I had a similar experience. GAIS is a fantastic app with great potential for further enhancements, and I’m confident those updates will come in time.
One thing I found particularly useful was providing the Assistant with directions through custom System Instructions. I created a detailed set of specifications for the Assistant to follow in its coding, which helped align its output more closely with my design requirements.
Here’s an example from my System Instructions (just a snippet, only my section H, as my full guidelines are much more comprehensive). I’m sure there’s still room for improvement in my instructions, and I’m learning as I go.
H. UI/UX & Design System Specification
All generated UI must adhere to these specifications.
The application employs a hybrid styling approach:
- Tailwind CSS: Used for all layout, typography, flexbox, grid, and structural styling via utility classes.
- CSS Custom Properties (Variables): Used exclusively for the color and theming system. All colors are defined as variables in :root and consumed by component-specific CSS classes or Tailwind’s style attribute. Direct color utilities (e.g., bg-indigo-600) are forbidden.
Accessibility (A11y)
All components and layouts must be designed and built to be fully accessible (WCAG 2.1 AA). This includes using semantic HTML, ensuring keyboard navigability, using ARIA attributes where necessary, and providing descriptive alt text for images.
General Theme & Color Palette
Theme Mode:
The application must be developed exclusively in Dark Mode. The only exception is for displaying standard text messages generated by the Gemini API: in those cases, dark text on a light background is permitted.
CSS Color Variables:
The following CSS variables must be defined in the :root selector within index.css and used for all color styling:
:root {
–primary-color: #4f46e5; /* Indigo-600 /
–primary-color-hover: #4338ca*; /* Indigo-700 /
–success-color: #4ade80*; /* Green-400 /
–success-color-hover: #22c55e*; /* Green-500 /
–success-surface: rgba(74, 222, 128, 0.1); / Green-400/10 /
–background-color: #111827*; /* Gray-900 /
–surface-color-1: #1f2937*; /* Gray-800 /
–surface-color-2: #374151*; /* Gray-700 /
–border-color: #374151*; /* Gray-700 /
–text-color-primary: #f9fafb*; /* Gray-50 /
–text-color-secondary: #9ca3af*; /* Gray-400 /
–danger-color: #fca5a5*; /* red-300 /
–danger-surface: rgba(252, 165, 165, 0.15); / red-300/15 */
–shadow-color: rgba(0, 0, 0, 0.2);
–link-color: #818cf8;
/* AI Message Bubble Theme (Exception) */
–ai-message-bg-color: #E3E3E3;
–ai-message-border-color: #D1D1D1;
–ai-message-text-color: #333333;
–ai-message-copy-btn-color: #555555;
–ai-message-copy-btn-hover-bg: #D1D1D1;
}
Layout, Header, & Responsiveness
Main Layout:
The primary layout must be a two-column structure:
A primary, scrollable content area on the left (ChatPanel).
A fixed-width on the right for forms and controls (ControlsPanel).
Header & Navigation:
The application must have a distinct element at the top.
The app title/logo is aligned to the left.
A series of icon-based buttons are aligned to the right. These buttons control primary actions like “Reset” and “Help”, and toggle the sidebar on mobile.
Sidebar Internal Layout:
The panel must use a vertical flexbox layout (flex-direction: column) for its main content wrapper, ensuring control groups are stacked vertically with a consistent gap.
Responsive Sidebar:
The application must feature a responsive sidebar that adapts based on the primary desktop breakpoint defined in the Breakpoint Philosophy:
- Mobile View (below lg breakpoint): The right sidebar must collapse into a slide-out panel. A “Controls” button (hamburger icon) must be present in the header to toggle its visibility. An overlay (bg-black/60) must cover the main content when the sidebar is open.
- Desktop View (at or above lg breakpoint): The sidebar must be permanently visible as a fixed-width panel. The toggle button and overlay must not be present.
Core Layout Height (Mobile-Safe):
- The Assistant must use the proper coding methods to determine the screen space taken up on the desktop and mobile devices (smartphone, tablet) by the browser’s UI chrome (address and navigation bars), and take this into account to ensure all content is rendered in a way that it is visible to the User.
- The Assistant must ensure the layout remains correct when the device is rotated (landscape to portrait or vice versa) or when the viewport size changes for any reason.
Breakpoint Philosophy:
- Single Source of Truth: The primary responsive breakpoint (lg) is defined in the tailwind.config object in index.html.
- Default Breakpoint: A default of 52.5rem must be used for the lg screen size.
- JavaScript Access: The getTailwindBreakpoint utility must be used to read this value for use in React component logic.
Typography & Spacing
Font:
The mandatory font is ‘Inter’, sans-serif, loaded from Google Fonts in index.html.
Typography Scale & Implementation:
All font sizes must be controlled exclusively through Tailwind CSS utility classes to ensure consistency with the design system. The following scale must be adhered to:
- Extra Small (text-xs - 0.75rem): For tertiary info, button text, and small labels.
- Small (text-sm - 0.875rem): For input fields, secondary text, and control titles.
- Base (text-base - 1rem): For the main body text within message bubbles.
- Large (text-lg - 1.125rem): For main headings in modals or pages.
- Extra Large (text-xl - 1.25rem): For major headings inside generated content.
Spacing System:
Use a consistent spacing scale based on Tailwind’s default 4px system (e.g., p-4 for 1rem, gap-2 for 0.5rem).
Sentence Case:
Use sentence case for all titles, labels, and button text.
Component Styles
Buttons:
- General: All buttons must have border-radius: 0.375rem (rounded-md), a visible focus ring using var(–primary-color), and use the text-sm utility.
- Primary/Secondary Buttons: Standard action buttons (btn-primary, btn-secondary) must have padding: 0.5rem 1rem.
- Control & Header Buttons: Buttons within the header or controls panel must use reduced padding (0.375rem 1rem or 0.375rem 0.75rem).
- Header Outline Buttons: Borderless buttons (btn-outline-success, btn-outline-danger) that rely on text color and a subtle background change on hover.
- Execute Button (.btn-execute): A full-width, bold button with a green background (var(–success-color)), used for the main call-to-action.
- Danger Button (.btn-danger): A solid red button with a background of var(–danger-color) and dark text, used for destructive confirmation actions.
- Header Button (.header-btn): A standard, non-outline button for the header with a transparent background that turns to var(–surface-color-2) on hover or when active.
- Icon-Only Button (variant=“icon”): A small, padding-only button designed to wrap a single icon.
- Icon Danger Button (.icon-btn-danger): A specific variant of the icon button with a solid red background (var(–danger-color)).
Form Controls:
- Input Fields (.form-input): Must have border-radius: 0.5rem (rounded-lg), padding: 0.625rem, use the text-sm utility, a background of var(–surface-color-2), and a border that changes to var(–primary-color) on focus.
- Checkboxes: Must use the
.form-input class for styling consistency but should be sized smaller (e.g., h-4 w-4).
Dropdowns / Combobox:
- Must use the
.form-input style for the input element.
- The options panel must have a background of
var(--surface-color-2) and a focus ring using var(--border-color).
Tags:
- Template Tag (.template-tag): A pill-shaped (rounded-full) tag with a background of
var(--primary-color). It contains text and an embedded icon button for removal, which has a subtle background change on hover.
Modals:
- Must appear over a semi-transparent, blurred backdrop (.modal-backdrop).
- Must be dismissible via click on the backdrop or the Escape key.
- Modal Title: text-lg, font-bold.
- Modal Body Text: text-sm or text-base as appropriate.
Cards / Containers (e.g., Message Bubbles):
- Must have border-radius: 0.75rem (rounded-xl) and a 1px solid var(–border-color) border (where applicable). Backgrounds vary by type:
- User Message (.user-message): var(–surface-color-2)
- AI Message (.ai-message-final): var(–ai-message-bg-color)
- Error Message (.error-message): var(–danger-surface)
- Loader (.tech-loader): var(–surface-color-1)
Iconography:
- Inline SVGs in JSX are forbidden.
- All icons must be rendered via a reusable
<Icon /> component which dynamically loads icons from the lucide-react library.
- The component must accept
name (a valid Lucide icon name), size, and className props and fail gracefully if an invalid name is provided.
Loading States:
- Button Actions: A disabled button must display a CSS border spinner (.btn-spinner).
- Long Operations: A multi-step “technical loader” (TechnicalLoader.tsx) must be displayed.
Help & Manual Styles:
- A “Help” button must be in the header, opening a modal (HelpModal.tsx).
- The modal’s content container must have the class
.manual-content.
- Keyboard keys must be styled using the
<kbd> tag, which gives it a distinct background and border to mimic a physical key.
- Item descriptions should use an italic style with a left border for emphasis.
Error Messages:
- Must be styled with .error-message, using var(–danger-surface) and var(–danger-color).
Animations:
- The framer-motion library must be used for all UI animations (message loading, modals, sidebar transitions, etc.).
Custom Scrollbars:
- Scrollbars in WebKit browsers must be styled to match the dark theme via
::-webkit-scrollbar in index.css.
Floating “Back-to-Top” Button:
- Appearance: A circular button with an icon, styled with var(–primary-color).
- Behavior: Appears in the bottom-right of the main content area after scrolling down 300px. It animates into view and hides when scrolling back to the top.
- Functionality: Triggers a smooth scroll animation to the top of the scrollable container.