@echothink-ui/layout 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +92 -0
- package/dist/index.cjs +1620 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.css +149 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.js +1546 -0
- package/dist/index.js.map +1 -0
- package/dist/layout-system/builders.d.ts +13 -0
- package/dist/layout-system/index.d.ts +24 -0
- package/dist/layout-system/inference/context.d.ts +33 -0
- package/dist/layout-system/inference/responsive.d.ts +21 -0
- package/dist/layout-system/inference/style.d.ts +15 -0
- package/dist/layout-system/page-layouts/index.d.ts +8 -0
- package/dist/layout-system/primitives/index.d.ts +6 -0
- package/dist/layout-system/regions/index.d.ts +4 -0
- package/dist/layout-system/registry/builtins.d.ts +8 -0
- package/dist/layout-system/registry/registry.d.ts +20 -0
- package/dist/layout-system/renderer/context.d.ts +41 -0
- package/dist/layout-system/renderer/region.d.ts +10 -0
- package/dist/layout-system/renderer/renderer.d.ts +13 -0
- package/dist/layout-system/renderer/root.d.ts +24 -0
- package/dist/layout-system/runtime/state.d.ts +17 -0
- package/dist/layout-system/runtime/viewport.d.ts +9 -0
- package/dist/layout-system/schema/types.d.ts +488 -0
- package/dist/layout-system/schema/validate.d.ts +15 -0
- package/dist/layout-system/tokens/preset-tokens.d.ts +11 -0
- package/package.json +47 -0
- package/src/index.tsx +42 -0
- package/src/layout-system/__tests__/layout-system.test.tsx +169 -0
- package/src/layout-system/builders.ts +46 -0
- package/src/layout-system/index.ts +87 -0
- package/src/layout-system/inference/context.ts +158 -0
- package/src/layout-system/inference/responsive.ts +147 -0
- package/src/layout-system/inference/style.ts +128 -0
- package/src/layout-system/page-layouts/index.tsx +405 -0
- package/src/layout-system/primitives/index.tsx +266 -0
- package/src/layout-system/regions/index.tsx +90 -0
- package/src/layout-system/registry/builtins.ts +19 -0
- package/src/layout-system/registry/registry.ts +47 -0
- package/src/layout-system/renderer/context.tsx +89 -0
- package/src/layout-system/renderer/region.tsx +34 -0
- package/src/layout-system/renderer/renderer.tsx +200 -0
- package/src/layout-system/renderer/root.tsx +95 -0
- package/src/layout-system/runtime/state.ts +80 -0
- package/src/layout-system/runtime/viewport.ts +71 -0
- package/src/layout-system/schema/types.ts +706 -0
- package/src/layout-system/schema/validate.ts +168 -0
- package/src/layout-system/tokens/preset-tokens.ts +77 -0
- package/src/styles.css +178 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.tsx","../src/layout-system/schema/validate.ts","../src/layout-system/tokens/preset-tokens.ts","../src/layout-system/inference/style.ts","../src/layout-system/inference/context.ts","../src/layout-system/inference/responsive.ts","../src/layout-system/registry/registry.ts","../src/layout-system/primitives/index.tsx","../src/layout-system/renderer/renderer.tsx","../src/layout-system/renderer/context.tsx","../src/layout-system/runtime/state.ts","../src/layout-system/renderer/region.tsx","../src/layout-system/regions/index.tsx","../src/layout-system/page-layouts/index.tsx","../src/layout-system/registry/builtins.ts","../src/layout-system/runtime/viewport.ts","../src/layout-system/renderer/root.tsx","../src/layout-system/builders.ts"],"sourcesContent":["/**\n * `@echothink-ui/layout` — public API.\n *\n * This package is the LAYOUT SYSTEM (layout-spec.md), not a template collection.\n * The former hard-coded page templates moved to `@echothink-ui/templates`; the\n * former preset-preview helpers are retired. Consumers now build pages as a\n * typed `LayoutNode` AST and render them through `LayoutRoot`.\n */\nimport \"./styles.css\";\n\n// Re-export the style axes for convenience (preset/density/typeScale + StyleScope).\nexport {\n StyleScope,\n defaultStylePreset,\n ethDensityModes,\n ethStylePresetDescriptions,\n ethStylePresetLabels,\n ethStylePresets,\n ethTypeScales,\n} from \"@echothink-ui/style\";\nexport type {\n EthStylePreset,\n EthDensityMode,\n EthTypeScale,\n EthPalette,\n} from \"@echothink-ui/style\";\n\n/**\n * Documented breakpoint contract (rem). CSS media queries can't read custom\n * properties, so these literal values are mirrored in `styles.css` and the\n * viewport observer.\n */\nexport const ethBreakpoints = {\n sm: \"36rem\",\n md: \"48rem\",\n lg: \"64rem\",\n xl: \"80rem\",\n} as const;\nexport type EthBreakpoint = keyof typeof ethBreakpoints;\n\n// The layout system.\nexport * from \"./layout-system/index.js\";\n","/**\n * Layout validation (`layout-spec.md` §16, §20).\n *\n * Hand-written structural + semantic validation that walks a `LayoutNode`\n * against a registry and emits `LayoutDiagnostic[]`. (zod can be layered on top\n * later for untrusted JSON; kept dependency-free here.)\n */\nimport type {\n LayoutDiagnostic,\n LayoutNode,\n NodeAcceptSpec,\n SlotContent,\n SlotDefinition,\n} from \"./types.js\";\nimport type { LayoutRegistry } from \"../registry/registry.js\";\n\nconst DEFAULT_MAX_DEPTH = 8;\n\nfunction acceptsContent(accepts: NodeAcceptSpec[], content: SlotContent): boolean {\n return accepts.some((spec) => {\n switch (content.kind) {\n case \"component\":\n return (\n spec.kind === \"component\" &&\n (!spec.componentTypes || spec.componentTypes.includes(content.component))\n );\n case \"layout\":\n return (\n spec.kind === \"layout\" &&\n (!spec.layoutTypes || spec.layoutTypes.includes(content.layout.type))\n );\n case \"template\":\n return (\n spec.kind === \"template\" &&\n (!spec.templateTypes || spec.templateTypes.includes(content.template))\n );\n case \"fragment\":\n return spec.kind === \"fragment\";\n case \"empty\":\n return spec.kind === \"empty\";\n default:\n return false;\n }\n });\n}\n\nfunction* childLayouts(content: SlotContent): Generator<LayoutNode> {\n if (content.kind === \"layout\") {\n yield content.layout;\n } else if (content.kind === \"fragment\") {\n for (const item of content.items) yield* childLayouts(item);\n }\n}\n\nexport interface ValidateOptions {\n maxDepth?: number;\n}\n\n/** Validate a layout tree, returning diagnostics (empty ⇒ valid). */\nexport function validateLayout(\n root: LayoutNode,\n registry: LayoutRegistry,\n opts: ValidateOptions = {},\n): LayoutDiagnostic[] {\n const diagnostics: LayoutDiagnostic[] = [];\n const maxDepth = opts.maxDepth ?? DEFAULT_MAX_DEPTH;\n const visiting = new Set<string>();\n\n function walk(node: LayoutNode, path: string[], depth: number): void {\n const nodePath = [...path, node.id];\n\n if (depth > maxDepth) {\n diagnostics.push({\n level: \"error\",\n code: \"MAX_DEPTH_EXCEEDED\",\n path: nodePath,\n message: `Layout nesting exceeds maxDepth=${maxDepth}.`,\n });\n return;\n }\n\n if (visiting.has(node.id)) {\n diagnostics.push({\n level: \"error\",\n code: \"CYCLE_DETECTED\",\n path: nodePath,\n message: `Cycle detected at node \"${node.id}\".`,\n });\n return;\n }\n visiting.add(node.id);\n\n const item = registry.get(node.type);\n if (!item) {\n diagnostics.push({\n level: \"error\",\n code: \"UNKNOWN_LAYOUT_TYPE\",\n path: nodePath,\n message: `Unknown layout type \"${node.type}\".`,\n suggestion: `Register \"${node.type}\" or use one of: ${registry.types().slice(0, 8).join(\", \")}…`,\n });\n visiting.delete(node.id);\n return;\n }\n\n const slotByName = new Map<string, SlotDefinition>(\n item.slots.map((s) => [s.name, s]),\n );\n\n // Unknown slots present on the node.\n for (const slotName of Object.keys(node.slots)) {\n if (!slotByName.has(slotName)) {\n diagnostics.push({\n level: \"warning\",\n code: \"UNKNOWN_SLOT\",\n path: [...nodePath, slotName],\n message: `Slot \"${slotName}\" is not declared by \"${node.type}\".`,\n });\n }\n }\n\n // Required slots + accepts + cardinality.\n for (const slot of item.slots) {\n const content = node.slots[slot.name];\n if (content === undefined) {\n if (slot.required && !slot.fallback?.empty) {\n diagnostics.push({\n level: \"error\",\n code: \"SLOT_REQUIRED\",\n path: [...nodePath, slot.name],\n message: `Required slot \"${slot.name}\" of \"${node.type}\" has no content or fallback.`,\n });\n }\n continue;\n }\n if (!acceptsContent(slot.accepts, content)) {\n diagnostics.push({\n level: \"error\",\n code: \"SLOT_ACCEPTS_VIOLATION\",\n path: [...nodePath, slot.name],\n message: `Slot \"${slot.name}\" of \"${node.type}\" does not accept ${content.kind} content.`,\n });\n }\n if (content.kind === \"fragment\" && slot.cardinality?.max && slot.cardinality.max !== \"unbounded\") {\n if (content.items.length > slot.cardinality.max) {\n diagnostics.push({\n level: \"error\",\n code: \"SLOT_CARDINALITY_VIOLATION\",\n path: [...nodePath, slot.name],\n message: `Slot \"${slot.name}\" allows at most ${slot.cardinality.max} items.`,\n });\n }\n }\n for (const child of childLayouts(content)) {\n walk(child, [...nodePath, slot.name], depth + 1);\n }\n }\n\n visiting.delete(node.id);\n }\n\n walk(root, [], 0);\n return diagnostics;\n}\n\nexport function hasErrors(diagnostics: LayoutDiagnostic[]): boolean {\n return diagnostics.some((d) => d.level === \"error\");\n}\n","/**\n * Preset → Tier-2 token map (`layout-spec.md` §13.2).\n *\n * Per TOKEN_CONTRACT.md every value is a Tier-2 `--eth-*` CSS variable; presets\n * override Tier-2, layout never reads raw `--cds-*`. These resolve through the\n * `@echothink-ui/style` preset stylesheets that are already on the page.\n */\nimport type {\n ComponentStyleParams,\n ResolvedLayoutTokens,\n StylePresetTokenMap,\n} from \"../schema/types.js\";\n\nexport const presetTokenMap: StylePresetTokenMap = {\n \"carbon-like\": {\n surface: \"var(--eth-surface, var(--eth-color-surface))\",\n surfaceMuted: \"var(--eth-surface-muted, var(--eth-color-surface-muted))\",\n border: \"var(--eth-border-subtle, var(--eth-color-border))\",\n text: \"var(--eth-text-primary, var(--eth-color-text))\",\n textMuted: \"var(--eth-text-secondary, var(--eth-color-text-secondary))\",\n accent: \"var(--eth-accent, var(--eth-color-accent))\",\n radius: \"var(--eth-radius-sm, 0.125rem)\",\n shadow: \"var(--eth-shadow-none, none)\",\n },\n \"soft-card\": {\n surface: \"var(--eth-surface, var(--eth-color-surface))\",\n surfaceMuted: \"var(--eth-surface-muted, var(--eth-color-surface-muted))\",\n border: \"var(--eth-border-soft, var(--eth-color-border))\",\n text: \"var(--eth-text-primary, var(--eth-color-text))\",\n textMuted: \"var(--eth-text-secondary, var(--eth-color-text-secondary))\",\n accent: \"var(--eth-accent, var(--eth-color-accent))\",\n radius: \"var(--eth-radius-lg, 0.75rem)\",\n shadow: \"var(--eth-shadow-card, 0 1px 2px rgba(15,23,42,0.08))\",\n },\n glass: {\n surface: \"var(--eth-surface-glass, var(--eth-color-surface))\",\n surfaceMuted: \"var(--eth-surface-glass-muted, var(--eth-color-surface-muted))\",\n border: \"var(--eth-border-glass, var(--eth-color-border))\",\n text: \"var(--eth-text-on-glass, var(--eth-color-text))\",\n textMuted: \"var(--eth-text-on-glass-muted, var(--eth-color-text-secondary))\",\n accent: \"var(--eth-accent, var(--eth-color-accent))\",\n radius: \"var(--eth-radius-xl, 1rem)\",\n shadow: \"var(--eth-shadow-floating, 0 8px 32px rgba(15,23,42,0.18))\",\n backdrop: \"blur(16px)\",\n },\n bright: {\n surface: \"var(--eth-surface, var(--eth-color-surface))\",\n surfaceMuted: \"var(--eth-surface-muted, var(--eth-color-surface-muted))\",\n border: \"var(--eth-border-bright, var(--eth-color-border))\",\n text: \"var(--eth-text-primary, var(--eth-color-text))\",\n textMuted: \"var(--eth-text-secondary, var(--eth-color-text-secondary))\",\n accent: \"var(--eth-accent, var(--eth-color-accent))\",\n radius: \"var(--eth-radius-md, 0.5rem)\",\n shadow: \"var(--eth-shadow-sm, 0 1px 2px rgba(15,23,42,0.06))\",\n },\n \"studio-dark\": {\n surface: \"var(--eth-surface-studio, var(--eth-color-surface))\",\n surfaceMuted: \"var(--eth-surface-studio-muted, var(--eth-color-surface-muted))\",\n border: \"var(--eth-border-studio, var(--eth-color-border))\",\n text: \"var(--eth-text-on-dark, var(--eth-color-text))\",\n textMuted: \"var(--eth-text-on-dark-muted, var(--eth-color-text-secondary))\",\n accent: \"var(--eth-accent, var(--eth-color-accent))\",\n radius: \"var(--eth-radius-sm, 0.125rem)\",\n shadow: \"var(--eth-shadow-none, none)\",\n },\n};\n\nconst densityGap: Record<ComponentStyleParams[\"density\"], string> = {\n compact: \"var(--eth-space-sm, 0.5rem)\",\n standard: \"var(--eth-space-md, 0.75rem)\",\n comfortable: \"var(--eth-space-lg, 1rem)\",\n};\n\n/** Resolve the token set for a final `ComponentStyleParams`. */\nexport function resolveTokens(style: ComponentStyleParams): ResolvedLayoutTokens {\n return { ...presetTokenMap[style.preset], gap: densityGap[style.density] };\n}\n","/**\n * Component style inference (`layout-spec.md` §7).\n *\n * Components do NOT pick their own preset/density/typeScale. The engine infers\n * `ComponentStyleParams` from the layout runtime context using a scoring\n * resolver for `preset` plus rule tables for `density` and `typeScale`.\n */\nimport type {\n ComponentDensity,\n ComponentStyleParams,\n ComponentStylePreset,\n ComponentTypeScale,\n StyleInferenceInput,\n} from \"../schema/types.js\";\n\nexport const defaultComponentStyle: ComponentStyleParams = {\n preset: \"carbon-like\",\n palette: \"default\",\n density: \"standard\",\n typeScale: \"standard\",\n};\n\nfunction matches(value: string | undefined, candidates: string[]): boolean {\n if (!value) return false;\n return candidates.some((c) => value === c || value.endsWith(`.${c}`) || value.includes(c));\n}\n\nfunction chooseHighestScore(\n scores: Record<ComponentStylePreset, number>,\n fallback: ComponentStylePreset,\n): ComponentStylePreset {\n let best: ComponentStylePreset = fallback;\n let bestScore = -Infinity;\n // Deterministic: iterate in a fixed key order.\n const order: ComponentStylePreset[] = [\n \"carbon-like\",\n \"soft-card\",\n \"glass\",\n \"bright\",\n \"studio-dark\",\n ];\n for (const key of order) {\n if (scores[key] > bestScore) {\n bestScore = scores[key];\n best = key;\n }\n }\n return bestScore <= 0 ? fallback : best;\n}\n\n/** §7.4 density rules. */\nexport function inferDensity(input: StyleInferenceInput): ComponentDensity {\n if (input.explicit?.density) return input.explicit.density;\n const role = input.slotRole;\n if (input.dataIntensity === \"high\" || input.dataIntensity === \"realtime\") return \"compact\";\n if (\n matches(role, [\"console\", \"timeline\", \"filter\", \"toolbar\", \"navigation\"]) ||\n matches(input.layoutType, [\"DataGridInspector\", \"MonitoringOps\"])\n ) {\n return \"compact\";\n }\n if (input.visualEmphasis === \"expressive\" || input.visualEmphasis === \"immersive\") {\n return \"comfortable\";\n }\n if (matches(role, [\"form\", \"inspector\", \"summary\", \"content\", \"preview\"])) return \"standard\";\n if (input.taskMode === \"wizard\" || input.taskMode === \"copilot\") return \"comfortable\";\n if (input.breakpoint === \"mobile\" && input.parent?.density === \"compact\") return \"standard\";\n return input.parent?.density ?? \"standard\";\n}\n\n/** §7.5 typeScale rules. */\nexport function inferTypeScale(input: StyleInferenceInput): ComponentTypeScale {\n if (input.explicit?.typeScale) return input.explicit.typeScale;\n const role = input.slotRole;\n if (typeof input.containerWidth === \"number\" && input.containerWidth < 360) return \"compact\";\n if (matches(role, [\"toolbar\", \"navigation\", \"console\", \"timeline\"])) return \"compact\";\n if (matches(input.layoutType, [\"DataGridInspector\", \"MonitoringOps\"])) return \"compact\";\n if (input.taskMode === \"wizard\" || matches(role, [\"summary\", \"emptyState\"])) return \"large\";\n if (input.breakpoint === \"mobile\") return \"standard\";\n if (matches(role, [\"form\", \"inspector\", \"content\", \"preview\"])) return \"standard\";\n return input.parent?.typeScale ?? \"standard\";\n}\n\n/** §7.6 scoring preset resolver. */\nexport function inferComponentStyle(input: StyleInferenceInput): ComponentStyleParams {\n const presetScores: Record<ComponentStylePreset, number> = {\n \"carbon-like\": 0,\n \"soft-card\": 0,\n glass: 0,\n bright: 0,\n \"studio-dark\": 0,\n };\n\n if (matches(input.layoutType, [\"AdminShell\", \"DataGridInspector\", \"SettingsConsole\"])) {\n presetScores[\"carbon-like\"] += 4;\n }\n if (matches(input.layoutType, [\"DashboardBento\", \"SearchCatalog\"])) {\n presetScores[\"soft-card\"] += 4;\n }\n if (matches(input.layoutType, [\"SpatialHud\"]) || input.surface === \"floating\") {\n presetScores.glass += 4;\n }\n if (matches(input.layoutType, [\"WizardComposer\"]) || input.taskMode === \"wizard\") {\n presetScores.bright += 4;\n }\n if (\n matches(input.layoutType, [\"Workbench\", \"CanvasInspector\", \"MonitoringOps\", \"Playground\"]) ||\n matches(input.slotRole, [\"console\", \"canvas\", \"timeline\"])\n ) {\n presetScores[\"studio-dark\"] += 4;\n }\n\n // Deep nested form/filter/inspector → bias toward stable carbon.\n if (input.depth >= 2 && matches(input.slotRole, [\"form\", \"filter\", \"inspector\"])) {\n presetScores[\"carbon-like\"] += 2;\n }\n\n const preset =\n input.explicit?.preset ??\n chooseHighestScore(presetScores, input.parent?.preset ?? defaultComponentStyle.preset);\n\n return {\n preset,\n palette: input.explicit?.palette ?? input.parent?.palette ?? \"default\",\n density: inferDensity(input),\n typeScale: inferTypeScale(input),\n };\n}\n","/**\n * Context propagation (`layout-spec.md` §6, §8).\n *\n * Builds the root `LayoutRuntimeContext` and composes a child context for each\n * slot: it derives the child surface/taskMode/etc. and runs `inferComponentStyle`\n * so the descendant components receive consistent, inferred style params.\n */\nimport type {\n ComponentStyleParams,\n ContextPolicy,\n LayoutNode,\n LayoutRuntimeContext,\n LayoutViewport,\n SlotContent,\n SlotDefinition,\n StyleInferenceInput,\n SurfaceRole,\n} from \"../schema/types.js\";\nimport { defaultComponentStyle, inferComponentStyle } from \"./style.js\";\nimport { resolveTokens } from \"../tokens/preset-tokens.js\";\n\nexport const defaultContextPolicy: ContextPolicy = {\n inheritStyle: true,\n inheritDensity: true,\n inheritTypeScale: true,\n inheritSurface: false,\n isolateState: false,\n isolateScroll: true,\n allowComponentOverride: true,\n maxDepth: 8,\n};\n\nexport const defaultViewport: LayoutViewport = {\n breakpoint: \"desktop\",\n width: 1440,\n height: 900,\n pointer: \"fine\",\n colorScheme: \"light\",\n};\n\nexport interface RootContextInput {\n viewport?: Partial<LayoutViewport>;\n surface?: SurfaceRole;\n style?: Partial<ComponentStyleParams>;\n route?: LayoutRuntimeContext[\"route\"];\n permissions?: string[];\n}\n\n/** Build the top-level context an app mounts the renderer with. */\nexport function createRootContext(input: RootContextInput = {}): LayoutRuntimeContext {\n const viewport: LayoutViewport = { ...defaultViewport, ...input.viewport };\n const componentStyle: ComponentStyleParams = {\n ...defaultComponentStyle,\n ...input.style,\n };\n return {\n path: [],\n depth: 0,\n ancestry: [],\n viewport,\n container: { width: viewport.width, height: viewport.height },\n route: input.route,\n surface: input.surface ?? \"app\",\n componentStyle,\n tokens: resolveTokens(componentStyle),\n stateScope: \"session\",\n permissions: input.permissions ? { granted: new Set(input.permissions) } : undefined,\n };\n}\n\nfunction inferChildSurface(\n parent: LayoutRuntimeContext,\n node: LayoutNode,\n slot: SlotDefinition,\n): SurfaceRole {\n return (\n slot.contextTransform?.surface ??\n node.styleIntent?.surface ??\n (parent.surface === \"app\" ? \"page\" : parent.surface)\n );\n}\n\n/** §7.1 — assemble the inference input from parent context + node + slot. */\nexport function buildStyleInferenceInput(args: {\n parent: LayoutRuntimeContext;\n node: LayoutNode;\n slot: SlotDefinition;\n content: SlotContent;\n}): StyleInferenceInput {\n const { parent, node, slot, content } = args;\n const surface = inferChildSurface(parent, node, slot);\n const explicit: Partial<ComponentStyleParams> = {\n ...node.styleIntent,\n ...slot.contextTransform?.styleIntent,\n ...(slot.contextTransform?.densityHint ? { density: slot.contextTransform.densityHint } : {}),\n ...(slot.contextTransform?.typeScaleHint ? { typeScale: slot.contextTransform.typeScaleHint } : {}),\n ...(content.kind === \"component\" ? content.styleOverride : undefined),\n };\n return {\n parent: parent.componentStyle,\n explicit,\n layoutType: node.type,\n layoutTier: node.tier,\n layoutVariant: node.variant,\n surface,\n slotRole: slot.role,\n taskMode: node.styleIntent?.taskMode ?? parent.taskMode,\n dataIntensity: node.styleIntent?.dataIntensity ?? parent.dataIntensity,\n interactionMode: node.styleIntent?.interactionMode ?? parent.interactionMode,\n visualEmphasis: node.styleIntent?.visualEmphasis ?? parent.visualEmphasis,\n depth: parent.depth + 1,\n breakpoint: parent.viewport.breakpoint,\n containerWidth: parent.container.width,\n };\n}\n\n/** §8.1 — compose the child runtime context for a slot. */\nexport function composeLayoutContext(args: {\n parent: LayoutRuntimeContext;\n node: LayoutNode;\n slot: SlotDefinition;\n content: SlotContent;\n}): LayoutRuntimeContext {\n const { parent, node, slot, content } = args;\n const styleInput = buildStyleInferenceInput(args);\n const componentStyle = inferComponentStyle(styleInput);\n const surface = styleInput.surface;\n\n return {\n ...parent,\n path: [...parent.path, node.id, slot.name],\n depth: parent.depth + 1,\n ancestry: [\n ...parent.ancestry,\n {\n id: node.id,\n type: node.type,\n tier: node.tier,\n surface: node.styleIntent?.surface,\n slotRole: slot.role,\n },\n ],\n slot: {\n name: slot.name,\n role: slot.role,\n priority: slot.priority?.value,\n surface: slot.contextTransform?.surface,\n },\n surface,\n taskMode: node.styleIntent?.taskMode ?? parent.taskMode,\n dataIntensity: node.styleIntent?.dataIntensity ?? parent.dataIntensity,\n interactionMode: node.styleIntent?.interactionMode ?? parent.interactionMode,\n visualEmphasis: node.styleIntent?.visualEmphasis ?? parent.visualEmphasis,\n componentStyle,\n tokens: resolveTokens(componentStyle),\n stateScope: node.state?.scope ?? parent.stateScope,\n };\n}\n","/**\n * Responsive physical plan (`layout-spec.md` §10).\n *\n * Maps a logical layout node + its registry slot definitions + the viewport (and\n * optional user collapse/pin state) to a `PhysicalLayoutPlan` describing each\n * slot's placement, visibility and collapse. Page-layout renderers consume the\n * plan so the same AST yields different desktop/tablet/mobile arrangements.\n */\nimport type {\n Breakpoint,\n LayoutNode,\n LayoutRegistryItem,\n LayoutViewport,\n PersistedLayoutState,\n PhysicalLayoutPlan,\n PhysicalRegion,\n SlotDefinition,\n SlotRole,\n} from \"../schema/types.js\";\n\nconst BREAKPOINT_ORDER: Breakpoint[] = [\n \"mobile\",\n \"tablet\",\n \"laptop\",\n \"desktop\",\n \"wide\",\n \"ultra\",\n];\n\nexport function breakpointRank(bp: Breakpoint): number {\n return BREAKPOINT_ORDER.indexOf(bp);\n}\n\nexport function isNarrow(bp: Breakpoint): boolean {\n return breakpointRank(bp) <= breakpointRank(\"tablet\");\n}\n\nconst PLACEMENT_BY_ROLE: Partial<Record<SlotRole, PhysicalRegion[\"placement\"]>> = {\n navigation: \"inline-start\",\n filter: \"inline-start\",\n inspector: \"inline-end\",\n secondary: \"inline-end\",\n toolbar: \"block-start\",\n search: \"block-start\",\n status: \"block-start\",\n console: \"block-end\",\n footer: \"block-end\",\n timeline: \"block-end\",\n summary: \"inline-end\",\n preview: \"inline-end\",\n drawer: \"overlay\",\n modal: \"overlay\",\n overlay: \"overlay\",\n};\n\nfunction placementFor(slot: SlotDefinition): PhysicalRegion[\"placement\"] {\n return PLACEMENT_BY_ROLE[slot.role] ?? \"center\";\n}\n\nexport interface ResolvePlanInput {\n node: LayoutNode;\n item: LayoutRegistryItem;\n viewport: LayoutViewport;\n state?: PersistedLayoutState;\n}\n\n/** Compute the physical plan for a single layout node. */\nexport function resolvePhysicalPlan(input: ResolvePlanInput): PhysicalLayoutPlan {\n const { node, item, viewport, state } = input;\n const narrow = isNarrow(viewport.breakpoint);\n const bpRank = breakpointRank(viewport.breakpoint);\n\n const regions: PhysicalRegion[] = item.slots.map((slot) => {\n const present = node.slots[slot.name] !== undefined;\n const persisted = state?.panels?.[slot.name];\n const placement = placementFor(slot);\n\n let visible = present;\n let collapsed = persisted?.collapsed ?? false;\n let layer: PhysicalRegion[\"layer\"] | undefined;\n let regionPlacement = placement;\n\n // Apply responsive slot policy.\n if (slot.responsive?.hideBelow && bpRank < breakpointRank(slot.responsive.hideBelow)) {\n visible = false;\n }\n if (slot.responsive?.collapseBelow && bpRank < breakpointRank(slot.responsive.collapseBelow)) {\n collapsed = true;\n }\n\n // Apply narrow-screen behavior from slot priority (never drop a required\n // primary/content slot — demote supporting panes to drawers/sheets instead).\n if (narrow && slot.priority) {\n switch (slot.priority.behaviorOnNarrow) {\n case \"collapse\":\n collapsed = true;\n break;\n case \"hide\":\n if (!slot.required) visible = false;\n break;\n case \"move-to-drawer\":\n regionPlacement = \"overlay\";\n layer = \"drawer\";\n break;\n case \"move-to-bottom-sheet\":\n regionPlacement = \"overlay\";\n layer = \"sheet\";\n break;\n case \"route-stack\":\n case \"tabs\":\n case \"keep\":\n default:\n break;\n }\n }\n\n return {\n slot: slot.name,\n placement: regionPlacement,\n visible,\n collapsed,\n mounted: present,\n layer,\n size: persisted?.width\n ? { width: persisted.width }\n : persisted?.height\n ? { height: persisted.height }\n : undefined,\n };\n });\n\n const mode: PhysicalLayoutPlan[\"mode\"] = narrow\n ? regions.some((r) => r.layer === \"drawer\" || r.layer === \"sheet\")\n ? \"drawer-assisted\"\n : \"single-pane\"\n : \"multi-pane\";\n\n return { layoutId: node.id, mode, regions };\n}\n\n/** Convenience: get the region for a slot from a plan. */\nexport function regionFor(\n plan: PhysicalLayoutPlan,\n slot: string,\n): PhysicalRegion | undefined {\n return plan.regions.find((r) => r.slot === slot);\n}\n","/**\n * Layout registry (`layout-spec.md` §9).\n *\n * Maps a layout `type` (e.g. \"PageLayout.Workbench\") to its `LayoutRegistryItem`\n * (slots, renderer, default composition/style intent). The recursive renderer\n * and the validator consult it; it is also the source the builder/copilot read\n * to discover available layouts and their slot contracts.\n */\nimport type { LayoutRegistryItem } from \"../schema/types.js\";\n\nexport class LayoutRegistry {\n private readonly items = new Map<string, LayoutRegistryItem>();\n\n register(item: LayoutRegistryItem): this {\n this.items.set(item.type, item);\n return this;\n }\n\n registerAll(items: readonly LayoutRegistryItem[]): this {\n for (const item of items) this.register(item);\n return this;\n }\n\n get(type: string): LayoutRegistryItem | undefined {\n return this.items.get(type);\n }\n\n has(type: string): boolean {\n return this.items.has(type);\n }\n\n list(): LayoutRegistryItem[] {\n return [...this.items.values()];\n }\n\n types(): string[] {\n return [...this.items.keys()];\n }\n\n byTier(tier: LayoutRegistryItem[\"tier\"]): LayoutRegistryItem[] {\n return this.list().filter((i) => i.tier === tier);\n }\n\n byCategory(category: LayoutRegistryItem[\"category\"]): LayoutRegistryItem[] {\n return this.list().filter((i) => i.category === category);\n }\n}\n","/**\n * Layout primitives (`layout-spec.md` §14, §19): Panel, SplitPane, Tabs, Stepper.\n *\n * Each is a `LayoutRegistryItem` whose renderer arranges the engine-rendered\n * `slots` map. Tabs/Stepper read their `composition` and render inline content\n * via `SlotContentRenderer`, carrying a11y semantics (§12).\n */\nimport * as React from \"react\";\nimport type {\n LayoutRegistryItem,\n LayoutRendererProps,\n ParallelComposition,\n StepperComposition,\n SwitchComposition,\n} from \"../schema/types.js\";\nimport { SlotContentRenderer } from \"../renderer/renderer.js\";\nimport { inlineSlot } from \"../renderer/region.js\";\n\n/* ----------------------------- Panel ----------------------------- */\n\nfunction PanelRenderer({ slots, context }: LayoutRendererProps) {\n return (\n <section\n className=\"eth-ls-panel\"\n style={{\n background: context.tokens.surface,\n border: `1px solid ${context.tokens.border}`,\n borderRadius: context.tokens.radius,\n boxShadow: context.tokens.shadow,\n color: context.tokens.text,\n }}\n >\n {slots.header ? <header className=\"eth-ls-panel__header\">{slots.header}</header> : null}\n <div className=\"eth-ls-panel__body\">{slots.body}</div>\n {slots.footer ? <footer className=\"eth-ls-panel__footer\">{slots.footer}</footer> : null}\n </section>\n );\n}\n\nexport const PanelLayout: LayoutRegistryItem = {\n type: \"Primitive.Panel\",\n displayName: \"Panel\",\n tier: \"primitive\",\n category: \"primitive\",\n description: \"A bounded surface with optional header/body/footer.\",\n slots: [\n { name: \"header\", role: \"toolbar\", accepts: [{ kind: \"component\" }, { kind: \"fragment\" }] },\n {\n name: \"body\",\n role: \"content\",\n required: true,\n accepts: [{ kind: \"component\" }, { kind: \"layout\" }, { kind: \"fragment\" }],\n },\n { name: \"footer\", role: \"footer\", accepts: [{ kind: \"component\" }, { kind: \"fragment\" }] },\n ],\n defaultStyleIntent: { surface: \"panel\" },\n renderer: PanelRenderer,\n};\n\n/* --------------------------- SplitPane --------------------------- */\n\nfunction SplitPaneRenderer({ slots, context, composition, variant }: LayoutRendererProps) {\n const orientation = variant === \"vertical\" ? \"vertical\" : \"horizontal\";\n const parallel = composition?.op === \"parallel\" ? (composition as ParallelComposition) : undefined;\n const primaryBasis = parallel?.sizing?.primary?.basis;\n return (\n <div\n className={`eth-ls-split eth-ls-split--${orientation}`}\n style={{\n display: \"grid\",\n gap: parallel?.gapToken ? `var(${parallel.gapToken})` : context.tokens.gap,\n gridTemplateColumns:\n orientation === \"horizontal\"\n ? `${primaryBasis ? cssSize(primaryBasis) : \"1fr\"} 1fr`\n : undefined,\n gridTemplateRows: orientation === \"vertical\" ? `${primaryBasis ? cssSize(primaryBasis) : \"1fr\"} 1fr` : undefined,\n height: \"100%\",\n minHeight: 0,\n }}\n >\n <div className=\"eth-ls-split__pane eth-ls-split__pane--primary\" style={{ minWidth: 0, minHeight: 0 }}>\n {slots.primary}\n </div>\n <div\n className=\"eth-ls-split__pane eth-ls-split__pane--secondary\"\n role=\"separator\"\n aria-orientation={orientation}\n style={{ minWidth: 0, minHeight: 0 }}\n >\n {slots.secondary}\n </div>\n </div>\n );\n}\n\nfunction cssSize(value: number | string): string {\n return typeof value === \"number\" ? `${value}px` : value;\n}\n\nexport const SplitPaneLayout: LayoutRegistryItem = {\n type: \"Primitive.SplitPane\",\n displayName: \"Split Pane\",\n tier: \"primitive\",\n category: \"primitive\",\n description: \"Two resizable panes split horizontally or vertically.\",\n variants: [\n { id: \"horizontal\", label: \"Left / Right\" },\n { id: \"vertical\", label: \"Top / Bottom\" },\n ],\n slots: [\n {\n name: \"primary\",\n role: \"primary\",\n required: true,\n accepts: [{ kind: \"component\" }, { kind: \"layout\" }, { kind: \"template\" }, { kind: \"fragment\" }],\n },\n {\n name: \"secondary\",\n role: \"secondary\",\n required: true,\n accepts: [{ kind: \"component\" }, { kind: \"layout\" }, { kind: \"template\" }, { kind: \"fragment\" }],\n },\n ],\n defaultComposition: {\n op: \"parallel\",\n axis: \"x\",\n slots: [\"primary\", \"secondary\"],\n sizing: { primary: { basis: \"1fr\", resizable: true }, secondary: { grow: 1 } },\n },\n renderer: SplitPaneRenderer,\n};\n\n/* ----------------------------- Tabs ------------------------------ */\n\nfunction TabsRenderer({ node, context, composition }: LayoutRendererProps) {\n const switchSpec =\n composition?.op === \"switch\" ? (composition as SwitchComposition) : undefined;\n const items = switchSpec?.items ?? [];\n const initial = switchSpec?.activeKey ?? items[0]?.key;\n const [active, setActive] = React.useState<string | undefined>(initial);\n const activeItem = items.find((i) => i.key === active) ?? items[0];\n\n return (\n <div className=\"eth-ls-tabs\" style={{ color: context.tokens.text }}>\n <div className=\"eth-ls-tabs__list\" role=\"tablist\">\n {items.map((item) => {\n const selected = item.key === activeItem?.key;\n return (\n <button\n key={item.key}\n type=\"button\"\n role=\"tab\"\n id={`tab-${node.id}-${item.key}`}\n aria-selected={selected}\n aria-controls={`tabpanel-${node.id}-${item.key}`}\n tabIndex={selected ? 0 : -1}\n className={`eth-ls-tabs__tab${selected ? \" eth-ls-tabs__tab--active\" : \"\"}`}\n onClick={() => setActive(item.key)}\n >\n {item.label}\n </button>\n );\n })}\n </div>\n {activeItem ? (\n <div\n className=\"eth-ls-tabs__panel\"\n role=\"tabpanel\"\n id={`tabpanel-${node.id}-${activeItem.key}`}\n aria-labelledby={`tab-${node.id}-${activeItem.key}`}\n >\n <SlotContentRenderer\n node={node}\n slot={inlineSlot(`tab:${activeItem.key}`, \"content\")}\n content={activeItem.content}\n parentContext={context}\n />\n </div>\n ) : null}\n </div>\n );\n}\n\nexport const TabsLayout: LayoutRegistryItem = {\n type: \"Primitive.Tabs\",\n displayName: \"Tabs\",\n tier: \"primitive\",\n category: \"primitive\",\n description: \"Switch composition rendering one panel at a time with tablist semantics.\",\n slots: [],\n defaultComposition: { op: \"switch\", mode: \"tabs\", items: [] },\n renderer: TabsRenderer,\n};\n\n/* ---------------------------- Stepper ---------------------------- */\n\nfunction StepperRenderer({ node, context, composition }: LayoutRendererProps) {\n const stepper =\n composition?.op === \"stepper\" ? (composition as StepperComposition) : undefined;\n const steps = stepper?.steps ?? [];\n const firstActive = steps.findIndex((s) => s.status === \"active\");\n const [activeIndex, setActiveIndex] = React.useState<number>(firstActive >= 0 ? firstActive : 0);\n const orientation = stepper?.orientation ?? \"horizontal\";\n const activeStep = steps[activeIndex];\n\n return (\n <div\n className={`eth-ls-stepper eth-ls-stepper--${orientation}`}\n style={{ display: \"flex\", flexDirection: orientation === \"vertical\" ? \"row\" : \"column\", gap: context.tokens.gap, color: context.tokens.text }}\n >\n <ol className=\"eth-ls-stepper__steps\" aria-label=\"Steps\">\n {steps.map((step, index) => {\n const current = index === activeIndex;\n return (\n <li\n key={step.id}\n className={`eth-ls-stepper__step eth-ls-stepper__step--${step.status ?? \"pending\"}${current ? \" eth-ls-stepper__step--current\" : \"\"}`}\n aria-current={current ? \"step\" : undefined}\n >\n <button type=\"button\" className=\"eth-ls-stepper__step-button\" onClick={() => setActiveIndex(index)}>\n <span className=\"eth-ls-stepper__index\">{index + 1}</span>\n <span className=\"eth-ls-stepper__label\">{step.label}</span>\n </button>\n </li>\n );\n })}\n </ol>\n {activeStep ? (\n <div className=\"eth-ls-stepper__content\">\n <SlotContentRenderer\n node={node}\n slot={inlineSlot(`step:${activeStep.id}`, \"form\")}\n content={activeStep.content}\n parentContext={context}\n />\n </div>\n ) : null}\n </div>\n );\n}\n\nexport const StepperLayout: LayoutRegistryItem = {\n type: \"Primitive.Stepper\",\n displayName: \"Stepper\",\n tier: \"primitive\",\n category: \"primitive\",\n description: \"Flow-oriented step container with validation/navigation semantics.\",\n variants: [{ id: \"horizontal\" }, { id: \"vertical\" }, { id: \"with-preview\" }],\n slots: [],\n defaultComposition: {\n op: \"stepper\",\n orientation: \"horizontal\",\n stepSlot: \"stepper\",\n contentSlot: \"content\",\n steps: [],\n },\n defaultStyleIntent: { taskMode: \"wizard\", visualEmphasis: \"balanced\" },\n renderer: StepperRenderer,\n};\n\nexport const primitiveLayouts: LayoutRegistryItem[] = [\n PanelLayout,\n SplitPaneLayout,\n TabsLayout,\n StepperLayout,\n];\n","/**\n * Recursive renderer (`layout-spec.md` §8.2).\n *\n * Walks a `LayoutNode`: resolves its registry item, renders each slot's content\n * into a React node under a recomposed child context, computes the physical\n * plan, and hands the pre-rendered `slots` map to the item's renderer.\n *\n * `SlotContentRenderer` is exported so composition renderers (Tabs/Stepper) can\n * render inline `SlotContent` (switch items / stepper steps) with correct child\n * context.\n */\nimport * as React from \"react\";\nimport { StyleScope } from \"@echothink-ui/style\";\nimport type {\n ComponentSlotContent,\n LayoutNode,\n LayoutRuntimeContext,\n SlotContent,\n SlotDefinition,\n} from \"../schema/types.js\";\nimport { composeLayoutContext } from \"../inference/context.js\";\nimport { resolvePhysicalPlan } from \"../inference/responsive.js\";\nimport {\n LayoutContextProvider,\n useLayoutContext,\n useLayoutEngine,\n type LayoutEngine,\n} from \"./context.js\";\n\n/* ------------------------------------------------------------------ *\n * Fallback surfaces for unknown types — never throw at render time.\n * ------------------------------------------------------------------ */\n\nfunction UnknownLayout({ type }: { type: string }) {\n return (\n <div data-ls-unknown-layout={type} className=\"eth-ls-unknown\" role=\"note\">\n Unknown layout type: <code>{type}</code>\n </div>\n );\n}\n\nfunction UnknownComponent({ name }: { name: string }) {\n return (\n <div data-ls-unknown-component={name} className=\"eth-ls-unknown\" role=\"note\">\n Unknown component: <code>{name}</code>\n </div>\n );\n}\n\nfunction EmptySlot({ reason }: { reason?: string }) {\n return (\n <div data-ls-empty={reason ?? \"not-configured\"} className=\"eth-ls-empty\" aria-hidden=\"true\" />\n );\n}\n\n/* ------------------------------------------------------------------ *\n * Component leaf — the style boundary.\n * ------------------------------------------------------------------ */\n\nfunction ComponentRenderer({\n content,\n context,\n}: {\n content: ComponentSlotContent;\n context: LayoutRuntimeContext;\n}) {\n const engine = useLayoutEngine();\n const Component = engine.componentResolver(content.component);\n if (!Component) return <UnknownComponent name={content.component} />;\n const s = context.componentStyle;\n // The StyleScope wrapper is the ONLY place style reaches a component: it sets\n // the preset/palette/density/typeScale classes + data-attrs the `@echothink-ui`\n // components read via the CSS cascade. We intentionally do NOT inject\n // styleParams/layoutContext as props (avoids DOM prop leakage).\n return (\n <StyleScope\n preset={s.preset}\n palette={s.palette}\n density={s.density}\n typeScale={s.typeScale}\n global={false}\n className=\"eth-ls-component\"\n data-ls-component={content.component}\n >\n <Component {...(content.props ?? {})} />\n </StyleScope>\n );\n}\n\n/* ------------------------------------------------------------------ *\n * Render a SlotContent within an already-composed child context.\n * ------------------------------------------------------------------ */\n\nfunction renderContent(\n content: SlotContent,\n context: LayoutRuntimeContext,\n engine: LayoutEngine,\n): React.ReactNode {\n switch (content.kind) {\n case \"component\":\n return <ComponentRenderer content={content} context={context} />;\n case \"layout\":\n return <LayoutRenderer node={content.layout} />;\n case \"template\": {\n const resolved = engine.templateResolver?.(content.template);\n if (!resolved) return <UnknownComponent name={`template:${content.template}`} />;\n return <LayoutRenderer node={resolved} />;\n }\n case \"fragment\": {\n const direction =\n content.composition?.op === \"stack\" && content.composition.direction === \"horizontal\"\n ? \"row\"\n : \"column\";\n return (\n <div className=\"eth-ls-fragment\" style={{ display: \"flex\", flexDirection: direction, gap: context.tokens.gap }}>\n {content.items.map((item, i) => (\n <React.Fragment key={i}>{renderContent(item, context, engine)}</React.Fragment>\n ))}\n </div>\n );\n }\n case \"empty\":\n return <EmptySlot reason={content.reason} />;\n default:\n return null;\n }\n}\n\nexport interface SlotContentRendererProps {\n node: LayoutNode;\n slot: SlotDefinition;\n content: SlotContent;\n /** Context of the layout node that owns the slot. */\n parentContext: LayoutRuntimeContext;\n}\n\n/** Render one slot's content under a freshly composed child context. */\nexport function SlotContentRenderer({\n node,\n slot,\n content,\n parentContext,\n}: SlotContentRendererProps) {\n const engine = useLayoutEngine();\n const childContext = React.useMemo(\n () => composeLayoutContext({ parent: parentContext, node, slot, content }),\n [parentContext, node, slot, content],\n );\n return (\n <LayoutContextProvider value={childContext}>\n {renderContent(content, childContext, engine)}\n </LayoutContextProvider>\n );\n}\n\n/* ------------------------------------------------------------------ *\n * The recursive layout renderer.\n * ------------------------------------------------------------------ */\n\nexport function LayoutRenderer({ node }: { node: LayoutNode }) {\n const parentContext = useLayoutContext();\n const engine = useLayoutEngine();\n const item = engine.registry.get(node.type);\n\n if (!item) return <UnknownLayout type={node.type} />;\n\n const slots: Record<string, React.ReactNode> = {};\n for (const slotDef of item.slots) {\n const content = node.slots[slotDef.name] ?? slotDef.fallback?.empty;\n if (content === undefined) continue;\n slots[slotDef.name] = (\n <SlotContentRenderer\n node={node}\n slot={slotDef}\n content={content}\n parentContext={parentContext}\n />\n );\n }\n\n const plan = resolvePhysicalPlan({\n node,\n item,\n viewport: parentContext.viewport,\n state: engine.stateStore.get(node.id),\n });\n\n const Renderer = item.renderer;\n return (\n <Renderer\n node={node}\n variant={node.variant}\n props={{ ...item.defaultProps, ...node.props }}\n slots={slots}\n context={parentContext}\n composition={node.composition ?? item.defaultComposition}\n plan={plan}\n />\n );\n}\n","/**\n * React contexts for the layout engine.\n *\n * Two contexts:\n * - `LayoutRuntimeContext` — the per-node runtime context (style/surface/depth/\n * tokens) that flows down and is recomposed at each slot boundary.\n * - `LayoutEngine` — the engine config (registry + resolvers + state store +\n * diagnostics sink). Decoupled from any component catalog: the host injects a\n * `componentResolver` and optional `templateResolver`.\n */\nimport * as React from \"react\";\nimport type {\n LayoutDiagnostic,\n LayoutNode,\n LayoutRuntimeContext,\n} from \"../schema/types.js\";\nimport { createRootContext } from \"../inference/context.js\";\nimport { LayoutRegistry } from \"../registry/registry.js\";\nimport type { LayoutStateStore } from \"../runtime/state.js\";\nimport { createMemoryLayoutStateStore } from \"../runtime/state.js\";\n\nexport type ComponentResolver = (\n name: string,\n) => React.ComponentType<Record<string, unknown>> | undefined;\n\nexport type TemplateResolver = (name: string) => LayoutNode | undefined;\n\nexport interface LayoutEngine {\n registry: LayoutRegistry;\n componentResolver: ComponentResolver;\n templateResolver?: TemplateResolver;\n stateStore: LayoutStateStore;\n onDiagnostics?: (diagnostics: LayoutDiagnostic[]) => void;\n}\n\nconst RuntimeContext = React.createContext<LayoutRuntimeContext>(createRootContext());\nconst EngineContext = React.createContext<LayoutEngine | null>(null);\n\nexport function LayoutContextProvider({\n value,\n children,\n}: {\n value: LayoutRuntimeContext;\n children: React.ReactNode;\n}) {\n return <RuntimeContext.Provider value={value}>{children}</RuntimeContext.Provider>;\n}\n\nexport function useLayoutContext(): LayoutRuntimeContext {\n return React.useContext(RuntimeContext);\n}\n\nexport function LayoutEngineProvider({\n value,\n children,\n}: {\n value: LayoutEngine;\n children: React.ReactNode;\n}) {\n return <EngineContext.Provider value={value}>{children}</EngineContext.Provider>;\n}\n\nexport function useLayoutEngine(): LayoutEngine {\n const engine = React.useContext(EngineContext);\n if (!engine) {\n throw new Error(\n \"useLayoutEngine must be used within <LayoutRoot> / <LayoutEngineProvider>.\",\n );\n }\n return engine;\n}\n\nexport interface BuildEngineInput {\n registry: LayoutRegistry;\n componentResolver: ComponentResolver;\n templateResolver?: TemplateResolver;\n stateStore?: LayoutStateStore;\n onDiagnostics?: (diagnostics: LayoutDiagnostic[]) => void;\n}\n\nexport function buildEngine(input: BuildEngineInput): LayoutEngine {\n return {\n registry: input.registry,\n componentResolver: input.componentResolver,\n templateResolver: input.templateResolver,\n stateStore: input.stateStore ?? createMemoryLayoutStateStore(),\n onDiagnostics: input.onDiagnostics,\n };\n}\n","/**\n * Layout state persistence (`layout-spec.md` §11).\n *\n * A minimal pluggable store for per-layout panel state (collapse/pin/width/\n * active tab/split ratio) + style preference. Default is an in-memory +\n * localStorage-backed store; the host can inject its own (e.g. server-synced).\n */\nimport type { PersistedLayoutState } from \"../schema/types.js\";\n\nexport interface LayoutStateStore {\n get(layoutId: string): PersistedLayoutState | undefined;\n set(layoutId: string, state: PersistedLayoutState): void;\n patchPanel(\n layoutId: string,\n slot: string,\n patch: Partial<PersistedLayoutState[\"panels\"][string]>,\n ): PersistedLayoutState;\n}\n\nfunction emptyState(layoutId: string): PersistedLayoutState {\n return {\n schemaVersion: 2,\n layoutId,\n panels: {},\n updatedAt: \"\",\n };\n}\n\n/** In-memory store; optionally mirrors to localStorage when available. */\nexport function createMemoryLayoutStateStore(opts?: {\n persistKey?: string;\n}): LayoutStateStore {\n const cache = new Map<string, PersistedLayoutState>();\n const persistKey = opts?.persistKey;\n\n function load(): void {\n if (!persistKey || typeof localStorage === \"undefined\") return;\n try {\n const raw = localStorage.getItem(persistKey);\n if (!raw) return;\n const parsed = JSON.parse(raw) as Record<string, PersistedLayoutState>;\n for (const [id, st] of Object.entries(parsed)) cache.set(id, st);\n } catch {\n /* ignore corrupt state */\n }\n }\n\n function flush(): void {\n if (!persistKey || typeof localStorage === \"undefined\") return;\n try {\n localStorage.setItem(persistKey, JSON.stringify(Object.fromEntries(cache)));\n } catch {\n /* ignore quota errors */\n }\n }\n\n load();\n\n return {\n get(layoutId) {\n return cache.get(layoutId);\n },\n set(layoutId, state) {\n cache.set(layoutId, state);\n flush();\n },\n patchPanel(layoutId, slot, patch) {\n const current = cache.get(layoutId) ?? emptyState(layoutId);\n const next: PersistedLayoutState = {\n ...current,\n panels: { ...current.panels, [slot]: { ...current.panels[slot], ...patch } },\n // `updatedAt` is set by the caller environment; left as a marker here.\n updatedAt: current.updatedAt || \"pending\",\n };\n cache.set(layoutId, next);\n flush();\n return next;\n },\n };\n}\n","/**\n * Renderer helpers shared by primitive/region/page-layout renderers.\n */\nimport type {\n NodeAcceptSpec,\n PhysicalLayoutPlan,\n SlotDefinition,\n SlotRole,\n} from \"../schema/types.js\";\nimport { regionFor } from \"../inference/responsive.js\";\n\nconst ANY_ACCEPTS: NodeAcceptSpec[] = [\n { kind: \"component\" },\n { kind: \"layout\" },\n { kind: \"template\" },\n { kind: \"fragment\" },\n { kind: \"empty\" },\n];\n\n/** Synthesize a slot definition for composition-embedded content (tabs/steps). */\nexport function inlineSlot(name: string, role: SlotRole = \"content\"): SlotDefinition {\n return { name, role, accepts: ANY_ACCEPTS };\n}\n\n/** Whether a slot's physical region is visible (default true when absent). */\nexport function isVisible(plan: PhysicalLayoutPlan, slot: string): boolean {\n const region = regionFor(plan, slot);\n return region ? region.visible : true;\n}\n\n/** Whether a slot's physical region is collapsed. */\nexport function isCollapsed(plan: PhysicalLayoutPlan, slot: string): boolean {\n return regionFor(plan, slot)?.collapsed ?? false;\n}\n","/**\n * Region layouts (`layout-spec.md` §14, §19): Toolbar, Inspector.\n */\nimport * as React from \"react\";\nimport type { LayoutRegistryItem, LayoutRendererProps } from \"../schema/types.js\";\n\n/* ---------------------------- Toolbar ---------------------------- */\n\nfunction ToolbarRenderer({ slots, context }: LayoutRendererProps) {\n return (\n <div\n className=\"eth-ls-toolbar\"\n role=\"toolbar\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: context.tokens.gap,\n background: context.tokens.surfaceMuted,\n borderBottom: `1px solid ${context.tokens.border}`,\n color: context.tokens.text,\n }}\n >\n {slots.start ? <div className=\"eth-ls-toolbar__start\">{slots.start}</div> : null}\n {slots.center ? <div className=\"eth-ls-toolbar__center\" style={{ flex: 1, minWidth: 0 }}>{slots.center}</div> : <div style={{ flex: 1 }} />}\n {slots.end ? <div className=\"eth-ls-toolbar__end\">{slots.end}</div> : null}\n </div>\n );\n}\n\nexport const ToolbarLayout: LayoutRegistryItem = {\n type: \"Region.Toolbar\",\n displayName: \"Toolbar\",\n tier: \"region\",\n category: \"region\",\n description: \"Horizontal toolbar with start/center/end groups and roving focus.\",\n slots: [\n { name: \"start\", role: \"toolbar\", accepts: [{ kind: \"component\" }, { kind: \"fragment\" }] },\n { name: \"center\", role: \"toolbar\", accepts: [{ kind: \"component\" }, { kind: \"fragment\" }] },\n { name: \"end\", role: \"toolbar\", accepts: [{ kind: \"component\" }, { kind: \"fragment\" }] },\n ],\n defaultStyleIntent: { surface: \"region\" },\n renderer: ToolbarRenderer,\n};\n\n/* --------------------------- Inspector --------------------------- */\n\nfunction InspectorRenderer({ slots, context }: LayoutRendererProps) {\n return (\n <aside\n className=\"eth-ls-inspector\"\n aria-label=\"Inspector\"\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n minHeight: 0,\n background: context.tokens.surface,\n borderInlineStart: `1px solid ${context.tokens.border}`,\n color: context.tokens.text,\n }}\n >\n {slots.header ? <header className=\"eth-ls-inspector__header\">{slots.header}</header> : null}\n <div className=\"eth-ls-inspector__body\" style={{ overflow: \"auto\", flex: 1, minHeight: 0 }}>\n {slots.body}\n </div>\n {slots.footer ? <footer className=\"eth-ls-inspector__footer\">{slots.footer}</footer> : null}\n </aside>\n );\n}\n\nexport const InspectorLayout: LayoutRegistryItem = {\n type: \"Region.Inspector\",\n displayName: \"Inspector\",\n tier: \"region\",\n category: \"region\",\n description: \"An inline-end inspector panel with header/body/footer.\",\n slots: [\n { name: \"header\", role: \"toolbar\", accepts: [{ kind: \"component\" }, { kind: \"fragment\" }] },\n {\n name: \"body\",\n role: \"inspector\",\n required: true,\n accepts: [{ kind: \"component\" }, { kind: \"layout\" }, { kind: \"fragment\" }],\n },\n { name: \"footer\", role: \"footer\", accepts: [{ kind: \"component\" }, { kind: \"fragment\" }] },\n ],\n defaultStyleIntent: { surface: \"panel\", interactionMode: \"edit\" },\n renderer: InspectorRenderer,\n};\n\nexport const regionLayouts: LayoutRegistryItem[] = [ToolbarLayout, InspectorLayout];\n","/**\n * Page layouts (`layout-spec.md` §14, §19): AdminShell, DataGridInspector,\n * Workbench, WizardComposer, MonitoringOps, CanvasInspector.\n *\n * Each renderer consumes the resolved `plan` so the same AST yields different\n * desktop/tablet/mobile arrangements (collapsed/hidden supporting panes).\n */\nimport * as React from \"react\";\nimport type { LayoutRegistryItem, LayoutRendererProps } from \"../schema/types.js\";\nimport { isVisible, isCollapsed } from \"../renderer/region.js\";\n\nfunction frameStyle(context: LayoutRendererProps[\"context\"]): React.CSSProperties {\n return {\n display: \"grid\",\n height: \"100%\",\n minHeight: 0,\n background: context.tokens.surfaceMuted,\n color: context.tokens.text,\n };\n}\n\n/* --------------------------- AdminShell -------------------------- */\n\nfunction AdminShellRenderer({ slots, context, plan }: LayoutRendererProps) {\n const navVisible = slots.navigation && isVisible(plan, \"navigation\");\n const navCollapsed = isCollapsed(plan, \"navigation\");\n return (\n <div\n className=\"eth-ls-admin-shell\"\n style={{\n ...frameStyle(context),\n gridTemplateRows: \"auto 1fr auto\",\n gridTemplateColumns: navVisible ? `${navCollapsed ? \"3.5rem\" : \"16rem\"} 1fr` : \"1fr\",\n gridTemplateAreas: navVisible\n ? `\"topbar topbar\" \"nav content\" \"footer footer\"`\n : `\"topbar\" \"content\" \"footer\"`,\n }}\n >\n {slots.topbar ? (\n <header className=\"eth-ls-admin-shell__topbar\" style={{ gridArea: \"topbar\" }}>\n {slots.topbar}\n </header>\n ) : null}\n {navVisible ? (\n <nav className=\"eth-ls-admin-shell__nav\" style={{ gridArea: \"nav\", overflow: \"auto\", borderInlineEnd: `1px solid ${context.tokens.border}` }}>\n {slots.navigation}\n </nav>\n ) : null}\n <main className=\"eth-ls-admin-shell__content\" style={{ gridArea: \"content\", overflow: \"auto\", minWidth: 0 }}>\n {slots.content}\n </main>\n {slots.footer ? (\n <footer className=\"eth-ls-admin-shell__footer\" style={{ gridArea: \"footer\", borderBlockStart: `1px solid ${context.tokens.border}` }}>\n {slots.footer}\n </footer>\n ) : null}\n </div>\n );\n}\n\nexport const AdminShellLayout: LayoutRegistryItem = {\n type: \"PageLayout.AdminShell\",\n displayName: \"Admin Shell\",\n tier: \"page\",\n category: \"app-shell\",\n description: \"Enterprise CRUD shell: topbar, navigation rail, content, footer.\",\n slots: [\n { name: \"topbar\", role: \"toolbar\", accepts: [{ kind: \"component\" }, { kind: \"layout\" }, { kind: \"fragment\" }] },\n {\n name: \"navigation\",\n role: \"navigation\",\n accepts: [{ kind: \"component\" }, { kind: \"layout\" }, { kind: \"fragment\" }],\n priority: { value: 40, behaviorOnNarrow: \"move-to-drawer\" },\n responsive: { collapseBelow: \"laptop\" },\n },\n {\n name: \"content\",\n role: \"content\",\n required: true,\n accepts: [{ kind: \"component\" }, { kind: \"layout\" }, { kind: \"template\" }, { kind: \"fragment\" }],\n priority: { value: 100, behaviorOnNarrow: \"keep\" },\n },\n { name: \"footer\", role: \"footer\", accepts: [{ kind: \"component\" }, { kind: \"fragment\" }] },\n ],\n defaultStyleIntent: { surface: \"app\", taskMode: \"crud\" },\n renderer: AdminShellRenderer,\n};\n\n/* ----------------------- DataGridInspector ----------------------- */\n\nfunction DataGridInspectorRenderer({ slots, context, plan }: LayoutRendererProps) {\n const inspectorVisible = slots.inspector && isVisible(plan, \"inspector\");\n return (\n <div\n className=\"eth-ls-datagrid\"\n style={{\n ...frameStyle(context),\n gridTemplateRows: \"auto 1fr\",\n gridTemplateColumns: inspectorVisible ? \"1fr minmax(18rem, 24rem)\" : \"1fr\",\n gridTemplateAreas: inspectorVisible ? `\"toolbar toolbar\" \"grid inspector\"` : `\"toolbar\" \"grid\"`,\n }}\n >\n {slots.toolbar ? (\n <div className=\"eth-ls-datagrid__toolbar\" style={{ gridArea: \"toolbar\" }}>{slots.toolbar}</div>\n ) : null}\n <div className=\"eth-ls-datagrid__grid\" style={{ gridArea: \"grid\", overflow: \"auto\", minWidth: 0 }}>\n {slots.grid}\n </div>\n {inspectorVisible ? (\n <div className=\"eth-ls-datagrid__inspector\" style={{ gridArea: \"inspector\", overflow: \"auto\", borderInlineStart: `1px solid ${context.tokens.border}` }}>\n {slots.inspector}\n </div>\n ) : null}\n </div>\n );\n}\n\nexport const DataGridInspectorLayout: LayoutRegistryItem = {\n type: \"PageLayout.DataGridInspector\",\n displayName: \"Data Grid + Inspector\",\n tier: \"page\",\n category: \"page\",\n description: \"High-density grid with a toolbar and an inline-end inspector.\",\n slots: [\n { name: \"toolbar\", role: \"toolbar\", accepts: [{ kind: \"component\" }, { kind: \"layout\" }, { kind: \"fragment\" }] },\n {\n name: \"grid\",\n role: \"content\",\n required: true,\n accepts: [{ kind: \"component\" }, { kind: \"layout\" }, { kind: \"fragment\" }],\n priority: { value: 100, behaviorOnNarrow: \"keep\" },\n },\n {\n name: \"inspector\",\n role: \"inspector\",\n accepts: [{ kind: \"component\" }, { kind: \"layout\" }, { kind: \"fragment\" }],\n priority: { value: 50, behaviorOnNarrow: \"move-to-drawer\" },\n },\n ],\n defaultStyleIntent: { surface: \"page\", taskMode: \"crud\", dataIntensity: \"high\" },\n renderer: DataGridInspectorRenderer,\n};\n\n/* ---------------------------- Workbench -------------------------- */\n\nfunction WorkbenchRenderer({ slots, context, plan }: LayoutRendererProps) {\n const explorerVisible = slots.explorer && isVisible(plan, \"explorer\");\n const inspectorVisible = slots.inspector && isVisible(plan, \"inspector\");\n const consoleVisible = slots.console && isVisible(plan, \"console\");\n const cols = [explorerVisible ? \"16rem\" : null, \"1fr\", inspectorVisible ? \"minmax(18rem, 22rem)\" : null]\n .filter(Boolean)\n .join(\" \");\n const areaMid = [explorerVisible ? \"explorer\" : null, \"primary\", inspectorVisible ? \"inspector\" : null]\n .filter(Boolean)\n .join(\" \");\n return (\n <div\n className=\"eth-ls-workbench\"\n style={{\n ...frameStyle(context),\n gridTemplateColumns: cols,\n gridTemplateRows: `auto 1fr ${consoleVisible ? \"minmax(8rem, 16rem)\" : \"0\"}`,\n gridTemplateAreas: `\"${new Array(cols.split(\" \").length).fill(\"toolbar\").join(\" \")}\" \"${areaMid}\" \"${new Array(cols.split(\" \").length).fill(\"console\").join(\" \")}\"`,\n }}\n >\n {slots.toolbar ? <div className=\"eth-ls-workbench__toolbar\" style={{ gridArea: \"toolbar\" }}>{slots.toolbar}</div> : null}\n {explorerVisible ? (\n <nav className=\"eth-ls-workbench__explorer\" style={{ gridArea: \"explorer\", overflow: \"auto\", borderInlineEnd: `1px solid ${context.tokens.border}` }}>\n {slots.explorer}\n </nav>\n ) : null}\n <main className=\"eth-ls-workbench__primary\" style={{ gridArea: \"primary\", overflow: \"auto\", minWidth: 0, minHeight: 0 }}>\n {slots.primary}\n </main>\n {inspectorVisible ? (\n <div className=\"eth-ls-workbench__inspector\" style={{ gridArea: \"inspector\", overflow: \"auto\", borderInlineStart: `1px solid ${context.tokens.border}` }}>\n {slots.inspector}\n </div>\n ) : null}\n {consoleVisible ? (\n <div className=\"eth-ls-workbench__console\" style={{ gridArea: \"console\", overflow: \"auto\", borderBlockStart: `1px solid ${context.tokens.border}` }}>\n {slots.console}\n </div>\n ) : null}\n </div>\n );\n}\n\nexport const WorkbenchLayout: LayoutRegistryItem = {\n type: \"PageLayout.Workbench\",\n displayName: \"Workbench\",\n tier: \"page\",\n category: \"page\",\n description: \"Authoring workbench: toolbar, explorer, primary canvas, inspector, console.\",\n variants: [{ id: \"canvas-primary\" }, { id: \"split-primary\" }],\n slots: [\n { name: \"toolbar\", role: \"toolbar\", accepts: [{ kind: \"component\" }, { kind: \"layout\" }, { kind: \"fragment\" }] },\n {\n name: \"explorer\",\n role: \"navigation\",\n accepts: [{ kind: \"component\" }, { kind: \"layout\" }, { kind: \"fragment\" }],\n priority: { value: 40, behaviorOnNarrow: \"move-to-drawer\" },\n responsive: { collapseBelow: \"laptop\" },\n },\n {\n name: \"primary\",\n role: \"primary\",\n required: true,\n accepts: [{ kind: \"component\" }, { kind: \"layout\" }, { kind: \"template\" }, { kind: \"fragment\" }],\n priority: { value: 100, behaviorOnNarrow: \"keep\" },\n },\n {\n name: \"inspector\",\n role: \"inspector\",\n accepts: [{ kind: \"component\" }, { kind: \"layout\" }, { kind: \"fragment\" }],\n priority: { value: 50, behaviorOnNarrow: \"move-to-drawer\" },\n },\n {\n name: \"console\",\n role: \"console\",\n accepts: [{ kind: \"component\" }, { kind: \"layout\" }, { kind: \"fragment\" }],\n priority: { value: 30, behaviorOnNarrow: \"move-to-bottom-sheet\" },\n },\n ],\n defaultStyleIntent: { surface: \"workspace\", taskMode: \"authoring\", visualEmphasis: \"immersive\" },\n renderer: WorkbenchRenderer,\n};\n\n/* ------------------------- WizardComposer ------------------------ */\n\nfunction WizardComposerRenderer({ slots, context, plan }: LayoutRendererProps) {\n const previewVisible = slots.preview && isVisible(plan, \"preview\");\n return (\n <div\n className=\"eth-ls-wizard\"\n style={{\n ...frameStyle(context),\n gridTemplateColumns: previewVisible ? \"1fr minmax(20rem, 28rem)\" : \"1fr\",\n gridTemplateRows: \"auto 1fr auto\",\n gridTemplateAreas: previewVisible\n ? `\"stepper stepper\" \"content preview\" \"footer footer\"`\n : `\"stepper\" \"content\" \"footer\"`,\n background: context.tokens.surface,\n }}\n >\n {slots.stepper ? <div className=\"eth-ls-wizard__stepper\" style={{ gridArea: \"stepper\" }}>{slots.stepper}</div> : null}\n <main className=\"eth-ls-wizard__content\" style={{ gridArea: \"content\", overflow: \"auto\", minWidth: 0 }}>\n {slots.content}\n </main>\n {previewVisible ? (\n <div className=\"eth-ls-wizard__preview\" style={{ gridArea: \"preview\", overflow: \"auto\", borderInlineStart: `1px solid ${context.tokens.border}` }}>\n {slots.preview}\n </div>\n ) : null}\n {slots.footerActions ? (\n <footer className=\"eth-ls-wizard__footer\" style={{ gridArea: \"footer\", borderBlockStart: `1px solid ${context.tokens.border}` }}>\n {slots.footerActions}\n </footer>\n ) : null}\n </div>\n );\n}\n\nexport const WizardComposerLayout: LayoutRegistryItem = {\n type: \"PageLayout.WizardComposer\",\n displayName: \"Wizard Composer\",\n tier: \"page\",\n category: \"page\",\n description: \"Guided multi-step creation flow with optional live preview.\",\n slots: [\n { name: \"stepper\", role: \"stepper\", accepts: [{ kind: \"component\" }, { kind: \"layout\" }, { kind: \"fragment\" }] },\n {\n name: \"content\",\n role: \"form\",\n required: true,\n accepts: [{ kind: \"component\" }, { kind: \"layout\" }, { kind: \"template\" }, { kind: \"fragment\" }],\n priority: { value: 100, behaviorOnNarrow: \"keep\" },\n },\n {\n name: \"preview\",\n role: \"preview\",\n accepts: [{ kind: \"component\" }, { kind: \"layout\" }, { kind: \"fragment\" }],\n priority: { value: 40, behaviorOnNarrow: \"hide\" },\n },\n { name: \"footerActions\", role: \"footer\", accepts: [{ kind: \"component\" }, { kind: \"fragment\" }] },\n ],\n defaultStyleIntent: { surface: \"page\", taskMode: \"wizard\", visualEmphasis: \"balanced\" },\n renderer: WizardComposerRenderer,\n};\n\n/* ------------------------- MonitoringOps ------------------------- */\n\nfunction MonitoringOpsRenderer({ slots, context, plan }: LayoutRendererProps) {\n const consoleVisible = slots.console && isVisible(plan, \"console\");\n return (\n <div\n className=\"eth-ls-monitoring\"\n style={{\n ...frameStyle(context),\n gridTemplateRows: `auto auto 1fr ${consoleVisible ? \"minmax(8rem, 14rem)\" : \"0\"}`,\n gridTemplateAreas: `\"toolbar\" \"metrics\" \"primary\" \"console\"`,\n }}\n >\n {slots.toolbar ? <div className=\"eth-ls-monitoring__toolbar\" style={{ gridArea: \"toolbar\" }}>{slots.toolbar}</div> : null}\n {slots.metrics ? <div className=\"eth-ls-monitoring__metrics\" style={{ gridArea: \"metrics\" }}>{slots.metrics}</div> : null}\n <main className=\"eth-ls-monitoring__primary\" style={{ gridArea: \"primary\", overflow: \"auto\", minHeight: 0 }}>\n {slots.primary}\n </main>\n {consoleVisible ? (\n <div className=\"eth-ls-monitoring__console\" style={{ gridArea: \"console\", overflow: \"auto\", borderBlockStart: `1px solid ${context.tokens.border}` }}>\n {slots.console}\n </div>\n ) : null}\n </div>\n );\n}\n\nexport const MonitoringOpsLayout: LayoutRegistryItem = {\n type: \"PageLayout.MonitoringOps\",\n displayName: \"Monitoring Ops\",\n tier: \"page\",\n category: \"page\",\n description: \"Realtime ops dashboard: toolbar, metric strip, primary view, console.\",\n slots: [\n { name: \"toolbar\", role: \"toolbar\", accepts: [{ kind: \"component\" }, { kind: \"layout\" }, { kind: \"fragment\" }] },\n { name: \"metrics\", role: \"summary\", accepts: [{ kind: \"component\" }, { kind: \"layout\" }, { kind: \"fragment\" }] },\n {\n name: \"primary\",\n role: \"content\",\n required: true,\n accepts: [{ kind: \"component\" }, { kind: \"layout\" }, { kind: \"fragment\" }],\n priority: { value: 100, behaviorOnNarrow: \"keep\" },\n },\n {\n name: \"console\",\n role: \"console\",\n accepts: [{ kind: \"component\" }, { kind: \"layout\" }, { kind: \"fragment\" }],\n priority: { value: 30, behaviorOnNarrow: \"move-to-bottom-sheet\" },\n },\n ],\n defaultStyleIntent: { surface: \"page\", taskMode: \"monitoring\", dataIntensity: \"realtime\" },\n renderer: MonitoringOpsRenderer,\n};\n\n/* ------------------------ CanvasInspector ------------------------ */\n\nfunction CanvasInspectorRenderer({ slots, context, plan }: LayoutRendererProps) {\n const inspectorVisible = slots.inspector && isVisible(plan, \"inspector\");\n return (\n <div\n className=\"eth-ls-canvas\"\n style={{\n ...frameStyle(context),\n gridTemplateRows: \"auto 1fr\",\n gridTemplateColumns: inspectorVisible ? \"1fr minmax(18rem, 24rem)\" : \"1fr\",\n gridTemplateAreas: inspectorVisible ? `\"toolbar toolbar\" \"canvas inspector\"` : `\"toolbar\" \"canvas\"`,\n }}\n >\n {slots.toolbar ? <div className=\"eth-ls-canvas__toolbar\" style={{ gridArea: \"toolbar\" }}>{slots.toolbar}</div> : null}\n <div className=\"eth-ls-canvas__stage\" style={{ gridArea: \"canvas\", overflow: \"hidden\", minWidth: 0, minHeight: 0 }}>\n {slots.canvas}\n </div>\n {inspectorVisible ? (\n <div className=\"eth-ls-canvas__inspector\" style={{ gridArea: \"inspector\", overflow: \"auto\", borderInlineStart: `1px solid ${context.tokens.border}` }}>\n {slots.inspector}\n </div>\n ) : null}\n </div>\n );\n}\n\nexport const CanvasInspectorLayout: LayoutRegistryItem = {\n type: \"PageLayout.CanvasInspector\",\n displayName: \"Canvas + Inspector\",\n tier: \"page\",\n category: \"page\",\n description: \"Full-bleed canvas with a toolbar and inline-end inspector.\",\n slots: [\n { name: \"toolbar\", role: \"toolbar\", accepts: [{ kind: \"component\" }, { kind: \"layout\" }, { kind: \"fragment\" }] },\n {\n name: \"canvas\",\n role: \"canvas\",\n required: true,\n accepts: [{ kind: \"component\" }, { kind: \"layout\" }, { kind: \"fragment\" }],\n priority: { value: 100, behaviorOnNarrow: \"keep\" },\n },\n {\n name: \"inspector\",\n role: \"inspector\",\n accepts: [{ kind: \"component\" }, { kind: \"layout\" }, { kind: \"fragment\" }],\n priority: { value: 50, behaviorOnNarrow: \"move-to-drawer\" },\n },\n ],\n defaultStyleIntent: { surface: \"canvas\", taskMode: \"authoring\", visualEmphasis: \"immersive\" },\n renderer: CanvasInspectorRenderer,\n};\n\nexport const pageLayouts: LayoutRegistryItem[] = [\n AdminShellLayout,\n DataGridInspectorLayout,\n WorkbenchLayout,\n WizardComposerLayout,\n MonitoringOpsLayout,\n CanvasInspectorLayout,\n];\n","/**\n * Builtin layout catalog + default registry factory (`layout-spec.md` §19).\n */\nimport type { LayoutRegistryItem } from \"../schema/types.js\";\nimport { LayoutRegistry } from \"./registry.js\";\nimport { primitiveLayouts } from \"../primitives/index.js\";\nimport { regionLayouts } from \"../regions/index.js\";\nimport { pageLayouts } from \"../page-layouts/index.js\";\n\nexport const builtinLayouts: LayoutRegistryItem[] = [\n ...primitiveLayouts,\n ...regionLayouts,\n ...pageLayouts,\n];\n\n/** A registry preloaded with the MVP builtin layouts. */\nexport function createDefaultLayoutRegistry(): LayoutRegistry {\n return new LayoutRegistry().registerAll(builtinLayouts);\n}\n","/**\n * Viewport observation (`layout-spec.md` §10.1, §17.5).\n *\n * A throttled hook that maps `window` size to a `LayoutViewport` (breakpoint,\n * pointer, color scheme). SSR-safe: returns the provided default until mounted.\n */\nimport * as React from \"react\";\nimport type { Breakpoint, LayoutViewport } from \"../schema/types.js\";\nimport { defaultViewport } from \"../inference/context.js\";\n\n/** rem-based breakpoint thresholds mirrored from `ethBreakpoints` (px @16). */\nconst BREAKPOINTS: Array<{ bp: Breakpoint; minWidth: number }> = [\n { bp: \"ultra\", minWidth: 1920 },\n { bp: \"wide\", minWidth: 1536 },\n { bp: \"desktop\", minWidth: 1280 },\n { bp: \"laptop\", minWidth: 1024 },\n { bp: \"tablet\", minWidth: 768 },\n { bp: \"mobile\", minWidth: 0 },\n];\n\nexport function breakpointForWidth(width: number): Breakpoint {\n for (const { bp, minWidth } of BREAKPOINTS) {\n if (width >= minWidth) return bp;\n }\n return \"mobile\";\n}\n\nfunction readViewport(): LayoutViewport {\n if (typeof window === \"undefined\") return defaultViewport;\n const width = window.innerWidth;\n const height = window.innerHeight;\n const pointer =\n typeof window.matchMedia === \"function\" && window.matchMedia(\"(pointer: coarse)\").matches\n ? \"coarse\"\n : \"fine\";\n const colorScheme =\n typeof window.matchMedia === \"function\" &&\n window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n ? \"dark\"\n : \"light\";\n return { breakpoint: breakpointForWidth(width), width, height, pointer, colorScheme };\n}\n\nexport interface UseViewportOptions {\n /** Initial value used before mount / on the server. */\n initial?: LayoutViewport;\n /** Resize debounce in ms. */\n debounceMs?: number;\n}\n\nexport function useViewport(opts: UseViewportOptions = {}): LayoutViewport {\n const { initial = defaultViewport, debounceMs = 120 } = opts;\n const [viewport, setViewport] = React.useState<LayoutViewport>(initial);\n\n React.useEffect(() => {\n if (typeof window === \"undefined\") return undefined;\n setViewport(readViewport());\n let timer: ReturnType<typeof setTimeout> | undefined;\n const onResize = () => {\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => setViewport(readViewport()), debounceMs);\n };\n window.addEventListener(\"resize\", onResize);\n return () => {\n if (timer) clearTimeout(timer);\n window.removeEventListener(\"resize\", onResize);\n };\n }, [debounceMs]);\n\n return viewport;\n}\n","/**\n * `LayoutRoot` — the top-level entry that mounts the layout engine.\n *\n * Wires the registry + resolvers + state store into an engine context, builds\n * the root runtime context (optionally observing the live viewport), validates\n * the tree once, and renders the recursive `LayoutRenderer`.\n */\nimport * as React from \"react\";\nimport type {\n LayoutDiagnostic,\n LayoutNode,\n LayoutViewport,\n} from \"../schema/types.js\";\nimport { createRootContext, type RootContextInput } from \"../inference/context.js\";\nimport { LayoutRegistry } from \"../registry/registry.js\";\nimport { createDefaultLayoutRegistry } from \"../registry/builtins.js\";\nimport type { LayoutStateStore } from \"../runtime/state.js\";\nimport { useViewport } from \"../runtime/viewport.js\";\nimport { validateLayout } from \"../schema/validate.js\";\nimport {\n LayoutContextProvider,\n LayoutEngineProvider,\n buildEngine,\n type ComponentResolver,\n type TemplateResolver,\n} from \"./context.js\";\nimport { LayoutRenderer } from \"./renderer.js\";\n\nexport interface LayoutRootProps {\n /** The layout AST to render. */\n node: LayoutNode;\n /** Resolves component names → React components (host-injected). */\n componentResolver: ComponentResolver;\n /** Resolves template names → layout nodes (host-injected). */\n templateResolver?: TemplateResolver;\n /** Layout registry; defaults to the MVP builtin registry. */\n registry?: LayoutRegistry;\n /** Root context overrides (surface/style/route/permissions/viewport). */\n context?: RootContextInput;\n /** Pluggable panel-state store. */\n stateStore?: LayoutStateStore;\n /** Observe the live viewport and feed it into the root context. Default true. */\n observeViewport?: boolean;\n /** Receives validation diagnostics whenever the tree changes. */\n onDiagnostics?: (diagnostics: LayoutDiagnostic[]) => void;\n}\n\nexport function LayoutRoot({\n node,\n componentResolver,\n templateResolver,\n registry,\n context,\n stateStore,\n observeViewport = true,\n onDiagnostics,\n}: LayoutRootProps) {\n const resolvedRegistry = React.useMemo(\n () => registry ?? createDefaultLayoutRegistry(),\n [registry],\n );\n\n const observed = useViewport({ initial: context?.viewport as LayoutViewport | undefined });\n const viewport = observeViewport ? observed : (context?.viewport as LayoutViewport | undefined);\n\n const rootContext = React.useMemo(\n () => createRootContext({ ...context, viewport }),\n [context, viewport],\n );\n\n const engine = React.useMemo(\n () =>\n buildEngine({\n registry: resolvedRegistry,\n componentResolver,\n templateResolver,\n stateStore,\n onDiagnostics,\n }),\n [resolvedRegistry, componentResolver, templateResolver, stateStore, onDiagnostics],\n );\n\n React.useEffect(() => {\n if (!onDiagnostics) return;\n onDiagnostics(validateLayout(node, resolvedRegistry));\n }, [node, resolvedRegistry, onDiagnostics]);\n\n return (\n <LayoutEngineProvider value={engine}>\n <LayoutContextProvider value={rootContext}>\n <LayoutRenderer node={node} />\n </LayoutContextProvider>\n </LayoutEngineProvider>\n );\n}\n","/**\n * Ergonomic builders for hand-authoring `LayoutNode` ASTs (used by templates\n * and tests). Pure helpers — no runtime behavior.\n */\nimport type {\n ComponentSlotContent,\n EmptySlotContent,\n FragmentSlotContent,\n LayoutNode,\n LayoutSlotContent,\n SlotContent,\n TemplateSlotContent,\n} from \"./schema/types.js\";\n\nexport interface LayoutNodeInput extends Omit<LayoutNode, \"kind\"> {}\n\nexport function layout(input: LayoutNodeInput): LayoutNode {\n return { kind: \"layout\", ...input };\n}\n\nexport function componentSlot(\n component: string,\n props?: Record<string, unknown>,\n styleOverride?: ComponentSlotContent[\"styleOverride\"],\n): ComponentSlotContent {\n return { kind: \"component\", component, props, styleOverride };\n}\n\nexport function layoutSlot(node: LayoutNode): LayoutSlotContent {\n return { kind: \"layout\", layout: node };\n}\n\nexport function templateSlot(template: string, props?: Record<string, unknown>): TemplateSlotContent {\n return { kind: \"template\", template, props };\n}\n\nexport function fragmentSlot(\n items: SlotContent[],\n composition?: FragmentSlotContent[\"composition\"],\n): FragmentSlotContent {\n return { kind: \"fragment\", items, composition };\n}\n\nexport function emptySlot(reason?: EmptySlotContent[\"reason\"]): EmptySlotContent {\n return { kind: \"empty\", reason };\n}\n"],"mappings":"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","names":["import_style","React","React","import_style","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","React","React","import_jsx_runtime"]}
|
package/dist/index.css
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/* src/styles.css */
|
|
2
|
+
:where(.eth-ls-unknown) {
|
|
3
|
+
padding: var(--eth-space-md, 0.75rem);
|
|
4
|
+
border: 1px dashed var(--eth-color-border, #cbd5e1);
|
|
5
|
+
border-radius: var(--eth-radius-sm, 0.25rem);
|
|
6
|
+
color: var(--eth-color-text-secondary, #64748b);
|
|
7
|
+
font: var(--eth-type-body-sm, 0.8125rem/1.4 system-ui, sans-serif);
|
|
8
|
+
}
|
|
9
|
+
:where(.eth-ls-empty) {
|
|
10
|
+
min-height: 1.5rem;
|
|
11
|
+
}
|
|
12
|
+
:where(.eth-ls-component) {
|
|
13
|
+
display: contents;
|
|
14
|
+
}
|
|
15
|
+
:where(.eth-ls-fragment) {
|
|
16
|
+
min-width: 0;
|
|
17
|
+
}
|
|
18
|
+
:where(.eth-ls-panel) {
|
|
19
|
+
display: flex;
|
|
20
|
+
flex-direction: column;
|
|
21
|
+
min-height: 0;
|
|
22
|
+
overflow: hidden;
|
|
23
|
+
}
|
|
24
|
+
:where(.eth-ls-panel__header) {
|
|
25
|
+
padding: var(--eth-space-sm, 0.5rem) var(--eth-space-md, 0.75rem);
|
|
26
|
+
border-bottom: 1px solid var(--eth-color-border, #e2e8f0);
|
|
27
|
+
font-weight: 600;
|
|
28
|
+
}
|
|
29
|
+
:where(.eth-ls-panel__body) {
|
|
30
|
+
padding: var(--eth-space-md, 0.75rem);
|
|
31
|
+
overflow: auto;
|
|
32
|
+
flex: 1;
|
|
33
|
+
min-height: 0;
|
|
34
|
+
}
|
|
35
|
+
:where(.eth-ls-panel__footer) {
|
|
36
|
+
padding: var(--eth-space-sm, 0.5rem) var(--eth-space-md, 0.75rem);
|
|
37
|
+
border-top: 1px solid var(--eth-color-border, #e2e8f0);
|
|
38
|
+
}
|
|
39
|
+
:where(.eth-ls-split) {
|
|
40
|
+
width: 100%;
|
|
41
|
+
}
|
|
42
|
+
:where(.eth-ls-split__pane) {
|
|
43
|
+
overflow: auto;
|
|
44
|
+
}
|
|
45
|
+
:where(.eth-ls-tabs) {
|
|
46
|
+
display: flex;
|
|
47
|
+
flex-direction: column;
|
|
48
|
+
min-height: 0;
|
|
49
|
+
}
|
|
50
|
+
:where(.eth-ls-tabs__list) {
|
|
51
|
+
display: flex;
|
|
52
|
+
gap: var(--eth-space-xs, 0.25rem);
|
|
53
|
+
border-bottom: 1px solid var(--eth-color-border, #e2e8f0);
|
|
54
|
+
}
|
|
55
|
+
:where(.eth-ls-tabs__tab) {
|
|
56
|
+
appearance: none;
|
|
57
|
+
background: transparent;
|
|
58
|
+
border: 0;
|
|
59
|
+
border-bottom: 2px solid transparent;
|
|
60
|
+
padding: var(--eth-space-sm, 0.5rem) var(--eth-space-md, 0.75rem);
|
|
61
|
+
color: var(--eth-color-text-secondary, #64748b);
|
|
62
|
+
cursor: pointer;
|
|
63
|
+
font: inherit;
|
|
64
|
+
}
|
|
65
|
+
:where(.eth-ls-tabs__tab--active) {
|
|
66
|
+
color: var(--eth-color-text, #0f172a);
|
|
67
|
+
border-bottom-color: var(--eth-color-accent, #2563eb);
|
|
68
|
+
}
|
|
69
|
+
:where(.eth-ls-tabs__panel) {
|
|
70
|
+
padding: var(--eth-space-md, 0.75rem) 0;
|
|
71
|
+
min-height: 0;
|
|
72
|
+
}
|
|
73
|
+
:where(.eth-ls-stepper__steps) {
|
|
74
|
+
list-style: none;
|
|
75
|
+
margin: 0;
|
|
76
|
+
padding: 0;
|
|
77
|
+
display: flex;
|
|
78
|
+
gap: var(--eth-space-md, 0.75rem);
|
|
79
|
+
}
|
|
80
|
+
:where(.eth-ls-stepper--vertical) .eth-ls-stepper__steps {
|
|
81
|
+
flex-direction: column;
|
|
82
|
+
}
|
|
83
|
+
:where(.eth-ls-stepper__step-button) {
|
|
84
|
+
display: inline-flex;
|
|
85
|
+
align-items: center;
|
|
86
|
+
gap: var(--eth-space-sm, 0.5rem);
|
|
87
|
+
appearance: none;
|
|
88
|
+
background: transparent;
|
|
89
|
+
border: 0;
|
|
90
|
+
cursor: pointer;
|
|
91
|
+
color: var(--eth-color-text-secondary, #64748b);
|
|
92
|
+
font: inherit;
|
|
93
|
+
}
|
|
94
|
+
:where(.eth-ls-stepper__step--current) .eth-ls-stepper__step-button,
|
|
95
|
+
:where(.eth-ls-stepper__step--active) .eth-ls-stepper__step-button {
|
|
96
|
+
color: var(--eth-color-text, #0f172a);
|
|
97
|
+
font-weight: 600;
|
|
98
|
+
}
|
|
99
|
+
:where(.eth-ls-stepper__index) {
|
|
100
|
+
display: inline-grid;
|
|
101
|
+
place-items: center;
|
|
102
|
+
width: 1.5rem;
|
|
103
|
+
height: 1.5rem;
|
|
104
|
+
border-radius: 999px;
|
|
105
|
+
border: 1px solid var(--eth-color-border, #cbd5e1);
|
|
106
|
+
}
|
|
107
|
+
:where(.eth-ls-stepper__step--valid) .eth-ls-stepper__index,
|
|
108
|
+
:where(.eth-ls-stepper__step--complete) .eth-ls-stepper__index {
|
|
109
|
+
background: var(--eth-color-success, #16a34a);
|
|
110
|
+
color: #fff;
|
|
111
|
+
border-color: transparent;
|
|
112
|
+
}
|
|
113
|
+
:where(.eth-ls-stepper__step--invalid) .eth-ls-stepper__index {
|
|
114
|
+
background: var(--eth-color-danger, #dc2626);
|
|
115
|
+
color: #fff;
|
|
116
|
+
border-color: transparent;
|
|
117
|
+
}
|
|
118
|
+
:where(.eth-ls-stepper__content) {
|
|
119
|
+
flex: 1;
|
|
120
|
+
min-width: 0;
|
|
121
|
+
}
|
|
122
|
+
:where(.eth-ls-toolbar) {
|
|
123
|
+
padding: var(--eth-space-sm, 0.5rem) var(--eth-space-md, 0.75rem);
|
|
124
|
+
min-height: 3rem;
|
|
125
|
+
}
|
|
126
|
+
:where(.eth-ls-inspector__header) {
|
|
127
|
+
padding: var(--eth-space-sm, 0.5rem) var(--eth-space-md, 0.75rem);
|
|
128
|
+
border-bottom: 1px solid var(--eth-color-border, #e2e8f0);
|
|
129
|
+
font-weight: 600;
|
|
130
|
+
}
|
|
131
|
+
:where(.eth-ls-inspector__body) {
|
|
132
|
+
padding: var(--eth-space-md, 0.75rem);
|
|
133
|
+
}
|
|
134
|
+
:where(.eth-ls-inspector__footer) {
|
|
135
|
+
padding: var(--eth-space-sm, 0.5rem) var(--eth-space-md, 0.75rem);
|
|
136
|
+
border-top: 1px solid var(--eth-color-border, #e2e8f0);
|
|
137
|
+
}
|
|
138
|
+
:where(.eth-ls-admin-shell, .eth-ls-datagrid, .eth-ls-workbench, .eth-ls-wizard, .eth-ls-monitoring, .eth-ls-canvas) {
|
|
139
|
+
width: 100%;
|
|
140
|
+
}
|
|
141
|
+
:where(.eth-ls-monitoring__metrics) {
|
|
142
|
+
padding: var(--eth-space-md, 0.75rem);
|
|
143
|
+
}
|
|
144
|
+
@media (max-width: 48rem) {
|
|
145
|
+
:where(.eth-ls-datagrid, .eth-ls-workbench, .eth-ls-wizard, .eth-ls-canvas) {
|
|
146
|
+
grid-template-columns: 1fr !important;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/*# sourceMappingURL=index.css.map */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/styles.css"],"sourcesContent":["/**\n * @echothink-ui/layout — layout system styles.\n *\n * Structural CSS for the recursive renderer's primitives/regions/page-layouts.\n * Colors/spacing/radius come from Tier-2 `--eth-*` tokens (TOKEN_CONTRACT.md);\n * preset stylesheets (`@echothink-ui/style`) supply the values.\n */\n\n:where(.eth-ls-unknown) {\n padding: var(--eth-space-md, 0.75rem);\n border: 1px dashed var(--eth-color-border, #cbd5e1);\n border-radius: var(--eth-radius-sm, 0.25rem);\n color: var(--eth-color-text-secondary, #64748b);\n font: var(--eth-type-body-sm, 0.8125rem/1.4 system-ui, sans-serif);\n}\n:where(.eth-ls-empty) {\n min-height: 1.5rem;\n}\n:where(.eth-ls-component) {\n display: contents;\n}\n:where(.eth-ls-fragment) {\n min-width: 0;\n}\n\n/* ----------------------------- Panel ----------------------------- */\n:where(.eth-ls-panel) {\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow: hidden;\n}\n:where(.eth-ls-panel__header) {\n padding: var(--eth-space-sm, 0.5rem) var(--eth-space-md, 0.75rem);\n border-bottom: 1px solid var(--eth-color-border, #e2e8f0);\n font-weight: 600;\n}\n:where(.eth-ls-panel__body) {\n padding: var(--eth-space-md, 0.75rem);\n overflow: auto;\n flex: 1;\n min-height: 0;\n}\n:where(.eth-ls-panel__footer) {\n padding: var(--eth-space-sm, 0.5rem) var(--eth-space-md, 0.75rem);\n border-top: 1px solid var(--eth-color-border, #e2e8f0);\n}\n\n/* --------------------------- SplitPane --------------------------- */\n:where(.eth-ls-split) {\n width: 100%;\n}\n:where(.eth-ls-split__pane) {\n overflow: auto;\n}\n\n/* ----------------------------- Tabs ------------------------------ */\n:where(.eth-ls-tabs) {\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n:where(.eth-ls-tabs__list) {\n display: flex;\n gap: var(--eth-space-xs, 0.25rem);\n border-bottom: 1px solid var(--eth-color-border, #e2e8f0);\n}\n:where(.eth-ls-tabs__tab) {\n appearance: none;\n background: transparent;\n border: 0;\n border-bottom: 2px solid transparent;\n padding: var(--eth-space-sm, 0.5rem) var(--eth-space-md, 0.75rem);\n color: var(--eth-color-text-secondary, #64748b);\n cursor: pointer;\n font: inherit;\n}\n:where(.eth-ls-tabs__tab--active) {\n color: var(--eth-color-text, #0f172a);\n border-bottom-color: var(--eth-color-accent, #2563eb);\n}\n:where(.eth-ls-tabs__panel) {\n padding: var(--eth-space-md, 0.75rem) 0;\n min-height: 0;\n}\n\n/* ---------------------------- Stepper ---------------------------- */\n:where(.eth-ls-stepper__steps) {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n gap: var(--eth-space-md, 0.75rem);\n}\n:where(.eth-ls-stepper--vertical) .eth-ls-stepper__steps {\n flex-direction: column;\n}\n:where(.eth-ls-stepper__step-button) {\n display: inline-flex;\n align-items: center;\n gap: var(--eth-space-sm, 0.5rem);\n appearance: none;\n background: transparent;\n border: 0;\n cursor: pointer;\n color: var(--eth-color-text-secondary, #64748b);\n font: inherit;\n}\n:where(.eth-ls-stepper__step--current) .eth-ls-stepper__step-button,\n:where(.eth-ls-stepper__step--active) .eth-ls-stepper__step-button {\n color: var(--eth-color-text, #0f172a);\n font-weight: 600;\n}\n:where(.eth-ls-stepper__index) {\n display: inline-grid;\n place-items: center;\n width: 1.5rem;\n height: 1.5rem;\n border-radius: 999px;\n border: 1px solid var(--eth-color-border, #cbd5e1);\n}\n:where(.eth-ls-stepper__step--valid) .eth-ls-stepper__index,\n:where(.eth-ls-stepper__step--complete) .eth-ls-stepper__index {\n background: var(--eth-color-success, #16a34a);\n color: #fff;\n border-color: transparent;\n}\n:where(.eth-ls-stepper__step--invalid) .eth-ls-stepper__index {\n background: var(--eth-color-danger, #dc2626);\n color: #fff;\n border-color: transparent;\n}\n:where(.eth-ls-stepper__content) {\n flex: 1;\n min-width: 0;\n}\n\n/* ---------------------------- Toolbar ---------------------------- */\n:where(.eth-ls-toolbar) {\n padding: var(--eth-space-sm, 0.5rem) var(--eth-space-md, 0.75rem);\n min-height: 3rem;\n}\n\n/* --------------------------- Inspector --------------------------- */\n:where(.eth-ls-inspector__header) {\n padding: var(--eth-space-sm, 0.5rem) var(--eth-space-md, 0.75rem);\n border-bottom: 1px solid var(--eth-color-border, #e2e8f0);\n font-weight: 600;\n}\n:where(.eth-ls-inspector__body) {\n padding: var(--eth-space-md, 0.75rem);\n}\n:where(.eth-ls-inspector__footer) {\n padding: var(--eth-space-sm, 0.5rem) var(--eth-space-md, 0.75rem);\n border-top: 1px solid var(--eth-color-border, #e2e8f0);\n}\n\n/* ------------------------- Page layouts -------------------------- */\n:where(\n .eth-ls-admin-shell,\n .eth-ls-datagrid,\n .eth-ls-workbench,\n .eth-ls-wizard,\n .eth-ls-monitoring,\n .eth-ls-canvas\n) {\n width: 100%;\n}\n:where(.eth-ls-monitoring__metrics) {\n padding: var(--eth-space-md, 0.75rem);\n}\n\n/* Narrow screens: collapse multi-pane page grids to a single column. */\n@media (max-width: 48rem) {\n :where(.eth-ls-datagrid, .eth-ls-workbench, .eth-ls-wizard, .eth-ls-canvas) {\n grid-template-columns: 1fr !important;\n }\n}\n"],"mappings":";AAQA,OAAO,CAAC;AACN,WAAS,IAAI,cAAc,EAAE;AAC7B,UAAQ,IAAI,OAAO,IAAI,kBAAkB,EAAE;AAC3C,iBAAe,IAAI,eAAe,EAAE;AACpC,SAAO,IAAI,0BAA0B,EAAE;AACvC,QAAM,IAAI,kBAAkB,EAAE,SAAS,CAAC,IAAI,SAAS,EAAE;AACzD;AACA,OAAO,CAAC;AACN,cAAY;AACd;AACA,OAAO,CAAC;AACN,WAAS;AACX;AACA,OAAO,CAAC;AACN,aAAW;AACb;AAGA,OAAO,CAAC;AACN,WAAS;AACT,kBAAgB;AAChB,cAAY;AACZ,YAAU;AACZ;AACA,OAAO,CAAC;AACN,WAAS,IAAI,cAAc,EAAE,QAAQ,IAAI,cAAc,EAAE;AACzD,iBAAe,IAAI,MAAM,IAAI,kBAAkB,EAAE;AACjD,eAAa;AACf;AACA,OAAO,CAAC;AACN,WAAS,IAAI,cAAc,EAAE;AAC7B,YAAU;AACV,QAAM;AACN,cAAY;AACd;AACA,OAAO,CAAC;AACN,WAAS,IAAI,cAAc,EAAE,QAAQ,IAAI,cAAc,EAAE;AACzD,cAAY,IAAI,MAAM,IAAI,kBAAkB,EAAE;AAChD;AAGA,OAAO,CAAC;AACN,SAAO;AACT;AACA,OAAO,CAAC;AACN,YAAU;AACZ;AAGA,OAAO,CAAC;AACN,WAAS;AACT,kBAAgB;AAChB,cAAY;AACd;AACA,OAAO,CAAC;AACN,WAAS;AACT,OAAK,IAAI,cAAc,EAAE;AACzB,iBAAe,IAAI,MAAM,IAAI,kBAAkB,EAAE;AACnD;AACA,OAAO,CAAC;AACN,cAAY;AACZ,cAAY;AACZ,UAAQ;AACR,iBAAe,IAAI,MAAM;AACzB,WAAS,IAAI,cAAc,EAAE,QAAQ,IAAI,cAAc,EAAE;AACzD,SAAO,IAAI,0BAA0B,EAAE;AACvC,UAAQ;AACR,QAAM;AACR;AACA,OAAO,CAAC;AACN,SAAO,IAAI,gBAAgB,EAAE;AAC7B,uBAAqB,IAAI,kBAAkB,EAAE;AAC/C;AACA,OAAO,CAAC;AACN,WAAS,IAAI,cAAc,EAAE,SAAS;AACtC,cAAY;AACd;AAGA,OAAO,CAAC;AACN,cAAY;AACZ,UAAQ;AACR,WAAS;AACT,WAAS;AACT,OAAK,IAAI,cAAc,EAAE;AAC3B;AACA,OAAO,CAAC,0BAA0B,CAP1B;AAQN,kBAAgB;AAClB;AACA,OAAO,CAAC;AACN,WAAS;AACT,eAAa;AACb,OAAK,IAAI,cAAc,EAAE;AACzB,cAAY;AACZ,cAAY;AACZ,UAAQ;AACR,UAAQ;AACR,SAAO,IAAI,0BAA0B,EAAE;AACvC,QAAM;AACR;AACA,OAAO,CAAC,+BAA+B,CAX/B;AAYR,OAAO,CAAC,8BAA8B,CAZ9B;AAaN,SAAO,IAAI,gBAAgB,EAAE;AAC7B,eAAa;AACf;AACA,OAAO,CAAC;AACN,WAAS;AACT,eAAa;AACb,SAAO;AACP,UAAQ;AACR,iBAAe;AACf,UAAQ,IAAI,MAAM,IAAI,kBAAkB,EAAE;AAC5C;AACA,OAAO,CAAC,6BAA6B,CAR7B;AASR,OAAO,CAAC,gCAAgC,CAThC;AAUN,cAAY,IAAI,mBAAmB,EAAE;AACrC,SAAO;AACP,gBAAc;AAChB;AACA,OAAO,CAAC,+BAA+B,CAd/B;AAeN,cAAY,IAAI,kBAAkB,EAAE;AACpC,SAAO;AACP,gBAAc;AAChB;AACA,OAAO,CAAC;AACN,QAAM;AACN,aAAW;AACb;AAGA,OAAO,CAAC;AACN,WAAS,IAAI,cAAc,EAAE,QAAQ,IAAI,cAAc,EAAE;AACzD,cAAY;AACd;AAGA,OAAO,CAAC;AACN,WAAS,IAAI,cAAc,EAAE,QAAQ,IAAI,cAAc,EAAE;AACzD,iBAAe,IAAI,MAAM,IAAI,kBAAkB,EAAE;AACjD,eAAa;AACf;AACA,OAAO,CAAC;AACN,WAAS,IAAI,cAAc,EAAE;AAC/B;AACA,OAAO,CAAC;AACN,WAAS,IAAI,cAAc,EAAE,QAAQ,IAAI,cAAc,EAAE;AACzD,cAAY,IAAI,MAAM,IAAI,kBAAkB,EAAE;AAChD;AAGA,OACE,CAAC,oBACD,CAAC,iBACD,CAAC,kBACD,CAAC,eACD,CAAC,mBACD,CAAC;AAED,SAAO;AACT;AACA,OAAO,CAAC;AACN,WAAS,IAAI,cAAc,EAAE;AAC/B;AAGA,QAAO,WAAY;AACjB,SAAO,CAdN,iBAcwB,CAbxB,kBAa2C,CAZ3C,eAY2D,CAV3D;AAWC,2BAAuB;AACzB;AACF;","names":[]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@echothink-ui/layout` — public API.
|
|
3
|
+
*
|
|
4
|
+
* This package is the LAYOUT SYSTEM (layout-spec.md), not a template collection.
|
|
5
|
+
* The former hard-coded page templates moved to `@echothink-ui/templates`; the
|
|
6
|
+
* former preset-preview helpers are retired. Consumers now build pages as a
|
|
7
|
+
* typed `LayoutNode` AST and render them through `LayoutRoot`.
|
|
8
|
+
*/
|
|
9
|
+
import "./styles.css";
|
|
10
|
+
export { StyleScope, defaultStylePreset, ethDensityModes, ethStylePresetDescriptions, ethStylePresetLabels, ethStylePresets, ethTypeScales, } from "@echothink-ui/style";
|
|
11
|
+
export type { EthStylePreset, EthDensityMode, EthTypeScale, EthPalette, } from "@echothink-ui/style";
|
|
12
|
+
/**
|
|
13
|
+
* Documented breakpoint contract (rem). CSS media queries can't read custom
|
|
14
|
+
* properties, so these literal values are mirrored in `styles.css` and the
|
|
15
|
+
* viewport observer.
|
|
16
|
+
*/
|
|
17
|
+
export declare const ethBreakpoints: {
|
|
18
|
+
readonly sm: "36rem";
|
|
19
|
+
readonly md: "48rem";
|
|
20
|
+
readonly lg: "64rem";
|
|
21
|
+
readonly xl: "80rem";
|
|
22
|
+
};
|
|
23
|
+
export type EthBreakpoint = keyof typeof ethBreakpoints;
|
|
24
|
+
export * from "./layout-system/index.js";
|