Files
Neon-Desk/docs/DESIGN_SYSTEM.md

15 KiB

Fiscal Clone Design System

This file is the shared design reference for Fiscal Clone. Use it when building new components, revising existing screens, or making frontend design decisions.

How to use this document

  • Treat this file as the human-readable source of truth for UI decisions.
  • Treat app/globals.css as the implementation source of truth for tokens already in code.
  • If a new UI pattern is introduced, update this document in the same change so the system does not drift.
  • Prefer extending an existing pattern before inventing a new one.

Product and visual intent

Fiscal Clone is a financial analysis terminal, not a generic SaaS dashboard.

The UI should feel:

  • focused
  • technical
  • data-dense without looking cramped
  • calm and high-confidence
  • operational, with clear state and hierarchy

The current visual language is a dark research workstation with muted chrome, soft glass-like surfaces, monospaced metadata, and restrained highlights.

Core design principles

  1. Data first. Numbers, charts, and evidence should dominate decorative elements.
  2. Restraint over novelty. Avoid bright accents, oversized illustrations, and consumer-app styling.
  3. One primary action per area. Panels and toolbars should make the next step obvious.
  4. Reuse familiar surfaces. Panels, pills, tables, and toolbars should feel like parts of one terminal.
  5. Dense, not crowded. Compact layouts are fine, but preserve scanability and whitespace between blocks.
  6. Status must be legible. State should never depend on color alone.
  7. Motion is ambient, not performative. Animation should support orientation, not demand attention.

Brand voice and tone

Interface copy should sound like an analyst workstation:

  • concise
  • factual
  • operational
  • low-hype

Prefer:

  • "Load overview"
  • "Queue AI insight"
  • "Recent tasks"
  • "Runtime state: stable"

Avoid:

  • playful marketing language
  • vague CTA labels like "Explore" or "Learn more"
  • overly conversational empty states

Layout system

Application shell

The app shell is the primary frame for authenticated product surfaces.

  • Left navigation is the persistent desktop anchor.
  • Mobile navigation is task-oriented and bottom-docked.
  • Every page should have a clear title, optional subtitle, and optional action group.
  • Breadcrumbs should orient the user inside research workflows, especially when a ticker is active.

Reference implementation: components/shell/app-shell.tsx

Page structure

Use this ordering for most product pages:

  1. page title and subtitle
  2. top-level actions
  3. summary metrics or controls
  4. primary content panels
  5. secondary detail or supporting panels

Grid guidance

  • Prefer gap-2 for tight dashboard summaries.
  • Prefer gap-4 for full content sections.
  • Use one-column layout by default on mobile.
  • Expand to two or three columns only when comparison improves comprehension.
  • Keep important analytical content in the left or center visual path.

Width and spacing

  • The Tailwind container is centered with 2rem horizontal padding and a 1400px 2xl width.
  • Major surfaces typically use rounded-2xl.
  • Controls typically use rounded-xl.
  • Default panel padding is p-4 on mobile and sm:p-5 or sm:p-6 on larger screens.

Research workspace modes

The research product now supports two layout modes for the same ticker-scoped workspace:

  • Workspace: the default operating mode. Keep memo authoring, library management, and uploads in the primary column with the copilot docked as a sticky secondary rail.
  • Copilot Focus: a deep-work mode. The conversation becomes the primary surface and memo, library, and packet views move into secondary tabs.

Rules:

  • The active ticker must remain visible in both modes.
  • Mode switches should preserve the same local state, draft state, and copilot session.
  • Secondary surfaces in focus mode should feel adjacent, not modal. Use tabbed panel switching rather than route changes for memo, library, and packet context.
  • Avoid introducing a second page shell for focus mode. The user should feel they are still inside the research workspace.

Typography

Font roles

  • Primary UI font: --font-display
  • Monospaced metadata font: --font-mono

The display font is used for headings, paragraph content, and core UI. The mono font is reserved for labels, captions, table headers, status metadata, and technical framing.

Reference implementation: app/globals.css

Type hierarchy

  • Page titles: text-2xl to text-3xl, semibold
  • Section titles: text-lg to text-xl, semibold
  • Panel titles: text-base
  • Body copy: text-sm with generous line height where content is dense
  • Metadata and eyebrow labels: text-xs or text-[11px], uppercase, increased letter spacing

Typography rules

  • Use uppercase mono labels for section identifiers, table headers, and compact metadata.
  • Avoid long all-caps paragraphs.
  • Keep body copy left-aligned.
  • Keep line length moderate for explanatory text.

Color and surface system

Primary tokens

These tokens already define the current visual system:

Token Value Usage
--bg-0 #121417 page background base
--bg-1 #181b20 page background mid
--bg-2 #21252b page background depth
--panel rgba(28, 31, 36, 0.84) primary panel surface
--panel-soft rgba(36, 39, 45, 0.72) secondary panel or hover surface
--panel-bright rgba(49, 53, 60, 0.94) stronger elevated surface
--line-weak rgba(196, 202, 211, 0.18) default border
--line-strong rgba(220, 226, 234, 0.34) active or hover border
--accent #d9dee5 restrained accent
--accent-strong #f4f7fb brighter accent state
--danger #ff8e8e destructive state
--danger-soft rgba(111, 46, 46, 0.42) destructive surface
--terminal-bright #f3f5f7 primary foreground
--terminal-muted #a1a9b3 secondary foreground
--focus-ring rgba(229, 231, 235, 0.14) focus halo

Reference implementation: app/globals.css

Color usage rules

  • Use muted neutrals for most surfaces and borders.
  • Use --accent sparingly for links, primary actions, and selected emphasis.
  • Use --danger only for destructive actions or failure states.
  • Success color may appear in metrics, but should remain understated.
  • Never rely on saturated color blocks as the main visual identity.

Background treatment

Backgrounds should feel atmospheric and infrastructural:

  • layered radial gradients
  • subtle grid textures
  • low-opacity noise

These effects support the terminal identity and should remain secondary to content.

Shape, borders, and depth

  • Standard control radius: rounded-xl
  • Standard panel radius: rounded-2xl
  • Most surfaces use a 1px border with --line-weak
  • Hover and active states strengthen the border before changing fill aggressively
  • Shadows should feel soft and deep, not crisp or card-like

Component decisions

Buttons

There are four established button variants:

  • primary
  • secondary
  • ghost
  • danger

Button rules:

  • Minimum touch height is 44px via min-h-11
  • Use icon-plus-label pairs when the action benefits from faster scanning
  • Keep labels direct and verb-based
  • Prefer primary for the single most important action in a local group
  • Use secondary for adjacent supporting actions
  • Use ghost for low-emphasis actions
  • Use danger only when the action is irreversible or risky

Reference implementation: components/ui/button.tsx

Inputs

Inputs use soft panel surfaces with a stronger border and subtle halo on focus.

Input rules:

  • Minimum touch height is 44px
  • Placeholder text should remain muted and never act as the only label
  • External labels are preferred for forms
  • Search and symbol-entry fields may include leading icons

Reference implementation: components/ui/input.tsx

Panels

Panels are the core information container.

Use surface panels for:

  • grouped data blocks
  • modal-like sections
  • elevated analytical modules

Use flat sections for:

  • page subsections
  • inline grouped content that does not need a full card treatment

Panel rules:

  • Titles should be short and descriptive
  • Subtitles should explain context or time horizon
  • Header actions should stay compact
  • Avoid stacking too many fully elevated panels when a flatter rhythm improves readability

Reference implementation: components/ui/panel.tsx

Research copilot panels

Copilot surfaces should feel like analytical instruments, not consumer chat.

Use the docked copilot rail for:

  • cited Q&A tied to the current ticker
  • short follow-up turns during memo work
  • pinning or attaching evidence while staying in the main workspace

Use the focus copilot surface for:

  • multi-turn investigative sessions
  • long answers with multiple citations
  • review-first drafting into memo or notes

Copilot panel rules:

  • Keep header copy operational and concise.
  • Show context chips for ticker, target memo section, and pinned evidence count.
  • Source toggles should be compact and behave like tool filters, not marketing pills.
  • Message cards should differentiate user and assistant turns with surface treatment, not bright color.
  • Empty states should suggest concrete research questions rather than generic onboarding copy.

Citation cards

Citation cards are evidence controls, not decorative footnotes.

Rules:

  • Lead with the citation index and source label.
  • Keep excerpts short and scan-friendly.
  • Present actions inline: Open, Pin or Unpin, and Attach.
  • Use the same card rhythm inside docked and focus copilot modes.
  • If a citation cannot be attached because no artifact exists, disable the attach action instead of hiding it.

Review-first AI write flows

AI-generated content may propose note drafts, memo-section drafts, or background brief jobs, but it must not silently mutate user-authored research state.

Rules:

  • Suggested actions should be explicit buttons on assistant messages.
  • Drafting into notes or memo sections should populate editable client form state first.
  • Persistence should happen only through the existing note or memo save actions.
  • Long-running synthesis should route through the task/notification system instead of blocking the conversation thread.

Status pills and tags

Status pills should be compact, uppercase, and visually coded, but the text label must remain meaningful on its own.

Use pills for:

  • job status
  • research posture
  • small categorical states

Reference implementation: components/ui/status-pill.tsx

Metric cards

Metric cards are terse summary blocks, not mini-panels.

Rules:

  • lead with the metric value
  • keep the label in mono uppercase style
  • use delta text only for meaningful comparison or trend context
  • reserve green and red text for clearly directional values

Reference implementation: components/dashboard/metric-card.tsx

Tables

Tables are a first-class pattern in this product.

Rules:

  • use .data-table and .data-table-wrap styles where possible
  • table headers should use mono uppercase metadata styling
  • row hover may add a subtle background, but should not reduce readability
  • numeric columns should remain easy to compare visually
  • avoid decorative striping unless it materially helps scanability

Reference implementation: app/globals.css

Navigation and quick links should feel like terminal controls, not marketing cards.

Rules:

  • prefer border, text, and surface changes over large movement
  • active states should be obvious from both color and structure
  • keep mobile nav labels short

Interaction and motion

Interaction rules

  • Hover states should generally strengthen border, foreground, or surface contrast.
  • Focus states must always be visible.
  • Loading states should be plain and informative.
  • Empty states should explain what to do next.
  • Error states should be specific and concise.

Motion rules

  • Standard transition duration is about 200ms
  • Keep motion subtle and utility-driven
  • Ambient background animation is acceptable when low contrast and slow
  • Respect prefers-reduced-motion
  • Do not add decorative animation to dense analytical surfaces

Reference implementation: app/globals.css

Responsive behavior

  • Mobile should preserve the same visual language, not switch to a different product identity.
  • Collapse complex layouts vertically before removing information.
  • Horizontal scroll is acceptable for dense tables, but not for primary page structure.
  • Mobile action groups should stack cleanly and remain thumb-friendly.
  • Reduce background intensity slightly on small screens to preserve legibility.

References:

  • components/shell/app-shell.tsx
  • components/auth/auth-shell.tsx
  • app/globals.css

Accessibility baseline

All new UI should meet this baseline:

  • WCAG 2.1 AA contrast for body text and controls
  • keyboard access for all interactive elements
  • visible focus styles
  • labels for all inputs
  • no color-only status communication
  • readable hit targets at or above 44x44px where practical
  • motion should degrade gracefully for reduced-motion users

Additional guidance:

  • Use semantic HTML first.
  • Use ARIA only when native semantics are insufficient.
  • Keep tab order aligned with the visual reading order.
  • Preserve text clarity over background effects.

Page-specific patterns

Auth pages

Auth pages use a split layout:

  • one side for product framing
  • one side for the form

This area should feel slightly more cinematic than the internal app, but still restrained and operational.

Reference implementation: components/auth/auth-shell.tsx

Research and analysis pages

These pages are company-first and should foreground the selected ticker, current context, and next analytical move.

Use:

  • a strong top toolbar
  • fast context switching between adjacent research surfaces
  • supporting metadata close to the relevant content

Reference implementation: components/analysis/analysis-toolbar.tsx

Rules for adding new components

Before adding a new component:

  1. Check whether Button, Input, Panel, table styles, pills, or existing shell patterns already solve the need.
  2. Reuse existing tokens before introducing new colors, radii, shadows, or spacing values.
  3. Match the established terminal tone in both visuals and copy.
  4. Test the component in mobile and desktop layouts.
  5. Verify keyboard focus, contrast, and empty or loading states.

Create a new pattern only when reuse would produce awkward semantics or poor usability.

Non-goals

Avoid pushing the interface toward:

  • bright startup-dashboard aesthetics
  • highly animated consumer-product styling
  • oversized rounded cards everywhere
  • generic marketing-site gradients disconnected from the product
  • decorative icons or illustrations that compete with data

Update protocol

When a design decision changes:

  1. update the implementation
  2. update this file in the same PR
  3. note the new default pattern instead of documenting one-off exceptions

If the code and this file disagree, align them quickly. Long-lived mismatches will turn this document into stale theory, which makes it useless.