# UI Rules — ClientHub admin Derived from the live codebase (`src/app/globals.css`, design system usage across admin pages). These are the rules to follow for any new or modified admin page. --- ## Brand palette All colours must be written as **hex literals** — no Tailwind semantic tokens (`text-foreground`, `bg-muted`, etc.) in admin UI. Semantic tokens are defined in `globals.css` but mixing hex and tokens creates inconsistency. | Role | Hex | Usage example | |-------------------|-------------|-----------------------------------------| | Primary | `#1A463C` | Primary buttons, active states, accents | | Primary hover | `#163a31` | Hover on primary buttons | | Accent | `#DEF168` | Brand highlights (use sparingly) | | Foreground | `#1a1a1a` | Body text, headings | | Muted text | `#71717a` | Secondary text, labels, meta | | Border | `#e5e7eb` | Card borders, table dividers, inputs | | Background muted | `#f9f9f9` | Table header rows, card hover bg | | White | `#ffffff` | Card / panel backgrounds | | Destructive | `#dc2626` | Delete/archive actions, error text | --- ## Typographic scale | Level | Classes | |--------------------|----------------------------------------------| | Page title (h1) | `text-2xl font-bold text-[#1a1a1a]` | | Section heading | `text-base font-semibold text-[#1a1a1a]` | | Subsection (h3) | `text-sm font-bold text-[#71717a] uppercase tracking-wider` | | Body | `text-sm text-[#1a1a1a]` | | Secondary/label | `text-xs text-[#71717a]` | | Numeric values | always add `tabular-nums` | --- ## Layout - **Page wrapper:** `
` — uniform vertical rhythm, full-width. - **Page header:** always use `` from `src/components/admin/PageHeader.tsx` — never hand-roll the title + action row. - **No width constraints on list pages:** do not add `max-w-*` or `mx-auto` to the page root. Width is controlled by the sidebar layout (`src/app/admin/layout.tsx`). - **Detail/form pages** (e.g. OfferEditorClient) may keep their own `max-w-4xl mx-auto` — this rule applies to list/overview pages only. - **Cards:** `rounded-lg border border-[#e5e7eb] bg-white p-4`; hover: `hover:shadow-[0_4px_12px_rgba(0,0,0,0.08)]`. - **Tables:** `bg-white rounded-xl border border-[#e5e7eb] overflow-hidden`; thead `bg-[#f9f9f9] border-b border-[#e5e7eb]`; row divider `border-b border-[#e5e7eb]`. --- ## Interaction - Clickable elements: `cursor-pointer` - Colour transitions: `transition-colors duration-150` - Focus ring: `focus:outline-none focus-visible:ring-2 focus-visible:ring-[#1A463C]/30` - Minimum touch target on buttons: 44 × 44 px (use `py-2 px-4` minimum or `h-10`) - Primary CTA: `bg-[#1A463C] text-white hover:bg-[#163a31] transition-colors` - Secondary/ghost CTA: `border border-[#e5e7eb] text-[#1a1a1a] hover:bg-[#f9f9f9] transition-colors` - Destructive action: `text-[#dc2626] hover:bg-red-50 transition-colors` --- ## Anti-patterns (do not do these) - **No emoji as UI icons** — use Lucide React icons instead. - **No mixed semantic tokens and hex** — pick hex throughout any given page/component. - **No per-page `max-w-*` on list pages** — layout width is the sidebar shell's responsibility. - **No hand-rolled page header divs** — always use `` to keep title size/weight/colour uniform. - **No inline `style={{}}` for colours that have a Tailwind class** — reserve `style` for dynamic values only (e.g. progress bar width percentages).