@riverbankcms/sdk 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +4840 -9
- package/dist/cli/index.js.map +1 -1
- package/dist/client/bookings.d.mts +82 -2
- package/dist/client/bookings.d.ts +82 -2
- package/dist/client/bookings.js +1623 -3
- package/dist/client/bookings.js.map +1 -1
- package/dist/client/bookings.mjs +1610 -5
- package/dist/client/bookings.mjs.map +1 -1
- package/dist/client/client.d.mts +8 -5
- package/dist/client/client.d.ts +8 -5
- package/dist/client/client.js +16873 -322
- package/dist/client/client.js.map +1 -1
- package/dist/client/client.mjs +16855 -307
- package/dist/client/client.mjs.map +1 -1
- package/dist/client/hooks.d.mts +10 -7
- package/dist/client/hooks.d.ts +10 -7
- package/dist/client/hooks.js +5074 -4
- package/dist/client/hooks.js.map +1 -1
- package/dist/client/hooks.mjs +5074 -4
- package/dist/client/hooks.mjs.map +1 -1
- package/dist/client/rendering/client.d.mts +7 -1
- package/dist/client/rendering/client.d.ts +7 -1
- package/dist/client/rendering/client.js +17388 -2
- package/dist/client/rendering/client.js.map +1 -1
- package/dist/client/rendering/client.mjs +17382 -2
- package/dist/client/rendering/client.mjs.map +1 -1
- package/dist/client/resolver-BhueZVxZ.d.mts +61 -0
- package/dist/client/resolver-BhueZVxZ.d.ts +61 -0
- package/dist/client/usePage-BBcFCxOU.d.ts +6297 -0
- package/dist/client/usePage-BydHcMYB.d.mts +6297 -0
- package/dist/client/usePage-CrKw1H6Y.d.ts +6338 -0
- package/dist/client/usePage-DMI8ImsU.d.mts +6338 -0
- package/dist/server/Layout-BM_KmCxO.d.ts +44 -0
- package/dist/server/Layout-CsAQ-0Fv.d.mts +44 -0
- package/dist/server/{chunk-JB4LIEFS.js → chunk-5R4NMVXA.js} +15 -8
- package/dist/server/chunk-5R4NMVXA.js.map +1 -0
- package/dist/server/{chunk-ADREPXFU.js → chunk-62ZJI564.js} +3 -3
- package/dist/server/{chunk-ADREPXFU.js.map → chunk-62ZJI564.js.map} +1 -1
- package/dist/server/chunk-7DS4Q3GA.mjs +333 -0
- package/dist/server/chunk-7DS4Q3GA.mjs.map +1 -0
- package/dist/server/chunk-BJTO5JO5.mjs +11 -0
- package/dist/server/{chunk-4Z5FBFRL.mjs → chunk-BPKYRPCQ.mjs} +7 -3
- package/dist/server/{chunk-4Z5FBFRL.mjs.map → chunk-BPKYRPCQ.mjs.map} +1 -1
- package/dist/server/chunk-DGUM43GV.js +11 -0
- package/dist/server/chunk-DGUM43GV.js.map +1 -0
- package/dist/server/chunk-EGTDJ4PL.js +5461 -0
- package/dist/server/chunk-EGTDJ4PL.js.map +1 -0
- package/dist/server/chunk-FK64TZBT.mjs +831 -0
- package/dist/server/chunk-FK64TZBT.mjs.map +1 -0
- package/dist/server/chunk-HOY77YBF.js +333 -0
- package/dist/server/chunk-HOY77YBF.js.map +1 -0
- package/dist/server/chunk-INWKF3IC.js +831 -0
- package/dist/server/chunk-INWKF3IC.js.map +1 -0
- package/dist/server/{chunk-2RW5HAQQ.mjs → chunk-JTAERCX2.mjs} +2 -2
- package/dist/server/chunk-O5DC7MYW.mjs +9606 -0
- package/dist/server/chunk-O5DC7MYW.mjs.map +1 -0
- package/dist/server/{chunk-PEAXKTDU.mjs → chunk-OP2GHK27.mjs} +2 -2
- package/dist/server/{chunk-WKG57P2H.mjs → chunk-PN3CHDVX.mjs} +10 -3
- package/dist/server/{chunk-WKG57P2H.mjs.map → chunk-PN3CHDVX.mjs.map} +1 -1
- package/dist/server/chunk-QFFQTOY3.mjs +2128 -0
- package/dist/server/chunk-QFFQTOY3.mjs.map +1 -0
- package/dist/server/chunk-SF63XAX7.js +9606 -0
- package/dist/server/chunk-SF63XAX7.js.map +1 -0
- package/dist/server/{chunk-F472SMKX.js → chunk-TO7FD6TQ.js} +4 -4
- package/dist/server/{chunk-F472SMKX.js.map → chunk-TO7FD6TQ.js.map} +1 -1
- package/dist/server/chunk-UFVCBGBY.js +2128 -0
- package/dist/server/chunk-UFVCBGBY.js.map +1 -0
- package/dist/server/chunk-USQF2XTU.mjs +5461 -0
- package/dist/server/chunk-USQF2XTU.mjs.map +1 -0
- package/dist/server/{chunk-SW7LE4M3.js → chunk-XLVL5WPH.js} +12 -8
- package/dist/server/chunk-XLVL5WPH.js.map +1 -0
- package/dist/server/components-CI3JiOYA.d.mts +305 -0
- package/dist/server/components-DJBLu_yc.d.ts +305 -0
- package/dist/server/components.d.mts +14 -49
- package/dist/server/components.d.ts +14 -49
- package/dist/server/components.js +7 -4
- package/dist/server/components.js.map +1 -1
- package/dist/server/components.mjs +9 -6
- package/dist/server/components.mjs.map +1 -1
- package/dist/server/config-validation.d.mts +2 -2
- package/dist/server/config-validation.d.ts +2 -2
- package/dist/server/config-validation.js +6 -3
- package/dist/server/config-validation.js.map +1 -1
- package/dist/server/config-validation.mjs +5 -2
- package/dist/server/config.d.mts +3 -3
- package/dist/server/config.d.ts +3 -3
- package/dist/server/config.js +6 -3
- package/dist/server/config.js.map +1 -1
- package/dist/server/config.mjs +5 -2
- package/dist/server/config.mjs.map +1 -1
- package/dist/server/data.d.mts +10 -8
- package/dist/server/data.d.ts +10 -8
- package/dist/server/data.js +4 -2
- package/dist/server/data.js.map +1 -1
- package/dist/server/data.mjs +3 -1
- package/dist/server/{index-B0yI_V6Z.d.mts → index-DoX3ELQn.d.mts} +1 -1
- package/dist/server/{index-C6M0Wfjq.d.ts → index-Dus2gkY6.d.ts} +1 -1
- package/dist/server/index.d.mts +1568 -5
- package/dist/server/index.d.ts +1568 -5
- package/dist/server/index.js +4 -4
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +4 -4
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/{loadContent-CJcbYF3J.d.ts → loadContent-CdXDGsJM.d.ts} +5 -4
- package/dist/server/{loadContent-zhlL4YSE.d.mts → loadContent-v2n6pOlO.d.mts} +5 -4
- package/dist/server/loadPage-3ECPF426.js +11 -0
- package/dist/server/loadPage-3ECPF426.js.map +1 -0
- package/dist/server/loadPage-LW273NYO.mjs +11 -0
- package/dist/server/loadPage-LW273NYO.mjs.map +1 -0
- package/dist/server/{loadPage-CCf15nt8.d.mts → loadPage-bejlajm9.d.ts} +147 -5
- package/dist/server/{loadPage-BYmVMk0V.d.ts → loadPage-en10WQrt.d.mts} +147 -5
- package/dist/server/metadata.d.mts +10 -6
- package/dist/server/metadata.d.ts +10 -6
- package/dist/server/metadata.js +3 -1
- package/dist/server/metadata.js.map +1 -1
- package/dist/server/metadata.mjs +2 -0
- package/dist/server/metadata.mjs.map +1 -1
- package/dist/server/navigation.d.mts +100 -0
- package/dist/server/navigation.d.ts +100 -0
- package/dist/server/navigation.js +44 -0
- package/dist/server/navigation.js.map +1 -0
- package/dist/server/navigation.mjs +44 -0
- package/dist/server/navigation.mjs.map +1 -0
- package/dist/server/rendering/server.d.mts +10 -7
- package/dist/server/rendering/server.d.ts +10 -7
- package/dist/server/rendering/server.js +7 -4
- package/dist/server/rendering/server.js.map +1 -1
- package/dist/server/rendering/server.mjs +6 -3
- package/dist/server/rendering.d.mts +173 -9
- package/dist/server/rendering.d.ts +173 -9
- package/dist/server/rendering.js +12 -9
- package/dist/server/rendering.js.map +1 -1
- package/dist/server/rendering.mjs +14 -11
- package/dist/server/rendering.mjs.map +1 -1
- package/dist/server/routing.d.mts +10 -6
- package/dist/server/routing.d.ts +10 -6
- package/dist/server/routing.js +4 -2
- package/dist/server/routing.js.map +1 -1
- package/dist/server/routing.mjs +3 -1
- package/dist/server/routing.mjs.map +1 -1
- package/dist/server/schema-Bpy9N5ZI.d.mts +1870 -0
- package/dist/server/schema-Bpy9N5ZI.d.ts +1870 -0
- package/dist/server/server.d.mts +12 -8
- package/dist/server/server.d.ts +12 -8
- package/dist/server/server.js +7 -5
- package/dist/server/server.js.map +1 -1
- package/dist/server/server.mjs +6 -4
- package/dist/server/theme-bridge.js +13 -10
- package/dist/server/theme-bridge.js.map +1 -1
- package/dist/server/theme-bridge.mjs +10 -7
- package/dist/server/theme-bridge.mjs.map +1 -1
- package/dist/server/theme.js +3 -1
- package/dist/server/theme.js.map +1 -1
- package/dist/server/theme.mjs +2 -0
- package/dist/server/theme.mjs.map +1 -1
- package/dist/server/{types-BCeqWtI2.d.mts → types-Bq3520hK.d.mts} +3 -3
- package/dist/server/{types-C6gmRHLe.d.mts → types-CLusapsM.d.mts} +1 -1
- package/dist/server/types-Cc7lyPkN.d.ts +4043 -0
- package/dist/server/{types-BCeqWtI2.d.ts → types-D-rqOU5I.d.ts} +3 -3
- package/dist/server/{types-C6gmRHLe.d.ts → types-Ls6BkLKg.d.ts} +1 -1
- package/dist/server/{types-Bbo01M7P.d.mts → types-_nDnPHpv.d.mts} +27 -1
- package/dist/server/{types-Bbo01M7P.d.ts → types-_nDnPHpv.d.ts} +27 -1
- package/dist/server/types-nVerjjdv.d.mts +4043 -0
- package/package.json +22 -17
- package/dist/server/chunk-3KKZVGH4.mjs +0 -179
- package/dist/server/chunk-3KKZVGH4.mjs.map +0 -1
- package/dist/server/chunk-4Z3GPTCS.js +0 -179
- package/dist/server/chunk-4Z3GPTCS.js.map +0 -1
- package/dist/server/chunk-JB4LIEFS.js.map +0 -1
- package/dist/server/chunk-QQ6U4QX6.js +0 -120
- package/dist/server/chunk-QQ6U4QX6.js.map +0 -1
- package/dist/server/chunk-R5YGLRUG.mjs +0 -122
- package/dist/server/chunk-R5YGLRUG.mjs.map +0 -1
- package/dist/server/chunk-SW7LE4M3.js.map +0 -1
- package/dist/server/chunk-W3K7LVPS.mjs +0 -120
- package/dist/server/chunk-W3K7LVPS.mjs.map +0 -1
- package/dist/server/chunk-YHEZMVTS.js +0 -122
- package/dist/server/chunk-YHEZMVTS.js.map +0 -1
- package/dist/server/loadPage-DVH3DW6E.js +0 -9
- package/dist/server/loadPage-DVH3DW6E.js.map +0 -1
- package/dist/server/loadPage-PHQZ6XQZ.mjs +0 -9
- /package/dist/server/{loadPage-PHQZ6XQZ.mjs.map → chunk-BJTO5JO5.mjs.map} +0 -0
- /package/dist/server/{chunk-2RW5HAQQ.mjs.map → chunk-JTAERCX2.mjs.map} +0 -0
- /package/dist/server/{chunk-PEAXKTDU.mjs.map → chunk-OP2GHK27.mjs.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/rendering/hooks/usePage.ts","../../src/data/prefetchBlockData.ts","../../src/rendering/hooks/useContent.ts","../../src/rendering/components/Page.tsx","../../src/client/index.ts","../../src/client/cache.ts"],"sourcesContent":["/**\n * Client-side React hook to fetch page data.\n *\n * Use this in client components for dynamic page loading.\n */\n\nimport { useState, useEffect } from 'react';\nimport type { RiverbankClient } from '../../client/types';\nimport type { PageProps } from '../components/Page';\nimport type { RuntimeSdkConfig } from '../helpers/loadPage';\nimport { prefetchBlockData } from '../../data/prefetchBlockData';\n\nexport type UsePageParams = {\n client: RiverbankClient;\n siteId: string;\n path: string;\n pageId?: string;\n /**\n * If true, fetches draft/unpublished content instead of published content.\n * This affects both the page structure and block data loaders.\n * Requires API key with site access.\n *\n * @default false\n */\n preview?: boolean;\n};\n\nexport type UsePageResult =\n | { loading: true; error: null; page: null; theme: null; siteId: string; resolvedData: null; sdkConfig: null }\n | { loading: false; error: Error; page: null; theme: null; siteId: string; resolvedData: null; sdkConfig: null }\n | { loading: false; error: null; sdkConfig: RuntimeSdkConfig | null } & Omit<PageProps, 'registry' | 'wrapBlock' | 'usePlaceholders' | 'sdkConfig'>;\n\n/**\n * Client-side React hook to fetch all data needed for <Page> component.\n *\n * Fetches site data, page data, and prefetches block data loaders.\n * Returns loading and error states for proper UI handling.\n *\n * IMPORTANT: The client object should be stable across renders to avoid\n * unnecessary re-fetches. Create it outside your component or use useMemo:\n *\n * ```tsx\n * // ✅ Good - stable reference\n * const client = useMemo(\n * () => createRiverbankClient({ apiKey, baseUrl }),\n * [apiKey, baseUrl]\n * );\n *\n * // ❌ Bad - new client on every render (causes infinite loops)\n * const client = createRiverbankClient({ apiKey, baseUrl });\n * ```\n *\n * @example Basic usage\n * ```tsx\n * import { createRiverbankClient } from '@riverbankcms/sdk';\n * import { usePage, Page } from '@riverbankcms/sdk/rendering';\n *\n * const client = createRiverbankClient({\n * apiKey: process.env.NEXT_PUBLIC_RIVERBANK_API_KEY!,\n * baseUrl: process.env.NEXT_PUBLIC_DASHBOARD_URL + '/api',\n * });\n *\n * function MyPage({ path }: { path: string }) {\n * const pageData = usePage({ client, siteId: 'site-123', path });\n *\n * if (pageData.loading) {\n * return <div>Loading...</div>;\n * }\n *\n * if (pageData.error) {\n * return <div>Error: {pageData.error.message}</div>;\n * }\n *\n * return <Page {...pageData} />;\n * }\n * ```\n *\n * @example With custom loading/error states\n * ```tsx\n * function MyPage({ path }: { path: string }) {\n * const pageData = usePage({ client, siteId: 'site-123', path });\n *\n * if (pageData.loading) {\n * return <Skeleton />;\n * }\n *\n * if (pageData.error) {\n * return (\n * <ErrorBoundary\n * error={pageData.error}\n * onRetry={() => window.location.reload()}\n * />\n * );\n * }\n *\n * return <Page {...pageData} />;\n * }\n * ```\n */\nexport function usePage(params: UsePageParams): UsePageResult {\n const { client, siteId, path, pageId, preview = false } = params;\n\n const [result, setResult] = useState<UsePageResult>({\n loading: true,\n error: null,\n page: null,\n theme: null,\n siteId,\n resolvedData: null,\n sdkConfig: null,\n });\n\n useEffect(() => {\n let cancelled = false;\n\n async function fetchPage() {\n try {\n // Fetch site and page data in parallel\n const [site, pageResponse] = await Promise.all([\n client.getSite({ id: siteId }),\n client.getPage({ siteId, path, preview }),\n ]);\n\n // If component unmounted, don't update state\n if (cancelled) return;\n\n // Extract page data (getContentByPath can return page or entry)\n if ('entry' in pageResponse) {\n throw new Error(\n 'This path resolves to a content entry, not a page. ' +\n 'Use useContent() instead, which handles both pages and entries. ' +\n 'For entries, useContent() returns the raw entry data for custom rendering.'\n );\n }\n\n const { page: pageData } = pageResponse;\n\n // Convert API response blocks to PageOutline format\n // API returns blocks with full content, but PageOutline only needs structure\n const blocks = pageData.blocks.map((block) => {\n if (!block || typeof block !== 'object') {\n throw new Error('Invalid block format in API response');\n }\n if (typeof block.id !== 'string' && block.id !== null) {\n throw new Error(`Invalid block id: expected string or null, got ${typeof block.id}`);\n }\n if (typeof block.kind !== 'string') {\n throw new Error(`Invalid block kind: expected string, got ${typeof block.kind}`);\n }\n if (typeof block.purpose !== 'string') {\n throw new Error(`Invalid block purpose: expected string, got ${typeof block.purpose}`);\n }\n return {\n id: block.id,\n kind: block.kind,\n purpose: block.purpose,\n };\n });\n\n const pageOutline = {\n name: pageData.name,\n path: pageData.path,\n purpose: pageData.purpose,\n blocks,\n };\n\n // Prefetch block data loaders\n const resolvedData = await prefetchBlockData(\n pageOutline,\n {\n siteId,\n pageId: pageId ?? pageData.id,\n previewStage: preview ? 'preview' : 'published',\n },\n client\n );\n\n // If component unmounted, don't update state\n if (cancelled) return;\n\n setResult({\n loading: false,\n error: null,\n page: pageOutline,\n theme: site.theme,\n siteId,\n resolvedData,\n sdkConfig: site.sdkConfig ?? null,\n });\n } catch (error) {\n if (cancelled) return;\n\n setResult({\n loading: false,\n error: error instanceof Error ? error : new Error(String(error)),\n page: null,\n theme: null,\n siteId,\n resolvedData: null,\n sdkConfig: null,\n });\n }\n }\n\n fetchPage();\n\n return () => {\n cancelled = true;\n };\n }, [client, siteId, path, pageId, preview]);\n\n return result;\n}\n","/**\n * SDK wrapper for block data prefetching.\n * Uses the shared core implementation from @riverbankcms/blocks with the SDK client.\n */\n\nimport type { BlockDataLoader, PageOutline, SdkCustomBlock } from '@riverbankcms/blocks';\nimport { prefetchBlockData as prefetchBlockDataCore } from '@riverbankcms/blocks/system/data';\nimport type { PrefetchContext, ResolvedBlockData } from '@riverbankcms/blocks/system/data';\nimport type { RiverbankClient } from '../client/types';\n\nexport type { PrefetchContext, ResolvedBlockData };\n\n/**\n * Supported loader endpoints for SDK data fetching.\n * Only these endpoints can be used in block data loaders when using the SDK.\n *\n * This is the SINGLE SOURCE OF TRUTH for whitelisted endpoints.\n * - Zod validation schema derives from this array\n * - TypeScript types derive from this array\n * - Runtime validation uses this array\n */\nexport const SUPPORTED_LOADER_ENDPOINTS = [\n 'listPublishedEntries',\n 'getPublishedEntryPreview',\n 'listPublicEvents',\n 'getPublicFormById',\n 'getPublicBookingServices',\n] as const;\n\n/**\n * Union type of all supported loader endpoints.\n * Derived from SUPPORTED_LOADER_ENDPOINTS array.\n */\nexport type SupportedLoaderEndpoint = typeof SUPPORTED_LOADER_ENDPOINTS[number];\n\n/**\n * Options for SDK block data prefetching.\n */\nexport type SdkPrefetchOptions = {\n /**\n * SDK custom blocks from site config.\n * Used to look up data loaders for custom.* blocks.\n */\n customBlocks?: SdkCustomBlock[];\n};\n\n/**\n * Prefetch block data for SDK-based applications.\n * Maps loader endpoints to corresponding SDK client methods.\n *\n * Supports both system blocks and SDK custom blocks with data loaders.\n *\n * @example\n * ```typescript\n * import { createRiverbankClient } from '@riverbankcms/sdk';\n * import { prefetchBlockData } from '@riverbankcms/sdk/data';\n *\n * const client = createRiverbankClient({ apiKey, baseUrl });\n * const page = await client.getPage({ siteId, path: '/' });\n *\n * // Basic usage (system blocks only)\n * const blockData = await prefetchBlockData(page.outline, {\n * siteId: page.siteId,\n * pageId: page.id,\n * }, client);\n *\n * // With custom blocks from SDK config\n * const blockData = await prefetchBlockData(page.outline, context, client, {\n * customBlocks: site.sdkConfig?.customBlocks,\n * });\n * ```\n */\nexport async function prefetchBlockData(\n page: PageOutline,\n context: PrefetchContext,\n client: RiverbankClient,\n options?: SdkPrefetchOptions,\n): Promise<ResolvedBlockData> {\n const { customBlocks } = options ?? {};\n\n // Build lookup map for custom block loaders\n // Key is string (blockKind from page) matching block.id (custom.xxx)\n const customBlockMap = new Map<string, SdkCustomBlock>(\n (customBlocks ?? []).map((block) => [block.id as string, block])\n );\n\n return prefetchBlockDataCore(page, context, {\n apiClient: async ({ endpoint, params }) => {\n // Only support whitelisted loader endpoints\n if (!isSupportedEndpoint(endpoint)) {\n throw new Error(\n `Unsupported loader endpoint: ${endpoint}. ` +\n `SDK only supports: ${SUPPORTED_LOADER_ENDPOINTS.join(', ')}`\n );\n }\n\n // Map endpoint to SDK client method\n switch (endpoint) {\n case 'listPublishedEntries': {\n const { siteId, type, orderBy, limit, stage, mode, entryIds } = params ?? {};\n if (!siteId || !type) {\n throw new Error('listPublishedEntries requires siteId and type params');\n }\n\n // Parse limit if provided (can come as string from bindings)\n const parsedLimit = typeof limit === 'string'\n ? Number.parseInt(limit, 10)\n : typeof limit === 'number'\n ? limit\n : undefined;\n\n // Map orderBy to order param (matching embed block field values)\n const order = (orderBy === 'newest' || orderBy === 'oldest' || orderBy === 'title' || orderBy === 'order')\n ? orderBy as 'newest' | 'oldest' | 'title' | 'order'\n : undefined;\n\n // Extract entry IDs for manual mode\n // entryIds comes from binding to entries field which contains { entryId: \"uuid\" } objects\n let parsedEntryIds: string[] | undefined;\n if (mode === 'manual' && Array.isArray(entryIds)) {\n parsedEntryIds = entryIds\n .map((item: unknown) => {\n if (typeof item === 'object' && item !== null && 'entryId' in item) {\n return (item as { entryId: string }).entryId;\n }\n // Also support direct string IDs\n if (typeof item === 'string') {\n return item;\n }\n return null;\n })\n .filter((id): id is string => id !== null);\n }\n\n return await client.getEntries({\n siteId,\n contentType: type,\n limit: parsedLimit,\n order,\n preview: stage === 'preview',\n // Manual mode - pass entry IDs for hydration\n mode: mode === 'manual' ? 'manual' : undefined,\n entryIds: parsedEntryIds,\n });\n }\n\n case 'getPublishedEntryPreview': {\n const { siteId, type, slug } = params ?? {};\n if (!siteId || !type || !slug) {\n throw new Error('getPublishedEntryPreview requires siteId, type, and slug params');\n }\n return await client.getEntry({ siteId, contentType: type, slug });\n }\n case 'listPublicEvents': {\n const { siteId, limit, from, to, stage } = params ?? {};\n if (!siteId) {\n throw new Error('listPublicEvents requires siteId param');\n }\n const parsedLimit =\n typeof limit === 'string'\n ? Number.parseInt(limit, 10)\n : typeof limit === 'number'\n ? limit\n : undefined;\n return await client.listPublicEvents({ siteId, limit: parsedLimit, from, to, stage });\n }\n case 'getPublicFormById': {\n const { formId } = params ?? {};\n if (!formId) {\n throw new Error('getPublicFormById requires formId param');\n }\n return await client.getPublicFormById({ formId });\n }\n case 'getPublicBookingServices': {\n const { siteId, ids } = params ?? {};\n if (!siteId) {\n throw new Error('getPublicBookingServices requires siteId param');\n }\n return await client.getPublicBookingServices({ siteId, ids });\n }\n\n default: {\n // TypeScript should never reach here due to isSupportedEndpoint check\n const _exhaustive: never = endpoint;\n throw new Error(`Unhandled endpoint: ${_exhaustive}`);\n }\n }\n },\n isValidEndpoint: isSupportedEndpoint,\n onError: (error, { block, loader }) => {\n console.warn('[prefetchBlockData] failed to prefetch block data', {\n block,\n loader,\n error,\n });\n },\n // Provide custom block loader lookup for SDK custom blocks\n getCustomBlockLoaders: (blockKind): Record<string, BlockDataLoader> | undefined => {\n const customBlock = customBlockMap.get(blockKind);\n if (!customBlock?.dataLoaders) return undefined;\n\n // Convert SdkConfigLoader to BlockDataLoader\n // SdkConfigLoader.endpoint is SdkLoaderEndpoint (string union) -> string\n // SdkConfigLoader.params is Record<string, LoaderParamValue> -> Record<string, unknown>\n // Both are structurally compatible via covariance\n const loaders: Record<string, BlockDataLoader> = {};\n for (const [key, loader] of Object.entries(customBlock.dataLoaders)) {\n loaders[key] = {\n endpoint: loader.endpoint,\n params: loader.params,\n mode: loader.mode,\n };\n }\n return loaders;\n },\n });\n}\n\n/**\n * Type guard for supported loader endpoints\n */\nfunction isSupportedEndpoint(endpoint: string): endpoint is SupportedLoaderEndpoint {\n return SUPPORTED_LOADER_ENDPOINTS.includes(endpoint as SupportedLoaderEndpoint);\n}\n","/**\n * Client-side React hook to fetch content (page or entry) by path.\n *\n * Use this in client components for dynamic routing where a path\n * could resolve to either a page or content entry.\n */\n\nimport { useState, useEffect } from 'react';\nimport type { Theme } from '@riverbankcms/blocks';\nimport type { RiverbankClient, PageResponse } from '../../client/types';\nimport type { PageProps } from '../components/Page';\nimport { prefetchBlockData } from '../../data/prefetchBlockData';\nimport type { ResolvedBlockData } from '../../data/prefetchBlockData';\nimport type { ContentEntryData } from '../helpers/loadContent';\n\nexport type UseContentParams = {\n client: RiverbankClient;\n siteId: string;\n path: string;\n /**\n * If true, fetches draft/unpublished content instead of published content.\n * This affects both pages and entries.\n * Requires API key with site access.\n *\n * @default false\n */\n preview?: boolean;\n};\n\n/**\n * Loading state\n */\ntype LoadingState = {\n loading: true;\n error: null;\n type: null;\n page: null;\n entry: null;\n theme: null;\n siteId: string;\n resolvedData: null;\n};\n\n/**\n * Error state\n */\ntype ErrorState = {\n loading: false;\n error: Error;\n type: null;\n page: null;\n entry: null;\n theme: null;\n siteId: string;\n resolvedData: null;\n};\n\n/**\n * Success state for page content\n */\ntype PageSuccessState = {\n loading: false;\n error: null;\n type: 'page';\n page: PageProps['page'];\n entry: null;\n theme: Theme;\n siteId: string;\n resolvedData: ResolvedBlockData;\n};\n\n/**\n * Success state for entry content\n */\ntype EntrySuccessState = {\n loading: false;\n error: null;\n type: 'entry';\n page: null;\n entry: ContentEntryData;\n theme: Theme;\n siteId: string;\n resolvedData: null;\n};\n\nexport type UseContentResult = LoadingState | ErrorState | PageSuccessState | EntrySuccessState;\n\n/**\n * Type guard to check if result is loading\n */\nexport function isContentLoading(result: UseContentResult): result is LoadingState {\n return result.loading === true;\n}\n\n/**\n * Type guard to check if result has an error\n */\nexport function isContentError(result: UseContentResult): result is ErrorState {\n return result.loading === false && result.error !== null;\n}\n\n/**\n * Type guard to check if result is a page\n */\nexport function isPageContentResult(result: UseContentResult): result is PageSuccessState {\n return result.loading === false && result.error === null && result.type === 'page';\n}\n\n/**\n * Type guard to check if result is an entry\n */\nexport function isEntryContentResult(result: UseContentResult): result is EntrySuccessState {\n return result.loading === false && result.error === null && result.type === 'entry';\n}\n\n/**\n * Client-side React hook to fetch content by path.\n *\n * Returns a discriminated union with loading/error states, and either\n * page data (ready for `<Page>` component) or raw entry data (for custom rendering).\n *\n * IMPORTANT: The client object should be stable across renders to avoid\n * unnecessary re-fetches. Create it outside your component or use useMemo.\n *\n * @example Dynamic routing with both pages and entries\n * ```tsx\n * \"use client\";\n *\n * import { useContent, Page, isPageContentResult } from '@riverbankcms/sdk/client';\n *\n * function DynamicPage({ path }: { path: string }) {\n * const content = useContent({ client, siteId: 'site-123', path });\n *\n * if (content.loading) return <div>Loading...</div>;\n * if (content.error) return <div>Error: {content.error.message}</div>;\n *\n * if (isPageContentResult(content)) {\n * return <Page page={content.page} theme={content.theme} siteId={content.siteId} resolvedData={content.resolvedData} />;\n * }\n *\n * // Render entry with custom UI\n * return (\n * <article>\n * <h1>{content.entry.title}</h1>\n * <div>{content.entry.content.body}</div>\n * </article>\n * );\n * }\n * ```\n *\n * @example Entry-specific rendering based on content type\n * ```tsx\n * const content = useContent({ client, siteId, path });\n *\n * if (content.loading) return <Spinner />;\n * if (content.error) return <Error error={content.error} />;\n *\n * if (content.type === 'entry') {\n * switch (content.entry.type) {\n * case 'blog-post':\n * return <BlogPost entry={content.entry} theme={content.theme} />;\n * case 'product':\n * return <ProductPage entry={content.entry} theme={content.theme} />;\n * }\n * }\n *\n * return <Page {...content} />;\n * ```\n */\nexport function useContent(params: UseContentParams): UseContentResult {\n const { client, siteId, path, preview = false } = params;\n\n const [result, setResult] = useState<UseContentResult>({\n loading: true,\n error: null,\n type: null,\n page: null,\n entry: null,\n theme: null,\n siteId,\n resolvedData: null,\n });\n\n useEffect(() => {\n let cancelled = false;\n\n async function fetchContent() {\n try {\n // Fetch site and content in parallel\n const [site, contentResponse] = await Promise.all([\n client.getSite({ id: siteId }),\n client.getPage({ siteId, path, preview }),\n ]);\n\n // If component unmounted, don't update state\n if (cancelled) return;\n\n // Check if response is an entry\n if (isEntryResponse(contentResponse)) {\n const entryData = contentResponse.entry;\n\n const entry: ContentEntryData = {\n id: entryData.id,\n type: entryData.type,\n title: entryData.title,\n slug: entryData.slug,\n path: entryData.path,\n status: entryData.status,\n publishAt: entryData.publishAt,\n content: preview\n ? (entryData.draftContent ?? entryData.content)\n : entryData.content,\n metaTitle: preview\n ? (entryData.draftMetaTitle ?? entryData.metaTitle)\n : entryData.metaTitle,\n metaDescription: preview\n ? (entryData.draftMetaDescription ?? entryData.metaDescription)\n : entryData.metaDescription,\n createdAt: entryData.createdAt,\n updatedAt: entryData.updatedAt,\n };\n\n setResult({\n loading: false,\n error: null,\n type: 'entry',\n page: null,\n entry,\n theme: site.theme,\n siteId,\n resolvedData: null,\n });\n return;\n }\n\n // Handle page response\n const { page: pageData } = contentResponse;\n\n // Convert API response blocks to PageOutline format\n const blocks = pageData.blocks.map((block) => {\n if (!block || typeof block !== 'object') {\n throw new Error('Invalid block format in API response');\n }\n if (typeof block.id !== 'string' && block.id !== null) {\n throw new Error(`Invalid block id: expected string or null, got ${typeof block.id}`);\n }\n if (typeof block.kind !== 'string') {\n throw new Error(`Invalid block kind: expected string, got ${typeof block.kind}`);\n }\n if (typeof block.purpose !== 'string') {\n throw new Error(`Invalid block purpose: expected string, got ${typeof block.purpose}`);\n }\n return {\n id: block.id,\n kind: block.kind,\n purpose: block.purpose,\n };\n });\n\n const pageOutline = {\n name: pageData.name,\n path: pageData.path,\n purpose: pageData.purpose,\n blocks,\n };\n\n // Prefetch block data loaders for pages\n const resolvedData = await prefetchBlockData(\n pageOutline,\n {\n siteId,\n pageId: pageData.id,\n previewStage: preview ? 'preview' : 'published',\n },\n client\n );\n\n // If component unmounted, don't update state\n if (cancelled) return;\n\n setResult({\n loading: false,\n error: null,\n type: 'page',\n page: pageOutline,\n entry: null,\n theme: site.theme,\n siteId,\n resolvedData,\n });\n } catch (error) {\n if (cancelled) return;\n\n setResult({\n loading: false,\n error: error instanceof Error ? error : new Error(String(error)),\n type: null,\n page: null,\n entry: null,\n theme: null,\n siteId,\n resolvedData: null,\n });\n }\n }\n\n fetchContent();\n\n return () => {\n cancelled = true;\n };\n }, [client, siteId, path, preview]);\n\n return result;\n}\n\n/**\n * Type guard to check if API response is an entry\n */\nfunction isEntryResponse(response: PageResponse): response is Extract<PageResponse, { type: 'entry' }> {\n return 'type' in response && response.type === 'entry';\n}\n","/**\n * Pure Page renderer component for Riverbank CMS.\n *\n * This component expects all data to be provided via props.\n * For data fetching, use:\n * - Server-side: `await loadPage({ client, siteId, path })`\n * - Client-side: `usePage({ client, siteId, path })`\n */\n\nimport { PageRenderer, buildThemeRuntime } from '@riverbankcms/blocks';\nimport type { PageOutline, RouteMap, Theme, ThemeTokens, BlockOverrides, OccurrenceContextData } from '@riverbankcms/blocks';\nimport type { ResolvedBlockData } from '../../data';\nimport type { RuntimeSdkConfig } from '../helpers/loadPage';\n\n// Re-export OccurrenceContextData for SDK consumers\nexport type { OccurrenceContextData };\n\nexport type PageProps = {\n // Required data (must be provided by caller)\n page: PageOutline;\n theme: Theme;\n siteId: string;\n\n // Optional data\n themeTokens?: ThemeTokens; // If not provided, will be built from theme\n resolvedData?: ResolvedBlockData; // Pre-fetched block data\n routeMap?: RouteMap;\n /**\n * SDK site configuration containing theme palette overrides.\n * When provided, the SDK palette tokens are merged into the theme tokens,\n * allowing blocks to use SDK-defined color tokens for section backgrounds.\n */\n sdkConfig?: RuntimeSdkConfig | null;\n\n /**\n * Additional context data for content entry pages.\n * Used to pass occurrence context and content entry data to blocks.\n */\n dataContext?: {\n /** Occurrence context for event pages (from URL like /events/yoga/2025-01-15) */\n occurrenceContext?: OccurrenceContextData | null;\n /** Content entry data for template pages */\n contentEntry?: Record<string, unknown> | null;\n };\n\n // Customization\n wrapBlock?: (blockId: string, rendered: React.ReactNode) => React.ReactNode;\n registry?: Parameters<typeof PageRenderer>[0]['registry'];\n usePlaceholders?: boolean;\n /**\n * Custom components to override default block rendering.\n * Keys can be full block kind (\"block.hero\") or short form (\"hero\").\n *\n * This is SSR-safe - no context or hooks required.\n *\n * @example\n * ```tsx\n * <Page\n * {...pageData}\n * blockOverrides={{\n * 'hero': MyCustomHero,\n * 'block.testimonials': MyCustomTestimonials,\n * }}\n * />\n * ```\n */\n blockOverrides?: BlockOverrides;\n};\n\n/**\n * Pure renderer for Riverbank CMS pages.\n *\n * This component expects all data to be provided via props.\n * For data fetching, use:\n * - Server-side: `await loadPage({ client, siteId, path })`\n * - Client-side: `usePage({ client, siteId, path })`\n *\n * @example Server-side (Next.js App Router)\n * ```tsx\n * import { createRiverbankClient } from '@riverbankcms/sdk';\n * import { loadPage, Page } from '@riverbankcms/sdk/rendering';\n *\n * const client = createRiverbankClient({ apiKey, baseUrl });\n *\n * export default async function PageRoute({ params }) {\n * const pageData = await loadPage({\n * client,\n * siteId: 'site-id',\n * path: `/${params.slug}`,\n * });\n *\n * return <Page {...pageData} />;\n * }\n * ```\n *\n * @example Client-side\n * ```tsx\n * import { createRiverbankClient } from '@riverbankcms/sdk';\n * import { usePage, Page } from '@riverbankcms/sdk/rendering';\n *\n * const client = createRiverbankClient({ apiKey, baseUrl });\n *\n * function MyPage({ path }) {\n * const pageData = usePage({ client, siteId: 'site-id', path });\n *\n * if (pageData.loading) return <LoadingState />;\n * if (pageData.error) return <ErrorState error={pageData.error} />;\n * if (!pageData.page) return <NotFound />;\n *\n * return <Page {...pageData} />;\n * }\n * ```\n */\nexport function Page({\n page,\n theme,\n themeTokens: providedTokens,\n siteId,\n resolvedData,\n routeMap,\n wrapBlock,\n registry,\n usePlaceholders = false,\n blockOverrides,\n sdkConfig,\n dataContext,\n}: PageProps) {\n // Build theme tokens if not provided\n const baseTokens = providedTokens ?? buildThemeRuntime(theme).tokens;\n\n // Merge SDK palette tokens into theme tokens\n // This allows blocks to resolve SDK-defined color tokens (e.g., 'primary' -> '#6d28d9')\n const themeTokens = sdkConfig?.theme?.palette\n ? { ...baseTokens, palette: { ...baseTokens.palette, ...sdkConfig.theme.palette } }\n : baseTokens;\n\n return (\n <PageRenderer\n theme={theme}\n page={page}\n themeTokens={themeTokens}\n usePlaceholders={usePlaceholders}\n dataContext={{\n siteId,\n resolvedData,\n routes: routeMap,\n occurrenceContext: dataContext?.occurrenceContext ?? null,\n contentEntry: dataContext?.contentEntry ?? null,\n }}\n routeMap={routeMap}\n wrapBlock={wrapBlock}\n registry={registry}\n blockOverrides={blockOverrides}\n sdkConfig={sdkConfig}\n />\n );\n}\n","import { createBearerAPIClient } from '@riverbankcms/api';\nimport type {\n RiverbankClient,\n RiverbankClientConfig,\n PublicBookingServicesResponse,\n PublicEventsResponse,\n PublicFormResponse,\n} from './types';\nimport { SimpleCache } from './cache';\n\n/**\n * Create a Riverbank CMS client for fetching content\n *\n * @example\n * ```ts\n * const client = createRiverbankClient({\n * apiKey: 'bld_live_sk_...',\n * baseUrl: 'https://dashboard.example.com/api',\n * });\n *\n * const site = await client.getSite({ slug: 'my-site' });\n * ```\n */\nexport function createRiverbankClient(config: RiverbankClientConfig): RiverbankClient {\n if (!config.baseUrl) {\n throw new Error(\n 'baseUrl is required when creating a Builder client. ' +\n 'Expected format: https://dashboard.example.com/api (must include /api path)'\n );\n }\n\n // Validate baseUrl format\n if (!config.baseUrl.endsWith('/api')) {\n throw new Error(\n `baseUrl must end with '/api'. Received: ${config.baseUrl}. ` +\n 'Expected format: https://dashboard.example.com/api'\n );\n }\n\n const cacheEnabled = config.cache?.enabled ?? true;\n const cacheTTL = (config.cache?.ttl ?? 300) * 1000; // Convert seconds to milliseconds\n const cacheMaxSize = config.cache?.maxSize ?? 100;\n\n // Create internal API client with Bearer token auth\n const apiClient = createBearerAPIClient(config.apiKey, config.baseUrl);\n\n // Create cache instance\n const cache = new SimpleCache<unknown>({\n maxSize: cacheMaxSize,\n ttl: cacheTTL,\n });\n\n /**\n * Helper to cache API calls\n */\n async function cachedFetch<T>(\n cacheKey: string,\n fetcher: () => Promise<T>,\n options?: { force?: boolean }\n ): Promise<T> {\n // Check cache unless force is true\n if (cacheEnabled && !options?.force) {\n const cached = cache.get(cacheKey) as T | undefined;\n if (cached !== undefined) {\n return cached;\n }\n }\n\n // Fetch fresh data\n const data = await fetcher();\n\n // Store in cache\n if (cacheEnabled) {\n cache.set(cacheKey, data);\n }\n\n return data;\n }\n\n return {\n async getSite(params) {\n const { slug, domain, id } = params;\n\n if (!slug && !domain && !id) {\n throw new Error(\n 'getSite() requires at least one identifier: slug, domain, or id. ' +\n `Received: ${JSON.stringify(params)}`\n );\n }\n\n const cacheKey = `site:${slug || domain || id}`;\n\n return cachedFetch(cacheKey, async () => {\n // Convert params to string record for API client\n const apiParams: Record<string, string> = {};\n if (params.slug) apiParams.slug = params.slug;\n if (params.domain) apiParams.domain = params.domain;\n if (params.id) apiParams.id = params.id;\n return await apiClient({ endpoint: 'getSite', params: apiParams });\n });\n },\n\n async getPage(params) {\n const { siteId, path, preview = false } = params;\n const cacheKey = `page:${siteId}:${path}:${preview}`;\n\n return cachedFetch(cacheKey, async () => {\n return await apiClient({ endpoint: 'getContentByPath', params: { siteId }, body: { path, preview } });\n });\n },\n\n async getEntries(params) {\n const { siteId, contentType, limit, order, preview = false, mode, entryIds } = params;\n\n // Include all params in cache key to ensure different queries are cached separately\n const entryIdsCacheKey = mode === 'manual' && entryIds?.length ? entryIds.join(',') : '';\n const cacheKey = `entries:${siteId}:${contentType}:${limit ?? ''}:${order ?? ''}:${preview}:${mode ?? ''}:${entryIdsCacheKey}`;\n\n return cachedFetch(cacheKey, async () => {\n // Build API params\n const apiParams: Record<string, string> = {\n siteId,\n type: contentType,\n };\n\n // Add optional pagination\n if (typeof limit === 'number') {\n apiParams.limit = String(limit);\n }\n\n // Convert user-friendly order to API format\n // 'order' means custom ordering - we don't pass an order param (API default)\n if (order === 'newest') {\n apiParams.order = 'published_at.desc';\n } else if (order === 'oldest') {\n apiParams.order = 'published_at.asc';\n } else if (order === 'title') {\n apiParams.order = 'title.asc';\n }\n // 'order' or undefined: don't set order param, use API default\n\n // Add preview stage if enabled\n if (preview) {\n apiParams.stage = 'preview';\n }\n\n // Manual mode - pass entry IDs for hydration\n if (mode === 'manual' && entryIds?.length) {\n apiParams.mode = 'manual';\n apiParams.entryIds = JSON.stringify(entryIds);\n }\n\n return await apiClient({ endpoint: 'listPublishedEntries', params: apiParams });\n });\n },\n\n async getEntry(params) {\n const { siteId, contentType, slug } = params;\n const cacheKey = `entry:${siteId}:${contentType}:${slug}`;\n\n return cachedFetch(cacheKey, async () => {\n return await apiClient({ endpoint: 'getPublishedEntryPreview', params: { siteId, type: contentType, slug } });\n });\n },\n\n async getPublicFormById(params) {\n const { formId } = params;\n if (!formId) {\n throw new Error('getPublicFormById() requires formId');\n }\n const cacheKey = `public-form:${formId}`;\n return cachedFetch(cacheKey, async () => {\n return await apiClient({ endpoint: 'getPublicFormById', params: { formId } }) as PublicFormResponse;\n });\n },\n\n async getPublicBookingServices(params) {\n const { siteId, ids } = params;\n if (!siteId) {\n throw new Error('getPublicBookingServices() requires siteId');\n }\n const cacheKey = `public-booking-services:${siteId}:${ids ?? ''}`;\n return cachedFetch(cacheKey, async () => {\n const apiParams: Record<string, string> = { siteId };\n if (ids) apiParams.ids = ids;\n return await apiClient({ endpoint: 'getPublicBookingServices', params: apiParams }) as PublicBookingServicesResponse;\n });\n },\n\n async listPublicEvents(params) {\n const { siteId, limit, from, to, stage } = params;\n if (!siteId) {\n throw new Error('listPublicEvents() requires siteId');\n }\n const cacheKey = `public-events:${siteId}:${limit ?? ''}:${from ?? ''}:${to ?? ''}:${stage ?? ''}`;\n return cachedFetch(cacheKey, async () => {\n const apiParams: Record<string, string> = { siteId };\n if (typeof limit === 'number') apiParams.limit = String(limit);\n if (from) apiParams.from = from;\n if (to) apiParams.to = to;\n if (stage) apiParams.stage = stage;\n return await apiClient({ endpoint: 'listPublicEvents', params: apiParams }) as PublicEventsResponse;\n });\n },\n\n clearCache() {\n cache.clear();\n },\n };\n}\n\n// Re-export types\nexport type { RiverbankClient, RiverbankClientConfig } from './types';\n","/**\n * Simple in-memory cache with TTL support\n */\nexport class SimpleCache<T> {\n private cache = new Map<string, { value: T; expires: number }>();\n private maxSize: number;\n private ttl: number;\n\n constructor(options: { maxSize?: number; ttl?: number } = {}) {\n this.maxSize = options.maxSize ?? 100;\n this.ttl = options.ttl ?? 300000; // 5 minutes in milliseconds\n }\n\n get(key: string): T | undefined {\n const entry = this.cache.get(key);\n if (!entry) return undefined;\n\n // Check if expired\n if (Date.now() > entry.expires) {\n this.cache.delete(key);\n return undefined;\n }\n\n return entry.value;\n }\n\n set(key: string, value: T): void {\n // Enforce max size with simple FIFO eviction\n if (this.cache.size >= this.maxSize) {\n const firstKey = this.cache.keys().next().value;\n if (firstKey) {\n this.cache.delete(firstKey);\n }\n }\n\n this.cache.set(key, {\n value,\n expires: Date.now() + this.ttl,\n });\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n has(key: string): boolean {\n return this.get(key) !== undefined;\n }\n}\n"],"mappings":";AAMA,SAAS,UAAU,iBAAiB;;;ACApC,SAAS,qBAAqB,6BAA6B;AAepD,IAAM,6BAA6B;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AA6CA,eAAsB,kBACpB,MACA,SACA,QACA,SAC4B;AAC5B,QAAM,EAAE,aAAa,IAAI,WAAW,CAAC;AAIrC,QAAM,iBAAiB,IAAI;AAAA,KACxB,gBAAgB,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,IAAc,KAAK,CAAC;AAAA,EACjE;AAEA,SAAO,sBAAsB,MAAM,SAAS;AAAA,IAC1C,WAAW,OAAO,EAAE,UAAU,OAAO,MAAM;AAEzC,UAAI,CAAC,oBAAoB,QAAQ,GAAG;AAClC,cAAM,IAAI;AAAA,UACR,gCAAgC,QAAQ,wBAClB,2BAA2B,KAAK,IAAI,CAAC;AAAA,QAC7D;AAAA,MACF;AAGA,cAAQ,UAAU;AAAA,QAChB,KAAK,wBAAwB;AAC3B,gBAAM,EAAE,QAAQ,MAAM,SAAS,OAAO,OAAO,MAAM,SAAS,IAAI,UAAU,CAAC;AAC3E,cAAI,CAAC,UAAU,CAAC,MAAM;AACpB,kBAAM,IAAI,MAAM,sDAAsD;AAAA,UACxE;AAGA,gBAAM,cAAc,OAAO,UAAU,WACjC,OAAO,SAAS,OAAO,EAAE,IACzB,OAAO,UAAU,WACf,QACA;AAGN,gBAAM,QAAS,YAAY,YAAY,YAAY,YAAY,YAAY,WAAW,YAAY,UAC9F,UACA;AAIJ,cAAI;AACJ,cAAI,SAAS,YAAY,MAAM,QAAQ,QAAQ,GAAG;AAChD,6BAAiB,SACd,IAAI,CAAC,SAAkB;AACtB,kBAAI,OAAO,SAAS,YAAY,SAAS,QAAQ,aAAa,MAAM;AAClE,uBAAQ,KAA6B;AAAA,cACvC;AAEA,kBAAI,OAAO,SAAS,UAAU;AAC5B,uBAAO;AAAA,cACT;AACA,qBAAO;AAAA,YACT,CAAC,EACA,OAAO,CAAC,OAAqB,OAAO,IAAI;AAAA,UAC7C;AAEA,iBAAO,MAAM,OAAO,WAAW;AAAA,YAC7B;AAAA,YACA,aAAa;AAAA,YACb,OAAO;AAAA,YACP;AAAA,YACA,SAAS,UAAU;AAAA;AAAA,YAEnB,MAAM,SAAS,WAAW,WAAW;AAAA,YACrC,UAAU;AAAA,UACZ,CAAC;AAAA,QACH;AAAA,QAEA,KAAK,4BAA4B;AAC/B,gBAAM,EAAE,QAAQ,MAAM,KAAK,IAAI,UAAU,CAAC;AAC1C,cAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM;AAC7B,kBAAM,IAAI,MAAM,iEAAiE;AAAA,UACnF;AACA,iBAAO,MAAM,OAAO,SAAS,EAAE,QAAQ,aAAa,MAAM,KAAK,CAAC;AAAA,QAClE;AAAA,QACA,KAAK,oBAAoB;AACvB,gBAAM,EAAE,QAAQ,OAAO,MAAM,IAAI,MAAM,IAAI,UAAU,CAAC;AACtD,cAAI,CAAC,QAAQ;AACX,kBAAM,IAAI,MAAM,wCAAwC;AAAA,UAC1D;AACA,gBAAM,cACJ,OAAO,UAAU,WACb,OAAO,SAAS,OAAO,EAAE,IACzB,OAAO,UAAU,WACf,QACA;AACR,iBAAO,MAAM,OAAO,iBAAiB,EAAE,QAAQ,OAAO,aAAa,MAAM,IAAI,MAAM,CAAC;AAAA,QACtF;AAAA,QACA,KAAK,qBAAqB;AACxB,gBAAM,EAAE,OAAO,IAAI,UAAU,CAAC;AAC9B,cAAI,CAAC,QAAQ;AACX,kBAAM,IAAI,MAAM,yCAAyC;AAAA,UAC3D;AACA,iBAAO,MAAM,OAAO,kBAAkB,EAAE,OAAO,CAAC;AAAA,QAClD;AAAA,QACA,KAAK,4BAA4B;AAC/B,gBAAM,EAAE,QAAQ,IAAI,IAAI,UAAU,CAAC;AACnC,cAAI,CAAC,QAAQ;AACX,kBAAM,IAAI,MAAM,gDAAgD;AAAA,UAClE;AACA,iBAAO,MAAM,OAAO,yBAAyB,EAAE,QAAQ,IAAI,CAAC;AAAA,QAC9D;AAAA,QAEA,SAAS;AAEP,gBAAM,cAAqB;AAC3B,gBAAM,IAAI,MAAM,uBAAuB,WAAW,EAAE;AAAA,QACtD;AAAA,MACF;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,IACjB,SAAS,CAAC,OAAO,EAAE,OAAO,OAAO,MAAM;AACrC,cAAQ,KAAK,qDAAqD;AAAA,QAChE;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA;AAAA,IAEA,uBAAuB,CAAC,cAA2D;AACjF,YAAM,cAAc,eAAe,IAAI,SAAS;AAChD,UAAI,CAAC,aAAa,YAAa,QAAO;AAMtC,YAAM,UAA2C,CAAC;AAClD,iBAAW,CAAC,KAAK,MAAM,KAAK,OAAO,QAAQ,YAAY,WAAW,GAAG;AACnE,gBAAQ,GAAG,IAAI;AAAA,UACb,UAAU,OAAO;AAAA,UACjB,QAAQ,OAAO;AAAA,UACf,MAAM,OAAO;AAAA,QACf;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AACH;AAKA,SAAS,oBAAoB,UAAuD;AAClF,SAAO,2BAA2B,SAAS,QAAmC;AAChF;;;AD5HO,SAAS,QAAQ,QAAsC;AAC5D,QAAM,EAAE,QAAQ,QAAQ,MAAM,QAAQ,UAAU,MAAM,IAAI;AAE1D,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAwB;AAAA,IAClD,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP;AAAA,IACA,cAAc;AAAA,IACd,WAAW;AAAA,EACb,CAAC;AAED,YAAU,MAAM;AACd,QAAI,YAAY;AAEhB,mBAAe,YAAY;AACzB,UAAI;AAEF,cAAM,CAAC,MAAM,YAAY,IAAI,MAAM,QAAQ,IAAI;AAAA,UAC7C,OAAO,QAAQ,EAAE,IAAI,OAAO,CAAC;AAAA,UAC7B,OAAO,QAAQ,EAAE,QAAQ,MAAM,QAAQ,CAAC;AAAA,QAC1C,CAAC;AAGD,YAAI,UAAW;AAGf,YAAI,WAAW,cAAc;AAC3B,gBAAM,IAAI;AAAA,YACR;AAAA,UAGF;AAAA,QACF;AAEA,cAAM,EAAE,MAAM,SAAS,IAAI;AAI3B,cAAM,SAAS,SAAS,OAAO,IAAI,CAAC,UAAU;AAC5C,cAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,kBAAM,IAAI,MAAM,sCAAsC;AAAA,UACxD;AACA,cAAI,OAAO,MAAM,OAAO,YAAY,MAAM,OAAO,MAAM;AACrD,kBAAM,IAAI,MAAM,kDAAkD,OAAO,MAAM,EAAE,EAAE;AAAA,UACrF;AACA,cAAI,OAAO,MAAM,SAAS,UAAU;AAClC,kBAAM,IAAI,MAAM,4CAA4C,OAAO,MAAM,IAAI,EAAE;AAAA,UACjF;AACA,cAAI,OAAO,MAAM,YAAY,UAAU;AACrC,kBAAM,IAAI,MAAM,+CAA+C,OAAO,MAAM,OAAO,EAAE;AAAA,UACvF;AACA,iBAAO;AAAA,YACL,IAAI,MAAM;AAAA,YACV,MAAM,MAAM;AAAA,YACZ,SAAS,MAAM;AAAA,UACjB;AAAA,QACF,CAAC;AAED,cAAM,cAAc;AAAA,UAClB,MAAM,SAAS;AAAA,UACf,MAAM,SAAS;AAAA,UACf,SAAS,SAAS;AAAA,UAClB;AAAA,QACF;AAGA,cAAM,eAAe,MAAM;AAAA,UACzB;AAAA,UACA;AAAA,YACE;AAAA,YACA,QAAQ,UAAU,SAAS;AAAA,YAC3B,cAAc,UAAU,YAAY;AAAA,UACtC;AAAA,UACA;AAAA,QACF;AAGA,YAAI,UAAW;AAEf,kBAAU;AAAA,UACR,SAAS;AAAA,UACT,OAAO;AAAA,UACP,MAAM;AAAA,UACN,OAAO,KAAK;AAAA,UACZ;AAAA,UACA;AAAA,UACA,WAAW,KAAK,aAAa;AAAA,QAC/B,CAAC;AAAA,MACH,SAAS,OAAO;AACd,YAAI,UAAW;AAEf,kBAAU;AAAA,UACR,SAAS;AAAA,UACT,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,UAC/D,MAAM;AAAA,UACN,OAAO;AAAA,UACP;AAAA,UACA,cAAc;AAAA,UACd,WAAW;AAAA,QACb,CAAC;AAAA,MACH;AAAA,IACF;AAEA,cAAU;AAEV,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,QAAQ,QAAQ,MAAM,QAAQ,OAAO,CAAC;AAE1C,SAAO;AACT;;;AE7MA,SAAS,YAAAA,WAAU,aAAAC,kBAAiB;AAmF7B,SAAS,iBAAiB,QAAkD;AACjF,SAAO,OAAO,YAAY;AAC5B;AAKO,SAAS,eAAe,QAAgD;AAC7E,SAAO,OAAO,YAAY,SAAS,OAAO,UAAU;AACtD;AAKO,SAAS,oBAAoB,QAAsD;AACxF,SAAO,OAAO,YAAY,SAAS,OAAO,UAAU,QAAQ,OAAO,SAAS;AAC9E;AAKO,SAAS,qBAAqB,QAAuD;AAC1F,SAAO,OAAO,YAAY,SAAS,OAAO,UAAU,QAAQ,OAAO,SAAS;AAC9E;AAwDO,SAAS,WAAW,QAA4C;AACrE,QAAM,EAAE,QAAQ,QAAQ,MAAM,UAAU,MAAM,IAAI;AAElD,QAAM,CAAC,QAAQ,SAAS,IAAIC,UAA2B;AAAA,IACrD,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP;AAAA,IACA,cAAc;AAAA,EAChB,CAAC;AAED,EAAAC,WAAU,MAAM;AACd,QAAI,YAAY;AAEhB,mBAAe,eAAe;AAC5B,UAAI;AAEF,cAAM,CAAC,MAAM,eAAe,IAAI,MAAM,QAAQ,IAAI;AAAA,UAChD,OAAO,QAAQ,EAAE,IAAI,OAAO,CAAC;AAAA,UAC7B,OAAO,QAAQ,EAAE,QAAQ,MAAM,QAAQ,CAAC;AAAA,QAC1C,CAAC;AAGD,YAAI,UAAW;AAGf,YAAI,gBAAgB,eAAe,GAAG;AACpC,gBAAM,YAAY,gBAAgB;AAElC,gBAAM,QAA0B;AAAA,YAC9B,IAAI,UAAU;AAAA,YACd,MAAM,UAAU;AAAA,YAChB,OAAO,UAAU;AAAA,YACjB,MAAM,UAAU;AAAA,YAChB,MAAM,UAAU;AAAA,YAChB,QAAQ,UAAU;AAAA,YAClB,WAAW,UAAU;AAAA,YACrB,SAAS,UACJ,UAAU,gBAAgB,UAAU,UACrC,UAAU;AAAA,YACd,WAAW,UACN,UAAU,kBAAkB,UAAU,YACvC,UAAU;AAAA,YACd,iBAAiB,UACZ,UAAU,wBAAwB,UAAU,kBAC7C,UAAU;AAAA,YACd,WAAW,UAAU;AAAA,YACrB,WAAW,UAAU;AAAA,UACvB;AAEA,oBAAU;AAAA,YACR,SAAS;AAAA,YACT,OAAO;AAAA,YACP,MAAM;AAAA,YACN,MAAM;AAAA,YACN;AAAA,YACA,OAAO,KAAK;AAAA,YACZ;AAAA,YACA,cAAc;AAAA,UAChB,CAAC;AACD;AAAA,QACF;AAGA,cAAM,EAAE,MAAM,SAAS,IAAI;AAG3B,cAAM,SAAS,SAAS,OAAO,IAAI,CAAC,UAAU;AAC5C,cAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,kBAAM,IAAI,MAAM,sCAAsC;AAAA,UACxD;AACA,cAAI,OAAO,MAAM,OAAO,YAAY,MAAM,OAAO,MAAM;AACrD,kBAAM,IAAI,MAAM,kDAAkD,OAAO,MAAM,EAAE,EAAE;AAAA,UACrF;AACA,cAAI,OAAO,MAAM,SAAS,UAAU;AAClC,kBAAM,IAAI,MAAM,4CAA4C,OAAO,MAAM,IAAI,EAAE;AAAA,UACjF;AACA,cAAI,OAAO,MAAM,YAAY,UAAU;AACrC,kBAAM,IAAI,MAAM,+CAA+C,OAAO,MAAM,OAAO,EAAE;AAAA,UACvF;AACA,iBAAO;AAAA,YACL,IAAI,MAAM;AAAA,YACV,MAAM,MAAM;AAAA,YACZ,SAAS,MAAM;AAAA,UACjB;AAAA,QACF,CAAC;AAED,cAAM,cAAc;AAAA,UAClB,MAAM,SAAS;AAAA,UACf,MAAM,SAAS;AAAA,UACf,SAAS,SAAS;AAAA,UAClB;AAAA,QACF;AAGA,cAAM,eAAe,MAAM;AAAA,UACzB;AAAA,UACA;AAAA,YACE;AAAA,YACA,QAAQ,SAAS;AAAA,YACjB,cAAc,UAAU,YAAY;AAAA,UACtC;AAAA,UACA;AAAA,QACF;AAGA,YAAI,UAAW;AAEf,kBAAU;AAAA,UACR,SAAS;AAAA,UACT,OAAO;AAAA,UACP,MAAM;AAAA,UACN,MAAM;AAAA,UACN,OAAO;AAAA,UACP,OAAO,KAAK;AAAA,UACZ;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH,SAAS,OAAO;AACd,YAAI,UAAW;AAEf,kBAAU;AAAA,UACR,SAAS;AAAA,UACT,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,UAC/D,MAAM;AAAA,UACN,MAAM;AAAA,UACN,OAAO;AAAA,UACP,OAAO;AAAA,UACP;AAAA,UACA,cAAc;AAAA,QAChB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,iBAAa;AAEb,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,QAAQ,QAAQ,MAAM,OAAO,CAAC;AAElC,SAAO;AACT;AAKA,SAAS,gBAAgB,UAA8E;AACrG,SAAO,UAAU,YAAY,SAAS,SAAS;AACjD;;;ACxTA,SAAS,cAAc,yBAAyB;AAgI5C;AAxBG,SAAS,KAAK;AAAA,EACnB;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AACF,GAAc;AAEZ,QAAM,aAAa,kBAAkB,kBAAkB,KAAK,EAAE;AAI9D,QAAM,cAAc,WAAW,OAAO,UAClC,EAAE,GAAG,YAAY,SAAS,EAAE,GAAG,WAAW,SAAS,GAAG,UAAU,MAAM,QAAQ,EAAE,IAChF;AAEJ,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,QACX;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,mBAAmB,aAAa,qBAAqB;AAAA,QACrD,cAAc,aAAa,gBAAgB;AAAA,MAC7C;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF;AAEJ;;;AC5JA,SAAS,6BAA6B;;;ACG/B,IAAM,cAAN,MAAqB;AAAA,EAK1B,YAAY,UAA8C,CAAC,GAAG;AAJ9D,SAAQ,QAAQ,oBAAI,IAA2C;AAK7D,SAAK,UAAU,QAAQ,WAAW;AAClC,SAAK,MAAM,QAAQ,OAAO;AAAA,EAC5B;AAAA,EAEA,IAAI,KAA4B;AAC9B,UAAM,QAAQ,KAAK,MAAM,IAAI,GAAG;AAChC,QAAI,CAAC,MAAO,QAAO;AAGnB,QAAI,KAAK,IAAI,IAAI,MAAM,SAAS;AAC9B,WAAK,MAAM,OAAO,GAAG;AACrB,aAAO;AAAA,IACT;AAEA,WAAO,MAAM;AAAA,EACf;AAAA,EAEA,IAAI,KAAa,OAAgB;AAE/B,QAAI,KAAK,MAAM,QAAQ,KAAK,SAAS;AACnC,YAAM,WAAW,KAAK,MAAM,KAAK,EAAE,KAAK,EAAE;AAC1C,UAAI,UAAU;AACZ,aAAK,MAAM,OAAO,QAAQ;AAAA,MAC5B;AAAA,IACF;AAEA,SAAK,MAAM,IAAI,KAAK;AAAA,MAClB;AAAA,MACA,SAAS,KAAK,IAAI,IAAI,KAAK;AAAA,IAC7B,CAAC;AAAA,EACH;AAAA,EAEA,QAAc;AACZ,SAAK,MAAM,MAAM;AAAA,EACnB;AAAA,EAEA,IAAI,KAAsB;AACxB,WAAO,KAAK,IAAI,GAAG,MAAM;AAAA,EAC3B;AACF;;;ADzBO,SAAS,sBAAsB,QAAgD;AACpF,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,IAAI;AAAA,MACR;AAAA,IAEF;AAAA,EACF;AAGA,MAAI,CAAC,OAAO,QAAQ,SAAS,MAAM,GAAG;AACpC,UAAM,IAAI;AAAA,MACR,2CAA2C,OAAO,OAAO;AAAA,IAE3D;AAAA,EACF;AAEA,QAAM,eAAe,OAAO,OAAO,WAAW;AAC9C,QAAM,YAAY,OAAO,OAAO,OAAO,OAAO;AAC9C,QAAM,eAAe,OAAO,OAAO,WAAW;AAG9C,QAAM,YAAY,sBAAsB,OAAO,QAAQ,OAAO,OAAO;AAGrE,QAAM,QAAQ,IAAI,YAAqB;AAAA,IACrC,SAAS;AAAA,IACT,KAAK;AAAA,EACP,CAAC;AAKD,iBAAe,YACb,UACA,SACA,SACY;AAEZ,QAAI,gBAAgB,CAAC,SAAS,OAAO;AACnC,YAAM,SAAS,MAAM,IAAI,QAAQ;AACjC,UAAI,WAAW,QAAW;AACxB,eAAO;AAAA,MACT;AAAA,IACF;AAGA,UAAM,OAAO,MAAM,QAAQ;AAG3B,QAAI,cAAc;AAChB,YAAM,IAAI,UAAU,IAAI;AAAA,IAC1B;AAEA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM,QAAQ,QAAQ;AACpB,YAAM,EAAE,MAAM,QAAQ,GAAG,IAAI;AAE7B,UAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI;AAC3B,cAAM,IAAI;AAAA,UACR,8EACa,KAAK,UAAU,MAAM,CAAC;AAAA,QACrC;AAAA,MACF;AAEA,YAAM,WAAW,QAAQ,QAAQ,UAAU,EAAE;AAE7C,aAAO,YAAY,UAAU,YAAY;AAEvC,cAAM,YAAoC,CAAC;AAC3C,YAAI,OAAO,KAAM,WAAU,OAAO,OAAO;AACzC,YAAI,OAAO,OAAQ,WAAU,SAAS,OAAO;AAC7C,YAAI,OAAO,GAAI,WAAU,KAAK,OAAO;AACrC,eAAO,MAAM,UAAU,EAAE,UAAU,WAAW,QAAQ,UAAU,CAAC;AAAA,MACnE,CAAC;AAAA,IACH;AAAA,IAEA,MAAM,QAAQ,QAAQ;AACpB,YAAM,EAAE,QAAQ,MAAM,UAAU,MAAM,IAAI;AAC1C,YAAM,WAAW,QAAQ,MAAM,IAAI,IAAI,IAAI,OAAO;AAElD,aAAO,YAAY,UAAU,YAAY;AACvC,eAAO,MAAM,UAAU,EAAE,UAAU,oBAAoB,QAAQ,EAAE,OAAO,GAAG,MAAM,EAAE,MAAM,QAAQ,EAAE,CAAC;AAAA,MACtG,CAAC;AAAA,IACH;AAAA,IAEA,MAAM,WAAW,QAAQ;AACvB,YAAM,EAAE,QAAQ,aAAa,OAAO,OAAO,UAAU,OAAO,MAAM,SAAS,IAAI;AAG/E,YAAM,mBAAmB,SAAS,YAAY,UAAU,SAAS,SAAS,KAAK,GAAG,IAAI;AACtF,YAAM,WAAW,WAAW,MAAM,IAAI,WAAW,IAAI,SAAS,EAAE,IAAI,SAAS,EAAE,IAAI,OAAO,IAAI,QAAQ,EAAE,IAAI,gBAAgB;AAE5H,aAAO,YAAY,UAAU,YAAY;AAEvC,cAAM,YAAoC;AAAA,UACxC;AAAA,UACA,MAAM;AAAA,QACR;AAGA,YAAI,OAAO,UAAU,UAAU;AAC7B,oBAAU,QAAQ,OAAO,KAAK;AAAA,QAChC;AAIA,YAAI,UAAU,UAAU;AACtB,oBAAU,QAAQ;AAAA,QACpB,WAAW,UAAU,UAAU;AAC7B,oBAAU,QAAQ;AAAA,QACpB,WAAW,UAAU,SAAS;AAC5B,oBAAU,QAAQ;AAAA,QACpB;AAIA,YAAI,SAAS;AACX,oBAAU,QAAQ;AAAA,QACpB;AAGA,YAAI,SAAS,YAAY,UAAU,QAAQ;AACzC,oBAAU,OAAO;AACjB,oBAAU,WAAW,KAAK,UAAU,QAAQ;AAAA,QAC9C;AAEA,eAAO,MAAM,UAAU,EAAE,UAAU,wBAAwB,QAAQ,UAAU,CAAC;AAAA,MAChF,CAAC;AAAA,IACH;AAAA,IAEA,MAAM,SAAS,QAAQ;AACrB,YAAM,EAAE,QAAQ,aAAa,KAAK,IAAI;AACtC,YAAM,WAAW,SAAS,MAAM,IAAI,WAAW,IAAI,IAAI;AAEvD,aAAO,YAAY,UAAU,YAAY;AACvC,eAAO,MAAM,UAAU,EAAE,UAAU,4BAA4B,QAAQ,EAAE,QAAQ,MAAM,aAAa,KAAK,EAAE,CAAC;AAAA,MAC9G,CAAC;AAAA,IACH;AAAA,IAEA,MAAM,kBAAkB,QAAQ;AAC9B,YAAM,EAAE,OAAO,IAAI;AACnB,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI,MAAM,qCAAqC;AAAA,MACvD;AACA,YAAM,WAAW,eAAe,MAAM;AACtC,aAAO,YAAY,UAAU,YAAY;AACvC,eAAO,MAAM,UAAU,EAAE,UAAU,qBAAqB,QAAQ,EAAE,OAAO,EAAE,CAAC;AAAA,MAC9E,CAAC;AAAA,IACH;AAAA,IAEA,MAAM,yBAAyB,QAAQ;AACrC,YAAM,EAAE,QAAQ,IAAI,IAAI;AACxB,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI,MAAM,4CAA4C;AAAA,MAC9D;AACA,YAAM,WAAW,2BAA2B,MAAM,IAAI,OAAO,EAAE;AAC/D,aAAO,YAAY,UAAU,YAAY;AACvC,cAAM,YAAoC,EAAE,OAAO;AACnD,YAAI,IAAK,WAAU,MAAM;AACzB,eAAO,MAAM,UAAU,EAAE,UAAU,4BAA4B,QAAQ,UAAU,CAAC;AAAA,MACpF,CAAC;AAAA,IACH;AAAA,IAEA,MAAM,iBAAiB,QAAQ;AAC7B,YAAM,EAAE,QAAQ,OAAO,MAAM,IAAI,MAAM,IAAI;AAC3C,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI,MAAM,oCAAoC;AAAA,MACtD;AACA,YAAM,WAAW,iBAAiB,MAAM,IAAI,SAAS,EAAE,IAAI,QAAQ,EAAE,IAAI,MAAM,EAAE,IAAI,SAAS,EAAE;AAChG,aAAO,YAAY,UAAU,YAAY;AACvC,cAAM,YAAoC,EAAE,OAAO;AACnD,YAAI,OAAO,UAAU,SAAU,WAAU,QAAQ,OAAO,KAAK;AAC7D,YAAI,KAAM,WAAU,OAAO;AAC3B,YAAI,GAAI,WAAU,KAAK;AACvB,YAAI,MAAO,WAAU,QAAQ;AAC7B,eAAO,MAAM,UAAU,EAAE,UAAU,oBAAoB,QAAQ,UAAU,CAAC;AAAA,MAC5E,CAAC;AAAA,IACH;AAAA,IAEA,aAAa;AACX,YAAM,MAAM;AAAA,IACd;AAAA,EACF;AACF;","names":["useState","useEffect","useState","useEffect"]}
|
|
1
|
+
{"version":3,"sources":["../../src/rendering/hooks/usePage.ts","../../../blocks/src/system/manifest/augmentManifest.ts","../../../blocks/src/system/manifest/registry.ts","../../../blocks/src/system/manifest/schema.ts","../../../blocks/src/system/node/schema.ts","../../../blocks/src/system/node/typeBasedLayout.ts","../../../blocks/src/system/manifest/validation.ts","../../../blocks/src/system/manifest/richTextSchema.ts","../../../blocks/src/utils/env.ts","../../../blocks/src/system/node/types.ts","../../../blocks/src/system/node/builder.ts","../../../blocks/src/system/node/fragments/backgroundLayer.ts","../../../blocks/src/theme/utils/colorStyles.ts","../../../blocks/src/system/node/fragments/headingGroup.ts","../../../blocks/src/system/node/fragments/sectionContainer.ts","../../../blocks/src/system/spacing.ts","../../../blocks/src/system/node/fragments/styledSection.ts","../../../blocks/src/system/node/fragments/ctaButton.ts","../../../blocks/src/system/node/fragments/ctaRow.ts","../../../blocks/src/system/node/fragments/navRow.ts","../../../blocks/src/system/fragments/types.ts","../../../blocks/src/system/fragments/builder.ts","../../../blocks/src/system/fragments/library/bodyCopy.ts","../../../blocks/src/system/fragments/library/heroCopy.ts","../../../blocks/src/system/fields/button.ts","../../../blocks/src/system/fields/ctas.ts","../../../blocks/src/system/fragments/library/ctaRow.ts","../../../blocks/src/system/fragments/library/ctaCopy.ts","../../../blocks/src/system/fragments/library/testimonialsHeading.ts","../../../blocks/src/system/fragments/library/testimonialsCarousel.ts","../../../blocks/src/system/fragments/library/formCopy.ts","../../../blocks/src/system/fragments/library/formEmbed.ts","../../../blocks/src/system/fragments/library/footerBottomText.ts","../../../blocks/src/system/fragments/library/footerLinkGroups.ts","../../../blocks/src/system/fragments/library/headerCta.ts","../../../blocks/src/system/fragments/library/singleButton.ts","../../../blocks/src/system/fragments/library/blogFeaturedPost.ts","../../../blocks/src/system/fragments/library/blogListGrid.ts","../../../blocks/src/system/fragments/library/blogListStack.ts","../../../blocks/src/system/fragments/library/faqHeading.ts","../../../blocks/src/system/fragments/library/faqAccordion.ts","../../../blocks/src/system/fragments/library/card.ts","../../../blocks/src/system/fragments/library/heading.ts","../../../blocks/src/system/fragments/library/richText.ts","../../../blocks/src/system/fragments/lazyInit.ts","../../../blocks/src/system/fragments/registry.ts","../../../blocks/src/system/fragments/utils/toRepeaterSchema.ts","../../../blocks/src/system/fragments/library/image.ts","../../../blocks/src/system/fragments/library/columnContent.ts","../../../blocks/src/system/constants/background.ts","../../../blocks/src/system/fields/background.ts","../../../blocks/src/system/fields/boxStyles.ts","../../../blocks/src/system/defineBlock.ts","../../../blocks/src/system/blocks/hero.ts","../../../blocks/src/system/blocks/body-text.ts","../../../blocks/src/system/blocks/blog-post.tsx","../../../blocks/src/system/blocks/blog-placeholder.ts","../../../blocks/src/system/blocks/blog-listing.ts","../../../blocks/src/system/blocks/cta-full.ts","../../../blocks/src/system/blocks/form.tsx","../../../blocks/src/system/blocks/faq.ts","../../../blocks/src/system/transforms/registry/formatting.ts","../../../blocks/src/system/transforms/registry/ui.ts","../../../blocks/src/system/transforms/registry/layout.ts","../../../blocks/src/theme/palette/utils/colorConversion.ts","../../../blocks/src/system/transforms/registry/media.ts","../../../blocks/src/system/transforms/typed.ts","../../../blocks/src/system/blocks/site-header.ts","../../../blocks/src/system/blocks/site-footer.ts","../../../blocks/src/system/blocks/testimonials.tsx","../../../blocks/src/system/blocks/columns.ts","../../../blocks/src/system/blocks/appointment-booking.tsx","../../../blocks/src/system/blocks/event-registration.ts","../../../blocks/src/system/blocks/events/shared/schemas.ts","../../../blocks/src/system/blocks/events/shared/fields.ts","../../../blocks/src/system/blocks/events/event-spotlight.ts","../../../blocks/src/system/blocks/events/event-listing.ts","../../../blocks/src/system/blocks/events/event-calendar.ts","../../../blocks/src/system/blocks/embed.ts","../../../blocks/src/system/blocks/index.ts","../../../blocks/src/system/registry.ts","../../../blocks/src/system/runtime/bindings.ts","../../../blocks/src/system/data/utils.ts","../../../blocks/src/system/data/prefetchBlockData.ts","../../src/data/prefetchBlockData.ts","../../src/rendering/hooks/useContent.ts","../../../blocks/src/PageRenderer.tsx","../../../blocks/src/system/theme/tokens.ts","../../../blocks/src/system/transforms/registry/core.ts","../../../blocks/src/system/transforms/registry/background.ts","../../../blocks/src/system/transforms/registry/links.ts","../../../blocks/src/system/transforms/registry/boxStyles.ts","../../../blocks/src/system/transforms/registry/index.ts","../../../blocks/src/system/runtime/resolver.ts","../../../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs","../../../blocks/src/primitives/layout/Section.tsx","../../../blocks/src/primitives/layout/Stack.tsx","../../../blocks/src/primitives/layout/Inline.tsx","../../../blocks/src/primitives/layout/Grid.tsx","../../../blocks/src/system/runtime/nodes/layout.tsx","../../../blocks/src/primitives/content/components/RichText.tsx","../../../blocks/src/primitives/content/components/Text.tsx","../../../blocks/src/system/runtime/nodes/basic.tsx","../../../media-core/src/types.ts","../../../media-core/src/url.ts","../../../blocks/src/system/runtime/nodes/media.tsx","../../../blocks/src/system/runtime/nodes/form.server.tsx","../../../blocks/src/system/runtime/nodes/carousel.server.tsx","../../../blocks/src/system/runtime/nodes/accordion.server.tsx","../../../blocks/src/system/runtime/nodes/header-section.server.tsx","../../../blocks/src/system/runtime/nodes/event-list.server.tsx","../../../blocks/src/system/runtime/nodes/booking-form.server.tsx","../../../blocks/src/system/runtime/nodes/event-registration.server.tsx","../../../blocks/src/system/runtime/nodes/events/shared/utils.ts","../../../blocks/src/system/runtime/nodes/events/shared/EventCard.tsx","../../../blocks/src/system/runtime/nodes/events/shared/EmptyState.tsx","../../../blocks/src/system/runtime/nodes/events/EventSpotlight.tsx","../../../blocks/src/system/runtime/nodes/events/EventListing.server.tsx","../../../blocks/src/system/runtime/components/registry.server.ts","../../../blocks/src/system/runtime/components/index.ts","../../../blocks/src/system/componentFactory.ts","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/utils/limit.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/utils/clip_rgb.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/utils/type.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/utils/unpack.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/utils/last.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/utils/index.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/input.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/Color.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/version.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/chroma.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/colors/w3cx11.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/hex/hex2rgb.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/hex/rgb2hex.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/named/index.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/ops/alpha.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/ops/clipped.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/lab/lab-constants.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/lab/lab2rgb.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/lab/rgb2lab.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/lab/index.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/ops/darken.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/ops/get.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/ops/luminance.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/interpolator/index.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/generator/mix.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/ops/mix.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/ops/premultiply.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/lch/lch2lab.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/lch/lch2rgb.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/lch/hcl2rgb.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/lch/lab2lch.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/lch/rgb2lch.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/lch/index.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/ops/saturate.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/ops/set.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/ops/shade.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/interpolator/rgb.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/interpolator/lrgb.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/interpolator/lab.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/interpolator/_hsx.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/interpolator/lch.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/num/num2rgb.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/num/rgb2num.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/num/index.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/interpolator/num.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/hcg/hcg2rgb.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/hcg/rgb2hcg.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/hcg/index.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/interpolator/hcg.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/hsi/hsi2rgb.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/hsi/rgb2hsi.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/hsi/index.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/interpolator/hsi.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/hsl/hsl2rgb.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/hsl/rgb2hsl.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/hsl/index.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/interpolator/hsl.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/hsv/hsv2rgb.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/hsv/rgb2hsv.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/hsv/index.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/interpolator/hsv.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/utils/multiply-matrices.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/oklab/oklab2rgb.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/oklab/rgb2oklab.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/oklab/index.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/interpolator/oklab.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/interpolator/oklch.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/generator/average.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/generator/scale.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/generator/bezier.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/rgb/index.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/generator/blend.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/generator/cubehelix.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/generator/random.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/utils/analyze.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/utils/contrast.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/utils/contrastAPCA.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/utils/delta-e.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/utils/distance.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/utils/valid.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/utils/scales.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/colors/colorbrewer.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/cmyk/cmyk2rgb.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/cmyk/rgb2cmyk.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/cmyk/index.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/css/hsl2css.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/css/lab2css.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/css/lch2css.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/css/oklab2css.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/oklch/rgb2oklch.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/css/oklch2css.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/css/rgb2css.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/oklch/oklch2rgb.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/css/css2rgb.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/css/index.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/gl/index.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/hex/index.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/temp/temperature2rgb.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/temp/rgb2temperature.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/temp/index.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/oklch/index.js","../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/index.js","../../../blocks/src/theme/palette/generateShades.ts","../../../blocks/src/theme/palette/neutralScale.ts","../../../blocks/src/theme/palette/expandPalette.ts","../../../blocks/src/theme/palette/generateCssVars.ts","../../../blocks/src/theme/styles/shadow.ts","../../../blocks/src/theme/buttons/effects/presets/background.ts","../../../blocks/src/theme/buttons/effects/presets/shadow.ts","../../../blocks/src/theme/buttons/effects/presets/transform.ts","../../../blocks/src/theme/buttons/effects/presets/overlay.ts","../../../blocks/src/theme/buttons/effects/presets/text.ts","../../../blocks/src/theme/buttons/effects/presets/border.ts","../../../blocks/src/theme/buttons/effects/presets/animation.ts","../../../blocks/src/theme/buttons/effects/registry.ts","../../../blocks/src/theme/tokens/resolver.ts","../../../blocks/src/theme/buttons/constants.ts","../../../blocks/src/theme/buttons/utils/contrast.ts","../../../blocks/src/theme/buttons/generateDefaultButtonSystem.ts","../../../blocks/src/theme/buttons/generateButtonCss.ts","../../../blocks/src/theme/cards/constants.ts","../../../blocks/src/theme/cards/generateDefaultCardSystem.ts","../../../blocks/src/theme/cards/generateCardCss.ts","../../../blocks/src/theme/accordions/types.ts","../../../blocks/src/theme/styles/border.ts","../../../blocks/src/theme/accordions/generateAccordionCss.ts","../../../blocks/src/theme/accordions/defaults.ts","../../../blocks/src/theme/inputs/types.ts","../../../blocks/src/theme/inputs/generateInputCss.ts","../../../blocks/src/theme/inputs/defaults.ts","../../../blocks/src/theme/header/generateHeaderCss.ts","../../../blocks/src/theme/layout/generateLayoutCss.ts","../../../blocks/src/theme/status/generateStatusCss.ts","../../../blocks/src/theme/progress/generateProgressCss.ts","../../../blocks/src/theme/runtime/buildThemeRuntime.ts","../../../blocks/src/system/manifest/hydrateLinks.ts","../../../blocks/src/sdkBlockTransform.ts","../../src/rendering/components/Page.tsx","../../../api/src/endpoints.ts","../../../api/src/url.ts","../../../api/src/request.ts","../../../api/src/aiPlayground.ts","../../src/client/cache.ts","../../src/client/index.ts"],"sourcesContent":["/**\n * Client-side React hook to fetch page data.\n *\n * Use this in client components for dynamic page loading.\n */\n\nimport { useState, useEffect } from 'react';\nimport type { RiverbankClient } from '../../client/types';\nimport type { PageProps } from '../components/Page';\nimport type { RuntimeSdkConfig } from '../helpers/loadPage';\nimport { prefetchBlockData } from '../../data/prefetchBlockData';\n\nexport type UsePageParams = {\n client: RiverbankClient;\n siteId: string;\n path: string;\n pageId?: string;\n /**\n * If true, fetches draft/unpublished content instead of published content.\n * This affects both the page structure and block data loaders.\n * Requires API key with site access.\n *\n * @default false\n */\n preview?: boolean;\n};\n\nexport type UsePageResult =\n | { loading: true; error: null; page: null; theme: null; siteId: string; resolvedData: null; sdkConfig: null }\n | { loading: false; error: Error; page: null; theme: null; siteId: string; resolvedData: null; sdkConfig: null }\n | { loading: false; error: null; sdkConfig: RuntimeSdkConfig | null } & Omit<PageProps, 'registry' | 'wrapBlock' | 'usePlaceholders' | 'sdkConfig'>;\n\n/**\n * Client-side React hook to fetch all data needed for <Page> component.\n *\n * Fetches site data, page data, and prefetches block data loaders.\n * Returns loading and error states for proper UI handling.\n *\n * IMPORTANT: The client object should be stable across renders to avoid\n * unnecessary re-fetches. Create it outside your component or use useMemo:\n *\n * ```tsx\n * // ✅ Good - stable reference\n * const client = useMemo(\n * () => createRiverbankClient({ apiKey, baseUrl }),\n * [apiKey, baseUrl]\n * );\n *\n * // ❌ Bad - new client on every render (causes infinite loops)\n * const client = createRiverbankClient({ apiKey, baseUrl });\n * ```\n *\n * @example Basic usage\n * ```tsx\n * import { createRiverbankClient } from '@riverbankcms/sdk';\n * import { usePage, Page } from '@riverbankcms/sdk/rendering';\n *\n * const client = createRiverbankClient({\n * apiKey: process.env.NEXT_PUBLIC_RIVERBANK_API_KEY!,\n * baseUrl: process.env.NEXT_PUBLIC_DASHBOARD_URL + '/api',\n * });\n *\n * function MyPage({ path }: { path: string }) {\n * const pageData = usePage({ client, siteId: 'site-123', path });\n *\n * if (pageData.loading) {\n * return <div>Loading...</div>;\n * }\n *\n * if (pageData.error) {\n * return <div>Error: {pageData.error.message}</div>;\n * }\n *\n * return <Page {...pageData} />;\n * }\n * ```\n *\n * @example With custom loading/error states\n * ```tsx\n * function MyPage({ path }: { path: string }) {\n * const pageData = usePage({ client, siteId: 'site-123', path });\n *\n * if (pageData.loading) {\n * return <Skeleton />;\n * }\n *\n * if (pageData.error) {\n * return (\n * <ErrorBoundary\n * error={pageData.error}\n * onRetry={() => window.location.reload()}\n * />\n * );\n * }\n *\n * return <Page {...pageData} />;\n * }\n * ```\n */\nexport function usePage(params: UsePageParams): UsePageResult {\n const { client, siteId, path, pageId, preview = false } = params;\n\n const [result, setResult] = useState<UsePageResult>({\n loading: true,\n error: null,\n page: null,\n theme: null,\n siteId,\n resolvedData: null,\n sdkConfig: null,\n });\n\n useEffect(() => {\n let cancelled = false;\n\n async function fetchPage() {\n try {\n // Fetch site and page data in parallel\n const [site, pageResponse] = await Promise.all([\n client.getSite({ id: siteId }),\n client.getPage({ siteId, path, preview }),\n ]);\n\n // If component unmounted, don't update state\n if (cancelled) return;\n\n // Extract page data (getContentByPath can return page or entry)\n if ('entry' in pageResponse) {\n throw new Error(\n 'This path resolves to a content entry, not a page. ' +\n 'Use useContent() instead, which handles both pages and entries. ' +\n 'For entries, useContent() returns the raw entry data for custom rendering.'\n );\n }\n\n const { page: pageData } = pageResponse;\n\n // Convert API response blocks to PageOutline format\n // API returns blocks with full content, but PageOutline only needs structure\n const blocks = pageData.blocks.map((block) => {\n if (!block || typeof block !== 'object') {\n throw new Error('Invalid block format in API response');\n }\n if (typeof block.id !== 'string' && block.id !== null) {\n throw new Error(`Invalid block id: expected string or null, got ${typeof block.id}`);\n }\n if (typeof block.kind !== 'string') {\n throw new Error(`Invalid block kind: expected string, got ${typeof block.kind}`);\n }\n if (typeof block.purpose !== 'string') {\n throw new Error(`Invalid block purpose: expected string, got ${typeof block.purpose}`);\n }\n return {\n id: block.id,\n kind: block.kind,\n purpose: block.purpose,\n };\n });\n\n const pageOutline = {\n name: pageData.name,\n path: pageData.path,\n purpose: pageData.purpose,\n blocks,\n };\n\n // Prefetch block data loaders\n const resolvedData = await prefetchBlockData(\n pageOutline,\n {\n siteId,\n pageId: pageId ?? pageData.id,\n previewStage: preview ? 'preview' : 'published',\n },\n client\n );\n\n // If component unmounted, don't update state\n if (cancelled) return;\n\n setResult({\n loading: false,\n error: null,\n page: pageOutline,\n theme: site.theme,\n siteId,\n resolvedData,\n sdkConfig: site.sdkConfig ?? null,\n });\n } catch (error) {\n if (cancelled) return;\n\n setResult({\n loading: false,\n error: error instanceof Error ? error : new Error(String(error)),\n page: null,\n theme: null,\n siteId,\n resolvedData: null,\n sdkConfig: null,\n });\n }\n }\n\n fetchPage();\n\n return () => {\n cancelled = true;\n };\n }, [client, siteId, path, pageId, preview]);\n\n return result;\n}\n","import type { BlockManifest, FieldDefinition } from './schema';\n\n/**\n * Augments a block manifest with synthetic fields and other transformations.\n * This should be called at the block definition level, not at runtime.\n *\n * Current augmentations:\n * - Adds a variant select field if the manifest has multiple variants\n *\n * Future augmentations might include:\n * - Theme field injection\n * - Spacing/layout presets\n * - Animation controls\n */\nexport function augmentManifest(manifest: BlockManifest): BlockManifest {\n let augmentedFields = manifest.fields ?? [];\n\n // Add variant field if block has multiple variants\n const variantField = createVariantField(manifest);\n if (variantField) {\n augmentedFields = [variantField, ...augmentedFields];\n }\n\n return {\n ...manifest,\n fields: augmentedFields,\n };\n}\n\n/**\n * Creates a synthetic variant field definition when a manifest has variants.\n */\nfunction createVariantField(manifest: BlockManifest): FieldDefinition | null {\n if (!manifest.variants || Object.keys(manifest.variants).length <= 1) {\n return null;\n }\n\n const variantKeys = Object.keys(manifest.variants);\n\n const field: FieldDefinition = {\n id: 'variant',\n type: 'select',\n label: 'Variant',\n description: 'Choose a layout variant for this block',\n required: false,\n defaultValue: manifest.defaultVariant ?? variantKeys[0],\n options: variantKeys.map((key) => ({\n value: key,\n label: formatVariantLabel(key),\n })),\n multiple: false,\n };\n\n return field;\n}\n\nfunction formatVariantLabel(variantKey: string): string {\n // Convert camelCase or snake_case to Title Case\n // Examples: \"splitReverse\" → \"Split Reverse\", \"classic\" → \"Classic\"\n return variantKey\n .replace(/([A-Z])/g, ' $1') // Add space before capitals\n .replace(/_/g, ' ') // Replace underscores with spaces\n .trim()\n .split(' ')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ');\n}\n","import type { BlockManifest } from \"./schema\";\n\nconst REGISTRY_SYMBOL = Symbol.for(\"@riverbankcms/blocks/manifest-registry\");\n\ntype ManifestRegistryStore = Map<string, BlockManifest>;\n\ninterface ManifestRegistryGlobal extends Record<PropertyKey, unknown> {\n [REGISTRY_SYMBOL]?: ManifestRegistryStore;\n}\n\nconst globalScope = globalThis as ManifestRegistryGlobal;\n\nif (!globalScope[REGISTRY_SYMBOL]) {\n globalScope[REGISTRY_SYMBOL] = new Map();\n}\n\nconst manifestStore = globalScope[REGISTRY_SYMBOL]!;\n\nexport function registerManifest(manifest: BlockManifest): BlockManifest {\n manifestStore.set(manifest.name, manifest);\n return manifest;\n}\n\nexport function getManifestByName(name: string): BlockManifest | undefined {\n return manifestStore.get(name);\n}\n\nexport function hasManifest(name: string): boolean {\n return manifestStore.has(name);\n}\n\nexport function listManifests(): BlockManifest[] {\n return Array.from(manifestStore.values());\n}\n\nexport function clearManifestRegistry(): void {\n const env = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env?.NODE_ENV;\n if (env === \"production\") {\n return;\n }\n\n manifestStore.clear();\n}\n","import { z } from \"zod\";\nimport { NodeSchema } from \"../node\";\n\n/**\n * Visibility levels gate editor access to fields/slots.\n */\nexport const visibilityLevels = [\"admin\", \"designer\", \"author\"] as const;\nexport type VisibilityLevel = (typeof visibilityLevels)[number];\n\n// metadata has been removed from BlockManifest. Use manifest.title/description\n// directly for any display purposes.\n\nconst uiSchema = z\n .object({\n widget: z.string().optional(),\n flattenInRepeater: z.boolean().optional(),\n hidden: z.boolean().optional(),\n hideLabel: z.boolean().optional(),\n hideDescription: z.boolean().optional(),\n showCharCount: z\n .union([z.number().int().positive(), z.object({ max: z.number().int().positive() })])\n .optional(),\n showSlugPreview: z.boolean().optional(),\n variant: z.enum(['full', 'inline', 'limited', 'media']).optional(),\n richTextVariant: z.enum(['full', 'inline', 'limited', 'media']).optional(),\n // Optional input hints for validators/widgets\n inputType: z.enum(['text', 'email', 'tel', 'number']).optional(),\n min: z.number().optional(),\n max: z.number().optional(),\n step: z.number().optional(),\n pattern: z.string().optional(),\n placeholder: z.string().optional(),\n visibleWhen: z\n .object({\n field: z.string().min(1),\n equals: z.any().optional(),\n notEquals: z.any().optional(),\n oneOf: z.array(z.any()).optional(),\n notIn: z.array(z.any()).optional(),\n })\n .optional(),\n // Modal configuration for modal and group fields\n modalConfig: z\n .object({\n buttonLabel: z.string().optional(),\n description: z.string().optional(),\n buttonVariant: z.enum(['default', 'outline']).optional(),\n showCustomizedIndicator: z.boolean().optional(),\n maxWidth: z.string().optional(),\n })\n .optional(),\n // Background field configuration\n allowedTypes: z.array(z.enum(['color', 'gradient', 'image'])).optional(),\n // Tab group configuration\n fullWidth: z.boolean().optional(),\n // Field layout configuration\n row: z.string().optional(),\n colSpan: z.number().int().min(1).max(4).optional(),\n // Group layout configuration\n layout: z.enum(['stack', 'grid']).optional(),\n columns: z.number().int().min(2).max(4).optional(),\n // Entry picker configuration\n contentTypeField: z.string().optional(),\n })\n .partial();\n\nconst baseFieldSchema = z.object({\n id: z.string().min(1, \"Field id is required\"),\n label: z.string().min(1, \"Field label is required\"),\n description: z.string().optional(),\n visibleRoles: z.array(z.enum(visibilityLevels)).optional(),\n defaultValue: z.any().optional(),\n required: z.boolean().default(false),\n ui: uiSchema.optional(),\n});\n\nconst textFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"text\"),\n multiline: z.boolean().default(false),\n maxLength: z.number().int().positive().optional(),\n});\n\nconst richTextFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"richText\"),\n format: z.enum([\"markdown\", \"html\"]).default(\"markdown\"),\n});\n\nconst mediaFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"media\"),\n mediaKinds: z.array(z.enum([\"image\", \"video\"])).default([\"image\"]),\n aspectRatio: z.string().optional(),\n});\n\nconst booleanFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"boolean\"),\n});\n\nconst dateFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"date\"),\n});\n\nconst timeFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"time\"),\n});\n\nconst dateTimeFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"datetime\"),\n});\n\nconst slugFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"slug\"),\n sourceFieldId: z.string().min(1).optional(),\n statusFieldId: z.string().min(1).optional(),\n maxLength: z.number().int().positive().optional(),\n});\n\nconst urlFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"url\"),\n allowRelative: z.boolean().default(false),\n});\n\nconst linkFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"link\"),\n});\n\nconst selectFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"select\"),\n options: z.array(z.object({\n value: z.string(),\n label: z.string(),\n })).min(1),\n multiple: z.boolean().default(false),\n});\n\nconst referenceFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"reference\"),\n referenceKind: z.string().min(1),\n allowManualEntry: z.boolean().default(false),\n});\n\n/**\n * Item type schema for polymorphic repeaters.\n * Each type has a label, optional icon, and its own field schema.\n */\nconst itemTypeSchema = z.object({\n label: z.string().min(1),\n icon: z.string().optional(),\n fields: z.lazy(() => getFieldSchemaInternal().array().min(1, \"Item type requires at least one field\")),\n});\n\n/**\n * Repeater fields allow nesting of other fields within them.\n * This enables complex layouts and structures by repeating a set of fields.\n *\n * Supports two modes:\n * 1. Monomorphic (default): All items have the same schema\n * 2. Polymorphic: Items can be different types (e.g., card, quote, stat)\n *\n * Uses z.lazy() to allow mutual recursion.\n */\nconst repeaterFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"repeater\"),\n itemLabel: z.string().default(\"Item\"),\n itemLabelSource: z.string().optional(),\n minItems: z.number().int().min(0).default(0),\n maxItems: z.number().int().positive().optional(),\n\n // Monomorphic mode\n schema: z.object({\n fields: z.lazy(() => getFieldSchemaInternal().array().min(1, \"Repeater requires at least one field\")),\n }).optional(),\n\n // Polymorphic mode\n polymorphic: z.boolean().optional(),\n itemTypes: z.record(z.string(), itemTypeSchema).optional(),\n allowConversion: z.boolean().default(true),\n}).refine(\n (data) => {\n // Either schema OR (polymorphic + itemTypes) must be present\n const hasSchema = data.schema !== undefined;\n const hasPolymorphic = data.polymorphic === true && data.itemTypes !== undefined;\n return hasSchema !== hasPolymorphic; // XOR: exactly one must be true\n },\n {\n message: \"Repeater must have either 'schema' (monomorphic) or 'polymorphic: true' with 'itemTypes' (polymorphic)\",\n }\n);\n\nconst groupFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"group\"),\n schema: z.object({\n fields: z.lazy(() => getFieldSchemaInternal().array().min(1, \"Group requires at least one field\")),\n }),\n});\n\nconst modalFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"modal\"),\n schema: z.object({\n fields: z.lazy(() => getFieldSchemaInternal().array().min(1, \"Modal requires at least one field\")),\n }),\n});\n\nconst numberFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"number\"),\n min: z.number().optional(),\n max: z.number().optional(),\n step: z.number().optional(),\n});\n\nconst tabDefinitionSchema = z.object({\n id: z.string().min(1),\n label: z.string().min(1),\n icon: z.string().optional(),\n description: z.string().optional(),\n fields: z.lazy(() => getFieldSchemaInternal().array()),\n /** SDK section option that controls tab visibility based on site config */\n sdkSectionOption: z.enum(['backgroundColor', 'backgroundGradient', 'backgroundImage']).optional(),\n});\n\nconst tabGroupFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"tabGroup\"),\n tabs: z.array(tabDefinitionSchema).min(1, \"TabGroup requires at least one tab\"),\n activeTabField: z.string().optional(),\n});\n\nconst presetOptionSchema = z.object({\n value: z.string(),\n label: z.string(),\n});\n\nconst presetOrCustomFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"presetOrCustom\"),\n presets: z.array(presetOptionSchema).min(1, \"PresetOrCustom requires at least one preset\"),\n customInput: z.object({\n placeholder: z.string().optional(),\n pattern: z.string().optional(),\n helpText: z.string().optional(),\n }).optional(),\n});\n\nconst contentTypeSelectFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"contentTypeSelect\"),\n /** Filter: all, routable (hasPages=true), nonRoutable (hasPages=false) */\n filter: z.enum([\"all\", \"routable\", \"nonRoutable\"]).default(\"all\"),\n});\n\nconst entryPickerFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"entryPicker\"),\n});\n\ntype FieldSchemaMembers = readonly [\n typeof textFieldSchema,\n typeof richTextFieldSchema,\n typeof mediaFieldSchema,\n typeof booleanFieldSchema,\n typeof numberFieldSchema,\n typeof dateFieldSchema,\n typeof timeFieldSchema,\n typeof dateTimeFieldSchema,\n typeof slugFieldSchema,\n typeof urlFieldSchema,\n typeof linkFieldSchema,\n typeof selectFieldSchema,\n typeof referenceFieldSchema,\n typeof repeaterFieldSchema,\n typeof groupFieldSchema,\n typeof modalFieldSchema,\n typeof tabGroupFieldSchema,\n typeof presetOrCustomFieldSchema,\n typeof contentTypeSelectFieldSchema,\n typeof entryPickerFieldSchema,\n];\n\ntype FieldSchemaUnion = z.ZodDiscriminatedUnion<FieldSchemaMembers, \"type\">;\n\n// Cached instance for lazy initialization\nlet _fieldSchemaInternal: FieldSchemaUnion | null = null;\n\nfunction getFieldSchemaInternal(): FieldSchemaUnion {\n // Lazy initialization to avoid module-level circular reference issues\n // when bundled into a single file\n if (_fieldSchemaInternal) {\n return _fieldSchemaInternal;\n }\n\n _fieldSchemaInternal = z.discriminatedUnion(\"type\", [\n textFieldSchema,\n richTextFieldSchema,\n mediaFieldSchema,\n booleanFieldSchema,\n numberFieldSchema,\n dateFieldSchema,\n timeFieldSchema,\n dateTimeFieldSchema,\n slugFieldSchema,\n urlFieldSchema,\n linkFieldSchema,\n selectFieldSchema,\n referenceFieldSchema,\n repeaterFieldSchema,\n groupFieldSchema,\n modalFieldSchema,\n tabGroupFieldSchema,\n presetOrCustomFieldSchema,\n contentTypeSelectFieldSchema,\n entryPickerFieldSchema,\n ]) as unknown as FieldSchemaUnion;\n\n return _fieldSchemaInternal;\n}\n\n// Getter function for programmatic access\nexport function getFieldSchema(): FieldSchemaUnion {\n return getFieldSchemaInternal();\n}\n\n// Lazy proxy that forwards all method calls to getFieldSchemaInternal()\n// This allows backward compatibility with code using fieldSchema.array(), .parse(), etc.\n// The actual schema is only created when a method is first called\nexport const fieldSchema: FieldSchemaUnion = new Proxy({} as FieldSchemaUnion, {\n get(_, prop: keyof FieldSchemaUnion) {\n const schema = getFieldSchemaInternal();\n const value = schema[prop];\n // Bind functions to the schema so `this` works correctly\n return typeof value === 'function' ? value.bind(schema) : value;\n },\n // Forward has checks to the real schema\n has(_, prop) {\n return prop in getFieldSchemaInternal();\n },\n});\n\nexport type FieldSchema = FieldSchemaUnion;\n\nexport type TextFieldDefinition = z.output<typeof textFieldSchema>;\nexport type RichTextFieldDefinition = z.output<typeof richTextFieldSchema>;\nexport type MediaFieldDefinition = z.output<typeof mediaFieldSchema>;\nexport type BooleanFieldDefinition = z.output<typeof booleanFieldSchema>;\nexport type NumberFieldDefinition = z.output<typeof numberFieldSchema>;\nexport type DateFieldDefinition = z.output<typeof dateFieldSchema>;\nexport type TimeFieldDefinition = z.output<typeof timeFieldSchema>;\nexport type DateTimeFieldDefinition = z.output<typeof dateTimeFieldSchema>;\nexport type SlugFieldDefinition = z.output<typeof slugFieldSchema>;\nexport type UrlFieldDefinition = z.output<typeof urlFieldSchema>;\nexport type LinkFieldDefinition = z.output<typeof linkFieldSchema>;\nexport type SelectFieldDefinition = z.output<typeof selectFieldSchema>;\nexport type ReferenceFieldDefinition = z.output<typeof referenceFieldSchema>;\nexport type ItemTypeDefinition = {\n label: string;\n icon?: string;\n fields: FieldDefinition[];\n};\n\nexport type RepeaterFieldDefinition = Omit<z.output<typeof repeaterFieldSchema>, \"schema\" | \"itemTypes\"> & {\n schema?: {\n fields: FieldDefinition[];\n };\n itemTypes?: Record<string, ItemTypeDefinition>;\n};\n\nexport type GroupFieldDefinition = Omit<z.output<typeof groupFieldSchema>, \"schema\"> & {\n schema: {\n fields: FieldDefinition[];\n };\n};\n\nexport type ModalFieldDefinition = Omit<z.output<typeof modalFieldSchema>, \"schema\"> & {\n schema: {\n fields: FieldDefinition[];\n };\n};\n\nexport type TabDefinition = {\n id: string;\n label: string;\n icon?: string;\n description?: string;\n fields: FieldDefinition[];\n /**\n * Optional SDK section option that controls tab visibility.\n * When set, the tab is only shown when the SDK sectionOptions[key] is not false.\n */\n sdkSectionOption?: 'backgroundColor' | 'backgroundGradient' | 'backgroundImage';\n};\n\nexport type TabGroupFieldDefinition = Omit<z.output<typeof tabGroupFieldSchema>, \"tabs\"> & {\n tabs: TabDefinition[];\n};\n\nexport type PresetOption = {\n value: string;\n label: string;\n};\n\nexport type PresetOrCustomFieldDefinition = z.output<typeof presetOrCustomFieldSchema>;\n\nexport type ContentTypeSelectFieldDefinition = z.output<typeof contentTypeSelectFieldSchema>;\n\nexport type EntryPickerFieldDefinition = z.output<typeof entryPickerFieldSchema>;\n\nexport type FieldDefinition =\n | TextFieldDefinition\n | RichTextFieldDefinition\n | MediaFieldDefinition\n | BooleanFieldDefinition\n | NumberFieldDefinition\n | DateFieldDefinition\n | TimeFieldDefinition\n | DateTimeFieldDefinition\n | SlugFieldDefinition\n | UrlFieldDefinition\n | LinkFieldDefinition\n | SelectFieldDefinition\n | ReferenceFieldDefinition\n | RepeaterFieldDefinition\n | GroupFieldDefinition\n | ModalFieldDefinition\n | TabGroupFieldDefinition\n | PresetOrCustomFieldDefinition\n | ContentTypeSelectFieldDefinition\n | EntryPickerFieldDefinition;\n\n/**\n * Union type of all possible block field types.\n * Extracted from FieldDefinition for use in type compatibility checks.\n */\nexport type BlockFieldType = FieldDefinition['type'];\n\nexport const slotSchema = z.object({\n id: z.string().min(1),\n label: z.string().min(1),\n allowedKinds: z.array(z.string()).default([]),\n min: z.number().int().min(0).default(0),\n max: z.number().int().positive().optional(),\n help: z.string().optional(),\n visibleRoles: z.array(z.enum(visibilityLevels)).optional(),\n});\n\nexport type SlotDefinition = z.infer<typeof slotSchema>;\n\nconst typographyTokens = [\"display\", \"heading\", \"subheading\", \"body\", \"caption\"] as const;\nconst colorTokens = [\"background\", \"surface\", \"foreground\", \"accent\", \"muted\"] as const;\nconst spacingTokens = [\"none\", \"xs\", \"sm\", \"md\", \"lg\", \"xl\"] as const;\nconst radiusTokens = [\"none\", \"sm\", \"md\", \"lg\", \"full\"] as const;\n\nexport const styleTokenSchema = z.object({\n background: z.enum(colorTokens).optional(),\n foreground: z.enum(colorTokens).optional(),\n border: z.enum(colorTokens).optional(),\n typography: z.enum(typographyTokens).optional(),\n spacing: z.enum(spacingTokens).optional(),\n radius: z.enum(radiusTokens).optional(),\n});\n\nexport type StyleTokenConfig = z.infer<typeof styleTokenSchema>;\n\nexport const behaviourSchema = z.object({\n supportsThemeSwitching: z.boolean().default(true),\n inlineEditing: z.boolean().default(false),\n animation: z.boolean().default(false),\n // Hide from block picker palettes (e.g., header/footer system blocks)\n paletteHidden: z.boolean().default(false),\n});\n\nexport type BehaviourConfig = z.infer<typeof behaviourSchema>;\n\n// Block discovery and organization metadata\nexport const blockCategoryEnum = z.enum(['marketing', 'content', 'blog', 'media', 'layout', 'interactive']);\nexport type BlockCategory = z.infer<typeof blockCategoryEnum>;\n\nexport const manifestSchema = z.object({\n name: z.string().min(1),\n version: z.string().min(1),\n title: z.string().min(1),\n titleSource: z.string().optional(),\n description: z.string().optional(),\n component: z.string().min(1),\n fields: fieldSchema.array().default([]),\n slots: slotSchema.array().default([]),\n styleTokens: styleTokenSchema.optional(),\n behaviours: behaviourSchema.optional(),\n layout: NodeSchema.optional(),\n // Block variants system\n variants: z.record(z.string(), NodeSchema).optional(),\n defaultVariant: z.string().optional(),\n // Discovery metadata\n category: blockCategoryEnum.optional(),\n contentTypes: z.array(z.string()).optional(),\n tags: z.array(z.string()).optional(),\n icon: z.string().optional(),\n});\n\nexport type BlockManifest = z.infer<typeof manifestSchema>;\n\n// ============================================================================\n// SDK Custom Block Types\n// ============================================================================\n\n/**\n * Whitelisted CMS loader endpoints for SDK custom blocks.\n *\n * The canonical list is SUPPORTED_LOADER_ENDPOINTS in @riverbankcms/sdk/data.\n * This type must remain in sync. The SDK validation derives its Zod schema\n * from that constant, ensuring runtime and compile-time consistency.\n *\n * Supported endpoints:\n * - listPublishedEntries: Fetch published content entries\n * - getPublishedEntryPreview: Fetch a single entry by slug\n * - listPublicEvents: Fetch public calendar events\n * - getPublicFormById: Fetch a form configuration\n * - getPublicBookingServices: Fetch booking services\n */\nexport type SdkLoaderEndpoint =\n | 'listPublishedEntries'\n | 'getPublishedEntryPreview'\n | 'listPublicEvents'\n | 'getPublicFormById'\n | 'getPublicBookingServices';\n\n/**\n * A binding expression for dynamic loader params.\n *\n * Bindings resolve at runtime from block content or page context:\n * - `content.fieldName` - Value from block's content field\n * - `$root.siteId` - Site ID from page context\n * - `$root.pageId` - Page ID from page context\n * - `$root.previewStage` - 'published' or 'preview'\n */\nexport type ParamBinding = {\n $bind: {\n /** Path to bind from (e.g., 'content.categoryId', '$root.siteId') */\n from: string;\n /** Fallback value if binding resolves to undefined */\n fallback?: string;\n };\n};\n\n/**\n * A loader param value can be static or a binding expression.\n */\nexport type LoaderParamValue = string | number | boolean | ParamBinding;\n\n/**\n * Config-based data loader for SDK custom blocks.\n *\n * Config loaders are declarative and restricted to whitelisted CMS endpoints.\n * They execute server-side during loadPage().\n */\nexport interface SdkConfigLoader {\n /** Whitelisted CMS endpoint to call */\n endpoint: SdkLoaderEndpoint;\n\n /**\n * Parameters to pass to the endpoint.\n * Values can be static or use bindings for dynamic resolution.\n */\n params: Record<string, LoaderParamValue>;\n\n /**\n * Execution mode.\n * Currently only 'server' is implemented - loaders run during loadPage().\n * 'client' is reserved for future client-side refresh functionality.\n * @default 'server'\n */\n mode?: 'server' | 'client';\n}\n\n/**\n * SDK Custom Block Definition\n *\n * Used by SDK sites to define entirely new blocks in their riverbank.config.ts.\n * These blocks:\n * - Have their own field schemas (using standard FieldDefinition format)\n * - Appear in the CMS block picker alongside system blocks\n * - Are edited using CMS-generated forms (existing infrastructure)\n * - MUST be rendered via blockOverrides on the SDK site\n *\n * Block IDs must start with 'custom.' to distinguish from system blocks.\n */\nexport interface SdkCustomBlock {\n /** Block ID - MUST start with 'custom.' (e.g., 'custom.team-member') */\n id: `custom.${string}`;\n\n /** Display title in block picker */\n title: string;\n\n /** Field ID to use as block title in lists (must match a field id) */\n titleSource?: string;\n\n /** Description shown in block picker */\n description?: string;\n\n /** Category for block picker organization */\n category: BlockCategory;\n\n /** Lucide icon name */\n icon?: string;\n\n /** Search tags for block discovery */\n tags?: string[];\n\n /** Field definitions - uses same type as system blocks */\n fields: FieldDefinition[];\n\n /**\n * Config-based data loaders for CMS endpoints.\n *\n * Keys are loader names (e.g., 'posts', 'events').\n * Data is available in the component as `data.{key}`.\n *\n * @example\n * ```typescript\n * dataLoaders: {\n * events: {\n * endpoint: 'listPublicEvents',\n * params: {\n * siteId: { $bind: { from: '$root.siteId' } },\n * limit: { $bind: { from: 'content.limit', fallback: '5' } },\n * },\n * },\n * }\n * ```\n */\n dataLoaders?: Record<string, SdkConfigLoader>;\n}\n","import { z } from \"zod\";\n\nconst transformStepSchema = z.object({\n id: z.string().min(1, \"Transform requires an identifier\"),\n options: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const bindingPathSchema = z\n .string()\n .min(1, \"Binding path is required\")\n .regex(/[A-Za-z0-9_\\.$\\[\\]/-]+/, \"Binding path contains invalid characters\");\n\nexport const bindingSchema = z.object({\n from: bindingPathSchema,\n fallback: z.unknown().optional(),\n transforms: transformStepSchema.array().default([]),\n pick: z.enum([\"value\", \"collection\", \"context\"]).default(\"value\"),\n});\n\nexport type Binding = z.infer<typeof bindingSchema>;\n\nexport const repeatSchema = z.object({\n collection: bindingSchema,\n itemName: z.string().min(1).default(\"item\"),\n indexName: z.string().min(1).default(\"index\"),\n limit: z.number().int().positive().optional(),\n sortBy: z\n .object({\n path: bindingPathSchema,\n direction: z.enum([\"asc\", \"desc\"]).default(\"asc\"),\n })\n .optional(),\n});\n\nexport type RepeatConfig = z.infer<typeof repeatSchema>;\n\nexport const conditionSchema = z.object({\n when: bindingSchema,\n equals: z.unknown().optional(),\n not: z.boolean().default(false),\n});\n\nexport type ConditionConfig = z.infer<typeof conditionSchema>;\n\nexport const dataScopeSchema = z.object({\n name: z.string().min(1),\n from: bindingSchema,\n});\n\nexport type DataScope = z.infer<typeof dataScopeSchema>;\n\nexport const nodePropsSchema = z.record(z.string(), z.unknown()).default({});\n\nexport const nodeSchema: z.ZodType<any> = z.object({\n type: z.string().min(1, \"Node type is required\"),\n key: z.string().optional(),\n props: nodePropsSchema.optional(),\n children: z.lazy(() => nodeSchema.array().default([])).optional(),\n $bind: bindingSchema.optional(),\n $repeat: repeatSchema.optional(),\n $when: conditionSchema.optional(),\n $scopes: dataScopeSchema.array().optional(),\n});\n\nexport type NodeDefinition = z.infer<typeof nodeSchema>;\n\nexport const nodeTreeSchema = nodeSchema.array().or(nodeSchema);\n\nexport type NodeTree = z.infer<typeof nodeTreeSchema>;\n\nexport const NodeSchema = nodeSchema;\nexport const NodeTreeSchema = nodeTreeSchema;\n","import type { NodeDefinition } from './schema';\n\n/**\n * Creates conditional layout branches based on item type.\n * Used for polymorphic repeaters where each item type has a different layout.\n *\n * @param itemTypesMap - Map of type IDs to their layout definitions\n * @param options - Configuration options\n * @returns Array of conditional node definitions\n *\n * @example\n * ```typescript\n * // In a repeater with items: [{_type: 'card', ...}, {_type: 'quote', ...}]\n * const children = typeBasedLayout({\n * card: stack({}, [\n * text({ as: 'h3' }, bind('item.title')),\n * richText({}, bind('item.body'))\n * ]),\n * quote: stack({}, [\n * richText({}, bind('item.text')),\n * text({ className: 'author' }, bind('item.author'))\n * ])\n * }, { itemName: 'item' });\n * ```\n */\nexport function typeBasedLayout(\n itemTypesMap: Record<string, NodeDefinition>,\n options?: {\n /**\n * Name of the repeater item variable (default: 'item')\n */\n itemName?: string;\n }\n): NodeDefinition[] {\n const itemName = options?.itemName ?? 'item';\n\n const result = Object.entries(itemTypesMap).map(([typeId, layout]) => {\n // Unwrap single-element arrays (fragments return [NodeDefinition])\n const node = Array.isArray(layout) && layout.length === 1 ? layout[0] : layout;\n\n return {\n ...node,\n $when: {\n when: { from: `${itemName}._type` },\n equals: typeId\n }\n };\n });\n\n return result;\n}\n","import { z } from \"zod\";\n\nimport {\n fieldSchema,\n type BlockManifest,\n type FieldDefinition,\n type TextFieldDefinition,\n type SelectFieldDefinition,\n type ReferenceFieldDefinition,\n type RepeaterFieldDefinition,\n type SlugFieldDefinition,\n type UrlFieldDefinition,\n} from \"./schema\";\nimport { buildRichTextSchema as buildSharedRichTextSchema } from \"./richTextSchema\";\n\ntype FieldShape = Record<string, z.ZodTypeAny>;\n\ntype ValidatorOptions = {\n allowNull?: boolean;\n /**\n * When true, required fields can be missing (undefined).\n * Use for autosave scenarios where content may be incomplete.\n */\n allowIncomplete?: boolean;\n};\n\nexport function createManifestValidator(\n manifestOrFields: BlockManifest | FieldDefinition[],\n options: ValidatorOptions = {},\n): z.ZodType<Record<string, unknown>> {\n const allowNull = options.allowNull ?? true;\n const allowIncomplete = options.allowIncomplete ?? false;\n const shape: FieldShape = {};\n\n const fields: FieldDefinition[] = Array.isArray(manifestOrFields)\n ? (manifestOrFields as FieldDefinition[])\n : (((manifestOrFields as BlockManifest).fields as FieldDefinition[] | undefined) ?? []);\n\n for (const field of fields) {\n shape[field.id] = buildFieldSchema(field, allowNull, allowIncomplete);\n }\n\n return z.object(shape).catchall(z.unknown()).passthrough();\n}\n\nfunction buildFieldSchema(field: FieldDefinition, allowNull: boolean, allowIncomplete: boolean = false): z.ZodTypeAny {\n const required = Boolean(field.required);\n let schema: z.ZodTypeAny;\n\n switch (field.type) {\n case \"text\":\n schema = buildTextSchema(field);\n break;\n case \"richText\":\n schema = buildRichTextSchema();\n break;\n case \"media\": {\n // Media fields use record schema for the media object\n const baseMediaSchema = z.record(z.string(), z.unknown());\n // For optional media fields, null is ALWAYS valid (represents \"no media selected\")\n // regardless of allowNull flag. For required fields, null is controlled by allowNull.\n const isRequired = Boolean(field.required);\n schema = isRequired ? baseMediaSchema : baseMediaSchema.nullable();\n break;\n }\n case \"boolean\":\n schema = z.boolean();\n break;\n case \"slug\":\n schema = buildSlugSchema(field);\n break;\n case \"url\":\n schema = buildUrlSchema(field);\n break;\n case \"link\":\n schema = buildLinkSchema();\n break;\n case \"select\":\n schema = buildSelectSchema(field);\n break;\n case \"reference\":\n schema = buildReferenceSchema(field);\n break;\n case \"repeater\":\n schema = buildRepeaterSchema(field, allowNull, allowIncomplete);\n break;\n case \"group\":\n schema = buildGroupSchema(field, allowNull, allowIncomplete);\n break;\n default:\n schema = z.unknown();\n break;\n }\n\n return finalizeSchema(schema, required, allowNull, allowIncomplete);\n}\n\nfunction buildTextSchema(field: TextFieldDefinition) {\n const ui = (field as any)?.ui ?? {}\n const inputType: 'text' | 'email' | 'tel' | 'number' | undefined = ui?.inputType\n let schema: z.ZodTypeAny\n\n if (inputType === 'number') {\n schema = z.coerce.number()\n if (typeof ui?.min === 'number') schema = (schema as z.ZodNumber).min(ui.min)\n if (typeof ui?.max === 'number') schema = (schema as z.ZodNumber).max(ui.max)\n } else {\n schema = z.string()\n if (inputType === 'email') {\n schema = (schema as z.ZodString).email(`${field.label} must be a valid email`)\n }\n if (inputType === 'tel') {\n const TEL_RE = /^[+()0-9\\s\\-]{3,}$/\n schema = (schema as z.ZodString).regex(TEL_RE, `${field.label} must be a valid phone number`)\n }\n if (ui?.pattern) {\n try {\n const re = new RegExp(ui.pattern)\n schema = (schema as z.ZodString).regex(re, `${field.label} is not in the correct format`)\n } catch {}\n }\n if (field.maxLength) {\n schema = (schema as z.ZodString).max(field.maxLength, `${field.label} must have at most ${field.maxLength} characters`)\n }\n if (field.required) {\n schema = (schema as z.ZodString).min(1, `${field.label} is required`)\n }\n }\n\n return schema\n}\n\nfunction buildRichTextSchema() {\n // Use shared rich text schema for consistency across packages\n return buildSharedRichTextSchema();\n}\n\nconst SLUG_PATTERN = /^(?:[a-z0-9]+(?:-[a-z0-9]+)*)(?:\\/(?:[a-z0-9]+(?:-[a-z0-9]+)*))*$/;\n\nfunction buildSlugSchema(field: SlugFieldDefinition) {\n const message = `${field.label} must contain lowercase letters, numbers, and dashes`;\n let schema = z.string().regex(SLUG_PATTERN, message);\n\n if (field.maxLength) {\n schema = schema.max(field.maxLength, `${field.label} must be at most ${field.maxLength} characters`);\n }\n\n if (field.required) {\n schema = schema.min(1, `${field.label} is required`);\n }\n\n return schema;\n}\n\nconst ALLOWED_URL_PROTOCOLS = [\"http:\", \"https:\"] as const;\n\nfunction buildUrlSchema(field: UrlFieldDefinition) {\n const message = `${field.label} must be a valid URL`;\n\n const validate = (value: string) => {\n if (!value) {\n return !field.required;\n }\n if (field.allowRelative && value.startsWith(\"/\")) {\n return true;\n }\n try {\n const parsed = new URL(value);\n return ALLOWED_URL_PROTOCOLS.includes(parsed.protocol as (typeof ALLOWED_URL_PROTOCOLS)[number]);\n } catch {\n return false;\n }\n };\n\n let schema = z.string().trim().refine(validate, message);\n\n if (field.required) {\n schema = schema.min(1, `${field.label} is required`);\n }\n\n return schema;\n}\n\nfunction buildLinkSchema() {\n const nullableString = z.union([z.string().min(1), z.null()]);\n\n const internal = z\n .object({\n kind: z.literal(\"internal\"),\n routeId: z.string().min(1),\n entityId: z.string().min(1).optional(),\n entityType: z.enum([\"page\", \"content\"]).optional(),\n href: nullableString.optional(),\n title: nullableString.optional(),\n typeLabel: nullableString.optional(),\n contentTypeKey: nullableString.optional(),\n contentTypeName: nullableString.optional(),\n updatedAt: nullableString.optional(),\n })\n .passthrough();\n\n const external = z\n .object({\n kind: z.literal(\"external\"),\n href: z.string().min(1),\n })\n .passthrough();\n\n const custom = z\n .object({\n kind: z.literal(\"url\"),\n href: z.string().min(1),\n })\n .passthrough();\n\n return z.union([internal, external, custom]);\n}\n\nfunction buildSelectSchema(field: SelectFieldDefinition) {\n // If the field uses sdkSelect widget, options come from SDK config at runtime\n // and aren't known to the blocks package - accept any string value.\n // Validation is handled by the CMS editor which has access to SDK options.\n const ui = field.ui as { widget?: string } | undefined;\n if (ui?.widget === 'sdkSelect') {\n const anyStringSchema = z.string();\n if (field.multiple) {\n const arraySchema = z.array(anyStringSchema);\n return field.required ? arraySchema : arraySchema.nullable();\n }\n return field.required ? anyStringSchema : anyStringSchema.nullable();\n }\n\n const values = field.options.map((option) => option.value);\n const valueSchema = z\n .string()\n .refine((value) => values.includes(value), `${field.label} must be one of: ${values.join(\", \")}`);\n\n if (field.multiple) {\n const arraySchema = z.array(valueSchema);\n return field.required ? arraySchema : arraySchema.nullable();\n }\n\n return field.required ? valueSchema : valueSchema.nullable();\n}\n\nfunction buildReferenceSchema(field: ReferenceFieldDefinition) {\n let schema = z.string();\n if (field.required) {\n schema = schema.min(1, `${field.label} is required`);\n }\n return schema;\n}\n\nfunction buildRepeaterSchema(field: RepeaterFieldDefinition, allowNull: boolean, allowIncomplete: boolean) {\n const parsed = fieldSchema.array().parse(field.schema?.fields ?? []) as FieldDefinition[];\n const childShape: FieldShape = {};\n\n for (const child of parsed) {\n if (child.type === 'group' && (child.ui as any)?.flattenInRepeater) {\n const groupParsed = fieldSchema.array().parse(child.schema?.fields ?? []) as FieldDefinition[];\n for (const gc of groupParsed) {\n childShape[gc.id] = buildFieldSchema(gc, allowNull, allowIncomplete);\n }\n } else {\n childShape[child.id] = buildFieldSchema(child, allowNull, allowIncomplete);\n }\n }\n\n let schema = z.object(childShape).catchall(z.unknown()).passthrough();\n let arraySchema = z.array(schema);\n\n if (typeof field.minItems === \"number\") {\n arraySchema = arraySchema.min(field.minItems);\n }\n if (typeof field.maxItems === \"number\") {\n arraySchema = arraySchema.max(field.maxItems);\n }\n\n return arraySchema;\n}\n\nfunction buildGroupSchema(field: any, allowNull: boolean, allowIncomplete: boolean) {\n const parsed = fieldSchema.array().parse(field.schema?.fields ?? []) as FieldDefinition[];\n const childShape: FieldShape = {};\n for (const child of parsed) {\n childShape[child.id] = buildFieldSchema(child, allowNull, allowIncomplete);\n }\n return z.object(childShape).catchall(z.unknown()).passthrough();\n}\n\nfunction finalizeSchema(\n schema: z.ZodTypeAny,\n required: boolean,\n allowNull: boolean,\n allowIncomplete: boolean = false,\n): z.ZodTypeAny {\n if (required) {\n if (allowIncomplete) {\n // For autosave scenarios: accept value, null, OR undefined (missing)\n return allowNull ? schema.or(z.null()).optional() : schema.optional();\n }\n // Normal required field: accept value, and optionally null (but NOT undefined)\n return allowNull ? schema.or(z.null()) : schema;\n }\n return allowNull ? schema.optional().nullable() : schema.optional();\n}\n","import { z } from 'zod'\n\n/**\n * Shared Rich Text Schema\n *\n * This module provides a single source of truth for TipTap rich text validation\n * across both the block-form editor and the block rendering system.\n *\n * Format compatibility:\n * - Unwrapped format (new): { type: 'doc', content: [...] }\n * - Wrapped format (legacy): { doc: { type: 'doc', content: [...] } }\n *\n * Both formats are supported for backward compatibility during migration.\n */\n\n/**\n * TipTap document node schema (recursive structure)\n *\n * Supports the full TipTap document structure including:\n * - type: Node type (e.g., 'doc', 'paragraph', 'text')\n * - content: Nested array of child nodes\n * - text: Text content for text nodes\n * - attrs: Node attributes (e.g., alignment, color)\n * - marks: Text formatting marks (e.g., bold, italic)\n */\nexport const TipTapNodeSchema: z.ZodType<any> = z.lazy(() =>\n z.object({\n type: z.string(),\n content: z.array(TipTapNodeSchema).optional(),\n text: z.string().optional(),\n attrs: z.record(z.string(), z.any()).optional(),\n marks: z.array(z.any()).optional(),\n }),\n)\n\n/**\n * Rich text value schema\n *\n * Accepts both wrapped { doc: {...} } and unwrapped { type: 'doc', ... } formats\n * for backward compatibility during migration from wrapped to unwrapped format.\n *\n * Unwrapped format is preferred going forward as it's more direct and matches\n * TipTap's native structure.\n */\nexport const RichTextValueSchema = z.union([\n // New format: TipTap document directly\n TipTapNodeSchema,\n // Legacy format: wrapped in { doc: {...} }\n z.object({\n doc: TipTapNodeSchema,\n }),\n])\n\n/**\n * Build Zod validation schema for rich text fields\n *\n * @param options - Optional configuration\n * @param options.required - If true, validates that content is not empty\n * @param options.label - Field label for error messages (defaults to 'This field')\n * @returns Zod schema for rich text validation\n *\n * @example\n * // Basic usage\n * const schema = buildRichTextSchema()\n *\n * @example\n * // Required field with custom label\n * const schema = buildRichTextSchema({ required: true, label: 'Description' })\n */\n/**\n * TypeScript type for a TipTap document node\n *\n * Use this type for rich text content fields in block definitions.\n * Defined explicitly (rather than inferred) because recursive Zod schemas\n * require `z.ZodType<any>` which loses type information.\n */\nexport type TipTapNode = {\n type: string;\n content?: TipTapNode[];\n text?: string;\n attrs?: Record<string, unknown>;\n marks?: Array<{ type: string; attrs?: Record<string, unknown> }>;\n};\n\nexport function buildRichTextSchema(options?: { required?: boolean; label?: string }) {\n let schema = RichTextValueSchema\n\n if (options?.required) {\n const label = options.label ?? 'This field'\n // For required fields, ensure doc has actual content (not just empty paragraph)\n schema = schema.refine(\n (val) => {\n // Handle both wrapped { doc: {...} } and unwrapped { type: 'doc', ... } formats\n const doc = (val as any).doc ?? val\n const content = doc?.content\n if (!content || content.length === 0) return false\n // Check if it's just an empty paragraph\n if (content.length === 1 && content[0].type === 'paragraph' && !content[0].content) {\n return false\n }\n return true\n },\n {\n message: `${label} is required`,\n },\n )\n }\n\n return schema\n}\n","/**\n * Environment detection utilities\n *\n * Provides type-safe environment detection without relying on 'as any' casts.\n */\n\n/**\n * Check if the current environment is development.\n *\n * Returns true if NODE_ENV is not 'production', or if NODE_ENV cannot be determined\n * (which is the safe default for validation and warnings).\n *\n * @returns true if in development mode, false if in production\n */\nexport function isDevEnvironment(): boolean {\n try {\n // Try to access process.env.NODE_ENV safely\n if (typeof process !== 'undefined' && process.env?.NODE_ENV !== undefined) {\n return process.env.NODE_ENV !== 'production'\n }\n // If process.env is unavailable (e.g., browser context), assume dev (safe default)\n return true\n } catch {\n // If accessing process throws (strict browser context), assume dev (safe default)\n return true\n }\n}\n","/**\n * Type-safe node builder types\n *\n * These types prevent common mistakes like putting 'children' in props\n * by explicitly excluding reserved keys at compile time.\n */\n\nimport type { NodeDefinition } from './schema'\nimport { isDevEnvironment } from '../../utils/env'\n\n/**\n * Reserved keys that should NEVER appear in node props.\n * These are top-level NodeDefinition properties that would conflict if placed in props.\n *\n * Note: 'type' is NOT included because components may legitimately need a 'type' prop\n * (e.g., Accordion needs type=\"single\"). The NodeDefinition.type is separate from props.type.\n */\ntype ReservedNodeKeys =\n | 'children'\n | 'key'\n | '$bind'\n | '$when'\n | '$repeat'\n | '$scopes'\n\n/**\n * List of reserved keys (for runtime validation).\n * Kept in sync with the ReservedNodeKeys type above.\n */\nconst RESERVED_KEYS: readonly ReservedNodeKeys[] = [\n 'children',\n 'key',\n '$bind',\n '$when',\n '$repeat',\n '$scopes',\n] as const\n\n/**\n * Props type that explicitly excludes reserved keys.\n * This makes it a compile-time error to pass children, $bind, etc. in props.\n *\n * @example\n * // ✅ OK\n * const props: NodeProps = { className: 'foo', gap: 'md' }\n *\n * // ❌ Type error - 'children' is not allowed in props\n * const props: NodeProps = { className: 'foo', children: [...] }\n */\nexport type NodeProps = Record<string, unknown> & {\n [K in ReservedNodeKeys]?: never\n}\n\n/**\n * Type-safe version of the el() function signature.\n * Ensures props cannot contain reserved keys.\n */\nexport type ElementBuilder = (\n type: string,\n props?: NodeProps | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: Array<(node: NodeDefinition) => NodeDefinition>\n) => NodeDefinition\n\n/**\n * Type guard to check if props contain reserved keys at runtime.\n * Use this in development mode to catch bugs early.\n *\n * @param props - Props object to validate\n * @returns Array of reserved keys found in props, or empty array if none\n */\nexport function findReservedKeysInProps(props: Record<string, unknown> | null | undefined): ReservedNodeKeys[] {\n if (!props) return []\n\n return RESERVED_KEYS.filter(key => key in props) as ReservedNodeKeys[]\n}\n\n/**\n * Validates that props don't contain reserved keys.\n * Throws in development, warns in production.\n *\n * @param props - Props to validate\n * @param context - Context for error message (e.g., \"el('grid', ...)\")\n */\nexport function validateProps(\n props: Record<string, unknown> | null | undefined,\n context: string = 'node builder'\n): void {\n const reserved = findReservedKeysInProps(props)\n\n if (reserved.length === 0) return\n\n const message = `[blocks:${context}] Reserved keys found in props: ${reserved.join(', ')}. ` +\n `These should be passed as separate parameters or modifiers, not in props. ` +\n `For example, 'children' should be the 3rd parameter to el(), not in the props object.`\n\n if (isDevEnvironment()) {\n throw new TypeError(message)\n } else {\n console.error(message)\n }\n}\n\n/**\n * Helper type to infer proper props for specific node types.\n * Can be extended to provide type-specific prop validation.\n */\nexport type NodeTypeProps<T extends string> = T extends 'grid'\n ? NodeProps & {\n cols?: unknown\n gap?: unknown\n }\n : T extends 'stack' | 'inline'\n ? NodeProps & {\n gap?: unknown\n align?: unknown\n justify?: unknown\n className?: unknown\n }\n : T extends 'text' | 'richText'\n ? NodeProps & {\n as?: string\n className?: unknown\n }\n : NodeProps\n","import { NodeSchema, type NodeDefinition } from './schema'\nimport { validateProps, type NodeProps } from './types'\nimport { isDevEnvironment } from '../../utils/env'\n\n// Modifier function that mutates or augments a node definition\nexport type NodeModifier = (node: NodeDefinition) => NodeDefinition\n\nfunction normalizeChildren(children?: Array<NodeDefinition | null | undefined>): NodeDefinition[] | undefined {\n if (!children) return undefined\n const flat = children.flat().filter(Boolean) as NodeDefinition[]\n return flat.length > 0 ? flat : undefined\n}\n\nexport function el(\n type: string,\n props?: NodeProps | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n): NodeDefinition {\n // Validate that reserved keys aren't in props (throws in dev, warns in prod)\n validateProps(props, `el('${type}', ...)`)\n\n const node: NodeDefinition = {\n type,\n ...(props && Object.keys(props).length > 0 ? { props } : {}),\n ...(children && children.length ? { children: normalizeChildren(children) } : {}),\n }\n\n if (mods && mods.length > 0) {\n // Filter out any non-function values (e.g., undefined, null)\n const validMods = mods.filter((mod): mod is NodeModifier => typeof mod === 'function')\n if (validMods.length > 0) {\n const modified = validMods.reduce((acc, fn) => fn(acc), node)\n return devValidate(modified)\n }\n }\n return devValidate(node)\n}\n\n// Convenience element helpers for common primitives\nexport const section = (\n props?: NodeProps | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n) => el('section', props, children, ...mods)\n\nexport const headerSection = (\n props?: NodeProps | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n) => el('headerSection', props, children, ...mods)\n\nexport const stack = (\n props?: NodeProps | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n) => el('stack', props, children, ...mods)\n\nexport const inline = (\n props?: NodeProps | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n) => el('inline', props, children, ...mods)\n\nexport const accordion = (\n props?: NodeProps | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n) => el('accordion', props, children, ...mods)\n\nexport const accordionItem = (\n props?: NodeProps | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n) => el('accordionItem', props, children, ...mods)\n\nexport const carousel = (\n props?: NodeProps | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n) => el('carousel', props, children, ...mods)\n\nexport const text = (\n props?: NodeProps | null,\n ...mods: NodeModifier[]\n) => el('text', props, undefined, ...mods)\n\nexport const richText = (\n props?: NodeProps | null,\n ...mods: NodeModifier[]\n) => el('richText', props, undefined, ...mods)\n\nexport const media = (\n props?: NodeProps | null,\n ...mods: NodeModifier[]\n) => el('media', props, undefined, ...mods)\n\nexport const button = (\n props?: NodeProps | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n) => el('button', props, children, ...mods)\n\nexport const link = (\n props?: NodeProps | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n) => el('link', props, children, ...mods)\n\nexport const form = (\n props?: NodeProps | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n) => el('form', props, children, ...mods)\n\nexport const bookingForm = (\n props?: NodeProps | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n) => el('booking-form', props, children, ...mods)\n\nexport const eventList = (\n props?: NodeProps | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n) => el('event-list', props, children, ...mods)\n\nexport const eventRegistration = (\n props?: NodeProps | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n) => el('event-registration', props, children, ...mods)\n\n// Modifiers\nexport function bind(from: string, options?: { fallback?: unknown; transforms?: Array<{ id: string; options?: Record<string, unknown> }>; pick?: 'value' | 'collection' | 'context' }): NodeModifier {\n return (node) => ({\n ...node,\n $bind: {\n from,\n ...(options?.fallback !== undefined ? { fallback: options.fallback } : {}),\n ...(options?.transforms ? { transforms: options.transforms } : {}),\n ...(options?.pick ? { pick: options.pick } : {}),\n },\n })\n}\n\nexport function when(path: string, options?: { equals?: unknown; not?: boolean }): NodeModifier {\n return (node) => ({\n ...node,\n $when: {\n when: { from: path },\n ...(options?.equals !== undefined ? { equals: options.equals } : {}),\n ...(options?.not ? { not: true } : {}),\n },\n })\n}\n\nexport function repeat(\n collectionPath: string,\n itemName: string = 'item',\n options?: { indexName?: string; limit?: number; sortBy?: { path: string; direction?: 'asc' | 'desc' } },\n): NodeModifier {\n return (node) => ({\n ...node,\n $repeat: {\n collection: { from: collectionPath, pick: 'collection' },\n itemName,\n ...(options?.indexName ? { indexName: options.indexName } : {}),\n ...(options?.limit ? { limit: options.limit } : {}),\n ...(options?.sortBy\n ? { sortBy: { path: options.sortBy.path, direction: options.sortBy.direction ?? 'asc' } }\n : {}),\n },\n })\n}\n\nexport function props(extra: Record<string, unknown>): NodeModifier {\n // Validate that reserved keys aren't being injected via the modifier\n validateProps(extra, 'props() modifier')\n\n return (node) => ({\n ...node,\n props: { ...(node.props ?? {}), ...extra },\n })\n}\n\ntype AccordionListOptions = {\n collection: string\n itemName?: string\n indexName?: string\n accordionProps?: NodeProps | null\n itemProps?: NodeProps | null\n triggerFrom: string\n contentFrom?: string\n valueFrom?: string | null\n}\n\nexport function accordionList(\n {\n collection,\n itemName = 'item',\n indexName,\n accordionProps = null,\n itemProps = null,\n triggerFrom,\n contentFrom,\n valueFrom,\n }: AccordionListOptions,\n ...mods: NodeModifier[]\n) {\n const resolvedIndexName = indexName ?? `${itemName}Index`\n const resolvedValuePath = valueFrom === null ? null : (valueFrom ?? resolvedIndexName)\n\n const baseItemProps: Record<string, unknown> = {\n ...(itemProps ?? {}),\n trigger: { $bind: { from: triggerFrom } },\n }\n\n if (contentFrom) {\n baseItemProps.content = { $bind: { from: contentFrom } }\n }\n\n if (resolvedValuePath) {\n baseItemProps.value = { $bind: { from: resolvedValuePath } }\n }\n\n return accordion(\n accordionProps ?? undefined,\n [\n accordionItem(\n baseItemProps,\n undefined,\n repeat(collection, itemName, { indexName: resolvedIndexName }),\n ),\n ],\n ...mods,\n )\n}\n\n// Dev-time validation against NodeSchema\nfunction devValidate(node: NodeDefinition): NodeDefinition {\n try {\n if (isDevEnvironment()) {\n const res = NodeSchema.safeParse(node)\n if (!res.success) {\n console.warn('[blocks:builder] Invalid node produced by builder', res.error.format())\n }\n }\n } catch {\n // noop: avoid crashing if zod or env is unavailable in certain runtimes\n }\n return node\n}\n","import { el, media, when, bind } from '../builder'\nimport type { NodeDefinition } from '../schema'\n\n/**\n * Options for customizing the appearance of background layers.\n */\nexport type BackgroundLayerOptions = {\n /**\n * CSS class applied to the color/gradient layer container.\n * This layer renders solid colors and gradients.\n *\n * @default 'absolute inset-0 -z-10 h-full w-full pointer-events-none'\n */\n styleClassName?: string\n\n /**\n * Base CSS classes applied to the background image element.\n * This layer renders background images with dynamic positioning based on scale.\n *\n * Note: Do NOT include positioning (inset-0), sizing (h-full w-full), object-fit, or opacity.\n * Those properties are applied dynamically via transforms:\n * - Positioning/sizing: background.resolveImageClassName (based on scale)\n * - Visual properties: background.resolveImageStyle (object-fit, opacity, width/height)\n *\n * @default 'absolute -z-10'\n */\n imageClassName?: string\n}\n\n/**\n * Creates a pair of background layer nodes for rendering backgrounds from field data.\n *\n * This helper generates two nodes:\n * 1. A style layer (div) that renders solid colors and gradients\n * 2. An image layer that conditionally renders background images\n *\n * The layers are designed to be placed behind content (z-index -10) and work\n * with data from `sectionStylesField`, `containerStylesField`, or `cardStylesField`.\n *\n * @param path - The data path to the background field (e.g., '_sectionStyles.background')\n * @param options - Optional customization for layer appearance\n * @returns Array of two NodeDefinition objects: [styleLayer, imageLayer]\n *\n * @example\n * // Basic usage in a block\n * const heroBackgroundNodes = backgroundLayer('_sectionStyles.background')\n *\n * @example\n * // Custom styling\n * const customBackgroundNodes = backgroundLayer('_sectionStyles.background', {\n * imageClassName: 'absolute inset-0 -z-10 h-full w-full object-cover opacity-30'\n * })\n *\n * @example\n * // In a block layout\n * const layout = section(\n * { background: 'background/base' },\n * [\n * ...backgroundLayer('_sectionStyles.background'),\n * sectionContainer([])\n * ]\n * )\n */\nexport function backgroundLayer(\n path: string,\n options: BackgroundLayerOptions = {},\n): NodeDefinition[] {\n const {\n styleClassName = 'absolute inset-0 -z-10 h-full w-full pointer-events-none',\n imageClassName,\n } = options\n\n const styleLayer = el('div', {\n className: { $bind: { from: path, transforms: [{ id: 'background.resolveClass', options: { baseClass: styleClassName } }] } },\n style: { $bind: { from: path, transforms: [{ id: 'background.resolveStyle' }] } },\n })\n\n const imageLayer = createBackgroundImageNode(path, imageClassName)\n\n return [styleLayer, imageLayer]\n}\n\n/**\n * Creates a media node for rendering a background image with conditional rendering.\n *\n * This helper creates a media element that:\n * - Only renders when the image path has a value (via `when` modifier)\n * - Binds to the image data at the specified path (via `bind` modifier)\n * - Applies the provided CSS class for positioning and styling\n * - Applies advanced image options (object-fit, object-position, opacity) via transform\n *\n * Used internally by `backgroundLayer()` but can be used independently for custom layouts.\n *\n * @param path - The data path to the background field (e.g., '_sectionStyles.background')\n * @param className - CSS class for the image element\n * @returns A media NodeDefinition with conditional rendering and data binding\n *\n * @example\n * // Standalone usage\n * const imageNode = createBackgroundImageNode('_sectionStyles.background')\n *\n * @example\n * // Custom styling\n * const imageNode = createBackgroundImageNode(\n * '_sectionStyles.background',\n * 'absolute inset-0 h-full w-full'\n * )\n */\nexport function createBackgroundImageNode(\n path: string,\n baseClassName: string = 'absolute -z-10',\n): NodeDefinition {\n const imagePath = `${path}.image`\n\n // Note: Visual properties (object-fit, opacity, scale) are applied dynamically.\n // className: Resolved via background.resolveImageClassName based on scale\n // style: Resolved via background.resolveImageStyle for object-fit, opacity, width/height\n return media(\n {\n className: {\n $bind: {\n from: path,\n transforms: [{\n id: 'background.resolveImageClassName',\n options: { baseClass: `background-image ${baseClassName}` }\n }]\n }\n },\n style: {\n $bind: {\n from: path,\n transforms: [{ id: 'background.resolveImageStyle' }],\n },\n },\n },\n when(imagePath),\n bind(imagePath),\n )\n}\n","import type { CSSProperties } from 'react';\n\n/**\n * Theme color tokens support three formats:\n *\n * 1. Semantic/palette tokens: 'text', 'surface', 'primary', 'mutedText', 'neutral-900', etc.\n * These resolve to CSS variables like `var(--tb-primary)`\n *\n * 2. Tokens with opacity: 'surface/95', 'primary/50', 'border/20'\n * Format: `{token}/{opacity%}`\n * These resolve to rgba with the specified opacity (e.g., `rgba(var(--tb-surface), 0.95)`)\n *\n * 3. Raw CSS values: 'raw:transparent', 'raw:#ffffff', 'raw:rgba(255, 0, 0, 0.5)'\n * Format: `raw:{css-value}`\n * These bypass the CSS variable system and output the literal value\n *\n * @example\n * // Semantic token\n * rgbColorValue('primary') // => 'rgb(var(--tb-primary))'\n *\n * @example\n * // Token with opacity\n * rgbColorValue('surface/95') // => 'rgba(var(--tb-surface), 0.95)'\n *\n * @example\n * // Raw value\n * rgbColorValue('raw:transparent') // => 'transparent'\n */\ntype ThemeColorToken = string;\n\ntype ParsedToken = {\n token: string;\n alpha?: number;\n raw?: string;\n};\n\nconst COLOR_VAR_PREFIX = '--tb-';\n\nfunction parseToken(source: ThemeColorToken): ParsedToken {\n if (source.startsWith('raw:')) {\n return { token: source, raw: source.slice(4) };\n }\n if (source.includes('/')) {\n const [token, opacity] = source.split('/');\n const alpha = Number(opacity) / 100;\n if (!Number.isNaN(alpha)) {\n return { token, alpha };\n }\n return { token: source };\n }\n return { token: source };\n}\n\n/**\n * Converts a theme color token to a CSS rgb/rgba value.\n * This is the primary function for applying theme colors to CSS properties.\n *\n * @param token - Theme color token (semantic, with opacity, or raw)\n * @returns CSS color value (rgb, rgba, or raw CSS value)\n *\n * @example\n * rgbColorValue('primary') // => 'rgb(var(--tb-primary))'\n * rgbColorValue('surface/95') // => 'rgba(var(--tb-surface), 0.95)'\n * rgbColorValue('raw:transparent') // => 'transparent'\n */\nexport function rgbColorValue(token: ThemeColorToken): string {\n const { token: baseToken, alpha, raw } = parseToken(token);\n if (raw) {\n return raw;\n }\n const cssVar = `${COLOR_VAR_PREFIX}${baseToken}`;\n if (alpha === undefined) {\n return `rgb(var(${cssVar}))`;\n }\n return `rgba(var(${cssVar}), ${alpha})`;\n}\n\n/**\n * Converts a theme color token to a CSS variable reference.\n * Note: This returns the base variable without rgb() wrapper, ignoring opacity.\n *\n * @param token - Theme color token\n * @returns CSS variable reference\n *\n * @example\n * cssVarValue('primary') // => 'var(--tb-primary)'\n * cssVarValue('surface/95') // => 'var(--tb-surface)' (opacity ignored)\n */\nexport function cssVarValue(token: ThemeColorToken): string {\n const { token: baseToken } = parseToken(token);\n return `var(${COLOR_VAR_PREFIX}${baseToken})`;\n}\n\n/**\n * Creates a backgroundColor style object from a theme token.\n *\n * @param token - Theme color token\n * @returns CSSProperties with backgroundColor\n */\nexport function backgroundColorStyle(token: ThemeColorToken): CSSProperties {\n return { backgroundColor: rgbColorValue(token) };\n}\n\n/**\n * Creates a text color style object from a theme token.\n *\n * @param token - Theme color token\n * @returns CSSProperties with color\n */\nexport function textColorStyle(token: ThemeColorToken): CSSProperties {\n return { color: rgbColorValue(token) };\n}\n\n/**\n * Creates a border color style object from a theme token.\n *\n * @param token - Theme color token\n * @returns CSSProperties with borderColor\n */\nexport function borderColorStyle(token: ThemeColorToken): CSSProperties {\n return { borderColor: rgbColorValue(token) };\n}\n\n/**\n * Creates a linear gradient background from theme tokens.\n *\n * @param tokens - Array of theme color tokens for gradient stops\n * @param direction - CSS gradient direction (default: 'to bottom')\n * @returns CSSProperties with backgroundImage\n *\n * @example\n * gradientBackgroundStyle(['primary', 'secondary'])\n * // => { backgroundImage: 'linear-gradient(to bottom, rgb(var(--tb-primary)), rgb(var(--tb-secondary)))' }\n *\n * @example\n * gradientBackgroundStyle(['primary/80', 'secondary/60'], '45deg')\n * // => { backgroundImage: 'linear-gradient(45deg, rgba(var(--tb-primary), 0.8), rgba(var(--tb-secondary), 0.6))' }\n */\nexport function gradientBackgroundStyle(\n tokens: ThemeColorToken[],\n direction: string = 'to bottom',\n): CSSProperties {\n const stops = tokens.map((stop) => rgbColorValue(stop)).join(', ');\n return { backgroundImage: `linear-gradient(${direction}, ${stops})` };\n}\n\n/**\n * Creates a Tailwind ring color style object from a theme token.\n * Used for focus ring styling with Tailwind's ring utilities.\n *\n * @param token - Theme color token\n * @returns CSSProperties with --tw-ring-color CSS variable\n */\nexport function ringColorStyle(token: ThemeColorToken): CSSProperties {\n return { '--tw-ring-color': rgbColorValue(token) } as CSSProperties;\n}\n\n/**\n * Merges multiple CSSProperties objects into a single object.\n * Later styles override earlier ones. Undefined values are filtered out.\n * Returns undefined if the merged result is empty.\n *\n * @param styles - Variable number of CSSProperties objects (can be undefined)\n * @returns Merged CSSProperties object, or undefined if empty\n *\n * @example\n * mergeStyles(\n * backgroundColorStyle('surface'),\n * textColorStyle('text'),\n * borderColorStyle('border')\n * )\n * // => { backgroundColor: '...', color: '...', borderColor: '...' }\n */\nexport function mergeStyles(...styles: Array<CSSProperties | undefined>): CSSProperties | undefined {\n const merged = styles.filter(Boolean).reduce<CSSProperties>((acc, style) => Object.assign(acc, style!), {});\n return Object.keys(merged).length ? merged : undefined;\n}\n\n","import { stack, text, when, bind } from '../builder'\nimport type { NodeDefinition } from '../schema'\nimport { textColorStyle } from '../../../theme/utils/colorStyles'\n\nexport function headingGroup(opts: {\n eyebrowPath?: string\n titlePath: string\n containerClass?: string\n className?: string\n eyebrowClass?: string\n titleClass?: string\n eyebrowStyle?: Record<string, unknown>\n titleStyle?: Record<string, unknown>\n}): NodeDefinition {\n const {\n eyebrowPath,\n titlePath,\n containerClass = 'text-center',\n className,\n eyebrowClass = 'heading-eyebrow text-sm font-semibold tracking-wide',\n titleClass = 'heading-title text-3xl font-semibold sm:text-4xl',\n eyebrowStyle = textColorStyle('neutral-500'),\n titleStyle = textColorStyle('neutral-900'),\n } = opts\n\n const finalContainerClass = className ? `${containerClass} ${className}` : containerClass\n\n return stack({ gap: 'sm', className: finalContainerClass }, [\n eyebrowPath ? text({ as: 'p', className: eyebrowClass, style: eyebrowStyle }, when(eyebrowPath), bind(eyebrowPath)) : null,\n text({ as: 'h2', className: titleClass, style: titleStyle }, bind(titlePath)),\n ])\n}\n","import { stack } from '../builder'\nimport type { NodeDefinition } from '../schema'\n\n/**\n * Creates a centered container with responsive max-width.\n *\n * By default, uses Tailwind's responsive `container` class which provides:\n * - sm: max-w-640px\n * - md: max-w-768px\n * - lg: max-w-1024px\n * - xl: max-w-1280px\n * - 2xl: max-w-1536px\n *\n * When `bindFrom` points to _containerStyles with fullWidth=true, switches to `w-full`\n * for edge-to-edge content without horizontal constraints.\n *\n * @param children - Child nodes to render inside container\n * @param opts - Configuration options\n * @param opts.gap - Vertical spacing between children (default: 'md')\n * @param opts.align - Horizontal alignment (default: undefined)\n * @param opts.className - Additional static classes\n * @param opts.bindFrom - Data path for container styles (default: '_containerStyles')\n * @returns A stack NodeDefinition configured as a responsive container\n */\nexport function sectionContainer(\n children: Array<NodeDefinition | null | undefined>,\n opts?: {\n gap?: 'sm' | 'md' | 'lg' | 'xl'\n align?: 'start' | 'center' | 'end'\n className?: string\n bindFrom?: string\n },\n): NodeDefinition {\n const gap = opts?.gap ?? 'md'\n const align = opts?.align\n const bindFrom = opts?.bindFrom ?? '_containerStyles'\n const additionalClasses = opts?.className ?? ''\n\n return stack(\n {\n gap,\n className: {\n $bind: {\n from: bindFrom,\n transforms: [\n {\n id: 'containerStyles.resolveClassName',\n options: { baseClass: additionalClasses },\n },\n ],\n fallback: additionalClasses ? `container mx-auto ${additionalClasses}` : 'container mx-auto',\n },\n },\n ...(align ? { align } : {}),\n },\n children,\n )\n}\n\n","/**\n * Type-safe spacing system for sections and containers.\n *\n * This module provides:\n * - Semantic spacing values (none, compact, cozy, medium, comfortable, spacious)\n * - Type-safe mappings to Tailwind CSS classes\n * - Runtime validation via type guards\n * - Separate handling for section (vertical) vs container (all-sides) spacing\n *\n * Type Safety Guarantees:\n * - Type is derived from data (single source of truth)\n * - Maps are validated for completeness at compile time\n * - Runtime validation available via isSemanticSpacing()\n */\n\n/**\n * Single source of truth for semantic spacing values.\n * The SemanticSpacing type is derived from this array to ensure they stay in sync.\n *\n * Adding a new spacing value:\n * 1. Add it to this array\n * 2. TypeScript will error until you update both spacing maps\n * 3. No way to get out of sync\n */\nconst SEMANTIC_SPACING_VALUES = [\n 'none', // No padding\n 'compact', // Minimal padding\n 'cozy', // Small but comfortable\n 'medium', // Standard spacing (default for most blocks)\n 'comfortable', // Generous spacing\n 'spacious', // Maximum spacing\n] as const;\n\n/**\n * Semantic spacing values used across the block system.\n * These abstract away the specific CSS classes and provide a consistent vocabulary.\n *\n * This type is derived from SEMANTIC_SPACING_VALUES to ensure compile-time safety.\n */\nexport type SemanticSpacing = typeof SEMANTIC_SPACING_VALUES[number];\n\n/**\n * Runtime type guard for validating spacing values.\n * Use this at system boundaries where data enters from external sources.\n *\n * @param value - Unknown value to validate\n * @returns true if value is a valid SemanticSpacing, with type narrowing\n *\n * @example\n * const userInput = 'medium';\n * if (isSemanticSpacing(userInput)) {\n * // TypeScript knows userInput is SemanticSpacing here\n * const classes = resolveSpacing(userInput, 'y');\n * }\n */\nexport function isSemanticSpacing(value: unknown): value is SemanticSpacing {\n return typeof value === 'string' &&\n (SEMANTIC_SPACING_VALUES as readonly string[]).includes(value);\n}\n\n/**\n * Spacing axis determines which sides receive padding.\n * - 'y': Vertical only (py-*) - used for sections\n * - 'all': All sides (p-*) - used for containers/cards\n */\nexport type SpacingAxis = 'y' | 'all';\n\n/**\n * Type-safe mapping from semantic spacing to Tailwind classes for sections (y-axis).\n *\n * Sections use vertical padding only to control spacing between blocks.\n * Horizontal padding (px-6) is handled separately via baseClass.\n *\n * The `satisfies` operator ensures all SemanticSpacing values are present at compile time.\n * TypeScript will error if any spacing value is missing or if extra keys exist.\n */\nexport const SECTION_SPACING_MAP = {\n none: 'py-0',\n compact: 'py-6 sm:py-8',\n cozy: 'py-10 sm:py-14',\n medium: 'py-12 sm:py-16',\n comfortable: 'py-16 sm:py-20',\n spacious: 'py-20 sm:py-28',\n} as const satisfies Record<SemanticSpacing, string>;\n\n/**\n * Type-safe mapping from semantic spacing to Tailwind classes for containers (all sides).\n *\n * Containers use padding on all sides for internal content spacing.\n *\n * The `satisfies` operator ensures all SemanticSpacing values are present at compile time.\n */\nexport const CONTAINER_SPACING_MAP = {\n none: 'p-0',\n compact: 'p-4 sm:p-6',\n cozy: 'p-6 sm:p-8',\n medium: 'p-6 sm:p-8',\n comfortable: 'p-8 sm:p-10',\n spacious: 'p-10 sm:p-14',\n} as const satisfies Record<SemanticSpacing, string>;\n\n/**\n * Resolve semantic spacing to CSS classes based on axis.\n *\n * This function guarantees that valid SemanticSpacing values always return a result.\n * Since spacing is typed, there's no need for fallback logic.\n *\n * @param spacing - Semantic spacing value (validated at compile time)\n * @param axis - Which axis to apply padding ('y' for sections, 'all' for containers)\n * @returns Tailwind CSS class string\n *\n * @example\n * resolveSpacing('medium', 'y') // => 'py-12 sm:py-16'\n * resolveSpacing('medium', 'all') // => 'p-6 sm:p-8'\n * resolveSpacing('compact') // => 'py-6 sm:py-8' (defaults to 'y' axis)\n */\nexport function resolveSpacing(spacing: SemanticSpacing, axis: SpacingAxis = 'y'): string {\n const map = axis === 'y' ? SECTION_SPACING_MAP : CONTAINER_SPACING_MAP;\n return map[spacing];\n}\n\n/**\n * Resolve semantic spacing to section CSS classes (vertical padding only).\n * More explicit alternative to resolveSpacing(spacing, 'y').\n *\n * @param spacing - Semantic spacing value\n * @returns Tailwind CSS class string for vertical padding (py-*)\n *\n * @example\n * resolveSectionSpacing('medium') // => 'py-12 sm:py-16'\n */\nexport function resolveSectionSpacing(spacing: SemanticSpacing): string {\n return SECTION_SPACING_MAP[spacing];\n}\n\n/**\n * Resolve semantic spacing to container CSS classes (all-sides padding).\n * More explicit alternative to resolveSpacing(spacing, 'all').\n *\n * @param spacing - Semantic spacing value\n * @returns Tailwind CSS class string for all-sides padding (p-*)\n *\n * @example\n * resolveContainerSpacing('medium') // => 'p-6 sm:p-8'\n */\nexport function resolveContainerSpacing(spacing: SemanticSpacing): string {\n return CONTAINER_SPACING_MAP[spacing];\n}\n\n/**\n * Default spacing value for sections when not explicitly configured.\n */\nexport const DEFAULT_SECTION_SPACING: SemanticSpacing = 'medium';\n\n/**\n * Default spacing value for containers when not explicitly configured.\n */\nexport const DEFAULT_CONTAINER_SPACING: SemanticSpacing = 'medium';\n","import type { NodeDefinition } from '../schema';\nimport { section } from '../builder';\nimport { backgroundLayer } from './backgroundLayer';\nimport type { SemanticSpacing } from '../../spacing';\nimport { DEFAULT_SECTION_SPACING } from '../../spacing';\n\n/**\n * Configuration for creating a styled section with background support.\n */\nexport type StyledSectionConfig = {\n /**\n * Content nodes to render inside the section.\n * Can be a single node, array of nodes, or empty array.\n */\n children: NodeDefinition | NodeDefinition[];\n\n /**\n * Base horizontal padding class (e.g., 'px-6', 'px-8').\n * This provides consistent horizontal constraints across sections.\n * Removed when fullWidth is enabled in _containerStyles.\n * @default 'px-6'\n */\n baseClass?: string;\n\n /**\n * Semantic vertical spacing value for the section.\n * Uses semantic values (none, compact, cozy, medium, comfortable, spacious)\n * which are transformed to responsive Tailwind classes.\n *\n * @default 'medium' (resolves to 'py-12 sm:py-16')\n */\n spacing?: SemanticSpacing;\n\n /**\n * Theme background token to apply.\n * @default 'background/base'\n */\n background?: string;\n\n /**\n * Path to the section styles data in the content (e.g., '_sectionStyles').\n * This path is used for binding className, allowOverflow, and background layers.\n * @default '_sectionStyles'\n */\n bindFrom?: string;\n\n /**\n * CSS class to apply to background image layer.\n * @default 'absolute -z-10'\n */\n imageClassName?: string;\n};\n\n/**\n * Create a styled section with automatic background layer and spacing bindings.\n *\n * This helper encapsulates the common pattern of:\n * - Creating a section wrapper with background theme\n * - Adding background color/gradient/image layers\n * - Binding className to section styles with transform\n * - Binding allowOverflow for background positioning\n * - Wrapping content children\n *\n * Use this helper to eliminate 25+ lines of boilerplate section setup code.\n *\n * @example\n * // Basic usage with default spacing\n * const layout = styledSection({\n * children: sectionContainer(contentNodes, { gap: 'md' }),\n * });\n *\n * @example\n * // Custom spacing and base padding\n * const compactLayout = styledSection({\n * children: sectionContainer(contentNodes, { gap: 'sm' }),\n * baseClass: 'px-8',\n * spacing: 'py-6 sm:py-8',\n * });\n *\n * @example\n * // Multiple children\n * const layout = styledSection({\n * children: [\n * heading({ text: 'Title' }),\n * sectionContainer(contentNodes, { gap: 'md' }),\n * ],\n * });\n *\n * @example\n * // Custom binding path (for nested sections)\n * const nestedSection = styledSection({\n * children: content,\n * bindFrom: 'container.styles',\n * });\n */\nexport function styledSection(config: StyledSectionConfig): NodeDefinition {\n const {\n children,\n baseClass = 'px-6',\n spacing = DEFAULT_SECTION_SPACING,\n background = 'background/base',\n bindFrom = '_sectionStyles',\n imageClassName = 'absolute -z-10',\n } = config;\n\n // Create background layers (color/gradient + image)\n const backgroundNodes = backgroundLayer(`${bindFrom}.background`, {\n imageClassName,\n });\n\n // Normalize children to array\n const childrenArray = Array.isArray(children) ? children : [children];\n\n // Create section with background, className binding, and allowOverflow binding\n return section(\n {\n background,\n className: {\n $bind: {\n from: bindFrom,\n transforms: [\n {\n id: 'sectionStyles.resolveClassName',\n options: { baseClass, defaultSpacing: spacing },\n },\n ],\n // No fallback needed - transform handles all cases via defaultSpacing\n },\n },\n allowOverflow: {\n $bind: {\n from: `${bindFrom}.background.overflow`,\n fallback: false,\n },\n },\n },\n [\n ...backgroundNodes,\n ...childrenArray,\n ],\n );\n}\n","import { button, media, text, bind, when, repeat } from '../builder'\nimport type { NodeDefinition } from '../schema'\n\n// Single CTA button primitive.\n// - Uses ui.buttonClass transform to resolve classes from `variant`\n// - Accepts optional icons and when-path\n// - Can optionally repeat over a collection when `repeatFrom` is provided\nexport function ctaButton(opts?: {\n basePath?: string\n linkPath?: string\n labelPath?: string\n variantPath?: string\n iconLeftPath?: string\n iconRightPath?: string\n whenPath?: string\n repeatFrom?: { collectionPath: string; itemName?: string }\n className?: string\n}): NodeDefinition {\n const base = opts?.basePath ?? 'cta'\n const linkPath = opts?.linkPath ?? `${base}.link`\n const labelPath = opts?.labelPath ?? `${base}.label`\n const variantPath = opts?.variantPath ?? `${base}.variant`\n const iconLeftPath = opts?.iconLeftPath ?? `${base}.iconLeft`\n const iconRightPath = opts?.iconRightPath ?? `${base}.iconRight`\n const whenPath = opts?.whenPath ?? labelPath\n\n const leftIcon = media({ className: 'mr-2 h-4 w-4 inline-block' }, when(iconLeftPath), bind(iconLeftPath))\n const rightIcon = media({ className: 'ml-2 h-4 w-4 inline-block' }, when(iconRightPath), bind(iconRightPath))\n const label = text({ as: 'span' }, bind(labelPath))\n\n // Build className object with $bind and $prepend, optionally $append\n const classNameObj: any = {\n $bind: {\n from: variantPath,\n fallback: 'primary',\n },\n $prepend: 'button-',\n };\n\n if (opts?.className) {\n classNameObj.$append = ` ${opts.className}`;\n }\n\n const node = button(\n {\n className: classNameObj,\n href: { $bind: { from: linkPath, transforms: [{ id: 'links.resolve' }], fallback: '#' } },\n },\n [leftIcon, label, rightIcon],\n )\n\n // Apply repeat to the node if requested\n if (opts?.repeatFrom) {\n return button(\n node.props ?? {},\n node.children as any,\n repeat(opts.repeatFrom.collectionPath, opts.repeatFrom.itemName ?? base),\n )\n }\n return button(node.props ?? {}, node.children as any, when(whenPath))\n}\n","import { inline, when } from '../builder'\nimport type { NodeDefinition } from '../schema'\nimport { ctaButton } from './ctaButton'\n\n// Renders a single inline container whose children are the repeated CTA buttons.\n// Button styling uses theme-friendly Tailwind utility classes (mapped to CSS vars),\n// selected by a simple transform keyed by `variant`.\nexport function ctaRow(opts?: {\n collectionPath?: string\n itemName?: string\n gap?: 'sm' | 'md' | 'lg'\n justify?: 'start' | 'center' | 'end'\n containerClassName?: string\n}): NodeDefinition {\n const collectionPath = opts?.collectionPath ?? 'content.ctas'\n const item = opts?.itemName ?? 'cta'\n const gap = opts?.gap ?? 'sm'\n const justify = opts?.justify ?? 'center'\n const containerClassName = ['cta-row flex-wrap', opts?.containerClassName].filter(Boolean).join(' ')\n\n return inline(\n { gap, justify, className: containerClassName },\n [\n ctaButton({ basePath: item, repeatFrom: { collectionPath, itemName: item } }),\n ],\n when(collectionPath),\n )\n}\n","import { bind, inline, link, repeat, text, when } from '../builder'\nimport type { NodeDefinition } from '../schema'\n\nexport function navRow(opts?: {\n collectionPath?: string\n itemName?: string\n gap?: 'sm' | 'md' | 'lg'\n align?: 'start' | 'center' | 'end'\n className?: string\n linkClassName?: string | Record<string, unknown>\n}): NodeDefinition {\n const collectionPath = opts?.collectionPath ?? 'menu.items'\n const itemName = opts?.itemName ?? 'navItem'\n const gap = opts?.gap ?? 'md'\n const align = opts?.align ?? 'end'\n const className = ['items-center flex-wrap', opts?.className].filter(Boolean).join(' ').trim()\n\n const linkClassName = opts?.linkClassName ?? 'header-nav-link inline-flex items-center px-4 py-2 text-sm font-medium transition-theme-standard'\n\n const links = link(\n {\n className: linkClassName,\n href: { $bind: { from: `${itemName}.link`, transforms: [{ id: 'links.resolve' }], fallback: '#' } },\n target: { $bind: { from: `${itemName}.target` } },\n rel: { $bind: { from: `${itemName}.rel` } },\n 'data-active': { $bind: { from: `${itemName}.active` } },\n },\n [text({ as: 'span' }, bind(`${itemName}.label`))],\n repeat(collectionPath, itemName),\n )\n\n return inline(\n { gap, align, className },\n [links],\n when(collectionPath),\n )\n}\n","import { z } from \"zod\";\n\nimport { fieldSchema, type FieldDefinition } from \"../manifest/schema\";\nimport {\n NodeSchema,\n type NodeDefinition,\n type Binding,\n type RepeatConfig,\n type ConditionConfig,\n type DataScope,\n} from \"../node\";\n\nconst FRAGMENT_ID_PATTERN = /^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?$/i;\nconst FIELD_ID_PATTERN = /^[a-z][a-zA-Z0-9_-]*$/;\n\nconst dataLoaderSchema = z.object({\n endpoint: z.string().min(1, \"Fragment data loader requires an endpoint\"),\n params: z.record(z.string(), z.unknown()).default({}),\n mode: z.enum([\"server\", \"client\"]).default(\"server\"),\n});\n\nconst fragmentDataSchema = z.object({\n key: z.string().min(1, \"Fragment data key is required\"),\n loader: dataLoaderSchema.optional(),\n});\n\nexport type FragmentDataConfig = z.output<typeof fragmentDataSchema>;\n\nconst fragmentConfigSchema = z.object({\n id: z\n .string()\n .min(1, \"Fragment id is required\")\n .regex(FRAGMENT_ID_PATTERN, \"Fragment id must be alphanumeric with optional . _ - separators\"),\n title: z.string().optional(),\n description: z.string().optional(),\n category: z.enum([\"content\", \"media\", \"interactive\", \"layout\"]).optional(),\n icon: z.string().optional(),\n fields: fieldSchema.array().default([]),\n layout: z\n .union([NodeSchema, NodeSchema.array()])\n .transform((value): NodeDefinition[] => (Array.isArray(value) ? value : [value])),\n data: fragmentDataSchema.optional(),\n}) as any;\n\nexport type FragmentConfig = z.input<typeof fragmentConfigSchema>;\nexport type FragmentDefinition = z.output<typeof fragmentConfigSchema>;\n\nexport class FragmentConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"FragmentConfigError\";\n }\n}\n\nexport function defineFragment(config: FragmentConfig): FragmentDefinition {\n const parsed = fragmentConfigSchema.parse(config);\n\n validateFieldDefinitions(parsed.fields as FieldDefinition[], parsed.id);\n\n return {\n ...parsed,\n fields: (parsed.fields as FieldDefinition[]).map(cloneFieldDefinition as (field: any) => FieldDefinition),\n layout: parsed.layout.map((node: any) => ({ ...node })),\n };\n}\n\nexport function scopeFragmentFields(fragment: FragmentDefinition, scope: string): FieldDefinition[] {\n const normalizedScope = scope.trim();\n if (!normalizedScope) {\n return fragment.fields.map(cloneFieldDefinition as (field: any) => FieldDefinition);\n }\n return fragment.fields.map((field: any) => prefixFieldId(field, normalizedScope));\n}\n\nexport function scopeFragmentLayout(fragment: FragmentDefinition, scope: string): NodeDefinition[] {\n const normalizedScope = scope.trim();\n return fragment.layout.map((node: any) => cloneAndScopeNode(node, normalizedScope));\n}\n\nfunction validateFieldDefinitions(fields: FieldDefinition[], fragmentId: string): void {\n const seen = new Set<string>();\n\n for (const field of fields) {\n if (field.id.includes(\".\")) {\n throw new FragmentConfigError(\n `Field \"${field.id}\" in fragment \"${fragmentId}\" should not include dot notation; the builder scopes fields automatically.`,\n );\n }\n if (!FIELD_ID_PATTERN.test(field.id)) {\n throw new FragmentConfigError(\n `Field \"${field.id}\" in fragment \"${fragmentId}\" must start with a letter and contain only alphanumeric, \"_\", or \"-\".`,\n );\n }\n if (seen.has(field.id)) {\n throw new FragmentConfigError(\n `Duplicate field id \"${field.id}\" found in fragment \"${fragmentId}\". Field ids must be unique per fragment.`,\n );\n }\n seen.add(field.id);\n }\n}\n\nfunction prefixFieldId(field: FieldDefinition, scope: string): FieldDefinition {\n const cloned = cloneFieldDefinition(field);\n cloned.id = `${scope}.${field.id}`;\n\n cloned.defaultValue = cloneUnknown(cloned.defaultValue);\n cloned.visibleRoles = cloned.visibleRoles ? [...cloned.visibleRoles] : undefined;\n cloned.ui = cloneUnknown(cloned.ui);\n\n return cloned;\n}\n\nfunction cloneFieldDefinition(field: FieldDefinition): FieldDefinition {\n switch (field.type) {\n case \"repeater\":\n if (field.polymorphic && field.itemTypes) {\n // Polymorphic repeater: clone itemTypes\n return {\n ...field,\n polymorphic: true as const,\n itemTypes: Object.fromEntries(\n Object.entries(field.itemTypes).map(([key, itemType]) => [\n key,\n {\n ...itemType,\n fields: itemType.fields.map(cloneFieldDefinition),\n },\n ])\n ),\n } as FieldDefinition;\n } else if (field.schema) {\n // Monomorphic repeater: clone schema\n return {\n ...field,\n schema: {\n fields: field.schema.fields.map(cloneFieldDefinition),\n },\n } as FieldDefinition;\n }\n // Fallback (shouldn't happen due to XOR validation)\n return { ...field } as FieldDefinition;\n case \"group\":\n return {\n ...field,\n schema: {\n fields: field.schema.fields.map(cloneFieldDefinition),\n },\n };\n default:\n return { ...field };\n }\n}\n\nfunction cloneUnknown<T>(value: T): T {\n if (value == null || typeof value !== \"object\") {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((entry: unknown) => cloneUnknown(entry)) as T;\n }\n return { ...(value as Record<string, unknown>) } as T;\n}\n\nfunction cloneAndScopeNode(node: NodeDefinition, scope: string): NodeDefinition {\n const cloned: NodeDefinition = {\n ...node,\n };\n\n if (node.children) {\n cloned.children = node.children.map((child: NodeDefinition) => cloneAndScopeNode(child, scope));\n }\n\n if (node.props) {\n cloned.props = scopePropBindings(node.props, scope);\n }\n\n if (node.$bind) {\n cloned.$bind = scopeBinding(node.$bind, scope);\n }\n\n if (node.$repeat) {\n cloned.$repeat = scopeRepeat(node.$repeat, scope);\n }\n\n if (node.$when) {\n cloned.$when = scopeCondition(node.$when, scope);\n }\n\n if (node.$scopes) {\n cloned.$scopes = node.$scopes.map((entry: DataScope) => ({\n name: entry.name,\n from: scopeBinding(entry.from, scope),\n }));\n }\n\n return cloned;\n}\n\nfunction scopeBinding(binding: Binding, scope: string): Binding {\n const cloned: Binding = {\n ...binding,\n transforms: binding.transforms?.map(\n (step: { id: string; options?: Record<string, unknown> }) => ({ ...step }),\n ) ?? [],\n };\n\n cloned.from = scopeContentPath(binding.from, scope);\n\n return cloned;\n}\n\nfunction scopeRepeat(repeat: RepeatConfig, scope: string): RepeatConfig {\n const cloned: RepeatConfig = {\n ...repeat,\n collection: scopeBinding(repeat.collection, scope),\n };\n\n if (repeat.sortBy) {\n cloned.sortBy = {\n ...repeat.sortBy,\n path: scopeContentPath(repeat.sortBy.path, scope),\n };\n }\n\n return cloned;\n}\n\nfunction scopeCondition(condition: ConditionConfig, scope: string): ConditionConfig {\n return {\n ...condition,\n when: scopeBinding(condition.when, scope),\n };\n}\n\nfunction scopePropBindings(input: Record<string, unknown>, scope: string): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(input)) {\n result[key] = scopePropValue(value, scope);\n }\n return result;\n}\n\nfunction scopePropValue(value: unknown, scope: string): unknown {\n if (Array.isArray(value)) {\n return value.map((entry: unknown) => scopePropValue(entry, scope));\n }\n if (value && typeof value === \"object\") {\n if (\"$bind\" in (value as Record<string, unknown>)) {\n const bindingConfig = (value as { $bind: Binding }).$bind;\n return {\n $bind: scopeBinding(bindingConfig, scope),\n };\n }\n const result: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value as Record<string, unknown>)) {\n result[key] = scopePropValue(entry, scope);\n }\n return result;\n }\n return value;\n}\n\nfunction scopeContentPath(path: string, scope: string): string {\n if (!scope || scope.length === 0) {\n return path;\n }\n if (path === \"content\") {\n return `content.${scope}`;\n }\n if (path.startsWith(\"content.\")) {\n const remainder = path.slice(\"content.\".length);\n return remainder.length > 0 ? `content.${scope}.${remainder}` : `content.${scope}`;\n }\n if (path.startsWith(\"content[\")) {\n return path.replace(/^content/, `content.${scope}`);\n }\n // Handle $root paths - don't scope them\n if (path.startsWith(\"$root.\")) {\n return path;\n }\n // Handle scope-qualified paths like \"item.label\" - don't rescope them\n // These are paths that reference other scopes (item, index, etc.)\n // We detect them by checking if they contain a dot (indicating scope.field pattern)\n // but don't start with content/$ root (which we handle above)\n if (path.includes('.')) {\n return path;\n }\n // Handle simple relative paths (field names without dots) - add content.scope prefix\n // e.g., \"media\" with scope \"background\" becomes \"content.background.media\"\n return `content.${scope}.${path}`;\n}\n","import type { BlockManifest } from \"../manifest\";\nimport type { FieldDefinition } from \"../manifest/schema\";\nimport type { NodeDefinition } from \"../node\";\nimport {\n type FragmentDefinition,\n type FragmentDataConfig,\n scopeFragmentFields,\n scopeFragmentLayout,\n} from \"./types\";\n\ntype FragmentInstanceConfig = {\n fragment: FragmentDefinition;\n scope?: string;\n dataKey?: string;\n fieldPriority?: number;\n};\n\nexport type MaterializedFragment = {\n fragment: FragmentDefinition;\n scope: string;\n fields: FieldDefinition[];\n layout: NodeDefinition[];\n data?: FragmentDataConfig;\n fieldPriority: number;\n};\n\nexport type FragmentComposition = {\n fields: FieldDefinition[];\n layout: NodeDefinition[];\n data: MaterializedFragment[\"data\"][];\n scopes: string[];\n};\n\nexport type FragmentDataLoaders = Record<\n string,\n {\n endpoint: string;\n params: Record<string, unknown>;\n mode: \"server\" | \"client\";\n }\n>;\n\nexport class FragmentCompositionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"FragmentCompositionError\";\n }\n}\n\nconst DOT_SCOPE_REGEX = /^[A-Za-z0-9_.-]*$/;\n\nexport function materializeFragment(config: FragmentInstanceConfig): MaterializedFragment {\n const scope = normalizeScope(config.scope);\n const fields = scopeFragmentFields(config.fragment, scope);\n const layout = scopeFragmentLayout(config.fragment, scope);\n const fieldPriority = config.fieldPriority ?? 0;\n\n let data: FragmentDataConfig | undefined;\n if (config.fragment.data) {\n const key = config.dataKey ?? config.fragment.data.key;\n if (!key || typeof key !== \"string\") {\n throw new FragmentCompositionError(\n `Fragment \"${config.fragment.id}\" requires a data key to compose.`,\n );\n }\n data = {\n key,\n loader: config.fragment.data.loader ? { ...config.fragment.data.loader } : undefined,\n };\n }\n\n return {\n fragment: config.fragment,\n scope,\n fields,\n layout,\n data,\n fieldPriority,\n };\n}\n\nexport function composeFragments(instances: FragmentInstanceConfig[]): FragmentComposition {\n type FieldEntry = {\n id: string;\n field: FieldDefinition;\n priority: number;\n order: number;\n };\n\n const fieldEntries: FieldEntry[] = [];\n const layouts: NodeDefinition[] = [];\n const dataEntries: FragmentDataConfig[] = [];\n const scopes: string[] = [];\n const seenFieldIds = new Set<string>();\n let fieldOrder = 0;\n\n for (const instance of instances) {\n const materialized = materializeFragment(instance);\n\n for (const field of materialized.fields) {\n if (seenFieldIds.has(field.id)) {\n throw new FragmentCompositionError(\n `Duplicate field id \"${field.id}\" when composing fragments.`,\n );\n }\n seenFieldIds.add(field.id);\n fieldEntries.push({\n id: field.id,\n field,\n priority: materialized.fieldPriority,\n order: fieldOrder++,\n });\n }\n\n scopes.push(materialized.scope);\n layouts.push(...materialized.layout);\n\n if (materialized.data) {\n if (dataEntries.find((entry) => entry.key === materialized.data?.key)) {\n throw new FragmentCompositionError(\n `Duplicate fragment data key \"${materialized.data.key}\" detected.`,\n );\n }\n dataEntries.push(materialized.data);\n }\n }\n\n return {\n fields: fieldEntries\n .sort((a, b) => {\n if (a.priority !== b.priority) {\n return a.priority - b.priority;\n }\n return a.order - b.order;\n })\n .map((entry) => entry.field),\n layout: layouts,\n data: dataEntries,\n scopes,\n };\n}\n\nexport function applyFragmentsToManifest(\n manifest: BlockManifest,\n composition: FragmentComposition,\n): BlockManifest {\n return {\n ...manifest,\n fields: [...composition.fields, ...(manifest.fields ?? [])],\n layout: manifest.layout ?? normalizeLayout(composition.layout),\n };\n}\n\nfunction normalizeScope(scope?: string): string {\n if (!scope) return \"\";\n const trimmed = scope.trim();\n if (!DOT_SCOPE_REGEX.test(trimmed)) {\n throw new FragmentCompositionError(\n `Fragment scope \"${scope}\" contains invalid characters. Use alphanumeric, \".\", \"-\", or \"_\".`,\n );\n }\n return trimmed;\n}\n\nfunction normalizeLayout(layout: NodeDefinition[]): NodeDefinition | NodeDefinition[] {\n if (layout.length === 0) {\n return [];\n }\n if (layout.length === 1) {\n return layout[0] as NodeDefinition;\n }\n return layout;\n}\n\nexport function buildFragmentDataLoaders(\n composition: FragmentComposition,\n): FragmentDataLoaders {\n const loaders: FragmentDataLoaders = {};\n for (const entry of composition.data) {\n if (!entry?.loader) continue;\n loaders[entry.key] = {\n endpoint: entry.loader.endpoint,\n params: { ...(entry.loader.params ?? {}) },\n mode: entry.loader.mode ?? \"server\",\n };\n }\n return loaders;\n}\n","import { defineFragment, type FragmentDefinition } from \"../types\";\nimport { stack, text, richText, bind, when } from \"../../node/builder\";\nimport { textColorStyle } from \"../../../theme/utils/colorStyles\";\n\nexport const bodyCopyFragment: FragmentDefinition = defineFragment({\n id: \"bodyCopy\",\n title: \"Body Copy\",\n description: \"Heading, rich text body, and alignment controls.\",\n fields: [\n {\n id: \"heading\",\n type: \"text\",\n label: \"Heading\",\n description: \"Optional heading displayed above the body copy.\",\n },\n {\n id: \"body\",\n type: \"richText\",\n label: \"Body\",\n required: true,\n },\n {\n id: \"alignment\",\n type: \"select\",\n label: \"Text alignment\",\n required: false,\n defaultValue: \"left\",\n options: [\n { value: \"left\", label: \"Left\" },\n { value: \"center\", label: \"Center\" },\n ],\n },\n ],\n layout: stack(\n {\n gap: \"md\",\n className: \"mx-auto max-w-3xl\",\n align: {\n $bind: {\n from: \"content.alignment\",\n transforms: [{ id: \"ui.stackAlignFromAlignment\" }],\n fallback: \"start\",\n },\n },\n },\n [\n text(\n {\n as: \"h2\",\n className: {\n $bind: {\n from: \"content.alignment\",\n transforms: [\n {\n id: \"ui.headingClassFromAlignment\",\n options: {\n base: \"text-3xl font-semibold sm:text-4xl\",\n },\n },\n ],\n fallback: \"text-3xl font-semibold sm:text-4xl\",\n },\n },\n style: textColorStyle('neutral-900'),\n },\n when(\"content.heading\"),\n bind(\"content.heading\"),\n ),\n richText(\n {\n className: {\n $bind: {\n from: \"content.alignment\",\n transforms: [\n {\n id: \"ui.bodyClassFromAlignment\",\n options: {\n base: \"prose prose-lg max-w-none sm:prose-xl\",\n },\n },\n ],\n fallback:\n \"prose prose-lg max-w-none sm:prose-xl\",\n },\n style: textColorStyle('neutral-600'),\n },\n },\n bind(\"content.body\"),\n ),\n ],\n ),\n});\n","import { defineFragment, type FragmentDefinition } from \"../types\";\nimport { text, bind, when } from \"../../node/builder\";\nimport { textColorStyle } from \"../../../theme/utils/colorStyles\";\n\nexport const heroCopyFragment: FragmentDefinition = defineFragment({\n id: \"heroCopy\",\n title: \"Hero Copy\",\n description: \"Eyebrow, headline, and subheadline copy for hero layouts.\",\n fields: [\n {\n id: \"eyebrow\",\n type: \"text\",\n label: \"Eyebrow\",\n description: \"Optional short line above the headline\",\n visibleRoles: [\"designer\", \"admin\"],\n },\n {\n id: \"headline\",\n type: \"text\",\n label: \"Headline\",\n required: true,\n maxLength: 120,\n },\n {\n id: \"subheadline\",\n type: \"text\",\n label: \"Subheadline\",\n multiline: true,\n maxLength: 280,\n },\n ],\n layout: [\n text(\n {\n as: \"p\",\n className: \"hero-eyebrow text-sm font-semibold tracking-wide\",\n style: textColorStyle('neutral-500'),\n },\n when(\"content.eyebrow\"),\n bind(\"content.eyebrow\"),\n ),\n text(\n {\n as: \"h1\",\n className: \"hero-headline text-4xl font-semibold sm:text-5xl md:text-6xl\",\n style: textColorStyle('neutral-900'),\n },\n bind(\"content.headline\"),\n ),\n text(\n {\n as: \"p\",\n className: \"hero-subheadline text-lg sm:text-xl\",\n style: textColorStyle('neutral-600'),\n },\n when(\"content.subheadline\"),\n bind(\"content.subheadline\"),\n ),\n ],\n});\n","import type { FieldDefinition } from '../manifest/schema'\n\ntype ButtonOptions = {\n variants?: { value: string; label: string }[]\n showGroupLabel?: boolean\n groupId?: string\n groupLabel?: string\n flattenInRepeater?: boolean\n}\n\nexport function createButtonGroup(options: ButtonOptions = {}): FieldDefinition {\n const {\n variants = [\n { value: 'primary', label: 'Primary' },\n { value: 'secondary', label: 'Secondary' },\n { value: 'outline', label: 'Outline' },\n ],\n showGroupLabel = false,\n groupId = 'button',\n groupLabel = 'Button',\n flattenInRepeater = true,\n } = options\n\n // Main button fields: label, variant, link\n const mainFields: FieldDefinition[] = [\n {\n id: 'label',\n type: 'text',\n label: 'Label',\n required: true,\n multiline: false,\n maxLength: 40,\n ui: { row: 'primary' },\n },\n {\n id: 'variant',\n type: 'select',\n label: 'Style',\n options: variants,\n required: false,\n multiple: false,\n ui: { row: 'primary' },\n },\n {\n id: 'link',\n type: 'link',\n label: 'Link',\n required: true,\n ui: { colSpan: 2 },\n },\n ]\n\n // Icons in collapsible disclosure section\n const iconsGroup: FieldDefinition = {\n id: 'icons',\n type: 'group',\n label: 'Icons',\n required: false,\n ui: { preset: 'disclosure', colSpan: 2 },\n schema: {\n fields: [\n { id: 'iconLeft', type: 'media', label: 'Left icon', required: false, mediaKinds: ['image'] },\n { id: 'iconRight', type: 'media', label: 'Right icon', required: false, mediaKinds: ['image'] },\n ],\n },\n } as FieldDefinition\n\n return {\n id: groupId,\n type: 'group',\n label: groupLabel,\n ui: { layout: 'grid', columns: 2, flattenInRepeater, hideLabel: !showGroupLabel },\n schema: { fields: [...mainFields, iconsGroup] },\n required: false,\n } as FieldDefinition\n}\n","import type { FieldDefinition } from '../manifest/schema'\nimport { createButtonGroup } from './button'\n\ntype CtasOptions = {\n id?: string\n label?: string\n itemLabel?: string\n minItems?: number\n maxItems?: number\n}\n\nexport function createCtasRepeater(options: CtasOptions = {}): FieldDefinition {\n const {\n id = 'ctas',\n label = 'Calls to action',\n itemLabel = 'CTA',\n minItems = 0,\n maxItems,\n } = options\n\n return {\n id,\n type: 'repeater',\n label,\n itemLabel,\n itemLabelSource: 'label',\n minItems,\n maxItems,\n schema: {\n fields: [createButtonGroup({ showGroupLabel: false, flattenInRepeater: true })],\n },\n } as FieldDefinition\n}\n","import { defineFragment, type FragmentDefinition } from \"../types\";\nimport { ctaRow } from \"../../node/fragments\";\nimport { createCtasRepeater } from \"../../fields/ctas\";\n\nexport const ctaRowFragment: FragmentDefinition = defineFragment({\n id: \"ctaRow\",\n title: \"CTA Row\",\n description: \"Repeatable calls to action rendered inline.\",\n fields: [createCtasRepeater({ label: \"Calls to action\", itemLabel: \"CTA\", maxItems: 3 })],\n layout: [\n ctaRow({ collectionPath: \"content.ctas\", itemName: \"cta\", justify: \"center\" }),\n ],\n});\n","import { defineFragment, type FragmentDefinition } from \"../types\";\nimport { headingGroup } from \"../../node/fragments\";\nimport { richText, bind, when } from \"../../node/builder\";\nimport { textColorStyle } from \"../../../theme/utils/colorStyles\";\n\nexport const ctaCopyFragment: FragmentDefinition = defineFragment({\n id: \"ctaCopy\",\n title: \"CTA Copy\",\n description: \"Eyebrow, title, and supporting rich text for CTA layouts.\",\n fields: [\n {\n id: \"eyebrow\",\n type: \"text\",\n label: \"Eyebrow\",\n description: \"Optional short line above the title\",\n visibleRoles: [\"designer\", \"admin\"],\n },\n {\n id: \"title\",\n type: \"text\",\n label: \"Title\",\n required: true,\n maxLength: 120,\n },\n {\n id: \"content\",\n type: \"richText\",\n label: \"Copy\",\n description: \"Short paragraph of supporting copy.\",\n },\n ],\n layout: [\n headingGroup({ eyebrowPath: \"content.eyebrow\", titlePath: \"content.title\", className: \"cta-heading\" }),\n richText(\n {\n className: \"cta-content prose prose-lg mx-auto max-w-none sm:prose-xl\",\n style: textColorStyle('neutral-700'),\n },\n when(\"content.content\"),\n bind(\"content.content\"),\n ),\n ],\n});\n","import { defineFragment, type FragmentDefinition } from \"../types\";\nimport { stack, text, bind, when } from \"../../node/builder\";\nimport { textColorStyle } from \"../../../theme/utils/colorStyles\";\n\nexport const testimonialsHeadingFragment: FragmentDefinition = defineFragment({\n id: \"testimonialsHeading\",\n title: \"Testimonials Heading\",\n description: \"Heading and subheading copy for testimonials section.\",\n fields: [\n {\n id: \"heading\",\n type: \"text\",\n label: \"Heading\",\n description: \"Optional block heading displayed above the testimonials.\",\n },\n {\n id: \"subheading\",\n type: \"text\",\n label: \"Description\",\n multiline: true,\n description: \"Optional supporting copy shown below the heading.\",\n },\n ],\n layout: [\n stack(\n { gap: \"md\", className: \"mx-auto max-w-2xl text-center\" },\n [\n text(\n { as: \"h2\", className: \"text-3xl font-semibold sm:text-4xl\", style: textColorStyle('neutral-900') },\n when(\"content.heading\"),\n bind(\"content.heading\"),\n ),\n text(\n { as: \"p\", className: \"text-lg sm:text-xl\", style: textColorStyle('neutral-600') },\n when(\"content.subheading\"),\n bind(\"content.subheading\"),\n ),\n ],\n ),\n ],\n});\n","import { defineFragment, type FragmentDefinition } from \"../types\";\nimport { carousel, stack, richText, bind, when, inline, media, repeat, text } from \"../../node/builder\";\nimport {\n backgroundColorStyle,\n borderColorStyle,\n mergeStyles,\n textColorStyle,\n} from \"../../../theme/utils/colorStyles\";\n\nexport const testimonialsCarouselFragment: FragmentDefinition = defineFragment({\n id: \"testimonialsCarousel\",\n title: \"Testimonials Carousel\",\n description: \"Carousel layout for testimonial cards with data loader configuration.\",\n fields: [\n {\n id: \"slidesToShow\",\n type: \"select\",\n label: \"Testimonials per view\",\n defaultValue: \"1\",\n options: [\n { value: \"1\", label: \"One at a time\" },\n { value: \"2\", label: \"Two at a time\" },\n { value: \"3\", label: \"Three at a time\" },\n ],\n },\n {\n id: \"transition\",\n type: \"select\",\n label: \"Transition\",\n defaultValue: \"slide\",\n options: [\n { value: \"slide\", label: \"Slide\" },\n { value: \"fade\", label: \"Fade\" },\n ],\n },\n {\n id: \"maxEntries\",\n type: \"select\",\n label: \"Testimonials to load\",\n defaultValue: \"6\",\n options: [\n { value: \"3\", label: \"3 testimonials\" },\n { value: \"6\", label: \"6 testimonials\" },\n { value: \"9\", label: \"9 testimonials\" },\n ],\n },\n ],\n layout: [\n carousel(\n {\n className: \"mt-12\",\n slidesToShow: { $bind: { from: \"slidesToShow\", fallback: 1 } },\n transition: { $bind: { from: \"transition\", fallback: \"slide\" } },\n showControls: true,\n },\n [\n stack(\n {\n gap: \"lg\",\n className:\n \"h-full justify-between rounded-2xl border p-8 shadow-sm\",\n style: mergeStyles(\n borderColorStyle('neutral-200'),\n backgroundColorStyle('surface'),\n ),\n },\n [\n richText(\n {\n className:\n \"prose prose-lg max-w-none sm:prose-xl\",\n style: textColorStyle('neutral-700'),\n },\n bind(\"testimonial.content.body\"),\n when(\"testimonial.content.body\"),\n ),\n inline(\n { gap: \"md\", className: \"mt-6 items-center\" },\n [\n media(\n { className: \"h-12 w-12 shrink-0 rounded-full object-cover\" },\n bind(\"testimonial.content.headshot\", { transforms: [{ id: \"media.fromUrl\" }] }),\n when(\"testimonial.content.headshot\"),\n ),\n stack(\n { gap: \"xs\" },\n [\n text(\n { as: \"p\", className: \"font-semibold\", style: textColorStyle('neutral-900') },\n bind(\"testimonial.content.name\", { fallback: \"Anonymous\" }),\n ),\n text(\n { as: \"p\", className: \"text-sm\", style: textColorStyle('neutral-500') },\n when(\"testimonial.content.jobTitle\"),\n bind(\"testimonial.content.jobTitle\"),\n ),\n text(\n { as: \"p\", className: \"text-sm\", style: textColorStyle('neutral-500') },\n when(\"testimonial.content.company\"),\n bind(\"testimonial.content.company\"),\n ),\n ],\n ),\n ],\n ),\n ],\n repeat(\"data.entries\", \"testimonial\"),\n ),\n ],\n ),\n ],\n data: {\n key: \"entries\",\n loader: {\n endpoint: \"listPublishedEntries\",\n params: {\n type: \"testimonial\",\n siteId: { $bind: { from: \"$root.siteId\" } },\n limit: { $bind: { from: \"maxEntries\", fallback: \"6\" } },\n stage: { $bind: { from: \"$root.previewStage\", fallback: \"published\" } },\n },\n mode: \"server\",\n },\n },\n});\n","import { defineFragment, type FragmentDefinition } from \"../types\";\nimport { text, richText, bind, when } from \"../../node/builder\";\nimport { textColorStyle } from \"../../../theme/utils/colorStyles\";\n\nexport const formCopyFragment: FragmentDefinition = defineFragment({\n id: \"formCopy\",\n title: \"Form Copy\",\n description: \"Optional title and introduction content for form blocks.\",\n fields: [\n {\n id: \"title\",\n type: \"text\",\n label: \"Title\",\n },\n {\n id: \"intro\",\n type: \"richText\",\n label: \"Intro\",\n description: \"Optional introduction above the form.\",\n },\n ],\n layout: [\n text(\n {\n as: \"h2\",\n className: \"text-2xl font-semibold\",\n style: textColorStyle('text'),\n },\n when(\"content.title\"),\n bind(\"content.title\"),\n ),\n richText(\n {\n className: \"text-base\",\n style: textColorStyle('text'),\n },\n when(\"content.intro\"),\n bind(\"content.intro\"),\n ),\n ],\n});\n","import { defineFragment, type FragmentDefinition } from \"../types\";\nimport { form, bind } from \"../../node/builder\";\n\nexport const formEmbedFragment: FragmentDefinition = defineFragment({\n id: \"formEmbed\",\n title: \"Form Embed\",\n description: \"Embeds a saved form with configurable submit button copy.\",\n fields: [\n {\n id: \"formId\",\n type: \"reference\",\n label: \"Form\",\n description: \"Pick a saved form to render.\",\n required: true,\n referenceKind: \"form\",\n allowManualEntry: false,\n },\n {\n id: \"submitLabel\",\n type: \"text\",\n label: \"Submit button label\",\n defaultValue: \"Submit\",\n },\n {\n id: \"successMessage\",\n type: \"text\",\n label: \"Success message\",\n description: \"Shown after successful submit (handled by page or block).\",\n },\n ],\n layout: [\n form(\n {\n submitLabel: { $bind: { from: \"submitLabel\" } },\n successMessage: { $bind: { from: \"successMessage\" } },\n },\n [],\n bind(\"data.form\"),\n ),\n ],\n data: {\n key: \"form\",\n loader: {\n endpoint: \"getPublicFormById\",\n params: {\n formId: { $bind: { from: \"formId\" } },\n },\n mode: \"server\",\n },\n },\n});\n","import { defineFragment, type FragmentDefinition } from \"../types\";\nimport { richText, bind, when } from \"../../node/builder\";\nimport { textColorStyle } from \"../../../theme/utils/colorStyles\";\n\nexport const footerBottomTextFragment: FragmentDefinition = defineFragment({\n id: \"footerBottomText\",\n title: \"Footer Bottom Text\",\n description: \"Rich text content displayed at the bottom of the footer.\",\n fields: [\n {\n id: \"bottomText\",\n type: \"richText\",\n label: \"Bottom text\",\n description: \"Appears at the very bottom of the footer.\",\n ui: { variant: \"limited\" },\n },\n ],\n layout: [\n richText(\n {\n className: \"prose prose-sm mx-auto max-w-3xl text-center\",\n style: textColorStyle('text/80'),\n },\n when(\"bottomText\"),\n bind(\"bottomText\"),\n ),\n ],\n});\n","import { defineFragment, type FragmentDefinition } from \"../types\";\nimport { stack, text, link, repeat, when, bind } from \"../../node/builder\";\nimport { textColorStyle } from \"../../../theme/utils/colorStyles\";\n\nexport const footerLinkGroupsFragment: FragmentDefinition = defineFragment({\n id: \"footerLinkGroups\",\n title: \"Footer Link Groups\",\n description: \"Repeating columns of grouped footer links.\",\n fields: [\n {\n id: \"linkGroups\",\n type: \"repeater\",\n label: \"Link groups\",\n description: \"Organize footer links into columns.\",\n schema: {\n fields: [\n {\n id: \"title\",\n type: \"text\",\n label: \"Group title\",\n },\n {\n id: \"links\",\n type: \"repeater\",\n label: \"Links\",\n schema: {\n fields: [\n {\n id: \"label\",\n type: \"text\",\n label: \"Label\",\n required: true,\n },\n {\n id: \"link\",\n type: \"link\",\n label: \"Link\",\n required: true,\n },\n ],\n },\n },\n ],\n },\n },\n ],\n layout: [\n stack(\n {\n gap: \"lg\",\n align: \"start\",\n className: \"grid gap-8 md:grid-cols-3\",\n },\n [\n stack(\n { gap: \"md\", align: \"start\", className: \"text-left\" },\n [\n text(\n {\n as: \"h3\",\n className: \"text-xs font-semibold uppercase tracking-wide\",\n style: textColorStyle('text/70'),\n },\n when(\"group.title\"),\n bind(\"group.title\"),\n ),\n stack(\n { gap: \"sm\", align: \"start\", className: \"space-y-2\" },\n [\n link(\n {\n className: \"block text-sm transition-theme hover:opacity-80\",\n style: textColorStyle('text'),\n href: {\n $bind: {\n from: \"entry.link\",\n transforms: [{ id: \"links.resolve\" }],\n fallback: \"#\",\n },\n },\n target: { $bind: { from: \"entry.target\" } },\n rel: { $bind: { from: \"entry.rel\" } },\n },\n [text({ as: \"span\" }, bind(\"entry.label\"))],\n repeat(\"group.links\", \"entry\"),\n ),\n ],\n ),\n ],\n repeat(\"linkGroups\", \"group\"), // Relative path\n ),\n ],\n when(\"linkGroups\"), // Relative path\n ),\n ],\n});\n","import { defineFragment, type FragmentDefinition } from \"../types\";\nimport { ctaButton } from \"../../node/fragments\";\n\nexport const headerCtaFragment: FragmentDefinition = defineFragment({\n id: \"headerCta\",\n title: \"Header CTA\",\n description: \"Single call-to-action button for the site header.\",\n fields: [\n {\n id: \"cta\",\n type: \"group\",\n label: \"Call to action\",\n description: \"Primary action button displayed on CTA variant layouts.\",\n schema: {\n fields: [\n {\n id: \"label\",\n type: \"text\",\n label: \"Label\",\n description: \"Button label shown in the header.\",\n },\n {\n id: \"link\",\n type: \"link\",\n label: \"Link\",\n description: \"Select an internal page or provide a custom destination.\",\n },\n {\n id: \"variant\",\n type: \"select\",\n label: \"Style\",\n defaultValue: \"primary\",\n options: [\n { value: \"primary\", label: \"Primary\" },\n { value: \"secondary\", label: \"Secondary\" },\n { value: \"outline\", label: \"Outline\" },\n ],\n },\n ],\n },\n },\n ],\n layout: [\n ctaButton({\n basePath: \"cta\", // Relative path\n whenPath: \"cta.label\", // Relative path\n }),\n ],\n});\n","import { defineFragment, type FragmentDefinition } from \"../types\";\nimport { headingGroup, ctaButton } from \"../../node/fragments\";\nimport { createButtonGroup } from \"../../fields/button\";\n\nexport const singleButtonFragment: FragmentDefinition = defineFragment({\n id: \"singleButton\",\n title: \"Single Button Content\",\n description: \"Heading and primary button for the single button block.\",\n fields: [\n {\n id: \"title\",\n type: \"text\",\n label: \"Title\",\n required: true,\n maxLength: 120,\n },\n createButtonGroup({\n showGroupLabel: true,\n groupId: \"button\",\n groupLabel: \"Button\",\n flattenInRepeater: false,\n }),\n ],\n layout: [\n headingGroup({ titlePath: \"title\" }), // Relative path\n ctaButton({ basePath: \"button\" }), // Relative path\n ],\n});\n","import { defineFragment, type FragmentDefinition } from \"../types\";\nimport { sectionContainer } from \"../../node/fragments\";\nimport { stack, text, link, media, when, bind, props as withProps } from \"../../node/builder\";\nimport {\n borderColorStyle,\n backgroundColorStyle,\n textColorStyle,\n mergeStyles,\n} from \"../../../theme/utils/colorStyles\";\n\nexport const blogFeaturedPostFragment: FragmentDefinition = defineFragment({\n id: \"blogFeaturedPost\",\n title: \"Featured Blog Post\",\n description: \"Featured blog post card with title and preview content.\",\n fields: [\n {\n id: \"title\",\n type: \"text\",\n label: \"Block title\",\n description: \"Displayed above the featured blog post.\",\n defaultValue: \"Latest post\",\n maxLength: 120,\n },\n {\n id: \"postSlug\",\n type: \"reference\",\n label: \"Blog post\",\n description: \"Pick the blog post to feature in this block.\",\n required: true,\n referenceKind: \"post\",\n allowManualEntry: false,\n },\n ],\n layout: [\n sectionContainer(\n [\n stack({ gap: \"sm\", className: \"md:w-1/3\" }, [\n text(\n {\n as: \"h2\",\n className: \"text-2xl font-semibold md:text-3xl\",\n style: textColorStyle(\"neutral-900\"),\n },\n bind(\"title\", { fallback: \"Latest post\" }), // Relative path\n ),\n ]),\n stack({ gap: \"md\", className: \"flex-1\" }, [\n stack({\n gap: \"md\",\n className: \"rounded-2xl border bg-white p-6 shadow-sm\",\n style: borderColorStyle(\"neutral-200\"),\n }, [\n link(\n {\n className: \"block overflow-hidden rounded-xl border\",\n style: borderColorStyle(\"neutral-100\"),\n href: { $bind: { from: \"post.path\" } },\n },\n [\n media(\n { className: \"h-56 w-full object-cover\" },\n bind(\"post.image\", { transforms: [{ id: \"media.fromUrl\" }] }),\n ),\n ],\n when(\"post.image\"),\n ),\n stack({ gap: \"sm\" }, [\n link(\n {\n className: \"block text-2xl font-semibold hover:opacity-80\",\n style: textColorStyle(\"neutral-900\"),\n href: { $bind: { from: \"post.path\" } },\n },\n [text({ as: \"span\" }, bind(\"post.title\"))],\n ),\n text(\n { as: \"p\", className: \"text-sm\", style: textColorStyle(\"neutral-500\") },\n when(\"post.publishedAt\"),\n bind(\"post.publishedAt\", { transforms: [{ id: \"date.formatShort\" }] }),\n ),\n text(\n { as: \"p\", className: \"text-base\", style: textColorStyle(\"neutral-600\") },\n bind(\"post.excerpt\", { fallback: \"Select a blog post to display its preview.\" }),\n ),\n link(\n {\n className: \"inline-flex items-center text-sm font-semibold hover:opacity-80\",\n style: textColorStyle(\"primary\"),\n href: { $bind: { from: \"post.path\" } },\n },\n [text({ as: \"span\" }, withProps({ value: \"Read more →\" }))],\n ),\n ]),\n ], when(\"post\")),\n stack(\n {\n gap: \"sm\",\n className: \"rounded-xl border border-dashed p-6 text-sm\",\n style: mergeStyles(\n borderColorStyle(\"neutral-300\"),\n backgroundColorStyle(\"neutral-50\"),\n textColorStyle(\"neutral-500\"),\n ),\n },\n [text({ as: \"p\" }, withProps({ value: \"Select a blog post to display its preview.\" }))],\n when(\"post\", { not: true }),\n ),\n ]),\n ],\n { gap: \"lg\", className: \"w-full md:flex-row md:items-start md:gap-10\" },\n ),\n ],\n data: {\n key: \"post\",\n loader: {\n endpoint: \"getPublishedEntryPreview\",\n params: {\n type: \"post\",\n slug: { $bind: { from: \"postSlug\" } },\n siteId: { $bind: { from: \"$root.siteId\" } },\n },\n mode: \"server\",\n },\n },\n});\n","import { defineFragment, type FragmentDefinition } from \"../types\";\nimport { stack, text, link, media, when, bind, el, repeat, button, type NodeModifier } from \"../../node/builder\";\nimport {\n backgroundColorStyle,\n borderColorStyle,\n mergeStyles,\n textColorStyle,\n} from \"../../../theme/utils/colorStyles\";\n\n// Grid primitive helper\nconst grid = (\n props?: Record<string, unknown> | null,\n children?: Array<import(\"../../node\").NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n) => el(\"grid\", props ?? undefined, children ?? undefined, ...mods);\n\nexport const blogListGridFragment: FragmentDefinition = defineFragment({\n id: \"blogListGrid\",\n title: \"Blog List Grid\",\n description: \"Grid layout for displaying blog posts as cards with images.\",\n fields: [\n {\n id: \"columns\",\n type: \"select\",\n label: \"Grid columns\",\n description: \"Number of columns in the grid layout.\",\n defaultValue: \"3\",\n options: [\n { value: \"2\", label: \"2 columns\" },\n { value: \"3\", label: \"3 columns\" },\n { value: \"4\", label: \"4 columns\" },\n ],\n },\n {\n id: \"showImages\",\n type: \"boolean\",\n label: \"Show images\",\n description: \"Display featured images for each post.\",\n defaultValue: true,\n },\n {\n id: \"showExcerpts\",\n type: \"boolean\",\n label: \"Show excerpts\",\n description: \"Display post preview text.\",\n defaultValue: true,\n },\n {\n id: \"showDates\",\n type: \"boolean\",\n label: \"Show dates\",\n description: \"Display publish dates.\",\n defaultValue: true,\n },\n ],\n layout: [\n // Grid container\n grid(\n {\n className: \"grid grid-cols-1 gap-8 md:grid-cols-2 lg:grid-cols-3\",\n },\n [\n // Individual post card\n stack(\n {\n gap: \"md\",\n className: \"flex flex-col overflow-hidden rounded-xl border shadow-sm transition-shadow hover:shadow-md\",\n style: mergeStyles(\n borderColorStyle('neutral-200'),\n backgroundColorStyle('surface'),\n ),\n },\n [\n // Featured image\n link(\n {\n className: \"block overflow-hidden\",\n href: { $bind: { from: \"post.path\" } },\n },\n [\n media(\n {\n className: \"h-56 w-full object-cover transition-transform hover:scale-105\",\n },\n bind(\"post.image\", { transforms: [{ id: \"media.fromUrl\" }] }),\n ),\n ],\n when(\"post.image\"),\n when(\"showImages\"),\n ),\n\n // Post content\n stack({ gap: \"sm\", className: \"flex-1 p-6\" }, [\n // Title\n link(\n {\n href: { $bind: { from: \"post.path\" } },\n className: \"block text-xl font-semibold transition-colors hover:opacity-80\",\n style: textColorStyle('neutral-900'),\n },\n [text({ as: \"h3\" }, bind(\"post.title\"))],\n ),\n\n // Date\n text(\n {\n as: \"time\",\n className: \"text-sm\",\n style: textColorStyle('neutral-500'),\n },\n bind(\"post.publishedAt\", { transforms: [{ id: \"date.formatShort\" }] }),\n when(\"post.publishedAt\"),\n when(\"showDates\"),\n ),\n\n // Excerpt\n text(\n {\n as: \"p\",\n className: \"mt-2 text-base line-clamp-3\",\n style: textColorStyle('neutral-600'),\n },\n bind(\"post.excerpt\"),\n when(\"post.excerpt\"),\n when(\"showExcerpts\"),\n ),\n\n // Read more button\n button(\n {\n href: { $bind: { from: \"post.path\" } },\n className: {\n $bind: { from: \"readMoreVariant\", fallback: \"primary\" },\n $prepend: \"button-\",\n },\n },\n [text({ as: \"span\" }, bind(\"readMoreText\", { fallback: \"Read more →\" }))],\n ),\n ]),\n ],\n repeat(\"data.posts\", \"post\"),\n ),\n ],\n ),\n ],\n data: {\n key: \"posts\",\n loader: {\n endpoint: \"listPublishedEntries\",\n params: {\n type: \"post\",\n siteId: { $bind: { from: \"$root.siteId\" } },\n limit: { $bind: { from: \"postsPerPage\", fallback: \"12\" } },\n stage: { $bind: { from: \"$root.previewStage\", fallback: \"published\" } },\n },\n mode: \"server\",\n },\n },\n});\n","import { bind, inline, link, media, repeat, stack, text, when, button } from \"../../node/builder\";\nimport { defineFragment, type FragmentDefinition } from \"../types\";\nimport { borderColorStyle, textColorStyle } from \"../../../theme/utils/colorStyles\";\n\nexport const blogListStackFragment: FragmentDefinition = defineFragment({\n id: \"blogListStack\",\n title: \"Blog List Stack\",\n description: \"Vertical list layout for displaying blog posts with optional thumbnails.\",\n fields: [\n {\n id: \"showImages\",\n type: \"boolean\",\n label: \"Show images\",\n description: \"Display thumbnail images for each post.\",\n defaultValue: true,\n },\n {\n id: \"showExcerpts\",\n type: \"boolean\",\n label: \"Show excerpts\",\n description: \"Display post preview text.\",\n defaultValue: true,\n },\n {\n id: \"showDates\",\n type: \"boolean\",\n label: \"Show dates\",\n description: \"Display publish dates.\",\n defaultValue: true,\n },\n ],\n layout: [\n // Vertical stack container\n stack({ gap: \"lg\", className: \"mx-auto max-w-3xl\" }, [\n // Individual post row\n inline(\n {\n gap: \"md\",\n className: \"items-start border-b pb-6 last:border-b-0\",\n style: borderColorStyle('neutral-200'),\n },\n [\n // Optional thumbnail (left-aligned)\n link(\n {\n href: { $bind: { from: \"post.path\" } },\n className: \"flex-shrink-0\",\n },\n [\n media(\n {\n className: \"h-24 w-24 rounded-lg object-cover transition-transform hover:scale-105\",\n },\n bind(\"post.image\", { transforms: [{ id: \"media.fromUrl\" }] }),\n ),\n ],\n when(\"post.image\"),\n when(\"showImages\"),\n ),\n\n // Post content (grows to fill space)\n stack({ gap: \"sm\", className: \"flex-1 min-w-0\" }, [\n // Title\n link(\n {\n href: { $bind: { from: \"post.path\" } },\n className: \"block text-xl font-semibold transition-colors hover:opacity-80\",\n style: textColorStyle('neutral-900'),\n },\n [text({ as: \"h3\" }, bind(\"post.title\"))],\n ),\n\n // Date\n text(\n {\n as: \"time\",\n className: \"text-sm\",\n style: textColorStyle('neutral-500'),\n },\n bind(\"post.publishedAt\", { transforms: [{ id: \"date.formatShort\" }] }),\n when(\"post.publishedAt\"),\n when(\"showDates\"),\n ),\n\n // Excerpt\n text(\n {\n as: \"p\",\n className: \"text-sm line-clamp-2\",\n style: textColorStyle('neutral-600'),\n },\n bind(\"post.excerpt\"),\n when(\"post.excerpt\"),\n when(\"showExcerpts\"),\n ),\n\n // Read more button\n button(\n {\n href: { $bind: { from: \"post.path\" } },\n className: {\n $bind: { from: \"readMoreVariant\", fallback: \"primary\" },\n $prepend: \"button-\",\n },\n },\n [text({ as: \"span\" }, bind(\"readMoreText\", { fallback: \"Read more →\" }))],\n ),\n ]),\n ],\n repeat(\"data.posts\", \"post\"),\n ),\n ]),\n ],\n data: {\n key: \"posts\",\n loader: {\n endpoint: \"listPublishedEntries\",\n params: {\n type: \"post\",\n siteId: { $bind: { from: \"$root.siteId\" } },\n limit: { $bind: { from: \"postsPerPage\", fallback: \"12\" } },\n stage: { $bind: { from: \"$root.previewStage\", fallback: \"published\" } },\n },\n mode: \"server\",\n },\n },\n});\n","import { defineFragment, type FragmentDefinition } from \"../types\";\nimport { stack, text, richText, bind, when } from \"../../node/builder\";\nimport { textColorStyle } from \"../../../theme/utils/colorStyles\";\n\nexport const faqHeadingFragment: FragmentDefinition = defineFragment({\n id: \"faqHeading\",\n title: \"FAQ Heading\",\n description: \"Optional eyebrow, title, and description for FAQ sections.\",\n fields: [\n {\n id: \"eyebrow\",\n type: \"text\",\n label: \"Eyebrow\",\n description: \"Short label displayed above the title.\",\n visibleRoles: [\"designer\", \"admin\"],\n maxLength: 60,\n },\n {\n id: \"title\",\n type: \"text\",\n label: \"Title\",\n required: false,\n maxLength: 120,\n },\n {\n id: \"description\",\n type: \"richText\",\n label: \"Description\",\n required: false,\n ui: { variant: \"limited\" },\n },\n ],\n layout: stack(\n {\n gap: \"sm\",\n className: \"mx-auto max-w-3xl text-center mb-4\",\n },\n [\n text(\n {\n as: \"p\",\n className: \"faq-eyebrow text-sm font-semibold uppercase tracking-wide\",\n style: textColorStyle('primary'),\n },\n when(\"content.eyebrow\"),\n bind(\"content.eyebrow\"),\n ),\n text(\n {\n as: \"h2\",\n className: \"faq-title text-3xl font-semibold sm:text-4xl\",\n style: textColorStyle('neutral-900'),\n },\n when(\"content.title\"),\n bind(\"content.title\"),\n ),\n richText(\n {\n className:\n \"faq-description prose mx-auto max-w-none text-base sm:text-lg\",\n style: textColorStyle('neutral-600'),\n },\n when(\"content.description\"),\n bind(\"content.description\"),\n ),\n ],\n ),\n});\n","import { accordionList } from \"../../node/builder\";\nimport { defineFragment, type FragmentDefinition } from \"../types\";\n\nexport const faqAccordionFragment: FragmentDefinition = defineFragment({\n id: \"faqAccordion\",\n title: \"FAQ Accordion\",\n description: \"Expandable list of question and answer pairs.\",\n fields: [\n {\n id: \"items\",\n type: \"repeater\",\n label: \"FAQ items\",\n itemLabel: \"FAQ item\",\n itemLabelSource: \"question\",\n minItems: 1,\n maxItems: 30,\n schema: {\n fields: [\n {\n id: \"question\",\n type: \"text\",\n label: \"Question\",\n required: true,\n maxLength: 160,\n },\n {\n id: \"answer\",\n type: \"richText\",\n label: \"Answer\",\n required: true,\n ui: { variant: \"limited\" },\n },\n ],\n },\n },\n ],\n layout: accordionList({\n collection: \"content.items\",\n itemName: \"faqItem\",\n indexName: \"faqIndex\",\n accordionProps: {\n className: \"accordion-root\", // CSS-first: all styling handled by theme CSS\n type: \"single\",\n collapsible: true,\n },\n itemProps: {\n className: \"accordion-item\",\n iconStyle: { $bind: { from: \"theme.accordions.icon.style\" } }, // Pass icon style from theme\n },\n triggerFrom: \"faqItem.question\",\n contentFrom: \"faqItem.answer\",\n }),\n});\n","import { defineFragment, type FragmentDefinition } from '../types';\nimport { stack, text, richText, media, bind, when } from '../../node/builder';\nimport { createCtasRepeater } from '../../fields/ctas';\nimport { ctaRow } from '../../node/fragments/ctaRow';\nimport { textColorStyle } from '../../../theme/utils/colorStyles';\n\n/**\n * Card fragment - flexible content card with title, body, optional media, and action buttons\n *\n * Features:\n * - Featured media (image/video) with configurable aspect ratio\n * - Title and rich text body\n * - Call-to-action buttons (0-3)\n * - Variant-based styling from theme (background, spacing, elevation, rounded corners)\n *\n * Card styling is managed through CSS generation at build-time (generateCardCss).\n * Each card uses:\n * - .card-{variant} - Container styles (background, border, shadow, radius)\n * - .card-media - Media corners matching container\n * - .card-content - Padding based on variant spacing\n *\n * This CSS-first approach eliminates runtime transforms for styling.\n */\nexport const cardFragment: FragmentDefinition = defineFragment({\n id: 'card',\n title: 'Card',\n description: 'Content card with optional media, title, body, and action buttons',\n category: 'content',\n icon: 'LayoutCard',\n fields: [\n {\n id: 'media',\n type: 'media',\n label: 'Featured media',\n description: 'Image or video displayed at top of card',\n required: false,\n mediaKinds: ['image', 'video'],\n },\n {\n id: 'aspectRatio',\n type: 'select',\n label: 'Media aspect ratio',\n defaultValue: 'auto',\n options: [\n { value: 'auto', label: 'Auto' },\n { value: '16/9', label: '16:9 (Landscape)' },\n { value: '4/3', label: '4:3 (Standard)' },\n { value: '1/1', label: '1:1 (Square)' },\n { value: '3/4', label: '3:4 (Portrait)' },\n ],\n condition: {\n field: 'media',\n operator: 'isNotEmpty',\n },\n },\n {\n id: 'title',\n type: 'text',\n label: 'Title',\n required: true,\n maxLength: 120,\n },\n {\n id: 'body',\n type: 'richText',\n label: 'Body',\n description: 'Main card content',\n format: 'markdown',\n },\n createCtasRepeater({\n id: 'ctas',\n label: 'Action buttons',\n itemLabel: 'Button',\n minItems: 0,\n maxItems: 3,\n }),\n {\n id: 'variant',\n type: 'select',\n label: 'Card variant',\n description: 'Choose a card style from your theme',\n required: false,\n defaultValue: 'default',\n options: [\n { value: 'default', label: 'Default' },\n { value: 'variant1', label: 'Variant 1' },\n { value: 'variant2', label: 'Variant 2' },\n ],\n },\n ],\n layout: stack(\n {\n gap: 'none',\n className: {\n $bind: {\n from: 'variant',\n fallback: 'default',\n },\n $prepend: 'card-',\n },\n },\n [\n // Featured media at top (conditional) - full width, no padding\n // CSS handles corner radius via .card-{variant} .card-media selector\n media(\n {\n className: 'card-media w-full h-auto object-cover',\n style: {\n aspectRatio: { $bind: { from: 'aspectRatio' } },\n },\n },\n when('media'),\n bind('media')\n ),\n // Content wrapper with padding based on variant\n // CSS handles padding via .card-{variant} .card-content selector\n stack(\n {\n gap: 'sm',\n className: 'card-content',\n },\n [\n text(\n {\n as: 'h3',\n className: 'card-title text-xl font-semibold',\n },\n bind('title'),\n ),\n richText(\n {\n className: 'card-body text-base',\n style: textColorStyle('mutedText'),\n },\n when('body'),\n bind('body'),\n ),\n // Action buttons at bottom (conditional)\n ctaRow({\n collectionPath: 'ctas',\n itemName: 'cta',\n gap: 'sm',\n justify: 'start',\n containerClassName: 'mt-2',\n }),\n ]\n ),\n ],\n ),\n});\n","import { defineFragment, type FragmentDefinition } from '../types';\nimport { text, bind } from '../../node/builder';\n\n/**\n * Heading fragment - simple text heading with configurable level\n */\nexport const headingFragment: FragmentDefinition = defineFragment({\n id: 'heading',\n title: 'Heading',\n description: 'Text heading',\n category: 'content',\n icon: 'Heading',\n fields: [\n {\n id: 'text',\n type: 'text',\n label: 'Heading text',\n required: true,\n maxLength: 200,\n },\n {\n id: 'level',\n type: 'select',\n label: 'Heading level',\n defaultValue: 'h2',\n options: [\n { value: 'h1', label: 'H1 (Large)' },\n { value: 'h2', label: 'H2 (Medium)' },\n { value: 'h3', label: 'H3 (Small)' },\n ],\n },\n ],\n layout: text(\n {\n as: { $bind: { from: 'level' } }, // Relative path - resolves to current scope\n className: 'fragment-heading font-bold',\n },\n bind('text'), // Relative path - resolves to current scope\n ),\n});\n","import { defineFragment, type FragmentDefinition } from '../types';\nimport { richText, bind } from '../../node/builder';\n\n/**\n * Rich text fragment - formatted text content\n */\nexport const richTextFragment: FragmentDefinition = defineFragment({\n id: 'richText',\n title: 'Rich Text',\n description: 'Formatted text with markdown',\n category: 'content',\n icon: 'FileText',\n fields: [\n {\n id: 'content',\n type: 'richText',\n label: 'Content',\n required: true,\n format: 'markdown',\n },\n ],\n layout: richText(\n {\n className: 'fragment-richtext prose prose-neutral',\n },\n bind('content'), // Relative path - resolves to current scope\n ),\n});\n","/**\n * Lazy fragment registration.\n * This module provides a synchronous lazy initialization mechanism\n * that registers all fragments on first access.\n */\n\nimport type { FragmentDefinition } from './types';\n\n// Import all fragment definitions at module load time\nimport { bodyCopyFragment } from './library/bodyCopy';\nimport { heroCopyFragment } from './library/heroCopy';\nimport { ctaRowFragment } from './library/ctaRow';\nimport { ctaCopyFragment } from './library/ctaCopy';\nimport { testimonialsHeadingFragment } from './library/testimonialsHeading';\nimport { testimonialsCarouselFragment } from './library/testimonialsCarousel';\nimport { formCopyFragment } from './library/formCopy';\nimport { formEmbedFragment } from './library/formEmbed';\nimport { footerBottomTextFragment } from './library/footerBottomText';\nimport { footerLinkGroupsFragment } from './library/footerLinkGroups';\nimport { headerCtaFragment } from './library/headerCta';\nimport { singleButtonFragment } from './library/singleButton';\nimport { blogFeaturedPostFragment } from './library/blogFeaturedPost';\nimport { blogListGridFragment } from './library/blogListGrid';\nimport { blogListStackFragment } from './library/blogListStack';\nimport { faqHeadingFragment } from './library/faqHeading';\nimport { faqAccordionFragment } from './library/faqAccordion';\nimport { cardFragment } from './library/card';\nimport { headingFragment } from './library/heading';\nimport { richTextFragment } from './library/richText';\n\n// Track initialization state\nlet initialized = false;\n\n// All fragments to register\nconst ALL_FRAGMENTS: FragmentDefinition[] = [\n bodyCopyFragment,\n heroCopyFragment,\n ctaRowFragment,\n ctaCopyFragment,\n testimonialsHeadingFragment,\n testimonialsCarouselFragment,\n formCopyFragment,\n formEmbedFragment,\n footerBottomTextFragment,\n footerLinkGroupsFragment,\n headerCtaFragment,\n singleButtonFragment,\n blogFeaturedPostFragment,\n blogListGridFragment,\n blogListStackFragment,\n faqHeadingFragment,\n faqAccordionFragment,\n cardFragment,\n headingFragment,\n richTextFragment,\n];\n\n/**\n * Register all fragment definitions lazily.\n * This function is called by the registry on first access.\n *\n * @param registerFn - Function to register a single fragment\n */\nexport function lazyRegisterFragments(registerFn: (fragment: FragmentDefinition) => void): void {\n if (initialized) return;\n\n // Register each fragment\n ALL_FRAGMENTS.forEach(registerFn);\n\n initialized = true;\n}\n\n/**\n * Reset the initialization flag.\n * Used by clearFragmentRegistry() to allow re-initialization.\n */\nexport function resetLazyInit(): void {\n initialized = false;\n}\n","import type { FragmentDefinition } from './types';\nimport { lazyRegisterFragments, resetLazyInit } from './lazyInit';\n\n/**\n * Central registry of all available fragments.\n * Fragments are registered lazily on first access.\n */\nexport type FragmentRegistry = Record<string, FragmentDefinition>;\n\n// Global fragment registry\nconst fragmentRegistry: FragmentRegistry = {};\n\n/**\n * Ensure all fragments are registered.\n * This is called automatically by getFragmentRegistry() and getFragment().\n * Can also be called explicitly to force registration.\n */\nfunction ensureInitialized(): void {\n lazyRegisterFragments((fragment) => {\n if (!fragmentRegistry[fragment.id]) {\n fragmentRegistry[fragment.id] = fragment;\n }\n });\n}\n\n/**\n * Register a fragment definition in the global registry.\n * Fragments should be registered at module load time (not runtime).\n *\n * @param fragment - The fragment definition to register\n * @throws Error if fragment ID is already registered\n */\nexport function registerFragment(fragment: FragmentDefinition): void {\n if (fragmentRegistry[fragment.id]) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(`[fragments] Fragment \"${fragment.id}\" already registered, skipping duplicate`);\n }\n return;\n }\n fragmentRegistry[fragment.id] = fragment;\n}\n\n/**\n * Get a fragment definition by ID.\n *\n * @param id - The fragment ID to look up\n * @returns The fragment definition, or undefined if not found\n */\nexport function getFragment(id: string): FragmentDefinition | undefined {\n ensureInitialized();\n return fragmentRegistry[id];\n}\n\n/**\n * List all registered fragments, optionally filtered by category.\n *\n * @param category - Optional category filter ('content', 'media', 'interactive', 'layout')\n * @returns Array of fragment definitions\n */\nexport function listFragments(category?: string): FragmentDefinition[] {\n ensureInitialized();\n const all = Object.values(fragmentRegistry);\n return category ? all.filter(f => f.category === category) : all;\n}\n\n/**\n * Get the full fragment registry.\n * Useful for passing to runtime components.\n *\n * @returns The complete fragment registry\n */\nexport function getFragmentRegistry(): FragmentRegistry {\n ensureInitialized();\n return fragmentRegistry;\n}\n\n/**\n * Clear all registered fragments.\n * Primarily used for testing.\n */\nexport function clearFragmentRegistry(): void {\n Object.keys(fragmentRegistry).forEach(key => {\n delete fragmentRegistry[key];\n });\n // Reset lazy initialization flag so fragments can be re-registered\n resetLazyInit();\n}\n","import type { FragmentDefinition } from '../types';\nimport type { RepeaterFieldDefinition } from '../../manifest/schema';\n\n/**\n * Converts a record of fragments into a polymorphic repeater field definition.\n * This allows fragments to be used in blocks via repeaters with type selection.\n *\n * @example\n * ```typescript\n * const field = fragmentsToRepeaterField(\n * 'items',\n * 'Column content',\n * {\n * card: cardFragment,\n * quote: quoteFragment,\n * stat: statFragment\n * },\n * { minItems: 0, maxItems: 50 }\n * );\n * ```\n */\nexport function fragmentsToRepeaterField(\n id: string,\n label: string,\n fragments: Record<string, FragmentDefinition>,\n options: {\n minItems?: number;\n maxItems?: number;\n itemLabel?: string;\n description?: string;\n allowConversion?: boolean;\n } = {}\n): RepeaterFieldDefinition {\n return {\n id,\n type: 'repeater',\n label,\n description: options.description,\n polymorphic: true,\n itemLabel: options.itemLabel ?? 'Item',\n itemLabelSource: '_type',\n minItems: options.minItems ?? 0,\n maxItems: options.maxItems,\n allowConversion: options.allowConversion ?? true,\n required: false,\n itemTypes: Object.fromEntries(\n Object.entries(fragments).map(([typeId, fragment]) => [\n typeId,\n {\n label: fragment.title ?? typeId,\n icon: fragment.icon,\n fields: fragment.fields\n }\n ])\n )\n };\n}\n","import { defineFragment, type FragmentDefinition } from '../types';\nimport { stack, media, text, bind, when } from '../../node/builder';\nimport { textColorStyle } from '../../../theme/utils/colorStyles';\n\n/**\n * Image fragment - single image with optional caption and aspect ratio control\n */\nexport const imageFragment: FragmentDefinition = defineFragment({\n id: 'image',\n title: 'Image',\n description: 'Image with optional caption',\n category: 'content',\n icon: 'Image',\n fields: [\n {\n id: 'image',\n type: 'media',\n label: 'Image',\n required: true,\n mediaKinds: ['image'],\n },\n {\n id: 'caption',\n type: 'text',\n label: 'Caption',\n required: false,\n maxLength: 200,\n },\n {\n id: 'aspectRatio',\n type: 'select',\n label: 'Aspect ratio',\n defaultValue: 'auto',\n options: [\n { value: 'auto', label: 'Auto' },\n { value: '16/9', label: '16:9 (Landscape)' },\n { value: '4/3', label: '4:3 (Standard)' },\n { value: '1/1', label: '1:1 (Square)' },\n { value: '3/4', label: '3:4 (Portrait)' },\n ],\n },\n ],\n layout: stack({ gap: 'sm' }, [\n media(\n {\n className: 'fragment-image w-full h-auto object-cover',\n style: {\n aspectRatio: { $bind: { from: 'aspectRatio' } },\n },\n },\n bind('image')\n ),\n text(\n {\n as: 'p',\n className: 'image-caption text-sm text-center',\n style: textColorStyle('mutedText'),\n },\n when('caption'),\n bind('caption')\n ),\n ]),\n});\n","import { defineFragment, type FragmentDefinition } from '../types';\nimport { stack } from '../../node/builder';\nimport { fragmentsToRepeaterField } from '../utils/toRepeaterSchema';\nimport { imageFragment } from './image';\nimport { headingFragment } from './heading';\nimport { richTextFragment } from './richText';\nimport { typeBasedLayout } from '../../node';\n\n/**\n * Column content fragment - represents a single column with nested items.\n * Each column can contain a flexible stack of images, headings, and rich text.\n */\nexport const columnContentFragment: FragmentDefinition = defineFragment({\n id: 'columnContent',\n title: 'Column',\n description: 'A single column with customizable content',\n category: 'layout',\n icon: 'RectangleVertical',\n fields: [\n fragmentsToRepeaterField(\n 'items',\n 'Column items',\n {\n image: imageFragment,\n heading: headingFragment,\n richText: richTextFragment,\n },\n {\n minItems: 0,\n maxItems: 20,\n itemLabel: 'Item',\n description: 'Add content to this column',\n }\n ),\n ],\n layout: stack(\n { gap: 'md', className: 'h-full' },\n [\n {\n type: 'stack',\n gap: 'md',\n children: typeBasedLayout(\n {\n image: imageFragment.layout,\n heading: headingFragment.layout,\n richText: richTextFragment.layout,\n },\n { itemName: 'item' }\n ),\n $repeat: {\n collection: { from: 'items' },\n itemName: 'item',\n },\n },\n ]\n ),\n});\n","/**\n * @file Defines constants for the background field, ensuring a single source of truth\n * for presets used in both the field definition and the style transforms.\n */\n\nexport const BACKGROUND_POSITION_PRESETS = [\n { value: 'center', label: 'Center' },\n { value: 'top', label: 'Top' },\n { value: 'top left', label: 'Top Left' },\n { value: 'top right', label: 'Top Right' },\n { value: 'bottom', label: 'Bottom' },\n { value: 'bottom left', label: 'Bottom Left' },\n { value: 'bottom right', label: 'Bottom Right' },\n { value: 'left', label: 'Left' },\n { value: 'right', label: 'Right' },\n // The following are valid keywords but are not included in the UI to reduce clutter.\n // They are included here to ensure the transform logic can correctly identify them as presets.\n { value: 'top center', label: 'Top Center' },\n { value: 'bottom center', label: 'Bottom Center' },\n { value: 'left center', label: 'Left Center' },\n { value: 'right center', label: 'Right Center' },\n { value: 'left top', label: 'Left Top' },\n { value: 'right top', label: 'Right Top' },\n { value: 'left bottom', label: 'Left Bottom' },\n { value: 'right bottom', label: 'Right Bottom' },\n] as const;\n\nexport const BACKGROUND_POSITION_PRESET_VALUES = BACKGROUND_POSITION_PRESETS.map((p) => p.value);\n\n/**\n * Maps position keywords to Tailwind anchor positioning classes.\n * Used for positioning scaled/overflow images within their containers.\n *\n * The keys are normalized (lowercase, trimmed) position keywords.\n * The values are Tailwind classes for position + translation.\n */\nexport const POSITION_TO_ANCHOR_CLASSES: Record<string, string> = {\n 'center': 'left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2',\n 'top': 'left-1/2 top-0 -translate-x-1/2',\n 'top center': 'left-1/2 top-0 -translate-x-1/2',\n 'bottom': 'left-1/2 bottom-0 -translate-x-1/2',\n 'bottom center': 'left-1/2 bottom-0 -translate-x-1/2',\n 'left': 'left-0 top-1/2 -translate-y-1/2',\n 'left center': 'left-0 top-1/2 -translate-y-1/2',\n 'right': 'right-0 top-1/2 -translate-y-1/2',\n 'right center': 'right-0 top-1/2 -translate-y-1/2',\n 'top left': 'left-0 top-0',\n 'left top': 'left-0 top-0',\n 'top right': 'right-0 top-0',\n 'right top': 'right-0 top-0',\n 'bottom left': 'left-0 bottom-0',\n 'left bottom': 'left-0 bottom-0',\n 'bottom right': 'right-0 bottom-0',\n 'right bottom': 'right-0 bottom-0',\n};\n\n/** Default anchor classes when position is null or unrecognized */\nexport const DEFAULT_ANCHOR_CLASSES = 'left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2';\n\n/**\n * Gets Tailwind anchor positioning classes for a position keyword.\n * Used for positioning scaled/overflow background images.\n *\n * @param position - Position keyword (e.g., \"center\", \"top\", \"bottom left\") or null\n * @returns Tailwind classes for positioning and translation\n */\nexport function getAnchorClasses(position: string | null): string {\n if (!position) return DEFAULT_ANCHOR_CLASSES;\n const normalized = position.toLowerCase().trim();\n return POSITION_TO_ANCHOR_CLASSES[normalized] ?? DEFAULT_ANCHOR_CLASSES;\n}\n","import { BACKGROUND_POSITION_PRESETS } from '../constants/background';\nimport type { FieldDefinition, TabDefinition, TabGroupFieldDefinition } from '../manifest/schema'\n\ntype BackgroundFieldOptions = {\n id?: string\n label?: string\n allowColor?: boolean\n allowGradient?: boolean\n allowImage?: boolean\n includeAdvanced?: boolean\n}\n\n/**\n * Creates a TabGroupField for background configuration\n * with Color/Gradient/Image tabs and advanced image options\n */\nexport function createBackgroundField(options: BackgroundFieldOptions = {}): TabGroupFieldDefinition {\n const {\n id = 'background',\n label = 'Background',\n allowColor = true,\n allowGradient = true,\n allowImage = true,\n includeAdvanced = false,\n } = options\n\n const tabs: TabDefinition[] = []\n\n // Color tab\n if (allowColor) {\n tabs.push({\n id: 'color',\n label: 'Color',\n description: 'Solid color background using theme tokens or custom colors',\n sdkSectionOption: 'backgroundColor',\n fields: [\n {\n id: 'color',\n type: 'text' as const,\n label: 'Color',\n description: 'Select a background color from the available options.',\n required: false,\n multiline: false,\n ui: {\n // Use BackgroundColorWidget via widget override\n widget: 'backgroundColor',\n },\n },\n ],\n })\n }\n\n // Gradient tab\n if (allowGradient) {\n tabs.push({\n id: 'gradient',\n label: 'Gradient',\n description: 'CSS gradient background',\n sdkSectionOption: 'backgroundGradient',\n fields: [\n {\n id: 'gradient',\n type: 'text' as const,\n label: 'Gradient',\n description: 'CSS gradient value (e.g., linear-gradient(to right, #ff0000, #00ff00)).',\n required: false,\n multiline: true,\n ui: {\n placeholder: 'linear-gradient(to right, #ff0000, #00ff00)',\n },\n },\n ],\n })\n }\n\n // Image tab\n if (allowImage) {\n const imageFields: FieldDefinition[] = [\n {\n id: 'image',\n type: 'media' as const,\n label: 'Image',\n description: 'Background image file',\n mediaKinds: ['image'],\n required: false,\n },\n ]\n\n // Advanced image options\n if (includeAdvanced) {\n const objectFitField: FieldDefinition = {\n id: 'objectFit',\n type: 'select',\n label: 'Image Sizing',\n description: 'How the image should be sized and positioned.',\n required: false,\n multiple: false,\n options: [\n { value: 'fill', label: 'Fill (cover)' },\n { value: 'fit', label: 'Fit (contain)' },\n { value: 'original', label: 'Original size' },\n { value: 'custom', label: 'Scale up' },\n ],\n }\n\n const scaleField: FieldDefinition = {\n id: 'scale',\n type: 'presetOrCustom',\n label: 'Scale',\n description: 'Image scale amount.',\n required: false,\n ui: {\n visibleWhen: {\n field: 'objectFit',\n equals: 'custom',\n },\n },\n presets: [\n { value: '125', label: '125%' },\n { value: '150', label: '150%' },\n { value: '175', label: '175%' },\n { value: '200', label: '200%' },\n ],\n customInput: {\n placeholder: 'e.g., 800px, 50vw, 175%',\n helpText: 'Enter a custom size using %, px, vh, vw, rem, or em units',\n },\n }\n\n const positionField: FieldDefinition = {\n id: 'position',\n type: 'presetOrCustom',\n label: 'Position',\n description: 'Anchor point for the image. Relevant for \"Fill\" and \"Custom size\" options.',\n required: false,\n presets: [...BACKGROUND_POSITION_PRESETS],\n customInput: {\n placeholder: 'e.g., 25% 75%, top 20px left 50px',\n helpText: 'Enter a custom CSS background-position value',\n },\n }\n\n const opacityField: FieldDefinition = {\n id: 'opacity',\n type: 'number',\n label: 'Opacity',\n description: 'Image opacity (0-100).',\n required: false,\n ui: {\n min: 0,\n max: 100,\n step: 5,\n },\n }\n\n imageFields.push(\n objectFitField,\n scaleField,\n positionField,\n opacityField\n )\n }\n\n tabs.push({\n id: 'image',\n label: 'Image',\n description: includeAdvanced\n ? 'Background image with advanced controls'\n : 'Background image',\n sdkSectionOption: 'backgroundImage',\n fields: imageFields,\n })\n }\n\n return {\n id,\n type: 'tabGroup' as const,\n label,\n required: false,\n tabs,\n activeTabField: 'type',\n ui: {\n hideLabel: false,\n },\n } satisfies TabGroupFieldDefinition\n}\n","import type { FieldDefinition } from '../manifest/schema'\nimport { createBackgroundField } from './background'\n\n/**\n * Options for customizing a section styles field.\n */\ntype SectionStylesOptions = {\n /** Field ID (default: '_sectionStyles') */\n id?: string\n /** Field label (default: 'Section styles') */\n label?: string\n /** Whether to include background field (default: true) */\n includeBackground?: boolean\n}\n\n/**\n * Options for customizing a container styles field.\n */\ntype ContainerStylesOptions = {\n /** Field ID (default: '_containerStyles') */\n id?: string\n /** Field label (default: 'Container styles') */\n label?: string\n /** Whether to include background field (default: true) */\n includeBackground?: boolean\n}\n\n/**\n * Options for customizing a card styles field.\n */\ntype CardStylesOptions = {\n /** Field ID (default: '_cardStyles') */\n id?: string\n /** Field label (default: 'Card styles') */\n label?: string\n /** Whether to include background field (default: true) */\n includeBackground?: boolean\n}\n\n/**\n * Internal discriminator for box style types.\n * @internal\n */\ntype BoxStyleType = 'container' | 'card'\n\n/**\n * Internal helper to create box styles with depth (container or card).\n *\n * Both containers and cards support:\n * - Background (color/gradient/image with advanced options)\n * - Inner spacing (padding)\n * - Raised (elevation shadow)\n * - Rounded corners (border radius)\n *\n * This function is used internally by `containerStylesField()` and `cardStylesField()`\n * to avoid code duplication while maintaining separate public APIs.\n *\n * @internal\n * @param type - Box style type discriminator ('container' or 'card')\n * @param options - Customization options passed from public field helpers\n * @returns A modal FieldDefinition with depth-specific fields\n */\nfunction createBoxStylesFieldWithDepth(\n type: BoxStyleType,\n options: ContainerStylesOptions | CardStylesOptions = {}\n): FieldDefinition {\n const defaults = {\n container: {\n id: '_containerStyles',\n label: 'Container styles',\n contextName: 'container',\n },\n card: {\n id: '_cardStyles',\n label: 'Card styles',\n contextName: 'card',\n },\n }\n\n const {\n id = defaults[type].id,\n label = defaults[type].label,\n includeBackground = true,\n } = options\n\n const contextName = defaults[type].contextName\n const fields: FieldDefinition[] = []\n\n // Background (color/gradient/image with advanced options)\n if (includeBackground) {\n fields.push(\n createBackgroundField({\n id: 'background',\n label: 'Background',\n allowColor: true,\n allowGradient: true,\n allowImage: true,\n includeAdvanced: true,\n }),\n )\n }\n\n // Horizontal + vertical spacing\n fields.push({\n id: 'spacing',\n type: 'select',\n label: 'Inner spacing',\n description: `Padding for the ${contextName}.`,\n required: false,\n multiple: false,\n options: [\n { value: 'none', label: 'None' },\n { value: 'compact', label: 'Compact' },\n { value: 'cozy', label: 'Cozy' },\n { value: 'medium', label: 'Medium' },\n { value: 'comfortable', label: 'Comfortable' },\n { value: 'spacious', label: 'Spacious' },\n ],\n })\n\n // Raised toggle (applies theme shadow)\n fields.push({\n id: 'raised',\n type: 'boolean',\n label: 'Raised',\n description: `Add shadow depth to the ${contextName}.`,\n required: false,\n })\n\n // Rounded corners\n fields.push({\n id: 'rounded',\n type: 'select',\n label: 'Rounded corners',\n description: 'Border radius size.',\n required: false,\n multiple: false,\n options: [\n { value: 'none', label: 'None' },\n { value: 'sm', label: 'Small' },\n { value: 'md', label: 'Medium' },\n { value: 'lg', label: 'Large' },\n { value: 'xl', label: 'Extra Large' },\n { value: '2xl', label: 'Extra Extra Large' },\n { value: 'full', label: 'Fully Rounded' },\n ],\n })\n\n // Full-width toggle (only for containers, not cards)\n if (type === 'container') {\n fields.push({\n id: 'fullWidth',\n type: 'boolean',\n label: 'Full width',\n description: 'Extend content edge-to-edge (removes container max-width and all horizontal padding).',\n required: false,\n defaultValue: false,\n })\n }\n\n return {\n id,\n type: 'modal',\n label,\n required: false,\n schema: { fields },\n ui: {\n modalConfig: {\n buttonLabel: label,\n description: `Configure background, spacing, elevation, and rounded corners for the ${contextName}.`,\n buttonVariant: 'outline' as const,\n showCustomizedIndicator: true,\n },\n },\n } as FieldDefinition\n}\n\n/**\n * Creates a modal field group for styling full-width sections.\n *\n * Section styles include:\n * - Background (color/gradient/image with advanced options)\n * - Inner spacing (vertical padding)\n *\n * Sections are full-width wrappers that span the entire viewport, so they don't\n * support rounded corners or elevation shadows (unlike containers and cards).\n *\n * Use with the `backgroundLayer()` helper to render backgrounds in the block layout.\n *\n * @param options - Customization options for the field\n * @param options.id - Field ID (default: '_sectionStyles')\n * @param options.label - Field label (default: 'Section styles')\n * @param options.includeBackground - Whether to include background field (default: true)\n * @returns A modal FieldDefinition that can be added to a block's fields array\n *\n * @example\n * // Basic usage in a block\n * const fields = [\n * // ... other fields\n * sectionStylesField({\n * id: '_sectionStyles',\n * label: 'Section styles',\n * }),\n * ]\n *\n * @example\n * // In the layout, use backgroundLayer() to render\n * const layout = section(\n * { background: 'background/base' },\n * [\n * ...backgroundLayer('_sectionStyles.background'),\n * sectionContainer([])\n * ]\n * )\n *\n * @see {@link containerStylesField} for constrained-width containers with elevation\n * @see {@link cardStylesField} for repeater items with elevation\n * @see {@link backgroundLayer} for rendering backgrounds in layouts\n */\nexport function sectionStylesField(options: SectionStylesOptions = {}): FieldDefinition {\n const {\n id = '_sectionStyles',\n label = 'Section styles',\n includeBackground = true,\n } = options\n\n const fields: FieldDefinition[] = []\n\n // Background (color/gradient/image with advanced options)\n if (includeBackground) {\n fields.push(\n createBackgroundField({\n id: 'background',\n label: 'Background',\n allowColor: true,\n allowGradient: true,\n allowImage: true,\n includeAdvanced: true,\n }),\n )\n }\n\n // Vertical spacing (maps to theme spacing tokens)\n fields.push({\n id: 'spacing',\n type: 'select',\n label: 'Inner spacing',\n description: 'Vertical padding for the section.',\n required: false,\n multiple: false,\n options: [\n { value: 'none', label: 'None' },\n { value: 'compact', label: 'Compact' },\n { value: 'cozy', label: 'Cozy' },\n { value: 'medium', label: 'Medium' },\n { value: 'comfortable', label: 'Comfortable' },\n { value: 'spacious', label: 'Spacious' },\n ],\n })\n\n return {\n id,\n type: 'modal',\n label,\n required: false,\n schema: { fields },\n ui: {\n modalConfig: {\n buttonLabel: label,\n description: 'Configure background and spacing for this section.',\n buttonVariant: 'outline' as const,\n showCustomizedIndicator: true,\n },\n },\n } as FieldDefinition\n}\n\n/**\n * Creates a modal field group for styling constrained-width containers.\n *\n * Container styles include:\n * - Background (color/gradient/image with advanced options)\n * - Inner spacing (padding)\n * - Raised (elevation shadow for visual depth)\n * - Rounded corners (border radius)\n *\n * Containers have constrained width (max-w-*) and are centered within their parent.\n * Use for content areas that need visual separation or elevation from the page background.\n *\n * @param options - Customization options for the field\n * @param options.id - Field ID (default: '_containerStyles')\n * @param options.label - Field label (default: 'Container styles')\n * @param options.includeBackground - Whether to include background field (default: true)\n * @returns A modal FieldDefinition that can be added to a block's fields array\n *\n * @example\n * // Basic usage in a block\n * const fields = [\n * // ... other fields\n * containerStylesField({\n * id: '_containerStyles',\n * label: 'Container styles',\n * }),\n * ]\n *\n * @see {@link sectionStylesField} for full-width sections\n * @see {@link cardStylesField} for repeater items with the same styling options\n * @see {@link backgroundLayer} for rendering backgrounds in layouts\n */\nexport function containerStylesField(options: ContainerStylesOptions = {}): FieldDefinition {\n return createBoxStylesFieldWithDepth('container', options)\n}\n\n/**\n * Creates a modal field group for styling individual cards in repeaters.\n *\n * Card styles include:\n * - Background (color/gradient/image with advanced options)\n * - Inner spacing (padding)\n * - Raised (elevation shadow for visual depth)\n * - Rounded corners (border radius)\n *\n * Cards are used in repeaters (e.g., columns, grids, carousels) and have the same\n * styling options as containers. Each card instance can be styled independently.\n *\n * **Important:** When used in fragments (not blocks), the field ID must start with\n * a letter (e.g., 'styles', 'cardStyles') - do NOT use a leading underscore like '_cardStyles'.\n *\n * @param options - Customization options for the field\n * @param options.id - Field ID (default: '_cardStyles' for blocks, 'styles' recommended for fragments)\n * @param options.label - Field label (default: 'Card styles')\n * @param options.includeBackground - Whether to include background field (default: true)\n * @returns A modal FieldDefinition that can be added to a block or fragment's fields array\n *\n * @example\n * // In a fragment (e.g., card.ts)\n * const cardFragment = defineFragment({\n * id: 'card',\n * fields: [\n * { id: 'title', type: 'text', label: 'Title' },\n * { id: 'body', type: 'richText', label: 'Body' },\n * cardStylesField({\n * id: 'styles', // No leading underscore for fragments!\n * label: 'Card styles',\n * }),\n * ],\n * layout: stack({ gap: 'md' }, [\n * text({ as: 'h3' }, bind('title')),\n * richText({}, bind('body')),\n * ]),\n * })\n *\n * @example\n * // In a block\n * const fields = [\n * // ... other fields\n * cardStylesField({\n * id: '_cardStyles', // Can use underscore in blocks\n * label: 'Card styles',\n * }),\n * ]\n *\n * @see {@link sectionStylesField} for full-width sections\n * @see {@link containerStylesField} for constrained-width containers\n * @see {@link backgroundLayer} for rendering backgrounds in layouts\n */\nexport function cardStylesField(options: CardStylesOptions = {}): FieldDefinition {\n return createBoxStylesFieldWithDepth('card', options)\n}\n","import type { BlockManifest, BlockCategory, FieldDefinition, StyleTokenConfig, BehaviourConfig } from './manifest/schema';\nimport { fieldSchema } from './manifest/schema';\nimport type { NodeDefinition } from './node';\nimport { composeFragments, type FragmentDefinition } from './fragments';\nimport { sectionStylesField } from './fields/boxStyles';\nimport { augmentManifest } from './manifest/augmentManifest';\n\n/**\n * Configuration for defining a block using the defineBlock helper.\n * Provides smart defaults and handles fragment composition automatically.\n */\nexport type BlockConfig = {\n // Required fields\n /** Block identifier (e.g., 'block.hero') */\n id: string;\n /** Human-readable title (e.g., 'Hero') */\n title: string;\n /** Block category for organization */\n category: BlockCategory;\n\n // Fragment composition (auto-handles field assembly)\n /** Fragments to compose into this block */\n fragments?: Array<{\n fragment: FragmentDefinition;\n fieldPriority?: number;\n scope?: string;\n dataKey?: string;\n }>;\n\n // Layout definition\n /** Block layout (NodeDefinition or array) */\n layout: NodeDefinition | NodeDefinition[];\n\n // Optional: variants\n /** Layout variants (e.g., { classic: layout1, minimal: layout2 }) */\n variants?: Record<string, NodeDefinition>;\n /** Default variant key */\n defaultVariant?: string;\n\n // Optional: additional fields beyond fragments\n /** Additional fields to include (fragments are added automatically) */\n additionalFields?: FieldDefinition[];\n\n // Optional: skip section styles field\n /** If true, don't automatically add sectionStylesField */\n skipSectionStyles?: boolean;\n\n // Optional: overrides for defaults\n /** Block description */\n description?: string;\n /** Field ID to use as block title in lists (e.g., 'headline') */\n titleSource?: string;\n /** Component name (auto-derived from id if not provided) */\n component?: string;\n /** Search/filter tags */\n tags?: string[];\n /** Icon name (Lucide icon) */\n icon?: string;\n /** Style token mappings */\n styleTokens?: StyleTokenConfig;\n /** Behavior flags */\n behaviours?: BehaviourConfig;\n /** Hide from block picker palettes */\n paletteHidden?: boolean;\n /** Content types this block is compatible with */\n contentTypes?: string[];\n};\n\n/**\n * Create a block manifest with smart defaults and automatic fragment composition.\n *\n * This helper reduces block definition boilerplate by:\n * - Composing fragments and managing field priorities automatically\n * - Adding section styles field by default\n * - Providing sensible defaults for manifest properties\n * - Auto-deriving component names from block IDs\n * - Handling manifest augmentation (variant selector, etc.)\n *\n * @example\n * ```typescript\n * export const heroManifest = createBlockManifest({\n * id: 'block.hero',\n * title: 'Hero',\n * category: 'layout',\n * fragments: [\n * { fragment: heroCopyFragment, priority: 0 },\n * { fragment: ctaRowFragment, priority: 2 },\n * ],\n * layout: styledSection({\n * children: sectionContainer(nodes, { gap: 'md' }),\n * }),\n * tags: ['header', 'banner', 'landing'],\n * icon: 'Sparkles',\n * });\n * ```\n */\nexport function createBlockManifest(config: BlockConfig): BlockManifest {\n // 1. Compose fragments + section styles\n const composition = config.fragments ? composeFragments(config.fragments) : { fields: [], layout: [], data: [], scopes: [] };\n\n const allFields: FieldDefinition[] = [\n ...composition.fields,\n ...(config.additionalFields ?? []),\n ];\n\n // Add section styles field unless explicitly skipped\n // This allows users to customize section spacing and background via the editor.\n // Even when auto-added, blocks get sensible defaults via the transform's defaultSpacing option.\n // The pattern:\n // 1. Block defines layout with styledSection({ spacing: 'medium' })\n // 2. createBlockManifest auto-adds _sectionStyles field (unless skipSectionStyles: true)\n // 3. Transform uses defaultSpacing when _sectionStyles.spacing is undefined\n // 4. Users can override spacing via the editor if needed\n if (!config.skipSectionStyles) {\n allFields.push(\n sectionStylesField({\n id: '_sectionStyles',\n label: 'Section styles',\n }),\n );\n }\n\n const fields = fieldSchema.array().parse(allFields);\n\n // 2. Build layout (with variants if provided)\n const layout = config.layout;\n const variants = config.variants;\n\n // 3. Build behaviours object (from explicit config or paletteHidden flag)\n let behaviours: BehaviourConfig | undefined = config.behaviours;\n if (!behaviours && config.paletteHidden !== undefined) {\n behaviours = {\n supportsThemeSwitching: true,\n inlineEditing: true,\n animation: true,\n paletteHidden: config.paletteHidden,\n };\n }\n\n // 4. Apply defaults and create manifest\n const manifest: BlockManifest = {\n name: config.id,\n version: '0.1.0',\n title: config.title,\n titleSource: config.titleSource,\n description: config.description ?? '',\n component: config.component ?? deriveComponentName(config.id),\n fields,\n slots: [], // Always empty\n styleTokens: config.styleTokens,\n behaviours,\n category: config.category,\n contentTypes: config.contentTypes,\n tags: config.tags ?? [],\n icon: config.icon ?? 'Box',\n layout,\n variants,\n defaultVariant: config.defaultVariant,\n };\n\n // 5. Augment manifest (adds variant selector field, etc.)\n return augmentManifest(manifest);\n}\n\n/**\n * Derive component name from block ID.\n *\n * Converts block IDs to component names by:\n * 1. Removing the 'block.' prefix\n * 2. Converting camelCase to dot.notation\n * 3. Adding '.default' suffix\n *\n * Examples:\n * - 'block.hero' → 'hero.default'\n * - 'block.ctaFull' → 'cta.full.default'\n * - 'block.siteHeader' → 'site.header.default'\n */\nfunction deriveComponentName(id: string): string {\n // Remove 'block.' prefix\n const base = id.replace(/^block\\./, '');\n\n // Convert camelCase to dot.separated\n // ctaFull → cta.full\n // siteHeader → site.header\n const dotSeparated = base\n .replace(/([a-z])([A-Z])/g, '$1.$2')\n .toLowerCase();\n\n // Always add .default suffix for consistency\n return `${dotSeparated}.default`;\n}\n","import type { Media } from \"../../lib/media\";\nimport type { GradientConfig } from \"../../theme/gradients\";\nimport type { NodeDefinition } from \"../node\";\nimport type { SystemBlockDefinition } from \"../registry\";\nimport type { BlockManifest } from \"../manifest/schema\";\nimport { sectionContainer } from \"../node/fragments\";\nimport { styledSection } from \"../node/fragments/styledSection\";\nimport { createBlockManifest } from \"../defineBlock\";\nimport {\n composeFragments,\n heroCopyFragment,\n ctaRowFragment,\n} from \"../fragments\";\n\n// Compose fragments to get layout nodes\nconst heroCopyAndCta = composeFragments([\n { fragment: heroCopyFragment },\n { fragment: ctaRowFragment },\n]);\n\nconst heroContentNodes = heroCopyAndCta.layout;\n\n// Variant: Classic (centered, full padding - current default)\nconst classicLayout: NodeDefinition = styledSection({\n children: sectionContainer(heroContentNodes, {\n gap: \"md\",\n className: \"text-center\",\n }),\n});\n\n// Variant: Micro (compact with reduced padding)\nconst microLayout: NodeDefinition = styledSection({\n children: sectionContainer(heroContentNodes, {\n gap: \"sm\",\n className: \"text-center\",\n }),\n spacing: \"compact\",\n});\n\n/**\n * Shared split layout for both split and splitReverse variants.\n * Both variants use the same structure (two-column grid with text on left).\n * The background image is rendered as an absolute-positioned layer,\n * so there's no visual difference between split/splitReverse currently.\n */\nconst splitLayoutBase: NodeDefinition = styledSection({\n children: {\n type: \"grid\",\n cols: 1,\n colsSm: 2,\n gap: \"lg\",\n className: \"mx-auto max-w-7xl items-center\",\n children: [\n {\n type: \"stack\",\n gap: \"md\",\n className: \"text-left\",\n children: heroContentNodes,\n },\n ],\n },\n});\n\n// Variant: Split (two-column with text on left)\n// Note: Currently identical to splitReverse since media is absolute-positioned\nconst splitLayout: NodeDefinition = splitLayoutBase;\n\n// Variant: Split-reverse (two-column with text on left)\n// Note: Currently identical to split since media is absolute-positioned\nconst splitReverseLayout: NodeDefinition = splitLayoutBase;\n\nexport const heroManifest: BlockManifest = createBlockManifest({\n id: \"block.hero\",\n title: \"Hero\",\n titleSource: \"headline\",\n category: \"layout\",\n\n fragments: [\n { fragment: heroCopyFragment, fieldPriority: 0 },\n { fragment: ctaRowFragment, fieldPriority: 2 },\n ],\n\n layout: classicLayout,\n\n variants: {\n classic: classicLayout,\n micro: microLayout,\n split: splitLayout,\n splitReverse: splitReverseLayout,\n },\n defaultVariant: \"classic\",\n\n description: \"Hero section with headline, subtitle, and repeatable CTAs.\",\n tags: [\"header\", \"banner\", \"landing\", \"introduction\", \"welcome\", \"splash\", \"headline\"],\n icon: \"Sparkles\",\n styleTokens: {\n typography: \"display\",\n spacing: \"xl\",\n },\n});\n\nexport type HeroManifest = typeof heroManifest;\n\nexport type HeroCta = {\n label: string;\n href: string;\n variant?: 'primary' | 'secondary' | 'outline';\n iconLeft?: Media | null;\n iconRight?: Media | null;\n};\n\nexport type HeroCtaInput = Partial<HeroCta>;\n\nexport type HeroContent = {\n eyebrow?: string;\n headline: string;\n subheadline?: string;\n _sectionStyles?: {\n background?: {\n type: 'color' | 'gradient' | 'image';\n color?: string | null;\n gradient?: GradientConfig | null;\n image?: HeroMedia | null;\n textColor?: string | null;\n } | null;\n spacing?: string | null;\n } | null;\n ctas?: HeroCtaInput[];\n};\n\nexport type HeroMedia = Media;\n\nexport const heroBlockDefinition: SystemBlockDefinition<HeroContent> = {\n manifest: heroManifest,\n};\n","import type { BlockManifest } from \"../manifest\";\nimport type { TipTapNode } from \"../manifest/richTextSchema\";\nimport type { SystemBlockDefinition } from \"../registry\";\nimport { styledSection } from \"../node/fragments/styledSection\";\nimport { createBlockManifest } from \"../defineBlock\";\nimport { bodyCopyFragment, composeFragments } from \"../fragments\";\n\n// Compose fragments to get layout nodes\nconst bodyCopyComposition = composeFragments([{ fragment: bodyCopyFragment }]);\n\nexport const bodyTextManifest: BlockManifest = createBlockManifest({\n id: \"block.bodyText\",\n title: \"Body Text\",\n titleSource: \"heading\",\n category: \"content\",\n component: \"body.text.basic\",\n\n fragments: [\n { fragment: bodyCopyFragment, fieldPriority: 0 },\n ],\n\n layout: styledSection({\n children: bodyCopyComposition.layout,\n spacing: \"medium\",\n }),\n\n description: \"Simple text block with optional heading and alignment controls.\",\n tags: [\"text\", \"paragraph\", \"content\", \"copy\", \"article\", \"writing\", \"rich-text\"],\n icon: \"Type\",\n styleTokens: {\n spacing: \"md\",\n },\n});\n\nexport type BodyTextManifest = typeof bodyTextManifest;\n\nexport type BodyTextAlignment = \"left\" | \"center\";\n\nexport type BodyTextContent = {\n heading?: string | null;\n body: TipTapNode;\n alignment?: BodyTextAlignment | null;\n};\n\nexport const bodyTextBlockDefinition: SystemBlockDefinition<BodyTextContent> = {\n manifest: bodyTextManifest,\n};\n","import { z } from \"zod\";\n\nimport { fieldSchema } from \"../manifest/schema\";\nimport type { BlockManifest } from \"../manifest/schema\";\nimport type { NodeDefinition } from \"../node\";\nimport type { SystemBlockDefinition } from \"../registry\";\nimport { section } from \"../node/builder\";\nimport {\n composeFragments,\n buildFragmentDataLoaders,\n blogFeaturedPostFragment,\n} from \"../fragments\";\n\nconst composition = composeFragments([{ fragment: blogFeaturedPostFragment }]);\nconst fields = fieldSchema.array().parse(composition.fields);\n\nconst blogPostLayout: NodeDefinition = section(\n { background: \"background/base\", className: \"px-6 py-12\" },\n [...composition.layout],\n);\n\nexport const blogPostManifest: BlockManifest = {\n name: \"block.blogPost\",\n version: \"0.1.0\",\n title: \"Blog post\",\n description: \"Highlights a single blog post with title, image, and excerpt.\",\n component: \"blog.post.highlight\",\n fields,\n slots: [],\n styleTokens: {\n background: \"surface\",\n typography: \"body\",\n spacing: \"md\",\n },\n behaviours: {\n supportsThemeSwitching: true,\n inlineEditing: false,\n animation: false,\n paletteHidden: false,\n },\n category: \"blog\",\n contentTypes: [\"post\"],\n tags: [\"blog\", \"post\", \"featured\", \"highlight\", \"article\", \"single\"],\n icon: \"FileText\",\n layout: blogPostLayout,\n};\n\nexport type BlogPostContent = {\n title?: string | null;\n postSlug?: string | null;\n};\n\nexport const blogPostDataSchema = z.object({\n id: z.string(),\n title: z.string(),\n slug: z.string(),\n path: z.string(),\n excerpt: z.string().nullable().optional(),\n image: z\n .object({\n url: z.string().optional().nullable(),\n alt: z.string().optional().nullable(),\n })\n .nullable()\n .optional(),\n publishedAt: z.string().nullable().optional(),\n});\n\nexport type BlogPostData = z.infer<typeof blogPostDataSchema>;\n\n// Component is provided by the default factory; view model is purely content + loader data\n\nexport const blogPostBlockDefinition: SystemBlockDefinition<BlogPostContent> = {\n manifest: blogPostManifest,\n dataSchemas: { post: blogPostDataSchema.optional() },\n dataLoaders: buildFragmentDataLoaders(composition),\n};\n","import { fieldSchema } from '../manifest/schema'\nimport type { BlockManifest } from '../manifest'\nimport type { NodeDefinition } from '../node'\nimport { el, section, stack, text, bind, repeat, type NodeModifier } from '../node/builder'\nimport type { SystemBlockDefinition } from '../registry'\nimport { createBlockManifest } from '../defineBlock'\nimport { backgroundColorStyle, borderColorStyle, textColorStyle, mergeStyles } from '../../theme/utils/colorStyles'\n\ntype BlogPlaceholderCard = {\n title: string\n summary: string\n}\n\nexport type BlogPlaceholderContent = {\n eyebrow?: string | null\n heading?: string | null\n description?: string | null\n cards?: BlogPlaceholderCard[]\n note?: string | null\n}\n\nconst grid = (\n props?: Record<string, unknown> | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n) => el('grid', props ?? undefined, children ?? undefined, ...mods)\n\nconst blogPlaceholderLayout: NodeDefinition = section(\n { background: 'surface', className: 'px-6 py-16 sm:py-20 md:py-24' }, // Semantic: comfortable + extra md padding\n [\n stack(\n { gap: 'sm', align: 'center', className: 'mx-auto max-w-3xl text-center' },\n [\n text(\n { as: 'p', className: 'text-sm font-semibold uppercase tracking-wide', style: textColorStyle('mutedText') },\n bind('content.eyebrow'),\n ),\n text(\n { as: 'h2', className: 'text-3xl font-semibold tracking-tight sm:text-4xl', style: textColorStyle('text') },\n bind('content.heading'),\n ),\n text(\n { className: 'text-base leading-relaxed', style: textColorStyle('mutedText') },\n bind('content.description'),\n ),\n ],\n ),\n grid(\n { className: 'mt-10 gap-6 sm:grid-cols-2 lg:grid-cols-3' },\n [\n stack(\n {\n gap: 'sm',\n className: 'rounded-xl border p-6 text-left shadow-sm',\n style: mergeStyles(borderColorStyle('border/60'), backgroundColorStyle('background')),\n },\n [\n text(\n { as: 'h3', className: 'text-lg font-semibold', style: textColorStyle('text') },\n bind('item.title'),\n ),\n text(\n { className: 'text-sm leading-relaxed', style: textColorStyle('mutedText') },\n bind('item.summary'),\n ),\n ],\n repeat('content.cards', 'item', { limit: 6 }),\n ),\n ],\n ),\n stack(\n { gap: 'xs', align: 'center', className: 'mt-10 text-center' },\n [\n text({ className: 'text-sm', style: textColorStyle('mutedText') }, bind('content.note')),\n ],\n ),\n ],\n)\n\nexport const blogPlaceholderManifest: BlockManifest = createBlockManifest({\n id: 'block.blogPlaceholder',\n title: 'Blog placeholder',\n category: 'blog',\n component: 'blog.placeholder',\n\n // Skip section styles - this block has custom layout with fixed styling\n skipSectionStyles: true,\n\n // Custom fields for blog placeholder content\n additionalFields: [\n fieldSchema.parse({\n id: 'eyebrow',\n type: 'text',\n label: 'Eyebrow',\n description: 'Short label displayed above the heading.',\n }),\n fieldSchema.parse({\n id: 'heading',\n type: 'text',\n label: 'Heading',\n required: true,\n }),\n fieldSchema.parse({\n id: 'description',\n type: 'text',\n label: 'Description',\n multiline: true,\n }),\n fieldSchema.parse({\n id: 'cards',\n type: 'repeater',\n label: 'Placeholder cards',\n itemLabel: 'Placeholder',\n schema: {\n fields: [\n { id: 'title', type: 'text', label: 'Title', required: true },\n { id: 'summary', type: 'text', label: 'Summary', multiline: true, required: true },\n ],\n },\n }),\n fieldSchema.parse({\n id: 'note',\n type: 'text',\n label: 'Footer note',\n description: 'Optional helper text displayed below the cards.',\n }),\n ],\n\n layout: blogPlaceholderLayout,\n\n description: 'Starter layout shown until real blog content replaces it.',\n styleTokens: {\n background: 'surface',\n spacing: 'lg',\n },\n paletteHidden: true,\n})\n\nexport const blogPlaceholderBlockDefinition: SystemBlockDefinition<BlogPlaceholderContent> = {\n manifest: blogPlaceholderManifest,\n}\n","import { z } from \"zod\";\nimport { fieldSchema } from \"../manifest/schema\";\nimport type { BlockManifest } from \"../manifest/schema\";\nimport type { NodeDefinition } from \"../node\";\nimport type { SystemBlockDefinition } from \"../registry\";\nimport { section, stack, text, bind, when } from \"../node/builder\";\nimport { backgroundColorStyle, borderColorStyle, textColorStyle, mergeStyles } from \"../../theme/utils/colorStyles\";\nimport {\n composeFragments,\n buildFragmentDataLoaders,\n blogListGridFragment,\n blogListStackFragment,\n} from \"../fragments\";\nimport { createBlockManifest } from \"../defineBlock\";\n\n// Compose both layout fragments WITHOUT scopes\nconst gridComposition = composeFragments([{ fragment: blogListGridFragment }]);\nconst stackComposition = composeFragments([{ fragment: blogListStackFragment }]);\n\n// Build unified field list\n// Combine fields from both fragments, removing duplicates\nconst fragmentFields = [...gridComposition.fields, ...stackComposition.fields];\nconst uniqueFields = fragmentFields.filter((field, index, self) =>\n index === self.findIndex((f) => f.id === field.id)\n);\n\n// Build layout with conditional rendering\nconst blogListingLayout: NodeDefinition = section(\n { background: \"background/base\", className: \"px-6 py-12 sm:py-16 md:py-20\" }, // Semantic: medium + extra md padding\n [\n // Grid layout (conditionally shown)\n ...gridComposition.layout.map((node) => ({\n ...node,\n $when: {\n when: { from: \"content.layout\" },\n equals: \"grid\",\n },\n })),\n\n // Stack layout (conditionally shown)\n ...stackComposition.layout.map((node) => ({\n ...node,\n $when: {\n when: { from: \"content.layout\" },\n equals: \"stack\",\n },\n })),\n\n // Empty state (shown when no posts)\n stack(\n {\n gap: \"sm\",\n className: \"mx-auto max-w-3xl rounded-xl border border-dashed p-12 text-center\",\n style: mergeStyles(\n borderColorStyle(\"neutral-300\"),\n backgroundColorStyle(\"neutral-50\"),\n ),\n },\n [\n text(\n { as: \"p\", className: \"text-base\", style: textColorStyle(\"neutral-500\") },\n bind(\"content.emptyMessage\", { fallback: \"No posts published yet.\" }),\n ),\n ],\n when(\"data.posts\", { not: true }),\n ),\n ],\n);\n\nexport const blogListingManifest: BlockManifest = createBlockManifest({\n id: \"block.blogListing\",\n title: \"Blog listing\",\n category: \"blog\",\n component: \"blog.listing\",\n\n // Skip section styles - this block has layout-specific fields instead\n skipSectionStyles: true,\n\n // Custom fields for blog listing configuration\n additionalFields: [\n fieldSchema.parse({\n id: \"layout\",\n type: \"select\",\n label: \"Layout\",\n description: \"Choose how blog posts are displayed.\",\n defaultValue: \"grid\",\n options: [\n { value: \"grid\", label: \"Grid (cards)\" },\n { value: \"stack\", label: \"Stack (vertical list)\" },\n ],\n }),\n // Grid-specific column field (only visible when layout is grid)\n ...gridComposition.fields\n .filter((f) => f.id === \"columns\")\n .map((f) => ({\n ...f,\n ui: {\n ...f.ui,\n visibleWhen: { field: \"layout\", equals: \"grid\" },\n },\n })),\n fieldSchema.parse({\n id: \"postsPerPage\",\n type: \"select\",\n label: \"Posts to display\",\n description: \"Number of posts to show on this page.\",\n defaultValue: \"12\",\n options: [\n { value: \"6\", label: \"6 posts\" },\n { value: \"12\", label: \"12 posts\" },\n { value: \"24\", label: \"24 posts\" },\n { value: \"48\", label: \"48 posts\" },\n ],\n }),\n // Shared toggle fields from fragments (now unscoped)\n ...uniqueFields.filter((f) => ['showImages', 'showExcerpts', 'showDates'].includes(f.id)),\n fieldSchema.parse({\n id: \"readMoreText\",\n type: \"text\",\n label: \"Read more text\",\n description: \"Text for the read more button/link.\",\n defaultValue: \"Read more →\",\n maxLength: 40,\n }),\n fieldSchema.parse({\n id: \"readMoreVariant\",\n type: \"select\",\n label: \"Read more style\",\n description: \"Visual style for the read more button.\",\n defaultValue: \"link\",\n options: [\n { value: \"link\", label: \"Link (minimal)\" },\n { value: \"primary\", label: \"Primary button\" },\n { value: \"secondary\", label: \"Secondary button\" },\n { value: \"outline\", label: \"Outline button\" },\n ],\n }),\n fieldSchema.parse({\n id: \"emptyMessage\",\n type: \"text\",\n label: \"Empty state message\",\n description: \"Message shown when no posts are available.\",\n defaultValue: \"No posts published yet.\",\n maxLength: 200,\n }),\n ],\n\n layout: blogListingLayout,\n\n description: \"Display a collection of blog posts in grid or stack layout.\",\n contentTypes: [\"post\"],\n tags: [\"blog\", \"posts\", \"articles\", \"news\", \"archive\", \"listing\", \"feed\", \"index\"],\n icon: \"Newspaper\",\n styleTokens: {\n background: \"surface\",\n spacing: \"lg\",\n },\n});\n\nexport type BlogListingContent = {\n layout?: \"grid\" | \"stack\" | null;\n columns?: \"2\" | \"3\" | \"4\" | null;\n postsPerPage?: \"6\" | \"12\" | \"24\" | \"48\" | null;\n showImages?: boolean | null;\n showExcerpts?: boolean | null;\n showDates?: boolean | null;\n readMoreText?: string | null;\n readMoreVariant?: \"link\" | \"primary\" | \"secondary\" | \"outline\" | null;\n emptyMessage?: string | null;\n};\n\nexport type BlogPostListEntry = {\n id: string;\n slug: string;\n path: string;\n title: string;\n excerpt: string | null;\n publishedAt: string | null;\n updatedAt: string;\n status: string;\n image?: {\n url: string;\n alt?: string;\n } | null;\n};\n\nconst blogPostListEntrySchema = z.object({\n id: z.string(),\n slug: z.string(),\n path: z.string(),\n title: z.string(),\n excerpt: z.string().nullable().optional(),\n publishedAt: z.string().nullable().optional(),\n updatedAt: z.string(),\n status: z.string(),\n image: z\n .object({\n url: z.string(),\n alt: z.string().optional(),\n })\n .nullable()\n .optional(),\n});\n\nexport const blogListingBlockDefinition: SystemBlockDefinition<BlogListingContent> = {\n manifest: blogListingManifest,\n dataSchemas: {\n posts: z.array(blogPostListEntrySchema).optional(),\n },\n dataLoaders: buildFragmentDataLoaders(gridComposition), // Use grid composition for loader config (same for both)\n};\n","import type { SystemBlockDefinition } from \"../registry\";\nimport type { Media } from \"../../lib/media\";\nimport type { GradientConfig } from \"../../theme/gradients\";\nimport type { BlockManifest } from \"../manifest/schema\";\nimport { sectionContainer } from \"../node/fragments\";\nimport { styledSection } from \"../node/fragments/styledSection\";\nimport { createBlockManifest } from \"../defineBlock\";\nimport {\n composeFragments,\n ctaCopyFragment,\n ctaRowFragment,\n} from \"../fragments\";\n\n// Compose fragments to get layout nodes\nconst ctaComposition = composeFragments([\n { fragment: ctaCopyFragment },\n { fragment: ctaRowFragment },\n]);\n\nexport const ctaFullManifest: BlockManifest = createBlockManifest({\n id: \"block.ctaFull\",\n title: \"Full-width CTA\",\n category: \"marketing\",\n\n fragments: [\n { fragment: ctaCopyFragment, fieldPriority: 0 },\n { fragment: ctaRowFragment, fieldPriority: 2 },\n ],\n\n layout: styledSection({\n children: sectionContainer(ctaComposition.layout, {\n gap: \"md\",\n className: \"relative text-center\",\n }),\n }),\n\n description: \"Centered call to action with optional background image.\",\n tags: [\"cta\", \"call-to-action\", \"button\", \"conversion\", \"action\", \"sign-up\", \"get-started\"],\n icon: \"Target\",\n});\n\nexport type CtaFullContent = {\n eyebrow?: string | null;\n title: string;\n content?: unknown;\n _sectionStyles?: {\n background?: {\n type: 'color' | 'gradient' | 'image';\n color?: string | null;\n gradient?: GradientConfig | null;\n image?: Media | null;\n textColor?: string | null;\n } | null;\n spacing?: string | null;\n } | null;\n ctas?: Array<{ label?: string | null; href?: string | null }>;\n};\n\nexport const ctaFullBlockDefinition: SystemBlockDefinition<CtaFullContent> = {\n manifest: ctaFullManifest,\n};\n","import { z } from \"zod\";\n\nimport { fieldSchema } from \"../manifest/schema\";\nimport type { BlockManifest } from \"../manifest/schema\";\nimport type { NodeDefinition } from \"../node\";\nimport type { SystemBlockDefinition } from \"../registry\";\nimport { section } from \"../node/builder\";\nimport { sectionContainer } from \"../node/fragments\";\nimport {\n composeFragments,\n buildFragmentDataLoaders,\n formCopyFragment,\n formEmbedFragment,\n} from \"../fragments\";\n\nconst formComposition = composeFragments([\n { fragment: formCopyFragment },\n { fragment: formEmbedFragment },\n]);\n\nconst formLayout: NodeDefinition = section(\n { background: \"surface\", className: \"px-6 py-12\" },\n [sectionContainer(formComposition.layout, { gap: \"lg\" })],\n);\n\nconst fields = fieldSchema.array().parse(formComposition.fields);\nconst dataLoaders = buildFragmentDataLoaders(formComposition);\n\nexport const formManifest: BlockManifest = {\n name: \"block.form\",\n version: \"0.1.0\",\n title: \"Form\",\n titleSource: \"title\",\n description: \"Renders a saved form definition with server-side submit.\",\n component: \"form.block\",\n fields,\n slots: [],\n styleTokens: { background: \"surface\", typography: \"body\", spacing: \"md\" },\n behaviours: { supportsThemeSwitching: true, inlineEditing: false, animation: false, paletteHidden: false },\n category: \"interactive\",\n tags: [\"form\", \"contact\", \"input\", \"submit\", \"fields\", \"signup\", \"lead-capture\"],\n icon: \"FormInput\",\n layout: formLayout,\n};\n\n/**\n * Rich text document structure (ProseMirror format)\n */\nexport type RichTextDoc = {\n type: 'doc';\n content?: Array<{\n type: string;\n content?: Array<{\n type: string;\n text?: string;\n [key: string]: unknown;\n }>;\n [key: string]: unknown;\n }>;\n};\n\nexport type FormBlockContent = {\n title?: string | null;\n intro?: RichTextDoc | null;\n formId: string;\n submitLabel?: string | null;\n successMessage?: string | null;\n};\n\nexport const formDataSchema = z.object({\n id: z.string(),\n siteId: z.string(),\n userId: z.string(),\n name: z.string(),\n slug: z.string(),\n schemaJson: z.any(),\n settingsJson: z.any().optional(),\n createdAt: z.string(),\n updatedAt: z.string(),\n});\n\nexport type FormData = z.infer<typeof formDataSchema>;\n\nexport const formBlockDefinition: SystemBlockDefinition<FormBlockContent> = {\n manifest: formManifest,\n dataSchemas: { form: formDataSchema.optional() },\n dataLoaders,\n};\n","import type { SystemBlockDefinition } from \"../registry\";\nimport type { BlockManifest } from \"../manifest/schema\";\nimport { sectionContainer } from \"../node/fragments\";\nimport { styledSection } from \"../node/fragments/styledSection\";\nimport { createBlockManifest } from \"../defineBlock\";\nimport { composeFragments, faqHeadingFragment, faqAccordionFragment } from \"../fragments\";\n\n// Compose fragments to get layout nodes\nconst faqComposition = composeFragments([\n { fragment: faqHeadingFragment, fieldPriority: 0 },\n { fragment: faqAccordionFragment, fieldPriority: 1 },\n]);\n\nexport const faqManifest: BlockManifest = createBlockManifest({\n id: \"block.faq\",\n title: \"FAQ\",\n titleSource: \"title\",\n category: \"content\",\n\n fragments: [\n { fragment: faqHeadingFragment, fieldPriority: 0 },\n { fragment: faqAccordionFragment, fieldPriority: 1 },\n ],\n\n layout: styledSection({\n children: sectionContainer(faqComposition.layout, {\n gap: \"xl\",\n className: \"w-full\",\n }),\n }),\n\n description: \"Accordion of frequently asked questions and answers.\",\n tags: [\"faq\", \"questions\", \"answers\", \"help\", \"support\", \"accordion\", \"q&a\"],\n icon: \"HelpCircle\",\n});\n\nexport type FaqItem = {\n question: string;\n answer: unknown;\n};\n\nexport type FaqContent = {\n eyebrow?: string | null;\n title?: string | null;\n description?: unknown;\n items?: FaqItem[] | null;\n};\n\nexport const faqBlockDefinition: SystemBlockDefinition<FaqContent> = {\n manifest: faqManifest,\n};\n","import { z } from \"zod\";\nimport type { TransformDefinition } from \"./core\";\n\nexport const uppercaseTransform: TransformDefinition = {\n id: \"string.uppercase\",\n kind: \"string\",\n summary: \"Uppercase text\",\n run: (value) => (typeof value === \"string\" ? value.toUpperCase() : value),\n};\n\nexport const fallbackTransform: TransformDefinition<{ fallback: unknown }> = {\n id: \"value.fallback\",\n kind: \"formatter\",\n summary: \"Provide fallback when value is null or undefined\",\n schema: z.object({ fallback: z.unknown() }),\n run: (value, options) => (value === null || value === undefined || value === \"\" ? options.fallback : value),\n};\n\nexport const dateFormatShort: TransformDefinition = {\n id: \"date.formatShort\",\n kind: \"formatter\",\n summary: \"Format ISO date string into short human-readable label\",\n run: (value) => {\n if (typeof value !== \"string\" || !value) return null;\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return null;\n try {\n return new Intl.DateTimeFormat(undefined, { month: \"short\", day: \"numeric\", year: \"numeric\" }).format(date);\n } catch {\n return null;\n }\n },\n};\n\nexport const arrayLengthTransform: TransformDefinition = {\n id: \"array.length\",\n kind: \"formatter\",\n summary: \"Get the length of an array\",\n run: (value) => (Array.isArray(value) ? value.length : 0),\n};\n\nexport const formattingTransforms = [\n uppercaseTransform,\n fallbackTransform,\n dateFormatShort,\n arrayLengthTransform,\n] satisfies ReadonlyArray<TransformDefinition<any>>;\n","import { z } from \"zod\";\nimport type { TransformDefinition } from \"./core\";\nimport type {\n HeaderNavStyle,\n ThemeHeader,\n} from \"../../../theme/schema\";\n\nconst joinClasses = (parts: Array<string | null | undefined>) =>\n parts\n .filter((part): part is string => typeof part === \"string\" && part.trim().length > 0)\n .join(\" \")\n .replace(/\\s+/g, \" \")\n .trim();\n\n/**\n * Get nav link classes based on nav style\n * Simplified version that reads navStyle enum from theme\n */\nfunction getNavStyleClasses(navStyle: HeaderNavStyle): string {\n const baseClasses = 'inline-flex items-center gap-2 px-3 py-2 transition-colors'\n\n switch (navStyle) {\n case 'minimal':\n return baseClasses\n\n case 'underline':\n return `${baseClasses} hover:underline underline-offset-4 data-[active=true]:underline data-[active=true]:underline-offset-4`\n\n case 'underline-grow':\n return `${baseClasses} nav-underline-grow nav-underline-active`\n\n case 'capsule':\n return `inline-flex items-center gap-2 transition-colors rounded-full px-3 py-1.5`\n\n case 'scale':\n return `${baseClasses} transform-gpu will-change-transform motion-safe:hover:scale-105`\n\n case 'frosted':\n return `inline-flex items-center gap-2 transition-colors rounded-lg px-3 py-1.5`\n\n case 'solid':\n return `${baseClasses} rounded-none`\n\n default:\n return baseClasses\n }\n}\n\nconst headerNavClassOptionsSchema = z.object({\n base: z.string().optional(),\n});\n\nexport const headerNavLinkClassTransform: TransformDefinition<z.infer<typeof headerNavClassOptionsSchema>> = {\n id: \"ui.headerNavLinkClass\",\n kind: \"string\",\n summary: \"Compose header navigation link classes from theme navStyle\",\n schema: headerNavClassOptionsSchema,\n run: (value, options) => {\n // Extract header from value if it's an object with header property\n const header = value && typeof value === 'object' && 'navStyle' in (value as Record<string, unknown>)\n ? (value as Partial<ThemeHeader>)\n : undefined\n\n // Get nav style from header or default to 'minimal'\n const navStyle = header?.navStyle ?? 'minimal'\n\n // Get base classes from nav style\n const styleClasses = getNavStyleClasses(navStyle)\n\n return joinClasses([styleClasses, options?.base])\n },\n};\n\nexport const headingClassFromAlignment: TransformDefinition<{ base: string }> = {\n id: \"ui.headingClassFromAlignment\",\n kind: \"string\",\n summary: \"Append text alignment class to a base heading class\",\n run: (value, options) => {\n const align = typeof value === \"string\" && value === \"center\" ? \"center\" : \"left\";\n const alignClass = align === \"center\" ? \"text-center\" : \"text-left\";\n return `${options.base} ${alignClass}`.trim();\n },\n};\n\nexport const bodyClassFromAlignment: TransformDefinition<{ base: string }> = {\n id: \"ui.bodyClassFromAlignment\",\n kind: \"string\",\n summary: \"Append body alignment helper classes to a base class\",\n run: (value, options) => {\n const align = typeof value === \"string\" && value === \"center\" ? \"center\" : \"left\";\n const extra = align === \"center\" ? \"mx-auto text-center\" : \"\";\n return `${options.base} ${extra}`.trim();\n },\n};\n\nexport const stackAlignFromAlignment: TransformDefinition = {\n id: \"ui.stackAlignFromAlignment\",\n kind: \"string\",\n summary: \"Map text alignment to stack alignment value\",\n run: (value) => (value === \"center\" ? \"center\" : \"start\"),\n};\n\nconst conditionalClassOptionsSchema = z.object({\n whenTrue: z.string(),\n whenFalse: z.string(),\n});\n\nexport const conditionalClassTransform: TransformDefinition<z.infer<typeof conditionalClassOptionsSchema>> = {\n id: \"ui.conditionalClass\",\n kind: \"string\",\n summary: \"Return different classes based on boolean value\",\n schema: conditionalClassOptionsSchema,\n run: (value, options) => {\n const isTrue = typeof value === 'boolean' ? value : Boolean(value);\n return isTrue ? options.whenTrue : options.whenFalse;\n },\n};\n\nexport const uiTransforms = [\n headerNavLinkClassTransform,\n headingClassFromAlignment,\n bodyClassFromAlignment,\n stackAlignFromAlignment,\n conditionalClassTransform,\n] satisfies ReadonlyArray<TransformDefinition<any>>;\n","import { z } from \"zod\";\nimport { featuresFromHex } from \"../../../theme/palette/utils/colorConversion\";\nimport type { ThemeFooter, ThemeHeader } from \"../../../theme/schema\";\nimport type { ThemeTokens } from \"../../theme\";\nimport type { TransformDefinition } from \"./core\";\nimport {\n backgroundColorStyle,\n borderColorStyle,\n mergeStyles,\n textColorStyle,\n} from \"../../../theme/utils/colorStyles\";\n\nconst joinClasses = (parts: Array<string | null | undefined>) =>\n parts\n .filter((part): part is string => typeof part === \"string\" && part.trim().length > 0)\n .join(\" \")\n .replace(/\\s+/g, \" \")\n .trim();\n\nconst maxWidthClassSchema = z.object({\n base: z.string().optional(),\n container: z.string().optional(),\n full: z.string().optional(),\n});\n\nexport const maxWidthClassTransform: TransformDefinition<z.infer<typeof maxWidthClassSchema>> = {\n id: \"layout.maxWidthClass\",\n kind: \"string\",\n summary: \"Resolve layout container width classes for site chrome blocks\",\n schema: maxWidthClassSchema,\n run: (value, options) => {\n const base = options.base ?? \"\";\n const variant = typeof value === \"string\" && value === \"full\" ? \"full\" : \"container\";\n const container = options.container ?? \"container mx-auto px-6\";\n const full = options.full ?? \"w-full px-6\";\n const chosen = variant === \"full\" ? full : container;\n return joinClasses([base, chosen]);\n },\n};\n\nconst headerRootClassSchema = z.object({\n base: z.string().optional(),\n sticky: z.string().optional(),\n stickyTransparent: z.string().optional(),\n invert: z.string().optional(),\n});\n\ntype HeaderRootOptions = z.infer<typeof headerRootClassSchema>;\n\nexport type HeaderVisualStyles = ReturnType<typeof resolveHeaderVisualStyles>;\n\nexport function resolveBackgroundVisualStyles(\n backgroundColor: string | undefined,\n tokens: ThemeTokens,\n defaultToken = \"surface\"\n) {\n const backgroundToken =\n typeof backgroundColor === \"string\" && backgroundColor.trim().length > 0\n ? backgroundColor\n : defaultToken;\n\n if (backgroundToken === \"transparent\") {\n return {\n backgroundToken,\n paletteHex: null as string | null,\n backgroundHex: null as string | null,\n isBackgroundDark: false,\n textColorToken: \"text\" as const,\n textColorOverride: null as string | null,\n isTransparent: true,\n };\n }\n\n const paletteHex = tokens.palette[backgroundToken];\n const fallbackHex =\n paletteHex ??\n tokens.palette.surface ??\n tokens.color[\"surface/base\"] ??\n tokens.color[\"background/base\"] ??\n \"#ffffff\";\n\n const baseBackgroundHex =\n tokens.color[\"background/base\"] ??\n tokens.palette.surface ??\n tokens.color[\"surface/base\"] ??\n \"#ffffff\";\n\n const backgroundTone = detectTone(fallbackHex);\n const baseTone = detectTone(baseBackgroundHex);\n\n const needsContrast = Boolean(backgroundTone && baseTone && backgroundTone !== baseTone);\n const textColorOverride = needsContrast\n ? backgroundTone === \"dark\"\n ? \"#ffffff\"\n : \"#000000\"\n : null;\n\n return {\n backgroundToken,\n paletteHex,\n backgroundHex: fallbackHex,\n isBackgroundDark: backgroundTone === \"dark\",\n textColorToken: needsContrast ? undefined : (\"text\" as const),\n textColorOverride,\n isTransparent: false,\n };\n}\n\nexport function resolveHeaderVisualStyles(\n header: Partial<ThemeHeader> | undefined,\n tokens: ThemeTokens\n) {\n const navContainerType = header?.navContainer?.type ?? 'none';\n const hasContainedNav = navContainerType === 'glass' || navContainerType === 'pill';\n\n if (hasContainedNav) {\n return {\n backgroundToken: 'transparent',\n paletteHex: null,\n backgroundHex: null,\n isBackgroundDark: false,\n textColorToken: 'text' as const,\n textColorOverride: null,\n isTransparent: true,\n } as const;\n }\n\n const background = header?.background;\n\n // Extract color token from background object\n let colorToken: string | undefined;\n if (!background || background.type === 'color') {\n colorToken = background?.color ?? 'surface';\n } else if (background.type === 'gradient' && background.gradient) {\n // For gradients, use first stop color for contrast calculation\n colorToken = background.gradient.stops[0]?.color ?? 'surface';\n } else if (background.type === 'image') {\n // For images, use a neutral default for contrast calculation\n colorToken = 'neutral-900'; // Assume dark background for images\n }\n\n const visuals = resolveBackgroundVisualStyles(colorToken, tokens);\n\n return visuals;\n}\n\nfunction detectTone(hex: string | null): \"light\" | \"dark\" | null {\n if (!hex) return null;\n try {\n return featuresFromHex(hex).Y < 0.5 ? \"dark\" : \"light\";\n } catch {\n return null;\n }\n}\n\nexport const headerRootClassTransform: TransformDefinition<HeaderRootOptions> = {\n id: \"layout.headerRootClass\",\n kind: \"string\",\n summary: \"Compose header root classes from positioning and shrink options\",\n schema: headerRootClassSchema,\n run: (value, options, context) => {\n const config = {\n base: \"z-40 w-full transition-theme\",\n baseWithBorder: \"z-40 w-full border-b transition-theme\",\n sticky: \"sticky top-0 shadow-sm\",\n stickyTransparent: \"sticky top-0\",\n fixed: \"fixed top-0 left-0 right-0\",\n shrink: \"transition-all duration-300 h-24 py-6 [&.header-scrolled]:h-16 [&.header-scrolled]:py-3\",\n blur: \"backdrop-blur\",\n blurSupport: \"supports-[backdrop-filter]:backdrop-blur\",\n ...options,\n };\n\n const content = value && typeof value === \"object\" ? (value as Record<string, unknown>) : {};\n const positioning = typeof content.positioning === \"string\" ? content.positioning : \"static\";\n const shrinkOnScroll = Boolean((content as any).shrinkOnScroll);\n const header = value && typeof value === \"object\" ? (value as Partial<ThemeHeader>) : undefined;\n const visuals = resolveHeaderVisualStyles(header, context.theme);\n const navContainerType = header?.navContainer?.type ?? 'none';\n const hasContainedNav = navContainerType === 'glass' || navContainerType === 'pill';\n const backgroundClass = visuals.isTransparent || hasContainedNav ? 'bg-transparent' : null;\n\n const classes = [\n // Use base without border for transparent shells or when nav container handles visuals\n visuals.isTransparent || hasContainedNav ? config.base : config.baseWithBorder,\n backgroundClass,\n ];\n\n if (!hasContainedNav) {\n classes.push(config.blur);\n classes.push(config.blurSupport);\n }\n\n // Add positioning classes\n if (positioning === \"sticky\") {\n classes.push(visuals.isTransparent ? config.stickyTransparent : config.sticky);\n } else if (positioning === \"fixed\") {\n classes.push(config.fixed);\n }\n\n // Add shrink classes if enabled and positioning is sticky or fixed\n if (shrinkOnScroll && (positioning === \"sticky\" || positioning === \"fixed\")) {\n classes.push(config.shrink);\n }\n\n return joinClasses(classes);\n },\n};\n\nconst footerRootClassSchema = z.object({\n base: z.string().optional(),\n surface: z.string().optional(),\n tokenPrefix: z.string().optional(),\n transparent: z.string().optional(),\n});\n\nexport const footerRootClassTransform: TransformDefinition<z.infer<typeof footerRootClassSchema>> = {\n id: \"layout.footerRootClass\",\n kind: \"string\",\n summary: \"Compose footer root classes with optional inversion\",\n schema: footerRootClassSchema,\n run: (value, options, context) => {\n const config = {\n base: \"w-full border-t transition-theme\",\n transparent: \"bg-transparent\",\n ...options,\n };\n const footer = value && typeof value === \"object\" ? (value as Partial<ThemeFooter>) : undefined;\n const background = footer?.background;\n const colorToken = extractBackgroundColorToken(background, 'surface');\n\n const visuals = resolveBackgroundVisualStyles(colorToken, context.theme);\n const backgroundClass = visuals.isTransparent ? config.transparent : null;\n\n return joinClasses([config.base, backgroundClass]);\n },\n};\n\nexport const headerRootStyleTransform: TransformDefinition = {\n id: \"layout.headerRootStyle\",\n kind: \"formatter\",\n summary: \"Compose header root inline styles for dynamic colors\",\n run: (value, _options, context) => {\n const header = value && typeof value === \"object\" ? (value as Partial<ThemeHeader>) : undefined;\n const navContainerType = header?.navContainer?.type ?? 'none';\n const hasContainedNav = navContainerType === 'glass' || navContainerType === 'pill';\n const background = header?.background;\n const colorToken = extractBackgroundColorToken(background, 'surface');\n const visuals = resolveBackgroundVisualStyles(colorToken, context.theme);\n\n const styleParts = [];\n\n if (!hasContainedNav && !visuals.isTransparent) {\n if (!background || background.type === 'color') {\n const token = background?.color ?? 'surface/95';\n styleParts.push(backgroundColorStyle(token));\n }\n }\n\n if (visuals.textColorOverride) {\n styleParts.push({ color: visuals.textColorOverride });\n } else if (visuals.textColorToken) {\n styleParts.push(textColorStyle(visuals.textColorToken));\n }\n\n const borderColorToken = header?.border?.color ?? 'border';\n styleParts.push(borderColorStyle(borderColorToken));\n\n return mergeStyles(...styleParts);\n },\n};\n\nexport const footerRootStyleTransform: TransformDefinition = {\n id: \"layout.footerRootStyle\",\n kind: \"formatter\",\n summary: \"Compose footer root inline styles for dynamic colors\",\n run: (value, _options, context) => {\n const footer = value && typeof value === \"object\" ? (value as Partial<ThemeFooter>) : undefined;\n const background = footer?.background;\n const colorToken = extractBackgroundColorToken(background, 'surface');\n const visuals = resolveBackgroundVisualStyles(colorToken, context.theme);\n\n const styleParts = [];\n\n if (!visuals.isTransparent) {\n if (!background || background.type === 'color') {\n const token = background?.color ?? 'surface';\n styleParts.push(backgroundColorStyle(token));\n }\n }\n\n if (visuals.textColorOverride) {\n styleParts.push({ color: visuals.textColorOverride });\n } else if (visuals.textColorToken) {\n styleParts.push(textColorStyle(visuals.textColorToken));\n }\n\n styleParts.push(borderColorStyle('border'));\n\n return mergeStyles(...styleParts);\n },\n};\n\nfunction extractBackgroundColorToken(\n background: ThemeHeader[\"background\"] | ThemeFooter[\"background\"] | undefined,\n fallback: string\n) {\n if (!background || background.type === 'color') {\n return background?.color ?? fallback;\n }\n if (background.type === 'gradient' && background.gradient) {\n return background.gradient.stops[0]?.color ?? fallback;\n }\n if (background.type === 'image') {\n return 'neutral-900';\n }\n return fallback;\n}\n\nexport const layoutTransforms = [\n maxWidthClassTransform,\n headerRootClassTransform,\n footerRootClassTransform,\n headerRootStyleTransform,\n footerRootStyleTransform,\n] satisfies ReadonlyArray<TransformDefinition<any>>;\n","/* ============================================================================\n * Color conversion utilities - OKLCH, RGB, HSL, HEX\n * ========================================================================== */\n\n// Basic math utilities\nexport const clamp01 = (x: number) => Math.max(0, Math.min(1, x));\nexport const mod = (a: number, n: number) => ((a % n) + n) % n;\nexport const deg = (x: number) => mod(x, 360);\nexport const mix = (a: number, b: number, t: number) => a + (b - a) * clamp01(t);\n\n// sRGB & HEX helpers\nexport function hexToRgb(hex: string) {\n const h = hex.replace(/^#/, \"\");\n const m = h.length === 3 ? h.split(\"\").map(c => c + c).join(\"\") : h;\n if (m.length !== 6) throw new Error(\"Bad hex\");\n const int = parseInt(m, 16);\n return { r: (int >> 16) & 255, g: (int >> 8) & 255, b: int & 255 };\n}\n\nexport function rgbToHex(r: number, g: number, b: number) {\n const to = (n: number) => Math.round(n).toString(16).padStart(2, \"0\");\n return `#${to(r)}${to(g)}${to(b)}`;\n}\n\nexport function srgbToLinear(u: number) {\n const x = u / 255; \n return x <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);\n}\n\nexport function linearToSrgb(x: number) {\n const y = x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055; \n return clamp01(y) * 255;\n}\n\n// HSL helpers\nexport function rgbToHsl(r: number, g: number, b: number) {\n const R = r / 255, G = g / 255, B = b / 255;\n const max = Math.max(R, G, B), min = Math.min(R, G, B);\n const d = max - min; \n let h = 0;\n if (d !== 0) {\n switch (max) { \n case R: h = ((G - B) / d + (G < B ? 6 : 0)); break; \n case G: h = (B - R) / d + 2; break; \n case B: h = (R - G) / d + 4; break; \n }\n h *= 60;\n }\n const l = (max + min) / 2; \n const s = d === 0 ? 0 : d / (1 - Math.abs(2 * l - 1));\n return { h, s, l };\n}\n\n// OKLab / OKLCH conversion\nexport function srgbToOklab(r: number, g: number, b: number) {\n const R = srgbToLinear(r), G = srgbToLinear(g), B = srgbToLinear(b);\n const l = 0.4122214708 * R + 0.5363325363 * G + 0.0514459929 * B;\n const m = 0.2119034982 * R + 0.6806995451 * G + 0.1073969566 * B;\n const s = 0.0883024619 * R + 0.2817188376 * G + 0.6299787005 * B;\n const l_ = Math.cbrt(l), m_ = Math.cbrt(m), s_ = Math.cbrt(s);\n const L = 0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_;\n const a = 1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_;\n const b2 = 0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_;\n return { L, a, b: b2 };\n}\n\nexport function oklabToSrgb(L: number, a: number, b: number) {\n const l_ = Math.pow(L + 0.3963377774 * a + 0.2158037573 * b, 3);\n const m_ = Math.pow(L - 0.1055613458 * a - 0.0638541728 * b, 3);\n const s_ = Math.pow(L - 0.0894841775 * a - 1.2914855480 * b, 3);\n const R = +4.0767416621 * l_ - 3.3077115913 * m_ + 0.2309699292 * s_;\n const G = -1.2684380046 * l_ + 2.6097574011 * m_ - 0.3413193965 * s_;\n const B = -0.0041960863 * l_ - 0.7034186147 * m_ + 1.7076147010 * s_;\n return { r: linearToSrgb(R), g: linearToSrgb(G), b: linearToSrgb(B) };\n}\n\nexport function oklabToOklch(L: number, a: number, b: number) {\n const C = Math.sqrt(a * a + b * b);\n const h = C < 1e-7 ? 0 : deg((Math.atan2(b, a) * 180) / Math.PI);\n return { L, C, h };\n}\n\nexport function oklchToOklab(L: number, C: number, h: number) {\n const hr = (h * Math.PI) / 180; \n const a = C * Math.cos(hr); \n const b = C * Math.sin(hr); \n return { L, a, b };\n}\n\nexport function inSRGB(r: number, g: number, b: number) { \n return r >= 0 && r <= 255 && g >= 0 && g <= 255 && b >= 0 && b <= 255; \n}\n\nexport function oklchToHexGamut(L: number, C: number, h: number): string {\n let lo = 0, hi = C, best = 0;\n for (let i = 0; i < 18; i++) {\n const mid = (lo + hi) / 2; \n const { a, b } = oklchToOklab(L, mid, h); \n const { r, g, b: bb } = oklabToSrgb(L, a, b);\n if (inSRGB(r, g, bb)) { \n best = mid; \n lo = mid; \n } else { \n hi = mid; \n }\n }\n const { a, b } = oklchToOklab(L, best, h); \n const { r, g, b: bb } = oklabToSrgb(L, a, b);\n return rgbToHex(r, g, bb);\n}\n\n// Color feature extraction from hex\nexport function featuresFromHex(hex: string) {\n const { r, g, b } = hexToRgb(hex);\n const { h, s, l } = rgbToHsl(r, g, b);\n const { L, a, b: b2 } = srgbToOklab(r, g, b);\n const { L: okL, C: okC, h: okH } = oklabToOklch(L, a, b2);\n const max = Math.max(r, g, b);\n const v = max / 255;\n const Y = 0.2126 * srgbToLinear(r) + 0.7152 * srgbToLinear(g) + 0.0722 * srgbToLinear(b);\n const chroma = s;\n return { r, g, b, h, s, l, v, Y, chroma, okL, okC, okH, hex };\n}\n\n// Color manipulation helpers\nexport function hueRotate(h: number, degrees: number) {\n return deg(h + degrees);\n}\n\nexport function setTone(L: number, target: number) {\n return clamp01(target);\n}\n","import type { TransformDefinition } from \"./core\";\n\nexport const mediaFromUrl: TransformDefinition = {\n id: \"media.fromUrl\",\n kind: \"formatter\",\n summary: \"Convert {url, alt} into Media image\",\n run: (value) => {\n if (!value || typeof value !== \"object\") return null;\n const url = (value as any).url;\n const alt = (value as any).alt;\n if (typeof url !== \"string\" || url.trim() === \"\") return null;\n return { type: \"image\", src: url, alt: typeof alt === \"string\" ? alt : \"\" };\n },\n};\n\nexport const mediaTransforms = [mediaFromUrl] satisfies ReadonlyArray<TransformDefinition<any>>;\n","import type { TransformDefinition } from \"./registry/core\";\nimport { uppercaseTransform, fallbackTransform, dateFormatShort } from \"./registry/formatting\";\nimport {\n headerNavLinkClassTransform,\n headingClassFromAlignment,\n bodyClassFromAlignment,\n stackAlignFromAlignment,\n conditionalClassTransform,\n} from \"./registry/ui\";\nimport {\n maxWidthClassTransform,\n headerRootClassTransform,\n footerRootClassTransform,\n headerRootStyleTransform,\n footerRootStyleTransform,\n} from \"./registry/layout\";\nimport { mediaFromUrl } from \"./registry/media\";\n\n// Canonical map of built-in transforms. Keys are the literal IDs.\n// Note: ui.buttonClass removed - styling now handled by CSS generation at build time\nexport const transformDefinitions = {\n \"string.uppercase\": uppercaseTransform,\n \"value.fallback\": fallbackTransform,\n \"ui.headerNavLinkClass\": headerNavLinkClassTransform,\n \"layout.maxWidthClass\": maxWidthClassTransform,\n \"layout.headerRootClass\": headerRootClassTransform,\n \"layout.footerRootClass\": footerRootClassTransform,\n \"layout.headerRootStyle\": headerRootStyleTransform,\n \"layout.footerRootStyle\": footerRootStyleTransform,\n \"ui.headingClassFromAlignment\": headingClassFromAlignment,\n \"ui.bodyClassFromAlignment\": bodyClassFromAlignment,\n \"ui.stackAlignFromAlignment\": stackAlignFromAlignment,\n \"ui.conditionalClass\": conditionalClassTransform,\n \"media.fromUrl\": mediaFromUrl,\n \"date.formatShort\": dateFormatShort,\n} as const;\n\nexport type TransformId = keyof typeof transformDefinitions;\n\ntype OptionsOf<T> = T extends TransformDefinition<infer O> ? O : never;\n\nexport type TransformOptionsById = {\n [K in TransformId]: OptionsOf<(typeof transformDefinitions)[K]>;\n};\n\nexport type TransformStep<K extends TransformId = TransformId> = {\n id: K;\n options?: TransformOptionsById[K];\n};\n\n// Convenience helpers for declaring transform pipelines in a type‑safe way.\nexport function tx<K extends TransformId>(id: K, options?: TransformOptionsById[K]): TransformStep<K> {\n return { id, options };\n}\n\nexport function pipe<T extends readonly TransformStep[]>(...steps: T): T {\n return steps;\n}\n\nexport function bindProp(\n from: string,\n opts?: { transforms?: readonly TransformStep[] | TransformStep[]; fallback?: unknown; pick?: \"value\" | \"collection\" | \"context\" }\n) {\n return {\n $bind: {\n from,\n ...(opts?.transforms ? { transforms: [...opts.transforms] } : {}),\n ...(opts?.fallback !== undefined ? { fallback: opts.fallback } : {}),\n ...(opts?.pick ? { pick: opts.pick } : {}),\n },\n } as const;\n}\n","import type { BlockManifest } from '../manifest/schema'\nimport type { NodeDefinition } from '../node'\nimport { bind, headerSection, inline, link, media, stack, text, when, props as withProps } from '../node/builder'\nimport { navRow, ctaButton } from '../node/fragments'\nimport type { SystemBlockDefinition } from '../registry'\nimport { bindProp, pipe, tx } from '../transforms/typed'\nimport { createBlockManifest } from '../defineBlock'\nimport { backgroundColorStyle, borderColorStyle, mergeStyles, textColorStyle } from '../../theme/utils/colorStyles'\n\nconst logoRow = link(\n { href: '/', className: 'header-logo flex min-w-0 items-center gap-3 no-underline transition-opacity hover:opacity-80' },\n [\n media({ className: 'h-10 w-auto transition-all duration-300 [.header-scrolled_&]:h-8' }, when('content.logo'), bind('content.logo')),\n text({ as: 'span', className: 'header-logo-text truncate text-lg font-semibold' }, bind('site.title', { fallback: 'Your Site' })),\n ],\n)\n\nconst centeredLogoRow = link(\n { href: '/', className: 'header-logo flex items-center justify-center gap-3 text-center no-underline transition-opacity hover:opacity-80' },\n [\n media({ className: 'h-12 w-auto transition-all duration-300 [.header-scrolled_&]:h-10' }, when('content.logo'), bind('content.logo')),\n text({ as: 'span', className: 'header-logo-text text-xl font-semibold' }, bind('site.title', { fallback: 'Your Site' })),\n ],\n)\n\n// Shared nav row configuration\nconst createNavRow = (className: string, align: 'start' | 'center' | 'end' = 'end') =>\n navRow({\n className: `${className} header-nav-row`,\n align,\n linkClassName: 'header-nav-link inline-flex items-center px-4 py-2 text-sm font-medium transition-theme-standard',\n })\n\nconst headerCta = ctaButton({\n basePath: 'menu.ctaItem',\n whenPath: 'menu.ctaItem.label',\n variantPath: 'menu.ctaItem.variant',\n linkPath: 'menu.ctaItem.link',\n className: 'header-cta btn-sm hidden md:inline-flex ml-6',\n})\n\n// Classic variant: logo left, nav right (horizontal inline layout)\nconst classicLayout = inline(\n {\n className: bindProp('$root.theme.header.maxWidth', {\n transforms: pipe(tx('layout.maxWidthClass', { base: 'flex w-full items-center gap-6 py-4' })),\n fallback: 'container mx-auto flex w-full items-center gap-6 px-6 py-4',\n }),\n align: 'center',\n },\n [\n logoRow,\n createNavRow('ml-auto hidden md:flex gap-6'),\n headerCta,\n ],\n when('$root.theme.header.variant', { equals: 'classic' }),\n)\n\n// Centered variant: logo centered, nav below (vertical stack layout)\nconst centeredLayout = stack(\n {\n gap: 'md',\n align: 'center',\n className: bindProp('$root.theme.header.maxWidth', {\n transforms: pipe(tx('layout.maxWidthClass', { base: 'flex w-full flex-col items-center gap-5 py-6 text-center' })),\n fallback: 'container mx-auto flex w-full flex-col items-center gap-5 px-6 py-6 text-center',\n }),\n },\n [\n centeredLogoRow,\n createNavRow('flex flex-wrap justify-center gap-x-6 gap-y-3', 'center'),\n ],\n when('$root.theme.header.variant', { equals: 'centered' }),\n)\n\n// Transparent variant: logo left, nav right (horizontal inline, transparent bg)\nconst transparentLayout = inline(\n {\n className: bindProp('$root.theme.header.maxWidth', {\n transforms: pipe(tx('layout.maxWidthClass', { base: 'flex w-full items-center gap-6 py-4' })),\n fallback: 'container mx-auto flex w-full items-center gap-6 px-6 py-4',\n }),\n align: 'center',\n },\n [\n logoRow,\n createNavRow('ml-auto hidden md:flex gap-6'),\n headerCta,\n ],\n when('$root.theme.header.variant', { equals: 'transparent' }),\n)\n\n// Floating variant: absolute positioned with padding + rounded container\nconst floatingLayout = inline(\n {\n className: bindProp('$root.theme.header.maxWidth', {\n transforms: pipe(tx('layout.maxWidthClass', { base: 'header-floating-container absolute left-1/2 top-4 flex w-[calc(100%-2rem)] max-w-7xl -translate-x-1/2 items-center gap-6 px-6 py-3' })),\n fallback: 'header-floating-container absolute left-1/2 top-4 flex w-[calc(100%-2rem)] max-w-7xl -translate-x-1/2 items-center gap-6 px-6 py-3',\n }),\n align: 'center',\n },\n [\n logoRow,\n createNavRow('ml-auto hidden md:flex gap-6'),\n headerCta,\n ],\n when('$root.theme.header.variant', { equals: 'floating' }),\n)\n\n// Editorial variant: centered logo with nav split left/right or large centered logo with nav below\nconst editorialLayout = stack(\n {\n gap: 'md',\n align: 'center',\n className: bindProp('$root.theme.header.maxWidth', {\n transforms: pipe(tx('layout.maxWidthClass', { base: 'flex w-full flex-col items-center gap-6 py-6 text-center' })),\n fallback: 'container mx-auto flex w-full flex-col items-center gap-6 px-6 py-6 text-center',\n }),\n },\n [\n centeredLogoRow,\n createNavRow('flex flex-wrap justify-center gap-x-8 gap-y-3', 'center'),\n ],\n when('$root.theme.header.variant', { equals: 'editorial' }),\n)\n\n// Root section contains all variant layouts\nconst headerLayout: NodeDefinition = headerSection(\n {\n background: 'background/base',\n className: bindProp('$root.theme.header', {\n transforms: pipe(tx('layout.headerRootClass')),\n fallback: 'header-root z-40 w-full border-b transition-theme backdrop-blur',\n }),\n style: bindProp('$root.theme.header', {\n transforms: pipe(tx('layout.headerRootStyle')),\n fallback: mergeStyles(\n backgroundColorStyle('surface'),\n textColorStyle('text'),\n borderColorStyle('border'),\n ),\n }),\n },\n [\n classicLayout,\n centeredLayout,\n transparentLayout,\n floatingLayout,\n editorialLayout,\n ],\n withProps({\n 'data-site-header': 'true',\n }),\n)\n\nexport const siteHeaderManifest: BlockManifest = createBlockManifest({\n id: 'block.siteHeader',\n title: 'Site Header',\n category: 'layout',\n component: 'site.header.default',\n\n // Skip section styles - this block uses theme-based styling\n skipSectionStyles: true,\n\n layout: headerLayout,\n\n description: 'Site-wide header with logo, navigation, and optional CTA.',\n styleTokens: {\n spacing: 'sm',\n },\n paletteHidden: true,\n})\n\nexport type SiteHeaderManifest = typeof siteHeaderManifest\n\nexport type SiteHeaderVariant = 'classic' | 'centered' | 'transparent' | 'floating' | 'editorial'\n\n// Header has no content fields - variant comes from theme.header.variant\n// CTA is handled via navigation items with is_cta flag\nexport type SiteHeaderContent = Record<string, never>\n\nexport const siteHeaderBlockDefinition: SystemBlockDefinition<SiteHeaderContent> = {\n manifest: siteHeaderManifest,\n}\n","import { navRow } from '../node/fragments'\nimport type { BlockManifest } from '../manifest/schema'\nimport type { NodeDefinition } from '../node'\nimport { bind, inline, section, stack, text, when } from '../node/builder'\nimport type { SystemBlockDefinition } from '../registry'\nimport type { LinkValue } from '../types/link'\nimport {\n composeFragments,\n materializeFragment,\n footerBottomTextFragment,\n footerLinkGroupsFragment,\n} from '../fragments'\nimport { createBlockManifest } from '../defineBlock'\nimport {\n backgroundColorStyle,\n borderColorStyle,\n mergeStyles,\n textColorStyle,\n} from '../../theme/utils/colorStyles'\n\nconst _footerFragments = composeFragments([\n { fragment: footerLinkGroupsFragment, fieldPriority: 0 },\n { fragment: footerBottomTextFragment, fieldPriority: 1 },\n])\n\nconst linkGroupsLayout = (): NodeDefinition[] =>\n materializeFragment({ fragment: footerLinkGroupsFragment }).layout\n\nconst bottomTextLayout = (): NodeDefinition[] =>\n materializeFragment({ fragment: footerBottomTextFragment }).layout\n\nconst simpleFooterLayout = stack(\n {\n gap: 'md',\n align: 'center',\n className: {\n $bind: {\n from: '$root.theme.footer.maxWidth',\n transforms: [\n {\n id: 'layout.maxWidthClass',\n options: { base: 'flex w-full flex-col items-center gap-4 py-10 text-center' },\n },\n ],\n fallback: 'container mx-auto flex w-full flex-col items-center gap-4 px-6 py-10 text-center',\n },\n },\n },\n [\n navRow({ align: 'center', className: 'flex flex-wrap justify-center gap-x-6 gap-y-3' }),\n ...bottomTextLayout(),\n ],\n when('$root.theme.footer.variant', { equals: 'simple' }),\n)\n\nconst columnsFooterLayout = stack(\n {\n gap: 'xl',\n align: 'start',\n className: {\n $bind: {\n from: '$root.theme.footer.maxWidth',\n transforms: [\n {\n id: 'layout.maxWidthClass',\n options: { base: 'flex w-full flex-col gap-10 py-12' },\n },\n ],\n fallback: 'container mx-auto flex w-full flex-col gap-10 px-6 py-12',\n },\n },\n },\n [\n ...linkGroupsLayout(),\n inline(\n { className: 'flex w-full flex-wrap items-center justify-between gap-4' },\n [\n text({ as: 'span', className: 'text-sm font-semibold', style: textColorStyle('text') }, bind('site.title', { fallback: 'Your Site' })),\n navRow({ className: 'flex flex-wrap justify-end gap-x-6 gap-y-3', align: 'end' }),\n ],\n ),\n ...bottomTextLayout(),\n ],\n when('$root.theme.footer.variant', { equals: 'columns' }),\n)\n\nconst footerLayout: NodeDefinition = section(\n {\n background: 'background/base',\n className: {\n $bind: {\n from: '$root.theme.footer',\n transforms: [\n {\n id: 'layout.footerRootClass',\n },\n ],\n fallback: 'w-full border-t transition-theme',\n },\n },\n style: {\n $bind: {\n from: '$root.theme.footer',\n transforms: [\n {\n id: 'layout.footerRootStyle',\n },\n ],\n fallback: mergeStyles(\n backgroundColorStyle('surface'),\n textColorStyle('text'),\n borderColorStyle('border'),\n ),\n },\n },\n },\n [\n simpleFooterLayout,\n columnsFooterLayout,\n ],\n)\n\nexport const siteFooterManifest: BlockManifest = createBlockManifest({\n id: 'block.siteFooter',\n title: 'Site Footer',\n category: 'layout',\n component: 'site.footer.default',\n\n // Use fragments for link groups and bottom text\n fragments: [\n { fragment: footerLinkGroupsFragment, fieldPriority: 0 },\n { fragment: footerBottomTextFragment, fieldPriority: 1 },\n ],\n\n // Skip section styles - this block uses theme-based styling\n skipSectionStyles: true,\n\n layout: footerLayout,\n\n description: 'Site-wide footer with navigation links and optional columns.',\n styleTokens: {\n spacing: 'md',\n },\n paletteHidden: true,\n})\n\nexport type SiteFooterVariant = 'simple' | 'columns'\n\nexport type SiteFooterLink = {\n label: string\n link: LinkValue | null\n target?: string | null\n rel?: string | null\n}\n\nexport type SiteFooterLinkGroup = {\n title?: string | null\n links: SiteFooterLink[]\n}\n\nexport type SiteFooterContent = {\n bottomText?: unknown\n linkGroups?: SiteFooterLinkGroup[]\n}\n\nexport const siteFooterBlockDefinition: SystemBlockDefinition<SiteFooterContent> = {\n manifest: siteFooterManifest,\n}\n","import type { Media } from '../../lib/media'\nimport type { BlockManifest } from '../manifest/schema'\nimport { fieldSchema } from '../manifest/schema'\nimport type { NodeDefinition } from '../node'\nimport { section } from '../node/builder'\nimport { sectionContainer } from '../node/fragments'\nimport { backgroundLayer } from '../node/fragments/backgroundLayer'\nimport { sectionStylesField } from '../fields/boxStyles'\nimport type { SystemBlockDefinition } from '../registry'\nimport {\n composeFragments,\n buildFragmentDataLoaders,\n testimonialsHeadingFragment,\n testimonialsCarouselFragment,\n} from '../fragments'\n\n// Background layer nodes (replaces testimonialsBackgroundFragment)\nconst testimonialsBackgroundNodes = backgroundLayer(\"_sectionStyles.background\", {\n imageClassName: \"absolute inset-0 -z-10 h-full w-full object-cover opacity-50\",\n})\n\nconst testimonialsContent = composeFragments([\n { fragment: testimonialsHeadingFragment },\n { fragment: testimonialsCarouselFragment },\n])\n\nconst testimonialsLayout: NodeDefinition = section(\n { background: 'background/base', className: 'px-6 py-16 sm:py-20 md:py-24' }, // Semantic: comfortable + extra md padding\n [\n ...testimonialsBackgroundNodes,\n sectionContainer(\n [...testimonialsContent.layout],\n { gap: 'xl', className: 'relative' },\n ),\n ],\n)\n\nconst fields = fieldSchema.array().parse([\n ...testimonialsContent.fields.filter((field) => field.id === 'heading' || field.id === 'subheading'),\n ...testimonialsContent.fields.filter(\n (field) => field.id === 'slidesToShow' || field.id === 'transition' || field.id === 'maxEntries',\n ),\n sectionStylesField({\n id: '_sectionStyles',\n label: 'Section styles',\n }),\n])\n\nconst dataLoaders = buildFragmentDataLoaders(testimonialsContent)\n\nexport const testimonialsManifest: BlockManifest = {\n name: 'block.testimonials',\n version: '0.1.0',\n title: 'Testimonials',\n description: 'Carousel of customer testimonials with optional background styling.',\n component: 'testimonials.carousel',\n fields,\n slots: [],\n styleTokens: {\n background: 'surface',\n typography: 'body',\n spacing: 'lg',\n },\n behaviours: {\n supportsThemeSwitching: true,\n inlineEditing: false,\n animation: true,\n paletteHidden: false,\n },\n category: 'marketing',\n tags: ['testimonials', 'reviews', 'quotes', 'feedback', 'social-proof', 'customers', 'carousel'],\n icon: 'MessageSquareQuote',\n layout: testimonialsLayout,\n}\n\nexport type TestimonialsBlockContent = {\n heading?: string | null\n subheading?: string | null\n slidesToShow?: number | string | null\n transition?: 'slide' | 'fade' | null\n maxEntries?: number | string | null\n _sectionStyles?: {\n background?: {\n type: 'color' | 'gradient' | 'image'\n color?: string | null\n gradient?: import('../../theme/gradients').GradientConfig | null\n image?: Media | null\n textColor?: string | null\n } | null\n spacing?: string | null\n } | null\n}\n\nexport type TestimonialEntryContent = {\n name?: string | null\n jobTitle?: string | null\n company?: string | null\n headshot?: {\n url?: string | null\n alt?: string | null\n } | null\n body?: unknown\n}\n\nexport type TestimonialEntry = {\n id: string\n slug: string | null\n path: string\n publishedAt: string | null\n status: string\n excerpt: string\n routeId: string | null\n content: TestimonialEntryContent\n}\n\nexport const testimonialsBlockDefinition: SystemBlockDefinition<TestimonialsBlockContent> = {\n manifest: testimonialsManifest,\n dataLoaders,\n}\n","import { cardFragment, columnContentFragment, fragmentsToRepeaterField } from '../fragments';\nimport { fieldSchema, type BlockManifest } from '../manifest/schema';\nimport type { SystemBlockDefinition } from '../registry';\nimport { createBlockManifest } from '../defineBlock';\nimport { typeBasedLayout } from '../node';\nimport { el } from '../node/builder';\nimport { styledSection, sectionContainer } from '../node/fragments';\n\nconst columnsLayout = styledSection({\n children: sectionContainer(\n [\n el('grid',\n {\n cols: {\n $bind: {\n from: 'content.columns',\n transforms: [{ id: 'array.length' }],\n },\n },\n gap: { $bind: { from: 'content.gap' } },\n },\n [\n {\n type: 'stack',\n props: { gap: 'md', className: 'h-full' },\n children: typeBasedLayout(\n {\n card: cardFragment.layout,\n columnContent: columnContentFragment.layout,\n },\n { itemName: 'column' }\n ),\n $repeat: {\n collection: { from: 'content.columns' },\n itemName: 'column',\n },\n },\n ]\n ),\n ],\n { gap: 'md' }\n ),\n spacing: 'medium',\n});\n\nexport const columnsManifest: BlockManifest = createBlockManifest({\n id: 'block.columns',\n title: 'Columns',\n category: 'layout',\n component: 'columns',\n\n // Custom fields for columns configuration\n additionalFields: [\n fieldSchema.parse({\n id: 'gap',\n type: 'select',\n label: 'Gap between columns',\n defaultValue: 'lg',\n options: [\n { value: 'sm', label: 'Small' },\n { value: 'md', label: 'Medium' },\n { value: 'lg', label: 'Large' },\n ],\n }),\n fragmentsToRepeaterField(\n 'columns',\n 'Columns',\n {\n card: cardFragment,\n columnContent: columnContentFragment,\n },\n {\n minItems: 0,\n maxItems: 4,\n itemLabel: 'Column',\n description: 'Add or remove columns (up to 4)',\n }\n ),\n ],\n\n layout: columnsLayout,\n\n description: 'Multi-column layout with customizable content per column',\n tags: ['columns', 'grid', 'layout', 'flexible', 'multi-column'],\n icon: 'Columns',\n styleTokens: {\n spacing: 'lg',\n },\n});\n\nexport type ColumnsContent = {\n gap?: 'sm' | 'md' | 'lg';\n columns: Array<\n | {\n _type: 'card';\n media?: unknown;\n aspectRatio?: '16/9' | '4/3' | '1/1' | '3/4' | 'auto';\n title: string;\n body?: unknown;\n ctas?: Array<unknown>;\n variant?: string;\n }\n | {\n _type: 'columnContent';\n items: Array<{ _type: string; [key: string]: unknown }>;\n }\n >;\n};\n\nexport const columnsBlockDefinition: SystemBlockDefinition<ColumnsContent> = {\n manifest: columnsManifest,\n};\n","import { z } from \"zod\";\n\nimport type { BlockManifest } from \"../manifest/schema\";\nimport type { SystemBlockDefinition } from \"../registry\";\nimport { text, richText, bookingForm } from \"../node/builder\";\nimport { bind, when } from \"../node/builder\";\nimport { styledSection } from \"../node/fragments/styledSection\";\nimport { sectionContainer } from \"../node/fragments\";\n\n/**\n * Appointment Booking Block (v2.0.0)\n *\n * This block creates a multi-step booking flow that references a booking form\n * for customer information fields. The booking form determines which services\n * can be booked and contains all field customization.\n *\n * Flow:\n * 1. Service/Resource Selection (if form allows multiple services)\n * 2. Date & Time Slot Picker (hardcoded, not customizable)\n * 3. Customer Information (from booking form fields)\n * 4. Confirmation\n *\n * The block no longer uses fragment composition - instead it dynamically\n * loads the booking form definition and renders its fields.\n */\nexport const appointmentBookingManifest: BlockManifest = {\n name: \"block.appointment-booking\",\n version: \"2.0.0\", // Major version bump - breaking change from v1\n title: \"Appointment Booking\",\n titleSource: \"heading\",\n description: \"Multi-step appointment booking with customizable form fields\",\n component: \"appointment-booking.block\",\n fields: [\n {\n id: \"formId\",\n type: \"reference\",\n label: \"Booking Form\",\n description: \"Select which booking form to use for collecting customer information\",\n required: true,\n referenceKind: \"bookingForm\",\n allowManualEntry: false,\n },\n {\n id: \"heading\",\n type: \"text\",\n label: \"Heading\",\n description: \"Main heading shown at the top of the booking flow\",\n required: false,\n multiline: false,\n defaultValue: \"Book an Appointment\",\n },\n {\n id: \"description\",\n type: \"richText\",\n label: \"Description\",\n description: \"Optional description or instructions for users\",\n required: false,\n format: \"markdown\",\n },\n ],\n slots: [],\n styleTokens: { background: \"surface\", typography: \"body\", spacing: \"md\" },\n behaviours: { supportsThemeSwitching: true, inlineEditing: false, animation: false, paletteHidden: false },\n category: \"interactive\",\n tags: [\"booking\", \"appointment\", \"calendar\", \"scheduling\", \"reservation\"],\n icon: \"Calendar\",\n layout: [\n styledSection({\n children: sectionContainer([\n // Optional heading\n text(\n { as: \"h2\", size: \"2xl\", weight: \"bold\" },\n bind(\"content.heading\"),\n when(\"content.heading\")\n ),\n\n // Optional description\n richText(\n {},\n bind(\"content.description\"),\n when(\"content.description\")\n ),\n\n // The booking form component - loads booking form by ID and renders multi-step flow\n bookingForm({\n siteId: { $bind: { from: \"$root.siteId\" } },\n formId: { $bind: { from: \"content.formId\" } },\n form: { $bind: { from: \"data.form\" } },\n services: { $bind: { from: \"data.services\" } },\n }),\n ], {\n gap: \"lg\",\n }),\n spacing: \"spacious\",\n }),\n ],\n};\n\nexport type AppointmentBookingContent = {\n formId: string; // NEW - reference to booking form\n heading?: string | null;\n description?: unknown; // Rich text\n // REMOVED: serviceId, resourceId, submitLabel, successMessage, timezone\n // These now come from the booking form settings\n};\n\nexport const availabilityDataSchema = z.object({\n slots: z.array(z.object({\n startAt: z.string(),\n endAt: z.string(),\n resourceId: z.string(),\n })),\n});\n\nexport type AvailabilityData = z.infer<typeof availabilityDataSchema>;\n\nexport const appointmentBookingBlockDefinition: SystemBlockDefinition<AppointmentBookingContent> = {\n manifest: appointmentBookingManifest,\n dataSchemas: { availability: availabilityDataSchema.optional() },\n dataLoaders: {\n form: {\n endpoint: 'getPublicFormById',\n params: {\n formId: { $bind: { from: 'content.formId' } },\n },\n mode: 'server',\n },\n services: {\n endpoint: 'getPublicBookingServices',\n params: {\n siteId: { $bind: { from: '$root.siteId' } },\n },\n mode: 'server',\n },\n },\n};\n","import { z } from \"zod\";\n\nimport type { BlockManifest } from \"../manifest/schema\";\nimport type { SystemBlockDefinition } from \"../registry\";\nimport { text, richText, eventRegistration } from \"../node/builder\";\nimport { bind, when } from \"../node/builder\";\nimport { styledSection } from \"../node/fragments/styledSection\";\nimport { sectionContainer } from \"../node/fragments\";\n// Import shared event types\nimport { publicEventSchema, type PublicEvent } from \"./events/shared\";\n\n/**\n * Event Registration Block\n *\n * Multi-step registration form for events. Can be placed on event content type\n * templates or standalone pages.\n *\n * Features:\n * - Occurrence selection (if not pre-selected via URL)\n * - Ticket quantity selection\n * - Attendee information form\n * - Confirmation display\n *\n * Context:\n * - When placed on an event template with occurrence URL (/events/yoga/2025-01-15),\n * the occurrence is pre-selected from route context\n * - When on event template without occurrence, shows occurrence picker\n * - When standalone, shows full event + occurrence picker\n */\nexport const eventRegistrationManifest: BlockManifest = {\n name: \"block.event-registration\",\n version: \"1.0.0\",\n title: \"Event Registration\",\n titleSource: \"heading\",\n description: \"Multi-step event registration form\",\n component: \"event-registration.block\",\n fields: [\n {\n id: \"heading\",\n type: \"text\",\n label: \"Heading\",\n description: \"Main heading for the registration form\",\n required: false,\n multiline: false,\n defaultValue: \"Register for this event\",\n },\n {\n id: \"description\",\n type: \"richText\",\n label: \"Description\",\n description: \"Optional introductory text\",\n required: false,\n format: \"markdown\",\n },\n {\n id: \"maxTickets\",\n type: \"select\",\n label: \"Max tickets per registration\",\n description: \"Maximum tickets a person can register for\",\n required: false,\n multiple: false,\n defaultValue: \"5\",\n options: [\n { value: \"1\", label: \"1 ticket\" },\n { value: \"2\", label: \"2 tickets\" },\n { value: \"3\", label: \"3 tickets\" },\n { value: \"5\", label: \"5 tickets\" },\n { value: \"10\", label: \"10 tickets\" },\n ],\n },\n {\n id: \"showVenue\",\n type: \"boolean\",\n label: \"Show venue\",\n description: \"Display venue information\",\n required: false,\n defaultValue: true,\n },\n {\n id: \"showCapacity\",\n type: \"boolean\",\n label: \"Show available spots\",\n description: \"Display remaining capacity\",\n required: false,\n defaultValue: true,\n },\n {\n id: \"successMessage\",\n type: \"text\",\n label: \"Success message\",\n description: \"Message shown after successful registration\",\n required: false,\n multiline: true,\n defaultValue: \"Thank you for registering! Check your email for confirmation details.\",\n maxLength: 500,\n },\n {\n id: \"waitlistMessage\",\n type: \"text\",\n label: \"Waitlist message\",\n description: \"Message when added to waitlist\",\n required: false,\n multiline: true,\n defaultValue: \"You've been added to the waitlist. We'll notify you if a spot opens up.\",\n maxLength: 500,\n },\n {\n id: \"buttonText\",\n type: \"text\",\n label: \"Submit button text\",\n description: \"Text for the registration submit button\",\n required: false,\n multiline: false,\n defaultValue: \"Complete Registration\",\n maxLength: 40,\n },\n {\n id: \"buttonVariant\",\n type: \"select\",\n label: \"Button style\",\n description: \"Choose a button style from your theme\",\n required: false,\n multiple: false,\n defaultValue: \"primary\",\n options: [\n { value: \"primary\", label: \"Primary\" },\n { value: \"secondary\", label: \"Secondary\" },\n { value: \"outline\", label: \"Outline\" },\n ],\n },\n ],\n slots: [],\n styleTokens: { background: \"surface\", typography: \"body\", spacing: \"md\" },\n behaviours: { supportsThemeSwitching: true, inlineEditing: false, animation: false, paletteHidden: false },\n category: \"interactive\",\n tags: [\"events\", \"registration\", \"booking\", \"form\", \"signup\"],\n icon: \"ClipboardList\",\n layout: [\n styledSection({\n spacing: \"spacious\",\n children: sectionContainer([\n // Optional heading\n text(\n { as: \"h2\", size: \"2xl\", weight: \"bold\" },\n bind(\"content.heading\"),\n when(\"content.heading\")\n ),\n\n // Optional description\n richText(\n {},\n bind(\"content.description\"),\n when(\"content.description\")\n ),\n\n // Event registration form component\n eventRegistration({\n // Site context for API calls\n siteId: { $bind: { from: \"$root.siteId\" } },\n // Pre-selected occurrence from route context (if available)\n occurrenceContext: { $bind: { from: \"$root.occurrenceContext\" } },\n // Event data from content entry context (if on event template)\n contentEntry: { $bind: { from: \"$root.contentEntry\" } },\n // Content configuration\n maxTickets: { $bind: { from: \"content.maxTickets\", fallback: \"5\" } },\n showVenue: { $bind: { from: \"content.showVenue\" } },\n showCapacity: { $bind: { from: \"content.showCapacity\" } },\n successMessage: { $bind: { from: \"content.successMessage\" } },\n waitlistMessage: { $bind: { from: \"content.waitlistMessage\" } },\n buttonText: { $bind: { from: \"content.buttonText\", fallback: \"Complete Registration\" } },\n buttonVariant: { $bind: { from: \"content.buttonVariant\", fallback: \"primary\" } },\n // Event data from loader\n events: { $bind: { from: \"data.events\" } },\n }),\n ], {\n gap: \"lg\",\n }),\n }),\n ],\n};\n\nexport type EventRegistrationContent = {\n heading?: string | null;\n description?: unknown; // Rich text\n maxTickets?: \"1\" | \"2\" | \"3\" | \"5\" | \"10\" | null;\n showVenue?: boolean | null;\n showCapacity?: boolean | null;\n successMessage?: string | null;\n waitlistMessage?: string | null;\n buttonText?: string | null;\n buttonVariant?: \"primary\" | \"secondary\" | \"outline\" | null;\n};\n\n// Re-export PublicEvent type for convenience\nexport type { PublicEvent };\n\n/**\n * Schema for occurrence context from route resolver\n *\n * Flat structure passed from PageRenderer.$root.occurrenceContext\n */\nexport const occurrenceContextSchema = z.object({\n /** Unique identifier for this occurrence */\n id: z.string(),\n /** The event series this occurrence belongs to */\n seriesId: z.string(),\n /** ISO 8601 datetime when the occurrence starts */\n startsAt: z.string(),\n /** ISO 8601 datetime when the occurrence ends */\n endsAt: z.string(),\n /** Override capacity for this specific occurrence (null = use series default) */\n capacityOverride: z.number().nullable().optional(),\n /** Field-level overrides: { title?, description?, venueId?, etc. } */\n overrides: z.record(z.string(), z.unknown()).nullable().optional(),\n}).nullable();\n\nexport type OccurrenceContext = z.infer<typeof occurrenceContextSchema>;\n\nexport const eventRegistrationBlockDefinition: SystemBlockDefinition<EventRegistrationContent> = {\n manifest: eventRegistrationManifest,\n dataSchemas: {\n events: z.array(publicEventSchema).optional(),\n occurrenceContext: occurrenceContextSchema.optional(),\n },\n dataLoaders: {\n // Load events for occurrence selection\n // This is needed when block is on a standalone page or event template without occurrence in URL\n events: {\n endpoint: 'listPublicEvents',\n params: {\n siteId: { $bind: { from: '$root.siteId' } },\n limit: '50', // Get more events for selection\n stage: { $bind: { from: '$root.previewStage', fallback: 'published' } },\n },\n mode: 'server',\n },\n },\n};\n","import { z } from 'zod';\n\n/**\n * Zod schema for venue data\n */\nexport const eventVenueSchema = z.object({\n id: z.string(),\n name: z.string(),\n address: z.string().nullable(),\n});\n\n/**\n * Zod schema for public event data\n */\nexport const publicEventSchema = z.object({\n id: z.string(),\n seriesId: z.string(),\n title: z.string(),\n description: z.string().nullable(),\n slug: z.string(),\n startsAt: z.string(),\n endsAt: z.string(),\n capacity: z.number().nullable(),\n registeredCount: z.number(),\n availableSpots: z.number().nullable(),\n venue: eventVenueSchema.nullable(),\n});\n\n/**\n * Schema for an array of public events\n */\nexport const publicEventsArraySchema = z.array(publicEventSchema);\n","import type { BlockManifest } from '../../../manifest/schema';\n\ntype ManifestField = BlockManifest['fields'][number];\n\n/**\n * Shared card styling fields for event blocks\n */\nexport const cardStylingFields: ManifestField[] = [\n {\n id: 'cardVariant',\n type: 'select',\n label: 'Card style',\n description: 'Choose a card style from your theme',\n required: false,\n multiple: false,\n defaultValue: 'default',\n options: [\n { value: 'default', label: 'Default' },\n { value: 'variant1', label: 'Variant 1' },\n { value: 'variant2', label: 'Variant 2' },\n ],\n },\n {\n id: 'buttonVariant',\n type: 'select',\n label: 'Button style',\n description: 'Choose a button style from your theme',\n required: false,\n multiple: false,\n defaultValue: 'primary',\n options: [\n { value: 'primary', label: 'Primary' },\n { value: 'secondary', label: 'Secondary' },\n { value: 'outline', label: 'Outline' },\n { value: 'link', label: 'Link' },\n ],\n },\n {\n id: 'buttonText',\n type: 'text',\n label: 'Button text',\n description: 'Text for the event action button',\n required: false,\n multiline: false,\n defaultValue: 'View event',\n maxLength: 40,\n },\n];\n\n/**\n * Shared event display option fields\n */\nexport const eventDisplayFields: ManifestField[] = [\n {\n id: 'showVenue',\n type: 'boolean',\n label: 'Show venue',\n description: 'Display venue name and address',\n required: false,\n defaultValue: true,\n },\n {\n id: 'showCapacity',\n type: 'boolean',\n label: 'Show available spots',\n description: 'Display remaining capacity',\n required: false,\n defaultValue: true,\n },\n];\n\n/**\n * Empty state field for when no events are available\n */\nexport const emptyStateField: ManifestField = {\n id: 'emptyMessage',\n type: 'text',\n label: 'Empty state message',\n description: 'Message when no upcoming events',\n required: false,\n multiline: false,\n defaultValue: 'No upcoming events scheduled.',\n maxLength: 200,\n};\n\n/**\n * Section heading and description fields\n */\nexport const sectionHeaderFields = (defaultHeading: string): ManifestField[] => [\n {\n id: 'heading',\n type: 'text',\n label: 'Heading',\n description: 'Main heading for the events section',\n required: false,\n multiline: false,\n defaultValue: defaultHeading,\n },\n {\n id: 'description',\n type: 'richText',\n label: 'Description',\n description: 'Optional introductory text',\n required: false,\n format: 'markdown',\n },\n];\n\n/**\n * Layout selection field with grid/stack options\n */\nexport const layoutField: ManifestField = {\n id: 'layout',\n type: 'select',\n label: 'Layout',\n description: 'Choose how events are displayed',\n required: false,\n multiple: false,\n defaultValue: 'grid',\n options: [\n { value: 'grid', label: 'Grid (cards)' },\n { value: 'stack', label: 'Stack (vertical list)' },\n ],\n};\n\n/**\n * Column count field for grid layouts (conditional on layout='grid')\n */\nexport const columnsField = (options: string[] = ['2', '3', '4']): ManifestField => ({\n id: 'columns',\n type: 'select',\n label: 'Columns',\n description: 'Number of columns in grid layout',\n required: false,\n multiple: false,\n defaultValue: '3',\n ui: {\n visibleWhen: { field: 'layout', equals: 'grid' },\n },\n options: options.map((n) => ({ value: n, label: `${n} columns` })),\n});\n","import type { BlockManifest } from \"../../manifest/schema\";\nimport type { SystemBlockDefinition } from \"../../registry\";\nimport { text, richText, el } from \"../../node/builder\";\nimport { bind, when } from \"../../node/builder\";\nimport { styledSection } from \"../../node/fragments/styledSection\";\nimport { sectionContainer } from \"../../node/fragments\";\nimport {\n publicEventsArraySchema,\n sectionHeaderFields,\n layoutField,\n columnsField,\n cardStylingFields,\n eventDisplayFields,\n emptyStateField,\n} from \"./shared\";\n\n/**\n * Event Spotlight Block\n *\n * Displays a simple list of 1-6 featured upcoming events.\n * Ideal for homepages or landing pages to highlight upcoming events.\n *\n * Features:\n * - Server-side only (static, no interactivity)\n * - Grid or stack layout\n * - Configurable event count (1-6)\n * - Theme-aware card and button styling\n */\nexport const eventSpotlightManifest: BlockManifest = {\n name: \"block.event-spotlight\",\n version: \"1.0.0\",\n title: \"Event Spotlight\",\n titleSource: \"heading\",\n description: \"Feature a few upcoming events on your homepage\",\n component: \"event-spotlight.block\",\n fields: [\n ...sectionHeaderFields(\"Upcoming Events\"),\n {\n id: \"maxEvents\",\n type: \"select\",\n label: \"Events to display\",\n description: \"Number of events to show\",\n required: false,\n multiple: false,\n defaultValue: \"3\",\n options: [\n { value: \"1\", label: \"1 event\" },\n { value: \"2\", label: \"2 events\" },\n { value: \"3\", label: \"3 events\" },\n { value: \"4\", label: \"4 events\" },\n { value: \"5\", label: \"5 events\" },\n { value: \"6\", label: \"6 events\" },\n ],\n },\n layoutField,\n columnsField([\"2\", \"3\"]),\n ...cardStylingFields,\n ...eventDisplayFields,\n emptyStateField,\n ],\n slots: [],\n styleTokens: { background: \"surface\", typography: \"body\", spacing: \"md\" },\n behaviours: { supportsThemeSwitching: true, inlineEditing: false, animation: false, paletteHidden: false },\n category: \"interactive\",\n tags: [\"events\", \"featured\", \"homepage\", \"spotlight\", \"upcoming\"],\n icon: \"Star\",\n layout: [\n styledSection({\n children: sectionContainer([\n // Optional heading\n text(\n { as: \"h2\", size: \"2xl\", weight: \"bold\" },\n bind(\"content.heading\"),\n when(\"content.heading\")\n ),\n\n // Optional description\n richText(\n {},\n bind(\"content.description\"),\n when(\"content.description\")\n ),\n\n // Event spotlight component\n el(\"event-spotlight\", {\n events: { $bind: { from: \"data.events\" } },\n layout: { $bind: { from: \"content.layout\", fallback: \"grid\" } },\n columns: { $bind: { from: \"content.columns\", fallback: \"3\" } },\n cardVariant: { $bind: { from: \"content.cardVariant\", fallback: \"default\" } },\n buttonVariant: { $bind: { from: \"content.buttonVariant\", fallback: \"primary\" } },\n buttonText: { $bind: { from: \"content.buttonText\", fallback: \"View event\" } },\n showVenue: { $bind: { from: \"content.showVenue\" } },\n showCapacity: { $bind: { from: \"content.showCapacity\" } },\n emptyMessage: { $bind: { from: \"content.emptyMessage\" } },\n }),\n ], {\n gap: \"lg\",\n }),\n spacing: \"spacious\",\n }),\n ],\n};\n\nexport type EventSpotlightContent = {\n heading?: string | null;\n description?: unknown; // Rich text\n maxEvents?: \"1\" | \"2\" | \"3\" | \"4\" | \"5\" | \"6\" | null;\n layout?: \"grid\" | \"stack\" | null;\n columns?: \"2\" | \"3\" | null;\n cardVariant?: \"default\" | \"variant1\" | \"variant2\" | null;\n buttonVariant?: \"primary\" | \"secondary\" | \"outline\" | \"link\" | null;\n buttonText?: string | null;\n showVenue?: boolean | null;\n showCapacity?: boolean | null;\n emptyMessage?: string | null;\n};\n\nexport const eventSpotlightBlockDefinition: SystemBlockDefinition<EventSpotlightContent> = {\n manifest: eventSpotlightManifest,\n dataSchemas: {\n events: publicEventsArraySchema.optional(),\n },\n dataLoaders: {\n events: {\n endpoint: 'listPublicEvents',\n params: {\n siteId: { $bind: { from: '$root.siteId' } },\n limit: { $bind: { from: 'content.maxEvents', fallback: '3' } },\n stage: { $bind: { from: '$root.previewStage', fallback: 'published' } },\n },\n mode: 'server',\n },\n },\n};\n","import type { BlockManifest } from \"../../manifest/schema\";\nimport type { SystemBlockDefinition } from \"../../registry\";\nimport { text, richText, el } from \"../../node/builder\";\nimport { bind, when } from \"../../node/builder\";\nimport { styledSection } from \"../../node/fragments/styledSection\";\nimport { sectionContainer } from \"../../node/fragments\";\nimport {\n publicEventsArraySchema,\n sectionHeaderFields,\n layoutField,\n columnsField,\n cardStylingFields,\n eventDisplayFields,\n emptyStateField,\n} from \"./shared\";\n\n/**\n * Event Listing Block\n *\n * Displays a paginated list of events with a \"load more\" button.\n * Ideal for dedicated events pages showing all upcoming events.\n *\n * Features:\n * - Server-side initial load\n * - Client-side \"load more\" pagination\n * - Grid or stack layout\n * - Configurable initial load and page sizes\n * - Theme-aware card and button styling\n */\nexport const eventListingManifest: BlockManifest = {\n name: \"block.event-listing\",\n version: \"1.0.0\",\n title: \"Event Listing\",\n titleSource: \"heading\",\n description: \"Paginated list of all upcoming events\",\n component: \"event-listing.block\",\n fields: [\n ...sectionHeaderFields(\"All Events\"),\n layoutField,\n columnsField([\"2\", \"3\", \"4\"]),\n {\n id: \"eventsPerPage\",\n type: \"select\",\n label: \"Events per page\",\n description: \"Number of events to load at a time\",\n required: false,\n multiple: false,\n defaultValue: \"12\",\n options: [\n { value: \"6\", label: \"6 events\" },\n { value: \"12\", label: \"12 events\" },\n { value: \"24\", label: \"24 events\" },\n ],\n },\n {\n id: \"loadMoreText\",\n type: \"text\",\n label: \"Load more button text\",\n description: \"Text for the pagination button\",\n required: false,\n multiline: false,\n defaultValue: \"Load more events\",\n maxLength: 40,\n },\n ...cardStylingFields,\n ...eventDisplayFields,\n emptyStateField,\n ],\n slots: [],\n styleTokens: { background: \"surface\", typography: \"body\", spacing: \"md\" },\n behaviours: { supportsThemeSwitching: true, inlineEditing: false, animation: false, paletteHidden: false },\n category: \"interactive\",\n tags: [\"events\", \"listing\", \"paginated\", \"archive\", \"all-events\"],\n icon: \"List\",\n layout: [\n styledSection({\n children: sectionContainer([\n // Optional heading\n text(\n { as: \"h2\", size: \"2xl\", weight: \"bold\" },\n bind(\"content.heading\"),\n when(\"content.heading\")\n ),\n\n // Optional description\n richText(\n {},\n bind(\"content.description\"),\n when(\"content.description\")\n ),\n\n // Event listing component with pagination\n el(\"event-listing\", {\n events: { $bind: { from: \"data.events\" } },\n siteId: { $bind: { from: \"$root.siteId\" } },\n layout: { $bind: { from: \"content.layout\", fallback: \"grid\" } },\n columns: { $bind: { from: \"content.columns\", fallback: \"3\" } },\n eventsPerPage: { $bind: { from: \"content.eventsPerPage\", fallback: \"12\" } },\n loadMoreText: { $bind: { from: \"content.loadMoreText\", fallback: \"Load more events\" } },\n cardVariant: { $bind: { from: \"content.cardVariant\", fallback: \"default\" } },\n buttonVariant: { $bind: { from: \"content.buttonVariant\", fallback: \"primary\" } },\n buttonText: { $bind: { from: \"content.buttonText\", fallback: \"View event\" } },\n showVenue: { $bind: { from: \"content.showVenue\" } },\n showCapacity: { $bind: { from: \"content.showCapacity\" } },\n emptyMessage: { $bind: { from: \"content.emptyMessage\" } },\n }),\n ], {\n gap: \"lg\",\n }),\n spacing: \"spacious\",\n }),\n ],\n};\n\nexport type EventListingContent = {\n heading?: string | null;\n description?: unknown; // Rich text\n layout?: \"grid\" | \"stack\" | null;\n columns?: \"2\" | \"3\" | \"4\" | null;\n eventsPerPage?: \"6\" | \"12\" | \"24\" | null;\n loadMoreText?: string | null;\n cardVariant?: \"default\" | \"variant1\" | \"variant2\" | null;\n buttonVariant?: \"primary\" | \"secondary\" | \"outline\" | \"link\" | null;\n buttonText?: string | null;\n showVenue?: boolean | null;\n showCapacity?: boolean | null;\n emptyMessage?: string | null;\n};\n\nexport const eventListingBlockDefinition: SystemBlockDefinition<EventListingContent> = {\n manifest: eventListingManifest,\n dataSchemas: {\n events: publicEventsArraySchema.optional(),\n },\n dataLoaders: {\n events: {\n endpoint: 'listPublicEvents',\n params: {\n siteId: { $bind: { from: '$root.siteId' } },\n limit: { $bind: { from: 'content.eventsPerPage', fallback: '12' } },\n stage: { $bind: { from: '$root.previewStage', fallback: 'published' } },\n },\n mode: 'server',\n },\n },\n};\n","import type { BlockManifest } from \"../../manifest/schema\";\nimport type { SystemBlockDefinition } from \"../../registry\";\nimport { text, richText, el } from \"../../node/builder\";\nimport { bind, when } from \"../../node/builder\";\nimport { styledSection } from \"../../node/fragments/styledSection\";\nimport { sectionContainer } from \"../../node/fragments\";\nimport {\n publicEventsArraySchema,\n sectionHeaderFields,\n cardStylingFields,\n emptyStateField,\n} from \"./shared\";\n\n/**\n * Event Calendar Block\n *\n * Displays events in an interactive month or week calendar grid.\n * Users can navigate between time periods to view events.\n *\n * Features:\n * - Month and week calendar views\n * - Interactive navigation (prev/next/today)\n * - Pre-fetches 3 months for smooth navigation\n * - Configurable week start day\n * - Theme-aware styling\n */\nexport const eventCalendarManifest: BlockManifest = {\n name: \"block.event-calendar\",\n version: \"2.0.0\",\n title: \"Event Calendar\",\n titleSource: \"heading\",\n description: \"Interactive calendar showing events by month or week\",\n component: \"event-calendar.block\",\n fields: [\n ...sectionHeaderFields(\"Event Calendar\"),\n {\n id: \"calendarView\",\n type: \"select\",\n label: \"Default view\",\n description: \"Initial calendar view\",\n required: false,\n multiple: false,\n defaultValue: \"month\",\n options: [\n { value: \"month\", label: \"Month\" },\n { value: \"week\", label: \"Week\" },\n ],\n },\n {\n id: \"startOfWeek\",\n type: \"select\",\n label: \"Week starts on\",\n description: \"First day of the week\",\n required: false,\n multiple: false,\n defaultValue: \"monday\",\n options: [\n { value: \"sunday\", label: \"Sunday\" },\n { value: \"monday\", label: \"Monday\" },\n ],\n },\n ...cardStylingFields.filter(f => f.id === 'buttonVariant'), // Only button variant for calendar\n emptyStateField,\n ],\n slots: [],\n styleTokens: { background: \"surface\", typography: \"body\", spacing: \"md\" },\n behaviours: { supportsThemeSwitching: true, inlineEditing: false, animation: false, paletteHidden: false },\n category: \"interactive\",\n tags: [\"events\", \"calendar\", \"month\", \"week\", \"schedule\", \"interactive\"],\n icon: \"CalendarDays\",\n layout: [\n styledSection({\n children: sectionContainer([\n // Optional heading\n text(\n { as: \"h2\", size: \"2xl\", weight: \"bold\" },\n bind(\"content.heading\"),\n when(\"content.heading\")\n ),\n\n // Optional description\n richText(\n {},\n bind(\"content.description\"),\n when(\"content.description\")\n ),\n\n // Event calendar grid component\n el(\"event-calendar\", {\n events: { $bind: { from: \"data.events\" } },\n siteId: { $bind: { from: \"$root.siteId\" } },\n calendarView: { $bind: { from: \"content.calendarView\", fallback: \"month\" } },\n startOfWeek: { $bind: { from: \"content.startOfWeek\", fallback: \"monday\" } },\n buttonVariant: { $bind: { from: \"content.buttonVariant\", fallback: \"primary\" } },\n emptyMessage: { $bind: { from: \"content.emptyMessage\" } },\n }),\n ], {\n gap: \"lg\",\n }),\n spacing: \"spacious\",\n }),\n ],\n};\n\nexport type EventCalendarContent = {\n heading?: string | null;\n description?: unknown; // Rich text\n calendarView?: \"month\" | \"week\" | null;\n startOfWeek?: \"sunday\" | \"monday\" | null;\n buttonVariant?: \"primary\" | \"secondary\" | \"outline\" | \"link\" | null;\n emptyMessage?: string | null;\n};\n\nexport const eventCalendarBlockDefinition: SystemBlockDefinition<EventCalendarContent> = {\n manifest: eventCalendarManifest,\n dataSchemas: {\n events: publicEventsArraySchema.optional(),\n },\n dataLoaders: {\n events: {\n endpoint: 'listPublicEvents',\n params: {\n siteId: { $bind: { from: '$root.siteId' } },\n // Pre-fetch 3 months of events (server-side)\n // The client will use the same API to fetch more as user navigates\n limit: 100, // High limit for calendar view\n stage: { $bind: { from: '$root.previewStage', fallback: 'published' } },\n },\n mode: 'server',\n },\n },\n};\n","import { z } from \"zod\";\nimport { fieldSchema } from \"../manifest/schema\";\nimport type { BlockManifest, FieldDefinition } from \"../manifest/schema\";\nimport type { SystemBlockDefinition } from \"../registry\";\nimport { stack, text, bind, when, repeat, el } from \"../node/builder\";\nimport { styledSection, sectionContainer } from \"../node/fragments\";\nimport { createBlockManifest } from \"../defineBlock\";\nimport { textColorStyle } from \"../../theme/utils/colorStyles\";\n\n/**\n * Embed block - enables embedding content entries from any content type.\n *\n * This block is designed to be overridden by SDK sites. The default layout\n * is a simple placeholder that shows basic entry information. Sites should\n * use blockOverrides to provide custom renderers based on content.layout.\n *\n * Example SDK usage:\n * ```tsx\n * <Page\n * {...pageData}\n * blockOverrides={{\n * embed: EmbedRenderer,\n * }}\n * />\n * ```\n *\n * The EmbedRenderer receives:\n * - content: EmbedContent with heading, layout, contentType, etc.\n * - data: { entries: ContentEntry[] }\n * - theme: Theme tokens\n */\n\n// Additional fields for the embed block\nconst embedFields: FieldDefinition[] = [\n // Section heading\n fieldSchema.parse({\n id: \"heading\",\n type: \"text\",\n label: \"Heading\",\n description: \"Optional section title displayed above the content.\",\n required: false,\n maxLength: 120,\n }),\n fieldSchema.parse({\n id: \"subheading\",\n type: \"richText\",\n label: \"Subheading\",\n description: \"Optional section description below the heading.\",\n required: false,\n format: \"markdown\",\n ui: { variant: \"limited\" },\n }),\n\n // Content source\n fieldSchema.parse({\n id: \"contentType\",\n type: \"contentTypeSelect\",\n label: \"Content type\",\n description: \"Select the content type to embed.\",\n required: true,\n filter: \"all\",\n }),\n fieldSchema.parse({\n id: \"mode\",\n type: \"select\",\n label: \"Selection mode\",\n description: \"How to select which entries to display.\",\n required: true,\n defaultValue: \"query\",\n options: [\n { value: \"query\", label: \"Query (automatic)\" },\n { value: \"manual\", label: \"Manual (pick entries)\" },\n ],\n }),\n\n // Query mode options\n fieldSchema.parse({\n id: \"limit\",\n type: \"select\",\n label: \"Limit\",\n description: \"Maximum number of entries to display.\",\n defaultValue: \"10\",\n options: [\n { value: \"3\", label: \"3 entries\" },\n { value: \"6\", label: \"6 entries\" },\n { value: \"10\", label: \"10 entries\" },\n { value: \"20\", label: \"20 entries\" },\n { value: \"50\", label: \"50 entries\" },\n ],\n ui: {\n visibleWhen: { field: \"mode\", equals: \"query\" },\n },\n }),\n fieldSchema.parse({\n id: \"orderBy\",\n type: \"select\",\n label: \"Order by\",\n description: \"How to sort the entries.\",\n defaultValue: \"order\",\n options: [\n { value: \"order\", label: \"Custom order field\" },\n { value: \"newest\", label: \"Newest first\" },\n { value: \"oldest\", label: \"Oldest first\" },\n { value: \"title\", label: \"Title (A-Z)\" },\n ],\n ui: {\n visibleWhen: { field: \"mode\", equals: \"query\" },\n },\n }),\n\n // Manual mode options - entry references\n fieldSchema.parse({\n id: \"entries\",\n type: \"repeater\",\n label: \"Entries\",\n description: \"Select specific entries to display.\",\n required: false,\n itemLabel: \"Entry\",\n minItems: 1,\n maxItems: 20,\n schema: {\n fields: [\n {\n id: \"entryId\",\n type: \"entryPicker\",\n label: \"Entry\",\n description: \"Select a content entry to embed.\",\n required: true,\n ui: {\n contentTypeField: \"contentType\",\n },\n },\n ],\n },\n ui: {\n visibleWhen: { field: \"mode\", equals: \"manual\" },\n },\n }),\n\n // Layout selection - SDK sites can provide custom options via blockFieldOptions\n fieldSchema.parse({\n id: \"layout\",\n type: \"select\",\n label: \"Layout\",\n description: \"Select a layout style for displaying the embedded content.\",\n defaultValue: \"list\",\n options: [\n { value: \"list\", label: \"List\" },\n { value: \"grid\", label: \"Grid\" },\n { value: \"carousel\", label: \"Carousel\" },\n ],\n ui: {\n widget: \"sdkSelect\", // Use SDK-aware widget for site-specific options\n },\n }),\n\n // Empty state\n fieldSchema.parse({\n id: \"emptyMessage\",\n type: \"text\",\n label: \"Empty state message\",\n description: \"Message shown when no entries are available.\",\n defaultValue: \"No entries found.\",\n maxLength: 200,\n }),\n];\n\n// Default layout - a simple placeholder that sites should override\nconst embedLayout = styledSection({\n children: sectionContainer([\n // Heading\n text(\n {\n as: \"h2\",\n className: \"text-3xl font-bold\",\n style: textColorStyle(\"neutral-900\"),\n },\n bind(\"content.heading\"),\n when(\"content.heading\"),\n ),\n\n // Subheading\n el(\n \"richText\",\n {\n className: \"mt-2 text-lg\",\n style: textColorStyle(\"neutral-600\"),\n },\n undefined,\n bind(\"content.subheading\"),\n when(\"content.subheading\"),\n ),\n\n // Default entry rendering - a simple list\n // Sites should override this with custom layouts via blockOverrides\n // Outer stack provides gap between repeated entry cards\n stack(\n { gap: \"md\", className: \"mt-8\" },\n [\n // Entry card (repeated for each entry)\n stack(\n {\n gap: \"sm\",\n className: \"rounded-lg border border-neutral-200 bg-white p-4 shadow-sm\",\n },\n [\n text(\n {\n as: \"h3\",\n className: \"text-lg font-semibold\",\n style: textColorStyle(\"neutral-900\"),\n },\n bind(\"entry.title\"),\n ),\n text(\n {\n as: \"p\",\n className: \"text-sm\",\n style: textColorStyle(\"neutral-500\"),\n },\n bind(\"entry.slug\"),\n when(\"entry.slug\"),\n ),\n ],\n repeat(\"data.entries\", \"entry\"),\n ),\n ],\n when(\"data.entries\"),\n ),\n\n // Empty state\n stack(\n {\n gap: \"sm\",\n className: \"py-12 text-center\",\n },\n [\n text(\n {\n as: \"p\",\n className: \"text-base\",\n style: textColorStyle(\"neutral-400\"),\n },\n bind(\"content.emptyMessage\", { fallback: \"No entries found.\" }),\n ),\n ],\n when(\"data.entries\", { not: true }),\n ),\n ]),\n spacing: \"comfortable\",\n});\n\nexport const embedManifest: BlockManifest = createBlockManifest({\n id: \"block.embed\",\n title: \"Embed Content\",\n category: \"content\",\n titleSource: \"heading\",\n\n additionalFields: embedFields,\n layout: embedLayout,\n\n description:\n \"Embed content entries from any content type. Sites provide custom layouts via block overrides.\",\n tags: [\"embed\", \"content\", \"dynamic\", \"collection\", \"entries\", \"listing\"],\n icon: \"LayoutList\",\n styleTokens: {\n spacing: \"lg\",\n },\n});\n\nexport type EmbedContent = {\n // Section heading\n heading?: string | null;\n subheading?: unknown; // TipTap richText\n\n // Content source\n contentType: string;\n mode: \"query\" | \"manual\";\n\n // Query mode options\n limit?: string | null;\n orderBy?: \"order\" | \"newest\" | \"oldest\" | \"title\" | null;\n\n // Manual mode options\n entries?: Array<{ entryId: string }> | null;\n\n // Layout\n layout?: string | null;\n\n // Empty state\n emptyMessage?: string | null;\n};\n\nexport type EmbedEntry = {\n id: string;\n title: string;\n slug?: string | null;\n content?: Record<string, unknown>;\n publishedAt?: string | null;\n};\n\nconst embedEntrySchema = z.object({\n id: z.string(),\n title: z.string(),\n slug: z.string().nullable().optional(),\n content: z.record(z.string(), z.unknown()).optional(),\n publishedAt: z.string().nullable().optional(),\n});\n\nexport const embedBlockDefinition: SystemBlockDefinition<EmbedContent> = {\n manifest: embedManifest,\n dataSchemas: {\n entries: z.array(embedEntrySchema).optional(),\n },\n dataLoaders: {\n entries: {\n endpoint: \"listPublishedEntries\",\n params: {\n type: { $bind: { from: \"contentType\" } },\n siteId: { $bind: { from: \"$root.siteId\" } },\n limit: { $bind: { from: \"limit\", fallback: \"10\" } },\n orderBy: { $bind: { from: \"orderBy\", fallback: \"order\" } },\n stage: { $bind: { from: \"$root.previewStage\", fallback: \"published\" } },\n // Manual mode entry IDs - loader should handle this\n entryIds: { $bind: { from: \"entries\" } },\n mode: { $bind: { from: \"mode\" } },\n },\n mode: \"server\",\n },\n },\n};\n","import { registerBlockDefinition, type SystemBlockDefinition } from \"../registry\";\nimport { heroBlockDefinition } from \"./hero\";\nimport { bodyTextBlockDefinition } from \"./body-text\";\nimport { blogPostBlockDefinition } from \"./blog-post\";\nimport { blogPlaceholderBlockDefinition } from \"./blog-placeholder\";\nimport { blogListingBlockDefinition } from \"./blog-listing\";\nimport { ctaFullBlockDefinition } from \"./cta-full\";\nimport { formBlockDefinition } from \"./form\";\nimport { faqBlockDefinition } from \"./faq\";\nimport { siteHeaderBlockDefinition } from \"./site-header\";\nimport { siteFooterBlockDefinition } from \"./site-footer\";\nimport { testimonialsBlockDefinition } from \"./testimonials\";\nimport { columnsBlockDefinition } from \"./columns\";\nimport { appointmentBookingBlockDefinition } from \"./appointment-booking\";\nimport { eventRegistrationBlockDefinition } from \"./event-registration\";\nimport {\n eventSpotlightBlockDefinition,\n eventListingBlockDefinition,\n eventCalendarBlockDefinition,\n} from \"./events\";\nimport { embedBlockDefinition } from \"./embed\";\n\nexport const systemBlockDefinitions: SystemBlockDefinition<any>[] = [\n heroBlockDefinition,\n bodyTextBlockDefinition,\n blogPostBlockDefinition,\n blogPlaceholderBlockDefinition,\n blogListingBlockDefinition,\n ctaFullBlockDefinition,\n formBlockDefinition,\n faqBlockDefinition,\n siteHeaderBlockDefinition,\n siteFooterBlockDefinition,\n testimonialsBlockDefinition,\n columnsBlockDefinition,\n appointmentBookingBlockDefinition,\n eventRegistrationBlockDefinition,\n // Event display blocks (3 specialized blocks)\n eventSpotlightBlockDefinition,\n eventListingBlockDefinition,\n eventCalendarBlockDefinition,\n // Content embedding\n embedBlockDefinition,\n];\n\nlet defaultsRegistered = false;\n\nexport function ensureSystemBlockDefinitionsRegistered(): void {\n if (defaultsRegistered) {\n return;\n }\n defaultsRegistered = true;\n for (const definition of systemBlockDefinitions) {\n registerBlockDefinition(definition);\n }\n}\n\nexport function resetSystemBlockDefinitionRegistration(): void {\n defaultsRegistered = false;\n}\n\nexport * from \"./hero\";\nexport * from \"./body-text\";\nexport * from \"./blog-post\";\nexport * from \"./blog-placeholder\";\nexport * from \"./blog-listing\";\nexport * from \"./cta-full\";\nexport * from \"./form\";\nexport * from \"./faq\";\nexport * from \"./site-header\";\nexport * from \"./site-footer\";\nexport * from \"./testimonials\";\nexport * from \"./columns\";\nexport * from \"./appointment-booking\";\nexport * from \"./event-registration\";\nexport * from \"./events\";\nexport * from \"./embed\";\n","import type { ComponentType, ReactNode } from \"react\";\nimport type { z } from \"zod\";\n\nimport type { BlockManifest } from \"./manifest\";\nimport { registerManifest } from \"./manifest\";\nimport { ensureSystemBlockDefinitionsRegistered, resetSystemBlockDefinitionRegistration } from \"./blocks\";\nimport type { ResolverContext } from \"./runtime\";\nimport type { ThemeTokens } from \"./theme\";\nimport type { TransformRegistry } from \"./transforms\";\nimport type { Theme } from \"../theme/schema\";\n\nexport type BlockRenderOptions = Omit<ResolverContext, \"viewModel\">;\n\n// Unified render options used by helpers (prefer this over per-block options)\nexport type RenderOptions = Partial<BlockRenderOptions> & {\n viewModelOverrides?: Record<string, unknown>;\n data?: Record<string, unknown>;\n themeConfig?: Theme;\n};\n\nexport type SystemBlockRenderer<TContent = Record<string, unknown>> = (\n content: TContent,\n options?: RenderOptions\n) => ReactNode;\n\n// Legacy loader cache types removed with new registry adoption\n\nexport type SystemBlockComponentProps<\n TContent = Record<string, unknown>\n> = {\n content: TContent;\n theme?: ThemeTokens;\n themeConfig?: Theme;\n registry?: ResolverContext[\"registry\"];\n transforms?: TransformRegistry;\n viewModelOverrides?: Record<string, unknown>;\n data?: Record<string, unknown>;\n // Optional base path for binding-derived editor paths, e.g., `blocks.<blockId>.`\n pathBase?: string;\n // Optional block metadata for editor-aware registries\n blockId?: string | null;\n blockKind?: string;\n // Optional template bindings for reverse field mapping (entry editing)\n blockBindings?: Record<string, unknown>;\n // Optional fragment registry for fragment renderer nodes\n fragmentRegistry?: ResolverContext[\"fragmentRegistry\"];\n};\n\nexport type SystemBlockComponent<\n TContent = Record<string, unknown>\n> = ComponentType<\n SystemBlockComponentProps<TContent>\n>;\n\nexport type BlockDataLoader = {\n endpoint: string;\n params: Record<string, unknown>;\n mode?: 'server' | 'client';\n};\n\nexport type SystemBlockDefinition<\n TContent = Record<string, unknown>\n> = {\n manifest: BlockManifest;\n normalizeContent?: (content: unknown) => TContent;\n dataSchemas?: Record<string, z.ZodTypeAny>;\n dataLoaders?: Record<string, BlockDataLoader>;\n};\n\ntype BlockDefinitionMap = Map<string, SystemBlockDefinition<any>>;\n\nexport type BlockDescriptor = {\n name: string;\n title: string;\n description?: string;\n category?: string;\n contentTypes?: string[];\n tags?: string[];\n icon?: string;\n definition: SystemBlockDefinition<any>;\n /** Where this block comes from: 'system' for built-in blocks, 'sdk' for custom SDK blocks */\n source?: 'system' | 'sdk';\n};\n\nconst REGISTRY_SYMBOL = Symbol.for(\"@riverbankcms/blocks/system/definitions\");\n\ninterface BlockRegistryGlobal extends Record<PropertyKey, unknown> {\n [REGISTRY_SYMBOL]?: BlockDefinitionMap;\n}\n\nconst globalScope = globalThis as BlockRegistryGlobal;\n\nif (!globalScope[REGISTRY_SYMBOL]) {\n globalScope[REGISTRY_SYMBOL] = new Map();\n}\n\nconst blockStore = globalScope[REGISTRY_SYMBOL]!;\n\nfunction ensureDefaults(): void {\n ensureSystemBlockDefinitionsRegistered();\n}\n\nexport function registerBlockDefinition<TContent>(\n definition: SystemBlockDefinition<TContent>,\n): SystemBlockDefinition<TContent> {\n registerManifest(definition.manifest);\n blockStore.set(definition.manifest.name, definition);\n return definition;\n}\n\nexport function getBlockDefinition(name: string): SystemBlockDefinition<any> | undefined {\n ensureDefaults();\n return blockStore.get(name);\n}\n\nexport function hasBlockDefinition(name: string): boolean {\n ensureDefaults();\n return blockStore.has(name);\n}\n\nexport function listBlockDefinitions(): SystemBlockDefinition<any>[] {\n ensureDefaults();\n return Array.from(blockStore.values());\n}\n\nexport function listBlockDescriptors(): BlockDescriptor[] {\n return listBlockDefinitions()\n .filter((d) => d.manifest.behaviours?.paletteHidden !== true)\n .map((definition) => ({\n name: definition.manifest.name,\n title: definition.manifest.title,\n description: definition.manifest.description,\n category: definition.manifest.category,\n contentTypes: definition.manifest.contentTypes,\n tags: definition.manifest.tags,\n icon: definition.manifest.icon,\n definition,\n source: 'system' as const,\n }));\n}\n\nexport function clearBlockDefinitions(): void {\n const env = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env?.NODE_ENV;\n if (env === \"production\") {\n return;\n }\n blockStore.clear();\n resetSystemBlockDefinitionRegistration();\n}\n","import { bindingSchema } from \"../node\";\n\nconst shouldLogWarnings = isNonProductionEnv();\n\nexport function resolveParamsBindings(\n input: unknown,\n vm: { content: Record<string, unknown>; $root?: Record<string, unknown> },\n meta?: { blockKind?: string },\n): unknown {\n if (input === null || typeof input !== \"object\") return input;\n if (Array.isArray(input)) return input.map((v) => resolveParamsBindings(v, vm, meta));\n\n // Binding object: { $bind: { from: '...', fallback: ... } }\n const maybeBind = (input as any).$bind;\n if (maybeBind && typeof maybeBind === \"object\") {\n try {\n const binding = bindingSchema.parse(maybeBind);\n const value = resolveBinding(binding.from, vm);\n // Return fallback if value is undefined/null\n if (value === undefined || value === null) {\n return binding.fallback;\n }\n return value;\n } catch (err) {\n if (shouldLogWarnings) {\n console.warn(\n `bindings: failed to parse loader param binding for block \"${meta?.blockKind ?? 'unknown'}\"`,\n err,\n );\n }\n return undefined;\n }\n }\n\n // Recurse object\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(input as Record<string, unknown>)) {\n out[k] = resolveParamsBindings(v, vm, meta);\n }\n return out;\n}\n\nexport function resolveBinding(\n path: string,\n vm: { content: Record<string, unknown>; $root?: Record<string, unknown> },\n): unknown {\n const segments = splitPath(path);\n if (!segments.length) return undefined;\n const [first, ...rest] = segments;\n let source: unknown = vm;\n if (first === \"$root\") {\n source = vm;\n return readFromSource(source as any, [first, ...rest]);\n }\n if (first === \"content\") {\n source = vm.content;\n return readFromSource(source, rest);\n }\n // Fallback: look in content first, then vm\n const contentResult = readFromSource(vm.content, segments);\n if (contentResult !== undefined) {\n return contentResult;\n }\n return readFromSource(vm as any, segments);\n}\n\nexport function splitPath(path: string): Array<string | number> {\n const PATH_SEPARATOR_REGEX = /\\./g;\n const BRACKET_ACCESS_REGEX = /\\[(?<token>[^\\]]+)\\]/g;\n const segments: Array<string | number> = [];\n const parts = path.split(PATH_SEPARATOR_REGEX);\n for (const raw of parts) {\n if (!raw) continue;\n const baseMatch = raw.match(/^([^\\[]+)/);\n if (baseMatch) {\n segments.push(baseMatch[1]);\n }\n const bracketMatches = raw.matchAll(BRACKET_ACCESS_REGEX);\n for (const match of bracketMatches) {\n const token = match.groups?.token ?? \"\";\n if (token.startsWith(\"\\\"\") || token.startsWith(\"'\")) {\n segments.push(token.slice(1, -1));\n } else if (/^\\d+$/.test(token)) {\n segments.push(Number(token));\n } else {\n segments.push(token);\n }\n }\n if (!baseMatch && !raw.includes(\"[\")) {\n segments.push(raw);\n }\n }\n return segments;\n}\n\nexport function readFromSource(source: unknown, segments: Array<string | number>): unknown {\n return segments.reduce<unknown>((current, segment) => {\n if (current === undefined || current === null) return undefined;\n if (typeof segment === \"number\") {\n if (Array.isArray(current)) return current[segment];\n return undefined;\n }\n if (\n typeof current === \"object\" &&\n current !== null &&\n segment in (current as Record<string, unknown>)\n ) {\n return (current as Record<string, unknown>)[segment];\n }\n return undefined;\n }, source);\n}\n\nfunction isNonProductionEnv(): boolean {\n if (typeof globalThis === \"undefined\") {\n return true;\n }\n const maybeProcess = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process;\n const nodeEnv = maybeProcess?.env?.NODE_ENV;\n return nodeEnv !== \"production\";\n}\n\n","/**\n * Utility functions for block data loading.\n * Pure functions with no side effects.\n */\n\nimport type { BlockDataLoader } from '../registry';\nimport type { DataLoaderEntry } from './types';\n\n/**\n * Normalize data loaders from block definition\n */\nexport function normalizeDataLoaders(\n def: { dataLoaders?: Record<string, BlockDataLoader> } | null\n): DataLoaderEntry[] {\n if (!def?.dataLoaders) {\n return [];\n }\n return Object.entries(def.dataLoaders).map(([key, loader]) => ({ key, loader }));\n}\n\n/**\n * Normalize block content for data loading.\n * Priority: draftContent > content > publishedContent\n */\nexport function normalizeContent(block: {\n content?: unknown;\n draftContent?: unknown;\n publishedContent?: unknown;\n}): Record<string, unknown> {\n const source = block.draftContent ?? block.content ?? block.publishedContent ?? {};\n if (!isRecord(source)) return {};\n\n // Unwrap data wrapper if present and valid\n if ('data' in source) {\n const data = (source as { data?: unknown }).data;\n if (isRecord(data)) {\n return data;\n }\n // If data is null/undefined/non-record, treat as empty\n if (data === null || data === undefined) {\n return {};\n }\n }\n\n return source as Record<string, unknown>;\n}\n\n/**\n * Normalize params for API calls.\n * Converts all values to strings.\n */\nexport function normalizeParams(input: unknown): Record<string, string> {\n if (!input || typeof input !== 'object') return {};\n const entries = Object.entries(input as Record<string, unknown>).map(([key, value]) => [\n key,\n coerceToString(value),\n ]);\n return Object.fromEntries(entries);\n}\n\n/**\n * Coerce value to string for API params\n */\nexport function coerceToString(value: unknown): string {\n if (value === null || value === undefined) return '';\n if (Array.isArray(value)) return value.map(coerceToString).join(',');\n return String(value);\n}\n\n/**\n * Extract data from API response.\n * Unwraps common response wrappers: { data }, { form }, { entries }, { services }\n *\n * Note: We check that properties are NOT functions to avoid returning\n * built-in methods like Array.prototype.entries\n */\nexport function coercePayload(payload: unknown): unknown {\n if (payload && typeof payload === 'object' && !Array.isArray(payload)) {\n const record = payload as Record<string, unknown>;\n if ('data' in record && typeof record.data !== 'function') return record.data;\n if ('form' in record && typeof record.form !== 'function') return record.form;\n if ('entries' in record && typeof record.entries !== 'function') return record.entries;\n if ('services' in record && typeof record.services !== 'function') return record.services;\n }\n return payload;\n}\n\n/**\n * Type guard for record objects\n */\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n","/**\n * Core block data prefetching logic (framework-agnostic).\n *\n * This module provides the shared implementation for prefetching block data loaders.\n * It works with any API client by accepting it as a parameter (dependency injection).\n *\n * Usage:\n * - Frontend: provide internal API client\n * - SDK: provide SDK client with endpoint mapping\n */\n\nimport { getBlockDefinition, type BlockDataLoader } from '../registry';\nimport { resolveParamsBindings } from '../runtime/bindings';\nimport type { PageOutline } from '../../structure/schema';\nimport type { ApiClient, DataLoaderEntry, PrefetchContext, ResolvedBlockData } from './types';\nimport {\n normalizeDataLoaders,\n normalizeContent,\n normalizeParams,\n coercePayload,\n} from './utils';\n\nexport type PrefetchBlockDataOptions = {\n /**\n * API client function that makes the actual requests.\n * This allows the caller to provide their own client (internal or SDK).\n */\n apiClient: ApiClient;\n\n /**\n * Validation function to check if endpoint is valid.\n * Different environments have different endpoint registries.\n */\n isValidEndpoint?: (endpoint: string) => boolean;\n\n /**\n * Error handler for failed data fetches.\n * By default, errors are logged and suppressed (data loading is best-effort).\n */\n onError?: (error: unknown, context: { block: string; loader: string }) => void;\n\n /**\n * Custom block data loader lookup.\n *\n * Called for blocks that aren't found in the system registry.\n * Returns data loaders for SDK custom blocks.\n *\n * @param blockKind - The block's kind (e.g., 'custom.team-member')\n * @returns Record of data loaders, or undefined if not a custom block\n */\n getCustomBlockLoaders?: (blockKind: string) => Record<string, BlockDataLoader> | undefined;\n};\n\n/**\n * Core data prefetching logic (framework-agnostic).\n *\n * This function is shared between frontend and SDK implementations.\n * It handles:\n * - Extracting data loaders from block definitions\n * - Resolving loader params with block content\n * - Executing server-mode loaders in parallel\n * - Organizing results by block ID and loader key\n *\n * @example\n * ```typescript\n * const resolved = await prefetchBlockData(page, context, {\n * apiClient: async ({ endpoint, params }) => {\n * return await myApiClient({ endpoint, params });\n * },\n * isValidEndpoint: (endpoint) => endpoint in API_ENDPOINTS,\n * });\n * ```\n */\nexport async function prefetchBlockData(\n page: PageOutline,\n context: PrefetchContext,\n options: PrefetchBlockDataOptions\n): Promise<ResolvedBlockData> {\n const { apiClient, isValidEndpoint, onError, getCustomBlockLoaders } = options;\n\n const results: ResolvedBlockData = {};\n const tasks: Array<Promise<void>> = [];\n\n for (const block of page.blocks) {\n const blockId = block.id;\n if (!blockId) continue;\n\n // Get loaders from system block definition OR custom block lookup\n let loaders: DataLoaderEntry[];\n const def = getBlockDefinition(block.kind);\n\n if (def) {\n // System block - use normalizeDataLoaders\n loaders = normalizeDataLoaders(def);\n } else if (getCustomBlockLoaders) {\n // Custom block - check callback\n const customLoaders = getCustomBlockLoaders(block.kind);\n loaders = customLoaders\n ? Object.entries(customLoaders).map(([key, loader]) => ({ key, loader }))\n : [];\n } else {\n loaders = [];\n }\n\n if (loaders.length === 0) continue;\n\n const root = {\n siteId: context.siteId,\n pageId: context.pageId,\n previewStage: context.previewStage,\n };\n const normalizedContent = normalizeContent(block as { content?: unknown; draftContent?: unknown; publishedContent?: unknown });\n const vm = { content: normalizedContent, $root: root };\n\n for (const { key, loader } of loaders) {\n // Skip client-mode loaders (they run in browser)\n if (loader.mode === 'client') {\n continue;\n }\n\n // Resolve params using block content\n const rawParams = resolveParamsBindings(loader.params, vm, {\n blockKind: block.kind,\n });\n const params = normalizeParams(rawParams);\n\n const endpoint = loader.endpoint;\n\n // Validate endpoint if validator provided\n if (isValidEndpoint && !isValidEndpoint(endpoint)) {\n continue;\n }\n\n tasks.push(\n (async () => {\n try {\n const payload = await apiClient({ endpoint, params });\n const data = coercePayload(payload);\n\n if (!results[blockId]) {\n results[blockId] = {};\n }\n results[blockId]![key] = data;\n } catch (error) {\n // Call error handler if provided, otherwise fail silently\n // Data loading is best-effort - failures shouldn't break the page\n if (onError) {\n onError(error, { block: block.kind, loader: key });\n }\n }\n })()\n );\n }\n }\n\n if (tasks.length > 0) {\n await Promise.all(tasks);\n }\n\n return results;\n}\n","/**\n * SDK wrapper for block data prefetching.\n * Uses the shared core implementation from @riverbankcms/blocks with the SDK client.\n */\n\nimport type { BlockDataLoader, PageOutline, SdkCustomBlock } from '@riverbankcms/blocks';\nimport { prefetchBlockData as prefetchBlockDataCore } from '@riverbankcms/blocks/system/data';\nimport type { PrefetchContext, ResolvedBlockData } from '@riverbankcms/blocks/system/data';\nimport type { RiverbankClient } from '../client/types';\n\nexport type { PrefetchContext, ResolvedBlockData };\n\n/**\n * Supported loader endpoints for SDK data fetching.\n * Only these endpoints can be used in block data loaders when using the SDK.\n *\n * This is the SINGLE SOURCE OF TRUTH for whitelisted endpoints.\n * - Zod validation schema derives from this array\n * - TypeScript types derive from this array\n * - Runtime validation uses this array\n */\nexport const SUPPORTED_LOADER_ENDPOINTS = [\n 'listPublishedEntries',\n 'getPublishedEntryPreview',\n 'listPublicEvents',\n 'getPublicFormById',\n 'getPublicBookingServices',\n] as const;\n\n/**\n * Union type of all supported loader endpoints.\n * Derived from SUPPORTED_LOADER_ENDPOINTS array.\n */\nexport type SupportedLoaderEndpoint = typeof SUPPORTED_LOADER_ENDPOINTS[number];\n\n/**\n * Options for SDK block data prefetching.\n */\nexport type SdkPrefetchOptions = {\n /**\n * SDK custom blocks from site config.\n * Used to look up data loaders for custom.* blocks.\n */\n customBlocks?: SdkCustomBlock[];\n};\n\n/**\n * Prefetch block data for SDK-based applications.\n * Maps loader endpoints to corresponding SDK client methods.\n *\n * Supports both system blocks and SDK custom blocks with data loaders.\n *\n * @example\n * ```typescript\n * import { createRiverbankClient } from '@riverbankcms/sdk';\n * import { prefetchBlockData } from '@riverbankcms/sdk/data';\n *\n * const client = createRiverbankClient({ apiKey, baseUrl });\n * const page = await client.getPage({ siteId, path: '/' });\n *\n * // Basic usage (system blocks only)\n * const blockData = await prefetchBlockData(page.outline, {\n * siteId: page.siteId,\n * pageId: page.id,\n * }, client);\n *\n * // With custom blocks from SDK config\n * const blockData = await prefetchBlockData(page.outline, context, client, {\n * customBlocks: site.sdkConfig?.customBlocks,\n * });\n * ```\n */\nexport async function prefetchBlockData(\n page: PageOutline,\n context: PrefetchContext,\n client: RiverbankClient,\n options?: SdkPrefetchOptions,\n): Promise<ResolvedBlockData> {\n const { customBlocks } = options ?? {};\n\n // Build lookup map for custom block loaders\n // Key is string (blockKind from page) matching block.id (custom.xxx)\n const customBlockMap = new Map<string, SdkCustomBlock>(\n (customBlocks ?? []).map((block) => [block.id as string, block])\n );\n\n return prefetchBlockDataCore(page, context, {\n apiClient: async ({ endpoint, params }) => {\n // Only support whitelisted loader endpoints\n if (!isSupportedEndpoint(endpoint)) {\n throw new Error(\n `Unsupported loader endpoint: ${endpoint}. ` +\n `SDK only supports: ${SUPPORTED_LOADER_ENDPOINTS.join(', ')}`\n );\n }\n\n // Map endpoint to SDK client method\n switch (endpoint) {\n case 'listPublishedEntries': {\n const { siteId, type, orderBy, limit, stage, mode, entryIds } = params ?? {};\n if (!siteId || !type) {\n throw new Error('listPublishedEntries requires siteId and type params');\n }\n\n // Parse limit if provided (can come as string from bindings)\n const parsedLimit = typeof limit === 'string'\n ? Number.parseInt(limit, 10)\n : typeof limit === 'number'\n ? limit\n : undefined;\n\n // Map orderBy to order param (matching embed block field values)\n const order = (orderBy === 'newest' || orderBy === 'oldest' || orderBy === 'title' || orderBy === 'order')\n ? orderBy as 'newest' | 'oldest' | 'title' | 'order'\n : undefined;\n\n // Extract entry IDs for manual mode\n // entryIds comes from binding to entries field which contains { entryId: \"uuid\" } objects\n let parsedEntryIds: string[] | undefined;\n if (mode === 'manual' && Array.isArray(entryIds)) {\n parsedEntryIds = entryIds\n .map((item: unknown) => {\n if (typeof item === 'object' && item !== null && 'entryId' in item) {\n return (item as { entryId: string }).entryId;\n }\n // Also support direct string IDs\n if (typeof item === 'string') {\n return item;\n }\n return null;\n })\n .filter((id): id is string => id !== null);\n }\n\n return await client.getEntries({\n siteId,\n contentType: type,\n limit: parsedLimit,\n order,\n preview: stage === 'preview',\n // Manual mode - pass entry IDs for hydration\n mode: mode === 'manual' ? 'manual' : undefined,\n entryIds: parsedEntryIds,\n });\n }\n\n case 'getPublishedEntryPreview': {\n const { siteId, type, slug } = params ?? {};\n if (!siteId || !type || !slug) {\n throw new Error('getPublishedEntryPreview requires siteId, type, and slug params');\n }\n return await client.getEntry({ siteId, contentType: type, slug });\n }\n case 'listPublicEvents': {\n const { siteId, limit, from, to, stage } = params ?? {};\n if (!siteId) {\n throw new Error('listPublicEvents requires siteId param');\n }\n const parsedLimit =\n typeof limit === 'string'\n ? Number.parseInt(limit, 10)\n : typeof limit === 'number'\n ? limit\n : undefined;\n return await client.listPublicEvents({ siteId, limit: parsedLimit, from, to, stage });\n }\n case 'getPublicFormById': {\n const { formId } = params ?? {};\n if (!formId) {\n throw new Error('getPublicFormById requires formId param');\n }\n return await client.getPublicFormById({ formId });\n }\n case 'getPublicBookingServices': {\n const { siteId, ids } = params ?? {};\n if (!siteId) {\n throw new Error('getPublicBookingServices requires siteId param');\n }\n return await client.getPublicBookingServices({ siteId, ids });\n }\n\n default: {\n // TypeScript should never reach here due to isSupportedEndpoint check\n const _exhaustive: never = endpoint;\n throw new Error(`Unhandled endpoint: ${_exhaustive}`);\n }\n }\n },\n isValidEndpoint: isSupportedEndpoint,\n onError: (error, { block, loader }) => {\n console.warn('[prefetchBlockData] failed to prefetch block data', {\n block,\n loader,\n error,\n });\n },\n // Provide custom block loader lookup for SDK custom blocks\n getCustomBlockLoaders: (blockKind): Record<string, BlockDataLoader> | undefined => {\n const customBlock = customBlockMap.get(blockKind);\n if (!customBlock?.dataLoaders) return undefined;\n\n // Convert SdkConfigLoader to BlockDataLoader\n // SdkConfigLoader.endpoint is SdkLoaderEndpoint (string union) -> string\n // SdkConfigLoader.params is Record<string, LoaderParamValue> -> Record<string, unknown>\n // Both are structurally compatible via covariance\n const loaders: Record<string, BlockDataLoader> = {};\n for (const [key, loader] of Object.entries(customBlock.dataLoaders)) {\n loaders[key] = {\n endpoint: loader.endpoint,\n params: loader.params,\n mode: loader.mode,\n };\n }\n return loaders;\n },\n });\n}\n\n/**\n * Type guard for supported loader endpoints\n */\nfunction isSupportedEndpoint(endpoint: string): endpoint is SupportedLoaderEndpoint {\n return SUPPORTED_LOADER_ENDPOINTS.includes(endpoint as SupportedLoaderEndpoint);\n}\n","/**\n * Client-side React hook to fetch content (page or entry) by path.\n *\n * Use this in client components for dynamic routing where a path\n * could resolve to either a page or content entry.\n */\n\nimport { useState, useEffect } from 'react';\nimport type { Theme } from '@riverbankcms/blocks';\nimport type { RiverbankClient, PageResponse } from '../../client/types';\nimport type { PageProps } from '../components/Page';\nimport { prefetchBlockData } from '../../data/prefetchBlockData';\nimport type { ResolvedBlockData } from '../../data/prefetchBlockData';\nimport type { ContentEntryData } from '../helpers/loadContent';\n\nexport type UseContentParams = {\n client: RiverbankClient;\n siteId: string;\n path: string;\n /**\n * If true, fetches draft/unpublished content instead of published content.\n * This affects both pages and entries.\n * Requires API key with site access.\n *\n * @default false\n */\n preview?: boolean;\n};\n\n/**\n * Loading state\n */\ntype LoadingState = {\n loading: true;\n error: null;\n type: null;\n page: null;\n entry: null;\n theme: null;\n siteId: string;\n resolvedData: null;\n};\n\n/**\n * Error state\n */\ntype ErrorState = {\n loading: false;\n error: Error;\n type: null;\n page: null;\n entry: null;\n theme: null;\n siteId: string;\n resolvedData: null;\n};\n\n/**\n * Success state for page content\n */\ntype PageSuccessState = {\n loading: false;\n error: null;\n type: 'page';\n page: PageProps['page'];\n entry: null;\n theme: Theme;\n siteId: string;\n resolvedData: ResolvedBlockData;\n};\n\n/**\n * Success state for entry content\n */\ntype EntrySuccessState = {\n loading: false;\n error: null;\n type: 'entry';\n page: null;\n entry: ContentEntryData;\n theme: Theme;\n siteId: string;\n resolvedData: null;\n};\n\nexport type UseContentResult = LoadingState | ErrorState | PageSuccessState | EntrySuccessState;\n\n/**\n * Type guard to check if result is loading\n */\nexport function isContentLoading(result: UseContentResult): result is LoadingState {\n return result.loading === true;\n}\n\n/**\n * Type guard to check if result has an error\n */\nexport function isContentError(result: UseContentResult): result is ErrorState {\n return result.loading === false && result.error !== null;\n}\n\n/**\n * Type guard to check if result is a page\n */\nexport function isPageContentResult(result: UseContentResult): result is PageSuccessState {\n return result.loading === false && result.error === null && result.type === 'page';\n}\n\n/**\n * Type guard to check if result is an entry\n */\nexport function isEntryContentResult(result: UseContentResult): result is EntrySuccessState {\n return result.loading === false && result.error === null && result.type === 'entry';\n}\n\n/**\n * Client-side React hook to fetch content by path.\n *\n * Returns a discriminated union with loading/error states, and either\n * page data (ready for `<Page>` component) or raw entry data (for custom rendering).\n *\n * IMPORTANT: The client object should be stable across renders to avoid\n * unnecessary re-fetches. Create it outside your component or use useMemo.\n *\n * @example Dynamic routing with both pages and entries\n * ```tsx\n * \"use client\";\n *\n * import { useContent, Page, isPageContentResult } from '@riverbankcms/sdk/client';\n *\n * function DynamicPage({ path }: { path: string }) {\n * const content = useContent({ client, siteId: 'site-123', path });\n *\n * if (content.loading) return <div>Loading...</div>;\n * if (content.error) return <div>Error: {content.error.message}</div>;\n *\n * if (isPageContentResult(content)) {\n * return <Page page={content.page} theme={content.theme} siteId={content.siteId} resolvedData={content.resolvedData} />;\n * }\n *\n * // Render entry with custom UI\n * return (\n * <article>\n * <h1>{content.entry.title}</h1>\n * <div>{content.entry.content.body}</div>\n * </article>\n * );\n * }\n * ```\n *\n * @example Entry-specific rendering based on content type\n * ```tsx\n * const content = useContent({ client, siteId, path });\n *\n * if (content.loading) return <Spinner />;\n * if (content.error) return <Error error={content.error} />;\n *\n * if (content.type === 'entry') {\n * switch (content.entry.type) {\n * case 'blog-post':\n * return <BlogPost entry={content.entry} theme={content.theme} />;\n * case 'product':\n * return <ProductPage entry={content.entry} theme={content.theme} />;\n * }\n * }\n *\n * return <Page {...content} />;\n * ```\n */\nexport function useContent(params: UseContentParams): UseContentResult {\n const { client, siteId, path, preview = false } = params;\n\n const [result, setResult] = useState<UseContentResult>({\n loading: true,\n error: null,\n type: null,\n page: null,\n entry: null,\n theme: null,\n siteId,\n resolvedData: null,\n });\n\n useEffect(() => {\n let cancelled = false;\n\n async function fetchContent() {\n try {\n // Fetch site and content in parallel\n const [site, contentResponse] = await Promise.all([\n client.getSite({ id: siteId }),\n client.getPage({ siteId, path, preview }),\n ]);\n\n // If component unmounted, don't update state\n if (cancelled) return;\n\n // Check if response is an entry\n if (isEntryResponse(contentResponse)) {\n const entryData = contentResponse.entry;\n\n const entry: ContentEntryData = {\n id: entryData.id,\n type: entryData.type,\n title: entryData.title,\n slug: entryData.slug,\n path: entryData.path,\n status: entryData.status,\n publishAt: entryData.publishAt,\n content: preview\n ? (entryData.draftContent ?? entryData.content)\n : entryData.content,\n metaTitle: preview\n ? (entryData.draftMetaTitle ?? entryData.metaTitle)\n : entryData.metaTitle,\n metaDescription: preview\n ? (entryData.draftMetaDescription ?? entryData.metaDescription)\n : entryData.metaDescription,\n createdAt: entryData.createdAt,\n updatedAt: entryData.updatedAt,\n };\n\n setResult({\n loading: false,\n error: null,\n type: 'entry',\n page: null,\n entry,\n theme: site.theme,\n siteId,\n resolvedData: null,\n });\n return;\n }\n\n // Handle page response\n const { page: pageData } = contentResponse;\n\n // Convert API response blocks to PageOutline format\n const blocks = pageData.blocks.map((block) => {\n if (!block || typeof block !== 'object') {\n throw new Error('Invalid block format in API response');\n }\n if (typeof block.id !== 'string' && block.id !== null) {\n throw new Error(`Invalid block id: expected string or null, got ${typeof block.id}`);\n }\n if (typeof block.kind !== 'string') {\n throw new Error(`Invalid block kind: expected string, got ${typeof block.kind}`);\n }\n if (typeof block.purpose !== 'string') {\n throw new Error(`Invalid block purpose: expected string, got ${typeof block.purpose}`);\n }\n return {\n id: block.id,\n kind: block.kind,\n purpose: block.purpose,\n };\n });\n\n const pageOutline = {\n name: pageData.name,\n path: pageData.path,\n purpose: pageData.purpose,\n blocks,\n };\n\n // Prefetch block data loaders for pages\n const resolvedData = await prefetchBlockData(\n pageOutline,\n {\n siteId,\n pageId: pageData.id,\n previewStage: preview ? 'preview' : 'published',\n },\n client\n );\n\n // If component unmounted, don't update state\n if (cancelled) return;\n\n setResult({\n loading: false,\n error: null,\n type: 'page',\n page: pageOutline,\n entry: null,\n theme: site.theme,\n siteId,\n resolvedData,\n });\n } catch (error) {\n if (cancelled) return;\n\n setResult({\n loading: false,\n error: error instanceof Error ? error : new Error(String(error)),\n type: null,\n page: null,\n entry: null,\n theme: null,\n siteId,\n resolvedData: null,\n });\n }\n }\n\n fetchContent();\n\n return () => {\n cancelled = true;\n };\n }, [client, siteId, path, preview]);\n\n return result;\n}\n\n/**\n * Type guard to check if API response is an entry\n */\nfunction isEntryResponse(response: PageResponse): response is Extract<PageResponse, { type: 'entry' }> {\n return 'type' in response && response.type === 'entry';\n}\n","import * as React from \"react\";\nimport { getBlockDefinition } from \"./system\";\nimport { makeDefaultBlockComponent } from \"./system/componentFactory\";\n// No React context required; block metadata is passed directly to registry components via resolver.\nimport type { ResolverContext, SystemBlockComponent } from \"./system\";\nimport type { Block, PageOutline } from \"./structure/schema\";\nimport type { Theme } from \"./theme/schema\";\nimport type { SdkCustomBlock } from \"./system/manifest/schema\";\nimport { createManifestValidator } from \"./system/manifest/validation\";\nimport { buildThemeRuntime } from \"./theme/runtime/buildThemeRuntime\";\nimport type { ThemeTokens } from \"./system/theme\";\nimport type { RouteMap } from \"./system/transforms\";\nimport { hydrateManifestLinks } from \"./system/manifest/hydrateLinks\";\nimport { getFragmentRegistry } from \"./system/fragments\";\nimport { getDefaultComponentRegistry } from \"./system/runtime\";\nimport { textColorStyle } from \"./theme/utils/colorStyles\";\nimport { transformSdkBlockToDefinition } from \"./sdkBlockTransform\";\n\n/**\n * Occurrence context for event pages.\n * Passed through to blocks that need occurrence information (e.g., event-registration).\n */\nexport type OccurrenceContextData = {\n id: string;\n seriesId: string;\n startsAt: string;\n endsAt: string;\n capacityOverride?: number | null;\n overrides?: Record<string, unknown> | null;\n};\n\ntype PageRendererDataContext = {\n siteId?: string;\n pageId?: string;\n // Optional pre-resolved data for blocks, keyed by block ID\n resolvedData?: Record<string, Record<string, unknown>>;\n previewStage?: 'published' | 'preview';\n routes?: RouteMap;\n // Occurrence context for event pages (from URL like /events/yoga/2025-01-15)\n occurrenceContext?: OccurrenceContextData | null;\n // Content entry data for template pages\n contentEntry?: Record<string, unknown> | null;\n};\n\n/**\n * Block override component type.\n * Override components receive the same props as default block components.\n *\n * Uses `any` for content type to allow typed components (e.g., SystemBlockComponentProps<HeroContent>)\n * to be used as overrides without type errors. The actual content type is validated at runtime\n * based on the block kind.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type BlockOverrideComponent = SystemBlockComponent<any>;\n\n/**\n * Map of block kinds to custom override components.\n * Keys can be either:\n * - Full block kind: \"block.hero\"\n * - Short form: \"hero\" (will match \"block.hero\")\n *\n * @example\n * ```tsx\n * const overrides: BlockOverrides = {\n * 'hero': CustomHero, // CustomHero: SystemBlockComponentProps<HeroContent>\n * 'bodyText': CustomBodyText, // CustomBodyText: SystemBlockComponentProps<BodyTextContent>\n * };\n * ```\n */\nexport type BlockOverrides = Record<string, BlockOverrideComponent>;\n\n/**\n * SDK site configuration for custom block rendering.\n * Minimal type containing only what PageRenderer needs.\n */\nexport type SdkConfigForRenderer = {\n customBlocks?: SdkCustomBlock[];\n};\n\ninterface PageRendererProps {\n theme: Theme;\n page: PageOutline | null;\n usePlaceholders?: boolean;\n dataContext?: PageRendererDataContext;\n routeMap?: RouteMap;\n // Optional: wrap rendered block output (e.g., for EditableBlockProvider)\n wrapBlock?: (blockId: string, rendered: React.ReactNode) => React.ReactNode;\n // Optional: pass a custom component registry into block components (e.g., editor-aware primitives)\n registry?: ResolverContext[\"registry\"];\n themeTokens?: ThemeTokens;\n // Optional: custom components to override default block rendering (SSR-safe, no context needed)\n blockOverrides?: BlockOverrides;\n // Optional: SDK site configuration for custom block definitions\n sdkConfig?: SdkConfigForRenderer | null;\n}\n\nexport default function PageRenderer({\n theme,\n page,\n usePlaceholders = false,\n dataContext,\n wrapBlock,\n registry,\n themeTokens: providedThemeTokens,\n routeMap,\n blockOverrides,\n sdkConfig,\n}: PageRendererProps) {\n if (!page || page.blocks.length === 0) {\n return (\n <div className=\"p-6 text-sm\" style={textColorStyle('mutedText')}>\n No blocks found.\n </div>\n );\n }\n\n const themeTokens = providedThemeTokens ?? buildThemeRuntime(theme).tokens;\n\n // Resolve a default component registry when one isn't explicitly provided\n const resolvedRegistry = registry ?? getDefaultComponentRegistry();\n\n return (\n <div>\n {page.blocks.map((block, index) => {\n const blockKey = block.id ?? `${block.kind}-${index}`;\n // Clean block kind: \"block.hero\" → \"hero\"\n const cleanKind = block.kind.replace(/^block\\./, '');\n return (\n <section\n key={blockKey}\n className={`block-${cleanKind}`}\n data-block={cleanKind}\n data-block-id={block.id ?? undefined}\n data-block-kind={block.kind}\n >\n <MemoBlockSection\n themeTokens={themeTokens}\n themeConfig={theme}\n block={block}\n usePlaceholders={usePlaceholders}\n dataContext={dataContext}\n blockKey={blockKey}\n registry={resolvedRegistry}\n routeMap={routeMap}\n wrapBlock={wrapBlock}\n blockOverrides={blockOverrides}\n sdkConfig={sdkConfig}\n />\n </section>\n );\n })}\n </div>\n );\n}\n\ntype MemoSectionProps = {\n themeTokens: ThemeTokens;\n themeConfig: Theme;\n block: Block;\n usePlaceholders: boolean;\n dataContext?: PageRendererDataContext;\n blockKey: string;\n registry?: ResolverContext[\"registry\"];\n routeMap?: RouteMap;\n wrapBlock?: (blockId: string, rendered: React.ReactNode) => React.ReactNode;\n blockOverrides?: BlockOverrides;\n sdkConfig?: SdkConfigForRenderer | null;\n};\n\n/**\n * Look up a block override component by block kind.\n * Supports both full (\"block.hero\") and short (\"hero\") keys.\n */\nfunction getBlockOverride(\n blockKind: string,\n overrides?: BlockOverrides\n): BlockOverrideComponent | undefined {\n if (!overrides) return undefined;\n\n // Try exact match first (e.g., \"block.hero\")\n if (overrides[blockKind]) {\n return overrides[blockKind];\n }\n\n // Try short form (e.g., \"hero\" for \"block.hero\")\n const shortKind = blockKind.replace(/^block\\./, '');\n if (overrides[shortKind]) {\n return overrides[shortKind];\n }\n\n return undefined;\n}\n\nconst blockComponentCache = new Map<string, SystemBlockComponent<Record<string, unknown>>>();\n\nfunction getCachedBlockComponent(\n manifest: NonNullable<ReturnType<typeof getBlockDefinition>>['manifest']\n): SystemBlockComponent<Record<string, unknown>> {\n const key = `${manifest.name}`;\n const cached = blockComponentCache.get(key);\n if (cached) return cached;\n const created = makeDefaultBlockComponent({ manifest });\n blockComponentCache.set(key, created);\n return created;\n}\n\n/**\n * Memoized block section component.\n *\n * Custom memoization prevents render loops during editing by explicitly checking\n * referential equality of all props that affect rendering. Standard React.memo\n * wouldn't catch all the render triggers from the editor store.\n */\nconst MemoBlockSection = React.memo(function MemoBlockSection({\n themeTokens,\n themeConfig,\n block,\n usePlaceholders,\n dataContext,\n registry,\n routeMap,\n wrapBlock,\n blockOverrides,\n sdkConfig,\n}: MemoSectionProps) {\n // Check for custom override component first\n const OverrideComponent = getBlockOverride(block.kind, blockOverrides);\n\n // Get definition - check SDK custom blocks if system lookup fails\n let definition = getBlockDefinition(block.kind);\n if (!definition && block.kind.startsWith('custom.') && sdkConfig?.customBlocks) {\n const sdkBlock = sdkConfig.customBlocks.find(b => b.id === block.kind);\n if (sdkBlock) {\n definition = transformSdkBlockToDefinition(sdkBlock);\n }\n }\n\n if (!definition) {\n const rendered = fallback(`No renderer available for block kind \"${block.kind}\".`);\n return wrapBlock && block.id ? <>{wrapBlock(block.id, rendered)}</> : <>{rendered}</>;\n }\n\n const content = getRenderableContent(block);\n\n const validator = createManifestValidator(definition.manifest, { allowNull: false });\n const parsed = validator.safeParse(content);\n // Dev logging for manifest validation issues before fallback kicks in\n try {\n const env = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env?.NODE_ENV;\n if (env !== 'production' && !parsed.success && !usePlaceholders) {\n console.warn('[blocks:PageRenderer] manifest validation failed', {\n blockId: block.id ?? null,\n blockKind: block.kind,\n content: summarizeValue(content),\n expectedFields: (definition.manifest.fields ?? []).map((f: any) => ({ id: f.id, type: f.type, required: !!f.required })),\n issues: (parsed as any)?.error?.issues ?? null,\n });\n }\n } catch {}\n\n let data: Record<string, unknown>;\n if (parsed.success) {\n data = parsed.data;\n } else if (usePlaceholders) {\n const placeholder = validator.safeParse({});\n if (placeholder.success) {\n data = placeholder.data;\n } else {\n const rendered = fallback(`Unable to render block kind \"${block.kind}\".`);\n return wrapBlock && block.id ? <>{wrapBlock(block.id, rendered)}</> : <>{rendered}</>;\n }\n } else {\n const rendered = fallback(`Invalid content for block kind \"${block.kind}\".`);\n return wrapBlock && block.id ? <>{wrapBlock(block.id, rendered)}</> : <>{rendered}</>;\n }\n\n try {\n // Use override component if provided, otherwise use manifest-based default\n const BlockComponent = OverrideComponent ?? getCachedBlockComponent(definition.manifest);\n const pathBase = typeof block.id === 'string' && block.id.length > 0 ? `blocks.${block.id}.` : undefined;\n const routes = routeMap ?? dataContext?.routes;\n const hydratedContent = routes\n ? hydrateManifestLinks(definition.manifest, data, routes)\n : data;\n\n const resolved = resolveBlockData({\n block,\n definition,\n dataContext,\n });\n\n const rootContext = {\n $root: {\n siteId: dataContext?.siteId ?? null,\n pageId: dataContext?.pageId ?? null,\n previewStage: dataContext?.previewStage ?? 'published',\n ...(routes ? { routes } : {}),\n // Occurrence and content entry context for template pages\n occurrenceContext: dataContext?.occurrenceContext ?? null,\n contentEntry: dataContext?.contentEntry ?? null,\n },\n };\n\n const blockBindings = (block as any).bindings ?? undefined;\n const fragmentRegistry = getFragmentRegistry();\n\n const rendered = (\n <BlockComponent\n content={hydratedContent}\n theme={themeTokens}\n themeConfig={themeConfig}\n registry={registry}\n pathBase={pathBase}\n data={resolved}\n blockId={block.id ?? null}\n blockKind={block.kind}\n blockBindings={blockBindings}\n viewModelOverrides={rootContext}\n fragmentRegistry={fragmentRegistry}\n />\n );\n\n // Apply wrapper if provided (e.g., EditableBlockProvider)\n if (wrapBlock && block.id) {\n return <>{wrapBlock(block.id, rendered)}</>;\n }\n\n return <>{rendered}</>;\n } catch {\n const rendered = usePlaceholders\n ? fallback(`Unable to render block kind \"${block.kind}\".`)\n : fallback(`Invalid content for block kind \"${block.kind}\".`);\n return wrapBlock && block.id ? <>{wrapBlock(block.id, rendered)}</> : <>{rendered}</>;\n }\n}, (prev, next) => {\n return (\n prev.block === next.block &&\n prev.registry === next.registry &&\n prev.dataContext === next.dataContext &&\n prev.themeTokens === next.themeTokens &&\n prev.themeConfig === next.themeConfig &&\n prev.routeMap === next.routeMap &&\n prev.usePlaceholders === next.usePlaceholders &&\n prev.wrapBlock === next.wrapBlock &&\n prev.blockOverrides === next.blockOverrides &&\n prev.sdkConfig === next.sdkConfig\n );\n});\n\nfunction fallback(message: string) {\n return (\n <div className=\"p-6 text-sm\" style={textColorStyle('mutedText')}>\n {message}\n </div>\n );\n}\n\ntype ResolveBlockDataArgs = {\n block: Block;\n definition: NonNullable<ReturnType<typeof getBlockDefinition>>;\n dataContext?: PageRendererDataContext;\n};\n\nfunction resolveBlockData({ block, definition, dataContext }: ResolveBlockDataArgs) {\n if (!definition.dataLoaders || Object.keys(definition.dataLoaders).length === 0) {\n return undefined;\n }\n const blockId = block.id ?? null;\n if (!blockId) return undefined;\n const raw = dataContext?.resolvedData?.[blockId];\n if (!raw || typeof raw !== 'object') {\n return {};\n }\n return { ...(raw as Record<string, unknown>) };\n}\n\n/**\n * Resolves block content based on stage priority.\n * For draft/preview: draftContent takes priority over content.\n * For published: content is the source of truth.\n * Returns empty object if no content exists (validator will handle placeholders if needed).\n */\nfunction getRenderableContent(block: Block): Record<string, unknown> {\n // Priority: draftContent > content (publishedContent is legacy and unused)\n const source = (block as any).draftContent ?? (block as any).content ?? {};\n\n if (!isRecord(source)) {\n return {};\n }\n\n return source;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\n// Dev-only: summarize content to avoid huge console logs\nfunction summarizeValue(value: unknown): unknown {\n try {\n if (value === null || value === undefined) return value;\n if (typeof value === 'string') return value.length > 160 ? `${value.slice(0, 160)}…` : value;\n if (typeof value === 'number' || typeof value === 'boolean') return value;\n if (Array.isArray(value)) return `[array(${value.length})]`;\n if (typeof value === 'object') {\n const rec = value as Record<string, unknown>;\n const keys = Object.keys(rec);\n const preview: Record<string, unknown> = {};\n for (const k of keys.slice(0, 8)) {\n const v = (rec as any)[k];\n if (k === 'body' || k === 'content') {\n const isDocWrapper = !!(v && typeof v === 'object' && 'doc' in (v as any));\n const isDoc = !!(v && typeof v === 'object' && (v as any).type === 'doc');\n preview[k] = isDocWrapper ? '{doc}' : isDoc ? '{type:doc}' : summarizeValue(v);\n } else {\n preview[k] = summarizeValue(v);\n }\n }\n return { keys, preview };\n }\n return String(value);\n } catch {\n return '[uninspectable]';\n }\n}\n","export const colorTokens = [\n \"background/base\",\n \"background/elevated\",\n \"surface/base\",\n \"surface/subtle\",\n \"surface/inverted\",\n \"content/primary\",\n \"content/secondary\",\n \"accent/primary\",\n \"accent/secondary\",\n \"border/base\",\n] as const;\n\nexport const typographyTokens = [\n \"display/hero\",\n \"display/section\",\n \"heading/large\",\n \"heading/medium\",\n \"heading/small\",\n \"body/normal\",\n \"body/small\",\n \"caption\",\n] as const;\n\nexport const spacingTokens = [\"none\", \"3xs\", \"2xs\", \"xs\", \"sm\", \"md\", \"lg\", \"xl\", \"2xl\", \"3xl\"] as const;\nexport const radiusTokens = [\"none\", \"xs\", \"sm\", \"md\", \"lg\", \"pill\", \"full\"] as const;\nexport const shadowTokens = [\"none\", \"soft\", \"medium\", \"strong\"] as const;\n\nexport type ThemeTokens = {\n color: Record<(typeof colorTokens)[number], string>;\n typography: Record<(typeof typographyTokens)[number], { fontSize: string; lineHeight: string; fontWeight?: string }>;\n spacing: Record<(typeof spacingTokens)[number], string>;\n radius: Record<(typeof radiusTokens)[number], string>;\n shadow: Record<(typeof shadowTokens)[number], string>;\n palette: Record<string, string>;\n // Note: buttons and cards removed - only needed for CSS generation, not runtime transforms\n};\n\nexport const defaultThemeTokens: ThemeTokens = {\n color: {\n \"background/base\": \"#ffffff\",\n \"background/elevated\": \"#f5f5f5\",\n \"surface/base\": \"#ffffff\",\n \"surface/subtle\": \"#f9f9fb\",\n \"surface/inverted\": \"#111111\",\n \"content/primary\": \"#111111\",\n \"content/secondary\": \"#3f3f46\",\n \"accent/primary\": \"#2563eb\",\n \"accent/secondary\": \"#1d4ed8\",\n \"border/base\": \"#e5e7eb\",\n },\n typography: {\n \"display/hero\": { fontSize: \"clamp(48px, 8vw, 96px)\", lineHeight: \"1.05\", fontWeight: \"700\" },\n \"display/section\": { fontSize: \"clamp(40px, 6vw, 72px)\", lineHeight: \"1.1\", fontWeight: \"700\" },\n \"heading/large\": { fontSize: \"clamp(32px, 4vw, 48px)\", lineHeight: \"1.2\", fontWeight: \"600\" },\n \"heading/medium\": { fontSize: \"clamp(24px, 3vw, 32px)\", lineHeight: \"1.25\", fontWeight: \"600\" },\n \"heading/small\": { fontSize: \"20px\", lineHeight: \"1.3\", fontWeight: \"600\" },\n \"body/normal\": { fontSize: \"16px\", lineHeight: \"1.6\", fontWeight: \"400\" },\n \"body/small\": { fontSize: \"14px\", lineHeight: \"1.5\", fontWeight: \"400\" },\n caption: { fontSize: \"12px\", lineHeight: \"1.4\", fontWeight: \"500\" },\n },\n spacing: {\n none: \"0px\",\n \"3xs\": \"4px\",\n \"2xs\": \"8px\",\n xs: \"12px\",\n sm: \"16px\",\n md: \"24px\",\n lg: \"32px\",\n xl: \"40px\",\n \"2xl\": \"56px\",\n \"3xl\": \"72px\",\n },\n radius: {\n none: \"0px\",\n xs: \"2px\",\n sm: \"4px\",\n md: \"8px\",\n lg: \"12px\",\n pill: \"999px\",\n full: \"9999px\",\n },\n shadow: {\n none: \"none\",\n soft: \"0px 2px 8px rgba(15, 23, 42, 0.08)\",\n medium: \"0px 6px 18px rgba(15, 23, 42, 0.12)\",\n strong: \"0px 12px 36px rgba(15, 23, 42, 0.16)\",\n },\n palette: {\n surface: \"#ffffff\",\n \"neutral-50\": \"#f9fafb\",\n \"neutral-900\": \"#111827\",\n primary: \"#2563eb\",\n \"primary-50\": \"#eff6ff\",\n \"primary-500\": \"#2563eb\",\n \"primary-900\": \"#1d4ed8\",\n secondary: \"#9333ea\",\n \"secondary-50\": \"#f3e8ff\",\n \"secondary-500\": \"#9333ea\",\n \"secondary-900\": \"#4c1d95\",\n accent: \"#f97316\",\n \"accent-50\": \"#fff7ed\",\n \"accent-500\": \"#f97316\",\n \"accent-900\": \"#7c2d12\",\n },\n};\n","import type { z } from \"zod\";\nimport type { ThemeTokens } from \"../../theme\";\n\nexport type RouteMapEntry =\n | string\n | {\n path?: string | null;\n href?: string | null;\n url?: string | null;\n draftPath?: string | null;\n [key: string]: unknown;\n };\n\nexport type RouteMap = Record<string, RouteMapEntry>;\n\nexport type TransformContext = {\n theme: ThemeTokens;\n locale?: string;\n routes?: RouteMap;\n};\n\nexport type TransformHandler<TOptions = unknown> = (\n value: unknown,\n options: TOptions,\n context: TransformContext\n) => unknown;\n\nexport type TransformDefinition<TOptions = unknown> = {\n id: string;\n summary?: string;\n kind: \"formatter\" | \"collection\" | \"string\" | \"html\";\n schema?: z.ZodType<TOptions>;\n run: TransformHandler<TOptions>;\n};\n\nexport type TransformRegistry = Map<string, TransformDefinition<any>>;\n\nexport function runTransforms(\n value: unknown,\n transforms: Array<{ id: string; options?: unknown }> | undefined,\n context: TransformContext,\n registry: TransformRegistry\n) {\n if (!transforms?.length) return value;\n return transforms.reduce((acc, step) => {\n const transform = registry.get(step.id);\n if (!transform) {\n throw new Error(`Unknown transform: ${step.id}`);\n }\n const options = transform.schema ? transform.schema.parse(step.options ?? {}) : (step.options ?? {});\n return transform.run(acc, options, context);\n }, value);\n}\n\nexport function createTransformRegistry(\n definitions: Iterable<TransformDefinition<any>>\n): TransformRegistry {\n const registry: TransformRegistry = new Map();\n for (const definition of definitions) {\n if (registry.has(definition.id)) continue;\n registry.set(definition.id, definition);\n }\n return registry;\n}\n\nexport function mergeTransformRegistries(\n ...registries: TransformRegistry[]\n): TransformRegistry {\n const merged: TransformRegistry = new Map();\n for (const registry of registries) {\n for (const [id, definition] of registry.entries()) {\n if (merged.has(id)) continue;\n merged.set(id, definition);\n }\n }\n return merged;\n}\n","import { BACKGROUND_POSITION_PRESET_VALUES, getAnchorClasses } from '../../constants/background';\nimport type { TransformDefinition } from \"./core\";\n\nconst isString = (value: unknown): value is string => typeof value === \"string\" && value.trim().length > 0;\nconst isNumber = (value: unknown): value is number => typeof value === \"number\" && !isNaN(value);\n\n/**\n * Transform for resolving inline styles on <img> elements from background data.\n * Converts advanced image options to object-fit, object-position, opacity, and scale (width/height).\n * Note: Preset positions are handled via className (anchor positioning), but custom values are applied as object-position.\n */\nconst resolveImageStyleTransform: TransformDefinition = {\n id: \"background.resolveImageStyle\",\n kind: \"formatter\",\n summary: \"Resolve inline styles for background image elements\",\n run: (value, _options, _context) => {\n if (!value || typeof value !== \"object\") return {};\n const input = value as Record<string, unknown>;\n const objectFit = isString(input.objectFit) ? input.objectFit.trim() : null;\n const opacity = isNumber(input.opacity) ? input.opacity : isString(input.opacity) ? parseFloat(input.opacity) : null;\n const position = isString(input.position) ? input.position.trim() : null;\n\n // Parse scale - supports \"150%\", \"200px\", \"50vh\", or plain \"150\"\n // Only applies when objectFit is 'custom' or 'original'\n let scaleValue: string | null = null;\n if (objectFit === 'custom' || objectFit === 'original') {\n if (isString(input.scale)) {\n const scaleStr = input.scale.trim();\n if (scaleStr) {\n // If it has units (%, px, vh, etc), use as-is\n if (/\\d+(%|px|vh|vw|rem|em)$/.test(scaleStr)) {\n scaleValue = scaleStr;\n } else {\n // Plain number - treat as percentage\n const num = parseFloat(scaleStr);\n if (!isNaN(num)) {\n scaleValue = `${num}%`;\n }\n }\n }\n }\n }\n\n const style: Record<string, string> = {};\n\n // Map objectFit values to CSS object-fit\n if (objectFit) {\n switch (objectFit) {\n case 'fill':\n style.objectFit = 'cover';\n break;\n case 'fit':\n style.objectFit = 'contain';\n break;\n case 'original':\n case 'custom':\n style.objectFit = 'none';\n break;\n default:\n // Fallback for legacy values (cover, contain, none)\n style.objectFit = objectFit;\n }\n }\n\n // Apply opacity\n if (opacity !== null && opacity >= 0 && opacity <= 100) {\n style.opacity = String(opacity / 100);\n }\n\n // Apply scale via width/height (only for custom/original sizing)\n if (scaleValue) {\n style.width = scaleValue;\n style.height = scaleValue;\n }\n\n // Apply object-position for custom values\n if (position && !BACKGROUND_POSITION_PRESET_VALUES.includes(position as any)) {\n style.objectPosition = position;\n }\n\n return style;\n },\n};\n\n/**\n * Transform for resolving className on <img> elements based on objectFit, scale, and position.\n * - 'fill' (cover) and 'fit' (contain): uses inset-0 to fill container\n * - 'original' and 'custom': uses anchor positioning when scale is set\n */\nconst resolveImageClassNameTransform: TransformDefinition<{ baseClass?: string }> = {\n id: \"background.resolveImageClassName\",\n kind: \"string\",\n summary: \"Resolve className for background image based on objectFit, scale and position\",\n run: (value, options, _context) => {\n const baseClass = (options as any)?.baseClass ?? 'absolute -z-10';\n if (!value || typeof value !== \"object\") return `${baseClass} inset-0 h-full w-full`;\n\n const input = value as Record<string, unknown>;\n const objectFit = isString(input.objectFit) ? input.objectFit.trim() : null;\n const position = isString(input.position) ? input.position.trim() : null;\n\n // For 'fill' (cover) and 'fit' (contain), always use inset-0\n if (objectFit === 'fill' || objectFit === 'fit') {\n return `${baseClass} inset-0 h-full w-full object-${objectFit === 'fill' ? 'cover' : 'contain'}`;\n }\n\n // For 'original' and 'custom', check if scale is set\n let needsAnchoring = false;\n if (objectFit === 'custom' || objectFit === 'original') {\n if (isString(input.scale)) {\n const scaleStr = input.scale.trim();\n if (scaleStr) {\n needsAnchoring = true;\n }\n }\n }\n\n // If no scale set for original/custom, still fill container\n if (!needsAnchoring) {\n return `${baseClass} inset-0 h-full w-full`;\n }\n\n // Scale is set: use anchor positioning based on position field\n const isPreset = position && BACKGROUND_POSITION_PRESET_VALUES.includes(position as any);\n const isCustom = position && !isPreset;\n\n if (isCustom) {\n // If position is custom, no anchor classes are needed as object-position is used.\n return baseClass;\n }\n\n // Otherwise, it's a preset or null, so apply anchor classes (getAnchorClasses handles null by defaulting to center)\n const anchorClasses = getAnchorClasses(position);\n return `${baseClass} ${anchorClasses}`;\n }\n};\n\nexport const backgroundTransforms: TransformDefinition<any>[] = [\n {\n id: \"background.resolveStyle\",\n kind: \"formatter\",\n summary: \"Resolve inline styles for background color/gradient layers\",\n run: (value, _options, context) => {\n if (!value || typeof value !== \"object\") return {};\n const input = value as Record<string, unknown>;\n const color = isString(input.color) ? input.color.trim() : null;\n const gradient = isString(input.gradient) ? input.gradient.trim() : null;\n const opacity = isNumber(input.opacity) ? input.opacity : isString(input.opacity) ? parseFloat(input.opacity) : null;\n\n const style: Record<string, string> = {};\n\n // Only apply backgroundColor inline when a raw hex/custom value is used.\n // If a token is present (recognized by presence in theme tokens or known keywords),\n // rely on the class produced by background.resolveClass instead.\n if (color) {\n const isToken = Boolean(context?.theme?.palette?.[color] || color === 'transparent' || color === 'surface');\n if (!isToken) {\n style.backgroundColor = color;\n }\n }\n\n if (gradient) {\n style.backgroundImage = gradient;\n }\n\n if (opacity !== null && opacity >= 0 && opacity <= 100) {\n style.opacity = String(opacity / 100);\n }\n\n return style;\n },\n },\n {\n id: \"background.resolveClass\",\n kind: \"string\",\n summary: \"Map background color token to Tailwind class with auto-overflow for custom sizing\",\n run: (value, options, context) => {\n const baseClass = (options as any)?.baseClass;\n const base = typeof baseClass === 'string' && baseClass.trim().length > 0 ? baseClass.trim() : '';\n if (!value || typeof value !== 'object') return base;\n const input = value as Record<string, unknown>;\n const color = isString(input.color) ? input.color.trim() : '';\n const objectFit = isString(input.objectFit) ? input.objectFit.trim() : null;\n\n const classes: string[] = [];\n\n // Add base class if provided\n if (base) classes.push(base);\n\n // Add color class if it's a theme token\n if (color) {\n const isToken = Boolean(context?.theme?.palette?.[color] || color === 'transparent' || color === 'surface');\n if (isToken) {\n classes.push(`bg-${color}`);\n }\n }\n\n // Auto-enable overflow for custom/original sizing when scale is set\n const needsOverflow = (objectFit === 'custom' || objectFit === 'original') && isString(input.scale) && input.scale.trim().length > 0;\n if (needsOverflow) {\n classes.push('overflow-visible');\n }\n\n return classes.join(' ').trim();\n },\n },\n resolveImageStyleTransform,\n resolveImageClassNameTransform,\n];\n","import type { TransformDefinition } from \"./core\";\n\nfunction extractHref(candidate: unknown): string | null {\n if (typeof candidate === \"string\") {\n const trimmed = candidate.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n if (!candidate || typeof candidate !== \"object\") {\n return null;\n }\n const record = candidate as Record<string, unknown>;\n const fields = [\"path\", \"href\", \"url\", \"draftPath\"];\n for (const field of fields) {\n const value = record[field];\n if (typeof value === \"string\" && value.trim().length > 0) {\n return value.trim();\n }\n }\n return null;\n}\n\nexport const resolveLinkTransform: TransformDefinition = {\n id: \"links.resolve\",\n kind: \"formatter\",\n summary: \"Resolve LinkValue objects to href strings using the route map\",\n run: (value, _options, context) => {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n\n const link = value as Record<string, unknown>;\n const kind = typeof link.kind === \"string\" ? link.kind : null;\n\n if (kind === \"internal\") {\n const routeId = typeof link.routeId === \"string\" ? link.routeId : null;\n const routes = context.routes ?? {};\n if (routeId && routes && typeof routes === \"object\") {\n const match = (routes as Record<string, unknown>)[routeId];\n const resolved = extractHref(match);\n if (resolved) {\n return resolved;\n }\n }\n const href = typeof link.href === \"string\" ? link.href.trim() : \"\";\n return href.length > 0 ? href : null;\n }\n\n if ((kind === \"external\" || kind === \"url\") && typeof link.href === \"string\") {\n const href = link.href.trim();\n return href.length > 0 ? href : null;\n }\n\n return null;\n },\n};\n\nexport const linksTransforms = [resolveLinkTransform] satisfies ReadonlyArray<TransformDefinition<any>>;\n","import type { TransformDefinition } from './core'\nimport type { SemanticSpacing } from '../../spacing'\nimport { resolveSpacing, isSemanticSpacing } from '../../spacing'\n\n/**\n * Maps semantic spacing values to Tailwind padding classes.\n *\n * Semantic values: none, compact, cozy, medium, comfortable, spacious\n * These are defined centrally in system/spacing.ts\n *\n * For sections (axis: 'y'), only vertical padding is applied (py-*).\n * For containers/cards (axis: 'all'), padding is applied to all sides (p-*).\n *\n * Runtime validation ensures invalid spacing values are caught early.\n */\nexport const spacingTransform: TransformDefinition<{ axis?: 'y' | 'all'; baseClass?: string }> = {\n id: 'boxStyles.spacing',\n kind: 'string',\n summary: 'Map semantic spacing value to Tailwind padding classes',\n run: (value, options, _context) => {\n const axis = options?.axis ?? 'all'\n const baseClass = options?.baseClass ?? ''\n\n // Handle null/undefined/empty values\n if (!value || typeof value !== 'string') {\n return baseClass.trim() || ''\n }\n\n const trimmed = value.trim();\n\n // Validate spacing value at runtime\n if (!isSemanticSpacing(trimmed)) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(`[spacing] Invalid spacing value: \"${trimmed}\". Expected one of: none, compact, cozy, medium, comfortable, spacious.`);\n }\n return baseClass.trim() || ''\n }\n\n // TypeScript now knows trimmed is SemanticSpacing\n const spacingClass = resolveSpacing(trimmed, axis)\n\n // Combine base class with spacing class\n return baseClass ? `${baseClass.trim()} ${spacingClass}` : spacingClass\n },\n}\n\n/**\n * Applies theme shadow class when raised is true.\n *\n * Uses the theme's 'medium' shadow token by default.\n */\nexport const raisedTransform: TransformDefinition<{ baseClass?: string }> = {\n id: 'boxStyles.raised',\n kind: 'string',\n summary: 'Apply shadow class when raised is true',\n run: (value, options, context) => {\n const baseClass = options.baseClass ?? ''\n\n // Only apply shadow if value is explicitly true\n if (value !== true) {\n return baseClass.trim() || ''\n }\n\n // Get shadow from theme (default to 'medium')\n const shadowValue = context.theme?.shadow?.medium\n if (!shadowValue || shadowValue === 'none') {\n return baseClass.trim() || ''\n }\n\n // Use Tailwind's shadow-md class for medium shadow\n // (We could make this configurable in the future)\n const shadowClass = 'shadow-md'\n\n return baseClass ? `${baseClass.trim()} ${shadowClass}` : shadowClass\n },\n}\n\n/**\n * Maps rounded corner values to Tailwind border radius classes.\n *\n * Rounded values:\n * - 'none' → no border radius\n * - 'sm' → rounded-sm\n * - 'md' → rounded-md\n * - 'lg' → rounded-lg\n * - 'xl' → rounded-xl\n * - '2xl' → rounded-2xl\n * - 'full' → rounded-full\n */\nexport const roundedTransform: TransformDefinition<{ baseClass?: string }> = {\n id: 'boxStyles.rounded',\n kind: 'string',\n summary: 'Map rounded value to Tailwind border radius class',\n run: (value, options, _context) => {\n const baseClass = options.baseClass ?? ''\n\n // Handle null/undefined/empty/'none' values\n if (!value || value === 'none') {\n return baseClass.trim() || ''\n }\n\n if (typeof value !== 'string') {\n return baseClass.trim() || ''\n }\n\n const rounded = value.trim()\n\n // Map rounded values to Tailwind classes\n const roundedMap: Record<string, string> = {\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl',\n '2xl': 'rounded-2xl',\n full: 'rounded-full',\n }\n\n const roundedClass = roundedMap[rounded]\n if (!roundedClass) {\n // Unknown rounded value - return base class only\n return baseClass.trim() || ''\n }\n\n // Combine base class with rounded class\n return baseClass ? `${baseClass.trim()} ${roundedClass}` : roundedClass\n },\n}\n\n/**\n * Composite transform that handles all box style properties at once.\n *\n * Takes a box styles object like:\n * ```\n * {\n * spacing: 'comfortable',\n * raised: true,\n * rounded: 'lg'\n * }\n * ```\n *\n * And outputs combined Tailwind classes.\n */\nexport const boxStylesCompositeTransform: TransformDefinition<{ axis?: 'y' | 'all'; baseClass?: string }> = {\n id: 'boxStyles.all',\n kind: 'string',\n summary: 'Composite transform for all box style properties',\n run: (value, options, context) => {\n if (!value || typeof value !== 'object') {\n return options.baseClass?.trim() || ''\n }\n\n const input = value as Record<string, unknown>\n const axis = options.axis ?? 'all'\n const baseClass = options.baseClass ?? ''\n\n const classes: string[] = []\n\n // Add base class if provided\n if (baseClass) classes.push(baseClass)\n\n // Apply spacing transform\n const spacing = typeof input.spacing === 'string' ? input.spacing.trim() : null\n if (spacing) {\n const spacingResult = spacingTransform.run(spacing, { axis, baseClass: '' }, context)\n if (typeof spacingResult === 'string' && spacingResult) {\n classes.push(spacingResult)\n }\n }\n\n // Apply raised transform\n if (input.raised === true) {\n const raisedResult = raisedTransform.run(true, { baseClass: '' }, context)\n if (typeof raisedResult === 'string' && raisedResult) {\n classes.push(raisedResult)\n }\n }\n\n // Apply rounded transform\n const rounded = typeof input.rounded === 'string' ? input.rounded.trim() : null\n if (rounded && rounded !== 'none') {\n const roundedResult = roundedTransform.run(rounded, { baseClass: '' }, context)\n if (typeof roundedResult === 'string' && roundedResult) {\n classes.push(roundedResult)\n }\n }\n\n return classes.join(' ').trim() || ''\n },\n}\n\ntype SectionClassNameOptions = {\n baseClass?: string;\n containerStylesPath?: string;\n defaultSpacing?: SemanticSpacing;\n};\n\n/**\n * Composite transform for section className.\n *\n * Responsibilities:\n * 1. Extracts spacing from _sectionStyles or uses defaultSpacing\n * 2. Converts semantic spacing to CSS classes via resolveSpacing()\n * 3. Respects fullWidth setting from containerStyles (removes px-* classes)\n * 4. Combines base class with spacing classes\n *\n * This transform ensures sections always have proper padding even when:\n * - _sectionStyles doesn't exist (uses defaultSpacing)\n * - _sectionStyles exists but spacing is undefined (uses defaultSpacing)\n * - _sectionStyles.spacing is explicitly set (uses that value)\n */\nexport const sectionClassNameTransform: TransformDefinition<SectionClassNameOptions> = {\n id: 'sectionStyles.resolveClassName',\n kind: 'string',\n summary: 'Resolve section className from spacing and fullWidth setting',\n run: (value, options, context) => {\n const baseClass = options?.baseClass ?? '';\n const containerStylesPath = options?.containerStylesPath ?? '_containerStyles';\n const defaultSpacing = options?.defaultSpacing;\n\n // Check if fullWidth is enabled in containerStyles\n // The data property is added at runtime during block rendering\n const contextData = (context as { data?: Record<string, unknown> }).data;\n const containerStyles = contextData?.[containerStylesPath] as { fullWidth?: boolean } | undefined;\n const fullWidth = containerStyles?.fullWidth === true;\n\n // If fullWidth is true, remove horizontal padding classes from baseClass\n let adjustedBaseClass = baseClass;\n if (fullWidth && baseClass) {\n // Remove px-* classes when fullWidth is enabled\n adjustedBaseClass = baseClass.split(' ')\n .filter((cls: string) => !cls.startsWith('px-'))\n .join(' ')\n .trim();\n }\n\n const classes: string[] = [];\n\n // Extract spacing from _sectionStyles if it exists\n let spacing: SemanticSpacing | null = null;\n if (value && typeof value === 'object') {\n const input = value as Record<string, unknown>;\n if (typeof input.spacing === 'string') {\n // Validate spacing value at runtime\n if (isSemanticSpacing(input.spacing)) {\n spacing = input.spacing;\n } else if (process.env.NODE_ENV !== 'production') {\n console.warn(`[sectionStyles] Invalid spacing value in _sectionStyles: \"${input.spacing}\". Expected one of: none, compact, cozy, medium, comfortable, spacious.`);\n }\n }\n }\n\n // Add adjusted base class (e.g., 'px-6' or '' if fullWidth)\n if (adjustedBaseClass) classes.push(adjustedBaseClass);\n\n // Determine effective spacing:\n // 1. Use explicit spacing from _sectionStyles if set and valid\n // 2. Otherwise use defaultSpacing from config\n // 3. If neither, no spacing classes are added\n const effectiveSpacing = spacing ?? defaultSpacing;\n\n if (effectiveSpacing) {\n // Convert semantic spacing to CSS classes\n // TypeScript knows effectiveSpacing is SemanticSpacing\n const spacingClass = resolveSpacing(effectiveSpacing, 'y');\n classes.push(spacingClass);\n }\n\n return classes.join(' ').trim();\n }\n};\n\ntype ContainerClassNameOptions = {\n baseClass?: string;\n};\n\n/**\n * Composite transform for container className.\n * Determines whether to use Tailwind container class (centered with max-width)\n * or full-width mode (edge-to-edge).\n *\n * Used for dynamically building container element className based on fullWidth setting.\n */\nexport const containerStylesResolveClassName: TransformDefinition<ContainerClassNameOptions> = {\n id: 'containerStyles.resolveClassName',\n kind: 'string',\n summary: 'Resolve container className based on fullWidth setting',\n run: (value, options, _context) => {\n const baseClass = options?.baseClass ?? '';\n\n // If no _containerStyles object exists, use default container behavior\n if (!value || typeof value !== 'object') {\n const defaultClass = 'container mx-auto';\n return baseClass ? `${baseClass} ${defaultClass}`.trim() : defaultClass;\n }\n\n const input = value as Record<string, unknown>;\n const fullWidth = input.fullWidth === true;\n\n const classes: string[] = [];\n\n // Add base class if provided\n if (baseClass) classes.push(baseClass);\n\n // Add container or full-width class\n if (fullWidth) {\n // Full-width mode: no max-width constraint\n classes.push('w-full');\n } else {\n // Default mode: responsive container with max-width\n classes.push('container mx-auto');\n }\n\n return classes.join(' ').trim();\n }\n};\n\nexport const boxStylesTransforms: TransformDefinition<any>[] = [\n spacingTransform as TransformDefinition<any>,\n raisedTransform as TransformDefinition<any>,\n roundedTransform as TransformDefinition<any>,\n boxStylesCompositeTransform as TransformDefinition<any>,\n sectionClassNameTransform as TransformDefinition<any>,\n containerStylesResolveClassName as TransformDefinition<any>,\n]\n","import { createTransformRegistry } from \"./core\";\nimport { formattingTransforms } from \"./formatting\";\nimport { layoutTransforms } from \"./layout\";\nimport { uiTransforms } from \"./ui\";\nimport { mediaTransforms } from \"./media\";\nimport { backgroundTransforms } from \"./background\";\nimport { linksTransforms } from \"./links\";\nimport { boxStylesTransforms } from \"./boxStyles\";\n\nexport const builtinTransformDefinitions = [\n ...formattingTransforms,\n ...layoutTransforms,\n ...uiTransforms,\n ...mediaTransforms,\n ...backgroundTransforms,\n ...linksTransforms,\n ...boxStylesTransforms,\n];\n\nexport const defaultTransforms = createTransformRegistry(builtinTransformDefinitions);\n\nexport {\n formattingTransforms,\n layoutTransforms,\n uiTransforms,\n mediaTransforms,\n backgroundTransforms,\n linksTransforms,\n boxStylesTransforms,\n};\n","import React from \"react\";\nimport type { NodeDefinition } from \"../node\";\nimport { bindingSchema } from \"../node\";\nimport { defaultThemeTokens, type ThemeTokens } from \"../theme\";\nimport type { TransformRegistry, RouteMap, RouteMapEntry } from \"../transforms\";\nimport { runTransforms, defaultTransforms } from \"../transforms\";\nimport { serverComponentRegistry } from \"./components/registry.server\";\nimport { SectionNode } from \"./nodes/layout\";\n\n/**\n * Maps meta binding paths to their actual store keys.\n * The metadata store uses 'draft' prefixed keys (e.g., draftTitle, draftSlug)\n * while template bindings use simple paths (e.g., title, slug).\n */\nconst META_PATH_TO_STORE_KEY: Record<string, string> = {\n title: 'draftTitle',\n slug: 'draftSlug',\n status: 'draftStatus',\n publishedAt: 'publishedAt',\n metaTitle: 'draftMetaTitle',\n metaDescription: 'draftMetaDescription',\n};\n\nfunction mapMetaPathToStoreKey(path: string): string {\n return META_PATH_TO_STORE_KEY[path] ?? path;\n}\n\nexport type ViewModel = Record<string, unknown>;\n\nexport type ComponentRegistry = Record<string, React.ComponentType<any>>;\n\nexport type ResolverContext = {\n viewModel: ViewModel;\n registry: ComponentRegistry;\n transforms?: TransformRegistry;\n theme?: ThemeTokens;\n routes?: RouteMap;\n // Optional base for building editor paths, e.g., `blocks.<blockId>.`\n pathBase?: string;\n // Optional block metadata for editor-aware registries\n blockId?: string | null;\n blockKind?: string;\n blockContent?: unknown;\n // Optional template bindings for reverse field mapping (entry editing)\n blockBindings?: Record<string, unknown>;\n // Optional fragment registry for fragment renderer nodes\n fragmentRegistry?: Record<string, any>;\n};\n\n/** @internal Exported for testing */\nexport type ScopeEntry = {\n name: string;\n value: unknown;\n basePathSegments?: Array<string | number>;\n};\n\n/** @internal Exported for testing */\nexport type InternalContext = ResolverContext & { scopes: ScopeEntry[] };\n\nconst PATH_SEPARATOR_REGEX = /\\./g;\nconst BRACKET_ACCESS_REGEX = /\\[(?<token>[^\\]]+)\\]/g;\n\n/**\n * Parses a bracket notation token into a segment.\n * Handles quoted strings, numeric indices, and plain keys.\n */\nfunction parseBracketToken(token: string): string | number {\n if (token.startsWith(\"\\\"\") || token.startsWith(\"'\")) {\n return token.slice(1, -1);\n }\n if (/^\\d+$/.test(token)) {\n return Number(token);\n }\n return token;\n}\n\n/**\n * Extracts segments from a path part containing brackets.\n * E.g., \"items[0]\" -> [\"items\", 0]\n */\nfunction extractSegmentsFromPart(part: string): Array<string | number> {\n if (!part) return [];\n\n const segments: Array<string | number> = [];\n\n // Extract base property before brackets\n const baseMatch = part.match(/^([^\\[]+)/);\n if (baseMatch) {\n segments.push(baseMatch[1]);\n }\n\n // Extract all bracket notations\n const bracketMatches = Array.from(part.matchAll(BRACKET_ACCESS_REGEX));\n const bracketSegments = bracketMatches\n .map((match) => match.groups?.token ?? \"\")\n .filter((token) => token.length > 0)\n .map(parseBracketToken);\n\n segments.push(...bracketSegments);\n\n // Handle plain part without base match or brackets\n if (!baseMatch && !part.includes(\"[\")) {\n return [part];\n }\n\n return segments;\n}\n\n/**\n * Splits a path string into an array of segments.\n * Supports dot notation (a.b.c), bracket notation (a[0]), and mixed (a.b[0].c).\n */\nfunction splitPath(path: string): Array<string | number> {\n return path\n .split(PATH_SEPARATOR_REGEX)\n .flatMap(extractSegmentsFromPart)\n .filter((segment) => segment !== \"\");\n}\n\n/**\n * Converts path segments back to a dot-notation string.\n */\nfunction segmentsToPath(segments: Array<string | number>): string | undefined {\n if (!segments.length) return undefined;\n return segments.map((s) => String(s)).join('.');\n}\n\n/**\n * Resolves a binding path to absolute segments for editor path injection.\n * Returns segments starting with 'content' or undefined if not applicable.\n */\nfunction getAbsoluteSegments(fromPath: string, context: InternalContext): Array<string | number> | undefined {\n const segments = splitPath(fromPath);\n if (!segments.length) return undefined;\n\n const [first, ...rest] = segments;\n if (typeof first !== 'string') return undefined;\n\n // Direct content or $root access\n if (first === '$root' || first === 'content') {\n return [first === '$root' ? '$root' : 'content', ...rest];\n }\n\n // Check if first segment is a scoped variable with a base path\n const scoped = context.scopes.find((entry) => entry.name === first);\n if (scoped?.basePathSegments && scoped.basePathSegments.length > 0) {\n return [...scoped.basePathSegments, ...rest];\n }\n\n return undefined;\n}\n\n/**\n * Reads a value from a source object using an array of path segments.\n * Handles both object property access and array indexing.\n */\nfunction readFromSource(source: unknown, segments: Array<string | number>): unknown {\n return segments.reduce<unknown>((current, segment) => {\n if (current === undefined || current === null) return undefined;\n\n if (typeof segment === \"number\") {\n return Array.isArray(current) ? current[segment] : undefined;\n }\n\n if (typeof current === \"object\" && current !== null && segment in (current as Record<string, unknown>)) {\n return (current as Record<string, unknown>)[segment];\n }\n\n return undefined;\n }, source);\n}\n\n/**\n * Type guard for plain objects.\n */\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * Validates and converts a route entry from the viewModel.\n */\nfunction parseRouteEntry(routeId: string, value: unknown): [string, string | RouteMapEntry] | null {\n if (typeof routeId !== \"string\" || routeId.length === 0) {\n return null;\n }\n if (typeof value === \"string\") {\n return [routeId, value];\n }\n if (isPlainObject(value)) {\n return [routeId, value as RouteMapEntry];\n }\n return null;\n}\n\n/**\n * Extracts route map from $root.routes in the viewModel.\n */\nfunction extractRouteMapFromViewModel(viewModel: ViewModel): RouteMap | undefined {\n if (!isPlainObject(viewModel)) return undefined;\n\n const root = viewModel.$root;\n if (!isPlainObject(root)) return undefined;\n\n const routes = (root as Record<string, unknown>).routes;\n if (!isPlainObject(routes)) return undefined;\n\n const entries = Object.entries(routes)\n .map(([routeId, value]) => parseRouteEntry(routeId, value))\n .filter((entry): entry is [string, string | RouteMapEntry] => entry !== null);\n\n if (entries.length === 0) return undefined;\n\n return Object.fromEntries(entries);\n}\n\n/**\n * Parses and validates a binding object using the binding schema.\n */\nfunction parseBinding(raw: unknown, origin: string) {\n try {\n return bindingSchema.parse(raw);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to parse binding (${origin}): ${message}`);\n }\n}\n\n/**\n * Applies transforms and fallback to a resolved value.\n */\nfunction applyTransformsAndFallback(\n value: unknown,\n binding: ReturnType<typeof bindingSchema.parse>,\n context: InternalContext\n): unknown {\n const transforms = context.transforms ?? defaultTransforms;\n const routeMap = context.routes ?? extractRouteMapFromViewModel(context.viewModel);\n\n const transformed = runTransforms(\n value,\n binding.transforms?.map((step) => ({ id: step.id, options: step.options })) ?? [],\n { theme: context.theme ?? defaultThemeTokens, routes: routeMap },\n transforms\n );\n\n if (transformed === undefined && binding.fallback !== undefined) {\n return binding.fallback;\n }\n\n if (binding.pick === \"collection\") {\n return Array.isArray(transformed) ? transformed : [];\n }\n\n return transformed;\n}\n\n/**\n * Resolves a binding to its value from the viewModel or scopes.\n * Applies transforms and fallback handling.\n *\n * Path resolution rules (scope-relative):\n * - $root.* → resolves to viewModel root\n * - scopeName.* → resolves to named scope (e.g., item.title, content.heading)\n * - path → resolves relative to innermost (current) scope\n *\n * @internal Exported for testing\n */\nexport function resolveBindingValue(binding: ReturnType<typeof bindingSchema.parse>, context: InternalContext): unknown {\n const fullPath = binding.from;\n const segments = splitPath(fullPath);\n if (!segments.length) return undefined;\n\n const [first, ...rest] = segments;\n let source: unknown;\n\n if (typeof first === \"string\") {\n // Special case: $root always resolves to viewModel.$root\n if (first === \"$root\") {\n const rootObj = (context.viewModel as Record<string, unknown>).$root;\n source = rootObj ?? {};\n const value = readFromSource(source, rest);\n return applyTransformsAndFallback(value, binding, context);\n }\n\n // Relative path: resolve to innermost (current) scope FIRST\n // This allows fragments with field names like 'content' to work correctly\n // even when a 'content' scope exists\n if (context.scopes.length > 0) {\n // Find the innermost scope that's an object or array (skip primitives like index numbers)\n let currentScope = context.scopes[context.scopes.length - 1];\n const scopeValue = currentScope.value;\n const isPrimitive = scopeValue === null || scopeValue === undefined ||\n typeof scopeValue === 'number' || typeof scopeValue === 'string' || typeof scopeValue === 'boolean';\n\n // If innermost scope is primitive (e.g., index), use the next scope up\n if (isPrimitive && context.scopes.length > 1) {\n currentScope = context.scopes[context.scopes.length - 2];\n }\n\n source = currentScope.value;\n const value = readFromSource(source, segments);\n\n // If found in current scope, return it\n if (value !== undefined) {\n return applyTransformsAndFallback(value, binding, context);\n }\n\n // Not found in current scope - check if first segment is a named scope\n const namedScope = context.scopes.find((entry) => entry.name === first);\n if (namedScope) {\n // Scope-qualified path: item.title, content.heading, etc.\n source = namedScope.value;\n const namedValue = readFromSource(source, rest);\n if (namedValue !== undefined) {\n return applyTransformsAndFallback(namedValue, binding, context);\n }\n }\n\n // Fall back to viewModel (allows accessing parent data from repeaters)\n const viewModelValue = readFromSource(context.viewModel, segments);\n return applyTransformsAndFallback(viewModelValue, binding, context);\n }\n\n // No scopes: check for named scope before falling back to viewModel\n const namedScope = context.scopes.find((entry) => entry.name === first);\n if (namedScope) {\n source = namedScope.value;\n const value = readFromSource(source, rest);\n return applyTransformsAndFallback(value, binding, context);\n }\n\n // No scopes: fall back to viewModel\n source = context.viewModel;\n } else {\n source = context.viewModel;\n }\n\n const value = readFromSource(source, segments);\n return applyTransformsAndFallback(value, binding, context);\n}\n\n/**\n * Determines whether a node should be rendered based on its $when condition.\n */\nfunction shouldRenderNode(node: NodeDefinition, context: InternalContext): boolean {\n if (!node.$when) return true;\n\n // Defensive check: if $when.when is undefined, render the node by default\n if (!node.$when.when) {\n console.warn('Block has $when condition but missing \"when\" property:', node);\n return true;\n }\n\n const binding = parseBinding(node.$when.when, \"$when\");\n const value = resolveBindingValue(binding, context);\n const equals = node.$when.equals;\n\n const matches = typeof equals === \"undefined\" ? Boolean(value) : value === equals;\n const shouldRender = node.$when.not ? !matches : matches;\n\n return shouldRender;\n}\n\n/**\n * Applies $scopes to the context, adding named bindings to the scope stack.\n */\nfunction applyScopes(node: NodeDefinition, context: InternalContext): InternalContext {\n if (!node.$scopes) return context;\n\n const scopeContext: InternalContext = { ...context, scopes: [...context.scopes] };\n for (const scope of node.$scopes) {\n const binding = bindingSchema.parse(scope.from);\n const value = resolveBindingValue(binding, scopeContext);\n scopeContext.scopes.push({ name: scope.name, value });\n }\n return scopeContext;\n}\n\n/**\n * Resolves a repeated node, creating an array of elements.\n */\nfunction resolveRepeater(\n node: NodeDefinition,\n context: InternalContext\n): React.ReactNode[] | null {\n if (!node.$repeat) return null;\n\n const binding = parseBinding(node.$repeat.collection, \"$repeat.collection\");\n const collection = resolveBindingValue(binding, context);\n\n if (!Array.isArray(collection)) return null;\n\n const limit = node.$repeat.limit ?? collection.length;\n const items = collection.slice(0, limit);\n const itemName = node.$repeat.itemName ?? \"item\";\n const indexName = node.$repeat.indexName ?? \"index\";\n\n return items\n .map((item, idx) => {\n const scopes = [...context.scopes];\n\n // Compute base path for repeated items rooted at content.*\n const absolute = getAbsoluteSegments(binding.from, context);\n const basePathSegments = absolute ? [...absolute, idx] : undefined;\n\n scopes.push({ name: itemName, value: item, basePathSegments });\n scopes.push({ name: indexName, value: idx });\n\n const repeatedContext: InternalContext = { ...context, scopes };\n const nodeWithoutRepeat = { ...node, $repeat: undefined };\n\n return resolveNode(nodeWithoutRepeat, repeatedContext, idx);\n })\n .filter((child): child is React.ReactNode => child !== null);\n}\n\n/**\n * Helper to walk a nested path through a bindings object.\n * Example: getNestedBinding({ ctas: { primary: { label: 'text' } } }, 'ctas.primary.label') → 'text'\n */\nfunction getNestedBinding(bindings: Record<string, unknown>, path: string): unknown {\n const segments = path.split('.');\n let current: unknown = bindings;\n\n for (const segment of segments) {\n if (!isPlainObject(current)) return undefined;\n current = (current as Record<string, unknown>)[segment];\n }\n\n return current;\n}\n\n/**\n * Resolves a block field binding back to its source entry path for editing.\n * Returns the path for editor injection (content.* or metadata.*), or null if read-only.\n *\n * Supports:\n * - Flat bindings: bindings['headline'] → 'title'\n * - Nested bindings: bindings.ctas.primary.label → 'ctaText'\n * - Fallback bindings: Makes first editable option in chain editable\n */\nfunction resolveBindingToEditorPath(\n fieldName: string,\n bindings: Record<string, unknown> | undefined\n): string | null {\n if (!bindings) return null;\n\n // Try both flat key lookup and nested path walking\n // This supports both bindings['ctas.primary.label'] and bindings.ctas.primary.label\n const binding = bindings[fieldName] ?? getNestedBinding(bindings, fieldName);\n if (!binding) return null;\n\n // Handle explicit binding descriptors\n if (isPlainObject(binding) && 'source' in binding) {\n const source = (binding as Record<string, unknown>).source;\n\n if (source === 'field' && 'path' in binding) {\n // Field binding: content.<path>\n const path = (binding as Record<string, unknown>).path;\n return typeof path === 'string' ? `content.${path}` : null;\n }\n\n if (source === 'meta' && 'path' in binding) {\n // Metadata binding: metadata.<mappedPath>\n // Map meta paths to their actual store keys (draft prefix convention)\n const path = (binding as Record<string, unknown>).path;\n if (typeof path !== 'string') return null;\n const mappedPath = mapMetaPathToStoreKey(path);\n return `metadata.${mappedPath}`;\n }\n\n // Fallback binding: Make first editable option in chain editable\n if (source === 'fallback' && 'options' in binding) {\n const options = (binding as Record<string, unknown>).options;\n if (!Array.isArray(options)) return null;\n\n // Find first editable option (field or meta binding)\n for (const option of options) {\n // String shorthand defaults to field binding\n if (typeof option === 'string') {\n return `content.${option}`;\n }\n\n // Check for field/meta descriptors\n if (isPlainObject(option) && 'source' in option) {\n const optSource = (option as Record<string, unknown>).source;\n\n if (optSource === 'field' && 'path' in option) {\n const path = (option as Record<string, unknown>).path;\n return typeof path === 'string' ? `content.${path}` : null;\n }\n\n if (optSource === 'meta' && 'path' in option) {\n const path = (option as Record<string, unknown>).path;\n if (typeof path !== 'string') return null;\n const mappedPath = mapMetaPathToStoreKey(path);\n return `metadata.${mappedPath}`;\n }\n\n // Skip literal, transform - they're computed/static, continue to next option\n }\n }\n\n // No editable option found in fallback chain\n return null;\n }\n\n // Literal, transform: read-only\n return null;\n }\n\n // Handle string shorthand (defaults to field binding)\n if (typeof binding === 'string') {\n return `content.${binding}`;\n }\n\n // Unknown format\n return null;\n}\n\n/**\n * Injects editor path into props for text/richText nodes bound to content fields.\n */\nfunction injectEditorPath(\n props: Record<string, unknown>,\n node: NodeDefinition,\n parsedBinding: ReturnType<typeof bindingSchema.parse> | undefined,\n context: InternalContext\n): Record<string, unknown> {\n if (!parsedBinding) return props;\n if (node.type !== 'text' && node.type !== 'richText') return props;\n\n const abs = getAbsoluteSegments(parsedBinding.from, context);\n const absolutePath = abs ? segmentsToPath(abs) : undefined;\n\n if (!absolutePath) return props;\n\n // Early exit for non-content bindings\n if (absolutePath !== 'content' && !absolutePath.startsWith('content.')) {\n return props;\n }\n\n const fieldPath = absolutePath === 'content' ? '' : absolutePath.slice('content.'.length);\n if (!fieldPath) return props;\n\n // CASE 1: Template binding resolution (entry blocks)\n // Check for template bindings FIRST - entry editing takes priority over block editing\n // Example: block field \"headline\" with binding {source:'meta', path:'title'} → inject \"metadata.title\"\n if (context.blockBindings) {\n const entryPath = resolveBindingToEditorPath(fieldPath, context.blockBindings);\n\n if (entryPath) {\n return { ...props, path: entryPath };\n }\n // If no template binding found, fall through to direct block editing\n }\n\n // CASE 2: Direct content binding (page/block editing)\n // Example: binding is \"content.title\" → inject \"blocks.<blockId>.title\"\n const prefix = context.pathBase ?? '';\n const injectedPath = `${prefix}${fieldPath}`;\n\n return {\n ...props,\n path: injectedPath,\n };\n}\n\n/**\n * Resolves children nodes, flattening arrays and filtering nulls.\n */\nfunction resolveChildren(\n nodes: NodeDefinition[] | undefined,\n context: InternalContext\n): React.ReactNode[] {\n if (!nodes?.length) return [];\n\n return nodes.flatMap((child, index) => {\n const childContext: InternalContext = { ...context, scopes: [...context.scopes] };\n const resolved = resolveNode(child, childContext, index);\n\n if (Array.isArray(resolved)) {\n return resolved.filter((item) => item !== null && item !== undefined);\n }\n\n return resolved !== null && resolved !== undefined ? [resolved] : [];\n });\n}\n\n/**\n * Resolves a node definition into a React element.\n * Handles conditionals ($when), scopes ($scopes), repeaters ($repeat), bindings ($bind), and children.\n */\nexport function resolveNode(\n node: NodeDefinition,\n context: InternalContext,\n indexFallback?: number\n): React.ReactNode | null {\n // Early exit for conditional rendering\n if (!shouldRenderNode(node, context)) {\n return null;\n }\n\n // Apply any $scopes to create a new scope context\n const scopeContext = applyScopes(node, context);\n\n // Handle repeaters\n if (node.$repeat) {\n return resolveRepeater(node, scopeContext);\n }\n\n // Resolve component from server registry (not passed as prop to maintain SSR compatibility)\n const registry = scopeContext.registry ?? serverComponentRegistry;\n const normalizedType = node.type.toLowerCase();\n const component =\n registry[node.type] ??\n registry[normalizedType] ??\n (normalizedType === \"section\" ? (SectionNode as any) : undefined);\n if (!component) {\n if ((globalThis as any)?.process?.env?.NODE_ENV !== \"production\") {\n console.warn(`[block-system] Missing renderer for node type: ${node.type}`);\n }\n return null;\n }\n\n // Resolve node binding\n const parsedBinding = node.$bind ? parseBinding(node.$bind, \"$bind\") : undefined;\n const bindingValue = parsedBinding ? resolveBindingValue(parsedBinding, scopeContext) : undefined;\n\n // Resolve props with potential bindings\n let props = resolveProps(node.props ?? {}, scopeContext, bindingValue);\n\n // Inject editor path for content-bound text/richText nodes\n props = injectEditorPath(props, node, parsedBinding, scopeContext);\n\n // Resolve children\n const children = resolveChildren(node.children, scopeContext);\n\n // Create element with merged props\n // Note: registry is NOT passed as a prop to maintain SSR compatibility\n // Components that need the registry should import serverComponentRegistry directly\n const elementProps = {\n ...props,\n key: node.key ?? indexFallback,\n pathBase: context.pathBase,\n blockId: context.blockId,\n blockKind: context.blockKind,\n blockContent: context.blockContent,\n fragmentRegistry: context.fragmentRegistry,\n };\n\n return React.createElement(component, elementProps, ...children);\n}\n\n/**\n * Recursively resolves a value, handling bindings, objects, and arrays.\n *\n * This function enables nested bindings like:\n * ```typescript\n * style: {\n * aspectRatio: { $bind: { from: 'content.aspectRatio' } }\n * }\n * ```\n *\n * It also supports $prepend and $append for string composition:\n * ```typescript\n * className: {\n * $bind: { from: 'variant' },\n * $prepend: 'card-',\n * $append: ' extra-class'\n * }\n * ```\n *\n * @param value - The value to resolve (may contain nested bindings)\n * @param context - The resolution context containing viewModel, transforms, etc.\n * @returns The resolved value with all bindings evaluated\n */\nfunction resolveValue(value: unknown, context: InternalContext): unknown {\n // Handle binding directives at any nesting level\n if (value && typeof value === \"object\" && \"$bind\" in (value as Record<string, unknown>)) {\n try {\n const valueObj = value as Record<string, unknown>;\n const parsed = parseBinding(valueObj.$bind, 'nested-binding');\n let resolved = resolveBindingValue(parsed, context);\n\n // Apply $prepend and $append for string composition\n if (typeof resolved === 'string') {\n if ('$prepend' in valueObj && typeof valueObj.$prepend === 'string') {\n resolved = valueObj.$prepend + resolved;\n }\n if ('$append' in valueObj && typeof valueObj.$append === 'string') {\n resolved = resolved + valueObj.$append;\n }\n }\n\n return resolved;\n } catch {\n // Preserve original value on parse failure\n return value;\n }\n }\n\n // Recursively handle plain objects (like `style: { aspectRatio: ... }`)\n // Exclude arrays, Dates, and other special object types from recursion\n if (\n value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n !(value instanceof Date) &&\n Object.getPrototypeOf(value) === Object.prototype\n ) {\n const resolved: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n resolved[k] = resolveValue(v, context);\n }\n return resolved;\n }\n\n // Recursively handle arrays\n if (Array.isArray(value)) {\n return value.map(item => resolveValue(item, context));\n }\n\n // Return primitives and special objects as-is\n return value;\n}\n\n/**\n * Resolves props, handling both static values and bound props (with $bind).\n * Also injects the node's binding value as the 'value' prop if present.\n *\n * This function now recursively resolves nested bindings in objects and arrays,\n * enabling complex binding patterns like style objects with multiple bound properties.\n */\nfunction resolveProps(\n props: Record<string, unknown>,\n context: InternalContext,\n bindingValue: unknown\n): Record<string, unknown> {\n const resolved: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(props)) {\n // Recursively resolve the value (handles nested objects/arrays with bindings)\n resolved[key] = resolveValue(value, context);\n }\n\n // Inject node binding value as 'value' prop\n if (bindingValue !== undefined) {\n resolved.value = bindingValue;\n }\n\n return resolved;\n}\n\n/**\n * Main entry point for resolving node definitions into React elements.\n * Accepts a single node or array of nodes and returns React elements.\n */\nexport function resolveTree(\n node: NodeDefinition | NodeDefinition[],\n options: ResolverContext\n): React.ReactNode {\n if (!options.registry) {\n throw new Error(\"Component registry is required for node resolution\");\n }\n\n // Auto-create content scope for block contexts\n // When viewModel has 'content' property and we're starting with no scopes,\n // automatically push a 'content' scope so fragments can use relative paths\n const scopes: ScopeEntry[] = [];\n const viewModel = options.viewModel || {};\n const hasContentInViewModel = 'content' in viewModel && viewModel.content !== undefined;\n\n if (hasContentInViewModel) {\n scopes.push({\n name: 'content',\n value: viewModel.content\n });\n }\n\n const scopedContext: InternalContext = {\n ...options,\n transforms: options.transforms ?? defaultTransforms,\n theme: options.theme ?? defaultThemeTokens,\n scopes,\n };\n\n if (Array.isArray(node)) {\n return node\n .map((child, idx) => resolveNode(child, scopedContext, idx))\n .filter((child): child is React.ReactNode => child !== null);\n }\n\n return resolveNode(node, scopedContext);\n}\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","import React from \"react\";\nimport clsx from \"clsx\";\nimport { backgroundColorStyle, mergeStyles } from \"../../theme/utils/colorStyles\";\nimport { PrimitiveProps } from \"../types\";\n\ntype SectionProps = PrimitiveProps & {\n background: string,\n allowOverflow?: boolean,\n /** Data slot attribute for CSS targeting */\n 'data-slot'?: string,\n}\nexport default function Section({\n as: Comp = \"section\",\n children,\n background = 'background',\n className = '',\n allowOverflow = false,\n style,\n 'data-slot': dataSlot,\n}: SectionProps) {\n const overflowClass = allowOverflow ? 'overflow-visible' : 'overflow-hidden';\n const alwaysClass = clsx('relative isolate', overflowClass, className);\n const backgroundStyle = background ? backgroundColorStyle(background) : undefined;\n\n return <Comp className={alwaysClass} style={mergeStyles(backgroundStyle, style)} data-slot={dataSlot ?? 'section'}>\n {children}\n </Comp>;\n}\n","// primitives/stack.tsx\nimport React from \"react\";\nimport clsx from \"clsx\"\nimport { PrimitiveProps } from \"../types\"\n\ntype StackProps = PrimitiveProps & {\n gap?: \"none\" | \"xs\" | \"sm\" | \"md\" | \"lg\"\n align?: \"start\" | \"center\" | \"end\" | \"stretch\"\n justify?: \"start\" | \"center\" | \"end\" | \"between\"\n /** Data slot attribute for CSS targeting */\n 'data-slot'?: string\n}\n\nexport function Stack({\n as: Comp = \"div\",\n gap = \"md\",\n align = \"stretch\",\n justify = \"start\",\n className,\n children,\n 'data-slot': dataSlot,\n}: StackProps) {\n return (\n <Comp\n className={clsx(\n \"flex flex-col\",\n {\n \"gap-0\": gap === \"none\",\n \"gap-1\": gap === \"xs\",\n \"gap-2\": gap === \"sm\",\n \"gap-4\": gap === \"md\",\n \"gap-6\": gap === \"lg\",\n \"items-start\": align === \"start\",\n \"items-center\": align === \"center\",\n \"items-end\": align === \"end\",\n \"items-stretch\": align === \"stretch\",\n \"justify-start\": justify === \"start\",\n \"justify-center\": justify === \"center\",\n \"justify-end\": justify === \"end\",\n \"justify-between\": justify === \"between\",\n },\n className\n )}\n data-slot={dataSlot ?? 'stack'}\n >\n {children}\n </Comp>\n )\n}\n","// primitives/inline.tsx\nimport React from \"react\";\nimport clsx from \"clsx\";\nimport { PrimitiveProps } from \"../types\";\n\ntype InlineProps = PrimitiveProps & {\n gap?: \"none\" | \"xs\" | \"sm\" | \"md\" | \"lg\"\n align?: \"start\" | \"center\" | \"end\" | \"stretch\" | \"baseline\"\n justify?: \"start\" | \"center\" | \"end\" | \"between\"\n wrap?: boolean\n /** Data slot attribute for CSS targeting */\n 'data-slot'?: string\n}\n\nexport function Inline({\n as: Comp = \"div\",\n gap = \"md\",\n align = \"center\",\n justify = \"start\",\n wrap = false,\n className,\n children,\n 'data-slot': dataSlot,\n}: InlineProps) {\n return (\n <Comp\n className={clsx(\n \"flex\",\n wrap && \"flex-wrap\",\n {\n \"gap-0\": gap === \"none\",\n \"gap-1\": gap === \"xs\",\n \"gap-2\": gap === \"sm\",\n \"gap-4\": gap === \"md\",\n \"gap-6\": gap === \"lg\",\n \"items-start\": align === \"start\",\n \"items-center\": align === \"center\",\n \"items-end\": align === \"end\",\n \"items-stretch\": align === \"stretch\",\n \"items-baseline\": align === \"baseline\",\n \"justify-start\": justify === \"start\",\n \"justify-center\": justify === \"center\",\n \"justify-end\": justify === \"end\",\n \"justify-between\": justify === \"between\",\n },\n className\n )}\n data-slot={dataSlot ?? 'inline'}\n >\n {children}\n </Comp>\n )\n}\n","// primitives/grid.tsx\nimport React from \"react\";\nimport clsx from \"clsx\";\nimport { PrimitiveProps } from \"../types\";\n\ntype GridProps = PrimitiveProps & {\n cols?: number | { base?: number; sm?: number; md?: number; lg?: number; xl?: number }\n gap?: \"none\" | \"xs\" | \"sm\" | \"md\" | \"lg\"\n /** Data slot attribute for CSS targeting */\n 'data-slot'?: string\n}\n\nexport function Grid({\n as: Comp = \"div\",\n cols = { base: 1, md: 2 },\n gap = \"md\",\n className,\n children,\n 'data-slot': dataSlot,\n}: GridProps) {\n // Normalize cols to object format\n // If cols is a number, convert it to { base: cols }\n const colsObj = typeof cols === 'number' ? { base: cols } : cols;\n\n const colClasses = [\n colsObj.base && `grid-cols-${colsObj.base}`,\n colsObj.sm && `sm:grid-cols-${colsObj.sm}`,\n colsObj.md && `md:grid-cols-${colsObj.md}`,\n colsObj.lg && `lg:grid-cols-${colsObj.lg}`,\n colsObj.xl && `xl:grid-cols-${colsObj.xl}`,\n ]\n\n return (\n <Comp\n className={clsx(\n \"grid\",\n colClasses,\n {\n \"gap-0\": gap === \"none\",\n \"gap-1\": gap === \"xs\",\n \"gap-2\": gap === \"sm\",\n \"gap-4\": gap === \"md\",\n \"gap-6\": gap === \"lg\",\n },\n className\n )}\n data-slot={dataSlot ?? 'grid'}\n >\n {children}\n </Comp>\n )\n}\n","import React from 'react'\n\nimport Section from '../../../primitives/layout/Section'\nimport { Stack as StackPrimitive } from '../../../primitives/layout/Stack'\nimport { Inline as InlinePrimitive } from '../../../primitives/layout/Inline'\nimport { Grid as GridPrimitive } from '../../../primitives/layout/Grid'\n\nexport const SectionNode: React.FC<any> = ({ blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, pathBase: _pathBase, allowOverflow, ...props }) => <Section {...props} allowOverflow={allowOverflow} />\nexport const StackNode: React.FC<any> = ({ blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, pathBase: _pathBase, ...props }) => <StackPrimitive {...props} />\nexport const InlineNode: React.FC<any> = ({ blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, pathBase: _pathBase, ...props }) => <InlinePrimitive {...props} />\nexport const GridNode: React.FC<any> = ({ blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, pathBase: _pathBase, ...props }) => <GridPrimitive {...props} />\nexport const DivNode: React.FC<any> = ({ blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, pathBase: _pathBase, ...props }) => (\n <div {...props} />\n)\n","import React from 'react';\nimport type { RichTextPrimitiveProps } from \"../primitives\";\nimport type { TipTapNode } from \"../../../system/manifest/richTextSchema\";\n\nfunction renderMarks(text: string, marks: Array<{ type: string }> | null | undefined, key: string) {\n if (!marks || marks.length === 0) return text;\n return marks.reduce<React.ReactNode>((acc, mark) => {\n switch (mark.type) {\n case 'bold':\n case 'strong':\n return <strong key={`${key}-b`}>{acc}</strong>;\n case 'italic':\n case 'em':\n return <em key={`${key}-i`}>{acc}</em>;\n default:\n return acc;\n }\n }, text);\n}\n\nfunction renderDoc(node: TipTapNode | null | undefined, key: string): React.ReactNode {\n if (!node || !node.type) return null;\n const children = node.content?.map((child, index) => renderDoc(child, `${key}-${index}`));\n\n switch (node.type) {\n case 'doc':\n return <>{children}</>;\n case 'paragraph':\n if (!children && !node.text) return <p key={key} />;\n return <p key={key}>{children ?? renderMarks(node.text ?? '', node.marks, key)}</p>;\n case 'heading': {\n const level = Math.min(Math.max((node.attrs?.level as number) ?? 2, 1), 6);\n const headingTag = `h${level}`;\n return React.createElement(headingTag, { key }, children);\n }\n case 'bulletList':\n return <ul key={key}>{children}</ul>;\n case 'orderedList':\n return <ol key={key}>{children}</ol>;\n case 'listItem':\n return <li key={key}>{children}</li>;\n case 'blockquote':\n return <blockquote key={key}>{children}</blockquote>;\n case 'horizontalRule':\n return <hr key={key} />;\n case 'text':\n return renderMarks(node.text ?? '', node.marks, key);\n default:\n return null;\n }\n}\n\nexport default function RichText({ as: Comp = 'div', className = '', doc, path }: RichTextPrimitiveProps) {\n const content = doc ? renderDoc(doc, 'doc') : null;\n const dataAttributes = path ? { 'data-builder-richtext': path } : undefined;\n return (\n <Comp className={`${className}`} {...dataAttributes}>\n {content}\n </Comp>\n );\n}\n","import React from \"react\";\nimport type { TextProps } from \"../primitives\";\n\nexport default function Text({ as: Comp = \"span\", children, className = \"\", path }: TextProps) {\n const dataAttributes = path ? { 'data-builder-text': path } : undefined;\n return <Comp className={className} {...dataAttributes}>{children}</Comp>;\n}\n","import React from 'react'\n\nimport RichTextPrimitive from '../../../primitives/content/components/RichText'\nimport TextPrimitive from '../../../primitives/content/components/Text'\n\nexport type TextNodeProps = {\n value?: React.ReactNode\n className?: string\n path?: string\n children?: React.ReactNode\n}\n\nexport const TextNode: React.FC<TextNodeProps & { blockId?: string; blockKind?: string; blockContent?: unknown; fragmentRegistry?: unknown; pathBase?: string }> = ({ value, children, blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, pathBase: _pathBase, ...rest }) => {\n return <TextPrimitive {...rest}>{value ?? children}</TextPrimitive>\n}\n\nexport type RichTextNodeProps = {\n value?: unknown\n path?: string\n className?: string\n children?: React.ReactNode\n}\n\nexport const RichTextNode: React.FC<RichTextNodeProps & { blockId?: string; blockKind?: string; blockContent?: unknown; fragmentRegistry?: unknown; pathBase?: string }> = ({ value, blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, pathBase: _pathBase, ...rest }) => {\n // Unwrap legacy { doc: {...} } format for backward compatibility\n const doc = (value as any)?.doc ?? value\n return <RichTextPrimitive doc={doc as any} {...rest} />\n}\n\nexport type ButtonNodeProps = {\n value?: React.ReactNode\n href?: string\n className?: string\n target?: string\n rel?: string\n children?: React.ReactNode\n /** Button variant ID (reads from theme.buttons.variants) */\n variantId?: string\n /** Disabled state */\n disabled?: boolean\n /** Button type (for form buttons) */\n type?: 'button' | 'submit' | 'reset'\n}\n\nexport const ButtonNode: React.FC<\n ButtonNodeProps & { blockId?: string; blockKind?: string; blockContent?: unknown; fragmentRegistry?: unknown; pathBase?: string }\n> = ({\n value,\n children,\n href,\n variantId = 'primary',\n disabled,\n type = 'button',\n blockId: _blockId,\n blockKind: _blockKind,\n blockContent: _blockContent,\n fragmentRegistry: _fragmentRegistry,\n pathBase: _pathBase,\n className,\n ...rest\n}) => {\n const content = value ?? children\n\n if (!content) {\n console.warn('[ButtonNode] No content to render - value and children are both empty')\n return null\n }\n\n // Simple class application - variant ID plus any custom classes\n // All styling is in generated CSS (no Tailwind utility classes needed)\n const combinedClassName = [variantId, className].filter(Boolean).join(' ')\n\n // If href is provided, render as link\n if (href) {\n return (\n <a\n href={href}\n className={combinedClassName}\n {...rest}\n >\n {content}\n </a>\n )\n }\n\n // Otherwise render as button\n return (\n <button\n type={type}\n disabled={disabled}\n className={combinedClassName}\n {...rest}\n >\n {content}\n </button>\n )\n}\n\nexport type LinkNodeProps = {\n href?: string\n className?: string\n target?: string\n rel?: string\n children?: React.ReactNode\n}\n\nexport const LinkNode: React.FC<\n LinkNodeProps & { blockId?: string; blockKind?: string; blockContent?: unknown; fragmentRegistry?: unknown; pathBase?: string }\n> = ({\n href = '#',\n children,\n blockId: _blockId,\n blockKind: _blockKind,\n blockContent: _blockContent,\n fragmentRegistry: _fragmentRegistry,\n pathBase: _pathBase,\n ...rest\n}) => {\n if (!children) return null\n return (\n <a href={href} {...rest}>\n {children}\n </a>\n )\n}\n","export type MediaSource = 'upload' | 'instagram'\n\nexport type MediaAsset = {\n id: string\n siteId: string\n storageBucket: string\n storagePath: string\n filename: string\n mimeType: string\n width?: number\n height?: number\n bytes?: number\n checksumSha256?: string\n source: MediaSource\n altText?: string\n caption?: string\n exif?: Record<string, unknown>\n createdBy?: string\n createdAt: string\n updatedAt: string\n classifiedAt?: string\n labelsCached?: string[]\n // Video metadata\n durationSeconds?: number\n thumbnailAssetId?: string\n isThumbnail?: boolean\n}\n\nexport type TransformFit =\n | 'clip'\n | 'crop'\n | 'fill'\n | 'fillmax'\n | 'max'\n | 'scale'\n | 'min'\n\nexport type TransformCrop =\n | 'top'\n | 'bottom'\n | 'left'\n | 'right'\n | 'center'\n | 'focalpoint'\n | 'entropy'\n\nexport type TransformFormat = 'jpg' | 'pjpg' | 'png' | 'webp' | 'avif' | 'json'\n\nexport type TransformFlip = 'h' | 'v' | 'hv'\n\nexport type TransformColorSpace = 'srgb' | 'cmyk' | 'b-w' | 'origin'\n\nexport type TransformRect = [number, number, number, number]\n\nexport type TransformParams = {\n w?: number\n h?: number\n dpr?: number\n fit?: TransformFit\n crop?: TransformCrop\n fpX?: number\n fpY?: number\n rect?: TransformRect\n q?: number\n fm?: TransformFormat\n autoFormat?: boolean\n bg?: string\n flip?: TransformFlip\n or?: 0 | 90 | 180 | 270\n pad?: number\n blur?: number\n sharp?: number\n invert?: boolean\n sat?: number\n cs?: TransformColorSpace\n}\n\nexport type ParamKey = keyof TransformParams\n\n// SVG detection utilities\nexport const SVG_MIME_TYPE = 'image/svg+xml'\n\nexport function isSvgMimeType(mimeType: string | undefined): boolean {\n return mimeType === SVG_MIME_TYPE\n}\n","import type { MediaAsset, ParamKey, TransformParams } from './types'\n\nconst DEFAULT_BASE_PATH = '/api/img'\n\nconst formatNumber = (value: number) =>\n Number.isInteger(value)\n ? value.toString()\n : value.toFixed(6).replace(/0+$/, '').replace(/\\.$/, '')\n\nconst addParam = <T extends ParamKey>(\n search: URLSearchParams,\n key: T,\n value: TransformParams[T] | undefined\n) => {\n if (value === undefined) return\n\n switch (key) {\n case 'fpX':\n search.set('fp-x', formatNumber(value as number))\n break\n case 'fpY':\n search.set('fp-y', formatNumber(value as number))\n break\n case 'rect': {\n const rect = value as TransformParams['rect'] | undefined\n if (!rect) break\n search.set('rect', rect.map(formatNumber).join(','))\n break\n }\n case 'autoFormat':\n if (value) {\n search.append('auto', 'format')\n }\n break\n case 'invert':\n search.set('invert', (value as boolean) ? 'true' : 'false')\n break\n default:\n search.set(\n key,\n typeof value === 'number' ? formatNumber(value) : String(value)\n )\n }\n}\n\nconst ORDER: ParamKey[] = [\n 'w',\n 'h',\n 'dpr',\n 'fit',\n 'crop',\n 'fpX',\n 'fpY',\n 'rect',\n 'q',\n 'fm',\n 'autoFormat',\n 'bg',\n 'flip',\n 'or',\n 'pad',\n 'blur',\n 'sharp',\n 'invert',\n 'sat',\n 'cs'\n]\n\nexport const getImageUrl = (\n asset: Pick<MediaAsset, 'id'>,\n params: TransformParams = {},\n basePath: string = DEFAULT_BASE_PATH\n) => {\n const trimmedBase = basePath.endsWith('/')\n ? basePath.slice(0, Math.max(basePath.length - 1, 0))\n : basePath\n const path = `${trimmedBase}/${encodeURIComponent(asset.id)}`\n const searchParams = new URLSearchParams()\n\n ORDER.forEach((key) => {\n addParam(searchParams, key, params[key])\n })\n\n const query = searchParams.toString()\n return query ? `${path}?${query}` : path\n}\n","import React from 'react'\nimport clsx from 'clsx'\nimport { getImageUrl } from '@riverbankcms/media-core'\nimport type { Media } from '../../../lib/media'\nimport {\n backgroundColorStyle,\n mergeStyles,\n textColorStyle,\n} from '../../../theme/utils/colorStyles'\n\n// Inline getCmsApiUrl to avoid circular dependency with @riverbankcms/api\nfunction getCmsApiUrl(): string {\n const dashboardUrl = process.env.NEXT_PUBLIC_DASHBOARD_URL\n if (dashboardUrl) {\n const base = dashboardUrl.replace(/\\/$/, '')\n return `${base}/api`\n }\n\n const legacyApiUrl = process.env.NEXT_PUBLIC_CMS_API_URL\n if (legacyApiUrl) {\n return legacyApiUrl.replace(/\\/$/, '')\n }\n\n throw new Error(\n 'NEXT_PUBLIC_DASHBOARD_URL is not configured. ' +\n 'Set it to your dashboard URL (e.g., http://dashboard.local:4000)'\n )\n}\n\nconst debugMediaNodeLog = (...args: Array<unknown>) => {\n if (typeof window !== 'undefined' && (window as any).__DEBUG_MEDIA_NODE__) {\n console.log('[MediaNode]', ...args)\n }\n}\n\nexport type MediaNodeProps = {\n value?: Media | null\n className?: string\n style?: React.CSSProperties\n children?: React.ReactNode\n /**\n * Preview API key for accessing unpublished images.\n * Pass this when rendering preview/draft content on SDK sites.\n */\n previewKey?: string | null\n}\n\nexport const MediaNode: React.FC<MediaNodeProps> = ({ value, className, style, previewKey }) => {\n if (!value) return null\n\n if (value.type === 'video') {\n const src = value.src\n if (!src) return null\n return (\n <video className={className} style={style} src={src} autoPlay muted loop playsInline aria-label={value.alt ?? ''} />\n )\n }\n\n const imageUrl = resolveImageUrl(value, { previewKey })\n if (!imageUrl) {\n return (\n <div\n className={clsx('flex h-48 w-full items-center justify-center', className)}\n style={mergeStyles(backgroundColorStyle('neutral-200'), style)}\n >\n <span className=\"text-sm\" style={textColorStyle('neutral-600')}>\n Image unavailable\n </span>\n </div>\n )\n }\n\n // Check if image URL is cross-origin (different domain than current page)\n const isCrossOrigin = typeof window !== 'undefined' && imageUrl.startsWith('http') && !imageUrl.startsWith(window.location.origin)\n\n // For cross-origin images:\n // - Signed URLs from storage: use 'anonymous' (auth is in URL token)\n // - API routes (/api/img, /api/public/img): use 'use-credentials' to send cookies\n const isApiRoute = imageUrl.includes('/api/img') || imageUrl.includes('/api/public/img')\n const crossOriginMode = isCrossOrigin && isApiRoute ? 'use-credentials' : (isCrossOrigin ? 'anonymous' : undefined)\n\n return (\n <img\n src={imageUrl}\n alt={value.alt ?? ''}\n className={className}\n style={style}\n loading=\"lazy\"\n crossOrigin={crossOriginMode}\n />\n )\n}\n\nexport type ResolveImageUrlOptions = {\n /**\n * Preview API key for accessing unpublished images.\n * When provided, appended as ?preview_key=xxx to the image URL.\n */\n previewKey?: string | null\n}\n\nexport function resolveImageUrl(value: Media, options: ResolveImageUrlOptions = {}): string | undefined {\n if (value.type !== 'image') return undefined\n const params: Record<string, unknown> = {}\n const rect = value.transform?.rect\n const hotspot = value.transform?.hotspot\n\n if (rect && Array.isArray(rect) && rect.length === 4) {\n params.rect = rect.join(',')\n }\n if (hotspot && typeof hotspot.x === 'number' && typeof hotspot.y === 'number') {\n const x = clamp(hotspot.x)\n const y = clamp(hotspot.y)\n params.hotspot = `${x.toFixed(4)},${y.toFixed(4)}`\n }\n\n debugMediaNodeLog('resolveImageUrl input', {\n assetId: value.assetId,\n src: value.src,\n type: value.type,\n hasPreviewKey: !!options.previewKey,\n })\n\n // 1) Asset ID - route through the public image proxy\n // This handles media library assets from the private 'media' bucket\n // - Published assets: accessible without authentication\n // - Unpublished assets: require preview_key query param\n if (value.assetId) {\n const cmsApiBase = getCmsApiUrl()\n const basePath = `${cmsApiBase}/public/img`\n\n let resolved = getImageUrl({ id: value.assetId }, params, basePath)\n\n // Append preview key for accessing unpublished images\n if (options.previewKey) {\n const separator = resolved.includes('?') ? '&' : '?'\n resolved = `${resolved}${separator}preview_key=${encodeURIComponent(options.previewKey)}`\n }\n\n debugMediaNodeLog('resolve:asset-id', {\n assetId: value.assetId,\n cmsApiBase,\n basePath,\n resolvedUrl: resolved,\n hasPreviewKey: !!options.previewKey,\n })\n return resolved\n }\n\n // 2) Explicit src - used when there's no assetId (e.g., external URLs, site logos from public buckets)\n if (typeof value.src === 'string' && value.src.length > 0) {\n debugMediaNodeLog('resolve:explicit-src', { src: value.src })\n return value.src\n }\n\n // 3) Loose fallback for legacy shapes\n debugMediaNodeLog('resolve:fallback-url', { fallbackUrl: (value as any).url ?? null })\n return (value as any).url ?? undefined\n}\n\nfunction clamp(v: number, min = 0, max = 1) {\n return Math.min(Math.max(v, min), max)\n}\n","import React from 'react'\nimport clsx from 'clsx'\nimport {\n backgroundColorStyle,\n borderColorStyle,\n mergeStyles,\n textColorStyle,\n} from '../../../theme/utils/colorStyles'\n\ntype FormNodeProps = {\n value?: any\n submitLabel?: string\n successMessage?: string | null\n className?: string\n}\n\n// Server-safe, non-interactive form rendering\nexport const FormNodeSSR: React.FC<FormNodeProps> = ({ value, submitLabel, successMessage: _successMessage, className }) => {\n const form = value\n if (!form) {\n return (\n <div\n className={clsx('rounded-md border border-dashed p-6 text-sm', className)}\n style={mergeStyles(\n backgroundColorStyle('surface'),\n borderColorStyle('border'),\n textColorStyle('mutedText'),\n )}\n >\n Missing or unknown form.\n </div>\n )\n }\n\n const fields = (form as any)?.schemaJson?.fields\n return (\n <form method=\"POST\" action=\"/api/forms/submit\" className={clsx('space-y-4', className)}>\n <input type=\"hidden\" name=\"form_id\" value={form.id} />\n {/* Honeypot */}\n <input type=\"text\" name=\"company\" className=\"hidden\" tabIndex={-1} autoComplete=\"off\" />\n\n {Array.isArray(fields)\n ? fields.map((field: any) => {\n const inputId = `f_${field.id}`\n const label = String(field.label ?? field.id)\n const required = Boolean(field.required)\n const type = String(field.type ?? 'text')\n if (type === 'textarea') {\n return (\n <div key={field.id} className=\"space-y-1\">\n <label htmlFor={inputId} className=\"form-label\">\n {label}\n </label>\n <textarea\n id={inputId}\n name={field.id}\n required={required}\n placeholder={field.placeholder}\n rows={field.rows}\n className=\"form-textarea\"\n />\n </div>\n )\n }\n if (type === 'select') {\n const options: Array<{ value: string; label: string }> = field.options ?? []\n const multiple = Boolean(field.multiple)\n return (\n <div key={field.id} className=\"space-y-1\">\n <label htmlFor={inputId} className=\"form-label\">\n {label}\n </label>\n <select\n id={inputId}\n name={field.id}\n multiple={multiple}\n required={required}\n className=\"form-select\"\n >\n {!multiple && <option value=\"\">Select…</option>}\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n </select>\n </div>\n )\n }\n if (type === 'radio') {\n const options: Array<{ value: string; label: string }> = field.options ?? []\n return (\n <fieldset key={field.id} className=\"space-y-2\">\n <legend className=\"form-label\">\n {label}\n </legend>\n {options.map((opt) => (\n <label\n key={opt.value}\n className=\"flex items-center gap-2 form-label\"\n >\n <input type=\"radio\" name={field.id} value={opt.value} required={required} className=\"form-radio\" />\n <span>{opt.label}</span>\n </label>\n ))}\n </fieldset>\n )\n }\n if (type === 'checkbox' || type === 'consent') {\n return (\n <label\n key={field.id}\n className=\"flex items-center gap-2 form-label\"\n >\n <input type=\"checkbox\" name={field.id} required={required} className=\"form-checkbox\" />\n <span>{label}</span>\n </label>\n )\n }\n const inputType = type === 'email' || type === 'url' || type === 'tel' || type === 'number' ? type : 'text'\n const extra: Record<string, any> = {}\n if (inputType === 'text' || inputType === 'email' || inputType === 'url' || inputType === 'tel') {\n if (typeof field.minLength === 'number') extra.minLength = field.minLength\n if (typeof field.maxLength === 'number') extra.maxLength = field.maxLength\n if (typeof field.pattern === 'string' && field.pattern) extra.pattern = field.pattern\n }\n if (inputType === 'number') {\n if (typeof field.min === 'number') extra.min = field.min\n if (typeof field.max === 'number') extra.max = field.max\n }\n return (\n <div key={field.id} className=\"space-y-1\">\n <label htmlFor={inputId} className=\"form-label\">\n {label}\n </label>\n <input\n id={inputId}\n name={field.id}\n type={inputType}\n required={required}\n placeholder={field.placeholder}\n {...extra}\n className=\"form-input\"\n />\n </div>\n )\n })\n : null}\n\n <div>\n <button\n type=\"submit\"\n className=\"primary\"\n >\n {submitLabel || 'Submit'}\n </button>\n </div>\n </form>\n )\n}\n\n","import React from 'react';\nimport clsx from 'clsx';\n\ntype CarouselNodeProps = {\n children?: React.ReactNode;\n className?: string;\n slidesToShow?: number | string;\n transition?: 'slide' | 'fade';\n showControls?: boolean | string;\n};\n\n/**\n * Server-safe carousel shell.\n * Renders static markup with controls; client counterpart hydrates behavior.\n */\nexport const CarouselNodeSSR: React.FC<CarouselNodeProps> = ({\n children,\n className,\n slidesToShow = 1,\n transition = 'slide',\n showControls = true,\n}) => {\n const slides = React.Children.toArray(children).filter(Boolean);\n const resolvedSlides = normalizeSlidesToShow(slidesToShow);\n const basis = `${100 / resolvedSlides}%`;\n const controlsEnabled = normalizeBoolean(showControls);\n const showNav = controlsEnabled && slides.length > resolvedSlides;\n\n return (\n <div\n className={clsx('relative', className)}\n data-slides-to-show={resolvedSlides}\n data-transition={transition}\n data-show-controls={controlsEnabled ? 'true' : 'false'}\n >\n <div className=\"overflow-hidden\">\n <div className=\"flex\">\n {slides.map((slide, index) => (\n <div\n key={index}\n className={clsx(\n 'shrink-0',\n transition === 'fade' && 'transition-opacity duration-500 ease-in-out',\n )}\n style={{ flex: `0 0 ${basis}` }}\n >\n {slide}\n </div>\n ))}\n </div>\n </div>\n {showNav ? (\n <div className=\"absolute inset-y-0 left-0 flex items-center px-2\">\n <span className=\"inline-flex h-9 w-9 items-center justify-center rounded-full bg-black/60 text-white\">\n ‹\n </span>\n </div>\n ) : null}\n {showNav ? (\n <div className=\"absolute inset-y-0 right-0 flex items-center px-2\">\n <span className=\"inline-flex h-9 w-9 items-center justify-center rounded-full bg-black/60 text-white\">\n ›\n </span>\n </div>\n ) : null}\n </div>\n );\n};\n\nfunction normalizeSlidesToShow(value: number | string | undefined): number {\n const parsed =\n typeof value === 'string'\n ? Number.parseInt(value, 10)\n : typeof value === 'number'\n ? value\n : 1;\n if (!Number.isFinite(parsed) || parsed <= 0) return 1;\n return Math.max(1, Math.min(4, parsed));\n}\n\nfunction normalizeBoolean(value: boolean | string | undefined): boolean {\n if (typeof value === 'string') {\n return value !== 'false';\n }\n return Boolean(value);\n}\n\nexport default CarouselNodeSSR;\n","import React from 'react';\nimport clsx from 'clsx';\nimport RichTextPrimitive from '../../../primitives/content/components/RichText';\n\ntype AccordionNodeProps = {\n children?: React.ReactNode;\n className?: string;\n type?: 'single' | 'multiple';\n defaultValue?: string | string[];\n collapsible?: boolean;\n};\n\nexport const AccordionNodeSSR: React.FC<AccordionNodeProps> = ({\n children,\n className,\n type = 'single',\n defaultValue,\n}) => {\n return (\n <div\n className={clsx('w-full accordion-root', className)}\n data-accordion-type={type}\n data-default-value={Array.isArray(defaultValue) ? defaultValue.join(',') : defaultValue}\n >\n {children}\n </div>\n );\n};\n\ntype AccordionItemNodeProps = {\n className?: string;\n value?: string | number | null;\n trigger?: unknown;\n content?: unknown;\n question?: unknown;\n answer?: unknown;\n};\n\nexport const AccordionItemNodeSSR: React.FC<AccordionItemNodeProps> = ({\n className,\n value,\n trigger,\n content,\n question,\n answer,\n}) => {\n const resolvedValue =\n value !== undefined && value !== null ? String(value) : undefined;\n const triggerSource = trigger ?? question;\n const contentSource = content ?? answer;\n\n return (\n <div className={clsx('border-b accordion-item', className)} data-accordion-value={resolvedValue}>\n <div className=\"flex w-full items-center justify-between py-3 accordion-trigger\">\n <span className=\"flex-1\">{resolveNode(triggerSource)}</span>\n <span aria-hidden=\"true\">+</span>\n </div>\n <div className=\"pb-3 accordion-content\">{resolveNode(contentSource)}</div>\n </div>\n );\n};\n\nfunction resolveNode(value: unknown): React.ReactNode {\n if (typeof value === 'string' || typeof value === 'number') return String(value);\n if (isDocNode(value)) {\n return <RichTextPrimitive doc={value as any} />;\n }\n return value as React.ReactNode;\n}\n\nfunction isDocNode(value: unknown): value is { type?: string; content?: unknown } {\n return Boolean(value && typeof value === 'object' && 'type' in (value as Record<string, unknown>));\n}\n\nexport default AccordionNodeSSR;\n","import React from 'react';\nimport Section from '../../../primitives/layout/Section';\n\ntype HeaderSectionNodeProps = React.PropsWithChildren<{\n className?: string;\n [key: string]: unknown;\n}>;\n\n/**\n * Server-safe header section without scroll effects.\n * Client counterpart adds scroll-aware behavior.\n */\nconst HeaderSectionNode: React.FC<HeaderSectionNodeProps> = ({ children, className, ...rest }) => {\n return (\n <Section {...(rest as any)} className={className}>\n {children}\n </Section>\n );\n};\n\nexport default HeaderSectionNode;\n","import React from 'react';\nimport clsx from 'clsx';\nimport type { PublicEvent } from '../../blocks/events/shared/types';\n\ntype EventListProps = {\n events?: PublicEvent[] | null;\n /** Layout mode: grid (cards) or stack (vertical list) */\n layout?: 'grid' | 'stack';\n /** Number of columns in grid layout (2, 3, or 4) */\n columns?: '2' | '3' | '4';\n /** Card variant from theme (default, variant1, variant2) */\n cardVariant?: 'default' | 'variant1' | 'variant2';\n /** Button variant from theme (primary, secondary, outline, link) */\n buttonVariant?: 'primary' | 'secondary' | 'outline' | 'link';\n /** Button text (default: 'View event') */\n buttonText?: string;\n showVenue?: boolean;\n showCapacity?: boolean;\n emptyMessage?: string;\n /** Base path for event registration URLs (default: '/events') */\n basePath?: string;\n className?: string;\n};\n\n/** Default base path for event URLs */\nconst DEFAULT_EVENT_BASE_PATH = '/events';\n\n/** Column class mappings for grid layout */\nconst COLUMN_CLASSES: Record<string, string> = {\n '2': 'sm:grid-cols-2',\n '3': 'sm:grid-cols-2 lg:grid-cols-3',\n '4': 'sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4',\n};\n\n/**\n * Extract the date portion from an ISO timestamp for URL building\n */\nfunction formatDateForUrl(isoTimestamp: string): string {\n return isoTimestamp.split('T')[0];\n}\n\n/**\n * Build the registration URL for an event occurrence\n */\nfunction buildEventUrl(basePath: string, slug: string, startsAt: string): string {\n const date = formatDateForUrl(startsAt);\n const normalizedPath = basePath.startsWith('/') ? basePath : `/${basePath}`;\n const cleanPath = normalizedPath.endsWith('/') ? normalizedPath.slice(0, -1) : normalizedPath;\n return `${cleanPath}/${slug}/${date}`;\n}\n\n/**\n * Format date for display (server-safe, no Intl)\n * Returns: \"Monday, January 15, 2025\"\n */\nfunction formatDate(isoTimestamp: string): string {\n const date = new Date(isoTimestamp);\n const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n const months = ['January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December'];\n return `${days[date.getDay()]}, ${months[date.getMonth()]} ${date.getDate()}, ${date.getFullYear()}`;\n}\n\n/**\n * Format time for display (server-safe, no Intl)\n * Returns: \"10:00 AM\"\n */\nfunction formatTime(isoTimestamp: string): string {\n const date = new Date(isoTimestamp);\n const hours = date.getHours();\n const minutes = date.getMinutes();\n const ampm = hours >= 12 ? 'PM' : 'AM';\n const displayHours = hours % 12 || 12;\n const displayMinutes = minutes.toString().padStart(2, '0');\n return `${displayHours}:${displayMinutes} ${ampm}`;\n}\n\n/**\n * EventCard Component (Server-safe)\n */\nconst EventCardSSR: React.FC<{\n event: PublicEvent;\n cardVariant?: 'default' | 'variant1' | 'variant2';\n buttonVariant?: 'primary' | 'secondary' | 'outline' | 'link';\n buttonText?: string;\n showVenue?: boolean;\n showCapacity?: boolean;\n basePath: string;\n}> = ({\n event,\n cardVariant = 'default',\n buttonVariant = 'primary',\n buttonText = 'View event',\n showVenue = true,\n showCapacity = true,\n basePath,\n}) => {\n const formattedDate = formatDate(event.startsAt);\n const formattedTime = `${formatTime(event.startsAt)} - ${formatTime(event.endsAt)}`;\n\n const isSoldOut = event.capacity !== null && event.availableSpots === 0;\n const spotsLeft = event.availableSpots;\n\n const cardClass = `card-${cardVariant}`;\n const buttonClass = `button-${buttonVariant}`;\n\n return (\n <article className={`${cardClass} group flex flex-col`}>\n <div className=\"card-content flex flex-col h-full\">\n <div className=\"mb-3\">\n <time className=\"text-sm font-medium opacity-60\">\n {formattedDate}\n </time>\n <p className=\"text-sm opacity-70\">{formattedTime}</p>\n </div>\n\n <h3 className=\"card-title mb-2 text-lg font-semibold\">\n {event.title}\n </h3>\n\n {event.description && (\n <p className=\"card-body mb-3 line-clamp-2 text-sm opacity-70\">\n {event.description}\n </p>\n )}\n\n {showVenue && event.venue && (\n <div className=\"mb-3 text-sm opacity-60\">\n <span className=\"font-medium\">{event.venue.name}</span>\n {event.venue.address && (\n <span className=\"ml-1 opacity-70\">\n · {event.venue.address}\n </span>\n )}\n </div>\n )}\n\n <div className=\"mt-auto flex items-center justify-between pt-4\">\n {showCapacity && event.capacity !== null && (\n <div>\n {isSoldOut ? (\n <span className=\"badge-status badge-status-sold-out\">\n Sold Out\n </span>\n ) : spotsLeft !== null && spotsLeft <= 5 ? (\n <span className=\"badge-status badge-status-low\">\n {spotsLeft} {spotsLeft === 1 ? 'spot' : 'spots'} left\n </span>\n ) : (\n <span className=\"badge-status badge-status-available\">\n {spotsLeft} spots available\n </span>\n )}\n </div>\n )}\n\n {!isSoldOut && (\n <a\n href={buildEventUrl(basePath, event.slug, event.startsAt)}\n className={buttonClass}\n >\n {buttonText}\n </a>\n )}\n </div>\n </div>\n </article>\n );\n};\n\n/**\n * EventListSSR Component\n *\n * Server-safe version of EventListClient for SSR rendering.\n * Renders the same HTML structure for proper hydration.\n */\nexport const EventListSSR: React.FC<EventListProps> = ({\n events,\n layout = 'grid',\n columns = '3',\n cardVariant = 'default',\n buttonVariant = 'primary',\n buttonText = 'View event',\n showVenue = true,\n showCapacity = true,\n emptyMessage = 'No upcoming events scheduled.',\n basePath = DEFAULT_EVENT_BASE_PATH,\n className,\n}) => {\n const normalizedEvents = events ?? [];\n\n if (normalizedEvents.length === 0) {\n return (\n <div className={clsx('event-list event-list-empty rounded-xl border border-dashed p-12 text-center', className)}>\n <p className=\"text-base opacity-60\">{emptyMessage}</p>\n </div>\n );\n }\n\n const containerClass = layout === 'stack'\n ? 'flex flex-col gap-6'\n : `grid gap-6 ${COLUMN_CLASSES[columns] || COLUMN_CLASSES['3']}`;\n\n return (\n <div className={clsx('event-list', containerClass, className)}>\n {normalizedEvents.map((event) => (\n <EventCardSSR\n key={event.id}\n event={event}\n cardVariant={cardVariant}\n buttonVariant={buttonVariant}\n buttonText={buttonText}\n showVenue={showVenue}\n showCapacity={showCapacity}\n basePath={basePath}\n />\n ))}\n </div>\n );\n};\n\nexport default EventListSSR;\n","import React from 'react';\n\ntype BookingFormProps = {\n siteId?: string;\n formId?: string;\n serviceId?: string | null;\n resourceId?: string | null;\n submitLabel?: string | null;\n successMessage?: string | null;\n className?: string | null;\n children?: React.ReactNode;\n};\n\n/**\n * Server-safe placeholder for booking form.\n * Renders a container with identifying data attributes so hydration can attach\n * to a stable shell without pulling client hooks into the server graph.\n */\nexport function BookingFormSSR({\n siteId,\n formId,\n serviceId,\n resourceId,\n submitLabel,\n successMessage,\n className,\n children,\n}: BookingFormProps) {\n return (\n <div\n className={`booking-form-ssr ${className ?? ''}`.trim()}\n data-booking-form\n data-site-id={siteId ?? undefined}\n data-form-id={formId ?? undefined}\n data-service-id={serviceId ?? undefined}\n data-resource-id={resourceId ?? undefined}\n >\n <div className=\"booking-form-ssr__summary\">\n <strong>{submitLabel ?? 'Book now'}</strong>\n {successMessage ? <p className=\"booking-form-ssr__success\">{successMessage}</p> : null}\n </div>\n {children}\n </div>\n );\n}\n\nexport default BookingFormSSR;\n","import React from 'react';\n\ntype EventRegistrationProps = {\n siteId?: string;\n className?: string | null;\n buttonText?: string | null;\n maxTickets?: string | null;\n children?: React.ReactNode;\n};\n\n/**\n * Server-safe placeholder for event registration.\n * Provides a static container for island hydration without importing client hooks.\n */\nexport function EventRegistrationSSR({ siteId, className, buttonText, maxTickets, children }: EventRegistrationProps) {\n return (\n <div\n className={`event-registration ${className ?? ''}`.trim()}\n data-event-registration\n data-site-id={siteId ?? undefined}\n data-max-tickets={maxTickets ?? undefined}\n >\n <div className=\"event-registration__summary\">\n <strong>{buttonText ?? 'Register'}</strong>\n </div>\n {children}\n </div>\n );\n}\n\nexport default EventRegistrationSSR;\n","/**\n * Shared utility functions for event blocks\n */\n\n/** Default base path for event URLs */\nexport const DEFAULT_EVENT_BASE_PATH = '/events';\n\n/** Column class mappings for grid layouts */\nexport const COLUMN_CLASSES: Record<string, string> = {\n '2': 'sm:grid-cols-2',\n '3': 'sm:grid-cols-2 lg:grid-cols-3',\n '4': 'sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4',\n};\n\n/**\n * Build container class based on layout mode\n * @param layout - 'grid' or 'stack'\n * @param columns - Number of columns for grid layout ('2', '3', '4')\n * @returns Tailwind class string for the container\n */\nexport function getContainerClass(layout: 'grid' | 'stack', columns: string): string {\n if (layout === 'stack') {\n return 'flex flex-col gap-6';\n }\n return `grid gap-6 ${COLUMN_CLASSES[columns] || COLUMN_CLASSES['3']}`;\n}\n\n\n/** Day names starting from Sunday */\nexport const DAY_NAMES = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n\n/** Month names */\nexport const MONTH_NAMES = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December'\n];\n\n/**\n * Extract the date portion from an ISO timestamp for URL building\n * @example formatDateForUrl('2025-01-15T10:00:00Z') => '2025-01-15'\n */\nexport function formatDateForUrl(isoTimestamp: string): string {\n return isoTimestamp.split('T')[0];\n}\n\n/**\n * Build the registration URL for an event occurrence\n * Pattern: /:basePath/:slug/:date\n */\nexport function buildEventUrl(basePath: string, slug: string, startsAt: string): string {\n const date = formatDateForUrl(startsAt);\n const normalizedPath = basePath.startsWith('/') ? basePath : `/${basePath}`;\n const cleanPath = normalizedPath.endsWith('/') ? normalizedPath.slice(0, -1) : normalizedPath;\n return `${cleanPath}/${slug}/${date}`;\n}\n\n/**\n * Format date for display (server-safe, no Intl)\n * Returns: \"Monday, January 15, 2025\"\n */\nexport function formatDate(isoTimestamp: string): string {\n const date = new Date(isoTimestamp);\n const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n const months = ['January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December'];\n return `${days[date.getDay()]}, ${months[date.getMonth()]} ${date.getDate()}, ${date.getFullYear()}`;\n}\n\n/**\n * Format time for display (server-safe, no Intl)\n * Returns: \"10:00 AM\"\n */\nexport function formatTime(isoTimestamp: string): string {\n const date = new Date(isoTimestamp);\n const hours = date.getHours();\n const minutes = date.getMinutes();\n const ampm = hours >= 12 ? 'PM' : 'AM';\n const displayHours = hours % 12 || 12;\n const displayMinutes = minutes.toString().padStart(2, '0');\n return `${displayHours}:${displayMinutes} ${ampm}`;\n}\n\n/**\n * Format a date as YYYY-MM-DD for use as a map key\n */\nexport function formatDateKey(date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n}\n\n/**\n * Check if a date is today\n */\nexport function isToday(date: Date): boolean {\n const today = new Date();\n return date.getDate() === today.getDate() &&\n date.getMonth() === today.getMonth() &&\n date.getFullYear() === today.getFullYear();\n}\n\n/**\n * Get the start of month for a given date\n */\nexport function getStartOfMonth(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), 1);\n}\n\n/**\n * Get the end of month for a given date\n */\nexport function getEndOfMonth(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth() + 1, 0);\n}\n\n/**\n * Add months to a date\n */\nexport function addMonths(date: Date, months: number): Date {\n const result = new Date(date);\n result.setMonth(result.getMonth() + months);\n return result;\n}\n\n/**\n * Get date range for 3 months centered on a given date\n * @param date Reference date\n * @returns Date range spanning previous, current, and next months (ISO strings)\n */\nexport function getThreeMonthRange(date: Date): { from: string; to: string } {\n const year = date.getFullYear();\n const month = date.getMonth();\n // Previous month start\n const prevStart = new Date(year, month - 1, 1);\n // Next month end\n const nextEnd = new Date(year, month + 2, 0);\n return {\n from: `${formatDateKey(prevStart)}T00:00:00Z`,\n to: `${formatDateKey(nextEnd)}T23:59:59Z`,\n };\n}\n","import React from 'react';\nimport type { PublicEvent, CardVariant, ButtonVariant } from '../../../../blocks/events/shared/types';\nimport { buildEventUrl, formatDate, formatTime, DEFAULT_EVENT_BASE_PATH } from './utils';\n\ntype EventCardProps = {\n event: PublicEvent;\n cardVariant?: CardVariant;\n buttonVariant?: ButtonVariant;\n buttonText?: string;\n showVenue?: boolean;\n showCapacity?: boolean;\n basePath?: string;\n};\n\n/**\n * EventCard Component\n *\n * Displays a single event with title, date, venue, and capacity.\n * Uses theme card and button variant classes for styling.\n *\n * This component is server-safe (uses no client APIs like Intl).\n */\nexport const EventCard: React.FC<EventCardProps> = ({\n event,\n cardVariant = 'default',\n buttonVariant = 'primary',\n buttonText = 'View event',\n showVenue = true,\n showCapacity = true,\n basePath = DEFAULT_EVENT_BASE_PATH,\n}) => {\n const formattedDate = formatDate(event.startsAt);\n const formattedTime = `${formatTime(event.startsAt)} - ${formatTime(event.endsAt)}`;\n\n const isSoldOut = event.capacity !== null && event.availableSpots === 0;\n const spotsLeft = event.availableSpots;\n\n const cardClass = `card-${cardVariant}`;\n const buttonClass = `button-${buttonVariant}`;\n\n return (\n <article className={`${cardClass} group flex flex-col`}>\n <div className=\"card-content flex flex-col h-full\">\n {/* Date and time header */}\n <div className=\"mb-3\">\n <time className=\"text-sm font-medium opacity-60\">\n {formattedDate}\n </time>\n <p className=\"text-sm opacity-70\">{formattedTime}</p>\n </div>\n\n {/* Event title */}\n <h3 className=\"card-title mb-2 text-lg font-semibold\">\n {event.title}\n </h3>\n\n {/* Description */}\n {event.description && (\n <p className=\"card-body mb-3 line-clamp-2 text-sm opacity-70\">\n {event.description}\n </p>\n )}\n\n {/* Venue */}\n {showVenue && event.venue && (\n <div className=\"mb-3 text-sm opacity-60\">\n <span className=\"font-medium\">{event.venue.name}</span>\n {event.venue.address && (\n <span className=\"ml-1 opacity-70\">\n · {event.venue.address}\n </span>\n )}\n </div>\n )}\n\n {/* Footer with capacity and register button */}\n <div className=\"mt-auto flex items-center justify-between pt-4\">\n {/* Capacity indicator */}\n {showCapacity && event.capacity !== null && (\n <div>\n {isSoldOut ? (\n <span className=\"badge-status badge-status-sold-out\">\n Sold Out\n </span>\n ) : spotsLeft !== null && spotsLeft <= 5 ? (\n <span className=\"badge-status badge-status-low\">\n {spotsLeft} {spotsLeft === 1 ? 'spot' : 'spots'} left\n </span>\n ) : (\n <span className=\"badge-status badge-status-available\">\n {spotsLeft} spots available\n </span>\n )}\n </div>\n )}\n\n {/* Action button */}\n {!isSoldOut && (\n <a\n href={buildEventUrl(basePath, event.slug, event.startsAt)}\n className={buttonClass}\n >\n {buttonText}\n </a>\n )}\n </div>\n </div>\n </article>\n );\n};\n\nexport default EventCard;\n","import React from 'react';\n\ntype EmptyStateProps = {\n message?: string;\n className?: string;\n};\n\n/**\n * EmptyState Component\n * Displays when no events are available\n */\nexport const EmptyState: React.FC<EmptyStateProps> = ({\n message = 'No upcoming events scheduled.',\n className,\n}) => {\n return (\n <div className={`event-list-empty rounded-xl border border-dashed p-12 text-center ${className || ''}`}>\n <p className=\"text-base opacity-60\">{message}</p>\n </div>\n );\n};\n\nexport default EmptyState;\n","import React from 'react';\nimport type { PublicEvent, CardVariant, ButtonVariant, EventLayout } from '../../../blocks/events/shared/types';\nimport { EventCard, EmptyState, getContainerClass } from './shared';\n\ntype EventSpotlightProps = {\n events?: PublicEvent[] | null;\n layout?: EventLayout;\n columns?: '2' | '3';\n cardVariant?: CardVariant;\n buttonVariant?: ButtonVariant;\n buttonText?: string;\n showVenue?: boolean;\n showCapacity?: boolean;\n emptyMessage?: string;\n className?: string;\n};\n\n/**\n * EventSpotlight Component\n *\n * Displays a simple list of featured upcoming events.\n * This is a server-safe component with no client-side interactivity.\n *\n * Designed for homepages and landing pages to highlight 1-6 events.\n */\nexport const EventSpotlight: React.FC<EventSpotlightProps> = ({\n events,\n layout = 'grid',\n columns = '3',\n cardVariant = 'default',\n buttonVariant = 'primary',\n buttonText = 'View event',\n showVenue = true,\n showCapacity = true,\n emptyMessage = 'No upcoming events scheduled.',\n className,\n}) => {\n const normalizedEvents = events ?? [];\n\n // Empty state\n if (normalizedEvents.length === 0) {\n return <EmptyState message={emptyMessage} className={className} />;\n }\n\n // Build container class based on layout\n const containerClass = getContainerClass(layout, columns);\n\n return (\n <div className={`event-spotlight ${containerClass} ${className || ''}`}>\n {normalizedEvents.map((event) => (\n <EventCard\n key={event.id}\n event={event}\n cardVariant={cardVariant}\n buttonVariant={buttonVariant}\n buttonText={buttonText}\n showVenue={showVenue}\n showCapacity={showCapacity}\n />\n ))}\n </div>\n );\n};\n\nexport default EventSpotlight;\n","import React from 'react';\nimport type { PublicEvent, CardVariant, ButtonVariant, EventLayout, ColumnOption } from '../../../blocks/events/shared/types';\nimport { EventCard, EmptyState, getContainerClass } from './shared';\n\ntype EventListingProps = {\n events?: PublicEvent[] | null;\n siteId: string;\n layout?: EventLayout;\n columns?: ColumnOption;\n eventsPerPage?: string;\n loadMoreText?: string;\n cardVariant?: CardVariant;\n buttonVariant?: ButtonVariant;\n buttonText?: string;\n showVenue?: boolean;\n showCapacity?: boolean;\n emptyMessage?: string;\n className?: string;\n};\n\n/**\n * EventListing SSR Component\n *\n * Server-safe version for SSR rendering.\n * Renders initial events without pagination (client handles that).\n */\nexport const EventListingSSR: React.FC<EventListingProps> = ({\n events,\n layout = 'grid',\n columns = '3',\n cardVariant = 'default',\n buttonVariant = 'primary',\n buttonText = 'View event',\n showVenue = true,\n showCapacity = true,\n emptyMessage = 'No upcoming events scheduled.',\n className,\n}) => {\n const normalizedEvents = events ?? [];\n\n // Empty state\n if (normalizedEvents.length === 0) {\n return <EmptyState message={emptyMessage} className={className} />;\n }\n\n // Build container class based on layout\n const containerClass = getContainerClass(layout, columns);\n\n return (\n <div className={`event-listing ${className || ''}`}>\n <div className={containerClass}>\n {normalizedEvents.map((event) => (\n <EventCard\n key={event.id}\n event={event}\n cardVariant={cardVariant}\n buttonVariant={buttonVariant}\n buttonText={buttonText}\n showVenue={showVenue}\n showCapacity={showCapacity}\n />\n ))}\n </div>\n </div>\n );\n};\n\nexport default EventListingSSR;\n","import type { ComponentRegistry } from '../resolver'\nimport { SectionNode, StackNode, InlineNode, GridNode, DivNode } from '../nodes/layout'\nimport { TextNode, RichTextNode, ButtonNode, LinkNode } from '../nodes/basic'\nimport { MediaNode } from '../nodes/media'\nimport { FormNodeSSR } from '../nodes/form.server'\nimport { CarouselNodeSSR } from '../nodes/carousel.server'\nimport { AccordionNodeSSR, AccordionItemNodeSSR } from '../nodes/accordion.server'\nimport HeaderSectionNode from '../nodes/header-section.server'\nimport { EventListSSR } from '../nodes/event-list.server'\nimport BookingFormSSR from '../nodes/booking-form.server'\nimport EventRegistrationSSR from '../nodes/event-registration.server'\nimport { EventSpotlight, EventListingSSR } from '../nodes/events'\n\nexport const serverComponentRegistry: ComponentRegistry = {\n div: DivNode,\n section: SectionNode,\n headerSection: HeaderSectionNode,\n stack: StackNode,\n inline: InlineNode,\n grid: GridNode,\n text: TextNode,\n richText: RichTextNode,\n button: ButtonNode,\n media: MediaNode,\n link: LinkNode,\n form: FormNodeSSR,\n carousel: CarouselNodeSSR,\n accordion: AccordionNodeSSR,\n accordionItem: AccordionItemNodeSSR,\n 'event-list': EventListSSR,\n 'booking-form': BookingFormSSR,\n 'event-registration': EventRegistrationSSR,\n // New event blocks\n 'event-spotlight': EventSpotlight,\n 'event-listing': EventListingSSR,\n 'event-calendar': EventSpotlight, // SSR fallback - calendar renders events as spotlight\n}\n","import type { ComponentRegistry } from '../resolver'\nimport { serverComponentRegistry } from './registry.server'\n\nexport function getDefaultComponentRegistry(): ComponentRegistry {\n // Server-safe by default. Client-side apps that need enhanced components\n // should import from '@riverbankcms/blocks/client' instead.\n return serverComponentRegistry\n}\n\nexport { serverComponentRegistry } from './registry.server'\n// Note: clientComponentRegistry is NOT exported here to keep this module server-safe.\n// For client components, import from '@riverbankcms/blocks/client' instead.\n\n// Convenience alias for direct access\nexport const defaultComponentRegistry: ComponentRegistry = getDefaultComponentRegistry()\n","import React, { type ReactNode } from 'react'\nimport type { BlockManifest } from './manifest'\nimport type { SystemBlockComponent } from './registry'\nimport { resolveTree, getDefaultComponentRegistry } from './runtime'\nimport type { Theme } from '../theme/schema'\nimport type { NodeDefinition } from './node'\nimport { defaultThemeTokens } from './theme'\n\ntype RenderOptions = {\n registry?: Parameters<typeof resolveTree>[1][\"registry\"];\n theme?: Parameters<typeof resolveTree>[1][\"theme\"];\n themeConfig?: Theme;\n transforms?: Parameters<typeof resolveTree>[1][\"transforms\"];\n viewModelOverrides?: Record<string, unknown>;\n data?: Record<string, unknown>;\n pathBase?: string;\n};\n\n/**\n * Resolves the layout definition for a block based on its manifest and content.\n *\n * Fallback chain:\n * 1. content.variant (if manifest.variants exists and contains the key)\n * 2. content.layout (legacy blog listing support)\n * 3. manifest.defaultVariant (if manifest.variants exists)\n * 4. First key in manifest.variants\n * 5. manifest.layout\n *\n * @param manifest - The block manifest\n * @param content - The block content object\n * @returns The resolved NodeDefinition layout or null if none found\n */\nexport function resolveBlockLayout(\n manifest: BlockManifest,\n content: Record<string, unknown>\n): NodeDefinition | null {\n // If no variants system, use manifest.layout directly\n if (!manifest.variants) {\n return manifest.layout ?? null;\n }\n\n // Try content.variant first\n const contentVariant = (content as any)?.variant;\n if (typeof contentVariant === 'string' && manifest.variants[contentVariant]) {\n return manifest.variants[contentVariant]!;\n }\n\n // Try content.layout for legacy blog listing blocks\n const contentLayout = (content as any)?.layout;\n if (typeof contentLayout === 'string' && manifest.variants[contentLayout]) {\n return manifest.variants[contentLayout]!;\n }\n\n // Try manifest.defaultVariant\n if (manifest.defaultVariant && manifest.variants[manifest.defaultVariant]) {\n return manifest.variants[manifest.defaultVariant]!;\n }\n\n // Use first variant key\n const variantKeys = Object.keys(manifest.variants);\n if (variantKeys.length > 0 && variantKeys[0]) {\n return manifest.variants[variantKeys[0]]!;\n }\n\n // Fall back to manifest.layout\n return manifest.layout ?? null;\n}\n\nexport function makeDefaultBlockComponent<TContent = Record<string, unknown>>(args: {\n manifest: BlockManifest;\n}): SystemBlockComponent<TContent> {\n const { manifest } = args;\n return function DefaultBlockComponent({\n content,\n data,\n registry,\n theme,\n themeConfig,\n transforms,\n viewModelOverrides,\n pathBase,\n blockId,\n blockKind,\n blockBindings,\n fragmentRegistry,\n }) {\n if (!theme) {\n throw new Error('Block rendering requires theme tokens; none were provided to makeDefaultBlockComponent');\n }\n if (!registry) {\n throw new Error('Block rendering requires a component registry; none was provided');\n }\n // Resolve layout from content (variant-aware)\n const layout = resolveBlockLayout(manifest, content as Record<string, unknown>);\n if (!layout) {\n throw new Error(`Block manifest \"${manifest.name}\" requires a layout definition`);\n }\n const baseVm: Record<string, unknown> = { content };\n if (data) {\n const normalizedData = { ...(data as Record<string, unknown>) };\n baseVm.data = {\n ...(typeof baseVm.data === 'object' && baseVm.data !== null\n ? (baseVm.data as Record<string, unknown>)\n : {}),\n ...normalizedData,\n };\n }\n // Merge viewModelOverrides and add theme to $root for bindings like $root.theme.header.variant\n const mergedOverrides = viewModelOverrides ?? {};\n const existingRoot = (mergedOverrides as Record<string, unknown>).$root as Record<string, unknown> | undefined;\n const viewModel = {\n ...baseVm,\n ...mergedOverrides,\n $root: {\n ...(existingRoot ?? {}),\n ...(typeof themeConfig !== 'undefined' ? { theme: themeConfig } : {}),\n },\n } as Record<string, unknown>;\n // Augment theme tokens with button system for transforms (required by ui.buttonClass)\n const themeForTransforms = themeConfig?.buttons\n ? ({ ...(theme as any), buttons: themeConfig.buttons } as typeof theme)\n : theme;\n\n return resolveTree(layout, {\n registry,\n viewModel,\n transforms,\n theme: themeForTransforms,\n pathBase,\n blockId,\n blockKind,\n blockContent: content,\n blockBindings,\n fragmentRegistry,\n });\n } as SystemBlockComponent<TContent>;\n}\n\nexport function renderBlock<TContent>(\n manifest: BlockManifest,\n content: TContent,\n options: RenderOptions = {},\n): ReactNode {\n // Validate that layout is resolvable\n const layout = resolveBlockLayout(manifest, content as Record<string, unknown>);\n if (!layout) {\n throw new Error(`Block manifest \"${manifest.name}\" requires a layout definition`);\n }\n\n // Use makeDefaultBlockComponent for consistent behavior with PageRenderer\n const Component = makeDefaultBlockComponent<TContent>({ manifest });\n\n // Resolve a registry explicitly for this render path\n const resolvedRegistry = options.registry ?? getDefaultComponentRegistry();\n\n // Use default theme tokens if none provided (for tests and standalone rendering)\n const resolvedTheme = options.theme ?? defaultThemeTokens;\n\n return React.createElement(Component, {\n content,\n data: options.data,\n registry: resolvedRegistry,\n theme: resolvedTheme,\n themeConfig: options.themeConfig,\n transforms: options.transforms,\n viewModelOverrides: options.viewModelOverrides,\n pathBase: options.pathBase,\n blockId: null,\n blockKind: manifest.name,\n });\n}\n","const { min, max } = Math;\n\nexport default (x, low = 0, high = 1) => {\n return min(max(low, x), high);\n};\n","import limit from './limit.js';\n\nexport default (rgb) => {\n rgb._clipped = false;\n rgb._unclipped = rgb.slice(0);\n for (let i = 0; i <= 3; i++) {\n if (i < 3) {\n if (rgb[i] < 0 || rgb[i] > 255) rgb._clipped = true;\n rgb[i] = limit(rgb[i], 0, 255);\n } else if (i === 3) {\n rgb[i] = limit(rgb[i], 0, 1);\n }\n }\n return rgb;\n};\n","// ported from jQuery's $.type\nconst classToType = {};\nfor (let name of [\n 'Boolean',\n 'Number',\n 'String',\n 'Function',\n 'Array',\n 'Date',\n 'RegExp',\n 'Undefined',\n 'Null'\n]) {\n classToType[`[object ${name}]`] = name.toLowerCase();\n}\nexport default function (obj) {\n return classToType[Object.prototype.toString.call(obj)] || 'object';\n}\n","import type from './type.js';\n\nexport default (args, keyOrder = null) => {\n // if called with more than 3 arguments, we return the arguments\n if (args.length >= 3) return Array.prototype.slice.call(args);\n // with less than 3 args we check if first arg is object\n // and use the keyOrder string to extract and sort properties\n if (type(args[0]) == 'object' && keyOrder) {\n return keyOrder\n .split('')\n .filter((k) => args[0][k] !== undefined)\n .map((k) => args[0][k]);\n }\n // otherwise we just return the first argument\n // (which we suppose is an array of args)\n return args[0].slice(0);\n};\n","import type from './type.js';\n\nexport default (args) => {\n if (args.length < 2) return null;\n const l = args.length - 1;\n if (type(args[l]) == 'string') return args[l].toLowerCase();\n return null;\n};\n","const { PI, min, max } = Math;\n\nconst rnd2 = (a) => Math.round(a * 100) / 100;\nconst rnd3 = (a) => Math.round(a * 100) / 100;\n\nexport { default as clip_rgb } from './clip_rgb.js';\nexport { default as limit } from './limit.js';\nexport { default as type } from './type.js';\nexport { default as unpack } from './unpack.js';\nexport { default as last } from './last.js';\n\nconst TWOPI = PI * 2;\nconst PITHIRD = PI / 3;\nconst DEG2RAD = PI / 180;\nconst RAD2DEG = 180 / PI;\n\n/**\n * Reverse the first three elements of an array\n *\n * @param {any[]} arr\n * @returns {any[]}\n */\nfunction reverse3(arr) {\n return [...arr.slice(0, 3).reverse(), ...arr.slice(3)];\n}\n\nexport { PI, TWOPI, PITHIRD, DEG2RAD, RAD2DEG, min, max, rnd2, rnd3, reverse3 };\n","export default {\n format: {},\n autodetect: []\n};\n","import { last, clip_rgb, type } from './utils/index.js';\nimport _input from './io/input.js';\n\nclass Color {\n constructor(...args) {\n const me = this;\n if (\n type(args[0]) === 'object' &&\n args[0].constructor &&\n args[0].constructor === this.constructor\n ) {\n // the argument is already a Color instance\n return args[0];\n }\n // last argument could be the mode\n let mode = last(args);\n let autodetect = false;\n if (!mode) {\n autodetect = true;\n\n if (!_input.sorted) {\n _input.autodetect = _input.autodetect.sort((a, b) => b.p - a.p);\n _input.sorted = true;\n }\n\n // auto-detect format\n for (let chk of _input.autodetect) {\n mode = chk.test(...args);\n if (mode) break;\n }\n }\n if (_input.format[mode]) {\n const rgb = _input.format[mode].apply(\n null,\n autodetect ? args : args.slice(0, -1)\n );\n me._rgb = clip_rgb(rgb);\n } else {\n throw new Error('unknown format: ' + args);\n }\n // add alpha channel\n if (me._rgb.length === 3) me._rgb.push(1);\n }\n toString() {\n if (type(this.hex) == 'function') return this.hex();\n return `[${this._rgb.join(',')}]`;\n }\n}\nexport default Color;\n","// this gets updated automatically\nexport const version = '3.1.2';\n","import Color from './Color.js';\nimport { version } from './version.js';\n\nconst chroma = (...args) => {\n return new Color(...args);\n};\n\nchroma.version = version;\n\nexport default chroma;\n","/**\n\tX11 color names\n\n\thttp://www.w3.org/TR/css3-color/#svg-color\n*/\n\nconst w3cx11 = {\n aliceblue: '#f0f8ff',\n antiquewhite: '#faebd7',\n aqua: '#00ffff',\n aquamarine: '#7fffd4',\n azure: '#f0ffff',\n beige: '#f5f5dc',\n bisque: '#ffe4c4',\n black: '#000000',\n blanchedalmond: '#ffebcd',\n blue: '#0000ff',\n blueviolet: '#8a2be2',\n brown: '#a52a2a',\n burlywood: '#deb887',\n cadetblue: '#5f9ea0',\n chartreuse: '#7fff00',\n chocolate: '#d2691e',\n coral: '#ff7f50',\n cornflowerblue: '#6495ed',\n cornsilk: '#fff8dc',\n crimson: '#dc143c',\n cyan: '#00ffff',\n darkblue: '#00008b',\n darkcyan: '#008b8b',\n darkgoldenrod: '#b8860b',\n darkgray: '#a9a9a9',\n darkgreen: '#006400',\n darkgrey: '#a9a9a9',\n darkkhaki: '#bdb76b',\n darkmagenta: '#8b008b',\n darkolivegreen: '#556b2f',\n darkorange: '#ff8c00',\n darkorchid: '#9932cc',\n darkred: '#8b0000',\n darksalmon: '#e9967a',\n darkseagreen: '#8fbc8f',\n darkslateblue: '#483d8b',\n darkslategray: '#2f4f4f',\n darkslategrey: '#2f4f4f',\n darkturquoise: '#00ced1',\n darkviolet: '#9400d3',\n deeppink: '#ff1493',\n deepskyblue: '#00bfff',\n dimgray: '#696969',\n dimgrey: '#696969',\n dodgerblue: '#1e90ff',\n firebrick: '#b22222',\n floralwhite: '#fffaf0',\n forestgreen: '#228b22',\n fuchsia: '#ff00ff',\n gainsboro: '#dcdcdc',\n ghostwhite: '#f8f8ff',\n gold: '#ffd700',\n goldenrod: '#daa520',\n gray: '#808080',\n green: '#008000',\n greenyellow: '#adff2f',\n grey: '#808080',\n honeydew: '#f0fff0',\n hotpink: '#ff69b4',\n indianred: '#cd5c5c',\n indigo: '#4b0082',\n ivory: '#fffff0',\n khaki: '#f0e68c',\n laserlemon: '#ffff54',\n lavender: '#e6e6fa',\n lavenderblush: '#fff0f5',\n lawngreen: '#7cfc00',\n lemonchiffon: '#fffacd',\n lightblue: '#add8e6',\n lightcoral: '#f08080',\n lightcyan: '#e0ffff',\n lightgoldenrod: '#fafad2',\n lightgoldenrodyellow: '#fafad2',\n lightgray: '#d3d3d3',\n lightgreen: '#90ee90',\n lightgrey: '#d3d3d3',\n lightpink: '#ffb6c1',\n lightsalmon: '#ffa07a',\n lightseagreen: '#20b2aa',\n lightskyblue: '#87cefa',\n lightslategray: '#778899',\n lightslategrey: '#778899',\n lightsteelblue: '#b0c4de',\n lightyellow: '#ffffe0',\n lime: '#00ff00',\n limegreen: '#32cd32',\n linen: '#faf0e6',\n magenta: '#ff00ff',\n maroon: '#800000',\n maroon2: '#7f0000',\n maroon3: '#b03060',\n mediumaquamarine: '#66cdaa',\n mediumblue: '#0000cd',\n mediumorchid: '#ba55d3',\n mediumpurple: '#9370db',\n mediumseagreen: '#3cb371',\n mediumslateblue: '#7b68ee',\n mediumspringgreen: '#00fa9a',\n mediumturquoise: '#48d1cc',\n mediumvioletred: '#c71585',\n midnightblue: '#191970',\n mintcream: '#f5fffa',\n mistyrose: '#ffe4e1',\n moccasin: '#ffe4b5',\n navajowhite: '#ffdead',\n navy: '#000080',\n oldlace: '#fdf5e6',\n olive: '#808000',\n olivedrab: '#6b8e23',\n orange: '#ffa500',\n orangered: '#ff4500',\n orchid: '#da70d6',\n palegoldenrod: '#eee8aa',\n palegreen: '#98fb98',\n paleturquoise: '#afeeee',\n palevioletred: '#db7093',\n papayawhip: '#ffefd5',\n peachpuff: '#ffdab9',\n peru: '#cd853f',\n pink: '#ffc0cb',\n plum: '#dda0dd',\n powderblue: '#b0e0e6',\n purple: '#800080',\n purple2: '#7f007f',\n purple3: '#a020f0',\n rebeccapurple: '#663399',\n red: '#ff0000',\n rosybrown: '#bc8f8f',\n royalblue: '#4169e1',\n saddlebrown: '#8b4513',\n salmon: '#fa8072',\n sandybrown: '#f4a460',\n seagreen: '#2e8b57',\n seashell: '#fff5ee',\n sienna: '#a0522d',\n silver: '#c0c0c0',\n skyblue: '#87ceeb',\n slateblue: '#6a5acd',\n slategray: '#708090',\n slategrey: '#708090',\n snow: '#fffafa',\n springgreen: '#00ff7f',\n steelblue: '#4682b4',\n tan: '#d2b48c',\n teal: '#008080',\n thistle: '#d8bfd8',\n tomato: '#ff6347',\n turquoise: '#40e0d0',\n violet: '#ee82ee',\n wheat: '#f5deb3',\n white: '#ffffff',\n whitesmoke: '#f5f5f5',\n yellow: '#ffff00',\n yellowgreen: '#9acd32'\n};\n\nexport default w3cx11;\n","const RE_HEX = /^#?([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/;\nconst RE_HEXA = /^#?([A-Fa-f0-9]{8}|[A-Fa-f0-9]{4})$/;\n\nconst hex2rgb = (hex) => {\n if (hex.match(RE_HEX)) {\n // remove optional leading #\n if (hex.length === 4 || hex.length === 7) {\n hex = hex.substr(1);\n }\n // expand short-notation to full six-digit\n if (hex.length === 3) {\n hex = hex.split('');\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n }\n const u = parseInt(hex, 16);\n const r = u >> 16;\n const g = (u >> 8) & 0xff;\n const b = u & 0xff;\n return [r, g, b, 1];\n }\n\n // match rgba hex format, eg #FF000077\n if (hex.match(RE_HEXA)) {\n if (hex.length === 5 || hex.length === 9) {\n // remove optional leading #\n hex = hex.substr(1);\n }\n // expand short-notation to full eight-digit\n if (hex.length === 4) {\n hex = hex.split('');\n hex =\n hex[0] +\n hex[0] +\n hex[1] +\n hex[1] +\n hex[2] +\n hex[2] +\n hex[3] +\n hex[3];\n }\n const u = parseInt(hex, 16);\n const r = (u >> 24) & 0xff;\n const g = (u >> 16) & 0xff;\n const b = (u >> 8) & 0xff;\n const a = Math.round(((u & 0xff) / 0xff) * 100) / 100;\n return [r, g, b, a];\n }\n\n // we used to check for css colors here\n // if _input.css? and rgb = _input.css hex\n // return rgb\n\n throw new Error(`unknown hex color: ${hex}`);\n};\n\nexport default hex2rgb;\n","import { unpack, last } from '../../utils/index.js';\nconst { round } = Math;\n\nconst rgb2hex = (...args) => {\n let [r, g, b, a] = unpack(args, 'rgba');\n let mode = last(args) || 'auto';\n if (a === undefined) a = 1;\n if (mode === 'auto') {\n mode = a < 1 ? 'rgba' : 'rgb';\n }\n r = round(r);\n g = round(g);\n b = round(b);\n const u = (r << 16) | (g << 8) | b;\n let str = '000000' + u.toString(16); //#.toUpperCase();\n str = str.substr(str.length - 6);\n let hxa = '0' + round(a * 255).toString(16);\n hxa = hxa.substr(hxa.length - 2);\n switch (mode.toLowerCase()) {\n case 'rgba':\n return `#${str}${hxa}`;\n case 'argb':\n return `#${hxa}${str}`;\n default:\n return `#${str}`;\n }\n};\n\nexport default rgb2hex;\n","import Color from '../../Color.js';\nimport input from '../input.js';\nimport { type } from '../../utils/index.js';\n\nimport w3cx11 from '../../colors/w3cx11.js';\nimport hex2rgb from '../hex/hex2rgb.js';\nimport rgb2hex from '../hex/rgb2hex.js';\n\nColor.prototype.name = function () {\n const hex = rgb2hex(this._rgb, 'rgb');\n for (let n of Object.keys(w3cx11)) {\n if (w3cx11[n] === hex) return n.toLowerCase();\n }\n return hex;\n};\n\ninput.format.named = (name) => {\n name = name.toLowerCase();\n if (w3cx11[name]) return hex2rgb(w3cx11[name]);\n throw new Error('unknown color name: ' + name);\n};\n\ninput.autodetect.push({\n p: 5,\n test: (h, ...rest) => {\n if (!rest.length && type(h) === 'string' && w3cx11[h.toLowerCase()]) {\n return 'named';\n }\n }\n});\n","import Color from '../Color.js';\nimport { type } from '../utils/index.js';\n\nColor.prototype.alpha = function (a, mutate = false) {\n if (a !== undefined && type(a) === 'number') {\n if (mutate) {\n this._rgb[3] = a;\n return this;\n }\n return new Color([this._rgb[0], this._rgb[1], this._rgb[2], a], 'rgb');\n }\n return this._rgb[3];\n};\n","import Color from '../Color.js';\n\nColor.prototype.clipped = function () {\n return this._rgb._clipped || false;\n};\n","const labConstants = {\n // Corresponds roughly to RGB brighter/darker\n Kn: 18,\n\n // D65 standard referent\n labWhitePoint: 'd65',\n Xn: 0.95047,\n Yn: 1,\n Zn: 1.08883,\n\n t0: 0.137931034, // 4 / 29\n t1: 0.206896552, // 6 / 29\n t2: 0.12841855, // 3 * t1 * t1\n t3: 0.008856452, // t1 * t1 * t1,\n\n kE: 216.0 / 24389.0,\n kKE: 8.0,\n kK: 24389.0 / 27.0,\n\n RefWhiteRGB: {\n // sRGB\n X: 0.95047,\n Y: 1,\n Z: 1.08883\n },\n\n MtxRGB2XYZ: {\n m00: 0.4124564390896922,\n m01: 0.21267285140562253,\n m02: 0.0193338955823293,\n m10: 0.357576077643909,\n m11: 0.715152155287818,\n m12: 0.11919202588130297,\n m20: 0.18043748326639894,\n m21: 0.07217499330655958,\n m22: 0.9503040785363679\n },\n\n MtxXYZ2RGB: {\n m00: 3.2404541621141045,\n m01: -0.9692660305051868,\n m02: 0.055643430959114726,\n m10: -1.5371385127977166,\n m11: 1.8760108454466942,\n m12: -0.2040259135167538,\n m20: -0.498531409556016,\n m21: 0.041556017530349834,\n m22: 1.0572251882231791\n },\n\n // used in rgb2xyz\n As: 0.9414285350000001,\n Bs: 1.040417467,\n Cs: 1.089532651,\n\n MtxAdaptMa: {\n m00: 0.8951,\n m01: -0.7502,\n m02: 0.0389,\n m10: 0.2664,\n m11: 1.7135,\n m12: -0.0685,\n m20: -0.1614,\n m21: 0.0367,\n m22: 1.0296\n },\n\n MtxAdaptMaI: {\n m00: 0.9869929054667123,\n m01: 0.43230526972339456,\n m02: -0.008528664575177328,\n m10: -0.14705425642099013,\n m11: 0.5183602715367776,\n m12: 0.04004282165408487,\n m20: 0.15996265166373125,\n m21: 0.0492912282128556,\n m22: 0.9684866957875502\n }\n};\n\nexport default labConstants;\n\n// taken from https://de.mathworks.com/help/images/ref/whitepoint.html\nconst ILLUMINANTS = new Map([\n // ASTM E308-01\n ['a', [1.0985, 0.35585]],\n // Wyszecki & Stiles, p. 769\n ['b', [1.0985, 0.35585]],\n // C ASTM E308-01\n ['c', [0.98074, 1.18232]],\n // D50 (ASTM E308-01)\n ['d50', [0.96422, 0.82521]],\n // D55 (ASTM E308-01)\n ['d55', [0.95682, 0.92149]],\n // D65 (ASTM E308-01)\n ['d65', [0.95047, 1.08883]],\n // E (ASTM E308-01)\n ['e', [1, 1, 1]],\n // F2 (ASTM E308-01)\n ['f2', [0.99186, 0.67393]],\n // F7 (ASTM E308-01)\n ['f7', [0.95041, 1.08747]],\n // F11 (ASTM E308-01)\n ['f11', [1.00962, 0.6435]],\n ['icc', [0.96422, 0.82521]]\n]);\n\nexport function setLabWhitePoint(name) {\n const ill = ILLUMINANTS.get(String(name).toLowerCase());\n if (!ill) {\n throw new Error('unknown Lab illuminant ' + name);\n }\n labConstants.labWhitePoint = name;\n labConstants.Xn = ill[0];\n labConstants.Zn = ill[1];\n}\n\nexport function getLabWhitePoint() {\n return labConstants.labWhitePoint;\n}\n","import LAB_CONSTANTS from './lab-constants.js';\nimport { unpack } from '../../utils/index.js';\n\n/*\n * L* [0..100]\n * a [-100..100]\n * b [-100..100]\n */\nconst lab2rgb = (...args) => {\n args = unpack(args, 'lab');\n const [L, a, b] = args;\n const [x, y, z] = lab2xyz(L, a, b);\n const [r, g, b_] = xyz2rgb(x, y, z);\n return [r, g, b_, args.length > 3 ? args[3] : 1];\n};\n\nconst lab2xyz = (L, a, b) => {\n const { kE, kK, kKE, Xn, Yn, Zn } = LAB_CONSTANTS;\n\n const fy = (L + 16.0) / 116.0;\n const fx = 0.002 * a + fy;\n const fz = fy - 0.005 * b;\n\n const fx3 = fx * fx * fx;\n const fz3 = fz * fz * fz;\n\n const xr = fx3 > kE ? fx3 : (116.0 * fx - 16.0) / kK;\n const yr = L > kKE ? Math.pow((L + 16.0) / 116.0, 3.0) : L / kK;\n const zr = fz3 > kE ? fz3 : (116.0 * fz - 16.0) / kK;\n\n const x = xr * Xn;\n const y = yr * Yn;\n const z = zr * Zn;\n\n return [x, y, z];\n};\n\nconst compand = (linear) => {\n /* sRGB */\n const sign = Math.sign(linear);\n linear = Math.abs(linear);\n return (\n (linear <= 0.0031308\n ? linear * 12.92\n : 1.055 * Math.pow(linear, 1.0 / 2.4) - 0.055) * sign\n );\n};\n\nconst xyz2rgb = (x, y, z) => {\n const { MtxAdaptMa, MtxAdaptMaI, MtxXYZ2RGB, RefWhiteRGB, Xn, Yn, Zn } =\n LAB_CONSTANTS;\n\n const As = Xn * MtxAdaptMa.m00 + Yn * MtxAdaptMa.m10 + Zn * MtxAdaptMa.m20;\n const Bs = Xn * MtxAdaptMa.m01 + Yn * MtxAdaptMa.m11 + Zn * MtxAdaptMa.m21;\n const Cs = Xn * MtxAdaptMa.m02 + Yn * MtxAdaptMa.m12 + Zn * MtxAdaptMa.m22;\n\n const Ad =\n RefWhiteRGB.X * MtxAdaptMa.m00 +\n RefWhiteRGB.Y * MtxAdaptMa.m10 +\n RefWhiteRGB.Z * MtxAdaptMa.m20;\n const Bd =\n RefWhiteRGB.X * MtxAdaptMa.m01 +\n RefWhiteRGB.Y * MtxAdaptMa.m11 +\n RefWhiteRGB.Z * MtxAdaptMa.m21;\n const Cd =\n RefWhiteRGB.X * MtxAdaptMa.m02 +\n RefWhiteRGB.Y * MtxAdaptMa.m12 +\n RefWhiteRGB.Z * MtxAdaptMa.m22;\n\n const X1 =\n (x * MtxAdaptMa.m00 + y * MtxAdaptMa.m10 + z * MtxAdaptMa.m20) *\n (Ad / As);\n const Y1 =\n (x * MtxAdaptMa.m01 + y * MtxAdaptMa.m11 + z * MtxAdaptMa.m21) *\n (Bd / Bs);\n const Z1 =\n (x * MtxAdaptMa.m02 + y * MtxAdaptMa.m12 + z * MtxAdaptMa.m22) *\n (Cd / Cs);\n\n const X2 =\n X1 * MtxAdaptMaI.m00 + Y1 * MtxAdaptMaI.m10 + Z1 * MtxAdaptMaI.m20;\n const Y2 =\n X1 * MtxAdaptMaI.m01 + Y1 * MtxAdaptMaI.m11 + Z1 * MtxAdaptMaI.m21;\n const Z2 =\n X1 * MtxAdaptMaI.m02 + Y1 * MtxAdaptMaI.m12 + Z1 * MtxAdaptMaI.m22;\n\n const r = compand(\n X2 * MtxXYZ2RGB.m00 + Y2 * MtxXYZ2RGB.m10 + Z2 * MtxXYZ2RGB.m20\n );\n const g = compand(\n X2 * MtxXYZ2RGB.m01 + Y2 * MtxXYZ2RGB.m11 + Z2 * MtxXYZ2RGB.m21\n );\n const b = compand(\n X2 * MtxXYZ2RGB.m02 + Y2 * MtxXYZ2RGB.m12 + Z2 * MtxXYZ2RGB.m22\n );\n\n return [r * 255, g * 255, b * 255];\n};\n\nexport default lab2rgb;\nexport { xyz2rgb };\n","import LAB_CONSTANTS from './lab-constants.js';\nimport { unpack } from '../../utils/index.js';\n\nconst rgb2lab = (...args) => {\n const [r, g, b, ...rest] = unpack(args, 'rgb');\n const [x, y, z] = rgb2xyz(r, g, b);\n const [L, a, b_] = xyz2lab(x, y, z);\n return [L, a, b_, ...(rest.length > 0 && rest[0] < 1 ? [rest[0]] : [])];\n};\n\nfunction xyz2lab(x, y, z) {\n const { Xn, Yn, Zn, kE, kK } = LAB_CONSTANTS;\n const xr = x / Xn;\n const yr = y / Yn;\n const zr = z / Zn;\n\n const fx = xr > kE ? Math.pow(xr, 1.0 / 3.0) : (kK * xr + 16.0) / 116.0;\n const fy = yr > kE ? Math.pow(yr, 1.0 / 3.0) : (kK * yr + 16.0) / 116.0;\n const fz = zr > kE ? Math.pow(zr, 1.0 / 3.0) : (kK * zr + 16.0) / 116.0;\n\n return [116.0 * fy - 16.0, 500.0 * (fx - fy), 200.0 * (fy - fz)];\n}\n\nfunction gammaAdjustSRGB(companded) {\n const sign = Math.sign(companded);\n companded = Math.abs(companded);\n const linear =\n companded <= 0.04045\n ? companded / 12.92\n : Math.pow((companded + 0.055) / 1.055, 2.4);\n return linear * sign;\n}\n\nconst rgb2xyz = (r, g, b) => {\n // normalize and gamma adjust\n r = gammaAdjustSRGB(r / 255);\n g = gammaAdjustSRGB(g / 255);\n b = gammaAdjustSRGB(b / 255);\n\n const { MtxRGB2XYZ, MtxAdaptMa, MtxAdaptMaI, Xn, Yn, Zn, As, Bs, Cs } =\n LAB_CONSTANTS;\n\n let x = r * MtxRGB2XYZ.m00 + g * MtxRGB2XYZ.m10 + b * MtxRGB2XYZ.m20;\n let y = r * MtxRGB2XYZ.m01 + g * MtxRGB2XYZ.m11 + b * MtxRGB2XYZ.m21;\n let z = r * MtxRGB2XYZ.m02 + g * MtxRGB2XYZ.m12 + b * MtxRGB2XYZ.m22;\n\n const Ad = Xn * MtxAdaptMa.m00 + Yn * MtxAdaptMa.m10 + Zn * MtxAdaptMa.m20;\n const Bd = Xn * MtxAdaptMa.m01 + Yn * MtxAdaptMa.m11 + Zn * MtxAdaptMa.m21;\n const Cd = Xn * MtxAdaptMa.m02 + Yn * MtxAdaptMa.m12 + Zn * MtxAdaptMa.m22;\n\n let X = x * MtxAdaptMa.m00 + y * MtxAdaptMa.m10 + z * MtxAdaptMa.m20;\n let Y = x * MtxAdaptMa.m01 + y * MtxAdaptMa.m11 + z * MtxAdaptMa.m21;\n let Z = x * MtxAdaptMa.m02 + y * MtxAdaptMa.m12 + z * MtxAdaptMa.m22;\n\n X *= Ad / As;\n Y *= Bd / Bs;\n Z *= Cd / Cs;\n\n x = X * MtxAdaptMaI.m00 + Y * MtxAdaptMaI.m10 + Z * MtxAdaptMaI.m20;\n y = X * MtxAdaptMaI.m01 + Y * MtxAdaptMaI.m11 + Z * MtxAdaptMaI.m21;\n z = X * MtxAdaptMaI.m02 + Y * MtxAdaptMaI.m12 + Z * MtxAdaptMaI.m22;\n\n return [x, y, z];\n};\n\nexport default rgb2lab;\nexport { rgb2xyz };\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport lab2rgb from './lab2rgb.js';\nimport rgb2lab from './rgb2lab.js';\nimport { getLabWhitePoint, setLabWhitePoint } from './lab-constants.js';\n\nColor.prototype.lab = function () {\n return rgb2lab(this._rgb);\n};\n\nconst lab = (...args) => new Color(...args, 'lab');\nObject.assign(chroma, { lab, getLabWhitePoint, setLabWhitePoint });\n\ninput.format.lab = lab2rgb;\n\ninput.autodetect.push({\n p: 2,\n test: (...args) => {\n args = unpack(args, 'lab');\n if (type(args) === 'array' && args.length === 3) {\n return 'lab';\n }\n }\n});\n\nexport { lab, getLabWhitePoint, setLabWhitePoint };\n","import '../io/lab/index.js';\nimport Color from '../Color.js';\nimport LAB_CONSTANTS from '../io/lab/lab-constants.js';\n\nColor.prototype.darken = function (amount = 1) {\n const me = this;\n const lab = me.lab();\n lab[0] -= LAB_CONSTANTS.Kn * amount;\n return new Color(lab, 'lab').alpha(me.alpha(), true);\n};\n\nColor.prototype.brighten = function (amount = 1) {\n return this.darken(-amount);\n};\n\nColor.prototype.darker = Color.prototype.darken;\nColor.prototype.brighter = Color.prototype.brighten;\n","import Color from '../Color.js';\n\nColor.prototype.get = function (mc) {\n const [mode, channel] = mc.split('.');\n const src = this[mode]();\n if (channel) {\n const i = mode.indexOf(channel) - (mode.substr(0, 2) === 'ok' ? 2 : 0);\n if (i > -1) return src[i];\n throw new Error(`unknown channel ${channel} in mode ${mode}`);\n } else {\n return src;\n }\n};\n","import Color from '../Color.js';\nimport { type } from '../utils/index.js';\nconst { pow } = Math;\n\nconst EPS = 1e-7;\nconst MAX_ITER = 20;\n\nColor.prototype.luminance = function (lum, mode = 'rgb') {\n if (lum !== undefined && type(lum) === 'number') {\n if (lum === 0) {\n // return pure black\n return new Color([0, 0, 0, this._rgb[3]], 'rgb');\n }\n if (lum === 1) {\n // return pure white\n return new Color([255, 255, 255, this._rgb[3]], 'rgb');\n }\n // compute new color using...\n let cur_lum = this.luminance();\n let max_iter = MAX_ITER;\n\n const test = (low, high) => {\n const mid = low.interpolate(high, 0.5, mode);\n const lm = mid.luminance();\n if (Math.abs(lum - lm) < EPS || !max_iter--) {\n // close enough\n return mid;\n }\n return lm > lum ? test(low, mid) : test(mid, high);\n };\n\n const rgb = (\n cur_lum > lum\n ? test(new Color([0, 0, 0]), this)\n : test(this, new Color([255, 255, 255]))\n ).rgb();\n return new Color([...rgb, this._rgb[3]]);\n }\n return rgb2luminance(...this._rgb.slice(0, 3));\n};\n\nconst rgb2luminance = (r, g, b) => {\n // relative luminance\n // see http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\n r = luminance_x(r);\n g = luminance_x(g);\n b = luminance_x(b);\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n};\n\nconst luminance_x = (x) => {\n x /= 255;\n return x <= 0.03928 ? x / 12.92 : pow((x + 0.055) / 1.055, 2.4);\n};\n","export default {};\n","import Color from '../Color.js';\nimport { type } from '../utils/index.js';\nimport interpolator from '../interpolator/index.js';\n\nexport default (col1, col2, f = 0.5, ...rest) => {\n let mode = rest[0] || 'lrgb';\n if (!interpolator[mode] && !rest.length) {\n // fall back to the first supported mode\n mode = Object.keys(interpolator)[0];\n }\n if (!interpolator[mode]) {\n throw new Error(`interpolation mode ${mode} is not defined`);\n }\n if (type(col1) !== 'object') col1 = new Color(col1);\n if (type(col2) !== 'object') col2 = new Color(col2);\n return interpolator[mode](col1, col2, f).alpha(\n col1.alpha() + f * (col2.alpha() - col1.alpha())\n );\n};\n","import Color from '../Color.js';\nimport mix from '../generator/mix.js';\n\nColor.prototype.mix = Color.prototype.interpolate = function (\n col2,\n f = 0.5,\n ...rest\n) {\n return mix(this, col2, f, ...rest);\n};\n","import Color from '../Color.js';\n\nColor.prototype.premultiply = function (mutate = false) {\n const rgb = this._rgb;\n const a = rgb[3];\n if (mutate) {\n this._rgb = [rgb[0] * a, rgb[1] * a, rgb[2] * a, a];\n return this;\n } else {\n return new Color([rgb[0] * a, rgb[1] * a, rgb[2] * a, a], 'rgb');\n }\n};\n","import { unpack, DEG2RAD } from '../../utils/index.js';\nconst { sin, cos } = Math;\n\nconst lch2lab = (...args) => {\n /*\n Convert from a qualitative parameter h and a quantitative parameter l to a 24-bit pixel.\n These formulas were invented by David Dalrymple to obtain maximum contrast without going\n out of gamut if the parameters are in the range 0-1.\n\n A saturation multiplier was added by Gregor Aisch\n */\n let [l, c, h] = unpack(args, 'lch');\n if (isNaN(h)) h = 0;\n h = h * DEG2RAD;\n return [l, cos(h) * c, sin(h) * c];\n};\n\nexport default lch2lab;\n","import { unpack } from '../../utils/index.js';\nimport lch2lab from './lch2lab.js';\nimport lab2rgb from '../lab/lab2rgb.js';\n\nconst lch2rgb = (...args) => {\n args = unpack(args, 'lch');\n const [l, c, h] = args;\n const [L, a, b_] = lch2lab(l, c, h);\n const [r, g, b] = lab2rgb(L, a, b_);\n return [r, g, b, args.length > 3 ? args[3] : 1];\n};\n\nexport default lch2rgb;\n","import { unpack, reverse3 } from '../../utils/index.js';\nimport lch2rgb from './lch2rgb.js';\n\nconst hcl2rgb = (...args) => {\n const hcl = reverse3(unpack(args, 'hcl'));\n return lch2rgb(...hcl);\n};\n\nexport default hcl2rgb;\n","import { unpack, RAD2DEG } from '../../utils/index.js';\nconst { sqrt, atan2, round } = Math;\n\nconst lab2lch = (...args) => {\n const [l, a, b] = unpack(args, 'lab');\n const c = sqrt(a * a + b * b);\n let h = (atan2(b, a) * RAD2DEG + 360) % 360;\n if (round(c * 10000) === 0) h = Number.NaN;\n return [l, c, h];\n};\n\nexport default lab2lch;\n","import { unpack } from '../../utils/index.js';\nimport rgb2lab from '../lab/rgb2lab.js';\nimport lab2lch from './lab2lch.js';\n\nconst rgb2lch = (...args) => {\n const [r, g, b, ...rest] = unpack(args, 'rgb');\n const [l, a, b_] = rgb2lab(r, g, b);\n const [L, c, h] = lab2lch(l, a, b_);\n return [L, c, h, ...(rest.length > 0 && rest[0] < 1 ? [rest[0]] : [])];\n};\n\nexport default rgb2lch;\n","import { unpack, type, reverse3 } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport lch2rgb from './lch2rgb.js';\nimport hcl2rgb from './hcl2rgb.js';\nimport rgb2lch from './rgb2lch.js';\n\nColor.prototype.lch = function () {\n return rgb2lch(this._rgb);\n};\nColor.prototype.hcl = function () {\n return reverse3(rgb2lch(this._rgb));\n};\n\nconst lch = (...args) => new Color(...args, 'lch');\nconst hcl = (...args) => new Color(...args, 'hcl');\n\nObject.assign(chroma, { lch, hcl });\n\ninput.format.lch = lch2rgb;\ninput.format.hcl = hcl2rgb;\n['lch', 'hcl'].forEach((m) =>\n input.autodetect.push({\n p: 2,\n test: (...args) => {\n args = unpack(args, m);\n if (type(args) === 'array' && args.length === 3) {\n return m;\n }\n }\n })\n);\n\nexport { lch, hcl };\n","import '../io/lch/index.js';\nimport Color from '../Color.js';\nimport LAB_CONSTANTS from '../io/lab/lab-constants.js';\n\nColor.prototype.saturate = function (amount = 1) {\n const me = this;\n const lch = me.lch();\n lch[1] += LAB_CONSTANTS.Kn * amount;\n if (lch[1] < 0) lch[1] = 0;\n return new Color(lch, 'lch').alpha(me.alpha(), true);\n};\n\nColor.prototype.desaturate = function (amount = 1) {\n return this.saturate(-amount);\n};\n","import Color from '../Color.js';\nimport { type } from '../utils/index.js';\n\nColor.prototype.set = function (mc, value, mutate = false) {\n const [mode, channel] = mc.split('.');\n const src = this[mode]();\n if (channel) {\n const i = mode.indexOf(channel) - (mode.substr(0, 2) === 'ok' ? 2 : 0);\n if (i > -1) {\n if (type(value) == 'string') {\n switch (value.charAt(0)) {\n case '+':\n src[i] += +value;\n break;\n case '-':\n src[i] += +value;\n break;\n case '*':\n src[i] *= +value.substr(1);\n break;\n case '/':\n src[i] /= +value.substr(1);\n break;\n default:\n src[i] = +value;\n }\n } else if (type(value) === 'number') {\n src[i] = value;\n } else {\n throw new Error(`unsupported value for Color.set`);\n }\n const out = new Color(src, mode);\n if (mutate) {\n this._rgb = out._rgb;\n return this;\n }\n return out;\n }\n throw new Error(`unknown channel ${channel} in mode ${mode}`);\n } else {\n return src;\n }\n};\n","import '../io/lab/index.js';\nimport Color from '../Color.js';\nimport mix from '../generator/mix.js';\n\nColor.prototype.tint = function (f = 0.5, ...rest) {\n return mix(this, 'white', f, ...rest);\n};\n\nColor.prototype.shade = function (f = 0.5, ...rest) {\n return mix(this, 'black', f, ...rest);\n};\n","import Color from '../Color.js';\nimport index from './index.js';\n\nconst rgb = (col1, col2, f) => {\n const xyz0 = col1._rgb;\n const xyz1 = col2._rgb;\n return new Color(\n xyz0[0] + f * (xyz1[0] - xyz0[0]),\n xyz0[1] + f * (xyz1[1] - xyz0[1]),\n xyz0[2] + f * (xyz1[2] - xyz0[2]),\n 'rgb'\n );\n};\n\n// register interpolator\nindex.rgb = rgb;\n\nexport default rgb;\n","import Color from '../Color.js';\nconst { sqrt, pow } = Math;\nimport index from './index.js';\n\nconst lrgb = (col1, col2, f) => {\n const [x1, y1, z1] = col1._rgb;\n const [x2, y2, z2] = col2._rgb;\n return new Color(\n sqrt(pow(x1, 2) * (1 - f) + pow(x2, 2) * f),\n sqrt(pow(y1, 2) * (1 - f) + pow(y2, 2) * f),\n sqrt(pow(z1, 2) * (1 - f) + pow(z2, 2) * f),\n 'rgb'\n );\n};\n\n// register interpolator\nindex.lrgb = lrgb;\n\nexport default lrgb;\n","import '../io/lab/index.js';\nimport index from './index.js';\nimport Color from '../Color.js';\n\nconst lab = (col1, col2, f) => {\n const xyz0 = col1.lab();\n const xyz1 = col2.lab();\n return new Color(\n xyz0[0] + f * (xyz1[0] - xyz0[0]),\n xyz0[1] + f * (xyz1[1] - xyz0[1]),\n xyz0[2] + f * (xyz1[2] - xyz0[2]),\n 'lab'\n );\n};\n\n// register interpolator\nindex.lab = lab;\n\nexport default lab;\n","import Color from '../Color.js';\n\nexport default (col1, col2, f, m) => {\n let xyz0, xyz1;\n if (m === 'hsl') {\n xyz0 = col1.hsl();\n xyz1 = col2.hsl();\n } else if (m === 'hsv') {\n xyz0 = col1.hsv();\n xyz1 = col2.hsv();\n } else if (m === 'hcg') {\n xyz0 = col1.hcg();\n xyz1 = col2.hcg();\n } else if (m === 'hsi') {\n xyz0 = col1.hsi();\n xyz1 = col2.hsi();\n } else if (m === 'lch' || m === 'hcl') {\n m = 'hcl';\n xyz0 = col1.hcl();\n xyz1 = col2.hcl();\n } else if (m === 'oklch') {\n xyz0 = col1.oklch().reverse();\n xyz1 = col2.oklch().reverse();\n }\n\n let hue0, hue1, sat0, sat1, lbv0, lbv1;\n if (m.substr(0, 1) === 'h' || m === 'oklch') {\n [hue0, sat0, lbv0] = xyz0;\n [hue1, sat1, lbv1] = xyz1;\n }\n\n let sat, hue, lbv, dh;\n\n if (!isNaN(hue0) && !isNaN(hue1)) {\n // both colors have hue\n if (hue1 > hue0 && hue1 - hue0 > 180) {\n dh = hue1 - (hue0 + 360);\n } else if (hue1 < hue0 && hue0 - hue1 > 180) {\n dh = hue1 + 360 - hue0;\n } else {\n dh = hue1 - hue0;\n }\n hue = hue0 + f * dh;\n } else if (!isNaN(hue0)) {\n hue = hue0;\n if ((lbv1 == 1 || lbv1 == 0) && m != 'hsv') sat = sat0;\n } else if (!isNaN(hue1)) {\n hue = hue1;\n if ((lbv0 == 1 || lbv0 == 0) && m != 'hsv') sat = sat1;\n } else {\n hue = Number.NaN;\n }\n\n if (sat === undefined) sat = sat0 + f * (sat1 - sat0);\n lbv = lbv0 + f * (lbv1 - lbv0);\n return m === 'oklch'\n ? new Color([lbv, sat, hue], m)\n : new Color([hue, sat, lbv], m);\n};\n","import '../io/lch/index.js';\nimport interpolate_hsx from './_hsx.js';\nimport index from './index.js';\n\nconst lch = (col1, col2, f) => {\n return interpolate_hsx(col1, col2, f, 'lch');\n};\n\n// register interpolator\nindex.lch = lch;\nindex.hcl = lch;\n\nexport default lch;\n","import { type } from '../../utils/index.js';\n\nconst num2rgb = (num) => {\n if (type(num) == 'number' && num >= 0 && num <= 0xffffff) {\n const r = num >> 16;\n const g = (num >> 8) & 0xff;\n const b = num & 0xff;\n return [r, g, b, 1];\n }\n throw new Error('unknown num color: ' + num);\n};\n\nexport default num2rgb;\n","import { unpack } from '../../utils/index.js';\n\nconst rgb2num = (...args) => {\n const [r, g, b] = unpack(args, 'rgb');\n return (r << 16) + (g << 8) + b;\n};\n\nexport default rgb2num;\n","import chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport { type } from '../../utils/index.js';\nimport num2rgb from './num2rgb.js';\nimport rgb2num from './rgb2num.js';\n\nColor.prototype.num = function () {\n return rgb2num(this._rgb);\n};\n\nconst num = (...args) => new Color(...args, 'num');\n\nObject.assign(chroma, { num });\n\ninput.format.num = num2rgb;\n\ninput.autodetect.push({\n p: 5,\n test: (...args) => {\n if (\n args.length === 1 &&\n type(args[0]) === 'number' &&\n args[0] >= 0 &&\n args[0] <= 0xffffff\n ) {\n return 'num';\n }\n }\n});\n\nexport { num };\n","import '../io/num/index.js';\nimport index from './index.js';\n\nimport Color from '../Color.js';\n\nconst num = (col1, col2, f) => {\n const c1 = col1.num();\n const c2 = col2.num();\n return new Color(c1 + f * (c2 - c1), 'num');\n};\n\n// register interpolator\nindex.num = num;\n\nexport default num;\n","import { unpack } from '../../utils/index.js';\nconst { floor } = Math;\n\n/*\n * this is basically just HSV with some minor tweaks\n *\n * hue.. [0..360]\n * chroma .. [0..1]\n * grayness .. [0..1]\n */\n\nconst hcg2rgb = (...args) => {\n args = unpack(args, 'hcg');\n let [h, c, _g] = args;\n let r, g, b;\n _g = _g * 255;\n const _c = c * 255;\n if (c === 0) {\n r = g = b = _g;\n } else {\n if (h === 360) h = 0;\n if (h > 360) h -= 360;\n if (h < 0) h += 360;\n h /= 60;\n const i = floor(h);\n const f = h - i;\n const p = _g * (1 - c);\n const q = p + _c * (1 - f);\n const t = p + _c * f;\n const v = p + _c;\n switch (i) {\n case 0:\n [r, g, b] = [v, t, p];\n break;\n case 1:\n [r, g, b] = [q, v, p];\n break;\n case 2:\n [r, g, b] = [p, v, t];\n break;\n case 3:\n [r, g, b] = [p, q, v];\n break;\n case 4:\n [r, g, b] = [t, p, v];\n break;\n case 5:\n [r, g, b] = [v, p, q];\n break;\n }\n }\n return [r, g, b, args.length > 3 ? args[3] : 1];\n};\n\nexport default hcg2rgb;\n","import { unpack, max, min } from '../../utils/index.js';\n\nconst rgb2hcg = (...args) => {\n const [r, g, b] = unpack(args, 'rgb');\n const minRgb = min(r, g, b);\n const maxRgb = max(r, g, b);\n const delta = maxRgb - minRgb;\n const c = (delta * 100) / 255;\n const _g = (minRgb / (255 - delta)) * 100;\n let h;\n if (delta === 0) {\n h = Number.NaN;\n } else {\n if (r === maxRgb) h = (g - b) / delta;\n if (g === maxRgb) h = 2 + (b - r) / delta;\n if (b === maxRgb) h = 4 + (r - g) / delta;\n h *= 60;\n if (h < 0) h += 360;\n }\n return [h, c, _g];\n};\n\nexport default rgb2hcg;\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport hcg2rgb from './hcg2rgb.js';\nimport rgb2hcg from './rgb2hcg.js';\n\nColor.prototype.hcg = function () {\n return rgb2hcg(this._rgb);\n};\n\nconst hcg = (...args) => new Color(...args, 'hcg');\nchroma.hcg = hcg;\n\ninput.format.hcg = hcg2rgb;\n\ninput.autodetect.push({\n p: 1,\n test: (...args) => {\n args = unpack(args, 'hcg');\n if (type(args) === 'array' && args.length === 3) {\n return 'hcg';\n }\n }\n});\n\nexport { hcg };\n","import '../io/hcg/index.js';\nimport interpolate_hsx from './_hsx.js';\nimport index from './index.js';\n\nconst hcg = (col1, col2, f) => {\n return interpolate_hsx(col1, col2, f, 'hcg');\n};\n\n// register interpolator\nindex.hcg = hcg;\n\nexport default hcg;\n","import { unpack, limit, TWOPI, PITHIRD } from '../../utils/index.js';\nconst { cos } = Math;\n\n/*\n * hue [0..360]\n * saturation [0..1]\n * intensity [0..1]\n */\nconst hsi2rgb = (...args) => {\n /*\n borrowed from here:\n http://hummer.stanford.edu/museinfo/doc/examples/humdrum/keyscape2/hsi2rgb.cpp\n */\n args = unpack(args, 'hsi');\n let [h, s, i] = args;\n let r, g, b;\n\n if (isNaN(h)) h = 0;\n if (isNaN(s)) s = 0;\n // normalize hue\n if (h > 360) h -= 360;\n if (h < 0) h += 360;\n h /= 360;\n if (h < 1 / 3) {\n b = (1 - s) / 3;\n r = (1 + (s * cos(TWOPI * h)) / cos(PITHIRD - TWOPI * h)) / 3;\n g = 1 - (b + r);\n } else if (h < 2 / 3) {\n h -= 1 / 3;\n r = (1 - s) / 3;\n g = (1 + (s * cos(TWOPI * h)) / cos(PITHIRD - TWOPI * h)) / 3;\n b = 1 - (r + g);\n } else {\n h -= 2 / 3;\n g = (1 - s) / 3;\n b = (1 + (s * cos(TWOPI * h)) / cos(PITHIRD - TWOPI * h)) / 3;\n r = 1 - (g + b);\n }\n r = limit(i * r * 3);\n g = limit(i * g * 3);\n b = limit(i * b * 3);\n return [r * 255, g * 255, b * 255, args.length > 3 ? args[3] : 1];\n};\n\nexport default hsi2rgb;\n","import { unpack, TWOPI } from '../../utils/index.js';\nconst { min, sqrt, acos } = Math;\n\nconst rgb2hsi = (...args) => {\n /*\n borrowed from here:\n http://hummer.stanford.edu/museinfo/doc/examples/humdrum/keyscape2/rgb2hsi.cpp\n */\n let [r, g, b] = unpack(args, 'rgb');\n r /= 255;\n g /= 255;\n b /= 255;\n let h;\n const min_ = min(r, g, b);\n const i = (r + g + b) / 3;\n const s = i > 0 ? 1 - min_ / i : 0;\n if (s === 0) {\n h = NaN;\n } else {\n h = (r - g + (r - b)) / 2;\n h /= sqrt((r - g) * (r - g) + (r - b) * (g - b));\n h = acos(h);\n if (b > g) {\n h = TWOPI - h;\n }\n h /= TWOPI;\n }\n return [h * 360, s, i];\n};\n\nexport default rgb2hsi;\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport hsi2rgb from './hsi2rgb.js';\nimport rgb2hsi from './rgb2hsi.js';\n\nColor.prototype.hsi = function () {\n return rgb2hsi(this._rgb);\n};\n\nconst hsi = (...args) => new Color(...args, 'hsi');\nchroma.hsi = hsi;\n\ninput.format.hsi = hsi2rgb;\n\ninput.autodetect.push({\n p: 2,\n test: (...args) => {\n args = unpack(args, 'hsi');\n if (type(args) === 'array' && args.length === 3) {\n return 'hsi';\n }\n }\n});\n\nexport { hsi };\n","import '../io/hsi/index.js';\nimport interpolate_hsx from './_hsx.js';\nimport index from './index.js';\n\nconst hsi = (col1, col2, f) => {\n return interpolate_hsx(col1, col2, f, 'hsi');\n};\n\n// register interpolator\nindex.hsi = hsi;\n\nexport default hsi;\n","import { unpack } from '../../utils/index.js';\n\nconst hsl2rgb = (...args) => {\n args = unpack(args, 'hsl');\n const [h, s, l] = args;\n let r, g, b;\n if (s === 0) {\n r = g = b = l * 255;\n } else {\n const t3 = [0, 0, 0];\n const c = [0, 0, 0];\n const t2 = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const t1 = 2 * l - t2;\n const h_ = h / 360;\n t3[0] = h_ + 1 / 3;\n t3[1] = h_;\n t3[2] = h_ - 1 / 3;\n for (let i = 0; i < 3; i++) {\n if (t3[i] < 0) t3[i] += 1;\n if (t3[i] > 1) t3[i] -= 1;\n if (6 * t3[i] < 1) c[i] = t1 + (t2 - t1) * 6 * t3[i];\n else if (2 * t3[i] < 1) c[i] = t2;\n else if (3 * t3[i] < 2) c[i] = t1 + (t2 - t1) * (2 / 3 - t3[i]) * 6;\n else c[i] = t1;\n }\n [r, g, b] = [c[0] * 255, c[1] * 255, c[2] * 255];\n }\n if (args.length > 3) {\n // keep alpha channel\n return [r, g, b, args[3]];\n }\n return [r, g, b, 1];\n};\n\nexport default hsl2rgb;\n","import { unpack, min, max } from '../../utils/index.js';\n\n/*\n * supported arguments:\n * - rgb2hsl(r,g,b)\n * - rgb2hsl(r,g,b,a)\n * - rgb2hsl([r,g,b])\n * - rgb2hsl([r,g,b,a])\n * - rgb2hsl({r,g,b,a})\n */\nconst rgb2hsl = (...args) => {\n args = unpack(args, 'rgba');\n let [r, g, b] = args;\n\n r /= 255;\n g /= 255;\n b /= 255;\n\n const minRgb = min(r, g, b);\n const maxRgb = max(r, g, b);\n\n const l = (maxRgb + minRgb) / 2;\n let s, h;\n\n if (maxRgb === minRgb) {\n s = 0;\n h = Number.NaN;\n } else {\n s =\n l < 0.5\n ? (maxRgb - minRgb) / (maxRgb + minRgb)\n : (maxRgb - minRgb) / (2 - maxRgb - minRgb);\n }\n\n if (r == maxRgb) h = (g - b) / (maxRgb - minRgb);\n else if (g == maxRgb) h = 2 + (b - r) / (maxRgb - minRgb);\n else if (b == maxRgb) h = 4 + (r - g) / (maxRgb - minRgb);\n\n h *= 60;\n if (h < 0) h += 360;\n if (args.length > 3 && args[3] !== undefined) return [h, s, l, args[3]];\n return [h, s, l];\n};\n\nexport default rgb2hsl;\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport hsl2rgb from './hsl2rgb.js';\nimport rgb2hsl from './rgb2hsl.js';\n\nColor.prototype.hsl = function () {\n return rgb2hsl(this._rgb);\n};\n\nconst hsl = (...args) => new Color(...args, 'hsl');\nchroma.hsl = hsl;\n\ninput.format.hsl = hsl2rgb;\n\ninput.autodetect.push({\n p: 2,\n test: (...args) => {\n args = unpack(args, 'hsl');\n if (type(args) === 'array' && args.length === 3) {\n return 'hsl';\n }\n }\n});\n\nexport { hsl };\n","import '../io/hsl/index.js';\nimport interpolate_hsx from './_hsx.js';\nimport index from './index.js';\n\nconst hsl = (col1, col2, f) => {\n return interpolate_hsx(col1, col2, f, 'hsl');\n};\n\n// register interpolator\nindex.hsl = hsl;\n\nexport default hsl;\n","import { unpack } from '../../utils/index.js';\nconst { floor } = Math;\n\nconst hsv2rgb = (...args) => {\n args = unpack(args, 'hsv');\n let [h, s, v] = args;\n let r, g, b;\n v *= 255;\n if (s === 0) {\n r = g = b = v;\n } else {\n if (h === 360) h = 0;\n if (h > 360) h -= 360;\n if (h < 0) h += 360;\n h /= 60;\n\n const i = floor(h);\n const f = h - i;\n const p = v * (1 - s);\n const q = v * (1 - s * f);\n const t = v * (1 - s * (1 - f));\n\n switch (i) {\n case 0:\n [r, g, b] = [v, t, p];\n break;\n case 1:\n [r, g, b] = [q, v, p];\n break;\n case 2:\n [r, g, b] = [p, v, t];\n break;\n case 3:\n [r, g, b] = [p, q, v];\n break;\n case 4:\n [r, g, b] = [t, p, v];\n break;\n case 5:\n [r, g, b] = [v, p, q];\n break;\n }\n }\n return [r, g, b, args.length > 3 ? args[3] : 1];\n};\n\nexport default hsv2rgb;\n","import { unpack } from '../../utils/index.js';\nconst { min, max } = Math;\n\n/*\n * supported arguments:\n * - rgb2hsv(r,g,b)\n * - rgb2hsv([r,g,b])\n * - rgb2hsv({r,g,b})\n */\nconst rgb2hsl = (...args) => {\n args = unpack(args, 'rgb');\n let [r, g, b] = args;\n const min_ = min(r, g, b);\n const max_ = max(r, g, b);\n const delta = max_ - min_;\n let h, s, v;\n v = max_ / 255.0;\n if (max_ === 0) {\n h = Number.NaN;\n s = 0;\n } else {\n s = delta / max_;\n if (r === max_) h = (g - b) / delta;\n if (g === max_) h = 2 + (b - r) / delta;\n if (b === max_) h = 4 + (r - g) / delta;\n h *= 60;\n if (h < 0) h += 360;\n }\n return [h, s, v];\n};\n\nexport default rgb2hsl;\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport hsv2rgb from './hsv2rgb.js';\nimport rgb2hsv from './rgb2hsv.js';\n\nColor.prototype.hsv = function () {\n return rgb2hsv(this._rgb);\n};\n\nconst hsv = (...args) => new Color(...args, 'hsv');\nchroma.hsv = hsv;\n\ninput.format.hsv = hsv2rgb;\n\ninput.autodetect.push({\n p: 2,\n test: (...args) => {\n args = unpack(args, 'hsv');\n if (type(args) === 'array' && args.length === 3) {\n return 'hsv';\n }\n }\n});\n\nexport { hsv };\n","import '../io/hsv/index.js';\nimport interpolate_hsx from './_hsx.js';\nimport index from './index.js';\n\nconst hsv = (col1, col2, f) => {\n return interpolate_hsx(col1, col2, f, 'hsv');\n};\n\n// register interpolator\nindex.hsv = hsv;\n\nexport default hsv;\n","// from https://www.w3.org/TR/css-color-4/multiply-matrices.js\nexport default function multiplyMatrices(A, B) {\n let m = A.length;\n\n if (!Array.isArray(A[0])) {\n // A is vector, convert to [[a, b, c, ...]]\n A = [A];\n }\n\n if (!Array.isArray(B[0])) {\n // B is vector, convert to [[a], [b], [c], ...]]\n B = B.map((x) => [x]);\n }\n\n let p = B[0].length;\n let B_cols = B[0].map((_, i) => B.map((x) => x[i])); // transpose B\n let product = A.map((row) =>\n B_cols.map((col) => {\n if (!Array.isArray(row)) {\n return col.reduce((a, c) => a + c * row, 0);\n }\n\n return row.reduce((a, c, i) => a + c * (col[i] || 0), 0);\n })\n );\n\n if (m === 1) {\n product = product[0]; // Avoid [[a, b, c, ...]]\n }\n\n if (p === 1) {\n return product.map((x) => x[0]); // Avoid [[a], [b], [c], ...]]\n }\n\n return product;\n}\n","import { unpack } from '../../utils/index.js';\nimport multiplyMatrices from '../../utils/multiply-matrices.js';\nimport { xyz2rgb } from '../lab/lab2rgb.js';\n\nconst oklab2rgb = (...args) => {\n args = unpack(args, 'lab');\n const [L, a, b, ...rest] = args;\n const [X, Y, Z] = OKLab_to_XYZ([L, a, b]);\n const [r, g, b_] = xyz2rgb(X, Y, Z);\n return [r, g, b_, ...(rest.length > 0 && rest[0] < 1 ? [rest[0]] : [])];\n};\n\n// from https://www.w3.org/TR/css-color-4/#color-conversion-code\nfunction OKLab_to_XYZ(OKLab) {\n // Given OKLab, convert to XYZ relative to D65\n var LMStoXYZ = [\n [1.2268798758459243, -0.5578149944602171, 0.2813910456659647],\n [-0.0405757452148008, 1.112286803280317, -0.0717110580655164],\n [-0.0763729366746601, -0.4214933324022432, 1.5869240198367816]\n ];\n var OKLabtoLMS = [\n [1.0, 0.3963377773761749, 0.2158037573099136],\n [1.0, -0.1055613458156586, -0.0638541728258133],\n [1.0, -0.0894841775298119, -1.2914855480194092]\n ];\n\n var LMSnl = multiplyMatrices(OKLabtoLMS, OKLab);\n return multiplyMatrices(\n LMStoXYZ,\n LMSnl.map((c) => c ** 3)\n );\n}\n\nexport default oklab2rgb;\n","import { unpack } from '../../utils/index.js';\nimport multiplyMatrices from '../../utils/multiply-matrices.js';\nimport { rgb2xyz } from '../lab/rgb2lab.js';\n\nconst rgb2oklab = (...args) => {\n const [r, g, b, ...rest] = unpack(args, 'rgb');\n const xyz = rgb2xyz(r, g, b);\n const oklab = XYZ_to_OKLab(xyz);\n return [...oklab, ...(rest.length > 0 && rest[0] < 1 ? [rest[0]] : [])];\n};\n\n// from https://www.w3.org/TR/css-color-4/#color-conversion-code\nfunction XYZ_to_OKLab(XYZ) {\n // Given XYZ relative to D65, convert to OKLab\n const XYZtoLMS = [\n [0.819022437996703, 0.3619062600528904, -0.1288737815209879],\n [0.0329836539323885, 0.9292868615863434, 0.0361446663506424],\n [0.0481771893596242, 0.2642395317527308, 0.6335478284694309]\n ];\n const LMStoOKLab = [\n [0.210454268309314, 0.7936177747023054, -0.0040720430116193],\n [1.9779985324311684, -2.4285922420485799, 0.450593709617411],\n [0.0259040424655478, 0.7827717124575296, -0.8086757549230774]\n ];\n\n const LMS = multiplyMatrices(XYZtoLMS, XYZ);\n // JavaScript Math.cbrt returns a sign-matched cube root\n // beware if porting to other languages\n // especially if tempted to use a general power function\n return multiplyMatrices(\n LMStoOKLab,\n LMS.map((c) => Math.cbrt(c))\n );\n // L in range [0,1]. For use in CSS, multiply by 100 and add a percent\n}\n\nexport default rgb2oklab;\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport oklab2rgb from './oklab2rgb.js';\nimport rgb2oklab from './rgb2oklab.js';\n\nColor.prototype.oklab = function () {\n return rgb2oklab(this._rgb);\n};\n\nconst oklab = (...args) => new Color(...args, 'oklab');\nObject.assign(chroma, { oklab });\n\ninput.format.oklab = oklab2rgb;\n\ninput.autodetect.push({\n p: 2,\n test: (...args) => {\n args = unpack(args, 'oklab');\n if (type(args) === 'array' && args.length === 3) {\n return 'oklab';\n }\n }\n});\n\nexport { oklab };\n","import '../io/oklab/index.js';\nimport index from './index.js';\nimport Color from '../Color.js';\n\nconst oklab = (col1, col2, f) => {\n const xyz0 = col1.oklab();\n const xyz1 = col2.oklab();\n return new Color(\n xyz0[0] + f * (xyz1[0] - xyz0[0]),\n xyz0[1] + f * (xyz1[1] - xyz0[1]),\n xyz0[2] + f * (xyz1[2] - xyz0[2]),\n 'oklab'\n );\n};\n\n// register interpolator\nindex.oklab = oklab;\n\nexport default oklab;\n","import '../io/lch/index.js';\nimport interpolate_hsx from './_hsx.js';\nimport index from './index.js';\n\nconst oklch = (col1, col2, f) => {\n return interpolate_hsx(col1, col2, f, 'oklch');\n};\n\n// register interpolator\nindex.oklch = oklch;\n\nexport default oklch;\n","import Color from '../Color.js';\nimport { clip_rgb } from '../utils/index.js';\n\nconst { pow, sqrt, PI, cos, sin, atan2 } = Math;\n\nexport default (colors, mode = 'lrgb', weights = null) => {\n const l = colors.length;\n if (!weights) weights = Array.from(new Array(l)).map(() => 1);\n // normalize weights\n const k =\n l /\n weights.reduce(function (a, b) {\n return a + b;\n });\n weights.forEach((w, i) => {\n weights[i] *= k;\n });\n // convert colors to Color objects\n colors = colors.map((c) => new Color(c));\n if (mode === 'lrgb') {\n return _average_lrgb(colors, weights);\n }\n const first = colors.shift();\n const xyz = first.get(mode);\n const cnt = [];\n let dx = 0;\n let dy = 0;\n // initial color\n for (let i = 0; i < xyz.length; i++) {\n xyz[i] = (xyz[i] || 0) * weights[0];\n cnt.push(isNaN(xyz[i]) ? 0 : weights[0]);\n if (mode.charAt(i) === 'h' && !isNaN(xyz[i])) {\n const A = (xyz[i] / 180) * PI;\n dx += cos(A) * weights[0];\n dy += sin(A) * weights[0];\n }\n }\n\n let alpha = first.alpha() * weights[0];\n colors.forEach((c, ci) => {\n const xyz2 = c.get(mode);\n alpha += c.alpha() * weights[ci + 1];\n for (let i = 0; i < xyz.length; i++) {\n if (!isNaN(xyz2[i])) {\n cnt[i] += weights[ci + 1];\n if (mode.charAt(i) === 'h') {\n const A = (xyz2[i] / 180) * PI;\n dx += cos(A) * weights[ci + 1];\n dy += sin(A) * weights[ci + 1];\n } else {\n xyz[i] += xyz2[i] * weights[ci + 1];\n }\n }\n }\n });\n\n for (let i = 0; i < xyz.length; i++) {\n if (mode.charAt(i) === 'h') {\n let A = (atan2(dy / cnt[i], dx / cnt[i]) / PI) * 180;\n while (A < 0) A += 360;\n while (A >= 360) A -= 360;\n xyz[i] = A;\n } else {\n xyz[i] = xyz[i] / cnt[i];\n }\n }\n alpha /= l;\n return new Color(xyz, mode).alpha(alpha > 0.99999 ? 1 : alpha, true);\n};\n\nconst _average_lrgb = (colors, weights) => {\n const l = colors.length;\n const xyz = [0, 0, 0, 0];\n for (let i = 0; i < colors.length; i++) {\n const col = colors[i];\n const f = weights[i] / l;\n const rgb = col._rgb;\n xyz[0] += pow(rgb[0], 2) * f;\n xyz[1] += pow(rgb[1], 2) * f;\n xyz[2] += pow(rgb[2], 2) * f;\n xyz[3] += rgb[3] * f;\n }\n xyz[0] = sqrt(xyz[0]);\n xyz[1] = sqrt(xyz[1]);\n xyz[2] = sqrt(xyz[2]);\n if (xyz[3] > 0.9999999) xyz[3] = 1;\n return new Color(clip_rgb(xyz));\n};\n","// minimal multi-purpose interface\n\n// @requires utils color analyze\nimport chroma from '../chroma.js';\nimport { limit, type } from '../utils/index.js';\n\nconst { pow } = Math;\n\nexport default function (colors) {\n // constructor\n let _mode = 'rgb';\n let _nacol = chroma('#ccc');\n let _spread = 0;\n // const _fixed = false;\n let _domain = [0, 1];\n let _pos = [];\n let _padding = [0, 0];\n let _classes = false;\n let _colors = [];\n let _out = false;\n let _min = 0;\n let _max = 1;\n let _correctLightness = false;\n let _colorCache = {};\n let _useCache = true;\n let _gamma = 1;\n\n // private methods\n\n const setColors = function (colors) {\n colors = colors || ['#fff', '#000'];\n if (\n colors &&\n type(colors) === 'string' &&\n chroma.brewer &&\n chroma.brewer[colors.toLowerCase()]\n ) {\n colors = chroma.brewer[colors.toLowerCase()];\n }\n if (type(colors) === 'array') {\n // handle single color\n if (colors.length === 1) {\n colors = [colors[0], colors[0]];\n }\n // make a copy of the colors\n colors = colors.slice(0);\n // convert to chroma classes\n for (let c = 0; c < colors.length; c++) {\n colors[c] = chroma(colors[c]);\n }\n // auto-fill color position\n _pos.length = 0;\n for (let c = 0; c < colors.length; c++) {\n _pos.push(c / (colors.length - 1));\n }\n }\n resetCache();\n return (_colors = colors);\n };\n\n const getClass = function (value) {\n if (_classes != null) {\n const n = _classes.length - 1;\n let i = 0;\n while (i < n && value >= _classes[i]) {\n i++;\n }\n return i - 1;\n }\n return 0;\n };\n\n let tMapLightness = (t) => t;\n let tMapDomain = (t) => t;\n\n // const classifyValue = function(value) {\n // let val = value;\n // if (_classes.length > 2) {\n // const n = _classes.length-1;\n // const i = getClass(value);\n // const minc = _classes[0] + ((_classes[1]-_classes[0]) * (0 + (_spread * 0.5))); // center of 1st class\n // const maxc = _classes[n-1] + ((_classes[n]-_classes[n-1]) * (1 - (_spread * 0.5))); // center of last class\n // val = _min + ((((_classes[i] + ((_classes[i+1] - _classes[i]) * 0.5)) - minc) / (maxc-minc)) * (_max - _min));\n // }\n // return val;\n // };\n\n const getColor = function (val, bypassMap) {\n let col, t;\n if (bypassMap == null) {\n bypassMap = false;\n }\n if (isNaN(val) || val === null) {\n return _nacol;\n }\n if (!bypassMap) {\n if (_classes && _classes.length > 2) {\n // find the class\n const c = getClass(val);\n t = c / (_classes.length - 2);\n } else if (_max !== _min) {\n // just interpolate between min/max\n t = (val - _min) / (_max - _min);\n } else {\n t = 1;\n }\n } else {\n t = val;\n }\n\n // domain map\n t = tMapDomain(t);\n\n if (!bypassMap) {\n t = tMapLightness(t); // lightness correction\n }\n\n if (_gamma !== 1) {\n t = pow(t, _gamma);\n }\n\n t = _padding[0] + t * (1 - _padding[0] - _padding[1]);\n\n t = limit(t, 0, 1);\n\n const k = Math.floor(t * 10000);\n\n if (_useCache && _colorCache[k]) {\n col = _colorCache[k];\n } else {\n if (type(_colors) === 'array') {\n //for i in [0.._pos.length-1]\n for (let i = 0; i < _pos.length; i++) {\n const p = _pos[i];\n if (t <= p) {\n col = _colors[i];\n break;\n }\n if (t >= p && i === _pos.length - 1) {\n col = _colors[i];\n break;\n }\n if (t > p && t < _pos[i + 1]) {\n t = (t - p) / (_pos[i + 1] - p);\n col = chroma.interpolate(\n _colors[i],\n _colors[i + 1],\n t,\n _mode\n );\n break;\n }\n }\n } else if (type(_colors) === 'function') {\n col = _colors(t);\n }\n if (_useCache) {\n _colorCache[k] = col;\n }\n }\n return col;\n };\n\n var resetCache = () => (_colorCache = {});\n\n setColors(colors);\n\n // public interface\n\n const f = function (v) {\n const c = chroma(getColor(v));\n if (_out && c[_out]) {\n return c[_out]();\n } else {\n return c;\n }\n };\n\n f.classes = function (classes) {\n if (classes != null) {\n if (type(classes) === 'array') {\n _classes = classes;\n _domain = [classes[0], classes[classes.length - 1]];\n } else {\n const d = chroma.analyze(_domain);\n if (classes === 0) {\n _classes = [d.min, d.max];\n } else {\n _classes = chroma.limits(d, 'e', classes);\n }\n }\n return f;\n }\n return _classes;\n };\n\n f.domain = function (domain) {\n if (!arguments.length) {\n return _domain;\n }\n _min = domain[0];\n _max = domain[domain.length - 1];\n _pos = [];\n const k = _colors.length;\n if (domain.length === k && _min !== _max) {\n // update positions\n for (let d of Array.from(domain)) {\n _pos.push((d - _min) / (_max - _min));\n }\n } else {\n for (let c = 0; c < k; c++) {\n _pos.push(c / (k - 1));\n }\n if (domain.length > 2) {\n // set domain map\n const tOut = domain.map((d, i) => i / (domain.length - 1));\n const tBreaks = domain.map((d) => (d - _min) / (_max - _min));\n if (!tBreaks.every((val, i) => tOut[i] === val)) {\n tMapDomain = (t) => {\n if (t <= 0 || t >= 1) return t;\n let i = 0;\n while (t >= tBreaks[i + 1]) i++;\n const f =\n (t - tBreaks[i]) / (tBreaks[i + 1] - tBreaks[i]);\n const out = tOut[i] + f * (tOut[i + 1] - tOut[i]);\n return out;\n };\n }\n }\n }\n _domain = [_min, _max];\n return f;\n };\n\n f.mode = function (_m) {\n if (!arguments.length) {\n return _mode;\n }\n _mode = _m;\n resetCache();\n return f;\n };\n\n f.range = function (colors, _pos) {\n setColors(colors, _pos);\n return f;\n };\n\n f.out = function (_o) {\n _out = _o;\n return f;\n };\n\n f.spread = function (val) {\n if (!arguments.length) {\n return _spread;\n }\n _spread = val;\n return f;\n };\n\n f.correctLightness = function (v) {\n if (v == null) {\n v = true;\n }\n _correctLightness = v;\n resetCache();\n if (_correctLightness) {\n tMapLightness = function (t) {\n const L0 = getColor(0, true).lab()[0];\n const L1 = getColor(1, true).lab()[0];\n const pol = L0 > L1;\n let L_actual = getColor(t, true).lab()[0];\n const L_ideal = L0 + (L1 - L0) * t;\n let L_diff = L_actual - L_ideal;\n let t0 = 0;\n let t1 = 1;\n let max_iter = 20;\n while (Math.abs(L_diff) > 1e-2 && max_iter-- > 0) {\n (function () {\n if (pol) {\n L_diff *= -1;\n }\n if (L_diff < 0) {\n t0 = t;\n t += (t1 - t) * 0.5;\n } else {\n t1 = t;\n t += (t0 - t) * 0.5;\n }\n L_actual = getColor(t, true).lab()[0];\n return (L_diff = L_actual - L_ideal);\n })();\n }\n return t;\n };\n } else {\n tMapLightness = (t) => t;\n }\n return f;\n };\n\n f.padding = function (p) {\n if (p != null) {\n if (type(p) === 'number') {\n p = [p, p];\n }\n _padding = p;\n return f;\n } else {\n return _padding;\n }\n };\n\n f.colors = function (numColors, out) {\n // If no arguments are given, return the original colors that were provided\n if (arguments.length < 2) {\n out = 'hex';\n }\n let result = [];\n\n if (arguments.length === 0) {\n result = _colors.slice(0);\n } else if (numColors === 1) {\n result = [f(0.5)];\n } else if (numColors > 1) {\n const dm = _domain[0];\n const dd = _domain[1] - dm;\n result = __range__(0, numColors, false).map((i) =>\n f(dm + (i / (numColors - 1)) * dd)\n );\n } else {\n // returns all colors based on the defined classes\n colors = [];\n let samples = [];\n if (_classes && _classes.length > 2) {\n for (\n let i = 1, end = _classes.length, asc = 1 <= end;\n asc ? i < end : i > end;\n asc ? i++ : i--\n ) {\n samples.push((_classes[i - 1] + _classes[i]) * 0.5);\n }\n } else {\n samples = _domain;\n }\n result = samples.map((v) => f(v));\n }\n\n if (chroma[out]) {\n result = result.map((c) => c[out]());\n }\n return result;\n };\n\n f.cache = function (c) {\n if (c != null) {\n _useCache = c;\n return f;\n } else {\n return _useCache;\n }\n };\n\n f.gamma = function (g) {\n if (g != null) {\n _gamma = g;\n return f;\n } else {\n return _gamma;\n }\n };\n\n f.nodata = function (d) {\n if (d != null) {\n _nacol = chroma(d);\n return f;\n } else {\n return _nacol;\n }\n };\n\n return f;\n}\n\nfunction __range__(left, right, inclusive) {\n let range = [];\n let ascending = left < right;\n let end = !inclusive ? right : ascending ? right + 1 : right - 1;\n for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {\n range.push(i);\n }\n return range;\n}\n","//\n// interpolates between a set of colors uzing a bezier spline\n//\n\n// @requires utils lab\nimport Color from '../Color.js';\nimport '../io/lab/index.js';\nimport scale from './scale.js';\n\n// nth row of the pascal triangle\nconst binom_row = function (n) {\n let row = [1, 1];\n for (let i = 1; i < n; i++) {\n let newrow = [1];\n for (let j = 1; j <= row.length; j++) {\n newrow[j] = (row[j] || 0) + row[j - 1];\n }\n row = newrow;\n }\n return row;\n};\n\nconst bezier = function (colors) {\n let I, lab0, lab1, lab2;\n colors = colors.map((c) => new Color(c));\n if (colors.length === 2) {\n // linear interpolation\n [lab0, lab1] = colors.map((c) => c.lab());\n I = function (t) {\n const lab = [0, 1, 2].map((i) => lab0[i] + t * (lab1[i] - lab0[i]));\n return new Color(lab, 'lab');\n };\n } else if (colors.length === 3) {\n // quadratic bezier interpolation\n [lab0, lab1, lab2] = colors.map((c) => c.lab());\n I = function (t) {\n const lab = [0, 1, 2].map(\n (i) =>\n (1 - t) * (1 - t) * lab0[i] +\n 2 * (1 - t) * t * lab1[i] +\n t * t * lab2[i]\n );\n return new Color(lab, 'lab');\n };\n } else if (colors.length === 4) {\n // cubic bezier interpolation\n let lab3;\n [lab0, lab1, lab2, lab3] = colors.map((c) => c.lab());\n I = function (t) {\n const lab = [0, 1, 2].map(\n (i) =>\n (1 - t) * (1 - t) * (1 - t) * lab0[i] +\n 3 * (1 - t) * (1 - t) * t * lab1[i] +\n 3 * (1 - t) * t * t * lab2[i] +\n t * t * t * lab3[i]\n );\n return new Color(lab, 'lab');\n };\n } else if (colors.length >= 5) {\n // general case (degree n bezier)\n let labs, row, n;\n labs = colors.map((c) => c.lab());\n n = colors.length - 1;\n row = binom_row(n);\n I = function (t) {\n const u = 1 - t;\n const lab = [0, 1, 2].map((i) =>\n labs.reduce(\n (sum, el, j) =>\n sum + row[j] * u ** (n - j) * t ** j * el[i],\n 0\n )\n );\n return new Color(lab, 'lab');\n };\n } else {\n throw new RangeError('No point in running bezier with only one color.');\n }\n return I;\n};\n\nexport default (colors) => {\n const f = bezier(colors);\n f.scale = () => scale(f);\n return f;\n};\n","import chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport { unpack, type } from '../../utils/index.js';\nconst { round } = Math;\n\nColor.prototype.rgb = function (rnd = true) {\n if (rnd === false) return this._rgb.slice(0, 3);\n return this._rgb.slice(0, 3).map(round);\n};\n\nColor.prototype.rgba = function (rnd = true) {\n return this._rgb.slice(0, 4).map((v, i) => {\n return i < 3 ? (rnd === false ? v : round(v)) : v;\n });\n};\n\nconst rgb = (...args) => new Color(...args, 'rgb');\nObject.assign(chroma, { rgb });\n\ninput.format.rgb = (...args) => {\n const rgba = unpack(args, 'rgba');\n if (rgba[3] === undefined) rgba[3] = 1;\n return rgba;\n};\n\ninput.autodetect.push({\n p: 3,\n test: (...args) => {\n args = unpack(args, 'rgba');\n if (\n type(args) === 'array' &&\n (args.length === 3 ||\n (args.length === 4 &&\n type(args[3]) == 'number' &&\n args[3] >= 0 &&\n args[3] <= 1))\n ) {\n return 'rgb';\n }\n }\n});\n\nexport { rgb };\n","/*\n * interpolates between a set of colors uzing a bezier spline\n * blend mode formulas taken from https://web.archive.org/web/20180110014946/http://www.venture-ware.com/kevin/coding/lets-learn-math-photoshop-blend-modes/\n */\n\nimport '../io/rgb/index.js';\nimport chroma from '../chroma.js';\n\nconst blend = (bottom, top, mode) => {\n if (!blend[mode]) {\n throw new Error('unknown blend mode ' + mode);\n }\n return blend[mode](bottom, top);\n};\n\nconst blend_f = (f) => (bottom, top) => {\n const c0 = chroma(top).rgb();\n const c1 = chroma(bottom).rgb();\n return chroma.rgb(f(c0, c1));\n};\n\nconst each = (f) => (c0, c1) => {\n const out = [];\n out[0] = f(c0[0], c1[0]);\n out[1] = f(c0[1], c1[1]);\n out[2] = f(c0[2], c1[2]);\n return out;\n};\n\nconst normal = (a) => a;\nconst multiply = (a, b) => (a * b) / 255;\nconst darken = (a, b) => (a > b ? b : a);\nconst lighten = (a, b) => (a > b ? a : b);\nconst screen = (a, b) => 255 * (1 - (1 - a / 255) * (1 - b / 255));\nconst overlay = (a, b) =>\n b < 128 ? (2 * a * b) / 255 : 255 * (1 - 2 * (1 - a / 255) * (1 - b / 255));\nconst burn = (a, b) => 255 * (1 - (1 - b / 255) / (a / 255));\nconst dodge = (a, b) => {\n if (a === 255) return 255;\n a = (255 * (b / 255)) / (1 - a / 255);\n return a > 255 ? 255 : a;\n};\n\n// # add = (a,b) ->\n// # if (a + b > 255) then 255 else a + b\n\nblend.normal = blend_f(each(normal));\nblend.multiply = blend_f(each(multiply));\nblend.screen = blend_f(each(screen));\nblend.overlay = blend_f(each(overlay));\nblend.darken = blend_f(each(darken));\nblend.lighten = blend_f(each(lighten));\nblend.dodge = blend_f(each(dodge));\nblend.burn = blend_f(each(burn));\n// blend.add = blend_f(each(add));\n\nexport default blend;\n","// cubehelix interpolation\n// based on D.A. Green \"A colour scheme for the display of astronomical intensity images\"\n// http://astron-soc.in/bulletin/11June/289392011.pdf\nimport { type, clip_rgb, TWOPI } from '../utils/index.js';\nimport chroma from '../chroma.js';\nconst { pow, sin, cos } = Math;\n\nexport default function (\n start = 300,\n rotations = -1.5,\n hue = 1,\n gamma = 1,\n lightness = [0, 1]\n) {\n let dh = 0,\n dl;\n if (type(lightness) === 'array') {\n dl = lightness[1] - lightness[0];\n } else {\n dl = 0;\n lightness = [lightness, lightness];\n }\n const f = function (fract) {\n const a = TWOPI * ((start + 120) / 360 + rotations * fract);\n const l = pow(lightness[0] + dl * fract, gamma);\n const h = dh !== 0 ? hue[0] + fract * dh : hue;\n const amp = (h * l * (1 - l)) / 2;\n const cos_a = cos(a);\n const sin_a = sin(a);\n const r = l + amp * (-0.14861 * cos_a + 1.78277 * sin_a);\n const g = l + amp * (-0.29227 * cos_a - 0.90649 * sin_a);\n const b = l + amp * (+1.97294 * cos_a);\n return chroma(clip_rgb([r * 255, g * 255, b * 255, 1]));\n };\n f.start = function (s) {\n if (s == null) {\n return start;\n }\n start = s;\n return f;\n };\n f.rotations = function (r) {\n if (r == null) {\n return rotations;\n }\n rotations = r;\n return f;\n };\n f.gamma = function (g) {\n if (g == null) {\n return gamma;\n }\n gamma = g;\n return f;\n };\n f.hue = function (h) {\n if (h == null) {\n return hue;\n }\n hue = h;\n if (type(hue) === 'array') {\n dh = hue[1] - hue[0];\n if (dh === 0) {\n hue = hue[1];\n }\n } else {\n dh = 0;\n }\n return f;\n };\n f.lightness = function (h) {\n if (h == null) {\n return lightness;\n }\n if (type(h) === 'array') {\n lightness = h;\n dl = h[1] - h[0];\n } else {\n lightness = [h, h];\n dl = 0;\n }\n return f;\n };\n f.scale = () => chroma.scale(f);\n f.hue(hue);\n return f;\n}\n","import Color from '../Color.js';\nconst digits = '0123456789abcdef';\n\nconst { floor, random } = Math;\n\nexport default () => {\n let code = '#';\n for (let i = 0; i < 6; i++) {\n code += digits.charAt(floor(random() * 16));\n }\n return new Color(code, 'hex');\n};\n","import type from './type.js';\n\nconst { log, pow, floor, abs } = Math;\n\nexport function analyze(data, key = null) {\n const r = {\n min: Number.MAX_VALUE,\n max: Number.MAX_VALUE * -1,\n sum: 0,\n values: [],\n count: 0\n };\n if (type(data) === 'object') {\n data = Object.values(data);\n }\n data.forEach((val) => {\n if (key && type(val) === 'object') val = val[key];\n if (val !== undefined && val !== null && !isNaN(val)) {\n r.values.push(val);\n r.sum += val;\n if (val < r.min) r.min = val;\n if (val > r.max) r.max = val;\n r.count += 1;\n }\n });\n\n r.domain = [r.min, r.max];\n\n r.limits = (mode, num) => limits(r, mode, num);\n\n return r;\n}\n\nexport function limits(data, mode = 'equal', num = 7) {\n if (type(data) == 'array') {\n data = analyze(data);\n }\n const { min, max } = data;\n const values = data.values.sort((a, b) => a - b);\n\n if (num === 1) {\n return [min, max];\n }\n\n const limits = [];\n\n if (mode.substr(0, 1) === 'c') {\n // continuous\n limits.push(min);\n limits.push(max);\n }\n\n if (mode.substr(0, 1) === 'e') {\n // equal interval\n limits.push(min);\n for (let i = 1; i < num; i++) {\n limits.push(min + (i / num) * (max - min));\n }\n limits.push(max);\n } else if (mode.substr(0, 1) === 'l') {\n // log scale\n if (min <= 0) {\n throw new Error(\n 'Logarithmic scales are only possible for values > 0'\n );\n }\n const min_log = Math.LOG10E * log(min);\n const max_log = Math.LOG10E * log(max);\n limits.push(min);\n for (let i = 1; i < num; i++) {\n limits.push(pow(10, min_log + (i / num) * (max_log - min_log)));\n }\n limits.push(max);\n } else if (mode.substr(0, 1) === 'q') {\n // quantile scale\n limits.push(min);\n for (let i = 1; i < num; i++) {\n const p = ((values.length - 1) * i) / num;\n const pb = floor(p);\n if (pb === p) {\n limits.push(values[pb]);\n } else {\n // p > pb\n const pr = p - pb;\n limits.push(values[pb] * (1 - pr) + values[pb + 1] * pr);\n }\n }\n limits.push(max);\n } else if (mode.substr(0, 1) === 'k') {\n // k-means clustering\n /*\n implementation based on\n http://code.google.com/p/figue/source/browse/trunk/figue.js#336\n simplified for 1-d input values\n */\n let cluster;\n const n = values.length;\n const assignments = new Array(n);\n const clusterSizes = new Array(num);\n let repeat = true;\n let nb_iters = 0;\n let centroids = null;\n\n // get seed values\n centroids = [];\n centroids.push(min);\n for (let i = 1; i < num; i++) {\n centroids.push(min + (i / num) * (max - min));\n }\n centroids.push(max);\n\n while (repeat) {\n // assignment step\n for (let j = 0; j < num; j++) {\n clusterSizes[j] = 0;\n }\n for (let i = 0; i < n; i++) {\n const value = values[i];\n let mindist = Number.MAX_VALUE;\n let best;\n for (let j = 0; j < num; j++) {\n const dist = abs(centroids[j] - value);\n if (dist < mindist) {\n mindist = dist;\n best = j;\n }\n clusterSizes[best]++;\n assignments[i] = best;\n }\n }\n\n // update centroids step\n const newCentroids = new Array(num);\n for (let j = 0; j < num; j++) {\n newCentroids[j] = null;\n }\n for (let i = 0; i < n; i++) {\n cluster = assignments[i];\n if (newCentroids[cluster] === null) {\n newCentroids[cluster] = values[i];\n } else {\n newCentroids[cluster] += values[i];\n }\n }\n for (let j = 0; j < num; j++) {\n newCentroids[j] *= 1 / clusterSizes[j];\n }\n\n // check convergence\n repeat = false;\n for (let j = 0; j < num; j++) {\n if (newCentroids[j] !== centroids[j]) {\n repeat = true;\n break;\n }\n }\n\n centroids = newCentroids;\n nb_iters++;\n\n if (nb_iters > 200) {\n repeat = false;\n }\n }\n\n // finished k-means clustering\n // the next part is borrowed from gabrielflor.it\n const kClusters = {};\n for (let j = 0; j < num; j++) {\n kClusters[j] = [];\n }\n for (let i = 0; i < n; i++) {\n cluster = assignments[i];\n kClusters[cluster].push(values[i]);\n }\n let tmpKMeansBreaks = [];\n for (let j = 0; j < num; j++) {\n tmpKMeansBreaks.push(kClusters[j][0]);\n tmpKMeansBreaks.push(kClusters[j][kClusters[j].length - 1]);\n }\n tmpKMeansBreaks = tmpKMeansBreaks.sort((a, b) => a - b);\n limits.push(tmpKMeansBreaks[0]);\n for (let i = 1; i < tmpKMeansBreaks.length; i += 2) {\n const v = tmpKMeansBreaks[i];\n if (!isNaN(v) && limits.indexOf(v) === -1) {\n limits.push(v);\n }\n }\n }\n return limits;\n}\n","import Color from '../Color.js';\nimport '../ops/luminance.js';\n\nexport default (a, b) => {\n // WCAG contrast ratio\n // see http://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef\n a = new Color(a);\n b = new Color(b);\n const l1 = a.luminance();\n const l2 = b.luminance();\n return l1 > l2 ? (l1 + 0.05) / (l2 + 0.05) : (l2 + 0.05) / (l1 + 0.05);\n};\n","import Color from '../Color.js';\nimport mix from '../generator/mix.js';\n\n/**\n * @license\n *\n * The APCA contrast prediction algorithm is based of the formulas published\n * in the APCA-1.0.98G specification by Myndex. The specification is available at:\n * https://raw.githubusercontent.com/Myndex/apca-w3/master/images/APCAw3_0.1.17_APCA0.0.98G.svg\n *\n * Note that the APCA implementation is still beta, so please update to\n * future versions of chroma.js when they become available.\n *\n * You can read more about the APCA Readability Criterion at\n * https://readtech.org/ARC/\n */\n\n// constants\nconst W_offset = 0.027;\nconst P_in = 0.0005;\nconst P_out = 0.1;\nconst R_scale = 1.14;\nconst B_threshold = 0.022;\nconst B_exp = 1.414;\n\nexport default (text, bg) => {\n // parse input colors\n text = new Color(text);\n bg = new Color(bg);\n // if text color has alpha, blend against background\n if (text.alpha() < 1) {\n text = mix(bg, text, text.alpha(), 'rgb');\n }\n const l_text = lum(...text.rgb());\n const l_bg = lum(...bg.rgb());\n\n // soft clamp black levels\n const Y_text =\n l_text >= B_threshold\n ? l_text\n : l_text + Math.pow(B_threshold - l_text, B_exp);\n const Y_bg =\n l_bg >= B_threshold ? l_bg : l_bg + Math.pow(B_threshold - l_bg, B_exp);\n\n // normal polarity (dark text on light background)\n const S_norm = Math.pow(Y_bg, 0.56) - Math.pow(Y_text, 0.57);\n // reverse polarity (light text on dark background)\n const S_rev = Math.pow(Y_bg, 0.65) - Math.pow(Y_text, 0.62);\n // clamp noise then scale\n const C =\n Math.abs(Y_bg - Y_text) < P_in\n ? 0\n : Y_text < Y_bg\n ? S_norm * R_scale\n : S_rev * R_scale;\n // clamp minimum contrast then offset\n const S_apc = Math.abs(C) < P_out ? 0 : C > 0 ? C - W_offset : C + W_offset;\n // scale to 100\n return S_apc * 100;\n};\n\nfunction lum(r, g, b) {\n return (\n 0.2126729 * Math.pow(r / 255, 2.4) +\n 0.7151522 * Math.pow(g / 255, 2.4) +\n 0.072175 * Math.pow(b / 255, 2.4)\n );\n}\n","import Color from '../Color.js';\nconst { sqrt, pow, min, max, atan2, abs, cos, sin, exp, PI } = Math;\n\nexport default function (a, b, Kl = 1, Kc = 1, Kh = 1) {\n // Delta E (CIE 2000)\n // see http://www.brucelindbloom.com/index.html?Eqn_DeltaE_CIE2000.html\n var rad2deg = function (rad) {\n return (360 * rad) / (2 * PI);\n };\n var deg2rad = function (deg) {\n return (2 * PI * deg) / 360;\n };\n a = new Color(a);\n b = new Color(b);\n const [L1, a1, b1] = Array.from(a.lab());\n const [L2, a2, b2] = Array.from(b.lab());\n const avgL = (L1 + L2) / 2;\n const C1 = sqrt(pow(a1, 2) + pow(b1, 2));\n const C2 = sqrt(pow(a2, 2) + pow(b2, 2));\n const avgC = (C1 + C2) / 2;\n const G = 0.5 * (1 - sqrt(pow(avgC, 7) / (pow(avgC, 7) + pow(25, 7))));\n const a1p = a1 * (1 + G);\n const a2p = a2 * (1 + G);\n const C1p = sqrt(pow(a1p, 2) + pow(b1, 2));\n const C2p = sqrt(pow(a2p, 2) + pow(b2, 2));\n const avgCp = (C1p + C2p) / 2;\n const arctan1 = rad2deg(atan2(b1, a1p));\n const arctan2 = rad2deg(atan2(b2, a2p));\n const h1p = arctan1 >= 0 ? arctan1 : arctan1 + 360;\n const h2p = arctan2 >= 0 ? arctan2 : arctan2 + 360;\n const avgHp =\n abs(h1p - h2p) > 180 ? (h1p + h2p + 360) / 2 : (h1p + h2p) / 2;\n const T =\n 1 -\n 0.17 * cos(deg2rad(avgHp - 30)) +\n 0.24 * cos(deg2rad(2 * avgHp)) +\n 0.32 * cos(deg2rad(3 * avgHp + 6)) -\n 0.2 * cos(deg2rad(4 * avgHp - 63));\n let deltaHp = h2p - h1p;\n deltaHp =\n abs(deltaHp) <= 180\n ? deltaHp\n : h2p <= h1p\n ? deltaHp + 360\n : deltaHp - 360;\n deltaHp = 2 * sqrt(C1p * C2p) * sin(deg2rad(deltaHp) / 2);\n const deltaL = L2 - L1;\n const deltaCp = C2p - C1p;\n const sl = 1 + (0.015 * pow(avgL - 50, 2)) / sqrt(20 + pow(avgL - 50, 2));\n const sc = 1 + 0.045 * avgCp;\n const sh = 1 + 0.015 * avgCp * T;\n const deltaTheta = 30 * exp(-pow((avgHp - 275) / 25, 2));\n const Rc = 2 * sqrt(pow(avgCp, 7) / (pow(avgCp, 7) + pow(25, 7)));\n const Rt = -Rc * sin(2 * deg2rad(deltaTheta));\n const result = sqrt(\n pow(deltaL / (Kl * sl), 2) +\n pow(deltaCp / (Kc * sc), 2) +\n pow(deltaHp / (Kh * sh), 2) +\n Rt * (deltaCp / (Kc * sc)) * (deltaHp / (Kh * sh))\n );\n return max(0, min(100, result));\n}\n","import Color from '../Color.js';\n\n// simple Euclidean distance\nexport default function (a, b, mode = 'lab') {\n // Delta E (CIE 1976)\n // see http://www.brucelindbloom.com/index.html?Equations.html\n a = new Color(a);\n b = new Color(b);\n const l1 = a.get(mode);\n const l2 = b.get(mode);\n let sum_sq = 0;\n for (let i in l1) {\n const d = (l1[i] || 0) - (l2[i] || 0);\n sum_sq += d * d;\n }\n return Math.sqrt(sum_sq);\n}\n","import Color from '../Color.js';\n\nexport default (...args) => {\n try {\n new Color(...args);\n return true;\n // eslint-disable-next-line\n } catch (e) {\n return false;\n }\n};\n","// some pre-defined color scales:\nimport chroma from '../chroma.js';\nimport '../io/hsl/index.js';\nimport scale from '../generator/scale.js';\n\nexport default {\n cool() {\n return scale([chroma.hsl(180, 1, 0.9), chroma.hsl(250, 0.7, 0.4)]);\n },\n hot() {\n return scale(['#000', '#f00', '#ff0', '#fff'], [0, 0.25, 0.75, 1]).mode(\n 'rgb'\n );\n }\n};\n","/**\n ColorBrewer colors for chroma.js\n\n Copyright (c) 2002 Cynthia Brewer, Mark Harrower, and The\n Pennsylvania State University.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software distributed\n under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR\n CONDITIONS OF ANY KIND, either express or implied. See the License for the\n specific language governing permissions and limitations under the License.\n*/\n\nconst colorbrewer = {\n // sequential\n OrRd: ['#fff7ec', '#fee8c8', '#fdd49e', '#fdbb84', '#fc8d59', '#ef6548', '#d7301f', '#b30000', '#7f0000'],\n PuBu: ['#fff7fb', '#ece7f2', '#d0d1e6', '#a6bddb', '#74a9cf', '#3690c0', '#0570b0', '#045a8d', '#023858'],\n BuPu: ['#f7fcfd', '#e0ecf4', '#bfd3e6', '#9ebcda', '#8c96c6', '#8c6bb1', '#88419d', '#810f7c', '#4d004b'],\n Oranges: ['#fff5eb', '#fee6ce', '#fdd0a2', '#fdae6b', '#fd8d3c', '#f16913', '#d94801', '#a63603', '#7f2704'],\n BuGn: ['#f7fcfd', '#e5f5f9', '#ccece6', '#99d8c9', '#66c2a4', '#41ae76', '#238b45', '#006d2c', '#00441b'],\n YlOrBr: ['#ffffe5', '#fff7bc', '#fee391', '#fec44f', '#fe9929', '#ec7014', '#cc4c02', '#993404', '#662506'],\n YlGn: ['#ffffe5', '#f7fcb9', '#d9f0a3', '#addd8e', '#78c679', '#41ab5d', '#238443', '#006837', '#004529'],\n Reds: ['#fff5f0', '#fee0d2', '#fcbba1', '#fc9272', '#fb6a4a', '#ef3b2c', '#cb181d', '#a50f15', '#67000d'],\n RdPu: ['#fff7f3', '#fde0dd', '#fcc5c0', '#fa9fb5', '#f768a1', '#dd3497', '#ae017e', '#7a0177', '#49006a'],\n Greens: ['#f7fcf5', '#e5f5e0', '#c7e9c0', '#a1d99b', '#74c476', '#41ab5d', '#238b45', '#006d2c', '#00441b'],\n YlGnBu: ['#ffffd9', '#edf8b1', '#c7e9b4', '#7fcdbb', '#41b6c4', '#1d91c0', '#225ea8', '#253494', '#081d58'],\n Purples: ['#fcfbfd', '#efedf5', '#dadaeb', '#bcbddc', '#9e9ac8', '#807dba', '#6a51a3', '#54278f', '#3f007d'],\n GnBu: ['#f7fcf0', '#e0f3db', '#ccebc5', '#a8ddb5', '#7bccc4', '#4eb3d3', '#2b8cbe', '#0868ac', '#084081'],\n Greys: ['#ffffff', '#f0f0f0', '#d9d9d9', '#bdbdbd', '#969696', '#737373', '#525252', '#252525', '#000000'],\n YlOrRd: ['#ffffcc', '#ffeda0', '#fed976', '#feb24c', '#fd8d3c', '#fc4e2a', '#e31a1c', '#bd0026', '#800026'],\n PuRd: ['#f7f4f9', '#e7e1ef', '#d4b9da', '#c994c7', '#df65b0', '#e7298a', '#ce1256', '#980043', '#67001f'],\n Blues: ['#f7fbff', '#deebf7', '#c6dbef', '#9ecae1', '#6baed6', '#4292c6', '#2171b5', '#08519c', '#08306b'],\n PuBuGn: ['#fff7fb', '#ece2f0', '#d0d1e6', '#a6bddb', '#67a9cf', '#3690c0', '#02818a', '#016c59', '#014636'],\n Viridis: ['#440154', '#482777', '#3f4a8a', '#31678e', '#26838f', '#1f9d8a', '#6cce5a', '#b6de2b', '#fee825'],\n\n // diverging\n Spectral: ['#9e0142', '#d53e4f', '#f46d43', '#fdae61', '#fee08b', '#ffffbf', '#e6f598', '#abdda4', '#66c2a5', '#3288bd', '#5e4fa2'],\n RdYlGn: ['#a50026', '#d73027', '#f46d43', '#fdae61', '#fee08b', '#ffffbf', '#d9ef8b', '#a6d96a', '#66bd63', '#1a9850', '#006837'],\n RdBu: ['#67001f', '#b2182b', '#d6604d', '#f4a582', '#fddbc7', '#f7f7f7', '#d1e5f0', '#92c5de', '#4393c3', '#2166ac', '#053061'],\n PiYG: ['#8e0152', '#c51b7d', '#de77ae', '#f1b6da', '#fde0ef', '#f7f7f7', '#e6f5d0', '#b8e186', '#7fbc41', '#4d9221', '#276419'],\n PRGn: ['#40004b', '#762a83', '#9970ab', '#c2a5cf', '#e7d4e8', '#f7f7f7', '#d9f0d3', '#a6dba0', '#5aae61', '#1b7837', '#00441b'],\n RdYlBu: ['#a50026', '#d73027', '#f46d43', '#fdae61', '#fee090', '#ffffbf', '#e0f3f8', '#abd9e9', '#74add1', '#4575b4', '#313695'],\n BrBG: ['#543005', '#8c510a', '#bf812d', '#dfc27d', '#f6e8c3', '#f5f5f5', '#c7eae5', '#80cdc1', '#35978f', '#01665e', '#003c30'],\n RdGy: ['#67001f', '#b2182b', '#d6604d', '#f4a582', '#fddbc7', '#ffffff', '#e0e0e0', '#bababa', '#878787', '#4d4d4d', '#1a1a1a'],\n PuOr: ['#7f3b08', '#b35806', '#e08214', '#fdb863', '#fee0b6', '#f7f7f7', '#d8daeb', '#b2abd2', '#8073ac', '#542788', '#2d004b'],\n\n // qualitative\n Set2: ['#66c2a5', '#fc8d62', '#8da0cb', '#e78ac3', '#a6d854', '#ffd92f', '#e5c494', '#b3b3b3'],\n Accent: ['#7fc97f', '#beaed4', '#fdc086', '#ffff99', '#386cb0', '#f0027f', '#bf5b17', '#666666'],\n Set1: ['#e41a1c', '#377eb8', '#4daf4a', '#984ea3', '#ff7f00', '#ffff33', '#a65628', '#f781bf', '#999999'],\n Set3: ['#8dd3c7', '#ffffb3', '#bebada', '#fb8072', '#80b1d3', '#fdb462', '#b3de69', '#fccde5', '#d9d9d9', '#bc80bd', '#ccebc5', '#ffed6f'],\n Dark2: ['#1b9e77', '#d95f02', '#7570b3', '#e7298a', '#66a61e', '#e6ab02', '#a6761d', '#666666'],\n Paired: ['#a6cee3', '#1f78b4', '#b2df8a', '#33a02c', '#fb9a99', '#e31a1c', '#fdbf6f', '#ff7f00', '#cab2d6', '#6a3d9a', '#ffff99', '#b15928'],\n Pastel2: ['#b3e2cd', '#fdcdac', '#cbd5e8', '#f4cae4', '#e6f5c9', '#fff2ae', '#f1e2cc', '#cccccc'],\n Pastel1: ['#fbb4ae', '#b3cde3', '#ccebc5', '#decbe4', '#fed9a6', '#ffffcc', '#e5d8bd', '#fddaec', '#f2f2f2']\n};\n\nconst colorbrewerTypes = Object.keys(colorbrewer);\nconst typeMap = new Map(colorbrewerTypes.map((key) => [key.toLowerCase(), key]));\n\n// use Proxy to allow case-insensitive access to palettes\nconst colorbrewerProxy =\n typeof Proxy === 'function'\n ? new Proxy(colorbrewer, {\n get(target, prop) {\n const lower = prop.toLowerCase();\n if (typeMap.has(lower)) {\n return target[typeMap.get(lower)];\n }\n },\n getOwnPropertyNames() {\n return Object.getOwnPropertyNames(colorbrewerTypes);\n }\n })\n : colorbrewer;\n\nexport default colorbrewerProxy;\n","import { unpack } from '../../utils/index.js';\n\nconst cmyk2rgb = (...args) => {\n args = unpack(args, 'cmyk');\n const [c, m, y, k] = args;\n const alpha = args.length > 4 ? args[4] : 1;\n if (k === 1) return [0, 0, 0, alpha];\n return [\n c >= 1 ? 0 : 255 * (1 - c) * (1 - k), // r\n m >= 1 ? 0 : 255 * (1 - m) * (1 - k), // g\n y >= 1 ? 0 : 255 * (1 - y) * (1 - k), // b\n alpha\n ];\n};\n\nexport default cmyk2rgb;\n","import { unpack } from '../../utils/index.js';\nconst { max } = Math;\n\nconst rgb2cmyk = (...args) => {\n let [r, g, b] = unpack(args, 'rgb');\n r = r / 255;\n g = g / 255;\n b = b / 255;\n const k = 1 - max(r, max(g, b));\n const f = k < 1 ? 1 / (1 - k) : 0;\n const c = (1 - r - k) * f;\n const m = (1 - g - k) * f;\n const y = (1 - b - k) * f;\n return [c, m, y, k];\n};\n\nexport default rgb2cmyk;\n","import chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport { unpack, type } from '../../utils/index.js';\nimport cmyk2rgb from './cmyk2rgb.js';\nimport rgb2cmyk from './rgb2cmyk.js';\n\nColor.prototype.cmyk = function () {\n return rgb2cmyk(this._rgb);\n};\n\nconst cmyk = (...args) => new Color(...args, 'cmyk');\nObject.assign(chroma, { cmyk });\n\ninput.format.cmyk = cmyk2rgb;\n\ninput.autodetect.push({\n p: 2,\n test: (...args) => {\n args = unpack(args, 'cmyk');\n if (type(args) === 'array' && args.length === 4) {\n return 'cmyk';\n }\n }\n});\n\nexport { cmyk };\n","import { unpack, last, rnd2 } from '../../utils/index.js';\n\n/*\n * supported arguments:\n * - hsl2css(h,s,l)\n * - hsl2css(h,s,l,a)\n * - hsl2css([h,s,l], mode)\n * - hsl2css([h,s,l,a], mode)\n * - hsl2css({h,s,l,a}, mode)\n */\nconst hsl2css = (...args) => {\n const hsla = unpack(args, 'hsla');\n let mode = last(args) || 'lsa';\n hsla[0] = rnd2(hsla[0] || 0) + 'deg';\n hsla[1] = rnd2(hsla[1] * 100) + '%';\n hsla[2] = rnd2(hsla[2] * 100) + '%';\n if (mode === 'hsla' || (hsla.length > 3 && hsla[3] < 1)) {\n hsla[3] = '/ ' + (hsla.length > 3 ? hsla[3] : 1);\n mode = 'hsla';\n } else {\n hsla.length = 3;\n }\n return `${mode.substr(0, 3)}(${hsla.join(' ')})`;\n};\n\nexport default hsl2css;\n","import { unpack, last, rnd2 } from '../../utils/index.js';\n\n/*\n * supported arguments:\n * - lab2css(l,a,b)\n * - lab2css(l,a,b,alpha)\n * - lab2css([l,a,b], mode)\n * - lab2css([l,a,b,alpha], mode)\n */\nconst lab2css = (...args) => {\n const laba = unpack(args, 'lab');\n let mode = last(args) || 'lab';\n laba[0] = rnd2(laba[0]) + '%';\n laba[1] = rnd2(laba[1]);\n laba[2] = rnd2(laba[2]);\n if (mode === 'laba' || (laba.length > 3 && laba[3] < 1)) {\n laba[3] = '/ ' + (laba.length > 3 ? laba[3] : 1);\n } else {\n laba.length = 3;\n }\n return `lab(${laba.join(' ')})`;\n};\n\nexport default lab2css;\n","import { unpack, last, rnd2 } from '../../utils/index.js';\n\n/*\n * supported arguments:\n * - lab2css(l,a,b)\n * - lab2css(l,a,b,alpha)\n * - lab2css([l,a,b], mode)\n * - lab2css([l,a,b,alpha], mode)\n */\nconst lch2css = (...args) => {\n const lcha = unpack(args, 'lch');\n let mode = last(args) || 'lab';\n lcha[0] = rnd2(lcha[0]) + '%';\n lcha[1] = rnd2(lcha[1]);\n lcha[2] = isNaN(lcha[2]) ? 'none' : rnd2(lcha[2]) + 'deg'; // add deg unit to hue\n if (mode === 'lcha' || (lcha.length > 3 && lcha[3] < 1)) {\n lcha[3] = '/ ' + (lcha.length > 3 ? lcha[3] : 1);\n } else {\n lcha.length = 3;\n }\n return `lch(${lcha.join(' ')})`;\n};\n\nexport default lch2css;\n","import { unpack, rnd2, rnd3 } from '../../utils/index.js';\n\nconst oklab2css = (...args) => {\n const laba = unpack(args, 'lab');\n laba[0] = rnd2(laba[0] * 100) + '%';\n laba[1] = rnd3(laba[1]);\n laba[2] = rnd3(laba[2]);\n if (laba.length > 3 && laba[3] < 1) {\n laba[3] = '/ ' + (laba.length > 3 ? laba[3] : 1);\n } else {\n laba.length = 3;\n }\n return `oklab(${laba.join(' ')})`;\n};\n\nexport default oklab2css;\n","import { unpack } from '../../utils/index.js';\nimport rgb2oklab from '../oklab/rgb2oklab.js';\nimport lab2lch from '../lch/lab2lch.js';\n\nconst rgb2oklch = (...args) => {\n const [r, g, b, ...rest] = unpack(args, 'rgb');\n const [l, a, b_] = rgb2oklab(r, g, b);\n const [L, c, h] = lab2lch(l, a, b_);\n return [L, c, h, ...(rest.length > 0 && rest[0] < 1 ? [rest[0]] : [])];\n};\n\nexport default rgb2oklch;\n","import { unpack, rnd2, rnd3 } from '../../utils/index.js';\n\nconst oklch2css = (...args) => {\n const lcha = unpack(args, 'lch');\n lcha[0] = rnd2(lcha[0] * 100) + '%';\n lcha[1] = rnd3(lcha[1]);\n lcha[2] = isNaN(lcha[2]) ? 'none' : rnd2(lcha[2]) + 'deg'; // add deg unit to hue\n if (lcha.length > 3 && lcha[3] < 1) {\n lcha[3] = '/ ' + (lcha.length > 3 ? lcha[3] : 1);\n } else {\n lcha.length = 3;\n }\n return `oklch(${lcha.join(' ')})`;\n};\n\nexport default oklch2css;\n","import { unpack, last } from '../../utils/index.js';\nimport hsl2css from './hsl2css.js';\nimport rgb2hsl from '../hsl/rgb2hsl.js';\nimport lab2css from './lab2css.js';\nimport rgb2lab from '../lab/rgb2lab.js';\nimport lch2css from './lch2css.js';\nimport rgb2lch from '../lch/rgb2lch.js';\nimport rgb2oklab from '../oklab/rgb2oklab.js';\nimport oklab2css from './oklab2css.js';\nimport rgb2oklch from '../oklch/rgb2oklch.js';\nimport oklch2css from './oklch2css.js';\nimport { getLabWhitePoint, setLabWhitePoint } from '../lab/lab-constants.js';\nconst { round } = Math;\n\n/*\n * supported arguments:\n * - rgb2css(r,g,b)\n * - rgb2css(r,g,b,a)\n * - rgb2css([r,g,b], mode)\n * - rgb2css([r,g,b,a], mode)\n * - rgb2css({r,g,b,a}, mode)\n */\nconst rgb2css = (...args) => {\n const rgba = unpack(args, 'rgba');\n let mode = last(args) || 'rgb';\n if (mode.substr(0, 3) === 'hsl') {\n return hsl2css(rgb2hsl(rgba), mode);\n }\n if (mode.substr(0, 3) === 'lab') {\n // change to D50 lab whitepoint since this is what W3C is using for CSS Lab colors\n const prevWhitePoint = getLabWhitePoint();\n setLabWhitePoint('d50');\n const cssColor = lab2css(rgb2lab(rgba), mode);\n setLabWhitePoint(prevWhitePoint);\n return cssColor;\n }\n if (mode.substr(0, 3) === 'lch') {\n // change to D50 lab whitepoint since this is what W3C is using for CSS Lab colors\n const prevWhitePoint = getLabWhitePoint();\n setLabWhitePoint('d50');\n const cssColor = lch2css(rgb2lch(rgba), mode);\n setLabWhitePoint(prevWhitePoint);\n return cssColor;\n }\n if (mode.substr(0, 5) === 'oklab') {\n return oklab2css(rgb2oklab(rgba));\n }\n if (mode.substr(0, 5) === 'oklch') {\n return oklch2css(rgb2oklch(rgba));\n }\n rgba[0] = round(rgba[0]);\n rgba[1] = round(rgba[1]);\n rgba[2] = round(rgba[2]);\n if (mode === 'rgba' || (rgba.length > 3 && rgba[3] < 1)) {\n rgba[3] = '/ ' + (rgba.length > 3 ? rgba[3] : 1);\n mode = 'rgba';\n }\n return `${mode.substr(0, 3)}(${rgba.slice(0, mode === 'rgb' ? 3 : 4).join(' ')})`;\n};\n\nexport default rgb2css;\n","import { unpack } from '../../utils/index.js';\nimport lch2lab from '../lch/lch2lab.js';\nimport oklab2rgb from '../oklab/oklab2rgb.js';\n\nconst oklch2rgb = (...args) => {\n args = unpack(args, 'lch');\n const [l, c, h, ...rest] = args;\n const [L, a, b_] = lch2lab(l, c, h);\n const [r, g, b] = oklab2rgb(L, a, b_);\n return [r, g, b, ...(rest.length > 0 && rest[0] < 1 ? [rest[0]] : [])];\n};\n\nexport default oklch2rgb;\n","import hsl2rgb from '../hsl/hsl2rgb.js';\nimport lab2rgb from '../lab/lab2rgb.js';\nimport lch2rgb from '../lch/lch2rgb.js';\nimport oklab2rgb from '../oklab/oklab2rgb.js';\nimport oklch2rgb from '../oklch/oklch2rgb.js';\nimport input from '../input.js';\nimport limit from '../../utils/limit.js';\nimport { getLabWhitePoint, setLabWhitePoint } from '../lab/lab-constants.js';\n\nconst INT_OR_PCT = /((?:-?\\d+)|(?:-?\\d+(?:\\.\\d+)?)%|none)/.source;\nconst FLOAT_OR_PCT = /((?:-?(?:\\d+(?:\\.\\d*)?|\\.\\d+)%?)|none)/.source;\nconst PCT = /((?:-?(?:\\d+(?:\\.\\d*)?|\\.\\d+)%)|none)/.source;\nconst RE_S = /\\s*/.source;\nconst SEP = /\\s+/.source;\nconst COMMA = /\\s*,\\s*/.source;\nconst ANLGE = /((?:-?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:deg)?)|none)/.source;\nconst ALPHA = /\\s*(?:\\/\\s*((?:[01]|[01]?\\.\\d+)|\\d+(?:\\.\\d+)?%))?/.source;\n\n// e.g. rgb(250 20 0), rgb(100% 50% 20%), rgb(100% 50% 20% / 0.5)\nconst RE_RGB = new RegExp(\n '^rgba?\\\\(' +\n RE_S +\n [INT_OR_PCT, INT_OR_PCT, INT_OR_PCT].join(SEP) +\n ALPHA +\n '\\\\)$'\n);\nconst RE_RGB_LEGACY = new RegExp(\n '^rgb\\\\(' +\n RE_S +\n [INT_OR_PCT, INT_OR_PCT, INT_OR_PCT].join(COMMA) +\n RE_S +\n '\\\\)$'\n);\nconst RE_RGBA_LEGACY = new RegExp(\n '^rgba\\\\(' +\n RE_S +\n [INT_OR_PCT, INT_OR_PCT, INT_OR_PCT, FLOAT_OR_PCT].join(COMMA) +\n RE_S +\n '\\\\)$'\n);\n\nconst RE_HSL = new RegExp(\n '^hsla?\\\\(' + RE_S + [ANLGE, PCT, PCT].join(SEP) + ALPHA + '\\\\)$'\n);\nconst RE_HSL_LEGACY = new RegExp(\n '^hsl?\\\\(' + RE_S + [ANLGE, PCT, PCT].join(COMMA) + RE_S + '\\\\)$'\n);\nconst RE_HSLA_LEGACY =\n /^hsla\\(\\s*(-?\\d+(?:\\.\\d+)?),\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*([01]|[01]?\\.\\d+)\\)$/;\n\nconst RE_LAB = new RegExp(\n '^lab\\\\(' +\n RE_S +\n [FLOAT_OR_PCT, FLOAT_OR_PCT, FLOAT_OR_PCT].join(SEP) +\n ALPHA +\n '\\\\)$'\n);\nconst RE_LCH = new RegExp(\n '^lch\\\\(' +\n RE_S +\n [FLOAT_OR_PCT, FLOAT_OR_PCT, ANLGE].join(SEP) +\n ALPHA +\n '\\\\)$'\n);\nconst RE_OKLAB = new RegExp(\n '^oklab\\\\(' +\n RE_S +\n [FLOAT_OR_PCT, FLOAT_OR_PCT, FLOAT_OR_PCT].join(SEP) +\n ALPHA +\n '\\\\)$'\n);\nconst RE_OKLCH = new RegExp(\n '^oklch\\\\(' +\n RE_S +\n [FLOAT_OR_PCT, FLOAT_OR_PCT, ANLGE].join(SEP) +\n ALPHA +\n '\\\\)$'\n);\n\nconst { round } = Math;\n\nconst roundRGB = (rgb) => {\n return rgb.map((v, i) => (i <= 2 ? limit(round(v), 0, 255) : v));\n};\n\nconst percentToAbsolute = (pct, min = 0, max = 100, signed = false) => {\n if (typeof pct === 'string' && pct.endsWith('%')) {\n pct = parseFloat(pct.substring(0, pct.length - 1)) / 100;\n if (signed) {\n // signed percentages are in the range -100% to 100%\n pct = min + (pct + 1) * 0.5 * (max - min);\n } else {\n pct = min + pct * (max - min);\n }\n }\n return +pct;\n};\n\nconst noneToValue = (v, noneValue) => {\n return v === 'none' ? noneValue : v;\n};\n\nconst css2rgb = (css) => {\n css = css.toLowerCase().trim();\n\n if (css === 'transparent') {\n return [0, 0, 0, 0];\n }\n\n let m;\n\n if (input.format.named) {\n try {\n return input.format.named(css);\n // eslint-disable-next-line\n } catch (e) {}\n }\n\n // rgb(250 20 0) or rgb(250,20,0)\n if ((m = css.match(RE_RGB)) || (m = css.match(RE_RGB_LEGACY))) {\n let rgb = m.slice(1, 4);\n for (let i = 0; i < 3; i++) {\n rgb[i] = +percentToAbsolute(noneToValue(rgb[i], 0), 0, 255);\n }\n rgb = roundRGB(rgb);\n const alpha = m[4] !== undefined ? +percentToAbsolute(m[4], 0, 1) : 1;\n rgb[3] = alpha; // default alpha\n return rgb;\n }\n\n // rgba(250,20,0,0.4)\n if ((m = css.match(RE_RGBA_LEGACY))) {\n const rgb = m.slice(1, 5);\n for (let i = 0; i < 4; i++) {\n rgb[i] = +percentToAbsolute(rgb[i], 0, 255);\n }\n return rgb;\n }\n\n // hsl(0,100%,50%)\n if ((m = css.match(RE_HSL)) || (m = css.match(RE_HSL_LEGACY))) {\n const hsl = m.slice(1, 4);\n hsl[0] = +noneToValue(hsl[0].replace('deg', ''), 0);\n hsl[1] = +percentToAbsolute(noneToValue(hsl[1], 0), 0, 100) * 0.01;\n hsl[2] = +percentToAbsolute(noneToValue(hsl[2], 0), 0, 100) * 0.01;\n const rgb = roundRGB(hsl2rgb(hsl));\n const alpha = m[4] !== undefined ? +percentToAbsolute(m[4], 0, 1) : 1;\n rgb[3] = alpha;\n return rgb;\n }\n\n // hsla(0,100%,50%,0.5)\n if ((m = css.match(RE_HSLA_LEGACY))) {\n const hsl = m.slice(1, 4);\n hsl[1] *= 0.01;\n hsl[2] *= 0.01;\n const rgb = hsl2rgb(hsl);\n for (let i = 0; i < 3; i++) {\n rgb[i] = round(rgb[i]);\n }\n rgb[3] = +m[4]; // default alpha = 1\n return rgb;\n }\n\n if ((m = css.match(RE_LAB))) {\n const lab = m.slice(1, 4);\n lab[0] = percentToAbsolute(noneToValue(lab[0], 0), 0, 100);\n lab[1] = percentToAbsolute(noneToValue(lab[1], 0), -125, 125, true);\n lab[2] = percentToAbsolute(noneToValue(lab[2], 0), -125, 125, true);\n // convert to D50 Lab whitepoint\n const wp = getLabWhitePoint();\n setLabWhitePoint('d50');\n const rgb = roundRGB(lab2rgb(lab));\n // convert back to original Lab whitepoint\n setLabWhitePoint(wp);\n const alpha = m[4] !== undefined ? +percentToAbsolute(m[4], 0, 1) : 1;\n rgb[3] = alpha;\n return rgb;\n }\n\n if ((m = css.match(RE_LCH))) {\n const lch = m.slice(1, 4);\n lch[0] = percentToAbsolute(lch[0], 0, 100);\n lch[1] = percentToAbsolute(noneToValue(lch[1], 0), 0, 150, false);\n lch[2] = +noneToValue(lch[2].replace('deg', ''), 0);\n // convert to D50 Lab whitepoint\n const wp = getLabWhitePoint();\n setLabWhitePoint('d50');\n const rgb = roundRGB(lch2rgb(lch));\n // convert back to original Lab whitepoint\n setLabWhitePoint(wp);\n const alpha = m[4] !== undefined ? +percentToAbsolute(m[4], 0, 1) : 1;\n rgb[3] = alpha;\n return rgb;\n }\n\n if ((m = css.match(RE_OKLAB))) {\n const oklab = m.slice(1, 4);\n oklab[0] = percentToAbsolute(noneToValue(oklab[0], 0), 0, 1);\n oklab[1] = percentToAbsolute(noneToValue(oklab[1], 0), -0.4, 0.4, true);\n oklab[2] = percentToAbsolute(noneToValue(oklab[2], 0), -0.4, 0.4, true);\n const rgb = roundRGB(oklab2rgb(oklab));\n const alpha = m[4] !== undefined ? +percentToAbsolute(m[4], 0, 1) : 1;\n rgb[3] = alpha;\n return rgb;\n }\n\n if ((m = css.match(RE_OKLCH))) {\n const oklch = m.slice(1, 4);\n oklch[0] = percentToAbsolute(noneToValue(oklch[0], 0), 0, 1);\n oklch[1] = percentToAbsolute(noneToValue(oklch[1], 0), 0, 0.4, false);\n oklch[2] = +noneToValue(oklch[2].replace('deg', ''), 0);\n const rgb = roundRGB(oklch2rgb(oklch));\n const alpha = m[4] !== undefined ? +percentToAbsolute(m[4], 0, 1) : 1;\n rgb[3] = alpha;\n return rgb;\n }\n};\n\ncss2rgb.test = (s) => {\n return (\n // modern\n RE_RGB.test(s) ||\n RE_HSL.test(s) ||\n RE_LAB.test(s) ||\n RE_LCH.test(s) ||\n RE_OKLAB.test(s) ||\n RE_OKLCH.test(s) ||\n // legacy\n RE_RGB_LEGACY.test(s) ||\n RE_RGBA_LEGACY.test(s) ||\n RE_HSL_LEGACY.test(s) ||\n RE_HSLA_LEGACY.test(s) ||\n s === 'transparent'\n );\n};\n\nexport default css2rgb;\n","import chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport { type } from '../../utils/index.js';\n\nimport rgb2css from './rgb2css.js';\nimport css2rgb from './css2rgb.js';\n\nColor.prototype.css = function (mode) {\n return rgb2css(this._rgb, mode);\n};\n\nconst css = (...args) => new Color(...args, 'css');\nchroma.css = css;\n\ninput.format.css = css2rgb;\n\ninput.autodetect.push({\n p: 5,\n test: (h, ...rest) => {\n if (!rest.length && type(h) === 'string' && css2rgb.test(h)) {\n return 'css';\n }\n }\n});\n\nexport { css };\n","import Color from '../../Color.js';\nimport chroma from '../../chroma.js';\nimport input from '../input.js';\nimport { unpack } from '../../utils/index.js';\n\ninput.format.gl = (...args) => {\n const rgb = unpack(args, 'rgba');\n rgb[0] *= 255;\n rgb[1] *= 255;\n rgb[2] *= 255;\n return rgb;\n};\n\nconst gl = (...args) => new Color(...args, 'gl');\nchroma.gl = gl;\n\nColor.prototype.gl = function () {\n const rgb = this._rgb;\n return [rgb[0] / 255, rgb[1] / 255, rgb[2] / 255, rgb[3]];\n};\n\nexport { gl };\n","import Color from '../../Color.js';\nimport chroma from '../../chroma.js';\nimport { type } from '../../utils/index.js';\nimport input from '../input.js';\nimport hex2rgb from './hex2rgb.js';\nimport rgb2hex from './rgb2hex.js';\n\nColor.prototype.hex = function (mode) {\n return rgb2hex(this._rgb, mode);\n};\n\nconst hex = (...args) => new Color(...args, 'hex');\nchroma.hex = hex;\n\ninput.format.hex = hex2rgb;\ninput.autodetect.push({\n p: 4,\n test: (h, ...rest) => {\n if (\n !rest.length &&\n type(h) === 'string' &&\n [3, 4, 5, 6, 7, 8, 9].indexOf(h.length) >= 0\n ) {\n return 'hex';\n }\n }\n});\n\nexport { hex };\n","/*\n * Based on implementation by Neil Bartlett\n * https://github.com/neilbartlett/color-temperature\n */\n\nconst { log } = Math;\n\nconst temperature2rgb = (kelvin) => {\n const temp = kelvin / 100;\n let r, g, b;\n if (temp < 66) {\n r = 255;\n g =\n temp < 6\n ? 0\n : -155.25485562709179 -\n 0.44596950469579133 * (g = temp - 2) +\n 104.49216199393888 * log(g);\n b =\n temp < 20\n ? 0\n : -254.76935184120902 +\n 0.8274096064007395 * (b = temp - 10) +\n 115.67994401066147 * log(b);\n } else {\n r =\n 351.97690566805693 +\n 0.114206453784165 * (r = temp - 55) -\n 40.25366309332127 * log(r);\n g =\n 325.4494125711974 +\n 0.07943456536662342 * (g = temp - 50) -\n 28.0852963507957 * log(g);\n b = 255;\n }\n return [r, g, b, 1];\n};\n\nexport default temperature2rgb;\n","/*\n * Based on implementation by Neil Bartlett\n * https://github.com/neilbartlett/color-temperature\n **/\n\nimport temperature2rgb from './temperature2rgb.js';\nimport { unpack } from '../../utils/index.js';\nconst { round } = Math;\n\nconst rgb2temperature = (...args) => {\n const rgb = unpack(args, 'rgb');\n const r = rgb[0],\n b = rgb[2];\n let minTemp = 1000;\n let maxTemp = 40000;\n const eps = 0.4;\n let temp;\n while (maxTemp - minTemp > eps) {\n temp = (maxTemp + minTemp) * 0.5;\n const rgb = temperature2rgb(temp);\n if (rgb[2] / rgb[0] >= b / r) {\n maxTemp = temp;\n } else {\n minTemp = temp;\n }\n }\n return round(temp);\n};\n\nexport default rgb2temperature;\n","import chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport temperature2rgb from './temperature2rgb.js';\nimport rgb2temperature from './rgb2temperature.js';\n\nColor.prototype.temp =\n Color.prototype.kelvin =\n Color.prototype.temperature =\n function () {\n return rgb2temperature(this._rgb);\n };\n\nconst temp = (...args) => new Color(...args, 'temp');\nObject.assign(chroma, { temp, kelvin: temp, temperature: temp });\n\ninput.format.temp =\n input.format.kelvin =\n input.format.temperature =\n temperature2rgb;\n\nexport { temp, temp as kelvin, temp as temperature };\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport oklch2rgb from './oklch2rgb.js';\nimport rgb2oklch from './rgb2oklch.js';\n\nColor.prototype.oklch = function () {\n return rgb2oklch(this._rgb);\n};\n\nconst oklch = (...args) => new Color(...args, 'oklch');\nObject.assign(chroma, { oklch });\n\ninput.format.oklch = oklch2rgb;\n\ninput.autodetect.push({\n p: 2,\n test: (...args) => {\n args = unpack(args, 'oklch');\n if (type(args) === 'array' && args.length === 3) {\n return 'oklch';\n }\n }\n});\n\nexport { oklch };\n","// feel free to comment out anything to rollup\n// a smaller chroma.js bundle\nimport chroma from './src/chroma.js';\n\n// io --> convert colors\nimport './src/io/named/index.js';\n\n// operators --> modify existing Colors\nimport './src/ops/alpha.js';\nimport './src/ops/clipped.js';\nimport './src/ops/darken.js';\nimport './src/ops/get.js';\nimport './src/ops/luminance.js';\nimport './src/ops/mix.js';\nimport './src/ops/premultiply.js';\nimport './src/ops/saturate.js';\nimport './src/ops/set.js';\nimport './src/ops/shade.js';\n\n// interpolators\nimport './src/interpolator/rgb.js';\nimport './src/interpolator/lrgb.js';\nimport './src/interpolator/lab.js';\nimport './src/interpolator/lch.js';\nimport './src/interpolator/num.js';\nimport './src/interpolator/hcg.js';\nimport './src/interpolator/hsi.js';\nimport './src/interpolator/hsl.js';\nimport './src/interpolator/hsv.js';\nimport './src/interpolator/oklab.js';\nimport './src/interpolator/oklch.js';\n\n// generators -- > create new colors\nimport average from './src/generator/average.js';\nimport bezier from './src/generator/bezier.js';\nimport blend from './src/generator/blend.js';\nimport cubehelix from './src/generator/cubehelix.js';\nimport mix from './src/generator/mix.js';\nimport random from './src/generator/random.js';\nimport scale from './src/generator/scale.js';\n\n// other utility methods\nimport { analyze } from './src/utils/analyze.js';\nimport contrast from './src/utils/contrast.js';\nimport contrastAPCA from './src/utils/contrastAPCA.js';\nimport deltaE from './src/utils/delta-e.js';\nimport distance from './src/utils/distance.js';\nimport { limits } from './src/utils/analyze.js';\nimport valid from './src/utils/valid.js';\nimport input from './src/io/input.js';\n\n// scale\nimport scales from './src/utils/scales.js';\n\n// colors\nimport colors from './src/colors/w3cx11.js';\nimport brewer from './src/colors/colorbrewer.js';\nimport Color from './src/Color.js';\n\nObject.assign(chroma, {\n analyze,\n average,\n bezier,\n blend,\n brewer,\n Color,\n colors,\n contrast,\n contrastAPCA,\n cubehelix,\n deltaE,\n distance,\n input,\n interpolate: mix,\n limits,\n mix,\n random,\n scale,\n scales,\n valid\n});\n\nexport default chroma;\n\nexport {\n analyze,\n average,\n bezier,\n blend,\n brewer,\n Color,\n colors,\n contrast,\n contrastAPCA,\n cubehelix,\n deltaE,\n distance,\n input,\n limits,\n mix,\n mix as interpolate,\n random,\n scale,\n scales,\n valid\n};\n\nexport * from './src/io/cmyk/index.js';\nexport * from './src/io/css/index.js';\nexport * from './src/io/gl/index.js';\nexport * from './src/io/hcg/index.js';\nexport * from './src/io/hex/index.js';\nexport * from './src/io/hsi/index.js';\nexport * from './src/io/hsl/index.js';\nexport * from './src/io/hsv/index.js';\nexport * from './src/io/lab/index.js';\nexport * from './src/io/lch/index.js';\nexport * from './src/io/num/index.js';\nexport * from './src/io/rgb/index.js';\nexport * from './src/io/temp/index.js';\nexport * from './src/io/oklab/index.js';\nexport * from './src/io/oklch/index.js';\n","\nimport chroma from 'chroma-js';\n\ntype Shade = {\n hex: string;\n name: string;\n}\nexport function generateShades(hexColor: string, name: string): Shade[] {\n const shades = {\n \"50\": 50,\n \"100\": 100,\n \"200\": 200,\n \"300\": 300,\n \"400\": 400,\n \"500\": 500,\n \"600\": 600,\n \"700\": 700,\n \"800\": 800,\n \"900\": 900,\n \"950\": 950\n };\n\n const base = chroma(hexColor);\n \n const shadeDefs = Object.keys(shades).map(shade => {\n const shadeNumber = shades[shade.toString() as keyof typeof shades];\n const shadeName = `${name}-${shadeNumber}`;\n \n // Generate shade based on lightness adjustment\n const lightnessMap: Record<number, number> = {\n 50: 0.95,\n 100: 0.9,\n 200: 0.8,\n 300: 0.7,\n 400: 0.6,\n 500: 0.5,\n 600: 0.4,\n 700: 0.3,\n 800: 0.2,\n 900: 0.1,\n 950: 0.05\n };\n \n const lightness = lightnessMap[shadeNumber];\n const shadeColor = base.luminance(lightness).hex();\n \n return {\n name: shadeName,\n hex: shadeColor\n };\n });\n shadeDefs.push({\n name,\n hex: hexColor\n })\n return shadeDefs;\n}","/* ============================================================================\n * Neutral scale generation utilities\n * ========================================================================== */\n\nimport { oklchToHexGamut } from './utils/colorConversion';\n\n\nexport type NeutralScaleStep = {\n name: string;\n hex: string;\n};\n\nexport function generateNeutralScale({\n background,\n steps = 11,\n warm = false,\n}: {\n background: string;\n steps?: number;\n warm?: boolean;\n}): NeutralScaleStep[] {\n const isDark = background === \"#000000\" || background.startsWith(\"#0\") || background.startsWith(\"#1\");\n // Target Tailwind shade names 50..900 plus 950\n const shadeNames = [50,100,200,300,400,500,600,700,800,900,950];\n const count = Math.min(steps, shadeNames.length);\n\n const scale: NeutralScaleStep[] = [];\n for (let i = 0; i < count; i++) {\n const t = i / (count - 1);\n const tone = isDark ? mix(0.06, 0.92, t) : mix(0.98, 0.1, t);\n const hex = oklchToHexGamut(tone, 0.02, warm ? 85 : 250);\n const name = `neutral-${shadeNames[i]}`;\n scale.push({ name, hex });\n }\n return scale;\n}\n\n// Helper function for mixing values\nfunction mix(a: number, b: number, t: number) {\n return a + (b - a) * Math.max(0, Math.min(1, t));\n}\n","import { Palette, PaletteMeta } from \"../schema\";\nimport { generateShades } from \"./generateShades\";\nimport { generateNeutralScale } from \"./neutralScale\";\nimport { featuresFromHex } from \"./utils/colorConversion\";\n\nexport type ExpandedPalette = {\n meta: PaletteMeta;\n [token: string]: any;\n}\n\nfunction colorsToMap(palette: Palette): Record<string,string> {\n const map: Record<string,string> = {};\n for (const c of palette.colors) {\n map[c.name] = c.hex;\n }\n return map;\n}\n\nfunction isBackgroundDark(hex: string): boolean {\n try {\n // Y is relative luminance (0-1). Values < 0.5 are considered dark.\n return featuresFromHex(hex).Y < 0.5;\n } catch {\n // If hex parsing fails, default to light background assumption\n return false;\n }\n}\n\nexport function expandPalette(palette: Palette) {\n const base = colorsToMap(palette);\n const expanded: Record<string,string> = { ...base };\n\n const background = base.background || base.surface || '#ffffff';\n const neutral = generateNeutralScale({ background, steps: 11, warm: false });\n neutral.forEach(n => {\n expanded[n.name] = n.hex;\n });\n\n // Generate shades for each defined role color in the colors array\n for (const [name, hex] of Object.entries(base)) {\n if (hex) {\n const shades = generateShades(hex, name);\n shades.forEach(shade => {\n expanded[shade.name] = shade.hex;\n });\n }\n }\n\n // Derived tokens\n if (base.text) expanded.body = base.text;\n\n // Check if dark mode via palette meta or luminance calculation\n const isDark = base.background ? isBackgroundDark(base.background) : false;\n const isDarkMode = palette.meta?.mode === 'dark' || isDark;\n\n // In dark mode, neutral-50 is dark (bg) and neutral-950 is light (text)\n // So we want a higher number for muted text (closer to white)\n expanded.mutedText = isDarkMode ? expanded['neutral-600'] : expanded['neutral-500'];\n\n return expanded as ExpandedPalette;\n}\n","import { ExpandedPalette } from \"./expandPalette\";\nimport { hexToRgb } from \"./utils/colorConversion\";\n\n/**\n * Generates CSS variables for a palette\n * \n * @param palette - The palette to generate CSS variables for\n * @returns \n */\nexport default function generateCssVars(palette: ExpandedPalette): Record<string, string> {\n const cssVars: Record<string, string> = {};\n // Iterate over all palette properties and generate channel values for non-null entries\n Object.entries(palette).forEach(([key, value]) => {\n if (value !== null && value !== undefined) {\n const { r, g, b } = hexToRgb(value);\n // Expose CSS variables as raw channels: \"r g b\"\n cssVars[`--tb-${key}`] = `${r} ${g} ${b}`;\n }\n });\n return cssVars;\n}\n","import { HydratedTheme, Shadow } from \"../schema\";\n\nexport function generateShadowCssVars(theme: { shadow: Shadow }): Record<string, string> {\n const level = theme.shadow.elevation;\n const soft = theme.shadow.softness !== 'crisp';\n\n // Base definitions roughly inspired by Tailwind defaults\n const base = {\n sm: [{ y: 1, blur: 2, spread: 0, a: 0.08 }],\n md: [\n { y: 4, blur: 6, spread: -1, a: 0.10 },\n { y: 2, blur: 4, spread: -2, a: 0.10 },\n ],\n lg: [\n { y: 10, blur: 15, spread: -3, a: 0.10 },\n { y: 4, blur: 6, spread: -4, a: 0.10 },\n ],\n xl: [\n { y: 20, blur: 25, spread: -5, a: 0.10 },\n { y: 8, blur: 10, spread: -6, a: 0.10 },\n ],\n x2l: [{ y: 25, blur: 50, spread: -12, a: 0.25 }],\n } as const;\n\n // Elevation scaling: higher elevation → larger offset/blur\n const scale = ((): number => {\n switch (level) {\n case 'none': return 0.8;\n case 'low': return 1.0;\n case 'medium': return 1.25;\n case 'high': return 1.5;\n default: return 1.0;\n }\n })();\n\n // Softness adjustment: soft → larger blur, slightly lower alpha\n const blurMul = soft ? 1.2 : 1.0;\n const alphaMul = soft ? 0.9 : 1.05;\n\n const fmt = (layers: ReadonlyArray<{ y: number; blur: number; spread: number; a: number }>) =>\n layers\n .map(l => {\n const y = Math.round(l.y * scale);\n const blur = Math.round(l.blur * scale * blurMul);\n const spread = Math.round(l.spread * scale);\n const a = Math.max(0, Math.min(1, +(l.a * alphaMul).toFixed(3)));\n return `0 ${y}px ${blur}px ${spread}px rgba(0, 0, 0, ${a})`;\n })\n .join(\", \");\n\n return {\n \"--shadow-sm\": fmt(base.sm),\n \"--shadow-md\": fmt(base.md),\n \"--shadow-lg\": fmt(base.lg),\n \"--shadow-xl\": fmt(base.xl),\n \"--shadow-2xl\": fmt(base.x2l),\n };\n}\n\nexport function getShadowClass(theme: HydratedTheme): string {\n switch (theme.shadow.elevation) {\n case 'none':\n return '';\n case 'low':\n return 'shadow-sm';\n case 'medium':\n return 'shadow-md';\n case 'high':\n return 'shadow-lg';\n default:\n return '';\n }\n}\n","import type { EffectPreset } from '../types';\n\n/**\n * Darken background on hover\n *\n * Works with solid backgrounds only. Darkens the background color by adjusting the shade.\n */\nexport const darkenBackgroundEffect: EffectPreset = {\n id: 'darken-background',\n name: 'Darken on Hover',\n description: 'Darkens the background color on hover',\n category: 'background',\n pseudoElement: 'none',\n\n customizableOption: {\n name: 'amount',\n type: 'number',\n label: 'Darken Amount (shade step)',\n default: 100,\n },\n\n isApplicable: (buttonConfig) => {\n return buttonConfig.background.type === 'solid';\n },\n\n generateCSS: (ctx) => {\n const { themeId, variantId, options, tokens, buttonConfig } = ctx;\n\n // Only works with solid backgrounds\n if (buttonConfig.background.type !== 'solid') {\n return '';\n }\n\n const amount = (options.amount as number) || 100;\n const baseToken = buttonConfig.background.colorToken;\n const darkerToken = tokens.adjustShade(baseToken, amount);\n const darkerColor = tokens.getColor(darkerToken);\n\n return `\n :where([data-theme-scope=\"${themeId}\"]) .${variantId}:hover {\n background-color: ${darkerColor};\n }\n `;\n },\n};\n\n/**\n * Lighten background on hover\n *\n * Works with solid backgrounds only. Lightens the background color by adjusting the shade.\n */\nexport const lightenBackgroundEffect: EffectPreset = {\n id: 'lighten-background',\n name: 'Lighten on Hover',\n description: 'Lightens the background color on hover',\n category: 'background',\n pseudoElement: 'none',\n\n customizableOption: {\n name: 'amount',\n type: 'number',\n label: 'Lighten Amount (shade step)',\n default: 100,\n },\n\n isApplicable: (buttonConfig) => {\n return buttonConfig.background.type === 'solid';\n },\n\n generateCSS: (ctx) => {\n const { themeId, variantId, options, tokens, buttonConfig } = ctx;\n\n // Only works with solid backgrounds\n if (buttonConfig.background.type !== 'solid') {\n return '';\n }\n\n const amount = (options.amount as number) || 100;\n const baseToken = buttonConfig.background.colorToken;\n const lighterToken = tokens.adjustShade(baseToken, -amount);\n const lighterColor = tokens.getColor(lighterToken);\n\n return `\n :where([data-theme-scope=\"${themeId}\"]) .${variantId}:hover {\n background-color: ${lighterColor};\n }\n `;\n },\n};\n\n/**\n * Fade background on hover (reduce opacity)\n *\n * Works with all background types.\n */\nexport const fadeBackgroundEffect: EffectPreset = {\n id: 'fade-background',\n name: 'Fade on Hover',\n description: 'Reduces background opacity on hover',\n category: 'background',\n pseudoElement: 'none',\n\n customizableOption: {\n name: 'opacity',\n type: 'percentage',\n label: 'Hover Opacity',\n default: 80,\n },\n\n generateCSS: (ctx) => {\n const { themeId, variantId, options } = ctx;\n const opacity = ((options.opacity as number) || 80) / 100;\n\n return `\n :where([data-theme-scope=\"${themeId}\"]) .${variantId}:hover {\n opacity: ${opacity};\n }\n `;\n },\n};\n\n/**\n * Reduce opacity on hover (simple opacity reduction)\n *\n * Works with all background types. Reduces opacity by a percentage (default 15%).\n * This is useful for default button styles that need simple hover feedback.\n */\nexport const opacityReduceEffect: EffectPreset = {\n id: 'opacity-reduce',\n name: 'Reduce Opacity',\n description: 'Reduces button opacity on hover by a percentage',\n category: 'background',\n pseudoElement: 'none',\n\n customizableOption: {\n name: 'reduction',\n type: 'percentage',\n label: 'Opacity Reduction',\n default: 15,\n },\n\n generateCSS: (ctx) => {\n const { themeId, variantId, options } = ctx;\n const reduction = ((options.reduction as number) || 15) / 100;\n const hoverOpacity = 1 - reduction;\n\n return `\n :where([data-theme-scope=\"${themeId}\"]) .${variantId}:hover {\n opacity: ${hoverOpacity};\n }\n `;\n },\n};\n\n/**\n * Animated gradient background\n *\n * Animates a gradient background by shifting its position on hover.\n * Works with gradient backgrounds only.\n *\n * Sets background-size to 200% and animates background-position from left to right.\n */\nexport const animatedGradientEffect: EffectPreset = {\n id: 'animated-gradient',\n name: 'Animated Gradient',\n description: 'Animates gradient position on hover',\n category: 'background',\n pseudoElement: 'none',\n\n customizableOption: {\n name: 'direction',\n type: 'select',\n label: 'Animation Direction',\n default: 'horizontal',\n options: ['horizontal', 'vertical'],\n },\n\n isApplicable: (buttonConfig) => {\n return buttonConfig.background.type === 'gradient';\n },\n\n generateCSS: (ctx) => {\n const { themeId, variantId, options, buttonConfig } = ctx;\n\n // Only works with gradient backgrounds\n if (buttonConfig.background.type !== 'gradient') {\n return '';\n }\n\n const direction = (options.direction as string) || 'horizontal';\n const backgroundSize = direction === 'horizontal' ? '200% auto' : 'auto 200%';\n const hoverPosition = direction === 'horizontal' ? 'right center' : 'center bottom';\n\n return `\n /* Setup animated gradient */\n :where([data-theme-scope=\"${themeId}\"]) .${variantId} {\n background-size: ${backgroundSize};\n background-position: left center;\n transition: background-position 0.3s ease;\n }\n\n /* Animate gradient on hover */\n :where([data-theme-scope=\"${themeId}\"]) .${variantId}:hover {\n background-position: ${hoverPosition};\n }\n `;\n },\n};\n\n/**\n * Add background color on hover\n *\n * Works best with transparent backgrounds. Adds a solid background color on hover.\n */\nexport const backgroundOnHoverEffect: EffectPreset = {\n id: 'background-on-hover',\n name: 'Background on Hover',\n description: 'Adds background color on hover',\n category: 'background',\n pseudoElement: 'none',\n\n customizableOption: {\n name: 'colorToken',\n type: 'select',\n label: 'Background Color',\n default: 'neutral-800',\n options: ['neutral-700', 'neutral-800', 'neutral-900', 'primary'],\n },\n\n generateCSS: (ctx) => {\n const { themeId, variantId, options, tokens } = ctx;\n const colorToken = (options.colorToken as string) || 'neutral-800';\n const color = tokens.getColor(colorToken);\n\n return `\n /* Add background on hover */\n :where([data-theme-scope=\"${themeId}\"]) .${variantId}:hover {\n background-color: ${color};\n }\n `;\n },\n};\n\n/**\n * Add semi-transparent background color on hover\n *\n * Adds a background with opacity/alpha channel. Perfect for retro/arcade styles.\n */\nexport const backgroundOnHoverAlphaEffect: EffectPreset = {\n id: 'background-on-hover-alpha',\n name: 'Background on Hover (Transparent)',\n description: 'Adds semi-transparent background on hover',\n category: 'background',\n pseudoElement: 'none',\n\n customizableOption: {\n name: 'opacity',\n type: 'percentage',\n label: 'Opacity',\n default: 50,\n },\n\n generateCSS: (ctx) => {\n const { themeId, variantId, stateGroup, options } = ctx;\n const colorToken = (options.colorToken as string) || 'neutral-800';\n const opacity = (options.opacity as number) || 50; // Percentage (0-100)\n\n // Use CSS variable directly with rgb() and slash syntax for alpha\n // CSS variables are stored as RGB channels (e.g., \"22 78 99\")\n // Modern CSS syntax: rgb(var(--color) / opacity) where opacity is 0-100\n const cssVar = `var(--tb-${colorToken})`;\n\n // Generate appropriate selector based on state group\n const stateSuffix = stateGroup === 'base' ? '' : `:${stateGroup}`;\n\n return `\n /* Add semi-transparent background (${stateGroup}) */\n :where([data-theme-scope=\"${themeId}\"]) .${variantId}${stateSuffix} {\n background-color: rgb(${cssVar} / ${opacity});\n }\n `;\n },\n};\n","import type { EffectPreset } from '../types';\n\n/**\n * Border glow on hover\n *\n * Adds a glowing box-shadow on hover using a customizable color.\n */\nexport const borderGlowEffect: EffectPreset = {\n id: 'border-glow',\n name: 'Border Glow',\n description: 'Adds a glowing shadow on hover',\n category: 'shadow',\n pseudoElement: 'none',\n\n customizableOption: {\n name: 'glowColorToken',\n type: 'colorToken',\n label: 'Glow Color',\n default: 'primary-400',\n },\n\n generateCSS: (ctx) => {\n const { themeId, variantId, options, tokens } = ctx;\n const glowToken = (options.glowColorToken as string) || 'primary-400';\n const glowColor = tokens.getColor(glowToken);\n\n return `\n :where([data-theme-scope=\"${themeId}\"]) .${variantId}:hover {\n box-shadow: 0 0 15px ${glowColor};\n }\n `;\n },\n};\n\n/**\n * Drop shadow on hover\n *\n * Adds an elevated drop shadow on hover.\n */\nexport const dropShadowEffect: EffectPreset = {\n id: 'drop-shadow',\n name: 'Drop Shadow',\n description: 'Adds an elevated shadow on hover',\n category: 'shadow',\n pseudoElement: 'none',\n\n customizableOption: {\n name: 'intensity',\n type: 'select',\n label: 'Shadow Intensity',\n default: 'medium',\n options: ['subtle', 'medium', 'strong'],\n },\n\n generateCSS: (ctx) => {\n const { themeId, variantId, options } = ctx;\n const intensity = (options.intensity as string) || 'medium';\n\n const shadows = {\n subtle: '0 4px 6px rgba(0, 0, 0, 0.1)',\n medium: '0 10px 15px rgba(0, 0, 0, 0.15)',\n strong: '0 20px 25px rgba(0, 0, 0, 0.2)',\n };\n\n return `\n :where([data-theme-scope=\"${themeId}\"]) .${variantId}:hover {\n box-shadow: ${shadows[intensity as keyof typeof shadows]};\n }\n `;\n },\n};\n\n/**\n * Inner shadow (pressed effect)\n *\n * Adds an inset shadow to create a pressed/depressed appearance.\n */\nexport const innerShadowEffect: EffectPreset = {\n id: 'inner-shadow',\n name: 'Inner Shadow',\n description: 'Adds an inset shadow for a pressed appearance',\n category: 'shadow',\n pseudoElement: 'none',\n\n generateCSS: (ctx) => {\n const { themeId, variantId } = ctx;\n\n return `\n :where([data-theme-scope=\"${themeId}\"]) .${variantId}:active {\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.2);\n }\n `;\n },\n};\n\n/**\n * Neumorphic shadow effect\n *\n * Creates dual shadows (light and dark) for soft UI / neumorphic design.\n * Supports both raised (outer shadows) and pressed (inset shadows) states.\n *\n * Options:\n * - mode: 'raised' (outer shadows) or 'pressed' (inset shadows)\n * - intensity: 'subtle', 'medium', 'strong'\n */\nexport const neumorphicShadowEffect: EffectPreset = {\n id: 'neumorphic-shadow',\n name: 'Neumorphic Shadow',\n description: 'Dual shadows for soft UI design (raised or pressed)',\n category: 'shadow',\n pseudoElement: 'none',\n\n customizableOption: {\n name: 'mode',\n type: 'select',\n label: 'Shadow Mode',\n default: 'raised',\n options: ['raised', 'pressed'],\n },\n\n generateCSS: (ctx) => {\n const { themeId, variantId, stateGroup, options } = ctx;\n const mode = (options.mode as string) || 'raised';\n const intensity = (options.intensity as string) || 'medium';\n\n // Shadow configurations for different intensities\n // Using neumorphic-appropriate colors: darker shadow (#a3b1c6) and light shadow (#ffffff)\n const shadows = {\n subtle: {\n raised: '3px 3px 6px #a3b1c6, -3px -3px 6px #ffffff',\n pressed: 'inset 3px 3px 6px #a3b1c6, inset -3px -3px 6px #ffffff',\n },\n medium: {\n raised: '6px 6px 12px #a3b1c6, -6px -6px 12px #ffffff',\n pressed: 'inset 6px 6px 12px #a3b1c6, inset -6px -6px 12px #ffffff',\n },\n strong: {\n raised: '9px 9px 18px #a3b1c6, -9px -9px 18px #ffffff',\n pressed: 'inset 9px 9px 18px #a3b1c6, inset -9px -9px 18px #ffffff',\n },\n };\n\n const shadowValue = shadows[intensity as keyof typeof shadows][mode as 'raised' | 'pressed'];\n\n // Generate appropriate selector based on state group\n const stateSuffix = stateGroup === 'base' ? '' : `:${stateGroup}`;\n\n return `\n /* Neumorphic shadow (${mode}, ${stateGroup}) */\n :where([data-theme-scope=\"${themeId}\"]) .${variantId}${stateSuffix} {\n box-shadow: ${shadowValue};\n transition: box-shadow 0.15s ease;\n }\n `;\n },\n};\n\n/**\n * Outer glow effect\n *\n * Creates an outer glow using box-shadow with no offset.\n * Can be used in base, hover, or active states for retro/neon aesthetics.\n */\nexport const outerGlowEffect: EffectPreset = {\n id: 'outer-glow',\n name: 'Outer Glow',\n description: 'Creates an outer glow around the button',\n category: 'shadow',\n pseudoElement: 'none',\n\n customizableOption: {\n name: 'spread',\n type: 'number',\n label: 'Glow Spread (px)',\n default: 10,\n },\n\n generateCSS: (ctx) => {\n const { themeId, variantId, stateGroup, options, tokens, buttonConfig } = ctx;\n const spread = (options.spread as number) || 10;\n\n // Derive glow color from button config or options\n let glowColor: string;\n if (options.glowColorToken && typeof options.glowColorToken === 'string') {\n glowColor = tokens.getColor(options.glowColorToken);\n } else if (buttonConfig.border?.colorToken) {\n // Use border color for glow\n glowColor = tokens.getColor(buttonConfig.border.colorToken);\n } else if (buttonConfig.background.type === 'solid') {\n // Use background color for glow\n glowColor = tokens.getColor(buttonConfig.background.colorToken);\n } else {\n // Default to primary\n glowColor = tokens.getColor('primary-400');\n }\n\n // Generate appropriate selector based on state group\n const stateSuffix = stateGroup === 'base' ? '' : `:${stateGroup}`;\n\n return `\n /* Outer glow (${stateGroup}) */\n :where([data-theme-scope=\"${themeId}\"]) .${variantId}${stateSuffix} {\n box-shadow: 0 0 ${spread}px ${glowColor};\n }\n `;\n },\n};\n\n/**\n * Retro 3D pressed shadow effect\n *\n * Creates a thick hard-edged bottom shadow that reduces as the button is pressed,\n * combined with vertical translation for a 3D pressed effect.\n */\nexport const retro3DShadowEffect: EffectPreset = {\n id: 'retro-3d-shadow',\n name: 'Retro 3D Shadow',\n description: '3D pressed shadow with vertical movement (retro style)',\n category: 'shadow',\n pseudoElement: 'none',\n\n generateCSS: (ctx) => {\n const { themeId, variantId } = ctx;\n\n return `\n /* Base: thick bottom shadow */\n :where([data-theme-scope=\"${themeId}\"]) .${variantId} {\n box-shadow: 0 4px 0 0 rgba(0, 0, 0, 0.25);\n transform: translateY(0);\n transition: all 0.15s ease;\n }\n\n /* Hover: reduced shadow + slight downward movement */\n :where([data-theme-scope=\"${themeId}\"]) .${variantId}:hover {\n box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.25);\n transform: translateY(1px);\n }\n\n /* Active: no shadow + full downward movement */\n :where([data-theme-scope=\"${themeId}\"]) .${variantId}:active {\n box-shadow: none;\n transform: translateY(2px);\n }\n `;\n },\n};\n","import type { EffectPreset } from '../types';\n\n/**\n * Scale up on hover\n *\n * Slightly enlarges the button on hover.\n */\nexport const scaleUpEffect: EffectPreset = {\n id: 'scale-up',\n name: 'Scale Up',\n description: 'Slightly enlarges the button on hover',\n category: 'transform',\n pseudoElement: 'none',\n\n customizableOption: {\n name: 'scale',\n type: 'select',\n label: 'Scale Amount',\n default: '1.05',\n options: ['1.02', '1.05', '1.10'],\n },\n\n generateCSS: (ctx) => {\n const { themeId, variantId, options } = ctx;\n const scale = (options.scale as string) || '1.05';\n\n return `\n :where([data-theme-scope=\"${themeId}\"]) .${variantId}:hover {\n transform: scale(${scale});\n }\n `;\n },\n};\n\n/**\n * Scale down on active (press effect)\n *\n * Slightly shrinks the button when clicked.\n */\nexport const scaleDownEffect: EffectPreset = {\n id: 'scale-down',\n name: 'Scale Down',\n description: 'Slightly shrinks the button when clicked',\n category: 'transform',\n pseudoElement: 'none',\n\n customizableOption: {\n name: 'scale',\n type: 'select',\n label: 'Scale Amount',\n default: '0.95',\n options: ['0.90', '0.95', '0.98'],\n },\n\n generateCSS: (ctx) => {\n const { themeId, variantId, options } = ctx;\n const scale = (options.scale as string) || '0.95';\n\n return `\n :where([data-theme-scope=\"${themeId}\"]) .${variantId}:active {\n transform: scale(${scale});\n }\n `;\n },\n};\n\n/**\n * Lift on hover (translate up)\n *\n * Moves the button upward on hover, creating a lifting effect.\n */\nexport const liftEffect: EffectPreset = {\n id: 'lift',\n name: 'Lift',\n description: 'Lifts the button upward on hover',\n category: 'transform',\n pseudoElement: 'none',\n\n customizableOption: {\n name: 'amount',\n type: 'select',\n label: 'Lift Amount',\n default: '0.5',\n options: ['0.25', '0.5', '1'],\n },\n\n generateCSS: (ctx) => {\n const { themeId, variantId, options } = ctx;\n const amount = (options.amount as string) || '0.5';\n\n return `\n :where([data-theme-scope=\"${themeId}\"]) .${variantId}:hover {\n transform: translateY(-${amount}rem);\n }\n `;\n },\n};\n\n/**\n * Press down on hover (neo-brutalist effect)\n *\n * Translates the button down and right while removing shadow to simulate a physical button press.\n * The translate amount automatically matches the shadow offset, creating a perfect \"press into shadow\" effect.\n * Commonly used with hard shadows in neo-brutalist/Block style designs.\n */\nexport const pressDownEffect: EffectPreset = {\n id: 'press-down',\n name: 'Press Down',\n description: 'Translates button to shadow position and removes shadow on hover',\n category: 'transform',\n pseudoElement: 'none',\n\n generateCSS: (ctx) => {\n const { themeId, variantId, theme } = ctx;\n\n // Use theme shadow configuration\n const shadowConfig = theme.shadow;\n\n // Calculate offset based on shadow elevation and position\n const elevationOffsets = {\n none: 0,\n low: 2,\n medium: 4,\n high: 6,\n } as const;\n\n const offset = elevationOffsets[shadowConfig.elevation];\n const xOffset = (shadowConfig.position || 'bottom') === 'bottom-right' ? offset : 0;\n const yOffset = offset;\n\n return `\n :where([data-theme-scope=\"${themeId}\"]) .${variantId}:hover {\n transform: translate(${xOffset}px, ${yOffset}px);\n box-shadow: none;\n }\n `;\n },\n};\n\n/**\n * Pop effect on hover (scale + tilt)\n *\n * Scales up and tilts the button clockwise for a playful, eye-catching pop effect.\n * Great for energetic, fun designs.\n */\nexport const popEffect: EffectPreset = {\n id: 'pop',\n name: 'Pop',\n description: 'Scales up and tilts the button on hover for a playful pop effect',\n category: 'transform',\n pseudoElement: 'none',\n\n customizableOption: {\n name: 'intensity',\n type: 'select',\n label: 'Intensity',\n default: 'medium',\n options: ['subtle', 'medium', 'dramatic'],\n },\n\n generateCSS: (ctx) => {\n const { themeId, variantId, options } = ctx;\n const intensity = (options.intensity as string) || 'medium';\n\n // Define scale and rotation for each intensity level\n const intensityConfig = {\n subtle: { scale: 1.02, rotate: 1 },\n medium: { scale: 1.05, rotate: 2 },\n dramatic: { scale: 1.08, rotate: 3 },\n } as const;\n\n const config = intensityConfig[intensity as keyof typeof intensityConfig] || intensityConfig.medium;\n\n return `\n :where([data-theme-scope=\"${themeId}\"]) .${variantId}:hover {\n transform: scale(${config.scale}) rotate(${config.rotate}deg);\n }\n `;\n },\n};\n","import type { EffectPreset } from '../types';\n\n/**\n * Aurora glow effect\n *\n * Creates a blurred gradient glow behind the button that appears on hover.\n * Uses ::before pseudo-element.\n *\n * This is a persistent effect (should be placed in effects.base) because it sets up\n * the ::before element structure, even though the glow only appears on hover.\n */\nexport const auroraGlowEffect: EffectPreset = {\n id: 'aurora-glow',\n name: 'Aurora Glow',\n description: 'Blurred gradient glow that appears on hover',\n category: 'overlay',\n pseudoElement: 'before',\n\n customizableOption: {\n name: 'intensity',\n type: 'percentage',\n label: 'Glow Intensity',\n default: 75,\n },\n\n generateCSS: (ctx) => {\n const { themeId, variantId, options, tokens, buttonConfig } = ctx;\n\n // Derive gradient colors from button config\n let fromColor: string;\n let toColor: string;\n\n if (buttonConfig.background.type === 'gradient') {\n // Use the button's gradient colors (first and last from stops array)\n const stops = buttonConfig.background.stops;\n fromColor = tokens.getColor(stops[0]);\n toColor = tokens.getColor(stops[stops.length - 1]);\n } else if (buttonConfig.background.type === 'solid') {\n // Create a gradient from the button's color to a lighter shade\n fromColor = tokens.getColor(buttonConfig.background.colorToken);\n const lighterToken = tokens.adjustShade(buttonConfig.background.colorToken, -200);\n toColor = tokens.getColor(lighterToken);\n } else {\n // Transparent background - use primary theme colors\n fromColor = tokens.getColor('primary-500');\n toColor = tokens.getColor('primary-300');\n }\n\n const intensity = ((options.intensity as number) || 75) / 100;\n\n return `\n /* Setup isolation for z-index stacking */\n :where([data-theme-scope=\"${themeId}\"]) .${variantId} {\n position: relative;\n isolation: isolate;\n }\n\n /* Glow layer */\n :where([data-theme-scope=\"${themeId}\"]) .${variantId}::before {\n content: '';\n position: absolute;\n inset: -2px;\n background: linear-gradient(to right, ${fromColor}, ${toColor});\n border-radius: inherit;\n filter: blur(8px);\n opacity: 0;\n transition: opacity 1s;\n z-index: -1;\n }\n\n /* Show glow on hover */\n :where([data-theme-scope=\"${themeId}\"]) .${variantId}:hover::before {\n opacity: ${intensity};\n }\n `;\n },\n};\n\n/**\n * Cosmic stardust effect\n *\n * Creates a rotating rainbow gradient glow behind the button.\n * Uses ::before pseudo-element with CSS @property animation.\n *\n * This is a persistent effect that is always visible (base opacity 0.5) and\n * intensifies on hover (opacity 1.0).\n */\nexport const cosmicStardustEffect: EffectPreset = {\n id: 'cosmic-stardust',\n name: 'Cosmic Stardust',\n description: 'Rotating rainbow gradient glow (always visible, intensifies on hover)',\n category: 'overlay',\n pseudoElement: 'before',\n\n customizableOption: {\n name: 'speed',\n type: 'select',\n label: 'Animation Speed',\n default: '4s',\n options: ['2s', '4s', '6s', '8s'],\n },\n\n generateCSS: (ctx) => {\n const { themeId, variantId, options } = ctx;\n const speed = (options.speed as string) || '4s';\n\n // Rainbow gradient using theme brand colors\n // Uses primary, secondary, accent from theme\n // CSS variables are stored as RGB channels, so wrap in rgb()\n const colors = [\n 'rgb(var(--tb-primary-400))',\n 'rgb(var(--tb-secondary-500))',\n 'rgb(var(--tb-accent-600))',\n 'rgb(var(--tb-primary-500))',\n ].join(', ');\n\n return `\n /* CSS @property for angle animation */\n @property --angle-${variantId} {\n syntax: '<angle>';\n initial-value: 0deg;\n inherits: false;\n }\n\n /* Keyframe animation for rotating gradient */\n @keyframes rotate-gradient-${variantId} {\n to {\n --angle-${variantId}: 360deg;\n }\n }\n\n /* Setup button for pseudo-element positioning */\n :where([data-theme-scope=\"${themeId}\"]) .${variantId} {\n position: relative;\n }\n\n /* Rotating glow - always visible, behind button */\n :where([data-theme-scope=\"${themeId}\"]) .${variantId}::before {\n content: '';\n position: absolute;\n inset: -2px;\n background: linear-gradient(var(--angle-${variantId}), ${colors});\n border-radius: inherit;\n filter: blur(8px);\n opacity: 0.5;\n animation: rotate-gradient-${variantId} ${speed} linear infinite;\n z-index: -1;\n }\n\n /* Intensify glow on hover */\n :where([data-theme-scope=\"${themeId}\"]) .${variantId}:hover::before {\n opacity: 1;\n }\n `;\n },\n};\n\n/**\n * Gradient border fill effect\n *\n * Creates a gradient border using a ::before pseudo-element with border-box/padding-box technique.\n * Base state: Button shows interior background color with gradient border visible\n * Hover state: Interior becomes transparent, revealing full gradient (filled appearance)\n *\n * Uses ::before pseudo-element so the main element's background is free for other effects\n * like gradient-text (which needs background-clip: text).\n *\n * Options:\n * - borderWidth: Width of the border in pixels (default: 2)\n * - gradientColors: Comma-separated color tokens for the gradient (optional)\n * - interiorColor: Color token for the button interior in base state (default: neutral-900)\n */\nexport const gradientBorderFillEffect: EffectPreset = {\n id: 'gradient-border-fill',\n name: 'Gradient Border Fill',\n description: 'Gradient border that fills on hover using ::before pseudo-element',\n category: 'overlay',\n pseudoElement: 'before',\n\n customizableOption: {\n name: 'borderWidth',\n type: 'number',\n label: 'Border Width (px)',\n default: 2,\n },\n\n generateCSS: (ctx) => {\n const { themeId, variantId, options, tokens } = ctx;\n const borderWidth = (options.borderWidth as number) || 2;\n\n // Build gradient colors from options or default\n let gradientColors: string;\n if (options.gradientColors && typeof options.gradientColors === 'string') {\n const colorTokens = options.gradientColors.split(',').map((t: string) => t.trim());\n const resolvedColors = colorTokens.map((token: string) => tokens.getColor(token));\n gradientColors = resolvedColors.join(', ');\n } else {\n // Default to primary-secondary-accent gradient\n const primary = tokens.getColor('primary-600');\n const secondary = tokens.getColor('secondary-600');\n const accent = tokens.getColor('accent-600');\n gradientColors = `${primary}, ${secondary}, ${accent}`;\n }\n\n // Interior color for base state\n const interiorColor = options.interiorColor\n ? tokens.getColor(options.interiorColor as string)\n : tokens.getColor('neutral-900');\n\n return `\n /* Setup button for pseudo-element */\n :where([data-theme-scope=\"${themeId}\"]) .${variantId} {\n position: relative;\n border: none !important;\n }\n\n /* Gradient border layer using ::before */\n :where([data-theme-scope=\"${themeId}\"]) .${variantId}::before {\n content: '';\n position: absolute;\n inset: 0;\n border: ${borderWidth}px solid transparent;\n border-radius: inherit;\n background:\n linear-gradient(${interiorColor}, ${interiorColor}) padding-box,\n linear-gradient(90deg, ${gradientColors}) border-box;\n z-index: -1;\n }\n\n /* Fill with gradient on hover */\n :where([data-theme-scope=\"${themeId}\"]) .${variantId}:hover::before {\n background:\n linear-gradient(transparent, transparent) padding-box,\n linear-gradient(90deg, ${gradientColors}) border-box;\n }\n `;\n },\n};\n\n/**\n * Animated gradient border fill effect\n *\n * Creates a rotating animated gradient border using ::before pseudo-element.\n * Base state: Button shows interior background color with animated gradient border\n * Hover state: Interior becomes transparent, revealing full animated gradient (filled appearance)\n *\n * Combines CSS @property animation with padding-box/border-box technique.\n *\n * Options:\n * - borderWidth: Width of the border in pixels (default: 2)\n * - gradientColors: Comma-separated color tokens for the gradient (optional)\n * - interiorColor: Color token for the button interior in base state (default: neutral-950)\n * - speed: Animation speed (default: '4s')\n */\nexport const animatedGradientBorderFillEffect: EffectPreset = {\n id: 'animated-gradient-border-fill',\n name: 'Animated Gradient Border Fill',\n description: 'Rotating gradient border that fills on hover',\n category: 'overlay',\n pseudoElement: 'before',\n\n customizableOption: {\n name: 'speed',\n type: 'select',\n label: 'Animation Speed',\n default: '4s',\n options: ['2s', '4s', '6s', '8s'],\n },\n\n generateCSS: (ctx) => {\n const { themeId, variantId, options, tokens } = ctx;\n const borderWidth = (options.borderWidth as number) || 2;\n const speed = (options.speed as string) || '4s';\n\n // Build gradient colors from options or default\n let gradientColors: string;\n if (options.gradientColors && typeof options.gradientColors === 'string') {\n const colorTokens = options.gradientColors.split(',').map((t: string) => t.trim());\n const resolvedColors = colorTokens.map((token: string) => tokens.getColor(token));\n gradientColors = resolvedColors.join(', ');\n } else {\n // Default to theme brand color gradient (primary, secondary, accent)\n const primary = tokens.getColor('primary-400');\n const secondary = tokens.getColor('secondary-500');\n const accent = tokens.getColor('accent-600');\n const primaryDark = tokens.getColor('primary-600');\n const accentLight = tokens.getColor('accent-400');\n gradientColors = `${primary}, ${secondary}, ${accent}, ${primaryDark}, ${accentLight}`;\n }\n\n // Interior color for base state\n const interiorColor = options.interiorColor\n ? tokens.getColor(options.interiorColor as string)\n : tokens.getColor('neutral-950');\n\n return `\n /* CSS @property for angle animation */\n @property --angle-${variantId} {\n syntax: '<angle>';\n initial-value: 0deg;\n inherits: false;\n }\n\n /* Keyframe animation for rotating gradient */\n @keyframes rotate-gradient-border-${variantId} {\n to {\n --angle-${variantId}: 360deg;\n }\n }\n\n /* Setup button for pseudo-element */\n :where([data-theme-scope=\"${themeId}\"]) .${variantId} {\n position: relative;\n border: none !important;\n }\n\n /* Animated gradient border layer using ::before */\n :where([data-theme-scope=\"${themeId}\"]) .${variantId}::before {\n content: '';\n position: absolute;\n inset: 0;\n border: ${borderWidth}px solid transparent;\n border-radius: inherit;\n background:\n linear-gradient(${interiorColor}, ${interiorColor}) padding-box,\n linear-gradient(var(--angle-${variantId}), ${gradientColors}) border-box;\n animation: rotate-gradient-border-${variantId} ${speed} linear infinite;\n z-index: -1;\n }\n\n /* Fill with gradient on hover */\n :where([data-theme-scope=\"${themeId}\"]) .${variantId}:hover::before {\n background:\n linear-gradient(transparent, transparent) padding-box,\n linear-gradient(var(--angle-${variantId}), ${gradientColors}) border-box;\n }\n `;\n },\n};\n\n/**\n * Border bottom grow effect\n *\n * Creates an animated underline that grows from one side on hover.\n * Uses ::after pseudo-element positioned at the bottom of the button.\n *\n * Options:\n * - colorToken: Color token for the border (default: neutral-400)\n * - height: Height of the border in pixels (default: 1)\n * - origin: Transform origin - 'left', 'center', or 'right' (default: left)\n */\nexport const borderBottomGrowEffect: EffectPreset = {\n id: 'border-bottom-grow',\n name: 'Border Bottom Grow',\n description: 'Animated underline that grows on hover',\n category: 'overlay',\n pseudoElement: 'after',\n\n customizableOption: {\n name: 'height',\n type: 'number',\n label: 'Border Height (px)',\n default: 1,\n },\n\n generateCSS: (ctx) => {\n const { themeId, variantId, options, tokens } = ctx;\n const height = (options.height as number) || 1;\n const colorToken = (options.colorToken as string) || 'neutral-400';\n const origin = (options.origin as string) || 'left';\n\n const color = tokens.getColor(colorToken);\n\n return `\n /* Setup button for pseudo-element */\n :where([data-theme-scope=\"${themeId}\"]) .${variantId} {\n position: relative;\n }\n\n /* Bottom border using ::after */\n :where([data-theme-scope=\"${themeId}\"]) .${variantId}::after {\n content: '';\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n height: ${height}px;\n background: ${color};\n transform: scaleX(0);\n transform-origin: ${origin};\n transition: transform 300ms ease-in-out;\n }\n\n /* Grow border on hover */\n :where([data-theme-scope=\"${themeId}\"]) .${variantId}:hover::after {\n transform: scaleX(1);\n }\n `;\n },\n};\n","import type { EffectPreset } from '../types';\n\n/**\n * Gradient text effect\n *\n * Applies a gradient to text using background-clip: text.\n * The gradient can use button's gradient colors or theme colors.\n *\n * Options:\n * - solidOnHover: If true, text becomes solid white on hover (default: false)\n */\nexport const gradientTextEffect: EffectPreset = {\n id: 'gradient-text',\n name: 'Gradient Text',\n description: 'Gradient text using background-clip',\n category: 'text',\n pseudoElement: 'none',\n\n customizableOption: {\n name: 'solidOnHover',\n type: 'select',\n label: 'Hover Behavior',\n default: 'false',\n options: ['false', 'true'],\n },\n\n generateCSS: (ctx) => {\n const { themeId, variantId, options, tokens, buttonConfig } = ctx;\n const solidOnHover = options.solidOnHover === 'true' || options.solidOnHover === true;\n\n // Build gradient colors from options or defaults\n let gradientColors: string;\n\n // Check if gradient colors are specified in options (comma-separated color tokens)\n if (options.gradientColors && typeof options.gradientColors === 'string') {\n // Parse comma-separated color tokens\n const colorTokens = options.gradientColors.split(',').map((t: string) => t.trim());\n const resolvedColors = colorTokens.map((token: string) => tokens.getColor(token));\n gradientColors = resolvedColors.join(', ');\n } else if (buttonConfig.background.type === 'gradient') {\n // Fall back to button's gradient colors if no gradientColors option\n const stops = buttonConfig.background.stops;\n const resolvedColors = stops.map((stop: string) => tokens.getColor(stop));\n gradientColors = resolvedColors.join(', ');\n } else {\n // Default to primary-secondary-accent gradient (theme brand colors)\n const primary = tokens.getColor('primary-400');\n const secondary = tokens.getColor('secondary-400');\n const accent = tokens.getColor('accent-400');\n gradientColors = `${primary}, ${secondary}, ${accent}`;\n }\n\n let css = `\n /* Gradient text */\n :where([data-theme-scope=\"${themeId}\"]) .${variantId} {\n background: linear-gradient(90deg, ${gradientColors});\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n }\n `;\n\n // On hover, switch to solid text\n if (solidOnHover) {\n css += `\n /* Solid text on hover */\n :where([data-theme-scope=\"${themeId}\"]) .${variantId}:hover {\n -webkit-text-fill-color: rgb(var(--tb-neutral-50));\n }\n `;\n }\n\n return css;\n },\n};\n\n/**\n * Text color change on hover\n *\n * Changes text color on hover. Useful for simple ghost/text buttons.\n *\n * Options:\n * - hoverColorToken: Color token for hover state (default: white)\n */\nexport const textColorChangeEffect: EffectPreset = {\n id: 'text-color-change',\n name: 'Text Color Change',\n description: 'Changes text color on hover',\n category: 'text',\n pseudoElement: 'none',\n\n customizableOption: {\n name: 'hoverColorToken',\n type: 'select',\n label: 'Hover Text Color',\n default: 'neutral-50',\n options: ['neutral-50', 'neutral-100', 'neutral-200', 'neutral-300', 'primary-400'],\n },\n\n generateCSS: (ctx) => {\n const { themeId, variantId, options, tokens } = ctx;\n const hoverColorToken = (options.hoverColorToken as string) || 'neutral-50';\n const hoverColor = tokens.getColor(hoverColorToken);\n\n return `\n /* Change text color on hover */\n :where([data-theme-scope=\"${themeId}\"]) .${variantId}:hover {\n color: ${hoverColor};\n }\n `;\n },\n};\n","import type { EffectPreset } from '../types';\n\n/**\n * Border color change on hover\n *\n * Changes the border color on hover. Useful for outline/bordered buttons.\n */\nexport const borderColorChangeEffect: EffectPreset = {\n id: 'border-color-change',\n name: 'Border Color Change',\n description: 'Changes border color on hover',\n category: 'border',\n pseudoElement: 'none',\n\n customizableOption: {\n name: 'hoverColorToken',\n type: 'select',\n label: 'Hover Border Color',\n default: 'neutral-200',\n options: ['neutral-200', 'neutral-300', 'neutral-400', 'primary-400', 'neutral-50'],\n },\n\n generateCSS: (ctx) => {\n const { themeId, variantId, options, tokens } = ctx;\n const hoverColorToken = (options.hoverColorToken as string) || 'neutral-200';\n const hoverColor = tokens.getColor(hoverColorToken);\n\n return `\n /* Change border color on hover */\n :where([data-theme-scope=\"${themeId}\"]) .${variantId}:hover {\n border-color: ${hoverColor};\n }\n `;\n },\n};\n\n/**\n * Sketchy/hand-drawn border effect\n *\n * Creates an imperfect, hand-drawn appearance using multiple shadows,\n * filters, and slight rotation to simulate hand-drawn lines.\n */\nexport const sketchyBorderEffect: EffectPreset = {\n id: 'sketchy-border',\n name: 'Sketchy Border',\n description: 'Hand-drawn style with imperfect edges',\n category: 'border',\n pseudoElement: 'none',\n\n customizableOption: {\n name: 'intensity',\n type: 'select',\n label: 'Sketch Intensity',\n default: 'medium',\n options: ['subtle', 'medium', 'strong'],\n },\n\n generateCSS: (ctx) => {\n const { themeId, variantId, options } = ctx;\n const intensity = (options.intensity as string) || 'medium';\n\n // Different rotation and skew values for varying intensities\n const transforms = {\n subtle: 'rotate(-0.5deg)',\n medium: 'rotate(-1deg)',\n strong: 'rotate(-1.5deg)',\n };\n\n const hoverTransforms = {\n subtle: 'rotate(0.5deg)',\n medium: 'rotate(1deg)',\n strong: 'rotate(1.5deg)',\n };\n\n return `\n /* Hand-drawn/sketchy appearance */\n :where([data-theme-scope=\"${themeId}\"]) .${variantId} {\n transform: ${transforms[intensity as keyof typeof transforms]};\n filter: contrast(0.95) brightness(1.02);\n transition: transform 0.2s ease, filter 0.2s ease;\n }\n\n :where([data-theme-scope=\"${themeId}\"]) .${variantId}:hover {\n transform: ${hoverTransforms[intensity as keyof typeof hoverTransforms]} scale(1.02);\n filter: contrast(1) brightness(1);\n }\n\n :where([data-theme-scope=\"${themeId}\"]) .${variantId}:active {\n transform: rotate(0deg) scale(0.98);\n }\n `;\n },\n};\n","import type { EffectPreset } from '../types';\n\n/**\n * Pulse animation\n *\n * Adds a continuous pulse animation (opacity fade in/out).\n * Perfect for call-to-action or \"press start\" style buttons.\n */\nexport const pulseAnimationEffect: EffectPreset = {\n id: 'pulse-animation',\n name: 'Pulse Animation',\n description: 'Continuous pulse animation (opacity fade)',\n category: 'animation',\n pseudoElement: 'none',\n\n customizableOption: {\n name: 'speed',\n type: 'select',\n label: 'Animation Speed',\n default: '2s',\n options: ['1s', '2s', '3s', '4s'],\n },\n\n generateCSS: (ctx) => {\n const { themeId, variantId, options } = ctx;\n const speed = (options.speed as string) || '2s';\n\n return `\n /* Pulse animation */\n @keyframes pulse-${variantId} {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n }\n\n :where([data-theme-scope=\"${themeId}\"]) .${variantId} {\n animation: pulse-${variantId} ${speed} cubic-bezier(0.4, 0, 0.6, 1) infinite;\n }\n `;\n },\n};\n","import type { EffectPreset } from './types';\nimport { darkenBackgroundEffect, lightenBackgroundEffect, fadeBackgroundEffect, opacityReduceEffect, animatedGradientEffect, backgroundOnHoverEffect, backgroundOnHoverAlphaEffect } from './presets/background';\nimport { borderGlowEffect, dropShadowEffect, innerShadowEffect, neumorphicShadowEffect, outerGlowEffect, retro3DShadowEffect } from './presets/shadow';\nimport { scaleUpEffect, scaleDownEffect, liftEffect, pressDownEffect, popEffect } from './presets/transform';\nimport { auroraGlowEffect, cosmicStardustEffect, gradientBorderFillEffect, animatedGradientBorderFillEffect, borderBottomGrowEffect } from './presets/overlay';\nimport { gradientTextEffect, textColorChangeEffect } from './presets/text';\nimport { borderColorChangeEffect, sketchyBorderEffect } from './presets/border';\nimport { pulseAnimationEffect } from './presets/animation';\n\n/**\n * Registry of all available effect presets\n */\nexport const EFFECT_PRESETS: EffectPreset[] = [\n // Background effects\n darkenBackgroundEffect,\n lightenBackgroundEffect,\n fadeBackgroundEffect,\n opacityReduceEffect,\n animatedGradientEffect,\n backgroundOnHoverEffect,\n backgroundOnHoverAlphaEffect,\n\n // Shadow effects\n borderGlowEffect,\n dropShadowEffect,\n innerShadowEffect,\n neumorphicShadowEffect,\n outerGlowEffect,\n retro3DShadowEffect,\n\n // Transform effects\n scaleUpEffect,\n scaleDownEffect,\n liftEffect,\n pressDownEffect,\n popEffect,\n\n // Overlay effects\n auroraGlowEffect,\n cosmicStardustEffect,\n gradientBorderFillEffect,\n animatedGradientBorderFillEffect,\n borderBottomGrowEffect,\n\n // Text effects\n gradientTextEffect,\n textColorChangeEffect,\n\n // Border effects\n borderColorChangeEffect,\n sketchyBorderEffect,\n\n // Animation effects\n pulseAnimationEffect,\n];\n\n/**\n * Get an effect preset by ID\n *\n * @param id - Effect preset ID\n * @returns Effect preset or undefined if not found\n */\nexport function getEffectPreset(id: string): EffectPreset | undefined {\n return EFFECT_PRESETS.find((preset) => preset.id === id);\n}\n\n/**\n * Get all effect presets in a category\n *\n * @param category - Effect category\n * @returns Array of effect presets in that category\n */\nexport function getEffectPresetsByCategory(category: string): EffectPreset[] {\n return EFFECT_PRESETS.filter((preset) => preset.category === category);\n}\n\n/**\n * Get all effect presets (for UI selection)\n *\n * @returns Array of all effect presets\n */\nexport function getAllEffectPresets(): EffectPreset[] {\n return EFFECT_PRESETS;\n}\n","import type { Theme } from '../schema';\n\n/**\n * Resolves theme tokens to CSS variables\n *\n * This resolver ensures all button styles use theme tokens (not hardcoded colors)\n * so that changing the palette automatically updates all buttons.\n */\nexport class TokenResolver {\n constructor(private theme: Theme) {}\n\n /**\n * Resolve a color token to a CSS variable reference wrapped in rgb()\n *\n * @param token - Token name (e.g., 'primary-500', 'white', 'text-900')\n * @returns CSS rgb() function with var reference (e.g., 'rgb(var(--tb-primary-500))')\n *\n * Note: CSS variables are stored as RGB channels (e.g., \"37 99 235\") following Tailwind convention,\n * so we must wrap them with rgb() to create a valid color value.\n *\n * @example\n * resolver.getColor('primary-500') // => 'rgb(var(--tb-primary-500))'\n * resolver.getColor('white') // => 'rgb(var(--tb-white))'\n */\n getColor(token: string): string {\n // Log warning if token doesn't exist in theme palette\n if (!this.tokenExists(token)) {\n console.warn(\n `[TokenResolver] Color token \"${token}\" not found in theme palette. Button may render incorrectly.`\n );\n }\n\n return `rgb(var(--tb-${token}))`;\n }\n\n /**\n * Adjust a color token's shade by a given amount\n *\n * @param token - Base token (e.g., 'primary-500')\n * @param amount - Shade adjustment (+100 = darker, -100 = lighter)\n * @returns Adjusted token name (e.g., 'primary-600')\n *\n * @example\n * resolver.adjustShade('primary-500', 100) // => 'primary-600' (darker)\n * resolver.adjustShade('primary-500', -100) // => 'primary-400' (lighter)\n */\n adjustShade(token: string, amount: number): string {\n // Parse token (e.g., 'primary-500' → ['primary', '500'])\n const parts = token.split('-');\n\n if (parts.length < 2) {\n // No shade specified, assume 500\n const newShade = Math.max(100, Math.min(900, 500 + amount));\n return `${token}-${newShade}`;\n }\n\n const base = parts.slice(0, -1).join('-');\n const shade = parseInt(parts[parts.length - 1], 10);\n\n if (isNaN(shade)) {\n // Not a shade token (e.g., 'white'), return as-is\n console.warn(\n `[TokenResolver] Cannot adjust shade for non-shade token \"${token}\". Returning original token.`\n );\n return token;\n }\n\n // Adjust shade, clamping to 100-900 range\n const newShade = Math.max(100, Math.min(900, shade + amount));\n return `${base}-${newShade}`;\n }\n\n /**\n * Check if a token exists in the theme palette\n *\n * @param token - Token name to check\n * @returns True if token exists in theme\n */\n private tokenExists(token: string): boolean {\n // For now, we'll assume tokens exist if they follow standard patterns\n // In the future, this could validate against theme.palette\n\n // Common non-shade tokens that should always exist\n const commonTokens = ['white', 'black', 'transparent'];\n if (commonTokens.includes(token)) {\n return true;\n }\n\n // Check if it's a shade token (e.g., 'primary-500', 'gray-800')\n const parts = token.split('-');\n if (parts.length >= 2) {\n const lastPart = parts[parts.length - 1];\n const shade = parseInt(lastPart, 10);\n if (!isNaN(shade) && shade >= 100 && shade <= 900 && shade % 100 === 0) {\n return true; // Valid shade token format\n }\n }\n\n // Could add validation against theme.palette here\n // For now, assume it exists\n return true;\n }\n}\n","import type { GradientDirection } from './types'\n\n/**\n * Shared constants for button CSS generation\n *\n * These mappings convert Tailwind-style tokens to actual CSS values.\n * Centralized here to eliminate duplication across multiple files.\n */\n\n/**\n * Map Tailwind-style gradient direction tokens to CSS gradient directions\n */\nexport const GRADIENT_DIRECTION_MAP: Record<GradientDirection, string> = {\n 'to-r': 'to right',\n 'to-l': 'to left',\n 'to-t': 'to top',\n 'to-b': 'to bottom',\n 'to-br': 'to bottom right',\n 'to-bl': 'to bottom left',\n 'to-tr': 'to top right',\n 'to-tl': 'to top left',\n}\n\n/**\n * Map Tailwind border-radius tokens to CSS values\n */\nexport const BORDER_RADIUS_MAP: Record<string, string> = {\n 'rounded-none': '0',\n 'rounded-sm': '0.125rem',\n 'rounded': '0.25rem',\n 'rounded-md': '0.375rem',\n 'rounded-lg': '0.5rem',\n 'rounded-xl': '0.75rem',\n 'rounded-2xl': '1rem',\n 'rounded-3xl': '1.5rem',\n 'rounded-full': '9999px',\n}\n\n/**\n * Generate shadow CSS value dynamically based on elevation, softness, and position\n *\n * This replaces the static shadow maps with a single dynamic function.\n * Benefits: single source of truth, easy to adjust algorithm, no redundancy.\n *\n * @param elevation - Shadow elevation level\n * @param softness - Shadow softness/blur style\n * @param position - Shadow position (bottom or bottom-right diagonal)\n * @returns CSS box-shadow value\n */\nexport function generateShadowValue(\n elevation: 'none' | 'low' | 'medium' | 'high',\n softness: 'crisp' | 'soft' | 'hard' | null,\n position: 'bottom' | 'bottom-right' = 'bottom'\n): string {\n if (elevation === 'none') return 'none'\n\n // Define base offset and blur per elevation level\n const elevationConfig = {\n low: { offset: 2, blur: 4, spread: 0 },\n medium: { offset: 4, blur: 8, spread: -1 },\n high: { offset: 6, blur: 12, spread: -2 },\n }\n\n const config = elevationConfig[elevation]\n\n // Calculate x and y offsets based on position\n const xOffset = position === 'bottom-right' ? config.offset : 0\n const yOffset = config.offset\n\n // Adjust based on softness\n switch (softness) {\n case 'hard':\n // Zero blur, opacity 1.0 for flat, hard-edged shadows\n return `${xOffset}px ${yOffset}px 0 0 rgb(0 0 0 / 1)`\n\n case 'crisp':\n // Minimal blur, higher opacity for sharp shadows\n return `${xOffset}px ${yOffset}px ${config.offset}px ${config.spread}px rgb(0 0 0 / 0.4)`\n\n case 'soft':\n default:\n // Large blur, moderate opacity for diffused shadows\n return `${xOffset}px ${yOffset}px ${config.blur}px ${config.spread}px rgb(0 0 0 / 0.3)`\n }\n}\n\n/**\n * Map Tailwind border-width tokens to CSS values\n */\nexport const BORDER_WIDTH_MAP: Record<string, string> = {\n 'border-0': '0px',\n 'border': '1px',\n 'border-2': '2px',\n 'border-4': '4px',\n 'border-8': '8px',\n}\n\n/**\n * Map Tailwind font-size tokens to CSS values\n */\nexport const FONT_SIZE_MAP: Record<string, string> = {\n 'text-xs': '0.75rem',\n 'text-sm': '0.875rem',\n 'text-base': '1rem',\n 'text-lg': '1.125rem',\n 'text-xl': '1.25rem',\n 'text-2xl': '1.5rem',\n}\n","import type { Theme } from '../../schema'\n\n/**\n * Convert hex color to RGB values\n */\nfunction hexToRgb(hex: string): { r: number; g: number; b: number } | null {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex)\n return result\n ? {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16),\n }\n : null\n}\n\n/**\n * Calculate relative luminance of a color\n * https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\nfunction getLuminance(r: number, g: number, b: number): number {\n const [rs, gs, bs] = [r, g, b].map((c) => {\n const sRGB = c / 255\n return sRGB <= 0.03928 ? sRGB / 12.92 : Math.pow((sRGB + 0.055) / 1.055, 2.4)\n })\n return 0.2126 * rs + 0.7152 * gs + 0.0722 * bs\n}\n\n/**\n * Calculate contrast ratio between two colors\n * https://www.w3.org/TR/WCAG20/#contrast-ratiodef\n *\n * Returns a ratio from 1:1 (no contrast) to 21:1 (maximum contrast)\n * WCAG AA requires 4.5:1 for normal text, 3:1 for large text\n */\nexport function getContrastRatio(hex1: string, hex2: string): number {\n const rgb1 = hexToRgb(hex1)\n const rgb2 = hexToRgb(hex2)\n\n if (!rgb1 || !rgb2) {\n return 0\n }\n\n const lum1 = getLuminance(rgb1.r, rgb1.g, rgb1.b)\n const lum2 = getLuminance(rgb2.r, rgb2.g, rgb2.b)\n\n const lighter = Math.max(lum1, lum2)\n const darker = Math.min(lum1, lum2)\n\n return (lighter + 0.05) / (darker + 0.05)\n}\n\n/**\n * Check if contrast ratio meets WCAG AA standard (4.5:1)\n */\nexport function hasGoodContrast(hex1: string, hex2: string): boolean {\n return getContrastRatio(hex1, hex2) >= 4.5\n}\n\n/**\n * Get a color token from the theme palette by name\n * Returns the hex value or null if not found\n */\nfunction getColorHexFromTheme(theme: Theme, tokenName: string): string | null {\n // Check direct palette colors\n const color = theme.palette.colors.find((c) => c.name === tokenName)\n if (color) {\n return color.hex\n }\n\n // Handle special cases\n if (tokenName === 'white') return '#ffffff'\n if (tokenName === 'black') return '#000000'\n\n // For now, return null for shade tokens (e.g., 'primary-500', 'text-900')\n // These would need to be resolved from the expanded palette\n // which isn't available at the time we're generating default buttons\n return null\n}\n\n/**\n * Select appropriate text color based on background color and theme mode\n *\n * Logic:\n * - Light theme: Try white → text color → black\n * - Dark theme: Try background → text color → white\n *\n * Returns the color token name that has sufficient contrast\n */\nexport function selectTextColorToken(\n backgroundHex: string,\n theme: Theme,\n isLightTheme: boolean\n): string {\n const candidates = isLightTheme\n ? ['white', 'text', 'black']\n : ['background', 'text', 'white']\n\n for (const candidate of candidates) {\n const candidateHex = getColorHexFromTheme(theme, candidate)\n\n // If we can't resolve the hex, skip this candidate\n if (!candidateHex) continue\n\n if (hasGoodContrast(backgroundHex, candidateHex)) {\n return candidate\n }\n }\n\n // Fallback to last option if nothing has good contrast\n return candidates[candidates.length - 1]\n}\n\n/**\n * Get contrasting text color for a button background\n *\n * This function returns theme-aware text colors using the neutral scale,\n * which is guaranteed to exist in every theme and harmonizes with the design.\n *\n * Uses neutral-50 (lightest) for dark backgrounds and neutral-950 (darkest)\n * for light backgrounds. This ensures excellent contrast while respecting\n * the theme's neutral palette (warm/cool tinting).\n *\n * For solid backgrounds with primary/secondary/neutral colors:\n * - Dark backgrounds (shade >= 500): neutral-50 (very light)\n * - Light backgrounds (shade < 500): neutral-950 (very dark)\n */\nexport function getContrastingTextColorToken(\n backgroundToken: string,\n theme: Theme\n): string {\n const isLightTheme = theme.palette.meta.mode === 'light'\n\n // For common background tokens, return sensible defaults\n if (backgroundToken.startsWith('primary-') || backgroundToken.startsWith('secondary-')) {\n // Primary/secondary colors are usually vivid, so lightest neutral works well\n return 'neutral-50'\n }\n\n if (backgroundToken.startsWith('neutral-')) {\n // Neutral colors depend on shade\n const match = backgroundToken.match(/neutral-(\\d+)/)\n if (match) {\n const shade = parseInt(match[1], 10)\n // 500 is the middle - darker than 500 needs light text, lighter needs dark text\n return shade >= 500 ? 'neutral-50' : 'neutral-950'\n }\n }\n\n // Default fallback based on theme mode\n return isLightTheme ? 'neutral-50' : 'neutral-950'\n}\n","import type { Theme, Corners } from '../schema'\nimport type { ButtonSystem, ButtonVariant } from './types'\nimport { getContrastingTextColorToken } from './utils/contrast'\n\n/**\n * Map theme corners to border-radius tokens\n */\nconst CORNERS_TO_RADIUS_MAP: Record<Corners, string> = {\n square: 'rounded-none', // 0px - sharp corners\n soft: 'rounded-md', // 6px - subtle rounding\n rounded: 'rounded-md', // 6px - standard rounded (same as soft for buttons)\n pill: 'rounded-full', // 9999px - full pill shape\n}\n\n/**\n * Map border width to border width class\n */\nconst BORDER_WIDTH_TO_CLASS_MAP: Record<string, string> = {\n none: 'border-0', // 0px\n hairline: 'border', // 1px - barely visible\n thin: 'border', // 1px - standard thin border\n thick: 'border-4', // 4px - clearly thick\n}\n\n/**\n * Map motion level to transition duration (milliseconds)\n * Used in effect generation\n */\nexport const MOTION_TO_DURATION_MAP: Record<string, string> = {\n off: '0ms',\n low: '150ms',\n medium: '200ms',\n high: '300ms',\n}\n\n/**\n * Map motion easing to CSS easing function\n */\nexport const MOTION_TO_EASING_MAP: Record<string, string> = {\n standard: 'ease-in-out',\n snappy: 'cubic-bezier(0.4, 0, 0.2, 1)',\n gentle: 'cubic-bezier(0.25, 0.1, 0.25, 1)',\n}\n\n/**\n * Generate default button system from theme settings\n *\n * Creates 4 standard button variants when theme.buttons is not defined:\n * 1. Primary - primary color background with opacity-reduce hover effect\n * 2. Secondary - neutral-700 background with opacity-reduce hover effect\n * 3. Outline - transparent background with primary border and opacity-reduce hover effect\n * 4. Ghost - transparent background, no border, with opacity-reduce hover effect\n *\n * All variants use theme settings for:\n * - Border radius (from theme.components.button.shape / theme.corners)\n * - Shadow (from theme.shadow.elevation)\n * - Border width for outline (from theme.border.width)\n * - Transitions (from theme.motion)\n *\n * @param theme - Theme configuration\n * @returns ButtonSystem with 4 default variants\n */\nexport function generateDefaultButtonSystem(theme: Theme): ButtonSystem {\n // Extract theme settings\n // Use theme.corners (global setting) for default buttons, not components.button.shape\n // This ensures default buttons respect the overall theme aesthetic\n const borderRadius = CORNERS_TO_RADIUS_MAP[theme.corners] || 'rounded-lg'\n const borderWidthClass = BORDER_WIDTH_TO_CLASS_MAP[theme.border.width] || 'border-2'\n\n const variants: ButtonVariant[] = []\n\n // 1. Primary button\n const primaryVariant: ButtonVariant = {\n id: 'primary',\n name: 'Primary',\n enabled: true,\n priority: 1,\n background: {\n type: 'solid',\n colorToken: 'primary-500',\n },\n textColorToken: getContrastingTextColorToken('primary-500', theme),\n borderRadius,\n // Inherits shadow from theme\n effects: {\n hover: [\n {\n effectId: 'opacity-reduce',\n options: { reduction: 15 },\n },\n ],\n },\n }\n variants.push(primaryVariant)\n\n // 2. Secondary button\n // Use neutral-700 as fallback if secondary doesn't exist\n const secondaryVariant: ButtonVariant = {\n id: 'secondary',\n name: 'Secondary',\n enabled: true,\n priority: 2,\n background: {\n type: 'solid',\n colorToken: 'neutral-700',\n },\n textColorToken: getContrastingTextColorToken('neutral-700', theme),\n borderRadius,\n // Inherits shadow from theme\n effects: {\n hover: [\n {\n effectId: 'opacity-reduce',\n options: { reduction: 15 },\n },\n ],\n },\n }\n variants.push(secondaryVariant)\n\n // 3. Outline button\n const outlineVariant: ButtonVariant = {\n id: 'outline',\n name: 'Outline',\n enabled: true,\n priority: 3,\n background: {\n type: 'transparent',\n },\n textColorToken: 'primary-600',\n borderRadius,\n shadow: { elevation: 'none', softness: null, position: 'bottom' }, // Outline buttons typically don't have shadows\n border: {\n colorToken: 'primary-500',\n widthClass: borderWidthClass,\n },\n effects: {\n hover: [\n {\n effectId: 'opacity-reduce',\n options: { reduction: 15 },\n },\n ],\n },\n }\n variants.push(outlineVariant)\n\n // 4. Ghost button\n const ghostVariant: ButtonVariant = {\n id: 'ghost',\n name: 'Ghost',\n enabled: true,\n priority: 3,\n background: {\n type: 'transparent',\n },\n textColorToken: 'primary-600',\n borderRadius,\n shadow: { elevation: 'none', softness: null, position: 'bottom' }, // Ghost buttons have no shadow\n // No border for ghost buttons\n effects: {\n hover: [\n {\n effectId: 'opacity-reduce',\n options: { reduction: 15 },\n },\n ],\n },\n }\n variants.push(ghostVariant)\n\n return {\n global: {\n // Use global theme.corners, not components.button.shape\n cornerStyle: theme.corners as 'square' | 'rounded' | 'pill',\n shadow: theme.shadow.elevation as 'none' | 'low' | 'medium' | 'high',\n textTransform: 'none',\n fontWeight: 500,\n borderWidth: theme.border.width === 'none' ? 1 : theme.border.width === 'thick' ? 3 : 2,\n hoverTransform: 'none',\n hoverColor: 'none',\n },\n variants,\n }\n}\n","import type { Theme } from '../schema'\nimport type { ButtonSystem, ButtonVariant, ButtonGlobalSettings, ButtonSizes, ButtonSizeName } from './types'\nimport type { StateGroup, EffectContext } from './effects/types'\nimport { getEffectPreset } from './effects/registry'\nimport { TokenResolver } from '../tokens/resolver'\nimport {\n GRADIENT_DIRECTION_MAP,\n BORDER_RADIUS_MAP,\n generateShadowValue,\n BORDER_WIDTH_MAP,\n FONT_SIZE_MAP,\n} from './constants'\nimport { generateDefaultButtonSystem } from './generateDefaultButtonSystem'\nimport type { ShadowSize, Shadow } from './types'\n\n/**\n * Default button sizes when not specified in theme\n */\nconst DEFAULT_BUTTON_SIZES: ButtonSizes = {\n sm: { padding: '0.375rem 0.75rem', fontSize: 'text-sm' },\n md: { padding: '0.5rem 1rem' },\n lg: { padding: '0.75rem 1.5rem', fontSize: 'text-lg' },\n}\n\n/**\n * Convert legacy ShadowSize to Shadow object\n *\n * Global settings use ShadowSize ('none' | 'low' | 'medium' | 'high')\n * but the CSS generator needs Shadow objects with { elevation, softness, position }\n *\n * Uses the elevation from the size, but preserves softness and position from the theme\n */\nfunction shadowSizeToShadow(size: ShadowSize, theme: Theme): Shadow {\n const elevationMap: Record<ShadowSize, Shadow['elevation']> = {\n 'none': 'none',\n 'low': 'low',\n 'medium': 'medium',\n 'high': 'high',\n }\n\n return {\n elevation: elevationMap[size],\n softness: theme.shadow.softness,\n position: theme.shadow.position,\n }\n}\n\n/**\n * Structural base styles for all buttons\n * These can be moved to ButtonGlobalSettings in the future if per-theme customization is needed\n */\nconst STRUCTURAL_BASE_STYLES = {\n padding: '0.5rem 1rem',\n fontWeight: 500,\n cursor: 'pointer',\n transition: 'all 200ms ease-in-out',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n} as const\n\n/**\n * Generate complete CSS for button system from theme config\n *\n * This function:\n * 1. Reads button variants from theme.buttons\n * 2. Generates CSS for each variant\n * 3. Returns scoped CSS string\n *\n * Runs SERVER-SIDE during theme loading.\n * NOTE: Renderer only knows about theme config, NOT presets.\n */\nexport interface GenerateButtonCssOptions {\n themeId: string\n theme: Theme\n buttonSystem?: ButtonSystem\n}\n\nexport function generateButtonCss(options: GenerateButtonCssOptions): string {\n const { themeId, theme, buttonSystem: providedButtonSystem } = options\n const tokens = new TokenResolver(theme)\n\n // Use provided button system, or generate defaults from theme\n const buttonSystem = providedButtonSystem ?? generateDefaultButtonSystem(theme)\n\n const cssChunks: string[] = []\n\n for (const variant of buttonSystem.variants) {\n if (!variant.enabled) continue\n\n // Generate base variant CSS (background, colors, shape)\n const baseCSS = generateVariantBaseCSS(variant, buttonSystem.global, themeId, tokens, theme)\n cssChunks.push(baseCSS)\n\n // Generate effect CSS for each state group\n const effectCSS = generateVariantEffectCSS(variant, themeId, tokens, theme)\n if (effectCSS) {\n cssChunks.push(effectCSS)\n }\n\n // Generate disabled state CSS\n const disabledCSS = generateDisabledCSS(variant, themeId)\n cssChunks.push(disabledCSS)\n }\n\n // Generate button size classes\n const sizesCSS = generateButtonSizeCSS(themeId, buttonSystem.sizes)\n if (sizesCSS) {\n cssChunks.push(sizesCSS)\n }\n\n return cssChunks.filter(Boolean).join('\\n\\n')\n}\n\n/**\n * Generate base CSS for a button variant\n *\n * Generates all styles (colors, structure, transitions) in pure CSS.\n * No Tailwind utility classes needed - everything is in the generated CSS.\n */\nfunction generateVariantBaseCSS(\n variant: ButtonVariant,\n global: ButtonGlobalSettings,\n themeId: string,\n tokens: TokenResolver,\n theme: Theme\n): string {\n // Wrap scope selector in :where() for zero specificity\n const selector = `:where([data-theme-scope=\"${themeId}\"]) .${variant.id}`\n const rules: string[] = []\n\n // Calculate padding adjustment for borders\n // If button has a border, reduce padding by border width to keep consistent button size\n const borderWidth = variant.border ? (BORDER_WIDTH_MAP[variant.border.widthClass] || '1px') : '0px'\n const hasBorder = borderWidth !== '0px'\n\n // Structural base styles (always applied)\n // Use variant padding if provided, otherwise default\n const padding = variant.padding || STRUCTURAL_BASE_STYLES.padding\n // Parse padding shorthand (e.g., \"0.5rem 1rem\" -> top/bottom: 0.5rem, left/right: 1rem)\n // and adjust if border is present to maintain consistent size\n const paddingParts = padding.split(' ')\n const verticalPadding = paddingParts[0] || '0.5rem'\n const horizontalPadding = paddingParts[1] || paddingParts[0] || '1rem'\n\n if (hasBorder) {\n // Use longhand properties with calc to subtract border width\n // Add extra 1px optical compensation on vertical padding to balance visual weight of border\n rules.push(`padding-top: calc(${verticalPadding} - ${borderWidth} - 1px);`)\n rules.push(`padding-bottom: calc(${verticalPadding} - ${borderWidth} - 1px);`)\n rules.push(`padding-left: calc(${horizontalPadding} - ${borderWidth});`)\n rules.push(`padding-right: calc(${horizontalPadding} - ${borderWidth});`)\n } else {\n // Use shorthand for cleaner CSS\n rules.push(`padding: ${padding};`)\n }\n // Font weight (use global setting as default)\n rules.push(`font-weight: ${global.fontWeight};`)\n\n // Font size (if variant specifies it)\n if (variant.fontSize) {\n const fontSize = FONT_SIZE_MAP[variant.fontSize] || '1rem'\n rules.push(`font-size: ${fontSize};`)\n }\n\n // Text transform (from global settings)\n if (global.textTransform !== 'none') {\n rules.push(`text-transform: ${global.textTransform};`)\n }\n\n rules.push(`cursor: ${STRUCTURAL_BASE_STYLES.cursor};`)\n rules.push(`transition: ${STRUCTURAL_BASE_STYLES.transition};`)\n rules.push(`display: ${STRUCTURAL_BASE_STYLES.display};`)\n rules.push(`align-items: ${STRUCTURAL_BASE_STYLES.alignItems};`)\n rules.push(`justify-content: ${STRUCTURAL_BASE_STYLES.justifyContent};`)\n\n // Border radius (from variant config, with fallback to global cornerStyle)\n let borderRadius: string\n if (variant.borderRadius) {\n borderRadius = BORDER_RADIUS_MAP[variant.borderRadius] || BORDER_RADIUS_MAP['rounded']\n } else {\n // Fallback to global cornerStyle\n const cornerStyleMap: Record<string, string> = {\n 'square': 'rounded-none',\n 'rounded': 'rounded-md',\n 'pill': 'rounded-full',\n }\n const fallbackRadius = cornerStyleMap[global.cornerStyle] || 'rounded-md'\n borderRadius = BORDER_RADIUS_MAP[fallbackRadius] || BORDER_RADIUS_MAP['rounded']\n }\n rules.push(`border-radius: ${borderRadius};`)\n\n // Shadow fallback hierarchy: variant.shadow -> global.shadow -> theme.shadow\n const shadowConfig = variant.shadow || shadowSizeToShadow(global.shadow, theme) || theme.shadow\n const shadow = generateShadowValue(\n shadowConfig.elevation,\n shadowConfig.softness,\n shadowConfig.position || 'bottom'\n )\n rules.push(`box-shadow: ${shadow};`)\n\n // Background\n if (variant.background.type === 'solid') {\n const bgColor = tokens.getColor(variant.background.colorToken)\n rules.push(`background-color: ${bgColor};`)\n } else if (variant.background.type === 'gradient') {\n const colors = variant.background.stops.map((stop) => tokens.getColor(stop)).join(', ')\n const direction = GRADIENT_DIRECTION_MAP[variant.background.direction] || 'to right'\n rules.push(`background-image: linear-gradient(${direction}, ${colors});`)\n } else if (variant.background.type === 'transparent') {\n rules.push(`background-color: transparent;`)\n }\n\n // Text color\n const textColor = tokens.getColor(variant.textColorToken)\n rules.push(`color: ${textColor};`)\n\n // Border\n if (variant.border) {\n const borderColor = tokens.getColor(variant.border.colorToken)\n const borderWidth = BORDER_WIDTH_MAP[variant.border.widthClass] || '1px'\n rules.push(`border: ${borderWidth} solid ${borderColor};`)\n }\n // Note: If no border is defined, we don't set border: none to allow effects\n // like gradient-border-fill to set their own borders\n\n if (rules.length === 0) return ''\n\n return `\n${selector} {\n ${rules.join('\\n ')}\n}\n `.trim()\n}\n\n/**\n * Generate CSS for all effects in a button variant\n */\nfunction generateVariantEffectCSS(\n variant: ButtonVariant,\n themeId: string,\n tokens: TokenResolver,\n theme: Theme\n): string {\n if (!variant.effects) return ''\n\n const cssChunks: string[] = []\n\n // Process each state group (base, hover, active, focus)\n for (const [stateGroup, effectApps] of Object.entries(variant.effects)) {\n if (!effectApps || effectApps.length === 0) continue\n\n for (const effectApp of effectApps) {\n const effectPreset = getEffectPreset(effectApp.effectId)\n\n if (!effectPreset) {\n console.warn(`[generateVariantEffectCSS] Unknown effect: ${effectApp.effectId}`)\n continue\n }\n\n // Build effect context\n const ctx: EffectContext = {\n themeId,\n variantId: variant.id,\n stateGroup: stateGroup as StateGroup,\n options: effectApp.options || {},\n buttonConfig: variant,\n tokens,\n theme,\n }\n\n // Generate CSS from effect preset\n const css = effectPreset.generateCSS(ctx)\n if (css) {\n cssChunks.push(css)\n }\n }\n }\n\n return cssChunks.join('\\n\\n')\n}\n\n/**\n * Generate disabled state CSS\n *\n * Hardcoded: reduces opacity, removes pointer events, removes hover effects.\n */\nfunction generateDisabledCSS(variant: ButtonVariant, themeId: string): string {\n // Wrap scope selector in :where() for zero specificity\n const selector = `:where([data-theme-scope=\"${themeId}\"]) .${variant.id}:disabled`\n\n return `\n${selector},\n${selector}:hover,\n${selector}:active,\n${selector}:focus {\n opacity: 0.5;\n cursor: not-allowed;\n pointer-events: none;\n transform: none;\n box-shadow: none;\n}\n\n/* Remove pseudo-element effects when disabled */\n${selector}::before,\n${selector}::after {\n opacity: 0;\n animation: none;\n pointer-events: none;\n}\n `.trim()\n}\n\n/**\n * Generate CSS classes for button sizes (btn-sm, btn-md, btn-lg)\n *\n * These classes can be combined with variant classes to adjust button sizing.\n * Uses !important to override variant padding/font-size.\n */\nfunction generateButtonSizeCSS(themeId: string, sizes?: ButtonSizes): string {\n const effectiveSizes = sizes ?? DEFAULT_BUTTON_SIZES\n const cssChunks: string[] = []\n\n for (const [sizeName, config] of Object.entries(effectiveSizes) as [ButtonSizeName, typeof effectiveSizes.sm][]) {\n // Wrap scope selector in :where() for zero specificity\n const selector = `:where([data-theme-scope=\"${themeId}\"]) .btn-${sizeName}`\n const rules: string[] = []\n\n // Padding with !important to override variant defaults\n rules.push(`padding: ${config.padding} !important;`)\n\n // Font size if specified\n if (config.fontSize) {\n const fontSize = FONT_SIZE_MAP[config.fontSize] || config.fontSize\n rules.push(`font-size: ${fontSize} !important;`)\n }\n\n cssChunks.push(`\n${selector} {\n ${rules.join('\\n ')}\n}`.trim())\n }\n\n return cssChunks.join('\\n\\n')\n}\n","import type { Corners } from '../schema'\n\n/**\n * Corner style to border-radius value map\n */\nexport const CORNER_RADIUS_MAP: Record<Corners, string> = {\n square: '0px',\n soft: '8px',\n rounded: '16px',\n pill: '9999px',\n}\n\n/**\n * Border width class to actual width map\n */\nexport const BORDER_WIDTH_MAP: Record<string, string> = {\n 'border': '1px',\n 'border-2': '2px',\n 'border-4': '4px',\n}\n\n/**\n * Gradient direction to CSS direction map\n */\nexport const GRADIENT_DIRECTION_MAP: Record<string, string> = {\n 'to-r': 'to right',\n 'to-l': 'to left',\n 'to-t': 'to top',\n 'to-b': 'to bottom',\n 'to-tr': 'to top right',\n 'to-tl': 'to top left',\n 'to-br': 'to bottom right',\n 'to-bl': 'to bottom left',\n}\n\n/**\n * Generate CSS box-shadow value from Shadow object\n */\nexport function generateShadowValue(shadow: {\n elevation: 'none' | 'low' | 'medium' | 'high'\n softness: 'crisp' | 'soft' | 'hard' | null\n position: 'bottom' | 'bottom-right'\n}): string {\n if (shadow.elevation === 'none') return 'none'\n\n const offsets = {\n low: 2,\n medium: 4,\n high: 6,\n }\n\n const offset = offsets[shadow.elevation]\n const xOffset = shadow.position === 'bottom-right' ? offset : 0\n\n // Hard shadows: zero blur, full opacity\n if (shadow.softness === 'hard') {\n return `${xOffset}px ${offset}px 0 0 rgba(0,0,0,1)`\n }\n\n // Soft vs crisp shadows\n const soft = shadow.softness !== 'crisp'\n\n switch (shadow.elevation) {\n case 'low':\n return soft\n ? `${xOffset}px 1px 2px rgba(0,0,0,.06)`\n : `${xOffset}px 1px 1px rgba(0,0,0,.12)`\n case 'medium':\n return soft\n ? `${xOffset}px 10px 20px rgba(0,0,0,.08)`\n : `${xOffset}px 6px 12px rgba(0,0,0,.16)`\n case 'high':\n return soft\n ? `${xOffset}px 25px 50px rgba(0,0,0,.18)`\n : `${xOffset}px 20px 30px rgba(0,0,0,.28)`\n }\n}\n","import type { Theme } from '../schema'\nimport type { CardSystem } from './types'\n\n/**\n * Generate a default card system from theme settings\n *\n * Creates a single \"default\" variant that intelligently uses theme settings:\n * - Explicitly sets theme.shadow and theme.corners (for runtime transform access)\n * - Uses theme.border if defined and has meaningful width\n *\n * This ensures cards have sensible defaults even when theme.cards is undefined.\n *\n * Note: We explicitly set corners and shadow (rather than leaving undefined)\n * so that runtime transforms can access them without needing the full theme config.\n */\nexport function generateDefaultCardSystem(theme: Theme): CardSystem {\n const variant: any = {\n id: 'default',\n name: 'Default',\n enabled: true,\n priority: 1,\n background: { type: 'solid', colorToken: 'surface' },\n spacing: 'comfortable',\n // Explicitly set corners and shadow from theme for runtime access\n corners: theme.corners,\n shadow: theme.shadow,\n }\n\n // If theme defines a border with meaningful width, add it to cards\n if (theme.border && theme.border.width !== 'none') {\n const widthClassMap: Record<string, string> = {\n 'hairline': 'border',\n 'thin': 'border',\n 'thick': 'border-4',\n }\n variant.border = {\n widthClass: widthClassMap[theme.border.width] || 'border',\n colorToken: 'border',\n }\n }\n\n return {\n variants: [variant],\n }\n}\n","import type { Theme } from '../schema'\nimport type { CardSystem, CardVariant } from './types'\nimport { TokenResolver } from '../tokens/resolver'\nimport {\n CORNER_RADIUS_MAP,\n GRADIENT_DIRECTION_MAP,\n generateShadowValue,\n} from './constants'\nimport { generateDefaultCardSystem } from './generateDefaultCardSystem'\n\n/**\n * Generate complete CSS for card system from theme config\n *\n * This function:\n * 1. Reads card variants from theme.cards\n * 2. Generates CSS for each variant\n * 3. Returns scoped CSS string\n *\n * Runs SERVER-SIDE during theme loading.\n */\nexport interface GenerateCardCssOptions {\n themeId: string\n theme: Theme\n cardSystem?: CardSystem\n}\n\nexport function generateCardCss(options: GenerateCardCssOptions): string {\n const { themeId, theme, cardSystem: providedCardSystem } = options\n const tokens = new TokenResolver(theme)\n\n // Use provided card system, or generate defaults from theme\n const cardSystem = providedCardSystem ?? generateDefaultCardSystem(theme)\n\n const cssChunks: string[] = []\n\n for (const variant of cardSystem.variants) {\n if (!variant.enabled) continue\n\n const css = generateVariantCSS(variant, themeId, tokens, theme)\n cssChunks.push(css)\n }\n\n return cssChunks.filter(Boolean).join('\\n\\n')\n}\n\n/**\n * Padding map for card content based on spacing semantic values\n */\nconst CONTENT_PADDING_MAP: Record<CardVariant['spacing'], string> = {\n none: '0',\n compact: '0.75rem',\n cozy: '1rem',\n medium: '1.25rem',\n comfortable: '1.5rem',\n spacious: '2rem',\n}\n\n/**\n * Corner radius map for card media (top corners only)\n */\nconst MEDIA_CORNER_MAP: Record<Theme['corners'], string> = {\n square: '0',\n soft: '0.5rem',\n rounded: '1rem',\n pill: '9999px',\n}\n\n/**\n * Generate CSS for a single card variant\n *\n * Generates complete CSS for card containers and their children:\n * - Container: background, shadow, corners, border\n * - .card-media: top corners matching container\n * - .card-content: padding based on spacing\n *\n * This CSS-first approach eliminates runtime transforms for styling,\n * keeping transforms only for data normalization and dynamic layout.\n */\nfunction generateVariantCSS(\n variant: CardVariant,\n themeId: string,\n tokens: TokenResolver,\n theme: Theme\n): string {\n const containerSelector = `:where([data-theme-scope=\"${themeId}\"]) .card-${variant.id}`\n const mediaSelector = `${containerSelector} .card-media`\n const contentSelector = `${containerSelector} .card-content`\n\n const rules: string[] = []\n\n // === Container Styles ===\n\n // Background\n if (variant.background.type === 'solid') {\n const bgColor = tokens.getColor(variant.background.colorToken)\n rules.push(`background: ${bgColor}`)\n } else if (variant.background.type === 'gradient') {\n const fromColor = tokens.getColor(variant.background.fromToken)\n const toColor = tokens.getColor(variant.background.toToken)\n const direction = GRADIENT_DIRECTION_MAP[variant.background.direction] || 'to right'\n rules.push(`background: linear-gradient(${direction}, ${fromColor}, ${toColor})`)\n } else {\n rules.push(`background: transparent`)\n }\n\n // Border\n if (variant.border) {\n const borderColor = tokens.getColor(variant.border.colorToken)\n const borderWidth = variant.border.widthClass === 'border-4' ? '4px' :\n variant.border.widthClass === 'border-2' ? '2px' :\n variant.border.widthClass === 'border' ? '1px' : '1px'\n rules.push(`border: ${borderWidth} solid ${borderColor}`)\n }\n\n // Border radius (use variant override or theme default)\n const corners = variant.corners ?? theme.corners\n const radius = CORNER_RADIUS_MAP[corners]\n rules.push(`border-radius: ${radius}`)\n\n // Shadow (use variant override or theme default)\n const shadow = variant.shadow ?? theme.shadow\n if (shadow.elevation !== 'none') {\n const shadowValue = generateShadowValue(shadow)\n rules.push(`box-shadow: ${shadowValue}`)\n }\n\n // Structural styles for flex layout\n rules.push(`display: flex`)\n rules.push(`flex-direction: column`)\n rules.push(`position: relative`)\n rules.push(`overflow: hidden`)\n\n // === Media Styles ===\n const mediaRadius = MEDIA_CORNER_MAP[corners]\n const mediaRules: string[] = [\n `border-top-left-radius: ${mediaRadius}`,\n `border-top-right-radius: ${mediaRadius}`,\n ]\n\n // === Content Styles ===\n const padding = CONTENT_PADDING_MAP[variant.spacing] || CONTENT_PADDING_MAP.comfortable\n const contentRules: string[] = [\n `padding: ${padding}`,\n ]\n\n // Build the complete CSS rules\n return [\n `${containerSelector} {\\n ${rules.join(';\\n ')};\\n}`,\n `${mediaSelector} {\\n ${mediaRules.join(';\\n ')};\\n}`,\n `${contentSelector} {\\n ${contentRules.join(';\\n ')};\\n}`,\n ].join('\\n\\n')\n}\n","import { z } from 'zod';\n\n/**\n * Accordion icon styles for expand/collapse indicators\n */\nexport const accordionIconSchema = z.enum([\n 'plus-minus', // + becomes - (swap or rotate 90°)\n 'chevron', // › becomes ⌄ (rotate 90° or 180°)\n 'caret', // ▸ becomes ▾ (rotate 90° or 180°)\n 'arrow', // → becomes ↓ (rotate 90° or 180°)\n 'circle-plus-minus', // ⊕ becomes ⊖ (swap with fade)\n]);\n\nexport type AccordionIcon = z.infer<typeof accordionIconSchema>;\n\n/**\n * Accordion icon names used in ICON_CONFIG\n * These are the only Lucide icons bundled for accordions\n */\nexport type AccordionLucideIcon = 'Plus' | 'Minus' | 'ChevronDown' | 'ArrowDown' | 'CirclePlus' | 'CircleMinus';\n\n/**\n * Accordion configuration for a theme\n * Single style per theme (no variants needed)\n */\nexport const accordionSystemSchema = z.object({\n // Visual styling (solid color only - gradients can be added later if needed)\n background: z.object({\n type: z.literal('solid'),\n colorToken: z.string(),\n }),\n\n // Spacing (padding inside items)\n spacing: z.enum(['none', 'compact', 'cozy', 'medium', 'comfortable', 'spacious']),\n\n // Border radius (null = inherit from theme.corners)\n corners: z.enum(['square', 'soft', 'rounded', 'pill']).nullable(),\n\n // Border styling (null = inherit from theme.border)\n border: z.object({\n widthClass: z.string(), // e.g., 'border', 'border-2', 'border-0'\n colorToken: z.string(),\n }).nullable(),\n\n // Shadow (null = inherit from theme.shadow)\n shadow: z.object({\n elevation: z.enum(['none', 'low', 'medium', 'high']),\n softness: z.enum(['soft', 'crisp', 'hard']).nullable(),\n position: z.enum(['bottom', 'bottom-right']),\n }).nullable(),\n\n // Icon style and animation\n icon: z.object({\n style: accordionIconSchema,\n position: z.enum(['left', 'right']),\n size: z.enum(['sm', 'md', 'lg']),\n }),\n\n // Trigger (question) styling\n trigger: z.object({\n textColorToken: z.string(),\n fontWeight: z.enum(['regular', 'medium', 'semibold', 'bold']).nullable(), // null = inherit from theme\n }),\n\n // Hover state styling\n hover: z.object({\n backgroundColorToken: z.string().optional(),\n textColorToken: z.string().optional(),\n borderColorToken: z.string().optional(),\n scale: z.number().min(1.0).max(1.1).optional(), // e.g., 1.02 for subtle lift\n shadowElevation: z.enum(['low', 'medium', 'high']).optional(),\n }),\n\n // Content (answer) styling\n content: z.object({\n textColorToken: z.string(),\n }),\n});\n\nexport type AccordionSystem = z.infer<typeof accordionSystemSchema>;\n\n/**\n * Icon configuration mapping icon styles to Lucide icons and behavior\n * Used by both CSS generation (for rotation) and component rendering (for icon selection)\n */\nexport const ICON_CONFIG: Record<AccordionIcon, {\n closedIcon: AccordionLucideIcon;\n openIcon?: AccordionLucideIcon;\n rotation: 0 | 90 | 180; // Degrees to rotate icon on open (0 = swap instead of rotate)\n}> = {\n 'plus-minus': { closedIcon: 'Plus', openIcon: 'Minus', rotation: 0 },\n 'chevron': { closedIcon: 'ChevronDown', rotation: 180 },\n 'caret': { closedIcon: 'ChevronDown', rotation: 180 }, // Using ChevronDown as caret equivalent\n 'arrow': { closedIcon: 'ArrowDown', rotation: 180 },\n 'circle-plus-minus': { closedIcon: 'CirclePlus', openIcon: 'CircleMinus', rotation: 0 },\n};\n\n/**\n * Icon size mapping (px values for CSS and Lucide React)\n */\nexport const ICON_SIZE_PX: Record<AccordionSystem['icon']['size'], string> = {\n sm: '16px',\n md: '20px',\n lg: '24px',\n};\n\n/**\n * Spacing map for accordion content padding\n */\nexport const ACCORDION_SPACING_MAP: Record<AccordionSystem['spacing'], string> = {\n none: '0',\n compact: '0.75rem', // 12px\n cozy: '1rem', // 16px\n medium: '1.25rem', // 20px\n comfortable: '1.5rem', // 24px\n spacious: '2rem', // 32px\n};\n","/**\n * Border width mapping from Tailwind class names to px values\n * Used by CSS generators for cards, accordions, and other components\n */\nexport const BORDER_WIDTH_TO_PX: Record<string, string> = {\n 'border-0': '0',\n 'border': '1px',\n 'border-2': '2px',\n 'border-3': '3px',\n 'border-4': '4px',\n 'border-8': '8px',\n};\n\n/**\n * Parse a Tailwind border width class to px value\n * Falls back to 1px if class is not recognized\n */\nexport function parseBorderWidth(widthClass: string): string {\n return BORDER_WIDTH_TO_PX[widthClass] ?? '1px';\n}\n","import type { Theme } from '../schema';\nimport type { AccordionSystem } from './types';\nimport { ACCORDION_SPACING_MAP, ICON_CONFIG, ICON_SIZE_PX } from './types';\nimport { generateShadowValue } from '../buttons/constants';\nimport { parseBorderWidth } from '../styles/border';\n\n/**\n * Corner radius map (reused from card/button systems)\n */\nconst CORNER_MAP: Record<Theme['corners'], string> = {\n square: '0',\n soft: '0.5rem',\n rounded: '1rem',\n pill: '9999px',\n};\n\n/**\n * Generate CSS for accordion styling based on theme configuration\n *\n * Creates scoped CSS classes that apply theme-aware styling to accordions:\n * - .accordion-root: Container styles (background, border, corners, shadow)\n * - .accordion-item: Individual item borders\n * - .accordion-trigger: Question/trigger text styling\n * - .accordion-content: Answer/content text styling\n * - .accordion-icon: Icon sizing and transitions\n */\nexport function generateAccordionCss({\n themeId,\n theme,\n accordionSystem,\n}: {\n themeId: string;\n theme: Theme;\n accordionSystem: AccordionSystem;\n}): string {\n // Wrap scope selector in :where() for zero specificity\n const rootSelector = `:where([data-theme-scope=\"${themeId}\"]) .accordion-root`;\n const itemSelector = `${rootSelector} .accordion-item`;\n const triggerSelector = `${itemSelector} .accordion-trigger`;\n const contentSelector = `${itemSelector} .accordion-content`;\n const iconSelector = `${triggerSelector} .accordion-icon`;\n\n // === Root Container Styles ===\n const rootRules: string[] = [];\n\n // Background (solid color)\n rootRules.push(`background-color: rgb(var(--tb-${accordionSystem.background.colorToken}))`);\n\n\n // Border radius (use accordion setting or fall back to theme)\n const corners = accordionSystem.corners ?? theme.corners;\n const borderRadius = CORNER_MAP[corners];\n rootRules.push(`border-radius: ${borderRadius}`);\n\n // Border\n if (accordionSystem.border) {\n const borderPx = parseBorderWidth(accordionSystem.border.widthClass);\n rootRules.push(`border: ${borderPx} solid rgb(var(--tb-${accordionSystem.border.colorToken}))`);\n }\n\n // Shadow\n if (accordionSystem.shadow && accordionSystem.shadow.elevation !== 'none') {\n const shadowValue = generateShadowValue(\n accordionSystem.shadow.elevation,\n accordionSystem.shadow.softness ?? 'soft',\n accordionSystem.shadow.position\n );\n rootRules.push(`box-shadow: ${shadowValue}`);\n }\n\n rootRules.push('overflow: hidden');\n\n // === Item Styles ===\n const itemRules: string[] = [];\n\n // Bottom border between items\n if (accordionSystem.border) {\n itemRules.push(`border-bottom: 1px solid rgb(var(--tb-${accordionSystem.border.colorToken}))`);\n } else {\n itemRules.push(`border-bottom: 1px solid rgb(var(--tb-border))`);\n }\n\n // Remove border from last item\n const lastItemSelector = `${itemSelector}:last-child`;\n const lastItemRules = ['border-bottom: none'];\n\n // === Trigger (Question) Styles ===\n const triggerRules: string[] = [];\n\n const padding = ACCORDION_SPACING_MAP[accordionSystem.spacing];\n triggerRules.push(`padding: ${padding}`);\n triggerRules.push(`color: rgb(var(--tb-${accordionSystem.trigger.textColorToken}))`);\n\n // Font weight (inherit from theme if not specified)\n if (accordionSystem.trigger.fontWeight) {\n const fontWeightMap = {\n regular: '400',\n medium: '500',\n semibold: '600',\n bold: '700',\n };\n triggerRules.push(`font-weight: ${fontWeightMap[accordionSystem.trigger.fontWeight]}`);\n }\n\n // Essential structural/layout properties\n triggerRules.push('cursor: pointer');\n triggerRules.push('display: flex');\n triggerRules.push('flex: 1');\n triggerRules.push('align-items: center');\n triggerRules.push('justify-content: space-between');\n triggerRules.push('width: 100%');\n triggerRules.push('text-align: left');\n triggerRules.push('gap: 1rem');\n\n // Focus styles (accessibility)\n triggerRules.push('outline: none');\n\n // Build transition properties based on what hover effects are configured\n const transitionProps: string[] = ['color 0.2s ease'];\n if (accordionSystem.hover.backgroundColorToken) {\n transitionProps.push('background-color 0.2s ease');\n }\n if (accordionSystem.hover.borderColorToken) {\n transitionProps.push('border-color 0.2s ease');\n }\n if (accordionSystem.hover.scale) {\n transitionProps.push('transform 0.2s ease');\n }\n if (accordionSystem.hover.shadowElevation) {\n transitionProps.push('box-shadow 0.2s ease');\n }\n triggerRules.push(`transition: ${transitionProps.join(', ')}`);\n\n // === Hover State ===\n const triggerHoverSelector = `${triggerSelector}:hover`;\n const triggerHoverRules: string[] = [];\n\n if (accordionSystem.hover.backgroundColorToken) {\n triggerHoverRules.push(`background-color: rgb(var(--tb-${accordionSystem.hover.backgroundColorToken}))`);\n }\n\n if (accordionSystem.hover.textColorToken) {\n triggerHoverRules.push(`color: rgb(var(--tb-${accordionSystem.hover.textColorToken}))`);\n }\n\n if (accordionSystem.hover.borderColorToken) {\n triggerHoverRules.push(`border-color: rgb(var(--tb-${accordionSystem.hover.borderColorToken}))`);\n }\n\n if (accordionSystem.hover.scale) {\n triggerHoverRules.push(`transform: scale(${accordionSystem.hover.scale})`);\n }\n\n if (accordionSystem.hover.shadowElevation) {\n const hoverShadowValue = generateShadowValue(\n accordionSystem.hover.shadowElevation,\n accordionSystem.shadow?.softness ?? 'soft',\n accordionSystem.shadow?.position ?? 'bottom'\n );\n triggerHoverRules.push(`box-shadow: ${hoverShadowValue}`);\n }\n\n // === Focus-Visible State (Accessibility) ===\n const triggerFocusSelector = `${triggerSelector}:focus-visible`;\n const triggerFocusRules: string[] = [];\n triggerFocusRules.push('outline: 2px solid rgb(var(--tb-primary))');\n triggerFocusRules.push('outline-offset: 2px');\n\n // === Content (Answer) Styles ===\n const contentRules: string[] = [];\n\n contentRules.push('overflow: hidden'); // Required for Radix accordion animation\n contentRules.push(`padding: 0 ${padding} ${padding} ${padding}`);\n contentRules.push(`color: rgb(var(--tb-${accordionSystem.content.textColorToken}))`);\n\n // === Icon Styles ===\n const iconRules: string[] = [];\n\n // Icon size based on configuration\n const iconSize = ICON_SIZE_PX[accordionSystem.icon.size];\n iconRules.push(`width: ${iconSize}`);\n iconRules.push(`height: ${iconSize}`);\n iconRules.push('flex-shrink: 0');\n iconRules.push('display: inline-flex');\n iconRules.push('align-items: center');\n iconRules.push('justify-content: center');\n\n const iconConfig = ICON_CONFIG[accordionSystem.icon.style];\n\n // Icon behavior: swap (show/hide different icons) vs rotate (transform single icon)\n const iconSwapBlocks: string[] = [];\n const iconRotateBlock: string[] = [];\n\n if (iconConfig.openIcon) {\n // Swap pattern: Show closed icon by default, hide open icon\n const iconClosedSelector = `${iconSelector} .accordion-icon-closed`;\n const iconOpenHiddenSelector = `${iconSelector} .accordion-icon-open`;\n const itemOpenIconClosedSelector = `[data-state=\"open\"] ${iconSelector} .accordion-icon-closed`;\n const itemOpenIconOpenSelector = `[data-state=\"open\"] ${iconSelector} .accordion-icon-open`;\n\n iconSwapBlocks.push(`${iconClosedSelector} {\\n display: block;\\n transition: opacity 0.2s ease;\\n}`);\n iconSwapBlocks.push(`${iconOpenHiddenSelector} {\\n display: none;\\n}`);\n iconSwapBlocks.push(`${itemOpenIconClosedSelector} {\\n display: none;\\n}`);\n iconSwapBlocks.push(`${itemOpenIconOpenSelector} {\\n display: block;\\n}`);\n } else {\n // Rotate pattern: Single icon that rotates\n iconRules.push('transition: transform 0.2s ease');\n\n if (iconConfig.rotation > 0) {\n const iconOpenSelector = `[data-state=\"open\"] ${iconSelector}`;\n const iconOpenRules: string[] = [];\n iconOpenRules.push(`transform: rotate(${iconConfig.rotation}deg)`);\n iconRotateBlock.push(`${iconOpenSelector} {\\n ${iconOpenRules.join(';\\n ')};\\n}`);\n }\n }\n\n // Build the complete CSS\n const cssBlocks: string[] = [];\n\n cssBlocks.push(`${rootSelector} {\\n ${rootRules.join(';\\n ')};\\n}`);\n cssBlocks.push(`${itemSelector} {\\n ${itemRules.join(';\\n ')};\\n}`);\n cssBlocks.push(`${lastItemSelector} {\\n ${lastItemRules.join(';\\n ')};\\n}`);\n cssBlocks.push(`${triggerSelector} {\\n ${triggerRules.join(';\\n ')};\\n}`);\n\n if (triggerHoverRules.length > 0) {\n cssBlocks.push(`${triggerHoverSelector} {\\n ${triggerHoverRules.join(';\\n ')};\\n}`);\n }\n\n if (triggerFocusRules.length > 0) {\n cssBlocks.push(`${triggerFocusSelector} {\\n ${triggerFocusRules.join(';\\n ')};\\n}`);\n }\n\n cssBlocks.push(`${contentSelector} {\\n ${contentRules.join(';\\n ')};\\n}`);\n cssBlocks.push(`${iconSelector} {\\n ${iconRules.join(';\\n ')};\\n}`);\n\n // Add icon swap or rotate rules\n if (iconSwapBlocks.length > 0) {\n cssBlocks.push(...iconSwapBlocks);\n }\n if (iconRotateBlock.length > 0) {\n cssBlocks.push(...iconRotateBlock);\n }\n\n return cssBlocks.join('\\n\\n');\n}\n","import type { Theme } from '../schema';\nimport type { AccordionSystem } from './types';\n\n/**\n * Generate default accordion system based on theme configuration\n *\n * Creates a single accordion style that harmonizes with the theme's\n * visual language (spacing, borders, shadows, colors).\n */\nexport function generateDefaultAccordionSystem(theme: Theme): AccordionSystem {\n const { axes, space, border, shadow } = theme;\n\n // Determine icon style based on theme tone\n let iconStyle: AccordionSystem['icon']['style'];\n if (axes.tone === 'bold') {\n iconStyle = 'plus-minus'; // Bold, clear icon\n } else if (axes.tone === 'minimal') {\n iconStyle = 'chevron'; // Subtle, modern\n } else {\n iconStyle = 'chevron'; // Default for most themes\n }\n\n // Icon position: always right (most common pattern)\n const iconPosition: AccordionSystem['icon']['position'] = 'right';\n\n // Determine icon size based on theme density\n const iconSize: AccordionSystem['icon']['size'] =\n axes.density === 'airy' ? 'md' :\n axes.density === 'compact' ? 'sm' : 'md';\n\n // Determine spacing based on theme space setting\n const spacing: AccordionSystem['spacing'] =\n space === 'comfortable' ? 'comfortable' :\n space === 'standard' ? 'medium' :\n space === 'dense' ? 'compact' : 'medium';\n\n // Determine font weight based on tone\n const fontWeight: AccordionSystem['trigger']['fontWeight'] =\n axes.tone === 'bold' ? 'bold' :\n axes.tone === 'minimal' ? 'medium' :\n 'semibold';\n\n // For high conversion sites, use more prominent styling\n const useBorder = axes.conversionBias === 'high' || border.width !== 'none';\n const useShadow = axes.conversionBias === 'high' || shadow.elevation !== 'none';\n\n return {\n background: {\n type: 'solid',\n colorToken: 'surface',\n },\n\n spacing,\n\n // Inherit theme corners unless theme is bold (then force square)\n corners: axes.tone === 'bold' ? 'square' : null,\n\n // Use border if theme has borders or conversion bias is high\n border: useBorder ? {\n widthClass: border.width === 'thick' ? 'border-2' : 'border',\n colorToken: 'border',\n } : null,\n\n // Use shadow if theme has shadows or conversion bias is high\n shadow: useShadow ? {\n elevation: shadow.elevation === 'none' ? 'low' : shadow.elevation,\n softness: shadow.softness === 'crisp' || shadow.softness === null ? 'soft' : shadow.softness,\n position: shadow.position,\n } : null,\n\n icon: {\n style: iconStyle,\n position: iconPosition,\n size: iconSize,\n },\n\n trigger: {\n textColorToken: 'text',\n fontWeight,\n },\n\n // Hover effects based on theme axes\n hover: generateHoverEffects(axes, space),\n\n content: {\n textColorToken: 'neutral-700',\n },\n };\n}\n\n/**\n * Generate hover effects based on theme characteristics\n *\n * Strategy:\n * - Minimal/calm themes: subtle text color change only\n * - Bold/vibrant themes: background + text color\n * - High conversion themes: background + shadow elevation\n */\nfunction generateHoverEffects(\n axes: Theme['axes'],\n _space: Theme['space']\n): AccordionSystem['hover'] {\n const { tone, energy, conversionBias } = axes;\n\n // Minimal themes: just text color change\n if (tone === 'minimal' && energy === 'calm') {\n return {\n textColorToken: 'primary',\n };\n }\n\n // Bold or high-conversion themes: background + optional shadow\n if (tone === 'bold' || conversionBias === 'high') {\n return {\n backgroundColorToken: 'primary/10',\n textColorToken: 'primary',\n shadowElevation: conversionBias === 'high' ? 'low' : undefined,\n };\n }\n\n // Vibrant themes: background + scale\n if (energy === 'vibrant') {\n return {\n backgroundColorToken: 'primary/5',\n textColorToken: 'primary',\n scale: 1.01,\n };\n }\n\n // Default: subtle background change\n return {\n backgroundColorToken: 'primary/5',\n textColorToken: 'primary',\n };\n}\n","import { z } from 'zod';\n\n/**\n * Input styling configuration for a theme\n *\n * Provides comprehensive control over form input appearance including:\n * - Base styling (background, borders, spacing)\n * - Label styling\n * - Focus, error, and disabled states\n *\n * Single configuration per theme (no variants needed for inputs)\n */\nexport const inputSystemSchema = z.object({\n // Base styling (applied to all inputs)\n base: z.object({\n background: z.object({\n type: z.literal('solid'),\n colorToken: z.string(),\n }),\n textColorToken: z.string(),\n border: z.object({\n widthClass: z.string(), // e.g., 'border', 'border-2'\n colorToken: z.string(),\n }),\n corners: z.enum(['square', 'soft', 'rounded', 'pill']).nullable(), // null = inherit from theme.corners\n shadow: z.object({\n elevation: z.enum(['none', 'low', 'medium']),\n softness: z.enum(['soft', 'crisp', 'hard']).nullable(),\n }).nullable(),\n spacing: z.enum(['compact', 'cozy', 'medium', 'comfortable']), // padding inside inputs\n fontSize: z.enum(['sm', 'base', 'lg']),\n }),\n\n // Label styling\n label: z.object({\n textColorToken: z.string(),\n fontWeight: z.enum(['regular', 'medium', 'semibold', 'bold']),\n fontSize: z.enum(['xs', 'sm', 'base']),\n }),\n\n // Focus state\n focus: z.object({\n ringColorToken: z.string(),\n ringWidth: z.enum(['1', '2', '3']),\n borderColorToken: z.string().optional(), // Change border color on focus\n }),\n\n // Error state (for validation feedback)\n error: z.object({\n borderColorToken: z.string(),\n textColorToken: z.string(),\n }),\n\n // Disabled state\n disabled: z.object({\n backgroundColorToken: z.string(),\n textColorToken: z.string(),\n opacity: z.number().min(0.3).max(0.7),\n }),\n});\n\nexport type InputSystem = z.infer<typeof inputSystemSchema>;\n\n/**\n * Spacing map for input padding\n */\nexport const INPUT_SPACING_MAP: Record<InputSystem['base']['spacing'], string> = {\n compact: '0.5rem 0.75rem', // py-2 px-3\n cozy: '0.625rem 0.875rem', // py-2.5 px-3.5\n medium: '0.75rem 1rem', // py-3 px-4\n comfortable: '0.875rem 1.25rem', // py-3.5 px-5\n};\n\n/**\n * Font size map for inputs\n */\nexport const INPUT_FONT_SIZE_MAP: Record<InputSystem['base']['fontSize'], string> = {\n sm: '0.875rem', // 14px\n base: '1rem', // 16px\n lg: '1.125rem', // 18px\n};\n\n/**\n * Label font size map\n */\nexport const LABEL_FONT_SIZE_MAP: Record<InputSystem['label']['fontSize'], string> = {\n xs: '0.75rem', // 12px\n sm: '0.875rem', // 14px\n base: '1rem', // 16px\n};\n\n/**\n * Font weight map\n */\nexport const FONT_WEIGHT_MAP: Record<InputSystem['label']['fontWeight'], string> = {\n regular: '400',\n medium: '500',\n semibold: '600',\n bold: '700',\n};\n","import type { Theme } from '../schema';\nimport type { InputSystem } from './types';\nimport {\n INPUT_SPACING_MAP,\n INPUT_FONT_SIZE_MAP,\n LABEL_FONT_SIZE_MAP,\n FONT_WEIGHT_MAP,\n} from './types';\nimport { generateShadowValue } from '../buttons/constants';\nimport { parseBorderWidth } from '../styles/border';\n\n/**\n * Corner radius map (reused from other systems)\n */\nconst CORNER_MAP: Record<Theme['corners'], string> = {\n square: '0',\n soft: '0.5rem',\n rounded: '1rem',\n pill: '9999px',\n};\n\n/**\n * Generate CSS for form input styling based on theme configuration\n *\n * Creates scoped CSS classes that apply theme-aware styling to form inputs:\n * - .form-label: Label styling\n * - .form-input: Text inputs (text, email, url, tel, number)\n * - .form-textarea: Textarea styling\n * - .form-select: Select dropdown styling\n * - .form-checkbox: Checkbox styling\n * - .form-radio: Radio button styling\n * - Focus states (:focus-visible)\n * - Error states ([aria-invalid=\"true\"])\n * - Disabled states (:disabled)\n */\nexport function generateInputCss({\n themeId,\n theme,\n inputSystem,\n}: {\n themeId: string;\n theme: Theme;\n inputSystem: InputSystem;\n}): string {\n const rootSelector = `:where([data-theme-scope=\"${themeId}\"])`;\n\n // === Shared Input Styles ===\n const baseInputRules: string[] = [];\n\n // Background\n baseInputRules.push(`background-color: rgb(var(--tb-${inputSystem.base.background.colorToken}))`);\n\n // Text color\n baseInputRules.push(`color: rgb(var(--tb-${inputSystem.base.textColorToken}))`);\n\n // Border\n const borderPx = parseBorderWidth(inputSystem.base.border.widthClass);\n baseInputRules.push(`border: ${borderPx} solid rgb(var(--tb-${inputSystem.base.border.colorToken}))`);\n\n // Corner radius\n const corners = inputSystem.base.corners ?? theme.corners;\n const borderRadius = CORNER_MAP[corners];\n baseInputRules.push(`border-radius: ${borderRadius}`);\n\n // Shadow\n if (inputSystem.base.shadow && inputSystem.base.shadow.elevation !== 'none') {\n const shadowValue = generateShadowValue(\n inputSystem.base.shadow.elevation,\n inputSystem.base.shadow.softness ?? 'soft',\n 'bottom'\n );\n baseInputRules.push(`box-shadow: ${shadowValue}`);\n }\n\n // Padding\n const padding = INPUT_SPACING_MAP[inputSystem.base.spacing];\n baseInputRules.push(`padding: ${padding}`);\n\n // Font size\n const fontSize = INPUT_FONT_SIZE_MAP[inputSystem.base.fontSize];\n baseInputRules.push(`font-size: ${fontSize}`);\n\n // Essential structural properties\n baseInputRules.push('width: 100%');\n baseInputRules.push('outline: none');\n baseInputRules.push('transition: border-color 0.2s ease, box-shadow 0.2s ease');\n\n // === Label Styles ===\n const labelSelector = `${rootSelector} .form-label`;\n const labelRules: string[] = [];\n\n labelRules.push(`color: rgb(var(--tb-${inputSystem.label.textColorToken}))`);\n labelRules.push(`font-weight: ${FONT_WEIGHT_MAP[inputSystem.label.fontWeight]}`);\n labelRules.push(`font-size: ${LABEL_FONT_SIZE_MAP[inputSystem.label.fontSize]}`);\n labelRules.push('display: block');\n labelRules.push('margin-bottom: 0.25rem');\n\n // === Text Input Styles ===\n const inputSelector = `${rootSelector} .form-input`;\n const inputRules = [...baseInputRules];\n\n // === Textarea Styles ===\n const textareaSelector = `${rootSelector} .form-textarea`;\n const textareaRules = [...baseInputRules];\n textareaRules.push('resize: vertical');\n textareaRules.push('min-height: 5rem');\n\n // === Select Styles ===\n const selectSelector = `${rootSelector} .form-select`;\n const selectRules = [...baseInputRules];\n selectRules.push('appearance: none');\n selectRules.push('background-image: url(\"data:image/svg+xml,%3csvg xmlns=\\'http://www.w3.org/2000/svg\\' fill=\\'none\\' viewBox=\\'0 0 20 20\\'%3e%3cpath stroke=\\'%236b7280\\' stroke-linecap=\\'round\\' stroke-linejoin=\\'round\\' stroke-width=\\'1.5\\' d=\\'M6 8l4 4 4-4\\'/%3e%3c/svg%3e\")');\n selectRules.push('background-position: right 0.5rem center');\n selectRules.push('background-repeat: no-repeat');\n selectRules.push('background-size: 1.5em 1.5em');\n selectRules.push('padding-right: 2.5rem');\n\n // === Focus State (all inputs) ===\n const focusSelectors = [\n `${inputSelector}:focus-visible`,\n `${textareaSelector}:focus-visible`,\n `${selectSelector}:focus-visible`,\n ];\n const focusRules: string[] = [];\n\n focusRules.push('outline: none');\n focusRules.push(`box-shadow: 0 0 0 ${inputSystem.focus.ringWidth}px rgb(var(--tb-${inputSystem.focus.ringColorToken}))`);\n\n if (inputSystem.focus.borderColorToken) {\n focusRules.push(`border-color: rgb(var(--tb-${inputSystem.focus.borderColorToken}))`);\n }\n\n // === Error State (all inputs) ===\n const errorSelectors = [\n `${inputSelector}[aria-invalid=\"true\"]`,\n `${textareaSelector}[aria-invalid=\"true\"]`,\n `${selectSelector}[aria-invalid=\"true\"]`,\n ];\n const errorRules: string[] = [];\n\n errorRules.push(`border-color: rgb(var(--tb-${inputSystem.error.borderColorToken}))`);\n errorRules.push(`color: rgb(var(--tb-${inputSystem.error.textColorToken}))`);\n\n // === Disabled State (all inputs) ===\n const disabledSelectors = [\n `${inputSelector}:disabled`,\n `${textareaSelector}:disabled`,\n `${selectSelector}:disabled`,\n ];\n const disabledRules: string[] = [];\n\n disabledRules.push(`background-color: rgb(var(--tb-${inputSystem.disabled.backgroundColorToken}))`);\n disabledRules.push(`color: rgb(var(--tb-${inputSystem.disabled.textColorToken}))`);\n disabledRules.push(`opacity: ${inputSystem.disabled.opacity}`);\n disabledRules.push('cursor: not-allowed');\n\n // === Checkbox and Radio Styles ===\n const checkboxSelector = `${rootSelector} .form-checkbox`;\n const radioSelector = `${rootSelector} .form-radio`;\n const checkableRules: string[] = [];\n\n checkableRules.push('appearance: none');\n checkableRules.push('width: 1rem');\n checkableRules.push('height: 1rem');\n checkableRules.push('flex-shrink: 0');\n checkableRules.push(`border: ${borderPx} solid rgb(var(--tb-${inputSystem.base.border.colorToken}))`);\n checkableRules.push(`background-color: rgb(var(--tb-${inputSystem.base.background.colorToken}))`);\n checkableRules.push('cursor: pointer');\n checkableRules.push('transition: background-color 0.2s ease, border-color 0.2s ease');\n\n // Checkbox specific (square)\n const checkboxSpecificRules = [...checkableRules];\n checkboxSpecificRules.push(`border-radius: ${CORNER_MAP.soft}`);\n\n // Radio specific (circle)\n const radioSpecificRules = [...checkableRules];\n radioSpecificRules.push('border-radius: 9999px');\n\n // Checked state for checkbox\n const checkboxCheckedSelector = `${checkboxSelector}:checked`;\n const checkboxCheckedRules: string[] = [];\n checkboxCheckedRules.push(`background-color: rgb(var(--tb-${inputSystem.focus.ringColorToken}))`);\n checkboxCheckedRules.push(`border-color: rgb(var(--tb-${inputSystem.focus.ringColorToken}))`);\n checkboxCheckedRules.push('background-image: url(\"data:image/svg+xml,%3csvg viewBox=\\'0 0 16 16\\' fill=\\'white\\' xmlns=\\'http://www.w3.org/2000/svg\\'%3e%3cpath d=\\'M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z\\'/%3e%3c/svg%3e\")');\n checkboxCheckedRules.push('background-size: 100% 100%');\n checkboxCheckedRules.push('background-position: center');\n checkboxCheckedRules.push('background-repeat: no-repeat');\n\n // Checked state for radio\n const radioCheckedSelector = `${radioSelector}:checked`;\n const radioCheckedRules: string[] = [];\n radioCheckedRules.push(`background-color: rgb(var(--tb-${inputSystem.focus.ringColorToken}))`);\n radioCheckedRules.push(`border-color: rgb(var(--tb-${inputSystem.focus.ringColorToken}))`);\n radioCheckedRules.push('background-image: radial-gradient(circle, white 40%, transparent 40%)');\n\n // Focus state for checkbox/radio\n const checkboxFocusSelector = `${checkboxSelector}:focus-visible`;\n const radioFocusSelector = `${radioSelector}:focus-visible`;\n const checkableFocusRules: string[] = [];\n checkableFocusRules.push('outline: none');\n checkableFocusRules.push(`box-shadow: 0 0 0 ${inputSystem.focus.ringWidth}px rgb(var(--tb-${inputSystem.focus.ringColorToken}))`);\n\n // Build the complete CSS\n const cssBlocks: string[] = [];\n\n cssBlocks.push(`${labelSelector} {\\n ${labelRules.join(';\\n ')};\\n}`);\n cssBlocks.push(`${inputSelector} {\\n ${inputRules.join(';\\n ')};\\n}`);\n cssBlocks.push(`${textareaSelector} {\\n ${textareaRules.join(';\\n ')};\\n}`);\n cssBlocks.push(`${selectSelector} {\\n ${selectRules.join(';\\n ')};\\n}`);\n cssBlocks.push(`${focusSelectors.join(',\\n')} {\\n ${focusRules.join(';\\n ')};\\n}`);\n cssBlocks.push(`${errorSelectors.join(',\\n')} {\\n ${errorRules.join(';\\n ')};\\n}`);\n cssBlocks.push(`${disabledSelectors.join(',\\n')} {\\n ${disabledRules.join(';\\n ')};\\n}`);\n cssBlocks.push(`${checkboxSelector} {\\n ${checkboxSpecificRules.join(';\\n ')};\\n}`);\n cssBlocks.push(`${radioSelector} {\\n ${radioSpecificRules.join(';\\n ')};\\n}`);\n cssBlocks.push(`${checkboxCheckedSelector} {\\n ${checkboxCheckedRules.join(';\\n ')};\\n}`);\n cssBlocks.push(`${radioCheckedSelector} {\\n ${radioCheckedRules.join(';\\n ')};\\n}`);\n cssBlocks.push(`${checkboxFocusSelector},\\n${radioFocusSelector} {\\n ${checkableFocusRules.join(';\\n ')};\\n}`);\n\n return cssBlocks.join('\\n\\n');\n}\n","import type { Theme } from '../schema';\nimport type { InputSystem } from './types';\n\n/**\n * Generate default input system based on theme configuration\n *\n * Creates input styling that harmonizes with the theme's visual language:\n * - Spacing adapts to theme density\n * - Border thickness matches theme border style\n * - Focus states reflect theme energy level\n * - Colors coordinate with theme palette\n */\nexport function generateDefaultInputSystem(theme: Theme): InputSystem {\n const { axes, space, border, shadow } = theme;\n\n // Determine spacing based on theme space/density\n let spacing: InputSystem['base']['spacing'];\n if (axes.density === 'compact') {\n spacing = 'compact';\n } else if (axes.density === 'airy') {\n spacing = 'comfortable';\n } else if (space === 'comfortable') {\n spacing = 'comfortable';\n } else if (space === 'dense') {\n spacing = 'compact';\n } else {\n spacing = 'medium';\n }\n\n // Determine font size based on theme density and readability\n let fontSize: InputSystem['base']['fontSize'];\n if (axes.density === 'compact') {\n fontSize = 'sm';\n } else if (axes.density === 'airy') {\n fontSize = 'lg';\n } else {\n fontSize = 'base';\n }\n\n // Determine border width based on theme border style\n let borderWidthClass: string;\n if (border.width === 'thick') {\n borderWidthClass = 'border-2';\n } else if (border.width === 'thin') {\n borderWidthClass = 'border';\n } else {\n borderWidthClass = 'border';\n }\n\n // Determine corner radius (null = inherit from theme)\n const inputCorners: InputSystem['base']['corners'] =\n axes.tone === 'bold' ? 'square' : null;\n\n // Determine shadow (inputs usually have subtle or no shadow)\n const inputShadow: InputSystem['base']['shadow'] =\n shadow.elevation !== 'none' && axes.conversionBias === 'high'\n ? { elevation: 'low', softness: shadow.softness }\n : null;\n\n // Label styling based on theme tone\n let labelFontWeight: InputSystem['label']['fontWeight'];\n if (axes.tone === 'bold') {\n labelFontWeight = 'semibold';\n } else if (axes.tone === 'minimal') {\n labelFontWeight = 'regular';\n } else {\n labelFontWeight = 'medium';\n }\n\n const labelFontSize: InputSystem['label']['fontSize'] =\n axes.density === 'compact' ? 'xs' : 'sm';\n\n // Focus ring based on theme energy\n let focusRingWidth: InputSystem['focus']['ringWidth'];\n if (axes.energy === 'vibrant' || axes.conversionBias === 'high') {\n focusRingWidth = '2';\n } else {\n focusRingWidth = '1';\n }\n\n return {\n base: {\n background: {\n type: 'solid',\n colorToken: 'surface',\n },\n textColorToken: 'text',\n border: {\n widthClass: borderWidthClass,\n colorToken: 'border',\n },\n corners: inputCorners,\n shadow: inputShadow,\n spacing,\n fontSize,\n },\n\n label: {\n textColorToken: 'text',\n fontWeight: labelFontWeight,\n fontSize: labelFontSize,\n },\n\n focus: {\n ringColorToken: 'primary',\n ringWidth: focusRingWidth,\n borderColorToken: 'primary', // Change border color on focus\n },\n\n error: {\n borderColorToken: 'error',\n textColorToken: 'error',\n },\n\n disabled: {\n backgroundColorToken: 'neutral-100',\n textColorToken: 'neutral-400',\n opacity: 0.6,\n },\n };\n}\n","import type {\n Theme,\n ThemeHeader,\n LogoStyle,\n HeaderContainer,\n} from '../schema'\nimport { TokenResolver } from '../tokens/resolver'\n\nexport interface GenerateHeaderCssOptions {\n themeId: string\n theme: Theme\n}\n\n/**\n * Generate complete CSS for header system from theme config\n *\n * Similar to button system - generates theme-scoped CSS using [data-theme-scope] selector\n */\nexport function generateHeaderCss(options: GenerateHeaderCssOptions): string {\n const { themeId, theme } = options\n const tokens = new TokenResolver(theme)\n const header = theme.header\n\n const cssChunks: string[] = []\n\n // Generate root header styles\n cssChunks.push(generateHeaderRootStyles(header, themeId, tokens, theme))\n\n // Generate logo styles\n if (header.logo) {\n cssChunks.push(generateLogoStyles(header.logo, themeId, tokens))\n }\n\n // Generate nav link styles\n cssChunks.push(generateNavLinkStyles(header, themeId, tokens))\n\n // Generate floating container styles\n if (header.variant === 'floating' && header.container) {\n cssChunks.push(generateFloatingContainerStyles(header.container, themeId, tokens))\n }\n\n // Generate nav container styles\n cssChunks.push(generateNavContainerStyles(header, themeId, tokens))\n\n\n return cssChunks.filter(Boolean).join('\\n\\n')\n}\n\n// Export for testing\nexport const _testExports = {\n generateHeaderRootStyles\n}\n\n/**\n * Generate root header container styles\n */\nfunction generateHeaderRootStyles(\n header: ThemeHeader,\n themeId: string,\n tokens: TokenResolver,\n _theme: Theme\n): string {\n const selector = `:where([data-theme-scope=\"${themeId}\"]) .header-root`\n const rules: string[] = []\n\n // Check if we should skip root styles (for contained nav)\n const navContainerType = header.navContainer?.type ?? 'none'\n const isContainedNav = navContainerType === 'pill' || navContainerType === 'glass'\n\n if (isContainedNav) {\n // For contained nav, we want the root to be transparent\n // We might still want positioning styles, but definitely not background/border\n } else {\n // Background\n const bg = header.background\n if (bg.type === 'color') {\n const bgColor = tokens.getColor(bg.color || 'surface')\n rules.push(`background-color: ${bgColor};`)\n } else if (bg.type === 'gradient' && bg.gradient) {\n // Generate gradient CSS\n const stops = bg.gradient.stops.map(s => tokens.getColor(s.color)).join(', ')\n const angle = bg.gradient.angle ?? 180 // default to 180deg (top to bottom)\n rules.push(`background-image: linear-gradient(${angle}deg, ${stops});`)\n }\n\n // Backdrop blur\n // Only apply if not transparent variant? Or always?\n // The user wants \"transparent\" variant to be truly transparent.\n // If variant is transparent, we probably shouldn't apply blur either unless specified?\n // But for now, let's just stick to the contained nav fix.\n rules.push(`backdrop-filter: blur(12px);`)\n rules.push(`-webkit-backdrop-filter: blur(12px);`)\n\n // Border\n if (header.border) {\n const borderWidth = {\n 'none': '0',\n 'thin': '1px',\n 'medium': '2px',\n 'thick': '4px',\n }[header.border.width]\n\n if (borderWidth !== '0') {\n const borderToken = header.border?.color?.trim() || 'border'\n const borderColor = tokens.getColor(borderToken)\n const borderStyle = header.border.style === 'dashed' ? 'dashed' : 'solid'\n\n if (header.border.position === 'bottom') {\n rules.push(`border-bottom: ${borderWidth} ${borderStyle} ${borderColor};`)\n } else if (header.border.position === 'top') {\n rules.push(`border-top: ${borderWidth} ${borderStyle} ${borderColor};`)\n } else if (header.border.position === 'both') {\n rules.push(`border-top: ${borderWidth} ${borderStyle} ${borderColor};`)\n rules.push(`border-bottom: ${borderWidth} ${borderStyle} ${borderColor};`)\n }\n }\n }\n }\n\n // Positioning-specific styles\n if (header.positioning === 'sticky') {\n rules.push(`box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1);`)\n }\n\n return `\\n${selector} {\\n ${rules.join('\\n ')}\\n}\\n`\n}\n\n/**\n * Generate logo typography styles\n */\nfunction generateLogoStyles(logo: LogoStyle | undefined, themeId: string, tokens: TokenResolver): string {\n if (!logo) return ''\n\n const selector = `:where([data-theme-scope=\"${themeId}\"]) .header-logo-text`\n const rules: string[] = []\n const primaryColor = tokens.getColor('primary')\n const accentColor = tokens.getColor('accent')\n\n // Font family\n if (logo.fontFamily === 'mono') {\n rules.push(`font-family: ui-monospace, monospace;`)\n } else if (logo.fontFamily === 'serif') {\n rules.push(`font-family: ui-serif, serif;`)\n }\n\n // Letter spacing\n if (logo.letterSpacing && logo.letterSpacing !== 'normal') {\n const spacingMap = {\n 'normal': '0em',\n 'wide': '0.05em',\n 'wider': '0.1em',\n 'widest': '0.15em',\n } as const\n rules.push(`letter-spacing: ${spacingMap[logo.letterSpacing]};`)\n }\n\n // Gradient text\n if (logo.gradient) {\n rules.push(`background: linear-gradient(to right, ${primaryColor}, ${accentColor});`)\n rules.push(`-webkit-background-clip: text;`)\n rules.push(`-webkit-text-fill-color: transparent;`)\n rules.push(`background-clip: text;`)\n rules.push(`color: transparent;`)\n }\n\n if (rules.length === 0) return ''\n\n return `\\n${selector} {\\n ${rules.join('\\n ')}\\n}\\n`\n}\n\n/**\n * Generate navigation link styles based on navStyle and effects\n */\nfunction generateNavLinkStyles(\n header: ThemeHeader,\n themeId: string,\n tokens: TokenResolver\n): string {\n const selector = `:where([data-theme-scope=\"${themeId}\"]) .header-nav-link`\n const hoverSelector = `${selector}:hover`\n const activeSelector = `${selector}[data-active=\"true\"]`\n\n const cssChunks: string[] = []\n const baseRules: string[] = []\n const hoverRules: string[] = []\n const activeRules: string[] = []\n const navContainerType = header.navContainer?.type ?? 'none'\n const usesGlassNavContainer = navContainerType === 'glass'\n const navColorToken = header.navColor?.trim()\n const primaryColor = tokens.getColor('primary')\n const navWeight = header.navWeight ?? 'medium'\n const navWeightMap = {\n regular: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n } as const\n\n if (navColorToken) {\n baseRules.push(`color: ${tokens.getColor(navColorToken)};`)\n }\n\n if (navWeight) {\n baseRules.push(`font-weight: ${navWeightMap[navWeight]};`)\n }\n\n // Add uppercase text transform for bold nav items (brutalist/block style)\n if (navWeight === 'bold' && header.navStyle === 'solid') {\n baseRules.push(`text-transform: uppercase;`)\n }\n\n // Base nav styles (from navStyle)\n switch (header.navStyle) {\n case 'minimal':\n baseRules.push(`transition: color 200ms ease;`)\n hoverRules.push(`color: ${primaryColor};`)\n activeRules.push(`color: ${primaryColor};`)\n break\n\n case 'underline':\n baseRules.push(`transition: all 200ms ease;`)\n hoverRules.push(`text-decoration: underline;`)\n hoverRules.push(`text-underline-offset: 4px;`)\n activeRules.push(`text-decoration: underline;`)\n activeRules.push(`text-underline-offset: 4px;`)\n break\n\n case 'underline-grow':\n baseRules.push(`position: relative;`)\n baseRules.push(`transition: color 200ms ease;`)\n hoverRules.push(`color: ${primaryColor};`)\n activeRules.push(`color: ${primaryColor};`)\n // Add ::after pseudo element CSS\n cssChunks.push(generateUnderlineGrowCSS(themeId))\n break\n\n case 'capsule':\n baseRules.push(`border-radius: 9999px;`)\n baseRules.push(`transition: background-color 200ms ease;`)\n hoverRules.push(`background-color: color-mix(in srgb, ${primaryColor} 10%, transparent);`)\n activeRules.push(`background-color: color-mix(in srgb, ${primaryColor} 15%, transparent);`)\n break\n\n case 'solid':\n baseRules.push(`border-radius: 0;`)\n baseRules.push(`transition: background-color 200ms ease, color 200ms ease;`)\n hoverRules.push(`background-color: ${primaryColor};`)\n // Preserve text color on hover to ensure contrast with solid background\n if (navColorToken) {\n hoverRules.push(`color: ${tokens.getColor(navColorToken)};`)\n }\n activeRules.push(`background-color: ${primaryColor};`)\n if (navColorToken) {\n activeRules.push(`color: ${tokens.getColor(navColorToken)};`)\n }\n break\n\n case 'scale':\n baseRules.push(`transition: all 200ms ease;`)\n hoverRules.push(`transform: scale(1.05);`)\n break\n\n case 'frosted':\n baseRules.push(`border-radius: 0.5rem;`)\n baseRules.push(`background-color: rgb(255 255 255 / 0.1);`)\n baseRules.push(`backdrop-filter: blur(8px);`)\n baseRules.push(`transition: background-color 200ms ease;`)\n hoverRules.push(`background-color: rgb(255 255 255 / 0.2);`)\n activeRules.push(`background-color: rgb(255 255 255 / 0.25);`)\n break\n }\n\n // Contained nav designs rely on the nav container for background treatment.\n if (usesGlassNavContainer && header.navStyle === 'minimal') {\n baseRules.push(`border-radius: 9999px;`)\n hoverRules.push(`background-color: rgba(255, 255, 255, 0.1);`)\n activeRules.push(`background-color: rgba(255, 255, 255, 0.18);`)\n hoverRules.push(`color: #fff;`)\n activeRules.push(`color: #fff;`)\n }\n\n // Apply nav effects\n if (header.navEffects) {\n if (header.navEffects.glow) {\n hoverRules.push(`filter: drop-shadow(0 0 5px currentColor);`)\n }\n\n if (header.navEffects.neumorphic) {\n console.log('[generateHeaderCss] Generating neumorphic styles for theme:', themeId);\n // Add base styles for neumorphic effect\n baseRules.push(`transition: all 200ms ease;`)\n baseRules.push(`border-radius: 0.5rem;`) // rounded-lg\n hoverRules.push(`box-shadow: inset 4px 4px 8px #c7c7c7, inset -4px -4px 8px #ffffff;`)\n hoverRules.push(`color: ${primaryColor};`) // hover:text-indigo-600 equivalent\n }\n\n if (header.navEffects.underlineGradient) {\n cssChunks.push(generateGradientUnderlineCSS(themeId, tokens))\n }\n }\n\n // Build CSS\n if (baseRules.length > 0) {\n cssChunks.push(`\\n${selector} {\\n ${baseRules.join('\\n ')}\\n}\\n`)\n }\n if (hoverRules.length > 0) {\n cssChunks.push(`\\n${hoverSelector} {\\n ${hoverRules.join('\\n ')}\\n}\\n`)\n }\n if (activeRules.length > 0) {\n cssChunks.push(`\\n${activeSelector} {\\n ${activeRules.join('\\n ')}\\n}\\n`)\n }\n\n return cssChunks.join('')\n}\n\n/**\n * Generate nav container styles (pill/glass)\n */\nfunction generateNavContainerStyles(\n header: ThemeHeader,\n themeId: string,\n tokens: TokenResolver\n): string {\n const navContainer = header.navContainer\n const navContainerType = navContainer?.type ?? 'none'\n if (!navContainer || navContainerType === 'none') return ''\n\n const selector = `:where([data-theme-scope=\"${themeId}\"]) .header-nav-row`\n const rules: string[] = []\n\n if (navContainerType === 'pill' || navContainerType === 'glass') {\n rules.push('padding: 0.5rem 0.75rem;') // px-3 py-2\n rules.push('border-radius: 9999px;') // rounded-full\n rules.push('display: inline-flex;')\n rules.push('align-items: center;')\n rules.push('gap: 1.5rem;') // gap-6\n }\n\n if (navContainerType === 'glass') {\n const opacity = clampOpacity(navContainer.opacity, 0.15)\n const background = navContainer.tint\n ? buildTint(tokens.getColor(navContainer.tint), opacity)\n : buildRgbWhite(opacity)\n\n rules.push(`background-color: ${background};`)\n rules.push('backdrop-filter: blur(12px);')\n rules.push('-webkit-backdrop-filter: blur(12px);')\n rules.push('border: 1px solid rgba(255, 255, 255, 0.2);')\n rules.push('box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);')\n } else if (navContainerType === 'pill') {\n const opacity = clampOpacity(navContainer.opacity, 0.15)\n if (navContainer.tint) {\n rules.push(`background-color: ${buildTint(tokens.getColor(navContainer.tint), opacity)};`)\n } else {\n rules.push(`background-color: ${tokens.getColor('surface')};`)\n }\n rules.push(`border: 1px solid ${tokens.getColor('border')};`)\n }\n\n if (rules.length > 0) {\n return `${selector} { ${rules.join(' ')} }`\n }\n\n return ''\n}\n\n/**\n * Generate gradient underline effect using CSS variables\n */\nfunction generateGradientUnderlineCSS(themeId: string, tokens: TokenResolver): string {\n const selector = `:where([data-theme-scope=\"${themeId}\"]) .header-nav-link`\n const primaryColor = tokens.getColor('primary')\n const accentColor = tokens.getColor('accent')\n\n return `\n${selector}::after {\n content: '';\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 2px;\n background: linear-gradient(to right, ${primaryColor}, ${accentColor});\n transform: scaleX(0);\n transform-origin: center;\n transition: transform 0.3s ease;\n}\n\n${selector}:hover::after,\n${selector}[data-active=\"true\"]::after {\n transform: scaleX(1);\n}\n `.trim()\n}\n\n/**\n * Generate underline-grow effect\n */\nfunction generateUnderlineGrowCSS(themeId: string): string {\n const selector = `:where([data-theme-scope=\"${themeId}\"]) .header-nav-link`\n\n return `\n${selector}::after {\n content: '';\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 2px;\n background: currentColor;\n transform: scaleX(0);\n transform-origin: center;\n transition: transform 0.3s ease;\n}\n\n${selector}:hover::after,\n${selector}[data-active=\"true\"]::after {\n transform: scaleX(1);\n}\n `.trim()\n}\n\n/**\n * Generate floating container styles\n */\nfunction generateFloatingContainerStyles(\n container: HeaderContainer | undefined,\n themeId: string,\n tokens: TokenResolver\n): string {\n if (!container) return ''\n\n const selector = `:where([data-theme-scope=\"${themeId}\"]) .header-floating-container`\n const rules: string[] = []\n\n // Background with backdrop blur\n const opacity = clampOpacity(container.opacity, 0.12)\n if (container.tint) {\n rules.push(`background-color: ${buildTint(tokens.getColor(container.tint), opacity)};`)\n } else {\n rules.push(`background-color: ${buildRgbWhite(opacity)};`)\n }\n rules.push(`backdrop-filter: blur(16px);`)\n rules.push(`-webkit-backdrop-filter: blur(16px);`)\n\n // Border\n if (container.border) {\n rules.push(`border: 1px solid rgb(255 255 255 / 0.2);`)\n }\n\n // Border radius\n const radiusMap = {\n 'none': '0',\n 'sm': '0.375rem',\n 'md': '0.5rem',\n 'lg': '0.75rem',\n 'xl': '1rem',\n '2xl': '1.5rem',\n }\n rules.push(`border-radius: ${radiusMap[container.rounded]};`)\n\n // Shadow\n if (container.shadow) {\n rules.push(`box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);`)\n }\n\n // Padding\n const paddingMap = {\n 'sm': '1rem 1.5rem',\n 'md': '1.5rem 2rem',\n 'lg': '2rem 2.5rem',\n }\n rules.push(`padding: ${paddingMap[container.padding]};`)\n\n return `\\n${selector} {\\n ${rules.join('\\n ')}\\n}\\n`\n}\n\nfunction clampOpacity(value: number | undefined | null, fallback: number) {\n if (typeof value !== 'number' || Number.isNaN(value)) {\n return fallback\n }\n return Math.min(Math.max(value, 0), 1)\n}\n\nfunction buildTint(color: string, opacity: number) {\n return applyAlpha(color, opacity)\n}\n\nfunction buildRgbWhite(opacity: number) {\n const clamped = clampOpacity(opacity, 1)\n return `rgb(255 255 255 / ${clamped})`\n}\n\nfunction applyAlpha(color: string, opacity: number) {\n const clamped = clampOpacity(opacity, 1)\n if (color.startsWith('rgb(') && color.endsWith(')')) {\n const inner = color.slice(4, -1).trim()\n const channels = inner.includes('/') ? inner.split('/')[0].trim() : inner\n return `rgb(${channels} / ${clamped})`\n }\n return color\n}\n","import type { Theme } from '../schema'\n\nexport interface GenerateLayoutCssOptions {\n themeId: string\n theme: Theme\n}\n\n/**\n * Generate layout CSS for theme scope (background, text color)\n *\n * This applies base layout styles to the theme-scope container using the\n * --tb-* CSS variables (not Tailwind color classes, to avoid conflicts with SDK sites).\n */\nexport function generateLayoutCss(options: GenerateLayoutCssOptions): string {\n const { themeId } = options\n const selector = `:where([data-theme-scope=\"${themeId}\"])`\n const rules: string[] = []\n\n // Site background and text color from theme palette\n rules.push(`background-color: rgb(var(--tb-background));`)\n rules.push(`color: rgb(var(--tb-text));`)\n\n // Ensure the theme scope fills available space\n rules.push(`min-height: 100%;`)\n\n return `${selector} {\\n ${rules.join('\\n ')}\\n}`\n}\n","/**\n * Status/Alert CSS Generator\n *\n * Generates CSS for status indicators, alerts, and feedback messages.\n * Uses theme colors via --tb-* CSS variables.\n */\n\nimport type { Theme } from '../schema';\n\n/**\n * Corner radius map - derives alert border-radius from theme.corners\n */\nconst CORNER_MAP: Record<Theme['corners'], string> = {\n square: '0',\n soft: '0.375rem',\n rounded: '0.5rem',\n pill: '1rem',\n};\n\nexport interface GenerateStatusCssParams {\n themeId: string;\n theme: Theme;\n}\n\n/**\n * Generate status and alert CSS from theme settings.\n *\n * Creates scoped CSS classes for:\n * - .status-error, .status-success, .status-warning, .status-info, .status-muted (text colors)\n * - .alert, .alert-error, .alert-success, .alert-warning, .alert-info (styled containers)\n * - .required-marker (required field indicator)\n * - .button-link (text-styled button)\n *\n * Selectors use :where() for zero specificity, allowing site styles to override easily.\n */\nexport function generateStatusCss({ themeId, theme }: GenerateStatusCssParams): string {\n const root = `:where([data-theme-scope=\"${themeId}\"])`;\n const borderRadius = CORNER_MAP[theme.corners];\n\n const cssBlocks: string[] = [];\n\n // Status text colors (inline indicators)\n cssBlocks.push(`/* Status text indicators */\n${root} .status-error { color: rgb(var(--tb-destructive)); }\n${root} .status-success { color: rgb(var(--tb-success)); }\n${root} .status-warning { color: rgb(var(--tb-warning)); }\n${root} .status-info { color: rgb(var(--tb-info)); }\n${root} .status-muted { color: rgb(var(--tb-mutedText)); }`);\n\n // Alert boxes (styled containers)\n cssBlocks.push(`/* Alert containers */\n${root} .alert {\n padding: 1rem;\n border-radius: ${borderRadius};\n border-width: 1px;\n border-style: solid;\n}\n\n${root} .alert-error {\n border-color: rgb(var(--tb-destructive));\n background-color: rgba(var(--tb-destructive), 0.1);\n color: rgb(var(--tb-destructive));\n}\n\n${root} .alert-success {\n border-color: rgb(var(--tb-success));\n background-color: rgba(var(--tb-success), 0.1);\n color: rgb(var(--tb-success));\n}\n\n${root} .alert-warning {\n border-color: rgb(var(--tb-warning));\n background-color: rgba(var(--tb-warning), 0.1);\n color: rgb(var(--tb-warning));\n}\n\n${root} .alert-info {\n border-color: rgb(var(--tb-info));\n background-color: rgba(var(--tb-info), 0.1);\n color: rgb(var(--tb-info));\n}`);\n\n // Required field indicator\n cssBlocks.push(`/* Required field indicator */\n${root} .required-marker {\n color: rgb(var(--tb-destructive));\n margin-left: 0.25rem;\n}`);\n\n // Link button (text-only button styled like a link)\n cssBlocks.push(`/* Link button */\n${root} .button-link {\n color: rgb(var(--tb-primary));\n background: transparent;\n border: none;\n padding: 0;\n cursor: pointer;\n text-decoration: none;\n transition: color 0.15s ease;\n}\n\n${root} .button-link:hover {\n text-decoration: underline;\n}`);\n\n return cssBlocks.join('\\n\\n');\n}\n","/**\n * Progress Indicator CSS Generator\n *\n * Generates CSS for progress bars, step indicators, and multi-step navigation.\n * Uses theme colors via --tb-* CSS variables and respects theme.motion settings.\n */\n\nimport type { Theme } from '../schema';\n\nexport interface GenerateProgressCssParams {\n themeId: string;\n theme: Theme;\n}\n\n/**\n * Generate progress indicator CSS from theme settings.\n *\n * Creates scoped CSS classes for:\n * - .progress-bar, .progress-fill (bar-style progress)\n * - .step-dot, .step-dot-active, .step-dot-complete (dot indicators)\n * - .step-circle, .step-circle-active, .step-circle-complete (numbered steps)\n * - .step-connector (line between steps)\n *\n * Selectors use :where() for zero specificity, allowing site styles to override easily.\n * Progress indicators always use pill/rounded shapes for visual consistency.\n * Transitions respect theme.motion.level settings.\n */\nexport function generateProgressCss({ themeId, theme }: GenerateProgressCssParams): string {\n const root = `:where([data-theme-scope=\"${themeId}\"])`;\n\n // Respect theme motion settings for transitions\n const hasMotion = theme.motion.level !== 'off';\n const fillTransition = hasMotion ? 'transition: width 0.3s ease-out' : 'transition: none';\n const elementTransition = hasMotion ? 'transition: all 0.2s ease' : 'transition: none';\n\n const cssBlocks: string[] = [];\n\n // Progress bar\n cssBlocks.push(`/* Progress bar */\n${root} .progress-bar {\n height: 0.5rem;\n background-color: rgb(var(--tb-muted));\n border-radius: 9999px;\n overflow: hidden;\n}\n\n${root} .progress-fill {\n height: 100%;\n background-color: rgb(var(--tb-primary));\n ${fillTransition};\n}`);\n\n // Step dots (for dot-style progress)\n cssBlocks.push(`/* Step dots */\n${root} .step-dot {\n width: 0.5rem;\n height: 0.5rem;\n border-radius: 9999px;\n background-color: rgb(var(--tb-muted));\n ${elementTransition};\n}\n\n${root} .step-dot-active {\n width: 2rem;\n background-color: rgb(var(--tb-primary));\n}\n\n${root} .step-dot-complete {\n background-color: rgba(var(--tb-primary), 0.6);\n}`);\n\n // Step circles (for numbered step indicators)\n cssBlocks.push(`/* Step circles (numbered) */\n${root} .step-circle {\n width: 2rem;\n height: 2rem;\n border-radius: 9999px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.875rem;\n font-weight: 500;\n background-color: rgb(var(--tb-muted));\n color: rgb(var(--tb-mutedText));\n ${elementTransition};\n}\n\n${root} .step-circle-active {\n background-color: rgb(var(--tb-primary));\n color: rgb(var(--tb-primaryForeground));\n}\n\n${root} .step-circle-complete {\n background-color: rgba(var(--tb-primary), 0.6);\n color: rgb(var(--tb-primaryForeground));\n}`);\n\n // Step connector line\n cssBlocks.push(`/* Step connector */\n${root} .step-connector {\n height: 1px;\n background-color: rgb(var(--tb-border));\n flex: 1;\n}`);\n\n return cssBlocks.join('\\n\\n');\n}\n","import type { HydratedTheme, Theme } from \"../schema\";\nimport { expandPalette, type ExpandedPalette } from \"../palette/expandPalette\";\nimport generateCssVars from \"../palette/generateCssVars\";\nimport { generateShadowCssVars } from \"../styles/shadow\";\nimport { generateButtonCss } from \"../buttons/generateButtonCss\";\nimport { generateCardCss } from \"../cards/generateCardCss\";\nimport { generateAccordionCss } from \"../accordions/generateAccordionCss\";\nimport { generateDefaultAccordionSystem } from \"../accordions/defaults\";\nimport { generateInputCss } from \"../inputs/generateInputCss\";\nimport { generateDefaultInputSystem } from \"../inputs/defaults\";\nimport { generateHeaderCss } from \"../header\";\nimport { generateLayoutCss } from \"../layout\";\nimport { generateStatusCss } from \"../status\";\nimport { generateProgressCss } from \"../progress\";\nimport { defaultThemeTokens, type ThemeTokens } from \"../../system/theme\";\n\nexport type ThemeCssVars = Record<string, string | number>;\n\nexport type ThemeRuntime = {\n hydrated: HydratedTheme;\n cssVars: ThemeCssVars;\n tokens: ThemeTokens;\n paletteTokens: ExpandedPalette;\n buttonCss?: string;\n headerCss?: string;\n cardCss?: string;\n accordionCss?: string;\n inputCss?: string;\n layoutCss?: string;\n statusCss?: string;\n progressCss?: string;\n};\n\nexport function buildThemeRuntime(\n theme: Theme,\n options?: {\n themeId?: string;\n }\n): ThemeRuntime {\n const hydrated = hydrateTheme(theme);\n const cssVars = buildThemeCssVars(hydrated);\n const themeId = options?.themeId ?? 'theme-default';\n\n // Generate button CSS (will use defaults if theme.buttons is undefined)\n const buttonCss = generateButtonCss({\n themeId,\n theme,\n buttonSystem: theme.buttons,\n });\n\n // Generate header CSS\n const headerCss = generateHeaderCss({\n themeId,\n theme,\n });\n\n // Generate card CSS (will use defaults if theme.cards is undefined)\n const cardCss = generateCardCss({\n themeId,\n theme,\n cardSystem: theme.cards,\n });\n\n // Generate accordion CSS (will use defaults if theme.accordions is undefined)\n const accordionSystem = theme.accordions ?? generateDefaultAccordionSystem(theme);\n const accordionCss = generateAccordionCss({\n themeId,\n theme,\n accordionSystem,\n });\n\n // Generate input CSS (will use defaults if theme.inputs is undefined)\n const inputSystem = theme.inputs ?? generateDefaultInputSystem(theme);\n const inputCss = generateInputCss({\n themeId,\n theme,\n inputSystem,\n });\n\n // Generate layout CSS (background, text color for theme scope)\n const layoutCss = generateLayoutCss({\n themeId,\n theme,\n });\n\n // Generate status CSS (alerts, status indicators)\n const statusCss = generateStatusCss({\n themeId,\n theme,\n });\n\n // Generate progress CSS (progress bars, step indicators)\n const progressCss = generateProgressCss({\n themeId,\n theme,\n });\n\n // Build tokens with button system (including defaults if needed)\n // Pass original theme (not hydrated) for default button system generation\n const tokens = buildThemeTokens(hydrated, theme);\n\n return { hydrated, cssVars, tokens, paletteTokens: hydrated.palette, buttonCss, headerCss, cardCss, accordionCss, inputCss, layoutCss, statusCss, progressCss };\n}\n\nexport function hydrateTheme(theme: Theme): HydratedTheme {\n return {\n ...theme,\n palette: expandPalette(theme.palette),\n };\n}\n\nexport function buildThemeCssVars(theme: HydratedTheme): ThemeCssVars {\n const { typography, space, shadow, motion } = theme;\n\n const baseSizes = computeTypeScale(typography.scale, typography.body.size);\n const sized = applyHeadingSizeOverrides(baseSizes, typography);\n\n return {\n ...generateCssVars(theme.palette),\n\n ...generateShadowCssVars(theme),\n\n [\"--font-heading\" as const]: formatFontFamily(typography.headings.default.family),\n [\"--font-body\" as const]: formatFontFamily(typography.body.family),\n [\"--font-weight-heading\" as const]: mapWeight(typography.headings.default.weight),\n [\"--font-weight-body\" as const]: mapWeight(typography.body.weight),\n ...(typography.headings.h1.weight ? ({ [\"--fw-h1\" as const]: mapWeight(typography.headings.h1.weight) }) : {}),\n ...(typography.headings.h2.weight ? ({ [\"--fw-h2\" as const]: mapWeight(typography.headings.h2.weight) }) : {}),\n ...(typography.headings.h3.weight ? ({ [\"--fw-h3\" as const]: mapWeight(typography.headings.h3.weight) }) : {}),\n ...(typography.headings.h4?.weight ? ({ [\"--fw-h4\" as const]: mapWeight(typography.headings.h4.weight) }) : {}),\n ...(typography.headings.h5?.weight ? ({ [\"--fw-h5\" as const]: mapWeight(typography.headings.h5.weight) }) : {}),\n ...(typography.headings.h6?.weight ? ({ [\"--fw-h6\" as const]: mapWeight(typography.headings.h6.weight) }) : {}),\n\n [\"--ls-heading\" as const]: mapLetterSpacing(typography.headings.default.letterSpacing),\n [\"--ls-body\" as const]: mapLetterSpacing(typography.body.letterSpacing),\n ...(typography.headings.h1.letterSpacing\n ? ({ [\"--ls-h1\" as const]: mapLetterSpacing(typography.headings.h1.letterSpacing) })\n : {}),\n ...(typography.headings.h2.letterSpacing\n ? ({ [\"--ls-h2\" as const]: mapLetterSpacing(typography.headings.h2.letterSpacing) })\n : {}),\n ...(typography.headings.h3.letterSpacing\n ? ({ [\"--ls-h3\" as const]: mapLetterSpacing(typography.headings.h3.letterSpacing) })\n : {}),\n\n [\"--lh-heading\" as const]: mapLineHeight(typography.headings.default.lineHeight),\n [\"--lh-body\" as const]: mapLineHeight(typography.body.lineHeight),\n ...(typography.headings.h1.lineHeight\n ? ({ [\"--lh-h1\" as const]: mapLineHeight(typography.headings.h1.lineHeight) })\n : {}),\n ...(typography.headings.h2.lineHeight\n ? ({ [\"--lh-h2\" as const]: mapLineHeight(typography.headings.h2.lineHeight) })\n : {}),\n ...(typography.headings.h3.lineHeight\n ? ({ [\"--lh-h3\" as const]: mapLineHeight(typography.headings.h3.lineHeight) })\n : {}),\n\n [\"--tt-heading\" as const]: mapTextTransform(typography.headings.default.case),\n [\"--fv-heading\" as const]: mapFontVariant(typography.headings.default.case),\n\n [\"--fs-body\" as const]: sized.body,\n [\"--fs-h3\" as const]: sized.h3,\n [\"--fs-h2\" as const]: sized.h2,\n [\"--fs-h1\" as const]: sized.h1,\n\n [\"--shadow-elev\" as const]: mapShadow(shadow.elevation, shadow.softness, shadow.position || 'bottom'),\n\n [\"--space-mult\" as const]: mapSpaceMult(space),\n\n [\"--motion-duration\" as const]: mapMotionDuration(motion.level),\n [\"--motion-ease\" as const]: mapMotionEasing(motion.easing ?? \"standard\"),\n\n [\"--rt-space-y\" as const]: mapRhythm(space),\n };\n}\n\nexport function buildThemeTokens(hydratedTheme: HydratedTheme, _originalTheme: Theme): ThemeTokens {\n const tokens = cloneThemeTokens(defaultThemeTokens);\n const palette = hydratedTheme.palette as Record<string, unknown> | undefined;\n const paletteStrings: Record<string, string> = {};\n if (palette) {\n for (const [key, value] of Object.entries(palette)) {\n if (typeof value === \"string\" && value.trim().length > 0) {\n paletteStrings[key] = value;\n }\n }\n }\n tokens.palette = paletteStrings;\n\n const resolveColor = (...keys: string[]): string | undefined => {\n for (const key of keys) {\n const value = paletteStrings[key];\n if (value) {\n return value;\n }\n }\n return undefined;\n };\n\n const assignColor = (token: keyof ThemeTokens[\"color\"], ...keys: string[]) => {\n const value = resolveColor(...keys);\n if (value) {\n tokens.color[token] = value;\n }\n };\n\n assignColor(\"background/base\", \"background\", \"surface\", \"primary-50\");\n assignColor(\"background/elevated\", \"surface\", \"background\");\n assignColor(\"surface/base\", \"surface\", \"background\");\n assignColor(\"surface/subtle\", \"neutral-100\", \"surface\", \"background\");\n assignColor(\"surface/inverted\", \"neutral-900\", \"text\", \"primary-900\");\n assignColor(\"content/primary\", \"text\", \"body\", \"neutral-900\");\n assignColor(\"content/secondary\", \"mutedText\", \"secondary\", \"neutral-600\");\n assignColor(\"accent/primary\", \"primary\", \"accent\");\n assignColor(\"accent/secondary\", \"accent\", \"secondary\", \"primary-400\");\n assignColor(\"border/base\", \"border\", \"neutral-300\");\n\n // Note: buttons and cards removed from tokens - only needed for CSS generation, not runtime transforms\n // Button and card systems are still generated and used by CSS generators at build time\n\n return tokens;\n}\n\nfunction cloneThemeTokens(source: ThemeTokens): ThemeTokens {\n return JSON.parse(JSON.stringify(source)) as ThemeTokens;\n}\n\nfunction mapWeight(w: \"light\" | \"regular\" | \"medium\" | \"semibold\" | \"bold\") {\n return ({ light: 300, regular: 400, medium: 500, semibold: 600, bold: 700 } as const)[w];\n}\n\nfunction formatFontFamily(family: string, fallback: string = \"sans-serif\") {\n const trimmed = (family || \"\").trim();\n if (!trimmed) return fallback;\n const needsQuotes = /[^a-zA-Z0-9_-]/.test(trimmed);\n const primary = needsQuotes ? `\"${trimmed.replace(/\"/g, '\\\\\"')}\"` : trimmed;\n return `${primary}, ${fallback}`;\n}\n\nfunction _mapRadius(c: \"square\" | \"soft\" | \"rounded\" | \"pill\") {\n return ({ square: \"0px\", soft: \"8px\", rounded: \"16px\", pill: \"9999px\" } as const)[c];\n}\n\nfunction mapShadow(\n level: \"none\" | \"low\" | \"medium\" | \"high\",\n softness: \"crisp\" | \"soft\" | \"hard\" | null,\n position: \"bottom\" | \"bottom-right\" = \"bottom\"\n) {\n if (level === \"none\") return \"none\";\n\n // Define base offsets per elevation level\n const offsets = {\n low: 2,\n medium: 4,\n high: 6,\n };\n\n const offset = offsets[level];\n const xOffset = position === 'bottom-right' ? offset : 0;\n\n // Hard shadows: zero blur, full opacity\n if (softness === \"hard\") {\n return `${xOffset}px ${offset}px 0 0 rgba(0,0,0,1)`;\n }\n\n // Soft vs crisp shadows\n const soft = softness !== \"crisp\";\n\n // For soft/crisp shadows, position affects x-offset similarly\n switch (level) {\n case \"low\":\n return soft\n ? `${xOffset}px 1px 2px rgba(0,0,0,.06)`\n : `${xOffset}px 1px 1px rgba(0,0,0,.12)`;\n case \"medium\":\n return soft\n ? `${xOffset}px 10px 20px rgba(0,0,0,.08)`\n : `${xOffset}px 6px 12px rgba(0,0,0,.16)`;\n case \"high\":\n return soft\n ? `${xOffset}px 25px 50px rgba(0,0,0,.18)`\n : `${xOffset}px 20px 30px rgba(0,0,0,.28)`;\n }\n}\n\nfunction mapSpaceMult(space: \"comfortable\" | \"standard\" | \"dense\") {\n return ({ comfortable: 1.15, standard: 1.0, dense: 0.88 } as const)[space];\n}\n\nfunction mapRhythm(space: \"comfortable\" | \"standard\" | \"dense\") {\n switch (space) {\n case \"comfortable\":\n return \"1.2rem\";\n case \"dense\":\n return \"0.75rem\";\n case \"standard\":\n default:\n return \"1rem\";\n }\n}\n\nfunction mapMotionDuration(level: \"off\" | \"low\" | \"medium\" | \"high\") {\n return ({ off: \"0ms\", low: \"120ms\", medium: \"180ms\", high: \"250ms\" } as const)[level];\n}\n\nfunction mapMotionEasing(e: \"standard\" | \"snappy\" | \"gentle\") {\n return (\n {\n standard: \"cubic-bezier(.2,.8,.2,1)\",\n snappy: \"cubic-bezier(.2,1,.2,1)\",\n gentle: \"cubic-bezier(.15,.85,.15,1)\",\n } as const\n )[e];\n}\n\nfunction computeTypeScale(\n scale: \"minorThird\" | \"majorThird\" | \"perfectFourth\",\n bodySize: \"md\" | \"lg\" | \"xl\"\n) {\n const base = ({ md: 16, lg: 17, xl: 18 } as const)[bodySize];\n const ratio = ({ minorThird: 1.2, majorThird: 1.25, perfectFourth: 1.333 } as const)[scale];\n const h3 = Math.round(base * ratio);\n const h2 = Math.round(h3 * ratio);\n const h1 = Math.round(h2 * ratio);\n return {\n [\"--fs-body\" as const]: `${base}px`,\n [\"--fs-h3\" as const]: `${h3}px`,\n [\"--fs-h2\" as const]: `${h2}px`,\n [\"--fs-h1\" as const]: `${h1}px`,\n };\n}\n\nfunction applyHeadingSizeOverrides(\n base: Record<\"--fs-body\" | \"--fs-h1\" | \"--fs-h2\" | \"--fs-h3\", string>,\n typography: Theme[\"typography\"]\n) {\n const body = base[\"--fs-body\"];\n const h1Base = parseFloat(base[\"--fs-h1\"].replace(\"px\", \"\"));\n const h2Base = parseFloat(base[\"--fs-h2\"].replace(\"px\", \"\"));\n const h3Base = parseFloat(base[\"--fs-h3\"].replace(\"px\", \"\"));\n\n const scaleMap: Record<\"md\" | \"lg\" | \"xl\", number> = { md: 1.0, lg: 1.1, xl: 1.2 };\n\n const h1Scale = typography.headings.h1.size ? scaleMap[typography.headings.h1.size] : 1.0;\n const h2Scale = typography.headings.h2.size ? scaleMap[typography.headings.h2.size] : 1.0;\n const h3Scale = typography.headings.h3.size ? scaleMap[typography.headings.h3.size] : 1.0;\n\n return {\n body,\n h1: `${Math.round(h1Base * h1Scale)}px`,\n h2: `${Math.round(h2Base * h2Scale)}px`,\n h3: `${Math.round(h3Base * h3Scale)}px`,\n } as const;\n}\n\nfunction mapLetterSpacing(s: \"tight\" | \"normal\" | \"loose\") {\n return ({ tight: \"-0.01em\", normal: \"0em\", loose: \"0.02em\" } as const)[s];\n}\n\nfunction mapLineHeight(s: \"normal\" | \"relaxed\" | \"loose\") {\n return ({ normal: \"1.5\", relaxed: \"1.65\", loose: \"1.8\" } as const)[s];\n}\n\nfunction mapTextTransform(c: \"uppercase\" | \"normal\" | \"smallCaps\" | null) {\n if (c === \"uppercase\") return \"uppercase\";\n return \"none\";\n}\n\nfunction mapFontVariant(c: \"uppercase\" | \"normal\" | \"smallCaps\" | null) {\n if (c === \"smallCaps\") return \"small-caps\";\n return \"normal\";\n}\n","import type { RouteMap, RouteMapEntry } from \"../transforms\";\nimport type { BlockManifest } from \"./schema\";\n\ntype JsonRecord = Record<string, unknown>;\n\n/**\n * Hydrates link objects within block content using the provided route map. Returns\n * the original content reference when no mutations are required to avoid unnecessary renders.\n */\nexport function hydrateManifestLinks(\n manifest: BlockManifest | undefined,\n content: Record<string, unknown>,\n routes: RouteMap | undefined,\n): Record<string, unknown> {\n if (!routes || !manifest?.fields?.length) {\n return content;\n }\n\n const hydrated = hydrateValue(content, routes);\n return hydrated as Record<string, unknown>;\n}\n\nfunction hydrateValue(value: unknown, routes: RouteMap): unknown {\n if (Array.isArray(value)) {\n const resolvedItems = value.map((item) => hydrateValue(item, routes));\n const isUnchanged = resolvedItems.every((item, index) => item === value[index]);\n return isUnchanged ? value : resolvedItems;\n }\n\n if (isRecord(value)) {\n if (isInternalLink(value)) {\n return hydrateInternalLink(value, routes);\n }\n\n const resolvedEntries = Object.entries(value).map(([key, entry]) => [key, hydrateValue(entry, routes)] as const);\n const isUnchanged = resolvedEntries.every(([key, entry]) => entry === value[key]);\n return isUnchanged ? value : Object.fromEntries(resolvedEntries);\n }\n\n return value;\n}\n\nfunction hydrateInternalLink(link: JsonRecord, routes: RouteMap): JsonRecord {\n const routeId = typeof link.routeId === \"string\" && link.routeId.length > 0 ? link.routeId : null;\n if (!routeId) {\n return link;\n }\n\n const routeEntry = routes[routeId];\n if (!routeEntry) {\n return link;\n }\n\n const nextHref = resolveRouteHref(routeEntry);\n const currentHref = typeof link.href === \"string\" && link.href.length > 0 ? link.href : null;\n\n const nextUpdatedAt = resolveRouteUpdatedAt(routeEntry);\n\n const updates: JsonRecord = {};\n if (nextHref && nextHref !== currentHref) {\n updates.href = nextHref;\n }\n if (nextUpdatedAt && link.updatedAt !== nextUpdatedAt) {\n updates.updatedAt = nextUpdatedAt;\n }\n\n return Object.keys(updates).length > 0 ? { ...link, ...updates } : link;\n}\n\nfunction resolveRouteHref(entry: RouteMapEntry): string | null {\n if (typeof entry === \"string\") {\n return entry.length > 0 ? entry : null;\n }\n\n if (!isRecord(entry)) {\n return null;\n }\n\n const candidates = [entry.path, entry.href, entry.url, entry.draftPath];\n for (const candidate of candidates) {\n if (typeof candidate === \"string\" && candidate.length > 0) {\n return candidate;\n }\n }\n\n return null;\n}\n\nfunction resolveRouteUpdatedAt(entry: RouteMapEntry): string | null {\n if (!isRecord(entry)) {\n return null;\n }\n const candidates = [\n entry.updatedAt,\n entry.updated_at,\n entry.publishedAt,\n entry.published_at,\n entry.modifiedAt,\n entry.modified_at,\n ];\n for (const candidate of candidates) {\n if (typeof candidate === \"string\" && candidate.length > 0) {\n return candidate;\n }\n }\n return null;\n}\n\nfunction isInternalLink(value: JsonRecord): value is JsonRecord & { kind: \"internal\"; routeId: string } {\n if (value.kind !== \"internal\") {\n return false;\n }\n\n if (typeof value.routeId !== \"string\" || value.routeId.length === 0) {\n return false;\n }\n\n return true;\n}\n\nfunction isRecord(value: unknown): value is JsonRecord {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","/**\n * SDK Custom Block Transform Utilities\n *\n * Transforms SDK custom block definitions into BlockManifest and SystemBlockDefinition\n * for use in PageRenderer and editor-blocks.\n *\n * This is the single source of truth for SDK block transformation - both PageRenderer\n * and editor-blocks should import from here to avoid drift.\n */\n\nimport type { SdkCustomBlock, BlockManifest } from './system/manifest/schema';\nimport type { SystemBlockDefinition } from './system/registry';\n\n/**\n * Transforms an SDK custom block into a BlockManifest.\n *\n * SDK blocks don't have layouts (they MUST use blockOverrides), so we create\n * a minimal manifest with just the fields and metadata.\n */\nexport function transformSdkBlockToManifest(sdkBlock: SdkCustomBlock): BlockManifest {\n return {\n name: sdkBlock.id,\n version: '1.0.0',\n title: sdkBlock.title,\n titleSource: sdkBlock.titleSource,\n description: sdkBlock.description,\n component: sdkBlock.id, // Not used for SDK blocks but required by type\n fields: sdkBlock.fields,\n slots: [],\n category: sdkBlock.category,\n tags: sdkBlock.tags,\n icon: sdkBlock.icon,\n // SDK blocks have fixed behaviours because they MUST be rendered via blockOverrides.\n // They don't support inline editing or animation in the CMS since there's no\n // layout definition - rendering is entirely handled by the SDK site's component.\n behaviours: {\n supportsThemeSwitching: true, // SDK blocks receive theme context\n inlineEditing: false, // No CMS inline editing - SDK handles rendering\n animation: false, // Animation is SDK site's responsibility\n paletteHidden: false, // Visible in block picker\n },\n };\n}\n\n/**\n * Transforms an SDK custom block into a SystemBlockDefinition.\n *\n * This creates a minimal definition with just the manifest - no data loaders\n * or content normalizers since SDK blocks handle their own rendering.\n */\nexport function transformSdkBlockToDefinition(\n sdkBlock: SdkCustomBlock\n): SystemBlockDefinition<Record<string, unknown>> {\n return {\n manifest: transformSdkBlockToManifest(sdkBlock),\n // SDK custom blocks may have dataLoaders defined in their config\n dataLoaders: sdkBlock.dataLoaders,\n // No content normalizer - SDK blocks use raw content\n };\n}\n","/**\n * Pure Page renderer component for Riverbank CMS.\n *\n * This component expects all data to be provided via props.\n * For data fetching, use:\n * - Server-side: `await loadPage({ client, siteId, path })`\n * - Client-side: `usePage({ client, siteId, path })`\n */\n\nimport { PageRenderer, buildThemeRuntime } from '@riverbankcms/blocks';\nimport type { PageOutline, RouteMap, Theme, ThemeTokens, BlockOverrides, OccurrenceContextData } from '@riverbankcms/blocks';\nimport type { ResolvedBlockData } from '../../data';\nimport type { RuntimeSdkConfig } from '../helpers/loadPage';\n\n// Re-export OccurrenceContextData for SDK consumers\nexport type { OccurrenceContextData };\n\nexport type PageProps = {\n // Required data (must be provided by caller)\n page: PageOutline;\n theme: Theme;\n siteId: string;\n\n // Optional data\n themeTokens?: ThemeTokens; // If not provided, will be built from theme\n resolvedData?: ResolvedBlockData; // Pre-fetched block data\n routeMap?: RouteMap;\n /**\n * SDK site configuration containing theme palette overrides.\n * When provided, the SDK palette tokens are merged into the theme tokens,\n * allowing blocks to use SDK-defined color tokens for section backgrounds.\n */\n sdkConfig?: RuntimeSdkConfig | null;\n\n /**\n * Additional context data for content entry pages.\n * Used to pass occurrence context and content entry data to blocks.\n */\n dataContext?: {\n /** Occurrence context for event pages (from URL like /events/yoga/2025-01-15) */\n occurrenceContext?: OccurrenceContextData | null;\n /** Content entry data for template pages */\n contentEntry?: Record<string, unknown> | null;\n };\n\n // Customization\n wrapBlock?: (blockId: string, rendered: React.ReactNode) => React.ReactNode;\n registry?: Parameters<typeof PageRenderer>[0]['registry'];\n usePlaceholders?: boolean;\n /**\n * Custom components to override default block rendering.\n * Keys can be full block kind (\"block.hero\") or short form (\"hero\").\n *\n * This is SSR-safe - no context or hooks required.\n *\n * @example\n * ```tsx\n * <Page\n * {...pageData}\n * blockOverrides={{\n * 'hero': MyCustomHero,\n * 'block.testimonials': MyCustomTestimonials,\n * }}\n * />\n * ```\n */\n blockOverrides?: BlockOverrides;\n};\n\n/**\n * Pure renderer for Riverbank CMS pages.\n *\n * This component expects all data to be provided via props.\n * For data fetching, use:\n * - Server-side: `await loadPage({ client, siteId, path })`\n * - Client-side: `usePage({ client, siteId, path })`\n *\n * @example Server-side (Next.js App Router)\n * ```tsx\n * import { createRiverbankClient } from '@riverbankcms/sdk';\n * import { loadPage, Page } from '@riverbankcms/sdk/rendering';\n *\n * const client = createRiverbankClient({ apiKey, baseUrl });\n *\n * export default async function PageRoute({ params }) {\n * const pageData = await loadPage({\n * client,\n * siteId: 'site-id',\n * path: `/${params.slug}`,\n * });\n *\n * return <Page {...pageData} />;\n * }\n * ```\n *\n * @example Client-side\n * ```tsx\n * import { createRiverbankClient } from '@riverbankcms/sdk';\n * import { usePage, Page } from '@riverbankcms/sdk/rendering';\n *\n * const client = createRiverbankClient({ apiKey, baseUrl });\n *\n * function MyPage({ path }) {\n * const pageData = usePage({ client, siteId: 'site-id', path });\n *\n * if (pageData.loading) return <LoadingState />;\n * if (pageData.error) return <ErrorState error={pageData.error} />;\n * if (!pageData.page) return <NotFound />;\n *\n * return <Page {...pageData} />;\n * }\n * ```\n */\nexport function Page({\n page,\n theme,\n themeTokens: providedTokens,\n siteId,\n resolvedData,\n routeMap,\n wrapBlock,\n registry,\n usePlaceholders = false,\n blockOverrides,\n sdkConfig,\n dataContext,\n}: PageProps) {\n // Build theme tokens if not provided\n const baseTokens = providedTokens ?? buildThemeRuntime(theme).tokens;\n\n // Merge SDK palette tokens into theme tokens\n // This allows blocks to resolve SDK-defined color tokens (e.g., 'primary' -> '#6d28d9')\n const themeTokens = sdkConfig?.theme?.palette\n ? { ...baseTokens, palette: { ...baseTokens.palette, ...sdkConfig.theme.palette } }\n : baseTokens;\n\n return (\n <PageRenderer\n theme={theme}\n page={page}\n themeTokens={themeTokens}\n usePlaceholders={usePlaceholders}\n dataContext={{\n siteId,\n resolvedData,\n routes: routeMap,\n occurrenceContext: dataContext?.occurrenceContext ?? null,\n contentEntry: dataContext?.contentEntry ?? null,\n }}\n routeMap={routeMap}\n wrapBlock={wrapBlock}\n registry={registry}\n blockOverrides={blockOverrides}\n sdkConfig={sdkConfig}\n />\n );\n}\n","import type { APIEndpoints } from \"./types\";\n\nconst ENDPOINT_DEFINITIONS = {\n // AI endpoints - no cache due to dynamic nature\n aiContentUpdateChat: {\n path: \"/ai/content-update-chat\",\n method: \"POST\",\n auth: 'user',\n responseKind: 'stream',\n },\n aiChat: {\n path: \"/ai/chat\",\n method: \"POST\",\n auth: 'user',\n responseKind: 'stream',\n },\n applySeoChanges: {\n path: \"/seo/apply\",\n method: \"POST\",\n auth: 'user',\n responseKind: 'json',\n },\n aiCreateBriefChat: {\n path: \"/ai/chat/create-brief\",\n method: \"POST\",\n auth: 'user',\n responseKind: 'json',\n },\n aiPrototypeChat: {\n path: \"/ai/chat/create-prototype\",\n method: \"POST\",\n revalidate: 30, // Short cache for AI responses to avoid duplicate calls\n tags: [\"ai-prototype\"],\n auth: 'user',\n responseKind: 'json',\n },\n aiPatchDryRun: {\n path: \"/ai/patch/dry-run\",\n method: \"POST\",\n auth: 'user',\n responseKind: 'json',\n },\n aiPatchApply: {\n path: \"/ai/patch/apply\",\n method: \"POST\",\n auth: 'user',\n responseKind: 'json',\n },\n aiPlaygroundPropose: {\n path: \"/sites/{siteId}/ai/playground/propose\",\n method: \"POST\",\n auth: 'user',\n responseKind: 'json',\n },\n // Admin SEO\n listGscPropertiesAdmin: {\n path: \"/admin/seo/gsc/properties\",\n method: \"GET\",\n auth: 'admin',\n responseKind: 'json',\n },\n adminSetGscPersist: {\n path: \"/admin/seo/gsc/meta/persist\",\n method: \"POST\",\n auth: 'admin',\n responseKind: 'json',\n },\n adminStartGscVerification: {\n path: \"/admin/seo/gsc/properties/verify/start\",\n method: \"POST\",\n auth: 'admin',\n responseKind: 'json',\n },\n adminConfirmGscVerification: {\n path: \"/admin/seo/gsc/properties/verify/confirm\",\n method: \"POST\",\n auth: 'admin',\n responseKind: 'json',\n },\n adminRunGscIngest: {\n path: \"/admin/seo/ingest/run\",\n method: \"POST\",\n auth: 'admin',\n responseKind: 'json',\n },\n getSeoVerificationMeta: {\n path: \"/public/seo/verification/meta\",\n method: \"GET\",\n auth: 'public',\n responseKind: 'json',\n },\n checkRedirect: {\n path: \"/api/public/content/redirect\",\n method: \"GET\",\n revalidate: 86400, // 24 hours - redirects rarely change\n tags: ['redirect'],\n auth: 'public',\n responseKind: 'json',\n },\n listRedirectRules: {\n path: \"/sites/{siteId}/redirects\",\n method: \"GET\",\n auth: 'user',\n responseKind: 'json',\n },\n createRedirectRule: {\n path: \"/sites/{siteId}/redirects\",\n method: \"POST\",\n auth: 'user',\n responseKind: 'json',\n },\n deleteRedirectRule: {\n path: \"/sites/{siteId}/redirects/{ruleId}\",\n method: \"DELETE\",\n auth: 'user',\n responseKind: 'json',\n },\n // API Keys (Account-level - DEPRECATED, use site-scoped endpoints)\n listApiKeys: {\n path: \"/account/api-keys\",\n method: \"GET\",\n auth: 'user',\n responseKind: 'json',\n },\n createApiKey: {\n path: \"/account/api-keys\",\n method: \"POST\",\n auth: 'user',\n responseKind: 'json',\n },\n revokeApiKey: {\n path: \"/account/api-keys/{keyId}\",\n method: \"DELETE\",\n auth: 'user',\n responseKind: 'json',\n },\n // API Keys (Site-scoped - preferred)\n listSiteApiKeys: {\n path: \"/sites/{siteId}/api-keys\",\n method: \"GET\",\n auth: 'user',\n tags: ['site-{siteId}', 'api-keys'],\n responseKind: 'json',\n },\n createSiteApiKey: {\n path: \"/sites/{siteId}/api-keys\",\n method: \"POST\",\n auth: 'user',\n tags: ['site-{siteId}', 'api-keys'],\n responseKind: 'json',\n },\n revokeSiteApiKey: {\n path: \"/sites/{siteId}/api-keys/{keyId}\",\n method: \"DELETE\",\n auth: 'user',\n tags: ['site-{siteId}', 'api-keys'],\n responseKind: 'json',\n },\n getSitePreviewKey: {\n path: \"/sites/{siteId}/api-keys/preview\",\n method: \"GET\",\n auth: 'user',\n tags: ['site-{siteId}', 'api-keys', 'preview-key'],\n responseKind: 'json',\n },\n regenerateSitePreviewKey: {\n path: \"/sites/{siteId}/api-keys/preview/regenerate\",\n method: \"POST\",\n auth: 'user',\n tags: ['site-{siteId}', 'api-keys', 'preview-key'],\n responseKind: 'json',\n },\n getSiteApiKeyAccessLogs: {\n path: \"/sites/{siteId}/api-keys/access-logs\",\n method: \"GET\",\n auth: 'user',\n tags: ['site-{siteId}', 'api-keys', 'access-logs'],\n responseKind: 'json',\n },\n getBookingSettings: {\n path: \"/sites/{siteId}/bookings/settings\",\n method: \"GET\",\n auth: 'user',\n responseKind: 'json',\n },\n updateBookingSettings: {\n path: \"/sites/{siteId}/bookings/settings\",\n method: \"PUT\",\n auth: 'user',\n responseKind: 'json',\n },\n listAppointmentResources: {\n path: \"/sites/{siteId}/bookings/resources\",\n method: \"GET\",\n auth: 'user',\n responseKind: 'json',\n },\n createAppointmentResource: {\n path: \"/sites/{siteId}/bookings/resources\",\n method: \"POST\",\n auth: 'user',\n responseKind: 'json',\n },\n getAppointmentResource: {\n path: \"/sites/{siteId}/bookings/resources/{resourceId}\",\n method: \"GET\",\n auth: 'user',\n responseKind: 'json',\n },\n updateAppointmentResource: {\n path: \"/sites/{siteId}/bookings/resources/{resourceId}\",\n method: \"PUT\",\n auth: 'user',\n responseKind: 'json',\n },\n deleteAppointmentResource: {\n path: \"/sites/{siteId}/bookings/resources/{resourceId}\",\n method: \"DELETE\",\n auth: 'user',\n responseKind: 'json',\n },\n listAppointmentServices: {\n path: \"/sites/{siteId}/bookings/services\",\n method: \"GET\",\n auth: 'user',\n responseKind: 'json',\n },\n createAppointmentService: {\n path: \"/sites/{siteId}/bookings/services\",\n method: \"POST\",\n auth: 'user',\n responseKind: 'json',\n },\n getAppointmentService: {\n path: \"/sites/{siteId}/bookings/services/{serviceId}\",\n method: \"GET\",\n auth: 'user',\n responseKind: 'json',\n },\n updateAppointmentService: {\n path: \"/sites/{siteId}/bookings/services/{serviceId}\",\n method: \"PUT\",\n auth: 'user',\n responseKind: 'json',\n },\n deleteAppointmentService: {\n path: \"/sites/{siteId}/bookings/services/{serviceId}\",\n method: \"DELETE\",\n auth: 'user',\n responseKind: 'json',\n },\n getAppointmentServicesReference: {\n path: \"/sites/{siteId}/bookings/services/reference\",\n method: \"GET\",\n auth: 'user',\n responseKind: 'json',\n },\n getAppointmentResourcesReference: {\n path: \"/sites/{siteId}/bookings/resources/reference\",\n method: \"GET\",\n auth: 'user',\n responseKind: 'json',\n },\n\n // Service-Resource linking\n getResourceServices: {\n path: \"/sites/{siteId}/bookings/resources/{resourceId}/services\",\n method: \"GET\",\n auth: 'user',\n responseKind: 'json',\n },\n updateResourceServices: {\n path: \"/sites/{siteId}/bookings/resources/{resourceId}/services\",\n method: \"PUT\",\n auth: 'user',\n responseKind: 'json',\n },\n getServiceResources: {\n path: \"/sites/{siteId}/bookings/services/{serviceId}/resources\",\n method: \"GET\",\n auth: 'user',\n responseKind: 'json',\n },\n updateServiceResources: {\n path: \"/sites/{siteId}/bookings/services/{serviceId}/resources\",\n method: \"PUT\",\n auth: 'user',\n responseKind: 'json',\n },\n\n // Availability management\n listAvailabilityRules: {\n path: \"/sites/{siteId}/bookings/resources/{resourceId}/availability\",\n method: \"GET\",\n auth: 'user',\n responseKind: 'json',\n },\n upsertAvailabilityRule: {\n path: \"/sites/{siteId}/bookings/resources/{resourceId}/availability\",\n method: \"POST\",\n auth: 'user',\n responseKind: 'json',\n },\n deleteAvailabilityRule: {\n path: \"/sites/{siteId}/bookings/resources/{resourceId}/availability/{ruleId}\",\n method: \"DELETE\",\n auth: 'user',\n responseKind: 'json',\n },\n listBlackouts: {\n path: \"/sites/{siteId}/bookings/resources/{resourceId}/blackouts\",\n method: \"GET\",\n auth: 'user',\n responseKind: 'json',\n },\n createBlackout: {\n path: \"/sites/{siteId}/bookings/resources/{resourceId}/blackouts\",\n method: \"POST\",\n auth: 'user',\n responseKind: 'json',\n },\n deleteBlackout: {\n path: \"/sites/{siteId}/bookings/resources/{resourceId}/blackouts/{blackoutId}\",\n method: \"DELETE\",\n auth: 'user',\n responseKind: 'json',\n },\n getAvailableSlots: {\n path: \"/sites/{siteId}/bookings/availability/slots\",\n method: \"GET\",\n auth: 'user',\n responseKind: 'json',\n },\n createAppointment: {\n path: \"/sites/{siteId}/bookings/appointments\",\n method: \"POST\",\n auth: 'user',\n responseKind: 'json',\n },\n\n // Data retrieval endpoints - good candidates for caching\n getBrief: {\n path: \"/briefs\",\n method: \"GET\",\n revalidate: 120, // 2 minutes\n tags: [\"brief\"],\n auth: 'user',\n responseKind: 'json',\n },\n // Unified site data endpoint - use this for all site lookups\n getSite: {\n path: \"/sites\",\n method: \"GET\",\n revalidate: 900, // 15 minutes - site data changes less frequently\n tags: [\"site\"],\n auth: 'user',\n responseKind: 'json',\n },\n // DEPRECATED: Use getSite with ?slug={slug} instead\n getSiteBySlug: {\n path: \"/sites/by-slug/{slug}\",\n method: \"GET\",\n revalidate: 900, // 15 minutes - site data changes less frequently\n tags: [\"site\", \"site-{slug}\"],\n auth: 'user',\n responseKind: 'json',\n },\n // DEPRECATED: Use getSite with ?domain={domain} instead\n getSiteByDomain: {\n path: \"/sites/by-domain/{domain}\",\n method: \"GET\",\n revalidate: 900, // 15 minutes - site data changes less frequently\n tags: [\"site\", \"site-domain-{domain}\"],\n auth: 'user',\n responseKind: 'json',\n },\n createBriefTurn: {\n path: \"/brief-turns\",\n method: \"POST\",\n tags: [\"brief\"], // Tags for invalidation after mutation\n auth: 'user',\n responseKind: 'json',\n },\n upsertBrief: {\n path: \"/briefs\",\n method: \"PUT\",\n tags: [\"brief\"],\n auth: 'user',\n responseKind: 'json',\n },\n aiBriefToSpec: {\n path: \"/ai/actions/brief-to-spec\",\n method: \"POST\",\n tags: [\"brief\", \"spec\"],\n auth: 'user',\n responseKind: 'json',\n },\n createSite: {\n path: \"/sites\",\n method: \"POST\",\n tags: [\"site\"],\n auth: 'user',\n responseKind: 'json',\n },\n createSiteManual: {\n path: \"/sites/manual\",\n method: \"POST\",\n tags: [\"site\"],\n auth: 'user',\n responseKind: 'json',\n },\n updateSite: {\n path: '/sites',\n method: 'PUT',\n tags: [\"site\"],\n auth: 'user',\n responseKind: 'json',\n },\n deleteSite: {\n path: '/sites/{siteId}',\n method: 'DELETE',\n tags: ['site', 'site-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n listSiteMembers: {\n path: '/sites/{siteId}/members',\n method: 'GET',\n tags: ['site-{siteId}', 'site-members-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n inviteSiteMember: {\n path: '/sites/{siteId}/members',\n method: 'POST',\n tags: ['site-{siteId}', 'site-members-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n updateSiteMemberRole: {\n path: '/sites/{siteId}/members/{memberId}',\n method: 'PATCH',\n tags: ['site-{siteId}', 'site-members-{siteId}', 'site-member-{memberId}'],\n auth: 'user',\n responseKind: 'json',\n },\n authLogin: {\n path: '/auth/login/submit',\n method: 'POST',\n tags: ['auth'],\n auth: 'public',\n responseKind: 'json',\n },\n authForgotPassword: {\n path: '/auth/forgot/submit',\n method: 'POST',\n tags: ['auth'],\n auth: 'public',\n responseKind: 'json',\n },\n authRegister: {\n path: '/auth/register/submit',\n method: 'POST',\n tags: ['auth'],\n auth: 'public',\n responseKind: 'json',\n },\n authReauthenticate: {\n path: '/auth/reauth/submit',\n method: 'POST',\n tags: ['auth'],\n auth: 'public',\n responseKind: 'json',\n },\n lookupSiteDomains: {\n path: '/sites/{siteId}/domains/lookup',\n method: 'POST',\n tags: ['site-{siteId}', 'site-domains'],\n auth: 'user',\n responseKind: 'json',\n },\n registerSiteDomain: {\n path: '/sites/{siteId}/domains/register',\n method: 'POST',\n tags: ['site-{siteId}', 'site-domains'],\n auth: 'user',\n responseKind: 'json',\n },\n addCustomDomain: {\n path: '/sites/{siteId}/domains/custom',\n method: 'POST',\n tags: ['site-{siteId}', 'site-domains'],\n auth: 'user',\n responseKind: 'json',\n },\n removeCustomDomain: {\n path: '/sites/{siteId}/domains/custom',\n method: 'DELETE',\n tags: ['site-{siteId}', 'site-domains'],\n auth: 'user',\n responseKind: 'json',\n },\n syncCustomDomainToEdgeConfig: {\n path: '/sites/{siteId}/domains/custom/sync',\n method: 'POST',\n tags: ['site-{siteId}', 'site-domains'],\n auth: 'user',\n responseKind: 'json',\n },\n removeSiteMember: {\n path: '/sites/{siteId}/members/{memberId}',\n method: 'DELETE',\n tags: ['site-{siteId}', 'site-members-{siteId}', 'site-member-{memberId}'],\n auth: 'user',\n responseKind: 'json',\n },\n revokeSiteInvitation: {\n path: '/sites/{siteId}/members/invitations/{invitationId}',\n method: 'DELETE',\n tags: ['site-{siteId}', 'site-members-{siteId}', 'site-invite-{invitationId}'],\n auth: 'user',\n responseKind: 'json',\n },\n transferSiteOwnership: {\n path: '/sites/{siteId}/members/transfer-ownership',\n method: 'POST',\n tags: ['site-{siteId}', 'site-members-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n listContentEntries: {\n path: '/sites/{siteId}/content/{type}',\n method: 'GET',\n revalidate: 60,\n tags: ['site-{siteId}', 'content-{siteId}-{type}'],\n auth: 'user',\n responseKind: 'json',\n },\n getContentTemplate: {\n path: '/sites/{siteId}/content/types/{type}/template',\n method: 'GET',\n revalidate: 60,\n tags: ['site-{siteId}', 'content-template-{siteId}-{type}'],\n auth: 'user',\n responseKind: 'json',\n },\n updateContentTemplateBlock: {\n path: '/sites/{siteId}/content/types/{type}/template/blocks/{blockId}',\n method: 'PATCH',\n tags: ['site-{siteId}', 'content-template-{siteId}-{type}', 'content-template-block-{blockId}'],\n auth: 'user',\n responseKind: 'json',\n },\n applyContentTemplateAddon: {\n path: '/sites/{siteId}/content/types/{type}/template/addons',\n method: 'POST',\n tags: ['site-{siteId}', 'content-template-{siteId}-{type}'],\n auth: 'user',\n responseKind: 'json',\n },\n updateContentTemplateBlockBindings: {\n path: '/sites/{siteId}/content/types/{type}/template/blocks/{blockId}/bindings',\n method: 'PATCH',\n tags: ['site-{siteId}', 'content-template-{siteId}-{type}', 'content-template-block-{blockId}'],\n auth: 'user',\n responseKind: 'json',\n },\n createTemplateBlock: {\n path: '/sites/{siteId}/content/types/{type}/template/blocks',\n method: 'POST',\n tags: ['site-{siteId}', 'content-template-{siteId}-{type}'],\n auth: 'user',\n responseKind: 'json',\n },\n deleteTemplateBlock: {\n path: '/sites/{siteId}/content/types/{type}/template/blocks/{blockId}',\n method: 'DELETE',\n tags: ['site-{siteId}', 'content-template-{siteId}-{type}', 'content-template-block-{blockId}'],\n auth: 'user',\n responseKind: 'json',\n },\n reorderTemplateBlocks: {\n path: '/sites/{siteId}/content/types/{type}/template/blocks/reorder',\n method: 'POST',\n tags: ['site-{siteId}', 'content-template-{siteId}-{type}'],\n auth: 'user',\n responseKind: 'json',\n },\n getTransforms: {\n path: '/transforms',\n method: 'GET',\n revalidate: 3600,\n tags: ['transforms'],\n auth: 'public',\n responseKind: 'json',\n },\n createContentEntry: {\n path: '/sites/{siteId}/content/{type}',\n method: 'POST',\n tags: ['site-{siteId}', 'content-{siteId}-{type}'],\n auth: 'user',\n responseKind: 'json',\n },\n getContentEntry: {\n path: '/sites/{siteId}/content/{type}/{entryId}',\n method: 'GET',\n tags: ['site-{siteId}', 'content-{siteId}-{type}', 'content-entry-{entryId}'],\n auth: 'user',\n responseKind: 'json',\n },\n updateContentEntry: {\n path: '/sites/{siteId}/content/{type}/{entryId}',\n method: 'PUT',\n tags: ['site-{siteId}', 'content-{siteId}-{type}', 'content-entry-{entryId}'],\n auth: 'user',\n responseKind: 'json',\n },\n updateContentEntryContent: {\n path: '/sites/{siteId}/content/{type}/{entryId}/content',\n method: 'PUT',\n tags: ['site-{siteId}', 'content-{siteId}-{type}', 'content-entry-{entryId}'],\n auth: 'user',\n responseKind: 'json',\n },\n updateRouteMetadata: {\n path: '/sites/{siteId}/routes/{routeId}/metadata',\n method: 'PATCH',\n tags: ['site-{siteId}', 'route-{routeId}'],\n auth: 'user',\n responseKind: 'json',\n },\n publishContentEntry: {\n path: '/sites/{siteId}/content/{type}/{entryId}/publish',\n method: 'POST',\n tags: ['site-{siteId}', 'content-{siteId}-{type}', 'content-entry-{entryId}'],\n auth: 'user',\n responseKind: 'json',\n },\n discardContentEntry: {\n path: '/sites/{siteId}/content/{type}/{entryId}/discard',\n method: 'POST',\n tags: ['site-{siteId}', 'content-{siteId}-{type}', 'content-entry-{entryId}'],\n auth: 'user',\n responseKind: 'json',\n },\n unpublishContentEntry: {\n path: '/sites/{siteId}/content/{type}/{entryId}/unpublish',\n method: 'POST',\n tags: ['site-{siteId}', 'content-{siteId}-{type}', 'content-entry-{entryId}'],\n auth: 'user',\n responseKind: 'json',\n },\n // Content types: enable + setup\n listContentTypes: {\n path: '/sites/{siteId}/content-types',\n method: 'GET',\n revalidate: 120, // 2 minutes\n tags: ['site-{siteId}', 'content-types'],\n auth: 'user',\n responseKind: 'json',\n },\n enableContentType: {\n path: '/sites/{siteId}/content-types/{key}/enable',\n method: 'POST',\n tags: ['site-{siteId}', 'content-types', 'content-type-{key}'],\n auth: 'user',\n responseKind: 'json',\n },\n setupContentType: {\n path: '/sites/{siteId}/content-types/{key}/setup',\n method: 'POST',\n tags: ['site-{siteId}', 'content-types', 'content-type-{key}'],\n auth: 'user',\n responseKind: 'json',\n },\n deleteContentEntry: {\n path: '/sites/{siteId}/content/{type}/{entryId}',\n method: 'DELETE',\n tags: ['site-{siteId}', 'content-{siteId}-{type}', 'content-entry-{entryId}'],\n auth: 'user',\n responseKind: 'json',\n },\n updateSiteGeneralSettings: {\n path: '/sites/{siteId}/settings/general',\n method: 'POST',\n tags: ['site-{siteId}', 'site-settings-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n getSiteLayoutSettings: {\n path: '/sites/{siteId}/settings/layout',\n method: 'GET',\n revalidate: 120,\n tags: ['site-{siteId}', 'site-settings-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n updateSiteLayoutSettings: {\n path: '/sites/{siteId}/settings/layout',\n method: 'POST',\n tags: ['site-{siteId}', 'site-settings-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n getMaintenanceSettings: {\n path: '/sites/{siteId}/settings/maintenance',\n method: 'GET',\n revalidate: 120,\n tags: ['site-{siteId}', 'site-settings-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n updateMaintenanceSettings: {\n path: '/sites/{siteId}/settings/maintenance',\n method: 'POST',\n tags: ['site-{siteId}', 'site-settings-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n setHomepage: {\n path: '/sites/{siteId}/settings/homepage',\n method: 'POST',\n tags: ['site-{siteId}', 'site-homepage'],\n auth: 'user',\n responseKind: 'json',\n },\n listAccountDomains: {\n path: '/domains',\n method: 'GET',\n tags: ['domains'],\n auth: 'user',\n responseKind: 'json',\n },\n searchDomains: {\n path: '/domains/search',\n method: 'POST',\n tags: ['domains'],\n auth: 'user',\n responseKind: 'json',\n },\n registerDomain: {\n path: '/domains/register',\n method: 'POST',\n tags: ['domains'],\n auth: 'user',\n responseKind: 'json',\n },\n assignDomain: {\n path: '/domains/{domainId}/assign',\n method: 'POST',\n tags: ['domains', 'domain-{domainId}'],\n auth: 'user',\n responseKind: 'json',\n },\n adminStartImpersonation: {\n path: '/admin/impersonation/start',\n method: 'POST',\n tags: ['admin', 'impersonation'],\n auth: 'user',\n responseKind: 'json',\n },\n adminStopImpersonation: {\n path: '/admin/impersonation/stop',\n method: 'POST',\n tags: ['admin', 'impersonation'],\n auth: 'user',\n responseKind: 'json',\n },\n adminAssignRole: {\n path: '/admin/roles/assign',\n method: 'POST',\n tags: ['admin', 'roles'],\n auth: 'user',\n responseKind: 'json',\n },\n adminRevokeRole: {\n path: '/admin/roles/revoke',\n method: 'POST',\n tags: ['admin', 'roles'],\n auth: 'user',\n responseKind: 'json',\n },\n adminChangePlan: {\n path: '/admin/billing/plan',\n method: 'POST',\n tags: ['admin', 'billing'],\n auth: 'user',\n responseKind: 'json',\n },\n changePlan: {\n path: '/billing/plan/change',\n method: 'POST',\n tags: ['billing'],\n auth: 'user',\n responseKind: 'json',\n },\n mfaTotpEnroll: {\n path: '/auth/mfa/totp/enroll',\n method: 'POST',\n tags: ['mfa'],\n auth: 'user',\n responseKind: 'json',\n },\n mfaTotpVerify: {\n path: '/auth/mfa/totp/verify',\n method: 'POST',\n tags: ['mfa'],\n auth: 'user',\n responseKind: 'json',\n },\n mfaTotpActivate: {\n path: '/auth/mfa/totp/activate',\n method: 'POST',\n tags: ['mfa'],\n auth: 'user',\n responseKind: 'json',\n },\n mfaDeleteFactor: {\n path: '/auth/mfa/factors/{factorId}',\n method: 'DELETE',\n tags: ['mfa'],\n auth: 'user',\n responseKind: 'json',\n },\n mfaBackupCodesGet: {\n path: '/auth/mfa/backup-codes',\n method: 'GET',\n tags: ['mfa'],\n auth: 'user',\n responseKind: 'json',\n },\n mfaBackupCodesRotate: {\n path: '/auth/mfa/backup-codes/rotate',\n method: 'POST',\n tags: ['mfa'],\n auth: 'user',\n responseKind: 'json',\n },\n mfaPhoneEnroll: {\n path: '/auth/mfa/phone/enroll',\n method: 'POST',\n tags: ['mfa'],\n auth: 'user',\n responseKind: 'json',\n },\n mfaPhoneChallenge: {\n path: '/auth/mfa/phone/challenge',\n method: 'POST',\n tags: ['mfa'],\n auth: 'user',\n responseKind: 'json',\n },\n mfaPhoneVerify: {\n path: '/auth/mfa/phone/verify',\n method: 'POST',\n tags: ['mfa'],\n auth: 'user',\n responseKind: 'json',\n },\n accountUpdatePassword: {\n path: '/account/password/update',\n method: 'POST',\n tags: ['account'],\n auth: 'user',\n responseKind: 'json',\n },\n accountRevokeSessions: {\n path: '/account/sessions/revoke',\n method: 'POST',\n tags: ['account'],\n auth: 'user',\n responseKind: 'json',\n },\n adminListInvites: {\n path: '/admin/invites',\n method: 'GET',\n tags: ['admin', 'invites'],\n auth: 'user',\n responseKind: 'json',\n },\n adminCreateInvite: {\n path: '/admin/invites',\n method: 'POST',\n tags: ['admin', 'invites'],\n auth: 'user',\n responseKind: 'json',\n },\n adminRevokeInvite: {\n path: '/admin/invites/{inviteId}',\n method: 'DELETE',\n tags: ['admin', 'invites'],\n auth: 'user',\n responseKind: 'json',\n },\n adminCreateUser: {\n path: '/admin/users',\n method: 'POST',\n tags: ['admin', 'users'],\n auth: 'admin',\n responseKind: 'json',\n },\n adminListAllowedDomains: {\n path: '/admin/allowed-domains',\n method: 'GET',\n tags: ['admin', 'allowed-domains'],\n auth: 'user',\n responseKind: 'json',\n },\n adminAddAllowedDomain: {\n path: '/admin/allowed-domains',\n method: 'POST',\n tags: ['admin', 'allowed-domains'],\n auth: 'user',\n responseKind: 'json',\n },\n adminDeleteAllowedDomain: {\n path: '/admin/allowed-domains/{domainId}',\n method: 'DELETE',\n tags: ['admin', 'allowed-domains'],\n auth: 'user',\n responseKind: 'json',\n },\n authAcceptInvite: {\n path: '/auth/invite/accept',\n method: 'POST',\n tags: ['auth', 'invite'],\n auth: 'user',\n responseKind: 'json',\n },\n acceptSiteInvitation: {\n path: '/sites/invitations/accept',\n method: 'POST',\n tags: ['site-invitations'],\n auth: 'user',\n responseKind: 'json',\n },\n getNavigationMenus: {\n path: '/sites/{siteId}/navigation/menus',\n method: 'GET',\n tags: ['site-{siteId}', 'navigation'],\n auth: 'user',\n responseKind: 'json',\n },\n createNavigationMenu: {\n path: '/sites/{siteId}/navigation/menus',\n method: 'POST',\n tags: ['site-{siteId}', 'navigation'],\n auth: 'user',\n responseKind: 'json',\n },\n updateNavigationMenu: {\n path: '/sites/{siteId}/navigation/menus/{menuId}',\n method: 'PATCH',\n tags: ['site-{siteId}', 'navigation', 'navigation-menu-{menuId}'],\n auth: 'user',\n responseKind: 'json',\n },\n deleteNavigationMenu: {\n path: '/sites/{siteId}/navigation/menus/{menuId}',\n method: 'DELETE',\n tags: ['site-{siteId}', 'navigation', 'navigation-menu-{menuId}'],\n auth: 'user',\n responseKind: 'json',\n },\n createNavigationItem: {\n path: '/sites/{siteId}/navigation/menus/{menuId}/items',\n method: 'POST',\n tags: ['site-{siteId}', 'navigation', 'navigation-menu-{menuId}'],\n auth: 'user',\n responseKind: 'json',\n },\n updateNavigationItem: {\n path: '/sites/{siteId}/navigation/menus/{menuId}/items/{itemId}',\n method: 'PATCH',\n tags: ['site-{siteId}', 'navigation', 'navigation-menu-{menuId}', 'navigation-item-{itemId}'],\n auth: 'user',\n responseKind: 'json',\n },\n deleteNavigationItem: {\n path: '/sites/{siteId}/navigation/menus/{menuId}/items/{itemId}',\n method: 'DELETE',\n tags: ['site-{siteId}', 'navigation', 'navigation-menu-{menuId}', 'navigation-item-{itemId}'],\n auth: 'user',\n responseKind: 'json',\n },\n reorderNavigationItems: {\n path: '/sites/{siteId}/navigation/menus/{menuId}/items/reorder',\n method: 'POST',\n tags: ['site-{siteId}', 'navigation', 'navigation-menu-{menuId}'],\n auth: 'user',\n responseKind: 'json',\n },\n getRoutableContent: {\n path: '/sites/{siteId}/routable-content',\n method: 'GET',\n revalidate: 60,\n tags: ['site-{siteId}', 'routable-content-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n // Generic public content preview (preferred)\n getPublishedEntryPreview: {\n path: '/public/content/{siteId}/{type}/{slug}/preview',\n method: 'GET',\n revalidate: 60,\n tags: ['content-{siteId}-{type}-{slug}'],\n auth: 'public',\n responseKind: 'json',\n },\n listPublishedEntries: {\n path: '/public/content/{siteId}/{type}/entries',\n method: 'GET',\n revalidate: 60,\n tags: ['content-{siteId}-{type}'],\n auth: 'public',\n responseKind: 'json',\n },\n getPublishedPostPreview: {\n path: '/public/posts/{siteId}/{slug}/preview',\n method: 'GET',\n revalidate: 60,\n tags: ['blog-post:{siteId}:{slug}'],\n auth: 'public',\n responseKind: 'json',\n },\n proposalsSelect: {\n path: '/proposals/select',\n method: 'POST',\n tags: [\"proposal\", \"site\"],\n auth: 'user',\n responseKind: 'json',\n },\n createTheme: {\n path: '/ai/chat/create-theme',\n method: 'POST',\n revalidate: 60, // 1 minute cache for theme creation to avoid duplicate requests\n tags: [\"theme\", \"ai-theme\"],\n auth: 'user',\n responseKind: 'json',\n },\n generateThemes: {\n path: '/theme/generate',\n method: 'POST',\n tags: [\"theme\"],\n auth: 'user',\n responseKind: 'json',\n },\n extractThemeFromInspiration: {\n path: '/theme/extract-from-inspiration',\n method: 'POST',\n tags: [\"theme\", \"preferences\"],\n auth: 'user',\n responseKind: 'json',\n },\n saveSiteTheme: {\n path: '/sites/{siteId}/theme/save',\n method: 'POST',\n tags: ['site-{siteId}', 'theme'],\n auth: 'user',\n responseKind: 'json',\n },\n uploadSiteLogo: {\n path: '/storage/upload-site-logo',\n method: 'POST',\n tags: [\"site\", \"logo\"],\n auth: 'user',\n responseKind: 'json',\n },\n upsertThemePreferences: {\n path: '/theme-preferences/upsert',\n method: 'POST',\n tags: [\"theme\", \"preferences\"],\n auth: 'user',\n responseKind: 'json',\n },\n finalizeSite: {\n path: '/sites/finalize',\n method: 'POST',\n tags: [\"site\"],\n auth: 'user',\n responseKind: 'json',\n },\n instagramUploadZip: {\n path: '/api/instagram/upload-zip',\n method: 'POST',\n tags: ['instagram-import'],\n auth: 'user',\n responseKind: 'json',\n },\n getAnalyticsReport: {\n path: '/sites/{siteId}/analytics/report',\n method: 'GET',\n revalidate: 300,\n tags: ['site-{siteId}', 'analytics-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n getSeoOverview: {\n path: '/sites/{siteId}/seo/overview',\n method: 'GET',\n revalidate: 300,\n tags: ['site-{siteId}', 'seo-overview-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n getSeoPages: {\n path: '/sites/{siteId}/seo/pages',\n method: 'GET',\n revalidate: 300,\n tags: ['site-{siteId}', 'seo-pages-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n getSeoQueries: {\n path: '/sites/{siteId}/seo/queries',\n method: 'GET',\n revalidate: 300,\n tags: ['site-{siteId}', 'seo-queries-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n getPerformanceOverview: {\n path: '/sites/{siteId}/performance/overview',\n method: 'GET',\n revalidate: 300,\n tags: ['site-{siteId}', 'performance-overview-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n createMediaAsset: {\n path: '/media',\n method: 'POST',\n tags: ['media'],\n auth: 'user',\n responseKind: 'json',\n },\n mediaList: {\n path: '/media',\n method: 'GET',\n tags: ['media'],\n auth: 'user',\n responseKind: 'json',\n },\n mediaGet: {\n path: '/media/{assetId}',\n method: 'GET',\n tags: ['media', 'media-{assetId}'],\n auth: 'user',\n responseKind: 'json',\n },\n mediaUpdate: {\n path: '/media/{assetId}',\n method: 'PATCH',\n tags: ['media', 'media-{assetId}'],\n auth: 'user',\n responseKind: 'json',\n },\n mediaDelete: {\n path: '/media/{assetId}',\n method: 'DELETE',\n tags: ['media', 'media-{assetId}'],\n auth: 'user',\n responseKind: 'void',\n },\n mediaBulkDelete: {\n path: '/media/bulk-delete',\n method: 'POST',\n tags: ['media'],\n auth: 'user',\n responseKind: 'json',\n },\n mediaGetSignedUrl: {\n path: '/media/{assetId}/signed-url',\n method: 'GET',\n tags: ['media', 'media-{assetId}'],\n auth: 'user',\n responseKind: 'json',\n },\n mediaUpload: {\n path: '/media/upload',\n method: 'POST',\n tags: ['media'],\n auth: 'user',\n responseKind: 'json',\n },\n getMediaLabels: {\n path: '/media/labels',\n method: 'GET',\n tags: ['media', 'media-labels'],\n auth: 'user',\n responseKind: 'json',\n },\n getMediaSettings: {\n path: '/media/settings',\n method: 'GET',\n tags: ['media-settings'],\n auth: 'user',\n responseKind: 'json',\n },\n updateMediaSettings: {\n path: '/media/settings',\n method: 'POST',\n tags: ['media-settings'],\n auth: 'user',\n responseKind: 'json',\n },\n // Media endpoints\n mediaSearch: {\n path: '/media/search',\n method: 'POST',\n tags: ['media-search'],\n auth: 'user',\n responseKind: 'json',\n },\n classifyMediaAsset: {\n path: '/media/{assetId}/classify',\n method: 'POST',\n tags: ['media', 'media-{assetId}'],\n auth: 'user',\n responseKind: 'json',\n },\n classifyMediaBatch: {\n path: '/media/classify',\n method: 'POST',\n tags: ['media'],\n auth: 'user',\n responseKind: 'json',\n },\n mediaJobsStatus: {\n path: '/media/jobs/status',\n method: 'GET',\n tags: ['media'],\n auth: 'user',\n responseKind: 'json',\n },\n enqueueMediaClassifyJob: {\n path: '/media/jobs',\n method: 'POST',\n tags: ['media'],\n auth: 'user',\n responseKind: 'json',\n },\n runMediaClassifyJob: {\n path: '/media/jobs/run',\n method: 'POST',\n tags: ['media'],\n auth: 'user',\n responseKind: 'json',\n },\n runAllMediaClassifyJobs: {\n path: '/media/jobs/run-all',\n method: 'POST',\n tags: ['media'],\n auth: 'user',\n responseKind: 'json',\n },\n initSiteContent: {\n path: '/sites/{siteId}/content/init',\n method: 'POST',\n tags: [\"site\", \"content\"],\n auth: 'user',\n responseKind: 'json',\n },\n updateBlockContent: {\n path: '/blocks/{blockId}/content',\n method: 'POST',\n tags: ['block', 'block-{blockId}', 'content'],\n auth: 'user',\n responseKind: 'json',\n },\n saveBlockContent: {\n path: '/blocks/{blockId}/content',\n method: 'POST',\n tags: ['block', 'block-{blockId}', 'content'],\n auth: 'user',\n responseKind: 'json',\n },\n createBlock: {\n path: '/sites/{siteId}/pages/{pageId}/blocks',\n method: 'POST',\n tags: ['site-{siteId}', 'page-{pageId}', 'blocks'],\n auth: 'user',\n responseKind: 'json',\n },\n reorderBlocks: {\n path: '/sites/{siteId}/pages/{pageId}/blocks/reorder',\n method: 'POST',\n tags: ['site-{siteId}', 'page-{pageId}', 'blocks'],\n auth: 'user',\n responseKind: 'json',\n },\n deleteBlock: {\n path: '/sites/{siteId}/pages/{pageId}/blocks/{blockId}',\n method: 'DELETE',\n tags: ['site-{siteId}', 'page-{pageId}', 'blocks'],\n auth: 'user',\n responseKind: 'json',\n },\n listBlocks: {\n path: '/sites/{siteId}/pages/{pageId}/blocks',\n method: 'GET',\n tags: ['site-{siteId}', 'page-{pageId}', 'blocks'],\n auth: 'user',\n responseKind: 'json',\n },\n getBlockContent: {\n path: '/blocks/{blockId}/content',\n method: 'GET',\n tags: ['block-{blockId}', 'content'],\n auth: 'user',\n responseKind: 'json',\n },\n // DEPRECATED: Use getSite with ?id={id} instead\n getSiteById: {\n path: '/sites/by-id/{id}',\n method: 'GET',\n revalidate: 900, // 15 minutes\n tags: ['site-{id}'],\n auth: 'user',\n responseKind: 'json',\n },\n // Page data endpoints\n getPageById: {\n path: '/sites/{siteId}/pages/{pageId}',\n method: 'GET',\n revalidate: 900, // 15 minutes\n tags: ['site-{siteId}', 'page-{pageId}'],\n auth: 'user',\n responseKind: 'json',\n },\n getContentByPath: {\n path: '/sites/{siteId}/pages',\n method: 'GET',\n tags: ['site-{siteId}', 'routable-content-{siteId}'],\n auth: 'public',\n responseKind: 'json',\n },\n getPageByPath: {\n path: '/sites/{siteId}/pages',\n method: 'GET',\n tags: ['site-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n // Forms CRUD\n listForms: {\n path: '/sites/{siteId}/forms',\n method: 'GET',\n tags: ['site-{siteId}', 'forms'],\n auth: 'user',\n responseKind: 'json',\n },\n listBookingForms: {\n path: '/sites/{siteId}/bookings/forms',\n method: 'GET',\n tags: ['site-{siteId}', 'forms'],\n auth: 'user',\n responseKind: 'json',\n },\n \n createForm: {\n path: '/sites/{siteId}/forms',\n method: 'POST',\n tags: ['site-{siteId}', 'forms'],\n auth: 'user',\n responseKind: 'json',\n },\n updateForm: {\n path: '/sites/{siteId}/forms/{slug}',\n method: 'PATCH',\n tags: ['site-{siteId}', 'forms', 'form-{slug}'],\n auth: 'user',\n responseKind: 'json',\n },\n deleteForm: {\n path: '/sites/{siteId}/forms/{slug}',\n method: 'DELETE',\n tags: ['site-{siteId}', 'forms', 'form-{slug}'],\n auth: 'user',\n responseKind: 'json',\n },\n listFormSubmissions: {\n path: '/sites/{siteId}/forms/{slug}/submissions',\n method: 'GET',\n revalidate: 30,\n tags: ['site-{siteId}', 'form-{slug}', 'form-submissions-{slug}'],\n auth: 'user',\n responseKind: 'json',\n },\n // Public submit\n submitForm: {\n path: '/forms/submit',\n method: 'POST',\n tags: ['forms-submit'],\n auth: 'public',\n responseKind: 'json',\n },\n // Public forms\n getPublicFormById: {\n path: '/public/forms/{formId}',\n method: 'GET',\n revalidate: 60,\n tags: ['form-{formId}'],\n auth: 'public',\n responseKind: 'json',\n },\n // Public booking services\n getPublicBookingServices: {\n path: '/public/bookings/services',\n method: 'GET',\n revalidate: 60,\n tags: ['site-{siteId}'],\n auth: 'public',\n responseKind: 'json',\n },\n devToolsImpersonateAdmin: {\n path: '/dev-tools/impersonate/admin',\n method: 'POST',\n auth: 'admin',\n responseKind: 'json',\n },\n devToolsImpersonateRandom: {\n path: '/dev-tools/impersonate/random',\n method: 'POST',\n auth: 'admin',\n responseKind: 'json',\n },\n devToolsSeedDemoData: {\n path: '/dev-tools/seed',\n method: 'POST',\n auth: 'admin',\n responseKind: 'json',\n },\n // Public analytics collection endpoint\n analyticsCollect: {\n path: '/api/analytics/collect',\n method: 'POST',\n auth: 'public',\n responseKind: 'json',\n },\n // Public events for event calendar block\n listPublicEvents: {\n path: '/public/sites/{siteId}/events',\n method: 'GET',\n revalidate: 60,\n tags: ['public-events-{siteId}'],\n auth: 'public',\n responseKind: 'json',\n },\n // Public event registration\n registerForEvent: {\n path: '/public/sites/{siteId}/events/register',\n method: 'POST',\n tags: ['public-events-{siteId}', 'event-registration'],\n auth: 'public',\n responseKind: 'json',\n },\n // Content Types CRUD\n listSiteContentTypes: {\n path: '/sites/{siteId}/content-types',\n method: 'GET',\n revalidate: 60,\n tags: ['site-{siteId}', 'content-types-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n getContentType: {\n path: '/sites/{siteId}/content-types/by-id/{typeId}',\n method: 'GET',\n revalidate: 60,\n tags: ['site-{siteId}', 'content-type-{typeId}'],\n auth: 'user',\n responseKind: 'json',\n },\n createContentType: {\n path: '/sites/{siteId}/content-types',\n method: 'POST',\n tags: ['site-{siteId}', 'content-types-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n updateContentType: {\n path: '/sites/{siteId}/content-types/by-id/{typeId}',\n method: 'PATCH',\n tags: ['site-{siteId}', 'content-type-{typeId}', 'content-types-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n deleteContentType: {\n path: '/sites/{siteId}/content-types/by-id/{typeId}',\n method: 'DELETE',\n tags: ['site-{siteId}', 'content-type-{typeId}', 'content-types-{sideId}'],\n auth: 'user',\n responseKind: 'json',\n },\n duplicateContentType: {\n path: '/sites/{siteId}/content-types/by-id/{typeId}/duplicate',\n method: 'POST',\n tags: ['site-{siteId}', 'content-type-{typeId}', 'content-types-{siteId}'],\n auth: 'user',\n responseKind: 'json',\n },\n // Admin site creation\n adminCreateSite: {\n path: '/admin/sites',\n method: 'POST',\n tags: ['admin', 'sites'],\n auth: 'admin',\n responseKind: 'json',\n },\n // SDK Config\n refreshSdkConfig: {\n path: '/sites/{siteId}/refresh-sdk-config',\n method: 'POST',\n tags: ['site-{siteId}', 'sdk-config'],\n auth: 'user',\n responseKind: 'json',\n },\n // Stripe Connect - Site billing\n stripeConnectAuthorize: {\n path: '/sites/{siteId}/billing/connect/authorize',\n method: 'POST',\n tags: ['site-{siteId}', 'stripe-connect'],\n auth: 'user',\n responseKind: 'json',\n },\n stripeConnectStatus: {\n path: '/sites/{siteId}/billing/connect/status',\n method: 'GET',\n tags: ['site-{siteId}', 'stripe-connect'],\n auth: 'user',\n responseKind: 'json',\n },\n stripeConnectDisconnect: {\n path: '/sites/{siteId}/billing/connect/disconnect',\n method: 'DELETE',\n tags: ['site-{siteId}', 'stripe-connect'],\n auth: 'user',\n responseKind: 'json',\n },\n // Backup\n importSiteBackup: {\n path: '/sites/{siteId}/backup/import',\n method: 'POST',\n tags: ['site-{siteId}', 'backup'],\n auth: 'user',\n responseKind: 'json',\n },\n previewBackup: {\n path: '/backup/preview',\n method: 'POST',\n tags: ['backup'],\n auth: 'user',\n responseKind: 'json',\n },\n importBackupAsNewSite: {\n path: '/sites/backup/import-as-new',\n method: 'POST',\n tags: ['site', 'backup'],\n auth: 'user',\n responseKind: 'json',\n },\n // Admin billing price overrides\n adminGetPriceOverride: {\n path: '/admin/billing/price-override',\n method: 'GET',\n tags: ['admin', 'billing', 'price-override'],\n auth: 'admin',\n responseKind: 'json',\n },\n adminUpsertPriceOverride: {\n path: '/admin/billing/price-override',\n method: 'POST',\n tags: ['admin', 'billing', 'price-override'],\n auth: 'admin',\n responseKind: 'json',\n },\n adminDeletePriceOverride: {\n path: '/admin/billing/price-override',\n method: 'DELETE',\n tags: ['admin', 'billing', 'price-override'],\n auth: 'admin',\n responseKind: 'json',\n },\n} as const satisfies APIEndpoints;\n\nexport const API_ENDPOINTS = ENDPOINT_DEFINITIONS;\n\ntype IsUnknown<T> = unknown extends T ? ([T] extends [unknown] ? true : false) : false;\n\ntype MissingResponseTypes = {\n [K in keyof APIEndpoints]: IsUnknown<NonNullable<APIEndpoints[K]['response']>> extends true ? K : never;\n}[keyof APIEndpoints];\n\ntype MissingResponseKindMetadata = {\n [K in keyof typeof ENDPOINT_DEFINITIONS]: typeof ENDPOINT_DEFINITIONS[K] extends { responseKind: infer RK }\n ? RK extends import('./types').ApiResponseKind\n ? never\n : K\n : K;\n}[keyof typeof ENDPOINT_DEFINITIONS];\n\ntype MissingAuthMetadata = {\n [K in keyof typeof ENDPOINT_DEFINITIONS]: typeof ENDPOINT_DEFINITIONS[K] extends { auth: infer A }\n ? A extends import('./types').ApiAuthRequirement\n ? never\n : K\n : K;\n}[keyof typeof ENDPOINT_DEFINITIONS];\n\ntype AssertTrue<T extends true> = T;\n\ntype _EnsureResponseTypes = AssertTrue<MissingResponseTypes extends never ? true : false>;\ntype _EnsureResponseKindMetadata = AssertTrue<MissingResponseKindMetadata extends never ? true : false>;\ntype _EnsureAuthMetadata = AssertTrue<MissingAuthMetadata extends never ? true : false>;\n\n// Helper function to build full URL\nexport function buildEndpointURL(baseURL: string, endpoint: keyof APIEndpoints): string {\n return baseURL + API_ENDPOINTS[endpoint].path;\n}\n","/**\n * URL construction helpers for dashboard and API URLs.\n *\n * These functions ensure consistent URL construction across the codebase\n * and derive the API URL from the dashboard URL to avoid duplicate env vars.\n */\n\n/**\n * Get the base dashboard URL from environment\n * @returns Dashboard base URL (e.g., 'http://dashboard.local:4000')\n * @throws Error if neither NEXT_PUBLIC_DASHBOARD_URL nor NEXT_PUBLIC_CMS_API_URL is configured\n */\nexport function getDashboardBaseUrl(): string {\n const internalUrl = process.env.CMS_API_URL;\n if (internalUrl) {\n return internalUrl.replace(/\\/api\\/?$/, '').replace(/\\/$/, '');\n }\n\n const dashboardUrl = process.env.NEXT_PUBLIC_DASHBOARD_URL;\n\n if (dashboardUrl) {\n // Remove trailing slash for consistency\n return dashboardUrl.replace(/\\/$/, '');\n }\n\n // Legacy fallback: derive from NEXT_PUBLIC_CMS_API_URL\n const legacyApiUrl = process.env.NEXT_PUBLIC_CMS_API_URL;\n if (legacyApiUrl) {\n // Strip /api suffix if present\n return legacyApiUrl.replace(/\\/$/, '').replace(/\\/api$/, '');\n }\n\n throw new Error(\n 'NEXT_PUBLIC_DASHBOARD_URL is not configured. ' +\n 'Set it to your dashboard URL (e.g., http://dashboard.local:4000)'\n );\n}\n\n/**\n * Get the CMS API URL by appending /api to the dashboard URL\n * @returns API base URL (e.g., 'http://dashboard.local:4000/api' or '/api' in browser)\n * @throws Error if neither NEXT_PUBLIC_DASHBOARD_URL nor NEXT_PUBLIC_CMS_API_URL is configured (server-side only)\n */\nexport function getCmsApiUrl(): string {\n // In browser, always use relative URL to avoid CORS issues\n // (e.g., www.example.com calling example.com/api would be cross-origin)\n if (typeof window !== 'undefined') {\n return '/api';\n }\n\n // Server-side: use explicit URLs for SSR/API routes\n const internalUrl = process.env.CMS_API_URL;\n if (internalUrl) {\n return internalUrl.replace(/\\/$/, '');\n }\n\n // Check for NEXT_PUBLIC_DASHBOARD_URL first (new standard)\n const dashboardUrl = process.env.NEXT_PUBLIC_DASHBOARD_URL;\n if (dashboardUrl) {\n const base = dashboardUrl.replace(/\\/$/, '');\n return `${base}/api`;\n }\n\n // Legacy: Use NEXT_PUBLIC_CMS_API_URL directly if available\n const legacyApiUrl = process.env.NEXT_PUBLIC_CMS_API_URL;\n if (legacyApiUrl) {\n return legacyApiUrl.replace(/\\/$/, '');\n }\n\n throw new Error(\n 'NEXT_PUBLIC_DASHBOARD_URL is not configured. ' +\n 'Set it to your dashboard URL (e.g., http://dashboard.local:4000)'\n );\n}\n\n/**\n * Legacy: Get API URL, supporting old NEXT_PUBLIC_CMS_API_URL env var\n * @deprecated Use getCmsApiUrl() instead - this function is maintained for backwards compatibility\n */\nexport function resolveApiBaseUrl(): string {\n return getCmsApiUrl();\n}\n","import SupabaseClient from \"@supabase/supabase-js/dist/module/SupabaseClient\";\nimport { API_ENDPOINTS } from \"./endpoints\";\nimport { AuthHeaders, getAuthHeaders } from \"./token\";\nimport { APICallParams, APIEndpoints, ApiAuthRequirement, ApiResponseKind, HTTPMethod } from \"./types\";\nimport { resolveApiBaseUrl } from \"./url\";\nimport { normalizeCmsApiKey } from \"./env\";\n\n// Optional Next.js imports - only available when Next.js is present\n// Next.js 16 requires a cacheLife profile as the second argument\ntype RevalidateTagFn = (tag: string, cacheLifeProfile: string) => void;\nlet revalidateTag: RevalidateTagFn | null = null;\n// Only attempt to import Next.js cache helpers on the server\nif (typeof window === 'undefined') {\n try {\n const nextCache = require(\"next/cache\");\n revalidateTag = nextCache.revalidateTag as RevalidateTagFn;\n } catch {\n // Next.js not available - revalidation functions will be no-ops\n revalidateTag = null;\n }\n}\n\ntype RawApiClient = <E extends keyof APIEndpoints>(params: APICallParams<E>) => Promise<Response>;\ntype EndpointResponse<E extends keyof APIEndpoints> = APIEndpoints[E]['response'];\ntype ApiResponseFor<E extends keyof APIEndpoints> =\n EndpointResponse<E> extends undefined ? void : NonNullable<EndpointResponse<E>>;\nexport type ApiClient = <E extends keyof APIEndpoints>(params: APICallParams<E>) => Promise<ApiResponseFor<E>>;\n\nexport interface ApiRequestErrorOptions {\n endpoint: keyof APIEndpoints;\n status: number;\n method: HTTPMethod;\n auth?: ApiAuthRequirement;\n requestId?: string;\n body?: unknown;\n cause?: unknown;\n}\n\nexport class ApiRequestError extends Error {\n readonly endpoint: keyof APIEndpoints;\n readonly status: number;\n readonly method: HTTPMethod;\n readonly auth?: ApiAuthRequirement;\n readonly requestId?: string;\n readonly body?: unknown;\n readonly cause?: unknown;\n\n constructor(message: string, options: ApiRequestErrorOptions) {\n super(message);\n this.name = 'ApiRequestError';\n this.endpoint = options.endpoint;\n this.status = options.status;\n this.method = options.method;\n this.auth = options.auth;\n this.requestId = options.requestId;\n this.body = options.body;\n this.cause = options.cause;\n }\n}\n\n// Helper function to build full URL\nfunction buildEndpointURL(baseURL: string, endpoint: keyof APIEndpoints): string {\n return baseURL + API_ENDPOINTS[endpoint].path;\n}\n\nexport const getApiUrl = (endpoint: keyof APIEndpoints) => buildEndpointURL(resolveApiBaseUrl(), endpoint);\n\n// Simple cache invalidation helper\nfunction invalidateCacheTags(tags?: string[], params?: Record<string, string | number>): void {\n // Only run on the server, and only when Next.js provides a revalidateTag function\n if (typeof window !== 'undefined' || !revalidateTag || !tags) return;\n\n tags.forEach(tag => {\n // Replace parameter placeholders in tags\n let processedTag = tag;\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n processedTag = processedTag.replace(`{${key}}`, String(value));\n });\n }\n\n try {\n revalidateTag(processedTag, 'max');\n } catch {\n // If static generation store is not available in this context, skip\n }\n });\n}\n\nexport async function parseErrorBody(response: Response): Promise<unknown> {\n const clone = response.clone();\n const contentType = clone.headers.get('content-type') ?? '';\n if (contentType.includes('application/json')) {\n try {\n return await clone.json();\n } catch {\n // fall through to attempt plain text parsing\n }\n }\n\n try {\n const text = await clone.text();\n return text.length ? text : null;\n } catch {\n return null;\n }\n}\n\nexport async function parseSuccessResponse<E extends keyof APIEndpoints>(\n endpoint: E,\n response: Response,\n config: APIEndpoints[E],\n): Promise<ApiResponseFor<E>> {\n const responseKind: ApiResponseKind = config.responseKind ?? 'json';\n const auth = config.auth ?? 'user';\n const requestId = response.headers.get('x-request-id') ?? undefined;\n\n switch (responseKind) {\n case 'json': {\n if (response.status === 204 || response.status === 205 || response.status === 304) {\n return undefined as ApiResponseFor<E>;\n }\n\n const raw = await response.text();\n if (!raw.trim()) {\n return undefined as ApiResponseFor<E>;\n }\n\n try {\n return JSON.parse(raw) as ApiResponseFor<E>;\n } catch (cause) {\n throw new ApiRequestError(\n `Failed to parse JSON response for endpoint ${String(endpoint)}`,\n {\n endpoint,\n status: response.status,\n method: config.method,\n auth,\n requestId,\n body: raw,\n cause,\n },\n );\n }\n }\n case 'text': {\n return (await response.text()) as ApiResponseFor<E>;\n }\n case 'stream': {\n const body = response.body;\n if (!body) {\n throw new ApiRequestError(\n `Expected a streamed body for endpoint ${String(endpoint)}`,\n {\n endpoint,\n status: response.status,\n method: config.method,\n auth,\n requestId,\n },\n );\n }\n const stream = body as ReadableStream<Uint8Array>;\n return stream as unknown as ApiResponseFor<E>;\n }\n case 'void': {\n return undefined as ApiResponseFor<E>;\n }\n default: {\n return undefined as ApiResponseFor<E>;\n }\n }\n}\n\nexport async function createAuthenticatedApiClient(supabase: SupabaseClient): Promise<ApiClient> {\n const authHeaders = await getAuthHeaders(supabase)\n\n if (!authHeaders) {\n throw new Error('No authentication token available')\n }\n \n return createCMSClient(authHeaders);\n}\n\nfunction createRawCMSClient(headers: AuthHeaders | {} = {}, baseUrl?: string): RawApiClient {\n return <E extends keyof APIEndpoints>({\n endpoint,\n body,\n params,\n options = {}\n }: APICallParams<E>): Promise<Response> => {\n const resolvedBaseUrl = baseUrl ?? resolveApiBaseUrl();\n let url = buildEndpointURL(resolvedBaseUrl, endpoint);\n const originalPath = API_ENDPOINTS[endpoint].path;\n\n // Handle URL path parameters and collect unused params for query string\n const unusedParams: Record<string, string> = {};\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n const placeholder = `{${key}}`;\n if (originalPath.includes(placeholder)) {\n // This param is used in the path - substitute it\n url = url.replace(placeholder, value);\n } else {\n // This param is not used in the path - save for query string\n unusedParams[key] = value;\n }\n });\n }\n\n const endpointConfig = API_ENDPOINTS[endpoint];\n const method = endpointConfig.method as HTTPMethod;\n const isGetOrHead = method === 'GET' || method === 'HEAD';\n\n // For GET/HEAD requests, convert body and unused params to query parameters\n if (isGetOrHead) {\n const queryParams = new URLSearchParams();\n\n // Add unused params (not used in path) to query string\n Object.entries(unusedParams).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n queryParams.append(key, String(value));\n }\n });\n\n // Add body params to query string\n if (body) {\n Object.entries(body as Record<string, any>).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n queryParams.append(key, String(value));\n }\n });\n }\n\n const queryString = queryParams.toString();\n if (queryString) {\n url += (url.includes('?') ? '&' : '?') + queryString;\n }\n }\n // Detect if body is FormData (for file uploads)\n const isFormData = typeof FormData !== 'undefined' && body instanceof FormData;\n \n // Build Next.js cache options for read operations\n const nextOptions: { revalidate?: number; tags?: string[] } = {};\n if (\n isGetOrHead &&\n 'revalidate' in endpointConfig &&\n typeof endpointConfig.revalidate === 'number'\n ) {\n nextOptions.revalidate = endpointConfig.revalidate;\n }\n if ('tags' in endpointConfig && Array.isArray(endpointConfig.tags)) {\n // Process tags with parameter replacement\n nextOptions.tags = endpointConfig.tags.map<string>((tag) => {\n let processedTag = tag as string;\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n processedTag = processedTag.replace(`{${key}}`, String(value));\n });\n }\n return processedTag;\n });\n }\n \n const requestInit: RequestInit & { next?: { revalidate?: number; tags?: string[] } } = {\n method,\n ...options,\n // Don't include body for GET/HEAD requests\n body: isGetOrHead ? undefined : (isFormData ? (body as unknown as BodyInit) : (body ? JSON.stringify(body) : undefined)),\n headers: {\n ...options.headers,\n ...headers,\n // Don't set Content-Type for GET/HEAD requests without body\n ...(isGetOrHead ? {} : (isFormData ? {} : { 'Content-Type': 'application/json' })),\n },\n // Add Next.js caching options\n next: Object.keys(nextOptions).length > 0 ? nextOptions : undefined,\n };\n\n // Make the fetch request\n const fetchPromise = fetch(url, requestInit);\n \n // For mutation requests, invalidate cache after successful response\n if (!isGetOrHead && 'tags' in endpointConfig && Array.isArray(endpointConfig.tags)) {\n const tags = endpointConfig.tags.map((tag) => tag as string);\n return fetchPromise.then(response => {\n if (response.ok) {\n invalidateCacheTags(tags, params);\n }\n return response;\n });\n }\n \n return fetchPromise;\n }\n}\n\nfunction createParsedClient(rawClient: RawApiClient): ApiClient {\n return async <E extends keyof APIEndpoints>(params: APICallParams<E>) => {\n const response = await rawClient(params);\n const endpoint = params.endpoint;\n const config = API_ENDPOINTS[endpoint];\n const auth = config.auth ?? 'user';\n\n if (!response.ok) {\n const body = await parseErrorBody(response);\n const requestId = response.headers.get('x-request-id') ?? undefined;\n throw new ApiRequestError(\n `Request to ${String(endpoint)} failed with status ${response.status}`,\n {\n endpoint,\n status: response.status,\n method: config.method,\n auth,\n requestId,\n body,\n },\n );\n }\n\n return parseSuccessResponse(endpoint, response, config);\n };\n}\n\nexport function createCMSClient(headers: AuthHeaders | {} = {}, baseUrl?: string): ApiClient {\n return createParsedClient(createRawCMSClient(headers, baseUrl));\n}\n\nexport const createServerAPIClient = (apiKey: string, baseUrl?: string): ApiClient => {\n const normalizedApiKey = normalizeCmsApiKey(apiKey);\n\n if (!normalizedApiKey) {\n throw new Error('No API key provided for server API client')\n }\n const authHeaders = {\n Authorization: `Bearer ${normalizedApiKey}`,\n }\n return createCMSClient(authHeaders, baseUrl);\n}\n\nexport function createInternalAPIClient(baseUrl?: string): ApiClient {\n return createCMSClient({}, baseUrl);\n}\n\n// Bearer-token client for preview-auth flows\nexport function createBearerAPIClient(token: string, baseUrl?: string): ApiClient {\n const authHeaders = {\n Authorization: `Bearer ${token}`,\n };\n return createCMSClient(authHeaders, baseUrl);\n}\n","import { z } from 'zod';\n\n/**\n * RFC-6902 JSON Patch Operations\n * Standard JSON Patch format for AI Playground content updates\n */\n\nexport const Rfc6902PatchOp = z.discriminatedUnion('op', [\n // Standard RFC-6902 operations\n z.object({\n op: z.literal('add'),\n path: z.string(),\n value: z.unknown(),\n }),\n z.object({\n op: z.literal('remove'),\n path: z.string(),\n }),\n z.object({\n op: z.literal('replace'),\n path: z.string(),\n value: z.unknown(),\n }),\n z.object({\n op: z.literal('move'),\n from: z.string(),\n path: z.string(),\n }),\n z.object({\n op: z.literal('copy'),\n from: z.string(),\n path: z.string(),\n }),\n // Block-level operations (Phase 2)\n z.object({\n op: z.literal('add_block'),\n blockKind: z.string(),\n afterBlockId: z.string().nullable(),\n content: z.record(z.string(), z.unknown()),\n rationale: z.string(),\n }),\n z.object({\n op: z.literal('delete_block'),\n blockId: z.string(),\n rationale: z.string(),\n }),\n z.object({\n op: z.literal('reorder_block'),\n blockId: z.string(),\n afterBlockId: z.string().nullable(),\n rationale: z.string(),\n }),\n]);\n\nexport const PatchEnvelope = z.object({\n blockId: z.string(),\n blockKind: z.string().optional(),\n blockPurpose: z.string().optional().nullable(),\n ops: z.array(Rfc6902PatchOp),\n rationale: z.string(),\n currentContent: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const ContentUpdateResponse = z.object({\n patches: z.array(PatchEnvelope),\n assistantMessage: z.string(),\n});\n\nexport const PlaygroundProposeRequest = z.object({\n request: z.string().min(1).max(2000),\n});\n\nexport const PlaygroundProposeResponse = z.object({\n patches: z.array(PatchEnvelope),\n assistantMessage: z.string(),\n validation: z.object({\n valid: z.boolean(),\n issues: z.array(z.string()),\n filtered: z.number(),\n }),\n});\n\n// Multi-page schemas (Phase 2)\nexport const MultiPagePatchEnvelope = z.object({\n pageId: z.string(),\n blockId: z.string().optional(), // Not present for page-level ops\n blockKind: z.string().optional(),\n blockPurpose: z.string().optional().nullable(),\n ops: z.array(Rfc6902PatchOp),\n rationale: z.string(),\n currentContent: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const MultiPageUpdateResponse = z.object({\n patches: z.array(MultiPagePatchEnvelope),\n assistantMessage: z.string(),\n pagesModified: z.number(),\n toolCallsUsed: z.number(),\n});\n\n// Stream event types for real-time updates\nexport type StreamEvent =\n | { type: 'status'; message: string; detail?: string }\n | { type: 'tool_call'; tool: string; args: unknown }\n | { type: 'tool_result'; tool: string; summary: string }\n | { type: 'patch_group'; envelope: MultiPagePatchEnvelope }\n | { type: 'complete'; response: MultiPageUpdateResponse };\n\n// Types - export both the schemas and the inferred types\nexport type Rfc6902PatchOp = z.infer<typeof Rfc6902PatchOp>;\nexport type PatchEnvelope = z.infer<typeof PatchEnvelope>;\nexport type ContentUpdateResponse = z.infer<typeof ContentUpdateResponse>;\nexport type PlaygroundProposeRequest = z.infer<typeof PlaygroundProposeRequest>;\nexport type PlaygroundProposeResponse = z.infer<typeof PlaygroundProposeResponse>;\nexport type MultiPagePatchEnvelope = z.infer<typeof MultiPagePatchEnvelope>;\nexport type MultiPageUpdateResponse = z.infer<typeof MultiPageUpdateResponse>;\n\n// Re-export schemas for runtime validation\nexport {\n Rfc6902PatchOp as Rfc6902PatchOpSchema,\n PatchEnvelope as PatchEnvelopeSchema,\n ContentUpdateResponse as ContentUpdateResponseSchema,\n PlaygroundProposeRequest as PlaygroundProposeRequestSchema,\n PlaygroundProposeResponse as PlaygroundProposeResponseSchema,\n MultiPagePatchEnvelope as MultiPagePatchEnvelopeSchema,\n MultiPageUpdateResponse as MultiPageUpdateResponseSchema,\n};\n\n// Page context types for building AI prompts\nexport type AllowedField = {\n path: string;\n type: 'richtext' | 'plaintext' | 'url' | 'number' | 'boolean';\n};\n\nexport type BlockContext = {\n id: string;\n kind: string;\n purpose: string | null;\n orderIndex: number;\n allowedPaths: string[]; // Legacy, kept for backward compat\n allowedFields?: AllowedField[]; // New structured format with types\n content: Record<string, unknown>;\n};\n\nexport type PageContext = {\n site: {\n id: string;\n title: string;\n primaryDomain: string | null;\n };\n page: {\n id: string;\n path: string;\n title: string;\n slug: string | null;\n metaTitle: string | null;\n metaDescription: string | null;\n blocks: BlockContext[];\n };\n};\n","/**\n * Simple in-memory cache with TTL support\n */\nexport class SimpleCache<T> {\n private cache = new Map<string, { value: T; expires: number }>();\n private maxSize: number;\n private ttl: number;\n\n constructor(options: { maxSize?: number; ttl?: number } = {}) {\n this.maxSize = options.maxSize ?? 100;\n this.ttl = options.ttl ?? 300000; // 5 minutes in milliseconds\n }\n\n get(key: string): T | undefined {\n const entry = this.cache.get(key);\n if (!entry) return undefined;\n\n // Check if expired\n if (Date.now() > entry.expires) {\n this.cache.delete(key);\n return undefined;\n }\n\n return entry.value;\n }\n\n set(key: string, value: T): void {\n // Enforce max size with simple FIFO eviction\n if (this.cache.size >= this.maxSize) {\n const firstKey = this.cache.keys().next().value;\n if (firstKey) {\n this.cache.delete(firstKey);\n }\n }\n\n this.cache.set(key, {\n value,\n expires: Date.now() + this.ttl,\n });\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n has(key: string): boolean {\n return this.get(key) !== undefined;\n }\n}\n","import { createBearerAPIClient } from '@riverbankcms/api';\nimport type {\n RiverbankClient,\n RiverbankClientConfig,\n PublicBookingServicesResponse,\n PublicEventsResponse,\n PublicFormResponse,\n} from './types';\nimport { SimpleCache } from './cache';\n\n/**\n * Create a Riverbank CMS client for fetching content\n *\n * @example\n * ```ts\n * const client = createRiverbankClient({\n * apiKey: 'bld_live_sk_...',\n * baseUrl: 'https://dashboard.example.com/api',\n * });\n *\n * const site = await client.getSite({ slug: 'my-site' });\n * ```\n */\nexport function createRiverbankClient(config: RiverbankClientConfig): RiverbankClient {\n if (!config.baseUrl) {\n throw new Error(\n 'baseUrl is required when creating a Builder client. ' +\n 'Expected format: https://dashboard.example.com/api (must include /api path)'\n );\n }\n\n // Validate baseUrl format\n if (!config.baseUrl.endsWith('/api')) {\n throw new Error(\n `baseUrl must end with '/api'. Received: ${config.baseUrl}. ` +\n 'Expected format: https://dashboard.example.com/api'\n );\n }\n\n const cacheEnabled = config.cache?.enabled ?? true;\n const cacheTTL = (config.cache?.ttl ?? 300) * 1000; // Convert seconds to milliseconds\n const cacheMaxSize = config.cache?.maxSize ?? 100;\n\n // Create internal API client with Bearer token auth\n const apiClient = createBearerAPIClient(config.apiKey, config.baseUrl);\n\n // Create cache instance\n const cache = new SimpleCache<unknown>({\n maxSize: cacheMaxSize,\n ttl: cacheTTL,\n });\n\n /**\n * Helper to cache API calls\n */\n async function cachedFetch<T>(\n cacheKey: string,\n fetcher: () => Promise<T>,\n options?: { force?: boolean }\n ): Promise<T> {\n // Check cache unless force is true\n if (cacheEnabled && !options?.force) {\n const cached = cache.get(cacheKey) as T | undefined;\n if (cached !== undefined) {\n return cached;\n }\n }\n\n // Fetch fresh data\n const data = await fetcher();\n\n // Store in cache\n if (cacheEnabled) {\n cache.set(cacheKey, data);\n }\n\n return data;\n }\n\n return {\n async getSite(params) {\n const { slug, domain, id } = params;\n\n if (!slug && !domain && !id) {\n throw new Error(\n 'getSite() requires at least one identifier: slug, domain, or id. ' +\n `Received: ${JSON.stringify(params)}`\n );\n }\n\n const cacheKey = `site:${slug || domain || id}`;\n\n return cachedFetch(cacheKey, async () => {\n // Convert params to string record for API client\n const apiParams: Record<string, string> = {};\n if (params.slug) apiParams.slug = params.slug;\n if (params.domain) apiParams.domain = params.domain;\n if (params.id) apiParams.id = params.id;\n return await apiClient({ endpoint: 'getSite', params: apiParams });\n });\n },\n\n async getPage(params) {\n const { siteId, path, preview = false } = params;\n const cacheKey = `page:${siteId}:${path}:${preview}`;\n\n return cachedFetch(cacheKey, async () => {\n return await apiClient({ endpoint: 'getContentByPath', params: { siteId }, body: { path, preview } });\n });\n },\n\n async getEntries(params) {\n const { siteId, contentType, limit, order, preview = false, mode, entryIds } = params;\n\n // Include all params in cache key to ensure different queries are cached separately\n const entryIdsCacheKey = mode === 'manual' && entryIds?.length ? entryIds.join(',') : '';\n const cacheKey = `entries:${siteId}:${contentType}:${limit ?? ''}:${order ?? ''}:${preview}:${mode ?? ''}:${entryIdsCacheKey}`;\n\n return cachedFetch(cacheKey, async () => {\n // Build API params\n const apiParams: Record<string, string> = {\n siteId,\n type: contentType,\n };\n\n // Add optional pagination\n if (typeof limit === 'number') {\n apiParams.limit = String(limit);\n }\n\n // Convert user-friendly order to API format\n // 'order' means custom ordering - we don't pass an order param (API default)\n if (order === 'newest') {\n apiParams.order = 'published_at.desc';\n } else if (order === 'oldest') {\n apiParams.order = 'published_at.asc';\n } else if (order === 'title') {\n apiParams.order = 'title.asc';\n }\n // 'order' or undefined: don't set order param, use API default\n\n // Add preview stage if enabled\n if (preview) {\n apiParams.stage = 'preview';\n }\n\n // Manual mode - pass entry IDs for hydration\n if (mode === 'manual' && entryIds?.length) {\n apiParams.mode = 'manual';\n apiParams.entryIds = JSON.stringify(entryIds);\n }\n\n return await apiClient({ endpoint: 'listPublishedEntries', params: apiParams });\n });\n },\n\n async getEntry(params) {\n const { siteId, contentType, slug } = params;\n const cacheKey = `entry:${siteId}:${contentType}:${slug}`;\n\n return cachedFetch(cacheKey, async () => {\n return await apiClient({ endpoint: 'getPublishedEntryPreview', params: { siteId, type: contentType, slug } });\n });\n },\n\n async getPublicFormById(params) {\n const { formId } = params;\n if (!formId) {\n throw new Error('getPublicFormById() requires formId');\n }\n const cacheKey = `public-form:${formId}`;\n return cachedFetch(cacheKey, async () => {\n return await apiClient({ endpoint: 'getPublicFormById', params: { formId } }) as PublicFormResponse;\n });\n },\n\n async getPublicBookingServices(params) {\n const { siteId, ids } = params;\n if (!siteId) {\n throw new Error('getPublicBookingServices() requires siteId');\n }\n const cacheKey = `public-booking-services:${siteId}:${ids ?? ''}`;\n return cachedFetch(cacheKey, async () => {\n const apiParams: Record<string, string> = { siteId };\n if (ids) apiParams.ids = ids;\n return await apiClient({ endpoint: 'getPublicBookingServices', params: apiParams }) as PublicBookingServicesResponse;\n });\n },\n\n async listPublicEvents(params) {\n const { siteId, limit, from, to, stage } = params;\n if (!siteId) {\n throw new Error('listPublicEvents() requires siteId');\n }\n const cacheKey = `public-events:${siteId}:${limit ?? ''}:${from ?? ''}:${to ?? ''}:${stage ?? ''}`;\n return cachedFetch(cacheKey, async () => {\n const apiParams: Record<string, string> = { siteId };\n if (typeof limit === 'number') apiParams.limit = String(limit);\n if (from) apiParams.from = from;\n if (to) apiParams.to = to;\n if (stage) apiParams.stage = stage;\n return await apiClient({ endpoint: 'listPublicEvents', params: apiParams }) as PublicEventsResponse;\n });\n },\n\n clearCache() {\n cache.clear();\n },\n };\n}\n\n// Re-export types\nexport type { RiverbankClient, RiverbankClientConfig } from './types';\n"],"mappings":"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","names":["z","z","z","z","z","fields","z","buildRichTextSchema","props","props","mod","props","z","z","fields","repeat","fields","composition","props","fields","composition","fields","z","z","grid","props","z","z","z","fields","z","z","z","z","hex","r","max","min","a","b","g","bb","chroma","joinClasses","z","hex","fallback","classicLayout","fields","dataLoaders","z","z","z","z","z","z","z","REGISTRY_SYMBOL","globalScope","PATH_SEPARATOR_REGEX","BRACKET_ACCESS_REGEX","prefetchBlockData","prefetchBlockData","useState","useEffect","useState","useEffect","prefetchBlockData","React","num","fields","link","React","jsx","jsx","jsx","jsx","props","jsx","text","jsx","jsx","jsx","min","max","jsx","form","fields","React","jsx","jsxs","React","jsx","jsxs","jsx","jsx","jsxs","jsx","jsxs","jsx","jsxs","DEFAULT_EVENT_BASE_PATH","COLUMN_CLASSES","formatDateForUrl","buildEventUrl","formatDate","formatTime","jsx","jsxs","DEFAULT_EVENT_BASE_PATH","formatDate","formatTime","buildEventUrl","jsx","jsx","jsx","splitPath","readFromSource","value","namedScope","resolveNode","props","abs","React","React","fragmentRegistry","rgb","min","max","rgb","hex","r","r","hex","z","r","r","z","lab","lum","rgb","r","rgb","r","hcl","round","r","lch","sqrt","pow","z2","lab","lch","num","r","r","num","r","r","min","max","hcg","cos","r","min","sqrt","r","hsi","r","r","min","max","hsl","floor","r","min","max","rgb2hsl","r","hsv","r","r","oklab","oklab","pow","sqrt","PI","cos","sin","atan2","rgb","pow","colors","f","_pos","lab2","lab","el","round","rgb","pow","sin","cos","r","floor","pow","floor","r","num","min","max","limits","repeat","text","r","sqrt","pow","min","max","atan2","abs","cos","sin","PI","deg","max","r","r","round","r","round","rgb","min","max","css","hsl","lab","lch","oklab","oklch","rgb","log","temp","r","round","rgb","r","temp","oklch","hex","hex","r","colorTokens","colorTokens","css","newShade","borderWidth","css","GRADIENT_DIRECTION_MAP","generateShadowValue","css","GRADIENT_DIRECTION_MAP","generateShadowValue","z","z","CORNER_MAP","fallback","CORNER_MAP","fallback","isRecord","link","Fragment","jsx","MemoBlockSection","fragmentRegistry","isRecord","jsx","getCmsApiUrl","text","z"]}
|