Files
warmbly/web/src/components/layout/index.ts
T
Matthew Meszaros 4d1d305915 feat(web): shared Page primitives + refactor 10 pages to use them
Added a small set of layout primitives every page can pull from:

  <Page>          outer container with width=default|wide|full + padding
  <PageHeader>    title + optional subtitle/eyebrow + right-side actions
  <PageSection>   labeled child block with optional actions
  <StatCard>      icon + label + big number tile
  <EmptyState>    icon + headline + supporting line + optional CTA

Every page that opted in now reads with the same vocabulary — the
title sits at the top-left of the white content panel with consistent
breathing room, primary actions float to the right of the header,
empty states use the same dashed-card pattern.

Pages refactored:

  Stubs (10): billing, settings, team, templates, api-keys, all of
  crm (deals/pipelines/tasks). Each was an h1 + description + card
  with slightly different paddings; now they're 1:1 PageHeader +
  EmptyState. Switched the "primary" colour from zinc-900 to sky-600
  to match the new chrome.

  Real pages (3): emails, campaigns list, analytics.
    - emails: stat strip reduced to <StatCard>×4, header moved to
      <PageHeader>, table colours pulled from zinc to slate, accent
      switched to sky-600.
    - campaigns: same treatment; card hover tint sky-200 instead of
      zinc-300; status dot colours kept (emerald/amber/slate).
    - analytics: stat row + chart card + side panel + warmup empty
      state all reflowed onto the same primitives.

Skipped on purpose:
  - contacts (just delegates to ContactsTable; the table itself can
    take a tonal pass later)
  - unibox (custom chat-style split layout; PageHeader doesn't fit)
  - campaigns/[id]/* (sub-pages live inside CampaignLayout which has
    its own header; cleaner to redesign that layout once than each
    sub-page individually)
2026-05-22 15:11:47 +00:00

11 lines
451 B
TypeScript

export { AppLayout } from "./AppLayout";
export { Page, PageHeader, PageSection, StatCard, EmptyState } from "./Page";
export { AppShell } from "./AppShell";
export { AppHeader } from "./AppHeader";
export { AppNav } from "./AppNav";
export { SkyChrome } from "./SkyChrome";
export { OrgSwitcher } from "./OrgSwitcher";
export { UserNav } from "./UserNav";
export { ThemeProvider } from "./ThemeProvider";
export { ThemeToggle } from "./ThemeToggle";