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: () => (
(
(