From ff985fb7550e915a62d2ef8d2622175fb7b24ce8 Mon Sep 17 00:00:00 2001 From: chihlasm Date: Tue, 24 Mar 2026 07:37:44 +0000 Subject: [PATCH] refactor: replace cyan accent with ember orange across entire frontend MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Swap accent color from cyan (#22d3ee) to ember orange (#f97316) site-wide. Cyan caused contrast issues and felt generic — orange brings warmth and urgency fitting for a troubleshooting tool. Changes: - CSS variables: accent, accent-hover, accent-dim, accent-text, primary, ring - Warning color shifted from amber (#fbbf24) to yellow (#eab308) for semantic separation from orange accent - Brand SVGs: logo gradient updated to orange - 50+ component files: all hardcoded cyan hex values, Tailwind cyan-* classes, and rgba(34,211,238,...) glow values replaced - landing.css: all 45+ cyan references + 5 old border color fixes - DESIGN-SYSTEM.md bumped to v5 with decisions log - CLAUDE.md: all color references synced to charcoal palette + orange accent - PWA theme-color meta tag updated to match sidebar (#10121a) Co-Authored-By: Claude Opus 4.6 (1M context) --- CLAUDE.md | 26 ++--- DESIGN-SYSTEM.md | 79 ++++++++----- frontend/index.html | 2 +- frontend/src/assets/brand/icon.svg | 4 +- frontend/src/assets/brand/logo-horizontal.svg | 4 +- .../src/assets/brand/logo-with-tagline.svg | 4 +- .../account/NotificationSettings.tsx | 2 +- .../analytics/FlowAnalyticsPanel.tsx | 2 +- .../components/analytics/PsaMetricsPanel.tsx | 8 +- frontend/src/components/common/BrandLogo.tsx | 2 +- .../common/EmptyStateIllustrations.tsx | 110 +++++++++--------- .../src/components/dashboard/FiltersBar.tsx | 2 +- .../dashboard/KnowledgeBaseCards.tsx | 2 +- .../dashboard/PendingEscalations.tsx | 2 +- .../components/dashboard/PerformanceCards.tsx | 4 +- .../components/dashboard/PreparedSessions.tsx | 6 +- .../src/components/dashboard/QuickActions.tsx | 6 +- .../components/dashboard/RecentActivity.tsx | 6 +- .../dashboard/RecentFlowPilotSessions.tsx | 2 +- .../src/components/dashboard/TeamSummary.tsx | 4 +- .../components/dashboard/WeeklyCalendar.tsx | 6 +- .../flowpilot/FlowPilotActionBar.tsx | 4 +- .../components/flowpilot/FlowPilotSession.tsx | 2 +- .../flowpilot/StatusUpdateModal.tsx | 6 +- .../src/components/layout/CommandPalette.tsx | 2 +- frontend/src/components/layout/Sidebar.tsx | 4 +- frontend/src/components/layout/TopBar.tsx | 2 +- .../src/components/library/TreeGridView.tsx | 2 +- .../src/components/library/TreeListView.tsx | 2 +- .../src/components/library/TreeTableView.tsx | 2 +- .../procedural/InlineVariablePrompt.tsx | 10 +- .../procedural/PrepareSessionModal.tsx | 14 +-- .../script-builder/SaveToLibraryDialog.tsx | 8 +- .../script-builder/ScriptBuilderChat.tsx | 12 +- .../script-builder/ScriptCodeBlock.tsx | 2 +- .../script-builder/ScriptPreviewModal.tsx | 2 +- .../components/session/TicketContextPanel.tsx | 2 +- .../session/TicketLinkIndicator.tsx | 2 +- .../components/session/UpdateTicketModal.tsx | 2 +- .../components/sidebar/SidebarStatsBar.tsx | 2 +- .../src/components/tree-editor/GlowEdge.tsx | 6 +- frontend/src/constants/categoryColors.ts | 2 +- frontend/src/index.css | 28 ++--- frontend/src/pages/FlowPilotAnalyticsPage.tsx | 14 +-- frontend/src/pages/FlowPilotSessionPage.tsx | 8 +- frontend/src/pages/LandingPage.tsx | 8 +- frontend/src/pages/MyAnalyticsPage.tsx | 2 +- .../src/pages/ProceduralNavigationPage.tsx | 10 +- frontend/src/pages/SessionHistoryPage.tsx | 14 +-- frontend/src/pages/TeamAnalyticsPage.tsx | 2 +- .../pages/account/BrandingSettingsPage.tsx | 12 +- frontend/src/styles/landing.css | 94 +++++++-------- 52 files changed, 291 insertions(+), 274 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index f647751e..adc328cb 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -21,7 +21,7 @@ - **Design system:** [DESIGN-SYSTEM.md](DESIGN-SYSTEM.md) — THE source of truth for all design decisions - **Design aesthetic:** Flat, high-contrast dark theme (Sentry/PostHog-inspired). No glass morphism, no gradients on surfaces, no ambient effects. Light mode planned. -- **Accent color:** Cyan (#22d3ee / #06b6d4). Used sparingly — ≤5% of the UI. +- **Accent color:** Ember orange (#f97316 / #ea580c). Used sparingly — ≤5% of the UI. Warning is yellow (#eab308), not amber, to stay distinct from accent. - **Fonts:** IBM Plex Sans (`font-sans`, body), Bricolage Grotesque (`font-heading`, headings), JetBrains Mono (`font-mono`, code) — loaded via Google Fonts - **Logo:** 30px gradient square (cyan) + "ResolutionFlow" in Bricolage Grotesque 700 - **Layout:** Icon rail sidebar (72px default) with hover flyout panels. Pinnable to full 260px sidebar. See [DESIGN-SYSTEM.md](DESIGN-SYSTEM.md) @@ -31,14 +31,14 @@ **Component styling rules:** -- Primary buttons: solid `accent` background (#22d3ee), white text, 5px radius +- Primary buttons: solid `accent` background (#f97316), white text, 5px radius - Ghost buttons: transparent with 1px `border-default`, hover `bg-elevated` - Cards: `bg-card` with 1px `border-default`, 8px radius. NO shadows, NO blur, NO gradients. - Badges: pill-shaped (20px radius), semantic dim background + matching text color - Active nav: `accent-dim` background + `accent-text` color + 3px left accent bar - Stat cards: 3px colored left border (accent/success/warning by position) - Code blocks: `bg-code` with JetBrains Mono, material-inspired syntax highlighting -- Status colors: green/`#34d399` (success), amber/`#fbbf24` (warning), red/`#f87171` (danger) — ONLY for semantic meaning +- Status colors: green/`#34d399` (success), yellow/`#eab308` (warning), red/`#f87171` (danger) — ONLY for semantic meaning - Section labels: 10px, 600 weight, uppercase, `text-muted`, 1.2px letter-spacing When adding new pages/components: reference [DESIGN-SYSTEM.md](DESIGN-SYSTEM.md). Use flat dark surfaces, 1px borders, no decorative effects. All colors via CSS variables. Use "Flows" not "Trees" in all user-facing text; use "Projects" not "Procedures" for procedural flows. @@ -364,7 +364,7 @@ gh run view --json jobs --jq '.jobs[] | {name: .name, conclusion: .conclusi **87. FlowPilot must ask GUI vs script preference:** When a task can be done via GUI or script (e.g., creating AD users), FlowPilot must ask the engineer which approach they prefer BEFORE suggesting either. Never assume the user wants a script. See `FLOWPILOT_SYSTEM_PROMPT` rules in `flowpilot_engine.py`. -**88. Charcoal palette — sidebar-darkest approach:** Sidebar `#10121a`, page `#1a1c23`, cards `#22252e`, borders `#2e3240`. This gives more contrast range than true-dark (`#0c0d10`). All colors via CSS variables in `index.css` `@theme` block. +**88. Charcoal palette — sidebar-darkest approach:** Sidebar `#10121a`, page `#1a1c23`, cards `#22252e`, borders `#2e3240`. This gives more contrast range than true-dark (`#0c0d10`). All colors via CSS variables in `index.css` `@theme` block. Accent is ember orange (#f97316), not cyan. **89. QuickLaunch merged into CommandPalette:** There is no separate QuickLaunch/lightning bolt. The unified Cmd+K omnibar handles search, navigation, quick actions, and FlowPilot. `QuickLaunch.tsx` was deleted. @@ -380,7 +380,7 @@ gh run view --json jobs --jq '.jobs[] | {name: .name, conclusion: .conclusi **95. Image upload → AI vision pipeline:** Paste/attach images → upload to Railway S3 bucket via `uploadsApi.upload()` → send `upload_ids` with chat message → backend fetches from S3 via `storage_service.download_file()` → resized via `storage_service.resize_image_for_vision()` (Pillow, 1568px max, PNG→JPEG) → base64-encoded → sent as Claude multimodal content blocks. Max 3 images/message. Images are NOT stored in conversation history (text-only). Vision helpers live in `storage_service.py`. -**96. `bg-accent` is bright cyan — never use for code/kbd elements:** In Tailwind v4, `bg-accent` maps to `--color-accent: #22d3ee`. Use `bg-code` for code blocks, `bg-white/[0.12] border border-white/[0.06]` for inline code/badges, `bg-white/[0.08]` for kbd shortcuts. Cyan is reserved for interactive elements only (buttons, active nav, links). +**96. `bg-accent` is ember orange — never use for code/kbd elements:** In Tailwind v4, `bg-accent` maps to `--color-accent: #f97316`. Use `bg-code` for code blocks, `bg-white/[0.12] border border-white/[0.06]` for inline code/badges, `bg-white/[0.08]` for kbd shortcuts. Orange is reserved for interactive elements only (buttons, active nav, links). **97. Railway Object Storage (S3 bucket) is provisioned:** Bucket `resolutionflow-uploads` on Railway canvas. Variables: `STORAGE_ENDPOINT`, `STORAGE_ACCESS_KEY`, `STORAGE_SECRET_KEY`, `STORAGE_BUCKET_NAME`, `STORAGE_REGION` — mapped via variable references on the `patherly` backend service. Accessed via boto3 in `storage_service.py`. Pillow (`Pillow>=10.0.0`) + `libjpeg-dev`/`zlib1g-dev` in Dockerfile for image resize. @@ -404,15 +404,15 @@ gh run view --json jobs --jq '.jobs[] | {name: .name, conclusion: .conclusi **Source of truth:** [DESIGN-SYSTEM.md](DESIGN-SYSTEM.md) — always read this before making visual or UI decisions. - **Theme:** Flat, high-contrast dark theme (Sentry/PostHog-inspired). No glass morphism, no backdrop blur, no ambient orbs, no gradient backgrounds on surfaces. Light mode planned. -- **Backgrounds:** `bg-page` (`#0c0d10`), `bg-sidebar` (`#0f1118`), `bg-card` (`#14161d`), `bg-elevated` (`#1c1f2a`) -- **Cards:** `bg-card` with 1px `border-default` (`#1e2130`), 8px radius. No shadows, no blur, no gradients. Hover: `border-hover` (`#2a2f3d`) -- **Buttons:** Primary: solid `accent` (#22d3ee), white text, 5px radius. Ghost: transparent + 1px border, hover `bg-elevated` -- **Inputs:** `bg-input` (`#191c25`) with 1px `border-default`, 5px radius. Focus: `border-color: accent` + `box-shadow: 0 0 0 2px accent-dim` +- **Backgrounds:** `bg-page` (`#1a1c23`), `bg-sidebar` (`#10121a`), `bg-card` (`#22252e`), `bg-elevated` (`#2e3140`) +- **Cards:** `bg-card` with 1px `border-default` (`#2e3240`), 8px radius. No shadows, no blur, no gradients. Hover: `border-hover` (`#3d4252`) +- **Buttons:** Primary: solid `accent` (#f97316), white text, 5px radius. Ghost: transparent + 1px border, hover `bg-elevated` +- **Inputs:** `bg-input` (`#282b35`) with 1px `border-default`, 5px radius. Focus: `border-color: accent` + `box-shadow: 0 0 0 2px accent-dim` - **Text:** `text-heading` (`#f0f2f5`) → `text-primary` (`#e2e5eb`) → `text-secondary` (`#848b9b`) → `text-muted` (`#4f5666`) -- **Borders:** `border-default` (`#1e2130`), `border-hover` (`#2a2f3d`) -- **Functional colors:** `#34d399` (success), `#fbbf24` (warning), `#f87171` (danger) — each with `-dim` variant at 10% opacity -- **Accent:** Cyan `#22d3ee` — used sparingly (≤5% of UI). `accent-dim` = `rgba(34,211,238,0.10)`, `accent-text` = `#67e8f9` -- **Deprecated:** Do NOT use `glass-card`, `glass-stat`, `bg-gradient-brand`, `text-gradient-brand`, `backdrop-filter: blur()`, ambient orbs, or purple gradients +- **Borders:** `border-default` (`#2e3240`), `border-hover` (`#3d4252`) +- **Functional colors:** `#34d399` (success), `#eab308` (warning), `#f87171` (danger) — each with `-dim` variant at 10% opacity +- **Accent:** Ember orange `#f97316` — used sparingly (≤5% of UI). `accent-dim` = `rgba(249,115,22,0.10)`, `accent-text` = `#fdba74` +- **Deprecated:** Do NOT use `glass-card`, `glass-stat`, `bg-gradient-brand`, `text-gradient-brand`, `backdrop-filter: blur()`, ambient orbs, purple gradients, or cyan accent (`#22d3ee`) --- diff --git a/DESIGN-SYSTEM.md b/DESIGN-SYSTEM.md index daab8dd6..e7808b01 100644 --- a/DESIGN-SYSTEM.md +++ b/DESIGN-SYSTEM.md @@ -1,14 +1,14 @@ -# ResolutionFlow Design System v4 +# ResolutionFlow Design System v5 > **Status:** ACTIVE — This document is the single source of truth for all frontend design decisions. -> **Supersedes:** All previous design system docs including `DESIGN_SYSTEM_GUIDE.md`, `UI-DESIGN-SYSTEM.md`, `REBRAND-IMPLEMENTATION-GUIDE.md`, and any `COMPONENT_EXAMPLES.md` files. -> **Last Updated:** March 21, 2026 +> **Supersedes:** All previous design system docs including `DESIGN_SYSTEM_GUIDE.md`, `UI-DESIGN-SYSTEM.md`, `REBRAND-IMPLEMENTATION-GUIDE.md`, and any `COMPONENT_EXAMPLES.md` files. Also supersedes the v4 cyan accent system. +> **Last Updated:** March 24, 2026 --- ## Design Philosophy -ResolutionFlow uses a **flat, high-contrast dark theme** inspired by Sentry and PostHog. The aesthetic is premium, clean, and minimal — no glass morphism, no backdrop blur, no ambient orbs, no gradient backgrounds on surfaces. The accent color appears in ≤5% of the UI. Every design decision prioritizes **readability over decoration**. +ResolutionFlow uses a **flat, high-contrast dark theme** inspired by Sentry and PostHog. The aesthetic is premium, clean, and minimal — no glass morphism, no backdrop blur, no ambient orbs, no gradient backgrounds on surfaces. The accent color (ember orange) appears in ≤5% of the UI. Warm accent on cold charcoal surfaces creates high contrast and distinctive personality — orange conveys urgency and action, fitting for a troubleshooting tool. Every design decision prioritizes **readability over decoration**. **Light mode** is a planned addition (dark/light toggle). Design all components with CSS variables so theming is a variable swap, not a rewrite. @@ -18,39 +18,41 @@ ResolutionFlow uses a **flat, high-contrast dark theme** inspired by Sentry and All colors are defined as CSS custom properties in `index.css` inside the `@theme` block (Tailwind v4) or `:root` / `.dark` blocks (Tailwind v3). -### Dark Mode (Default) +### Dark Mode (Default) — Charcoal Palette ``` -Page background: #0c0d10 -Sidebar background: #0f1118 -Card background: #14161d -Card hover: #191c25 -Input background: #191c25 -Code background: #0e1017 -Elevated surface: #1c1f2a +Page background: #1a1c23 +Sidebar background: #10121a +Card background: #22252e +Card hover: #282b35 +Input background: #282b35 +Code background: #14161e +Elevated surface: #2e3140 Text primary: #e2e5eb Text heading: #f0f2f5 Text secondary: #848b9b Text muted: #4f5666 -Text rail label: #6b7280 +Text rail label: #e2e5eb -Border default: #1e2130 -Border hover: #2a2f3d +Border default: #2e3240 +Border hover: #3d4252 -Accent (cyan): #22d3ee -Accent hover: #06b6d4 -Accent dim (8-10%): rgba(34,211,238,0.10) -Accent text: #67e8f9 +Accent (ember): #f97316 +Accent hover: #ea580c +Accent dim (10%): rgba(249,115,22,0.10) +Accent text: #fdba74 Success: #34d399 Success dim: rgba(52,211,153,0.10) -Warning: #fbbf24 -Warning dim: rgba(251,191,36,0.10) +Warning: #eab308 +Warning dim: rgba(234,179,8,0.10) Danger: #f87171 Danger dim: rgba(248,113,113,0.10) ``` +> **Note:** Warning shifted from amber (#fbbf24) to yellow (#eab308) to maintain clear separation from the orange accent. + ### Light Mode (Planned) ``` @@ -70,9 +72,9 @@ Text muted: #8b92a1 Border default: #dde0e7 Border hover: #c5c9d3 -Accent: #0891b2 -Accent dim: rgba(8,145,178,0.07) -Accent text: #0e7490 +Accent: #ea580c +Accent dim: rgba(234,88,12,0.07) +Accent text: #c2410c ``` ### What NOT To Use @@ -82,6 +84,7 @@ Accent text: #0e7490 - No ambient orbs or floating glow elements - No `bg-white/[0.04]` opacity-based backgrounds - No purple gradient accent (`#818cf8 → #a78bfa`) — this is deprecated +- No cyan accent (`#22d3ee` / `#06b6d4` / `#67e8f9`) — replaced by ember orange in v5 - No `text-gradient-brand` utility — replaced by solid `accent-text` color - No `glass-card`, `glass-stat`, `glass-card-glow` CSS utilities @@ -236,13 +239,14 @@ Placeholder: text-muted **Primary:** ``` -Background: accent (#22d3ee) +Background: accent (#f97316) Color: #fff Border: none Border-radius: 5px Padding: 9px 16px Font: 13px, 550 weight -Hover: brightness(1.1) +Hover: accent-hover (#ea580c), box-shadow 0 2px 12px rgba(249,115,22,0.25), translateY(-1px) +Active: translateY(0), box-shadow 0 0 4px rgba(249,115,22,0.15) ``` **Ghost:** @@ -289,7 +293,7 @@ Color: accent-text ## Logo -- **Mark:** 30-32px square, border-radius 8px, `linear-gradient(135deg, #06b6d4, #22d3ee)`, white lightning bolt SVG +- **Mark:** 30-32px square, border-radius 8px, `linear-gradient(135deg, #ea580c, #f97316)`, white lightning bolt SVG - **Wordmark:** "ResolutionFlow" in Bricolage Grotesque, 16-17px, weight 700, text-heading color - **Combined:** Mark + wordmark horizontally, 10px gap @@ -325,21 +329,21 @@ Shadows communicate **interaction state**, not decoration. On dark backgrounds, **Resting state:** No shadows. Elements are flat with 1px borders. -**Elevation on dark backgrounds (the principle):** Instead of shadow = darker, elevation = lighter. A "raised" element gets a brighter surface color (`bg-elevated` / `#1c1f2a`) and optionally a very faint cyan glow. This creates perceived depth through contrast. +**Elevation on dark backgrounds (the principle):** Instead of shadow = darker, elevation = lighter. A "raised" element gets a brighter surface color (`bg-elevated` / `#2e3140`) and optionally a very faint orange glow. This creates perceived depth through contrast. **Hover state (buttons):** Lift effect with accent glow. -- Primary button hover: `0 2px 10px rgba(34,211,238,0.2)` + `translateY(-1px)` — cyan glow +- Primary button hover: `0 2px 12px rgba(249,115,22,0.25)` + `translateY(-1px)` — orange glow - Ghost button hover: brighter border (`border-hover`) + `translateY(-1px)`, no shadow - Active/click: glow fades, element "presses down" to `translateY(0)` **Active/selected state (tabs, toggles):** Elevated surface + faint accent glow. -- Active tab: `bg-elevated` + `box-shadow: 0 1px 4px rgba(34,211,238,0.08)` — class: `tab-active-shadow` +- Active tab: `bg-elevated` + `box-shadow: 0 1px 4px rgba(249,115,22,0.08)` — class: `tab-active-shadow` **Card hover lift (optional):** For clickable cards. -- Hover: brighter border + `0 2px 8px rgba(34,211,238,0.06)` + `translateY(-2px)` — class: `card-lift` +- Hover: brighter border + `0 2px 8px rgba(249,115,22,0.06)` + `translateY(-2px)` — class: `card-lift` **Overlays:** Flyouts, dropdowns, modals get stronger shadows (they overlay lighter content). @@ -352,6 +356,7 @@ Shadows communicate **interaction state**, not decoration. On dark backgrounds, - No `rgba(0,0,0,...)` shadows on resting elements (invisible on dark bg) - No permanent decorative shadows - No heavy glow effects — accent glow should be barely perceptible (≤ 0.1 opacity) +- No cyan glow effects — all accent glows use orange rgba(249,115,22,...) --- @@ -402,3 +407,15 @@ These files contain outdated design information and should be ignored: - `REBRAND-IMPLEMENTATION-GUIDE.md` — Old purple rebrand from Patherly - `COMPONENT_EXAMPLES.md` — Old monochrome component patterns - Any file referencing `glass-card`, `glass-stat`, `bg-gradient-brand`, or `text-gradient-brand` +- Any code using cyan accent values (`#22d3ee`, `#06b6d4`, `#67e8f9`, `rgba(34,211,238,...)`) — migrate to ember orange + +--- + +## Decisions Log + +| Date | Decision | Rationale | +|------|----------|-----------| +| 2026-03-24 | Accent color changed from cyan (#22d3ee) to ember orange (#f97316) | Cyan caused contrast issues, felt generic "tech SaaS". Orange provides warmth against cold charcoal, conveys urgency fitting for troubleshooting, and is distinctive in the MSP tool space. | +| 2026-03-24 | Warning color shifted from amber (#fbbf24) to yellow (#eab308) | Orange accent would clash with amber warning. Yellow provides clear semantic separation from the orange accent. | +| 2026-03-24 | Light mode accent set to #ea580c (orange-600) | Darker orange variant ensures proper contrast on white/light surfaces. | +| 2026-03-24 | Synced DESIGN-SYSTEM.md to actual charcoal palette | Doc was behind — still showed pre-charcoal values (#0c0d10 page, #14161d card). Updated to match index.css (#1a1c23 page, #22252e card). | diff --git a/frontend/index.html b/frontend/index.html index 892d7a42..35e65ff1 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -14,7 +14,7 @@ - +