@glyphjs/runtime 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/plugins/validate.ts","../src/plugins/registry.ts","../src/theme/light.ts","../src/theme/dark.ts","../src/theme/resolve.ts","../src/theme/context.tsx","../src/context.tsx","../src/ErrorBoundary.tsx","../src/FallbackRenderer.tsx","../src/navigation/useNavigation.ts","../src/renderers/InlineRenderer.tsx","../src/renderers/GlyphHeading.tsx","../src/renderers/GlyphParagraph.tsx","../src/renderers/GlyphList.tsx","../src/renderers/GlyphCodeBlock.tsx","../src/renderers/GlyphBlockquote.tsx","../src/renderers/GlyphImage.tsx","../src/renderers/GlyphThematicBreak.tsx","../src/renderers/GlyphRawHtml.tsx","../src/renderers/index.ts","../src/plugins/resolve-props.ts","../src/animation/AnimationProvider.tsx","../src/animation/useBlockAnimation.ts","../src/navigation/ReferenceIndicator.tsx","../src/BlockRenderer.tsx","../src/layout/LayoutProvider.tsx","../src/layout/DocumentLayout.tsx","../src/layout/DashboardLayout.tsx","../src/layout/PresentationLayout.tsx","../src/diagnostics/DiagnosticsOverlay.tsx","../src/diagnostics/BlockDiagnosticIndicator.tsx","../src/container/ContainerMeasure.tsx","../src/container/breakpoints.ts","../src/GlyphDocument.tsx","../src/create-runtime.tsx","../src/ssr/useIsClient.ts","../src/ssr/SSRPlaceholder.tsx"],"names":["createContext","useMemo","jsx","useContext","Component","jsxs","useRef","useCallback","Fragment","DOMPurify","useState","useEffect","componentSchemas","containerStyle","severityColors","severityBackgrounds","severityIcons","formatPosition"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { GlyphComponentDefinition } from '@glyphjs/types';\n\n// ─── Validation Result ───────────────────────────────────────\n\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\n// ─── Pattern for ui:* type ───────────────────────────────────\n\nconst UI_TYPE_PATTERN = /^ui:.+$/;\n\n/**\n * Validates a GlyphComponentDefinition before registration.\n *\n * Checks:\n * 1. `type` must match the `ui:${string}` format\n * 2. `schema` must be present with `parse` and `safeParse` methods\n * 3. `render` must be present and be a function or class\n *\n * @param definition - The component definition to validate.\n * @returns A ValidationResult with `valid` (boolean) and `errors` (string[]).\n */\nexport function validateComponentDefinition(\n definition: GlyphComponentDefinition,\n): ValidationResult {\n const errors: string[] = [];\n\n // 1. Validate type field\n if (!definition.type) {\n errors.push('Component definition must have a \"type\" field.');\n } else if (!UI_TYPE_PATTERN.test(definition.type)) {\n errors.push(\n `Component type \"${definition.type}\" must match the \"ui:*\" format (e.g. \"ui:chart\", \"ui:graph\").`,\n );\n }\n\n // 2. Validate schema field\n if (!definition.schema) {\n errors.push('Component definition must have a \"schema\" field.');\n } else {\n if (typeof definition.schema.parse !== 'function') {\n errors.push(\n 'Component schema must have a \"parse\" method (expected a Zod-compatible schema).',\n );\n }\n if (typeof definition.schema.safeParse !== 'function') {\n errors.push(\n 'Component schema must have a \"safeParse\" method (expected a Zod-compatible schema).',\n );\n }\n }\n\n // 3. Validate render field\n if (!definition.render) {\n errors.push(\n 'Component definition must have a \"render\" field (function or class component).',\n );\n } else if (\n typeof definition.render !== 'function'\n ) {\n errors.push(\n 'Component \"render\" must be a function (functional component) or a class (class component).',\n );\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n","import type {\n GlyphComponentDefinition,\n BlockProps,\n ComponentType,\n GlyphTheme,\n} from '@glyphjs/types';\nimport { validateComponentDefinition } from './validate.js';\n\n/**\n * Listener function invoked when the registry changes.\n */\nexport type RegistryChangeListener = () => void;\n\n/**\n * Enhanced plugin registry that adds validation, theme defaults\n * merging, and change notification on top of the base ComponentRegistry.\n *\n * This class replaces the original `ComponentRegistry` with a\n * superset of its API so existing consumers continue to work.\n */\nexport class PluginRegistry {\n private components = new Map<string, GlyphComponentDefinition>();\n private overrides = new Map<string, ComponentType<BlockProps>>();\n private listeners = new Set<RegistryChangeListener>();\n private themeDefaults: Record<string, string> = {};\n\n // ─── Registration ────────────────────────────────────────────\n\n /**\n * Register a `ui:*` component plugin definition.\n * Validates the definition first; throws if invalid.\n * Merges any `themeDefaults` from the definition into\n * the accumulated theme defaults map.\n *\n * @param definition - The component definition to register.\n * @throws Error if the definition fails validation.\n */\n registerComponent(definition: GlyphComponentDefinition): void {\n const result = validateComponentDefinition(definition);\n if (!result.valid) {\n throw new Error(\n `Invalid component definition for \"${definition.type}\":\\n - ${result.errors.join('\\n - ')}`,\n );\n }\n\n this.components.set(definition.type, definition);\n\n // Merge theme defaults\n if (definition.themeDefaults) {\n Object.assign(this.themeDefaults, definition.themeDefaults);\n }\n\n this.notify();\n }\n\n /** Bulk-register an array of component definitions. */\n registerAll(definitions: GlyphComponentDefinition[]): void {\n for (const def of definitions) {\n this.registerComponent(def);\n }\n }\n\n // ─── Overrides ───────────────────────────────────────────────\n\n /** Set override renderers (keyed by block type). */\n setOverrides(\n overrides: Partial<Record<string, ComponentType<BlockProps>>>,\n ): void {\n for (const [type, renderer] of Object.entries(overrides)) {\n if (renderer) {\n this.overrides.set(type, renderer);\n }\n }\n this.notify();\n }\n\n // ─── Lookups ─────────────────────────────────────────────────\n\n /** Get a registered `ui:*` component definition. */\n getRenderer(blockType: string): GlyphComponentDefinition | undefined {\n return this.components.get(blockType);\n }\n\n /** Get an override renderer for any block type. */\n getOverride(blockType: string): ComponentType<BlockProps> | undefined {\n return this.overrides.get(blockType);\n }\n\n /** Check if a component type is registered. */\n has(blockType: string): boolean {\n return this.components.has(blockType);\n }\n\n /** Get all registered component type names. */\n getRegisteredTypes(): string[] {\n return Array.from(this.components.keys());\n }\n\n // ─── Theme Defaults ──────────────────────────────────────────\n\n /**\n * Returns the accumulated theme defaults from all registered\n * component definitions. These can be merged into a GlyphTheme\n * to provide sensible defaults for plugin-specific variables.\n */\n getThemeDefaults(): Record<string, string> {\n return { ...this.themeDefaults };\n }\n\n /**\n * Merge accumulated plugin theme defaults into a GlyphTheme.\n * Plugin defaults have lower priority than existing theme variables.\n *\n * @param theme - The base theme to merge defaults into.\n * @returns A new GlyphTheme with plugin defaults applied under existing variables.\n */\n mergeThemeDefaults(theme: GlyphTheme): GlyphTheme {\n return {\n ...theme,\n variables: {\n ...this.themeDefaults,\n ...theme.variables,\n },\n };\n }\n\n // ─── Change Notification ─────────────────────────────────────\n\n /**\n * Subscribe to registry changes.\n *\n * @param listener - Callback invoked whenever a component or override is registered.\n * @returns An unsubscribe function that removes the listener.\n */\n subscribe(listener: RegistryChangeListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private notify(): void {\n for (const listener of this.listeners) {\n listener();\n }\n }\n}\n","import type { GlyphTheme } from '@glyphjs/types';\n\n/**\n * Built-in light theme.\n *\n * Provides all `--glyph-*` CSS variables with values suitable for\n * light backgrounds and dark text. Palette inspired by the Oblivion\n * neon-on-dark design language — cool off-whites, teal accents,\n * generous radii.\n */\nexport const lightTheme: GlyphTheme = {\n name: 'light',\n variables: {\n // Colors\n '--glyph-bg': '#f4f6fa',\n '--glyph-text': '#1a2035',\n '--glyph-text-muted': '#6b7a94',\n '--glyph-heading': '#0a0e1a',\n '--glyph-link': '#0a9d7c',\n '--glyph-link-hover': '#088a6c',\n '--glyph-border': '#d0d8e4',\n '--glyph-border-strong': '#a8b5c8',\n '--glyph-surface': '#e8ecf3',\n '--glyph-surface-raised': '#f4f6fa',\n\n // Accent\n '--glyph-accent': '#0a9d7c',\n '--glyph-accent-hover': '#088a6c',\n '--glyph-accent-subtle': '#e6f6f2',\n '--glyph-accent-muted': '#b0ddd0',\n\n // Code\n '--glyph-code-bg': '#e8ecf3',\n '--glyph-code-text': '#1a2035',\n\n // Blockquote\n '--glyph-blockquote-border': '#0a9d7c',\n '--glyph-blockquote-bg': '#e6f6f2',\n\n // Grid / Tooltip\n '--glyph-grid': '#d0d8e4',\n '--glyph-tooltip-bg': 'rgba(10, 14, 26, 0.9)',\n '--glyph-tooltip-text': '#f4f6fa',\n\n // Callouts\n '--glyph-callout-info-bg': '#e6f2fa',\n '--glyph-callout-info-border': '#38bdf8',\n '--glyph-callout-warning-bg': '#fef3e2',\n '--glyph-callout-warning-border': '#fb923c',\n '--glyph-callout-error-bg': '#fde8e8',\n '--glyph-callout-error-border': '#f87171',\n '--glyph-callout-tip-bg': '#e6f6f0',\n '--glyph-callout-tip-border': '#22c55e',\n\n // Spacing\n '--glyph-spacing-xs': '0.25rem',\n '--glyph-spacing-sm': '0.5rem',\n '--glyph-spacing-md': '1rem',\n '--glyph-spacing-lg': '1.5rem',\n '--glyph-spacing-xl': '2rem',\n\n // Typography\n '--glyph-font-body': '\"Inter\", \"Helvetica Neue\", system-ui, sans-serif',\n '--glyph-font-heading': '\"Inter\", \"Helvetica Neue\", system-ui, sans-serif',\n '--glyph-font-mono': 'ui-monospace, \"Cascadia Code\", \"Fira Code\", monospace',\n\n // Border radius\n '--glyph-radius-sm': '0.375rem',\n '--glyph-radius-md': '0.5rem',\n '--glyph-radius-lg': '0.75rem',\n\n // Effects\n '--glyph-shadow-sm': '0 1px 3px rgba(0,0,0,0.1)',\n '--glyph-shadow-md': '0 4px 12px rgba(0,0,0,0.15)',\n '--glyph-shadow-lg': '0 8px 30px rgba(0,0,0,0.2)',\n '--glyph-shadow-glow': 'none',\n '--glyph-text-shadow': 'none',\n '--glyph-backdrop': 'none',\n '--glyph-gradient-accent': 'linear-gradient(135deg, #0a9d7c, #22c55e)',\n '--glyph-transition': '0.2s ease',\n '--glyph-opacity-muted': '0.7',\n '--glyph-opacity-disabled': '0.4',\n '--glyph-focus-ring': '0 0 0 2px #0a9d7c',\n\n // SVG / Data Visualization\n '--glyph-node-fill-opacity': '0.85',\n '--glyph-node-radius': '3',\n '--glyph-node-stroke-width': '1.5',\n '--glyph-node-label-color': '#fff',\n '--glyph-edge-color': '#a8b5c8',\n '--glyph-icon-stroke': '#fff',\n '--glyph-icon-stroke-width': '1.5',\n },\n};\n","import type { GlyphTheme } from '@glyphjs/types';\n\n/**\n * Built-in dark theme.\n *\n * Provides all `--glyph-*` CSS variables with values suitable for\n * dark backgrounds and light text. Palette inspired by the Oblivion\n * neon-on-dark design language — deep navy blacks, neon cyan-green\n * accents, generous radii.\n */\nexport const darkTheme: GlyphTheme = {\n name: 'dark',\n variables: {\n // Colors\n '--glyph-bg': '#0a0e1a',\n '--glyph-text': '#d4dae3',\n '--glyph-text-muted': '#6b7a94',\n '--glyph-heading': '#edf0f5',\n '--glyph-link': '#00d4aa',\n '--glyph-link-hover': '#33e0be',\n '--glyph-border': '#1a2035',\n '--glyph-border-strong': '#2a3550',\n '--glyph-surface': '#0f1526',\n '--glyph-surface-raised': '#162038',\n\n // Accent\n '--glyph-accent': '#00d4aa',\n '--glyph-accent-hover': '#33e0be',\n '--glyph-accent-subtle': '#0a1a1a',\n '--glyph-accent-muted': '#1a4a3a',\n\n // Code\n '--glyph-code-bg': '#0f1526',\n '--glyph-code-text': '#d4dae3',\n\n // Blockquote\n '--glyph-blockquote-border': '#00d4aa',\n '--glyph-blockquote-bg': '#0a1a1a',\n\n // Grid / Tooltip\n '--glyph-grid': '#1a2035',\n '--glyph-tooltip-bg': 'rgba(0, 0, 0, 0.9)',\n '--glyph-tooltip-text': '#d4dae3',\n\n // Callouts\n '--glyph-callout-info-bg': '#0a1526',\n '--glyph-callout-info-border': '#38bdf8',\n '--glyph-callout-warning-bg': '#1a1608',\n '--glyph-callout-warning-border': '#fb923c',\n '--glyph-callout-error-bg': '#1f0e0e',\n '--glyph-callout-error-border': '#f87171',\n '--glyph-callout-tip-bg': '#0a1a14',\n '--glyph-callout-tip-border': '#22c55e',\n\n // Spacing (same as light — spacing is mode-independent)\n '--glyph-spacing-xs': '0.25rem',\n '--glyph-spacing-sm': '0.5rem',\n '--glyph-spacing-md': '1rem',\n '--glyph-spacing-lg': '1.5rem',\n '--glyph-spacing-xl': '2rem',\n\n // Typography (same as light — font stacks are mode-independent)\n '--glyph-font-body': '\"Inter\", \"Helvetica Neue\", system-ui, sans-serif',\n '--glyph-font-heading': '\"Inter\", \"Helvetica Neue\", system-ui, sans-serif',\n '--glyph-font-mono': 'ui-monospace, \"Cascadia Code\", \"Fira Code\", monospace',\n\n // Border radius\n '--glyph-radius-sm': '0.375rem',\n '--glyph-radius-md': '0.5rem',\n '--glyph-radius-lg': '0.75rem',\n\n // Effects\n '--glyph-shadow-sm': '0 1px 3px rgba(0,0,0,0.4)',\n '--glyph-shadow-md': '0 4px 12px rgba(0,0,0,0.5)',\n '--glyph-shadow-lg': '0 8px 30px rgba(0,0,0,0.6)',\n '--glyph-shadow-glow': '0 0 15px rgba(0,212,170,0.3)',\n '--glyph-text-shadow': 'none',\n '--glyph-backdrop': 'none',\n '--glyph-gradient-accent': 'linear-gradient(135deg, #00d4aa, #00e5ff)',\n '--glyph-transition': '0.2s ease',\n '--glyph-opacity-muted': '0.7',\n '--glyph-opacity-disabled': '0.4',\n '--glyph-focus-ring': '0 0 0 2px #00d4aa',\n\n // SVG / Data Visualization\n '--glyph-node-fill-opacity': '0.85',\n '--glyph-node-radius': '3',\n '--glyph-node-stroke-width': '1.5',\n '--glyph-node-label-color': '#fff',\n '--glyph-edge-color': '#6b7a94',\n '--glyph-icon-stroke': '#fff',\n '--glyph-icon-stroke-width': '1.5',\n },\n};\n","import type { GlyphTheme } from '@glyphjs/types';\nimport { lightTheme } from './light.js';\nimport { darkTheme } from './dark.js';\n\n/**\n * Resolves a theme value — either a string shortcut (`'light'` / `'dark'`)\n * or a full `GlyphTheme` object — into a concrete `GlyphTheme`.\n *\n * When `undefined` is passed, defaults to the light theme.\n */\nexport function resolveTheme(\n theme: 'light' | 'dark' | GlyphTheme | undefined,\n): GlyphTheme {\n if (!theme || theme === 'light') {\n return lightTheme;\n }\n if (theme === 'dark') {\n return darkTheme;\n }\n return theme;\n}\n\n/**\n * Merges component-specific theme defaults into a theme's variable map.\n *\n * Variables already present in `theme.variables` take precedence. Only\n * keys from `defaults` that are absent in the theme are added.\n *\n * Returns a new theme object — the original is not mutated.\n */\nexport function mergeThemeDefaults(\n theme: GlyphTheme,\n defaults: Record<string, string>,\n): GlyphTheme {\n return {\n ...theme,\n variables: { ...defaults, ...theme.variables },\n };\n}\n\n/**\n * Creates a `resolveVar` function bound to a given theme.\n *\n * The returned function takes a CSS variable name (e.g. `'--glyph-bg'`) and\n * returns the value defined in the theme, or an empty string if the variable\n * is not present.\n */\nexport function createResolveVar(\n theme: GlyphTheme,\n): (varName: string) => string {\n return (varName: string): string => theme.variables[varName] ?? '';\n}\n\n/**\n * Heuristic check for whether a theme is a \"dark\" theme.\n *\n * Inspects the `--glyph-bg` variable: if its perceived luminance is below\n * the midpoint it is considered dark. Falls back to checking whether the\n * theme name contains the substring \"dark\" (case-insensitive).\n */\nexport function isDarkTheme(theme: GlyphTheme): boolean {\n const bg = theme.variables['--glyph-bg'];\n if (bg) {\n const luminance = perceivedLuminance(bg);\n if (luminance !== null) {\n return luminance < 0.5;\n }\n }\n // Fallback: name-based heuristic\n return theme.name.toLowerCase().includes('dark');\n}\n\n// ─── Internal helpers ────────────────────────────────────────────\n\n/**\n * Parse a hex colour string (#rgb or #rrggbb) and return its perceived\n * relative luminance in the 0–1 range. Returns `null` for unparseable values.\n */\nfunction perceivedLuminance(hex: string): number | null {\n const trimmed = hex.trim();\n if (!trimmed.startsWith('#')) return null;\n\n let r: number;\n let g: number;\n let b: number;\n\n if (trimmed.length === 4) {\n // #rgb — expand each hex digit, e.g. #abc → #aabbcc\n const rChar = trimmed.charAt(1);\n const gChar = trimmed.charAt(2);\n const bChar = trimmed.charAt(3);\n r = parseInt(rChar + rChar, 16);\n g = parseInt(gChar + gChar, 16);\n b = parseInt(bChar + bChar, 16);\n } else if (trimmed.length === 7) {\n // #rrggbb\n r = parseInt(trimmed.slice(1, 3), 16);\n g = parseInt(trimmed.slice(3, 5), 16);\n b = parseInt(trimmed.slice(5, 7), 16);\n } else {\n return null;\n }\n\n if (isNaN(r) || isNaN(g) || isNaN(b)) return null;\n\n // Relative luminance (ITU-R BT.709)\n return (0.2126 * r + 0.7152 * g + 0.0722 * b) / 255;\n}\n","import { createContext, useContext, useMemo } from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport type { GlyphTheme, GlyphThemeContext } from '@glyphjs/types';\nimport { resolveTheme, createResolveVar, isDarkTheme } from './resolve.js';\n\n// ─── Theme Context ─────────────────────────────────────────────\n\nconst ThemeContext = createContext<GlyphThemeContext | null>(null);\n\n// ─── Theme Provider ────────────────────────────────────────────\n\nexport interface ThemeProviderProps {\n /** A theme shortcut string or a full GlyphTheme object. */\n theme?: 'light' | 'dark' | GlyphTheme;\n /** Optional CSS class name applied to the theme wrapper div. */\n className?: string;\n /** Optional inline styles merged with (and overriding) theme CSS variables. */\n style?: CSSProperties;\n children: ReactNode;\n}\n\n/**\n * Applies a Glyph theme to its children.\n *\n * Resolves the theme to a full `GlyphTheme` object, then renders a wrapper\n * `<div>` with all `--glyph-*` CSS variables applied as inline styles.\n * Descendants can read theme values via `useGlyphTheme()`.\n */\nexport function ThemeProvider({\n theme,\n className,\n style: consumerStyle,\n children,\n}: ThemeProviderProps): ReactNode {\n const resolved = useMemo(() => resolveTheme(theme), [theme]);\n\n const themeContext = useMemo<GlyphThemeContext>(\n () => ({\n name: resolved.name,\n resolveVar: createResolveVar(resolved),\n isDark: isDarkTheme(resolved),\n }),\n [resolved],\n );\n\n // Build the inline style object from the theme variables.\n // Consumer style wins over theme variables for intentional overrides.\n const style = useMemo<Record<string, string>>(\n () => ({ ...resolved.variables, ...(consumerStyle as Record<string, string>) }),\n [resolved, consumerStyle],\n );\n\n return (\n <ThemeContext value={themeContext}>\n <div data-glyph-theme={resolved.name} className={className} style={style}>\n {children}\n </div>\n </ThemeContext>\n );\n}\n\n// ─── Hook ──────────────────────────────────────────────────────\n\n/**\n * Returns the current `GlyphThemeContext`.\n *\n * Must be used inside a `<ThemeProvider>` or the `<RuntimeProvider>`\n * from `createGlyphRuntime()`.\n *\n * @throws if called outside a theme context.\n */\nexport function useGlyphTheme(): GlyphThemeContext {\n const ctx = useContext(ThemeContext);\n if (!ctx) {\n throw new Error(\n 'useGlyphTheme() must be used within a <ThemeProvider> or <RuntimeProvider>. ' +\n 'Did you forget to wrap your component tree?',\n );\n }\n return ctx;\n}\n\nexport { ThemeContext };\n","import { createContext, useContext, useMemo } from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport type { Block, Reference, GlyphTheme, GlyphThemeContext, Diagnostic } from '@glyphjs/types';\nimport type { ComponentRegistry } from './registry.js';\nimport {\n resolveTheme as resolveThemeObject,\n createResolveVar,\n isDarkTheme,\n} from './theme/resolve.js';\nimport { ThemeContext } from './theme/context.js';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nconst noop = () => {};\n\n// ─── Runtime Context Value ────────────────────────────────────\n\nexport interface RuntimeContextValue {\n registry: ComponentRegistry;\n references: Reference[];\n theme: GlyphThemeContext;\n onDiagnostic: (diagnostic: Diagnostic) => void;\n onNavigate: (ref: Reference, targetBlock: Block) => void;\n}\n\nconst RuntimeContext = createContext<RuntimeContextValue | null>(null);\n\n// ─── Provider ─────────────────────────────────────────────────\n\nexport interface RuntimeProviderProps {\n registry: ComponentRegistry;\n references: Reference[];\n theme: 'light' | 'dark' | GlyphTheme | undefined;\n /** Optional CSS class name applied to the runtime wrapper div. */\n className?: string;\n /** Optional inline styles merged with (and overriding) theme CSS variables. */\n style?: CSSProperties;\n onDiagnostic?: (diagnostic: Diagnostic) => void;\n onNavigate?: (ref: Reference, targetBlock: Block) => void;\n children: ReactNode;\n}\n\nexport function RuntimeProvider({\n registry,\n references,\n theme,\n className,\n style: consumerStyle,\n onDiagnostic,\n onNavigate,\n children,\n}: RuntimeProviderProps): ReactNode {\n const resolvedThemeObject = useMemo(() => resolveThemeObject(theme), [theme]);\n\n const resolvedTheme = useMemo<GlyphThemeContext>(\n () => ({\n name: resolvedThemeObject.name,\n resolveVar: createResolveVar(resolvedThemeObject),\n isDark: isDarkTheme(resolvedThemeObject),\n }),\n [resolvedThemeObject],\n );\n\n const value = useMemo<RuntimeContextValue>(\n () => ({\n registry,\n references,\n theme: resolvedTheme,\n onDiagnostic: onDiagnostic ?? noop,\n onNavigate: onNavigate ?? noop,\n }),\n [registry, references, resolvedTheme, onDiagnostic, onNavigate],\n );\n\n // Build inline style object from the resolved theme's CSS variables.\n // Consumer style wins over theme variables for intentional overrides.\n const style = useMemo<Record<string, string>>(\n () => ({ ...resolvedThemeObject.variables, ...(consumerStyle as Record<string, string>) }),\n [resolvedThemeObject, consumerStyle],\n );\n\n return (\n <RuntimeContext value={value}>\n <ThemeContext value={resolvedTheme}>\n <div data-glyph-theme={resolvedThemeObject.name} className={className} style={style}>\n {children}\n </div>\n </ThemeContext>\n </RuntimeContext>\n );\n}\n\n// ─── Hooks ────────────────────────────────────────────────────\n\n/** Access the full runtime context. Throws if used outside RuntimeProvider. */\nexport function useRuntime(): RuntimeContextValue {\n const ctx = useContext(RuntimeContext);\n if (!ctx) {\n throw new Error(\n 'useRuntime() must be used within a <RuntimeProvider>. ' +\n 'Did you forget to use createGlyphRuntime()?',\n );\n }\n return ctx;\n}\n\n/**\n * Get incoming and outgoing references for a specific block.\n */\nexport function useReferences(blockId: string): {\n incomingRefs: Reference[];\n outgoingRefs: Reference[];\n} {\n const { references } = useRuntime();\n\n return useMemo(() => {\n const incoming: Reference[] = [];\n const outgoing: Reference[] = [];\n\n for (const ref of references) {\n if (ref.sourceBlockId === blockId) {\n outgoing.push(ref);\n }\n if (ref.targetBlockId === blockId) {\n incoming.push(ref);\n }\n // Bidirectional refs appear in both directions\n if (ref.bidirectional) {\n if (ref.targetBlockId === blockId && ref.sourceBlockId !== blockId) {\n outgoing.push(ref);\n }\n if (ref.sourceBlockId === blockId && ref.targetBlockId !== blockId) {\n incoming.push(ref);\n }\n }\n }\n\n return { incomingRefs: incoming, outgoingRefs: outgoing };\n }, [references, blockId]);\n}\n","import { Component } from 'react';\nimport type { ErrorInfo, ReactNode } from 'react';\nimport type { Diagnostic } from '@glyphjs/types';\n\n// ─── Props & State ────────────────────────────────────────────\n\ninterface ErrorBoundaryProps {\n blockId: string;\n blockType: string;\n onDiagnostic: (diagnostic: Diagnostic) => void;\n children: ReactNode;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\n// ─── Error Boundary ───────────────────────────────────────────\n\n/**\n * Per-block error boundary that catches render errors.\n * Reports diagnostics via the onDiagnostic callback and renders\n * a fallback UI instead of crashing the entire document.\n */\nexport class ErrorBoundary extends Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error };\n }\n\n override componentDidCatch(error: Error, info: ErrorInfo): void {\n const { blockId, blockType, onDiagnostic } = this.props;\n\n onDiagnostic({\n severity: 'error',\n code: 'RUNTIME_RENDER_ERROR',\n message: `Error rendering block \"${blockId}\" (type: ${blockType}): ${error.message}`,\n source: 'runtime',\n details: {\n blockId,\n blockType,\n errorMessage: error.message,\n componentStack: info.componentStack,\n },\n });\n }\n\n override render(): ReactNode {\n if (this.state.hasError) {\n const { blockId, blockType } = this.props;\n const { error } = this.state;\n\n return (\n <div\n style={{\n border: '1px solid #e53e3e',\n borderRadius: '4px',\n padding: '8px 12px',\n margin: '4px 0',\n backgroundColor: '#fff5f5',\n fontSize: '13px',\n fontFamily: 'monospace',\n }}\n >\n <div style={{ color: '#e53e3e', fontWeight: 600 }}>\n Render error in block &quot;{blockId}&quot; ({blockType})\n </div>\n {error && (\n <div style={{ color: '#742a2a', marginTop: '4px' }}>\n {error.message}\n </div>\n )}\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n","import type { ReactNode } from 'react';\nimport type { Block } from '@glyphjs/types';\n\n// ─── Props ────────────────────────────────────────────────────\n\ninterface FallbackRendererProps {\n block: Block;\n}\n\n// ─── Component ────────────────────────────────────────────────\n\n/**\n * Fallback renderer for unknown or unregistered block types.\n * Renders the block type name and a stringified preview of the raw data.\n * Styled subtly so it is visible during development but not intrusive.\n */\nexport function FallbackRenderer({ block }: FallbackRendererProps): ReactNode {\n let dataPreview: string;\n try {\n dataPreview = JSON.stringify(block.data, null, 2);\n } catch {\n dataPreview = '[Unable to serialize block data]';\n }\n\n return (\n <div\n style={{\n border: '1px dashed #a0aec0',\n borderRadius: '4px',\n padding: '8px 12px',\n margin: '4px 0',\n backgroundColor: '#f7fafc',\n fontSize: '12px',\n fontFamily: 'monospace',\n color: '#718096',\n }}\n >\n <div style={{ fontWeight: 600, marginBottom: '4px' }}>\n Unknown block type: {block.type}\n </div>\n <pre\n style={{\n margin: 0,\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n maxHeight: '200px',\n overflow: 'auto',\n }}\n >\n {dataPreview}\n </pre>\n </div>\n );\n}\n","import { useCallback, useRef } from 'react';\nimport type { Reference, Block } from '@glyphjs/types';\nimport { useRuntime } from '../context.js';\n\n// ─── Constants ────────────────────────────────────────────────\n\nconst HIGHLIGHT_DURATION_MS = 1500;\nconst SCROLL_BEHAVIOR: ScrollBehavior = 'smooth';\nconst BLOCK_SELECTOR_PREFIX = 'data-glyph-block';\n\n// ─── Hook ─────────────────────────────────────────────────────\n\nexport interface NavigationResult {\n /**\n * Smooth-scroll to a block by ID, highlight it briefly, and\n * move focus. Also fires the runtime `onNavigate` callback.\n */\n navigateTo: (blockId: string, ref?: Reference) => void;\n}\n\n/**\n * Provides cross-block navigation utilities.\n *\n * - Smooth-scrolls the target block into view\n * - Applies a temporary highlight via a `data-glyph-highlight` attribute\n * - Moves DOM focus to the block for keyboard users\n * - Announces the navigation to screen readers via an `aria-live` region\n * - Invokes the `onNavigate` callback from the runtime config\n */\nexport function useNavigation(): NavigationResult {\n const { onNavigate, references } = useRuntime();\n const announcerRef = useRef<HTMLDivElement | null>(null);\n\n const navigateTo = useCallback(\n (blockId: string, ref?: Reference) => {\n // Find the DOM element for the target block\n const el = document.querySelector(\n `[${BLOCK_SELECTOR_PREFIX}=\"${blockId}\"]`,\n );\n\n if (!el || !(el instanceof HTMLElement)) {\n return;\n }\n\n // 1. Smooth-scroll into view\n el.scrollIntoView({ behavior: SCROLL_BEHAVIOR, block: 'center' });\n\n // 2. Apply highlight attribute (consumers style via CSS)\n el.setAttribute('data-glyph-highlight', 'true');\n setTimeout(() => {\n el.removeAttribute('data-glyph-highlight');\n }, HIGHLIGHT_DURATION_MS);\n\n // 3. Move focus for keyboard / assistive-tech users\n if (!el.hasAttribute('tabindex')) {\n el.setAttribute('tabindex', '-1');\n }\n el.focus({ preventScroll: true });\n\n // 4. Screen reader announcement via aria-live\n announceNavigation(blockId, announcerRef);\n\n // 5. Fire the runtime onNavigate callback\n if (ref) {\n // Build a minimal target block representation for the callback\n const targetBlock: Block = {\n id: blockId,\n type: 'paragraph',\n data: {},\n position: {\n start: { line: 0, column: 0 },\n end: { line: 0, column: 0 },\n },\n };\n onNavigate(ref, targetBlock);\n } else if (references.length > 0) {\n // Try to find a matching reference\n const matchedRef = references.find(\n (r) => r.targetBlockId === blockId || r.sourceBlockId === blockId,\n );\n if (matchedRef) {\n const targetBlock: Block = {\n id: blockId,\n type: 'paragraph',\n data: {},\n position: {\n start: { line: 0, column: 0 },\n end: { line: 0, column: 0 },\n },\n };\n onNavigate(matchedRef, targetBlock);\n }\n }\n },\n [onNavigate, references],\n );\n\n return { navigateTo };\n}\n\n// ─── Helpers ──────────────────────────────────────────────────\n\n/**\n * Inserts (or reuses) a visually-hidden aria-live region and\n * announces the navigation target to screen readers.\n */\nfunction announceNavigation(\n blockId: string,\n ref: React.RefObject<HTMLDivElement | null>,\n): void {\n let announcer = ref.current;\n\n if (!announcer) {\n announcer = document.createElement('div');\n announcer.setAttribute('aria-live', 'polite');\n announcer.setAttribute('aria-atomic', 'true');\n announcer.setAttribute('role', 'status');\n // Visually hidden but available to screen readers\n Object.assign(announcer.style, {\n position: 'absolute',\n width: '1px',\n height: '1px',\n padding: '0',\n margin: '-1px',\n overflow: 'hidden',\n clip: 'rect(0, 0, 0, 0)',\n whiteSpace: 'nowrap',\n border: '0',\n });\n document.body.appendChild(announcer);\n ref.current = announcer;\n }\n\n announcer.textContent = `Navigated to block ${blockId}`;\n}\n","import { useCallback } from 'react';\nimport type { ReactNode } from 'react';\nimport type { InlineNode } from '@glyphjs/types';\nimport { useNavigation } from '../navigation/useNavigation.js';\n\n// ─── Constants ────────────────────────────────────────────────\n\nconst GLYPH_LINK_PREFIX = '#glyph:';\n\n// ─── Props ────────────────────────────────────────────────────\n\ninterface InlineRendererProps {\n nodes: InlineNode[];\n}\n\n// ─── Glyph link sub-component ─────────────────────────────────\n\n/**\n * Renders a `#glyph:block-id` link as a clickable element that\n * triggers smooth-scroll navigation to the referenced block.\n */\nfunction GlyphLink({\n blockId,\n title,\n children,\n}: {\n blockId: string;\n title?: string;\n children: ReactNode;\n}): ReactNode {\n const { navigateTo } = useNavigation();\n\n const handleClick = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n navigateTo(blockId);\n },\n [navigateTo, blockId],\n );\n\n return (\n <a\n href={`${GLYPH_LINK_PREFIX}${blockId}`}\n title={title}\n onClick={handleClick}\n data-glyph-ref={blockId}\n role=\"link\"\n >\n {children}\n </a>\n );\n}\n\n// ─── Helpers ──────────────────────────────────────────────────\n\nfunction isGlyphLink(url: string): boolean {\n return url.startsWith(GLYPH_LINK_PREFIX);\n}\n\nfunction extractBlockId(url: string): string {\n return url.slice(GLYPH_LINK_PREFIX.length);\n}\n\n// ─── Single node renderer ─────────────────────────────────────\n\nfunction renderInlineNode(node: InlineNode, index: number): ReactNode {\n switch (node.type) {\n case 'text':\n return node.value;\n\n case 'strong':\n return (\n <strong key={index}>\n <InlineRenderer nodes={node.children} />\n </strong>\n );\n\n case 'emphasis':\n return (\n <em key={index}>\n <InlineRenderer nodes={node.children} />\n </em>\n );\n\n case 'delete':\n return (\n <del key={index}>\n <InlineRenderer nodes={node.children} />\n </del>\n );\n\n case 'inlineCode':\n return <code key={index}>{node.value}</code>;\n\n case 'link':\n // Handle #glyph:block-id links as cross-block navigation\n if (isGlyphLink(node.url)) {\n return (\n <GlyphLink\n key={index}\n blockId={extractBlockId(node.url)}\n title={node.title}\n >\n <InlineRenderer nodes={node.children} />\n </GlyphLink>\n );\n }\n return (\n <a key={index} href={node.url} title={node.title}>\n <InlineRenderer nodes={node.children} />\n </a>\n );\n\n case 'image':\n return <img key={index} src={node.src} alt={node.alt} title={node.title} />;\n\n case 'break':\n return <br key={index} />;\n\n default:\n return null;\n }\n}\n\n// ─── Component ────────────────────────────────────────────────\n\n/**\n * Recursively renders an array of InlineNode values into React elements.\n * Handles text, strong, emphasis, delete, inlineCode, link, image, and break.\n * Links with `#glyph:block-id` URLs are rendered as navigable cross-block\n * references that smooth-scroll to the target block on click.\n */\nexport function InlineRenderer({ nodes }: InlineRendererProps): ReactNode {\n return <>{nodes.map((node, i) => renderInlineNode(node, i))}</>;\n}\n","import type { ReactNode } from 'react';\nimport type { BlockProps, HeadingData, InlineNode } from '@glyphjs/types';\nimport { InlineRenderer } from './InlineRenderer.js';\n\n// ─── Helpers ──────────────────────────────────────────────────\n\n/**\n * Extracts plain text from an InlineNode tree for use as an anchor id.\n */\nfunction extractText(nodes: InlineNode[]): string {\n return nodes\n .map((node) => {\n switch (node.type) {\n case 'text':\n return node.value;\n case 'inlineCode':\n return node.value;\n case 'strong':\n case 'emphasis':\n case 'delete':\n case 'link':\n return extractText(node.children);\n default:\n return '';\n }\n })\n .join('');\n}\n\n/**\n * Generates a URL-friendly id from heading text.\n */\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .trim()\n .replace(/[^\\w\\s-]/g, '')\n .replace(/[\\s_]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\n// ─── Component ────────────────────────────────────────────────\n\n/**\n * Renders a heading block (`<h1>` through `<h6>`) based on `data.depth`.\n * Generates an `id` attribute from the heading text for anchor links.\n */\nexport function GlyphHeading({ block }: BlockProps): ReactNode {\n const data = block.data as HeadingData;\n const Tag = `h${data.depth}` as const;\n const id = slugify(extractText(data.children));\n\n return (\n <Tag id={id}>\n <InlineRenderer nodes={data.children} />\n </Tag>\n );\n}\n","import type { ReactNode } from 'react';\nimport type { BlockProps, ParagraphData } from '@glyphjs/types';\nimport { InlineRenderer } from './InlineRenderer.js';\n\n// ─── Component ────────────────────────────────────────────────\n\n/**\n * Renders a paragraph block with inline content.\n */\nexport function GlyphParagraph({ block }: BlockProps): ReactNode {\n const data = block.data as ParagraphData;\n\n return (\n <p>\n <InlineRenderer nodes={data.children} />\n </p>\n );\n}\n","import type { ReactNode } from 'react';\nimport type { BlockProps, ListData, ListItemData } from '@glyphjs/types';\nimport { InlineRenderer } from './InlineRenderer.js';\n\n// ─── Sub-list renderer ────────────────────────────────────────\n\nfunction renderSubList(list: ListData): ReactNode {\n const items = list.items.map((item, i) => renderListItem(item, i));\n\n if (list.ordered) {\n return <ol start={list.start}>{items}</ol>;\n }\n return <ul>{items}</ul>;\n}\n\nfunction renderListItem(item: ListItemData, index: number): ReactNode {\n return (\n <li key={index}>\n <InlineRenderer nodes={item.children} />\n {item.subList ? renderSubList(item.subList) : null}\n </li>\n );\n}\n\n// ─── Component ────────────────────────────────────────────────\n\n/**\n * Renders a list block as `<ol>` or `<ul>` based on `data.ordered`.\n * Supports `start` attribute for ordered lists and nested sub-lists.\n */\nexport function GlyphList({ block }: BlockProps): ReactNode {\n const data = block.data as ListData;\n\n return renderSubList(data);\n}\n","import type { ReactNode } from 'react';\nimport type { BlockProps, CodeData } from '@glyphjs/types';\n\n// ─── Component ────────────────────────────────────────────────\n\n/**\n * Renders a fenced code block as `<pre><code>`.\n * Adds a `data-language` attribute and a `language-{lang}` CSS class\n * so users can integrate their own syntax highlighter (e.g. Prism, Shiki).\n */\nexport function GlyphCodeBlock({ block }: BlockProps): ReactNode {\n const data = block.data as CodeData;\n const language = data.language ?? undefined;\n\n return (\n <pre data-language={language} aria-label={language ? `Code block (${language})` : 'Code block'}>\n <code className={language ? `language-${language}` : undefined}>\n {data.value}\n </code>\n </pre>\n );\n}\n","import type { ReactNode } from 'react';\nimport type { BlockProps, BlockquoteData } from '@glyphjs/types';\nimport { InlineRenderer } from './InlineRenderer.js';\n\n// ─── Component ────────────────────────────────────────────────\n\n/**\n * Renders a blockquote with inline content.\n */\nexport function GlyphBlockquote({ block }: BlockProps): ReactNode {\n const data = block.data as BlockquoteData;\n\n return (\n <blockquote>\n <InlineRenderer nodes={data.children} />\n </blockquote>\n );\n}\n","import type { ReactNode } from 'react';\nimport type { BlockProps, ImageData } from '@glyphjs/types';\n\n// ─── Component ────────────────────────────────────────────────\n\n/**\n * Renders an image block as a `<figure>` containing an `<img>` with lazy loading.\n * If `data.title` is present, renders a `<figcaption>`.\n */\nexport function GlyphImage({ block }: BlockProps): ReactNode {\n const data = block.data as ImageData;\n\n return (\n <figure>\n <img src={data.src} alt={data.alt ?? ''} loading=\"lazy\" />\n {data.title ? <figcaption>{data.title}</figcaption> : null}\n </figure>\n );\n}\n","import type { ReactNode } from 'react';\nimport type { BlockProps } from '@glyphjs/types';\n\n// ─── Component ────────────────────────────────────────────────\n\n/**\n * Renders a thematic break (horizontal rule).\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function GlyphThematicBreak(_props: BlockProps): ReactNode {\n return <hr />;\n}\n","import type { ReactNode } from 'react';\nimport type { BlockProps, HtmlData } from '@glyphjs/types';\nimport DOMPurify from 'dompurify';\n\n// ─── Component ────────────────────────────────────────────────\n\n/**\n * Renders raw HTML content sanitized with DOMPurify.\n * Removes dangerous elements, attributes, and URLs to prevent XSS.\n */\nexport function GlyphRawHtml({ block }: BlockProps): ReactNode {\n const data = block.data as HtmlData;\n const clean = DOMPurify.sanitize(data.value);\n\n return <div dangerouslySetInnerHTML={{ __html: clean }} />;\n}\n","import type { ComponentType as ReactComponentType } from 'react';\nimport type { BlockProps } from '@glyphjs/types';\n\nimport { GlyphHeading } from './GlyphHeading.js';\nimport { GlyphParagraph } from './GlyphParagraph.js';\nimport { GlyphList } from './GlyphList.js';\nimport { GlyphCodeBlock } from './GlyphCodeBlock.js';\nimport { GlyphBlockquote } from './GlyphBlockquote.js';\nimport { GlyphImage } from './GlyphImage.js';\nimport { GlyphThematicBreak } from './GlyphThematicBreak.js';\nimport { GlyphRawHtml } from './GlyphRawHtml.js';\n\n// ─── Individual renderer exports ─────────────────────────────\n\nexport { InlineRenderer } from './InlineRenderer.js';\nexport { GlyphHeading } from './GlyphHeading.js';\nexport { GlyphParagraph } from './GlyphParagraph.js';\nexport { GlyphList } from './GlyphList.js';\nexport { GlyphCodeBlock } from './GlyphCodeBlock.js';\nexport { GlyphBlockquote } from './GlyphBlockquote.js';\nexport { GlyphImage } from './GlyphImage.js';\nexport { GlyphThematicBreak } from './GlyphThematicBreak.js';\nexport { GlyphRawHtml } from './GlyphRawHtml.js';\n\n// ─── Built-in renderers map ──────────────────────────────────\n\n/**\n * Maps standard Markdown block type strings to their built-in\n * renderer components. Used by `BlockRenderer` to resolve\n * standard blocks before falling back to the unknown-type fallback.\n */\nexport const builtInRenderers: Record<string, ReactComponentType<BlockProps>> = {\n heading: GlyphHeading,\n paragraph: GlyphParagraph,\n list: GlyphList,\n code: GlyphCodeBlock,\n blockquote: GlyphBlockquote,\n image: GlyphImage,\n 'thematic-break': GlyphThematicBreak,\n html: GlyphRawHtml,\n};\n","import type {\n Block,\n ContainerContext,\n GlyphComponentDefinition,\n GlyphComponentProps,\n GlyphThemeContext,\n LayoutHints,\n Reference,\n} from '@glyphjs/types';\n\n/**\n * Assembles the full `GlyphComponentProps` for a ui:* component.\n *\n * - Parses `block.data` through the component's Zod schema (via `safeParse`)\n * - Filters outgoing refs: references where `sourceBlockId === block.id`\n * (plus bidirectional refs where `targetBlockId === block.id`)\n * - Filters incoming refs: references where `targetBlockId === block.id`\n * (plus bidirectional refs where `sourceBlockId === block.id`)\n * - Wires the `onNavigate` callback\n * - Passes theme context and layout hints\n *\n * @param block - The IR block to resolve props for.\n * @param definition - The registered component definition (provides the Zod schema).\n * @param references - All references in the document (filtered to this block).\n * @param onNavigate - Callback invoked when the component triggers navigation via a reference.\n * @param themeContext - Current theme context passed through to the component.\n * @param layoutHints - Layout hints (e.g., viewport size, container width) for responsive rendering.\n * @param containerContext - Container measurement context for container-adaptive layout.\n * @returns Fully assembled GlyphComponentProps ready to pass to the component's render function.\n */\nexport function resolveComponentProps<T = unknown>(\n block: Block,\n definition: GlyphComponentDefinition<T>,\n references: Reference[],\n onNavigate: (ref: Reference) => void,\n themeContext: GlyphThemeContext,\n layoutHints: LayoutHints,\n containerContext: ContainerContext,\n): GlyphComponentProps<T> {\n // Parse block data through the component's schema\n const parseResult = definition.schema.safeParse(block.data);\n const data: T = parseResult.success\n ? (parseResult.data as T)\n : (() => {\n const err = parseResult.error;\n const issues =\n err != null &&\n typeof err === 'object' &&\n 'issues' in err &&\n Array.isArray((err as { issues: unknown }).issues)\n ? (err as { issues: { path: string[]; message: string }[] }).issues\n .map(\n (i: { path: string[]; message: string }) => `${i.path.join('.')}: ${i.message}`,\n )\n .join('; ')\n : 'unknown error';\n console.warn(\n `[GlyphJS] Schema validation failed for block \"${block.id}\" (${block.type}). ` +\n `Falling back to raw data. Issues: ${issues}`,\n );\n return block.data as T;\n })();\n\n // Filter references for this block\n const outgoingRefs: Reference[] = [];\n const incomingRefs: Reference[] = [];\n\n for (const ref of references) {\n // Standard outgoing: source is this block\n if (ref.sourceBlockId === block.id) {\n outgoingRefs.push(ref);\n }\n\n // Standard incoming: target is this block\n if (ref.targetBlockId === block.id) {\n incomingRefs.push(ref);\n }\n\n // Bidirectional refs appear in both directions\n if (ref.bidirectional) {\n if (ref.targetBlockId === block.id && ref.sourceBlockId !== block.id) {\n outgoingRefs.push(ref);\n }\n if (ref.sourceBlockId === block.id && ref.targetBlockId !== block.id) {\n incomingRefs.push(ref);\n }\n }\n }\n\n return {\n data,\n block,\n outgoingRefs,\n incomingRefs,\n onNavigate,\n theme: themeContext,\n layout: layoutHints,\n container: containerContext,\n };\n}\n","import { createContext, useContext, useMemo } from 'react';\nimport type { ReactNode } from 'react';\nimport type { AnimationConfig } from '@glyphjs/types';\n\n// ─── Animation State ─────────────────────────────────────────\n\nexport interface AnimationState {\n enabled: boolean;\n duration: number;\n easing: string;\n staggerDelay: number;\n}\n\nconst defaultConfig: AnimationState = {\n enabled: true,\n duration: 300,\n easing: 'ease-out',\n staggerDelay: 50,\n};\n\n// ─── Context ─────────────────────────────────────────────────\n\nconst AnimationContext = createContext<AnimationState>(defaultConfig);\n\n// ─── Provider ────────────────────────────────────────────────\n\ninterface AnimationProviderProps {\n config?: AnimationConfig;\n children: ReactNode;\n}\n\n/**\n * Provides animation configuration to the component tree.\n * Merges partial user config with sensible defaults.\n */\nexport function AnimationProvider({\n config,\n children,\n}: AnimationProviderProps): ReactNode {\n const state = useMemo<AnimationState>(\n () => ({\n ...defaultConfig,\n ...config,\n }),\n [config],\n );\n\n return <AnimationContext value={state}>{children}</AnimationContext>;\n}\n\n// ─── Hook ────────────────────────────────────────────────────\n\n/**\n * Returns the current animation configuration.\n * Falls back to defaults if no `AnimationProvider` is found.\n */\nexport function useAnimation(): AnimationState {\n return useContext(AnimationContext);\n}\n\nexport { AnimationContext };\n","import { useRef, useState, useEffect, useMemo } from 'react';\nimport type { CSSProperties, RefObject } from 'react';\nimport { useAnimation } from './AnimationProvider.js';\n\n// ─── Return type ─────────────────────────────────────────────\n\nexport interface BlockAnimationResult {\n /** Attach to the block wrapper element. */\n ref: RefObject<HTMLDivElement | null>;\n /** Inline styles that drive the entry animation. */\n style: CSSProperties;\n /** Whether the block has entered the viewport. */\n isVisible: boolean;\n}\n\n// ─── Reduced-motion query ────────────────────────────────────\n\nfunction usePrefersReducedMotion(): boolean {\n const [prefersReduced, setPrefersReduced] = useState(false);\n\n useEffect(() => {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {\n return;\n }\n const mql = window.matchMedia('(prefers-reduced-motion: reduce)');\n setPrefersReduced(mql.matches);\n\n const handler = (e: MediaQueryListEvent): void => {\n setPrefersReduced(e.matches);\n };\n\n mql.addEventListener('change', handler);\n return () => {\n mql.removeEventListener('change', handler);\n };\n }, []);\n\n return prefersReduced;\n}\n\n// ─── Hook ────────────────────────────────────────────────────\n\n/**\n * Per-block entry animation powered by Intersection Observer.\n *\n * Returns a `ref` to attach to the block wrapper, an inline `style`\n * object that drives the CSS transition, and an `isVisible` flag.\n *\n * Animations are skipped when:\n * - The animation config has `enabled: false`\n * - The user has `prefers-reduced-motion: reduce` set\n *\n * @param index - The block's position in the document, used for stagger delay.\n */\nexport function useBlockAnimation(index: number): BlockAnimationResult {\n const config = useAnimation();\n const prefersReduced = usePrefersReducedMotion();\n const ref = useRef<HTMLDivElement | null>(null);\n const [isVisible, setIsVisible] = useState(false);\n\n const disabled = !config.enabled || prefersReduced;\n\n useEffect(() => {\n if (disabled) {\n setIsVisible(true);\n return;\n }\n\n const element = ref.current;\n if (!element) {\n return;\n }\n\n if (typeof IntersectionObserver === 'undefined') {\n setIsVisible(true);\n return;\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n const entry = entries[0];\n if (entry && entry.isIntersecting) {\n setIsVisible(true);\n observer.unobserve(element);\n }\n },\n { threshold: 0.1 },\n );\n\n observer.observe(element);\n\n return () => {\n observer.disconnect();\n };\n }, [disabled]);\n\n const style = useMemo<CSSProperties>(() => {\n if (disabled) {\n return {};\n }\n\n const delay = index * config.staggerDelay;\n\n return isVisible\n ? {\n opacity: 1,\n transform: 'translateY(0)',\n transition: `opacity ${config.duration}ms ${config.easing} ${delay}ms, transform ${config.duration}ms ${config.easing} ${delay}ms`,\n }\n : {\n opacity: 0,\n transform: 'translateY(10px)',\n transition: `opacity ${config.duration}ms ${config.easing} ${delay}ms, transform ${config.duration}ms ${config.easing} ${delay}ms`,\n };\n }, [disabled, isVisible, index, config.duration, config.easing, config.staggerDelay]);\n\n return { ref, style, isVisible };\n}\n","import { useCallback } from 'react';\nimport type { ReactNode } from 'react';\nimport type { Reference } from '@glyphjs/types';\nimport { useReferences } from '../context.js';\nimport { useNavigation } from './useNavigation.js';\n\n// ─── Props ────────────────────────────────────────────────────\n\ninterface ReferenceIndicatorProps {\n blockId: string;\n}\n\n// ─── Styles ───────────────────────────────────────────────────\n\nconst containerStyle: React.CSSProperties = {\n display: 'flex',\n flexWrap: 'wrap',\n gap: '4px',\n marginTop: '4px',\n};\n\nconst badgeBaseStyle: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n padding: '1px 6px',\n borderRadius: '9999px',\n fontSize: '11px',\n lineHeight: '1.4',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n cursor: 'pointer',\n border: '1px solid',\n textDecoration: 'none',\n transition: 'opacity 150ms ease',\n};\n\nconst outgoingBadgeStyle: React.CSSProperties = {\n ...badgeBaseStyle,\n backgroundColor: '#eff6ff',\n borderColor: '#bfdbfe',\n color: '#1d4ed8',\n};\n\nconst incomingBadgeStyle: React.CSSProperties = {\n ...badgeBaseStyle,\n backgroundColor: '#f0fdf4',\n borderColor: '#bbf7d0',\n color: '#15803d',\n};\n\n// ─── Component ────────────────────────────────────────────────\n\n/**\n * Renders clickable reference badges for a given block.\n *\n * - Outgoing references are shown as \" -> target-label\"\n * - Incoming references are shown as \" <- source-label\"\n * - Clicking a badge navigates (smooth-scroll + highlight) to the\n * referenced block.\n */\nexport function ReferenceIndicator({\n blockId,\n}: ReferenceIndicatorProps): ReactNode {\n const { incomingRefs, outgoingRefs } = useReferences(blockId);\n const { navigateTo } = useNavigation();\n\n const handleClick = useCallback(\n (targetBlockId: string, ref: Reference) => {\n navigateTo(targetBlockId, ref);\n },\n [navigateTo],\n );\n\n if (outgoingRefs.length === 0 && incomingRefs.length === 0) {\n return null;\n }\n\n return (\n <nav\n aria-label={`References for block ${blockId}`}\n style={containerStyle}\n >\n {outgoingRefs.map((ref) => {\n const targetId =\n ref.sourceBlockId === blockId\n ? ref.targetBlockId\n : ref.sourceBlockId;\n const label = ref.label ?? targetId;\n\n return (\n <button\n key={`out-${ref.id}`}\n type=\"button\"\n style={outgoingBadgeStyle}\n onClick={() => handleClick(targetId, ref)}\n aria-label={`Navigate to referenced block: ${label}`}\n title={`Go to: ${label} (${ref.type})`}\n >\n {'\\u2192 '}\n {label}\n </button>\n );\n })}\n\n {incomingRefs.map((ref) => {\n const sourceId =\n ref.targetBlockId === blockId\n ? ref.sourceBlockId\n : ref.targetBlockId;\n const label = ref.label ?? sourceId;\n\n return (\n <button\n key={`in-${ref.id}`}\n type=\"button\"\n style={incomingBadgeStyle}\n onClick={() => handleClick(sourceId, ref)}\n aria-label={`Navigate to referencing block: ${label}`}\n title={`Referenced by: ${label} (${ref.type})`}\n >\n {'\\u2190 '}\n {label}\n </button>\n );\n })}\n </nav>\n );\n}\n","import type { ComponentType as ReactComponentType, ReactNode } from 'react';\nimport type {\n Block,\n BlockProps,\n ContainerContext,\n GlyphComponentProps,\n LayoutHints,\n Reference,\n} from '@glyphjs/types';\nimport { componentSchemas } from '@glyphjs/schemas';\nimport { useRuntime, useReferences } from './context.js';\nimport { ErrorBoundary } from './ErrorBoundary.js';\nimport { FallbackRenderer } from './FallbackRenderer.js';\nimport { builtInRenderers } from './renderers/index.js';\nimport { resolveComponentProps } from './plugins/resolve-props.js';\nimport { useBlockAnimation } from './animation/useBlockAnimation.js';\nimport { ReferenceIndicator } from './navigation/ReferenceIndicator.js';\n\n// ─── Props ────────────────────────────────────────────────────\n\ninterface BlockRendererProps {\n block: Block;\n layout: LayoutHints;\n /** Position index used for stagger animation delay. */\n index?: number;\n /** Container measurement context for responsive adaptation. */\n container: ContainerContext;\n}\n\n// ─── Inner dispatch (unwrapped from ErrorBoundary) ────────────\n\nfunction BlockDispatch({ block, layout, container }: BlockRendererProps): ReactNode {\n const { registry, references, theme, onNavigate } = useRuntime();\n const { incomingRefs, outgoingRefs } = useReferences(block.id);\n\n const hasRefs = incomingRefs.length > 0 || outgoingRefs.length > 0;\n\n // Dev-mode schema validation for ui:* block types\n if (block.type.startsWith('ui:')) {\n const componentName = block.type.slice(3); // strip 'ui:' prefix\n const schema = componentSchemas.get(componentName);\n if (schema) {\n const result = schema.safeParse(block.data);\n if (!result.success) {\n console.warn(\n `[GlyphJS] Schema validation failed for block \"${block.id}\" (${block.type}):`,\n result.error.issues,\n );\n }\n }\n }\n\n // Resolve the rendered content for this block\n let content: ReactNode;\n\n // 1. Check for an override renderer\n const overrideDef = registry.getOverride(block.type);\n if (overrideDef) {\n // Cast from the generic ComponentType (returns unknown) to React's ComponentType\n const Override = overrideDef as ReactComponentType<BlockProps>;\n content = <Override block={block} layout={layout} />;\n } else {\n // 2. Check for a registered ui:* component definition\n const definition = registry.getRenderer(block.type);\n if (definition) {\n const handleNavigate = (ref: Reference) => {\n // Find the target block — caller receives the ref and target\n onNavigate(ref, block);\n };\n\n // Use resolveComponentProps to assemble the full typed props\n const props = resolveComponentProps(\n block,\n definition,\n references,\n handleNavigate,\n theme,\n layout,\n container,\n );\n\n // Cast from the generic ComponentType (returns unknown) to React's ComponentType\n const Renderer = definition.render as ReactComponentType<GlyphComponentProps>;\n content = <Renderer {...props} />;\n } else {\n // 3. Built-in standard renderers for standard Markdown block types\n const BuiltIn = builtInRenderers[block.type];\n if (BuiltIn) {\n content = <BuiltIn block={block} layout={layout} />;\n } else {\n // 4. Fallback for unknown/unregistered block types\n content = <FallbackRenderer block={block} />;\n }\n }\n }\n\n return (\n <div data-glyph-block={block.id}>\n {content}\n {hasRefs && <ReferenceIndicator blockId={block.id} />}\n </div>\n );\n}\n\n// ─── BlockRenderer (with ErrorBoundary wrapper) ───────────────\n\n/**\n * Renders a single Block by dispatching to the correct renderer.\n * Each block is wrapped in its own ErrorBoundary so a failure\n * in one block does not crash the rest of the document.\n * When an `index` is provided, the block wrapper applies an\n * entry animation with stagger delay via `useBlockAnimation`.\n */\nexport function BlockRenderer({\n block,\n layout,\n index = 0,\n container,\n}: BlockRendererProps): ReactNode {\n const { onDiagnostic } = useRuntime();\n const { ref, style } = useBlockAnimation(index);\n\n return (\n <div ref={ref} style={style} data-glyph-block-anim={block.id}>\n <ErrorBoundary blockId={block.id} blockType={block.type} onDiagnostic={onDiagnostic}>\n <BlockDispatch block={block} layout={layout} container={container} />\n </ErrorBoundary>\n </div>\n );\n}\n","import { createContext, useContext } from 'react';\nimport type { ReactNode } from 'react';\nimport type { LayoutHints } from '@glyphjs/types';\n\n// ─── Default layout ──────────────────────────────────────────\n\nconst defaultLayout: LayoutHints = {\n mode: 'document',\n spacing: 'normal',\n};\n\n// ─── Context ─────────────────────────────────────────────────\n\nconst LayoutContext = createContext<LayoutHints>(defaultLayout);\n\n// ─── Provider ────────────────────────────────────────────────\n\ninterface LayoutProviderProps {\n layout: LayoutHints;\n children: ReactNode;\n}\n\n/**\n * Provides layout hints to the component tree.\n * Wraps children in a `LayoutContext` so any descendant\n * can call `useLayout()` to access the active layout.\n */\nexport function LayoutProvider({\n layout,\n children,\n}: LayoutProviderProps): ReactNode {\n return <LayoutContext value={layout}>{children}</LayoutContext>;\n}\n\n// ─── Hook ────────────────────────────────────────────────────\n\n/**\n * Access the current layout hints from the nearest `LayoutProvider`.\n * Falls back to the default document layout if no provider is found.\n */\nexport function useLayout(): LayoutHints {\n return useContext(LayoutContext);\n}\n","import type { CSSProperties, ReactNode } from 'react';\nimport type { Block, LayoutHints } from '@glyphjs/types';\n\n// ─── Spacing map ─────────────────────────────────────────────\n\nconst spacingMap: Record<NonNullable<LayoutHints['spacing']>, string> = {\n compact: '0.5rem',\n normal: '1rem',\n relaxed: '2rem',\n};\n\n// ─── Props ───────────────────────────────────────────────────\n\ninterface DocumentLayoutProps {\n blocks: Block[];\n layout: LayoutHints;\n renderBlock: (block: Block, index: number) => ReactNode;\n}\n\n// ─── Component ───────────────────────────────────────────────\n\n/**\n * Document mode layout — single-column vertical flow.\n *\n * Applies configurable `maxWidth` and inter-block spacing.\n */\nexport function DocumentLayout({\n blocks,\n layout,\n renderBlock,\n}: DocumentLayoutProps): ReactNode {\n const gap = spacingMap[layout.spacing ?? 'normal'];\n\n const containerStyle: CSSProperties = {\n maxWidth: layout.maxWidth ?? 'none',\n margin: '0 auto',\n display: 'flex',\n flexDirection: 'column',\n gap,\n };\n\n return (\n <div style={containerStyle} data-glyph-layout=\"document\">\n {blocks.map((block, index) => (\n <div key={block.id}>{renderBlock(block, index)}</div>\n ))}\n </div>\n );\n}\n","import type { CSSProperties, ReactNode } from 'react';\nimport type { Block, LayoutHints } from '@glyphjs/types';\n\n// ─── Props ───────────────────────────────────────────────────\n\ninterface DashboardLayoutProps {\n blocks: Block[];\n layout: LayoutHints;\n renderBlock: (block: Block, index: number) => ReactNode;\n}\n\n// ─── Component ───────────────────────────────────────────────\n\n/**\n * Dashboard mode layout — CSS grid with configurable columns.\n *\n * Supports per-block placement overrides via `layout.blockLayout`.\n * Blocks without overrides flow naturally in the grid.\n */\nexport function DashboardLayout({\n blocks,\n layout,\n renderBlock,\n}: DashboardLayoutProps): ReactNode {\n const columns = layout.columns ?? 2;\n\n const containerStyle: CSSProperties = {\n display: 'grid',\n gridTemplateColumns: `repeat(${String(columns)}, 1fr)`,\n gap: '1rem',\n };\n\n return (\n <div style={containerStyle} data-glyph-layout=\"dashboard\">\n {blocks.map((block, index) => {\n const override = layout.blockLayout?.[block.id];\n const cellStyle: CSSProperties = {};\n\n if (override) {\n if (override.gridColumn) {\n cellStyle.gridColumn = override.gridColumn;\n }\n if (override.gridRow) {\n cellStyle.gridRow = override.gridRow;\n }\n if (override.span) {\n cellStyle.gridColumn = `span ${String(override.span)}`;\n }\n }\n\n return (\n <div key={block.id} style={cellStyle}>\n {renderBlock(block, index)}\n </div>\n );\n })}\n </div>\n );\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport type { Block } from '@glyphjs/types';\n\n// ─── Props ───────────────────────────────────────────────────\n\ninterface PresentationLayoutProps {\n blocks: Block[];\n renderBlock: (block: Block, index: number) => ReactNode;\n}\n\n// ─── Component ───────────────────────────────────────────────\n\n/**\n * Presentation mode layout — full-viewport slides.\n *\n * Displays one block at a time with keyboard navigation\n * (left/up for previous, right/down/space for next).\n * Shows a slide indicator in the bottom-right corner.\n */\nexport function PresentationLayout({\n blocks,\n renderBlock,\n}: PresentationLayoutProps): ReactNode {\n const [currentIndex, setCurrentIndex] = useState(0);\n const total = blocks.length;\n\n const goNext = useCallback(() => {\n setCurrentIndex((i) => Math.min(i + 1, total - 1));\n }, [total]);\n\n const goPrev = useCallback(() => {\n setCurrentIndex((i) => Math.max(i - 1, 0));\n }, []);\n\n useEffect(() => {\n function handleKeyDown(e: KeyboardEvent): void {\n switch (e.key) {\n case 'ArrowRight':\n case 'ArrowDown':\n case ' ':\n e.preventDefault();\n goNext();\n break;\n case 'ArrowLeft':\n case 'ArrowUp':\n e.preventDefault();\n goPrev();\n break;\n }\n }\n\n window.addEventListener('keydown', handleKeyDown);\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n };\n }, [goNext, goPrev]);\n\n if (total === 0) {\n return null;\n }\n\n const currentBlock = blocks[currentIndex];\n\n const containerStyle: CSSProperties = {\n position: 'relative',\n width: '100vw',\n height: '100vh',\n overflow: 'hidden',\n };\n\n const slideStyle: CSSProperties = {\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '2rem',\n boxSizing: 'border-box',\n };\n\n const indicatorStyle: CSSProperties = {\n position: 'absolute',\n bottom: '1rem',\n right: '1rem',\n fontSize: '0.875rem',\n color: '#718096',\n fontFamily: 'sans-serif',\n userSelect: 'none',\n };\n\n return (\n <div style={containerStyle} data-glyph-layout=\"presentation\">\n <div style={slideStyle}>\n {currentBlock ? renderBlock(currentBlock, currentIndex) : null}\n </div>\n <div style={indicatorStyle}>\n {String(currentIndex + 1)} / {String(total)}\n </div>\n </div>\n );\n}\n","import { useState, useEffect, useCallback, useMemo } from 'react';\nimport type { ReactNode, CSSProperties } from 'react';\nimport type { Diagnostic } from '@glyphjs/types';\n\n// ─── Props ────────────────────────────────────────────────────\n\ninterface DiagnosticsOverlayProps {\n diagnostics: Diagnostic[];\n}\n\n// ─── Severity helpers ─────────────────────────────────────────\n\nconst severityColors: Record<Diagnostic['severity'], string> = {\n error: '#dc2626',\n warning: '#d97706',\n info: '#2563eb',\n};\n\nconst severityBackgrounds: Record<Diagnostic['severity'], string> = {\n error: '#fef2f2',\n warning: '#fffbeb',\n info: '#eff6ff',\n};\n\nconst severityIcons: Record<Diagnostic['severity'], string> = {\n error: '\\u2716', // heavy multiplication sign\n warning: '\\u26A0', // warning sign\n info: '\\u2139', // information source\n};\n\nfunction formatPosition(diagnostic: Diagnostic): string {\n if (!diagnostic.position) return '';\n const { start } = diagnostic.position;\n return `${String(start.line)}:${String(start.column)}`;\n}\n\n// ─── Styles ───────────────────────────────────────────────────\n\nconst overlayStyle: CSSProperties = {\n position: 'fixed',\n bottom: '16px',\n right: '16px',\n maxWidth: '480px',\n maxHeight: '60vh',\n overflowY: 'auto',\n backgroundColor: '#ffffff',\n border: '1px solid #e5e7eb',\n borderRadius: '8px',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n fontFamily:\n 'ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace',\n fontSize: '13px',\n zIndex: 9999,\n};\n\nconst headerStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '10px 14px',\n borderBottom: '1px solid #e5e7eb',\n backgroundColor: '#f9fafb',\n borderRadius: '8px 8px 0 0',\n};\n\nconst closeButtonStyle: CSSProperties = {\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n fontSize: '16px',\n color: '#6b7280',\n padding: '2px 6px',\n borderRadius: '4px',\n lineHeight: 1,\n};\n\nconst itemStyle: CSSProperties = {\n padding: '8px 14px',\n borderBottom: '1px solid #f3f4f6',\n};\n\nconst itemHeaderStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n};\n\nconst codeStyle: CSSProperties = {\n color: '#6b7280',\n fontSize: '11px',\n};\n\nconst messageStyle: CSSProperties = {\n marginTop: '2px',\n color: '#1f2937',\n lineHeight: '1.4',\n};\n\nconst positionStyle: CSSProperties = {\n color: '#9ca3af',\n fontSize: '11px',\n marginTop: '2px',\n};\n\n// ─── Component ────────────────────────────────────────────────\n\n/**\n * Dev-mode overlay that displays compilation diagnostics.\n * Shows an aggregate summary and a scrollable list of diagnostics\n * with severity icons/colors, codes, messages, and source positions.\n * Dismissable via a close button or the Escape key.\n * Only rendered when diagnostics are present.\n */\nexport function DiagnosticsOverlay({\n diagnostics,\n}: DiagnosticsOverlayProps): ReactNode {\n const [dismissed, setDismissed] = useState(false);\n\n // Reset dismissed state when diagnostics change\n useEffect(() => {\n setDismissed(false);\n }, [diagnostics]);\n\n const handleDismiss = useCallback(() => {\n setDismissed(true);\n }, []);\n\n // Escape key handler\n useEffect(() => {\n function handleKeyDown(e: KeyboardEvent): void {\n if (e.key === 'Escape') {\n setDismissed(true);\n }\n }\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, []);\n\n const summary = useMemo(() => {\n let errors = 0;\n let warnings = 0;\n let infos = 0;\n for (const d of diagnostics) {\n if (d.severity === 'error') errors++;\n else if (d.severity === 'warning') warnings++;\n else infos++;\n }\n const parts: string[] = [];\n if (errors > 0) parts.push(`${String(errors)} error${errors > 1 ? 's' : ''}`);\n if (warnings > 0)\n parts.push(`${String(warnings)} warning${warnings > 1 ? 's' : ''}`);\n if (infos > 0) parts.push(`${String(infos)} info`);\n return parts.join(', ');\n }, [diagnostics]);\n\n if (diagnostics.length === 0 || dismissed) {\n return null;\n }\n\n return (\n <div\n style={overlayStyle}\n data-glyph-diagnostics-overlay\n role=\"complementary\"\n aria-label=\"Diagnostics overlay\"\n >\n {/* Header with summary and close button */}\n <div style={headerStyle}>\n <span style={{ fontWeight: 600, color: '#1f2937' }}>{summary}</span>\n <button\n type=\"button\"\n style={closeButtonStyle}\n onClick={handleDismiss}\n aria-label=\"Dismiss diagnostics\"\n >\n {'\\u2715'}\n </button>\n </div>\n\n {/* Diagnostic list */}\n <div>\n {diagnostics.map((diagnostic, index) => {\n const color = severityColors[diagnostic.severity];\n const bg = severityBackgrounds[diagnostic.severity];\n const icon = severityIcons[diagnostic.severity];\n const pos = formatPosition(diagnostic);\n\n return (\n <div\n key={`${diagnostic.code}-${String(index)}`}\n style={{ ...itemStyle, backgroundColor: bg }}\n >\n <div style={itemHeaderStyle}>\n <span style={{ color, fontWeight: 700 }}>{icon}</span>\n <span style={{ color, fontWeight: 600 }}>\n {diagnostic.severity}\n </span>\n {diagnostic.code && (\n <span style={codeStyle}>[{diagnostic.code}]</span>\n )}\n </div>\n <div style={messageStyle}>{diagnostic.message}</div>\n {pos && <div style={positionStyle}>at {pos}</div>}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import { useState, useCallback } from 'react';\nimport type { ReactNode, CSSProperties } from 'react';\nimport type { Diagnostic } from '@glyphjs/types';\n\n// ─── Props ────────────────────────────────────────────────────\n\ninterface BlockDiagnosticIndicatorProps {\n diagnostics: Diagnostic[];\n}\n\n// ─── Severity helpers ─────────────────────────────────────────\n\nconst severityColors: Record<Diagnostic['severity'], string> = {\n error: '#dc2626',\n warning: '#d97706',\n info: '#2563eb',\n};\n\nconst severityBackgrounds: Record<Diagnostic['severity'], string> = {\n error: '#fef2f2',\n warning: '#fffbeb',\n info: '#eff6ff',\n};\n\nconst severityIcons: Record<Diagnostic['severity'], string> = {\n error: '\\u2716',\n warning: '\\u26A0',\n info: '\\u2139',\n};\n\n/** Determine the highest severity present in the diagnostics list. */\nfunction highestSeverity(\n diagnostics: Diagnostic[],\n): Diagnostic['severity'] {\n let has: Diagnostic['severity'] = 'info';\n for (const d of diagnostics) {\n if (d.severity === 'error') return 'error';\n if (d.severity === 'warning') has = 'warning';\n }\n return has;\n}\n\nfunction formatPosition(diagnostic: Diagnostic): string {\n if (!diagnostic.position) return '';\n const { start } = diagnostic.position;\n return `${String(start.line)}:${String(start.column)}`;\n}\n\n// ─── Styles ───────────────────────────────────────────────────\n\nconst wrapperStyle: CSSProperties = {\n position: 'relative',\n display: 'inline-block',\n};\n\nconst detailsStyle: CSSProperties = {\n position: 'absolute',\n top: '100%',\n left: 0,\n marginTop: '4px',\n minWidth: '280px',\n maxWidth: '400px',\n backgroundColor: '#ffffff',\n border: '1px solid #e5e7eb',\n borderRadius: '6px',\n boxShadow: '0 2px 8px rgba(0, 0, 0, 0.12)',\n fontFamily:\n 'ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace',\n fontSize: '12px',\n zIndex: 9998,\n overflow: 'hidden',\n};\n\nconst detailItemStyle: CSSProperties = {\n padding: '6px 10px',\n borderBottom: '1px solid #f3f4f6',\n};\n\n// ─── Component ────────────────────────────────────────────────\n\n/**\n * Per-block indicator badge for blocks that have diagnostics.\n * Displays a small color-coded icon; click to expand inline details.\n */\nexport function BlockDiagnosticIndicator({\n diagnostics,\n}: BlockDiagnosticIndicatorProps): ReactNode {\n const [expanded, setExpanded] = useState(false);\n\n const toggle = useCallback(() => {\n setExpanded((prev) => !prev);\n }, []);\n\n if (diagnostics.length === 0) {\n return null;\n }\n\n const severity = highestSeverity(diagnostics);\n const color = severityColors[severity];\n const icon = severityIcons[severity];\n\n const badgeStyle: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '20px',\n height: '20px',\n borderRadius: '50%',\n backgroundColor: color,\n color: '#ffffff',\n fontSize: '11px',\n fontWeight: 700,\n cursor: 'pointer',\n border: 'none',\n lineHeight: 1,\n padding: 0,\n };\n\n return (\n <span style={wrapperStyle} data-glyph-diagnostic-indicator>\n <button\n type=\"button\"\n style={badgeStyle}\n onClick={toggle}\n aria-label={`${String(diagnostics.length)} diagnostic${diagnostics.length > 1 ? 's' : ''}`}\n aria-expanded={expanded}\n title={`${String(diagnostics.length)} diagnostic${diagnostics.length > 1 ? 's' : ''}`}\n >\n {icon}\n </button>\n\n {expanded && (\n <div style={detailsStyle} role=\"tooltip\">\n {diagnostics.map((diagnostic, index) => {\n const dColor = severityColors[diagnostic.severity];\n const bg = severityBackgrounds[diagnostic.severity];\n const dIcon = severityIcons[diagnostic.severity];\n const pos = formatPosition(diagnostic);\n\n return (\n <div\n key={`${diagnostic.code}-${String(index)}`}\n style={{ ...detailItemStyle, backgroundColor: bg }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n }}\n >\n <span style={{ color: dColor, fontWeight: 700 }}>\n {dIcon}\n </span>\n <span style={{ color: dColor, fontWeight: 600 }}>\n {diagnostic.severity}\n </span>\n {diagnostic.code && (\n <span style={{ color: '#6b7280', fontSize: '10px' }}>\n [{diagnostic.code}]\n </span>\n )}\n </div>\n <div\n style={{\n color: '#1f2937',\n marginTop: '2px',\n lineHeight: '1.4',\n }}\n >\n {diagnostic.message}\n </div>\n {pos && (\n <div style={{ color: '#9ca3af', fontSize: '10px', marginTop: '2px' }}>\n at {pos}\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n </span>\n );\n}\n","import { useEffect, useRef } from 'react';\nimport type { ReactNode } from 'react';\n\ninterface ContainerMeasureProps {\n children: ReactNode;\n /** Stable callback invoked with the container's content width in px. */\n onMeasure: (width: number) => void;\n}\n\n/**\n * Wraps children in a block-level div and reports its content width\n * via ResizeObserver. The wrapper uses `width: 100%` and does not\n * alter the layout of its children.\n *\n * `onMeasure` should be a stable reference (e.g. a `setState` setter)\n * to avoid unnecessary observer teardown/setup.\n */\nexport function ContainerMeasure({ children, onMeasure }: ContainerMeasureProps): ReactNode {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n if (entry.contentRect.width > 0) {\n onMeasure(entry.contentRect.width);\n }\n }\n });\n\n // Fire initial measurement synchronously\n onMeasure(el.clientWidth);\n observer.observe(el);\n\n return () => observer.disconnect();\n }, [onMeasure]);\n\n return (\n <div ref={ref} style={{ width: '100%' }}>\n {children}\n </div>\n );\n}\n","import type { ContainerTier } from '@glyphjs/types';\n\n// ─── Breakpoint Thresholds ───────────────────────────────────\n// 16px hysteresis dead zone prevents layout thrashing when the\n// container width hovers near a boundary.\n\nconst COMPACT_UP = 500;\nconst COMPACT_DOWN = 484; // 500 - 16\nconst WIDE_UP = 900;\nconst WIDE_DOWN = 884; // 900 - 16\n\n/**\n * Resolves the container tier from a measured width with hysteresis.\n *\n * When growing, transitions use the higher threshold (500, 900).\n * When shrinking, transitions use the lower threshold (484, 884).\n * A width of 0 (not yet measured) defaults to `'wide'`.\n */\nexport function resolveTier(width: number, previous: ContainerTier): ContainerTier {\n if (width === 0) return 'wide';\n\n switch (previous) {\n case 'compact':\n if (width >= WIDE_UP) return 'wide';\n if (width >= COMPACT_UP) return 'standard';\n return 'compact';\n case 'standard':\n if (width >= WIDE_UP) return 'wide';\n if (width < COMPACT_DOWN) return 'compact';\n return 'standard';\n case 'wide':\n if (width < COMPACT_DOWN) return 'compact';\n if (width < WIDE_DOWN) return 'standard';\n return 'wide';\n }\n}\n","import { useCallback, useMemo, useRef, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport type {\n Block,\n ContainerContext,\n ContainerTier,\n Diagnostic,\n GlyphIR,\n AnimationConfig,\n} from '@glyphjs/types';\nimport { BlockRenderer } from './BlockRenderer.js';\nimport { LayoutProvider } from './layout/LayoutProvider.js';\nimport { DocumentLayout } from './layout/DocumentLayout.js';\nimport { DashboardLayout } from './layout/DashboardLayout.js';\nimport { PresentationLayout } from './layout/PresentationLayout.js';\nimport { AnimationProvider } from './animation/AnimationProvider.js';\nimport { DiagnosticsOverlay } from './diagnostics/index.js';\nimport { ContainerMeasure } from './container/ContainerMeasure.js';\nimport { resolveTier } from './container/breakpoints.js';\n\n// ─── Props ────────────────────────────────────────────────────\n\ninterface GlyphDocumentProps {\n ir: GlyphIR;\n className?: string;\n animation?: AnimationConfig;\n diagnostics?: Diagnostic[];\n}\n\n// ─── Component ────────────────────────────────────────────────\n\n/**\n * Renders a complete GlyphIR document.\n * Selects the appropriate layout component based on `ir.layout.mode`\n * and renders each block via `BlockRenderer`.\n * Expects to be wrapped in a `RuntimeProvider` (either directly\n * or via the `createGlyphRuntime()` factory).\n */\nexport function GlyphDocument({\n ir,\n className,\n animation,\n diagnostics,\n}: GlyphDocumentProps): ReactNode {\n const { layout, blocks } = ir;\n\n // Container measurement with hysteresis\n const [containerWidth, setContainerWidth] = useState(0);\n const tierRef = useRef<ContainerTier>('wide');\n const containerTier = useMemo(() => {\n const next = resolveTier(containerWidth, tierRef.current);\n tierRef.current = next;\n return next;\n }, [containerWidth]);\n const container: ContainerContext = useMemo(\n () => ({ width: containerWidth, tier: containerTier }),\n [containerWidth, containerTier],\n );\n\n const renderBlock = useCallback(\n (block: Block, index: number): ReactNode => (\n <BlockRenderer\n key={block.id}\n block={block}\n layout={layout}\n index={index}\n container={container}\n />\n ),\n [layout, container],\n );\n\n let content: ReactNode;\n\n switch (layout.mode) {\n case 'dashboard':\n content = <DashboardLayout blocks={blocks} layout={layout} renderBlock={renderBlock} />;\n break;\n\n case 'presentation':\n content = <PresentationLayout blocks={blocks} renderBlock={renderBlock} />;\n break;\n\n case 'document':\n default:\n content = <DocumentLayout blocks={blocks} layout={layout} renderBlock={renderBlock} />;\n break;\n }\n\n return (\n <AnimationProvider config={animation}>\n <LayoutProvider layout={layout}>\n <ContainerMeasure onMeasure={setContainerWidth}>\n <div className={className} data-glyph-document={ir.id}>\n {content}\n {diagnostics && diagnostics.length > 0 && (\n <DiagnosticsOverlay diagnostics={diagnostics} />\n )}\n </div>\n </ContainerMeasure>\n </LayoutProvider>\n </AnimationProvider>\n );\n}\n","import { useState, useCallback, useMemo } from 'react';\nimport type { ReactNode } from 'react';\nimport type {\n GlyphIR,\n GlyphTheme,\n GlyphRuntimeConfig,\n GlyphRuntime,\n GlyphComponentDefinition,\n} from '@glyphjs/types';\nimport { ComponentRegistry } from './registry.js';\nimport { RuntimeProvider } from './context.js';\nimport { GlyphDocument } from './GlyphDocument.js';\n\n// ─── Wrapped document with provider ──────────────────────────\n\ninterface WrappedDocumentProps {\n ir: GlyphIR;\n className?: string;\n}\n\n/**\n * Creates a fully configured Glyph runtime instance.\n *\n * Returns a `GlyphRuntime` object containing:\n * - `GlyphDocument` — A React component pre-wired with the config\n * - `registerComponent()` — Dynamically add component definitions\n * - `setTheme()` — Update the theme (triggers re-render)\n */\nexport function createGlyphRuntime(config: GlyphRuntimeConfig): GlyphRuntime {\n // Create the component registry\n const registry = new ComponentRegistry();\n\n // Pre-register components from config\n if (config.components) {\n registry.registerAll(config.components);\n }\n\n // Store overrides\n if (config.overrides) {\n registry.setOverrides(config.overrides);\n }\n\n // Mutable state container shared between the factory and the React tree.\n // React state hooks inside WrappedDocument drive re-renders when these change.\n let currentTheme = config.theme;\n let registryVersion = 0;\n const listeners = new Set<() => void>();\n\n function notify(): void {\n for (const listener of listeners) {\n listener();\n }\n }\n\n // The wrapped document component that includes RuntimeProvider\n function WrappedDocument({ ir, className }: WrappedDocumentProps): ReactNode {\n const [theme, setThemeState] = useState(currentTheme);\n const [, setVersion] = useState(registryVersion);\n\n // Subscribe to external mutations (registerComponent, setTheme)\n const forceUpdate = useCallback(() => {\n setThemeState(currentTheme);\n setVersion(registryVersion);\n }, []);\n\n // Register and unregister listener on mount/unmount\n useMemo(() => {\n listeners.add(forceUpdate);\n return () => {\n listeners.delete(forceUpdate);\n };\n }, [forceUpdate]);\n\n return (\n <RuntimeProvider\n registry={registry}\n references={ir.references}\n theme={theme}\n onDiagnostic={config.onDiagnostic}\n onNavigate={config.onNavigate}\n >\n <GlyphDocument ir={ir} className={className} animation={config.animation} />\n </RuntimeProvider>\n );\n }\n\n return {\n GlyphDocument: WrappedDocument,\n\n registerComponent(definition: GlyphComponentDefinition): void {\n registry.registerComponent(definition);\n registryVersion++;\n notify();\n },\n\n setTheme(theme: 'light' | 'dark' | GlyphTheme): void {\n currentTheme = theme;\n notify();\n },\n };\n}\n","import { useState, useEffect } from 'react';\n\n/**\n * Returns `true` once the component has mounted on the client.\n *\n * During server-side rendering (SSR) and the initial client render\n * before hydration completes, this returns `false`. After the first\n * `useEffect` fires (client only), it flips to `true`.\n *\n * Use this to gate browser-only code paths (e.g. D3 rendering,\n * ResizeObserver, window access) so they are skipped during SSR.\n */\nexport function useIsClient(): boolean {\n const [isClient, setIsClient] = useState(false);\n useEffect(() => {\n setIsClient(true);\n }, []);\n return isClient;\n}\n","import type { CSSProperties, ReactNode } from 'react';\nimport { useIsClient } from './useIsClient.js';\n\n// ─── Props ────────────────────────────────────────────────────\n\nexport interface SSRPlaceholderProps {\n /** Width of the placeholder element (CSS value). Defaults to `'100%'`. */\n width?: string | number;\n /** Height of the placeholder element (CSS value). Defaults to `300`. */\n height?: string | number;\n /** Optional CSS class name applied to both the placeholder and wrapper. */\n className?: string;\n /** Content to render once the component has mounted on the client. */\n children: ReactNode;\n}\n\n// ─── Component ────────────────────────────────────────────────\n\n/**\n * Renders a lightweight placeholder `<div>` during server-side rendering\n * and on the initial client render (before hydration completes).\n * Once `useEffect` fires on the client, the placeholder is replaced\n * with the provided `children`.\n *\n * This is useful for wrapping components that rely on browser-only APIs\n * (e.g. D3 charts, Canvas, ResizeObserver) so that `renderToString`\n * produces valid, non-crashing HTML with the correct dimensions reserved.\n *\n * @example\n * ```tsx\n * <SSRPlaceholder width=\"100%\" height={400}>\n * <Chart data={chartData} />\n * </SSRPlaceholder>\n * ```\n */\nexport function SSRPlaceholder({\n width = '100%',\n height = 300,\n className,\n children,\n}: SSRPlaceholderProps): ReactNode {\n const isClient = useIsClient();\n\n if (!isClient) {\n const style: CSSProperties = {\n width,\n height,\n // Subtle background so the reserved space is visible in the layout\n backgroundColor: 'var(--glyph-ssr-placeholder-bg, #f0f0f0)',\n };\n\n return (\n <div\n className={className}\n style={style}\n data-ssr-placeholder=\"true\"\n aria-hidden=\"true\"\n />\n );\n }\n\n return <>{children}</>;\n}\n"]}