diff --git a/src/components/composed/DataAppShell/DataAppShell.stories.tsx b/src/components/composed/DataAppShell/DataAppShell.stories.tsx index 675d0909..4f338c26 100644 --- a/src/components/composed/DataAppShell/DataAppShell.stories.tsx +++ b/src/components/composed/DataAppShell/DataAppShell.stories.tsx @@ -271,10 +271,361 @@ function WorkflowPanel({ // Meta // ============================================================================= +// ============================================================================= +// Anatomy diagram — hand-built in HTML/CSS (positioned callouts over a mock shell) +// ============================================================================= + +const NAVY = "#0B1533"; +const CALLOUT_BLUE = "#2E6BF2"; + +const Line = ({ x, y, w, h }: { x: number; y: number; w: number; h: number }) => ( +
+); +const Dot = ({ x, y }: { x: number; y: number }) => ( +
+); +const Num = ({ x, y, n }: { x: number; y: number; n: number }) => ( +
+ {n} +
+); +const Pill = ({ x, y, children }: { x: number; y: number; children: React.ReactNode }) => ( +
+ {children} +
+); + +// Skeleton bar helper +const Bar = ({ w, bg = "#DDE3EC" }: { w: number | string; bg?: string }) => ( +
+); + +const AnatomyDiagram = () => ( +
+

Anatomy

+

+ how the components compose into the AppShell +

+ +
+ {/* ── Mock shell ─────────────────────────────────────────────── */} +
+ {/* Primary nav rail */} +
+
+
+
+
+
+
+ + {/* Content column */} +
+ {/* TopBar */} +
+ +
+
+
+ + {/* Body */} +
+ {/* Secondary nav */} +
+
+ + + + +
+ + + + +
+ + {/* Main */} +
+
+ {[0, 1, 2, 3].map((i) => ( +
+ ))} +
+
+ + {/* Right panel */} +
+ + + +
+
+
+
+ + {/* ── Callouts ───────────────────────────────────────────────── */} + {/* 1 · Primary nav: Rail */} + + + + Primary nav: Rail + + {/* 3 · TopBar */} + + + + TopBar + + {/* 5 · Right panel / Drawer */} + + + Right panel / Drawer + + {/* 2 · Secondary nav */} + + + + Secondary nav : workflow + + {/* 4 · Main */} + + + Main +
+
+); + +type DocRow = { name: string; desc: React.ReactNode }; + +const SUBCOMPONENTS: DocRow[] = [ + { + name: "1. Primary navigation bar", + desc: 'The global icon rail; holds top-level product destinations such as "Home" and "Lists" and persists across workflows, hiding only when the shell is collapsed.', + }, + { + name: "2. Secondary nav", + desc: "Task-scoped navigation; renders the active workflow's steps as a vertical or horizontal stepper and collapses to an icon rail to reclaim space.", + }, + { + name: "3. TopBar", + desc: "The experience header; carries the breadcrumb trail, page actions, notifications, the Tetra Agent trigger, and the user menu.", + }, + { + name: "4. Main", + desc: "The primary content region; renders the active page's tables, dashboards, and forms, and is the only area that scrolls independently.", + }, + { + name: "5. Right panel / Drawer", + desc: "Contextual companion surface for Tetra Agent and inspectors; mounts inline (docked) for persistent tools or as an overlay drawer for transient tasks.", + }, +]; + +const MAJOR_VARIANTS: DocRow[] = [ + { name: "Default", desc: "Primary nav as a collapsible sidebar (⇄ rail); no secondary nav." }, + { + name: "Workflow · Vertical", + desc: "Rail + vertical step list; collapses to an icon rail (can hide the primary rail).", + }, + { + name: "Workflow · Horizontal", + desc: "Rail + horizontal stepper; collapses into a step dropdown by the breadcrumb.", + }, + { + name: "Secondary Nav · Sidebar", + desc: "Rail + grouped sidebar menu (Default / SubMenu / Multiple Group; small–large menu sizes).", + }, +]; + +const DocTable = ({ title, rows }: { title: string; rows: DocRow[] }) => ( + <> +

+ {title} +

+
+ {rows.map((r) => ( +
+ {r.name} + {r.desc} +
+ ))} +
+ +); + +const DataAppShellDocsPage = () => ( +
+

DataAppShell

+

+ A composable application shell for TDP data apps. It assembles a Primary Nav, an optional + Secondary Nav, a Top Bar, a main content area, and an optional Right Panel. Pick a ready-made + variant on the left, or open the Component Properties panel to explore customization options + beyond the four main variants. +

+ +
+ +
+ + + +
+); + const meta: Meta = { title: "Design Patterns/Data App Shell", component: DataAppShell, - parameters: { layout: "fullscreen" }, + parameters: { + layout: "fullscreen", + docs: { page: DataAppShellDocsPage }, + }, tags: ["autodocs"], }; @@ -374,7 +725,7 @@ const DefaultShell = ({ initialCollapsed = false }: { initialCollapsed?: boolean }; export const Default: Story = { - name: "Default", + name: "Workflow · Vertical", render: () => , play: async ({ canvasElement, step }) => { const canvas = within(canvasElement); @@ -408,6 +759,8 @@ export const Default: Story = { export const CollapsedWorkflow: Story = { name: "Collapsed Workflow", + // Hidden from the sidebar; still runs as a play/interaction test. + tags: ["!dev"], render: () => , play: async ({ canvasElement, step }) => { const canvas = within(canvasElement); @@ -433,7 +786,7 @@ export const CollapsedWorkflow: Story = { // ============================================================================= export const NonWorkflowPage: Story = { - name: "Non-Workflow Page", + name: "Default", render: () => ( { export const Interactive: Story = { name: "Interactive", + // Hidden from the sidebar; still runs as a play/interaction test. + tags: ["!dev"], render: () => , play: async ({ canvasElement, step }) => { const canvas = within(canvasElement); @@ -608,6 +963,8 @@ export const AppDropdownInteraction: Story = { export const BreadcrumbVariants: Story = { name: "Breadcrumb Variants", + // Hidden from the sidebar; still runs as a play/interaction test. + tags: ["!dev"], render: () => (