idml-ui 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/schema/config.schema.ts","../src/schema/tokens.schema.ts","../src/schema/page.schema.ts","../src/schema/layout.schema.ts","../src/schema/component.schema.ts","../src/schema/binding.schema.ts","../src/renderer/ConfigProvider.tsx","../src/renderer/tokens/token-resolver.ts","../src/renderer/registry/method-registry.ts","../src/renderer/registry/component-registry.ts","../src/renderer/LayoutRenderer.tsx","../src/renderer/ComponentRenderer.tsx","../src/renderer/hooks/useVisibility.ts","../src/renderer/builtins/index.ts","../src/renderer/repeat-context.ts","../src/renderer/form-context.tsx","../src/renderer/ConfigRenderer.tsx","../src/renderer/hooks/useRegisteredMethod.ts","../src/editor/EditorPage.tsx","../src/editor/hooks/useEditorState.ts","../src/editor/hooks/useSSEConfig.ts","../src/editor/hooks/useSaveConfig.ts","../src/editor/panels/ComponentTree.tsx","../src/editor/panels/LivePreview.tsx","../src/editor/panels/PropertyPanel.tsx","../src/parser/idml-parser.ts"],"sourcesContent":["import { z } from 'zod';\nimport { TokensDefSchema } from './tokens.schema';\nimport { PageDefSchema } from './page.schema';\nimport type { UIConfig } from '../types';\n\nexport const UIConfigSchema = z\n .object({\n version: z.literal('1'),\n tokens: TokensDefSchema,\n pages: z.array(PageDefSchema).min(1),\n userComponents: z.array(z.string()).optional(),\n })\n .strict();\n\nexport type UIConfigType = z.infer<typeof UIConfigSchema>;\n\nexport function validateConfig(raw: unknown): UIConfig {\n return UIConfigSchema.parse(raw) as UIConfig;\n}\n\nexport function safeValidateConfig(raw: unknown) {\n return UIConfigSchema.safeParse(raw);\n}\n","import { z } from 'zod';\n\nexport const ColorTokenSchema = z\n .object({\n name: z.string().min(1),\n value: z.string().min(1),\n darkValue: z.string().optional(),\n })\n .strict();\n\nexport const TypographyTokenSchema = z\n .object({\n name: z.string().min(1),\n fontFamily: z.string().optional(),\n fontSize: z.string().min(1),\n fontWeight: z.union([z.number(), z.string()]).optional(),\n lineHeight: z.string().optional(),\n letterSpacing: z.string().optional(),\n })\n .strict();\n\nexport const SpacingTokenSchema = z\n .object({\n name: z.string().min(1),\n value: z.string().min(1),\n })\n .strict();\n\nexport const TokensDefSchema = z\n .object({\n colors: z.array(ColorTokenSchema),\n typography: z.array(TypographyTokenSchema),\n spacing: z.array(SpacingTokenSchema),\n })\n .strict();\n","import { z } from 'zod';\nimport { LayoutDefSchema } from './layout.schema';\nimport { ComponentDefSchema } from './component.schema';\n\nexport const PageDefSchema = z\n .object({\n route: z.string().min(1),\n title: z.string().optional(),\n layout: LayoutDefSchema,\n components: z.array(ComponentDefSchema),\n meta: z\n .object({\n description: z.string().optional(),\n ogTitle: z.string().optional(),\n })\n .strict()\n .optional(),\n })\n .strict();\n","import { z } from 'zod';\n\nconst percentageString = z.string().regex(/^\\d+(\\.\\d+)?%$/, {\n message:\n 'All size values must be expressed as percentages (e.g. \"100%\", \"33.3%\"). px, rem, em, vw, vh are not allowed.',\n});\n\nexport const SizeDefSchema = z\n .object({\n width: percentageString.optional(),\n height: percentageString.optional(),\n minWidth: percentageString.optional(),\n minHeight: percentageString.optional(),\n maxWidth: percentageString.optional(),\n maxHeight: percentageString.optional(),\n })\n .strict();\n\nconst VisibilitySchema = z\n .object({ ref: z.string(), negate: z.boolean().optional() })\n .strict();\n\nconst ConditionalClassSchema = z\n .object({ classes: z.string(), ref: z.string(), negate: z.boolean().optional() })\n .strict();\n\nconst DynamicDimSchema = z\n .object({\n ref: z.string(),\n whenTrue: z.string().optional(),\n whenFalse: z.string().optional(),\n })\n .strict();\n\nconst DynamicSizeSchema = z\n .object({ width: DynamicDimSchema.optional(), height: DynamicDimSchema.optional() })\n .strict();\n\nexport const LayoutDefSchema: z.ZodType<any> = z.lazy(() =>\n z.discriminatedUnion('type', [\n z\n .object({\n type: z.literal('flex'),\n direction: z.enum(['row', 'column', 'row-reverse', 'column-reverse']),\n wrap: z.enum(['nowrap', 'wrap', 'wrap-reverse']).optional(),\n justifyContent: z\n .enum(['flex-start', 'flex-end', 'center', 'space-between', 'space-around', 'space-evenly'])\n .optional(),\n alignItems: z.enum(['flex-start', 'flex-end', 'center', 'stretch', 'baseline']).optional(),\n gap: z.string().optional(),\n size: SizeDefSchema.optional(),\n children: z.array(LayoutDefSchema),\n componentId: z.string().optional(),\n idmlStyle: z.record(z.string()).optional(),\n className: z.string().optional(),\n classRefs: z.array(z.string()).optional(),\n condClasses: z.array(ConditionalClassSchema).optional(),\n visibility: VisibilitySchema.optional(),\n dynamicSize: DynamicSizeSchema.optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal('grid'),\n columns: z.number().int().min(1).max(24),\n rows: z.number().int().min(1).optional(),\n gap: z.string().optional(),\n size: SizeDefSchema.optional(),\n children: z.array(LayoutDefSchema),\n componentId: z.string().optional(),\n idmlStyle: z.record(z.string()).optional(),\n className: z.string().optional(),\n classRefs: z.array(z.string()).optional(),\n condClasses: z.array(ConditionalClassSchema).optional(),\n visibility: VisibilitySchema.optional(),\n dynamicSize: DynamicSizeSchema.optional(),\n })\n .strict(),\n ])\n);\n\nexport const FlexDefSchema = LayoutDefSchema;\nexport const GridDefSchema = LayoutDefSchema;\n","import { z } from 'zod';\nimport { DataBindingDefSchema, VisibilityDefSchema } from './binding.schema';\n\nexport const ComponentDefSchema: z.ZodType<any> = z.lazy(() =>\n z\n .object({\n id: z.string().min(1),\n type: z.string().min(1),\n props: z.record(z.unknown()).optional(),\n tokenProps: z\n .object({\n color: z.string().optional(),\n background: z.string().optional(),\n typography: z.string().optional(),\n padding: z.string().optional(),\n })\n .strict()\n .optional(),\n bindings: z.array(DataBindingDefSchema).optional(),\n visibility: VisibilityDefSchema.optional(),\n children: z.array(ComponentDefSchema).optional(),\n idmlStyle: z.record(z.string()).optional(),\n className: z.string().optional(),\n })\n .strict()\n);\n","import { z } from 'zod';\n\nexport const DataBindingDefSchema = z\n .object({\n prop: z.string().min(1),\n methodId: z.string().min(1),\n kind: z.enum(['handler', 'value', 'model']).optional(),\n })\n .strict();\n\nexport const VisibilityDefSchema = z\n .object({\n methodId: z.string().min(1),\n negate: z.boolean().optional(),\n })\n .strict();\n","'use client';\n\nimport React, { createContext, useContext, useEffect, useState, useCallback } from 'react';\nimport type { UIConfig } from '../types';\nimport { validateConfig } from '../schema/config.schema';\nimport { injectTokenVars } from './tokens/token-resolver';\nimport { registerMethod, clearRegistry } from './registry/method-registry';\nimport { registerComponent, clearComponentRegistry } from './registry/component-registry';\n\nexport interface ConfigContextValue {\n config: UIConfig;\n darkMode: boolean;\n setDarkMode: (value: boolean) => void;\n tokenVars: Record<string, string>;\n /**\n * When true, structural Row/Col containers are drawn with a debug bounding-box\n * outline. Off by default so rendered pages look like real pages; the editor\n * preview can opt in to visualise layout structure.\n */\n debug: boolean;\n}\n\n// Exported so tests (and other low-level consumers) can render the renderer\n// tree against a hand-built context without ConfigProvider's effect-driven\n// config validation — which never runs under server-side rendering.\nexport const ConfigContext = createContext<ConfigContextValue | undefined>(undefined);\n\nexport function useConfigContext(): ConfigContextValue {\n const ctx = useContext(ConfigContext);\n if (!ctx) throw new Error('useConfigContext must be used inside <ConfigProvider>');\n return ctx;\n}\n\nexport interface MethodRegistration {\n id: string;\n fn: (...args: unknown[]) => unknown;\n}\n\nexport interface ComponentRegistration {\n name: string;\n component: React.ComponentType<Record<string, unknown>>;\n}\n\nexport interface ConfigProviderProps {\n config: UIConfig | unknown;\n methods?: MethodRegistration[];\n components?: ComponentRegistration[];\n children: React.ReactNode;\n onConfigInvalid?: (error: Error) => void;\n /** Draw debug bounding boxes around structural containers. Default false. */\n debug?: boolean;\n}\n\nexport function ConfigProvider({\n config: rawConfig,\n methods = [],\n components = [],\n children,\n onConfigInvalid,\n debug = false,\n}: ConfigProviderProps): React.ReactElement | null {\n const [validConfig, setValidConfig] = useState<UIConfig | null>(null);\n const [darkMode, setDarkMode] = useState(false);\n\n useEffect(() => {\n try {\n const parsed = validateConfig(rawConfig);\n setValidConfig(parsed);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n onConfigInvalid?.(error);\n }\n }, [rawConfig, onConfigInvalid]);\n\n useEffect(() => {\n clearRegistry();\n for (const { id, fn } of methods) {\n registerMethod(id, fn);\n }\n }, [methods]);\n\n useEffect(() => {\n clearComponentRegistry();\n for (const { name, component } of components) {\n registerComponent(name, component);\n }\n }, [components]);\n\n // Attach click-to-select listener in dev mode\n useEffect(() => {\n if (process.env.NODE_ENV !== 'development') return;\n\n const handler = (e: MouseEvent) => {\n const target = (e.target as HTMLElement).closest('[data-isd-id]');\n if (target) {\n const id = target.getAttribute('data-isd-id');\n window.parent.postMessage({ type: 'isd:select', componentId: id }, window.location.origin);\n }\n };\n\n document.addEventListener('click', handler);\n return () => document.removeEventListener('click', handler);\n }, []);\n\n if (!validConfig) return null;\n\n const tokenVars = injectTokenVars(validConfig.tokens, darkMode);\n\n return (\n <ConfigContext.Provider value={{ config: validConfig, darkMode, setDarkMode, tokenVars, debug }}>\n <div style={tokenVars as React.CSSProperties}>{children}</div>\n </ConfigContext.Provider>\n );\n}\n","import React from 'react';\nimport type { TokensDef, ComponentDef } from '../../types';\n\nexport function injectTokenVars(tokens: TokensDef, darkMode: boolean): Record<string, string> {\n const vars: Record<string, string> = {};\n\n for (const color of tokens.colors) {\n const value = darkMode && color.darkValue ? color.darkValue : color.value;\n vars[`--isd-color-${color.name}`] = value;\n }\n\n for (const spacing of tokens.spacing) {\n vars[`--isd-spacing-${spacing.name}`] = spacing.value;\n }\n\n return vars;\n}\n\nexport function resolveTokenProps(\n tokenProps: ComponentDef['tokenProps'],\n tokens: TokensDef\n): React.CSSProperties {\n if (!tokenProps) return {};\n\n const style: React.CSSProperties = {};\n\n if (tokenProps.color) {\n style.color = `var(--isd-color-${tokenProps.color})`;\n }\n\n if (tokenProps.background) {\n style.backgroundColor = `var(--isd-color-${tokenProps.background})`;\n }\n\n if (tokenProps.typography) {\n const token = tokens.typography.find((t) => t.name === tokenProps.typography);\n if (token) {\n style.fontSize = token.fontSize;\n if (token.fontWeight) style.fontWeight = token.fontWeight as React.CSSProperties['fontWeight'];\n if (token.lineHeight) style.lineHeight = token.lineHeight;\n if (token.letterSpacing) style.letterSpacing = token.letterSpacing;\n if (token.fontFamily) style.fontFamily = token.fontFamily;\n }\n }\n\n if (tokenProps.padding) {\n style.padding = `var(--isd-spacing-${tokenProps.padding})`;\n }\n\n return style;\n}\n","type RegisteredMethod = (...args: unknown[]) => unknown;\n\nconst registry = new Map<string, RegisteredMethod>();\n\nexport function registerMethod(id: string, fn: RegisteredMethod): void {\n if (registry.has(id)) {\n console.warn(`[idml] registerMethod: overwriting existing method \"${id}\"`);\n }\n registry.set(id, fn);\n}\n\nexport function getMethod(id: string): RegisteredMethod | undefined {\n return registry.get(id);\n}\n\nexport function getAllMethodIds(): string[] {\n return Array.from(registry.keys());\n}\n\nexport function clearRegistry(): void {\n registry.clear();\n}\n","import type React from 'react';\n\ntype RegisteredComponent = React.ComponentType<Record<string, unknown>>;\n\nconst registry = new Map<string, RegisteredComponent>();\n\nexport function registerComponent(name: string, component: RegisteredComponent): void {\n if (registry.has(name)) {\n console.warn(`[idml] registerComponent: overwriting existing component \"${name}\"`);\n }\n registry.set(name, component);\n}\n\nexport function getComponent(name: string): RegisteredComponent | undefined {\n return registry.get(name);\n}\n\nexport function getAllComponentNames(): string[] {\n return Array.from(registry.keys());\n}\n\nexport function clearComponentRegistry(): void {\n registry.clear();\n}\n","'use client';\n\nimport React from 'react';\nimport type { LayoutDef, ComponentDef } from '../types';\nimport type { DynamicDim } from '../types/layout.types';\nimport { useConfigContext } from './ConfigProvider';\nimport { ComponentRenderer, resolveValueRef } from './ComponentRenderer';\nimport { RepeatItemContext } from './repeat-context';\nimport { FormStateContext } from './form-context';\n\ninterface LayoutRendererProps {\n layout: LayoutDef;\n components: ComponentDef[];\n}\n\nconst DIM_ANIM: KeyframeAnimationOptions = { duration: 300, easing: 'ease-in-out' };\nconst toDimStr = (v: unknown): string | undefined =>\n v == null ? undefined : typeof v === 'number' ? `${v}%` : String(v);\n\nexport function LayoutRenderer({ layout, components }: LayoutRendererProps): React.ReactElement | null {\n const { config, debug } = useConfigContext();\n // Reactive show/hide: a `?@ref` cell renders only when its ref is truthy.\n // Read contexts unconditionally to keep hook order stable.\n const item = React.useContext(RepeatItemContext);\n const formStore = React.useContext(FormStateContext);\n\n // Resolve reactive `@ref` dims once (used by both the style and the animation\n // effect). All hooks run BEFORE the visibility early-return so hook order is\n // stable across renders.\n const resolveDyn = (d: DynamicDim): string | undefined => {\n const v = resolveValueRef(d.ref, item, formStore?.values);\n // Conditional dim: pick one of the two inline sizes by the ref's truthiness.\n if (d.whenTrue !== undefined) return v ? d.whenTrue : d.whenFalse;\n return toDimStr(v);\n };\n const dynW = layout.dynamicSize?.width ? resolveDyn(layout.dynamicSize.width) : undefined;\n const dynH = layout.dynamicSize?.height ? resolveDyn(layout.dynamicSize.height) : undefined;\n const elRef = React.useRef<HTMLDivElement>(null);\n const prevDimsRef = React.useRef<{ w?: string; h?: string }>({ w: dynW, h: dynH });\n React.useLayoutEffect(() => {\n const el = elRef.current;\n const prev = prevDimsRef.current;\n if (el && layout.dynamicSize) {\n // Animate size changes with the Web Animations API. CSS transitions on a\n // flex item's width/flex-basis are unreliable (the new value often doesn't\n // apply mid-flex-layout, leaving it stuck); WAA sets the interpolated size\n // each frame, which the flex layout honours — a smooth slide.\n if (dynW !== undefined && prev.w !== undefined && prev.w !== dynW) {\n el.animate([{ width: prev.w }, { width: dynW }], DIM_ANIM);\n }\n if (dynH !== undefined && prev.h !== undefined && prev.h !== dynH) {\n el.animate([{ height: prev.h }, { height: dynH }], DIM_ANIM);\n }\n }\n prevDimsRef.current = { w: dynW, h: dynH };\n // Dev guardrail: an `overflow:hidden` container whose content is TALLER/WIDER\n // than its box is silently CLIPPING (e.g. sidebar items spilling past the\n // column). Tiling validates declared %s at parse time, but content-flow (hug)\n // packs by content and can overflow at runtime — surface that here.\n // (Vertical only — horizontal `overflow:hidden` is the intentional hug/\n // ellipsis clip, e.g. the launcher's collapsed label.)\n if (process.env.NODE_ENV !== 'production' && el) {\n const cs = getComputedStyle(el);\n if (cs.overflowY === 'hidden' && el.scrollHeight - el.clientHeight > 1) {\n console.error(\n `[idml] content overflows its box and is clipped — ` +\n `${el.scrollHeight - el.clientHeight}px taller than its height. ` +\n `Reduce the content or its spacing.`,\n el\n );\n }\n }\n }, [dynW, dynH]);\n\n if (layout.visibility) {\n const value = resolveValueRef(layout.visibility.ref, item, formStore?.values);\n const visible = layout.visibility.negate ? !value : Boolean(value);\n if (!visible) return null;\n }\n\n const sizeStyle = resolveSizeStyle(layout.size);\n const gapValue = layout.gap ? resolveGap(layout.gap, config.tokens.spacing) : undefined;\n\n const containerStyle: React.CSSProperties = {\n ...sizeStyle,\n // Debug aid (opt-in): show bounding boxes for structural Row/Col containers\n // (not component-bound leaf cells). Off by default so pages render cleanly.\n ...(debug && !layout.componentId ? { outline: '1px solid rgba(100,100,100,0.35)' } : {}),\n // Apply .idml inline styles (can override sizeStyle values, e.g. height: '30vh' for scroll pages)\n ...(layout.idmlStyle ?? {}),\n // Prevent flex children from shrinking so percentage/vh heights are respected and scroll works\n flexShrink: 0,\n };\n\n let containerClass = '';\n\n if (layout.type === 'flex') {\n containerClass = 'flex';\n containerStyle.flexDirection = layout.direction;\n if (layout.wrap) containerStyle.flexWrap = layout.wrap;\n if (layout.justifyContent) containerStyle.justifyContent = layout.justifyContent;\n if (layout.alignItems) containerStyle.alignItems = layout.alignItems;\n if (gapValue) containerStyle.gap = gapValue;\n } else {\n containerClass = 'grid';\n containerStyle.gridTemplateColumns = `repeat(${layout.columns}, minmax(0, 1fr))`;\n if (layout.rows) containerStyle.gridTemplateRows = `repeat(${layout.rows}, minmax(0, 1fr))`;\n if (gapValue) containerStyle.gap = gapValue;\n }\n\n // Reactive sizing: apply the `@ref` dims resolved above, overriding the static\n // `size` so a cell can grow/shrink on state (e.g. a collapsing sidebar). The\n // transition between values is handled imperatively by the WAA effect above;\n // `min-width/height:0` lets the box shrink past its content during the slide.\n if (layout.dynamicSize) {\n if (dynW !== undefined) {\n containerStyle.width = dynW;\n containerStyle.minWidth = 0;\n }\n if (dynH !== undefined) {\n containerStyle.height = dynH;\n containerStyle.minHeight = 0;\n }\n }\n\n // Author-supplied utility classes (e.g. Tailwind) on Row/Col.\n if (layout.className) containerClass += ` ${layout.className}`;\n // Dynamic `@method` classes on a container (resolved per render, reactive to\n // state) — e.g. a pop-up panel's scale/opacity from `@feedbackPanelClass`.\n if (layout.classRefs?.length) {\n for (const ref of layout.classRefs) {\n const cls = resolveValueRef(ref, item, formStore?.values);\n if (cls) containerClass += ` ${cls}`;\n }\n }\n // Conditional class blocks: apply each block's classes when its `?@ref`\n // condition holds (`negate` flips it) — e.g. a pop-up's scale/opacity per\n // @state.feedbackOpen, with the actual classes declared in the .idml.\n if (layout.condClasses?.length) {\n for (const c of layout.condClasses) {\n const v = resolveValueRef(c.ref, item, formStore?.values);\n if (c.negate ? !v : Boolean(v)) containerClass += ` ${c.classes}`;\n }\n }\n\n const boundComponent = layout.componentId\n ? components.find((c) => c.id === layout.componentId)\n : undefined;\n\n const children = layout.children.map((child, i) => (\n <LayoutRenderer key={i} layout={child} components={components} />\n ));\n\n // A node can both bind a component AND carry layout children — that's a custom\n // container (e.g. Card, or an imported DefaultPageFormat). The children are\n // rendered and handed to the component as its slot, so the component decides\n // where they go (directly, or at a `Children` marker once definitions land).\n return (\n <div ref={elRef} className={containerClass} style={containerStyle} data-isd-layout>\n {boundComponent ? (\n <ComponentRenderer\n component={boundComponent}\n components={components}\n slot={layout.children.length > 0 ? children : undefined}\n />\n ) : (\n children\n )}\n </div>\n );\n}\n\nfunction resolveSizeStyle(size: LayoutDef['size']): React.CSSProperties {\n if (!size) return {};\n const s: React.CSSProperties = {};\n if (size.width) s.width = size.width;\n if (size.height) s.height = size.height;\n if (size.minWidth) s.minWidth = size.minWidth;\n if (size.minHeight) s.minHeight = size.minHeight;\n if (size.maxWidth) s.maxWidth = size.maxWidth;\n if (size.maxHeight) s.maxHeight = size.maxHeight;\n return s;\n}\n\nfunction resolveGap(tokenName: string, spacingTokens: any[]): string | undefined {\n return spacingTokens.find((t) => t.name === tokenName)?.value;\n}\n","'use client';\n\nimport React from 'react';\nimport type { ComponentDef } from '../types';\nimport { useConfigContext } from './ConfigProvider';\nimport { useVisibility } from './hooks/useVisibility';\nimport { resolveTokenProps } from './tokens/token-resolver';\nimport { getComponent } from './registry/component-registry';\nimport { BUILTIN_COMPONENTS } from './builtins';\nimport { getMethod } from './registry/method-registry';\nimport { RepeatItemContext } from './repeat-context';\nimport { FormStateContext } from './form-context';\n\nexport interface ComponentRendererProps {\n component: ComponentDef;\n components: ComponentDef[];\n /**\n * Rendered children to place inside this component (the \"slot\"). Supplied by\n * the LayoutRenderer when a layout node binds a component AND has layout\n * children — e.g. a custom container like `Card`/`DefaultPageFormat`. When\n * present it takes precedence over the component's own `children` defs.\n */\n slot?: React.ReactNode;\n}\n\nexport function ComponentRenderer({\n component,\n components,\n slot,\n}: ComponentRendererProps): React.ReactElement | null {\n const { config } = useConfigContext();\n const isVisible = useVisibility(component.visibility);\n // Evaluate bindings before any early return so hook order stays stable —\n // a 'value' binding may call a method that is itself a hook (useQuery/useState).\n const boundProps = useBoundProps(component.bindings ?? []);\n\n if (!isVisible) return null;\n\n // Block-like components fill their cell; text/heading stay natural height so\n // the parent flex container can centre them vertically.\n const FILL_HEIGHT = new Set(['Button', 'Image', 'Card', 'Divider', 'Spacer']);\n const tokenStyle = {\n width: '100%',\n ...(FILL_HEIGHT.has(component.type) ? { height: '100%' } : {}),\n boxSizing: 'border-box' as const,\n ...resolveTokenProps(component.tokenProps, config.tokens),\n ...(component.idmlStyle ?? {}),\n };\n\n const childElements = (component.children ?? []).map((child) => (\n <ComponentRenderer key={child.id} component={child} components={components} />\n ));\n\n const Component =\n getComponent(component.type) ??\n (BUILTIN_COMPONENTS as Record<string, any>)[component.type];\n\n if (!Component) {\n console.warn(`[idml] Unknown component type \"${component.type}\"`);\n return null;\n }\n\n const content = slot ?? childElements;\n const hasContent = Array.isArray(content) ? content.length > 0 : content != null;\n\n const props: Record<string, unknown> = {\n ...component.props,\n ...boundProps,\n style: tokenStyle,\n 'data-isd-id': component.id,\n };\n // className = static author classes + any dynamic `@method` classes (resolved\n // into boundProps.className), merged so both apply.\n const mergedClass = [component.className, boundProps.className as string | undefined]\n .filter(Boolean)\n .join(' ');\n if (mergedClass) props.className = mergedClass;\n else delete props.className;\n\n // Don't pass children to childless components — void elements (input, etc.)\n // error if given any children, even an empty array.\n return hasContent\n ? <Component {...props}>{content}</Component>\n : <Component {...props} />;\n}\n\nfunction useBoundProps(\n bindings: { prop: string; methodId: string; kind?: 'handler' | 'value' | 'model' }[]\n): Record<string, unknown> {\n // The current Repeat row and the enclosing form-state scope. Read once,\n // unconditionally, to keep hook order stable.\n const item = React.useContext(RepeatItemContext);\n const formStore = React.useContext(FormStateContext);\n\n const props: Record<string, unknown> = {};\n for (const binding of bindings) {\n if (binding.kind === 'value') {\n // Resolve the method/path to a live value. If a referenced method is a hook\n // this subscribes the component and re-renders when its value changes.\n const resolved = resolveValueRef(binding.methodId, item, formStore?.values);\n // Multiple `@class` bindings accumulate onto one className string.\n if (binding.prop === 'className') {\n props.className = [props.className, resolved].filter(Boolean).join(' ');\n } else {\n props[binding.prop] = resolved;\n }\n } else if (binding.kind === 'model') {\n // Two-way: read the form-state cell into the prop, and write it back on change.\n const name = binding.methodId;\n const isChecked = binding.prop === 'checked';\n const current = formStore?.values[name];\n props[binding.prop] = isChecked ? Boolean(current) : (current ?? '');\n props.onChange = (e: { target?: { value?: unknown; checked?: unknown } }) =>\n formStore?.setValue(name, isChecked ? e?.target?.checked : e?.target?.value);\n } else {\n // Handler: wrap the method so it receives the current form values plus a\n // helpers object: `handler(values, { set, event, item })`. `set(name, value)`\n // writes form state (e.g. to open/close a Modal via `@state.x`); `item` is the\n // current Repeat row, so a per-row handler (e.g. a table's Edit button) knows\n // which record it was fired for.\n const method = getMethod(binding.methodId);\n if (typeof method === 'function') {\n const fn = method as (...a: unknown[]) => unknown;\n props[binding.prop] = (event: unknown) =>\n fn(formStore?.values ?? {}, {\n set: (name: string, value: unknown) => formStore?.setValue(name, value),\n event,\n item,\n });\n }\n }\n }\n return props;\n}\n\n/**\n * Resolve a value-reference path. The first segment selects the source:\n * - `item` — the current Repeat row\n * - `state` — the enclosing form-state store (so `@state.isOpen` reads UI state)\n * - anything else — a registered method, called for its value\n * Each later segment indexes into the result. Examples: `users`, `item.name`,\n * `state.isCreateOpen`, `currentUser.email`.\n */\nexport function resolveValueRef(ref: string, item: unknown, state?: Record<string, unknown>): unknown {\n const segments = ref.split('.');\n let base: unknown;\n if (segments[0] === 'item') {\n base = item;\n } else if (segments[0] === 'state') {\n base = state;\n } else {\n // Pass the current row item AND the form state so a method can compute a\n // value from either — e.g. a role → colour-class mapping (per-row) or a\n // state-driven animation class (`feedbackOpen` → scale-100/scale-0). Plain\n // methods simply ignore the extra arguments.\n const method = getMethod(segments[0]);\n base =\n typeof method === 'function'\n ? (method as (it: unknown, st?: Record<string, unknown>) => unknown)(item, state)\n : undefined;\n }\n for (let i = 1; i < segments.length; i++) {\n if (base == null) return undefined;\n base = (base as Record<string, unknown>)[segments[i]];\n }\n return base;\n}\n","import type { VisibilityDef } from '../../types';\nimport { getMethod } from '../registry/method-registry';\n\nexport function useVisibility(rule: VisibilityDef | undefined): boolean {\n if (!rule) return true;\n\n const method = getMethod(rule.methodId);\n if (!method) {\n console.warn(\n `[idml] Visibility method \"${rule.methodId}\" not registered — defaulting to visible`\n );\n return true;\n }\n\n const result = Boolean(method());\n return rule.negate ? !result : result;\n}\n","import React from 'react';\nimport type { ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport Link from 'next/link';\nimport { RepeatItemContext } from '../repeat-context';\nimport { FormStateProvider } from '../form-context';\n\ninterface ComponentProps {\n [key: string]: any;\n children?: ReactNode;\n}\n\nconst Text = ({ text, children, ...props }: ComponentProps) =>\n React.createElement('span', props, text || children);\n\nconst Heading = ({ level = 1, text, children, ...props }: ComponentProps) => {\n const Tag = (`h${level}` as unknown) as keyof React.JSX.IntrinsicElements;\n return React.createElement(Tag, props, text || children);\n};\n\nconst BUTTON_BASE: React.CSSProperties = {\n border: 'none',\n outline: 'none',\n textDecoration: 'none',\n cursor: 'pointer',\n fontFamily: 'inherit',\n fontSize: 'inherit',\n};\n\nconst Button = ({ text, children, onClick, href, style, type = 'button', ...props }: ComponentProps) => {\n const merged = { ...BUTTON_BASE, ...style };\n // Render both the label and any slotted children (e.g. an icon placed inside\n // the button via `Button(\"Save\", { Image(...) })`).\n const content = [text, children];\n // Default type=\"button\" so a button inside a Form doesn't trigger native form\n // submission on click — our onClick handler runs instead.\n return href\n ? React.createElement(Link, { href: href as string, style: merged, ...props }, content)\n : React.createElement('button', { type, onClick, style: merged, ...props }, content);\n};\n\nconst Image = ({ src, alt, ...props }: ComponentProps) =>\n React.createElement('img', { src, alt: alt || '', ...props });\n\nconst List = ({ items = [], children, ...props }: ComponentProps) =>\n React.createElement(\n 'ul',\n props,\n items.map((item: any, i: number) =>\n React.createElement('li', { key: i }, typeof item === 'string' ? item : JSON.stringify(item))\n ),\n children\n );\n\nconst Card = ({ children, ...props }: ComponentProps) =>\n React.createElement('div', props, children);\n\nconst Divider = (props: ComponentProps) => React.createElement('hr', props);\n\nconst Spacer = (props: ComponentProps) => React.createElement('div', props);\n\nconst Icon = ({ name, ...props }: ComponentProps) =>\n React.createElement('span', props, name || '●');\n\n// Stub. The real Table is being designed as an idml object with its own data\n// binding/column format; for now it renders a labelled placeholder so pages that\n// reference it compose and lay out correctly.\nconst Table = ({ children, ...props }: ComponentProps) =>\n React.createElement('div', { 'data-isd-table': '', ...props }, children ?? 'Table');\n\nconst Input = ({ type = 'text', value, onChange, placeholder, name, disabled, style, ...props }: ComponentProps) =>\n React.createElement('input', { type, value, onChange, placeholder, name, disabled, style, ...props });\n\nconst Textarea = ({ value, onChange, placeholder, name, rows, style, ...props }: ComponentProps) =>\n React.createElement('textarea', { value, onChange, placeholder, name, rows, style, ...props });\n\nconst Option = ({ value, label, children, ...props }: ComponentProps) =>\n React.createElement('option', { value, ...props }, label ?? children);\n\nconst Select = ({ value, onChange, name, options, children, style, ...props }: ComponentProps) =>\n React.createElement(\n 'select',\n { value, onChange, name, style, ...props },\n Array.isArray(options)\n ? options.map((opt: any, i: number) =>\n React.createElement('option', { key: i, value: opt.value }, opt.label)\n )\n : children\n );\n\nconst Checkbox = ({ checked, onChange, name, disabled, style, ...props }: ComponentProps) =>\n React.createElement('input', { type: 'checkbox', checked, onChange, name, disabled, style, ...props });\n\nconst Radio = ({ checked, value, name, onChange, style, ...props }: ComponentProps) =>\n React.createElement('input', { type: 'radio', checked, value, name, onChange, style, ...props });\n\nconst Label = ({ htmlFor, text, children, style, ...props }: ComponentProps) =>\n React.createElement('label', { htmlFor, style, ...props }, text ?? children);\n\n// Slot marker. Inside a reusable component definition, `Children` marks the\n// region that the call site's children fill. The renderer threads the slot in\n// via the `slot` prop (see ComponentRenderer); here we just render it.\nconst Children = ({ slot, children, ...props }: ComponentProps) =>\n React.createElement(React.Fragment, null, slot ?? children);\n\n// Renders its child template (`children`) once per element of the `data` array\n// (bound via `Repeat(@items)`), exposing each element as the current `item` so\n// the template can read `@item.field`. `data` is reactive: when the bound method\n// (e.g. a useQuery hook) returns new data, the rows re-render.\nconst Repeat = ({ data, children, style, ...props }: ComponentProps) => {\n const items = Array.isArray(data) ? data : [];\n return React.createElement(\n 'div',\n { 'data-isd-repeat': '', style, ...props },\n items.map((item, i) =>\n React.createElement(RepeatItemContext.Provider, { key: i, value: item }, children)\n )\n );\n};\n\n// Establishes a nested form-state scope so `~name` model bindings inside it are\n// isolated from other forms / the page-level store.\nconst Form = ({ children, style, ...props }: ComponentProps) =>\n React.createElement(\n FormStateProvider,\n null,\n React.createElement('form', { style, ...props }, children)\n );\n\nconst MODAL_BACKDROP: React.CSSProperties = {\n position: 'fixed',\n inset: 0,\n background: 'rgba(0,0,0,0.5)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 1000,\n};\n// Only structural defaults that keep a tall modal on-screen. Appearance —\n// background, radius, padding, width, shadow — is left to the panel's className\n// so an inline style here never overrides the author's utility classes (e.g.\n// `max-w-md` would otherwise lose to an inline `maxWidth`).\nconst MODAL_PANEL: React.CSSProperties = {\n maxHeight: '90vh',\n overflow: 'auto',\n};\n\n// Overlay rendered in a portal when `open` is truthy. Open state typically lives\n// in form state (`Modal(@state.isCreateOpen)`), toggled by handlers via `set`.\n// Clicking the backdrop calls `onClose` if provided.\nconst Modal = ({ open, onClose, children, style, ...props }: ComponentProps) => {\n if (!open) return null;\n if (typeof document === 'undefined') return null; // SSR guard\n const panel = React.createElement(\n 'div',\n {\n 'data-isd-modal': '',\n style: { ...MODAL_PANEL, ...style },\n onClick: (e: React.MouseEvent) => e.stopPropagation(),\n ...props,\n },\n children\n );\n return createPortal(\n React.createElement('div', { 'data-isd-modal-backdrop': '', style: MODAL_BACKDROP, onClick: onClose }, panel),\n document.body\n );\n};\n\nexport const BUILTIN_COMPONENTS = {\n Text,\n Heading,\n Button,\n Image,\n List,\n Card,\n Divider,\n Spacer,\n Icon,\n Table,\n Input,\n Textarea,\n Select,\n Option,\n Checkbox,\n Radio,\n Label,\n Children,\n Repeat,\n Form,\n Modal,\n};\n","import { createContext } from 'react';\n\n/**\n * The current row/item provided by a `Repeat`. Value-references whose path starts\n * with `item` (e.g. `@item.name`) resolve against this. `undefined` outside a Repeat.\n */\nexport const RepeatItemContext = createContext<unknown>(undefined);\n","'use client';\n\nimport React, { createContext, useCallback, useContext, useState } from 'react';\n\nexport interface FormStore {\n values: Record<string, unknown>;\n setValue: (name: string, value: unknown) => void;\n}\n\n/**\n * Form-state scope for two-way (`~name`) model bindings. A default scope is\n * provided at the page root (see ConfigRenderer); a `Form` component nests a new\n * one so multiple forms don't collide.\n */\nexport const FormStateContext = createContext<FormStore | undefined>(undefined);\n\nexport function FormStateProvider({\n initial,\n children,\n}: {\n initial?: Record<string, unknown>;\n children: React.ReactNode;\n}): React.ReactElement {\n const [values, setValues] = useState<Record<string, unknown>>(initial ?? {});\n const setValue = useCallback((name: string, value: unknown) => {\n setValues((prev) => ({ ...prev, [name]: value }));\n }, []);\n return (\n <FormStateContext.Provider value={{ values, setValue }}>{children}</FormStateContext.Provider>\n );\n}\n\nexport function useFormStore(): FormStore | undefined {\n return useContext(FormStateContext);\n}\n","'use client';\n\nimport React from 'react';\nimport { useConfigContext } from './ConfigProvider';\nimport { LayoutRenderer } from './LayoutRenderer';\nimport { FormStateProvider } from './form-context';\n\nexport interface ConfigRendererProps {\n page: string;\n}\n\nexport function ConfigRenderer({ page }: ConfigRendererProps): React.ReactElement | null {\n const { config } = useConfigContext();\n const pageDef = config.pages.find((p) => p.route === page);\n\n if (!pageDef) {\n console.warn(`[idml] No page found for route \"${page}\"`);\n return null;\n }\n\n // A page-level form-state scope so `~name` model bindings work without an\n // explicit Form; a Form component nests its own scope when isolation is wanted.\n return (\n <FormStateProvider>\n <div\n data-isd-page={page}\n style={{ width: '100%', height: '100vh', display: 'flex', flexDirection: 'column' }}\n >\n <LayoutRenderer layout={pageDef.layout} components={pageDef.components} />\n </div>\n </FormStateProvider>\n );\n}\n","import { getMethod } from '../registry/method-registry';\n\nexport function useRegisteredMethod(id: string): ((...args: unknown[]) => unknown) | undefined {\n return getMethod(id);\n}\n","'use client';\n\nimport React, { useEffect, useState } from 'react';\nimport type { UIConfig } from '../types';\nimport { useEditorState } from './hooks/useEditorState';\nimport { useSSEConfig } from './hooks/useSSEConfig';\nimport { useSaveConfig } from './hooks/useSaveConfig';\nimport { ComponentTree } from './panels/ComponentTree';\nimport { LivePreview } from './panels/LivePreview';\nimport { PropertyPanel } from './panels/PropertyPanel';\n\nexport function EditorPage(): React.ReactElement {\n const [initialConfig, setInitialConfig] = useState<UIConfig | null>(null);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n fetch('/api/_isd/config')\n .then((r) => r.json())\n .then((config: UIConfig) => {\n setInitialConfig(config);\n setLoading(false);\n })\n .catch((err) => {\n console.error('[idml editor] Failed to load config:', err);\n setLoading(false);\n });\n }, []);\n\n if (loading) {\n return <div style={{ padding: '16px' }}>Loading editor...</div>;\n }\n\n if (!initialConfig) {\n return <div style={{ padding: '16px', color: '#dc2626' }}>Failed to load configuration</div>;\n }\n\n return <EditorShell initialConfig={initialConfig} />;\n}\n\nfunction EditorShell({ initialConfig }: { initialConfig: UIConfig }): React.ReactElement {\n const { state, selectComponent, selectPage, updateConfig, undo, redo } =\n useEditorState(initialConfig);\n const { save, saving, error } = useSaveConfig();\n\n useSSEConfig((fresh) => {\n updateConfig(fresh);\n });\n\n const activePage = state.config.pages.find((p) => p.route === state.selectedPageRoute);\n const selectedComponent = activePage?.components.find((c) => c.id === state.selectedComponentId);\n\n return (\n <div style={{ display: 'flex', width: '100vw', height: '100vh', fontFamily: 'system-ui' }}>\n {/* Left panel */}\n <div style={{ width: '20%', borderRight: '1px solid #e5e7eb', display: 'flex', flexDirection: 'column' }}>\n <div style={{ padding: '8px', borderBottom: '1px solid #e5e7eb', fontSize: '12px', fontWeight: 600 }}>\n Structure\n </div>\n <ComponentTree\n pages={state.config.pages}\n selectedId={state.selectedComponentId}\n onSelect={selectComponent}\n onPageChange={selectPage}\n />\n </div>\n\n {/* Center panel */}\n <div style={{ flex: 1, display: 'flex', flexDirection: 'column' }}>\n <div\n style={{\n padding: '8px',\n borderBottom: '1px solid #e5e7eb',\n display: 'flex',\n gap: '8px',\n alignItems: 'center',\n fontSize: '12px',\n }}\n >\n <button\n onClick={undo}\n disabled={state.history.length === 0}\n style={{\n padding: '4px 8px',\n fontSize: '11px',\n cursor: state.history.length === 0 ? 'not-allowed' : 'pointer',\n opacity: state.history.length === 0 ? 0.5 : 1,\n }}\n >\n ↶ Undo\n </button>\n <button\n onClick={redo}\n disabled={state.future.length === 0}\n style={{\n padding: '4px 8px',\n fontSize: '11px',\n cursor: state.future.length === 0 ? 'not-allowed' : 'pointer',\n opacity: state.future.length === 0 ? 0.5 : 1,\n }}\n >\n ↷ Redo\n </button>\n <button\n onClick={() => save(state.config)}\n disabled={saving}\n style={{\n padding: '4px 8px',\n fontSize: '11px',\n background: '#dbeafe',\n color: '#1a56db',\n border: 'none',\n cursor: saving ? 'not-allowed' : 'pointer',\n opacity: saving ? 0.7 : 1,\n }}\n >\n {saving ? '⋯ Saving' : '💾 Save'}\n </button>\n {error && (\n <div style={{ fontSize: '10px', color: '#dc2626', flex: 1 }}>\n Error: {error}\n </div>\n )}\n </div>\n {activePage && (\n <LivePreview pageRoute={state.selectedPageRoute} onComponentSelect={selectComponent} />\n )}\n </div>\n\n {/* Right panel */}\n <div style={{ width: '25%', borderLeft: '1px solid #e5e7eb', display: 'flex', flexDirection: 'column' }}>\n <div style={{ padding: '8px', borderBottom: '1px solid #e5e7eb', fontSize: '12px', fontWeight: 600 }}>\n Properties\n </div>\n <div style={{ flex: 1, overflow: 'auto' }}>\n {selectedComponent && activePage ? (\n <PropertyPanel\n component={selectedComponent}\n tokens={state.config.tokens}\n onChange={(updated) => {\n const newPages = state.config.pages.map((p) =>\n p.route === state.selectedPageRoute\n ? {\n ...p,\n components: p.components.map((c) =>\n c.id === updated.id ? updated : c\n ),\n }\n : p\n );\n updateConfig({ ...state.config, pages: newPages });\n }}\n />\n ) : (\n <div style={{ padding: '12px', fontSize: '12px', color: '#6b7280' }}>\n Select a component to edit its properties\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useState, useCallback } from 'react';\nimport type { UIConfig } from '../../types';\n\nexport interface EditorState {\n config: UIConfig;\n selectedComponentId: string | null;\n selectedPageRoute: string;\n history: UIConfig[];\n future: UIConfig[];\n}\n\nexport function useEditorState(initialConfig: UIConfig) {\n const [state, setState] = useState<EditorState>({\n config: initialConfig,\n selectedComponentId: null,\n selectedPageRoute: initialConfig.pages[0]?.route ?? '/',\n history: [],\n future: [],\n });\n\n const selectComponent = useCallback((id: string | null) => {\n setState((s) => ({ ...s, selectedComponentId: id }));\n }, []);\n\n const selectPage = useCallback((route: string) => {\n setState((s) => ({ ...s, selectedPageRoute: route, selectedComponentId: null }));\n }, []);\n\n const updateConfig = useCallback((next: UIConfig) => {\n setState((s) => ({\n ...s,\n config: next,\n history: [...s.history, s.config].slice(-50),\n future: [],\n }));\n }, []);\n\n const undo = useCallback(() => {\n setState((s) => {\n if (s.history.length === 0) return s;\n const prev = s.history[s.history.length - 1];\n return {\n ...s,\n config: prev,\n history: s.history.slice(0, -1),\n future: [s.config, ...s.future],\n };\n });\n }, []);\n\n const redo = useCallback(() => {\n setState((s) => {\n if (s.future.length === 0) return s;\n const next = s.future[0];\n return {\n ...s,\n config: next,\n history: [...s.history, s.config],\n future: s.future.slice(1),\n };\n });\n }, []);\n\n return { state, selectComponent, selectPage, updateConfig, undo, redo };\n}\n","'use client';\n\nimport { useEffect, useCallback } from 'react';\nimport type { UIConfig } from '../../types';\n\nexport function useSSEConfig(onConfigChange: (config: UIConfig) => void): void {\n const handleChange = useCallback(() => {\n fetch('/api/_isd/config')\n .then((r) => r.json())\n .then((raw: unknown) => onConfigChange(raw as UIConfig))\n .catch((err) => console.error('[idml editor] Failed to reload config:', err));\n }, [onConfigChange]);\n\n useEffect(() => {\n const es = new EventSource('/api/_isd/events');\n\n es.onmessage = (event) => {\n try {\n const data = JSON.parse(event.data);\n if (data.type === 'config:change') {\n handleChange();\n }\n } catch {\n // ignore parse errors\n }\n };\n\n es.onerror = () => {\n console.warn('[idml editor] SSE connection lost, will retry automatically');\n };\n\n return () => es.close();\n }, [handleChange]);\n}\n","'use client';\n\nimport { useCallback, useState } from 'react';\nimport type { UIConfig } from '../../types';\n\nexport function useSaveConfig() {\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const save = useCallback(async (config: UIConfig) => {\n setSaving(true);\n setError(null);\n try {\n const res = await fetch('/api/_isd/config', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(config),\n });\n if (!res.ok) {\n const data = await res.json();\n throw new Error(data.error || `Save failed: ${res.status}`);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Unknown error');\n } finally {\n setSaving(false);\n }\n }, []);\n\n return { save, saving, error };\n}\n","'use client';\n\nimport React from 'react';\nimport type { PageDef, ComponentDef } from '../../types';\n\ninterface ComponentTreeProps {\n pages: PageDef[];\n selectedId: string | null;\n onSelect: (id: string | null) => void;\n onPageChange: (route: string) => void;\n}\n\nexport function ComponentTree({\n pages,\n selectedId,\n onSelect,\n onPageChange,\n}: ComponentTreeProps): React.ReactElement {\n return (\n <div style={{ padding: '12px', overflow: 'auto', height: '100%' }}>\n <div style={{ fontSize: '12px', fontWeight: 600, marginBottom: '8px' }}>Pages</div>\n {pages.map((page) => (\n <div key={page.route} style={{ marginBottom: '12px' }}>\n <button\n onClick={() => onPageChange(page.route)}\n style={{\n display: 'block',\n width: '100%',\n padding: '6px 8px',\n textAlign: 'left',\n border: '1px solid #d1d5db',\n background: '#f9fafb',\n cursor: 'pointer',\n fontSize: '12px',\n fontWeight: 500,\n }}\n >\n {page.route}\n </button>\n <div style={{ paddingLeft: '8px', marginTop: '4px' }}>\n {page.components.map((comp) => (\n <ComponentTreeItem\n key={comp.id}\n component={comp}\n selected={selectedId === comp.id}\n onSelect={onSelect}\n />\n ))}\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nfunction ComponentTreeItem({\n component,\n selected,\n onSelect,\n}: {\n component: ComponentDef;\n selected: boolean;\n onSelect: (id: string) => void;\n}): React.ReactElement {\n return (\n <div>\n <button\n onClick={() => onSelect(component.id)}\n style={{\n display: 'block',\n width: '100%',\n padding: '4px 6px',\n textAlign: 'left',\n border: selected ? '1px solid #1a56db' : '1px solid transparent',\n background: selected ? '#eff6ff' : 'transparent',\n cursor: 'pointer',\n fontSize: '11px',\n marginBottom: '2px',\n }}\n >\n <span style={{ fontFamily: 'monospace' }}>{component.type}</span>\n <span style={{ fontSize: '10px', color: '#6b7280' }}>#{component.id}</span>\n </button>\n {component.children?.map((child) => (\n <div key={child.id} style={{ paddingLeft: '12px' }}>\n <ComponentTreeItem component={child} selected={selected} onSelect={onSelect} />\n </div>\n ))}\n </div>\n );\n}\n","'use client';\n\nimport React, { useRef, useEffect } from 'react';\n\ninterface LivePreviewProps {\n pageRoute: string;\n onComponentSelect: (id: string) => void;\n}\n\nexport function LivePreview({\n pageRoute,\n onComponentSelect,\n}: LivePreviewProps): React.ReactElement {\n const iframeRef = useRef<HTMLIFrameElement>(null);\n\n useEffect(() => {\n const handler = (event: MessageEvent) => {\n if (event.data?.type === 'isd:select' && typeof event.data.componentId === 'string') {\n onComponentSelect(event.data.componentId);\n }\n };\n window.addEventListener('message', handler);\n return () => window.removeEventListener('message', handler);\n }, [onComponentSelect]);\n\n return (\n <div style={{ height: '100%', display: 'flex', flexDirection: 'column', background: '#fff' }}>\n <div style={{ padding: '8px', borderBottom: '1px solid #e5e7eb', fontSize: '12px' }}>\n Preview: {pageRoute}\n </div>\n <iframe\n ref={iframeRef}\n src={pageRoute}\n style={{\n flex: 1,\n border: 'none',\n width: '100%',\n }}\n title=\"Live preview\"\n />\n </div>\n );\n}\n","'use client';\n\nimport React, { useState } from 'react';\nimport type { ComponentDef, TokensDef } from '../../types';\n\ninterface PropertyPanelProps {\n component: ComponentDef;\n tokens: TokensDef;\n onChange: (updated: ComponentDef) => void;\n}\n\nexport function PropertyPanel({\n component,\n tokens,\n onChange,\n}: PropertyPanelProps): React.ReactElement {\n const [expandedSection, setExpandedSection] = useState<string | null>('props');\n\n const updateComponent = (updates: Partial<ComponentDef>) => {\n onChange({ ...component, ...updates });\n };\n\n return (\n <div style={{ padding: '12px', overflow: 'auto', height: '100%', fontSize: '12px' }}>\n <div style={{ marginBottom: '16px' }}>\n <div style={{ fontSize: '11px', color: '#6b7280', marginBottom: '4px' }}>ID</div>\n <div\n style={{\n fontFamily: 'monospace',\n padding: '4px 6px',\n background: '#f3f4f6',\n borderRadius: '2px',\n }}\n >\n {component.id}\n </div>\n </div>\n\n <Section\n title=\"Type\"\n expanded={expandedSection === 'type'}\n onToggle={() =>\n setExpandedSection(expandedSection === 'type' ? null : 'type')\n }\n >\n <input\n type=\"text\"\n value={component.type}\n onChange={(e) => updateComponent({ type: e.target.value })}\n style={{ width: '100%', padding: '4px', fontSize: '12px' }}\n />\n </Section>\n\n <Section\n title=\"Token Props\"\n expanded={expandedSection === 'tokenProps'}\n onToggle={() =>\n setExpandedSection(expandedSection === 'tokenProps' ? null : 'tokenProps')\n }\n >\n <PropertyInput\n label=\"Color\"\n value={component.tokenProps?.color ?? ''}\n onChange={(value) =>\n updateComponent({\n tokenProps: { ...component.tokenProps, color: value || undefined },\n })\n }\n options={tokens.colors.map((c) => c.name)}\n />\n <PropertyInput\n label=\"Background\"\n value={component.tokenProps?.background ?? ''}\n onChange={(value) =>\n updateComponent({\n tokenProps: { ...component.tokenProps, background: value || undefined },\n })\n }\n options={tokens.colors.map((c) => c.name)}\n />\n <PropertyInput\n label=\"Typography\"\n value={component.tokenProps?.typography ?? ''}\n onChange={(value) =>\n updateComponent({\n tokenProps: { ...component.tokenProps, typography: value || undefined },\n })\n }\n options={tokens.typography.map((t) => t.name)}\n />\n </Section>\n\n <Section\n title=\"Visibility\"\n expanded={expandedSection === 'visibility'}\n onToggle={() =>\n setExpandedSection(expandedSection === 'visibility' ? null : 'visibility')\n }\n >\n {component.visibility ? (\n <>\n <div style={{ marginBottom: '8px' }}>\n <div style={{ fontSize: '10px', color: '#6b7280' }}>Method</div>\n <input\n type=\"text\"\n value={component.visibility.methodId}\n onChange={(e) =>\n updateComponent({\n visibility: { ...component.visibility, methodId: e.target.value },\n })\n }\n style={{ width: '100%', padding: '4px', fontSize: '12px' }}\n />\n </div>\n <label style={{ display: 'flex', alignItems: 'center', gap: '4px', fontSize: '11px' }}>\n <input\n type=\"checkbox\"\n checked={component.visibility.negate ?? false}\n onChange={(e) =>\n updateComponent({\n visibility: { ...component.visibility, negate: e.target.checked },\n })\n }\n />\n Negate (show when false)\n </label>\n <button\n onClick={() => updateComponent({ visibility: undefined })}\n style={{\n marginTop: '8px',\n padding: '4px 8px',\n fontSize: '11px',\n background: '#fee2e2',\n color: '#dc2626',\n border: 'none',\n cursor: 'pointer',\n }}\n >\n Remove visibility\n </button>\n </>\n ) : (\n <button\n onClick={() =>\n updateComponent({ visibility: { methodId: '', negate: false } })\n }\n style={{\n padding: '4px 8px',\n fontSize: '11px',\n background: '#dbeafe',\n color: '#1a56db',\n border: 'none',\n cursor: 'pointer',\n }}\n >\n Add visibility rule\n </button>\n )}\n </Section>\n </div>\n );\n}\n\nfunction Section({\n title,\n expanded,\n onToggle,\n children,\n}: {\n title: string;\n expanded: boolean;\n onToggle: () => void;\n children: React.ReactNode;\n}): React.ReactElement {\n return (\n <div style={{ marginBottom: '12px' }}>\n <button\n onClick={onToggle}\n style={{\n width: '100%',\n padding: '6px 8px',\n textAlign: 'left',\n background: '#f3f4f6',\n border: '1px solid #e5e7eb',\n cursor: 'pointer',\n fontSize: '11px',\n fontWeight: 600,\n }}\n >\n {expanded ? '▼' : '▶'} {title}\n </button>\n {expanded && <div style={{ padding: '8px', background: '#fafafa' }}>{children}</div>}\n </div>\n );\n}\n\nfunction PropertyInput({\n label,\n value,\n onChange,\n options,\n}: {\n label: string;\n value: string;\n onChange: (value: string) => void;\n options: string[];\n}): React.ReactElement {\n return (\n <div style={{ marginBottom: '8px' }}>\n <label style={{ display: 'block', fontSize: '10px', color: '#6b7280', marginBottom: '2px' }}>\n {label}\n </label>\n {options.length > 0 ? (\n <select\n value={value}\n onChange={(e) => onChange(e.target.value)}\n style={{\n width: '100%',\n padding: '4px',\n fontSize: '12px',\n border: '1px solid #d1d5db',\n }}\n >\n <option value=\"\">None</option>\n {options.map((opt) => (\n <option key={opt} value={opt}>\n {opt}\n </option>\n ))}\n </select>\n ) : (\n <input\n type=\"text\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n style={{\n width: '100%',\n padding: '4px',\n fontSize: '12px',\n border: '1px solid #d1d5db',\n }}\n />\n )}\n </div>\n );\n}\n","import type { UIConfig, LayoutDef, ComponentDef, FlexDef, SizeDef, DataBindingDef } from '../types';\nimport type { PercentageString, DynamicSize, DynamicDim } from '../types/layout.types';\n\n// ==================== PARSED INTERMEDIATE TYPES ====================\n\n// A dimension is a static percentage number, or a `@ref` value-binding (resolved\n// per render to a dimension) so a cell can resize on state — e.g. a sidebar that\n// narrows when collapsed. A `@ref ? A : B` form picks A/B from the ref's\n// truthiness so the two sizes (the visual values) live in the .idml, not in a\n// method. (`'auto'` is gone; see parseDimension.)\ntype DimRef = { ref: string; whenTrue?: string; whenFalse?: string };\n// `'auto'` is internal-only (table expansion uses it for content-height); the\n// parser rejects it as user input. `@ref` dims come from `parseDimension`.\ntype DimValue = number | 'auto' | DimRef;\nconst isDimRef = (d: DimValue): d is DimRef => typeof d === 'object' && d !== null && 'ref' in d;\n\n/**\n * Content-sizing (\"hug\") flags. An element still declares its `[h,w]` percentage\n * tile — that tile is its MAX bound — but a hugged axis shrinks the bound\n * component to its content within the tile (instead of stretching to fill it),\n * clipping with an ellipsis if the content would overflow the tile.\n */\ninterface HugSpec {\n w: boolean;\n h: boolean;\n}\n\n// An argument value in a component call. Bare identifiers become tagged strings\n// (FN_REF_PREFIX = handler, VALUE_REF_PREFIX = reactive value binding); `null`,\n// booleans, numbers and strings are literals; a `{ }` block is a children marker.\ntype IdmlArg = string | number | boolean | null | Record<string, unknown>;\n\ninterface ParsedItem {\n name: string;\n args: IdmlArg[];\n height: DimValue;\n width: DimValue;\n anchor: string;\n children: ParsedItem[];\n style: Record<string, string>;\n className?: string;\n /** Method ids referenced as `@x` tokens inside a class block — resolved per\n * render (with the current row item) and appended to className. */\n classRefs?: string[];\n /** Conditional class blocks (`` `classes`?@ref ``) applied per render. */\n condClasses?: { classes: string; ref: string; negate: boolean }[];\n /** Optional content-sizing flags from a trailing `hug` / `hug-w` / `hug-h`\n * token in the dimension bracket. */\n hug?: HugSpec;\n /** Optional visibility condition from a `?@ref` / `?!@ref` clause after the\n * dims — the element renders only when the ref is truthy (negate flips it). */\n visibility?: VisibilityRef;\n}\n\n/** A reactive show/hide condition: render the element only when `ref` (a value\n * path like `state.open` / `item.x` / a method) is truthy; `negate` flips it. */\ninterface VisibilityRef {\n ref: string;\n negate: boolean;\n}\n\ninterface ParsedPage {\n route: string;\n scroll: boolean;\n items: ParsedItem[];\n}\n\ninterface StyleEntry {\n baseType: string;\n defaultArgs: IdmlArg[];\n style: Record<string, string>;\n /** Utility (Tailwind) classes baked into this styled variant. */\n className?: string;\n}\n\n// ==================== TOKENIZER ====================\n\ntype TokenType =\n | 'ROUTE'\n | 'IDENT'\n | 'NUMBER'\n | 'STRING'\n | 'COLOR'\n | 'COLON'\n | 'LPAREN'\n | 'RPAREN'\n | 'LBRACKET'\n | 'RBRACKET'\n | 'LBRACE'\n | 'RBRACE'\n | 'COMMA'\n | 'QUESTION'\n | 'BANG'\n | 'VALUE_REF'\n | 'MODEL_REF'\n | 'CLASS_BLOCK';\n\ninterface Token {\n type: TokenType;\n value?: string | number;\n}\n\nconst SINGLE_CHAR_TOKENS: Record<string, TokenType> = {\n '(': 'LPAREN',\n ')': 'RPAREN',\n '[': 'LBRACKET',\n ']': 'RBRACKET',\n '{': 'LBRACE',\n '}': 'RBRACE',\n ',': 'COMMA',\n ':': 'COLON',\n '?': 'QUESTION',\n '!': 'BANG',\n};\n\n// Hard maximum line width. Lines longer than this are a parse error: long lines\n// hide structure, so the DSL is kept legible at a glance.\nconst MAX_LINE_WIDTH = 80;\n\n/**\n * Source-level rules enforced before tokenizing (so they apply to the main file\n * and every imported file uniformly):\n * - no line may exceed MAX_LINE_WIDTH columns;\n * - comments (`#` lines) are only allowed in the header — a single block at the\n * top of the file, before the first line of code. A comment anywhere after\n * code has started is an error.\n * Blank lines are allowed anywhere. Inline `#rrggbb` colours are not affected:\n * only a line whose first non-whitespace character is `#` counts as a comment.\n */\nfunction validateSource(source: string): void {\n const lines = source.split('\\n');\n let codeStarted = false;\n lines.forEach((line, idx) => {\n const lineNo = idx + 1;\n if (line.length > MAX_LINE_WIDTH) {\n throw new Error(\n `[idml] line ${lineNo} is ${line.length} columns; the limit is ${MAX_LINE_WIDTH}`\n );\n }\n const trimmed = line.trim();\n if (trimmed === '') return;\n if (trimmed.startsWith('#')) {\n if (codeStarted) {\n throw new Error(\n `[idml] line ${lineNo}: comments are only allowed in the header block ` +\n `at the very top of the file, before any code`\n );\n }\n return;\n }\n codeStarted = true;\n });\n}\n\nfunction tokenize(source: string): Token[] {\n validateSource(source);\n\n // Strip whole-line comments (lines where # is the first non-whitespace char).\n // This preserves inline # such as hex colours inside style blocks.\n const stripped = source\n .split('\\n')\n .map(line => (line.trimStart().startsWith('#') ? '' : line))\n .join('\\n');\n\n const tokens: Token[] = [];\n let i = 0;\n\n while (i < stripped.length) {\n if (/\\s/.test(stripped[i])) { i++; continue; }\n\n // Route: ./segment or ./segment/segment (multi-segment routes supported)\n if (stripped[i] === '.' && stripped[i + 1] === '/') {\n let j = i + 2;\n while (j < stripped.length && /[\\w/-]/.test(stripped[j])) j++;\n tokens.push({ type: 'ROUTE', value: '/' + stripped.slice(i + 2, j) });\n i = j;\n continue;\n }\n\n // Hex color: #rrggbb or #rgb\n if (stripped[i] === '#' && /[0-9a-fA-F]/.test(stripped[i + 1] ?? '')) {\n let j = i + 1;\n while (j < stripped.length && /[0-9a-fA-F]/.test(stripped[j])) j++;\n tokens.push({ type: 'COLOR', value: stripped.slice(i, j) });\n i = j;\n continue;\n }\n\n // Reactive value reference: @methodName or @item.field or @obj.field — binds a\n // prop to a live value. A dotted path's first segment is either the reserved\n // `item` (current repeat row) or a registered method; later segments index\n // into the result. A bare identifier (no @) is a handler instead.\n if (stripped[i] === '@' && /[a-zA-Z_]/.test(stripped[i + 1] ?? '')) {\n let j = i + 1;\n while (j < stripped.length && /[\\w.-]/.test(stripped[j])) j++;\n tokens.push({ type: 'VALUE_REF', value: stripped.slice(i + 1, j) });\n i = j;\n continue;\n }\n\n // Two-way model reference: ~stateName — binds an input's value to a form-state\n // cell (read + write). Used on form inputs, e.g. Input(~email).\n if (stripped[i] === '~' && /[a-zA-Z_]/.test(stripped[i + 1] ?? '')) {\n let j = i + 1;\n while (j < stripped.length && /[\\w-]/.test(stripped[j])) j++;\n tokens.push({ type: 'MODEL_REF', value: stripped.slice(i + 1, j) });\n i = j;\n continue;\n }\n\n // Inline `<...>` style blocks are no longer supported — all styling lives in\n // named styled variants (Name:BaseType). Reject them explicitly.\n if (stripped[i] === '<') {\n throw new Error(\n '[idml] inline `<...>` style blocks are no longer supported; ' +\n 'declare a styled variant (Name:BaseType) and apply it instead'\n );\n }\n\n // CSS class block: `class names here` (backticks). Spaces allowed; flows to\n // the element's className (e.g. Tailwind utilities).\n if (stripped[i] === '`') {\n let j = i + 1;\n while (j < stripped.length && stripped[j] !== '`') j++;\n tokens.push({ type: 'CLASS_BLOCK', value: stripped.slice(i + 1, j).trim() });\n i = j + 1;\n continue;\n }\n\n // Single-char tokens\n if (stripped[i] in SINGLE_CHAR_TOKENS) {\n tokens.push({ type: SINGLE_CHAR_TOKENS[stripped[i]] });\n i++;\n continue;\n }\n\n // Quoted string\n if (stripped[i] === '\"') {\n let j = i + 1;\n while (j < stripped.length && stripped[j] !== '\"') {\n if (stripped[j] === '\\\\') j++;\n j++;\n }\n tokens.push({ type: 'STRING', value: stripped.slice(i + 1, j) });\n i = j + 1;\n continue;\n }\n\n // Number (may include decimal point)\n if (/\\d/.test(stripped[i])) {\n let j = i;\n while (j < stripped.length && /[\\d.]/.test(stripped[j])) j++;\n tokens.push({ type: 'NUMBER', value: parseFloat(stripped.slice(i, j)) });\n i = j;\n continue;\n }\n\n // Identifier (includes hyphenated keywords like top-left)\n if (/[a-zA-Z_]/.test(stripped[i])) {\n let j = i;\n while (j < stripped.length && /[\\w-]/.test(stripped[j])) j++;\n tokens.push({ type: 'IDENT', value: stripped.slice(i, j) });\n i = j;\n continue;\n }\n\n throw new Error(`[idml] Unexpected character '${stripped[i]}' at position ${i}`);\n }\n\n return tokens;\n}\n\n// ==================== STYLE PROP MAPPER ====================\n\nfunction applyStyleProp(key: string, val: string, result: Record<string, string>): void {\n switch (key) {\n case 'bg': result.backgroundColor = val; break;\n case 'fg': result.color = val; break;\n case 'size': result.fontSize = val.endsWith('vw') ? val : `${val}vw`; break;\n case 'font': result.fontFamily = val; break;\n case 'weight': result.fontWeight = val; break;\n case 'style':\n if (val === 'bold') result.fontWeight = '700';\n else if (val === 'italic') result.fontStyle = 'italic';\n break;\n case 'pad': result.padding = val.endsWith('%') ? val : `${val}%`; break;\n case 'radius': result.borderRadius = val.endsWith('px') ? val : `${val}px`; break;\n case 'gap': result.gap = val.endsWith('vw') ? val : `${val}vw`; break;\n case 'align': result.textAlign = val; break;\n case 'overflow': result.overflowY = val; break;\n case 'h': result.height = val; break;\n case 'w': result.width = val; break;\n default: result[key] = val;\n }\n}\n\n// ==================== RECURSIVE DESCENT PARSER ====================\n\n// Prefix added to bare-identifier args so callers can distinguish them from string values.\nconst FN_REF_PREFIX = '\\x00fn:';\n// Prefix for `@method` value references — a prop bound to a method's live return value.\nconst VALUE_REF_PREFIX = '\\x00val:';\n// Prefix for `~name` model references — a two-way binding to a form-state cell.\nconst MODEL_REF_PREFIX = '\\x00model:';\n\n// Names that resolve to builtins (renderer-provided) or layout primitives, so an\n// `import` of them needn't be defined in the target file. Kept here (rather than\n// importing from the renderer) to preserve the parser/renderer separation.\nconst BUILTIN_NAMES = new Set([\n 'Text', 'Heading', 'Button', 'Image', 'List', 'Card', 'Divider', 'Spacer',\n 'Icon', 'Table', 'Children', 'Row', 'Col', 'Repeat', 'Form', 'Modal', 'Column',\n 'Overlay', 'Input', 'Textarea', 'Select', 'Option', 'Checkbox', 'Radio', 'Label',\n]);\n\nclass IdmlParser {\n private tokens: Token[];\n private pos = 0;\n styleRegistry: Map<string, StyleEntry> = new Map();\n // Reusable component definitions: name -> body template (item list). A `define`\n // block registers one; using the name as an item expands the body (macro-style),\n // substituting the call's children at the `Children` marker. See convertItem.\n defRegistry: Map<string, ParsedItem[]> = new Map();\n // Parameter names per definition (e.g. `define TopBar(title)` -> ['title']).\n // At expansion the call's positional args are bound to these names and any\n // matching references inside the body are substituted. See convertItem.\n defParamRegistry: Map<string, string[]> = new Map();\n\n constructor(tokens: Token[]) {\n this.tokens = tokens;\n }\n\n private peek(offset = 0): Token | undefined { return this.tokens[this.pos + offset]; }\n\n private consume(type?: TokenType): Token {\n const t = this.tokens[this.pos++];\n if (!t) throw new Error('[idml] Unexpected end of input');\n if (type && t.type !== type) {\n throw new Error(`[idml] Expected ${type}, got ${t.type} (\"${t.value}\")`);\n }\n return t;\n }\n\n // Entry point. resolve() is called to load imported .idml files.\n parseFile(resolve?: (path: string) => string): ParsedPage[] {\n this.parseImports(resolve);\n this.parseTopDecls();\n\n const pages: ParsedPage[] = [];\n while (this.peek()) {\n const route = this.consume('ROUTE').value as string;\n\n let scroll = false;\n if (this.peek()?.type === 'LBRACKET') {\n this.consume('LBRACKET');\n const flag = this.consume('IDENT').value as string;\n if (flag === 'scroll') scroll = true;\n this.consume('RBRACKET');\n }\n\n const items: ParsedItem[] = [];\n while (this.peek() && this.peek()?.type !== 'ROUTE') {\n const t = this.peek();\n // Imports / definitions may appear anywhere in a file — including after\n // the route line (a natural \"this is the /x page, and it needs these\"\n // ordering). Process them into the shared registries and continue.\n if (t?.type === 'IDENT' && t.value === 'import') { this.parseImports(resolve); continue; }\n if (t?.type === 'IDENT' && t.value === 'define') { this.parseDefinition(); continue; }\n if (t?.type === 'IDENT' && this.peek(1)?.type === 'COLON' && this.peek(2)?.type === 'IDENT') {\n this.parseStyleDefs();\n continue;\n }\n items.push(this.parseItem());\n }\n pages.push({ route, scroll, items });\n }\n return pages;\n }\n\n // Consume import lines. Two forms:\n // import \"path\" (whole-file style/def import)\n // import Name, Name from \"path\" (named component/def import)\n // In both cases the referenced .idml file is parsed and its definitions +\n // style-defs are registered into the shared registries.\n private parseImports(resolve?: (path: string) => string): void {\n while (this.peek(0)?.type === 'IDENT' && this.peek(0)?.value === 'import') {\n const next = this.peek(1);\n\n if (next?.type === 'STRING') {\n // Whole-file form: import \"path\"\n this.pos++; // consume 'import'\n const importPath = this.consume('STRING').value as string;\n this.resolveImport(importPath, [], resolve);\n continue;\n }\n\n if (next?.type === 'IDENT') {\n // Named form: import A, B from \"path\"\n this.pos++; // consume 'import'\n const names: string[] = [this.consume('IDENT').value as string];\n while (this.peek()?.type === 'COMMA') {\n this.pos++;\n names.push(this.consume('IDENT').value as string);\n }\n const fromTok = this.consume('IDENT');\n if (fromTok.value !== 'from') {\n throw new Error(`[idml] Expected 'from' in import, got \"${fromTok.value}\"`);\n }\n const importPath = this.consume('STRING').value as string;\n this.resolveImport(importPath, names, resolve);\n continue;\n }\n\n break;\n }\n }\n\n // Resolve and parse an imported .idml file into the shared registries.\n // `names`, when non-empty, are validated against what the file actually defines.\n private resolveImport(\n importPath: string,\n names: string[],\n resolve?: (path: string) => string\n ): void {\n // Only .idml (or extension-less) imports are resolvable here. Other imports\n // (e.g. .ts/.tsx) are documentation-only at parse time.\n const afterLastSlash = importPath.slice(importPath.lastIndexOf('/') + 1);\n const dotIdx = afterLastSlash.lastIndexOf('.');\n const ext = dotIdx >= 0 ? afterLastSlash.slice(dotIdx) : '';\n if (ext !== '.idml' && ext !== '') return;\n if (!resolve) return;\n\n const src = resolve(importPath);\n const sub = new IdmlParser(tokenize(src));\n sub.styleRegistry = this.styleRegistry; // share registries\n sub.defRegistry = this.defRegistry;\n sub.defParamRegistry = this.defParamRegistry;\n sub.parseImports(resolve); // transitive imports\n sub.parseTopDecls();\n\n for (const name of names) {\n if (\n !this.defRegistry.has(name) &&\n !this.styleRegistry.has(name) &&\n !BUILTIN_NAMES.has(name)\n ) {\n console.warn(`[idml] import: \"${name}\" is not defined in ${importPath}`);\n }\n }\n }\n\n // Parse the top-of-file declarations: `define` component definitions and\n // `Name:BaseType` style-defs, in any order, until a page route or EOF.\n private parseTopDecls(): void {\n for (;;) {\n const t = this.peek();\n if (t?.type === 'IDENT' && t.value === 'define') {\n this.parseDefinition();\n continue;\n }\n if (\n t?.type === 'IDENT' &&\n this.peek(1)?.type === 'COLON' &&\n this.peek(2)?.type === 'IDENT'\n ) {\n this.parseStyleDefs();\n continue;\n }\n break;\n }\n }\n\n // Consume `define Name(params?) { ...items including Children()... }`.\n private parseDefinition(): void {\n this.pos++; // consume 'define'\n const name = this.consume('IDENT').value as string;\n\n // Parameter list: bare identifiers, bound positionally to the call args at\n // expansion time (see convertItem's definition branch + substituteParams).\n this.consume('LPAREN');\n const params: string[] = [];\n if (this.peek()?.type !== 'RPAREN') {\n params.push(this.consume('IDENT').value as string);\n while (this.peek()?.type === 'COMMA') {\n this.pos++;\n params.push(this.consume('IDENT').value as string);\n }\n }\n this.consume('RPAREN');\n\n this.consume('LBRACE');\n const body: ParsedItem[] = [];\n while (this.peek()?.type !== 'RBRACE') {\n body.push(this.parseItem());\n }\n this.consume('RBRACE');\n\n this.defRegistry.set(name, body);\n this.defParamRegistry.set(name, params);\n }\n\n // Consume `Name:BaseType(\"arg\"...) { prop: value }` definitions.\n parseStyleDefs(): void {\n while (\n this.peek(0)?.type === 'IDENT' &&\n this.peek(1)?.type === 'COLON' &&\n this.peek(2)?.type === 'IDENT'\n ) {\n const name = this.consume('IDENT').value as string;\n this.consume('COLON');\n const baseType = this.consume('IDENT').value as string;\n\n // Optional pre-set args: Name:Type(\"arg1\", \"arg2\") { ... }\n const defaultArgs: IdmlArg[] = [];\n if (this.peek()?.type === 'LPAREN') {\n this.consume('LPAREN');\n if (this.peek()?.type !== 'RPAREN') defaultArgs.push(...this.parseArgList());\n this.consume('RPAREN');\n }\n\n // Optional baked-in utility classes: Name:Type `tailwind classes`\n let className: string | undefined;\n while (this.peek()?.type === 'CLASS_BLOCK') {\n const cls = this.consume('CLASS_BLOCK').value as string;\n className = className ? `${className} ${cls}` : cls;\n }\n\n // The `{ cssProp: val }` body is optional — a styled variant may carry only\n // classes (the common case) and/or pre-set args.\n const style = this.peek()?.type === 'LBRACE' ? this.parseStyleDefBody() : {};\n\n this.styleRegistry.set(name, { baseType, defaultArgs, style, className });\n }\n }\n\n // Parse `{ prop: value ... }` body of a style definition.\n private parseStyleDefBody(): Record<string, string> {\n this.consume('LBRACE');\n const result: Record<string, string> = {};\n while (this.peek()?.type !== 'RBRACE') {\n const key = this.consume('IDENT').value as string;\n this.consume('COLON');\n const val = this.parseStyleValue();\n applyStyleProp(key, val, result);\n }\n this.consume('RBRACE');\n return result;\n }\n\n // Parse a value token inside a style def body.\n private parseStyleValue(): string {\n const t = this.peek();\n if (!t) throw new Error('[idml] Expected style value');\n\n if (t.type === 'COLOR') { this.pos++; return t.value as string; }\n\n if (t.type === 'NUMBER') {\n const n = this.consume('NUMBER').value as number;\n const next = this.peek();\n if (next?.type === 'IDENT' && ['vh', 'vw', 'px', 'rem', 'em'].includes(next.value as string)) {\n this.pos++;\n return `${n}${next.value}`;\n }\n return String(n);\n }\n\n if (t.type === 'IDENT') { this.pos++; return t.value as string; }\n\n throw new Error(`[idml] Unexpected token type ${t.type} as style value`);\n }\n\n parseItem(): ParsedItem {\n const rawName = this.consume('IDENT').value as string;\n\n const regEntry = this.styleRegistry.get(rawName);\n const name = regEntry ? regEntry.baseType : rawName;\n const baseStyle: Record<string, string> = regEntry ? { ...regEntry.style } : {};\n\n // Args are always required: Name(arg, ...) or Name()\n this.consume('LPAREN');\n const parsedArgs: IdmlArg[] = [];\n if (this.peek()?.type !== 'RPAREN') parsedArgs.push(...this.parseArgList());\n this.consume('RPAREN');\n\n // Lift any `{ ... }` children-block args out of the arg list; they become\n // part of this item's children (merged with the trailing `{ }` block below).\n const inlineChildren: ParsedItem[] = [];\n const valueArgs: IdmlArg[] = [];\n for (const a of parsedArgs) {\n if (a && typeof a === 'object' && Array.isArray((a as Record<string, unknown>).__idmlChildren)) {\n inlineChildren.push(...((a as { __idmlChildren: ParsedItem[] }).__idmlChildren));\n } else {\n valueArgs.push(a);\n }\n }\n\n // Use provided value args; fall back to style-def defaults if none given\n const args = valueArgs.length > 0 ? valueArgs : (regEntry?.defaultArgs ?? []);\n\n // Dimensions: [height%, width%, anchor]. Required on every item, and always\n // explicit numbers — the `auto` keyword is gone (see parseDimension), because\n // every element must declare exactly how much space it occupies.\n if (this.peek()?.type !== 'LBRACKET') {\n throw new Error(\n `[idml] \"${rawName}\" is missing its required [height,width,anchor] ` +\n `dimensions`\n );\n }\n this.consume('LBRACKET');\n const height = this.parseDimension();\n this.consume('COMMA');\n const width = this.parseDimension();\n this.consume('COMMA');\n const anchor = this.consume('IDENT').value as string;\n // Optional trailing sizing keyword: [h, w, anchor, hug|hug-w|hug-h]. It makes\n // the bound component hug its content within the declared tile (see HugSpec).\n let hug: HugSpec | undefined;\n if (this.peek()?.type === 'COMMA') {\n this.consume('COMMA');\n const kw = this.consume('IDENT').value as string;\n if (kw === 'hug') hug = { w: true, h: true };\n else if (kw === 'hug-w') hug = { w: true, h: false };\n else if (kw === 'hug-h') hug = { w: false, h: true };\n else\n throw new Error(\n `[idml] unknown sizing keyword \"${kw}\" for \"${rawName}\"; ` +\n `expected hug, hug-w, or hug-h`\n );\n }\n this.consume('RBRACKET');\n\n // Optional visibility clause: `?@ref` (show when truthy) or `?!@ref` (show\n // when falsy). `ref` is a value path — `@state.x`, `@item.x`, or `@method`.\n let visibility: VisibilityRef | undefined;\n if (this.peek()?.type === 'QUESTION') {\n this.consume('QUESTION');\n let negate = false;\n if (this.peek()?.type === 'BANG') { this.consume('BANG'); negate = true; }\n const ref = this.consume('VALUE_REF').value as string;\n visibility = { ref, negate };\n }\n\n // Optional `` `class names` `` block before the children. A styled variant\n // (Name:BaseType) seeds its baked-in classes here. A use-site class block may\n // contain ONLY dynamic `@method` bindings (e.g. a per-row colour) — literal\n // utility classes are not allowed at a use site; they belong in a variant.\n let className: string | undefined = regEntry?.className;\n const condClasses: { classes: string; ref: string; negate: boolean }[] = [];\n while (this.peek()?.type === 'CLASS_BLOCK') {\n const cls = this.consume('CLASS_BLOCK').value as string;\n // Optional trailing condition `?@ref` / `?!@ref`: these classes apply only\n // when the ref is truthy / falsy. A CONDITIONAL block may use literal\n // classes — it expresses a state-driven visual (e.g. a pop-up's scale/\n // opacity), which belongs in the .idml, not a method.\n if (this.peek()?.type === 'QUESTION') {\n this.consume('QUESTION');\n let negate = false;\n if (this.peek()?.type === 'BANG') { this.consume('BANG'); negate = true; }\n const ref = this.consume('VALUE_REF').value as string;\n condClasses.push({ classes: cls, ref, negate });\n continue;\n }\n // Unconditional use-site block: only `@method` bindings (no literals).\n for (const tok of cls.split(/\\s+/).filter(Boolean)) {\n if (!tok.startsWith('@')) {\n throw new Error(\n `[idml] literal class \"${tok}\" is not allowed at a use site; ` +\n `declare a styled variant (Name:BaseType) instead`\n );\n }\n }\n className = className ? `${className} ${cls}` : cls;\n }\n\n const style = { ...baseStyle };\n\n // Split the class string into static classes and `@method` references. The\n // refs are resolved per render (with the current row item) and appended to\n // className — so e.g. a role badge can colour itself from its row's role.\n const classRefs: string[] = [];\n if (className) {\n const statics: string[] = [];\n for (const tok of className.split(/\\s+/).filter(Boolean)) {\n if (tok.startsWith('@')) classRefs.push(tok.slice(1));\n else statics.push(tok);\n }\n className = statics.length ? statics.join(' ') : undefined;\n }\n\n this.consume('LBRACE');\n const children: ParsedItem[] = [...inlineChildren];\n while (this.peek()?.type !== 'RBRACE') {\n children.push(this.parseItem());\n }\n this.consume('RBRACE');\n\n return { name, args, height, width, anchor, children, style, className, classRefs, condClasses, hug, visibility };\n }\n\n private parseDimension(): DimValue {\n if (this.peek()?.type === 'IDENT' && this.peek()?.value === 'auto') {\n throw new Error(\n '[idml] the `auto` dimension is no longer supported; give an explicit ' +\n 'percentage (use a Spacer for any intentional empty space)'\n );\n }\n // `@ref` dimension — resolved per render to a percentage (reactive sizing).\n // `@ref ? A : B` resolves to A when the ref is truthy, else B (the two sizes\n // declared inline, e.g. `@state.collapsed ? 3.4vw : 13.5vw`).\n if (this.peek()?.type === 'VALUE_REF') {\n const ref = this.consume('VALUE_REF').value as string;\n if (this.peek()?.type === 'QUESTION') {\n this.consume('QUESTION');\n const whenTrue = this.parseDimLiteral();\n this.consume('COLON');\n const whenFalse = this.parseDimLiteral();\n return { ref, whenTrue, whenFalse };\n }\n return { ref };\n }\n return this.consume('NUMBER').value as number;\n }\n\n /** A literal dimension value inside a `@ref ? A : B`: a number (→ `%`) or a\n * number with a unit (`3.4vw`, `64px`). Returns the final CSS string. */\n private parseDimLiteral(): string {\n const n = this.consume('NUMBER').value as number;\n const next = this.peek();\n if (next?.type === 'IDENT' && ['vw', 'vh', 'px', 'rem', 'em'].includes(next.value as string)) {\n this.pos++;\n return `${n}${next.value}`;\n }\n return `${n}%`;\n }\n\n private parseArgList(): IdmlArg[] {\n const args: IdmlArg[] = [];\n args.push(this.parseArg());\n while (this.peek()?.type === 'COMMA') {\n this.pos++;\n if (this.peek()?.type === 'RPAREN') break;\n args.push(this.parseArg());\n }\n return args;\n }\n\n private parseArg(): IdmlArg {\n const t = this.peek();\n if (!t) throw new Error('[idml] Expected argument');\n if (t.type === 'STRING') { this.pos++; return t.value as string; }\n if (t.type === 'NUMBER') { this.pos++; return t.value as number; }\n // @method — reactive value binding (prop bound to the method's return value).\n if (t.type === 'VALUE_REF') { this.pos++; return `${VALUE_REF_PREFIX}${t.value}`; }\n // ~name — two-way model binding to a form-state cell.\n if (t.type === 'MODEL_REF') { this.pos++; return `${MODEL_REF_PREFIX}${t.value}`; }\n if (t.type === 'IDENT') {\n this.pos++;\n // Literal keywords. `null` is the explicit \"no handler / no value\" placeholder.\n if (t.value === 'null') return null;\n if (t.value === 'true') return true;\n if (t.value === 'false') return false;\n // Any other bare identifier = function reference (e.g. a Button onClick handler).\n return `${FN_REF_PREFIX}${t.value}`;\n }\n // A `{ ... }` argument is a children block — child items placed inside the\n // component (e.g. `Button(\"Save\", { Image(...) })`). Returned tagged so\n // parseItem can lift them into the item's children.\n if (t.type === 'LBRACE') {\n this.pos++; // consume '{'\n const childItems: ParsedItem[] = [];\n while (this.peek()?.type !== 'RBRACE') {\n childItems.push(this.parseItem());\n }\n this.consume('RBRACE');\n return { __idmlChildren: childItems };\n }\n throw new Error(`[idml] Unexpected token type ${t.type} as argument`);\n }\n}\n\n// ==================== CONVERTER ====================\n\nconst LAYOUT_ITEMS = new Set(['Row', 'Col']);\n\nconst ANCHOR_V: Record<string, string> = { top: 'flex-start', center: 'center', bottom: 'flex-end' };\nconst ANCHOR_H: Record<string, string> = { left: 'flex-start', center: 'center', right: 'flex-end' };\n\n/**\n * Map an anchor to absolute-position insets, used to place a child inside an\n * `Overlay` layer. The child keeps its dims (width/height %), so e.g.\n * `[10,10,bottom-right]` is a 10%×10% box pinned to the bottom-right corner with\n * the rest of the screen left empty.\n */\nfunction anchorToAbsoluteInsets(anchor: string): Record<string, string> {\n const parts = anchor.split('-');\n const v = parts.length === 1 ? parts[0] : (parts[0] ?? 'top');\n const h = parts.length === 1 ? parts[0] : (parts[1] ?? 'left');\n const css: Record<string, string> = {};\n if (v === 'bottom') css.bottom = '0';\n else if (v === 'center') css.top = '50%';\n else css.top = '0';\n if (h === 'right') css.right = '0';\n else if (h === 'center') css.left = '50%';\n else css.left = '0';\n if (v === 'center' || h === 'center') {\n css.transform = `translate(${h === 'center' ? '-50%' : '0'}, ${v === 'center' ? '-50%' : '0'})`;\n }\n return css;\n}\n\nfunction anchorToFlexProps(anchor: string, direction: 'row' | 'column') {\n const parts = anchor.split('-');\n if (parts.length === 1) {\n const val = (ANCHOR_V[parts[0]] ?? ANCHOR_H[parts[0]] ?? 'flex-start') as FlexDef['justifyContent'];\n return { justifyContent: val, alignItems: val as FlexDef['alignItems'] };\n }\n const [v = 'top', h = 'left'] = parts;\n const vVal = ANCHOR_V[v] ?? 'flex-start';\n const hVal = ANCHOR_H[h] ?? 'flex-start';\n if (direction === 'row') {\n return { justifyContent: hVal as FlexDef['justifyContent'], alignItems: vVal as FlexDef['alignItems'] };\n }\n return { justifyContent: vVal as FlexDef['justifyContent'], alignItems: hVal as FlexDef['alignItems'] };\n}\n\nfunction pct(n: number): PercentageString { return `${n}%` as PercentageString; }\n\nlet _idCounter = 0;\nfunction genId(prefix: string): string { return `${prefix}-${++_idCounter}`; }\n\ninterface ConvertCtx {\n components: ComponentDef[];\n defs: Map<string, ParsedItem[]>;\n /** Parameter names per definition (bound positionally to call args at expansion). */\n defParams: Map<string, string[]>;\n /** Call-site children to inject at a `Children` marker (set while expanding a definition). */\n slotChildren?: ParsedItem[];\n /** Definition names currently being expanded — guards against infinite recursion. */\n expanding: Set<string>;\n /** True for out-of-flow node types (Overlay/Modal/out-of-flow defs) — their\n * cells render with `display:contents` so they occupy no flow space. */\n isOutOfFlow: (name: string) => boolean;\n}\n\n/**\n * Deep-copy a definition body item, replacing any arg that references a bound\n * parameter with that parameter's value. Parameters appear in the body as bare\n * identifiers (handler refs) or `@`/`~` refs whose name matches a param; the\n * bound value is whatever the caller passed in that position (a literal, another\n * ref, etc.), so values also thread through nested definition calls.\n */\nfunction substituteParams(item: ParsedItem, bindings: Map<string, IdmlArg>): ParsedItem {\n if (bindings.size === 0) return item;\n const subArg = (a: IdmlArg): IdmlArg => {\n if (typeof a === 'string') {\n for (const prefix of [FN_REF_PREFIX, VALUE_REF_PREFIX, MODEL_REF_PREFIX]) {\n if (a.startsWith(prefix)) {\n const name = a.slice(prefix.length);\n return bindings.has(name) ? (bindings.get(name) as IdmlArg) : a;\n }\n }\n return a;\n }\n if (a && typeof a === 'object' && Array.isArray((a as { __idmlChildren?: ParsedItem[] }).__idmlChildren)) {\n return {\n __idmlChildren: (a as { __idmlChildren: ParsedItem[] }).__idmlChildren.map(c => substituteParams(c, bindings)),\n } as IdmlArg;\n }\n return a;\n };\n return {\n ...item,\n args: item.args.map(subArg),\n children: item.children.map(c => substituteParams(c, bindings)),\n };\n}\n\n// ==================== LAYOUT (TILING) VALIDATION ====================\n\n/**\n * Direction in which a node lays its children out, or `null` if the node is NOT\n * a space-tiling container. Only `Row`, `Col`, `Form` and definition calls tile\n * their children; everything else (`Overlay`, `Modal`, `Repeat`, `Table`, and\n * leaf components whose children are a slot) is exempt from the sum-to-100 rule.\n */\nfunction containerDirection(\n name: string,\n defs: Map<string, ParsedItem[]>\n): 'row' | 'column' | null {\n if (name === 'Row') return 'row';\n if (name === 'Col' || name === 'Form') return 'column';\n if (defs.has(name)) return 'column'; // a def call's slot children flow in a column\n return null;\n}\n\n/**\n * Enforce total tiling: a container's children must account for ALL of its space\n * with no implicit gaps. Along the main axis (height for a column, width for a\n * row) the children's percentages must sum to exactly 100; along the cross axis\n * each child must be exactly 100. Any intentional empty space must be an explicit\n * element (e.g. a Spacer) with a declared percentage.\n */\n/** Out-of-flow node types: portals / fixed layers. They don't occupy flow space,\n * so they neither count toward a parent's tiling sum nor must fill the cross axis. */\nconst OUT_OF_FLOW = new Set(['Overlay', 'Modal']);\n\n/**\n * A definition is itself out-of-flow when its body renders only out-of-flow\n * content (Overlay/Modal, or other out-of-flow definitions). This lets a shared\n * \"chrome\" widget — e.g. a feedback launcher that is just an Overlay + a Modal —\n * be called as a sibling without consuming any tiling space.\n */\nfunction defIsOutOfFlow(\n name: string,\n defs: Map<string, ParsedItem[]>,\n seen: Set<string> = new Set()\n): boolean {\n const body = defs.get(name);\n if (!body || seen.has(name)) return false;\n seen.add(name);\n return body.every(\n (c) => OUT_OF_FLOW.has(c.name) || (defs.has(c.name) && defIsOutOfFlow(c.name, defs, seen))\n );\n}\n\n/** Build the predicate that decides whether a node takes part in flow tiling. */\nfunction makeOutOfFlowPredicate(defs: Map<string, ParsedItem[]>): (name: string) => boolean {\n return (name: string) => OUT_OF_FLOW.has(name) || (defs.has(name) && defIsOutOfFlow(name, defs));\n}\n\nfunction validateTiling(\n children: ParsedItem[],\n direction: 'row' | 'column',\n where: string,\n isOutOfFlow: (name: string) => boolean,\n containerHug?: HugSpec\n): void {\n // Out-of-flow children (Overlay/Modal/out-of-flow defs) are positioned, not tiled.\n children = children.filter((c) => !isOutOfFlow(c.name));\n if (children.length === 0) return;\n const main = direction === 'row' ? 'width' : 'height';\n const cross = direction === 'row' ? 'height' : 'width';\n const mainKey = direction === 'row' ? 'w' : 'h';\n const crossKey = direction === 'row' ? 'h' : 'w';\n // Content-flow: when the container hugs the main axis, OR any child hugs the\n // main axis (is content-sized), the children PACK instead of tiling — so the\n // sum-to-100 rule is lifted (the leftover is explicit empty padding, exactly\n // as a hug element's unused tile space is). Strict tiling still applies to\n // every ordinary container.\n // A `@ref` (reactive) dim is resolved at render time, so its value can't be\n // summed statically — its presence on the main axis lifts the sum-to-100 rule\n // (just like hug), and on the cross axis it's exempt from the fill check. The\n // author guarantees the runtime values tile (e.g. sidebar + content widths).\n const packsMain =\n !!containerHug?.[mainKey] ||\n children.some((c) => c.hug?.[mainKey] || isDimRef(c[main]));\n let sum = 0;\n for (const c of children) {\n if (typeof c[main] === 'number') sum += c[main] as number;\n // A child that hugs the CROSS axis is content-sized there (≤100), and a\n // `@ref` cross dim is dynamic — both opt out of the fill-the-cross-axis rule.\n if (!c.hug?.[crossKey] && !isDimRef(c[cross]) && (c[cross] as number) !== 100) {\n throw new Error(\n `[idml] ${c.name} in ${where}: cross-axis ${cross} must be 100 ` +\n `(got ${c[cross]}); no vacant space is allowed`\n );\n }\n }\n if (!packsMain && sum !== 100) {\n throw new Error(\n `[idml] children of ${where} must tile to 100% along ${main}; got ${sum}. ` +\n `Add an explicit Spacer for any gap.`\n );\n }\n}\n\n/** Recursively validate tiling for a node's children, descending into all nodes. */\nfunction walkTiling(\n item: ParsedItem,\n defs: Map<string, ParsedItem[]>,\n isOutOfFlow: (name: string) => boolean\n): void {\n const dir = containerDirection(item.name, defs);\n if (dir) validateTiling(item.children, dir, `<${item.name}>`, isOutOfFlow, item.hug);\n for (const child of item.children) walkTiling(child, defs, isOutOfFlow);\n}\n\nfunction sizeOf(item: ParsedItem): SizeDef {\n const size: SizeDef = {};\n // Only static numeric dims become a fixed `%`; `@ref` dims are resolved at\n // render time (see dynSizeOf / LayoutRenderer).\n if (typeof item.height === 'number') size.height = pct(item.height);\n if (typeof item.width === 'number') size.width = pct(item.width);\n return size;\n}\n\n/** Collect the `@ref` (reactive) dimensions — resolved per render, not baked.\n * A conditional dim carries its two inline sizes (`whenTrue`/`whenFalse`). */\nfunction dynSizeOf(item: ParsedItem): DynamicSize | undefined {\n const dyn: DynamicSize = {};\n if (isDimRef(item.height)) dyn.height = dimRefToDynamic(item.height);\n if (isDimRef(item.width)) dyn.width = dimRefToDynamic(item.width);\n return dyn.width || dyn.height ? dyn : undefined;\n}\n\nfunction dimRefToDynamic(d: DimRef): DynamicDim {\n return d.whenTrue !== undefined\n ? { ref: d.ref, whenTrue: d.whenTrue, whenFalse: d.whenFalse }\n : { ref: d.ref };\n}\n\n/**\n * Inline styles that make a bound component hug its content on the requested\n * axes. `fit-content` shrinks the box to its content but never past the tile\n * (the tile is the available width/height); `nowrap` + `overflow:hidden` +\n * `text-overflow:ellipsis` truncate a too-long label with `…` instead of letting\n * it spill out of the tile. These are spread LAST into the component's style, so\n * they override the renderer's default `width/height:100%` fill.\n */\nfunction hugStyles(hug: HugSpec): Record<string, string> {\n const s: Record<string, string> = {};\n if (hug.w) {\n s.width = 'fit-content';\n s.maxWidth = '100%';\n s.minWidth = '0';\n s.overflow = 'hidden';\n s.textOverflow = 'ellipsis';\n s.whiteSpace = 'nowrap';\n }\n if (hug.h) {\n s.height = 'fit-content';\n s.maxHeight = '100%';\n }\n return s;\n}\n\n/**\n * Cell-level hug styles for a CONTAINER (Row/Col/Form): the cell shrinks to its\n * packed children on the hugged axis, capped at its tile. No overflow/ellipsis\n * (that would clip the children) — truncation is a leaf-text concern only.\n */\nfunction hugContainerStyles(hug: HugSpec): Record<string, string> {\n const s: Record<string, string> = {};\n // NB: no inline max-width/height cap. The cell shrinks to its content\n // (fit-content); a hard tile cap would override author `max-w-*` classes\n // (which the feedback launcher's hover text-reveal relies on), and the\n // surrounding flex layout already constrains the cell in practice.\n if (hug.w) s.width = 'fit-content';\n if (hug.h) s.height = 'fit-content';\n return s;\n}\n\n/** Node names that can't be hugged: they bind no component AND don't lay out\n * flow children whose packing `hug` could control. (`Table` IS huggable — it\n * expands to a Col of content-height rows, so `hug-h` gives a content-height\n * card with no dead space below the last row; handled in `expandTable`.) */\nconst HUG_INVALID_ON = new Set(['Overlay', 'Modal', 'Children']);\n\n/** Throw if `hug` is used where it has nothing to size (a portal/slot/table or\n * a definition call). Containers (Row/Col/Form) and components are fine. */\nfunction assertHuggable(item: ParsedItem, isDef: boolean): void {\n if (!item.hug) return;\n if (HUG_INVALID_ON.has(item.name) || isDef) {\n throw new Error(\n `[idml] \"${item.name}\" cannot use hug — nothing to content-size here. ` +\n `hug applies to components (e.g. Button/Text) and layout containers ` +\n `(Row/Col/Form), not definitions, slots, tables, or out-of-flow layers.`\n );\n }\n}\n\nfunction mkItem(\n name: string,\n args: IdmlArg[],\n height: DimValue,\n width: DimValue,\n anchor: string,\n children: ParsedItem[],\n style: Record<string, string> = {}\n): ParsedItem {\n return { name, args, height, width, anchor, children, style };\n}\n\n/**\n * Expand `Table(@data){ Column(\"H\"){ cell } ... }` into existing primitives: a\n * header Row of column labels, then a Repeat over `@data` whose template is a Row\n * of one cell per column. Cell templates use `@item.field` and resolve per row via\n * the Repeat's item scope. Each Column's `[h,w,anchor]` provides the column width\n * and cell alignment (height is auto so rows size to content).\n */\nfunction expandTable(item: ParsedItem, ctx: ConvertCtx): LayoutDef {\n const dataArg = item.args.find(\n (a): a is string => typeof a === 'string' && a.startsWith(VALUE_REF_PREFIX)\n );\n const columns = item.children.filter(c => c.name === 'Column');\n\n // Header: a tinted row of small, uppercase, muted column labels with generous\n // cell padding — the conventional data-table header look.\n const headerCells = columns.map(col => {\n // Font size is set in vw (not a px/rem `text-xs` class) so table headers\n // scale with the viewport like the rest of the text.\n const label = mkItem(\n 'Text', [String(col.args[0] ?? '')], 'auto', 100, col.anchor, [], { fontSize: '0.63vw' }\n );\n label.className = 'font-medium text-gray-500 uppercase tracking-wider';\n // Cell padding is vw (not px-6/py-3) so the table is zoom-invariant.\n const cell = mkItem('Col', [], 'auto', col.width, col.anchor, [label], {\n paddingLeft: '1.6vw', paddingRight: '1.6vw', paddingTop: '0.8vw', paddingBottom: '0.8vw',\n });\n return cell;\n });\n const headerRow = mkItem('Row', [], 'auto', 100, 'top-left', headerCells, {\n borderBottom: '0.07vw solid #e5e7eb',\n });\n headerRow.className = 'bg-gray-50';\n\n // Body cells carry the same horizontal padding and a comfortable vertical\n // rhythm; rows are separated by a light divider.\n const bodyCells = columns.map(col => {\n const cell = mkItem('Col', [], 'auto', col.width, col.anchor, col.children, {\n paddingLeft: '1.6vw', paddingRight: '1.6vw', paddingTop: '1vw', paddingBottom: '1vw',\n });\n cell.className = 'whitespace-nowrap';\n return cell;\n });\n const bodyRowTemplate = mkItem('Row', [], 'auto', 100, 'top-left', bodyCells, {\n borderBottom: '0.07vw solid #e5e7eb',\n });\n\n const repeat = mkItem('Repeat', dataArg ? [dataArg] : [], 'auto', 100, 'top-left', [bodyRowTemplate]);\n\n // `hug` content-sizes the card on the requested axis: an `auto` dim emits no\n // fixed size, so the Col shrinks to its rows (no dead white space below the\n // last row) instead of stretching to the declared tile height.\n const tableStyle = { ...item.style };\n if (item.hug?.w) tableStyle.width = 'fit-content';\n const tableCol = mkItem(\n 'Col', [],\n item.hug?.h ? 'auto' : item.height,\n item.hug?.w ? 'auto' : item.width,\n item.anchor, [headerRow, repeat], tableStyle\n );\n tableCol.className = item.className;\n return convertItem(tableCol, ctx);\n}\n\n/** Convert a parsed item, attaching its `?@ref` visibility condition (if any) to\n * the resulting cell. The heavy lifting is in `convertNode`. */\nfunction convertItem(item: ParsedItem, ctx: ConvertCtx): LayoutDef {\n const def = convertNode(item, ctx);\n if (item.visibility) def.visibility = item.visibility;\n const dyn = dynSizeOf(item);\n if (dyn) def.dynamicSize = dyn;\n // Dynamic `@class` refs / conditional class blocks on a CONTAINER (no bound\n // component) are resolved by the LayoutRenderer; a component's `@class` refs\n // are already wired as className value-bindings.\n if (item.classRefs?.length && !def.componentId) def.classRefs = item.classRefs;\n if (item.condClasses?.length) def.condClasses = item.condClasses;\n return def;\n}\n\nfunction convertNode(item: ParsedItem, ctx: ConvertCtx): LayoutDef {\n assertHuggable(item, ctx.defs.has(item.name));\n const size = sizeOf(item);\n const idmlStyle = Object.keys(item.style).length ? item.style : undefined;\n const colAnchor = anchorToFlexProps(item.anchor, 'column');\n // Out-of-flow nodes (Modal / out-of-flow defs) render with `display:contents`\n // so their wrapper cell occupies NO flow space (their real content is a portal\n // or fixed layer). This means authors don't have to fake a 0 height for them.\n // (Overlay has its own branch below; its layer is already position:fixed.)\n const outOfFlow = ctx.isOutOfFlow(item.name);\n const cellStyle = outOfFlow ? { ...(idmlStyle ?? {}), display: 'contents' } : idmlStyle;\n\n // `Children` slot marker — replaced by the enclosing definition's call children.\n if (item.name === 'Children') {\n const slot = ctx.slotChildren ?? [];\n // Slot content is real page content: convert it without an active slot context.\n const childCtx: ConvertCtx = { ...ctx, slotChildren: undefined };\n return {\n type: 'flex',\n direction: 'column',\n ...colAnchor,\n size,\n children: slot.map(child => convertItem(child, childCtx)),\n idmlStyle,\n };\n }\n\n // Reusable component definition — expand its body, injecting this call's\n // children at any `Children` marker inside it.\n const defBody = ctx.defs.get(item.name);\n if (defBody && !ctx.expanding.has(item.name)) {\n // Bind the definition's parameters to this call's positional args, then\n // substitute references in the body (missing args bind to '' so they render\n // empty rather than leaking the param name).\n const params = ctx.defParams.get(item.name) ?? [];\n const bindings = new Map<string, IdmlArg>();\n params.forEach((p, i) => bindings.set(p, item.args[i] ?? ''));\n const body = bindings.size ? defBody.map(t => substituteParams(t, bindings)) : defBody;\n\n const innerCtx: ConvertCtx = {\n ...ctx,\n slotChildren: item.children,\n expanding: new Set(ctx.expanding).add(item.name),\n };\n return {\n type: 'flex',\n direction: 'column',\n ...colAnchor,\n size,\n children: body.map(t => convertItem(t, innerCtx)),\n idmlStyle: cellStyle,\n };\n }\n\n // Overlay — a full-viewport, click-through layer. Each child is absolutely\n // positioned by its own anchor + dims, so it occupies exactly that box at that\n // corner and the rest of the screen stays empty and interactive (the layer\n // itself is pointer-events:none; children opt back in). No fixed/pixel classes\n // needed — placement comes entirely from dims + anchor.\n if (item.name === 'Overlay') {\n const children = item.children.map(child => {\n const layout = convertItem(child, ctx);\n // An Overlay child is positioned (not tiled), so `hug` may shrink it to\n // content on the hugged axis — its declared dim becomes the MAX bound\n // (so a docked panel grows from its corner to fit content, no dead space).\n const hugStyle: Record<string, string> = {};\n if (child.hug?.w) {\n hugStyle.width = 'fit-content';\n if (layout.size?.width) hugStyle.maxWidth = layout.size.width;\n }\n if (child.hug?.h) {\n hugStyle.height = 'fit-content';\n if (layout.size?.height) hugStyle.maxHeight = layout.size.height;\n }\n return {\n ...layout,\n idmlStyle: {\n ...(layout.idmlStyle ?? {}),\n position: 'absolute',\n pointerEvents: 'auto',\n ...anchorToAbsoluteInsets(child.anchor),\n ...hugStyle,\n },\n } as LayoutDef;\n });\n return {\n type: 'flex',\n direction: 'column',\n size: { width: '100%', height: '100%' },\n children,\n idmlStyle: {\n position: 'fixed',\n top: '0',\n left: '0',\n right: '0',\n bottom: '0',\n pointerEvents: 'none',\n outline: 'none',\n zIndex: '50',\n ...(idmlStyle ?? {}),\n },\n ...(item.className ? { className: item.className } : {}),\n };\n }\n\n // Table sugar — expands to a header row + a Repeat of row templates.\n if (item.name === 'Table') {\n return expandTable(item, ctx);\n }\n\n // Layout primitives (Row/Col).\n if (LAYOUT_ITEMS.has(item.name)) {\n const direction = item.name === 'Row' ? 'row' : 'column';\n const { justifyContent, alignItems } = anchorToFlexProps(item.anchor, direction);\n const children = item.children.map(child => convertItem(child, ctx));\n // Content-flow: a container hugged on its MAIN axis lays its children out by\n // content (they pack) instead of tiling. The container keeps its own size;\n // each child's main-axis size is dropped so it shrinks to content, and the\n // anchor's justify-content packs them, leaving the rest as explicit empty\n // space. (Cross-axis hug, if any, just content-sizes the cell itself.)\n const mainHug = direction === 'column' ? item.hug?.h : item.hug?.w;\n if (mainHug) {\n for (const ch of children) {\n if (!ch.size) continue;\n if (direction === 'column') delete ch.size.height;\n else delete ch.size.width;\n }\n }\n const crossHug = direction === 'column' ? item.hug?.w : item.hug?.h;\n const containerStyle = crossHug\n ? { ...(idmlStyle ?? {}), ...hugContainerStyles({ w: direction === 'column', h: direction === 'row' }) }\n : idmlStyle;\n return {\n type: 'flex',\n direction,\n justifyContent,\n alignItems,\n size,\n children,\n idmlStyle: containerStyle,\n ...(item.className ? { className: item.className } : {}),\n };\n }\n\n // Select sugar — `Select(~role){ Option(\"Admin\") … }`. The <option> elements\n // must be direct DOM children of <select>, but every layout child is wrapped in\n // a layout <div>, which is invalid inside a <select>. So lift Option children\n // into an `options: [{value,label}]` prop (the Select builtin renders that) and\n // emit no layout children.\n if (item.name === 'Select' && item.children.some(c => c.name === 'Option')) {\n const id = genId('select');\n const options = item.children\n .filter(c => c.name === 'Option')\n .map(c => ({ value: c.args[0] ?? '', label: c.args[1] ?? c.args[0] ?? '' }));\n const def = buildComponentDef(item, id);\n def.props = { ...def.props, options };\n ctx.components.push(def);\n return { type: 'flex', direction: 'column', ...colAnchor, size, children: [], componentId: id };\n }\n\n // Component (builtin / registered / custom). Children stay as layout nodes on\n // the bound cell; the LayoutRenderer threads them into the component as its\n // slot so containers (Card, Table, imported components) render their content.\n // slotChildren is passed through so a `Children` marker nested inside a\n // definition's component still resolves.\n const id = genId(item.name.toLowerCase());\n ctx.components.push(buildComponentDef(item, id));\n const children = item.children.map(child => convertItem(child, ctx));\n // A hugged component shrinks to its content; make its CELL content-width/height\n // too. Otherwise the cell keeps the dim's `width:100%`, which collapses to 0\n // inside a fit-content parent (e.g. the feedback launcher's hover label) and\n // is what makes a hug pill content-sized within a definite-width column.\n const hugCell: Record<string, string> = {};\n if (item.hug?.w) {\n hugCell.width = 'fit-content';\n if (typeof item.width === 'number') hugCell.maxWidth = `${item.width}%`;\n }\n if (item.hug?.h) {\n hugCell.height = 'fit-content';\n if (typeof item.height === 'number') hugCell.maxHeight = `${item.height}%`;\n }\n const cellIdml = outOfFlow\n ? { ...(cellStyle ?? {}), ...hugCell }\n : Object.keys(hugCell).length\n ? hugCell\n : undefined;\n return {\n type: 'flex', direction: 'column', ...colAnchor, size, children, componentId: id,\n ...(cellIdml ? { idmlStyle: cellIdml } : {}),\n };\n}\n\n/**\n * Derive CSS alignment properties from the item's anchor so that content\n * centres (or aligns) correctly within the component element itself.\n * Text components use textAlign; Button uses flex centering.\n */\nfunction anchorToComponentStyle(anchor: string, componentType: string): Record<string, string> {\n const parts = anchor.split('-');\n const h = parts.length === 1 ? parts[0] : parts[1] ?? parts[0];\n const v = parts.length === 1 ? parts[0] : parts[0];\n\n const css: Record<string, string> = {};\n\n if (componentType === 'Text' || componentType === 'Heading') {\n if (h === 'center') css.textAlign = 'center';\n else if (h === 'right') css.textAlign = 'right';\n }\n\n if (componentType === 'Button') {\n css.display = 'flex';\n css.justifyContent = h === 'center' ? 'center' : h === 'right' ? 'flex-end' : 'flex-start';\n css.alignItems = v === 'center' ? 'center' : v === 'bottom' ? 'flex-end' : 'flex-start';\n }\n\n return css;\n}\n\nfunction buildComponentDef(item: ParsedItem, id: string): ComponentDef {\n const anchorStyle = anchorToComponentStyle(item.anchor, item.name);\n // hug styles win over anchor defaults and variant styles so the component\n // actually shrinks to content (overriding the renderer's default fill).\n const hug = item.hug ? hugStyles(item.hug) : {};\n const merged = { ...anchorStyle, ...item.style, ...hug };\n const idmlStyle = Object.keys(merged).length ? merged : undefined;\n\n // Classify call args. `@x` -> reactive value binding; a bare identifier -> a\n // handler (onClick); a \"/...\" string -> a route href; everything else (strings,\n // numbers, booleans, null) is a positional literal.\n const valueRefs: string[] = [];\n const modelRefs: string[] = [];\n const handlerRefs: string[] = [];\n const literals: IdmlArg[] = [];\n for (const a of item.args) {\n if (typeof a === 'string' && a.startsWith(VALUE_REF_PREFIX)) valueRefs.push(a.slice(VALUE_REF_PREFIX.length));\n else if (typeof a === 'string' && a.startsWith(MODEL_REF_PREFIX)) modelRefs.push(a.slice(MODEL_REF_PREFIX.length));\n else if (typeof a === 'string' && a.startsWith(FN_REF_PREFIX)) handlerRefs.push(a.slice(FN_REF_PREFIX.length));\n else literals.push(a);\n }\n\n // The prop a leading `@value` / `~model` binds to, per component. Bound props are\n // applied after literal props in the renderer, so they win when both are present.\n const primaryProp = PRIMARY_PROP[item.name] ?? 'value';\n const bindings: DataBindingDef[] = [\n ...valueRefs.map(methodId => ({ prop: primaryProp, methodId, kind: 'value' as const })),\n ...modelRefs.map(methodId => ({ prop: primaryProp, methodId, kind: 'model' as const })),\n ...handlerRefs.map(methodId => ({ prop: 'onClick', methodId })),\n // Dynamic classes (`@method` tokens in a class block) resolve to strings that\n // are appended to className per render.\n ...(item.classRefs ?? []).map(methodId => ({ prop: 'className', methodId, kind: 'value' as const })),\n ];\n const withBindings = (def: ComponentDef): ComponentDef => {\n const withB = bindings.length ? { ...def, bindings } : def;\n return item.className ? { ...withB, className: item.className } : withB;\n };\n\n const [first, second] = literals;\n\n switch (item.name) {\n case 'Text':\n return withBindings({ id, type: 'Text', props: { text: String(first ?? '') }, idmlStyle });\n\n case 'Heading':\n return withBindings({\n id,\n type: 'Heading',\n props: { text: String(first ?? ''), level: typeof second === 'number' ? second : 1 },\n idmlStyle,\n });\n\n case 'Button': {\n // For a Button, a \"/...\" literal is a route href; the first non-route\n // literal is the label.\n const route = literals.find(a => typeof a === 'string' && a.startsWith('/')) as string | undefined;\n const label = literals.find(a => typeof a === 'string' && !a.startsWith('/'));\n const props: Record<string, unknown> = { text: String(label ?? '') };\n if (route) props.href = route;\n return withBindings({ id, type: 'Button', props, idmlStyle });\n }\n\n case 'Image':\n return withBindings({ id, type: 'Image', props: { src: String(first ?? ''), alt: String(second ?? '') }, idmlStyle });\n\n case 'Label':\n return withBindings({ id, type: 'Label', props: { text: String(first ?? '') }, idmlStyle });\n\n case 'Icon': {\n // `Icon(\"House\")` → name only; `Icon(\"House\", 24)` → name + size;\n // `Icon(\"ChatCenteredDots\", 24, \"white\")` → + colour (a numeric arg is the\n // size, a string arg the colour). Name may also be bound dynamically via\n // `@method` (PRIMARY_PROP.Icon = 'name'), e.g. a dark-mode toggle swapping\n // MoonStars/SunDim.\n const props: Record<string, unknown> = { name: String(first ?? '') };\n for (const rest of literals.slice(1)) {\n if (typeof rest === 'number') props.size = rest;\n else if (typeof rest === 'string') props.color = rest;\n }\n return withBindings({ id, type: 'Icon', props, idmlStyle });\n }\n\n case 'Option': {\n // `Option(\"Admin\")` → value & label both \"Admin\"; `Option(\"admin\", \"Administrator\")`\n // → value \"admin\", label \"Administrator\".\n const value = first ?? '';\n const label = second ?? first ?? '';\n return withBindings({ id, type: 'Option', props: { value, label }, idmlStyle });\n }\n\n case 'Input':\n case 'Textarea':\n // `Input(~model, \"Placeholder text\")` — the `~model` binds the value; the\n // first string literal is the placeholder (its text is content → .idml).\n return withBindings({\n id,\n type: item.name,\n props: first != null ? { placeholder: String(first) } : {},\n idmlStyle,\n });\n\n default:\n return withBindings({\n id,\n type: item.name,\n props: Object.fromEntries(literals.map((v, i) => [`arg${i}`, v])),\n idmlStyle,\n });\n }\n}\n\n// The prop that a leading `@value` reference binds to, per component type.\nconst PRIMARY_PROP: Record<string, string> = {\n Text: 'text',\n Heading: 'text',\n Button: 'text',\n Image: 'src',\n Input: 'value',\n Textarea: 'value',\n Select: 'value',\n Checkbox: 'checked',\n Table: 'data',\n Repeat: 'data',\n Modal: 'open',\n Icon: 'name',\n};\n\nconst DEFAULT_TOKENS: UIConfig['tokens'] = {\n colors: [\n { name: 'primary', value: '#1a56db', darkValue: '#60a5fa' },\n { name: 'surface', value: '#ffffff', darkValue: '#1e1e2e' },\n { name: 'on-surface', value: '#111827', darkValue: '#f9fafb' },\n { name: 'danger', value: '#dc2626', darkValue: '#f87171' },\n ],\n typography: [\n { name: 'heading-xl', fontSize: '2.25rem', fontWeight: 700, lineHeight: '1.25' },\n { name: 'body-md', fontSize: '1rem', fontWeight: 400, lineHeight: '1.6' },\n { name: 'label-sm', fontSize: '0.75rem', fontWeight: 500, lineHeight: '1.4' },\n ],\n spacing: [\n { name: 'gap-sm', value: '0.5rem' },\n { name: 'gap-md', value: '1rem' },\n { name: 'gap-lg', value: '2rem' },\n ],\n};\n\nexport interface ParseOptions {\n /**\n * Called when an `import \"./file.idml\"` line is encountered.\n * Should return the raw source of the imported file.\n */\n resolve?: (path: string) => string;\n}\n\nexport function parseIdml(source: string, options?: ParseOptions): UIConfig {\n _idCounter = 0;\n const parser = new IdmlParser(tokenize(source));\n const parsedPages = parser.parseFile(options?.resolve);\n\n // Total-tiling validation: every page (a column root) and every definition\n // body (also a column) must tile to 100%, as must every nested Row/Col/Form.\n const isOutOfFlow = makeOutOfFlowPredicate(parser.defRegistry);\n for (const { route, items } of parsedPages) {\n validateTiling(items, 'column', `page ${route}`, isOutOfFlow);\n items.forEach((it) => walkTiling(it, parser.defRegistry, isOutOfFlow));\n }\n for (const [name, body] of parser.defRegistry) {\n validateTiling(body, 'column', `define ${name}`, isOutOfFlow);\n body.forEach((it) => walkTiling(it, parser.defRegistry, isOutOfFlow));\n }\n\n const pages = parsedPages.map(({ route, scroll, items }) => {\n const components: ComponentDef[] = [];\n const ctx: ConvertCtx = {\n components,\n defs: parser.defRegistry,\n defParams: parser.defParamRegistry,\n expanding: new Set(),\n isOutOfFlow,\n };\n const layoutChildren = items.map(item => convertItem(item, ctx));\n const rootLayout: FlexDef = {\n type: 'flex',\n direction: 'column',\n size: { width: '100%', height: '100%' },\n children: layoutChildren,\n ...(scroll ? { idmlStyle: { overflowY: 'auto' } } : {}),\n };\n return { route, layout: rootLayout, components };\n });\n\n return { version: '1', tokens: DEFAULT_TOKENS, pages };\n}\n"],"mappings":"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","names":["z","z","z","z","z","z","z","z","registry","registry","React","React","React","createContext","createContext","useCallback","useContext","useState","jsx","React","jsx","React","jsx","React","jsx","useEffect","useState","useState","useCallback","useEffect","useCallback","useCallback","useState","jsx","useEffect","jsx","jsxs","useState","jsx","jsxs","jsx","jsxs","useState","useEffect","children","id"]}