pagiera 0.2.0-alpha.33

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.
Files changed (192) hide show
  1. package/README.md +528 -0
  2. package/dist/adapters.d.ts +89 -0
  3. package/dist/adapters.d.ts.map +1 -0
  4. package/dist/adapters.js +2 -0
  5. package/dist/adapters.js.map +1 -0
  6. package/dist/client.d.ts +22 -0
  7. package/dist/client.d.ts.map +1 -0
  8. package/dist/client.js +33 -0
  9. package/dist/client.js.map +1 -0
  10. package/dist/data.js +210 -0
  11. package/dist/data.js.map +7 -0
  12. package/dist/document.d.ts +63 -0
  13. package/dist/document.d.ts.map +1 -0
  14. package/dist/document.js +25 -0
  15. package/dist/document.js.map +1 -0
  16. package/dist/editor.d.ts +14 -0
  17. package/dist/editor.d.ts.map +1 -0
  18. package/dist/editor.js +59 -0
  19. package/dist/editor.js.map +1 -0
  20. package/dist/full-editor.d.ts +53 -0
  21. package/dist/full-editor.js +11117 -0
  22. package/dist/full-editor.js.map +7 -0
  23. package/dist/full.css +3498 -0
  24. package/dist/index.d.ts +8 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +7 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/internal/app/api/ai-design/route.d.ts +3 -0
  29. package/dist/internal/app/api/ai-design/route.d.ts.map +1 -0
  30. package/dist/internal/app/api/ai-design/route.js +165 -0
  31. package/dist/internal/app/api/ai-design/route.js.map +1 -0
  32. package/dist/internal/app/p/editor/ai-panel.d.ts +27 -0
  33. package/dist/internal/app/p/editor/ai-panel.d.ts.map +1 -0
  34. package/dist/internal/app/p/editor/ai-panel.js +77 -0
  35. package/dist/internal/app/p/editor/ai-panel.js.map +1 -0
  36. package/dist/internal/app/p/editor/data-modal.d.ts +26 -0
  37. package/dist/internal/app/p/editor/data-modal.d.ts.map +1 -0
  38. package/dist/internal/app/p/editor/data-modal.js +94 -0
  39. package/dist/internal/app/p/editor/data-modal.js.map +1 -0
  40. package/dist/internal/app/p/editor/data-panel.d.ts +18 -0
  41. package/dist/internal/app/p/editor/data-panel.d.ts.map +1 -0
  42. package/dist/internal/app/p/editor/data-panel.js +45 -0
  43. package/dist/internal/app/p/editor/data-panel.js.map +1 -0
  44. package/dist/internal/app/p/editor/editor.d.ts +51 -0
  45. package/dist/internal/app/p/editor/editor.d.ts.map +1 -0
  46. package/dist/internal/app/p/editor/editor.js +1551 -0
  47. package/dist/internal/app/p/editor/editor.js.map +1 -0
  48. package/dist/internal/app/p/editor/fields.d.ts +111 -0
  49. package/dist/internal/app/p/editor/fields.d.ts.map +1 -0
  50. package/dist/internal/app/p/editor/fields.js +141 -0
  51. package/dist/internal/app/p/editor/fields.js.map +1 -0
  52. package/dist/internal/app/p/editor/inspector.d.ts +38 -0
  53. package/dist/internal/app/p/editor/inspector.d.ts.map +1 -0
  54. package/dist/internal/app/p/editor/inspector.js +336 -0
  55. package/dist/internal/app/p/editor/inspector.js.map +1 -0
  56. package/dist/internal/app/p/editor/library.d.ts +18 -0
  57. package/dist/internal/app/p/editor/library.d.ts.map +1 -0
  58. package/dist/internal/app/p/editor/library.js +61 -0
  59. package/dist/internal/app/p/editor/library.js.map +1 -0
  60. package/dist/internal/app/p/editor/parts.d.ts +75 -0
  61. package/dist/internal/app/p/editor/parts.d.ts.map +1 -0
  62. package/dist/internal/app/p/editor/parts.js +261 -0
  63. package/dist/internal/app/p/editor/parts.js.map +1 -0
  64. package/dist/internal/app/p/editor/templates-panel.d.ts +6 -0
  65. package/dist/internal/app/p/editor/templates-panel.d.ts.map +1 -0
  66. package/dist/internal/app/p/editor/templates-panel.js +12 -0
  67. package/dist/internal/app/p/editor/templates-panel.js.map +1 -0
  68. package/dist/internal/app/p/editor/use-canvas-view.d.ts +24 -0
  69. package/dist/internal/app/p/editor/use-canvas-view.d.ts.map +1 -0
  70. package/dist/internal/app/p/editor/use-canvas-view.js +242 -0
  71. package/dist/internal/app/p/editor/use-canvas-view.js.map +1 -0
  72. package/dist/internal/app/p/editor/use-editor.d.ts +48 -0
  73. package/dist/internal/app/p/editor/use-editor.d.ts.map +1 -0
  74. package/dist/internal/app/p/editor/use-editor.js +224 -0
  75. package/dist/internal/app/p/editor/use-editor.js.map +1 -0
  76. package/dist/internal/app/p/editor/variables-panel.d.ts +8 -0
  77. package/dist/internal/app/p/editor/variables-panel.d.ts.map +1 -0
  78. package/dist/internal/app/p/editor/variables-panel.js +52 -0
  79. package/dist/internal/app/p/editor/variables-panel.js.map +1 -0
  80. package/dist/internal/components/ui/select.d.ts +12 -0
  81. package/dist/internal/components/ui/select.d.ts.map +1 -0
  82. package/dist/internal/components/ui/select.js +32 -0
  83. package/dist/internal/components/ui/select.js.map +1 -0
  84. package/dist/internal/drizzle/index.d.ts +6 -0
  85. package/dist/internal/drizzle/index.d.ts.map +1 -0
  86. package/dist/internal/drizzle/index.js +20 -0
  87. package/dist/internal/drizzle/index.js.map +1 -0
  88. package/dist/internal/drizzle/schema.d.ts +405 -0
  89. package/dist/internal/drizzle/schema.d.ts.map +1 -0
  90. package/dist/internal/drizzle/schema.js +70 -0
  91. package/dist/internal/drizzle/schema.js.map +1 -0
  92. package/dist/internal/lib/data/context.d.ts +8 -0
  93. package/dist/internal/lib/data/context.d.ts.map +1 -0
  94. package/dist/internal/lib/data/context.js +17 -0
  95. package/dist/internal/lib/data/context.js.map +1 -0
  96. package/dist/internal/lib/data/source.d.ts +54 -0
  97. package/dist/internal/lib/data/source.d.ts.map +1 -0
  98. package/dist/internal/lib/data/source.js +229 -0
  99. package/dist/internal/lib/data/source.js.map +1 -0
  100. package/dist/internal/lib/editor/ai-types.d.ts +44 -0
  101. package/dist/internal/lib/editor/ai-types.d.ts.map +1 -0
  102. package/dist/internal/lib/editor/ai-types.js +2 -0
  103. package/dist/internal/lib/editor/ai-types.js.map +1 -0
  104. package/dist/internal/lib/editor/arrange.d.ts +12 -0
  105. package/dist/internal/lib/editor/arrange.d.ts.map +1 -0
  106. package/dist/internal/lib/editor/arrange.js +72 -0
  107. package/dist/internal/lib/editor/arrange.js.map +1 -0
  108. package/dist/internal/lib/editor/cascade.d.ts +39 -0
  109. package/dist/internal/lib/editor/cascade.d.ts.map +1 -0
  110. package/dist/internal/lib/editor/cascade.js +86 -0
  111. package/dist/internal/lib/editor/cascade.js.map +1 -0
  112. package/dist/internal/lib/editor/icon.d.ts +6 -0
  113. package/dist/internal/lib/editor/icon.d.ts.map +1 -0
  114. package/dist/internal/lib/editor/icon.js +13 -0
  115. package/dist/internal/lib/editor/icon.js.map +1 -0
  116. package/dist/internal/lib/editor/presets.d.ts +10 -0
  117. package/dist/internal/lib/editor/presets.d.ts.map +1 -0
  118. package/dist/internal/lib/editor/presets.js +83 -0
  119. package/dist/internal/lib/editor/presets.js.map +1 -0
  120. package/dist/internal/lib/editor/showcase.d.ts +14 -0
  121. package/dist/internal/lib/editor/showcase.d.ts.map +1 -0
  122. package/dist/internal/lib/editor/showcase.js +219 -0
  123. package/dist/internal/lib/editor/showcase.js.map +1 -0
  124. package/dist/internal/lib/editor/site-templates.d.ts +4 -0
  125. package/dist/internal/lib/editor/site-templates.d.ts.map +1 -0
  126. package/dist/internal/lib/editor/site-templates.js +156 -0
  127. package/dist/internal/lib/editor/site-templates.js.map +1 -0
  128. package/dist/internal/lib/editor/snap.d.ts +34 -0
  129. package/dist/internal/lib/editor/snap.d.ts.map +1 -0
  130. package/dist/internal/lib/editor/snap.js +70 -0
  131. package/dist/internal/lib/editor/snap.js.map +1 -0
  132. package/dist/internal/lib/editor/style.d.ts +53 -0
  133. package/dist/internal/lib/editor/style.d.ts.map +1 -0
  134. package/dist/internal/lib/editor/style.js +313 -0
  135. package/dist/internal/lib/editor/style.js.map +1 -0
  136. package/dist/internal/lib/editor/tree.d.ts +72 -0
  137. package/dist/internal/lib/editor/tree.d.ts.map +1 -0
  138. package/dist/internal/lib/editor/tree.js +301 -0
  139. package/dist/internal/lib/editor/tree.js.map +1 -0
  140. package/dist/internal/lib/editor/types.d.ts +273 -0
  141. package/dist/internal/lib/editor/types.d.ts.map +1 -0
  142. package/dist/internal/lib/editor/types.js +411 -0
  143. package/dist/internal/lib/editor/types.js.map +1 -0
  144. package/dist/internal/lib/editor/validate.d.ts +20 -0
  145. package/dist/internal/lib/editor/validate.d.ts.map +1 -0
  146. package/dist/internal/lib/editor/validate.js +467 -0
  147. package/dist/internal/lib/editor/validate.js.map +1 -0
  148. package/dist/internal/lib/pages.d.ts +83 -0
  149. package/dist/internal/lib/pages.d.ts.map +1 -0
  150. package/dist/internal/lib/pages.js +294 -0
  151. package/dist/internal/lib/pages.js.map +1 -0
  152. package/dist/internal/lib/render/bind.d.ts +18 -0
  153. package/dist/internal/lib/render/bind.d.ts.map +1 -0
  154. package/dist/internal/lib/render/bind.js +28 -0
  155. package/dist/internal/lib/render/bind.js.map +1 -0
  156. package/dist/internal/lib/render/css.d.ts +31 -0
  157. package/dist/internal/lib/render/css.d.ts.map +1 -0
  158. package/dist/internal/lib/render/css.js +239 -0
  159. package/dist/internal/lib/render/css.js.map +1 -0
  160. package/dist/internal/lib/render/load-data.d.ts +15 -0
  161. package/dist/internal/lib/render/load-data.d.ts.map +1 -0
  162. package/dist/internal/lib/render/load-data.js +39 -0
  163. package/dist/internal/lib/render/load-data.js.map +1 -0
  164. package/dist/internal/lib/render/page-render.d.ts +17 -0
  165. package/dist/internal/lib/render/page-render.d.ts.map +1 -0
  166. package/dist/internal/lib/render/page-render.js +117 -0
  167. package/dist/internal/lib/render/page-render.js.map +1 -0
  168. package/dist/internal/lib/utils.d.ts +3 -0
  169. package/dist/internal/lib/utils.d.ts.map +1 -0
  170. package/dist/internal/lib/utils.js +6 -0
  171. package/dist/internal/lib/utils.js.map +1 -0
  172. package/dist/manrope-data.d.ts +3 -0
  173. package/dist/manrope-data.d.ts.map +1 -0
  174. package/dist/manrope-data.js +3 -0
  175. package/dist/manrope-data.js.map +1 -0
  176. package/dist/page.d.ts +9 -0
  177. package/dist/page.d.ts.map +1 -0
  178. package/dist/page.js +148 -0
  179. package/dist/page.js.map +1 -0
  180. package/dist/provider.d.ts +14 -0
  181. package/dist/provider.d.ts.map +1 -0
  182. package/dist/provider.js +45 -0
  183. package/dist/provider.js.map +1 -0
  184. package/dist/runtime.d.ts +8 -0
  185. package/dist/runtime.js +717 -0
  186. package/dist/runtime.js.map +7 -0
  187. package/dist/server.d.ts +31 -0
  188. package/dist/server.js +2267 -0
  189. package/dist/server.js.map +7 -0
  190. package/dist/styles.css +300 -0
  191. package/package.json +94 -0
  192. package/thumbnail.png +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/internal/app/p/editor/editor.tsx", "../src/internal/components/ui/select.tsx", "../../../node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs", "../../../node_modules/.bun/tailwind-merge@3.6.0/node_modules/tailwind-merge/src/lib/utils.ts", "../../../node_modules/.bun/tailwind-merge@3.6.0/node_modules/tailwind-merge/src/lib/class-group-utils.ts", "../../../node_modules/.bun/tailwind-merge@3.6.0/node_modules/tailwind-merge/src/lib/lru-cache.ts", "../../../node_modules/.bun/tailwind-merge@3.6.0/node_modules/tailwind-merge/src/lib/parse-class-name.ts", "../../../node_modules/.bun/tailwind-merge@3.6.0/node_modules/tailwind-merge/src/lib/sort-modifiers.ts", "../../../node_modules/.bun/tailwind-merge@3.6.0/node_modules/tailwind-merge/src/lib/config-utils.ts", "../../../node_modules/.bun/tailwind-merge@3.6.0/node_modules/tailwind-merge/src/lib/merge-classlist.ts", "../../../node_modules/.bun/tailwind-merge@3.6.0/node_modules/tailwind-merge/src/lib/tw-join.ts", "../../../node_modules/.bun/tailwind-merge@3.6.0/node_modules/tailwind-merge/src/lib/create-tailwind-merge.ts", "../../../node_modules/.bun/tailwind-merge@3.6.0/node_modules/tailwind-merge/src/lib/from-theme.ts", "../../../node_modules/.bun/tailwind-merge@3.6.0/node_modules/tailwind-merge/src/lib/validators.ts", "../../../node_modules/.bun/tailwind-merge@3.6.0/node_modules/tailwind-merge/src/lib/default-config.ts", "../../../node_modules/.bun/tailwind-merge@3.6.0/node_modules/tailwind-merge/src/lib/merge-configs.ts", "../../../node_modules/.bun/tailwind-merge@3.6.0/node_modules/tailwind-merge/src/lib/extend-tailwind-merge.ts", "../../../node_modules/.bun/tailwind-merge@3.6.0/node_modules/tailwind-merge/src/lib/tw-merge.ts", "../src/internal/lib/utils.ts", "../src/internal/lib/editor/types.ts", "../src/internal/lib/editor/cascade.ts", "../src/internal/lib/editor/style.ts", "../src/internal/lib/editor/arrange.ts", "../src/internal/lib/data/source.ts", "../src/internal/lib/render/bind.ts", "../src/internal/lib/editor/tree.ts", "../src/internal/lib/render/css.ts", "../src/internal/lib/editor/showcase.ts", "../src/internal/lib/editor/snap.ts", "../src/internal/app/p/editor/inspector.tsx", "../src/internal/app/p/editor/fields.tsx", "../src/internal/app/p/editor/data-panel.tsx", "../src/internal/app/p/editor/data-modal.tsx", "../src/internal/app/p/editor/library.tsx", "../src/internal/lib/editor/presets.ts", "../src/internal/app/p/editor/parts.tsx", "../src/internal/lib/editor/icon.tsx", "../src/internal/app/p/editor/use-canvas-view.ts", "../src/internal/app/p/editor/use-editor.ts", "../src/internal/app/p/editor/ai-panel.tsx", "../src/internal/app/p/editor/variables-panel.tsx", "../src/internal/app/p/editor/templates-panel.tsx", "../src/internal/pagiera-full-entry.ts"],
4
+ "sourcesContent": ["\"use client\";\n\nimport {\n IconArrowBackUp,\n IconArrowForwardUp,\n IconArrowsMaximize,\n IconCommand,\n IconComponents,\n IconCopy,\n IconChevronLeft,\n IconChevronRight,\n IconDatabase,\n IconExternalLink,\n IconFocusCentered,\n IconLayoutSidebarLeftCollapse,\n IconLayoutSidebarRightCollapse,\n IconMinus,\n IconPlayerPlay,\n IconPlus,\n IconPointer,\n IconSearch,\n IconSparkles,\n IconTrash,\n IconWorld,\n IconLayersLinked,\n IconLayoutColumns,\n IconBox,\n IconFile,\n IconLibrary,\n IconIcons,\n IconMoon,\n IconPalette,\n IconPin,\n IconPinFilled,\n IconSun,\n IconTemplate,\n IconX,\n} from \"@tabler/icons-react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport type React from \"react\";\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n useTransition,\n} from \"react\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\";\nimport { alignElements, distributeElements } from \"@/lib/editor/arrange\";\nimport { baseOf, cascadeOf } from \"@/lib/editor/cascade\";\nimport type { AiDesignPlan } from \"@/lib/editor/ai-types\";\nimport { bindElement, type Row, rowsFor } from \"@/lib/render/bind\";\nimport { resolveFont } from \"@/lib/render/css\";\nimport { createNocturneShowcase } from \"@/lib/editor/showcase\";\nimport type { SiteTemplateId } from \"@/lib/editor/site-templates\";\nimport { type Guide, snapPosition } from \"@/lib/editor/snap\";\nimport {\n applyStyle,\n applyStyleIsolated,\n clearOverrides,\n isBand,\n resolveStyle,\n rootStyleToCss,\n splitBand,\n styleToCss,\n} from \"@/lib/editor/style\";\nimport {\n absolutePosition,\n childrenOf,\n cloneSubtree,\n containerAt,\n createElement,\n indexById,\n isNote,\n nextZ,\n removeSubtree,\n reorder,\n reparent,\n subtreeIds,\n wrapInContainer,\n} from \"@/lib/editor/tree\";\nimport {\n DEFAULT_BREAKPOINTS,\n type Breakpoint,\n type BreakpointDefinition,\n type CanvasElement,\n type DataSource,\n DRAG_MIME,\n type ElementStyle,\n type ElementType,\n isContainer,\n isTextual,\n MOVE_MIME,\n type ResizeHandle,\n type RootStyle,\n STYLE_KEYS,\n type StyleKey,\n} from \"@/lib/editor/types\";\nimport { Inspector, MultiSelectPanel, PageInspector } from \"./inspector\";\nimport { DataPanel, type SourceSample } from \"./data-panel\";\nimport type { SourcePreviewer } from \"./data-modal\";\nimport { type LibraryPage, type LibraryPick, LibraryPanel } from \"./library\";\nimport {\n Breadcrumbs,\n ContextMenu,\n ElementBody,\n ElementsPanel,\n IconsPanel,\n LayersPanel,\n type PageEntry,\n PagesPanel,\n ResizeHandles,\n SaveIndicator,\n} from \"./parts\";\nimport { useCanvasView } from \"./use-canvas-view\";\nimport { useEditorDocument } from \"./use-editor\";\nimport { AiPanel, type AiDesignGenerator } from \"./ai-panel\";\nimport { VariablesPanel } from \"./variables-panel\";\nimport { TemplatesPanel } from \"./templates-panel\";\n\nconst MIN_SIZE = 10;\nconst COMPONENT_MIME = \"application/pagiera-component\";\n\nexport type EditorPage = {\n id: string;\n name: string;\n slug: string;\n version: number;\n elements: CanvasElement[];\n rootStyle: RootStyle;\n dataSources: DataSource[];\n publishedAt: string | null;\n};\n\nexport type EditorAdapters = {\n save?: Parameters<typeof useEditorDocument>[0][\"saveDocument\"];\n generate?: AiDesignGenerator;\n createPage?: (name: string, slug: string) => Promise<PageMutationResult>;\n renamePage?: (id: string, name: string, slug: string) => Promise<PageMutationResult>;\n duplicatePage?: (id: string, name: string, slug: string) => Promise<PageMutationResult>;\n deletePage?: (id: string) => Promise<PageMutationResult>;\n installTemplate?: (id: SiteTemplateId) => Promise<PageMutationResult>;\n publishPage?: (id: string) => Promise<PageMutationResult>;\n unpublishPage?: (id: string, slug: string) => Promise<PageMutationResult>;\n navigate?: (pageId: string, options?: { replace?: boolean }) => void | Promise<void>;\n refresh?: () => void;\n previewHref?: (pageId: string) => string;\n publishedHref?: (slug: string) => string;\n previewSource?: SourcePreviewer;\n};\n\nconst defaultEditorHref = (pageId: string) => `/editor/${encodeURIComponent(pageId)}`;\nconst defaultPublishedHref = (slug: string) => slug === \"home\" || slug === \"\" ? \"/\" : `/${slug.split(\"/\").map((part) => part.startsWith(\":\") ? part : encodeURIComponent(part)).join(\"/\")}`;\n\nexport type PageMutationResult =\n | { status: \"ok\"; pageId?: string; slug?: string }\n | { status: \"error\"; message: string };\n\nconst unavailable = async (): Promise<PageMutationResult> => ({\n status: \"error\",\n message: \"This editor action has no host adapter.\",\n});\n\ntype DragInfo = {\n id: string;\n breakpoint: Breakpoint;\n /** `free` moves by x/y; `reflow` only reparents, the layout owns position. */\n mode: \"free\" | \"reflow\";\n startX: number;\n startY: number;\n initialX: number;\n initialY: number;\n};\n\ntype ResizeInfo = {\n id: string;\n breakpoint: Breakpoint;\n handle: ResizeHandle;\n startX: number;\n startY: number;\n initialX: number;\n initialY: number;\n initialW: number;\n initialH: number;\n};\n\ntype Clipboard = { elements: CanvasElement[]; rootId: string };\n\nexport default function Editor({\n page,\n pages,\n library,\n adapters,\n}: {\n page: EditorPage;\n pages: PageEntry[];\n library: LibraryPage[];\n adapters?: EditorAdapters;\n}) {\n const [isPending, startTransition] = useTransition();\n\n const {\n elements,\n rootStyle,\n dataSources,\n setElements,\n setRootStyle,\n setDataSources,\n beginTransaction,\n endTransaction,\n undo,\n redo,\n canUndo,\n canRedo,\n saveStatus,\n saveError,\n isDirty,\n saveNow,\n } = useEditorDocument({\n pageId: page.id,\n initialDocument: {\n elements: page.elements,\n rootStyle: page.rootStyle,\n dataSources: page.dataSources,\n },\n initialVersion: page.version,\n saveDocument: useCallback(\n (pageId, document, expectedVersion) =>\n adapters?.save?.(pageId, document, expectedVersion) ??\n Promise.resolve({ status: \"error\" as const, message: \"No persistence adapter configured.\" }),\n [adapters?.save],\n ),\n });\n\n /** Editor chrome theme; the palette itself lives in globals.css. */\n const [chromeTheme, setChromeTheme] = useState<\"light\" | \"dark\">(\"dark\");\n\n useEffect(() => {\n const stored = localStorage.getItem(\"pagiera:editor-theme\");\n if (stored === \"dark\" || stored === \"light\") setChromeTheme(stored);\n }, []);\n\n const toggleChromeTheme = useCallback(() => {\n setChromeTheme((current) => {\n const next = current === \"dark\" ? \"light\" : \"dark\";\n try {\n localStorage.setItem(\"pagiera:editor-theme\", next);\n } catch {\n // A private-mode storage failure must not block the toggle.\n }\n return next;\n });\n }, []);\n\n const [breakpoint, setBreakpoint] = useState<Breakpoint>(\"desktop\");\n const [breakpointPanel, setBreakpointPanel] = useState(false);\n const componentMode = rootStyle.documentMode === \"component\";\n const componentMasters = elements.filter((element) => element.componentRole === \"master\");\n const [activeComponentMasterId, setActiveComponentMasterId] = useState<string | null>(null);\n const activeComponentMaster = componentMasters.find((element) => element.id === activeComponentMasterId) ?? componentMasters[0];\n const activeComponentVariants = activeComponentMaster\n ? componentMasters.filter((element) => element.componentId === activeComponentMaster.componentId)\n : [];\n const breakpointDefs = rootStyle.breakpoints?.length\n ? rootStyle.breakpoints\n : DEFAULT_BREAKPOINTS;\n const cascade = useMemo(\n () => cascadeOf(rootStyle.breakpoints, rootStyle.baseBreakpointId),\n [rootStyle.breakpoints, rootStyle.baseBreakpointId],\n );\n const selectedBreakpoint =\n breakpointDefs.find((item) => item.id === breakpoint) ?? breakpointDefs[0];\n const frameWidthForBreakpoint = selectedBreakpoint.width;\n\n const frames = useMemo<Array<{ bp: Breakpoint; width: number }>>(\n () => componentMode ? [{ bp: \"desktop\", width: Math.max(1, activeComponentMaster?.base.w ?? 320) }] : breakpointDefs.map((item) => ({ bp: item.id, width: item.width })),\n [activeComponentMaster?.base.w, breakpointDefs, componentMode],\n );\n\n /** Widest frame on screen; the zoom fits against this. */\n const fitWidth = Math.max(320, frames.reduce((total, frame) => total + frame.width, 0) + Math.max(0, frames.length - 1) * 40);\n\n const {\n viewportRef,\n frameRef,\n zoom,\n scale,\n zoomTo,\n stepZoom,\n zoomToFit,\n spaceHeld,\n isPanning,\n tryBeginPan,\n recenter,\n } = useCanvasView(fitWidth);\n\n const [leftTab, setLeftTab] = useState(\"Layers\");\n const [rightTab, setRightTab] = useState<\"Design\" | \"Content\" | \"Hover\" | \"Interact\">(\"Design\");\n const [isLeftCollapsed, setIsLeftCollapsed] = useState(false);\n const [isRightCollapsed, setIsRightCollapsed] = useState(false);\n const [search, setSearch] = useState(\"\");\n\n const [selectedIds, setSelectedIds] = useState<string[]>([]);\n const [editingId, setEditingId] = useState<string | null>(null);\n const [hoveredEffectId, setHoveredEffectId] = useState<string | null>(null);\n const [pressedEffectId, setPressedEffectId] = useState<string | null>(null);\n const [effectsPreview, setEffectsPreview] = useState(false);\n const [previewVisibility, setPreviewVisibility] = useState<Record<string, boolean>>({});\n const [marquee, setMarquee] = useState<{ startX: number; startY: number; x: number; y: number } | null>(null);\n const [codeComposerOpen, setCodeComposerOpen] = useState(false);\n const [codeComponentName, setCodeComponentName] = useState(\"Code Component\");\n const [codeComponentSource, setCodeComponentSource] = useState('<style>body{margin:0;font-family:system-ui;display:grid;place-items:center;height:100vh}button{border:0;border-radius:12px;padding:14px 22px;background:#4f8cff;color:white;font-weight:600}</style><button>Button</button>');\n const [draggedBreakpointId, setDraggedBreakpointId] = useState<string | null>(null);\n const [editingBreakpointId, setEditingBreakpointId] = useState<string | null>(null);\n const marqueePageRef = useRef<HTMLElement | null>(null);\n const marqueeBaseRef = useRef<string[]>([]);\n const [contextMenu, setContextMenu] = useState<{\n x: number;\n y: number;\n elementId?: string;\n canvasX?: number;\n canvasY?: number;\n } | null>(null);\n\n const updateBreakpoints = (next: BreakpointDefinition[]) =>\n setRootStyle({\n ...rootStyle,\n breakpoints: next,\n // Keep the current base unless it was the artboard just removed.\n baseBreakpointId: next.some((item) => item.id === cascade.baseId)\n ? cascade.baseId\n : baseOf(cascadeOf(next, undefined)).id,\n });\n\n /**\n * Moving the base moves where shared values live: the old base's values are\n * already in `element.base`, so the new base needs its own overrides folded\n * in and the old base needs an override carrying what it used to show.\n */\n const setBaseBreakpoint = (nextBaseId: string) => {\n if (nextBaseId === cascade.baseId) return;\n const nextCascade = cascadeOf(breakpointDefs, nextBaseId);\n\n setElements((els) =>\n els.map((el) => {\n // What each artboard shows today, before anything moves.\n const before = new Map(\n breakpointDefs.map((bp) => [bp.id, resolveStyle(el, bp.id, cascade)]),\n );\n\n const base = before.get(nextBaseId);\n if (!base) return el;\n\n const overrides: CanvasElement[\"overrides\"] = {};\n for (const bp of breakpointDefs) {\n if (bp.id === nextBaseId) continue;\n const effective = before.get(bp.id);\n if (!effective) continue;\n\n // Keep only what actually differs from the new base, so the\n // stored deltas stay meaningful rather than full copies.\n const delta: Partial<ElementStyle> = {};\n for (const key of STYLE_KEYS) {\n if (effective[key] !== base[key]) {\n delta[key] = effective[key] as never;\n }\n }\n if (Object.keys(delta).length > 0) overrides[bp.id] = delta;\n }\n\n return {\n ...el,\n base,\n overrides: Object.keys(overrides).length > 0 ? overrides : undefined,\n };\n }),\n );\n\n setRootStyle({ ...rootStyle, baseBreakpointId: nextCascade.baseId });\n };\n\n const addBreakpoint = () => {\n const id = `bp-${Date.now().toString(36)}`;\n const width = Math.max(240, selectedBreakpoint.width - 160);\n updateBreakpoints([\n ...breakpointDefs,\n { id, name: `Breakpoint ${breakpointDefs.length + 1}`, width },\n ]);\n setBreakpoint(id);\n };\n\n const moveBreakpoint = (sourceId: string, targetId: string) => {\n if (sourceId === targetId) return;\n const next = [...breakpointDefs];\n const from = next.findIndex((item) => item.id === sourceId);\n const to = next.findIndex((item) => item.id === targetId);\n if (from < 0 || to < 0) return;\n const [moved] = next.splice(from, 1);\n next.splice(to, 0, moved);\n updateBreakpoints(next);\n };\n\n const renameBreakpoint = (id: string, name: string) => {\n updateBreakpoints(\n breakpointDefs.map((item) =>\n item.id === id ? { ...item, name: name.slice(0, 40) } : item,\n ),\n );\n };\n\n const commitBreakpointName = (id: string) => {\n const item = breakpointDefs.find((entry) => entry.id === id);\n if (item && !item.name.trim()) renameBreakpoint(id, \"Breakpoint\");\n };\n\n const resizeBreakpoint = (id: string, width: number) => {\n const clamped = Math.round(Math.max(240, Math.min(3840, width)));\n if (!Number.isFinite(clamped)) return;\n updateBreakpoints(\n breakpointDefs.map((item) =>\n item.id === id ? { ...item, width: clamped } : item,\n ),\n );\n };\n\n const removeBreakpoint = (id: string) => {\n if (breakpointDefs.length < 2) return;\n const next = breakpointDefs.filter((item) => item.id !== id);\n // Drop the artboard's stored deltas too, otherwise they linger invisibly\n // and reappear if a breakpoint is later added back under the same id.\n setElements((els) =>\n els.map((el) => {\n if (!el.overrides?.[id]) return el;\n const overrides = { ...el.overrides };\n delete overrides[id];\n return {\n ...el,\n overrides: Object.keys(overrides).length > 0 ? overrides : undefined,\n };\n }),\n );\n updateBreakpoints(next);\n if (breakpoint === id) setBreakpoint(next[0].id);\n };\n\n /** What window widths an artboard actually governs on the published page. */\n const breakpointRange = (id: string) => {\n const item = breakpointDefs.find((entry) => entry.id === id);\n if (!item) return \"\";\n const ceiling = breakpointDefs\n .filter((other) => other.width > item.width)\n .reduce(\n (lowest, other) => Math.min(lowest, other.width),\n Number.POSITIVE_INFINITY,\n );\n return Number.isFinite(ceiling)\n ? `${item.width} \u2014 ${ceiling - 1}`\n : `${item.width}+`;\n };\n\n const beginCanvasResize = (event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n const startY = event.clientY;\n const initial = canvasHeight;\n const move = (pointer: MouseEvent) => {\n const height = Math.round(Math.max(1, Math.min(12000, initial + (pointer.clientY - startY) / scale)));\n setCanvasHeight(height);\n if (componentMode && activeComponentMaster) setElements((current) => current.map((element) => element.id === activeComponentMaster.id ? { ...element, base: { ...element.base, h: height, heightMode: \"fixed\" } } : element));\n };\n const up = (pointer: MouseEvent) => {\n const height = Math.round(Math.max(1, Math.min(12000, initial + (pointer.clientY - startY) / scale)));\n setCanvasHeight(height);\n setRootStyle({ ...rootStyle, canvasHeight: height });\n window.removeEventListener(\"mousemove\", move);\n window.removeEventListener(\"mouseup\", up);\n };\n window.addEventListener(\"mousemove\", move);\n window.addEventListener(\"mouseup\", up);\n };\n\n const beginComponentWidthResize = (event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n const startX = event.clientX;\n const initial = activeComponentMaster?.base.w ?? 320;\n const move = (pointer: MouseEvent) => {\n const width = Math.round(Math.max(1, Math.min(4000, initial + (pointer.clientX - startX) / scale)));\n if (activeComponentMaster) setElements((current) => current.map((element) => element.id === activeComponentMaster.id ? { ...element, base: { ...element.base, w: width, widthMode: \"fixed\" } } : element));\n };\n const up = () => {\n window.removeEventListener(\"mousemove\", move);\n window.removeEventListener(\"mouseup\", up);\n };\n window.addEventListener(\"mousemove\", move);\n window.addEventListener(\"mouseup\", up);\n };\n\n const applyAiPlan = (plan: AiDesignPlan) => {\n const pagePatch = plan.operations\n .filter((operation) => operation.kind === \"page\")\n .reduce<Partial<RootStyle>>(\n (patch, operation) => ({ ...patch, ...operation.style }),\n {},\n );\n if (Object.keys(pagePatch).length) setRootStyle(pagePatch);\n\n setElements((current) => {\n let next = [...current];\n const refs = new Map<string, string>();\n const addedIds = new Set<string>();\n for (const operation of plan.operations) {\n if (operation.kind === \"page\") continue;\n if (operation.kind === \"remove\") {\n if (next.some((element) => element.id === operation.id))\n next = removeSubtree(next, operation.id);\n continue;\n }\n if (operation.kind === \"add\") {\n const parentId = operation.parentId\n ? refs.get(operation.parentId) ?? operation.parentId\n : undefined;\n const created = createElement(operation.type, {\n x: operation.style?.x ?? 0,\n y: operation.style?.y ?? 0,\n z: nextZ(next, parentId),\n parentId,\n });\n created.base = { ...created.base, ...operation.style };\n created.overrides = {\n ...(operation.tabletStyle\n ? { tablet: operation.tabletStyle }\n : {}),\n ...(operation.mobileStyle\n ? { mobile: operation.mobileStyle }\n : {}),\n };\n if (operation.hoverStyle) created.hover = operation.hoverStyle;\n if (operation.pressStyle) created.press = operation.pressStyle;\n if (operation.loop) created.loop = operation.loop;\n if (operation.draggable !== undefined) created.draggable = operation.draggable;\n if (operation.styleBindings) created.styleBindings = operation.styleBindings;\n if (operation.interaction) created.interaction = {\n ...operation.interaction,\n value: operation.interaction.action === \"navigate\"\n ? operation.interaction.value\n : refs.get(operation.interaction.value) ?? operation.interaction.value,\n };\n if (operation.content !== undefined) created.content = operation.content;\n if (operation.src !== undefined) created.src = operation.src;\n if (operation.href !== undefined) created.href = operation.href;\n refs.set(operation.ref, created.id);\n addedIds.add(created.id);\n next.push(created);\n continue;\n }\n next = next.map((element) => {\n if (element.id !== operation.id) return element;\n const updated = operation.style\n ? applyStyle(element, cascade.baseId, operation.style, cascade)\n : element;\n return {\n ...updated,\n overrides: {\n ...updated.overrides,\n ...(operation.tabletStyle\n ? {\n tablet: {\n ...updated.overrides?.tablet,\n ...operation.tabletStyle,\n },\n }\n : {}),\n ...(operation.mobileStyle\n ? {\n mobile: {\n ...updated.overrides?.mobile,\n ...operation.mobileStyle,\n },\n }\n : {}),\n },\n hover: operation.hoverStyle\n ? { ...updated.hover, ...operation.hoverStyle }\n : updated.hover,\n press: operation.pressStyle\n ? { ...updated.press, ...operation.pressStyle }\n : updated.press,\n loop: operation.loop ?? updated.loop,\n draggable: operation.draggable ?? updated.draggable,\n styleBindings: operation.styleBindings\n ? { ...updated.styleBindings, ...operation.styleBindings }\n : updated.styleBindings,\n interaction: operation.interaction ? {\n ...operation.interaction,\n value: operation.interaction.action === \"navigate\"\n ? operation.interaction.value\n : refs.get(operation.interaction.value) ?? operation.interaction.value,\n } : updated.interaction,\n ...(operation.content !== undefined\n ? { content: operation.content }\n : {}),\n ...(operation.src !== undefined ? { src: operation.src } : {}),\n ...(operation.href !== undefined ? { href: operation.href } : {}),\n };\n });\n }\n const generatedById = new Map(next.map((element) => [element.id, element]));\n return next.map((element) => {\n if (!addedIds.has(element.id)) return element;\n const parent = element.parentId\n ? generatedById.get(element.parentId)\n : undefined;\n const parentStyle = parent?.base;\n const hasChildren = next.some((child) => child.parentId === element.id);\n const base = { ...element.base };\n\n // Keep generated compositions in the flow. Absolute children\n // and fixed section heights are the main source of overlaps\n // and fake-looking AI pages.\n if (element.type === \"Section\") {\n base.widthMode = \"fill\";\n base.heightMode = \"auto\";\n if (hasChildren) base.layout = \"stack\";\n }\n if (\n hasChildren &&\n [\"Frame\", \"Stack\", \"Container\", \"Grid\", \"Request\", \"Repeat\"].includes(\n element.type,\n ) &&\n base.layout === \"absolute\"\n ) {\n base.layout = \"stack\";\n }\n if ([\"Heading\", \"Text\", \"Button\"].includes(element.type)) {\n base.heightMode = \"auto\";\n }\n if (element.type === \"Button\") {\n base.layout = \"stack\";\n base.justify = \"center\";\n base.align = \"center\";\n if (parentStyle?.align === \"center\" && base.widthMode === \"fill\")\n base.widthMode = \"auto\";\n }\n return { ...element, base };\n });\n });\n };\n\n const [dragInfo, setDragInfo] = useState<DragInfo | null>(null);\n const [resizeInfo, setResizeInfo] = useState<ResizeInfo | null>(null);\n const [guides, setGuides] = useState<{\n origin: { x: number; y: number };\n lines: Guide[];\n }>({ origin: { x: 0, y: 0 }, lines: [] });\n const [ghost, setGhost] = useState<{ dx: number; dy: number } | null>(null);\n const [dropTargetId, setDropTargetId] = useState<string | null | undefined>(\n undefined,\n );\n const [clipboard, setClipboard] = useState<Clipboard | null>(null);\n /** Rows fetched by the Data panel, used to preview Repeat blocks. */\n const [samples, setSamples] = useState<Record<string, SourceSample>>({});\n\n useEffect(() => {\n // Page-local state must not leak into the next document. Chrome state\n // such as leftTab/rightTab intentionally remains untouched.\n setSelectedIds([]);\n setEditingId(null);\n setHoveredEffectId(null);\n setPressedEffectId(null);\n setPreviewVisibility({});\n setSamples({});\n setContextMenu(null);\n }, [page.id]);\n const [pageError, setPageError] = useState<string | null>(null);\n\n const canvasRef = useRef<HTMLDivElement>(null);\n const [canvasHeight, setCanvasHeight] = useState(rootStyle.canvasHeight);\n const [contentHeight, setContentHeight] = useState(rootStyle.canvasHeight);\n const displayCanvasHeight = Math.max(canvasHeight, contentHeight);\n\n const byId = useMemo(() => indexById(elements), [elements]);\n const componentAssetIds = useMemo(() => {\n const ids = new Set<string>();\n for (const master of elements.filter((element) => element.componentRole === \"master\")) for (const id of subtreeIds(elements, master.id)) ids.add(id);\n return ids;\n }, [elements]);\n const activeComponentIds = useMemo(\n () => activeComponentMaster ? subtreeIds(elements, activeComponentMaster.id) : new Set<string>(),\n [activeComponentMaster, elements],\n );\n const visibleEditorElements = useMemo(() => elements.filter((element) => componentMode ? activeComponentIds.has(element.id) : !componentAssetIds.has(element.id)), [activeComponentIds, componentAssetIds, componentMode, elements]);\n const selectedId = selectedIds.length === 1 ? selectedIds[0] : null;\n const selectedElement = selectedId ? byId.get(selectedId) : undefined;\n const deviceWidth = frameWidthForBreakpoint;\n const frameWidth = rootStyle.fullWidth\n ? deviceWidth\n : Math.min(deviceWidth, rootStyle.maxWidth);\n\n useEffect(() => setCanvasHeight(rootStyle.canvasHeight), [rootStyle.canvasHeight]);\n useEffect(() => {\n if (!componentMode || !activeComponentMaster) return;\n setCanvasHeight(Math.max(1, activeComponentMaster.base.h));\n setContentHeight(Math.max(1, activeComponentMaster.base.h));\n }, [activeComponentMaster?.base.h, activeComponentMaster?.id, componentMode]);\n useEffect(() => {\n const node = canvasRef.current;\n if (!node) return;\n const observer = new ResizeObserver(([entry]) => setContentHeight(Math.ceil(entry.contentRect.height)));\n observer.observe(node);\n return () => observer.disconnect();\n }, [breakpoint, componentMode]);\n\n /** How the parent of `element` arranges its children at this breakpoint. */\n const contextFor = useCallback(\n (element: CanvasElement, bp: Breakpoint = breakpoint) => {\n const parent = element.parentId ? byId.get(element.parentId) : undefined;\n const parentStyle = parent ? resolveStyle(parent, bp, cascade) : undefined;\n return {\n parentLayout: parentStyle?.layout ?? rootStyle.layout,\n parentDirection: parentStyle?.direction ?? rootStyle.direction,\n };\n },\n [byId, breakpoint, rootStyle.direction, rootStyle.layout],\n );\n\n /* ---------------------------------------------------------------- edits */\n\n const patchStyle = useCallback(\n (ids: string[], patch: Partial<ElementStyle>) => {\n setElements((els) =>\n els.map((el) =>\n ids.includes(el.id) ? applyStyleIsolated(el, breakpoint, patch, breakpointDefs.map((definition) => definition.id), cascade) : el,\n ),\n );\n },\n [breakpoint, breakpointDefs, cascade, setElements],\n );\n\n const patchProps = useCallback(\n (id: string, patch: Partial<CanvasElement>) => {\n setElements((els) =>\n els.map((el) => (el.id === id ? { ...el, ...patch } : el)),\n );\n },\n [setElements],\n );\n\n const resetOverrides = useCallback(\n (ids: string[], keys: StyleKey[]) => {\n setElements((els) =>\n els.map((el) =>\n ids.includes(el.id) ? clearOverrides(el, breakpoint, keys, cascade) : el,\n ),\n );\n },\n [breakpoint, cascade, setElements],\n );\n\n const deleteElements = useCallback(\n (ids: string[]) => {\n // Children live inside their parent, so they have to go with it.\n const doomed = new Set<string>();\n for (const id of ids) {\n for (const sub of subtreeIds(elements, id)) doomed.add(sub);\n }\n setElements((els) =>\n ids.reduce((acc, id) => removeSubtree(acc, id), els),\n );\n setSelectedIds((current) => current.filter((id) => !doomed.has(id)));\n setEditingId((current) => (current && doomed.has(current) ? null : current));\n setContextMenu(null);\n },\n [elements, setElements],\n );\n\n const duplicateElements = useCallback(\n (ids: string[]) => {\n const additions: CanvasElement[] = [];\n const roots: string[] = [];\n for (const id of ids) {\n const clone = cloneSubtree(elements, id);\n if (!clone) continue;\n additions.push(...clone.elements);\n roots.push(clone.rootId);\n }\n if (additions.length === 0) return;\n setElements((els) => [...els, ...additions]);\n setSelectedIds(roots);\n setContextMenu(null);\n },\n [elements, setElements],\n );\n\n const copyElements = useCallback(\n (ids: string[]) => {\n if (ids.length === 0) return;\n const wanted = new Set<string>();\n for (const id of ids) {\n for (const sub of subtreeIds(elements, id)) wanted.add(sub);\n }\n setClipboard({\n elements: elements.filter((el) => wanted.has(el.id)),\n rootId: ids[0],\n });\n },\n [elements],\n );\n\n const pasteClipboard = useCallback(() => {\n if (!clipboard) return;\n const clone = cloneSubtree(clipboard.elements, clipboard.rootId);\n if (!clone) return;\n\n // Paste into the selection when it can hold children, otherwise beside it.\n const anchor = selectedId ? byId.get(selectedId) : undefined;\n const parentId = anchor\n ? isContainer(anchor.type)\n ? anchor.id\n : anchor.parentId\n : undefined;\n const z = nextZ(elements, parentId);\n\n setElements((els) => [\n ...els,\n ...clone.elements.map((el) =>\n el.id === clone.rootId ? { ...el, parentId, z } : el,\n ),\n ]);\n setSelectedIds([clone.rootId]);\n }, [byId, clipboard, elements, selectedId, setElements]);\n\n const insertFromLibrary = useCallback(\n (pick: LibraryPick) => {\n const clone = cloneSubtree(pick.elements, pick.rootId, { x: 0, y: 0 });\n if (!clone) return;\n\n // Drop it into the selected container when there is one, so a block\n // can be nested rather than always landing at the page root.\n const anchor = selectedId ? byId.get(selectedId) : undefined;\n const parentId = anchor && isContainer(anchor.type) ? anchor.id : undefined;\n const z = nextZ(elements, parentId);\n\n setElements((els) => [\n ...els,\n ...clone.elements.map((el) =>\n el.id === clone.rootId ? { ...el, parentId, z } : el,\n ),\n ]);\n setSelectedIds([clone.rootId]);\n },\n [byId, elements, selectedId, setElements],\n );\n\n const insertElement = useCallback(\n (type: ElementType, props?: Partial<CanvasElement>) => {\n const anchor = selectedId ? byId.get(selectedId) : undefined;\n const parentId = anchor && isContainer(anchor.type) ? anchor.id : undefined;\n const element = createElement(type, {\n x: 32,\n y: 32,\n z: nextZ(elements, parentId),\n parentId,\n });\n Object.assign(element, props);\n setElements((current) => [...current, element]);\n setSelectedIds([element.id]);\n },\n [byId, elements, selectedId, setElements],\n );\n\n const createCodeComponent = () => {\n const master = createElement(\"Frame\", { x: 0, y: 0, z: nextZ(elements) });\n master.name = codeComponentName.trim() || \"Code Component\";\n master.code = codeComponentSource;\n master.componentRole = \"master\";\n master.componentId = master.id;\n master.componentSourceId = master.id;\n master.variant = \"Default\";\n master.base = { ...master.base, w: 360, h: 220, widthMode: \"fixed\", heightMode: \"fixed\", overflow: \"hidden\", bg: \"#ffffff\", radius: 16 };\n setElements((current) => [...current, master]);\n setRootStyle({ ...rootStyle, documentMode: \"component\", maxWidth: Math.max(rootStyle.maxWidth, 760) });\n setActiveComponentMasterId(master.id);\n setSelectedIds([master.id]);\n setLeftTab(\"Components\");\n setCodeComposerOpen(false);\n };\n\n const createBlankComponent = () => {\n const master = createElement(\"Frame\", { x: 0, y: 0, z: nextZ(elements) });\n master.name = `Component ${componentMasters.length + 1}`;\n master.componentRole = \"master\";\n master.componentId = master.id;\n master.componentSourceId = master.id;\n master.variant = \"Default\";\n master.base = { ...master.base, w: 320, h: 180, widthMode: \"fixed\", heightMode: \"fixed\", layout: \"absolute\", bg: \"#ffffff\", radius: 16, overflow: \"hidden\" };\n setElements((current) => [...current, master]);\n setRootStyle({ ...rootStyle, documentMode: \"component\", maxWidth: Math.max(rootStyle.maxWidth, 760) });\n setActiveComponentMasterId(master.id);\n setSelectedIds([master.id]);\n setBreakpoint(\"desktop\");\n setLeftTab(\"Components\");\n };\n\n const createComponentInstance = useCallback(() => {\n if (!selectedElement?.componentId || selectedElement.componentRole !== \"master\")\n return;\n const clone = cloneSubtree(elements, selectedElement.id, { x: 32, y: 32 });\n if (!clone) return;\n const copies = clone.elements.map((element) => ({\n ...element,\n componentRole: element.id === clone.rootId ? (\"instance\" as const) : undefined,\n componentId: selectedElement.componentId,\n variant: element.id === clone.rootId ? selectedElement.variant : undefined,\n }));\n setElements((current) => [...current, ...copies]);\n setSelectedIds([clone.rootId]);\n }, [elements, selectedElement, setElements]);\n\n const createComponentVariant = useCallback(() => {\n if (!selectedElement?.componentId || selectedElement.componentRole !== \"master\")\n return;\n const siblings = elements.filter(\n (element) =>\n element.componentRole === \"master\" &&\n element.componentId === selectedElement.componentId,\n );\n const clone = cloneSubtree(elements, selectedElement.id, { x: 0, y: 0 });\n if (!clone) return;\n const copies = clone.elements.map((element) => ({\n ...element,\n componentRole: element.id === clone.rootId ? (\"master\" as const) : undefined,\n componentId: selectedElement.componentId,\n variant:\n element.id === clone.rootId\n ? `Variant ${siblings.length + 1}`\n : undefined,\n }));\n setElements((current) => [...current, ...copies]);\n setActiveComponentMasterId(clone.rootId);\n setSelectedIds([clone.rootId]);\n }, [elements, selectedElement, setElements]);\n\n const switchInstanceVariant = useCallback(\n (variant: string) => {\n if (\n !selectedElement?.componentId ||\n selectedElement.componentRole !== \"instance\"\n )\n return;\n const master = elements.find(\n (element) =>\n element.componentRole === \"master\" &&\n element.componentId === selectedElement.componentId &&\n element.variant === variant,\n );\n if (!master) return;\n const masterIds = subtreeIds(elements, master.id);\n const sourceBySlot = new Map(\n elements\n .filter((element) => masterIds.has(element.id))\n .map((element) => [element.componentSourceId, element]),\n );\n const instanceIds = subtreeIds(elements, selectedElement.id);\n setElements((current) =>\n current.map((element) => {\n if (!instanceIds.has(element.id)) return element;\n const source = sourceBySlot.get(element.componentSourceId);\n if (!source) return element;\n const position = element.id === selectedElement.id\n ? {\n x: element.base.x,\n y: element.base.y,\n constraintX: element.base.constraintX,\n constraintY: element.base.constraintY,\n }\n : {};\n return {\n ...element,\n type: source.type,\n content: source.content,\n code: source.code,\n src: source.src,\n href: source.href,\n base: { ...source.base, ...position },\n overrides: source.overrides,\n hover: source.hover,\n press: source.press,\n loop: source.loop,\n draggable: source.draggable,\n variant:\n element.id === selectedElement.id ? variant : undefined,\n };\n }),\n );\n },\n [elements, selectedElement, setElements],\n );\n\n const nudge = useCallback(\n (dx: number, dy: number) => {\n const movable = selectedIds.filter((id) => {\n const el = byId.get(id);\n return el && !el.locked && contextFor(el).parentLayout === \"absolute\";\n });\n if (movable.length === 0) return;\n\n setElements((els) =>\n els.map((el) => {\n if (!movable.includes(el.id)) return el;\n const style = resolveStyle(el, breakpoint, cascade);\n return applyStyleIsolated(el, breakpoint, {\n x: style.x + dx,\n y: style.y + dy,\n }, breakpointDefs.map((definition) => definition.id), cascade);\n }),\n );\n },\n [breakpoint, breakpointDefs, byId, cascade, contextFor, selectedIds, setElements],\n );\n\n const doReparent = useCallback(\n (id: string, parentId: string | undefined, beforeId?: string) => {\n if (!componentMode && parentId && componentAssetIds.has(parentId)) return;\n setElements((els) => reparent(els, id, parentId, breakpoint, beforeId));\n },\n [breakpoint, componentAssetIds, componentMode, setElements],\n );\n\n const switchPageLayout = (layout: \"stack\" | \"absolute\") => {\n if (layout === rootStyle.layout) return;\n if (layout === \"absolute\") {\n const canvas = canvasRef.current;\n const canvasRect = canvas?.getBoundingClientRect();\n if (canvas && canvasRect) {\n const rootIds = new Set(childrenOf(visibleEditorElements, undefined).map((element) => element.id));\n setElements((current) => current.map((element) => {\n if (!rootIds.has(element.id)) return element;\n const node = canvas.querySelector<HTMLElement>(`[data-canvas-element=\"${element.id}\"]`);\n if (!node) return element;\n const rect = node.getBoundingClientRect();\n return applyStyleIsolated(element, breakpoint, { x: (rect.left - canvasRect.left) / scale, y: (rect.top - canvasRect.top) / scale }, breakpointDefs.map((definition) => definition.id), cascade);\n }));\n }\n setRootStyle({ ...rootStyle, layout: \"absolute\", padT: 0, padR: 0, padB: 0, padL: 0 });\n } else {\n const rootIds = new Set(childrenOf(visibleEditorElements, undefined).map((element) => element.id));\n setElements((current) => current.map((element) => rootIds.has(element.id) ? applyStyleIsolated(element, breakpoint, { x: 0, y: 0 }, breakpointDefs.map((definition) => definition.id), cascade) : element));\n setRootStyle({ ...rootStyle, layout: \"stack\" });\n }\n };\n\n const applyStyleKit = (kit: \"midnight\" | \"editorial\" | \"cobalt\" | \"warm\") => {\n const palette = {\n midnight: { bg: \"#090b10\", surface: \"#121620\", text: \"#f8fafc\", muted: \"#94a3b8\", accent: \"#7c5cff\", border: \"#252b38\" },\n editorial: { bg: \"#f3efe7\", surface: \"#fffdf8\", text: \"#171512\", muted: \"#746f66\", accent: \"#e14b32\", border: \"#d8d0c2\" },\n cobalt: { bg: \"#071425\", surface: \"#0d2038\", text: \"#f0f7ff\", muted: \"#91a9c2\", accent: \"#2f80ff\", border: \"#1d3a59\" },\n warm: { bg: \"#18110f\", surface: \"#251916\", text: \"#fff7ed\", muted: \"#c6a99b\", accent: \"#f97316\", border: \"#44302a\" },\n }[kit];\n setRootStyle({ ...rootStyle, bg: palette.bg, variables: [\n { id: \"kit-bg\", name: \"Background\", type: \"color\", value: palette.bg },\n { id: \"kit-surface\", name: \"Surface\", type: \"color\", value: palette.surface },\n { id: \"kit-text\", name: \"Text\", type: \"color\", value: palette.text },\n { id: \"kit-muted\", name: \"Muted\", type: \"color\", value: palette.muted },\n { id: \"kit-accent\", name: \"Accent\", type: \"color\", value: palette.accent },\n ] });\n setElements((current) => current.map((element) => {\n if (componentAssetIds.has(element.id)) return element;\n const base = { ...element.base };\n if (element.type === \"Button\") { base.bg = palette.accent; base.color = \"#ffffff\"; base.borderC = palette.accent; }\n else if (isTextual(element.type)) base.color = element.type === \"Text\" ? palette.muted : palette.text;\n else if (base.bg && base.bg !== \"transparent\") { base.bg = palette.surface; base.borderC = palette.border; }\n return { ...element, base };\n }));\n };\n\n const loadNocturneShowcase = () => {\n if (elements.some((element) => !componentAssetIds.has(element.id)) && !window.confirm(\"This replaces the current page canvas with the Nocturne showcase. Continue?\")) return;\n const showcase = createNocturneShowcase();\n beginTransaction();\n setElements((current) => [...current.filter((element) => componentAssetIds.has(element.id)), ...showcase.elements]);\n setRootStyle(showcase.rootStyle);\n setSelectedIds([]);\n setBreakpoint(\"desktop\");\n setLeftTab(\"Layers\");\n endTransaction();\n window.setTimeout(() => zoomToFit(), 80);\n };\n\n const select = useCallback((id: string, additive: boolean) => {\n setSelectedIds((current) => {\n if (!additive) return [id];\n return current.includes(id)\n ? current.filter((x) => x !== id)\n : [...current, id];\n });\n }, []);\n\n /* ------------------------------------------------------ drag and resize */\n\n const gesturing = dragInfo !== null || resizeInfo !== null;\n\n useEffect(() => {\n if (!gesturing) return;\n\n const handleMouseMove = (event: MouseEvent) => {\n\n const gestureBreakpoint = dragInfo?.breakpoint ?? resizeInfo?.breakpoint ?? breakpoint;\n\n if (dragInfo) {\n const moving = byId.get(dragInfo.id);\n if (!moving) return;\n\n const dx = (event.clientX - dragInfo.startX) / scale;\n const dy = (event.clientY - dragInfo.startY) / scale;\n\n // Which container would receive the element if dropped here.\n const rect = canvasRef.current?.getBoundingClientRect();\n if (rect) {\n const point = {\n x: (event.clientX - rect.left) / scale,\n y: (event.clientY - rect.top) / scale,\n };\n setDropTargetId(\n containerAt(visibleEditorElements, byId, point, gestureBreakpoint, dragInfo.id),\n );\n }\n\n if (dragInfo.mode === \"reflow\") {\n // Position is owned by the parent's layout, so only show a\n // ghost offset while the pointer looks for a new home.\n setGhost({ dx, dy });\n return;\n }\n\n const style = resolveStyle(moving, gestureBreakpoint, cascade);\n const proposed = {\n x: dragInfo.initialX + dx,\n y: dragInfo.initialY + dy,\n w: style.w,\n h: style.h,\n };\n\n const parent = moving.parentId ? byId.get(moving.parentId) : undefined;\n const parentStyle = parent ? resolveStyle(parent, gestureBreakpoint, cascade) : undefined;\n const gestureFrameWidth = breakpointDefs.find((definition) => definition.id === gestureBreakpoint)?.width ?? frameWidth;\n const frame = parentStyle\n ? { w: parentStyle.w, h: parentStyle.h }\n : { w: gestureFrameWidth, h: canvasHeight };\n\n // Alt suspends snapping for pixel-exact placement.\n const snapped = event.altKey\n ? { ...proposed, guides: [] as Guide[] }\n : snapPosition(\n elements,\n dragInfo.id,\n proposed,\n frame,\n gestureBreakpoint,\n 6 / scale,\n );\n\n setGuides({\n origin: parent\n ? absolutePosition(byId, parent, gestureBreakpoint, cascade)\n : { x: 0, y: 0 },\n lines: snapped.guides,\n });\n\n setElements((els) =>\n els.map((el) =>\n el.id === dragInfo.id\n ? applyStyleIsolated(el, gestureBreakpoint, { x: snapped.x, y: snapped.y }, breakpointDefs.map((definition) => definition.id), cascade)\n : el,\n ),\n );\n return;\n }\n\n if (!resizeInfo) return;\n const dx = (event.clientX - resizeInfo.startX) / scale;\n const dy = (event.clientY - resizeInfo.startY) / scale;\n const { initialX, initialY, initialW, initialH, handle } = resizeInfo;\n\n let x = initialX;\n let y = initialY;\n let w = initialW;\n let h = initialH;\n\n const resizing = byId.get(resizeInfo.id);\n const minSize = resizing?.componentRole === \"master\" ? 1 : MIN_SIZE;\n if (handle.includes(\"e\")) w = Math.max(minSize, initialW + dx);\n if (handle.includes(\"s\")) h = Math.max(minSize, initialH + dy);\n if (handle.includes(\"w\") && initialW - dx >= minSize) {\n w = initialW - dx;\n x = initialX + dx;\n }\n if (handle.includes(\"n\") && initialH - dy >= minSize) {\n h = initialH - dy;\n y = initialY + dy;\n }\n\n setElements((els) =>\n els.map((el) =>\n el.id === resizeInfo.id\n ? applyStyleIsolated(el, gestureBreakpoint, { x, y, w, h }, breakpointDefs.map((definition) => definition.id), cascade)\n : el,\n ),\n );\n };\n\n const handleMouseUp = () => {\n if (dragInfo) {\n const moving = byId.get(dragInfo.id);\n const currentParent = moving?.parentId;\n // `undefined` means the page root, which is a valid destination,\n // so only skip when nothing was hovered at all.\n if (\n dragInfo.mode === \"reflow\" &&\n dragInfo.breakpoint === cascade.baseId &&\n dropTargetId !== undefined &&\n dropTargetId !== currentParent\n ) {\n doReparent(dragInfo.id, dropTargetId ?? undefined);\n }\n }\n setDragInfo(null);\n setPressedEffectId(null);\n setResizeInfo(null);\n setGhost(null);\n setDropTargetId(undefined);\n setGuides({ origin: { x: 0, y: 0 }, lines: [] });\n // The whole gesture lands in the undo stack as a single step.\n endTransaction();\n };\n\n window.addEventListener(\"mousemove\", handleMouseMove);\n window.addEventListener(\"mouseup\", handleMouseUp);\n return () => {\n window.removeEventListener(\"mousemove\", handleMouseMove);\n window.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }, [\n breakpoint,\n breakpointDefs,\n byId,\n cascade,\n canvasHeight,\n doReparent,\n dragInfo,\n dropTargetId,\n elements,\n endTransaction,\n frameWidth,\n gesturing,\n resizeInfo,\n scale,\n setElements,\n visibleEditorElements,\n ]);\n\n const handleElementMouseDown = (\n event: React.MouseEvent,\n el: CanvasElement,\n bp: Breakpoint = breakpoint,\n ) => {\n // Space-drag and middle-drag pan the canvas instead of moving elements.\n if (tryBeginPan(event)) return;\n event.stopPropagation();\n // Editing in a frame switches the toolbar to that frame's breakpoint,\n // so the inspector and the drag write to the same layer.\n if (bp !== breakpoint) setBreakpoint(bp);\n if (effectsPreview) {\n if (el.press) setPressedEffectId(el.id);\n const interaction = el.interaction;\n if (interaction && [\"toggle-layer\", \"show-layer\", \"hide-layer\"].includes(interaction.action)) {\n const target = byId.get(interaction.value);\n if (target) setPreviewVisibility((current) => {\n const currentlyVisible = current[target.id] ?? !resolveStyle(target, bp, cascade).hidden;\n const visible = interaction.action === \"show-layer\" ? true : interaction.action === \"hide-layer\" ? false : !currentlyVisible;\n return { ...current, [target.id]: visible };\n });\n }\n return;\n }\n select(el.id, event.shiftKey || event.metaKey);\n if (editingId !== el.id) setEditingId(null);\n if (el.locked || editingId === el.id) return;\n\n const style = resolveStyle(el, bp, cascade);\n beginTransaction();\n setDragInfo({\n id: el.id,\n breakpoint: bp,\n mode: contextFor(el).parentLayout === \"absolute\" ? \"free\" : \"reflow\",\n startX: event.clientX,\n startY: event.clientY,\n initialX: style.x,\n initialY: style.y,\n });\n };\n\n const handleResizeMouseDown = (\n event: React.MouseEvent,\n handle: ResizeHandle,\n el: CanvasElement,\n bp: Breakpoint,\n ) => {\n event.stopPropagation();\n if (bp !== breakpoint) setBreakpoint(bp);\n setSelectedIds([el.id]);\n const style = resolveStyle(el, bp, cascade);\n beginTransaction();\n setResizeInfo({\n id: el.id,\n breakpoint: bp,\n handle,\n startX: event.clientX,\n startY: event.clientY,\n initialX: style.x,\n initialY: style.y,\n initialW: style.w,\n initialH: style.h,\n });\n };\n\n const beginMarquee = (event: React.MouseEvent, bp: Breakpoint) => {\n if (event.button !== 0 || spaceHeld || tryBeginPan(event)) return;\n event.preventDefault();\n if (bp !== breakpoint) setBreakpoint(bp);\n marqueePageRef.current = ((event.currentTarget as HTMLElement).closest(\"[data-canvas-page]\") ?? event.currentTarget) as HTMLElement;\n marqueeBaseRef.current = event.shiftKey || event.metaKey ? selectedIds : [];\n if (!marqueeBaseRef.current.length) setSelectedIds([]);\n setEditingId(null);\n setMarquee({ startX: event.clientX, startY: event.clientY, x: event.clientX, y: event.clientY });\n };\n\n useEffect(() => {\n if (!marquee) return;\n const move = (event: MouseEvent) => {\n const left = Math.min(marquee.startX, event.clientX);\n const top = Math.min(marquee.startY, event.clientY);\n const right = Math.max(marquee.startX, event.clientX);\n const bottom = Math.max(marquee.startY, event.clientY);\n const hits = Array.from(marqueePageRef.current?.querySelectorAll<HTMLElement>(\"[data-canvas-element]\") ?? []).flatMap((node) => {\n const rect = node.getBoundingClientRect();\n const intersects = rect.right >= left && rect.left <= right && rect.bottom >= top && rect.top <= bottom;\n const id = node.dataset.canvasElement;\n return intersects && id ? [id] : [];\n });\n setSelectedIds(Array.from(new Set([...marqueeBaseRef.current, ...hits])));\n setMarquee((current) => current ? { ...current, x: event.clientX, y: event.clientY } : null);\n };\n const up = () => {\n setMarquee(null);\n marqueePageRef.current = null;\n };\n window.addEventListener(\"mousemove\", move);\n window.addEventListener(\"mouseup\", up, { once: true });\n return () => {\n window.removeEventListener(\"mousemove\", move);\n window.removeEventListener(\"mouseup\", up);\n };\n }, [marquee?.startX, marquee?.startY]);\n\n /* ------------------------------------------------------------- dropping */\n\n const handleDrop = (event: React.DragEvent, parentId: string | null) => {\n event.preventDefault();\n event.stopPropagation();\n setDropTargetId(undefined);\n\n // An existing layer dragged out of the Layers panel.\n const movedId = event.dataTransfer.getData(MOVE_MIME);\n if (movedId) {\n doReparent(movedId, parentId ?? undefined);\n setSelectedIds([movedId]);\n return;\n }\n\n const componentId = event.dataTransfer.getData(COMPONENT_MIME);\n if (componentId) {\n const master = elements.find((element) => element.id === componentId && element.componentRole === \"master\");\n if (!master) return;\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect();\n const style = resolveStyle(master, cascade.baseId, cascade);\n const x = Math.max(0, (event.clientX - rect.left) / scale - style.w / 2);\n const y = Math.max(0, (event.clientY - rect.top) / scale - style.h / 2);\n const clone = cloneSubtree(elements, master.id, { x: x - style.x, y: y - style.y });\n if (!clone) return;\n const copies = clone.elements.map((element) => element.id === clone.rootId ? { ...element, parentId: parentId ?? undefined, componentRole: \"instance\" as const, componentId: master.componentId, variant: master.variant, z: nextZ(elements, parentId ?? undefined) } : { ...element, componentRole: undefined });\n setElements((current) => [...current, ...copies]);\n setSelectedIds([clone.rootId]);\n return;\n }\n\n const type = event.dataTransfer.getData(DRAG_MIME) as ElementType;\n if (!type) return;\n\n // The drop target's rect is already scaled by the zoom transform, so\n // dividing brings the pointer back into canvas coordinates.\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect();\n const x = (event.clientX - rect.left) / scale;\n const y = (event.clientY - rect.top) / scale;\n\n const element = createElement(type, {\n x: 0,\n y: 0,\n z: nextZ(elements, parentId ?? undefined),\n parentId: parentId ?? undefined,\n });\n element.base.x = Math.max(0, x - element.base.w / 2);\n element.base.y = Math.max(0, y - element.base.h / 2);\n\n setElements((els) => [...els, element]);\n setSelectedIds([element.id]);\n };\n\n /* ------------------------------------------------------------ shortcuts */\n\n useEffect(() => {\n const handler = (event: KeyboardEvent) => {\n const target = event.target as HTMLElement | null;\n const typing =\n !!target &&\n (target.isContentEditable ||\n [\"INPUT\", \"TEXTAREA\", \"SELECT\"].includes(target.tagName));\n\n if (event.key === \"Escape\") {\n if (editingId) setEditingId(null);\n else setSelectedIds([]);\n setContextMenu(null);\n return;\n }\n\n const mod = event.metaKey || event.ctrlKey;\n const key = event.key.toLowerCase();\n\n\n // These stay live even while a field has focus.\n if (mod && key === \"s\") {\n event.preventDefault();\n saveNow();\n return;\n }\n if (mod && key === \"z\") {\n event.preventDefault();\n if (event.shiftKey) redo();\n else undo();\n return;\n }\n if (mod && key === \"y\") {\n event.preventDefault();\n redo();\n return;\n }\n if (mod && (event.key === \"=\" || event.key === \"+\")) {\n event.preventDefault();\n stepZoom(1);\n return;\n }\n if (mod && event.key === \"-\") {\n event.preventDefault();\n stepZoom(-1);\n return;\n }\n if (mod && event.key === \"0\") {\n event.preventDefault();\n zoomTo(100);\n return;\n }\n\n // Everything below would fight with normal text entry.\n if (typing) return;\n\n if (mod && key === \"a\") {\n event.preventDefault();\n setSelectedIds(elements.map((el) => el.id));\n return;\n }\n if (mod && key === \"c\" && selectedIds.length) {\n copyElements(selectedIds);\n return;\n }\n if (mod && key === \"x\" && selectedIds.length) {\n copyElements(selectedIds);\n deleteElements(selectedIds);\n return;\n }\n if (mod && key === \"v\") {\n event.preventDefault();\n pasteClipboard();\n return;\n }\n if (mod && key === \"d\" && selectedIds.length) {\n event.preventDefault();\n duplicateElements(selectedIds);\n return;\n }\n if ((event.key === \"Delete\" || event.key === \"Backspace\") && selectedIds.length) {\n event.preventDefault();\n deleteElements(selectedIds);\n return;\n }\n\n const step = event.shiftKey ? 10 : 1;\n const arrows: Record<string, [number, number]> = {\n ArrowLeft: [-step, 0],\n ArrowRight: [step, 0],\n ArrowUp: [0, -step],\n ArrowDown: [0, step],\n };\n const delta = arrows[event.key];\n if (delta) {\n event.preventDefault();\n nudge(delta[0], delta[1]);\n }\n };\n\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [\n copyElements,\n deleteElements,\n duplicateElements,\n editingId,\n elements,\n nudge,\n pasteClipboard,\n redo,\n saveNow,\n selectedIds,\n stepZoom,\n undo,\n zoomTo,\n ]);\n\n useEffect(() => {\n if (!contextMenu) return;\n const close = () => setContextMenu(null);\n window.addEventListener(\"click\", close);\n return () => window.removeEventListener(\"click\", close);\n }, [contextMenu]);\n\n /* -------------------------------------------------------- page actions */\n\n const runPageAction = useCallback(\n (\n action: () => Promise<\n { status: \"ok\"; pageId?: string } | { status: \"error\"; message: string }\n >,\n navigate: false | \"push\" | \"replace\" = false,\n ) => {\n setPageError(null);\n startTransition(async () => {\n const result = await action();\n if (result.status === \"error\") {\n setPageError(result.message);\n return;\n }\n if (navigate && result.pageId) adapters?.navigate?.(result.pageId, { replace: navigate === \"replace\" });\n else adapters?.refresh?.();\n });\n },\n [adapters],\n );\n\n const installSiteTemplate = useCallback((templateId: SiteTemplateId) => {\n setPageError(null);\n startTransition(async () => {\n const result = await (adapters?.installTemplate ?? unavailable)(templateId);\n if (result.status === \"error\") {\n setPageError(result.message);\n return;\n }\n // A template can replace the currently open page document. A hard\n // navigation guarantees stale editor state cannot autosave over it.\n if (result.pageId) adapters?.navigate?.(result.pageId, { replace: true });\n });\n }, [adapters]);\n\n const publish = useCallback(() => {\n // Flush the draft first; Publish snapshots whatever the server holds.\n saveNow();\n setPageError(null);\n startTransition(async () => {\n const result = await (adapters?.publishPage ?? unavailable)(page.id);\n if (result.status === \"error\") setPageError(result.message);\n else adapters?.refresh?.();\n });\n }, [adapters, page.id, saveNow]);\n\n /* --------------------------------------------------------------- render */\n\n const enclosingDataBlock = useMemo(() => {\n if (!selectedElement) return undefined;\n let cursor = selectedElement.parentId\n ? byId.get(selectedElement.parentId)\n : undefined;\n const guard = new Set<string>([selectedElement.id]);\n while (cursor && !guard.has(cursor.id)) {\n guard.add(cursor.id);\n if (cursor.type === \"Repeat\" || cursor.type === \"Request\") return cursor;\n cursor = cursor.parentId ? byId.get(cursor.parentId) : undefined;\n }\n return undefined;\n }, [byId, selectedElement]);\n\n const bindingSourceId = enclosingDataBlock?.sourceId ?? selectedElement?.sourceId;\n const bindingKeys = bindingSourceId\n ? (samples[bindingSourceId]?.keys ?? [])\n : [];\n\n const canvasData = useMemo(\n () =>\n Object.fromEntries(\n Object.entries(samples).map(([id, sample]) => [id, sample.rows]),\n ),\n [samples],\n );\n\n type Frame = { bp: Breakpoint; width: number };\n\n const renderNode = (\n raw: CanvasElement,\n frame: Frame,\n row?: Row,\n keyPrefix = \"\",\n ): React.ReactNode => {\n const directRow = row ?? (raw.sourceId ? canvasData[raw.sourceId]?.[0] : undefined);\n const el = bindElement(raw, directRow);\n const resolvedStyle = resolveStyle(el, frame.bp, cascade);\n const isActiveFrame = frame.bp === breakpoint;\n const previewVisible = previewVisibility[el.id];\n if (previewVisible !== undefined) resolvedStyle.hidden = !previewVisible;\n const style = {\n ...resolvedStyle,\n ...(isActiveFrame && hoveredEffectId === el.id ? el.hover : undefined),\n ...(isActiveFrame && pressedEffectId === el.id ? el.press : undefined),\n };\n if (style.hidden) return null;\n\n const children = childrenOf(elements, el.id);\n const container = isContainer(el.type);\n const isSelected = isActiveFrame && selectedIds.includes(el.id);\n const isEditing = isActiveFrame && editingId === el.id;\n const isDropTarget = isActiveFrame && dropTargetId === el.id;\n const isGhosting = ghost !== null && dragInfo?.id === el.id && dragInfo.breakpoint === frame.bp;\n\n const note = isNote(el, byId, frame.bp, frame.width, rootStyle.layout, cascade);\n const band = isBand(el.type, style, rootStyle);\n const css = styleToCss(style, contextFor(el, frame.bp), el);\n if (el.hover || el.press) css.transition = \"transform .42s cubic-bezier(.16,1,.3,1), scale .42s cubic-bezier(.16,1,.3,1), rotate .42s cubic-bezier(.16,1,.3,1), background-color .32s ease, color .32s ease, border-color .32s ease, box-shadow .42s cubic-bezier(.16,1,.3,1), opacity .32s ease, filter .42s ease\";\n css.zIndex = el.z;\n if (el.loop) css.animation = `pg-loop-${el.loop.type} ${el.loop.duration}ms ease-in-out infinite`;\n css.cursor = el.locked ? \"default\" : isEditing ? \"text\" : \"move\";\n css.outline = isSelected\n ? \"1.5px solid var(--ed-accent)\"\n : isDropTarget\n ? \"1.5px solid #22c55e\"\n : note\n ? \"1.5px dashed var(--ed-accent)\"\n : undefined;\n if (note) css.opacity = 0.55;\n css.outlineOffset = isSelected || isDropTarget ? \"-1px\" : undefined;\n // A band paints edge to edge while its content sits in a centred inner\n // box \u2014 the same split the published stylesheet emits.\n const split = band ? splitBand(css, rootStyle.maxWidth) : null;\n if (isGhosting) {\n css.transform = `${css.transform ?? \"\"} translate(${ghost.dx}px, ${ghost.dy}px)`;\n css.opacity = 0.6;\n css.pointerEvents = \"none\";\n }\n\n // Repeat iterates sampled rows. Request renders once and passes the\n // sampled object to every descendant as its binding context.\n const renderChildren = () =>\n el.type === \"Repeat\"\n ? rowsFor(el, canvasData, true).flatMap((dataRow, index) =>\n children.map((child) =>\n renderNode(child, frame, dataRow, `${keyPrefix}${index}:`),\n ),\n )\n : children.map((child) => renderNode(\n child,\n frame,\n el.type === \"Request\" ? canvasData[el.sourceId ?? \"\"]?.[0] : row,\n keyPrefix,\n ));\n\n return (\n // A canvas node is manipulated by pointer; the Layers panel is its keyboard equivalent.\n // biome-ignore lint/a11y/noStaticElementInteractions: pointer-driven canvas node\n <div\n key={`${keyPrefix}${el.id}`}\n data-canvas-element={el.id}\n style={split ? split.shell : css}\n onMouseDown={(event) => handleElementMouseDown(event, el, frame.bp)}\n onMouseEnter={() => effectsPreview && el.hover && setHoveredEffectId(el.id)}\n onMouseUp={() => effectsPreview && setPressedEffectId((id) => id === el.id ? null : id)}\n onMouseLeave={() => { setHoveredEffectId((id) => id === el.id ? null : id); setPressedEffectId((id) => id === el.id ? null : id); }}\n onDoubleClick={(event) => {\n event.stopPropagation();\n if (isTextual(el.type) && !el.locked) setEditingId(el.id);\n }}\n onContextMenu={(event) => {\n event.preventDefault();\n event.stopPropagation();\n if (!selectedIds.includes(el.id)) setSelectedIds([el.id]);\n setContextMenu({\n x: event.clientX,\n y: event.clientY,\n elementId: el.id,\n });\n }}\n onDragOver={\n container\n ? (event) => {\n event.preventDefault();\n event.stopPropagation();\n event.dataTransfer.dropEffect = \"copy\";\n setDropTargetId(el.id);\n }\n : undefined\n }\n onDragLeave={\n container\n ? () => setDropTargetId((c) => (c === el.id ? undefined : c))\n : undefined\n }\n onDrop={container ? (event) => handleDrop(event, el.id) : undefined}\n >\n {isEditing ? (\n <textarea\n // Focus follows the double-click that opened the editor.\n ref={(node) => node?.focus()}\n value={el.content ?? \"\"}\n onChange={(event) => patchProps(el.id, { content: event.target.value })}\n onMouseDown={(event) => event.stopPropagation()}\n onClick={(event) => event.stopPropagation()}\n onDoubleClick={(event) => event.stopPropagation()}\n onBlur={() => setEditingId(null)}\n className=\"min-h-[1em] w-full flex-1 resize-none overflow-hidden whitespace-pre-wrap bg-transparent text-inherit outline-none\"\n style={{\n font: \"inherit\",\n color: \"inherit\",\n textAlign: style.textAlign,\n letterSpacing: \"inherit\",\n lineHeight: \"inherit\",\n }}\n />\n ) : (\n <ElementBody element={el} />\n )}\n\n {split ? (\n <div style={split.inner}>{renderChildren()}</div>\n ) : (\n renderChildren()\n )}\n\n {isSelected && !note && (\n <span\n className=\"pointer-events-none absolute -bottom-1 left-1/2 z-[70] translate-y-full whitespace-nowrap rounded px-1.5 py-0.5 font-mono text-[10px] font-medium text-white shadow-sm\"\n style={{\n background: \"var(--ed-accent)\",\n // Undo the canvas zoom so the label keeps one size.\n transform: `translate(-50%, 100%) scale(${1 / scale})`,\n transformOrigin: \"top center\",\n }}\n >\n {Math.round(style.widthMode === \"fixed\" ? style.w : 0) || \"auto\"} \u00D7{\" \"}\n {Math.round(style.heightMode === \"fixed\" ? style.h : 0) || \"auto\"}\n </span>\n )}\n\n {note && (\n <span\n className=\"pointer-events-none absolute -top-5 left-0 whitespace-nowrap rounded px-1.5 py-0.5 text-[10px] font-medium\"\n style={{\n background: \"var(--ed-accent-soft)\",\n color: \"var(--ed-accent)\",\n }}\n >\n Note \u00B7 not published\n </span>\n )}\n\n {isSelected && !el.locked && selectedIds.length === 1 && (\n <ResizeHandles\n element={el}\n style={style}\n onMouseDown={(event, handle, element) => handleResizeMouseDown(event, handle, element, frame.bp)}\n />\n )}\n </div>\n );\n };\n\n const rootCss = rootStyleToCss(rootStyle);\n const customFontCss = (rootStyle.customFonts ?? []).map((font) => `@font-face{font-family:\"${font.name.replace(/[\"'{};]/g, \"\")}\";src:url(\"${font.url.replace(/[\"'()\\\\]/g, \"\")}\");font-weight:${font.weight};font-style:${font.style};font-display:swap}`).join(\"\\n\");\n const arrangeable = useMemo(() => {\n if (selectedIds.length < 2) return false;\n const parents = new Set(\n selectedIds.map((id) => byId.get(id)?.parentId ?? \"__root__\"),\n );\n if (parents.size !== 1) return false;\n const first = byId.get(selectedIds[0]);\n return first ? contextFor(first).parentLayout === \"absolute\" : false;\n }, [byId, contextFor, selectedIds]);\n\n const menuElementId = contextMenu?.elementId;\n\n return (\n <div\n className=\"pg-editor flex h-screen w-full flex-col overflow-hidden bg-ed-surface font-sans text-xs text-ed-text selection:bg-blue-500/30\"\n data-ed-theme={chromeTheme === \"light\" ? \"light\" : undefined}\n >\n <header className=\"relative z-30 grid h-14 shrink-0 grid-cols-[minmax(0,1fr)_auto_minmax(0,1fr)] items-center gap-3 border-b border-ed-border bg-ed-surface/90 px-3 backdrop-blur-2xl\">\n <button type=\"button\" onClick={() => setIsLeftCollapsed((current) => !current)} title=\"Toggle sidebar\" className=\"w-fit text-[13px] font-semibold tracking-tight text-ed-text\">Pagiera</button>\n\n <div className=\"pg-chrome-card flex items-center gap-2 rounded-2xl border border-ed-border bg-ed-subtle/90 p-1.5 backdrop-blur-xl\">\n <div className=\"flex items-center gap-2 text-[11px] font-medium text-ed-muted\">\n {componentMode && <><Select value={activeComponentMaster?.id} onValueChange={(id) => { setActiveComponentMasterId(id); setSelectedIds([id]); }}><SelectTrigger aria-label=\"Variant\"><SelectValue placeholder=\"Select variant\" /></SelectTrigger><SelectContent>{activeComponentVariants.map((master) => <SelectItem key={master.id} value={master.id}>{master.variant ?? \"Default\"}</SelectItem>)}</SelectContent></Select><button type=\"button\" onClick={createComponentVariant} disabled={selectedElement?.componentRole !== \"master\"} title=\"Add variant\" className=\"flex size-7 items-center justify-center rounded-lg bg-ed-field text-ed-muted hover:bg-ed-field-hover hover:text-ed-text disabled:opacity-30\"><IconPlus size={13} /></button></>}\n <div className=\"flex items-center gap-0.5\">\n <button\n type=\"button\"\n title=\"Zoom out (Ctrl -)\"\n onClick={() => stepZoom(-1)}\n className=\"rounded p-1 transition-colors hover:bg-ed-field hover:text-ed-text\"\n >\n <IconMinus size={12} />\n </button>\n <button\n type=\"button\"\n title=\"Reset zoom (Ctrl 0)\"\n onClick={() => zoomTo(100)}\n className=\"w-10 select-none text-center tabular-nums transition-colors hover:text-ed-text\"\n >\n {zoom}%\n </button>\n <button\n type=\"button\"\n title=\"Zoom in (Ctrl +)\"\n onClick={() => stepZoom(1)}\n className=\"rounded p-1 transition-colors hover:bg-ed-field hover:text-ed-text\"\n >\n <IconPlus size={12} />\n </button>\n </div>\n </div>\n\n <div className=\"flex items-center gap-2 border-l border-ed-border pl-2 text-ed-muted\">\n <button\n type=\"button\"\n title=\"Undo (Ctrl Z)\"\n onClick={undo}\n disabled={!canUndo}\n className=\"transition-colors hover:text-ed-text disabled:cursor-not-allowed disabled:opacity-40 disabled:hover:text-ed-muted\"\n >\n <IconArrowBackUp size={16} />\n </button>\n <button\n type=\"button\"\n title=\"Redo (Ctrl Shift Z)\"\n onClick={redo}\n disabled={!canRedo}\n className=\"transition-colors hover:text-ed-text disabled:cursor-not-allowed disabled:opacity-40 disabled:hover:text-ed-muted\"\n >\n <IconArrowForwardUp size={16} />\n </button>\n </div>\n </div>\n\n <div className=\"flex min-w-0 items-center justify-end gap-2\">\n {page.publishedAt && (\n <a\n href={(adapters?.publishedHref ?? defaultPublishedHref)(page.slug)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"hidden items-center gap-1.5 text-[11px] text-emerald-500 transition-colors hover:text-emerald-400 xl:flex\"\n >\n <IconWorld size={14} />\n {(adapters?.publishedHref ?? defaultPublishedHref)(page.slug)}\n <IconExternalLink size={11} />\n </a>\n )}\n <button\n type=\"button\"\n onClick={publish}\n disabled={isPending || isDirty}\n title={isDirty ? \"Waiting for the draft to save\u2026\" : undefined}\n className=\"rounded-lg bg-ed-accent px-3 py-1.5 text-[11px] font-semibold text-white shadow-sm transition-all hover:opacity-90 disabled:opacity-50\"\n >\n {isPending ? \"Working\u2026\" : page.publishedAt ? \"Republish\" : \"Publish\"}\n </button>\n {page.publishedAt && (\n <button\n type=\"button\"\n onClick={() =>\n runPageAction(() => (adapters?.unpublishPage ?? unavailable)(page.id, page.slug))\n }\n className=\"text-[11px] text-ed-muted transition-colors hover:text-ed-text\"\n >\n Unpublish\n </button>\n )}\n <button\n type=\"button\"\n title={chromeTheme === \"dark\" ? \"Switch to light editor\" : \"Switch to dark editor\"}\n aria-label=\"Toggle editor theme\"\n onClick={toggleChromeTheme}\n className=\"rounded-md p-1.5 text-ed-muted transition-colors hover:bg-ed-field hover:text-ed-text\"\n >\n {chromeTheme === \"dark\" ? <IconSun size={16} /> : <IconMoon size={16} />}\n </button>\n <button\n type=\"button\"\n onClick={() => setIsRightCollapsed((c) => !c)}\n className=\"text-ed-faint transition-colors hover:text-ed-text\"\n >\n {isRightCollapsed ? (\n <IconLayoutSidebarLeftCollapse size={18} />\n ) : (\n <IconLayoutSidebarRightCollapse size={18} />\n )}\n </button>\n </div>\n </header>\n\n <div className=\"flex flex-1 overflow-hidden bg-ed-canvas\">\n {/* Thin Toolbar */}\n <aside className=\"z-20 flex w-12 shrink-0 flex-col items-center border-r border-ed-border bg-ed-surface/95 py-2 backdrop-blur-xl\">\n <button\n type=\"button\"\n title=\"Select (V)\"\n className=\"mb-1 flex size-8 items-center justify-center rounded-xl bg-ed-accent/15 text-ed-accent ring-1 ring-inset ring-ed-accent/20 transition-all hover:scale-105 hover:bg-ed-accent/20\"\n >\n <IconPointer size={17} stroke={1.7} />\n </button>\n <button\n type=\"button\"\n title=\"Insert (A)\"\n className=\"flex size-8 items-center justify-center rounded-lg text-ed-muted transition-colors hover:bg-ed-field hover:text-ed-text\"\n onClick={() => {\n setLeftTab(\"Elements\");\n setIsLeftCollapsed(false);\n }}\n >\n <IconPlus size={18} stroke={1.8} />\n </button>\n <div className=\"my-2 h-px w-5 bg-ed-border\" />\n <div className=\"flex w-full flex-col items-center gap-1 px-1.5\">\n {[\"Layers\", componentMode ? \"Components\" : \"Assets\", \"Library\", \"Icons\", ...(componentMode ? [] : [\"Templates\"]), \"Variables\", \"AI\", \"Data\", ...(componentMode ? [] : [\"Pages\"])].map((tab) => {\n const Icon =\n tab === \"Layers\"\n ? IconLayersLinked\n : tab === \"Elements\"\n ? IconBox\n : tab === \"Library\"\n ? IconLibrary\n : tab === \"Icons\"\n ? IconIcons\n : tab === \"Templates\"\n ? IconTemplate\n : tab === \"Variables\"\n ? IconPalette\n : tab === \"AI\"\n ? IconSparkles\n : tab === \"Components\" || tab === \"Assets\"\n ? IconComponents\n : tab === \"Data\"\n ? IconDatabase\n : IconFile;\n return (\n <button\n type=\"button\"\n key={tab}\n onClick={() => {\n setLeftTab(tab);\n if (isLeftCollapsed) setIsLeftCollapsed(false);\n }}\n className={`flex size-8 items-center justify-center rounded-xl transition-all hover:scale-105 ${\n leftTab === tab && !isLeftCollapsed\n ? \"bg-ed-field text-ed-accent\"\n : \"text-ed-muted hover:bg-ed-subtle hover:text-ed-text\"\n }`}\n title={tab}\n >\n <Icon size={17} stroke={1.6} />\n </button>\n );\n })}\n </div>\n </aside>\n\n {/* Left Panel */}\n <AnimatePresence initial={false}>\n {!isLeftCollapsed && (\n <motion.aside initial={{ width: 0, opacity: 0, x: -12 }} animate={{ width: 292, opacity: 1, x: 0 }} exit={{ width: 0, opacity: 0, x: -12 }} transition={{ type: \"spring\", stiffness: 420, damping: 38 }} className=\"relative z-10 flex w-[292px] shrink-0 flex-col overflow-hidden border-r border-ed-border bg-ed-surface/95 backdrop-blur-xl\">\n <div className=\"flex h-11 shrink-0 items-center justify-between border-b border-ed-border px-3.5\">\n <span className=\"text-[11px] font-semibold text-ed-text\">{leftTab}</span>\n <button type=\"button\" onClick={() => setIsLeftCollapsed(true)} className=\"text-ed-faint hover:text-ed-muted transition-colors p-1 rounded-md hover:bg-ed-field\">\n <IconX size={16} />\n </button>\n </div>\n\n {leftTab !== \"Pages\" && leftTab !== \"Components\" && leftTab !== \"Assets\" && leftTab !== \"Library\" && leftTab !== \"Templates\" && leftTab !== \"Variables\" && leftTab !== \"Data\" && leftTab !== \"AI\" && (\n <div className=\"border-b border-ed-border p-3 bg-ed-subtle\">\n <div className=\"flex items-center gap-2 rounded-md border border-ed-border bg-ed-surface px-2.5 py-1.5 transition-all focus-within:border-ed-accent/50 focus-within:ring-1 focus-within:ring-blue-500/20\">\n <IconSearch size={14} className=\"text-ed-faint\" />\n <input\n type=\"text\"\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n placeholder={`Search ${leftTab.toLowerCase()}...`}\n className=\"w-full bg-transparent text-xs text-ed-text outline-none placeholder:text-ed-faint\"\n />\n <IconCommand size={12} className=\"text-ed-faint\" />\n </div>\n </div>\n )}\n\n <div className=\"custom-scrollbar flex-1 overflow-y-auto\">\n {leftTab === \"Layers\" ? (\n <LayersPanel\n elements={visibleEditorElements}\n breakpoint={breakpoint}\n search={search}\n selectedIds={selectedIds}\n onSelect={select}\n onToggleHidden={(id) => {\n const el = byId.get(id);\n if (el) {\n patchStyle([id], {\n hidden: !resolveStyle(el, breakpoint, cascade).hidden,\n });\n }\n }}\n onToggleLocked={(id) => {\n const el = byId.get(id);\n if (el) patchProps(id, { locked: !el.locked });\n }}\n onReorder={(id, direction) =>\n setElements((els) => reorder(els, id, direction))\n }\n onDelete={(id) => deleteElements([id])}\n onReparent={doReparent}\n />\n ) : leftTab === \"Elements\" ? (\n <ElementsPanel search={search} onInsert={insertElement} />\n ) : leftTab === \"Icons\" ? (\n <IconsPanel search={search} onInsert={(iconName) => insertElement(\"Icon\", { iconName })} />\n ) : leftTab === \"Data\" ? (\n <DataPanel\n sources={dataSources}\n samples={samples}\n onChange={setDataSources}\n onSample={(id, sample) =>\n setSamples((prev) => ({ ...prev, [id]: sample }))\n }\n preview={adapters?.previewSource ?? (async () => ({ status: \"error\", message: \"No data preview adapter configured.\" }))}\n />\n ) : leftTab === \"Library\" ? (\n <LibraryPanel\n pages={library}\n currentPageId={page.id}\n onInsert={insertFromLibrary}\n />\n ) : leftTab === \"Templates\" ? (\n <TemplatesPanel busy={isPending} onInstall={(id) => {\n if (!window.confirm(\"Replace this site with the selected template? All existing pages and their revisions will be deleted.\")) return;\n installSiteTemplate(id);\n }} />\n ) : leftTab === \"Assets\" ? (\n <div className=\"p-3\"><div className=\"mb-3 rounded-xl border border-ed-border bg-ed-subtle p-3\"><p className=\"text-[11px] font-semibold text-ed-text\">Project assets</p><p className=\"mt-1 text-[9px] leading-relaxed text-ed-faint\">Open a component to edit its own canvas, or drag a variant directly onto the page.</p></div><div className=\"mb-2 flex items-center justify-between\"><span className=\"text-[10px] font-semibold text-ed-muted\">Components</span><span className=\"flex gap-1\"><button type=\"button\" onClick={createBlankComponent} className=\"flex items-center gap-1 rounded-md bg-ed-field px-2 py-1 text-[9px] text-ed-muted hover:text-ed-text\"><IconPlus size={10} /> New</button><button type=\"button\" onClick={() => setCodeComposerOpen(true)} className=\"flex items-center gap-1 rounded-md bg-ed-field px-2 py-1 text-[9px] text-ed-muted hover:text-ed-text\">Code</button></span></div><div className=\"space-y-2\">{componentMasters.map((master) => <button key={master.id} type=\"button\" draggable onDragStart={(event) => { event.dataTransfer.setData(COMPONENT_MIME, master.id); event.dataTransfer.effectAllowed = \"copy\"; }} onClick={() => { setRootStyle({ ...rootStyle, documentMode: \"component\" }); setActiveComponentMasterId(master.id); setSelectedIds([master.id]); setBreakpoint(\"desktop\"); setLeftTab(\"Components\"); }} className=\"group flex w-full cursor-grab items-center gap-3 rounded-xl border border-ed-border bg-ed-subtle p-2.5 text-left hover:border-ed-accent/50 hover:bg-ed-field active:cursor-grabbing\"><span className=\"flex size-9 items-center justify-center rounded-lg bg-ed-field text-ed-accent\"><IconComponents size={16} /></span><span className=\"min-w-0 flex-1\"><span className=\"block truncate text-[10px] font-semibold text-ed-text\">{master.name ?? \"Component\"}</span><span className=\"block text-[9px] text-ed-faint\">{master.variant ?? \"Default\"} \u00B7 drag to insert</span></span></button>)}{componentMasters.length === 0 && <p className=\"rounded-xl border border-dashed border-ed-border p-5 text-center text-[10px] text-ed-faint\">Create a component or add one from code.</p>}</div></div>\n ) : leftTab === \"Variables\" ? (\n <VariablesPanel\n rootStyle={rootStyle}\n selectedElement={selectedElement}\n setRootStyle={setRootStyle}\n setElements={setElements}\n />\n ) : leftTab === \"AI\" ? (\n <AiPanel\n pageId={page.id}\n elements={elements}\n rootStyle={rootStyle}\n breakpoint={breakpoint}\n onApply={applyAiPlan}\n generate={adapters?.generate}\n />\n ) : leftTab === \"Components\" ? (\n <div className=\"p-3\"><div className=\"mb-3 flex items-center justify-between\"><div><p className=\"text-[11px] font-semibold text-ed-text\">Component canvas</p><p className=\"mt-1 text-[9px] text-ed-faint\">Every variant opens in its own resizable canvas.</p></div><button type=\"button\" onClick={() => { setRootStyle({ ...rootStyle, documentMode: \"page\" }); setLeftTab(\"Layers\"); }} className=\"rounded-lg bg-ed-field px-2 py-1.5 text-[9px] text-ed-muted hover:text-ed-text\">Page mode</button></div>{selectedElement?.componentRole === \"master\" && <div className=\"mb-3 space-y-2 rounded-xl border border-ed-border bg-ed-subtle p-2.5\"><label className=\"flex items-center gap-2 text-[9px] text-ed-faint\"><span className=\"w-16\">Name</span><input value={selectedElement.name ?? \"\"} placeholder=\"Component name\" onChange={(event) => patchProps(selectedElement.id, { name: event.target.value })} className=\"h-8 min-w-0 flex-1 rounded-lg bg-ed-field px-2.5 text-[10px] text-ed-text outline-none focus:ring-1 focus:ring-ed-accent\" /></label><label className=\"flex items-center gap-2 text-[9px] text-ed-faint\"><span className=\"w-16\">Variant</span><input value={selectedElement.variant ?? \"Default\"} onChange={(event) => patchProps(selectedElement.id, { variant: event.target.value })} className=\"h-8 min-w-0 flex-1 rounded-lg bg-ed-field px-2.5 text-[10px] text-ed-text outline-none focus:ring-1 focus:ring-ed-accent\" /></label></div>}<div className=\"space-y-2\">{componentMasters.map((master) => <button key={master.id} type=\"button\" onClick={() => { setActiveComponentMasterId(master.id); setSelectedIds([master.id]); }} className={`flex w-full items-center gap-3 rounded-xl border p-2.5 text-left ${activeComponentMaster?.id === master.id ? \"border-ed-accent bg-ed-accent/10\" : \"border-ed-border bg-ed-subtle hover:bg-ed-field\"}`}><span className=\"flex size-8 items-center justify-center rounded-lg bg-ed-field text-ed-accent\"><IconComponents size={15} /></span><span className=\"min-w-0 flex-1\"><span className=\"block truncate text-[10px] font-semibold text-ed-text\">{master.name ?? \"Component\"}</span><span className=\"block text-[9px] text-ed-faint\">{master.variant ?? \"Default\"}</span></span><span className=\"font-mono text-[9px] text-ed-faint\">{Math.round(master.base.w)}\u00D7{Math.round(master.base.h)}</span></button>)}{componentMasters.length === 0 && <p className=\"rounded-xl border border-dashed border-ed-border p-5 text-center text-[10px] text-ed-faint\">Create a new component canvas.</p>}</div><button type=\"button\" onClick={createComponentVariant} disabled={selectedElement?.componentRole !== \"master\"} className=\"mt-3 flex w-full items-center justify-center gap-1.5 rounded-lg bg-ed-accent px-3 py-2 text-[10px] font-semibold text-white disabled:opacity-30\"><IconPlus size={12} /> Add variant</button></div>\n ) : (\n <PagesPanel\n pages={pages}\n currentId={page.id}\n busy={isPending}\n error={pageError}\n onCreate={(name) =>\n runPageAction(() => (adapters?.createPage ?? unavailable)(name, name), \"push\")\n }\n onRename={(id, name, slug) =>\n runPageAction(() => (adapters?.renamePage ?? unavailable)(id, name, slug))\n }\n onDuplicate={(id, name) =>\n runPageAction(\n () => (adapters?.duplicatePage ?? unavailable)(id, name, name),\n \"push\",\n )\n }\n onDelete={(id) =>\n runPageAction(() => (adapters?.deletePage ?? unavailable)(id), id === page.id ? \"replace\" : false)\n }\n onNavigate={(id) => (adapters?.navigate ?? ((pageId) => { window.location.href = defaultEditorHref(pageId); }))(id)}\n publishedHref={adapters?.publishedHref ?? defaultPublishedHref}\n />\n )}\n </div>\n\n <div className=\"flex items-center justify-between border-t border-ed-border p-2 px-3 text-ed-muted\">\n <span className=\"text-[10px] tabular-nums\">\n {elements.length} element{elements.length === 1 ? \"\" : \"s\"}\n </span>\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n title=\"Duplicate (Ctrl D)\"\n disabled={selectedIds.length === 0}\n onClick={() => duplicateElements(selectedIds)}\n className=\"rounded p-1.5 transition-colors hover:bg-ed-field hover:text-ed-text disabled:pointer-events-none disabled:opacity-30\"\n >\n <IconCopy size={16} />\n </button>\n <button\n type=\"button\"\n title=\"Delete (Del)\"\n disabled={selectedIds.length === 0}\n onClick={() => deleteElements(selectedIds)}\n className=\"rounded p-1.5 transition-colors hover:bg-ed-field hover:text-ed-text disabled:pointer-events-none disabled:opacity-30\"\n >\n <IconTrash size={16} />\n </button>\n </div>\n </div>\n </motion.aside>\n )}\n </AnimatePresence>\n\n <main\n className=\"relative flex flex-1 flex-col overflow-hidden bg-ed-canvas\"\n style={{\n // The grid is drawn from the border colour, so it reads\n // on the dark well and the light one alike.\n backgroundImage:\n \"linear-gradient(to right, var(--ed-grid) 1px, transparent 1px), linear-gradient(to bottom, var(--ed-grid) 1px, transparent 1px)\",\n backgroundSize: \"28px 28px\",\n backgroundPosition: \"-1px -1px\",\n }}\n onMouseDown={(event) => {\n if (event.target === event.currentTarget) setSelectedIds([]);\n }}\n >\n {/* biome-ignore lint/a11y/noStaticElementInteractions: pan surface; Ctrl +/-/0 cover the same ground from the keyboard */}\n <div\n ref={viewportRef}\n className=\"canvas-scrollbar absolute inset-0 overflow-auto overscroll-none\"\n style={{ cursor: isPanning ? \"grabbing\" : spaceHeld ? \"grab\" : undefined }}\n onMouseDown={(event) => {\n if (tryBeginPan(event)) return;\n setContextMenu(null);\n if (event.target === event.currentTarget) beginMarquee(event, breakpoint);\n }}\n onContextMenu={(event) => {\n if ((event.target as HTMLElement).closest(\"[data-canvas-page]\")) return;\n event.preventDefault();\n const rect = frameRef.current?.getBoundingClientRect();\n setContextMenu({\n x: event.clientX,\n y: event.clientY,\n canvasX: rect ? Math.round((event.clientX - rect.left) / scale) : 0,\n canvasY: rect ? Math.round((event.clientY - rect.top) / scale) : 0,\n });\n }}\n >\n {/* The gutter is what makes panning possible: with the\n frames sized to fit exactly there would be no scroll\n range at all, and space-drag would do nothing. Fixed\n rather than viewport units: the canvas area is\n narrower than the window by however much the panels\n take, so vw/vh under-measured it. */}\n <div className=\"flex min-w-max items-start justify-center gap-10 px-[900px] py-[560px]\">\n {frames.map((frame) => {\n const primary = frame.bp === breakpoint;\n const definition = breakpointDefs.find(\n (item) => item.id === frame.bp,\n );\n const isBaseFrame = !componentMode && frame.bp === cascade.baseId;\n return (\n <div key={frame.bp} className=\"flex flex-col gap-2\">\n <div\n draggable={!componentMode}\n onDragStart={(event) => { if (componentMode) return; setDraggedBreakpointId(frame.bp); event.dataTransfer.effectAllowed = \"move\"; }}\n onDragEnd={() => setDraggedBreakpointId(null)}\n onDragOver={(event) => { event.preventDefault(); event.dataTransfer.dropEffect = \"move\"; }}\n onDrop={(event) => { event.preventDefault(); if (draggedBreakpointId) moveBreakpoint(draggedBreakpointId, frame.bp); setDraggedBreakpointId(null); }}\n className={`flex h-8 cursor-grab items-center gap-2 rounded-lg border px-2 active:cursor-grabbing ${draggedBreakpointId === frame.bp ? \"border-ed-accent bg-ed-accent/10 opacity-60\" : \"border-ed-border bg-ed-subtle\"}`}\n style={{ width: frame.width * scale }}\n >\n {editingBreakpointId === frame.bp && !componentMode ? (\n <input\n ref={(node) => node?.select()}\n value={definition?.name ?? frame.bp}\n onChange={(event) => renameBreakpoint(frame.bp, event.target.value)}\n onBlur={(event) => { renameBreakpoint(frame.bp, event.target.value); commitBreakpointName(frame.bp); setEditingBreakpointId(null); }}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") event.currentTarget.blur();\n if (event.key === \"Escape\") setEditingBreakpointId(null);\n }}\n className=\"w-24 rounded bg-ed-field px-1 text-[11px] font-medium text-ed-text outline-none ring-1 ring-ed-accent\"\n />\n ) : (\n <button\n type=\"button\"\n onClick={() => setBreakpoint(frame.bp)}\n onDoubleClick={() => { if (!componentMode) setEditingBreakpointId(frame.bp); }}\n title={componentMode ? undefined : \"Double-click to rename\"}\n className={`text-[11px] font-medium capitalize transition-colors ${\n primary\n ? \"text-ed-text\"\n : \"text-ed-faint hover:text-ed-muted\"\n }`}\n >\n {componentMode ? activeComponentMaster?.name ?? \"Component\" : definition?.name ?? frame.bp}\n </button>\n )}\n\n {componentMode ? (\n <span className=\"font-mono text-[10px] text-ed-faint\">{`${frame.width} \u00D7 ${canvasHeight}`}</span>\n ) : (\n <input\n type=\"number\"\n value={frame.width}\n onChange={(event) => resizeBreakpoint(frame.bp, Number(event.target.value))}\n onFocus={(event) => event.target.select()}\n title={`Governs ${breakpointRange(frame.bp)}px`}\n className=\"w-12 bg-transparent font-mono text-[10px] text-ed-faint outline-none hover:text-ed-muted focus:text-ed-text [appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none\"\n />\n )}\n {!componentMode && (\n <span className=\"font-mono text-[10px] text-ed-faint/60\">{breakpointRange(frame.bp)}</span>\n )}\n\n <div className=\"ml-auto flex items-center gap-1\">\n {!componentMode && (\n <button\n type=\"button\"\n onClick={(event) => { event.stopPropagation(); setBaseBreakpoint(frame.bp); }}\n disabled={isBaseFrame}\n title={isBaseFrame ? \"Main breakpoint \u2014 its edits are shared\" : \"Make main breakpoint\"}\n className={`flex size-5 items-center justify-center rounded-md ${isBaseFrame ? \"bg-ed-accent/15 text-ed-accent\" : \"bg-ed-field text-ed-muted hover:bg-ed-field-hover hover:text-ed-text\"}`}\n >\n {isBaseFrame ? <IconPinFilled size={11} /> : <IconPin size={11} />}\n </button>\n )}\n {!componentMode && breakpointDefs.length > 1 && (\n <button\n type=\"button\"\n onClick={(event) => { event.stopPropagation(); removeBreakpoint(frame.bp); }}\n title=\"Remove breakpoint\"\n className=\"flex size-5 items-center justify-center rounded-md bg-ed-field text-ed-muted hover:bg-red-500/15 hover:text-red-400\"\n >\n <IconTrash size={11} />\n </button>\n )}\n <button type=\"button\" onClick={(event) => { event.stopPropagation(); if (componentMode) createComponentVariant(); else addBreakpoint(); }} disabled={componentMode && selectedElement?.componentRole !== \"master\"} className=\"flex size-5 items-center justify-center rounded-md bg-ed-field text-ed-muted hover:bg-ed-field-hover hover:text-ed-text disabled:opacity-30\" title={componentMode ? \"Add variant\" : \"Add breakpoint\"}><IconPlus size={12} /></button>\n </div>\n </div>\n\n {/* Reserves the scaled footprint so the\n scrollbars match what is on screen. */}\n <div\n className=\"group/frame relative\"\n style={{\n width: frame.width * scale,\n height: displayCanvasHeight * scale,\n flexShrink: 0,\n }}\n >\n {/* biome-ignore lint/a11y/noStaticElementInteractions: simulated viewport; a bare click clears the selection, as Escape does */}\n <div\n ref={primary ? frameRef : undefined}\n data-canvas-page\n className=\"shadow-2xl\"\n style={{\n width: frame.width,\n minHeight: canvasHeight,\n background: rootStyle.bg,\n transform: `scale(${scale})`,\n transformOrigin: \"top left\",\n outline:\n primary && frames.length > 1\n ? \"2px solid var(--ed-accent)\"\n : undefined,\n outlineOffset: 3,\n }}\n onMouseDown={(event) => {\n if (event.target === event.currentTarget)\n beginMarquee(event, frame.bp);\n }}\n >\n {/* biome-ignore lint/a11y/noStaticElementInteractions: the page surface clears the selection on a bare click; Escape does the same */}\n <div\n ref={primary ? canvasRef : undefined}\n style={{\n ...rootCss,\n // Match the published page: the\n // app font must not leak in.\n fontFamily: resolveFont(\n rootStyle.fontFamily,\n ),\n // The shell spans the frame; the\n // content width comes from bands.\n maxWidth: \"none\",\n minHeight: canvasHeight,\n }}\n onDragOver={(event) => {\n event.preventDefault();\n event.dataTransfer.dropEffect = \"copy\";\n setDropTargetId(null);\n }}\n onDrop={(event) => handleDrop(event, null)}\n onMouseDown={(event) => {\n if (event.target === event.currentTarget)\n beginMarquee(event, frame.bp);\n }}\n >\n {visibleEditorElements.length === 0 && (\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center text-sm font-medium text-ed-muted\">\n Drag an element here to start\n </div>\n )}\n\n {childrenOf(visibleEditorElements, undefined).map((el) =>\n renderNode(\n el,\n frame,\n undefined,\n `${frame.bp}:`,\n ),\n )}\n\n {primary &&\n guides.lines.map((guide) => (\n <div\n key={`${guide.axis}-${guide.at}-${guide.from}`}\n className=\"pointer-events-none absolute z-[9999] bg-fuchsia-500\"\n style={\n guide.axis === \"x\"\n ? {\n left:\n guides.origin.x +\n guide.at,\n top:\n guides.origin.y +\n guide.from,\n width: 1,\n height:\n guide.to -\n guide.from,\n }\n : {\n top:\n guides.origin.y +\n guide.at,\n left:\n guides.origin.x +\n guide.from,\n height: 1,\n width:\n guide.to -\n guide.from,\n }\n }\n />\n ))}\n </div>\n </div>\n {componentMode && <button type=\"button\" aria-label=\"Resize component width\" onMouseDown={beginComponentWidthResize} className=\"absolute -right-1.5 inset-y-0 z-30 w-3 cursor-ew-resize opacity-0 transition-opacity group-hover/frame:opacity-100\"><span className=\"absolute inset-y-1/2 left-1/2 h-12 w-1 -translate-x-1/2 -translate-y-1/2 rounded-full bg-ed-accent shadow-[0_0_0_3px_var(--ed-accent-soft)]\" /></button>}\n {primary && <button type=\"button\" aria-label={`Resize ${componentMode ? \"component\" : \"page\"} canvas height`} onMouseDown={beginCanvasResize} className=\"absolute -bottom-1.5 inset-x-0 z-30 h-3 cursor-ns-resize opacity-0 transition-opacity group-hover/frame:opacity-100\"><span className=\"absolute left-1/2 top-1/2 h-1 w-14 -translate-x-1/2 -translate-y-1/2 rounded-full bg-ed-accent shadow-[0_0_0_3px_var(--ed-accent-soft)]\" /></button>}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n\n <div className=\"absolute bottom-0 left-0 z-20 flex h-8 w-full items-center gap-2 border-t border-ed-border bg-ed-surface px-4 text-[11px] text-ed-muted shadow-sm\">\n <Breadcrumbs\n byId={byId}\n selectedId={selectedId}\n onSelect={(id) => setSelectedIds([id])}\n />\n </div>\n\n <div className=\"absolute bottom-12 right-6 z-20 flex items-center gap-0.5 rounded-lg border border-ed-border bg-ed-surface/90 p-1 shadow-md backdrop-blur\">\n <button type=\"button\" title={effectsPreview ? \"Stop interaction preview\" : \"Preview hover, press and layer actions\"} onClick={() => { setEffectsPreview((value) => !value); setHoveredEffectId(null); setPressedEffectId(null); setPreviewVisibility({}); }} className={`rounded-md p-1.5 transition-colors ${effectsPreview ? \"bg-ed-accent text-white\" : \"text-ed-faint hover:bg-ed-field hover:text-ed-text\"}`}><IconPlayerPlay size={16} stroke={1.5} /></button>\n <button\n type=\"button\"\n title=\"Select\"\n className=\"rounded-md bg-[var(--ed-accent-soft)] p-1.5 text-ed-accent\"\n >\n <IconPointer size={16} stroke={1.5} />\n </button>\n <button\n type=\"button\"\n title=\"Recentre the canvas\"\n onClick={recenter}\n className=\"rounded-md p-1.5 text-ed-faint transition-colors hover:bg-ed-field hover:text-ed-text\"\n >\n <IconFocusCentered size={16} stroke={1.5} />\n </button>\n <button\n type=\"button\"\n title=\"Zoom to 100% (Ctrl 0)\"\n onClick={() => zoomTo(100)}\n className=\"rounded-md px-1.5 py-1.5 font-mono text-[11px] text-ed-faint transition-colors hover:bg-ed-field hover:text-ed-text\"\n >\n 1:1\n </button>\n <button\n type=\"button\"\n title=\"Fit to width\"\n onClick={() => zoomToFit()}\n className=\"rounded-md p-1.5 text-ed-faint transition-colors hover:bg-ed-field hover:text-ed-text\"\n >\n <IconArrowsMaximize size={16} stroke={1.5} />\n </button>\n </div>\n </main>\n\n <AnimatePresence initial={false}>\n {!isRightCollapsed && (\n <motion.aside initial={{ width: 0, opacity: 0, x: 14 }} animate={{ width: 312, opacity: 1, x: 0 }} exit={{ width: 0, opacity: 0, x: 14 }} transition={{ type: \"spring\", stiffness: 420, damping: 38 }} className=\"z-10 flex w-[312px] shrink-0 flex-col overflow-hidden border-l border-ed-border bg-ed-surface/95 backdrop-blur-xl\">\n <div className=\"flex h-11 shrink-0 items-end gap-0.5 border-b border-ed-border px-2\">\n {([\"Design\", \"Content\", \"Hover\", \"Interact\"] as const).map((tab) => (\n <button\n type=\"button\"\n key={tab}\n onClick={() => setRightTab(tab)}\n disabled={!selectedElement}\n className={`relative flex-1 px-2 pb-3 pt-2 text-[11px] font-medium transition-colors disabled:opacity-30 ${\n rightTab === tab\n ? \"text-ed-text\"\n : \"text-ed-muted hover:text-ed-text\"\n }`}\n >\n {tab === \"Hover\" ? \"Effects\" : tab === \"Interact\" ? \"Actions\" : tab}\n {rightTab === tab && selectedElement && (\n <motion.span\n layoutId=\"inspector-tab\"\n className=\"absolute inset-x-2 -bottom-px h-0.5 rounded-full bg-ed-accent\"\n transition={{ type: \"spring\", stiffness: 500, damping: 40 }}\n />\n )}\n </button>\n ))}\n </div>\n\n {selectedElement && breakpoint !== \"desktop\" && (\n <p className=\"border-b border-ed-border bg-amber-500/10 px-5 py-2.5 text-[11px] leading-relaxed text-amber-500\">\n Editing the <b>{breakpoint}</b> breakpoint. Changes here\n override desktop and only apply at this size.\n </p>\n )}\n\n <div className=\"custom-scrollbar flex flex-1 flex-col overflow-y-auto px-4 py-3\">\n {selectedElement ? (\n <>\n <div className=\"mb-1 flex items-baseline justify-between\">\n <span className=\"text-[15px] font-semibold tracking-tight text-ed-text\">\n {selectedElement.type}\n </span>\n <span className=\"font-mono text-[10px] text-ed-faint\">\n {selectedElement.id.slice(0, 6)}\n </span>\n </div>\n <div className=\"mb-3 flex items-center gap-1.5\">\n {!componentMode && rootStyle.layout === \"absolute\" && selectedElement.parentId && <button type=\"button\" onClick={() => doReparent(selectedElement.id, undefined)} className=\"flex-1 rounded-lg border border-ed-border bg-ed-subtle px-2.5 py-2 text-[10px] font-medium text-ed-muted hover:border-ed-accent/50 hover:bg-ed-field hover:text-ed-text\">Detach to canvas</button>}\n {selectedElement.componentRole === \"master\" && (\n <>\n <span className=\"rounded-md bg-ed-accent/15 px-2 py-1 text-[9px] font-semibold uppercase text-ed-accent\">\n Master \u00B7 {selectedElement.variant}\n </span>\n <button type=\"button\" onClick={createComponentInstance} className=\"rounded-lg bg-ed-field px-2 py-1.5 text-[9px] text-ed-text hover:bg-ed-field-hover\">Instance</button>\n <button type=\"button\" onClick={createComponentVariant} className=\"rounded-lg bg-ed-field px-2 py-1.5 text-[9px] text-ed-text hover:bg-ed-field-hover\">+ Variant</button>\n </>\n )}\n {selectedElement.componentRole === \"instance\" && (\n <Select\n value={selectedElement.variant ?? \"Default\"}\n onValueChange={switchInstanceVariant}\n >\n <SelectTrigger className=\"h-8 min-w-0 flex-1\" aria-label=\"Component variant\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {elements\n .filter(\n (element) =>\n element.componentRole === \"master\" &&\n element.componentId ===\n selectedElement.componentId,\n )\n .map((element) => (\n <SelectItem\n key={element.id}\n value={element.variant ?? \"Default\"}\n >\n {element.variant ?? \"Default\"}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n </div>\n <motion.div\n key={rightTab}\n initial={{ opacity: 0, y: 7 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.18, ease: [0.16, 1, 0.3, 1] }}\n ><Inspector\n tab={rightTab}\n element={selectedElement}\n elements={visibleEditorElements}\n style={resolveStyle(selectedElement, breakpoint, cascade)}\n breakpoint={breakpoint}\n parentLayout={contextFor(selectedElement).parentLayout}\n onStyle={(patch) => patchStyle([selectedElement.id], patch)}\n onReset={(keys) => resetOverrides([selectedElement.id], keys)}\n onProps={(patch) => patchProps(selectedElement.id, patch)}\n onCommitStart={beginTransaction}\n onCommitEnd={endTransaction}\n sources={dataSources}\n bindingKeys={bindingKeys}\n insideRepeat={enclosingDataBlock !== undefined}\n /></motion.div>\n </>\n ) : selectedIds.length > 1 ? (\n <MultiSelectPanel\n count={selectedIds.length}\n canArrange={arrangeable}\n onAlign={(action) =>\n setElements((els) =>\n alignElements(els, selectedIds, action, breakpoint),\n )\n }\n onDistribute={(action) =>\n setElements((els) =>\n distributeElements(els, selectedIds, action, breakpoint),\n )\n }\n />\n ) : (\n <PageInspector rootStyle={rootStyle} onChange={(patch) => patch.layout ? switchPageLayout(patch.layout) : setRootStyle(patch)} onApplyStyleKit={applyStyleKit} onLoadShowcase={loadNocturneShowcase} />\n )}\n </div>\n </motion.aside>\n )}\n </AnimatePresence>\n </div>\n\n {codeComposerOpen && <div className=\"fixed inset-0 z-[100] flex items-center justify-center bg-black/65 p-6 backdrop-blur-sm\" onMouseDown={() => setCodeComposerOpen(false)}><div className=\"flex h-[min(720px,85vh)] w-[min(820px,92vw)] flex-col overflow-hidden rounded-2xl border border-ed-border bg-ed-surface shadow-2xl\" onMouseDown={(event) => event.stopPropagation()}><div className=\"flex h-12 items-center justify-between border-b border-ed-border px-4\"><div><p className=\"text-xs font-semibold text-ed-text\">New code component</p><p className=\"text-[9px] text-ed-faint\">Sandboxed HTML and CSS \u2014 scripts stay disabled.</p></div><button type=\"button\" onClick={() => setCodeComposerOpen(false)} className=\"rounded-md p-1.5 text-ed-muted hover:bg-ed-field hover:text-ed-text\"><IconX size={15} /></button></div><div className=\"grid min-h-0 flex-1 grid-cols-2\"><div className=\"flex min-h-0 flex-col gap-3 border-r border-ed-border p-4\"><label className=\"text-[10px] font-medium text-ed-muted\">Name<input value={codeComponentName} onChange={(event) => setCodeComponentName(event.target.value)} className=\"mt-1.5 h-9 w-full rounded-lg border border-ed-border bg-ed-field px-3 text-[11px] text-ed-text outline-none focus:border-ed-accent\" /></label><label className=\"flex min-h-0 flex-1 flex-col text-[10px] font-medium text-ed-muted\">HTML / CSS<textarea value={codeComponentSource} onChange={(event) => setCodeComponentSource(event.target.value)} spellCheck={false} className=\"mt-1.5 min-h-0 flex-1 resize-none rounded-xl border border-ed-border bg-[#101114] p-3 font-mono text-[11px] leading-relaxed text-zinc-300 outline-none focus:border-ed-accent\" /></label></div><div className=\"flex min-h-0 flex-col bg-ed-canvas p-4\"><span className=\"mb-2 text-[10px] font-medium text-ed-muted\">Preview</span><iframe title=\"Code component preview\" srcDoc={codeComponentSource} sandbox=\"\" className=\"min-h-0 flex-1 rounded-xl border border-ed-border bg-white\" /></div></div><div className=\"flex h-14 items-center justify-end gap-2 border-t border-ed-border px-4\"><button type=\"button\" onClick={() => setCodeComposerOpen(false)} className=\"rounded-lg px-3 py-2 text-[10px] text-ed-muted hover:bg-ed-field\">Cancel</button><button type=\"button\" onClick={createCodeComponent} disabled={!codeComponentSource.trim()} className=\"rounded-lg bg-ed-accent px-3 py-2 text-[10px] font-semibold text-white disabled:opacity-30\">Create component</button></div></div></div>}\n\n {breakpointPanel && !componentMode && (\n <div className=\"fixed left-1/2 top-16 z-[80] w-[420px] -translate-x-1/2 rounded-2xl border border-ed-border bg-ed-surface p-4 shadow-2xl\">\n <div className=\"mb-4 flex items-start justify-between\">\n <div>\n <h3 className=\"text-sm font-semibold text-ed-text\">Breakpoints</h3>\n <p className=\"mt-1 text-[11px] text-ed-muted\">Rename, resize and reorder the viewports. Main values are shared by every other size.</p>\n </div>\n <button type=\"button\" onClick={() => setBreakpointPanel(false)} className=\"rounded p-1 text-ed-muted hover:bg-ed-field\"><IconX size={15} /></button>\n </div>\n <div className=\"flex max-h-[360px] flex-col gap-2 overflow-y-auto scrollbar-none\">\n {breakpointDefs.map((item, index) => (\n <div key={item.id} className=\"grid grid-cols-[1fr_86px_auto] items-center gap-2 rounded-xl border border-ed-border bg-ed-subtle p-2\">\n <input\n aria-label=\"Breakpoint name\"\n value={item.name}\n onChange={(event) => renameBreakpoint(item.id, event.target.value)}\n onBlur={() => commitBreakpointName(item.id)}\n className=\"min-w-0 rounded-lg border border-ed-border bg-ed-field px-2.5 py-2 text-xs text-ed-text outline-none focus:border-ed-accent\"\n />\n <label className=\"flex items-center rounded-lg border border-ed-border bg-ed-field px-2 py-2 text-xs text-ed-muted\">\n <input\n aria-label=\"Breakpoint width\"\n type=\"number\"\n min={240}\n max={4000}\n value={item.width}\n onChange={(event) => resizeBreakpoint(item.id, Number(event.target.value) || 240)}\n className=\"w-full bg-transparent text-right tabular-nums text-ed-text outline-none\"\n />px\n </label>\n <div className=\"flex items-center gap-0.5\">\n {item.id === cascade.baseId ? (\n <span className=\"rounded-md bg-ed-accent/15 px-2 py-1.5 text-[10px] font-semibold text-ed-accent\">MAIN</span>\n ) : (\n <button type=\"button\" title=\"Make main\" onClick={() => setBaseBreakpoint(item.id)} className=\"rounded-md px-2 py-1.5 text-[10px] font-semibold text-ed-muted hover:bg-ed-field hover:text-ed-text\">MAIN</button>\n )}\n <button type=\"button\" disabled={index === 0} title=\"Move left\" onClick={() => { const next = [...breakpointDefs]; [next[index - 1], next[index]] = [next[index], next[index - 1]]; updateBreakpoints(next); }} className=\"rounded p-1 text-ed-faint hover:bg-ed-field disabled:opacity-20\"><IconChevronLeft size={13} /></button>\n <button type=\"button\" disabled={index === breakpointDefs.length - 1} title=\"Move right\" onClick={() => { const next = [...breakpointDefs]; [next[index], next[index + 1]] = [next[index + 1], next[index]]; updateBreakpoints(next); }} className=\"rounded p-1 text-ed-faint hover:bg-ed-field disabled:opacity-20\"><IconChevronRight size={13} /></button>\n {item.id !== cascade.baseId && breakpointDefs.length > 1 && (\n <button type=\"button\" title=\"Delete\" onClick={() => removeBreakpoint(item.id)} className=\"rounded p-1 text-ed-faint hover:bg-red-500/10 hover:text-red-400\"><IconTrash size={13} /></button>\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {contextMenu && menuElementId && (\n <ContextMenu\n x={contextMenu.x}\n y={contextMenu.y}\n onBringForward={() => {\n setElements((els) => reorder(els, menuElementId, \"up\"));\n setContextMenu(null);\n }}\n onSendBackward={() => {\n setElements((els) => reorder(els, menuElementId, \"down\"));\n setContextMenu(null);\n }}\n onWrap={() => {\n const wrapped = wrapInContainer(\n elements,\n menuElementId,\n breakpoint,\n );\n if (wrapped) {\n setElements(wrapped.elements);\n setSelectedIds([wrapped.wrapperId]);\n }\n setContextMenu(null);\n }}\n onUnwrap={() => {\n const el = byId.get(menuElementId);\n const grandparent = el?.parentId\n ? byId.get(el.parentId)?.parentId\n : undefined;\n doReparent(menuElementId, grandparent);\n setContextMenu(null);\n }}\n onDuplicate={() => duplicateElements([menuElementId])}\n onCopy={() => {\n copyElements([menuElementId]);\n setContextMenu(null);\n }}\n onDelete={() => deleteElements([menuElementId])}\n />\n )}\n\n {contextMenu && !contextMenu.elementId && (\n <div className=\"fixed z-[90] w-48 overflow-hidden rounded-xl border border-ed-border bg-ed-surface p-1.5 shadow-2xl\" style={{ left: contextMenu.x, top: contextMenu.y }}>\n {([\"Text\", \"Heading\", \"Button\", \"Container\"] as ElementType[]).map((type) => (\n <button key={type} type=\"button\" onClick={() => {\n const created = createElement(type, { x: contextMenu.canvasX ?? 0, y: contextMenu.canvasY ?? 0, z: nextZ(elements) });\n if (type === \"Text\") created.content = \"Canvas note\";\n setElements((current) => [...current, created]);\n setSelectedIds([created.id]);\n setContextMenu(null);\n }} className=\"flex w-full items-center gap-2 rounded-lg px-3 py-2 text-left text-xs text-ed-muted hover:bg-ed-field hover:text-ed-text\">\n <IconPlus size={13} /> Add {type}\n </button>\n ))}\n <div className=\"my-1 h-px bg-ed-border\" />\n {componentMode ? <button type=\"button\" onClick={() => { createComponentVariant(); setContextMenu(null); }} disabled={selectedElement?.componentRole !== \"master\"} className=\"flex w-full items-center gap-2 rounded-lg px-3 py-2 text-left text-xs font-medium text-ed-muted hover:bg-ed-field hover:text-ed-text disabled:opacity-30\"><IconComponents size={13} /> Add variant</button> : <><button type=\"button\" onClick={() => {\n addBreakpoint();\n setBreakpointPanel(true);\n setContextMenu(null);\n }} className=\"flex w-full items-center gap-2 rounded-lg px-3 py-2 text-left text-xs font-medium text-ed-muted hover:bg-ed-field hover:text-ed-text\">\n <IconLayoutColumns size={13} /> Add breakpoint\n </button>\n <button type=\"button\" onClick={() => {\n setBreakpointPanel(true);\n setContextMenu(null);\n }} className=\"flex w-full items-center gap-2 rounded-lg px-3 py-2 text-left text-xs text-ed-muted hover:bg-ed-field hover:text-ed-text\">\n <IconBox size={13} /> Breakpoint settings\n </button></>}\n </div>\n )}\n\n {marquee && <div className=\"pointer-events-none fixed z-[110] border border-blue-400 bg-blue-500/20 shadow-[0_0_0_1px_rgba(59,130,246,.15)]\" style={{ left: Math.min(marquee.startX, marquee.x), top: Math.min(marquee.startY, marquee.y), width: Math.abs(marquee.x - marquee.startX), height: Math.abs(marquee.y - marquee.startY) }} />}\n\n <style\n // biome-ignore lint/security/noDangerouslySetInnerHtml: webkit scrollbar pseudo-elements have no Tailwind utility\n dangerouslySetInnerHTML={{\n __html: `${customFontCss}\n .canvas-scrollbar { scrollbar-width: none; -ms-overflow-style: none; }\n .canvas-scrollbar::-webkit-scrollbar { display: none; width: 0; height: 0; }\n `,\n }}\n />\n </div>\n );\n}\n", "\"use client\"\n\nimport { IconCheck, IconChevronDown, IconChevronUp } from \"@tabler/icons-react\"\nimport * as React from \"react\"\nimport { Select as SelectPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Select = SelectPrimitive.Root\nconst SelectGroup = SelectPrimitive.Group\nconst SelectValue = SelectPrimitive.Value\n\nfunction SelectTrigger({ className, children, ...props }: React.ComponentProps<typeof SelectPrimitive.Trigger>) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n className={cn(\n \"group flex h-8 w-full min-w-36 items-center justify-between gap-2.5 rounded-md border border-ed-border bg-ed-field px-3 text-xs font-medium text-ed-text outline-none transition-colors hover:bg-ed-field-hover focus:border-ed-accent data-[placeholder]:text-ed-muted disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n >\n <span className=\"truncate\">{children}</span>\n <SelectPrimitive.Icon asChild>\n <IconChevronDown className=\"size-3.5 shrink-0 text-ed-muted transition-transform duration-200 group-data-[state=open]:rotate-180\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n )\n}\n\nfunction SelectContent({ className, children, position = \"popper\", ...props }: React.ComponentProps<typeof SelectPrimitive.Content>) {\n const [portalContainer, setPortalContainer] = React.useState<HTMLElement | null>(null)\n\n React.useEffect(() => {\n setPortalContainer(document.querySelector<HTMLElement>(\".pg-editor\"))\n }, [])\n\n return (\n <SelectPrimitive.Portal container={portalContainer ?? undefined}>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n position={position}\n className={cn(\n \"relative z-[9999] max-h-96 min-w-[8rem] overflow-hidden rounded-md border border-ed-border bg-ed-surface text-ed-text shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n {...props}\n >\n <SelectPrimitive.ScrollUpButton className=\"flex cursor-default items-center justify-center py-1 text-ed-muted hover:text-ed-text\">\n <IconChevronUp className=\"size-3.5\" />\n </SelectPrimitive.ScrollUpButton>\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectPrimitive.ScrollDownButton className=\"flex cursor-default items-center justify-center py-1 text-ed-muted hover:text-ed-text\">\n <IconChevronDown className=\"size-3.5\" />\n </SelectPrimitive.ScrollDownButton>\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n )\n}\n\nfunction SelectLabel({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Label>) {\n return <SelectPrimitive.Label className={cn(\"px-2.5 py-1.5 text-[11px] font-semibold tracking-wider text-ed-muted uppercase\", className)} {...props} />\n}\n\nfunction SelectItem({ className, children, ...props }: React.ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n className={cn(\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2.5 text-xs font-medium text-ed-text outline-none transition-colors data-[highlighted]:bg-ed-field-hover data-[highlighted]:text-ed-text data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2.5 flex size-3.5 items-center justify-center text-ed-accent\">\n <SelectPrimitive.ItemIndicator>\n <IconCheck className=\"size-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n )\n}\n\nfunction SelectSeparator({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n return <SelectPrimitive.Separator className={cn(\"-mx-1 my-1 h-px bg-ed-border\", className)} {...props} />\n}\n\nexport { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectSeparator, SelectTrigger, SelectValue }\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;", "/**\n * Concatenates two arrays faster than the array spread operator.\n */\nexport const concatArrays = <T, U>(\n array1: readonly T[],\n array2: readonly U[],\n): readonly (T | U)[] => {\n // Pre-allocate for better V8 optimization\n const combinedArray: (T | U)[] = new Array(array1.length + array2.length)\n for (let i = 0; i < array1.length; i++) {\n combinedArray[i] = array1[i]!\n }\n for (let i = 0; i < array2.length; i++) {\n combinedArray[array1.length + i] = array2[i]!\n }\n return combinedArray\n}\n", "import {\n AnyClassGroupIds,\n AnyConfig,\n AnyThemeGroupIds,\n ClassGroup,\n ClassValidator,\n Config,\n ThemeGetter,\n ThemeObject,\n} from './types'\nimport { concatArrays } from './utils'\n\nexport interface ClassPartObject {\n nextPart: Map<string, ClassPartObject>\n validators: ClassValidatorObject[] | null\n classGroupId: AnyClassGroupIds | undefined // Always define optional props for consistent shape\n}\n\ninterface ClassValidatorObject {\n classGroupId: AnyClassGroupIds\n validator: ClassValidator\n}\n\n// Factory function ensures consistent object shapes\nconst createClassValidatorObject = (\n classGroupId: AnyClassGroupIds,\n validator: ClassValidator,\n): ClassValidatorObject => ({\n classGroupId,\n validator,\n})\n\n// Factory ensures consistent ClassPartObject shape\nconst createClassPartObject = (\n nextPart: Map<string, ClassPartObject> = new Map(),\n validators: ClassValidatorObject[] | null = null,\n classGroupId?: AnyClassGroupIds,\n): ClassPartObject => ({\n nextPart,\n validators,\n classGroupId,\n})\n\nconst CLASS_PART_SEPARATOR = '-'\n\nconst EMPTY_CONFLICTS: readonly AnyClassGroupIds[] = []\n// I use two dots here because one dot is used as prefix for class groups in plugins\nconst ARBITRARY_PROPERTY_PREFIX = 'arbitrary..'\n\nexport const createClassGroupUtils = (config: AnyConfig) => {\n const classMap = createClassMap(config)\n const { conflictingClassGroups, conflictingClassGroupModifiers } = config\n\n const getClassGroupId = (className: string) => {\n if (className.startsWith('[') && className.endsWith(']')) {\n return getGroupIdForArbitraryProperty(className)\n }\n\n const classParts = className.split(CLASS_PART_SEPARATOR)\n // Classes like `-inset-1` produce an empty string as first classPart. We assume that classes for negative values are used correctly and skip it.\n const startIndex = classParts[0] === '' && classParts.length > 1 ? 1 : 0\n return getGroupRecursive(classParts, startIndex, classMap)\n }\n\n const getConflictingClassGroupIds = (\n classGroupId: AnyClassGroupIds,\n hasPostfixModifier: boolean,\n ): readonly AnyClassGroupIds[] => {\n if (hasPostfixModifier) {\n const modifierConflicts = conflictingClassGroupModifiers[classGroupId]\n const baseConflicts = conflictingClassGroups[classGroupId]\n\n if (modifierConflicts) {\n if (baseConflicts) {\n // Merge base conflicts with modifier conflicts\n return concatArrays(baseConflicts, modifierConflicts)\n }\n // Only modifier conflicts\n return modifierConflicts\n }\n // Fall back to without postfix if no modifier conflicts\n return baseConflicts || EMPTY_CONFLICTS\n }\n\n return conflictingClassGroups[classGroupId] || EMPTY_CONFLICTS\n }\n\n return {\n getClassGroupId,\n getConflictingClassGroupIds,\n }\n}\n\nconst getGroupRecursive = (\n classParts: string[],\n startIndex: number,\n classPartObject: ClassPartObject,\n): AnyClassGroupIds | undefined => {\n const classPathsLength = classParts.length - startIndex\n if (classPathsLength === 0) {\n return classPartObject.classGroupId\n }\n\n const currentClassPart = classParts[startIndex]!\n const nextClassPartObject = classPartObject.nextPart.get(currentClassPart)\n\n if (nextClassPartObject) {\n const result = getGroupRecursive(classParts, startIndex + 1, nextClassPartObject)\n if (result) return result\n }\n\n const validators = classPartObject.validators\n if (validators === null) {\n return undefined\n }\n\n // Build classRest string efficiently by joining from startIndex onwards\n const classRest =\n startIndex === 0\n ? classParts.join(CLASS_PART_SEPARATOR)\n : classParts.slice(startIndex).join(CLASS_PART_SEPARATOR)\n const validatorsLength = validators.length\n\n for (let i = 0; i < validatorsLength; i++) {\n const validatorObj = validators[i]!\n if (validatorObj.validator(classRest)) {\n return validatorObj.classGroupId\n }\n }\n\n return undefined\n}\n\n/**\n * Get the class group ID for an arbitrary property.\n *\n * @param className - The class name to get the group ID for. Is expected to be string starting with `[` and ending with `]`.\n */\nconst getGroupIdForArbitraryProperty = (className: string): AnyClassGroupIds | undefined =>\n className.slice(1, -1).indexOf(':') === -1\n ? undefined\n : (() => {\n const content = className.slice(1, -1)\n const colonIndex = content.indexOf(':')\n const property = content.slice(0, colonIndex)\n return property ? ARBITRARY_PROPERTY_PREFIX + property : undefined\n })()\n\n/**\n * Exported for testing only\n */\nexport const createClassMap = (config: Config<AnyClassGroupIds, AnyThemeGroupIds>) => {\n const { theme, classGroups } = config\n return processClassGroups(classGroups, theme)\n}\n\n// Split into separate functions to maintain monomorphic call sites\nconst processClassGroups = (\n classGroups: Record<AnyClassGroupIds, ClassGroup<AnyThemeGroupIds>>,\n theme: ThemeObject<AnyThemeGroupIds>,\n): ClassPartObject => {\n const classMap = createClassPartObject()\n\n for (const classGroupId in classGroups) {\n const group = classGroups[classGroupId]!\n processClassesRecursively(group, classMap, classGroupId, theme)\n }\n\n return classMap\n}\n\nconst processClassesRecursively = (\n classGroup: ClassGroup<AnyThemeGroupIds>,\n classPartObject: ClassPartObject,\n classGroupId: AnyClassGroupIds,\n theme: ThemeObject<AnyThemeGroupIds>,\n) => {\n const len = classGroup.length\n for (let i = 0; i < len; i++) {\n const classDefinition = classGroup[i]!\n processClassDefinition(classDefinition, classPartObject, classGroupId, theme)\n }\n}\n\n// Split into separate functions for each type to maintain monomorphic call sites\nconst processClassDefinition = (\n classDefinition: ClassGroup<AnyThemeGroupIds>[number],\n classPartObject: ClassPartObject,\n classGroupId: AnyClassGroupIds,\n theme: ThemeObject<AnyThemeGroupIds>,\n) => {\n if (typeof classDefinition === 'string') {\n processStringDefinition(classDefinition, classPartObject, classGroupId)\n return\n }\n\n if (typeof classDefinition === 'function') {\n processFunctionDefinition(classDefinition, classPartObject, classGroupId, theme)\n return\n }\n\n processObjectDefinition(\n classDefinition as Record<string, ClassGroup<AnyThemeGroupIds>>,\n classPartObject,\n classGroupId,\n theme,\n )\n}\n\nconst processStringDefinition = (\n classDefinition: string,\n classPartObject: ClassPartObject,\n classGroupId: AnyClassGroupIds,\n) => {\n const classPartObjectToEdit =\n classDefinition === '' ? classPartObject : getPart(classPartObject, classDefinition)\n classPartObjectToEdit.classGroupId = classGroupId\n}\n\nconst processFunctionDefinition = (\n classDefinition: Function,\n classPartObject: ClassPartObject,\n classGroupId: AnyClassGroupIds,\n theme: ThemeObject<AnyThemeGroupIds>,\n) => {\n if (isThemeGetter(classDefinition)) {\n processClassesRecursively(classDefinition(theme), classPartObject, classGroupId, theme)\n return\n }\n\n if (classPartObject.validators === null) {\n classPartObject.validators = []\n }\n classPartObject.validators.push(\n createClassValidatorObject(classGroupId, classDefinition as ClassValidator),\n )\n}\n\nconst processObjectDefinition = (\n classDefinition: Record<string, ClassGroup<AnyThemeGroupIds>>,\n classPartObject: ClassPartObject,\n classGroupId: AnyClassGroupIds,\n theme: ThemeObject<AnyThemeGroupIds>,\n) => {\n const entries = Object.entries(classDefinition)\n const len = entries.length\n for (let i = 0; i < len; i++) {\n const [key, value] = entries[i]!\n processClassesRecursively(value, getPart(classPartObject, key), classGroupId, theme)\n }\n}\n\nconst getPart = (classPartObject: ClassPartObject, path: string): ClassPartObject => {\n let current = classPartObject\n const parts = path.split(CLASS_PART_SEPARATOR)\n const len = parts.length\n\n for (let i = 0; i < len; i++) {\n const part = parts[i]!\n\n let next = current.nextPart.get(part)\n if (!next) {\n next = createClassPartObject()\n current.nextPart.set(part, next)\n }\n current = next\n }\n\n return current\n}\n\n// Type guard maintains monomorphic check\nconst isThemeGetter = (func: Function): func is ThemeGetter =>\n 'isThemeGetter' in func && (func as ThemeGetter).isThemeGetter === true\n", "// Export is needed because TypeScript complains about an error otherwise:\n// Error: \u2026/tailwind-merge/src/config-utils.ts(8,17): semantic error TS4058: Return type of exported function has or is using name 'LruCache' from external module \"\u2026/tailwind-merge/src/lru-cache\" but cannot be named.\nexport interface LruCache<Key extends string, Value> {\n get(key: Key): Value | undefined\n set(key: Key, value: Value): void\n}\n\n// LRU cache implementation using plain objects for simplicity\nexport const createLruCache = <Key extends string, Value>(\n maxCacheSize: number,\n): LruCache<Key, Value> => {\n if (maxCacheSize < 1) {\n return {\n get: () => undefined,\n set: () => {},\n }\n }\n\n let cacheSize = 0\n let cache: Record<Key, Value> = Object.create(null)\n let previousCache: Record<Key, Value> = Object.create(null)\n\n const update = (key: Key, value: Value) => {\n cache[key] = value\n cacheSize++\n\n if (cacheSize > maxCacheSize) {\n cacheSize = 0\n previousCache = cache\n cache = Object.create(null)\n }\n }\n\n return {\n get(key) {\n let value = cache[key]\n\n if (value !== undefined) {\n return value\n }\n if ((value = previousCache[key]) !== undefined) {\n update(key, value)\n return value\n }\n },\n set(key, value) {\n if (key in cache) {\n cache[key] = value\n } else {\n update(key, value)\n }\n },\n }\n}\n", "import { AnyConfig, ParsedClassName } from './types'\n\nexport const IMPORTANT_MODIFIER = '!'\n\nconst MODIFIER_SEPARATOR = ':'\nconst EMPTY_MODIFIERS: string[] = []\n\n// Pre-allocated result object shape for consistency\nconst createResultObject = (\n modifiers: string[],\n hasImportantModifier: boolean,\n baseClassName: string,\n maybePostfixModifierPosition?: number,\n isExternal?: boolean,\n): ParsedClassName => ({\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition,\n isExternal,\n})\n\nexport const createParseClassName = (config: AnyConfig) => {\n const { prefix, experimentalParseClassName } = config\n\n /**\n * Parse class name into parts.\n *\n * Inspired by `splitAtTopLevelOnly` used in Tailwind CSS\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v3.2.2/src/util/splitAtTopLevelOnly.js\n */\n let parseClassName = (className: string): ParsedClassName => {\n // Use simple array with push for better performance\n const modifiers: string[] = []\n\n let bracketDepth = 0\n let parenDepth = 0\n let modifierStart = 0\n let postfixModifierPosition: number | undefined\n\n const len = className.length\n for (let index = 0; index < len; index++) {\n const currentCharacter = className[index]!\n\n if (bracketDepth === 0 && parenDepth === 0) {\n if (currentCharacter === MODIFIER_SEPARATOR) {\n modifiers.push(className.slice(modifierStart, index))\n modifierStart = index + 1\n continue\n }\n\n if (currentCharacter === '/') {\n postfixModifierPosition = index\n continue\n }\n }\n\n if (currentCharacter === '[') bracketDepth++\n else if (currentCharacter === ']') bracketDepth--\n else if (currentCharacter === '(') parenDepth++\n else if (currentCharacter === ')') parenDepth--\n }\n\n const baseClassNameWithImportantModifier =\n modifiers.length === 0 ? className : className.slice(modifierStart)\n\n // Inline important modifier check\n let baseClassName = baseClassNameWithImportantModifier\n let hasImportantModifier = false\n\n if (baseClassNameWithImportantModifier.endsWith(IMPORTANT_MODIFIER)) {\n baseClassName = baseClassNameWithImportantModifier.slice(0, -1)\n hasImportantModifier = true\n } else if (\n /**\n * In Tailwind CSS v3 the important modifier was at the start of the base class name. This is still supported for legacy reasons.\n * @see https://github.com/dcastil/tailwind-merge/issues/513#issuecomment-2614029864\n */\n baseClassNameWithImportantModifier.startsWith(IMPORTANT_MODIFIER)\n ) {\n baseClassName = baseClassNameWithImportantModifier.slice(1)\n hasImportantModifier = true\n }\n\n const maybePostfixModifierPosition =\n postfixModifierPosition && postfixModifierPosition > modifierStart\n ? postfixModifierPosition - modifierStart\n : undefined\n\n return createResultObject(\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition,\n )\n }\n\n if (prefix) {\n const fullPrefix = prefix + MODIFIER_SEPARATOR\n const parseClassNameOriginal = parseClassName\n parseClassName = (className: string) =>\n className.startsWith(fullPrefix)\n ? parseClassNameOriginal(className.slice(fullPrefix.length))\n : createResultObject(EMPTY_MODIFIERS, false, className, undefined, true)\n }\n\n if (experimentalParseClassName) {\n const parseClassNameOriginal = parseClassName\n parseClassName = (className: string) =>\n experimentalParseClassName({ className, parseClassName: parseClassNameOriginal })\n }\n\n return parseClassName\n}\n", "import { AnyConfig } from './types'\n\n/**\n * Sorts modifiers according to following schema:\n * - Predefined modifiers are sorted alphabetically\n * - When an arbitrary variant appears, it must be preserved which modifiers are before and after it\n */\nexport const createSortModifiers = (config: AnyConfig) => {\n // Pre-compute weights for all known modifiers for O(1) comparison\n const modifierWeights = new Map<string, number>()\n\n // Assign weights to sensitive modifiers (highest priority, but preserve order)\n config.orderSensitiveModifiers.forEach((mod, index) => {\n modifierWeights.set(mod, 1000000 + index) // High weights for sensitive mods\n })\n\n return (modifiers: readonly string[]): string[] => {\n const result: string[] = []\n let currentSegment: string[] = []\n\n // Process modifiers in one pass\n for (let i = 0; i < modifiers.length; i++) {\n const modifier = modifiers[i]!\n\n // Check if modifier is sensitive (starts with '[' or in orderSensitiveModifiers)\n const isArbitrary = modifier[0] === '['\n const isOrderSensitive = modifierWeights.has(modifier)\n\n if (isArbitrary || isOrderSensitive) {\n // Sort and flush current segment alphabetically\n if (currentSegment.length > 0) {\n currentSegment.sort()\n result.push(...currentSegment)\n currentSegment = []\n }\n result.push(modifier)\n } else {\n // Regular modifier - add to current segment for batch sorting\n currentSegment.push(modifier)\n }\n }\n\n // Sort and add any remaining segment items\n if (currentSegment.length > 0) {\n currentSegment.sort()\n result.push(...currentSegment)\n }\n\n return result\n }\n}\n", "import { createClassGroupUtils } from './class-group-utils'\nimport { createLruCache } from './lru-cache'\nimport { createParseClassName } from './parse-class-name'\nimport { createSortModifiers } from './sort-modifiers'\nimport { AnyClassGroupIds, AnyConfig } from './types'\n\nexport type ConfigUtils = ReturnType<typeof createConfigUtils>\n\nexport const createConfigUtils = (config: AnyConfig) => ({\n cache: createLruCache<string, string>(config.cacheSize),\n parseClassName: createParseClassName(config),\n sortModifiers: createSortModifiers(config),\n postfixLookupClassGroupIds: createPostfixLookupClassGroupIds(config),\n ...createClassGroupUtils(config),\n})\n\nconst createPostfixLookupClassGroupIds = (config: AnyConfig) => {\n const lookup: Partial<Record<AnyClassGroupIds, true>> = Object.create(null)\n const classGroupIds = config.postfixLookupClassGroups\n\n if (classGroupIds) {\n for (let i = 0; i < classGroupIds.length; i++) {\n lookup[classGroupIds[i]!] = true\n }\n }\n\n return lookup\n}\n", "import { ConfigUtils } from './config-utils'\nimport { IMPORTANT_MODIFIER } from './parse-class-name'\n\nconst SPLIT_CLASSES_REGEX = /\\s+/\n\nexport const mergeClassList = (classList: string, configUtils: ConfigUtils) => {\n const {\n parseClassName,\n getClassGroupId,\n getConflictingClassGroupIds,\n sortModifiers,\n postfixLookupClassGroupIds,\n } = configUtils\n\n /**\n * Set of classGroupIds in following format:\n * `{importantModifier}{variantModifiers}{classGroupId}`\n * @example 'float'\n * @example 'hover:focus:bg-color'\n * @example 'md:!pr'\n */\n const classGroupsInConflict: string[] = []\n const classNames = classList.trim().split(SPLIT_CLASSES_REGEX)\n\n let result = ''\n\n for (let index = classNames.length - 1; index >= 0; index -= 1) {\n const originalClassName = classNames[index]!\n\n const {\n isExternal,\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition,\n } = parseClassName(originalClassName)\n\n if (isExternal) {\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n continue\n }\n\n let hasPostfixModifier = !!maybePostfixModifierPosition\n let classGroupId: ReturnType<typeof getClassGroupId>\n\n if (hasPostfixModifier) {\n const baseClassNameWithoutPostfix = baseClassName.substring(\n 0,\n maybePostfixModifierPosition,\n )\n classGroupId = getClassGroupId(baseClassNameWithoutPostfix)\n\n const classGroupIdWithPostfix =\n classGroupId && postfixLookupClassGroupIds[classGroupId]\n ? getClassGroupId(baseClassName)\n : undefined\n if (classGroupIdWithPostfix && classGroupIdWithPostfix !== classGroupId) {\n classGroupId = classGroupIdWithPostfix\n hasPostfixModifier = false\n }\n } else {\n classGroupId = getClassGroupId(baseClassName)\n }\n\n if (!classGroupId) {\n if (!hasPostfixModifier) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n continue\n }\n\n classGroupId = getClassGroupId(baseClassName)\n\n if (!classGroupId) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n continue\n }\n\n hasPostfixModifier = false\n }\n\n // Fast path: skip sorting for empty or single modifier\n const variantModifier =\n modifiers.length === 0\n ? ''\n : modifiers.length === 1\n ? modifiers[0]!\n : sortModifiers(modifiers).join(':')\n\n const modifierId = hasImportantModifier\n ? variantModifier + IMPORTANT_MODIFIER\n : variantModifier\n\n const classId = modifierId + classGroupId\n\n if (classGroupsInConflict.indexOf(classId) > -1) {\n // Tailwind class omitted due to conflict\n continue\n }\n\n classGroupsInConflict.push(classId)\n\n const conflictGroups = getConflictingClassGroupIds(classGroupId, hasPostfixModifier)\n for (let i = 0; i < conflictGroups.length; ++i) {\n const group = conflictGroups[i]!\n classGroupsInConflict.push(modifierId + group)\n }\n\n // Tailwind class not in conflict\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n }\n\n return result\n}\n", "/**\n * The code in this file is copied from https://github.com/lukeed/clsx and modified to suit the needs of tailwind-merge better.\n *\n * Specifically:\n * - Runtime code from https://github.com/lukeed/clsx/blob/v1.2.1/src/index.js\n * - TypeScript types from https://github.com/lukeed/clsx/blob/v1.2.1/clsx.d.ts\n *\n * Original code has MIT license: Copyright (c) Luke Edwards <luke.edwards05@gmail.com> (lukeed.com)\n */\n\nexport type ClassNameValue = ClassNameArray | string | null | undefined | 0 | 0n | false\ntype ClassNameArray = readonly ClassNameValue[]\n\nexport const twJoin = (...classLists: ClassNameValue[]): string => {\n let index = 0\n let argument: ClassNameValue\n let resolvedValue: string\n let string = ''\n\n while (index < classLists.length) {\n if ((argument = classLists[index++])) {\n if ((resolvedValue = toValue(argument))) {\n string && (string += ' ')\n string += resolvedValue\n }\n }\n }\n return string\n}\n\nconst toValue = (mix: ClassNameArray | string): string => {\n // Fast path for strings\n if (typeof mix === 'string') {\n return mix\n }\n\n let resolvedValue: string\n let string = ''\n\n for (let k = 0; k < mix.length; k++) {\n if (mix[k]) {\n if ((resolvedValue = toValue(mix[k] as ClassNameArray | string))) {\n string && (string += ' ')\n string += resolvedValue\n }\n }\n }\n\n return string\n}\n", "import { createConfigUtils } from './config-utils'\nimport { mergeClassList } from './merge-classlist'\nimport { ClassNameValue, twJoin } from './tw-join'\nimport { AnyConfig } from './types'\n\ntype CreateConfigFirst = () => AnyConfig\ntype CreateConfigSubsequent = (config: AnyConfig) => AnyConfig\ntype TailwindMerge = (...classLists: ClassNameValue[]) => string\ntype ConfigUtils = ReturnType<typeof createConfigUtils>\n\nexport const createTailwindMerge = (\n createConfigFirst: CreateConfigFirst,\n ...createConfigRest: CreateConfigSubsequent[]\n): TailwindMerge => {\n let configUtils: ConfigUtils\n let cacheGet: ConfigUtils['cache']['get']\n let cacheSet: ConfigUtils['cache']['set']\n let functionToCall: (classList: string) => string\n\n const initTailwindMerge = (classList: string) => {\n const config = createConfigRest.reduce(\n (previousConfig, createConfigCurrent) => createConfigCurrent(previousConfig),\n createConfigFirst() as AnyConfig,\n )\n\n configUtils = createConfigUtils(config)\n cacheGet = configUtils.cache.get\n cacheSet = configUtils.cache.set\n functionToCall = tailwindMerge\n\n return tailwindMerge(classList)\n }\n\n const tailwindMerge = (classList: string) => {\n const cachedResult = cacheGet(classList)\n\n if (cachedResult) {\n return cachedResult\n }\n\n const result = mergeClassList(classList, configUtils)\n cacheSet(classList, result)\n\n return result\n }\n\n functionToCall = initTailwindMerge\n\n return (...args: ClassNameValue[]) => functionToCall(twJoin(...args))\n}\n", "import { DefaultThemeGroupIds, NoInfer, ThemeGetter, ThemeObject } from './types'\n\nconst fallbackThemeArr: ThemeObject<DefaultThemeGroupIds>[DefaultThemeGroupIds] = []\n\nexport const fromTheme = <\n AdditionalThemeGroupIds extends string = never,\n DefaultThemeGroupIdsInner extends string = DefaultThemeGroupIds,\n>(\n key: NoInfer<DefaultThemeGroupIdsInner | AdditionalThemeGroupIds>,\n): ThemeGetter => {\n const themeGetter = (theme: ThemeObject<DefaultThemeGroupIdsInner | AdditionalThemeGroupIds>) =>\n theme[key] || fallbackThemeArr\n\n themeGetter.isThemeGetter = true as const\n\n return themeGetter\n}\n", "const arbitraryValueRegex = /^\\[(?:(\\w[\\w-]*):)?(.+)\\]$/i\nconst arbitraryVariableRegex = /^\\((?:(\\w[\\w-]*):)?(.+)\\)$/i\nconst fractionRegex = /^\\d+(?:\\.\\d+)?\\/\\d+(?:\\.\\d+)?$/\nconst tshirtUnitRegex = /^(\\d+(\\.\\d+)?)?(xs|sm|md|lg|xl)$/\nconst lengthUnitRegex =\n /\\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\\b(calc|min|max|clamp)\\(.+\\)|^0$/\nconst colorFunctionRegex = /^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\\(.+\\)$/\n// Shadow always begins with x and y offset separated by underscore optionally prepended by inset\nconst shadowRegex = /^(inset_)?-?((\\d+)?\\.?(\\d+)[a-z]+|0)_-?((\\d+)?\\.?(\\d+)[a-z]+|0)/\nconst imageRegex =\n /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\\(.+\\)$/\n\nexport const isFraction = (value: string) => fractionRegex.test(value)\n\nexport const isNumber = (value: string) => !!value && !Number.isNaN(Number(value))\n\nexport const isInteger = (value: string) => !!value && Number.isInteger(Number(value))\n\nexport const isPercent = (value: string) => value.endsWith('%') && isNumber(value.slice(0, -1))\n\nexport const isTshirtSize = (value: string) => tshirtUnitRegex.test(value)\n\nexport const isAny = () => true\n\nconst isLengthOnly = (value: string) =>\n // `colorFunctionRegex` check is necessary because color functions can have percentages in them which which would be incorrectly classified as lengths.\n // For example, `hsl(0 0% 0%)` would be classified as a length without this check.\n // I could also use lookbehind assertion in `lengthUnitRegex` but that isn't supported widely enough.\n lengthUnitRegex.test(value) && !colorFunctionRegex.test(value)\n\nconst isNever = () => false\n\nconst isShadow = (value: string) => shadowRegex.test(value)\n\nconst isImage = (value: string) => imageRegex.test(value)\n\nexport const isAnyNonArbitrary = (value: string) =>\n !isArbitraryValue(value) && !isArbitraryVariable(value)\n\nexport const isNamedContainerQuery = (value: string) =>\n value.startsWith('@container') &&\n ((value[10] === '/' && value[11] !== undefined) ||\n (value[11] === 's' && value[16] !== undefined && value.startsWith('-size/', 10)) ||\n (value[11] === 'n' && value[18] !== undefined && value.startsWith('-normal/', 10)))\n\nexport const isArbitrarySize = (value: string) => getIsArbitraryValue(value, isLabelSize, isNever)\n\nexport const isArbitraryValue = (value: string) => arbitraryValueRegex.test(value)\n\nexport const isArbitraryLength = (value: string) =>\n getIsArbitraryValue(value, isLabelLength, isLengthOnly)\n\nexport const isArbitraryNumber = (value: string) =>\n getIsArbitraryValue(value, isLabelNumber, isNumber)\n\nexport const isArbitraryWeight = (value: string) => getIsArbitraryValue(value, isLabelWeight, isAny)\n\nexport const isArbitraryFamilyName = (value: string) =>\n getIsArbitraryValue(value, isLabelFamilyName, isNever)\n\nexport const isArbitraryPosition = (value: string) =>\n getIsArbitraryValue(value, isLabelPosition, isNever)\n\nexport const isArbitraryImage = (value: string) => getIsArbitraryValue(value, isLabelImage, isImage)\n\nexport const isArbitraryShadow = (value: string) =>\n getIsArbitraryValue(value, isLabelShadow, isShadow)\n\nexport const isArbitraryVariable = (value: string) => arbitraryVariableRegex.test(value)\n\nexport const isArbitraryVariableLength = (value: string) =>\n getIsArbitraryVariable(value, isLabelLength)\n\nexport const isArbitraryVariableFamilyName = (value: string) =>\n getIsArbitraryVariable(value, isLabelFamilyName)\n\nexport const isArbitraryVariablePosition = (value: string) =>\n getIsArbitraryVariable(value, isLabelPosition)\n\nexport const isArbitraryVariableSize = (value: string) => getIsArbitraryVariable(value, isLabelSize)\n\nexport const isArbitraryVariableImage = (value: string) =>\n getIsArbitraryVariable(value, isLabelImage)\n\nexport const isArbitraryVariableShadow = (value: string) =>\n getIsArbitraryVariable(value, isLabelShadow, true)\n\nexport const isArbitraryVariableWeight = (value: string) =>\n getIsArbitraryVariable(value, isLabelWeight, true)\n\n// Helpers\n\nconst getIsArbitraryValue = (\n value: string,\n testLabel: (label: string) => boolean,\n testValue: (value: string) => boolean,\n) => {\n const result = arbitraryValueRegex.exec(value)\n\n if (result) {\n if (result[1]) {\n return testLabel(result[1])\n }\n\n return testValue(result[2]!)\n }\n\n return false\n}\n\nconst getIsArbitraryVariable = (\n value: string,\n testLabel: (label: string) => boolean,\n shouldMatchNoLabel = false,\n) => {\n const result = arbitraryVariableRegex.exec(value)\n\n if (result) {\n if (result[1]) {\n return testLabel(result[1])\n }\n return shouldMatchNoLabel\n }\n\n return false\n}\n\n// Labels\n\nconst isLabelPosition = (label: string) => label === 'position' || label === 'percentage'\n\nconst isLabelImage = (label: string) => label === 'image' || label === 'url'\n\nconst isLabelSize = (label: string) => label === 'length' || label === 'size' || label === 'bg-size'\n\nconst isLabelLength = (label: string) => label === 'length'\n\nconst isLabelNumber = (label: string) => label === 'number'\n\nconst isLabelFamilyName = (label: string) => label === 'family-name'\n\nconst isLabelWeight = (label: string) => label === 'number' || label === 'weight'\n\nconst isLabelShadow = (label: string) => label === 'shadow'\n", "import { fromTheme } from './from-theme'\nimport { Config, DefaultClassGroupIds, DefaultThemeGroupIds } from './types'\nimport {\n isAny,\n isAnyNonArbitrary,\n isArbitraryFamilyName,\n isArbitraryImage,\n isArbitraryLength,\n isArbitraryNumber,\n isArbitraryPosition,\n isArbitraryShadow,\n isArbitrarySize,\n isArbitraryValue,\n isArbitraryVariable,\n isArbitraryVariableFamilyName,\n isArbitraryVariableImage,\n isArbitraryVariableLength,\n isArbitraryVariablePosition,\n isArbitraryVariableShadow,\n isArbitraryVariableSize,\n isArbitraryVariableWeight,\n isArbitraryWeight,\n isFraction,\n isInteger,\n isNamedContainerQuery,\n isNumber,\n isPercent,\n isTshirtSize,\n} from './validators'\n\nexport const getDefaultConfig = () => {\n /**\n * Theme getters for theme variable namespaces\n * @see https://tailwindcss.com/docs/theme#theme-variable-namespaces\n */\n /***/\n\n const themeColor = fromTheme('color')\n const themeFont = fromTheme('font')\n const themeText = fromTheme('text')\n const themeFontWeight = fromTheme('font-weight')\n const themeTracking = fromTheme('tracking')\n const themeLeading = fromTheme('leading')\n const themeBreakpoint = fromTheme('breakpoint')\n const themeContainer = fromTheme('container')\n const themeSpacing = fromTheme('spacing')\n const themeRadius = fromTheme('radius')\n const themeShadow = fromTheme('shadow')\n const themeInsetShadow = fromTheme('inset-shadow')\n const themeTextShadow = fromTheme('text-shadow')\n const themeDropShadow = fromTheme('drop-shadow')\n const themeBlur = fromTheme('blur')\n const themePerspective = fromTheme('perspective')\n const themeAspect = fromTheme('aspect')\n const themeEase = fromTheme('ease')\n const themeAnimate = fromTheme('animate')\n\n /**\n * Helpers to avoid repeating the same scales\n *\n * We use functions that create a new array every time they're called instead of static arrays.\n * This ensures that users who modify any scale by mutating the array (e.g. with `array.push(element)`) don't accidentally mutate arrays in other parts of the config.\n */\n /***/\n\n const scaleBreak = () =>\n ['auto', 'avoid', 'all', 'avoid-page', 'page', 'left', 'right', 'column'] as const\n const scalePosition = () =>\n [\n 'center',\n 'top',\n 'bottom',\n 'left',\n 'right',\n 'top-left',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'left-top',\n 'top-right',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'right-top',\n 'bottom-right',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'right-bottom',\n 'bottom-left',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'left-bottom',\n ] as const\n const scalePositionWithArbitrary = () =>\n [...scalePosition(), isArbitraryVariable, isArbitraryValue] as const\n const scaleOverflow = () => ['auto', 'hidden', 'clip', 'visible', 'scroll'] as const\n const scaleOverscroll = () => ['auto', 'contain', 'none'] as const\n const scaleUnambiguousSpacing = () =>\n [isArbitraryVariable, isArbitraryValue, themeSpacing] as const\n const scaleInset = () => [isFraction, 'full', 'auto', ...scaleUnambiguousSpacing()] as const\n const scaleGridTemplateColsRows = () =>\n [isInteger, 'none', 'subgrid', isArbitraryVariable, isArbitraryValue] as const\n const scaleGridColRowStartAndEnd = () =>\n [\n 'auto',\n { span: ['full', isInteger, isArbitraryVariable, isArbitraryValue] },\n isInteger,\n isArbitraryVariable,\n isArbitraryValue,\n ] as const\n const scaleGridColRowStartOrEnd = () =>\n [isInteger, 'auto', isArbitraryVariable, isArbitraryValue] as const\n const scaleGridAutoColsRows = () =>\n ['auto', 'min', 'max', 'fr', isArbitraryVariable, isArbitraryValue] as const\n const scaleAlignPrimaryAxis = () =>\n [\n 'start',\n 'end',\n 'center',\n 'between',\n 'around',\n 'evenly',\n 'stretch',\n 'baseline',\n 'center-safe',\n 'end-safe',\n ] as const\n const scaleAlignSecondaryAxis = () =>\n ['start', 'end', 'center', 'stretch', 'center-safe', 'end-safe'] as const\n const scaleMargin = () => ['auto', ...scaleUnambiguousSpacing()] as const\n const scaleSizing = () =>\n [\n isFraction,\n 'auto',\n 'full',\n 'dvw',\n 'dvh',\n 'lvw',\n 'lvh',\n 'svw',\n 'svh',\n 'min',\n 'max',\n 'fit',\n ...scaleUnambiguousSpacing(),\n ] as const\n const scaleSizingInline = () =>\n [\n isFraction,\n 'screen',\n 'full',\n 'dvw',\n 'lvw',\n 'svw',\n 'min',\n 'max',\n 'fit',\n ...scaleUnambiguousSpacing(),\n ] as const\n const scaleSizingBlock = () =>\n [\n isFraction,\n 'screen',\n 'full',\n 'lh',\n 'dvh',\n 'lvh',\n 'svh',\n 'min',\n 'max',\n 'fit',\n ...scaleUnambiguousSpacing(),\n ] as const\n const scaleColor = () => [themeColor, isArbitraryVariable, isArbitraryValue] as const\n const scaleBgPosition = () =>\n [\n ...scalePosition(),\n isArbitraryVariablePosition,\n isArbitraryPosition,\n { position: [isArbitraryVariable, isArbitraryValue] },\n ] as const\n const scaleBgRepeat = () => ['no-repeat', { repeat: ['', 'x', 'y', 'space', 'round'] }] as const\n const scaleBgSize = () =>\n [\n 'auto',\n 'cover',\n 'contain',\n isArbitraryVariableSize,\n isArbitrarySize,\n { size: [isArbitraryVariable, isArbitraryValue] },\n ] as const\n const scaleGradientStopPosition = () =>\n [isPercent, isArbitraryVariableLength, isArbitraryLength] as const\n const scaleRadius = () =>\n [\n // Deprecated since Tailwind CSS v4.0.0\n '',\n 'none',\n 'full',\n themeRadius,\n isArbitraryVariable,\n isArbitraryValue,\n ] as const\n const scaleBorderWidth = () =>\n ['', isNumber, isArbitraryVariableLength, isArbitraryLength] as const\n const scaleLineStyle = () => ['solid', 'dashed', 'dotted', 'double'] as const\n const scaleBlendMode = () =>\n [\n 'normal',\n 'multiply',\n 'screen',\n 'overlay',\n 'darken',\n 'lighten',\n 'color-dodge',\n 'color-burn',\n 'hard-light',\n 'soft-light',\n 'difference',\n 'exclusion',\n 'hue',\n 'saturation',\n 'color',\n 'luminosity',\n ] as const\n const scaleMaskImagePosition = () =>\n [isNumber, isPercent, isArbitraryVariablePosition, isArbitraryPosition] as const\n const scaleBlur = () =>\n [\n // Deprecated since Tailwind CSS v4.0.0\n '',\n 'none',\n themeBlur,\n isArbitraryVariable,\n isArbitraryValue,\n ] as const\n const scaleRotate = () => ['none', isNumber, isArbitraryVariable, isArbitraryValue] as const\n const scaleScale = () => ['none', isNumber, isArbitraryVariable, isArbitraryValue] as const\n const scaleSkew = () => [isNumber, isArbitraryVariable, isArbitraryValue] as const\n const scaleTranslate = () => [isFraction, 'full', ...scaleUnambiguousSpacing()] as const\n\n return {\n cacheSize: 500,\n theme: {\n animate: ['spin', 'ping', 'pulse', 'bounce'],\n aspect: ['video'],\n blur: [isTshirtSize],\n breakpoint: [isTshirtSize],\n color: [isAny],\n container: [isTshirtSize],\n 'drop-shadow': [isTshirtSize],\n ease: ['in', 'out', 'in-out'],\n font: [isAnyNonArbitrary],\n 'font-weight': [\n 'thin',\n 'extralight',\n 'light',\n 'normal',\n 'medium',\n 'semibold',\n 'bold',\n 'extrabold',\n 'black',\n ],\n 'inset-shadow': [isTshirtSize],\n leading: ['none', 'tight', 'snug', 'normal', 'relaxed', 'loose'],\n perspective: ['dramatic', 'near', 'normal', 'midrange', 'distant', 'none'],\n radius: [isTshirtSize],\n shadow: [isTshirtSize],\n spacing: ['px', isNumber],\n text: [isTshirtSize],\n 'text-shadow': [isTshirtSize],\n tracking: ['tighter', 'tight', 'normal', 'wide', 'wider', 'widest'],\n },\n classGroups: {\n // --------------\n // --- Layout ---\n // --------------\n\n /**\n * Aspect Ratio\n * @see https://tailwindcss.com/docs/aspect-ratio\n */\n aspect: [\n {\n aspect: [\n 'auto',\n 'square',\n isFraction,\n isArbitraryValue,\n isArbitraryVariable,\n themeAspect,\n ],\n },\n ],\n /**\n * Container\n * @see https://tailwindcss.com/docs/container\n * @deprecated since Tailwind CSS v4.0.0\n */\n container: ['container'],\n /**\n * Container Type\n * @see https://tailwindcss.com/docs/responsive-design#container-queries\n */\n 'container-type': [\n { '@container': ['', 'normal', 'size', isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Container Name\n * @see https://tailwindcss.com/docs/responsive-design#named-containers\n */\n 'container-named': [isNamedContainerQuery],\n /**\n * Columns\n * @see https://tailwindcss.com/docs/columns\n */\n columns: [\n { columns: [isNumber, isArbitraryValue, isArbitraryVariable, themeContainer] },\n ],\n /**\n * Break After\n * @see https://tailwindcss.com/docs/break-after\n */\n 'break-after': [{ 'break-after': scaleBreak() }],\n /**\n * Break Before\n * @see https://tailwindcss.com/docs/break-before\n */\n 'break-before': [{ 'break-before': scaleBreak() }],\n /**\n * Break Inside\n * @see https://tailwindcss.com/docs/break-inside\n */\n 'break-inside': [{ 'break-inside': ['auto', 'avoid', 'avoid-page', 'avoid-column'] }],\n /**\n * Box Decoration Break\n * @see https://tailwindcss.com/docs/box-decoration-break\n */\n 'box-decoration': [{ 'box-decoration': ['slice', 'clone'] }],\n /**\n * Box Sizing\n * @see https://tailwindcss.com/docs/box-sizing\n */\n box: [{ box: ['border', 'content'] }],\n /**\n * Display\n * @see https://tailwindcss.com/docs/display\n */\n display: [\n 'block',\n 'inline-block',\n 'inline',\n 'flex',\n 'inline-flex',\n 'table',\n 'inline-table',\n 'table-caption',\n 'table-cell',\n 'table-column',\n 'table-column-group',\n 'table-footer-group',\n 'table-header-group',\n 'table-row-group',\n 'table-row',\n 'flow-root',\n 'grid',\n 'inline-grid',\n 'contents',\n 'list-item',\n 'hidden',\n ],\n /**\n * Screen Reader Only\n * @see https://tailwindcss.com/docs/display#screen-reader-only\n */\n sr: ['sr-only', 'not-sr-only'],\n /**\n * Floats\n * @see https://tailwindcss.com/docs/float\n */\n float: [{ float: ['right', 'left', 'none', 'start', 'end'] }],\n /**\n * Clear\n * @see https://tailwindcss.com/docs/clear\n */\n clear: [{ clear: ['left', 'right', 'both', 'none', 'start', 'end'] }],\n /**\n * Isolation\n * @see https://tailwindcss.com/docs/isolation\n */\n isolation: ['isolate', 'isolation-auto'],\n /**\n * Object Fit\n * @see https://tailwindcss.com/docs/object-fit\n */\n 'object-fit': [{ object: ['contain', 'cover', 'fill', 'none', 'scale-down'] }],\n /**\n * Object Position\n * @see https://tailwindcss.com/docs/object-position\n */\n 'object-position': [{ object: scalePositionWithArbitrary() }],\n /**\n * Overflow\n * @see https://tailwindcss.com/docs/overflow\n */\n overflow: [{ overflow: scaleOverflow() }],\n /**\n * Overflow X\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-x': [{ 'overflow-x': scaleOverflow() }],\n /**\n * Overflow Y\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-y': [{ 'overflow-y': scaleOverflow() }],\n /**\n * Overscroll Behavior\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n overscroll: [{ overscroll: scaleOverscroll() }],\n /**\n * Overscroll Behavior X\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-x': [{ 'overscroll-x': scaleOverscroll() }],\n /**\n * Overscroll Behavior Y\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-y': [{ 'overscroll-y': scaleOverscroll() }],\n /**\n * Position\n * @see https://tailwindcss.com/docs/position\n */\n position: ['static', 'fixed', 'absolute', 'relative', 'sticky'],\n /**\n * Inset\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n inset: [{ inset: scaleInset() }],\n /**\n * Inset Inline\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-x': [{ 'inset-x': scaleInset() }],\n /**\n * Inset Block\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-y': [{ 'inset-y': scaleInset() }],\n /**\n * Inset Inline Start\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n * @todo class group will be renamed to `inset-s` in next major release\n */\n start: [\n {\n 'inset-s': scaleInset(),\n /**\n * @deprecated since Tailwind CSS v4.2.0 in favor of `inset-s-*` utilities.\n * @see https://github.com/tailwindlabs/tailwindcss/pull/19613\n */\n start: scaleInset(),\n },\n ],\n /**\n * Inset Inline End\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n * @todo class group will be renamed to `inset-e` in next major release\n */\n end: [\n {\n 'inset-e': scaleInset(),\n /**\n * @deprecated since Tailwind CSS v4.2.0 in favor of `inset-e-*` utilities.\n * @see https://github.com/tailwindlabs/tailwindcss/pull/19613\n */\n end: scaleInset(),\n },\n ],\n /**\n * Inset Block Start\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-bs': [{ 'inset-bs': scaleInset() }],\n /**\n * Inset Block End\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-be': [{ 'inset-be': scaleInset() }],\n /**\n * Top\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n top: [{ top: scaleInset() }],\n /**\n * Right\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n right: [{ right: scaleInset() }],\n /**\n * Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n bottom: [{ bottom: scaleInset() }],\n /**\n * Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n left: [{ left: scaleInset() }],\n /**\n * Visibility\n * @see https://tailwindcss.com/docs/visibility\n */\n visibility: ['visible', 'invisible', 'collapse'],\n /**\n * Z-Index\n * @see https://tailwindcss.com/docs/z-index\n */\n z: [{ z: [isInteger, 'auto', isArbitraryVariable, isArbitraryValue] }],\n\n // ------------------------\n // --- Flexbox and Grid ---\n // ------------------------\n\n /**\n * Flex Basis\n * @see https://tailwindcss.com/docs/flex-basis\n */\n basis: [\n {\n basis: [\n isFraction,\n 'full',\n 'auto',\n themeContainer,\n ...scaleUnambiguousSpacing(),\n ],\n },\n ],\n /**\n * Flex Direction\n * @see https://tailwindcss.com/docs/flex-direction\n */\n 'flex-direction': [{ flex: ['row', 'row-reverse', 'col', 'col-reverse'] }],\n /**\n * Flex Wrap\n * @see https://tailwindcss.com/docs/flex-wrap\n */\n 'flex-wrap': [{ flex: ['nowrap', 'wrap', 'wrap-reverse'] }],\n /**\n * Flex\n * @see https://tailwindcss.com/docs/flex\n */\n flex: [{ flex: [isNumber, isFraction, 'auto', 'initial', 'none', isArbitraryValue] }],\n /**\n * Flex Grow\n * @see https://tailwindcss.com/docs/flex-grow\n */\n grow: [{ grow: ['', isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Flex Shrink\n * @see https://tailwindcss.com/docs/flex-shrink\n */\n shrink: [{ shrink: ['', isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Order\n * @see https://tailwindcss.com/docs/order\n */\n order: [\n {\n order: [\n isInteger,\n 'first',\n 'last',\n 'none',\n isArbitraryVariable,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Grid Template Columns\n * @see https://tailwindcss.com/docs/grid-template-columns\n */\n 'grid-cols': [{ 'grid-cols': scaleGridTemplateColsRows() }],\n /**\n * Grid Column Start / End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start-end': [{ col: scaleGridColRowStartAndEnd() }],\n /**\n * Grid Column Start\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start': [{ 'col-start': scaleGridColRowStartOrEnd() }],\n /**\n * Grid Column End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-end': [{ 'col-end': scaleGridColRowStartOrEnd() }],\n /**\n * Grid Template Rows\n * @see https://tailwindcss.com/docs/grid-template-rows\n */\n 'grid-rows': [{ 'grid-rows': scaleGridTemplateColsRows() }],\n /**\n * Grid Row Start / End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start-end': [{ row: scaleGridColRowStartAndEnd() }],\n /**\n * Grid Row Start\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start': [{ 'row-start': scaleGridColRowStartOrEnd() }],\n /**\n * Grid Row End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-end': [{ 'row-end': scaleGridColRowStartOrEnd() }],\n /**\n * Grid Auto Flow\n * @see https://tailwindcss.com/docs/grid-auto-flow\n */\n 'grid-flow': [{ 'grid-flow': ['row', 'col', 'dense', 'row-dense', 'col-dense'] }],\n /**\n * Grid Auto Columns\n * @see https://tailwindcss.com/docs/grid-auto-columns\n */\n 'auto-cols': [{ 'auto-cols': scaleGridAutoColsRows() }],\n /**\n * Grid Auto Rows\n * @see https://tailwindcss.com/docs/grid-auto-rows\n */\n 'auto-rows': [{ 'auto-rows': scaleGridAutoColsRows() }],\n /**\n * Gap\n * @see https://tailwindcss.com/docs/gap\n */\n gap: [{ gap: scaleUnambiguousSpacing() }],\n /**\n * Gap X\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-x': [{ 'gap-x': scaleUnambiguousSpacing() }],\n /**\n * Gap Y\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-y': [{ 'gap-y': scaleUnambiguousSpacing() }],\n /**\n * Justify Content\n * @see https://tailwindcss.com/docs/justify-content\n */\n 'justify-content': [{ justify: [...scaleAlignPrimaryAxis(), 'normal'] }],\n /**\n * Justify Items\n * @see https://tailwindcss.com/docs/justify-items\n */\n 'justify-items': [{ 'justify-items': [...scaleAlignSecondaryAxis(), 'normal'] }],\n /**\n * Justify Self\n * @see https://tailwindcss.com/docs/justify-self\n */\n 'justify-self': [{ 'justify-self': ['auto', ...scaleAlignSecondaryAxis()] }],\n /**\n * Align Content\n * @see https://tailwindcss.com/docs/align-content\n */\n 'align-content': [{ content: ['normal', ...scaleAlignPrimaryAxis()] }],\n /**\n * Align Items\n * @see https://tailwindcss.com/docs/align-items\n */\n 'align-items': [{ items: [...scaleAlignSecondaryAxis(), { baseline: ['', 'last'] }] }],\n /**\n * Align Self\n * @see https://tailwindcss.com/docs/align-self\n */\n 'align-self': [\n { self: ['auto', ...scaleAlignSecondaryAxis(), { baseline: ['', 'last'] }] },\n ],\n /**\n * Place Content\n * @see https://tailwindcss.com/docs/place-content\n */\n 'place-content': [{ 'place-content': scaleAlignPrimaryAxis() }],\n /**\n * Place Items\n * @see https://tailwindcss.com/docs/place-items\n */\n 'place-items': [{ 'place-items': [...scaleAlignSecondaryAxis(), 'baseline'] }],\n /**\n * Place Self\n * @see https://tailwindcss.com/docs/place-self\n */\n 'place-self': [{ 'place-self': ['auto', ...scaleAlignSecondaryAxis()] }],\n // Spacing\n /**\n * Padding\n * @see https://tailwindcss.com/docs/padding\n */\n p: [{ p: scaleUnambiguousSpacing() }],\n /**\n * Padding Inline\n * @see https://tailwindcss.com/docs/padding\n */\n px: [{ px: scaleUnambiguousSpacing() }],\n /**\n * Padding Block\n * @see https://tailwindcss.com/docs/padding\n */\n py: [{ py: scaleUnambiguousSpacing() }],\n /**\n * Padding Inline Start\n * @see https://tailwindcss.com/docs/padding\n */\n ps: [{ ps: scaleUnambiguousSpacing() }],\n /**\n * Padding Inline End\n * @see https://tailwindcss.com/docs/padding\n */\n pe: [{ pe: scaleUnambiguousSpacing() }],\n /**\n * Padding Block Start\n * @see https://tailwindcss.com/docs/padding\n */\n pbs: [{ pbs: scaleUnambiguousSpacing() }],\n /**\n * Padding Block End\n * @see https://tailwindcss.com/docs/padding\n */\n pbe: [{ pbe: scaleUnambiguousSpacing() }],\n /**\n * Padding Top\n * @see https://tailwindcss.com/docs/padding\n */\n pt: [{ pt: scaleUnambiguousSpacing() }],\n /**\n * Padding Right\n * @see https://tailwindcss.com/docs/padding\n */\n pr: [{ pr: scaleUnambiguousSpacing() }],\n /**\n * Padding Bottom\n * @see https://tailwindcss.com/docs/padding\n */\n pb: [{ pb: scaleUnambiguousSpacing() }],\n /**\n * Padding Left\n * @see https://tailwindcss.com/docs/padding\n */\n pl: [{ pl: scaleUnambiguousSpacing() }],\n /**\n * Margin\n * @see https://tailwindcss.com/docs/margin\n */\n m: [{ m: scaleMargin() }],\n /**\n * Margin Inline\n * @see https://tailwindcss.com/docs/margin\n */\n mx: [{ mx: scaleMargin() }],\n /**\n * Margin Block\n * @see https://tailwindcss.com/docs/margin\n */\n my: [{ my: scaleMargin() }],\n /**\n * Margin Inline Start\n * @see https://tailwindcss.com/docs/margin\n */\n ms: [{ ms: scaleMargin() }],\n /**\n * Margin Inline End\n * @see https://tailwindcss.com/docs/margin\n */\n me: [{ me: scaleMargin() }],\n /**\n * Margin Block Start\n * @see https://tailwindcss.com/docs/margin\n */\n mbs: [{ mbs: scaleMargin() }],\n /**\n * Margin Block End\n * @see https://tailwindcss.com/docs/margin\n */\n mbe: [{ mbe: scaleMargin() }],\n /**\n * Margin Top\n * @see https://tailwindcss.com/docs/margin\n */\n mt: [{ mt: scaleMargin() }],\n /**\n * Margin Right\n * @see https://tailwindcss.com/docs/margin\n */\n mr: [{ mr: scaleMargin() }],\n /**\n * Margin Bottom\n * @see https://tailwindcss.com/docs/margin\n */\n mb: [{ mb: scaleMargin() }],\n /**\n * Margin Left\n * @see https://tailwindcss.com/docs/margin\n */\n ml: [{ ml: scaleMargin() }],\n /**\n * Space Between X\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-x': [{ 'space-x': scaleUnambiguousSpacing() }],\n /**\n * Space Between X Reverse\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-x-reverse': ['space-x-reverse'],\n /**\n * Space Between Y\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-y': [{ 'space-y': scaleUnambiguousSpacing() }],\n /**\n * Space Between Y Reverse\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-y-reverse': ['space-y-reverse'],\n\n // --------------\n // --- Sizing ---\n // --------------\n\n /**\n * Size\n * @see https://tailwindcss.com/docs/width#setting-both-width-and-height\n */\n size: [{ size: scaleSizing() }],\n /**\n * Inline Size\n * @see https://tailwindcss.com/docs/width\n */\n 'inline-size': [{ inline: ['auto', ...scaleSizingInline()] }],\n /**\n * Min-Inline Size\n * @see https://tailwindcss.com/docs/min-width\n */\n 'min-inline-size': [{ 'min-inline': ['auto', ...scaleSizingInline()] }],\n /**\n * Max-Inline Size\n * @see https://tailwindcss.com/docs/max-width\n */\n 'max-inline-size': [{ 'max-inline': ['none', ...scaleSizingInline()] }],\n /**\n * Block Size\n * @see https://tailwindcss.com/docs/height\n */\n 'block-size': [{ block: ['auto', ...scaleSizingBlock()] }],\n /**\n * Min-Block Size\n * @see https://tailwindcss.com/docs/min-height\n */\n 'min-block-size': [{ 'min-block': ['auto', ...scaleSizingBlock()] }],\n /**\n * Max-Block Size\n * @see https://tailwindcss.com/docs/max-height\n */\n 'max-block-size': [{ 'max-block': ['none', ...scaleSizingBlock()] }],\n /**\n * Width\n * @see https://tailwindcss.com/docs/width\n */\n w: [{ w: [themeContainer, 'screen', ...scaleSizing()] }],\n /**\n * Min-Width\n * @see https://tailwindcss.com/docs/min-width\n */\n 'min-w': [\n {\n 'min-w': [\n themeContainer,\n 'screen',\n /** Deprecated. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n 'none',\n ...scaleSizing(),\n ],\n },\n ],\n /**\n * Max-Width\n * @see https://tailwindcss.com/docs/max-width\n */\n 'max-w': [\n {\n 'max-w': [\n themeContainer,\n 'screen',\n 'none',\n /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n 'prose',\n /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n { screen: [themeBreakpoint] },\n ...scaleSizing(),\n ],\n },\n ],\n /**\n * Height\n * @see https://tailwindcss.com/docs/height\n */\n h: [{ h: ['screen', 'lh', ...scaleSizing()] }],\n /**\n * Min-Height\n * @see https://tailwindcss.com/docs/min-height\n */\n 'min-h': [{ 'min-h': ['screen', 'lh', 'none', ...scaleSizing()] }],\n /**\n * Max-Height\n * @see https://tailwindcss.com/docs/max-height\n */\n 'max-h': [{ 'max-h': ['screen', 'lh', ...scaleSizing()] }],\n\n // ------------------\n // --- Typography ---\n // ------------------\n\n /**\n * Font Size\n * @see https://tailwindcss.com/docs/font-size\n */\n 'font-size': [\n { text: ['base', themeText, isArbitraryVariableLength, isArbitraryLength] },\n ],\n /**\n * Font Smoothing\n * @see https://tailwindcss.com/docs/font-smoothing\n */\n 'font-smoothing': ['antialiased', 'subpixel-antialiased'],\n /**\n * Font Style\n * @see https://tailwindcss.com/docs/font-style\n */\n 'font-style': ['italic', 'not-italic'],\n /**\n * Font Weight\n * @see https://tailwindcss.com/docs/font-weight\n */\n 'font-weight': [\n {\n font: [themeFontWeight, isArbitraryVariableWeight, isArbitraryWeight],\n },\n ],\n /**\n * Font Stretch\n * @see https://tailwindcss.com/docs/font-stretch\n */\n 'font-stretch': [\n {\n 'font-stretch': [\n 'ultra-condensed',\n 'extra-condensed',\n 'condensed',\n 'semi-condensed',\n 'normal',\n 'semi-expanded',\n 'expanded',\n 'extra-expanded',\n 'ultra-expanded',\n isPercent,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Font Family\n * @see https://tailwindcss.com/docs/font-family\n */\n 'font-family': [\n { font: [isArbitraryVariableFamilyName, isArbitraryFamilyName, themeFont] },\n ],\n /**\n * Font Feature Settings\n * @see https://tailwindcss.com/docs/font-feature-settings\n */\n 'font-features': [{ 'font-features': [isArbitraryValue] }],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-normal': ['normal-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-ordinal': ['ordinal'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-slashed-zero': ['slashed-zero'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-figure': ['lining-nums', 'oldstyle-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-spacing': ['proportional-nums', 'tabular-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-fraction': ['diagonal-fractions', 'stacked-fractions'],\n /**\n * Letter Spacing\n * @see https://tailwindcss.com/docs/letter-spacing\n */\n tracking: [{ tracking: [themeTracking, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Line Clamp\n * @see https://tailwindcss.com/docs/line-clamp\n */\n 'line-clamp': [\n { 'line-clamp': [isNumber, 'none', isArbitraryVariable, isArbitraryNumber] },\n ],\n /**\n * Line Height\n * @see https://tailwindcss.com/docs/line-height\n */\n leading: [\n {\n leading: [\n /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n themeLeading,\n ...scaleUnambiguousSpacing(),\n ],\n },\n ],\n /**\n * List Style Image\n * @see https://tailwindcss.com/docs/list-style-image\n */\n 'list-image': [{ 'list-image': ['none', isArbitraryVariable, isArbitraryValue] }],\n /**\n * List Style Position\n * @see https://tailwindcss.com/docs/list-style-position\n */\n 'list-style-position': [{ list: ['inside', 'outside'] }],\n /**\n * List Style Type\n * @see https://tailwindcss.com/docs/list-style-type\n */\n 'list-style-type': [\n { list: ['disc', 'decimal', 'none', isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Text Alignment\n * @see https://tailwindcss.com/docs/text-align\n */\n 'text-alignment': [{ text: ['left', 'center', 'right', 'justify', 'start', 'end'] }],\n /**\n * Placeholder Color\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://v3.tailwindcss.com/docs/placeholder-color\n */\n 'placeholder-color': [{ placeholder: scaleColor() }],\n /**\n * Text Color\n * @see https://tailwindcss.com/docs/text-color\n */\n 'text-color': [{ text: scaleColor() }],\n /**\n * Text Decoration\n * @see https://tailwindcss.com/docs/text-decoration\n */\n 'text-decoration': ['underline', 'overline', 'line-through', 'no-underline'],\n /**\n * Text Decoration Style\n * @see https://tailwindcss.com/docs/text-decoration-style\n */\n 'text-decoration-style': [{ decoration: [...scaleLineStyle(), 'wavy'] }],\n /**\n * Text Decoration Thickness\n * @see https://tailwindcss.com/docs/text-decoration-thickness\n */\n 'text-decoration-thickness': [\n {\n decoration: [\n isNumber,\n 'from-font',\n 'auto',\n isArbitraryVariable,\n isArbitraryLength,\n ],\n },\n ],\n /**\n * Text Decoration Color\n * @see https://tailwindcss.com/docs/text-decoration-color\n */\n 'text-decoration-color': [{ decoration: scaleColor() }],\n /**\n * Text Underline Offset\n * @see https://tailwindcss.com/docs/text-underline-offset\n */\n 'underline-offset': [\n { 'underline-offset': [isNumber, 'auto', isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Text Transform\n * @see https://tailwindcss.com/docs/text-transform\n */\n 'text-transform': ['uppercase', 'lowercase', 'capitalize', 'normal-case'],\n /**\n * Text Overflow\n * @see https://tailwindcss.com/docs/text-overflow\n */\n 'text-overflow': ['truncate', 'text-ellipsis', 'text-clip'],\n /**\n * Text Wrap\n * @see https://tailwindcss.com/docs/text-wrap\n */\n 'text-wrap': [{ text: ['wrap', 'nowrap', 'balance', 'pretty'] }],\n /**\n * Text Indent\n * @see https://tailwindcss.com/docs/text-indent\n */\n indent: [{ indent: scaleUnambiguousSpacing() }],\n /**\n * Tab Size\n * @see https://tailwindcss.com/docs/tab-size\n */\n 'tab-size': [{ tab: [isInteger, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Vertical Alignment\n * @see https://tailwindcss.com/docs/vertical-align\n */\n 'vertical-align': [\n {\n align: [\n 'baseline',\n 'top',\n 'middle',\n 'bottom',\n 'text-top',\n 'text-bottom',\n 'sub',\n 'super',\n isArbitraryVariable,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Whitespace\n * @see https://tailwindcss.com/docs/whitespace\n */\n whitespace: [\n { whitespace: ['normal', 'nowrap', 'pre', 'pre-line', 'pre-wrap', 'break-spaces'] },\n ],\n /**\n * Word Break\n * @see https://tailwindcss.com/docs/word-break\n */\n break: [{ break: ['normal', 'words', 'all', 'keep'] }],\n /**\n * Overflow Wrap\n * @see https://tailwindcss.com/docs/overflow-wrap\n */\n wrap: [{ wrap: ['break-word', 'anywhere', 'normal'] }],\n /**\n * Hyphens\n * @see https://tailwindcss.com/docs/hyphens\n */\n hyphens: [{ hyphens: ['none', 'manual', 'auto'] }],\n /**\n * Content\n * @see https://tailwindcss.com/docs/content\n */\n content: [{ content: ['none', isArbitraryVariable, isArbitraryValue] }],\n\n // -------------------\n // --- Backgrounds ---\n // -------------------\n\n /**\n * Background Attachment\n * @see https://tailwindcss.com/docs/background-attachment\n */\n 'bg-attachment': [{ bg: ['fixed', 'local', 'scroll'] }],\n /**\n * Background Clip\n * @see https://tailwindcss.com/docs/background-clip\n */\n 'bg-clip': [{ 'bg-clip': ['border', 'padding', 'content', 'text'] }],\n /**\n * Background Origin\n * @see https://tailwindcss.com/docs/background-origin\n */\n 'bg-origin': [{ 'bg-origin': ['border', 'padding', 'content'] }],\n /**\n * Background Position\n * @see https://tailwindcss.com/docs/background-position\n */\n 'bg-position': [{ bg: scaleBgPosition() }],\n /**\n * Background Repeat\n * @see https://tailwindcss.com/docs/background-repeat\n */\n 'bg-repeat': [{ bg: scaleBgRepeat() }],\n /**\n * Background Size\n * @see https://tailwindcss.com/docs/background-size\n */\n 'bg-size': [{ bg: scaleBgSize() }],\n /**\n * Background Image\n * @see https://tailwindcss.com/docs/background-image\n */\n 'bg-image': [\n {\n bg: [\n 'none',\n {\n linear: [\n { to: ['t', 'tr', 'r', 'br', 'b', 'bl', 'l', 'tl'] },\n isInteger,\n isArbitraryVariable,\n isArbitraryValue,\n ],\n radial: ['', isArbitraryVariable, isArbitraryValue],\n conic: [isInteger, isArbitraryVariable, isArbitraryValue],\n },\n isArbitraryVariableImage,\n isArbitraryImage,\n ],\n },\n ],\n /**\n * Background Color\n * @see https://tailwindcss.com/docs/background-color\n */\n 'bg-color': [{ bg: scaleColor() }],\n /**\n * Gradient Color Stops From Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from-pos': [{ from: scaleGradientStopPosition() }],\n /**\n * Gradient Color Stops Via Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via-pos': [{ via: scaleGradientStopPosition() }],\n /**\n * Gradient Color Stops To Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to-pos': [{ to: scaleGradientStopPosition() }],\n /**\n * Gradient Color Stops From\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from': [{ from: scaleColor() }],\n /**\n * Gradient Color Stops Via\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via': [{ via: scaleColor() }],\n /**\n * Gradient Color Stops To\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to': [{ to: scaleColor() }],\n\n // ---------------\n // --- Borders ---\n // ---------------\n\n /**\n * Border Radius\n * @see https://tailwindcss.com/docs/border-radius\n */\n rounded: [{ rounded: scaleRadius() }],\n /**\n * Border Radius Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-s': [{ 'rounded-s': scaleRadius() }],\n /**\n * Border Radius End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-e': [{ 'rounded-e': scaleRadius() }],\n /**\n * Border Radius Top\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-t': [{ 'rounded-t': scaleRadius() }],\n /**\n * Border Radius Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-r': [{ 'rounded-r': scaleRadius() }],\n /**\n * Border Radius Bottom\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-b': [{ 'rounded-b': scaleRadius() }],\n /**\n * Border Radius Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-l': [{ 'rounded-l': scaleRadius() }],\n /**\n * Border Radius Start Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ss': [{ 'rounded-ss': scaleRadius() }],\n /**\n * Border Radius Start End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-se': [{ 'rounded-se': scaleRadius() }],\n /**\n * Border Radius End End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ee': [{ 'rounded-ee': scaleRadius() }],\n /**\n * Border Radius End Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-es': [{ 'rounded-es': scaleRadius() }],\n /**\n * Border Radius Top Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tl': [{ 'rounded-tl': scaleRadius() }],\n /**\n * Border Radius Top Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tr': [{ 'rounded-tr': scaleRadius() }],\n /**\n * Border Radius Bottom Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-br': [{ 'rounded-br': scaleRadius() }],\n /**\n * Border Radius Bottom Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-bl': [{ 'rounded-bl': scaleRadius() }],\n /**\n * Border Width\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w': [{ border: scaleBorderWidth() }],\n /**\n * Border Width Inline\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-x': [{ 'border-x': scaleBorderWidth() }],\n /**\n * Border Width Block\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-y': [{ 'border-y': scaleBorderWidth() }],\n /**\n * Border Width Inline Start\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-s': [{ 'border-s': scaleBorderWidth() }],\n /**\n * Border Width Inline End\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-e': [{ 'border-e': scaleBorderWidth() }],\n /**\n * Border Width Block Start\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-bs': [{ 'border-bs': scaleBorderWidth() }],\n /**\n * Border Width Block End\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-be': [{ 'border-be': scaleBorderWidth() }],\n /**\n * Border Width Top\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-t': [{ 'border-t': scaleBorderWidth() }],\n /**\n * Border Width Right\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-r': [{ 'border-r': scaleBorderWidth() }],\n /**\n * Border Width Bottom\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-b': [{ 'border-b': scaleBorderWidth() }],\n /**\n * Border Width Left\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-l': [{ 'border-l': scaleBorderWidth() }],\n /**\n * Divide Width X\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-x': [{ 'divide-x': scaleBorderWidth() }],\n /**\n * Divide Width X Reverse\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-x-reverse': ['divide-x-reverse'],\n /**\n * Divide Width Y\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-y': [{ 'divide-y': scaleBorderWidth() }],\n /**\n * Divide Width Y Reverse\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-y-reverse': ['divide-y-reverse'],\n /**\n * Border Style\n * @see https://tailwindcss.com/docs/border-style\n */\n 'border-style': [{ border: [...scaleLineStyle(), 'hidden', 'none'] }],\n /**\n * Divide Style\n * @see https://tailwindcss.com/docs/border-style#setting-the-divider-style\n */\n 'divide-style': [{ divide: [...scaleLineStyle(), 'hidden', 'none'] }],\n /**\n * Border Color\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color': [{ border: scaleColor() }],\n /**\n * Border Color Inline\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-x': [{ 'border-x': scaleColor() }],\n /**\n * Border Color Block\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-y': [{ 'border-y': scaleColor() }],\n /**\n * Border Color Inline Start\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-s': [{ 'border-s': scaleColor() }],\n /**\n * Border Color Inline End\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-e': [{ 'border-e': scaleColor() }],\n /**\n * Border Color Block Start\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-bs': [{ 'border-bs': scaleColor() }],\n /**\n * Border Color Block End\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-be': [{ 'border-be': scaleColor() }],\n /**\n * Border Color Top\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-t': [{ 'border-t': scaleColor() }],\n /**\n * Border Color Right\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-r': [{ 'border-r': scaleColor() }],\n /**\n * Border Color Bottom\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-b': [{ 'border-b': scaleColor() }],\n /**\n * Border Color Left\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-l': [{ 'border-l': scaleColor() }],\n /**\n * Divide Color\n * @see https://tailwindcss.com/docs/divide-color\n */\n 'divide-color': [{ divide: scaleColor() }],\n /**\n * Outline Style\n * @see https://tailwindcss.com/docs/outline-style\n */\n 'outline-style': [{ outline: [...scaleLineStyle(), 'none', 'hidden'] }],\n /**\n * Outline Offset\n * @see https://tailwindcss.com/docs/outline-offset\n */\n 'outline-offset': [\n { 'outline-offset': [isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Outline Width\n * @see https://tailwindcss.com/docs/outline-width\n */\n 'outline-w': [\n { outline: ['', isNumber, isArbitraryVariableLength, isArbitraryLength] },\n ],\n /**\n * Outline Color\n * @see https://tailwindcss.com/docs/outline-color\n */\n 'outline-color': [{ outline: scaleColor() }],\n\n // ---------------\n // --- Effects ---\n // ---------------\n\n /**\n * Box Shadow\n * @see https://tailwindcss.com/docs/box-shadow\n */\n shadow: [\n {\n shadow: [\n // Deprecated since Tailwind CSS v4.0.0\n '',\n 'none',\n themeShadow,\n isArbitraryVariableShadow,\n isArbitraryShadow,\n ],\n },\n ],\n /**\n * Box Shadow Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-shadow-color\n */\n 'shadow-color': [{ shadow: scaleColor() }],\n /**\n * Inset Box Shadow\n * @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-shadow\n */\n 'inset-shadow': [\n {\n 'inset-shadow': [\n 'none',\n themeInsetShadow,\n isArbitraryVariableShadow,\n isArbitraryShadow,\n ],\n },\n ],\n /**\n * Inset Box Shadow Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-shadow-color\n */\n 'inset-shadow-color': [{ 'inset-shadow': scaleColor() }],\n /**\n * Ring Width\n * @see https://tailwindcss.com/docs/box-shadow#adding-a-ring\n */\n 'ring-w': [{ ring: scaleBorderWidth() }],\n /**\n * Ring Width Inset\n * @see https://v3.tailwindcss.com/docs/ring-width#inset-rings\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-w-inset': ['ring-inset'],\n /**\n * Ring Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-ring-color\n */\n 'ring-color': [{ ring: scaleColor() }],\n /**\n * Ring Offset Width\n * @see https://v3.tailwindcss.com/docs/ring-offset-width\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-offset-w': [{ 'ring-offset': [isNumber, isArbitraryLength] }],\n /**\n * Ring Offset Color\n * @see https://v3.tailwindcss.com/docs/ring-offset-color\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-offset-color': [{ 'ring-offset': scaleColor() }],\n /**\n * Inset Ring Width\n * @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-ring\n */\n 'inset-ring-w': [{ 'inset-ring': scaleBorderWidth() }],\n /**\n * Inset Ring Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-ring-color\n */\n 'inset-ring-color': [{ 'inset-ring': scaleColor() }],\n /**\n * Text Shadow\n * @see https://tailwindcss.com/docs/text-shadow\n */\n 'text-shadow': [\n {\n 'text-shadow': [\n 'none',\n themeTextShadow,\n isArbitraryVariableShadow,\n isArbitraryShadow,\n ],\n },\n ],\n /**\n * Text Shadow Color\n * @see https://tailwindcss.com/docs/text-shadow#setting-the-shadow-color\n */\n 'text-shadow-color': [{ 'text-shadow': scaleColor() }],\n /**\n * Opacity\n * @see https://tailwindcss.com/docs/opacity\n */\n opacity: [{ opacity: [isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Mix Blend Mode\n * @see https://tailwindcss.com/docs/mix-blend-mode\n */\n 'mix-blend': [{ 'mix-blend': [...scaleBlendMode(), 'plus-darker', 'plus-lighter'] }],\n /**\n * Background Blend Mode\n * @see https://tailwindcss.com/docs/background-blend-mode\n */\n 'bg-blend': [{ 'bg-blend': scaleBlendMode() }],\n /**\n * Mask Clip\n * @see https://tailwindcss.com/docs/mask-clip\n */\n 'mask-clip': [\n { 'mask-clip': ['border', 'padding', 'content', 'fill', 'stroke', 'view'] },\n 'mask-no-clip',\n ],\n /**\n * Mask Composite\n * @see https://tailwindcss.com/docs/mask-composite\n */\n 'mask-composite': [{ mask: ['add', 'subtract', 'intersect', 'exclude'] }],\n /**\n * Mask Image\n * @see https://tailwindcss.com/docs/mask-image\n */\n 'mask-image-linear-pos': [{ 'mask-linear': [isNumber] }],\n 'mask-image-linear-from-pos': [{ 'mask-linear-from': scaleMaskImagePosition() }],\n 'mask-image-linear-to-pos': [{ 'mask-linear-to': scaleMaskImagePosition() }],\n 'mask-image-linear-from-color': [{ 'mask-linear-from': scaleColor() }],\n 'mask-image-linear-to-color': [{ 'mask-linear-to': scaleColor() }],\n 'mask-image-t-from-pos': [{ 'mask-t-from': scaleMaskImagePosition() }],\n 'mask-image-t-to-pos': [{ 'mask-t-to': scaleMaskImagePosition() }],\n 'mask-image-t-from-color': [{ 'mask-t-from': scaleColor() }],\n 'mask-image-t-to-color': [{ 'mask-t-to': scaleColor() }],\n 'mask-image-r-from-pos': [{ 'mask-r-from': scaleMaskImagePosition() }],\n 'mask-image-r-to-pos': [{ 'mask-r-to': scaleMaskImagePosition() }],\n 'mask-image-r-from-color': [{ 'mask-r-from': scaleColor() }],\n 'mask-image-r-to-color': [{ 'mask-r-to': scaleColor() }],\n 'mask-image-b-from-pos': [{ 'mask-b-from': scaleMaskImagePosition() }],\n 'mask-image-b-to-pos': [{ 'mask-b-to': scaleMaskImagePosition() }],\n 'mask-image-b-from-color': [{ 'mask-b-from': scaleColor() }],\n 'mask-image-b-to-color': [{ 'mask-b-to': scaleColor() }],\n 'mask-image-l-from-pos': [{ 'mask-l-from': scaleMaskImagePosition() }],\n 'mask-image-l-to-pos': [{ 'mask-l-to': scaleMaskImagePosition() }],\n 'mask-image-l-from-color': [{ 'mask-l-from': scaleColor() }],\n 'mask-image-l-to-color': [{ 'mask-l-to': scaleColor() }],\n 'mask-image-x-from-pos': [{ 'mask-x-from': scaleMaskImagePosition() }],\n 'mask-image-x-to-pos': [{ 'mask-x-to': scaleMaskImagePosition() }],\n 'mask-image-x-from-color': [{ 'mask-x-from': scaleColor() }],\n 'mask-image-x-to-color': [{ 'mask-x-to': scaleColor() }],\n 'mask-image-y-from-pos': [{ 'mask-y-from': scaleMaskImagePosition() }],\n 'mask-image-y-to-pos': [{ 'mask-y-to': scaleMaskImagePosition() }],\n 'mask-image-y-from-color': [{ 'mask-y-from': scaleColor() }],\n 'mask-image-y-to-color': [{ 'mask-y-to': scaleColor() }],\n 'mask-image-radial': [{ 'mask-radial': [isArbitraryVariable, isArbitraryValue] }],\n 'mask-image-radial-from-pos': [{ 'mask-radial-from': scaleMaskImagePosition() }],\n 'mask-image-radial-to-pos': [{ 'mask-radial-to': scaleMaskImagePosition() }],\n 'mask-image-radial-from-color': [{ 'mask-radial-from': scaleColor() }],\n 'mask-image-radial-to-color': [{ 'mask-radial-to': scaleColor() }],\n 'mask-image-radial-shape': [{ 'mask-radial': ['circle', 'ellipse'] }],\n 'mask-image-radial-size': [\n { 'mask-radial': [{ closest: ['side', 'corner'], farthest: ['side', 'corner'] }] },\n ],\n 'mask-image-radial-pos': [{ 'mask-radial-at': scalePosition() }],\n 'mask-image-conic-pos': [{ 'mask-conic': [isNumber] }],\n 'mask-image-conic-from-pos': [{ 'mask-conic-from': scaleMaskImagePosition() }],\n 'mask-image-conic-to-pos': [{ 'mask-conic-to': scaleMaskImagePosition() }],\n 'mask-image-conic-from-color': [{ 'mask-conic-from': scaleColor() }],\n 'mask-image-conic-to-color': [{ 'mask-conic-to': scaleColor() }],\n /**\n * Mask Mode\n * @see https://tailwindcss.com/docs/mask-mode\n */\n 'mask-mode': [{ mask: ['alpha', 'luminance', 'match'] }],\n /**\n * Mask Origin\n * @see https://tailwindcss.com/docs/mask-origin\n */\n 'mask-origin': [\n { 'mask-origin': ['border', 'padding', 'content', 'fill', 'stroke', 'view'] },\n ],\n /**\n * Mask Position\n * @see https://tailwindcss.com/docs/mask-position\n */\n 'mask-position': [{ mask: scaleBgPosition() }],\n /**\n * Mask Repeat\n * @see https://tailwindcss.com/docs/mask-repeat\n */\n 'mask-repeat': [{ mask: scaleBgRepeat() }],\n /**\n * Mask Size\n * @see https://tailwindcss.com/docs/mask-size\n */\n 'mask-size': [{ mask: scaleBgSize() }],\n /**\n * Mask Type\n * @see https://tailwindcss.com/docs/mask-type\n */\n 'mask-type': [{ 'mask-type': ['alpha', 'luminance'] }],\n /**\n * Mask Image\n * @see https://tailwindcss.com/docs/mask-image\n */\n 'mask-image': [{ mask: ['none', isArbitraryVariable, isArbitraryValue] }],\n\n // ---------------\n // --- Filters ---\n // ---------------\n\n /**\n * Filter\n * @see https://tailwindcss.com/docs/filter\n */\n filter: [\n {\n filter: [\n // Deprecated since Tailwind CSS v3.0.0\n '',\n 'none',\n isArbitraryVariable,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Blur\n * @see https://tailwindcss.com/docs/blur\n */\n blur: [{ blur: scaleBlur() }],\n /**\n * Brightness\n * @see https://tailwindcss.com/docs/brightness\n */\n brightness: [{ brightness: [isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Contrast\n * @see https://tailwindcss.com/docs/contrast\n */\n contrast: [{ contrast: [isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Drop Shadow\n * @see https://tailwindcss.com/docs/drop-shadow\n */\n 'drop-shadow': [\n {\n 'drop-shadow': [\n // Deprecated since Tailwind CSS v4.0.0\n '',\n 'none',\n themeDropShadow,\n isArbitraryVariableShadow,\n isArbitraryShadow,\n ],\n },\n ],\n /**\n * Drop Shadow Color\n * @see https://tailwindcss.com/docs/filter-drop-shadow#setting-the-shadow-color\n */\n 'drop-shadow-color': [{ 'drop-shadow': scaleColor() }],\n /**\n * Grayscale\n * @see https://tailwindcss.com/docs/grayscale\n */\n grayscale: [{ grayscale: ['', isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Hue Rotate\n * @see https://tailwindcss.com/docs/hue-rotate\n */\n 'hue-rotate': [{ 'hue-rotate': [isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Invert\n * @see https://tailwindcss.com/docs/invert\n */\n invert: [{ invert: ['', isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Saturate\n * @see https://tailwindcss.com/docs/saturate\n */\n saturate: [{ saturate: [isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Sepia\n * @see https://tailwindcss.com/docs/sepia\n */\n sepia: [{ sepia: ['', isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Backdrop Filter\n * @see https://tailwindcss.com/docs/backdrop-filter\n */\n 'backdrop-filter': [\n {\n 'backdrop-filter': [\n // Deprecated since Tailwind CSS v3.0.0\n '',\n 'none',\n isArbitraryVariable,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Backdrop Blur\n * @see https://tailwindcss.com/docs/backdrop-blur\n */\n 'backdrop-blur': [{ 'backdrop-blur': scaleBlur() }],\n /**\n * Backdrop Brightness\n * @see https://tailwindcss.com/docs/backdrop-brightness\n */\n 'backdrop-brightness': [\n { 'backdrop-brightness': [isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Backdrop Contrast\n * @see https://tailwindcss.com/docs/backdrop-contrast\n */\n 'backdrop-contrast': [\n { 'backdrop-contrast': [isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Backdrop Grayscale\n * @see https://tailwindcss.com/docs/backdrop-grayscale\n */\n 'backdrop-grayscale': [\n { 'backdrop-grayscale': ['', isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Backdrop Hue Rotate\n * @see https://tailwindcss.com/docs/backdrop-hue-rotate\n */\n 'backdrop-hue-rotate': [\n { 'backdrop-hue-rotate': [isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Backdrop Invert\n * @see https://tailwindcss.com/docs/backdrop-invert\n */\n 'backdrop-invert': [\n { 'backdrop-invert': ['', isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Backdrop Opacity\n * @see https://tailwindcss.com/docs/backdrop-opacity\n */\n 'backdrop-opacity': [\n { 'backdrop-opacity': [isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Backdrop Saturate\n * @see https://tailwindcss.com/docs/backdrop-saturate\n */\n 'backdrop-saturate': [\n { 'backdrop-saturate': [isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Backdrop Sepia\n * @see https://tailwindcss.com/docs/backdrop-sepia\n */\n 'backdrop-sepia': [\n { 'backdrop-sepia': ['', isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n\n // --------------\n // --- Tables ---\n // --------------\n\n /**\n * Border Collapse\n * @see https://tailwindcss.com/docs/border-collapse\n */\n 'border-collapse': [{ border: ['collapse', 'separate'] }],\n /**\n * Border Spacing\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing': [{ 'border-spacing': scaleUnambiguousSpacing() }],\n /**\n * Border Spacing X\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-x': [{ 'border-spacing-x': scaleUnambiguousSpacing() }],\n /**\n * Border Spacing Y\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-y': [{ 'border-spacing-y': scaleUnambiguousSpacing() }],\n /**\n * Table Layout\n * @see https://tailwindcss.com/docs/table-layout\n */\n 'table-layout': [{ table: ['auto', 'fixed'] }],\n /**\n * Caption Side\n * @see https://tailwindcss.com/docs/caption-side\n */\n caption: [{ caption: ['top', 'bottom'] }],\n\n // ---------------------------------\n // --- Transitions and Animation ---\n // ---------------------------------\n\n /**\n * Transition Property\n * @see https://tailwindcss.com/docs/transition-property\n */\n transition: [\n {\n transition: [\n '',\n 'all',\n 'colors',\n 'opacity',\n 'shadow',\n 'transform',\n 'none',\n isArbitraryVariable,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Transition Behavior\n * @see https://tailwindcss.com/docs/transition-behavior\n */\n 'transition-behavior': [{ transition: ['normal', 'discrete'] }],\n /**\n * Transition Duration\n * @see https://tailwindcss.com/docs/transition-duration\n */\n duration: [{ duration: [isNumber, 'initial', isArbitraryVariable, isArbitraryValue] }],\n /**\n * Transition Timing Function\n * @see https://tailwindcss.com/docs/transition-timing-function\n */\n ease: [\n { ease: ['linear', 'initial', themeEase, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Transition Delay\n * @see https://tailwindcss.com/docs/transition-delay\n */\n delay: [{ delay: [isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Animation\n * @see https://tailwindcss.com/docs/animation\n */\n animate: [{ animate: ['none', themeAnimate, isArbitraryVariable, isArbitraryValue] }],\n\n // ------------------\n // --- Transforms ---\n // ------------------\n\n /**\n * Backface Visibility\n * @see https://tailwindcss.com/docs/backface-visibility\n */\n backface: [{ backface: ['hidden', 'visible'] }],\n /**\n * Perspective\n * @see https://tailwindcss.com/docs/perspective\n */\n perspective: [\n { perspective: [themePerspective, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Perspective Origin\n * @see https://tailwindcss.com/docs/perspective-origin\n */\n 'perspective-origin': [{ 'perspective-origin': scalePositionWithArbitrary() }],\n /**\n * Rotate\n * @see https://tailwindcss.com/docs/rotate\n */\n rotate: [{ rotate: scaleRotate() }],\n /**\n * Rotate X\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-x': [{ 'rotate-x': scaleRotate() }],\n /**\n * Rotate Y\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-y': [{ 'rotate-y': scaleRotate() }],\n /**\n * Rotate Z\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-z': [{ 'rotate-z': scaleRotate() }],\n /**\n * Scale\n * @see https://tailwindcss.com/docs/scale\n */\n scale: [{ scale: scaleScale() }],\n /**\n * Scale X\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-x': [{ 'scale-x': scaleScale() }],\n /**\n * Scale Y\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-y': [{ 'scale-y': scaleScale() }],\n /**\n * Scale Z\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-z': [{ 'scale-z': scaleScale() }],\n /**\n * Scale 3D\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-3d': ['scale-3d'],\n /**\n * Skew\n * @see https://tailwindcss.com/docs/skew\n */\n skew: [{ skew: scaleSkew() }],\n /**\n * Skew X\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-x': [{ 'skew-x': scaleSkew() }],\n /**\n * Skew Y\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-y': [{ 'skew-y': scaleSkew() }],\n /**\n * Transform\n * @see https://tailwindcss.com/docs/transform\n */\n transform: [\n { transform: [isArbitraryVariable, isArbitraryValue, '', 'none', 'gpu', 'cpu'] },\n ],\n /**\n * Transform Origin\n * @see https://tailwindcss.com/docs/transform-origin\n */\n 'transform-origin': [{ origin: scalePositionWithArbitrary() }],\n /**\n * Transform Style\n * @see https://tailwindcss.com/docs/transform-style\n */\n 'transform-style': [{ transform: ['3d', 'flat'] }],\n /**\n * Translate\n * @see https://tailwindcss.com/docs/translate\n */\n translate: [{ translate: scaleTranslate() }],\n /**\n * Translate X\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-x': [{ 'translate-x': scaleTranslate() }],\n /**\n * Translate Y\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-y': [{ 'translate-y': scaleTranslate() }],\n /**\n * Translate Z\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-z': [{ 'translate-z': scaleTranslate() }],\n /**\n * Translate None\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-none': ['translate-none'],\n /**\n * Zoom\n * @see https://tailwindcss.com/docs/zoom\n */\n zoom: [{ zoom: [isInteger, isArbitraryVariable, isArbitraryValue] }],\n\n // ---------------------\n // --- Interactivity ---\n // ---------------------\n\n /**\n * Accent Color\n * @see https://tailwindcss.com/docs/accent-color\n */\n accent: [{ accent: scaleColor() }],\n /**\n * Appearance\n * @see https://tailwindcss.com/docs/appearance\n */\n appearance: [{ appearance: ['none', 'auto'] }],\n /**\n * Caret Color\n * @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities\n */\n 'caret-color': [{ caret: scaleColor() }],\n /**\n * Color Scheme\n * @see https://tailwindcss.com/docs/color-scheme\n */\n 'color-scheme': [\n { scheme: ['normal', 'dark', 'light', 'light-dark', 'only-dark', 'only-light'] },\n ],\n /**\n * Cursor\n * @see https://tailwindcss.com/docs/cursor\n */\n cursor: [\n {\n cursor: [\n 'auto',\n 'default',\n 'pointer',\n 'wait',\n 'text',\n 'move',\n 'help',\n 'not-allowed',\n 'none',\n 'context-menu',\n 'progress',\n 'cell',\n 'crosshair',\n 'vertical-text',\n 'alias',\n 'copy',\n 'no-drop',\n 'grab',\n 'grabbing',\n 'all-scroll',\n 'col-resize',\n 'row-resize',\n 'n-resize',\n 'e-resize',\n 's-resize',\n 'w-resize',\n 'ne-resize',\n 'nw-resize',\n 'se-resize',\n 'sw-resize',\n 'ew-resize',\n 'ns-resize',\n 'nesw-resize',\n 'nwse-resize',\n 'zoom-in',\n 'zoom-out',\n isArbitraryVariable,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Field Sizing\n * @see https://tailwindcss.com/docs/field-sizing\n */\n 'field-sizing': [{ 'field-sizing': ['fixed', 'content'] }],\n /**\n * Pointer Events\n * @see https://tailwindcss.com/docs/pointer-events\n */\n 'pointer-events': [{ 'pointer-events': ['auto', 'none'] }],\n /**\n * Resize\n * @see https://tailwindcss.com/docs/resize\n */\n resize: [{ resize: ['none', '', 'y', 'x'] }],\n /**\n * Scroll Behavior\n * @see https://tailwindcss.com/docs/scroll-behavior\n */\n 'scroll-behavior': [{ scroll: ['auto', 'smooth'] }],\n /**\n * Scrollbar Thumb Color\n * @see https://tailwindcss.com/docs/scrollbar-color\n */\n 'scrollbar-thumb-color': [{ 'scrollbar-thumb': scaleColor() }],\n /**\n * Scrollbar Track Color\n * @see https://tailwindcss.com/docs/scrollbar-color\n */\n 'scrollbar-track-color': [{ 'scrollbar-track': scaleColor() }],\n /**\n * Scrollbar Gutter\n * @see https://tailwindcss.com/docs/scrollbar-gutter\n */\n 'scrollbar-gutter': [{ 'scrollbar-gutter': ['auto', 'stable', 'both'] }],\n /**\n * Scrollbar Width\n * @see https://tailwindcss.com/docs/scrollbar-width\n */\n 'scrollbar-w': [{ scrollbar: ['auto', 'thin', 'none'] }],\n /**\n * Scroll Margin\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-m': [{ 'scroll-m': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Inline\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mx': [{ 'scroll-mx': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Block\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-my': [{ 'scroll-my': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Inline Start\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ms': [{ 'scroll-ms': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Inline End\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-me': [{ 'scroll-me': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Block Start\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mbs': [{ 'scroll-mbs': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Block End\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mbe': [{ 'scroll-mbe': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Top\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mt': [{ 'scroll-mt': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Right\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mr': [{ 'scroll-mr': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Bottom\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mb': [{ 'scroll-mb': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Left\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ml': [{ 'scroll-ml': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-p': [{ 'scroll-p': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Inline\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-px': [{ 'scroll-px': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Block\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-py': [{ 'scroll-py': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Inline Start\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-ps': [{ 'scroll-ps': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Inline End\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pe': [{ 'scroll-pe': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Block Start\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pbs': [{ 'scroll-pbs': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Block End\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pbe': [{ 'scroll-pbe': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Top\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pt': [{ 'scroll-pt': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Right\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pr': [{ 'scroll-pr': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Bottom\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pb': [{ 'scroll-pb': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Left\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pl': [{ 'scroll-pl': scaleUnambiguousSpacing() }],\n /**\n * Scroll Snap Align\n * @see https://tailwindcss.com/docs/scroll-snap-align\n */\n 'snap-align': [{ snap: ['start', 'end', 'center', 'align-none'] }],\n /**\n * Scroll Snap Stop\n * @see https://tailwindcss.com/docs/scroll-snap-stop\n */\n 'snap-stop': [{ snap: ['normal', 'always'] }],\n /**\n * Scroll Snap Type\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-type': [{ snap: ['none', 'x', 'y', 'both'] }],\n /**\n * Scroll Snap Type Strictness\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-strictness': [{ snap: ['mandatory', 'proximity'] }],\n /**\n * Touch Action\n * @see https://tailwindcss.com/docs/touch-action\n */\n touch: [{ touch: ['auto', 'none', 'manipulation'] }],\n /**\n * Touch Action X\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-x': [{ 'touch-pan': ['x', 'left', 'right'] }],\n /**\n * Touch Action Y\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-y': [{ 'touch-pan': ['y', 'up', 'down'] }],\n /**\n * Touch Action Pinch Zoom\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-pz': ['touch-pinch-zoom'],\n /**\n * User Select\n * @see https://tailwindcss.com/docs/user-select\n */\n select: [{ select: ['none', 'text', 'all', 'auto'] }],\n /**\n * Will Change\n * @see https://tailwindcss.com/docs/will-change\n */\n 'will-change': [\n {\n 'will-change': [\n 'auto',\n 'scroll',\n 'contents',\n 'transform',\n isArbitraryVariable,\n isArbitraryValue,\n ],\n },\n ],\n\n // -----------\n // --- SVG ---\n // -----------\n\n /**\n * Fill\n * @see https://tailwindcss.com/docs/fill\n */\n fill: [{ fill: ['none', ...scaleColor()] }],\n /**\n * Stroke Width\n * @see https://tailwindcss.com/docs/stroke-width\n */\n 'stroke-w': [\n {\n stroke: [\n isNumber,\n isArbitraryVariableLength,\n isArbitraryLength,\n isArbitraryNumber,\n ],\n },\n ],\n /**\n * Stroke\n * @see https://tailwindcss.com/docs/stroke\n */\n stroke: [{ stroke: ['none', ...scaleColor()] }],\n\n // ---------------------\n // --- Accessibility ---\n // ---------------------\n\n /**\n * Forced Color Adjust\n * @see https://tailwindcss.com/docs/forced-color-adjust\n */\n 'forced-color-adjust': [{ 'forced-color-adjust': ['auto', 'none'] }],\n },\n conflictingClassGroups: {\n 'container-named': ['container-type'],\n overflow: ['overflow-x', 'overflow-y'],\n overscroll: ['overscroll-x', 'overscroll-y'],\n inset: [\n 'inset-x',\n 'inset-y',\n 'inset-bs',\n 'inset-be',\n 'start',\n 'end',\n 'top',\n 'right',\n 'bottom',\n 'left',\n ],\n 'inset-x': ['right', 'left'],\n 'inset-y': ['top', 'bottom'],\n flex: ['basis', 'grow', 'shrink'],\n gap: ['gap-x', 'gap-y'],\n p: ['px', 'py', 'ps', 'pe', 'pbs', 'pbe', 'pt', 'pr', 'pb', 'pl'],\n px: ['pr', 'pl'],\n py: ['pt', 'pb'],\n m: ['mx', 'my', 'ms', 'me', 'mbs', 'mbe', 'mt', 'mr', 'mb', 'ml'],\n mx: ['mr', 'ml'],\n my: ['mt', 'mb'],\n size: ['w', 'h'],\n 'font-size': ['leading'],\n 'fvn-normal': [\n 'fvn-ordinal',\n 'fvn-slashed-zero',\n 'fvn-figure',\n 'fvn-spacing',\n 'fvn-fraction',\n ],\n 'fvn-ordinal': ['fvn-normal'],\n 'fvn-slashed-zero': ['fvn-normal'],\n 'fvn-figure': ['fvn-normal'],\n 'fvn-spacing': ['fvn-normal'],\n 'fvn-fraction': ['fvn-normal'],\n 'line-clamp': ['display', 'overflow'],\n rounded: [\n 'rounded-s',\n 'rounded-e',\n 'rounded-t',\n 'rounded-r',\n 'rounded-b',\n 'rounded-l',\n 'rounded-ss',\n 'rounded-se',\n 'rounded-ee',\n 'rounded-es',\n 'rounded-tl',\n 'rounded-tr',\n 'rounded-br',\n 'rounded-bl',\n ],\n 'rounded-s': ['rounded-ss', 'rounded-es'],\n 'rounded-e': ['rounded-se', 'rounded-ee'],\n 'rounded-t': ['rounded-tl', 'rounded-tr'],\n 'rounded-r': ['rounded-tr', 'rounded-br'],\n 'rounded-b': ['rounded-br', 'rounded-bl'],\n 'rounded-l': ['rounded-tl', 'rounded-bl'],\n 'border-spacing': ['border-spacing-x', 'border-spacing-y'],\n 'border-w': [\n 'border-w-x',\n 'border-w-y',\n 'border-w-s',\n 'border-w-e',\n 'border-w-bs',\n 'border-w-be',\n 'border-w-t',\n 'border-w-r',\n 'border-w-b',\n 'border-w-l',\n ],\n 'border-w-x': ['border-w-r', 'border-w-l'],\n 'border-w-y': ['border-w-t', 'border-w-b'],\n 'border-color': [\n 'border-color-x',\n 'border-color-y',\n 'border-color-s',\n 'border-color-e',\n 'border-color-bs',\n 'border-color-be',\n 'border-color-t',\n 'border-color-r',\n 'border-color-b',\n 'border-color-l',\n ],\n 'border-color-x': ['border-color-r', 'border-color-l'],\n 'border-color-y': ['border-color-t', 'border-color-b'],\n translate: ['translate-x', 'translate-y', 'translate-none'],\n 'translate-none': ['translate', 'translate-x', 'translate-y', 'translate-z'],\n 'scroll-m': [\n 'scroll-mx',\n 'scroll-my',\n 'scroll-ms',\n 'scroll-me',\n 'scroll-mbs',\n 'scroll-mbe',\n 'scroll-mt',\n 'scroll-mr',\n 'scroll-mb',\n 'scroll-ml',\n ],\n 'scroll-mx': ['scroll-mr', 'scroll-ml'],\n 'scroll-my': ['scroll-mt', 'scroll-mb'],\n 'scroll-p': [\n 'scroll-px',\n 'scroll-py',\n 'scroll-ps',\n 'scroll-pe',\n 'scroll-pbs',\n 'scroll-pbe',\n 'scroll-pt',\n 'scroll-pr',\n 'scroll-pb',\n 'scroll-pl',\n ],\n 'scroll-px': ['scroll-pr', 'scroll-pl'],\n 'scroll-py': ['scroll-pt', 'scroll-pb'],\n touch: ['touch-x', 'touch-y', 'touch-pz'],\n 'touch-x': ['touch'],\n 'touch-y': ['touch'],\n 'touch-pz': ['touch'],\n },\n conflictingClassGroupModifiers: {\n 'font-size': ['leading'],\n },\n postfixLookupClassGroups: ['container-type'],\n orderSensitiveModifiers: [\n '*',\n '**',\n 'after',\n 'backdrop',\n 'before',\n 'details-content',\n 'file',\n 'first-letter',\n 'first-line',\n 'marker',\n 'placeholder',\n 'selection',\n ],\n } as const satisfies Config<DefaultClassGroupIds, DefaultThemeGroupIds>\n}\n", "import { AnyConfig, ConfigExtension, NoInfer } from './types'\n\n/**\n * @param baseConfig Config where other config will be merged into. This object will be mutated.\n * @param configExtension Partial config to merge into the `baseConfig`.\n */\nexport const mergeConfigs = <ClassGroupIds extends string, ThemeGroupIds extends string = never>(\n baseConfig: AnyConfig,\n {\n cacheSize,\n prefix,\n experimentalParseClassName,\n extend = {},\n override = {},\n }: ConfigExtension<ClassGroupIds, ThemeGroupIds>,\n) => {\n overrideProperty(baseConfig, 'cacheSize', cacheSize)\n overrideProperty(baseConfig, 'prefix', prefix)\n overrideProperty(baseConfig, 'experimentalParseClassName', experimentalParseClassName)\n\n overrideConfigProperties(baseConfig.theme, override.theme)\n overrideConfigProperties(baseConfig.classGroups, override.classGroups)\n overrideConfigProperties(baseConfig.conflictingClassGroups, override.conflictingClassGroups)\n overrideConfigProperties(\n baseConfig.conflictingClassGroupModifiers,\n override.conflictingClassGroupModifiers,\n )\n overrideProperty(baseConfig, 'postfixLookupClassGroups', override.postfixLookupClassGroups)\n overrideProperty(baseConfig, 'orderSensitiveModifiers', override.orderSensitiveModifiers)\n\n mergeConfigProperties(baseConfig.theme, extend.theme)\n mergeConfigProperties(baseConfig.classGroups, extend.classGroups)\n mergeConfigProperties(baseConfig.conflictingClassGroups, extend.conflictingClassGroups)\n mergeConfigProperties(\n baseConfig.conflictingClassGroupModifiers,\n extend.conflictingClassGroupModifiers,\n )\n mergeArrayProperties(baseConfig, extend, 'postfixLookupClassGroups')\n mergeArrayProperties(baseConfig, extend, 'orderSensitiveModifiers')\n\n return baseConfig\n}\n\nconst overrideProperty = <T extends object, K extends keyof T>(\n baseObject: T,\n overrideKey: K,\n overrideValue: T[K] | undefined,\n) => {\n if (overrideValue !== undefined) {\n baseObject[overrideKey] = overrideValue\n }\n}\n\nconst overrideConfigProperties = (\n baseObject: Partial<Record<string, readonly unknown[]>>,\n overrideObject: Partial<Record<string, readonly unknown[]>> | undefined,\n) => {\n if (overrideObject) {\n for (const key in overrideObject) {\n overrideProperty(baseObject, key, overrideObject[key])\n }\n }\n}\n\nconst mergeConfigProperties = (\n baseObject: Partial<Record<string, readonly unknown[]>>,\n mergeObject: Partial<Record<string, readonly unknown[]>> | undefined,\n) => {\n if (mergeObject) {\n for (const key in mergeObject) {\n mergeArrayProperties(baseObject, mergeObject, key)\n }\n }\n}\n\nconst mergeArrayProperties = <Key extends string>(\n baseObject: Partial<Record<NoInfer<Key>, readonly unknown[]>>,\n mergeObject: Partial<Record<NoInfer<Key>, readonly unknown[]>>,\n key: Key,\n) => {\n const mergeValue = mergeObject[key]\n\n if (mergeValue !== undefined) {\n baseObject[key] = baseObject[key] ? baseObject[key].concat(mergeValue) : mergeValue\n }\n}\n", "import { createTailwindMerge } from './create-tailwind-merge'\nimport { getDefaultConfig } from './default-config'\nimport { mergeConfigs } from './merge-configs'\nimport { AnyConfig, ConfigExtension, DefaultClassGroupIds, DefaultThemeGroupIds } from './types'\n\ntype CreateConfigSubsequent = (config: AnyConfig) => AnyConfig\n\nexport const extendTailwindMerge = <\n AdditionalClassGroupIds extends string = never,\n AdditionalThemeGroupIds extends string = never,\n>(\n configExtension:\n | ConfigExtension<\n DefaultClassGroupIds | AdditionalClassGroupIds,\n DefaultThemeGroupIds | AdditionalThemeGroupIds\n >\n | CreateConfigSubsequent,\n ...createConfig: CreateConfigSubsequent[]\n) =>\n typeof configExtension === 'function'\n ? createTailwindMerge(getDefaultConfig, configExtension, ...createConfig)\n : createTailwindMerge(\n () => mergeConfigs(getDefaultConfig(), configExtension),\n ...createConfig,\n )\n", "import { createTailwindMerge } from './create-tailwind-merge'\nimport { getDefaultConfig } from './default-config'\n\nexport const twMerge = createTailwindMerge(getDefaultConfig)\n", "import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n", "export const ELEMENT_TYPES = [\n \"Frame\",\n \"Stack\",\n \"Section\",\n \"Container\",\n \"Grid\",\n \"Heading\",\n \"Text\",\n \"Image\",\n \"Button\",\n \"Video\",\n \"Icon\",\n \"Request\",\n \"Repeat\",\n] as const;\n\nexport type ElementType = (typeof ELEMENT_TYPES)[number];\n\n/** One key/value pair on a request; values may carry `{{\u2026}}` tokens. */\nexport type RequestPair = { key: string; value: string };\n\nexport const HTTP_METHODS = [\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\"] as const;\nexport type HttpMethod = (typeof HTTP_METHODS)[number];\n\nexport const DATA_SOURCE_NOT_FOUND_BEHAVIORS = [\"empty\", \"page-404\"] as const;\nexport type DataSourceNotFoundBehavior = (typeof DATA_SOURCE_NOT_FOUND_BEHAVIORS)[number];\n\n/** Methods that carry a request body. */\nexport function sendsBody(method: HttpMethod) {\n return method === \"POST\" || method === \"PUT\" || method === \"PATCH\";\n}\n\n/**\n * A JSON endpoint the page pulls content from. Sources live on the page so a\n * Repeat block can name one without carrying the URL on every element.\n */\nexport type DataSource = {\n id: string;\n name: string;\n url: string;\n /** Dotted path to the array inside the payload; \"\" when it is the root. */\n path: string;\n method?: HttpMethod;\n /** JSON body for POST/PUT/PATCH; tokens are resolved before sending. */\n body?: string;\n /** Appended to the URL as a query string. */\n params?: RequestPair[];\n /** Sent as request headers \u2014 for API keys and the like. */\n headers?: RequestPair[];\n /** Controls whether an upstream 404 empties this source or rejects the whole page. */\n onNotFound?: DataSourceNotFoundBehavior;\n};\n\n/**\n * Values a request token can read. Everything else resolves to an empty\n * string, so a typo cannot leak an unrelated value into the URL.\n */\nexport type RequestContext = {\n /** The visitor's query string, e.g. `{{query.id}}` on /post?id=5. */\n query: Record<string, string>;\n /** Values captured by a dynamic page path, e.g. `{{params.slug}}`. */\n params: Record<string, string>;\n /** The page being rendered, e.g. `{{page.slug}}`. */\n page: { slug: string };\n};\n\nexport type ResizeHandle = \"nw\" | \"ne\" | \"sw\" | \"se\" | \"n\" | \"s\" | \"w\" | \"e\";\n\n/* ------------------------------------------------------------- breakpoints */\n\nexport const BREAKPOINTS = [\"desktop\", \"tablet\", \"mobile\"] as const;\nexport type Breakpoint = string;\n\nexport type BreakpointDefinition = {\n id: string;\n name: string;\n width: number;\n};\n\nexport const DEFAULT_BREAKPOINTS: BreakpointDefinition[] = [\n { id: \"desktop\", name: \"Desktop\", width: 1280 },\n { id: \"tablet\", name: \"Tablet\", width: 768 },\n { id: \"mobile\", name: \"Mobile\", width: 375 },\n];\n\nexport const BREAKPOINT_WIDTHS: Record<string, number> = {\n desktop: 1280,\n tablet: 768,\n mobile: 375,\n};\n\n/**\n * Styles cascade from the widest breakpoint down, so a value set on desktop\n * holds everywhere until a narrower breakpoint overrides it.\n */\nexport const BREAKPOINT_CHAIN: Record<string, Breakpoint[]> = {\n desktop: [\"desktop\"],\n tablet: [\"desktop\", \"tablet\"],\n mobile: [\"desktop\", \"tablet\", \"mobile\"],\n};\n\n/* ------------------------------------------------------------------ styles */\n\n/** `fill` stretches to the parent, `auto` shrinks to the content. */\nexport type SizeMode = \"fixed\" | \"fill\" | \"auto\";\nexport type Constraint = \"start\" | \"center\" | \"end\" | \"stretch\";\n/** `absolute` positions children by x/y; `stack` lays them out with flexbox. */\nexport type LayoutMode = \"absolute\" | \"stack\";\nexport type Direction = \"row\" | \"column\";\nexport type Justify = \"start\" | \"center\" | \"end\" | \"between\";\nexport type Align = \"start\" | \"center\" | \"end\" | \"stretch\";\nexport type TextAlign = \"left\" | \"center\" | \"right\" | \"justify\";\nexport type TextTransform = \"none\" | \"uppercase\" | \"lowercase\" | \"capitalize\";\nexport type ObjectFit = \"cover\" | \"contain\" | \"fill\" | \"none\";\nexport type Overflow = \"visible\" | \"hidden\" | \"auto\" | \"scroll\";\nexport type Entrance = \"none\" | \"fade\" | \"up\" | \"down\" | \"left\" | \"right\" | \"zoom\";\nexport type MotionCurve = \"ease\" | \"spring\";\nexport type CursorStyle = \"auto\" | \"default\" | \"pointer\" | \"text\" | \"grab\" | \"zoom-in\" | \"none\";\nexport type PositionMode = \"static\" | \"sticky\";\nexport type BgSize = \"cover\" | \"contain\" | \"auto\";\nexport type BlendMode =\n | \"normal\"\n | \"multiply\"\n | \"screen\"\n | \"overlay\"\n | \"darken\"\n | \"lighten\"\n | \"difference\"\n | \"luminosity\";\nexport type BorderStyle = \"solid\" | \"dashed\" | \"dotted\";\n\nexport type ElementStyle = {\n // Box \u2014 x/y only apply inside an `absolute` parent.\n x: number;\n y: number;\n constraintX: Constraint;\n constraintY: Constraint;\n w: number;\n h: number;\n widthMode: SizeMode;\n heightMode: SizeMode;\n\n // How this element arranges its own children.\n layout: LayoutMode;\n direction: Direction;\n gap: number;\n padT: number;\n padR: number;\n padB: number;\n padL: number;\n justify: Justify;\n align: Align;\n wrap: boolean;\n /** Grid columns; only read when `layout` is `stack` on a Grid element. */\n columns: number;\n\n // Appearance\n bg: string;\n /** A full CSS gradient value, or \"\" for none. Painted over `bg`. */\n gradient: string;\n color: string;\n radius: number;\n opacity: number;\n borderW: number;\n borderC: string;\n borderStyle: BorderStyle;\n /** A full CSS box-shadow value, or \"\" for none. */\n shadow: string;\n rotate: number;\n\n // Typography\n fontFamily: string;\n fontSize: number;\n fontWeight: string;\n lineHeight: number;\n letterSpacing: number;\n textAlign: TextAlign;\n textTransform: TextTransform;\n\n // Composition \u2014 the pieces that make a layout feel designed rather than\n // stacked: clipping, sticky rails, imagery, glass and blend effects.\n overflow: Overflow;\n position: PositionMode;\n /** Distance from the top edge while stuck; only read when position is sticky. */\n stickyOffset: number;\n /** Background image URL, or \"\" for none. Painted over `gradient`. */\n bgImage: string;\n bgSize: BgSize;\n bgPosition: string;\n /** Blurs the element's own content, in px. */\n blur: number;\n /** Blurs whatever sits behind the element, in px \u2014 the glass effect. */\n backdropBlur: number;\n blendMode: BlendMode;\n /** Percent; 100 leaves the element alone. */\n scale: number;\n /** A CSS ratio such as \"16/9\", or \"\" to leave height to the layout. */\n aspectRatio: string;\n\n /** Entrance effect, played once when the element scrolls into view. */\n entrance: Entrance;\n /** Milliseconds. */\n entranceDuration: number;\n entranceDelay: number;\n entranceCurve: MotionCurve;\n entranceBezier: string;\n springStiffness: number;\n springDamping: number;\n cursor: CursorStyle;\n\n /** Hidden at this breakpoint. */\n hidden: boolean;\n};\n\nexport const STYLE_KEYS = [\n \"x\",\n \"y\",\n \"constraintX\",\n \"constraintY\",\n \"w\",\n \"h\",\n \"widthMode\",\n \"heightMode\",\n \"layout\",\n \"direction\",\n \"gap\",\n \"padT\",\n \"padR\",\n \"padB\",\n \"padL\",\n \"justify\",\n \"align\",\n \"wrap\",\n \"columns\",\n \"bg\",\n \"gradient\",\n \"color\",\n \"radius\",\n \"opacity\",\n \"borderW\",\n \"borderC\",\n \"borderStyle\",\n \"shadow\",\n \"rotate\",\n \"fontFamily\",\n \"fontSize\",\n \"fontWeight\",\n \"lineHeight\",\n \"letterSpacing\",\n \"textAlign\",\n \"textTransform\",\n \"overflow\",\n \"position\",\n \"stickyOffset\",\n \"bgImage\",\n \"bgSize\",\n \"bgPosition\",\n \"blur\",\n \"backdropBlur\",\n \"blendMode\",\n \"scale\",\n \"aspectRatio\",\n \"entrance\",\n \"entranceDuration\",\n \"entranceDelay\",\n \"entranceCurve\",\n \"entranceBezier\",\n \"springStiffness\",\n \"springDamping\",\n \"cursor\",\n \"hidden\",\n] as const satisfies ReadonlyArray<keyof ElementStyle>;\n\nexport type StyleKey = (typeof STYLE_KEYS)[number];\n\nexport type CanvasElement = {\n id: string;\n type: ElementType;\n name?: string;\n parentId?: string;\n z: number;\n locked?: boolean;\n /** Page-local reusable component metadata. */\n componentRole?: \"master\" | \"instance\";\n componentId?: string;\n componentSourceId?: string;\n variant?: string;\n styleBindings?: Partial<Record<StyleKey, string>>;\n\n // Content is shared across breakpoints.\n content?: string;\n /** Sandboxed HTML/CSS used by code components. */\n code?: string;\n src?: string;\n alt?: string;\n objectFit?: ObjectFit;\n iconName?: \"star\" | \"heart\" | \"arrow-right\" | \"check\" | \"menu\" | \"search\";\n href?: string;\n target?: \"_self\" | \"_blank\";\n interaction?: {\n trigger: \"click\";\n action: \"navigate\" | \"scroll-to\" | \"toggle-layer\" | \"show-layer\" | \"hide-layer\";\n value: string;\n target?: \"_self\" | \"_blank\";\n };\n\n /** Data source read by a Request/Repeat block or a directly-bound element. */\n sourceId?: string;\n /**\n * Inside Request/Repeat, pulls this field off the current object instead\n * of using the element's content. Dotted paths work: \"author.name\".\n */\n binding?: string;\n\n /** Desktop values; every breakpoint falls back to these. */\n base: ElementStyle;\n /** Narrower-breakpoint deltas, applied over `base` in cascade order. */\n overrides?: Record<string, Partial<ElementStyle>>;\n /** Applied on pointer hover, on top of the resolved breakpoint style. */\n hover?: Partial<ElementStyle>;\n /** Applied while the pointer is pressed. */\n press?: Partial<ElementStyle>;\n loop?: { type: \"pulse\" | \"float\" | \"spin\"; duration: number };\n draggable?: boolean;\n};\n\n/* ---------------------------------------------------------------- defaults */\n\nexport const BASE_STYLE: ElementStyle = {\n x: 0,\n y: 0,\n constraintX: \"start\",\n constraintY: \"start\",\n w: 200,\n h: 100,\n widthMode: \"fixed\",\n heightMode: \"fixed\",\n\n layout: \"absolute\",\n direction: \"column\",\n gap: 0,\n padT: 0,\n padR: 0,\n padB: 0,\n padL: 0,\n justify: \"start\",\n align: \"start\",\n wrap: false,\n columns: 3,\n\n bg: \"transparent\",\n gradient: \"\",\n color: \"#27272a\",\n radius: 0,\n opacity: 100,\n borderW: 0,\n borderC: \"transparent\",\n borderStyle: \"solid\",\n shadow: \"\",\n rotate: 0,\n\n fontFamily: \"inherit\",\n fontSize: 16,\n fontWeight: \"normal\",\n lineHeight: 1.5,\n letterSpacing: 0,\n textAlign: \"left\",\n textTransform: \"none\",\n\n overflow: \"visible\",\n position: \"static\",\n stickyOffset: 0,\n bgImage: \"\",\n bgSize: \"cover\",\n bgPosition: \"center\",\n blur: 0,\n backdropBlur: 0,\n blendMode: \"normal\",\n scale: 100,\n aspectRatio: \"\",\n\n entrance: \"none\",\n entranceDuration: 600,\n entranceDelay: 0,\n entranceCurve: \"ease\",\n entranceBezier: \"0.44, 0, 0.56, 1\",\n springStiffness: 300,\n springDamping: 30,\n cursor: \"auto\",\n\n hidden: false,\n};\n\nexport function makeStyle(overrides: Partial<ElementStyle>): ElementStyle {\n return { ...BASE_STYLE, ...overrides };\n}\n\n/** Every field a freshly dropped element starts with. */\nexport const ELEMENT_DEFAULTS: Record<\n ElementType,\n { style: Partial<ElementStyle>; props?: Partial<CanvasElement> }\n> = {\n Frame: {\n style: {\n w: 640,\n h: 420,\n widthMode: \"fixed\",\n heightMode: \"fixed\",\n layout: \"absolute\",\n direction: \"column\",\n overflow: \"hidden\",\n bg: \"#ffffff\",\n borderW: 1,\n borderC: \"#e4e4e7\",\n radius: 12,\n },\n },\n Stack: {\n style: {\n w: 600,\n h: 160,\n widthMode: \"fill\",\n heightMode: \"auto\",\n layout: \"stack\",\n direction: \"column\",\n gap: 16,\n padT: 0,\n padR: 0,\n padB: 0,\n padL: 0,\n justify: \"start\",\n align: \"stretch\",\n bg: \"transparent\",\n },\n },\n Section: {\n style: {\n w: 1280,\n h: 480,\n widthMode: \"fill\",\n heightMode: \"auto\",\n layout: \"stack\",\n direction: \"column\",\n gap: 24,\n padT: 64,\n padR: 48,\n padB: 64,\n padL: 48,\n justify: \"start\",\n align: \"stretch\",\n bg: \"#ffffff\",\n },\n },\n Container: {\n style: {\n w: 600,\n h: 240,\n widthMode: \"fill\",\n heightMode: \"auto\",\n layout: \"stack\",\n direction: \"column\",\n gap: 16,\n padT: 24,\n padR: 24,\n padB: 24,\n padL: 24,\n align: \"stretch\",\n bg: \"transparent\",\n borderW: 1,\n borderC: \"#e4e4e7\",\n radius: 12,\n },\n },\n Grid: {\n style: {\n w: 900,\n h: 300,\n widthMode: \"fill\",\n heightMode: \"auto\",\n layout: \"stack\",\n direction: \"row\",\n columns: 3,\n gap: 24,\n align: \"stretch\",\n },\n },\n Heading: {\n style: {\n w: 480,\n h: 48,\n widthMode: \"fill\",\n heightMode: \"auto\",\n fontSize: 40,\n fontWeight: \"bold\",\n lineHeight: 1.2,\n letterSpacing: -0.5,\n color: \"#18181b\",\n },\n props: { content: \"Heading\" },\n },\n Text: {\n style: {\n w: 480,\n h: 24,\n widthMode: \"fill\",\n heightMode: \"auto\",\n fontSize: 16,\n lineHeight: 1.6,\n color: \"#52525b\",\n },\n props: { content: \"Text block content\" },\n },\n Image: {\n style: { w: 400, h: 260, widthMode: \"fill\", bg: \"#e4e4e7\", radius: 12 },\n props: { src: \"\", alt: \"\", objectFit: \"cover\" },\n },\n Button: {\n style: {\n w: 140,\n h: 44,\n widthMode: \"auto\",\n heightMode: \"auto\",\n layout: \"stack\",\n direction: \"row\",\n justify: \"center\",\n align: \"center\",\n padT: 12,\n padR: 22,\n padB: 12,\n padL: 22,\n bg: \"#2563eb\",\n color: \"#ffffff\",\n radius: 8,\n fontSize: 15,\n fontWeight: \"500\",\n textAlign: \"center\",\n },\n props: { content: \"Button\", href: \"\", target: \"_self\" },\n },\n Video: {\n style: { w: 640, h: 360, widthMode: \"fill\", bg: \"#18181b\", radius: 12 },\n props: { src: \"\" },\n },\n Icon: {\n style: { w: 24, h: 24, widthMode: \"fixed\", heightMode: \"fixed\", color: \"#5402E6\" },\n props: { iconName: \"star\" },\n },\n Request: {\n style: {\n w: 900,\n h: 200,\n widthMode: \"fill\",\n heightMode: \"auto\",\n layout: \"stack\",\n direction: \"column\",\n gap: 16,\n align: \"stretch\",\n },\n props: { sourceId: \"\" },\n },\n Repeat: {\n style: {\n w: 900,\n h: 200,\n widthMode: \"fill\",\n heightMode: \"auto\",\n layout: \"stack\",\n direction: \"row\",\n gap: 24,\n align: \"stretch\",\n wrap: true,\n },\n props: { sourceId: \"\" },\n },\n};\n\n/* ----------------------------------------------------------------- helpers */\n\nconst CONTAINER_TYPES: ReadonlySet<ElementType> = new Set([\n \"Frame\",\n \"Stack\",\n \"Section\",\n \"Container\",\n \"Grid\",\n \"Button\",\n \"Request\",\n \"Repeat\",\n]);\n\n/** Whether an element can hold children. */\nexport function isContainer(type: ElementType) {\n return CONTAINER_TYPES.has(type);\n}\n\nconst TEXTUAL_TYPES: ReadonlySet<ElementType> = new Set([\n \"Heading\",\n \"Text\",\n \"Button\",\n]);\n\n/** Whether an element renders editable text. */\nexport function isTextual(type: ElementType) {\n return TEXTUAL_TYPES.has(type);\n}\n\n/** Page-level settings; the canvas behaves as the root container. */\nexport type RootStyle = {\n documentMode: \"page\" | \"component\";\n /** Content is centred inside this width unless `fullWidth` is set. */\n maxWidth: number;\n /** Editable design-surface height; the public page can still grow with content. */\n canvasHeight: number;\n /** Let content run edge to edge instead of being capped at `maxWidth`. */\n fullWidth: boolean;\n bg: string;\n layout: LayoutMode;\n direction: Direction;\n gap: number;\n padT: number;\n padR: number;\n padB: number;\n padL: number;\n align: Align;\n fontFamily: string;\n /** User-defined viewport previews, ordered from widest to narrowest. */\n breakpoints?: BreakpointDefinition[];\n /** The breakpoint whose values live in every element's `base` style. */\n baseBreakpointId?: string;\n variables?: DesignVariable[];\n customFonts?: CustomFont[];\n};\n\nexport type CustomFont = { id: string; name: string; url: string; weight: number; style: \"normal\" | \"italic\" };\n\nexport type DesignVariable = {\n id: string;\n name: string;\n type: \"color\" | \"number\";\n value: string | number;\n};\n\nexport const DEFAULT_ROOT_STYLE: RootStyle = {\n documentMode: \"page\",\n maxWidth: 1280,\n canvasHeight: 800,\n fullWidth: false,\n bg: \"#ffffff\",\n layout: \"stack\",\n direction: \"column\",\n gap: 0,\n padT: 0,\n padR: 0,\n padB: 0,\n padL: 0,\n align: \"stretch\",\n fontFamily: \"inherit\",\n};\n\nexport const FONT_STACKS: Array<{ label: string; value: string }> = [\n { label: \"Inherit\", value: \"inherit\" },\n { label: \"Sans\", value: \"ui-sans-serif, system-ui, sans-serif\" },\n { label: \"Serif\", value: \"ui-serif, Georgia, serif\" },\n { label: \"Mono\", value: \"ui-monospace, SFMono-Regular, monospace\" },\n];\n\nexport const SHADOW_PRESETS: Array<{ label: string; value: string }> = [\n { label: \"None\", value: \"\" },\n { label: \"Small\", value: \"0 1px 2px rgba(0,0,0,0.06)\" },\n { label: \"Medium\", value: \"0 4px 12px rgba(0,0,0,0.08)\" },\n { label: \"Large\", value: \"0 12px 32px rgba(0,0,0,0.12)\" },\n { label: \"Glow\", value: \"0 0 0 4px rgba(37,99,235,0.15)\" },\n];\n\nexport const ASPECT_RATIOS: Array<{ label: string; value: string }> = [\n { label: \"Free\", value: \"\" },\n { label: \"Square 1:1\", value: \"1/1\" },\n { label: \"Photo 4:3\", value: \"4/3\" },\n { label: \"Wide 16:9\", value: \"16/9\" },\n { label: \"Ultra 21:9\", value: \"21/9\" },\n { label: \"Portrait 3:4\", value: \"3/4\" },\n];\n\nexport const ENTRANCES: Array<{ label: string; value: Entrance }> = [\n { label: \"None\", value: \"none\" },\n { label: \"Fade in\", value: \"fade\" },\n { label: \"Rise up\", value: \"up\" },\n { label: \"Drop down\", value: \"down\" },\n { label: \"Slide from left\", value: \"left\" },\n { label: \"Slide from right\", value: \"right\" },\n { label: \"Zoom in\", value: \"zoom\" },\n];\n\nexport const DRAG_MIME = \"application/pagiera-element-type\";\n/** Set when dragging an element that already exists on the canvas. */\nexport const MOVE_MIME = \"application/pagiera-element-id\";\n", "import {\n type BreakpointDefinition,\n DEFAULT_BREAKPOINTS,\n} from \"./types\";\n\n/**\n * The breakpoint layout of a page: which artboards exist and which one holds\n * the shared values.\n *\n * Styles live in two places \u2014 `element.base` carries the base breakpoint's\n * values, and `element.overrides[id]` carries the deltas for every other one.\n * Which overrides apply to a given artboard depends entirely on where it sits\n * relative to the base, so that ordering is computed here rather than being\n * hard-coded to desktop \u2192 tablet \u2192 mobile.\n */\nexport type Cascade = {\n breakpoints: BreakpointDefinition[];\n /** Whose values live in `element.base`. */\n baseId: string;\n};\n\nexport const DEFAULT_CASCADE: Cascade = {\n breakpoints: DEFAULT_BREAKPOINTS,\n baseId: \"desktop\",\n};\n\n/** Builds a cascade from whatever the page has stored, filling the gaps. */\nexport function cascadeOf(\n breakpoints: BreakpointDefinition[] | undefined,\n baseId: string | undefined,\n): Cascade {\n const list = breakpoints?.length ? breakpoints : DEFAULT_BREAKPOINTS;\n const base = list.find((item) => item.id === baseId) ?? widest(list);\n return { breakpoints: list, baseId: base.id };\n}\n\nfunction widest(list: BreakpointDefinition[]) {\n return list.reduce((a, b) => (b.width > a.width ? b : a), list[0]);\n}\n\nexport function baseOf(cascade: Cascade): BreakpointDefinition {\n return (\n cascade.breakpoints.find((item) => item.id === cascade.baseId) ??\n widest(cascade.breakpoints)\n );\n}\n\n/**\n * The overrides to apply, in order, to reach `targetId` from the base.\n *\n * Narrower artboards inherit downward from the base and wider ones inherit\n * upward, so a value set on the base reaches both directions until something\n * closer to the target overrides it.\n */\nexport function overrideChain(cascade: Cascade, targetId: string): string[] {\n const base = baseOf(cascade);\n if (targetId === base.id) return [];\n\n const target = cascade.breakpoints.find((item) => item.id === targetId);\n if (!target) return [];\n\n const goingNarrower = target.width < base.width;\n\n const between = cascade.breakpoints.filter((item) => {\n if (item.id === base.id) return false;\n return goingNarrower\n ? item.width < base.width && item.width >= target.width\n : item.width > base.width && item.width <= target.width;\n });\n\n // Apply from the artboard nearest the base outward, so the one closest to\n // the target has the last word.\n between.sort((a, b) => (goingNarrower ? b.width - a.width : a.width - b.width));\n return between.map((item) => item.id);\n}\n\n/**\n * Media queries for the published page, in the order they must appear so that\n * later rules win. Narrower artboards become `max-width`, wider ones\n * `min-width`; the base itself needs no query.\n */\nexport function mediaPlan(\n cascade: Cascade,\n): Array<{ id: string; query: string }> {\n const base = baseOf(cascade);\n\n // An artboard governs from its own width up to just below the next wider\n // one \u2014 the same reading the canvas gives, where a 1000px window falls to\n // the nearest artboard at or below it.\n const narrower = cascade.breakpoints\n .filter((item) => item.id !== base.id && item.width < base.width)\n .sort((a, b) => b.width - a.width)\n .map((item) => {\n const ceiling = cascade.breakpoints\n .filter((other) => other.width > item.width)\n .reduce(\n (lowest, other) => Math.min(lowest, other.width),\n Number.POSITIVE_INFINITY,\n );\n return { id: item.id, query: `(max-width: ${ceiling - 1}px)` };\n });\n\n const wider = cascade.breakpoints\n .filter((item) => item.id !== base.id && item.width > base.width)\n .sort((a, b) => a.width - b.width)\n .map((item) => ({ id: item.id, query: `(min-width: ${item.width}px)` }));\n\n return [...narrower, ...wider];\n}\n\n/** Memoised chains \u2014 resolution runs per element, the chain does not. */\nconst chainCache = new WeakMap<Cascade, Map<string, string[]>>();\n\nexport function chainFor(cascade: Cascade, targetId: string): string[] {\n let byTarget = chainCache.get(cascade);\n if (!byTarget) {\n byTarget = new Map();\n chainCache.set(cascade, byTarget);\n }\n const cached = byTarget.get(targetId);\n if (cached) return cached;\n\n const chain = overrideChain(cascade, targetId);\n byTarget.set(targetId, chain);\n return chain;\n}\n", "import type { CSSProperties } from \"react\";\nimport { baseOf, type Cascade, chainFor, DEFAULT_CASCADE } from \"./cascade\";\nimport {\n type Align,\n type Breakpoint,\n type CanvasElement,\n type ElementStyle,\n type Justify,\n type RootStyle,\n type StyleKey,\n} from \"./types\";\n\n/**\n * Flattens the cascade for one breakpoint: the base values, then each override\n * between the base and this artboard, nearest-to-base first.\n */\nexport function resolveStyle(\n element: CanvasElement,\n breakpoint: Breakpoint,\n cascade: Cascade = DEFAULT_CASCADE,\n): ElementStyle {\n let style = element.base;\n for (const step of chainFor(cascade, breakpoint)) {\n const override = element.overrides?.[step];\n if (override) style = { ...style, ...override };\n }\n return style;\n}\n\n/**\n * Which breakpoint actually supplies the value shown for `key` \u2014 used to mark\n * a field in the inspector as inherited rather than set here.\n */\nexport function originOf(\n element: CanvasElement,\n breakpoint: Breakpoint,\n key: StyleKey,\n cascade: Cascade = DEFAULT_CASCADE,\n): Breakpoint {\n let origin: Breakpoint = baseOf(cascade).id;\n for (const step of chainFor(cascade, breakpoint)) {\n if (element.overrides?.[step]?.[key] !== undefined) origin = step;\n }\n return origin;\n}\n\nexport function hasOverride(\n element: CanvasElement,\n breakpoint: Breakpoint,\n key: StyleKey,\n cascade: Cascade = DEFAULT_CASCADE,\n) {\n return (\n breakpoint !== baseOf(cascade).id &&\n element.overrides?.[breakpoint]?.[key] !== undefined\n );\n}\n\n/**\n * Writes style changes to the right layer: an edit on the base artboard\n * changes the shared values, anywhere else accumulates an override so the\n * other artboards keep theirs.\n */\nexport function applyStyle(\n element: CanvasElement,\n breakpoint: Breakpoint,\n patch: Partial<ElementStyle>,\n cascade: Cascade = DEFAULT_CASCADE,\n): CanvasElement {\n const baseId = baseOf(cascade).id;\n if (breakpoint === baseId) {\n const next = { ...element, base: { ...element.base, ...patch } };\n // The base owns `base`, so an override under its own id is dead weight\n // \u2014 usually left behind when the base moved. Clear it as we pass.\n if (next.overrides?.[baseId]) {\n const overrides = { ...next.overrides };\n delete overrides[baseId];\n next.overrides =\n Object.keys(overrides).length > 0 ? overrides : undefined;\n }\n return next;\n }\n return {\n ...element,\n overrides: {\n ...element.overrides,\n [breakpoint]: { ...element.overrides?.[breakpoint], ...patch },\n },\n };\n}\n\n/** Keeps a base-breakpoint edit local by snapshotting the affected values on\n * every other artboard before changing the shared desktop base. */\nexport function applyStyleIsolated(\n element: CanvasElement,\n breakpoint: Breakpoint,\n patch: Partial<ElementStyle>,\n breakpoints: readonly Breakpoint[],\n cascade: Cascade = DEFAULT_CASCADE,\n): CanvasElement {\n const keys = Object.keys(patch) as StyleKey[];\n const baseId = baseOf(cascade).id;\n const snapshots = new Map<Breakpoint, ElementStyle>();\n for (const target of breakpoints) {\n if (target !== breakpoint && target !== baseId) {\n snapshots.set(target, resolveStyle(element, target, cascade));\n }\n }\n const updated = applyStyle(element, breakpoint, patch, cascade);\n const overrides = { ...updated.overrides };\n for (const [target, effective] of snapshots) {\n const layer = { ...overrides[target] };\n for (const key of keys) layer[key] = effective[key] as never;\n overrides[target] = layer;\n }\n return { ...updated, overrides };\n}\n\n/** Drops overrides for `keys` at this breakpoint so they inherit again. */\nexport function clearOverrides(\n element: CanvasElement,\n breakpoint: Breakpoint,\n keys: StyleKey[],\n cascade: Cascade = DEFAULT_CASCADE,\n): CanvasElement {\n // The base artboard holds the shared values; there is nothing to clear.\n if (breakpoint === baseOf(cascade).id) return element;\n const current = element.overrides?.[breakpoint];\n if (!current) return element;\n\n const next = { ...current };\n for (const key of keys) delete next[key];\n\n const overrides = { ...element.overrides };\n if (Object.keys(next).length === 0) delete overrides[breakpoint];\n else overrides[breakpoint] = next;\n\n return { ...element, overrides };\n}\n\n/* ------------------------------------------------------------------ to CSS */\n\nconst JUSTIFY_MAP: Record<Justify, CSSProperties[\"justifyContent\"]> = {\n start: \"flex-start\",\n center: \"center\",\n end: \"flex-end\",\n between: \"space-between\",\n};\n\nconst ALIGN_MAP: Record<Align, CSSProperties[\"alignItems\"]> = {\n start: \"flex-start\",\n center: \"center\",\n end: \"flex-end\",\n stretch: \"stretch\",\n};\n\nexport type BoxContext = {\n /** How the parent arranges this element; drives positioning vs flex sizing. */\n parentLayout: \"absolute\" | \"stack\";\n parentDirection: \"row\" | \"column\";\n};\n\n/**\n * Turns a resolved style into inline CSS. Positioning depends on the parent:\n * inside an absolute parent the element is placed at x/y, inside a stack it is\n * a flex item whose sizing comes from widthMode/heightMode.\n */\nexport function styleToCss(\n style: ElementStyle,\n context: BoxContext,\n element?: Pick<CanvasElement, \"type\">,\n): CSSProperties {\n const css: CSSProperties = {\n boxSizing: \"border-box\",\n display: \"flex\",\n flexDirection: style.direction,\n gap: style.gap || undefined,\n justifyContent: JUSTIFY_MAP[style.justify],\n alignItems: ALIGN_MAP[style.align],\n flexWrap: style.wrap ? \"wrap\" : \"nowrap\",\n\n paddingTop: style.padT || undefined,\n paddingRight: style.padR || undefined,\n paddingBottom: style.padB || undefined,\n paddingLeft: style.padL || undefined,\n\n backgroundColor: style.bg || undefined,\n // A gradient and a photo can be layered; the gradient is painted first\n // so it reads as a scrim over the image.\n backgroundImage:\n [style.gradient, style.bgImage && `url(\"${style.bgImage}\")`]\n .filter(Boolean)\n .join(\", \") || undefined,\n backgroundSize: style.bgImage ? style.bgSize : undefined,\n backgroundPosition: style.bgImage ? style.bgPosition : undefined,\n backgroundRepeat: style.bgImage ? \"no-repeat\" : undefined,\n\n overflow: style.overflow === \"visible\" ? undefined : style.overflow,\n aspectRatio: style.aspectRatio || undefined,\n cursor: style.cursor === \"auto\" ? undefined : style.cursor,\n mixBlendMode: style.blendMode === \"normal\" ? undefined : style.blendMode,\n filter: style.blur ? `blur(${style.blur}px)` : undefined,\n backdropFilter: style.backdropBlur\n ? `blur(${style.backdropBlur}px)`\n : undefined,\n color: style.color,\n borderRadius: style.radius || undefined,\n opacity: style.opacity === 100 ? undefined : style.opacity / 100,\n borderWidth: style.borderW || undefined,\n borderColor: style.borderW ? style.borderC : undefined,\n borderStyle: style.borderW ? style.borderStyle : undefined,\n boxShadow: style.shadow || undefined,\n transform:\n [\n style.rotate ? `rotate(${style.rotate}deg)` : \"\",\n style.scale === 100 ? \"\" : `scale(${style.scale / 100})`,\n ]\n .filter(Boolean)\n .join(\" \") || undefined,\n\n fontFamily: style.fontFamily === \"inherit\" ? undefined : style.fontFamily,\n fontSize: style.fontSize,\n fontWeight: style.fontWeight,\n lineHeight: style.lineHeight,\n letterSpacing: style.letterSpacing || undefined,\n textAlign: style.textAlign,\n textTransform: style.textTransform,\n };\n\n // A Grid ignores the flex axis and lays its children out in columns.\n if (element?.type === \"Grid\" && style.layout === \"stack\") {\n css.display = \"grid\";\n css.gridTemplateColumns = `repeat(${Math.max(1, style.columns)}, minmax(0, 1fr))`;\n css.alignItems = ALIGN_MAP[style.align];\n }\n\n // An absolute container is still a positioning context for its children.\n if (style.layout === \"absolute\") {\n css.display = \"block\";\n }\n\n if (context.parentLayout === \"absolute\") {\n css.position = \"absolute\";\n css.left = style.x;\n css.top = style.y;\n css.width = style.widthMode === \"fixed\" ? style.w : \"max-content\";\n css.height = style.heightMode === \"fixed\" ? style.h : \"max-content\";\n if (style.widthMode === \"fill\") css.width = \"100%\";\n if (style.heightMode === \"fill\") css.height = \"100%\";\n\n const transforms: string[] = [];\n if (style.constraintX === \"center\") {\n css.left = `calc(50% + ${style.x}px)`;\n transforms.push(\"translateX(-50%)\");\n } else if (style.constraintX === \"end\") {\n css.left = undefined;\n css.right = style.x;\n } else if (style.constraintX === \"stretch\") {\n css.left = style.x;\n css.right = style.x;\n css.width = \"auto\";\n }\n\n if (style.constraintY === \"center\") {\n css.top = `calc(50% + ${style.y}px)`;\n transforms.push(\"translateY(-50%)\");\n } else if (style.constraintY === \"end\") {\n css.top = undefined;\n css.bottom = style.y;\n } else if (style.constraintY === \"stretch\") {\n css.top = style.y;\n css.bottom = style.y;\n css.height = \"auto\";\n }\n if (css.transform) transforms.push(String(css.transform));\n css.transform = transforms.join(\" \") || undefined;\n return css;\n }\n\n // Sticky only means anything inside a flowing parent; in an absolute one\n // the element is already taken out of the flow above.\n css.position = style.position === \"sticky\" ? \"sticky\" : \"relative\";\n if (style.position === \"sticky\") css.top = style.stickyOffset;\n\n const mainAxisIsWidth = context.parentDirection === \"row\";\n\n applySize(css, \"width\", style.widthMode, style.w, mainAxisIsWidth);\n applySize(css, \"height\", style.heightMode, style.h, !mainAxisIsWidth);\n\n return css;\n}\n\nfunction applySize(\n css: CSSProperties,\n axis: \"width\" | \"height\",\n mode: ElementStyle[\"widthMode\"],\n value: number,\n isMainAxis: boolean,\n) {\n if (mode === \"fixed\") {\n css[axis] = value;\n if (isMainAxis) css.flexShrink = 0;\n // An explicit size already wins over the parent's `stretch`.\n return;\n }\n\n if (mode === \"auto\") {\n css[axis] = \"auto\";\n if (isMainAxis) css.flexGrow = 0;\n // Without this the parent's `align-items: stretch` would blow an\n // auto-sized element out to the full cross axis instead of hugging.\n else css.alignSelf = \"flex-start\";\n return;\n }\n\n // fill\n css[axis] = \"auto\";\n if (isMainAxis) {\n css.flexGrow = 1;\n css.flexBasis = 0;\n } else {\n css.alignSelf = \"stretch\";\n }\n}\n\n/**\n * A Section is a full-bleed band: its background reaches both edges of the\n * viewport while the content inside stays within the page's content width.\n * Capping the Section itself instead would box the background too, which is\n * why the published page used to sit in a container the canvas never showed.\n *\n * Returns the outer shell and the centred inner box; the inner one keeps the\n * flex/grid layout so children lay out exactly as before.\n */\nexport function splitBand(\n css: CSSProperties,\n contentWidth: number,\n): { shell: CSSProperties; inner: CSSProperties } {\n const inner: CSSProperties = {\n boxSizing: \"border-box\",\n display: css.display,\n flexDirection: css.flexDirection,\n gap: css.gap,\n justifyContent: css.justifyContent,\n alignItems: css.alignItems,\n flexWrap: css.flexWrap,\n gridTemplateColumns: css.gridTemplateColumns,\n width: \"100%\",\n maxWidth: contentWidth,\n marginLeft: \"auto\",\n marginRight: \"auto\",\n };\n\n const shell: CSSProperties = { ...css };\n // The inner box owns the layout now.\n shell.flexDirection = undefined;\n shell.gap = undefined;\n shell.justifyContent = undefined;\n shell.alignItems = undefined;\n shell.flexWrap = undefined;\n shell.gridTemplateColumns = undefined;\n shell.display = \"block\";\n\n return { shell, inner };\n}\n\n/** Whether this element should render as a full-bleed band. */\nexport function isBand(\n type: string,\n style: ElementStyle,\n root: Pick<RootStyle, \"fullWidth\">,\n) {\n return type === \"Section\" && style.layout === \"stack\" && !root.fullWidth;\n}\n\nexport function rootStyleToCss(root: RootStyle): CSSProperties {\n return {\n boxSizing: \"border-box\",\n display: root.layout === \"stack\" ? \"flex\" : \"block\",\n flexDirection: root.direction,\n gap: root.gap || undefined,\n alignItems: ALIGN_MAP[root.align],\n paddingTop: root.padT || undefined,\n paddingRight: root.padR || undefined,\n paddingBottom: root.padB || undefined,\n paddingLeft: root.padL || undefined,\n backgroundColor: root.bg,\n fontFamily: root.fontFamily === \"inherit\" ? undefined : root.fontFamily,\n position: \"relative\",\n minHeight: \"100%\",\n width: \"100%\",\n };\n}\n", "import { applyStyle, resolveStyle } from \"./style\";\nimport type { Breakpoint, CanvasElement } from \"./types\";\n\nexport type AlignAction =\n | \"left\"\n | \"center-x\"\n | \"right\"\n | \"top\"\n | \"center-y\"\n | \"bottom\";\n\nexport type DistributeAction = \"horizontal\" | \"vertical\";\n\ntype Box = { id: string; x: number; y: number; w: number; h: number };\n\nfunction boxesOf(\n elements: CanvasElement[],\n ids: string[],\n breakpoint: Breakpoint,\n): Box[] {\n return elements\n .filter((el) => ids.includes(el.id))\n .map((el) => {\n const style = resolveStyle(el, breakpoint);\n return { id: el.id, x: style.x, y: style.y, w: style.w, h: style.h };\n });\n}\n\n/**\n * Aligns the selection against its own bounding box. Only meaningful for\n * elements positioned by x/y, so callers should restrict it to siblings inside\n * an absolute parent.\n */\nexport function alignElements(\n elements: CanvasElement[],\n ids: string[],\n action: AlignAction,\n breakpoint: Breakpoint,\n): CanvasElement[] {\n const boxes = boxesOf(elements, ids, breakpoint);\n if (boxes.length < 2) return elements;\n\n const minX = Math.min(...boxes.map((b) => b.x));\n const maxX = Math.max(...boxes.map((b) => b.x + b.w));\n const minY = Math.min(...boxes.map((b) => b.y));\n const maxY = Math.max(...boxes.map((b) => b.y + b.h));\n const midX = (minX + maxX) / 2;\n const midY = (minY + maxY) / 2;\n\n const patchFor = (box: Box) => {\n switch (action) {\n case \"left\":\n return { x: minX };\n case \"right\":\n return { x: maxX - box.w };\n case \"center-x\":\n return { x: midX - box.w / 2 };\n case \"top\":\n return { y: minY };\n case \"bottom\":\n return { y: maxY - box.h };\n case \"center-y\":\n return { y: midY - box.h / 2 };\n }\n };\n\n const byId = new Map(boxes.map((b) => [b.id, b]));\n return elements.map((el) => {\n const box = byId.get(el.id);\n return box ? applyStyle(el, breakpoint, patchFor(box)) : el;\n });\n}\n\n/** Evens out the gaps between the outermost two elements of the selection. */\nexport function distributeElements(\n elements: CanvasElement[],\n ids: string[],\n action: DistributeAction,\n breakpoint: Breakpoint,\n): CanvasElement[] {\n const boxes = boxesOf(elements, ids, breakpoint);\n if (boxes.length < 3) return elements;\n\n const horizontal = action === \"horizontal\";\n const sorted = [...boxes].sort((a, b) =>\n horizontal ? a.x - b.x : a.y - b.y,\n );\n\n const first = sorted[0];\n const last = sorted[sorted.length - 1];\n const span = horizontal\n ? last.x + last.w - first.x\n : last.y + last.h - first.y;\n const used = sorted.reduce((sum, b) => sum + (horizontal ? b.w : b.h), 0);\n const gap = (span - used) / (sorted.length - 1);\n\n const patches = new Map<string, { x?: number; y?: number }>();\n let cursor = horizontal ? first.x : first.y;\n for (const box of sorted) {\n patches.set(box.id, horizontal ? { x: cursor } : { y: cursor });\n cursor += (horizontal ? box.w : box.h) + gap;\n }\n\n return elements.map((el) => {\n const patch = patches.get(el.id);\n return patch ? applyStyle(el, breakpoint, patch) : el;\n });\n}\n", "import {\n type DataSource,\n type HttpMethod,\n type RequestContext,\n type RequestPair,\n sendsBody,\n} from \"@/lib/editor/types\";\n\n/**\n * Fetching an author-supplied URL from our server is a server-side request\n * forgery vector: without checks it can reach cloud metadata endpoints, admin\n * services on localhost, or anything else inside the network perimeter. Every\n * hop is validated against this list, and redirects are followed by hand so a\n * public URL cannot bounce into private space.\n */\nconst BLOCKED_HOSTS = new Set([\n \"localhost\",\n \"127.0.0.1\",\n \"0.0.0.0\",\n \"::1\",\n \"[::1]\",\n \"metadata.google.internal\",\n \"metadata.goog\",\n]);\n\nconst PRIVATE_IPV4 =\n /^(10\\.|127\\.|0\\.|169\\.254\\.|192\\.168\\.|172\\.(1[6-9]|2\\d|3[01])\\.)/;\n\n/** Hostnames that only resolve inside a private network. */\nconst PRIVATE_SUFFIXES = [\".local\", \".internal\", \".localdomain\", \".home.arpa\"];\n\nexport const MAX_ROWS = 200;\nconst MAX_BYTES = 2_000_000;\nconst TIMEOUT_MS = 8000;\nconst MAX_REDIRECTS = 3;\n\nexport class DataSourceError extends Error {\n constructor(message: string, public readonly status?: number) {\n super(message);\n this.name = \"DataSourceError\";\n }\n}\n\nexport function assertFetchableUrl(raw: string): URL {\n let url: URL;\n try {\n url = new URL(raw);\n } catch {\n throw new DataSourceError(\"That is not a valid URL.\");\n }\n\n if (url.protocol !== \"https:\" && url.protocol !== \"http:\") {\n throw new DataSourceError(\"Only http and https URLs can be requested.\");\n }\n\n const host = url.hostname.toLowerCase();\n if (BLOCKED_HOSTS.has(host) || PRIVATE_IPV4.test(host)) {\n throw new DataSourceError(`Requests to ${host} are not allowed.`);\n }\n if (PRIVATE_SUFFIXES.some((suffix) => host.endsWith(suffix))) {\n throw new DataSourceError(`Requests to ${host} are not allowed.`);\n }\n // Bracketed IPv6 literals: anything link-local or unique-local.\n if (host.startsWith(\"[\") && /^\\[(fe80|fc|fd)/i.test(host)) {\n throw new DataSourceError(\"Requests to private addresses are not allowed.\");\n }\n\n return url;\n}\n\n/**\n * Walks a dotted path such as `data.items` or `results.0.tags`. An empty path\n * returns the payload itself, which is what a bare JSON array needs.\n */\nexport function selectPath(payload: unknown, path: string): unknown {\n const steps = path.split(\".\").map((s) => s.trim()).filter(Boolean);\n let cursor: unknown = payload;\n for (const step of steps) {\n if (cursor === null || typeof cursor !== \"object\") return undefined;\n cursor = (cursor as Record<string, unknown>)[step];\n }\n return cursor;\n}\n\n/** Reads a body with a hard cap so a huge response cannot exhaust memory. */\nasync function readCapped(response: Response): Promise<string> {\n const reader = response.body?.getReader();\n if (!reader) return \"\";\n\n const chunks: Uint8Array[] = [];\n let total = 0;\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n total += value.byteLength;\n if (total > MAX_BYTES) {\n await reader.cancel();\n throw new DataSourceError(\"That response is too large (over 2 MB).\");\n }\n chunks.push(value);\n }\n return new TextDecoder().decode(\n chunks.reduce<Uint8Array>((acc, chunk) => {\n const merged = new Uint8Array(acc.length + chunk.length);\n merged.set(acc);\n merged.set(chunk, acc.length);\n return merged;\n }, new Uint8Array()),\n );\n}\n\nexport type SourceResult = { rows: Array<Record<string, unknown>>; keys: string[] };\n\n/**\n * Requests a source and normalizes it to rows. A root object becomes one row\n * for Request; an array stays multiple rows for Repeat.\n */\nexport type LoadOptions = {\n /**\n * Seconds to cache the response for. `false` bypasses the cache \u2014 only for\n * the editor's Test button; on a rendered route it would force an\n * otherwise-static page to become dynamic on every request.\n */\n revalidate?: number | false;\n /** Supplies `{{query.\u2026}}` / `{{page.\u2026}}` values for this request. */\n context?: RequestContext;\n};\n\nexport const DEFAULT_REVALIDATE = 60;\n\nexport async function loadSource(\n source: DataSource,\n { revalidate = DEFAULT_REVALIDATE, context = EMPTY_CONTEXT }: LoadOptions = {},\n): Promise<SourceResult> {\n const request = buildRequest(source, context);\n let target = request.url;\n\n let response: Response | undefined;\n for (let hop = 0; hop <= MAX_REDIRECTS; hop++) {\n response = await fetch(target, {\n // Redirects are followed by hand so each hop is validated too.\n redirect: \"manual\",\n method: request.method,\n headers: request.headers,\n body: request.body,\n signal: AbortSignal.timeout(TIMEOUT_MS),\n // Only GET responses are cacheable; anything with side effects is\n // fetched fresh every time.\n ...(revalidate === false || request.method !== \"GET\"\n ? { cache: \"no-store\" as const }\n : { next: { revalidate } }),\n });\n\n if (response.status < 300 || response.status >= 400) break;\n\n const location = response.headers.get(\"location\");\n if (!location) break;\n target = assertFetchableUrl(new URL(location, target).toString());\n response = undefined;\n }\n\n if (!response) throw new DataSourceError(\"Too many redirects.\");\n if (!response.ok) {\n throw new DataSourceError(`The API replied ${response.status}.`, response.status);\n }\n\n const text = await readCapped(response);\n let payload: unknown;\n try {\n payload = JSON.parse(text);\n } catch {\n throw new DataSourceError(\"The response was not JSON.\");\n }\n\n const selected = selectPath(payload, source.path);\n const selectedRows = Array.isArray(selected)\n ? selected\n : selected !== null && typeof selected === \"object\"\n ? [selected]\n : undefined;\n if (!selectedRows) {\n throw new DataSourceError(\n source.path\n ? `\"${source.path}\" is not a list in that response.`\n : \"That response is neither an object nor a list.\",\n );\n }\n\n const rows = selectedRows\n .slice(0, MAX_ROWS)\n .map((row) =>\n row !== null && typeof row === \"object\" && !Array.isArray(row)\n ? (row as Record<string, unknown>)\n : { value: row },\n );\n\n // Union of the keys across the sample, so binding menus list everything.\n const keys = [...new Set(rows.flatMap((row) => Object.keys(row)))].sort();\n return { rows, keys };\n}\n\n/** Reads one binding path off a row and flattens it to something renderable. */\nexport function readBinding(row: Record<string, unknown>, path: string): string {\n const value = selectPath(row, path);\n if (value === null || value === undefined) return \"\";\n if (typeof value === \"object\") return \"\";\n return String(value);\n}\n\n/* ------------------------------------------------------------------ tokens */\n\n/**\n * Resolves `{{query.id}}`, `{{params.slug}}` and `{{page.slug}}`.\n *\n * Only these two namespaces exist: an unknown token becomes an empty string\n * rather than being left in the URL, so a typo cannot send a literal `{{\u2026}}`\n * to the API or accidentally expose something else.\n */\nexport function resolveTokens(value: string, context: RequestContext): string {\n return value.replace(/\\{\\{\\s*([a-zA-Z0-9_.]+)\\s*\\}\\}/g, (_, token: string) => {\n const [namespace, ...rest] = token.split(\".\");\n const key = rest.join(\".\");\n if (namespace === \"query\") return context.query[key] ?? \"\";\n if (namespace === \"params\") return context.params[key] ?? \"\";\n if (namespace === \"page\" && key === \"slug\") return context.page.slug;\n return \"\";\n });\n}\n\n/** Header names and values must not be able to inject extra headers. */\nfunction safeHeader(pair: RequestPair, context: RequestContext) {\n const name = pair.key.trim();\n if (!/^[A-Za-z0-9!#$%&'*+.^_`|~-]+$/.test(name)) return null;\n // Strip anything that could terminate the header line.\n const value = resolveTokens(pair.value, context).replace(/[\\r\\n\\0]/g, \"\").trim();\n return value ? ([name, value] as const) : null;\n}\n\n/**\n * Builds the final URL: tokens resolved, params appended and percent-encoded\n * by `URLSearchParams` so a value can never break out into the query grammar.\n */\nexport function buildRequest(source: DataSource, context: RequestContext) {\n const url = assertFetchableUrl(resolveTokens(source.url, context));\n\n for (const pair of source.params ?? []) {\n const key = pair.key.trim();\n if (!key) continue;\n const value = resolveTokens(pair.value, context);\n // An empty optional filter is dropped rather than sent as `key=`.\n if (value === \"\") continue;\n url.searchParams.set(key, value);\n }\n\n const method: HttpMethod = source.method ?? \"GET\";\n\n const headers: Record<string, string> = {\n accept: \"application/json,text/plain;q=0.9,*/*;q=0.8\",\n };\n\n let body: string | undefined;\n if (sendsBody(method) && source.body?.trim()) {\n body = resolveTokens(source.body, context);\n headers[\"content-type\"] = \"application/json\";\n }\n\n // Author headers last, so they can override the defaults above.\n for (const pair of source.headers ?? []) {\n const safe = safeHeader(pair, context);\n if (safe) headers[safe[0]] = safe[1];\n }\n\n // Re-check after tokens: a token could have rewritten the host.\n return { url: assertFetchableUrl(url.toString()), headers, method, body };\n}\n\nexport const EMPTY_CONTEXT: RequestContext = { query: {}, params: {}, page: { slug: \"\" } };\n", "import { readBinding } from \"@/lib/data/source\";\nimport type { CanvasElement } from \"@/lib/editor/types\";\n\n/** One object of a data source, as seen inside Request or Repeat. */\nexport type Row = Record<string, unknown>;\n\n/** Resolved data for every source on the page, keyed by source id. */\nexport type PageData = Record<string, Row[]>;\n\n/**\n * Applies a row to an element. A bound Image or Video takes its `src` from the\n * field; anything else takes its text. Returns the element unchanged when\n * there is nothing to bind, so callers can use the result directly.\n */\nexport function bindElement(\n element: CanvasElement,\n row: Row | undefined,\n): CanvasElement {\n if (!row || !element.binding) return element;\n\n const value = readBinding(row, element.binding);\n if (element.type === \"Image\" || element.type === \"Video\") {\n // An empty result would blank the element; keep the authored fallback.\n return value ? { ...element, src: value } : element;\n }\n return { ...element, content: value };\n}\n\n/**\n * The rows a Repeat should render. An unconfigured or failed source yields a\n * single placeholder row so the template still shows up in the editor rather\n * than collapsing to nothing.\n */\nexport function rowsFor(\n element: CanvasElement,\n data: PageData,\n placeholderWhenEmpty: boolean,\n): Array<Row | undefined> {\n const rows = element.sourceId ? data[element.sourceId] : undefined;\n if (rows && rows.length > 0) return rows;\n return placeholderWhenEmpty ? [undefined] : [];\n}\n", "import { type Cascade, DEFAULT_CASCADE } from \"./cascade\";\nimport { applyStyle, resolveStyle } from \"./style\";\nimport {\n type Breakpoint,\n type CanvasElement,\n ELEMENT_DEFAULTS,\n type ElementType,\n isContainer,\n type LayoutMode,\n makeStyle,\n} from \"./types\";\n\nexport function indexById(elements: CanvasElement[]) {\n return new Map(elements.map((el) => [el.id, el]));\n}\n\nexport function childrenOf(elements: CanvasElement[], parentId?: string) {\n return elements\n .filter((el) => (el.parentId ?? undefined) === parentId)\n .sort((a, b) => a.z - b.z);\n}\n\n/** The element plus every descendant. */\nexport function subtreeIds(elements: CanvasElement[], rootId: string) {\n const ids = new Set<string>([rootId]);\n let grew = true;\n while (grew) {\n grew = false;\n for (const el of elements) {\n if (el.parentId && ids.has(el.parentId) && !ids.has(el.id)) {\n ids.add(el.id);\n grew = true;\n }\n }\n }\n return ids;\n}\n\nexport function removeSubtree(elements: CanvasElement[], rootId: string) {\n const doomed = subtreeIds(elements, rootId);\n return elements.filter((el) => !doomed.has(el.id));\n}\n\nexport function nextZ(elements: CanvasElement[], parentId?: string) {\n const siblings = childrenOf(elements, parentId);\n return siblings.length ? Math.max(...siblings.map((s) => s.z)) + 1 : 0;\n}\n\nexport function newId() {\n // `crypto.randomUUID` needs a secure context, which localhost and https\n // both provide; the fallback covers anything else.\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) {\n return crypto.randomUUID();\n }\n return `el-${Date.now().toString(36)}-${Math.floor(Math.random() * 1e9).toString(36)}`;\n}\n\nexport function createElement(\n type: ElementType,\n position: { x: number; y: number; z: number; parentId?: string },\n): CanvasElement {\n const defaults = ELEMENT_DEFAULTS[type];\n return {\n id: newId(),\n type,\n z: position.z,\n parentId: position.parentId,\n ...defaults.props,\n base: makeStyle({ ...defaults.style, x: position.x, y: position.y }),\n };\n}\n\n/**\n * Copies an element and everything under it, giving each node a fresh id while\n * keeping the parent/child wiring intact.\n */\nexport function cloneSubtree(\n elements: CanvasElement[],\n rootId: string,\n offset = { x: 16, y: 16 },\n): { elements: CanvasElement[]; rootId: string } | null {\n const byId = indexById(elements);\n const root = byId.get(rootId);\n if (!root) return null;\n\n const ids = subtreeIds(elements, rootId);\n const idMap = new Map<string, string>();\n for (const id of ids) idMap.set(id, newId());\n const remap = (id: string) => idMap.get(id) ?? id;\n\n const copies = elements\n .filter((el) => ids.has(el.id))\n .map<CanvasElement>((el) => ({\n ...el,\n id: remap(el.id),\n parentId: el.parentId ? idMap.get(el.parentId) : undefined,\n // Only the root shifts; descendants stay positioned relative to it.\n base:\n el.id === rootId\n ? { ...el.base, x: el.base.x + offset.x, y: el.base.y + offset.y }\n : el.base,\n }));\n\n const newRootId = remap(rootId);\n const topZ = nextZ(elements, root.parentId);\n return {\n elements: copies.map((el) =>\n el.id === newRootId ? { ...el, z: topZ } : el,\n ),\n rootId: newRootId,\n };\n}\n\n/** Absolute position on the canvas, accumulating every ancestor's offset. */\nexport function absolutePosition(\n byId: Map<string, CanvasElement>,\n element: CanvasElement,\n breakpoint: Breakpoint,\n cascade: Cascade = DEFAULT_CASCADE,\n) {\n const own = resolveStyle(element, breakpoint, cascade);\n let x = own.x;\n let y = own.y;\n let parent = element.parentId ? byId.get(element.parentId) : undefined;\n const guard = new Set<string>([element.id]);\n\n while (parent && !guard.has(parent.id)) {\n guard.add(parent.id);\n const style = resolveStyle(parent, breakpoint, cascade);\n x += style.x;\n y += style.y;\n parent = parent.parentId ? byId.get(parent.parentId) : undefined;\n }\n return { x, y };\n}\n\nexport function isAncestor(\n byId: Map<string, CanvasElement>,\n maybeAncestorId: string,\n elementId: string,\n) {\n let cursor = byId.get(elementId);\n const guard = new Set<string>();\n while (cursor?.parentId) {\n if (guard.has(cursor.id)) return false;\n guard.add(cursor.id);\n if (cursor.parentId === maybeAncestorId) return true;\n cursor = byId.get(cursor.parentId);\n }\n return false;\n}\n\nexport function displayName(element: CanvasElement) {\n if (element.name?.trim()) return element.name.trim();\n const content = element.content?.trim();\n if (content && !isContainer(element.type)) {\n return content.length > 24 ? `${content.slice(0, 24)}\u2026` : content;\n }\n return element.type;\n}\n\n/** Moves an element one step up or down among its siblings. */\nexport function reorder(\n elements: CanvasElement[],\n id: string,\n direction: \"up\" | \"down\",\n): CanvasElement[] {\n const target = elements.find((el) => el.id === id);\n if (!target) return elements;\n\n const siblings = childrenOf(elements, target.parentId);\n const index = siblings.findIndex((s) => s.id === id);\n const nextIndex = direction === \"up\" ? index + 1 : index - 1;\n if (!siblings[nextIndex]) return elements;\n\n // Re-index the whole sibling list so repeated swaps can't collide on ties.\n const ordered = [...siblings];\n ordered[index] = siblings[nextIndex];\n ordered[nextIndex] = target;\n const zById = new Map(ordered.map((el, i) => [el.id, i]));\n\n return elements.map((el) => {\n const z = zById.get(el.id);\n return z === undefined ? el : { ...el, z };\n });\n}\n\n/**\n * Inserts a Container between an element and its parent, sized to the element\n * and taking over its slot, so a loose element can be grouped in one step.\n */\nexport function wrapInContainer(\n elements: CanvasElement[],\n id: string,\n breakpoint: Breakpoint,\n): { elements: CanvasElement[]; wrapperId: string } | null {\n const target = elements.find((el) => el.id === id);\n if (!target) return null;\n\n const style = resolveStyle(target, breakpoint);\n const wrapper = createElement(\"Container\", {\n x: style.x,\n y: style.y,\n z: target.z,\n parentId: target.parentId,\n });\n wrapper.base = {\n ...wrapper.base,\n w: style.w,\n h: style.h,\n widthMode: style.widthMode,\n heightMode: \"auto\",\n padT: 0,\n padR: 0,\n padB: 0,\n padL: 0,\n borderW: 0,\n radius: 0,\n };\n\n const child = applyStyle({ ...target, parentId: wrapper.id, z: 0 }, breakpoint, {\n x: 0,\n y: 0,\n });\n\n return {\n elements: [...elements.map((el) => (el.id === id ? child : el)), wrapper],\n wrapperId: wrapper.id,\n };\n}\n\n/* -------------------------------------------------------------- reparenting */\n\n/**\n * Moves an element under a new parent, refusing the moves that would corrupt\n * the tree (into itself, into a descendant, or into a leaf).\n */\nexport function reparent(\n elements: CanvasElement[],\n id: string,\n newParentId: string | undefined,\n breakpoint: Breakpoint,\n /** Insert before this sibling; appended last when omitted. */\n beforeSiblingId?: string,\n): CanvasElement[] {\n const byId = indexById(elements);\n const element = byId.get(id);\n if (!element) return elements;\n if (newParentId === id) return elements;\n\n if (newParentId) {\n const parent = byId.get(newParentId);\n if (!parent || !isContainer(parent.type)) return elements;\n if (subtreeIds(elements, id).has(newParentId)) return elements;\n }\n\n // Keep the element where it looks like it is: convert its absolute position\n // into the new parent's coordinate space.\n const before = absolutePosition(byId, element, breakpoint);\n const newParent = newParentId ? byId.get(newParentId) : undefined;\n const parentOrigin = newParent\n ? absolutePosition(byId, newParent, breakpoint)\n : { x: 0, y: 0 };\n\n const moved = applyStyle(\n { ...element, parentId: newParentId },\n breakpoint,\n { x: before.x - parentOrigin.x, y: before.y - parentOrigin.y },\n );\n\n const rest = elements.map((el) => (el.id === id ? moved : el));\n return resequence(rest, newParentId, id, beforeSiblingId);\n}\n\n/** Rewrites z for one parent's children so the order is dense and explicit. */\nfunction resequence(\n elements: CanvasElement[],\n parentId: string | undefined,\n movedId: string,\n beforeSiblingId?: string,\n): CanvasElement[] {\n const siblings = childrenOf(elements, parentId).filter(\n (el) => el.id !== movedId,\n );\n const moved = elements.find((el) => el.id === movedId);\n if (!moved) return elements;\n\n const at = beforeSiblingId\n ? siblings.findIndex((s) => s.id === beforeSiblingId)\n : -1;\n const ordered =\n at === -1\n ? [...siblings, moved]\n : [...siblings.slice(0, at), moved, ...siblings.slice(at)];\n\n const zById = new Map(ordered.map((el, i) => [el.id, i]));\n return elements.map((el) => {\n const z = zById.get(el.id);\n return z === undefined ? el : { ...el, z };\n });\n}\n\n/**\n * The deepest container under a point that can accept `draggedId`, or\n * undefined for the page root.\n */\nexport function containerAt(\n elements: CanvasElement[],\n byId: Map<string, CanvasElement>,\n point: { x: number; y: number },\n breakpoint: Breakpoint,\n draggedId?: string,\n): string | undefined {\n const excluded = draggedId ? subtreeIds(elements, draggedId) : new Set<string>();\n\n const hits = elements\n .filter((el) => isContainer(el.type) && !excluded.has(el.id))\n .filter((el) => !resolveStyle(el, breakpoint).hidden)\n .filter((el) => {\n const style = resolveStyle(el, breakpoint);\n const origin = absolutePosition(byId, el, breakpoint);\n return (\n point.x >= origin.x &&\n point.x <= origin.x + style.w &&\n point.y >= origin.y &&\n point.y <= origin.y + style.h\n );\n });\n\n if (hits.length === 0) return undefined;\n\n // Prefer the most deeply nested hit, then the one painted on top.\n return hits.sort((a, b) => depthOf(byId, b) - depthOf(byId, a) || b.z - a.z)[0]\n .id;\n}\n\nfunction depthOf(byId: Map<string, CanvasElement>, element: CanvasElement) {\n let depth = 0;\n let cursor = element.parentId ? byId.get(element.parentId) : undefined;\n const guard = new Set<string>([element.id]);\n while (cursor && !guard.has(cursor.id)) {\n guard.add(cursor.id);\n depth += 1;\n cursor = cursor.parentId ? byId.get(cursor.parentId) : undefined;\n }\n return depth;\n}\n\n/**\n * An element parked beside the canvas is treated as a note: it stays visible\n * while designing but is left out of the published page.\n *\n * Only the horizontal axis counts. The canvas has a definite width \u2014 the\n * simulated viewport \u2014 while its height grows with the content, so \"below the\n * fold\" is a normal place for content to be, not a margin.\n */\nexport function isNote(\n element: CanvasElement,\n byId: Map<string, CanvasElement>,\n breakpoint: Breakpoint,\n frameWidth: number,\n /** How the page root arranges its own children. */\n rootLayout: LayoutMode = \"absolute\",\n cascade: Cascade = DEFAULT_CASCADE,\n): boolean {\n // Wherever a stack does the placing, x/y are not read at all \u2014 so a stale\n // coordinate must never be able to drop an element from the page.\n const parent = element.parentId ? byId.get(element.parentId) : undefined;\n const placedBy = parent\n ? resolveStyle(parent, breakpoint, cascade).layout\n : rootLayout;\n if (placedBy !== \"absolute\") return false;\n\n const style = resolveStyle(element, breakpoint, cascade);\n const { x } = absolutePosition(byId, element, breakpoint, cascade);\n const right = x + (style.widthMode === \"fixed\" ? style.w : 0);\n\n // Fully past either edge \u2014 a partial overlap is still part of the page.\n return right <= 0 || x >= frameWidth;\n}\n\n/** Ids of every note and everything inside one. */\nexport function noteIds(\n elements: CanvasElement[],\n byId: Map<string, CanvasElement>,\n breakpoint: Breakpoint,\n frameWidth: number,\n rootLayout: LayoutMode = \"absolute\",\n cascade: Cascade = DEFAULT_CASCADE,\n): Set<string> {\n const notes = new Set<string>();\n for (const element of elements) {\n if (isNote(element, byId, breakpoint, frameWidth, rootLayout, cascade)) {\n for (const id of subtreeIds(elements, element.id)) notes.add(id);\n }\n }\n return notes;\n}\n", "import type { CSSProperties } from \"react\";\nimport {\n isBand,\n resolveStyle,\n rootStyleToCss,\n splitBand,\n styleToCss,\n} from \"@/lib/editor/style\";\nimport {\n baseOf,\n type Cascade,\n cascadeOf,\n DEFAULT_CASCADE,\n mediaPlan,\n} from \"@/lib/editor/cascade\";\nimport { childrenOf } from \"@/lib/editor/tree\";\nimport {\n type Breakpoint,\n type CanvasElement,\n type RootStyle,\n} from \"@/lib/editor/types\";\n\n/** Properties that take a raw number rather than pixels. */\nconst UNITLESS = new Set([\n \"opacity\",\n \"zIndex\",\n \"flexGrow\",\n \"flexShrink\",\n \"flexBasis\",\n \"lineHeight\",\n \"order\",\n \"fontWeight\",\n \"columns\",\n]);\n\nfunction kebab(property: string) {\n return property.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);\n}\n\nexport function declarationsToCss(css: CSSProperties): string {\n return Object.entries(css)\n .filter(([, value]) => value !== undefined && value !== null && value !== \"\")\n .map(([property, value]) => {\n const rendered =\n typeof value === \"number\" && !UNITLESS.has(property)\n ? `${value}px`\n : String(value);\n return `${kebab(property)}:${rendered}`;\n })\n .join(\";\");\n}\n\n/** A CSS-identifier-safe class for one element. */\nexport function classFor(id: string) {\n return `pg-${id.replace(/[^a-zA-Z0-9_-]/g, \"-\")}`;\n}\n\n/**\n * \"inherit\" means \"the page default\" \u2014 which on a published page is a neutral\n * system stack, not whatever the surrounding app happens to set.\n */\nexport const DEFAULT_PAGE_FONT = \"ui-sans-serif, system-ui, sans-serif\";\n\nexport function resolveFont(fontFamily: string) {\n return fontFamily === \"inherit\" || fontFamily === \"\"\n ? DEFAULT_PAGE_FONT\n : fontFamily;\n}\n\n/**\n * Breakpoints are emitted as real media queries so a published page responds\n * to the viewport rather than to whatever the editor was previewing.\n */\n/**\n * The rules for one element. A full-bleed band produces two: the shell that\n * spans the viewport and the inner box that holds the content width.\n */\nfunction rulesFor(\n element: CanvasElement,\n byId: Map<string, CanvasElement>,\n breakpoint: Breakpoint,\n rootStyle: RootStyle,\n cascade: Cascade,\n): Array<[suffix: string, declarations: string]> {\n const parent = element.parentId ? byId.get(element.parentId) : undefined;\n const parentStyle = parent ? resolveStyle(parent, breakpoint, cascade) : undefined;\n const style = resolveStyle(element, breakpoint, cascade);\n\n const css = styleToCss(\n style,\n {\n parentLayout: parentStyle?.layout ?? \"stack\",\n parentDirection: parentStyle?.direction ?? \"column\",\n },\n element,\n );\n css.zIndex = element.z;\n if (style.hidden) css.display = \"none\";\n\n if (!isBand(element.type, style, rootStyle) || style.hidden) {\n return [[\"\", declarationsToCss(css)]];\n }\n\n const { shell, inner } = splitBand(css, rootStyle.maxWidth);\n return [\n [\"\", declarationsToCss(shell)],\n [\">.pg-inner\", declarationsToCss(inner)],\n ];\n}\n\n/**\n * Entrance keyframes animate `translate`/`scale` rather than `transform`, so\n * they compose with an element's own rotation or scale instead of clobbering\n * it. Emitted once, only when some element actually uses an entrance.\n */\nconst ENTRANCE_KEYFRAMES = `\n@keyframes pg-fade{from{opacity:0}to{opacity:1}}\n@keyframes pg-up{from{opacity:0;translate:0 28px}to{opacity:1;translate:none}}\n@keyframes pg-down{from{opacity:0;translate:0 -28px}to{opacity:1;translate:none}}\n@keyframes pg-left{from{opacity:0;translate:-32px 0}to{opacity:1;translate:none}}\n@keyframes pg-right{from{opacity:0;translate:32px 0}to{opacity:1;translate:none}}\n@keyframes pg-zoom{from{opacity:0;scale:.94}to{opacity:1;scale:none}}\n/* The hidden start state is applied only once the script is running, so a\n visitor without JavaScript still sees every element. */\n.pg-ready .pg-anim{opacity:0}\n/* Revealed elements are visible as a resting value, not only as the end of a\n keyframe: if animations are disabled or never get to run, the content still\n shows rather than staying at zero opacity. */\n.pg-ready .pg-anim.pg-in{opacity:1}\n@media (prefers-reduced-motion:reduce){.pg-ready .pg-anim{opacity:1;animation:none!important}}\n`.trim();\n\n/**\n * The reveal script; static, with no interpolated content.\n *\n * Hiding content until a callback fires is a risky trade on a public page, so\n * this fails open three ways: whatever is already on screen is revealed\n * synchronously, anything still hidden is revealed after a timeout, and the\n * whole hidden state is skipped when IntersectionObserver or motion\n * preferences say so.\n */\nexport const ENTRANCE_SCRIPT = `\n(function(){\n var nodes=document.querySelectorAll('.pg-anim');\n if(!nodes.length)return;\n var reveal=function(n){n.classList.add('pg-in');};\n var all=function(){for(var i=0;i<nodes.length;i++)reveal(nodes[i]);};\n\n if(!('IntersectionObserver' in window)||!window.matchMedia||matchMedia('(prefers-reduced-motion:reduce)').matches){\n all();return;\n }\n document.documentElement.classList.add('pg-ready');\n\n // Anything already in view animates straight away rather than waiting for\n // the observer's first delivery.\n var pending=[];\n for(var i=0;i<nodes.length;i++){\n var r=nodes[i].getBoundingClientRect();\n if(r.top<innerHeight&&r.bottom>0)reveal(nodes[i]);else pending.push(nodes[i]);\n }\n\n var io=new IntersectionObserver(function(entries){\n for(var j=0;j<entries.length;j++){\n if(entries[j].isIntersecting){reveal(entries[j].target);io.unobserve(entries[j].target);}\n }\n },{threshold:0.15,rootMargin:'0px 0px -8% 0px'});\n for(var k=0;k<pending.length;k++)io.observe(pending[k]);\n\n // Last resort: never leave content invisible because a callback did not run.\n setTimeout(all,3000);\n})();\n`.trim();\n\nexport function hasEntrances(\n elements: CanvasElement[],\n cascade: Cascade = DEFAULT_CASCADE,\n) {\n const baseId = baseOf(cascade).id;\n return elements.some(\n (el) => resolveStyle(el, baseId, cascade).entrance !== \"none\",\n );\n}\n\n/**\n * Builds the stylesheet for a published document: one base rule per element,\n * plus a media block for each breakpoint that actually overrides something,\n * plus hover rules.\n */\nexport function stylesheetFor(\n elements: CanvasElement[],\n rootStyle: RootStyle,\n): string {\n const byId = new Map(elements.map((el) => [el.id, el]));\n const cascade = cascadeOf(rootStyle.breakpoints, rootStyle.baseBreakpointId);\n const baseId = baseOf(cascade).id;\n const parts: string[] = [];\n for (const font of rootStyle.customFonts ?? []) {\n const family = font.name.replace(/[\"'{};]/g, \"\");\n const rawUrl = font.url.replace(/[\"'()\\\\]/g, \"\");\n const url = rawUrl === \"/fonts/manrope-variable.woff2\"\n ? \"/api/pagiera/assets/manrope-variable.woff2\"\n : rawUrl;\n parts.push(`@font-face{font-family:\"${family}\";src:url(\"${url}\") format(\"woff2\");font-weight:${font.weight};font-style:${font.style};font-display:swap}`);\n }\n\n // The published page lives inside the app's root layout, which paints its\n // own theme background on <body>. Take that over, or the area beside a\n // width-capped page shows the editor's chrome colour rather than the\n // page's own background.\n parts.push(`html,body{margin:0;padding:0;background:${rootStyle.bg}}`);\n\n parts.push(`html{scroll-behavior:smooth}.pg-root{${declarationsToCss(rootStyleToCss(rootStyle))}}`);\n parts.push(\n // The font is pinned on `.pg-root` rather than on <body>: the app's\n // layout puts a font class on <body>, which would out-specify an\n // element selector and leak the editor's typeface into the site.\n // The shell spans the viewport; the content width is applied by each\n // band's inner box, so section backgrounds reach both edges.\n `.pg-root{font-family:${resolveFont(rootStyle.fontFamily)}}` +\n \".pg-node{box-sizing:border-box}\" +\n \".pg-node img{display:block;width:100%;height:100%}\" +\n \".pg-link{text-decoration:none;color:inherit}\",\n );\n\n for (const element of elements) {\n const emitted = rulesFor(element, byId, baseId, rootStyle, cascade)\n .map(([suffix, decl]) => `.${classFor(element.id)}${suffix}{${decl}}`)\n .join(\"\");\n parts.push(emitted);\n }\n\n for (const plan of mediaPlan(cascade)) {\n const breakpoint = plan.id;\n // A parent switching layout at this breakpoint changes how its children\n // position themselves, so re-emit descendants of any changed container.\n const affected = elements.filter((el) => {\n if (el.overrides?.[breakpoint]) return true;\n const parent = el.parentId ? byId.get(el.parentId) : undefined;\n return Boolean(parent?.overrides?.[breakpoint]);\n });\n if (affected.length === 0) continue;\n\n const rules = affected\n .flatMap((el) =>\n rulesFor(el, byId, breakpoint, rootStyle, cascade).map(\n ([suffix, decl]) => `.${classFor(el.id)}${suffix}{${decl}}`,\n ),\n )\n .join(\"\");\n parts.push(`@media ${plan.query}{${rules}}`);\n }\n\n if (hasEntrances(elements, cascade)) {\n parts.push(ENTRANCE_KEYFRAMES);\n for (const element of elements) {\n const style = resolveStyle(element, baseId, cascade);\n if (style.entrance === \"none\") continue;\n parts.push(\n `.pg-ready .${classFor(element.id)}.pg-in{` +\n `animation:pg-${style.entrance} ${style.entranceDuration}ms ` +\n `${style.entranceCurve === \"spring\" ? `cubic-bezier(.16,${1 + Math.max(0, 45 - style.springDamping) / 100},${Math.max(0.12, Math.min(0.52, 120 / style.springStiffness))},1)` : `cubic-bezier(${style.entranceBezier})`} ${style.entranceDelay}ms both}`,\n );\n }\n }\n\n for (const element of elements) {\n if (element.hover || element.press) parts.push(`.${classFor(element.id)}{transition:transform .42s cubic-bezier(.16,1,.3,1),scale .42s cubic-bezier(.16,1,.3,1),rotate .42s cubic-bezier(.16,1,.3,1),translate .42s cubic-bezier(.16,1,.3,1),background-color .32s ease,color .32s ease,border-color .32s ease,box-shadow .42s cubic-bezier(.16,1,.3,1),opacity .32s ease,filter .42s ease;will-change:transform}`);\n if (!element.hover || Object.keys(element.hover).length === 0) continue;\n const merged = { ...resolveStyle(element, baseId, cascade), ...element.hover };\n const parent = element.parentId ? byId.get(element.parentId) : undefined;\n const parentStyle = parent ? resolveStyle(parent, baseId, cascade) : undefined;\n const css = styleToCss(\n merged,\n {\n parentLayout: parentStyle?.layout ?? \"stack\",\n parentDirection: parentStyle?.direction ?? \"column\",\n },\n element,\n );\n parts.push(\n `.${classFor(element.id)}:hover{${declarationsToCss(css)}}`,\n );\n }\n\n for (const element of elements) {\n if (element.press && Object.keys(element.press).length) {\n const merged = { ...resolveStyle(element, baseId, cascade), ...element.press };\n const parent = element.parentId ? byId.get(element.parentId) : undefined;\n const parentStyle = parent ? resolveStyle(parent, baseId, cascade) : undefined;\n const css = styleToCss(merged, { parentLayout: parentStyle?.layout ?? \"stack\", parentDirection: parentStyle?.direction ?? \"column\" }, element);\n parts.push(`.${classFor(element.id)}:active{${declarationsToCss(css)}}`);\n }\n if (element.loop) {\n const name = element.loop.type;\n parts.push(`.${classFor(element.id)}{animation:pg-loop-${name} ${element.loop.duration}ms ease-in-out infinite}`);\n }\n }\n if (elements.some((element) => element.loop)) parts.push(`@keyframes pg-loop-pulse{0%,100%{scale:1}50%{scale:1.06}}@keyframes pg-loop-float{0%,100%{translate:0 0}50%{translate:0 -12px}}@keyframes pg-loop-spin{to{rotate:360deg}}@media(prefers-reduced-motion:reduce){.pg-node{animation:none!important}}`);\n\n return parts.join(\"\\n\");\n}\n\nexport function rootChildren(elements: CanvasElement[]) {\n return childrenOf(elements, undefined);\n}\n", "import { createElement } from \"./tree\";\nimport { DEFAULT_ROOT_STYLE, type CanvasElement, type DataSource, type ElementStyle, type ElementType, type RootStyle } from \"./types\";\n\nfunction node(type: ElementType, name: string, style: Partial<ElementStyle>, content?: string, parentId?: string) {\n const element = createElement(type, { x: 0, y: 0, z: 0, parentId });\n element.name = name;\n element.base = { ...element.base, ...style };\n if (content !== undefined) element.content = content;\n return element;\n}\n\nfunction responsive(element: CanvasElement, tablet: Partial<ElementStyle>, mobile: Partial<ElementStyle>) {\n element.overrides = { tablet, mobile };\n return element;\n}\n\nfunction enter(element: CanvasElement, delay = 0, entrance: ElementStyle[\"entrance\"] = \"up\") {\n element.base = { ...element.base, entrance, entranceDelay: delay, entranceDuration: 760, entranceCurve: \"ease\", entranceBezier: \"0.16, 1, 0.3, 1\" };\n return element;\n}\n\nexport function createNocturneShowcase(): { elements: CanvasElement[]; rootStyle: RootStyle } {\n const ink = \"#f1f0ea\";\n const muted = \"#96958f\";\n const acid = \"#d7ff3f\";\n const surface = \"#151514\";\n const border = \"rgba(241,240,234,.14)\";\n const elements: CanvasElement[] = [];\n\n const section = (name: string, style: Partial<ElementStyle>) => {\n const item = node(\"Section\", name, { widthMode: \"fill\", heightMode: \"auto\", layout: \"stack\", direction: \"column\", align: \"center\", ...style });\n elements.push(item);\n return item;\n };\n const container = (name: string, parentId: string, style: Partial<ElementStyle>) => {\n const item = node(\"Container\", name, { widthMode: \"fill\", heightMode: \"auto\", layout: \"stack\", borderW: 0, padT: 0, padR: 0, padB: 0, padL: 0, ...style }, undefined, parentId);\n elements.push(item);\n return item;\n };\n\n const nav = section(\"Nocturne navigation\", { bg: \"#0b0b0a\", padT: 22, padR: 40, padB: 22, padL: 40, borderW: 0 });\n const navInner = responsive(container(\"Navigation inner\", nav.id, { direction: \"row\", justify: \"between\", align: \"center\", gap: 28, w: 1180, widthMode: \"fixed\" }), { w: 860 }, { widthMode: \"fill\" });\n elements.push(node(\"Heading\", \"Wordmark\", { widthMode: \"auto\", heightMode: \"auto\", color: ink, fontSize: 17, fontWeight: \"800\", letterSpacing: -0.7 }, \"NOCTURNE\u00AE\", navInner.id));\n const links = responsive(container(\"Navigation links\", navInner.id, { widthMode: \"auto\", direction: \"row\", align: \"center\", gap: 28 }), {}, { hidden: true });\n for (const [label, slug] of [[\"Work\", \"work\"], [\"Studio\", \"studio\"], [\"Contact\", \"contact\"]]) { const link = node(\"Button\", `Nav ${label}`, { widthMode: \"auto\", heightMode: \"auto\", bg: \"transparent\", color: muted, fontSize: 13, fontWeight: \"600\", padT: 4, padR: 0, padB: 4, padL: 0, cursor: \"pointer\" }, label, links.id); link.interaction = { trigger: \"click\", action: \"navigate\", value: `/s/${slug}`, target: \"_self\" }; link.hover = { color: ink }; elements.push(link); }\n const navCta = node(\"Button\", \"Navigation CTA\", { widthMode: \"auto\", heightMode: \"auto\", bg: acid, color: \"#0b0b0a\", radius: 999, padT: 11, padR: 18, padB: 11, padL: 18, fontSize: 12, fontWeight: \"800\", cursor: \"pointer\" }, \"Start a project \u2197\", navInner.id);\n navCta.hover = { scale: 101.8, bg: \"#edff9a\", shadow: \"0 10px 32px rgba(215,255,63,.18)\" }; navCta.press = { scale: 97.5 }; navCta.overrides = { mobile: { hidden: true } }; elements.push(navCta);\n const menuButton = node(\"Button\", \"Mobile menu trigger\", { widthMode: \"auto\", heightMode: \"auto\", bg: \"transparent\", color: ink, borderW: 1, borderC: border, radius: 999, padT: 9, padR: 14, padB: 9, padL: 14, fontSize: 11, fontWeight: \"800\", hidden: true, cursor: \"pointer\" }, \"MENU +\", navInner.id);\n menuButton.overrides = { mobile: { hidden: false } }; menuButton.press = { scale: 97 }; elements.push(menuButton);\n const mobileMenu = node(\"Container\", \"Mobile navigation menu\", { widthMode: \"fill\", heightMode: \"auto\", layout: \"stack\", direction: \"column\", gap: 0, bg: \"#151514\", borderW: 1, borderC: border, radius: 14, padT: 8, padR: 8, padB: 8, padL: 8, hidden: true }, undefined, nav.id); elements.push(mobileMenu);\n menuButton.interaction = { trigger: \"click\", action: \"toggle-layer\", value: mobileMenu.id };\n for (const [label, slug] of [[\"Work\", \"work\"], [\"Studio\", \"studio\"], [\"Contact\", \"contact\"]]) { const item = node(\"Button\", `Mobile ${label}`, { widthMode: \"fill\", heightMode: \"auto\", bg: \"transparent\", color: ink, borderW: 0, radius: 9, padT: 14, padR: 14, padB: 14, padL: 14, fontSize: 14, fontWeight: \"700\", textAlign: \"left\", cursor: \"pointer\" }, `${label} \u2197`, mobileMenu.id); item.interaction = { trigger: \"click\", action: \"navigate\", value: `/s/${slug}`, target: \"_self\" }; item.hover = { bg: \"rgba(255,255,255,.06)\" }; elements.push(item); }\n\n const hero = section(\"Hero\", { bg: \"#0b0b0a\", padT: 86, padR: 40, padB: 72, padL: 40, overflow: \"hidden\" });\n const heroInner = responsive(container(\"Hero composition\", hero.id, { direction: \"row\", justify: \"between\", align: \"end\", gap: 64, w: 1180, widthMode: \"fixed\" }), { w: 860, gap: 36 }, { widthMode: \"fill\", direction: \"column\", align: \"stretch\", gap: 44 });\n const heroCopy = container(\"Hero copy\", heroInner.id, { widthMode: \"fixed\", w: 650, direction: \"column\", gap: 26 });\n heroCopy.overrides = { tablet: { w: 500 }, mobile: { widthMode: \"fill\" } };\n elements.push(enter(node(\"Text\", \"Hero index\", { widthMode: \"auto\", heightMode: \"auto\", color: acid, fontSize: 11, fontWeight: \"700\", letterSpacing: 2.2, textTransform: \"uppercase\" }, \"Independent creative practice \u2014 Istanbul / Worldwide\", heroCopy.id), 0, \"fade\"));\n const title = enter(node(\"Heading\", \"Hero title\", { widthMode: \"fill\", heightMode: \"auto\", color: ink, fontSize: 96, fontWeight: \"600\", lineHeight: .9, letterSpacing: -6.5 }, \"WE DESIGN\\nTHE UNEXPECTED.\", heroCopy.id), 90);\n title.overrides = { tablet: { fontSize: 68, letterSpacing: -4 }, mobile: { fontSize: 52, letterSpacing: -3, lineHeight: .94 } }; elements.push(title);\n const heroBottom = container(\"Hero statement\", heroCopy.id, { direction: \"row\", justify: \"between\", align: \"end\", gap: 28, padT: 12, borderW: 0 });\n heroBottom.overrides = { mobile: { direction: \"column\", align: \"start\" } };\n const intro = enter(node(\"Text\", \"Hero intro\", { widthMode: \"fixed\", w: 390, heightMode: \"auto\", color: muted, fontSize: 16, lineHeight: 1.65 }, \"A strategy-led design studio shaping identities and digital experiences for ambitious people building what comes next.\", heroBottom.id), 180);\n intro.overrides = { mobile: { widthMode: \"fill\" } }; elements.push(intro);\n const scroll = node(\"Text\", \"Scroll cue\", { widthMode: \"auto\", heightMode: \"auto\", color: ink, fontSize: 11, fontWeight: \"700\", letterSpacing: 1.4, textTransform: \"uppercase\" }, \"Scroll to explore \u2193\", heroBottom.id); scroll.loop = { type: \"float\", duration: 2600 }; elements.push(scroll);\n\n const visual = enter(node(\"Frame\", \"Hero artwork\", { widthMode: \"fixed\", w: 390, heightMode: \"fixed\", h: 540, layout: \"absolute\", bg: surface, gradient: \"radial-gradient(circle at 68% 28%, #d7ff3f 0%, #7f9c16 11%, #27291d 28%, #151514 58%)\", radius: 2, overflow: \"hidden\", borderW: 1, borderC: border, rotate: 2, shadow: \"0 40px 100px rgba(0,0,0,.45)\" }, undefined, heroInner.id), 160, \"zoom\");\n visual.overrides = { tablet: { w: 310, h: 460 }, mobile: { widthMode: \"fill\", w: 320, h: 420, rotate: 0 } }; elements.push(visual);\n const artLabel = node(\"Text\", \"Artwork label\", { x: 24, y: 24, w: 190, h: 30, widthMode: \"fixed\", heightMode: \"fixed\", color: \"#0b0b0a\", fontSize: 10, fontWeight: \"800\", letterSpacing: 1.5, textTransform: \"uppercase\" }, \"Form / Tension / 001\", visual.id); elements.push(artLabel);\n const orb = node(\"Frame\", \"Kinetic orb\", { x: 220, y: 350, w: 110, h: 110, widthMode: \"fixed\", heightMode: \"fixed\", bg: acid, radius: 999, blur: 1, shadow: \"0 0 70px rgba(215,255,63,.42)\" }, undefined, visual.id); orb.loop = { type: \"pulse\", duration: 4200 }; elements.push(orb);\n elements.push(node(\"Heading\", \"Artwork number\", { x: 24, y: 436, w: 260, h: 82, widthMode: \"fixed\", heightMode: \"fixed\", color: ink, fontSize: 64, fontWeight: \"500\", letterSpacing: -4 }, \"24\u201426\", visual.id));\n\n const ticker = section(\"Ticker\", { bg: acid, padT: 17, padR: 24, padB: 17, padL: 24 });\n elements.push(node(\"Text\", \"Ticker line\", { widthMode: \"fill\", heightMode: \"auto\", color: \"#0b0b0a\", fontSize: 12, fontWeight: \"800\", letterSpacing: 2, textAlign: \"center\", textTransform: \"uppercase\" }, \"Brand systems \u2726 Digital direction \u2726 Interactive experiences \u2726 Art direction \u2726 Strategy\", ticker.id));\n\n const manifesto = section(\"Manifesto\", { bg: \"#f1f0ea\", padT: 140, padR: 40, padB: 140, padL: 40 });\n const manifestoInner = responsive(container(\"Manifesto inner\", manifesto.id, { direction: \"column\", gap: 64, w: 1180, widthMode: \"fixed\" }), { w: 860 }, { widthMode: \"fill\", gap: 40 });\n elements.push(node(\"Text\", \"Manifesto eyebrow\", { widthMode: \"auto\", heightMode: \"auto\", color: \"#5d5d58\", fontSize: 11, fontWeight: \"800\", letterSpacing: 2, textTransform: \"uppercase\" }, \"01 / Our point of view\", manifestoInner.id));\n const statement = enter(node(\"Heading\", \"Manifesto statement\", { widthMode: \"fill\", heightMode: \"auto\", color: \"#11110f\", fontSize: 70, fontWeight: \"500\", lineHeight: 1.03, letterSpacing: -4.4 }, \"Safe ideas disappear.\\nDistinct ones build culture.\", manifestoInner.id), 40);\n statement.overrides = { tablet: { fontSize: 54 }, mobile: { fontSize: 40, letterSpacing: -2.4 } }; elements.push(statement);\n const manifestoBottom = responsive(container(\"Manifesto details\", manifestoInner.id, { direction: \"row\", justify: \"end\", gap: 60 }), {}, { direction: \"column\", gap: 24 });\n const body = node(\"Text\", \"Manifesto body\", { widthMode: \"fixed\", w: 500, heightMode: \"auto\", color: \"#5d5d58\", fontSize: 17, lineHeight: 1.75 }, \"We partner with founders and cultural teams at inflection points\u2014when the old language no longer fits and a sharper expression can unlock the next chapter.\", manifestoBottom.id); body.overrides = { mobile: { widthMode: \"fill\" } }; elements.push(body);\n elements.push(node(\"Text\", \"Manifesto services\", { widthMode: \"fixed\", w: 220, heightMode: \"auto\", color: \"#11110f\", fontSize: 13, fontWeight: \"700\", lineHeight: 2 }, \"POSITIONING\\nIDENTITY SYSTEMS\\nDIGITAL PRODUCTS\\nCAMPAIGN WORLDS\", manifestoBottom.id));\n\n const work = section(\"Selected work\", { bg: \"#0b0b0a\", padT: 128, padR: 40, padB: 128, padL: 40 });\n const workInner = responsive(container(\"Work inner\", work.id, { direction: \"column\", gap: 42, w: 1180, widthMode: \"fixed\" }), { w: 860 }, { widthMode: \"fill\" });\n const workHead = container(\"Work heading\", workInner.id, { direction: \"row\", justify: \"between\", align: \"end\", gap: 20 }); workHead.overrides = { mobile: { direction: \"column\", align: \"start\" } };\n elements.push(node(\"Heading\", \"Work title\", { widthMode: \"auto\", heightMode: \"auto\", color: ink, fontSize: 48, fontWeight: \"600\", letterSpacing: -2.5 }, \"SELECTED WORK\", workHead.id));\n elements.push(node(\"Text\", \"Work count\", { widthMode: \"auto\", heightMode: \"auto\", color: muted, fontSize: 12, letterSpacing: 1.2 }, \"2024\u20142026 / 03 PROJECTS\", workHead.id));\n const grid = responsive(node(\"Grid\", \"Projects grid\", { widthMode: \"fill\", heightMode: \"auto\", layout: \"stack\", columns: 2, gap: 18 }, undefined, workInner.id), { columns: 2 }, { columns: 1 }); elements.push(grid);\n const projects = [\n [\"AER / Mobility\", \"Identity + Digital\", \"linear-gradient(135deg,#29352a,#a9c6a2 55%,#e4ecdf)\"],\n [\"KERN / Objects\", \"Strategy + Commerce\", \"linear-gradient(145deg,#4b251c,#e06d45 48%,#f3c7a8)\"],\n [\"OTHER / Culture\", \"Campaign + Experience\", \"linear-gradient(145deg,#172d43,#3b83a8 48%,#b8ddea)\"],\n ];\n projects.forEach(([titleText, meta, gradient], index) => {\n const card = enter(node(\"Container\", `Project ${index + 1}`, { widthMode: \"fill\", heightMode: \"auto\", layout: \"stack\", direction: \"column\", gap: 18, bg: \"transparent\", borderW: 0, padT: 0, padR: 0, padB: 18, padL: 0 }, undefined, grid.id), index * 90);\n if (index === 2) card.base = { ...card.base, columns: 2 }; card.hover = { shadow: \"0 26px 70px rgba(0,0,0,.28)\", opacity: 96 }; elements.push(card);\n const image = node(\"Frame\", \"Project image\", { widthMode: \"fill\", heightMode: \"fixed\", h: index === 0 ? 520 : 360, bg: surface, gradient, overflow: \"hidden\", radius: 2 }, undefined, card.id); image.overrides = { mobile: { h: 320 } }; elements.push(image);\n const caption = container(\"Project caption\", card.id, { direction: \"row\", justify: \"between\", gap: 20 });\n elements.push(node(\"Heading\", \"Project name\", { widthMode: \"auto\", heightMode: \"auto\", color: ink, fontSize: 17, fontWeight: \"700\", letterSpacing: -.5 }, titleText, caption.id));\n elements.push(node(\"Text\", \"Project discipline\", { widthMode: \"auto\", heightMode: \"auto\", color: muted, fontSize: 12 }, meta, caption.id));\n });\n\n const cta = section(\"Closing CTA\", { bg: acid, padT: 120, padR: 40, padB: 120, padL: 40 });\n const ctaInner = responsive(container(\"CTA inner\", cta.id, { direction: \"column\", align: \"center\", gap: 30, w: 980, widthMode: \"fixed\", textAlign: \"center\" }), { w: 760 }, { widthMode: \"fill\" });\n elements.push(node(\"Text\", \"CTA eyebrow\", { widthMode: \"auto\", heightMode: \"auto\", color: \"#30340d\", fontSize: 11, fontWeight: \"800\", letterSpacing: 2, textTransform: \"uppercase\" }, \"Have a meaningful problem?\", ctaInner.id));\n const ctaTitle = node(\"Heading\", \"CTA title\", { widthMode: \"fill\", heightMode: \"auto\", color: \"#0b0b0a\", fontSize: 76, fontWeight: \"600\", lineHeight: .98, letterSpacing: -4.5, textAlign: \"center\" }, \"LET\u2019S MAKE IT\\nIMPOSSIBLE TO IGNORE.\", ctaInner.id); ctaTitle.overrides = { mobile: { fontSize: 44, letterSpacing: -2.5 } }; elements.push(ctaTitle);\n const button = node(\"Button\", \"CTA button\", { widthMode: \"auto\", heightMode: \"auto\", bg: \"#0b0b0a\", color: ink, radius: 999, padT: 15, padR: 24, padB: 15, padL: 24, fontSize: 13, fontWeight: \"800\", cursor: \"pointer\" }, \"Tell us what you\u2019re building \u2197\", ctaInner.id); button.hover = { scale: 101.8, bg: \"#282821\", shadow: \"0 16px 44px rgba(11,11,10,.2)\" }; button.press = { scale: 97.5 }; elements.push(button);\n\n const footer = section(\"Footer\", { bg: \"#0b0b0a\", padT: 42, padR: 40, padB: 42, padL: 40 });\n const footerInner = responsive(container(\"Footer inner\", footer.id, { direction: \"row\", justify: \"between\", align: \"end\", gap: 32, w: 1180, widthMode: \"fixed\" }), { w: 860 }, { widthMode: \"fill\", direction: \"column\", align: \"start\" });\n elements.push(node(\"Heading\", \"Footer brand\", { widthMode: \"auto\", heightMode: \"auto\", color: ink, fontSize: 28, fontWeight: \"800\", letterSpacing: -1.5 }, \"NOCTURNE\u00AE\", footerInner.id));\n elements.push(node(\"Text\", \"Footer meta\", { widthMode: \"auto\", heightMode: \"auto\", color: muted, fontSize: 11, lineHeight: 1.8, textAlign: \"right\" }, \"ISTANBUL / WORLDWIDE\\n\u00A9 2026 \u2014 ALL RIGHTS RESERVED\", footerInner.id));\n\n return {\n elements,\n rootStyle: {\n ...DEFAULT_ROOT_STYLE,\n documentMode: \"page\",\n fullWidth: true,\n maxWidth: 1200,\n canvasHeight: 5200,\n bg: \"#0b0b0a\",\n layout: \"stack\",\n direction: \"column\",\n gap: 0,\n align: \"stretch\",\n padT: 0, padR: 0, padB: 0, padL: 0,\n fontFamily: '\"Manrope Showcase\", sans-serif',\n customFonts: [{ id: \"showcase-manrope\", name: \"Manrope Showcase\", url: \"/api/pagiera/assets/manrope-variable.woff2\", weight: 400, style: \"normal\" }],\n variables: [\n { id: \"nocturne-bg\", name: \"Nocturne / Background\", type: \"color\", value: \"#0b0b0a\" },\n { id: \"nocturne-ink\", name: \"Nocturne / Ink\", type: \"color\", value: ink },\n { id: \"nocturne-acid\", name: \"Nocturne / Acid\", type: \"color\", value: acid },\n { id: \"nocturne-muted\", name: \"Nocturne / Muted\", type: \"color\", value: muted },\n ],\n },\n };\n}\n\nexport type SiteTemplatePage = { name: string; slug: string; elements: CanvasElement[]; rootStyle: RootStyle; dataSources?: DataSource[] };\n\nfunction nocturneInnerPage(name: string, slug: string, index: string, title: string, intro: string, columns: Array<[string, string]>) : SiteTemplatePage {\n const source = createNocturneShowcase();\n const roots = source.elements.filter((element) => element.name === \"Nocturne navigation\" || element.name === \"Footer\");\n const keep = new Set<string>();\n const visit = (id: string) => { keep.add(id); source.elements.filter((element) => element.parentId === id).forEach((element) => visit(element.id)); };\n roots.forEach((root) => visit(root.id));\n const nav = roots.find((root) => root.name === \"Nocturne navigation\");\n const footer = roots.find((root) => root.name === \"Footer\");\n const navTree = source.elements.filter((element) => keep.has(element.id) && (element.id === nav?.id || (() => { let cursor = element.parentId; while (cursor) { if (cursor === nav?.id) return true; cursor = source.elements.find((item) => item.id === cursor)?.parentId; } return false; })()));\n const footerTree = source.elements.filter((element) => keep.has(element.id) && (element.id === footer?.id || (() => { let cursor = element.parentId; while (cursor) { if (cursor === footer?.id) return true; cursor = source.elements.find((item) => item.id === cursor)?.parentId; } return false; })()));\n\n const elements: CanvasElement[] = [...navTree];\n const hero = node(\"Section\", `${name} hero`, { widthMode: \"fill\", heightMode: \"auto\", layout: \"stack\", direction: \"column\", align: \"center\", gap: 54, bg: \"#0b0b0a\", padT: 120, padR: 40, padB: 130, padL: 40 }); elements.push(hero);\n const inner = responsive(node(\"Container\", `${name} hero inner`, { widthMode: \"fixed\", w: 1180, heightMode: \"auto\", layout: \"stack\", direction: \"column\", gap: 34, borderW: 0, padT: 0, padR: 0, padB: 0, padL: 0 }, undefined, hero.id), { w: 860 }, { widthMode: \"fill\" }); elements.push(inner);\n elements.push(enter(node(\"Text\", `${name} index`, { widthMode: \"auto\", heightMode: \"auto\", color: \"#d7ff3f\", fontSize: 11, fontWeight: \"800\", letterSpacing: 2, textTransform: \"uppercase\" }, `${index} / ${name}`, inner.id), 0, \"fade\"));\n const heading = enter(node(\"Heading\", `${name} title`, { widthMode: \"fill\", heightMode: \"auto\", color: \"#f1f0ea\", fontSize: 92, fontWeight: \"600\", lineHeight: .92, letterSpacing: -6 }, title, inner.id), 70); heading.overrides = { tablet: { fontSize: 66 }, mobile: { fontSize: 48, letterSpacing: -3 } }; elements.push(heading);\n const introNode = enter(node(\"Text\", `${name} intro`, { widthMode: \"fixed\", w: 620, heightMode: \"auto\", color: \"#96958f\", fontSize: 18, lineHeight: 1.7 }, intro, inner.id), 150); introNode.overrides = { mobile: { widthMode: \"fill\" } }; elements.push(introNode);\n\n const content = node(\"Section\", `${name} content`, { widthMode: \"fill\", heightMode: \"auto\", layout: \"stack\", direction: \"column\", align: \"center\", bg: \"#f1f0ea\", padT: 110, padR: 40, padB: 120, padL: 40 }); elements.push(content);\n const grid = responsive(node(\"Grid\", `${name} grid`, { widthMode: \"fixed\", w: 1180, heightMode: \"auto\", layout: \"stack\", columns: 2, gap: 1, bg: \"#b9b8b0\" }, undefined, content.id), { w: 860 }, { widthMode: \"fill\", columns: 1 }); elements.push(grid);\n columns.forEach(([label, copy], position) => {\n const card = enter(node(\"Container\", `${name} ${label}`, { widthMode: \"fill\", heightMode: \"auto\", layout: \"stack\", direction: \"column\", gap: 26, bg: \"#f1f0ea\", borderW: 0, padT: 44, padR: 44, padB: 50, padL: 44 }, undefined, grid.id), position * 80); elements.push(card);\n elements.push(node(\"Text\", `${label} number`, { widthMode: \"auto\", heightMode: \"auto\", color: \"#74736d\", fontSize: 10, fontWeight: \"800\", letterSpacing: 1.8 }, `0${position + 1} \u2014 ${label.toUpperCase()}`, card.id));\n elements.push(node(\"Text\", `${label} copy`, { widthMode: \"fill\", heightMode: \"auto\", color: \"#171714\", fontSize: 21, lineHeight: 1.5, letterSpacing: -.5 }, copy, card.id));\n });\n elements.push(...footerTree);\n return { name, slug, elements, rootStyle: { ...source.rootStyle, canvasHeight: 3000 } };\n}\n\nexport function createNocturneSiteTemplate(): SiteTemplatePage[] {\n const home = createNocturneShowcase();\n return [\n { name: \"Home\", slug: \"home\", ...home },\n nocturneInnerPage(\"Work\", \"work\", \"02\", \"SELECTED\\nENGAGEMENTS.\", \"A focused archive of identities, products and campaign worlds created with teams in motion.\", [[\"Aer\", \"A new identity and booking experience for an electric mobility company built around quiet confidence.\"], [\"Kern\", \"A tactile commerce system for collectible objects, balancing material detail with digital clarity.\"], [\"Other\", \"A cultural platform transformed into an evolving editorial identity and participatory campaign.\"], [\"Field\", \"A data product made human through a precise interface, direct language and a flexible visual system.\"]]),\n nocturneInnerPage(\"Studio\", \"studio\", \"03\", \"SMALL TEAM.\\nSERIOUS RANGE.\", \"Nocturne is an independent strategy and design practice for moments when a familiar answer is no longer enough.\", [[\"Approach\", \"We begin with the tension underneath the brief, then build one clear idea that can carry an entire system.\"], [\"Team\", \"A senior, hands-on core supported by a trusted network of specialists selected around each challenge.\"], [\"Principles\", \"Clarity over decoration. Character over trends. Systems that stay useful after the launch moment.\"], [\"Partners\", \"We work directly with founders, cultural leaders and internal teams who value an honest creative exchange.\"]]),\n nocturneInnerPage(\"Contact\", \"contact\", \"04\", \"LET\u2019S START\\nWITH THE TRUTH.\", \"Tell us what is changing, what feels stuck and why this moment matters. We will take it from there.\", [[\"New business\", \"projects@nocturne.studio\\nShare your ambition, timing and the people involved.\"], [\"Elsewhere\", \"Instagram / LinkedIn / Are.na\\nFollow current work, fragments and studio notes.\"], [\"Istanbul\", \"Karak\u00F6y, Istanbul\\nWorking locally and collaborating worldwide.\"], [\"Availability\", \"Selected partnerships for Q4 2026.\\nTypical engagements begin with a focused strategy sprint.\"]]),\n ];\n}\n", "import { resolveStyle } from \"./style\";\nimport { childrenOf, subtreeIds } from \"./tree\";\nimport type { Breakpoint, CanvasElement } from \"./types\";\n\n/** How close (in canvas px) an edge must be before it snaps. */\nexport const SNAP_THRESHOLD = 6;\n\nexport type Guide = {\n axis: \"x\" | \"y\";\n /** Position in the dragged element's own coordinate space. */\n at: number;\n /** Span of the guide line, so it only reaches as far as the pairing needs. */\n from: number;\n to: number;\n};\n\ntype Box = { x: number; y: number; w: number; h: number };\n\nfunction edges(box: Box, axis: \"x\" | \"y\") {\n return axis === \"x\"\n ? [box.x, box.x + box.w / 2, box.x + box.w]\n : [box.y, box.y + box.h / 2, box.y + box.h];\n}\n\n/**\n * Aligns the moving box against its siblings and the frame it lives in,\n * returning the corrected position plus the guides worth drawing.\n *\n * Everything is expressed in the moving element's parent coordinate space, so\n * a nested element snaps against its own container rather than the page.\n */\nexport function snapPosition(\n elements: CanvasElement[],\n movingId: string,\n proposed: Box,\n frame: { w: number; h: number },\n breakpoint: Breakpoint,\n threshold = SNAP_THRESHOLD,\n): { x: number; y: number; guides: Guide[] } {\n const moving = elements.find((el) => el.id === movingId);\n if (!moving) return { x: proposed.x, y: proposed.y, guides: [] };\n\n const excluded = subtreeIds(elements, movingId);\n const siblings = childrenOf(elements, moving.parentId)\n .filter((el) => !excluded.has(el.id))\n .map((el) => ({ el, style: resolveStyle(el, breakpoint) }))\n .filter(({ style }) => !style.hidden);\n\n const targets: Box[] = [\n { x: 0, y: 0, w: frame.w, h: frame.h },\n ...siblings.map(({ style }) => ({\n x: style.x,\n y: style.y,\n w: style.w,\n h: style.h,\n })),\n ];\n\n const guides: Guide[] = [];\n const result = { x: proposed.x, y: proposed.y };\n\n for (const axis of [\"x\", \"y\"] as const) {\n const movingEdges = edges(proposed, axis);\n let best: { delta: number; at: number; target: Box } | null = null;\n\n for (const target of targets) {\n for (const targetEdge of edges(target, axis)) {\n for (const movingEdge of movingEdges) {\n const delta = targetEdge - movingEdge;\n if (Math.abs(delta) > threshold) continue;\n if (!best || Math.abs(delta) < Math.abs(best.delta)) {\n best = { delta, at: targetEdge, target };\n }\n }\n }\n }\n\n if (!best) continue;\n result[axis] = proposed[axis] + best.delta;\n\n const crossAxis = axis === \"x\" ? \"y\" : \"x\";\n const crossSize = axis === \"x\" ? \"h\" : \"w\";\n const movingStart = proposed[crossAxis];\n const movingEnd = movingStart + proposed[crossSize];\n const targetStart = best.target[crossAxis];\n const targetEnd = targetStart + best.target[crossSize];\n\n guides.push({\n axis,\n at: best.at,\n from: Math.min(movingStart, targetStart),\n to: Math.max(movingEnd, targetEnd),\n });\n }\n\n return { ...result, guides };\n}\n", "\"use client\";\n\nimport {\n IconAlignBoxCenterMiddle,\n IconAlignBoxLeftMiddle,\n IconAlignBoxRightMiddle,\n IconArrowsHorizontal,\n IconArrowsVertical,\n IconLayoutAlignBottom,\n IconLayoutAlignTop,\n IconChevronRight,\n IconPlus,\n IconPlayerPlay,\n IconSparkles,\n IconTrash,\n IconX,\n} from \"@tabler/icons-react\";\nimport type React from \"react\";\nimport { useState } from \"react\";\nimport { usePagieraFonts } from \"pagiera/provider\";\nimport { hasOverride } from \"@/lib/editor/style\";\nimport {\n type Align,\n ASPECT_RATIOS,\n type BgSize,\n type BlendMode,\n type Breakpoint,\n type CanvasElement,\n type Constraint,\n type DataSource,\n type Direction,\n type ElementStyle,\n ENTRANCES,\n FONT_STACKS,\n isContainer,\n isTextual,\n type Justify,\n type LayoutMode,\n type PositionMode,\n type RootStyle,\n SHADOW_PRESETS,\n type StyleKey,\n type TextAlign,\n type TextTransform,\n} from \"@/lib/editor/types\";\nimport {\n ColorInput,\n Group,\n More,\n NumberInput,\n Overridable,\n Segmented,\n SelectInput,\n SizeField,\n SliderInput,\n TextArea,\n TextInput,\n} from \"./fields\";\n\ntype Ctx = {\n element: CanvasElement;\n elements: CanvasElement[];\n style: ElementStyle;\n breakpoint: Breakpoint;\n parentLayout: LayoutMode;\n onStyle: (patch: Partial<ElementStyle>) => void;\n onReset: (keys: StyleKey[]) => void;\n onProps: (patch: Partial<CanvasElement>) => void;\n onCommitStart: () => void;\n onCommitEnd: () => void;\n /** Page data sources, for the Repeat picker. */\n sources: DataSource[];\n /** Field names sampled from the enclosing Repeat's source. */\n bindingKeys: string[];\n /** Whether this element sits inside a Repeat, so binding is meaningful. */\n insideRepeat: boolean;\n};\n\ntype Wrap = (keys: StyleKey[], node: React.ReactNode) => React.ReactNode;\n\n/**\n * Wraps a control so it shows \u2014 and can undo \u2014 an override set at the current\n * breakpoint. Every style field goes through this, otherwise there is no way to\n * tell an inherited value from one set here.\n */\nfunction makeOverridable(ctx: Ctx): Wrap {\n return (keys, node) => (\n <Overridable\n overridden={keys.some((key) => hasOverride(ctx.element, ctx.breakpoint, key))}\n onReset={() => ctx.onReset(keys)}\n >\n {node}\n </Overridable>\n );\n}\n\nexport function Inspector({\n tab,\n ...ctx\n}: Ctx & { tab: \"Design\" | \"Content\" | \"Hover\" | \"Interact\" }) {\n if (tab === \"Content\") return <ContentTab {...ctx} />;\n if (tab === \"Hover\") return <HoverTab {...ctx} />;\n if (tab === \"Interact\") return <InteractionTab {...ctx} />;\n return <DesignTab {...ctx} />;\n}\n\nfunction InteractionTab({ element, elements, onProps }: Ctx) {\n const interaction = element.interaction;\n const action = interaction?.action ?? \"navigate\";\n return (\n <div className=\"flex flex-col gap-4\">\n <p className=\"text-[10px] leading-relaxed text-ed-muted\">Create navigation or control another layer. Toggle/show/hide powers menus, dropdowns, accordions and overlays.</p>\n <Group title=\"On click\">\n <SelectInput label=\"Action\" value={action} options={[{ label: \"Navigate\", value: \"navigate\" as const }, { label: \"Scroll to layer\", value: \"scroll-to\" as const }, { label: \"Toggle layer\", value: \"toggle-layer\" as const }, { label: \"Show layer\", value: \"show-layer\" as const }, { label: \"Hide layer\", value: \"hide-layer\" as const }]} onChange={(nextAction) => onProps({ interaction: { trigger: \"click\", action: nextAction, value: interaction?.value ?? \"\", target: interaction?.target ?? \"_self\" } })} />\n {action === \"navigate\" ? <TextInput label=\"URL\" value={interaction?.value ?? \"\"} placeholder=\"https://\u2026 or /s/about\" onChange={(value) => onProps({ interaction: { trigger: \"click\", action, value, target: interaction?.target ?? \"_self\" } })} /> : <SelectInput label=\"Target layer\" value={interaction?.value ?? \"\"} options={[{ label: \"Choose a layer\u2026\", value: \"\" }, ...elements.filter((candidate) => candidate.id !== element.id).map((candidate) => ({ label: candidate.name || candidate.type, value: candidate.id }))]} onChange={(value) => onProps({ interaction: { trigger: \"click\", action, value, target: \"_self\" } })} />}\n {action === \"navigate\" && <SelectInput label=\"Opens\" value={interaction?.target ?? \"_self\"} options={[{ label: \"Same tab\", value: \"_self\" as const }, { label: \"New tab\", value: \"_blank\" as const }]} onChange={(target) => onProps({ interaction: { trigger: \"click\", action, value: interaction?.value ?? \"\", target } })} />}\n {interaction && <button type=\"button\" onClick={() => onProps({ interaction: undefined })} className=\"self-start rounded-md px-2 py-1 text-[10px] text-ed-faint hover:bg-ed-field hover:text-red-400\">Remove interaction</button>}\n </Group>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------- design */\n\nfunction DesignTab(ctx: Ctx) {\n const { element } = ctx;\n const ov = makeOverridable(ctx);\n const textual = isTextual(element.type);\n\n return (\n <div className=\"flex flex-col divide-y divide-ed-border\">\n <SizeGroup ctx={ctx} ov={ov} />\n {isContainer(element.type) && <LayoutGroup ctx={ctx} ov={ov} />}\n {/* The group most likely to be edited for this element opens first. */}\n {textual && <TypographyGroup ctx={ctx} ov={ov} />}\n <FillGroup ctx={ctx} ov={ov} defaultOpen={!textual} />\n <SpacingGroup ctx={ctx} ov={ov} />\n <EffectsGroup ctx={ctx} ov={ov} />\n <CompositionGroup ctx={ctx} ov={ov} />\n <MotionGroup ctx={ctx} ov={ov} />\n </div>\n );\n}\n\nfunction SizeGroup({ ctx, ov }: { ctx: Ctx; ov: Wrap }) {\n const { style, parentLayout, onStyle, onCommitStart, onCommitEnd } = ctx;\n\n return (\n <Group title=\"Size\">\n {ov(\n [\"widthMode\", \"w\"],\n <SizeField\n axis=\"W\"\n mode={style.widthMode}\n value={style.w}\n onMode={(widthMode) => onStyle({ widthMode })}\n onValue={(w) => onStyle({ w })}\n onCommitStart={onCommitStart}\n onCommitEnd={onCommitEnd}\n />,\n )}\n {ov(\n [\"heightMode\", \"h\"],\n <SizeField\n axis=\"H\"\n mode={style.heightMode}\n value={style.h}\n onMode={(heightMode) => onStyle({ heightMode })}\n onValue={(h) => onStyle({ h })}\n onCommitStart={onCommitStart}\n onCommitEnd={onCommitEnd}\n />,\n )}\n\n {/* x/y only mean anything when the parent positions absolutely. */}\n {parentLayout === \"absolute\" && (\n <More label=\"Position\">\n {ov(\n [\"x\"],\n <NumberInput\n label=\"X\"\n suffix=\"px\"\n value={style.x}\n onChange={(x) => onStyle({ x })}\n onCommitStart={onCommitStart}\n onCommitEnd={onCommitEnd}\n />,\n )}\n {ov(\n [\"y\"],\n <NumberInput\n label=\"Y\"\n suffix=\"px\"\n value={style.y}\n onChange={(y) => onStyle({ y })}\n onCommitStart={onCommitStart}\n onCommitEnd={onCommitEnd}\n />,\n )}\n {ov(\n [\"constraintX\"],\n <SelectInput\n label=\"Horizontal\"\n value={style.constraintX}\n options={[\n { label: \"Left\", value: \"start\" as Constraint },\n { label: \"Center\", value: \"center\" as Constraint },\n { label: \"Right\", value: \"end\" as Constraint },\n { label: \"Left & right\", value: \"stretch\" as Constraint },\n ]}\n onChange={(constraintX) => onStyle({ constraintX })}\n />,\n )}\n {ov(\n [\"constraintY\"],\n <SelectInput\n label=\"Vertical\"\n value={style.constraintY}\n options={[\n { label: \"Top\", value: \"start\" as Constraint },\n { label: \"Center\", value: \"center\" as Constraint },\n { label: \"Bottom\", value: \"end\" as Constraint },\n { label: \"Top & bottom\", value: \"stretch\" as Constraint },\n ]}\n onChange={(constraintY) => onStyle({ constraintY })}\n />,\n )}\n </More>\n )}\n </Group>\n );\n}\n\nfunction LayoutGroup({ ctx, ov }: { ctx: Ctx; ov: Wrap }) {\n const { style, onStyle, element } = ctx;\n const isGrid = element.type === \"Grid\";\n\n return (\n <Group title=\"Layout\">\n {ov(\n [\"layout\"],\n <Segmented\n label=\"Mode\"\n value={style.layout}\n options={[\n { label: \"Stack\", value: \"stack\" as LayoutMode },\n { label: \"Free\", value: \"absolute\" as LayoutMode },\n ]}\n onChange={(layout) => onStyle({ layout })}\n />,\n )}\n\n {style.layout === \"stack\" && (\n <>\n {isGrid\n ? ov(\n [\"columns\"],\n <NumberInput\n label=\"Columns\"\n min={1}\n max={12}\n value={style.columns}\n onChange={(columns) => onStyle({ columns })}\n />,\n )\n : ov(\n [\"direction\"],\n <Segmented\n label=\"Flow\"\n value={style.direction}\n options={[\n {\n label: \"Row\",\n value: \"row\" as Direction,\n icon: <IconArrowsHorizontal size={12} />,\n },\n {\n label: \"Column\",\n value: \"column\" as Direction,\n icon: <IconArrowsVertical size={12} />,\n },\n ]}\n onChange={(direction) => onStyle({ direction })}\n />,\n )}\n\n {ov(\n [\"gap\"],\n <NumberInput\n label=\"Gap\"\n suffix=\"px\"\n min={0}\n value={style.gap}\n onChange={(gap) => onStyle({ gap })}\n />,\n )}\n\n <More label=\"Alignment\">\n {ov(\n [\"align\"],\n <Segmented\n label=\"Align\"\n value={style.align}\n options={[\n { label: \"Start\", value: \"start\" as Align },\n { label: \"Center\", value: \"center\" as Align },\n { label: \"End\", value: \"end\" as Align },\n { label: \"Stretch\", value: \"stretch\" as Align },\n ]}\n onChange={(align) => onStyle({ align })}\n />,\n )}\n {!isGrid &&\n ov(\n [\"justify\"],\n <Segmented\n label=\"Spread\"\n value={style.justify}\n options={[\n { label: \"Start\", value: \"start\" as Justify },\n { label: \"Center\", value: \"center\" as Justify },\n { label: \"End\", value: \"end\" as Justify },\n { label: \"Space\", value: \"between\" as Justify },\n ]}\n onChange={(justify) => onStyle({ justify })}\n />,\n )}\n {!isGrid &&\n ov(\n [\"wrap\"],\n <Segmented\n label=\"Wrap\"\n value={style.wrap ? \"on\" : \"off\"}\n options={[\n { label: \"Off\", value: \"off\" },\n { label: \"On\", value: \"on\" },\n ]}\n onChange={(value) => onStyle({ wrap: value === \"on\" })}\n />,\n )}\n </More>\n </>\n )}\n </Group>\n );\n}\n\nfunction SpacingGroup({ ctx, ov }: { ctx: Ctx; ov: Wrap }) {\n const { style, onStyle } = ctx;\n const uniform =\n style.padT === style.padR &&\n style.padR === style.padB &&\n style.padB === style.padL;\n\n return (\n <Group title=\"Spacing\" defaultOpen={false}>\n {ov(\n [\"padT\", \"padR\", \"padB\", \"padL\"],\n <NumberInput\n label={uniform ? \"Padding\" : \"Padding (mixed)\"}\n suffix=\"px\"\n min={0}\n value={style.padT}\n onChange={(value) =>\n onStyle({ padT: value, padR: value, padB: value, padL: value })\n }\n />,\n )}\n <More label=\"Per side\">\n {ov(\n [\"padT\"],\n <NumberInput\n label=\"Top\"\n suffix=\"px\"\n min={0}\n value={style.padT}\n onChange={(padT) => onStyle({ padT })}\n />,\n )}\n {ov(\n [\"padR\"],\n <NumberInput\n label=\"Right\"\n suffix=\"px\"\n min={0}\n value={style.padR}\n onChange={(padR) => onStyle({ padR })}\n />,\n )}\n {ov(\n [\"padB\"],\n <NumberInput\n label=\"Bottom\"\n suffix=\"px\"\n min={0}\n value={style.padB}\n onChange={(padB) => onStyle({ padB })}\n />,\n )}\n {ov(\n [\"padL\"],\n <NumberInput\n label=\"Left\"\n suffix=\"px\"\n min={0}\n value={style.padL}\n onChange={(padL) => onStyle({ padL })}\n />,\n )}\n </More>\n </Group>\n );\n}\n\nconst GRADIENT_PRESETS = [\n \"linear-gradient(135deg,#6366f1,#a855f7)\",\n \"linear-gradient(135deg,#0ea5e9,#22d3ee)\",\n \"linear-gradient(135deg,#f97316,#ef4444)\",\n \"linear-gradient(180deg,rgba(0,0,0,0),rgba(0,0,0,.6))\",\n];\n\nfunction FillGroup({\n ctx,\n ov,\n defaultOpen,\n}: {\n ctx: Ctx;\n ov: Wrap;\n defaultOpen: boolean;\n}) {\n const { style, onStyle } = ctx;\n\n return (\n <Group title=\"Fill\" defaultOpen={defaultOpen}>\n {ov(\n [\"bg\"],\n <ColorInput\n label=\"Background\"\n value={style.bg}\n placeholder=\"transparent\"\n onChange={(bg) => onStyle({ bg })}\n />,\n )}\n <More label=\"Gradient\">\n <div className=\"flex gap-1\">\n {GRADIENT_PRESETS.map((preset) => (\n <button\n type=\"button\"\n key={preset}\n aria-label=\"Apply gradient preset\"\n onClick={() => onStyle({ gradient: preset })}\n className=\"h-5 flex-1 rounded border border-ed-border\"\n style={{ backgroundImage: preset }}\n />\n ))}\n <button\n type=\"button\"\n onClick={() => onStyle({ gradient: \"\" })}\n className=\"h-5 flex-1 rounded border border-ed-border text-[9px] text-ed-muted hover:text-ed-text\"\n >\n None\n </button>\n </div>\n {ov(\n [\"gradient\"],\n <TextInput\n label=\"Custom\"\n value={style.gradient}\n placeholder=\"linear-gradient(...)\"\n onChange={(gradient) => onStyle({ gradient })}\n />,\n )}\n </More>\n </Group>\n );\n}\n\nfunction TypographyGroup({ ctx, ov }: { ctx: Ctx; ov: Wrap }) {\n const { style, onStyle } = ctx;\n\n return (\n <Group title=\"Text\">\n {ov(\n [\"color\"],\n <ColorInput\n label=\"Colour\"\n value={style.color}\n onChange={(color) => onStyle({ color })}\n />,\n )}\n {ov(\n [\"fontSize\"],\n <NumberInput\n label=\"Size\"\n suffix=\"px\"\n min={1}\n value={style.fontSize}\n onChange={(fontSize) => onStyle({ fontSize })}\n />,\n )}\n {ov(\n [\"lineHeight\"],\n <NumberInput\n label=\"Line height\"\n min={0.5}\n max={10}\n step={0.05}\n value={style.lineHeight}\n onChange={(lineHeight) => onStyle({ lineHeight })}\n />,\n )} {ov(\n [\"fontWeight\"],\n <SelectInput\n label=\"Weight\"\n value={style.fontWeight}\n options={[\n { label: \"Light\", value: \"300\" },\n { label: \"Normal\", value: \"normal\" },\n { label: \"Medium\", value: \"500\" },\n { label: \"Semibold\", value: \"600\" },\n { label: \"Bold\", value: \"bold\" },\n { label: \"Black\", value: \"800\" },\n ]}\n onChange={(fontWeight) => onStyle({ fontWeight })}\n />,\n )}\n {ov(\n [\"textAlign\"],\n <Segmented\n label=\"Align\"\n value={style.textAlign}\n options={[\n {\n label: \"Left\",\n value: \"left\" as TextAlign,\n icon: <IconAlignBoxLeftMiddle size={12} />,\n },\n {\n label: \"Center\",\n value: \"center\" as TextAlign,\n icon: <IconAlignBoxCenterMiddle size={12} />,\n },\n {\n label: \"Right\",\n value: \"right\" as TextAlign,\n icon: <IconAlignBoxRightMiddle size={12} />,\n },\n { label: \"Justify\", value: \"justify\" as TextAlign },\n ]}\n onChange={(textAlign) => onStyle({ textAlign })}\n />,\n )}\n\n <More>\n {ov(\n [\"fontFamily\"],\n <SelectInput\n label=\"Font\"\n value={style.fontFamily}\n options={FONT_STACKS}\n onChange={(fontFamily) => onStyle({ fontFamily })}\n />,\n )}\n {ov(\n [\"letterSpacing\"],\n <NumberInput\n label=\"Tracking\"\n suffix=\"px\"\n step={0.1}\n value={style.letterSpacing}\n onChange={(letterSpacing) => onStyle({ letterSpacing })}\n />,\n )}\n {ov(\n [\"textTransform\"],\n <SelectInput\n label=\"Case\"\n value={style.textTransform}\n options={[\n { label: \"As typed\", value: \"none\" as TextTransform },\n { label: \"UPPERCASE\", value: \"uppercase\" as TextTransform },\n { label: \"lowercase\", value: \"lowercase\" as TextTransform },\n { label: \"Capitalize\", value: \"capitalize\" as TextTransform },\n ]}\n onChange={(textTransform) => onStyle({ textTransform })}\n />,\n )}\n </More>\n </Group>\n );\n}\n\nfunction EffectsGroup({ ctx, ov }: { ctx: Ctx; ov: Wrap }) {\n const { style, onStyle, onCommitStart, onCommitEnd } = ctx;\n const knownShadow = SHADOW_PRESETS.some((p) => p.value === style.shadow);\n\n return (\n <Group title=\"Effects\" defaultOpen={false}>\n {ov(\n [\"radius\"],\n <NumberInput\n label=\"Corner radius\"\n suffix=\"px\"\n min={0}\n value={style.radius}\n onChange={(radius) => onStyle({ radius })}\n />,\n )}\n {ov(\n [\"shadow\"],\n <SelectInput\n label=\"Shadow\"\n value={knownShadow ? style.shadow : \"custom\"}\n options={\n knownShadow\n ? SHADOW_PRESETS\n : [...SHADOW_PRESETS, { label: \"Custom\", value: \"custom\" }]\n }\n onChange={(shadow) => {\n if (shadow !== \"custom\") onStyle({ shadow });\n }}\n />,\n )}\n {ov(\n [\"opacity\"],\n <SliderInput\n label=\"Opacity\"\n min={0}\n max={100}\n suffix=\"%\"\n value={style.opacity}\n onChange={(opacity) => onStyle({ opacity })}\n onCommitStart={onCommitStart}\n onCommitEnd={onCommitEnd}\n />,\n )}\n\n <More label=\"Border and rotation\">\n {ov(\n [\"borderW\"],\n <NumberInput\n label=\"Border\"\n suffix=\"px\"\n min={0}\n value={style.borderW}\n onChange={(borderW) => onStyle({ borderW })}\n />,\n )}\n {ov(\n [\"borderStyle\"],\n <SelectInput\n label=\"Style\"\n value={style.borderStyle}\n options={[\n { label: \"Solid\", value: \"solid\" as const },\n { label: \"Dashed\", value: \"dashed\" as const },\n { label: \"Dotted\", value: \"dotted\" as const },\n ]}\n onChange={(borderStyle) => onStyle({ borderStyle })}\n />,\n )} {style.borderW > 0 &&\n ov(\n [\"borderC\"],\n <ColorInput\n label=\"Colour\"\n value={style.borderC}\n onChange={(borderC) => onStyle({ borderC })}\n />,\n )}\n {ov(\n [\"rotate\"],\n <SliderInput\n label=\"Rotate\"\n min={-180}\n max={180}\n suffix=\"\u00B0\"\n value={style.rotate}\n onChange={(rotate) => onStyle({ rotate })}\n onCommitStart={onCommitStart}\n onCommitEnd={onCommitEnd}\n />,\n )}\n </More>\n </Group>\n );\n}\n\n/**\n * The pieces that turn a stack of boxes into a designed page: clipping,\n * sticky rails, imagery, glass and blend effects.\n */\nfunction CompositionGroup({ ctx, ov }: { ctx: Ctx; ov: Wrap }) {\n const { style, onStyle, onCommitStart, onCommitEnd } = ctx;\n\n return (\n <Group title=\"Composition\" defaultOpen={false}>\n {ov(\n [\"overflow\"],\n <SelectInput\n label=\"Overflow\"\n value={style.overflow}\n options={[\n { label: \"Visible\", value: \"visible\" as const },\n { label: \"Clip\", value: \"hidden\" as const },\n { label: \"Scroll if needed\", value: \"auto\" as const },\n { label: \"Always scroll\", value: \"scroll\" as const },\n ]}\n onChange={(overflow) => onStyle({ overflow })}\n />,\n )}\n {ov(\n [\"aspectRatio\"],\n <SelectInput\n label=\"Ratio\"\n value={style.aspectRatio}\n options={ASPECT_RATIOS}\n onChange={(aspectRatio) => onStyle({ aspectRatio })}\n />,\n )}\n {ov(\n [\"position\"],\n <Segmented\n label=\"Pin\"\n value={style.position}\n options={[\n { label: \"Off\", value: \"static\" as PositionMode },\n { label: \"Sticky\", value: \"sticky\" as PositionMode },\n ]}\n onChange={(position) => onStyle({ position })}\n />,\n )}\n {style.position === \"sticky\" &&\n ov(\n [\"stickyOffset\"],\n <NumberInput\n label=\"Stops at\"\n suffix=\"px\"\n value={style.stickyOffset}\n onChange={(stickyOffset) => onStyle({ stickyOffset })}\n />,\n )}\n\n <More label=\"Image and effects\">\n {ov(\n [\"bgImage\"],\n <TextInput\n label=\"Image\"\n value={style.bgImage}\n placeholder=\"https://\u2026\"\n onChange={(bgImage) => onStyle({ bgImage })}\n />,\n )}\n {style.bgImage !== \"\" && (\n <>\n {ov(\n [\"bgSize\"],\n <Segmented\n label=\"Fit\"\n value={style.bgSize}\n options={[\n { label: \"Cover\", value: \"cover\" as BgSize },\n { label: \"Contain\", value: \"contain\" as BgSize },\n { label: \"Actual\", value: \"auto\" as BgSize },\n ]}\n onChange={(bgSize) => onStyle({ bgSize })}\n />,\n )}\n {ov(\n [\"bgPosition\"],\n <TextInput\n label=\"Focus\"\n value={style.bgPosition}\n placeholder=\"center\"\n onChange={(bgPosition) => onStyle({ bgPosition })}\n />,\n )}\n </>\n )}\n {ov(\n [\"backdropBlur\"],\n <SliderInput\n label=\"Glass\"\n min={0}\n max={40}\n suffix=\"px\"\n value={style.backdropBlur}\n onChange={(backdropBlur) => onStyle({ backdropBlur })}\n onCommitStart={onCommitStart}\n onCommitEnd={onCommitEnd}\n />,\n )}\n {ov(\n [\"blur\"],\n <SliderInput\n label=\"Blur\"\n min={0}\n max={40}\n suffix=\"px\"\n value={style.blur}\n onChange={(blur) => onStyle({ blur })}\n onCommitStart={onCommitStart}\n onCommitEnd={onCommitEnd}\n />,\n )}\n {ov(\n [\"scale\"],\n <SliderInput\n label=\"Scale\"\n min={10}\n max={300}\n suffix=\"%\"\n value={style.scale}\n onChange={(scale) => onStyle({ scale })}\n onCommitStart={onCommitStart}\n onCommitEnd={onCommitEnd}\n />,\n )}\n {ov(\n [\"blendMode\"],\n <SelectInput\n label=\"Blend\"\n value={style.blendMode}\n options={[\n { label: \"Normal\", value: \"normal\" as BlendMode },\n { label: \"Multiply\", value: \"multiply\" as BlendMode },\n { label: \"Screen\", value: \"screen\" as BlendMode },\n { label: \"Overlay\", value: \"overlay\" as BlendMode },\n { label: \"Darken\", value: \"darken\" as BlendMode },\n { label: \"Lighten\", value: \"lighten\" as BlendMode },\n { label: \"Difference\", value: \"difference\" as BlendMode },\n { label: \"Luminosity\", value: \"luminosity\" as BlendMode },\n ]}\n onChange={(blendMode) => onStyle({ blendMode })}\n />,\n )}\n </More>\n </Group>\n );\n}\n\n/** Entrance effects play on the published page and in Preview, not on canvas. */\nfunction MotionGroup({ ctx, ov }: { ctx: Ctx; ov: Wrap }) {\n const { style, onStyle } = ctx;\n\n return (\n <Group title=\"Motion\" defaultOpen={false}>\n {ov(\n [\"entrance\"],\n <SelectInput\n label=\"Entrance\"\n value={style.entrance}\n options={ENTRANCES}\n onChange={(entrance) => onStyle({ entrance })}\n />,\n )}\n {style.entrance !== \"none\" && (\n <>\n {ov(\n [\"entranceDuration\"],\n <NumberInput\n label=\"Duration\"\n suffix=\"ms\"\n min={50}\n max={5000}\n step={50}\n value={style.entranceDuration}\n onChange={(entranceDuration) => onStyle({ entranceDuration })}\n />,\n )}\n {ov(\n [\"entranceDelay\"],\n <NumberInput\n label=\"Delay\"\n suffix=\"ms\"\n min={0}\n max={5000}\n step={50}\n value={style.entranceDelay}\n onChange={(entranceDelay) => onStyle({ entranceDelay })}\n />,\n )}\n <p className=\"text-[10px] leading-relaxed text-ed-faint\">\n Plays once as the element scrolls into view. The canvas shows\n the finished state \u2014 use Preview to watch it.\n </p>\n </>\n )}\n </Group>\n );\n}\n\n/* ------------------------------------------------------------------ content */\n\nfunction ContentTab({ element, onProps, sources, bindingKeys, insideRepeat }: Ctx) {\n return (\n <div className=\"flex flex-col divide-y divide-ed-border\">\n {(element.type === \"Repeat\" || element.type === \"Request\") && (\n <Group title=\"Data\">\n <SelectInput\n label=\"Source\"\n value={element.sourceId ?? \"\"}\n options={[\n { label: \"Choose a source\u2026\", value: \"\" },\n ...sources.map((s) => ({ label: s.name, value: s.id })),\n ]}\n onChange={(sourceId) => onProps({ sourceId })}\n />\n <p className=\"text-[10px] leading-relaxed text-ed-faint\">\n {element.type === \"Request\"\n ? \"Fetches on the server and renders its children once with the returned object. Bind child fields such as title or user.name.\"\n : \"Whatever you put inside this block is the template \u2014 it renders once per row. Add sources in the Data panel.\"}\n </p>\n </Group>\n )}\n\n {!insideRepeat && element.type !== \"Repeat\" && element.type !== \"Request\" && (\n <Group title=\"Request result\">\n <SelectInput\n label=\"Source\"\n value={element.sourceId ?? \"\"}\n options={[\n { label: \"Not connected\", value: \"\" },\n ...sources.map((source) => ({ label: source.name, value: source.id })),\n ]}\n onChange={(sourceId) => onProps({ sourceId: sourceId || undefined, binding: sourceId ? element.binding : undefined })}\n />\n {element.sourceId && (bindingKeys.length > 0 ? (\n <SelectInput\n label=\"Field\"\n value={element.binding ?? \"\"}\n options={[{ label: \"Choose a field\u2026\", value: \"\" }, ...bindingKeys.map((key) => ({ label: key, value: key }))]}\n onChange={(binding) => onProps({ binding: binding || undefined })}\n />\n ) : (\n <TextInput\n label=\"Field\"\n value={element.binding ?? \"\"}\n placeholder=\"title, author.name or image.url\"\n onChange={(binding) => onProps({ binding: binding || undefined })}\n />\n ))}\n <p className=\"text-[10px] leading-relaxed text-ed-faint\">\n Uses the returned object directly. Repeat is only needed when you want to render every item in a list.\n </p>\n </Group>\n )}\n\n {insideRepeat && element.type !== \"Repeat\" && element.type !== \"Request\" && (\n <Group title=\"Bound field\">\n {bindingKeys.length > 0 ? (\n <SelectInput\n label=\"Field\"\n value={element.binding ?? \"\"}\n options={[\n { label: \"Not bound\", value: \"\" },\n ...bindingKeys.map((key) => ({ label: key, value: key })),\n ]}\n onChange={(binding) => onProps({ binding: binding || undefined })}\n />\n ) : (\n <TextInput\n label=\"Field\"\n value={element.binding ?? \"\"}\n placeholder=\"title, or author.name\"\n onChange={(binding) => onProps({ binding: binding || undefined })}\n />\n )}\n <p className=\"text-[10px] leading-relaxed text-ed-faint\">\n {element.type === \"Image\" || element.type === \"Video\"\n ? \"The field supplies this element's source URL.\"\n : \"The field supplies this element's text.\"}\n </p>\n </Group>\n )}\n\n {isTextual(element.type) && (\n <Group title=\"Text\">\n <TextArea\n label=\"Content\"\n value={element.content ?? \"\"}\n onChange={(content) => onProps({ content })}\n />\n </Group>\n )}\n\n {element.type === \"Image\" && (\n <Group title=\"Image\">\n <TextInput\n label=\"Source\"\n value={element.src ?? \"\"}\n placeholder=\"https://\u2026\"\n onChange={(src) => onProps({ src })}\n />\n <TextInput\n label=\"Alt text\"\n value={element.alt ?? \"\"}\n placeholder=\"Describes the image\"\n onChange={(alt) => onProps({ alt })}\n />\n <SelectInput\n label=\"Fit\"\n value={element.objectFit ?? \"cover\"}\n options={[\n { label: \"Cover\", value: \"cover\" as const },\n { label: \"Contain\", value: \"contain\" as const },\n { label: \"Stretch\", value: \"fill\" as const },\n { label: \"Original\", value: \"none\" as const },\n ]}\n onChange={(objectFit) => onProps({ objectFit })}\n />\n </Group>\n )}\n\n {element.type === \"Video\" && (\n <Group title=\"Video\">\n <TextInput\n label=\"Embed URL\"\n value={element.src ?? \"\"}\n placeholder=\"https://www.youtube.com/embed/\u2026\"\n onChange={(src) => onProps({ src })}\n />\n <p className=\"text-[10px] leading-relaxed text-ed-faint\">\n Use the provider's embed URL \u2014 a normal watch link will be\n refused by the site it points at.\n </p>\n </Group>\n )}\n\n {element.type === \"Icon\" && (\n <Group title=\"Icon\">\n <SelectInput\n label=\"Glyph\"\n value={element.iconName ?? \"star\"}\n options={[\n { label: \"Star\", value: \"star\" as const },\n { label: \"Heart\", value: \"heart\" as const },\n { label: \"Arrow right\", value: \"arrow-right\" as const },\n { label: \"Check\", value: \"check\" as const },\n { label: \"Menu\", value: \"menu\" as const },\n { label: \"Search\", value: \"search\" as const },\n ]}\n onChange={(iconName) => onProps({ iconName })}\n />\n </Group>\n )}\n\n <Group title=\"Link\" defaultOpen={false}>\n <TextInput\n label=\"URL\"\n value={element.href ?? \"\"}\n placeholder=\"https://\u2026 or /s/about\"\n onChange={(href) => onProps({ href })}\n />\n <SelectInput\n label=\"Opens\"\n value={element.target ?? \"_self\"}\n options={[\n { label: \"Same tab\", value: \"_self\" as const },\n { label: \"New tab\", value: \"_blank\" as const },\n ]}\n onChange={(target) => onProps({ target })}\n />\n </Group>\n\n <Group title=\"Layer name\" defaultOpen={false}>\n <TextInput\n label=\"Name\"\n value={element.name ?? \"\"}\n placeholder={element.type}\n onChange={(name) => onProps({ name })}\n />\n </Group>\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- hover */\n\nfunction bezierValues(value: string): [number, number, number, number] {\n const values = value.split(\",\").map((part) => Number(part.trim()));\n return values.length === 4 && values.every(Number.isFinite)\n ? [values[0], values[1], values[2], values[3]]\n : [0.44, 0, 0.56, 1];\n}\n\nfunction BezierEditor({ value, onChange }: { value: string; onChange: (value: string) => void }) {\n const points = bezierValues(value);\n const px = (x: number) => 20 + x * 120;\n const py = (y: number) => 84 - y * 68;\n const begin = (event: React.PointerEvent<SVGCircleElement>, point: 0 | 1) => {\n event.preventDefault();\n const svg = event.currentTarget.ownerSVGElement;\n if (!svg) return;\n const move = (pointer: PointerEvent) => {\n const rect = svg.getBoundingClientRect();\n const x = Math.max(0, Math.min(1, ((pointer.clientX - rect.left) / rect.width * 160 - 20) / 120));\n const y = Math.max(-1, Math.min(2, (84 - (pointer.clientY - rect.top) / rect.height * 100) / 68));\n const next = [...points] as [number, number, number, number];\n next[point * 2] = x;\n next[point * 2 + 1] = y;\n onChange(next.map((number) => Number(number.toFixed(2))).join(\", \"));\n };\n const up = () => { window.removeEventListener(\"pointermove\", move); window.removeEventListener(\"pointerup\", up); };\n window.addEventListener(\"pointermove\", move);\n window.addEventListener(\"pointerup\", up, { once: true });\n };\n return <div className=\"rounded-xl bg-white/5 p-2\"><svg viewBox=\"0 0 160 100\" className=\"h-36 w-full touch-none overflow-visible\"><path d=\"M20 84H140M20 16V84\" fill=\"none\" stroke=\"rgba(255,255,255,.08)\" strokeWidth=\"1\"/><line x1=\"20\" y1=\"84\" x2={px(points[0])} y2={py(points[1])} stroke=\"#52525b\"/><line x1=\"140\" y1=\"16\" x2={px(points[2])} y2={py(points[3])} stroke=\"#52525b\"/><path d={`M20 84 C${px(points[0])} ${py(points[1])}, ${px(points[2])} ${py(points[3])}, 140 16`} fill=\"none\" stroke=\"#a1a1aa\" strokeWidth=\"2.2\"/><circle cx=\"20\" cy=\"84\" r=\"4\" fill=\"#fff\"/><circle cx=\"140\" cy=\"16\" r=\"4\" fill=\"#fff\"/><circle cx={px(points[0])} cy={py(points[1])} r=\"6\" fill=\"#4f8cff\" stroke=\"white\" strokeWidth=\"2\" className=\"cursor-grab active:cursor-grabbing\" onPointerDown={(event) => begin(event, 0)}/><circle cx={px(points[2])} cy={py(points[3])} r=\"6\" fill=\"#4f8cff\" stroke=\"white\" strokeWidth=\"2\" className=\"cursor-grab active:cursor-grabbing\" onPointerDown={(event) => begin(event, 1)}/></svg><div className=\"grid grid-cols-4 gap-1\">{points.map((number, index) => <label key={index} className=\"rounded-md bg-black/20 px-1.5 py-1 text-center font-mono text-[9px] text-zinc-400\"><span className=\"mr-1 text-zinc-600\">{[\"X1\", \"Y1\", \"X2\", \"Y2\"][index]}</span>{number}</label>)}</div></div>;\n}\n\nfunction HoverTab({ element, style, onProps, onStyle }: Ctx) {\n const hover = element.hover ?? {};\n const active = Object.keys(hover).length > 0;\n const [addOpen, setAddOpen] = useState(false);\n const [transitionOpen, setTransitionOpen] = useState(false);\n const setHover = (patch: Partial<ElementStyle>) =>\n onProps({ hover: { ...hover, ...patch } });\n const addEffect = (name: string) => {\n setAddOpen(false);\n if (name === \"Appear\") setTransitionOpen(true);\n if (name === \"Hover\") onProps({ hover: { ...hover, scale: hover.scale ?? 103 } });\n if (name === \"Press\") onProps({ press: { ...(element.press ?? {}), scale: element.press?.scale ?? 96, opacity: element.press?.opacity ?? 92 } });\n if (name === \"Loop\") onProps({ loop: element.loop ?? { type: \"pulse\", duration: 1600 } });\n if (name === \"Drag\") onProps({ draggable: true });\n if (name === \"Scroll\") { onStyle({ entrance: style.entrance === \"none\" ? \"up\" : style.entrance }); setTransitionOpen(true); }\n };\n const previewEntrance = () => {\n const frames = Array.from(document.querySelectorAll<HTMLElement>(`[data-canvas-element=\"${element.id}\"]`));\n const from: Keyframe = style.entrance === \"zoom\" ? { opacity: 0, scale: 0.94 } : style.entrance === \"left\" ? { opacity: 0, translate: \"-32px 0\" } : style.entrance === \"right\" ? { opacity: 0, translate: \"32px 0\" } : style.entrance === \"down\" ? { opacity: 0, translate: \"0 -28px\" } : style.entrance === \"fade\" ? { opacity: 0 } : { opacity: 0, translate: \"0 28px\" };\n const easing = style.entranceCurve === \"spring\" ? `cubic-bezier(.16,${1 + Math.max(0, 45 - style.springDamping) / 100},${Math.max(0.12, Math.min(0.52, 120 / style.springStiffness))},1)` : `cubic-bezier(${style.entranceBezier})`;\n for (const frame of frames) frame.animate([from, { opacity: 1, translate: \"none\", scale: 1 }], { duration: style.entranceDuration, delay: style.entranceDelay, easing, fill: \"both\" });\n };\n\n return (\n <div className=\"relative flex flex-col gap-3\">\n <div className=\"relative rounded-xl border border-ed-border bg-ed-subtle\">\n <div className=\"flex items-center justify-between border-b border-ed-border px-3 py-2.5\"><span className=\"text-[11px] font-semibold text-ed-text\">Effects</span><button type=\"button\" onClick={() => setAddOpen((value) => !value)} className=\"rounded-md p-1 text-ed-muted hover:bg-ed-field hover:text-ed-text\"><IconPlus size={14} /></button></div>\n <button type=\"button\" onClick={() => setTransitionOpen(true)} className=\"flex w-full items-center justify-between border-b border-ed-border px-3 py-2.5 text-left\"><span><span className=\"block text-[10px] font-medium text-ed-text\">Appear</span><span className=\"mt-0.5 block text-[9px] text-ed-faint\">{style.entrance === \"none\" ? \"None\" : `${style.entrance} \u00B7 ${style.entranceDuration / 1000}s`}</span></span><IconChevronRight size={13} className=\"text-ed-faint\" /></button>\n <div className=\"flex items-center justify-between px-3 py-2.5\"><span><span className=\"block text-[10px] font-medium text-ed-text\">Hover</span><span className=\"mt-0.5 block text-[9px] text-ed-faint\">{active ? `${Object.keys(hover).length} properties` : \"Not configured\"}</span></span><span className={`size-1.5 rounded-full ${active ? \"bg-ed-accent\" : \"bg-ed-border\"}`} /></div>\n {addOpen && <div className=\"absolute right-2 top-10 z-30 w-36 rounded-xl border border-ed-border bg-ed-surface p-1.5 shadow-2xl\">{[\"Appear\", \"Hover\", \"Press\", \"Loop\", \"Drag\", \"Scroll\"].map((name) => <button key={name} type=\"button\" onClick={() => addEffect(name)} className=\"flex w-full items-center justify-between rounded-lg px-3 py-2 text-left text-[10px] font-medium text-ed-muted hover:bg-ed-field hover:text-ed-text\"><span>{name}</span>{name === \"Scroll\" && <IconChevronRight size={12} />}</button>)}</div>}\n </div>\n <div className=\"rounded-xl border border-ed-border bg-ed-subtle\"><div className=\"flex items-center justify-between border-b border-ed-border px-3 py-2.5\"><span className=\"text-[10px] font-medium text-ed-text\">Overlays</span><IconPlus size={13} className=\"text-ed-faint\" /></div><div className=\"border-b border-ed-border px-3 py-2.5\"><SelectInput label=\"Cursor\" value={style.cursor} options={[{ label: \"Automatic\", value: \"auto\" as const }, { label: \"Pointer\", value: \"pointer\" as const }, { label: \"Text\", value: \"text\" as const }, { label: \"Grab\", value: \"grab\" as const }, { label: \"Zoom in\", value: \"zoom-in\" as const }, { label: \"Hidden\", value: \"none\" as const }]} onChange={(cursor) => onStyle({ cursor })} /></div><div className=\"flex items-center justify-between px-3 py-2.5\"><span className=\"text-[10px] font-medium text-ed-text\">Styles</span><IconPlus size={13} className=\"text-ed-faint\" /></div></div>\n\n <Group\n title=\"Hover state\"\n action={\n active ? (\n <button\n type=\"button\"\n onClick={() => onProps({ hover: undefined })}\n className=\"text-[10px] text-ed-muted transition-colors hover:text-ed-text\"\n >\n Clear\n </button>\n ) : null\n }\n >\n <ColorInput\n label=\"Background\"\n value={hover.bg ?? style.bg}\n onChange={(bg) => setHover({ bg })}\n />\n <ColorInput\n label=\"Text\"\n value={hover.color ?? style.color}\n onChange={(color) => setHover({ color })}\n />\n <SliderInput\n label=\"Opacity\"\n min={0}\n max={100}\n suffix=\"%\"\n value={hover.opacity ?? style.opacity}\n onChange={(opacity) => setHover({ opacity })}\n />\n <More>\n <ColorInput\n label=\"Border\"\n value={hover.borderC ?? style.borderC}\n onChange={(borderC) => setHover({ borderC })}\n />\n <SelectInput\n label=\"Shadow\"\n value={hover.shadow ?? style.shadow}\n options={SHADOW_PRESETS}\n onChange={(shadow) => setHover({ shadow })}\n />\n <NumberInput\n label=\"Corner radius\"\n suffix=\"px\"\n min={0}\n value={hover.radius ?? style.radius}\n onChange={(radius) => setHover({ radius })}\n />\n </More>\n </Group>\n\n {element.press && <Group title=\"Press state\" action={<button type=\"button\" onClick={() => onProps({ press: undefined })} className=\"text-[10px] text-ed-muted hover:text-red-400\">Remove</button>}><SliderInput label=\"Scale\" min={10} max={150} suffix=\"%\" value={element.press.scale ?? 96} onChange={(scale) => onProps({ press: { ...element.press, scale } })} /><SliderInput label=\"Opacity\" min={0} max={100} suffix=\"%\" value={element.press.opacity ?? 92} onChange={(opacity) => onProps({ press: { ...element.press, opacity } })} /></Group>}\n {element.loop && <Group title=\"Loop\" action={<button type=\"button\" onClick={() => onProps({ loop: undefined })} className=\"text-[10px] text-ed-muted hover:text-red-400\">Remove</button>}><SelectInput label=\"Motion\" value={element.loop.type} options={[{ label: \"Pulse\", value: \"pulse\" as const }, { label: \"Float\", value: \"float\" as const }, { label: \"Spin\", value: \"spin\" as const }]} onChange={(type) => onProps({ loop: { ...element.loop!, type } })} /><SliderInput label=\"Duration\" min={100} max={10000} suffix=\"ms\" value={element.loop.duration} onChange={(duration) => onProps({ loop: { ...element.loop!, duration } })} /></Group>}\n {element.draggable && <Group title=\"Drag\" action={<button type=\"button\" onClick={() => onProps({ draggable: undefined })} className=\"text-[10px] text-ed-muted hover:text-red-400\">Remove</button>}><p className=\"text-[10px] leading-relaxed text-ed-muted\">Visitors can drag this element freely on Preview and the published page.</p></Group>}\n\n {active && (\n <p className=\"text-[10px] text-ed-faint\">\n Overriding: {Object.keys(hover).join(\", \")}\n </p>\n )}\n {transitionOpen && <div className=\"absolute inset-x-0 top-0 z-40 max-h-[calc(100vh-150px)] overflow-y-auto rounded-2xl border border-ed-border bg-[#151515] p-3 shadow-2xl\"><div className=\"mb-3 flex items-center justify-between\"><button type=\"button\" onClick={previewEntrance} className=\"flex items-center gap-1.5 rounded-lg bg-white/5 px-2 py-1.5 text-[10px] font-semibold text-white hover:bg-white/10\"><IconPlayerPlay size={12} /> Preview</button><span className=\"text-[11px] font-semibold text-white\">Transition</span><button type=\"button\" onClick={() => setTransitionOpen(false)} className=\"rounded-md p-1 text-zinc-500 hover:bg-white/5 hover:text-white\"><IconX size={13} /></button></div><div className=\"mb-3 grid grid-cols-2 rounded-lg bg-white/5 p-0.5\"><button type=\"button\" onClick={() => onStyle({ entranceCurve: \"ease\" })} className={`rounded-md py-1.5 text-[10px] ${style.entranceCurve === \"ease\" ? \"bg-white/15 text-white\" : \"text-zinc-500\"}`}>Ease</button><button type=\"button\" onClick={() => onStyle({ entranceCurve: \"spring\" })} className={`rounded-md py-1.5 text-[10px] ${style.entranceCurve === \"spring\" ? \"bg-white/15 text-white\" : \"text-zinc-500\"}`}>Spring</button></div>{style.entranceCurve === \"ease\" ? <><BezierEditor value={style.entranceBezier} onChange={(entranceBezier) => onStyle({ entranceBezier })} /><SelectInput label=\"Preset\" value=\"custom\" options={[{ label: \"Custom\", value: \"custom\" }, { label: \"Ease\", value: \"0.25, 0.1, 0.25, 1\" }, { label: \"Ease in\", value: \"0.42, 0, 1, 1\" }, { label: \"Ease out\", value: \"0, 0, 0.58, 1\" }, { label: \"Ease in out\", value: \"0.42, 0, 0.58, 1\" }, { label: \"Snappy\", value: \"0.2, 0.8, 0.2, 1\" }, { label: \"Overshoot\", value: \"0.34, 1.56, 0.64, 1\" }]} onChange={(preset) => preset !== \"custom\" && onStyle({ entranceBezier: preset })} /><TextInput label=\"Bezier\" value={style.entranceBezier} onChange={(entranceBezier) => onStyle({ entranceBezier })} /></> : <div className=\"rounded-xl bg-white/5 p-3\"><svg viewBox=\"0 0 160 90\" className=\"h-28 w-full\"><path d=\"M15 75 C48 75 54 8 98 18 C124 25 130 10 145 15\" fill=\"none\" stroke=\"#a1a1aa\" strokeWidth=\"2\"/><circle cx=\"15\" cy=\"75\" r=\"4\" fill=\"white\"/><circle cx=\"145\" cy=\"15\" r=\"4\" fill=\"white\"/></svg><SliderInput label=\"Stiffness\" min={1} max={1000} value={style.springStiffness} onChange={(springStiffness) => onStyle({ springStiffness })} /><SliderInput label=\"Damping\" min={1} max={100} value={style.springDamping} onChange={(springDamping) => onStyle({ springDamping })} /></div>}<div className=\"mt-3 space-y-2\"><SelectInput label=\"Effect\" value={style.entrance} options={ENTRANCES} onChange={(entrance) => onStyle({ entrance })} /><SliderInput label=\"Time\" min={50} max={5000} suffix=\"ms\" value={style.entranceDuration} onChange={(entranceDuration) => onStyle({ entranceDuration })} /><SliderInput label=\"Delay\" min={0} max={5000} suffix=\"ms\" value={style.entranceDelay} onChange={(entranceDelay) => onStyle({ entranceDelay })} /></div></div>}\n </div>\n );\n}\n\n/* ---------------------------------------------------------------- page tab */\n\nexport function PageInspector({\n rootStyle,\n onChange,\n onApplyStyleKit,\n onLoadShowcase,\n}: {\n rootStyle: RootStyle;\n onChange: (patch: Partial<RootStyle>) => void;\n onApplyStyleKit: (kit: \"midnight\" | \"editorial\" | \"cobalt\" | \"warm\") => void;\n onLoadShowcase: () => void;\n}) {\n const providerFonts = usePagieraFonts();\n return (\n <div className=\"flex flex-col divide-y divide-ed-border\">\n <p className=\"pb-3 text-[10px] leading-relaxed text-ed-muted\">\n Nothing is selected, so these settings apply to the page itself.\n </p>\n\n <Group title=\"Canvas\">\n <Segmented\n label=\"Width\"\n value={rootStyle.fullWidth ? \"full\" : \"contained\"}\n options={[\n { label: \"Contained\", value: \"contained\" },\n { label: \"Full bleed\", value: \"full\" },\n ]}\n onChange={(mode) => onChange({ fullWidth: mode === \"full\" })}\n />\n {!rootStyle.fullWidth && (\n <NumberInput\n label=\"Max width\"\n suffix=\"px\"\n min={320}\n max={4000}\n value={rootStyle.maxWidth}\n onChange={(maxWidth) => onChange({ maxWidth })}\n />\n )}\n <p className=\"text-[10px] leading-relaxed text-ed-faint\">\n {rootStyle.fullWidth\n ? \"Content runs edge to edge on every screen.\"\n : `Wider screens show the page background beside the ${rootStyle.maxWidth}px content.`}\n </p>\n <ColorInput\n label=\"Background\"\n value={rootStyle.bg}\n onChange={(bg) => onChange({ bg })}\n />\n </Group>\n\n <Group title=\"Typography\">\n <SelectInput\n label=\"Site font\"\n value={rootStyle.fontFamily}\n options={[...providerFonts.map((font) => ({ label: font.title, value: font.family })), ...FONT_STACKS]}\n onChange={(fontFamily) => onChange({ fontFamily })}\n />\n <p className=\"text-[10px] leading-relaxed text-ed-faint\">\n Applied to the whole site. Individual layers inherit this font automatically.\n </p>\n </Group>\n\n <Group title=\"Style kits\">\n <button type=\"button\" onClick={onLoadShowcase} className=\"group mb-3 w-full overflow-hidden rounded-xl border border-lime-300/25 bg-[#10110d] p-3 text-left transition hover:border-lime-300/60\">\n <span className=\"mb-3 flex items-center justify-between\"><span className=\"flex size-8 items-center justify-center rounded-lg bg-[#d7ff3f] text-[#0b0b0a]\"><IconSparkles size={15} /></span><span className=\"font-mono text-[8px] uppercase tracking-[.18em] text-lime-200/60\">Full site</span></span>\n <span className=\"block text-[11px] font-semibold text-[#f1f0ea]\">Load Nocturne showcase</span>\n <span className=\"mt-1 block text-[9px] leading-relaxed text-[#96958f]\">Custom font, editorial composition and polished motion.</span>\n </button>\n <p className=\"text-[10px] leading-relaxed text-ed-faint\">Apply a coherent background, surface, typography and accent palette to the whole page.</p>\n <div className=\"grid grid-cols-2 gap-2\">{([\n [\"midnight\", \"Midnight\", [\"#090b10\", \"#7c5cff\"]],\n [\"editorial\", \"Editorial\", [\"#f3efe7\", \"#e14b32\"]],\n [\"cobalt\", \"Cobalt\", [\"#071425\", \"#2f80ff\"]],\n [\"warm\", \"Warm\", [\"#18110f\", \"#f97316\"]],\n ] as const).map(([id, label, colors]) => <button key={id} type=\"button\" onClick={() => onApplyStyleKit(id)} className=\"rounded-xl border border-ed-border bg-ed-subtle p-2 text-left hover:border-ed-accent/50 hover:bg-ed-field\"><span className=\"mb-2 flex h-8 overflow-hidden rounded-lg\">{colors.map((color) => <span key={color} className=\"flex-1\" style={{ background: color }} />)}</span><span className=\"text-[9px] font-semibold text-ed-text\">{label}</span></button>)}</div>\n </Group>\n\n <Group title=\"Layout\" defaultOpen={false}>\n <Segmented\n label=\"Mode\"\n value={rootStyle.layout}\n options={[\n { label: \"Stack\", value: \"stack\" as LayoutMode },\n { label: \"Free\", value: \"absolute\" as LayoutMode },\n ]}\n onChange={(layout) => onChange({ layout })}\n />\n {rootStyle.layout === \"stack\" && (\n <>\n <Segmented\n label=\"Flow\"\n value={rootStyle.direction}\n options={[\n {\n label: \"Row\",\n value: \"row\" as Direction,\n icon: <IconArrowsHorizontal size={12} />,\n },\n {\n label: \"Column\",\n value: \"column\" as Direction,\n icon: <IconArrowsVertical size={12} />,\n },\n ]}\n onChange={(direction) => onChange({ direction })}\n />\n <NumberInput\n label=\"Gap\"\n suffix=\"px\"\n min={0}\n value={rootStyle.gap}\n onChange={(gap) => onChange({ gap })}\n />\n <Segmented\n label=\"Align\"\n value={rootStyle.align}\n options={[\n { label: \"Start\", value: \"start\" as Align },\n { label: \"Center\", value: \"center\" as Align },\n { label: \"End\", value: \"end\" as Align },\n { label: \"Stretch\", value: \"stretch\" as Align },\n ]}\n onChange={(align) => onChange({ align })}\n />\n </>\n )}\n </Group>\n\n <Group title=\"Spacing\" defaultOpen={false}>\n <NumberInput\n label=\"Top\"\n suffix=\"px\"\n min={0}\n value={rootStyle.padT}\n onChange={(padT) => onChange({ padT })}\n />\n <NumberInput\n label=\"Right\"\n suffix=\"px\"\n min={0}\n value={rootStyle.padR}\n onChange={(padR) => onChange({ padR })}\n />\n <NumberInput\n label=\"Bottom\"\n suffix=\"px\"\n min={0}\n value={rootStyle.padB}\n onChange={(padB) => onChange({ padB })}\n />\n <NumberInput\n label=\"Left\"\n suffix=\"px\"\n min={0}\n value={rootStyle.padL}\n onChange={(padL) => onChange({ padL })}\n /> </Group>\n </div>\n );\n}\n\n/* --------------------------------------------------------- multi-selection */\n\nexport type AlignChoice =\n | \"left\"\n | \"center-x\"\n | \"right\"\n | \"top\"\n | \"center-y\"\n | \"bottom\";\n\nconst ALIGN_LABELS: Record<AlignChoice, string> = {\n left: \"Align left\",\n \"center-x\": \"Align centre\",\n right: \"Align right\",\n top: \"Align top\",\n \"center-y\": \"Align middle\",\n bottom: \"Align bottom\",\n};\n\nexport function MultiSelectPanel({\n count,\n canArrange,\n onAlign,\n onDistribute,\n}: {\n count: number;\n canArrange: boolean;\n onAlign: (action: AlignChoice) => void;\n onDistribute: (action: \"horizontal\" | \"vertical\") => void;\n}) {\n return (\n <div className=\"flex flex-col gap-4\">\n <p className=\"text-[10px] leading-relaxed text-ed-muted\">\n {count} elements selected.\n {!canArrange &&\n \" Alignment needs siblings inside a freely positioned parent.\"}\n </p>\n\n <Group title=\"Align\">\n <div className=\"grid grid-cols-3 gap-1\">\n {(\n [\n [\"left\", <IconAlignBoxLeftMiddle key=\"l\" size={14} />],\n [\"center-x\", <IconAlignBoxCenterMiddle key=\"c\" size={14} />],\n [\"right\", <IconAlignBoxRightMiddle key=\"r\" size={14} />],\n [\"top\", <IconLayoutAlignTop key=\"t\" size={14} />],\n [\"center-y\", <IconAlignBoxCenterMiddle key=\"m\" size={14} />],\n [\"bottom\", <IconLayoutAlignBottom key=\"b\" size={14} />],\n ] as Array<[AlignChoice, React.ReactNode]>\n ).map(([action, icon]) => (\n <button\n type=\"button\"\n key={action}\n title={ALIGN_LABELS[action]}\n aria-label={ALIGN_LABELS[action]}\n disabled={!canArrange}\n onClick={() => onAlign(action)}\n className=\"flex items-center justify-center rounded border border-ed-border bg-ed-field p-2 text-ed-muted transition-colors hover:bg-ed-field hover:text-ed-text disabled:pointer-events-none disabled:opacity-30\"\n >\n {icon}\n </button>\n ))}\n </div>\n </Group>\n\n <Group title=\"Distribute\">\n <div className=\"grid grid-cols-2 gap-1\">\n <button\n type=\"button\"\n disabled={!canArrange || count < 3}\n onClick={() => onDistribute(\"horizontal\")}\n className=\"flex items-center justify-center gap-1.5 rounded border border-ed-border bg-ed-field p-2 text-[10px] text-ed-muted transition-colors hover:bg-ed-field hover:text-ed-text disabled:pointer-events-none disabled:opacity-30\"\n >\n <IconArrowsHorizontal size={13} /> Horizontal\n </button>\n <button\n type=\"button\"\n disabled={!canArrange || count < 3}\n onClick={() => onDistribute(\"vertical\")}\n className=\"flex items-center justify-center gap-1.5 rounded border border-ed-border bg-ed-field p-2 text-[10px] text-ed-muted transition-colors hover:bg-ed-field hover:text-ed-text disabled:pointer-events-none disabled:opacity-30\"\n >\n <IconArrowsVertical size={13} /> Vertical\n </button>\n </div>\n </Group>\n </div>\n );\n}\n", "\"use client\";\n\nimport { IconChevronRight } from \"@tabler/icons-react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport type React from \"react\";\nimport { useEffect, useId, useState } from \"react\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\";\n\n/*\n * Inspector controls.\n *\n * One grammar for every field: a 28px row, a muted label on the left, the\n * value on the right, and no visible chrome until the row is hovered or\n * focused. Keeping the shell identical everywhere is what stops the panel\n * reading as a pile of unrelated boxes.\n */\n\nconst FIELD =\n \"flex h-8 items-center gap-2 rounded-lg bg-ed-field px-2.5 text-[12px] text-ed-text transition-colors hover:bg-ed-field-hover focus-within:bg-ed-surface focus-within:ring-1 focus-within:ring-inset focus-within:ring-[var(--ed-accent)]/60\";\nconst LABEL = \"shrink-0 text-[11px] text-ed-muted\";\nconst VALUE =\n \"min-w-0 flex-1 bg-transparent text-right tabular-nums outline-none placeholder:text-ed-faint\";\n\n/** Label column width, so every row in a group lines up. */\nconst LABEL_W = \"w-[70px]\";\n\nconst GROUP_STATE_KEY = \"pagiera:inspector-groups\";\n\nfunction readGroupState(): Record<string, boolean> {\n try {\n return JSON.parse(localStorage.getItem(GROUP_STATE_KEY) ?? \"{}\");\n } catch {\n return {};\n }\n}\n\n/**\n * A collapsible inspector section. Which sections are open is a per-user\n * preference rather than per-element, so it is keyed by title and remembered\n * across reloads.\n */\nexport function Group({\n title,\n children,\n action,\n defaultOpen = true,\n}: {\n title: string;\n children: React.ReactNode;\n action?: React.ReactNode;\n defaultOpen?: boolean;\n}) {\n const [open, setOpen] = useState(defaultOpen);\n\n // Read after mount so the server and client render the same first pass.\n useEffect(() => {\n const stored = readGroupState()[title];\n if (typeof stored === \"boolean\") setOpen(stored);\n }, [title]);\n\n function toggle() {\n setOpen((current) => {\n const next = !current;\n try {\n localStorage.setItem(\n GROUP_STATE_KEY,\n JSON.stringify({ ...readGroupState(), [title]: next }),\n );\n } catch {\n // A private-mode storage failure must not break the panel.\n }\n return next;\n });\n }\n\n return (\n <div className=\"flex flex-col py-1.5\">\n <div className=\"flex items-center justify-between\">\n <button\n type=\"button\"\n onClick={toggle}\n aria-expanded={open}\n className=\"-ml-1 flex flex-1 items-center gap-1.5 rounded-md py-2 pl-1 text-left text-[11px] font-semibold uppercase tracking-wide text-ed-muted transition-colors hover:text-ed-text\"\n >\n <IconChevronRight\n size={12}\n className={`shrink-0 text-ed-faint transition-transform duration-200 ${open ? \"rotate-90\" : \"\"}`}\n />\n {title}\n </button>\n {action}\n </div>\n <AnimatePresence initial={false}>\n {open && (\n <motion.div\n key=\"body\"\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: \"auto\", opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={{ duration: 0.18, ease: [0.22, 1, 0.36, 1] }}\n className=\"overflow-hidden\"\n >\n <div className=\"flex flex-col gap-2 pb-3 pt-0.5\">{children}</div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n );\n}\n\n/**\n * Hides the controls most edits never touch, so a group opens with only the\n * handful of fields that carry the common cases.\n */\nexport function More({\n children,\n label = \"More options\",\n}: {\n children: React.ReactNode;\n label?: string;\n}) {\n const [open, setOpen] = useState(false);\n\n return (\n <div className=\"flex flex-col gap-2\">\n <AnimatePresence initial={false}>\n {open && (\n <motion.div\n key=\"more\"\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: \"auto\", opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={{ duration: 0.18, ease: [0.22, 1, 0.36, 1] }}\n className=\"overflow-hidden\"\n >\n <div className=\"flex flex-col gap-2\">{children}</div>\n </motion.div>\n )}\n </AnimatePresence>\n <button\n type=\"button\"\n onClick={() => setOpen((c) => !c)}\n className=\"self-start rounded-md px-1.5 py-1 text-[10px] text-ed-faint transition-colors hover:bg-ed-field hover:text-ed-muted\"\n >\n {open ? \"Less\" : label}\n </button>\n </div>\n );\n}\n\n/**\n * Marks a control whose value comes from a wider breakpoint. A hairline in the\n * gutter reads as a margin note instead of competing with the control itself.\n */\nexport function Overridable({\n overridden,\n onReset,\n children,\n}: {\n overridden: boolean;\n onReset?: () => void;\n children: React.ReactNode;\n}) {\n return (\n <div className=\"relative\">\n {overridden && onReset && (\n <button\n type=\"button\"\n title=\"Overridden here \u2014 click to inherit again\"\n aria-label=\"Reset to the inherited value\"\n onClick={onReset}\n className=\"absolute -left-2.5 bottom-1 top-1 w-[3px] rounded-full bg-amber-400 transition-colors hover:bg-amber-500\"\n />\n )}\n {children}\n </div>\n );\n}\n\n/** A labelled row; the label column keeps every control aligned. */\nexport function Row({\n label,\n children,\n htmlFor,\n}: {\n label: string;\n children: React.ReactNode;\n htmlFor?: string;\n}) {\n return (\n <div className=\"flex items-center gap-2\">\n {htmlFor ? (\n <label htmlFor={htmlFor} className={`${LABEL} ${LABEL_W}`}>\n {label}\n </label>\n ) : (\n <span className={`${LABEL} ${LABEL_W}`}>{label}</span>\n )}\n <div className=\"flex min-w-0 flex-1 items-center gap-2\">{children}</div>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------- select */\n\n/** Shared shadcn select used by every inspector choice. */\nfunction SelectShell<T extends string>({\n value,\n options,\n onChange,\n className = \"\",\n ariaLabel,\n id,\n}: {\n value: T;\n options: ReadonlyArray<{ label: string; value: T }>;\n onChange: (value: T) => void;\n className?: string;\n ariaLabel?: string;\n id?: string;\n}) {\n return (\n <Select value={value} onValueChange={(next) => onChange(next as T)}>\n <SelectTrigger\n id={id}\n aria-label={ariaLabel}\n className={`min-w-0 border-transparent bg-ed-field px-2.5 hover:bg-ed-field-hover focus:border-ed-accent ${className || \"flex-1\"}`}\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {options.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n}\n\nexport function SelectInput<T extends string>({\n label,\n value,\n options,\n onChange,\n}: {\n label: string;\n value: T;\n options: ReadonlyArray<{ label: string; value: T }>;\n onChange: (value: T) => void;\n}) {\n const id = useId();\n return (\n <Row label={label} htmlFor={id}>\n <SelectShell id={id} value={value} options={options} onChange={onChange} />\n </Row>\n );\n}\n\n/* --------------------------------------------------------------------- size */\n\nexport type SizeChoice = \"fixed\" | \"fill\" | \"auto\";\n\nconst SIZE_OPTIONS: ReadonlyArray<{ label: string; value: SizeChoice }> = [\n { label: \"Fixed\", value: \"fixed\" },\n { label: \"Fill\", value: \"fill\" },\n { label: \"Hug\", value: \"auto\" },\n];\n\n/**\n * Width and height in one row. The number and the sizing mode describe the same\n * decision, so splitting them into a cramped three-way toggle plus a separate\n * box was both wider and harder to read.\n */\nexport function SizeField({\n axis,\n mode,\n value,\n onMode,\n onValue,\n onCommitStart,\n onCommitEnd,\n}: {\n axis: \"W\" | \"H\";\n mode: SizeChoice;\n value: number;\n onMode: (mode: SizeChoice) => void;\n onValue: (value: number) => void;\n onCommitStart?: () => void;\n onCommitEnd?: () => void;\n}) {\n const id = useId();\n const name = axis === \"W\" ? \"Width\" : \"Height\";\n\n return (\n <div className=\"flex items-center gap-1.5\">\n <label htmlFor={id} className={`${LABEL} w-3.5 font-medium`} title={name}>\n {axis}\n </label>\n\n <div className={`${FIELD} flex-1`}>\n {mode === \"fixed\" ? (\n <>\n <input\n id={id}\n type=\"number\"\n min={1}\n value={Math.round(value)}\n onFocus={onCommitStart}\n onBlur={onCommitEnd}\n onChange={(event) => {\n const next = Number(event.target.value);\n if (Number.isFinite(next)) onValue(Math.max(1, next));\n }}\n className={VALUE}\n />\n <span className=\"shrink-0 text-ed-faint\">px</span>\n </>\n ) : (\n // The layout owns this axis, so there is no number to type.\n <span className=\"flex-1 text-right text-ed-faint\">\n {mode === \"fill\" ? \"Fill\" : \"Hug\"}\n </span>\n )}\n </div>\n\n <SelectShell\n value={mode}\n options={SIZE_OPTIONS}\n onChange={onMode}\n ariaLabel={`${name} sizing mode`}\n className=\"w-[76px] shrink-0\"\n />\n </div>\n );\n}\n\n/* ------------------------------------------------------------------- inputs */\n\nexport function NumberInput({\n label,\n value,\n onChange,\n onCommitStart,\n onCommitEnd,\n min,\n max,\n step = 1,\n suffix,\n disabled,\n}: {\n label: string;\n value: number;\n onChange: (value: number) => void;\n onCommitStart?: () => void;\n onCommitEnd?: () => void;\n min?: number;\n max?: number;\n step?: number;\n suffix?: string;\n disabled?: boolean;\n}) {\n const id = useId();\n return (\n <Row label={label} htmlFor={id}>\n <div className={FIELD}>\n <input\n id={id}\n type=\"number\"\n value={Number.isFinite(value) ? Math.round(value * 100) / 100 : 0}\n min={min}\n max={max}\n step={step}\n disabled={disabled}\n onFocus={onCommitStart}\n onBlur={onCommitEnd}\n onChange={(event) => {\n const next = Number(event.target.value);\n if (!Number.isFinite(next)) return;\n onChange(\n Math.min(\n max ?? Number.MAX_SAFE_INTEGER,\n Math.max(min ?? -1e9, next),\n ),\n );\n }}\n className={`${VALUE} disabled:text-ed-faint`}\n />\n {suffix && <span className=\"shrink-0 text-ed-faint\">{suffix}</span>}\n </div>\n </Row>\n );\n}\n\nexport function TextInput({\n label,\n value,\n onChange,\n placeholder,\n}: {\n label: string;\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n}) {\n const id = useId();\n return (\n <Row label={label} htmlFor={id}>\n <div className={FIELD}>\n <input\n id={id}\n type=\"text\"\n value={value}\n placeholder={placeholder}\n onChange={(event) => onChange(event.target.value)}\n className={`${VALUE} text-left`}\n />\n </div>\n </Row>\n );\n}\n\nexport function ColorInput({\n label,\n value,\n onChange,\n placeholder,\n}: {\n label: string;\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n}) {\n const id = useId();\n const swatch = /^#[0-9a-f]{6}$/i.test(value) ? value : \"#000000\";\n\n return (\n <Row label={label} htmlFor={id}>\n <div className={FIELD}>\n {/* The native picker writes hex; the text field still accepts\n rgba()/named colours and CSS variables. */}\n <input\n type=\"color\"\n aria-label={`${label} colour picker`}\n value={swatch}\n onChange={(event) => onChange(event.target.value)}\n className=\"h-3.5 w-3.5 shrink-0 cursor-pointer rounded border border-black/10 bg-transparent p-0 [&::-webkit-color-swatch-wrapper]:p-0 [&::-webkit-color-swatch]:rounded-[3px] [&::-webkit-color-swatch]:border-0\"\n />\n <input\n id={id}\n type=\"text\"\n value={value}\n placeholder={placeholder}\n onChange={(event) => onChange(event.target.value)}\n className={`${VALUE} text-left`}\n />\n </div>\n </Row>\n );\n}\n\n/** Segmented control \u2014 for two to four short, mutually exclusive choices. */\nexport function Segmented<T extends string>({\n label,\n value,\n options,\n onChange,\n}: {\n label?: string;\n value: T;\n options: ReadonlyArray<{ label: string; value: T; icon?: React.ReactNode }>;\n onChange: (value: T) => void;\n}) {\n const control = (\n <div className=\"flex h-8 min-w-0 flex-1 gap-0.5 rounded-lg bg-ed-field p-1\">\n {options.map((option) => (\n <button\n type=\"button\"\n key={option.value}\n title={option.label}\n aria-pressed={value === option.value}\n onClick={() => onChange(option.value)}\n className={`flex min-w-0 flex-1 items-center justify-center rounded-md px-1 text-[11px] transition-colors ${\n value === option.value\n ? \"bg-ed-surface text-ed-text shadow-sm\"\n : \"text-ed-muted hover:text-ed-text\"\n }`}\n >\n <span className=\"truncate\">{option.icon ?? option.label}</span>\n </button>\n ))}\n </div>\n );\n\n if (!label) return control;\n return (\n <div className=\"flex items-center gap-2\">\n <span className={`${LABEL} ${LABEL_W}`}>{label}</span>\n {control}\n </div>\n );\n}\n\nexport function SliderInput({\n label,\n value,\n min,\n max,\n step = 1,\n suffix,\n onChange,\n onCommitStart,\n onCommitEnd,\n}: {\n label: string;\n value: number;\n min: number;\n max: number;\n step?: number;\n suffix?: string;\n onChange: (value: number) => void;\n onCommitStart?: () => void;\n onCommitEnd?: () => void;\n}) {\n const id = useId();\n return (\n <Row label={label} htmlFor={id}>\n <input\n id={id}\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={value}\n onPointerDown={onCommitStart}\n onPointerUp={onCommitEnd}\n onChange={(event) => onChange(Number(event.target.value))}\n className=\"h-7 min-w-0 flex-1 accent-blue-600\"\n />\n <span className=\"w-9 shrink-0 text-right text-[11px] tabular-nums text-ed-muted\">\n {Math.round(value)}\n {suffix}\n </span>\n </Row>\n );\n}\n\nexport function TextArea({\n label,\n value,\n onChange,\n}: {\n label: string;\n value: string;\n onChange: (value: string) => void;\n}) {\n const id = useId();\n return (\n <div className=\"flex flex-col gap-1.5\">\n <label htmlFor={id} className={LABEL}>\n {label}\n </label>\n <textarea\n id={id}\n value={value}\n onChange={(event) => onChange(event.target.value)}\n className=\"min-h-[88px] resize-y rounded-lg bg-ed-field p-2.5 text-[12px] leading-relaxed text-ed-text outline-none transition-colors hover:bg-ed-field-hover focus:bg-ed-surface focus:ring-1 focus:ring-inset focus:ring-[var(--ed-accent)]/60\"\n />\n </div>\n );\n}\n", "\"use client\";\n\nimport { IconDatabase, IconPlus, IconTrash } from \"@tabler/icons-react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { useState } from \"react\";\nimport { newId } from \"@/lib/editor/tree\";\nimport type { DataSource } from \"@/lib/editor/types\";\nimport { DataSourceModal, type SourcePreviewer } from \"./data-modal\";\n\nexport type SourceSample = { keys: string[]; rows: Array<Record<string, unknown>> };\n\n/**\n * The rail lists sources and their state; editing one opens the modal, where\n * the URL, query, headers and response all fit on screen at once.\n */\nexport function DataPanel({\n sources,\n samples,\n onChange,\n onSample,\n preview,\n}: {\n sources: DataSource[];\n samples: Record<string, SourceSample>;\n onChange: (updater: (prev: DataSource[]) => DataSource[]) => void;\n onSample: (sourceId: string, sample: SourceSample) => void;\n preview: SourcePreviewer;\n}) {\n const [openId, setOpenId] = useState<string | null>(null);\n const open = sources.find((source) => source.id === openId);\n\n const add = () => {\n const source: DataSource = {\n id: newId(),\n name: `Source ${sources.length + 1}`,\n url: \"\",\n path: \"\",\n params: [],\n headers: [],\n };\n onChange((prev) => [...prev, source]);\n setOpenId(source.id);\n };\n\n return (\n <div className=\"flex flex-col gap-3 p-4\">\n <p className=\"text-[11px] leading-relaxed text-ed-muted\">\n Point a source at a JSON endpoint. Use <b>Request</b> for one object\n or <b>Repeat</b> for an array, then bind their children to fields.\n </p>\n\n <div className=\"flex flex-col gap-2\">\n {sources.map((source) => {\n const sample = samples[source.id];\n const host = hostOf(source.url);\n\n return (\n <motion.div\n key={source.id}\n layout\n initial={{ opacity: 0, y: -4 }}\n animate={{ opacity: 1, y: 0 }}\n className=\"group flex items-center gap-2.5 rounded-lg border border-ed-border p-2.5 transition-colors hover:border-ed-accent/50\"\n >\n <button\n type=\"button\"\n onClick={() => setOpenId(source.id)}\n className=\"flex min-w-0 flex-1 items-center gap-2.5 text-left\"\n >\n <span\n className={`flex h-8 w-8 shrink-0 items-center justify-center rounded-md ${\n sample\n ? \"bg-emerald-500/15 text-emerald-500\"\n : \"bg-ed-field text-ed-faint\"\n }`}\n >\n <IconDatabase size={15} />\n </span>\n <span className=\"flex min-w-0 flex-col\">\n <span className=\"truncate text-[12px] font-medium text-ed-text\">\n {source.name}\n </span>\n <span className=\"truncate text-[10px] text-ed-faint\">\n {sample\n ? `${sample.rows.length} rows \u00B7 ${sample.keys.length} fields`\n : host || \"No URL yet\"}\n </span>\n </span>\n </button>\n\n <button\n type=\"button\"\n aria-label={`Remove ${source.name}`}\n onClick={() =>\n onChange((prev) => prev.filter((s) => s.id !== source.id))\n }\n className=\"shrink-0 rounded-md p-1.5 text-ed-faint opacity-0 transition-all hover:bg-ed-field hover:text-red-400 focus:opacity-100 group-hover:opacity-100\"\n >\n <IconTrash size={13} />\n </button>\n </motion.div>\n );\n })}\n </div>\n\n <button\n type=\"button\"\n onClick={add}\n className=\"flex items-center justify-center gap-1.5 rounded-lg border border-dashed border-ed-border py-2.5 text-[11px] text-ed-muted transition-colors hover:border-ed-accent hover:text-ed-text\"\n >\n <IconPlus size={14} />\n Add a data source\n </button>\n\n <AnimatePresence>\n {open && (\n <DataSourceModal\n key={open.id}\n source={open}\n sample={samples[open.id]}\n onChange={(changes) =>\n onChange((prev) =>\n prev.map((s) => (s.id === open.id ? { ...s, ...changes } : s)),\n )\n }\n onSample={(sample) => onSample(open.id, sample)}\n onClose={() => setOpenId(null)}\n preview={preview}\n />\n )}\n </AnimatePresence>\n </div>\n );\n}\n\nfunction hostOf(url: string) {\n try {\n return new URL(url).host;\n } catch {\n return \"\";\n }\n}\n", "\"use client\";\n\nimport {\n IconAlertTriangle,\n IconCheck,\n IconPlayerPlay,\n IconPlus,\n IconTrash,\n IconX,\n} from \"@tabler/icons-react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { useEffect, useState, useTransition } from \"react\";\nimport {\n type DataSource,\n HTTP_METHODS,\n type HttpMethod,\n type RequestPair,\n sendsBody,\n} from \"@/lib/editor/types\";\nimport type { SourceSample } from \"./data-panel\";\n\nexport type SourcePreview =\n | { status: \"ok\"; rows: Array<Record<string, unknown>>; keys: string[]; total: number }\n | { status: \"error\"; message: string };\nexport type SourcePreviewer = (source: DataSource, sampleQuery: string) => Promise<SourcePreview>;\n\ntype Tab = \"params\" | \"body\" | \"headers\" | \"response\";\n\n/**\n * The full request builder. A source has enough moving parts \u2014 URL, query,\n * headers, the path into the payload, and the response itself \u2014 that editing\n * it in a 240px rail meant guessing; here everything is visible at once.\n */\nexport function DataSourceModal({\n source,\n sample,\n onChange,\n onSample,\n onClose,\n preview,\n}: {\n source: DataSource;\n sample?: SourceSample;\n onChange: (changes: Partial<DataSource>) => void;\n onSample: (sample: SourceSample) => void;\n onClose: () => void;\n preview: SourcePreviewer;\n}) {\n const [tab, setTab] = useState<Tab>(\"params\");\n const method = source.method ?? \"GET\";\n const [error, setError] = useState<string | null>(null);\n const [rows, setRows] = useState<Array<Record<string, unknown>>>(\n sample?.rows ?? [],\n );\n const [keys, setKeys] = useState<string[]>(sample?.keys ?? []);\n const [testQuery, setTestQuery] = useState(\"\");\n const [busy, startTest] = useTransition();\n\n useEffect(() => {\n const onKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") onClose();\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [onClose]);\n\n const bodyError = (() => {\n if (!sendsBody(method)) return null;\n const raw = source.body?.trim();\n if (!raw) return null;\n // Tokens are not valid JSON on their own, so check the resolved shape\n // with placeholders swapped for a string.\n try {\n JSON.parse(raw.replace(/{{[^}]*}}/g, \"x\"));\n return null;\n } catch {\n return \"This is not valid JSON yet.\";\n }\n })();\n\n const run = () => {\n startTest(async () => {\n const result = await preview(source, testQuery);\n if (result.status === \"error\") {\n setError(result.message);\n return;\n }\n setError(null);\n setRows(result.rows);\n setKeys(result.keys);\n setTab(\"response\");\n onSample({ keys: result.keys, rows: result.rows });\n });\n };\n\n return (\n <motion.div\n className=\"fixed inset-0 z-[200] flex items-center justify-center p-8\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n >\n {/* A real button, so closing by click-away is reachable from the\n keyboard too rather than relying on Escape alone. */}\n <button\n type=\"button\"\n aria-label=\"Close dialog\"\n tabIndex={-1}\n onClick={onClose}\n className=\"absolute inset-0 cursor-default bg-black/60 backdrop-blur-sm\"\n />\n\n <motion.div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={`Data source: ${source.name}`}\n className=\"relative flex h-full max-h-[680px] w-full max-w-[860px] flex-col overflow-hidden rounded-2xl border border-ed-border bg-ed-surface shadow-2xl\"\n initial={{ opacity: 0, scale: 0.97, y: 12 }}\n animate={{ opacity: 1, scale: 1, y: 0 }}\n exit={{ opacity: 0, scale: 0.97, y: 12 }}\n transition={{ type: \"spring\", stiffness: 420, damping: 32 }}\n >\n <header className=\"flex shrink-0 items-center gap-3 border-b border-ed-border px-5 py-4\">\n <input\n type=\"text\"\n value={source.name}\n aria-label=\"Source name\"\n onChange={(e) => onChange({ name: e.target.value })}\n className=\"min-w-0 flex-1 bg-transparent text-[15px] font-semibold text-ed-text outline-none\"\n />\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Close\"\n className=\"rounded-lg p-1.5 text-ed-faint transition-colors hover:bg-ed-field hover:text-ed-text\"\n >\n <IconX size={16} />\n </button>\n </header>\n\n <div className=\"flex shrink-0 items-center gap-2 border-b border-ed-border px-5 py-3\">\n <select\n aria-label=\"HTTP method\"\n value={method}\n onChange={(e) => onChange({ method: e.target.value as HttpMethod })}\n className=\"shrink-0 cursor-pointer rounded-md bg-ed-field px-2 py-1.5 font-mono text-[11px] font-semibold text-ed-text outline-none [&>option]:bg-ed-surface\"\n >\n {HTTP_METHODS.map((m) => (\n <option key={m} value={m}>\n {m}\n </option>\n ))}\n </select>\n <input\n type=\"text\"\n value={source.url}\n aria-label=\"Request URL\"\n placeholder=\"https://api.example.com/posts\"\n onChange={(e) => onChange({ url: e.target.value })}\n className=\"min-w-0 flex-1 rounded-md bg-ed-field px-3 py-1.5 font-mono text-[12px] text-ed-text outline-none transition-colors focus:bg-ed-field-hover placeholder:text-ed-faint\"\n />\n <button\n type=\"button\"\n onClick={run}\n disabled={busy}\n className=\"flex shrink-0 items-center gap-1.5 rounded-md bg-ed-accent px-3.5 py-1.5 text-[12px] font-medium text-white transition-opacity hover:opacity-90 disabled:opacity-50\"\n >\n <IconPlayerPlay size={13} />\n {busy ? \"Sending\u2026\" : \"Send\"}\n </button>\n <select\n aria-label=\"Behavior when the API returns 404\"\n value={source.onNotFound ?? \"empty\"}\n onChange={(event) => onChange({\n onNotFound: event.target.value as DataSource[\"onNotFound\"],\n })}\n title=\"Choose what the published page does when this API returns 404\"\n className=\"shrink-0 cursor-pointer rounded-md bg-ed-field px-2 py-1.5 text-[11px] font-medium text-ed-muted outline-none [&>option]:bg-ed-surface\"\n >\n <option value=\"empty\">404: Keep page</option>\n <option value=\"page-404\">404: Page not found</option>\n </select>\n </div>\n\n <nav className=\"flex shrink-0 gap-1 border-b border-ed-border px-5\">\n {(\n [\n [\"params\", `Query${source.params?.length ? ` (${source.params.length})` : \"\"}`],\n ...(sendsBody(method)\n ? ([[\"body\", source.body?.trim() ? \"Body \u2022\" : \"Body\"]] as Array<[Tab, string]>)\n : []),\n [\"headers\", `Headers${source.headers?.length ? ` (${source.headers.length})` : \"\"}`],\n [\"response\", `Response${rows.length ? ` (${rows.length})` : \"\"}`],\n ] as Array<[Tab, string]>\n ).map(([value, label]) => (\n <button\n type=\"button\"\n key={value}\n onClick={() => setTab(value)}\n className={`relative px-3 py-2.5 text-[12px] transition-colors ${\n tab === value\n ? \"text-ed-text\"\n : \"text-ed-muted hover:text-ed-text\"\n }`}\n >\n {label}\n {tab === value && (\n <motion.span\n layoutId=\"data-tab\"\n className=\"absolute inset-x-2 -bottom-px h-0.5 rounded-full bg-ed-accent\"\n transition={{ type: \"spring\", stiffness: 500, damping: 40 }}\n />\n )}\n </button>\n ))}\n </nav>\n\n <div className=\"custom-scrollbar flex-1 overflow-y-auto px-5 py-4\">\n {/* No `mode=\"wait\"`: the incoming tab mounts immediately, so\n the panel never depends on an exit animation finishing\n to show the right content. */}\n <motion.div\n key={tab}\n initial={{ opacity: 0, y: 6 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.14 }}\n >\n {tab === \"params\" && (\n <PairTable\n pairs={source.params ?? []}\n valueHint=\"value, {{query.id}} or {{params.slug}}\"\n onChange={(params) => onChange({ params })}\n note=\"Empty values are dropped, so an unset filter is simply not sent.\"\n />\n )}\n {tab === \"body\" && (\n <div className=\"flex flex-col gap-2\">\n <textarea\n value={source.body ?? \"\"}\n aria-label=\"Request body\"\n spellCheck={false}\n placeholder={`{\\n \"title\": \"{{query.title}}\"\\n}`}\n onChange={(e) => onChange({ body: e.target.value })}\n className=\"min-h-[280px] resize-y rounded-lg bg-ed-field p-3 font-mono text-[12px] leading-relaxed text-ed-text outline-none transition-colors focus:bg-ed-surface focus:ring-1 focus:ring-inset focus:ring-[var(--ed-accent)]/60 placeholder:text-ed-faint\"\n />\n <p className=\"text-[11px] leading-relaxed text-ed-faint\">\n Sent as{\" \"}\n <code className=\"rounded bg-ed-field px-1 font-mono\">\n application/json\n </code>\n . Tokens work here too. A body is never cached, so\n the request runs on every render.\n </p>\n {bodyError && (\n <p className=\"flex items-center gap-1.5 text-[11px] text-amber-500\">\n <IconAlertTriangle size={13} />\n {bodyError}\n </p>\n )}\n </div>\n )}\n {tab === \"headers\" && (\n <PairTable\n pairs={source.headers ?? []}\n valueHint=\"e.g. Bearer \u2026\"\n onChange={(headers) => onChange({ headers })}\n note=\"Headers are sent from the server, so a key never reaches the browser \u2014 but it is stored with the page, so treat it as shared with anyone who can edit this site.\"\n />\n )}\n {tab === \"response\" && (\n <ResponseView\n rows={rows}\n keys={keys}\n path={source.path}\n onPath={(path) => onChange({ path })}\n />\n )}\n </motion.div>\n </div>\n\n <footer className=\"flex shrink-0 items-center gap-3 border-t border-ed-border px-5 py-3\">\n <label\n htmlFor=\"data-test-query\"\n className=\"shrink-0 text-[11px] text-ed-faint\"\n >\n Test with\n </label>\n <input\n id=\"data-test-query\"\n type=\"text\"\n value={testQuery}\n placeholder=\"uid=1&limit=5\"\n onChange={(e) => setTestQuery(e.target.value)}\n className=\"min-w-0 flex-1 rounded-md bg-ed-field px-3 py-1.5 font-mono text-[11px] text-ed-text outline-none placeholder:text-ed-faint\"\n />\n <AnimatePresence>\n {error ? (\n <motion.span\n key=\"err\"\n initial={{ opacity: 0, x: 6 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0 }}\n className=\"flex items-center gap-1.5 text-[11px] text-red-400\"\n >\n <IconAlertTriangle size={13} />\n {error}\n </motion.span>\n ) : rows.length > 0 ? (\n <motion.span\n key=\"ok\"\n initial={{ opacity: 0, x: 6 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0 }}\n className=\"flex items-center gap-1.5 text-[11px] text-emerald-500\"\n >\n <IconCheck size={13} />\n {rows.length} rows\n </motion.span>\n ) : null}\n </AnimatePresence>\n </footer>\n </motion.div>\n </motion.div>\n );\n}\n\nfunction PairTable({\n pairs,\n valueHint,\n note,\n onChange,\n}: {\n pairs: RequestPair[];\n valueHint: string;\n note: string;\n onChange: (next: RequestPair[]) => void;\n}) {\n return (\n <div className=\"flex flex-col gap-2\">\n {pairs.map((pair, index) => (\n // Rows are appended and deleted, never reordered, so position is\n // a stable identity here.\n // biome-ignore lint/suspicious/noArrayIndexKey: positional identity is stable for this list\n <div key={index} className=\"flex items-center gap-2\">\n <input\n type=\"text\"\n value={pair.key}\n aria-label=\"Name\"\n placeholder=\"name\"\n onChange={(e) =>\n onChange(\n pairs.map((p, i) =>\n i === index ? { ...p, key: e.target.value } : p,\n ),\n )\n }\n className=\"w-[240px] shrink-0 rounded-md bg-ed-field px-3 py-2 font-mono text-[12px] text-ed-text outline-none transition-colors focus:bg-ed-field-hover placeholder:text-ed-faint\"\n />\n <input\n type=\"text\"\n value={pair.value}\n aria-label=\"Value\"\n placeholder={valueHint}\n onChange={(e) =>\n onChange(\n pairs.map((p, i) =>\n i === index ? { ...p, value: e.target.value } : p,\n ),\n )\n }\n className=\"min-w-0 flex-1 rounded-md bg-ed-field px-3 py-2 font-mono text-[12px] text-ed-text outline-none transition-colors focus:bg-ed-field-hover placeholder:text-ed-faint\"\n />\n <button\n type=\"button\"\n aria-label=\"Remove row\"\n onClick={() => onChange(pairs.filter((_, i) => i !== index))}\n className=\"shrink-0 rounded-md p-2 text-ed-faint transition-colors hover:bg-ed-field hover:text-red-400\"\n >\n <IconTrash size={13} />\n </button>\n </div>\n ))}\n\n <button\n type=\"button\"\n onClick={() => onChange([...pairs, { key: \"\", value: \"\" }])}\n className=\"flex items-center justify-center gap-1.5 rounded-md border border-dashed border-ed-border py-2.5 text-[12px] text-ed-muted transition-colors hover:border-ed-accent hover:text-ed-text\"\n >\n <IconPlus size={14} />\n Add row\n </button>\n\n <p className=\"pt-1 text-[11px] leading-relaxed text-ed-faint\">\n {note} Use{\" \"}\n <code className=\"rounded bg-ed-field px-1 font-mono\">\n {\"{{query.name}}\"}\n </code>{\" \"}\n to read the visitor&apos;s URL, or{\" \"}\n <code className=\"rounded bg-ed-field px-1 font-mono\">\n {\"{{params.slug}}\"}\n </code>{\" \"}\n for a dynamic path such as <span className=\"text-ed-muted\">blog/:slug</span>, or{\" \"}\n <code className=\"rounded bg-ed-field px-1 font-mono\">\n {\"{{page.slug}}\"}\n </code>{\" \"}\n for the page.\n </p>\n </div>\n );\n}\n\nfunction ResponseView({\n rows,\n keys,\n path,\n onPath,\n}: {\n rows: Array<Record<string, unknown>>;\n keys: string[];\n path: string;\n onPath: (path: string) => void;\n}) {\n if (rows.length === 0) {\n return (\n <div className=\"flex flex-col items-center justify-center gap-2 py-16 text-center\">\n <p className=\"text-[13px] text-ed-muted\">No response yet</p>\n <p className=\"max-w-[380px] text-[11px] leading-relaxed text-ed-faint\">\n Press <b>Send</b> to call the endpoint. If the list is nested inside\n the payload, set the path below \u2014 for example{\" \"}\n <code className=\"rounded bg-ed-field px-1 font-mono\">data.items</code>.\n </p>\n <input\n type=\"text\"\n value={path}\n aria-label=\"Path to the list\"\n placeholder=\"path to the list\"\n onChange={(e) => onPath(e.target.value)}\n className=\"mt-2 w-[240px] rounded-md bg-ed-field px-3 py-2 text-center font-mono text-[12px] text-ed-text outline-none placeholder:text-ed-faint\"\n />\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex items-center gap-2\">\n <label\n htmlFor=\"data-path\"\n className=\"shrink-0 text-[11px] text-ed-faint\"\n >\n List path\n </label>\n <input\n id=\"data-path\"\n type=\"text\"\n value={path}\n placeholder=\"(payload is already a list)\"\n onChange={(e) => onPath(e.target.value)}\n className=\"min-w-0 flex-1 rounded-md bg-ed-field px-3 py-1.5 font-mono text-[12px] text-ed-text outline-none placeholder:text-ed-faint\"\n />\n </div>\n\n <div>\n <p className=\"mb-2 text-[11px] font-semibold uppercase tracking-wide text-ed-faint\">\n Fields you can bind\n </p>\n <div className=\"flex flex-wrap gap-1.5\">\n {keys.map((key) => (\n <span\n key={key}\n className=\"rounded-md bg-ed-field px-2 py-1 font-mono text-[11px] text-ed-muted\"\n >\n {key}\n </span>\n ))}\n </div>\n </div>\n\n <div>\n <p className=\"mb-2 text-[11px] font-semibold uppercase tracking-wide text-ed-faint\">\n First rows\n </p>\n <div className=\"overflow-x-auto rounded-lg border border-ed-border\">\n <table className=\"w-full border-collapse text-left\">\n <thead>\n <tr className=\"border-b border-ed-border bg-ed-subtle\">\n {keys.map((key) => (\n <th\n key={key}\n className=\"whitespace-nowrap px-3 py-2 font-mono text-[10px] font-semibold uppercase text-ed-faint\"\n >\n {key}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.slice(0, 6).map((row, index) => (\n // Rows come from an API and have no guaranteed id.\n // biome-ignore lint/suspicious/noArrayIndexKey: a response row has no stable key\n <tr key={index} className=\"border-b border-ed-border last:border-0\">\n {keys.map((key) => (\n <td\n key={key}\n className=\"max-w-[220px] truncate px-3 py-2 text-[11px] text-ed-muted\"\n >\n {formatCell(row[key])}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n </div>\n );\n}\n\nfunction formatCell(value: unknown) {\n if (value === null || value === undefined) return \"\u2014\";\n if (typeof value === \"object\") return Array.isArray(value) ? \"[\u2026]\" : \"{\u2026}\";\n return String(value);\n}\n", "\"use client\";\n\nimport { IconArrowLeft, IconBox, IconChevronRight, IconLayoutNavbar, IconLayoutRows, IconPhoto, IconPlus, IconSearch } from \"@tabler/icons-react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { useMemo, useState } from \"react\";\nimport { COMPONENT_PRESETS, type ComponentPreset } from \"@/lib/editor/presets\";\nimport { resolveStyle } from \"@/lib/editor/style\";\nimport { childrenOf, createElement, displayName, subtreeIds } from \"@/lib/editor/tree\";\nimport { ELEMENT_TYPES, type CanvasElement, type ElementType } from \"@/lib/editor/types\";\n\nexport type LibraryPage = { id: string; name: string; elements: CanvasElement[] };\nexport type LibraryPick = { elements: CanvasElement[]; rootId: string };\ntype View = \"home\" | \"Navigation\" | \"Hero\" | \"Footer\" | \"Basic\" | \"Blocks\";\ntype Entry = { pageId: string; pageName: string; element: CanvasElement; elements: CanvasElement[]; childCount: number };\n\nconst CATEGORIES: Array<{ view: View; name: string; description: string; icon: typeof IconBox }> = [\n { view: \"Navigation\", name: \"Navbar\", description: \"Headers, menus and navigation\", icon: IconLayoutNavbar },\n { view: \"Hero\", name: \"Hero\", description: \"Modern opening sections\", icon: IconPhoto },\n { view: \"Footer\", name: \"Footer\", description: \"Links, legal and conversion\", icon: IconLayoutRows },\n { view: \"Basic\", name: \"Basic components\", description: \"Buttons, text, grids and media\", icon: IconBox },\n { view: \"Blocks\", name: \"Page blocks\", description: \"Sections reused from your pages\", icon: IconLayoutRows },\n];\n\nexport function LibraryPanel({ pages, currentPageId, onInsert }: { pages: LibraryPage[]; currentPageId: string; onInsert: (pick: LibraryPick) => void }) {\n const [view, setView] = useState<View>(\"home\");\n const [direction, setDirection] = useState(1);\n const [search, setSearch] = useState(\"\");\n const entries = useMemo<Entry[]>(() => pages.flatMap((page) => childrenOf(page.elements, undefined).map((element) => ({ pageId: page.id, pageName: page.name, element, elements: page.elements, childCount: subtreeIds(page.elements, element.id).size - 1 }))), [pages]);\n const open = (next: View) => { setDirection(1); setSearch(\"\"); setView(next); };\n const back = () => { setDirection(-1); setSearch(\"\"); setView(\"home\"); };\n const insertPreset = (preset: ComponentPreset) => { const elements = preset.create(); onInsert({ elements, rootId: elements[0].id }); };\n const insertBasic = (type: ElementType) => { const element = createElement(type, { x: 0, y: 0, z: 0 }); onInsert({ elements: [element], rootId: element.id }); };\n\n return <div className=\"relative h-full overflow-hidden\"><AnimatePresence initial={false} custom={direction} mode=\"popLayout\"><motion.div key={view} custom={direction} variants={{ enter: (value: number) => ({ x: value > 0 ? \"100%\" : \"-28%\", opacity: 0 }), center: { x: 0, opacity: 1 }, exit: (value: number) => ({ x: value > 0 ? \"-28%\" : \"100%\", opacity: 0 }) }} initial=\"enter\" animate=\"center\" exit=\"exit\" transition={{ type: \"spring\", stiffness: 360, damping: 34, mass: 0.8 }} className=\"absolute inset-0 overflow-y-auto\">\n {view === \"home\" ? <LibraryHome onOpen={open} /> : <DetailHeader view={view} search={search} onSearch={setSearch} onBack={back} />}\n {view === \"Navigation\" || view === \"Hero\" || view === \"Footer\" ? <PresetList category={view} query={search} onInsert={insertPreset} /> : null}\n {view === \"Basic\" ? <BasicList query={search} onInsert={insertBasic} /> : null}\n {view === \"Blocks\" ? <BlockList entries={entries} currentPageId={currentPageId} query={search} onInsert={onInsert} /> : null}\n </motion.div></AnimatePresence></div>;\n}\n\nfunction LibraryHome({ onOpen }: { onOpen: (view: View) => void }) {\n return <div className=\"p-3\"><div className=\"pg-chrome-card relative mb-4 overflow-hidden rounded-3xl border border-ed-border bg-[radial-gradient(circle_at_90%_0%,rgba(109,124,255,.2),transparent_48%),linear-gradient(145deg,var(--ed-subtle),var(--ed-surface))] p-5\"><span className=\"mb-4 flex size-9 items-center justify-center rounded-2xl bg-ed-accent text-white shadow-[0_10px_28px_rgba(109,124,255,.32)]\"><IconBox size={17} /></span><p className=\"text-[13px] font-semibold tracking-tight text-ed-text\">Component library</p><p className=\"mt-1.5 text-[10px] leading-relaxed text-ed-muted\">Choose a category, preview a component and add its complete editable structure.</p></div><div className=\"flex flex-col gap-2.5\">{CATEGORIES.map(({ view, name, description, icon: Icon }, index) => <motion.button whileHover={{ y: -2 }} whileTap={{ scale: .985 }} key={view} type=\"button\" onClick={() => onOpen(view)} className=\"pg-chrome-card group relative overflow-hidden rounded-2xl border border-ed-border bg-gradient-to-r from-ed-subtle to-ed-surface p-3.5 text-left transition-colors hover:border-ed-accent/40\"><span className={`absolute inset-y-0 right-0 w-24 opacity-20 ${index === 0 ? \"bg-gradient-to-l from-indigo-500\" : index === 1 ? \"bg-gradient-to-l from-cyan-500\" : index === 2 ? \"bg-gradient-to-l from-violet-500\" : \"bg-gradient-to-l from-ed-accent\"}`} /><span className=\"relative flex items-center gap-3\"><span className=\"flex size-10 shrink-0 items-center justify-center rounded-2xl border border-white/[.04] bg-ed-field text-ed-accent transition-transform group-hover:scale-105\"><Icon size={17} /></span><span className=\"min-w-0 flex-1\"><span className=\"block text-[11px] font-semibold text-ed-text\">{name}</span><span className=\"mt-0.5 block truncate text-[9px] text-ed-faint\">{description}</span></span><IconChevronRight size={14} className=\"text-ed-faint transition-transform group-hover:translate-x-1 group-hover:text-ed-text\" /></span></motion.button>)}</div></div>;\n}\n\nfunction DetailHeader({ view, search, onSearch, onBack }: { view: Exclude<View, \"home\">; search: string; onSearch: (value: string) => void; onBack: () => void }) {\n const title = CATEGORIES.find((item) => item.view === view)?.name ?? view;\n return <div className=\"sticky top-0 z-10 border-b border-ed-border bg-ed-surface/95 p-3 backdrop-blur-md\"><div className=\"mb-3 flex items-center gap-2\"><button type=\"button\" onClick={onBack} className=\"flex size-7 items-center justify-center rounded-lg bg-ed-field text-ed-muted hover:bg-ed-field-hover hover:text-ed-text\"><IconArrowLeft size={14} /></button><div><p className=\"text-[11px] font-semibold text-ed-text\">{title}</p><p className=\"text-[9px] text-ed-faint\">Choose a variant</p></div></div><div className=\"flex h-8 items-center gap-2 rounded-lg border border-ed-border bg-ed-field px-2.5\"><IconSearch size={12} className=\"text-ed-faint\" /><input value={search} onChange={(event) => onSearch(event.target.value)} placeholder={`Search ${title.toLowerCase()}\u2026`} className=\"min-w-0 flex-1 bg-transparent text-[10px] text-ed-text outline-none placeholder:text-ed-faint\" /></div></div>;\n}\n\nfunction PresetList({ category, query, onInsert }: { category: ComponentPreset[\"category\"]; query: string; onInsert: (preset: ComponentPreset) => void }) {\n const presets = COMPONENT_PRESETS.filter((preset) => preset.category === category && `${preset.name} ${preset.description}`.toLowerCase().includes(query.toLowerCase()));\n return <div className=\"space-y-3.5 p-3\">{presets.map((preset) => <motion.button whileHover={{ y: -3 }} whileTap={{ scale: .99 }} key={preset.id} type=\"button\" onClick={() => onInsert(preset)} className=\"pg-chrome-card group block w-full overflow-hidden rounded-3xl border border-ed-border bg-ed-subtle text-left transition-colors hover:border-ed-accent/50\"><PresetPreview preset={preset} /><span className=\"flex items-center gap-3 p-3.5\"><span className=\"min-w-0 flex-1\"><span className=\"block text-[11px] font-semibold text-ed-text\">{preset.name}</span><span className=\"mt-0.5 block text-[9px] text-ed-faint\">{preset.description}</span></span><span className=\"flex size-8 items-center justify-center rounded-xl bg-ed-field text-ed-faint transition-all group-hover:rotate-90 group-hover:bg-ed-accent group-hover:text-white\"><IconPlus size={13} /></span></span></motion.button>)}{presets.length === 0 && <Empty />}</div>;\n}\n\nfunction BasicList({ query, onInsert }: { query: string; onInsert: (type: ElementType) => void }) {\n const types = ELEMENT_TYPES.filter((type) => type.toLowerCase().includes(query.toLowerCase()));\n return <div className=\"grid grid-cols-2 gap-2 p-3\">{types.map((type) => <button key={type} type=\"button\" onClick={() => onInsert(type)} className=\"overflow-hidden rounded-xl border border-ed-border bg-ed-subtle text-left hover:border-ed-accent/40 hover:bg-ed-field\"><BasicPreview type={type} /><span className=\"flex items-center justify-between px-2.5 py-2 text-[10px] font-medium text-ed-text\">{type}<IconPlus size={11} className=\"text-ed-faint\" /></span></button>)}</div>;\n}\n\nfunction BlockList({ entries, currentPageId, query, onInsert }: { entries: Entry[]; currentPageId: string; query: string; onInsert: (pick: LibraryPick) => void }) {\n const visible = entries.filter((entry) => entry.pageId !== currentPageId && `${displayName(entry.element)} ${entry.pageName}`.toLowerCase().includes(query.toLowerCase()));\n return <div className=\"space-y-2 p-3\">{visible.map((entry) => { const style = resolveStyle(entry.element, \"desktop\"); return <button key={`${entry.pageId}:${entry.element.id}`} type=\"button\" onClick={() => onInsert({ elements: entry.elements, rootId: entry.element.id })} className=\"flex w-full items-center gap-3 rounded-xl border border-ed-border bg-ed-subtle p-2.5 text-left hover:border-ed-accent/40 hover:bg-ed-field\"><span className=\"h-10 w-12 shrink-0 rounded-lg border border-ed-border\" style={{ background: style.gradient || style.bg || \"var(--ed-field)\" }} /><span className=\"min-w-0 flex-1\"><span className=\"block truncate text-[10px] font-medium text-ed-text\">{displayName(entry.element)}</span><span className=\"block truncate text-[9px] text-ed-faint\">{entry.pageName} \u00B7 {entry.childCount} children</span></span><IconPlus size={12} className=\"text-ed-faint\" /></button>; })}{visible.length === 0 && <Empty />}</div>;\n}\n\nfunction PresetPreview({ preset }: { preset: ComponentPreset }) {\n const light = preset.id === \"navbar-light\"; const glass = preset.id === \"navbar-glass\";\n if (preset.category === \"Navigation\") return <span className={`flex h-24 items-start p-4 ${light ? \"bg-[#e8edf4]\" : glass ? \"bg-gradient-to-br from-[#4338ca] to-[#0f172a]\" : \"bg-[#070b16]\"}`}><span className={`flex h-9 w-full items-center gap-2 rounded-lg px-3 ${glass ? \"border border-white/15 bg-white/10 backdrop-blur\" : light ? \"bg-white shadow-md\" : \"bg-[#111827]\"}`}><span className={`h-2 w-10 rounded-full ${light ? \"bg-slate-900\" : \"bg-white\"}`} /><span className=\"ml-auto h-1 w-7 rounded bg-slate-400/60\" /><span className=\"h-1 w-7 rounded bg-slate-400/60\" /><span className={`ml-1 h-4 w-12 rounded-full ${glass ? \"bg-white\" : light ? \"bg-slate-900\" : \"bg-[#8b7bff]\"}`} /></span></span>;\n if (preset.category === \"Hero\") return <span className=\"flex h-32 flex-col items-center justify-center gap-2 bg-[radial-gradient(circle_at_50%_0%,#4338ca,#0b1020_65%)] px-8\"><span className=\"h-1 w-16 rounded bg-indigo-300/70\" /><span className=\"h-3 w-4/5 rounded bg-white\" /><span className=\"h-1.5 w-2/3 rounded bg-slate-300/60\" /><span className=\"mt-2 h-5 w-16 rounded-full bg-[#8b7bff]\" /></span>;\n return <span className=\"flex h-28 flex-col justify-between bg-[#09090f] p-4\"><span className=\"flex justify-between\"><span className=\"space-y-2\"><span className=\"block h-2 w-10 rounded bg-white\" /><span className=\"block h-1 w-16 rounded bg-slate-600\" /></span><span className=\"flex gap-5\">{[1,2,3].map((value) => <span key={value} className=\"space-y-2\"><span className=\"block h-1.5 w-8 rounded bg-slate-300\" /><span className=\"block h-1 w-6 rounded bg-slate-700\" /><span className=\"block h-1 w-7 rounded bg-slate-700\" /></span>)}</span></span><span className=\"h-px bg-slate-800\" /></span>;\n}\n\nfunction BasicPreview({ type }: { type: ElementType }) {\n return <span className=\"flex h-14 items-center justify-center border-b border-ed-border bg-ed-field/60 px-2\">{type === \"Button\" ? <span className=\"rounded-full bg-[#8b7bff] px-3 py-1.5 text-[7px] font-semibold text-white\">Button</span> : type === \"Heading\" ? <span className=\"text-xs font-bold text-ed-text\">Big heading</span> : type === \"Text\" ? <span className=\"space-y-1.5\"><span className=\"block h-1 w-16 rounded bg-ed-muted/70\" /><span className=\"block h-1 w-11 rounded bg-ed-faint/50\" /></span> : type === \"Image\" || type === \"Video\" ? <span className=\"h-9 w-16 rounded bg-gradient-to-br from-indigo-400/50 to-cyan-400/20\" /> : type === \"Request\" ? <span className=\"flex h-9 w-16 items-center justify-center rounded border border-cyan-400/30 bg-cyan-400/10 font-mono text-[7px] text-cyan-300\">GET {\"{}\"}</span> : type === \"Grid\" || type === \"Repeat\" ? <span className=\"flex gap-1\">{[1,2,3].map((item) => <span key={item} className=\"h-8 w-6 rounded border border-ed-border bg-ed-surface\" />)}</span> : <span className=\"h-9 w-16 rounded border border-ed-border bg-ed-surface shadow-sm\" />}</span>;\n}\n\nfunction Empty() { return <p className=\"p-6 text-center text-[10px] leading-relaxed text-ed-faint\">Nothing matches this category yet.</p>; }\n\nexport { IconArrowLeft };\n", "import { createElement } from \"./tree\";\nimport type { CanvasElement, ElementStyle, ElementType } from \"./types\";\n\nexport type ComponentPreset = {\n id: string;\n name: string;\n category: \"Navigation\" | \"Hero\" | \"Footer\";\n description: string;\n create: () => CanvasElement[];\n};\n\nfunction node(\n type: ElementType,\n patch: Partial<ElementStyle>,\n props: Partial<CanvasElement> = {},\n parentId?: string,\n) {\n const element = createElement(type, { x: 0, y: 0, z: 0, parentId });\n element.base = { ...element.base, ...patch };\n return Object.assign(element, props);\n}\n\nfunction navbar() {\n const bar = node(\"Section\", {\n widthMode: \"fill\", heightMode: \"auto\", layout: \"stack\", direction: \"row\",\n justify: \"between\", align: \"center\", gap: 24, padT: 18, padR: 40,\n padB: 18, padL: 40, bg: \"#0b1020\", color: \"#f8fafc\",\n }, { name: \"Navbar\" });\n bar.overrides = { mobile: { direction: \"column\", align: \"stretch\", padR: 20, padL: 20 } };\n\n const logo = node(\"Heading\", { widthMode: \"auto\", heightMode: \"auto\", fontSize: 20, fontWeight: \"700\", color: \"#ffffff\", letterSpacing: -0.4 }, { name: \"Brand\", content: \"NORTHSTAR\" }, bar.id);\n const links = node(\"Container\", { widthMode: \"auto\", heightMode: \"auto\", layout: \"stack\", direction: \"row\", align: \"center\", gap: 6, padT: 0, padR: 0, padB: 0, padL: 0, borderW: 0 }, { name: \"Navigation links\" }, bar.id);\n links.overrides = { mobile: { widthMode: \"fill\", justify: \"center\", wrap: true } };\n const link = (label: string) => node(\"Button\", { widthMode: \"auto\", heightMode: \"auto\", bg: \"transparent\", color: \"#cbd5e1\", padT: 8, padR: 12, padB: 8, padL: 12, fontSize: 14, fontWeight: \"500\" }, { content: label }, links.id);\n const cta = node(\"Button\", { widthMode: \"auto\", heightMode: \"auto\", bg: \"#8b7bff\", color: \"#ffffff\", radius: 999, padT: 10, padR: 18, padB: 10, padL: 18, fontSize: 14, fontWeight: \"600\" }, { content: \"Get started\", name: \"Navbar CTA\" }, bar.id);\n return [bar, logo, links, link(\"Product\"), link(\"Solutions\"), link(\"Pricing\"), cta];\n}\n\nfunction navbarLight() {\n const elements = navbar();\n const bar = elements[0];\n bar.name = \"Navbar \u00B7 Light\";\n bar.base = { ...bar.base, bg: \"#ffffff\", color: \"#111827\", borderW: 0, shadow: \"0 1px 0 rgba(15,23,42,.10)\", padT: 16, padB: 16 };\n for (const element of elements) {\n if (element.name === \"Brand\") element.base = { ...element.base, color: \"#111827\" };\n if (element.parentId === elements[2].id) element.base = { ...element.base, color: \"#475569\" };\n }\n const cta = elements.find((element) => element.name === \"Navbar CTA\");\n if (cta) cta.base = { ...cta.base, bg: \"#111827\", color: \"#ffffff\", radius: 10 };\n return elements;\n}\n\nfunction navbarGlass() {\n const elements = navbar();\n const bar = elements[0];\n bar.name = \"Navbar \u00B7 Glass\";\n bar.base = { ...bar.base, bg: \"rgba(15,23,42,.78)\", backdropBlur: 18, borderW: 1, borderC: \"rgba(255,255,255,.12)\", radius: 18, padT: 14, padR: 22, padB: 14, padL: 22, shadow: \"0 18px 50px rgba(2,6,23,.28)\" };\n const cta = elements.find((element) => element.name === \"Navbar CTA\");\n if (cta) cta.base = { ...cta.base, bg: \"#ffffff\", color: \"#111827\" };\n return elements;\n}\n\nfunction footer() {\n const root = node(\"Section\", { widthMode: \"fill\", heightMode: \"auto\", layout: \"stack\", direction: \"column\", gap: 36, padT: 64, padR: 40, padB: 32, padL: 40, bg: \"#09090f\", color: \"#f8fafc\" }, { name: \"Footer\" });\n const top = node(\"Container\", { widthMode: \"fill\", heightMode: \"auto\", layout: \"stack\", direction: \"row\", justify: \"between\", align: \"start\", gap: 32, padT: 0, padR: 0, padB: 0, padL: 0, borderW: 0 }, { name: \"Footer content\" }, root.id);\n top.overrides = { mobile: { direction: \"column\" } };\n const brand = node(\"Container\", { widthMode: \"fixed\", w: 340, heightMode: \"auto\", layout: \"stack\", direction: \"column\", gap: 12, padT: 0, padR: 0, padB: 0, padL: 0, borderW: 0 }, { name: \"Footer brand\" }, top.id);\n const title = node(\"Heading\", { widthMode: \"auto\", heightMode: \"auto\", fontSize: 24, fontWeight: \"700\", color: \"#ffffff\" }, { content: \"NORTHSTAR\" }, brand.id);\n const copy = node(\"Text\", { widthMode: \"fill\", heightMode: \"auto\", fontSize: 14, color: \"#94a3b8\", lineHeight: 1.7 }, { content: \"Thoughtful digital products for teams building what comes next.\" }, brand.id);\n const columns = node(\"Container\", { widthMode: \"auto\", heightMode: \"auto\", layout: \"stack\", direction: \"row\", gap: 64, padT: 0, padR: 0, padB: 0, padL: 0, borderW: 0 }, { name: \"Footer links\" }, top.id);\n columns.overrides = { mobile: { widthMode: \"fill\", wrap: true, gap: 32 } };\n const column = (heading: string, body: string) => {\n const group = node(\"Container\", { widthMode: \"fixed\", w: 130, heightMode: \"auto\", layout: \"stack\", direction: \"column\", gap: 10, padT: 0, padR: 0, padB: 0, padL: 0, borderW: 0 }, {}, columns.id);\n return [group, node(\"Heading\", { widthMode: \"auto\", heightMode: \"auto\", fontSize: 13, fontWeight: \"600\", color: \"#ffffff\" }, { content: heading }, group.id), node(\"Text\", { widthMode: \"auto\", heightMode: \"auto\", fontSize: 13, color: \"#94a3b8\", lineHeight: 2 }, { content: body }, group.id)];\n };\n const legal = node(\"Text\", { widthMode: \"fill\", heightMode: \"auto\", padT: 24, borderW: 0, color: \"#64748b\", fontSize: 12 }, { content: \"\u00A9 2026 Northstar. All rights reserved.\" }, root.id);\n return [root, top, brand, title, copy, columns, ...column(\"Product\", \"Features\\nIntegrations\\nChangelog\"), ...column(\"Company\", \"About\\nJournal\\nContact\"), legal];\n}\n\nfunction hero() {\n const root = node(\"Section\", { widthMode: \"fill\", heightMode: \"auto\", layout: \"stack\", direction: \"column\", justify: \"center\", align: \"center\", gap: 24, padT: 112, padR: 32, padB: 112, padL: 32, bg: \"#0b1020\", gradient: \"radial-gradient(circle at 50% 0%, #312e81 0%, #0b1020 55%)\", color: \"#ffffff\", textAlign: \"center\" }, { name: \"Hero\" });\n const eyebrow = node(\"Text\", { widthMode: \"auto\", heightMode: \"auto\", color: \"#a5b4fc\", fontSize: 13, fontWeight: \"600\", letterSpacing: 1.8, textTransform: \"uppercase\", textAlign: \"center\" }, { content: \"Built for ambitious teams\" }, root.id);\n const heading = node(\"Heading\", { widthMode: \"fixed\", w: 820, heightMode: \"auto\", color: \"#ffffff\", fontSize: 64, fontWeight: \"700\", lineHeight: 1.05, letterSpacing: -2, textAlign: \"center\" }, { content: \"Turn your next big idea into something remarkable\" }, root.id);\n heading.overrides = { tablet: { w: 640, fontSize: 48 }, mobile: { widthMode: \"fill\", fontSize: 38, letterSpacing: -1 } };\n const text = node(\"Text\", { widthMode: \"fixed\", w: 620, heightMode: \"auto\", color: \"#cbd5e1\", fontSize: 18, lineHeight: 1.7, textAlign: \"center\" }, { content: \"A flexible platform for designing, launching, and improving digital experiences without slowing down.\" }, root.id);\n text.overrides = { mobile: { widthMode: \"fill\", fontSize: 16 } };\n const actions = node(\"Container\", { widthMode: \"auto\", heightMode: \"auto\", layout: \"stack\", direction: \"row\", justify: \"center\", align: \"center\", gap: 12, padT: 8, padR: 0, padB: 0, padL: 0, borderW: 0 }, {}, root.id);\n actions.overrides = { mobile: { widthMode: \"fill\", direction: \"column\", align: \"stretch\" } };\n const primary = node(\"Button\", { widthMode: \"auto\", heightMode: \"auto\", bg: \"#8b7bff\", color: \"#ffffff\", radius: 999, padT: 14, padR: 24, padB: 14, padL: 24, fontWeight: \"600\" }, { content: \"Start building\" }, actions.id);\n const secondary = node(\"Button\", { widthMode: \"auto\", heightMode: \"auto\", bg: \"rgba(255,255,255,.08)\", color: \"#ffffff\", radius: 999, borderW: 1, borderC: \"rgba(255,255,255,.16)\", padT: 14, padR: 24, padB: 14, padL: 24, fontWeight: \"600\" }, { content: \"See how it works\" }, actions.id);\n return [root, eyebrow, heading, text, actions, primary, secondary];\n}\n\nexport const COMPONENT_PRESETS: ComponentPreset[] = [\n { id: \"navbar-dark\", name: \"Navbar Dark\", category: \"Navigation\", description: \"Dark brand, links and pill CTA\", create: navbar },\n { id: \"navbar-light\", name: \"Navbar Light\", category: \"Navigation\", description: \"Clean product navigation\", create: navbarLight },\n { id: \"navbar-glass\", name: \"Navbar Glass\", category: \"Navigation\", description: \"Floating translucent navigation\", create: navbarGlass },\n { id: \"hero-centered\", name: \"Hero Centered\", category: \"Hero\", description: \"Gradient conversion hero\", create: hero },\n { id: \"footer-columns\", name: \"Footer Columns\", category: \"Footer\", description: \"Responsive link footer\", create: footer },\n];\n", "\"use client\";\n\nimport {\n IconArrowDown,\n IconArrowUp,\n IconBox,\n IconChevronRight,\n IconCopy,\n IconCloudDownload,\n IconEye,\n IconEyeOff,\n IconFile,\n IconGridDots,\n IconHandClick,\n IconHeart,\n IconHeading,\n IconLock,\n IconLockOpen,\n IconLayoutRows,\n IconPencil,\n IconPhoto,\n IconPlayerPlay,\n IconPlus,\n IconRepeat,\n IconSection,\n IconSearch,\n IconSparkles,\n IconStar,\n IconArrowRight,\n IconCheck,\n IconMenu2,\n IconTrash,\n IconTypography,\n IconVideo,\n IconWorld,\n} from \"@tabler/icons-react\";\nimport type React from \"react\";\nimport { useState } from \"react\";\nimport { resolveStyle } from \"@/lib/editor/style\";\nimport { IconGlyph } from \"@/lib/editor/icon\";\nimport { childrenOf, displayName } from \"@/lib/editor/tree\";\nimport {\n type Breakpoint,\n type CanvasElement,\n DRAG_MIME,\n type ElementStyle,\n type ElementType,\n isContainer,\n MOVE_MIME,\n type ResizeHandle,\n} from \"@/lib/editor/types\";\nimport type { SaveStatus } from \"./use-editor\";\n\nconst TYPE_ICONS: Record<\n ElementType,\n React.ComponentType<{ size?: number; stroke?: number }>\n> = {\n Frame: IconBox,\n Stack: IconLayoutRows,\n Section: IconSection,\n Container: IconBox,\n Grid: IconGridDots,\n Heading: IconHeading,\n Text: IconTypography,\n Image: IconPhoto,\n Button: IconHandClick,\n Video: IconVideo,\n Icon: IconSparkles,\n Request: IconCloudDownload,\n Repeat: IconRepeat,\n};\n\n/* ------------------------------------------------------------------ canvas */\n\n/** What an element shows on the canvas when it is not being text-edited. */\nexport function ElementBody({ element }: { element: CanvasElement }) {\n if (element.code) return <iframe title={element.name ?? \"Code component\"} srcDoc={element.code} sandbox=\"\" className=\"pointer-events-none h-full w-full border-0 bg-transparent\" />;\n if (element.type === \"Image\") {\n if (element.src) {\n return (\n // biome-ignore lint/performance/noImgElement: the src is author-supplied at runtime and cannot be statically optimised\n <img\n src={element.src}\n alt={element.alt ?? \"\"}\n draggable={false}\n className=\"pointer-events-none h-full w-full\"\n style={{ objectFit: element.objectFit ?? \"cover\", borderRadius: \"inherit\" }}\n />\n );\n }\n return (\n <span className=\"pointer-events-none flex h-full w-full items-center justify-center text-ed-muted\">\n <IconPhoto size={28} stroke={1.5} />\n </span>\n );\n }\n\n if (element.type === \"Video\") {\n return (\n <span className=\"pointer-events-none flex h-full w-full flex-col items-center justify-center gap-1 text-ed-muted\">\n <IconPlayerPlay size={28} stroke={1.5} />\n {element.src && (\n <span className=\"max-w-full truncate px-2 text-[9px]\">\n {element.src}\n </span>\n )}\n </span>\n );\n }\n\n if (element.type === \"Icon\") return <span className=\"pointer-events-none block size-full\"><IconGlyph element={element} /></span>;\n\n if (!element.content) return null;\n return (\n <span className=\"pointer-events-none block w-full select-none whitespace-pre-wrap\">\n {element.content}\n </span>\n );\n}\n\nconst CORNER_HANDLES: Array<{ handle: ResizeHandle; className: string }> = [\n { handle: \"nw\", className: \"-top-[5px] -left-[5px] cursor-nwse-resize\" },\n { handle: \"ne\", className: \"-top-[5px] -right-[5px] cursor-nesw-resize\" },\n { handle: \"sw\", className: \"-bottom-[5px] -left-[5px] cursor-nesw-resize\" },\n { handle: \"se\", className: \"-bottom-[5px] -right-[5px] cursor-nwse-resize\" },\n];\n\nconst EDGE_HANDLES: Record<ResizeHandle, string> = {\n nw: \"\",\n ne: \"\",\n sw: \"\",\n se: \"\",\n n: \"left-1/2 -top-[5px] -translate-x-1/2 cursor-ns-resize\",\n s: \"left-1/2 -bottom-[5px] -translate-x-1/2 cursor-ns-resize\",\n w: \"top-1/2 -left-[5px] -translate-y-1/2 cursor-ew-resize\",\n e: \"top-1/2 -right-[5px] -translate-y-1/2 cursor-ew-resize\",\n};\n\n/**\n * Only the axes the element can actually be resized on get a handle: a `fill`\n * or `auto` dimension is decided by the layout, not by dragging.\n */\nexport function ResizeHandles({\n element,\n style,\n onMouseDown,\n}: {\n element: CanvasElement;\n style: ElementStyle;\n onMouseDown: (\n event: React.MouseEvent,\n handle: ResizeHandle,\n element: CanvasElement,\n ) => void;\n}) {\n const canWidth = style.widthMode === \"fixed\";\n const canHeight = style.heightMode === \"fixed\";\n if (!canWidth && !canHeight) return null;\n\n const handles: Array<{ handle: ResizeHandle; className: string }> =\n canWidth && canHeight\n ? CORNER_HANDLES\n : canWidth\n ? ([\"w\", \"e\"] as const).map((h) => ({ handle: h, className: EDGE_HANDLES[h] }))\n : ([\"n\", \"s\"] as const).map((h) => ({ handle: h, className: EDGE_HANDLES[h] }));\n\n return (\n <>\n {handles.map(({ handle, className }) => (\n <button\n type=\"button\"\n key={handle}\n aria-label={`Resize ${handle}`}\n onMouseDown={(event) => onMouseDown(event, handle, element)}\n className={`absolute z-[60] h-[10px] w-[10px] rounded-full border-[1.5px] border-ed-accent bg-ed-surface shadow-sm ${className}`}\n />\n ))}\n </>\n );\n}\n\nexport function Breadcrumbs({\n byId,\n selectedId,\n onSelect,\n}: {\n byId: Map<string, CanvasElement>;\n selectedId: string | null;\n onSelect: (id: string) => void;\n}) {\n const trail: CanvasElement[] = [];\n let cursor = selectedId ? byId.get(selectedId) : undefined;\n const guard = new Set<string>();\n while (cursor && !guard.has(cursor.id)) {\n guard.add(cursor.id);\n trail.unshift(cursor);\n cursor = cursor.parentId ? byId.get(cursor.parentId) : undefined;\n }\n\n return (\n <div className=\"pointer-events-auto flex items-center gap-1\">\n <span className=\"text-ed-faint\">Page</span>\n {trail.map((el) => (\n <span key={el.id} className=\"flex items-center gap-1\">\n <IconChevronRight size={11} className=\"text-ed-faint\" />\n <button\n type=\"button\"\n onClick={() => onSelect(el.id)}\n className=\"text-ed-muted transition-colors hover:text-ed-text\"\n >\n {displayName(el)}\n </button>\n </span>\n ))}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ header */\n\nconst SAVE_LABELS: Record<SaveStatus, { text: string; dot: string }> = {\n saved: { text: \"Saved\", dot: \"bg-emerald-500\" },\n dirty: { text: \"Unsaved changes\", dot: \"bg-amber-500\" },\n saving: { text: \"Saving\u2026\", dot: \"bg-blue-500 animate-pulse\" },\n error: { text: \"Save failed\", dot: \"bg-red-500\" },\n conflict: { text: \"Reloaded from server\", dot: \"bg-amber-500\" },\n};\n\nexport function SaveIndicator({\n status,\n error,\n}: {\n status: SaveStatus;\n error: string | null;\n}) {\n const { text, dot } = SAVE_LABELS[status];\n return (\n <span\n title={error ?? undefined}\n className=\"flex items-center gap-1.5 whitespace-nowrap text-[11px] text-ed-muted\"\n >\n <span className={`h-1.5 w-1.5 rounded-full ${dot}`} />\n {text}\n </span>\n );\n}\n\n/* ------------------------------------------------------------- left panels */\n\nconst ELEMENT_GROUPS: Array<{ title: string; types: ElementType[] }> = [\n { title: \"Layout\", types: [\"Frame\", \"Stack\", \"Grid\", \"Section\", \"Container\"] },\n { title: \"Basic\", types: [\"Heading\", \"Text\", \"Image\", \"Button\", \"Video\"] },\n { title: \"Data\", types: [\"Request\", \"Repeat\"] },\n];\n\nexport function ElementsPanel({\n search,\n onInsert,\n}: {\n search: string;\n onInsert: (type: ElementType) => void;\n}) {\n const query = search.trim().toLowerCase();\n const groups = ELEMENT_GROUPS.map((group) => ({\n ...group,\n types: group.types.filter((type) => type.toLowerCase().includes(query)),\n })).filter((group) => group.types.length > 0);\n\n if (groups.length === 0) {\n return <p className=\"p-4 text-center text-ed-faint\">No elements match \u201C{search}\u201D</p>;\n }\n\n return (\n <div className=\"flex flex-col gap-6 p-3.5\">\n {groups.map((group) => (\n <div key={group.title}>\n <h3 className=\"mb-3 px-1 text-[9px] font-bold uppercase tracking-[0.18em] text-ed-faint\">\n {group.title}\n </h3>\n <div className=\"grid grid-cols-2 gap-2\">\n {group.types.map((type) => {\n const Icon = TYPE_ICONS[type];\n return (\n <button\n type=\"button\"\n key={type}\n draggable\n onDragStart={(event) => {\n event.dataTransfer.setData(DRAG_MIME, type);\n event.dataTransfer.effectAllowed = \"copy\";\n }}\n onClick={() => onInsert(type)}\n className=\"pg-chrome-card group relative flex cursor-grab flex-col items-center justify-center gap-2 overflow-hidden rounded-2xl border border-ed-border bg-gradient-to-b from-ed-subtle to-ed-surface p-3.5 transition-all duration-200 hover:-translate-y-0.5 hover:border-ed-accent/40 hover:from-ed-field active:scale-[.97] active:cursor-grabbing\"\n >\n <span className=\"pointer-events-none flex size-8 items-center justify-center rounded-xl bg-ed-field text-ed-muted ring-1 ring-inset ring-white/[.03] transition-all group-hover:scale-105 group-hover:bg-ed-accent/15 group-hover:text-ed-accent\">\n <Icon size={20} stroke={1.5} />\n </span>\n <span className=\"pointer-events-none text-[10px] font-medium text-ed-muted group-hover:text-ed-text\">\n {type}\n </span>\n </button>\n );\n })}\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nconst ICON_CHOICES = [\n { name: \"Star\", value: \"star\", icon: IconStar },\n { name: \"Heart\", value: \"heart\", icon: IconHeart },\n { name: \"Arrow right\", value: \"arrow-right\", icon: IconArrowRight },\n { name: \"Check\", value: \"check\", icon: IconCheck },\n { name: \"Menu\", value: \"menu\", icon: IconMenu2 },\n { name: \"Search\", value: \"search\", icon: IconSearch },\n] as const;\n\nexport function IconsPanel({ search, onInsert }: {\n search: string;\n onInsert: (iconName: CanvasElement[\"iconName\"]) => void;\n}) {\n const query = search.trim().toLowerCase();\n const icons = ICON_CHOICES.filter((item) => item.name.toLowerCase().includes(query));\n return <div className=\"grid grid-cols-3 gap-2 p-3\">{icons.map(({ name, value, icon: Icon }) => <button key={value} type=\"button\" title={name} onClick={() => onInsert(value)} className=\"group flex aspect-square flex-col items-center justify-center gap-2 rounded-2xl border border-ed-border bg-ed-subtle text-ed-muted transition-all hover:-translate-y-0.5 hover:border-ed-accent/50 hover:bg-ed-field hover:text-ed-accent active:scale-95\"><Icon size={22} stroke={1.7} /><span className=\"max-w-full truncate px-1 text-[8px] text-ed-faint group-hover:text-ed-muted\">{name}</span></button>)}</div>;\n}\n\nexport function LayersPanel({\n elements,\n breakpoint,\n search,\n selectedIds,\n onSelect,\n onToggleHidden,\n onToggleLocked,\n onReorder,\n onDelete,\n onReparent,\n}: {\n elements: CanvasElement[];\n breakpoint: Breakpoint;\n search: string;\n selectedIds: string[];\n onSelect: (id: string, additive: boolean) => void;\n onToggleHidden: (id: string) => void;\n onToggleLocked: (id: string) => void;\n onReorder: (id: string, direction: \"up\" | \"down\") => void;\n onDelete: (id: string) => void;\n onReparent: (id: string, parentId: string | undefined, beforeId?: string) => void;\n}) {\n const [dropTarget, setDropTarget] = useState<string | null>(null);\n\n if (elements.length === 0) {\n return (\n <p className=\"p-4 text-center text-ed-faint\">\n Nothing on the canvas yet. Drop an element from the Elements tab.\n </p>\n );\n }\n\n const query = search.trim().toLowerCase();\n const matches = (el: CanvasElement) =>\n !query || displayName(el).toLowerCase().includes(query);\n\n // Layers are listed top-most first, the reverse of paint order.\n const rows = (parentId: string | undefined, depth: number): React.ReactNode[] =>\n childrenOf(elements, parentId)\n .slice()\n .reverse()\n .flatMap((el) => {\n const nested = rows(el.id, depth + 1);\n // Keep a branch visible when a descendant matches the search.\n if (!matches(el) && nested.length === 0) return [];\n\n return [\n <LayerRow\n key={el.id}\n element={el}\n style={resolveStyle(el, breakpoint)}\n depth={depth}\n isSelected={selectedIds.includes(el.id)}\n isDropTarget={dropTarget === el.id}\n onSelect={onSelect}\n onToggleHidden={onToggleHidden}\n onToggleLocked={onToggleLocked}\n onReorder={onReorder}\n onDelete={onDelete}\n onDropTargetChange={setDropTarget}\n onReparent={onReparent}\n />,\n ...nested,\n ];\n });\n\n const list = rows(undefined, 0);\n if (list.length === 0) {\n return <p className=\"p-4 text-center text-ed-faint\">No layers match \u201C{search}\u201D</p>;\n }\n\n return (\n // The panel body is a drop zone for moving a layer to the page root;\n // the row buttons carry the keyboard-reachable actions.\n // biome-ignore lint/a11y/noStaticElementInteractions: drag-and-drop surface\n <div\n className=\"min-h-full py-2\"\n onDragOver={(event) => {\n if (!event.dataTransfer.types.includes(MOVE_MIME)) return;\n event.preventDefault();\n setDropTarget(null);\n }}\n onDrop={(event) => {\n const id = event.dataTransfer.getData(MOVE_MIME);\n if (!id) return;\n event.preventDefault();\n // Dropping on empty panel space moves the layer to the page root.\n onReparent(id, undefined);\n setDropTarget(null);\n }}\n >\n {list}\n </div>\n );\n}\n\nfunction LayerRow({\n element,\n style,\n depth,\n isSelected,\n isDropTarget,\n onSelect,\n onToggleHidden,\n onToggleLocked,\n onReorder,\n onDelete,\n onDropTargetChange,\n onReparent,\n}: {\n element: CanvasElement;\n style: ElementStyle;\n depth: number;\n isSelected: boolean;\n isDropTarget: boolean;\n onSelect: (id: string, additive: boolean) => void;\n onToggleHidden: (id: string) => void;\n onToggleLocked: (id: string) => void;\n onReorder: (id: string, direction: \"up\" | \"down\") => void;\n onDelete: (id: string) => void;\n onDropTargetChange: (id: string | null) => void;\n onReparent: (id: string, parentId: string | undefined, beforeId?: string) => void;\n}) {\n const Icon = TYPE_ICONS[element.type];\n const container = isContainer(element.type);\n\n return (\n // A container row accepts dropped layers; selection and every action\n // live on the buttons inside it.\n // biome-ignore lint/a11y/noStaticElementInteractions: drag-and-drop surface\n <div\n className={`group flex h-8 items-center gap-2 pr-2 text-[11px] transition-colors ${isDropTarget\n ? \"bg-emerald-500/20 text-ed-text\"\n : isSelected\n ? \"bg-[var(--ed-accent-soft)] text-ed-text\"\n : \"text-ed-muted hover:bg-ed-field hover:text-ed-text\"\n }`}\n style={{ paddingLeft: 12 + depth * 14 }}\n onDragOver={\n container\n ? (event) => {\n if (!event.dataTransfer.types.includes(MOVE_MIME)) return;\n event.preventDefault();\n event.stopPropagation();\n event.dataTransfer.dropEffect = \"move\";\n onDropTargetChange(element.id);\n }\n : undefined\n }\n onDragLeave={container ? () => onDropTargetChange(null) : undefined}\n onDrop={\n container\n ? (event) => {\n const id = event.dataTransfer.getData(MOVE_MIME);\n if (!id) return;\n event.preventDefault();\n event.stopPropagation();\n onReparent(id, element.id);\n onDropTargetChange(null);\n }\n : undefined\n }\n >\n {/* The row's own button selects; the action buttons sit beside it so\n the markup stays valid (buttons cannot nest). */}\n <button\n type=\"button\"\n draggable\n onDragStart={(event) => {\n event.dataTransfer.setData(MOVE_MIME, element.id);\n event.dataTransfer.effectAllowed = \"move\";\n }}\n onClick={(event) => onSelect(element.id, event.shiftKey || event.metaKey)}\n aria-pressed={isSelected}\n className=\"flex min-w-0 flex-1 cursor-grab items-center gap-2 text-left active:cursor-grabbing\"\n >\n <Icon size={13} stroke={1.5} />\n <span\n className={`flex-1 truncate ${style.hidden ? \"text-ed-faint line-through\" : \"\"}`}\n >\n {displayName(element)}\n </span>\n </button>\n\n <span className=\"flex items-center gap-0.5 opacity-0 transition-opacity focus-within:opacity-100 group-hover:opacity-100\">\n <LayerAction\n label=\"Move up\"\n onClick={() => onReorder(element.id, \"up\")}\n icon={<IconArrowUp size={12} />}\n />\n <LayerAction\n label=\"Move down\"\n onClick={() => onReorder(element.id, \"down\")}\n icon={<IconArrowDown size={12} />}\n />\n <LayerAction\n label={element.locked ? \"Unlock\" : \"Lock\"}\n onClick={() => onToggleLocked(element.id)}\n icon={element.locked ? <IconLock size={12} /> : <IconLockOpen size={12} />}\n />\n <LayerAction\n label=\"Delete\"\n onClick={() => onDelete(element.id)}\n icon={<IconTrash size={12} />}\n />\n </span>\n\n <LayerAction\n label={style.hidden ? \"Show\" : \"Hide\"}\n onClick={() => onToggleHidden(element.id)}\n icon={style.hidden ? <IconEyeOff size={12} /> : <IconEye size={12} />}\n className={style.hidden ? \"\" : \"opacity-0 group-hover:opacity-100\"}\n />\n </div>\n );\n}\n\nfunction LayerAction({\n label,\n onClick,\n icon,\n className = \"\",\n}: {\n label: string;\n onClick: () => void;\n icon: React.ReactNode;\n className?: string;\n}) {\n return (\n <button\n type=\"button\"\n title={label}\n aria-label={label}\n onClick={(event) => {\n event.stopPropagation();\n onClick();\n }}\n className={`rounded p-1 text-ed-muted transition-colors hover:bg-ed-field-hover hover:text-ed-text ${className}`}\n >\n {icon}\n </button>\n );\n}\n\n/* ------------------------------------------------------------- pages panel */\n\nexport type PageEntry = {\n id: string;\n name: string;\n slug: string;\n published: boolean;\n};\n\nexport function PagesPanel({\n pages,\n currentId,\n busy,\n error,\n onCreate,\n onRename,\n onDuplicate,\n onDelete,\n onNavigate,\n publishedHref,\n}: {\n pages: PageEntry[];\n currentId: string;\n busy: boolean;\n error: string | null;\n onCreate: (name: string) => void;\n onRename: (id: string, name: string, slug: string) => void;\n onDuplicate: (id: string, name: string) => void;\n onDelete: (id: string) => void;\n onNavigate: (id: string) => void;\n publishedHref: (slug: string) => string;\n}) {\n const [newName, setNewName] = useState(\"\");\n const [editing, setEditing] = useState<string | null>(null);\n const [draft, setDraft] = useState({ name: \"\", slug: \"\" });\n\n return (\n <div className=\"flex flex-col gap-3 p-3\">\n <form\n className=\"flex gap-1\"\n onSubmit={(event) => {\n event.preventDefault();\n if (!newName.trim()) return;\n onCreate(newName.trim());\n setNewName(\"\");\n }}\n >\n <input\n type=\"text\"\n value={newName}\n placeholder=\"New page name\"\n onChange={(event) => setNewName(event.target.value)}\n className=\"min-w-0 flex-1 rounded border border-ed-border bg-ed-surface px-2 py-1.5 text-xs text-ed-text outline-none placeholder:text-ed-faint focus:border-ed-accent/50 focus:ring-1 focus:ring-blue-500/20\"\n />\n <button\n type=\"submit\"\n disabled={busy || !newName.trim()}\n className=\"rounded bg-ed-accent px-2 text-ed-text transition-colors hover:opacity-90 disabled:pointer-events-none disabled:opacity-40\"\n >\n <IconPlus size={14} />\n </button>\n </form>\n\n {error && (\n <p className=\"rounded border border-red-500/20 bg-red-500/10 px-2 py-1.5 text-[10px] text-red-300\">\n {error}\n </p>\n )}\n\n <div className=\"flex flex-col gap-1\">\n {pages.map((page) => {\n const isCurrent = page.id === currentId;\n\n if (editing === page.id) {\n return (\n <form\n key={page.id}\n className=\"flex flex-col gap-1 rounded border border-ed-accent/40 bg-black/30 p-2\"\n onSubmit={(event) => {\n event.preventDefault();\n onRename(page.id, draft.name, draft.slug);\n setEditing(null);\n }}\n >\n <input\n type=\"text\"\n value={draft.name}\n aria-label=\"Page name\"\n onChange={(e) =>\n setDraft((d) => ({ ...d, name: e.target.value }))\n }\n className=\"rounded bg-ed-surface px-2 py-1 text-xs text-ed-text outline-none\"\n />\n <div className=\"flex items-center gap-1 rounded bg-ed-surface px-2 py-1\">\n <span className=\"max-w-24 truncate text-[10px] text-ed-faint\">\n {publishedHref(\"\").replace(/\\/$/, \"\") || \"/\"}\n </span>\n <input\n type=\"text\"\n value={draft.slug}\n aria-label=\"Page URL slug\"\n onChange={(e) =>\n setDraft((d) => ({ ...d, slug: e.target.value }))\n }\n className=\"min-w-0 flex-1 bg-transparent text-xs text-ed-text outline-none\"\n />\n </div>\n <div className=\"flex gap-1\">\n <button\n type=\"submit\"\n className=\"flex-1 rounded bg-ed-accent py-1 text-[10px] text-ed-text hover:opacity-90\"\n >\n Save\n </button>\n <button\n type=\"button\"\n onClick={() => setEditing(null)}\n className=\"flex-1 rounded bg-ed-field py-1 text-[10px] text-ed-muted hover:text-ed-text\"\n >\n Cancel\n </button>\n </div>\n </form>\n );\n }\n\n return (\n <div\n key={page.id}\n className={`group flex items-center gap-1.5 rounded px-2 py-1.5 transition-colors ${isCurrent\n ? \"bg-[var(--ed-accent-soft)] text-ed-text\"\n : \"text-ed-muted hover:bg-ed-field\"\n }`}\n >\n <button\n type=\"button\"\n onClick={() => onNavigate(page.id)}\n className=\"flex min-w-0 flex-1 items-center gap-2\"\n >\n <IconFile size={13} stroke={1.5} />\n <span className=\"min-w-0 flex-1 truncate text-[11px] text-left\">\n {page.name}\n </span>\n {page.published && (\n <IconWorld\n size={11}\n className=\"shrink-0 text-emerald-500\"\n title=\"Published\"\n />\n )}\n </button>\n <span className=\"flex items-center gap-0.5 opacity-0 transition-opacity group-hover:opacity-100\">\n {page.slug !== \"home\" && <LayerAction\n label=\"Rename\"\n onClick={() => {\n setDraft({ name: page.name, slug: page.slug });\n setEditing(page.id);\n }}\n icon={<IconPencil size={12} />}\n />}\n <LayerAction\n label=\"Duplicate\"\n onClick={() => onDuplicate(page.id, `${page.name} copy`)}\n icon={<IconCopy size={12} />}\n />\n {page.slug !== \"home\" && <LayerAction\n label=\"Delete\"\n onClick={() => onDelete(page.id)}\n icon={<IconTrash size={12} />}\n />}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\n/* ------------------------------------------------------------ context menu */\n\nexport function ContextMenu({\n x,\n y,\n onBringForward,\n onSendBackward,\n onDuplicate,\n onCopy,\n onWrap,\n onUnwrap,\n onDelete,\n}: {\n x: number;\n y: number;\n onBringForward: () => void;\n onSendBackward: () => void;\n onDuplicate: () => void;\n onCopy: () => void;\n onWrap: () => void;\n onUnwrap: () => void;\n onDelete: () => void;\n}) {\n return (\n <div\n className=\"fixed z-[100] flex min-w-[210px] flex-col rounded-xl border border-ed-border bg-ed-surface/95 p-1.5 shadow-2xl backdrop-blur-md\"\n style={{ left: x, top: y }}\n >\n <MenuItem\n icon={<IconArrowUp size={14} className=\"text-ed-muted\" />}\n label=\"Bring forward\"\n onClick={onBringForward}\n />\n <MenuItem\n icon={<IconArrowDown size={14} className=\"text-ed-muted\" />}\n label=\"Send backward\"\n onClick={onSendBackward}\n />\n <div className=\"mx-1 my-1 h-px bg-ed-field\" />\n <MenuItem\n icon={<IconBox size={14} className=\"text-ed-muted\" />}\n label=\"Wrap in container\"\n onClick={onWrap}\n />\n <MenuItem\n icon={<IconBox size={14} className=\"text-ed-muted\" />}\n label=\"Move out of parent\"\n onClick={onUnwrap}\n />\n <div className=\"mx-1 my-1 h-px bg-ed-field\" />\n <MenuItem\n icon={<IconCopy size={14} className=\"text-ed-muted\" />}\n label=\"Duplicate\"\n shortcut=\"Ctrl D\"\n onClick={onDuplicate}\n />\n <MenuItem\n icon={<IconCopy size={14} className=\"text-ed-muted\" />}\n label=\"Copy\"\n shortcut=\"Ctrl C\"\n onClick={onCopy}\n />\n <div className=\"mx-1 my-1 h-px bg-ed-field\" />\n <MenuItem\n icon={<IconTrash size={14} className=\"text-red-400/80\" />}\n label=\"Delete\"\n shortcut=\"Del\"\n destructive\n onClick={onDelete}\n />\n </div>\n );\n}\n\nfunction MenuItem({\n icon,\n label,\n shortcut,\n destructive = false,\n onClick,\n}: {\n icon: React.ReactNode;\n label: string;\n shortcut?: string;\n destructive?: boolean;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n onClick();\n }}\n className={`flex items-center gap-2.5 rounded-md px-3 py-2 text-[11px] font-medium transition-colors ${destructive\n ? \"text-red-400 hover:bg-red-500/10 hover:text-red-300\"\n : \"text-ed-text hover:bg-ed-field-hover hover:text-ed-text\"\n }`}\n >\n {icon}\n {label}\n {shortcut && <span className=\"ml-auto text-[10px] text-ed-faint\">{shortcut}</span>}\n </button>\n );\n}\n", "import type React from \"react\";\nimport type { CanvasElement } from \"./types\";\n\nconst paths: Record<NonNullable<CanvasElement[\"iconName\"]>, React.ReactNode> = {\n star: <path d=\"m12 2.8 2.8 5.7 6.2.9-4.5 4.4 1.1 6.2-5.6-2.9L6.4 20l1.1-6.2L3 9.4l6.2-.9L12 2.8Z\" />,\n heart: <path d=\"M20.8 5.8c-2.2-2.2-5.7-2.2-7.9 0L12 6.7l-.9-.9a5.6 5.6 0 0 0-7.9 7.9L12 22l8.8-8.3a5.6 5.6 0 0 0 0-7.9Z\" />,\n \"arrow-right\": <><path d=\"M5 12h14\" /><path d=\"m14 7 5 5-5 5\" /></>,\n check: <path d=\"m5 12 4 4L19 6\" />,\n menu: <><path d=\"M4 7h16\" /><path d=\"M4 12h16\" /><path d=\"M4 17h16\" /></>,\n search: <><circle cx=\"11\" cy=\"11\" r=\"7\" /><path d=\"m20 20-4-4\" /></>,\n};\n\nexport function IconGlyph({ element }: { element: CanvasElement }) {\n return <svg viewBox=\"0 0 24 24\" width=\"100%\" height=\"100%\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">{paths[element.iconName ?? \"star\"]}</svg>;\n}\n", "\"use client\";\n\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\n\nexport const MIN_ZOOM = 10;\nexport const MAX_ZOOM = 400;\n/** Presets the +/- buttons step through. */\nconst ZOOM_STEPS = [10, 25, 50, 75, 100, 125, 150, 200, 300, 400];\n\nconst clamp = (value: number) =>\n Math.min(MAX_ZOOM, Math.max(MIN_ZOOM, Math.round(value)));\n\n/**\n * Photoshop-style canvas navigation: Ctrl/\u2318 + wheel zooms toward the pointer,\n * space-drag and middle-drag pan, plain wheel scrolls.\n *\n * Zooming has to keep the point under the cursor fixed, which means adjusting\n * the scroll offset in the same frame the scale changes \u2014 hence the anchor\n * captured before the state update and applied in a layout effect.\n */\nexport function useCanvasView(contentWidth: number) {\n const viewportRef = useRef<HTMLDivElement>(null);\n /** The scaled frame; all anchoring maths is relative to this box. */\n const frameRef = useRef<HTMLDivElement>(null);\n\n const [zoom, setZoomState] = useState(100);\n /**\n * The canvas fits itself to the space available until the author zooms by\n * hand \u2014 otherwise a 1280 frame in a narrower window overflows and pins\n * itself to the left edge instead of sitting centred.\n */\n const autoFitRef = useRef(true);\n const zoomRef = useRef(zoom);\n zoomRef.current = zoom;\n\n const anchorRef = useRef<{\n clientX: number;\n clientY: number;\n cx: number;\n cy: number;\n } | null>(null);\n\n /**\n * Brings the frames back into view. The scroll content carries a wide\n * gutter so the canvas can be panned freely, which means the natural\n * scroll origin is empty space rather than the page.\n */\n const recenter = useCallback(() => {\n const viewport = viewportRef.current;\n if (!viewport) return;\n viewport.scrollLeft = (viewport.scrollWidth - viewport.clientWidth) / 2;\n\n const frame = frameRef.current;\n // Sit just above the frame rather than centring vertically: a tall\n // page should open at its top, not its middle.\n viewport.scrollTop = frame\n ? Math.max(0, frame.getBoundingClientRect().top - viewport.getBoundingClientRect().top + viewport.scrollTop - 48)\n : (viewport.scrollHeight - viewport.clientHeight) / 2;\n }, []);\n\n const zoomAt = useCallback(\n (next: number, clientX: number, clientY: number) => {\n const frame = frameRef.current;\n if (frame) {\n const rect = frame.getBoundingClientRect();\n const scale = zoomRef.current / 100;\n anchorRef.current = {\n clientX,\n clientY,\n // Where the cursor sits in unscaled canvas coordinates.\n cx: (clientX - rect.left) / scale,\n cy: (clientY - rect.top) / scale,\n };\n }\n autoFitRef.current = false;\n setZoomState(clamp(next));\n },\n [],\n );\n\n /** Zoom from the centre of the viewport, for buttons and shortcuts. */\n const zoomTo = useCallback(\n (next: number) => {\n const viewport = viewportRef.current;\n if (!viewport) {\n autoFitRef.current = false;\n setZoomState(clamp(next));\n return;\n }\n const rect = viewport.getBoundingClientRect();\n zoomAt(next, rect.left + rect.width / 2, rect.top + rect.height / 2);\n },\n [zoomAt],\n );\n\n const stepZoom = useCallback(\n (direction: 1 | -1) => {\n const current = zoomRef.current;\n const next =\n direction === 1\n ? ZOOM_STEPS.find((step) => step > current + 0.5)\n : [...ZOOM_STEPS].reverse().find((step) => step < current - 0.5);\n zoomTo(next ?? current);\n },\n [zoomTo],\n );\n\n /** Scales the frame down until it fits the viewport, never past 100%. */\n const fitNow = useCallback(\n (width: number, padding = 80) => {\n const viewport = viewportRef.current;\n if (!viewport || width <= 0) return;\n const available = viewport.clientWidth - padding;\n setZoomState(clamp(Math.min(100, (available / width) * 100)));\n },\n [],\n );\n\n /** Explicit \"fit\" also re-arms auto-fitting. */\n const zoomToFit = useCallback(\n (width: number = contentWidth, padding = 80) => {\n autoFitRef.current = true;\n fitNow(width, padding);\n // The layout effect below recentres once the new zoom is applied.\n },\n [contentWidth, fitNow],\n );\n\n // Re-fit while auto-fitting is armed: on mount, when the frame width\n // changes with the breakpoint, and whenever the panels resize the canvas.\n useEffect(() => {\n const viewport = viewportRef.current;\n if (!viewport) return;\n const refit = () => {\n if (!autoFitRef.current) return;\n fitNow(contentWidth);\n recenter();\n };\n refit();\n const observer = new ResizeObserver(refit);\n observer.observe(viewport);\n return () => observer.disconnect();\n }, [contentWidth, fitNow, recenter]);\n\n useLayoutEffect(() => {\n const anchor = anchorRef.current;\n anchorRef.current = null;\n\n // An auto-fit has no anchor to preserve: put the frames back in view.\n if (!anchor) {\n if (autoFitRef.current) recenter();\n return;\n }\n\n const viewport = viewportRef.current;\n const frame = frameRef.current;\n if (!viewport || !frame) return;\n\n const rect = frame.getBoundingClientRect();\n const scale = zoom / 100;\n // Where the frame's top-left must land for the anchored point to stay\n // under the cursor.\n viewport.scrollLeft += rect.left - (anchor.clientX - anchor.cx * scale);\n viewport.scrollTop += rect.top - (anchor.clientY - anchor.cy * scale);\n }, [zoom, recenter]);\n\n // Ctrl/\u2318 + wheel zooms; a bare wheel keeps the container's native scroll.\n // Trackpad pinch arrives as a wheel event with ctrlKey already set.\n useEffect(() => {\n const viewport = viewportRef.current;\n if (!viewport) return;\n\n const onWheel = (event: WheelEvent) => {\n if (!event.ctrlKey && !event.metaKey) return;\n event.preventDefault();\n const factor = Math.exp(-event.deltaY / 300);\n zoomAt(zoomRef.current * factor, event.clientX, event.clientY);\n };\n\n viewport.addEventListener(\"wheel\", onWheel, { passive: false });\n return () => viewport.removeEventListener(\"wheel\", onWheel);\n }, [zoomAt]);\n\n /* ---------------------------------------------------------------- panning */\n\n const [spaceHeld, setSpaceHeld] = useState(false);\n const spaceHeldRef = useRef(false);\n spaceHeldRef.current = spaceHeld;\n\n const [isPanning, setIsPanning] = useState(false);\n const panRef = useRef<{\n x: number;\n y: number;\n left: number;\n top: number;\n } | null>(null);\n\n useEffect(() => {\n const isTyping = (target: EventTarget | null) => {\n const node = target as HTMLElement | null;\n return (\n !!node &&\n (node.isContentEditable ||\n [\"INPUT\", \"TEXTAREA\", \"SELECT\"].includes(node.tagName))\n );\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.code !== \"Space\" || isTyping(event.target)) return;\n // Space would otherwise scroll the page.\n event.preventDefault();\n setSpaceHeld(true);\n };\n const onKeyUp = (event: KeyboardEvent) => {\n if (event.code === \"Space\") setSpaceHeld(false);\n };\n // A key-up that happens while the tab is blurred never arrives, which\n // would leave the canvas stuck in pan mode.\n const onBlur = () => setSpaceHeld(false);\n\n window.addEventListener(\"keydown\", onKeyDown);\n window.addEventListener(\"keyup\", onKeyUp);\n window.addEventListener(\"blur\", onBlur);\n return () => {\n window.removeEventListener(\"keydown\", onKeyDown);\n window.removeEventListener(\"keyup\", onKeyUp);\n window.removeEventListener(\"blur\", onBlur);\n };\n }, []);\n\n /**\n * Call from the canvas' mousedown. Returns true when the gesture was taken\n * over for panning, so the caller skips selection and dragging.\n */\n const tryBeginPan = useCallback((event: React.MouseEvent) => {\n const viewport = viewportRef.current;\n if (!viewport) return false;\n\n const wantsPan =\n event.button === 1 || (event.button === 0 && spaceHeldRef.current);\n if (!wantsPan) return false;\n\n event.preventDefault();\n event.stopPropagation();\n panRef.current = {\n x: event.clientX,\n y: event.clientY,\n left: viewport.scrollLeft,\n top: viewport.scrollTop,\n };\n setIsPanning(true);\n return true;\n }, []);\n\n useEffect(() => {\n if (!isPanning) return;\n\n const onMove = (event: MouseEvent) => {\n const viewport = viewportRef.current;\n const start = panRef.current;\n if (!viewport || !start) return;\n viewport.scrollLeft = start.left - (event.clientX - start.x);\n viewport.scrollTop = start.top - (event.clientY - start.y);\n };\n const onUp = () => {\n panRef.current = null;\n setIsPanning(false);\n };\n\n window.addEventListener(\"mousemove\", onMove);\n window.addEventListener(\"mouseup\", onUp);\n return () => {\n window.removeEventListener(\"mousemove\", onMove);\n window.removeEventListener(\"mouseup\", onUp);\n };\n }, [isPanning]);\n\n return {\n viewportRef,\n frameRef,\n zoom,\n scale: zoom / 100,\n zoomTo,\n stepZoom,\n zoomToFit,\n spaceHeld,\n isPanning,\n tryBeginPan,\n recenter,\n };\n}\n", "\"use client\";\n\nimport { useCallback, useEffect, useReducer, useRef, useState } from \"react\";\nimport type { CanvasElement, DataSource, RootStyle } from \"@/lib/editor/types\";\n\nconst HISTORY_LIMIT = 100;\nconst AUTOSAVE_DELAY = 900;\n\nexport type SaveStatus = \"saved\" | \"dirty\" | \"saving\" | \"error\" | \"conflict\";\n\n/** Everything a page save writes; history and autosave track it as one unit. */\nexport type EditorDocument = {\n elements: CanvasElement[];\n rootStyle: RootStyle;\n dataSources: DataSource[];\n};\n\nexport type EditorSaveResult =\n | { status: \"saved\"; version: number }\n | {\n status: \"conflict\";\n version: number;\n elements: CanvasElement[];\n rootStyle: RootStyle;\n dataSources: DataSource[];\n }\n | { status: \"error\"; message: string };\n\nexport type EditorDocumentSaver = (\n pageId: string,\n document: EditorDocument,\n expectedVersion: number,\n) => Promise<EditorSaveResult>;\n\ntype Updater = EditorDocument | ((prev: EditorDocument) => EditorDocument);\n\ntype HistoryState = {\n past: EditorDocument[];\n present: EditorDocument;\n future: EditorDocument[];\n /**\n * Snapshot taken when a continuous gesture (drag, resize, slider) starts.\n * Without it every mousemove would land in the undo stack.\n */\n txBase: EditorDocument | null;\n};\n\ntype Action =\n | { type: \"set\"; updater: Updater; transient?: boolean }\n | { type: \"beginTx\" }\n | { type: \"endTx\" }\n | { type: \"undo\" }\n | { type: \"redo\" }\n | { type: \"reset\"; document: EditorDocument };\n\nfunction pushPast(past: EditorDocument[], entry: EditorDocument) {\n const next = [...past, entry];\n return next.length > HISTORY_LIMIT\n ? next.slice(next.length - HISTORY_LIMIT)\n : next;\n}\n\nfunction reducer(state: HistoryState, action: Action): HistoryState {\n switch (action.type) {\n case \"set\": {\n const next =\n typeof action.updater === \"function\"\n ? action.updater(state.present)\n : action.updater;\n if (next === state.present) return state;\n\n // Inside a transaction the intermediate values are not history\n // entries; `endTx` records the whole gesture as one step.\n if (action.transient || state.txBase) {\n return { ...state, present: next, future: [] };\n }\n return {\n past: pushPast(state.past, state.present),\n present: next,\n future: [],\n txBase: null,\n };\n }\n case \"beginTx\":\n return state.txBase ? state : { ...state, txBase: state.present };\n case \"endTx\": {\n if (!state.txBase) return state;\n if (state.txBase === state.present) return { ...state, txBase: null };\n return {\n past: pushPast(state.past, state.txBase),\n present: state.present,\n future: [],\n txBase: null,\n };\n }\n case \"undo\": {\n const previous = state.past.at(-1);\n if (!previous) return state;\n return {\n past: state.past.slice(0, -1),\n present: previous,\n future: [state.present, ...state.future],\n txBase: null,\n };\n }\n case \"redo\": {\n const [next, ...rest] = state.future;\n if (!next) return state;\n return {\n past: pushPast(state.past, state.present),\n present: next,\n future: rest,\n txBase: null,\n };\n }\n case \"reset\":\n return { past: [], present: action.document, future: [], txBase: null };\n }\n}\n\nexport function useEditorDocument({\n pageId,\n initialDocument,\n initialVersion,\n saveDocument,\n}: {\n pageId: string;\n initialDocument: EditorDocument;\n initialVersion: number;\n saveDocument: EditorDocumentSaver;\n}) {\n const [state, dispatch] = useReducer(reducer, {\n past: [],\n present: initialDocument,\n future: [],\n txBase: null,\n });\n\n const [saveStatus, setSaveStatus] = useState<SaveStatus>(\"saved\");\n const [saveError, setSaveError] = useState<string | null>(null);\n\n const versionRef = useRef(initialVersion);\n const savedRef = useRef(initialDocument);\n const pendingRef = useRef(state.present);\n const inFlightRef = useRef(false);\n /** Set when an edit lands mid-request, so the save is retried on completion. */\n const queuedRef = useRef(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const activePageRef = useRef(pageId);\n\n pendingRef.current = state.present;\n\n // Swap only the document state when navigation changes the page. Keeping\n // the Editor component mounted preserves the selected side-panel tabs,\n // canvas view and chrome state.\n useEffect(() => {\n if (activePageRef.current === pageId) return;\n activePageRef.current = pageId;\n if (timerRef.current) clearTimeout(timerRef.current);\n versionRef.current = initialVersion;\n savedRef.current = initialDocument;\n pendingRef.current = initialDocument;\n queuedRef.current = false;\n inFlightRef.current = false;\n dispatch({ type: \"reset\", document: initialDocument });\n setSaveError(null);\n setSaveStatus(\"saved\");\n }, [pageId]);\n\n const persist = useCallback(async () => {\n if (inFlightRef.current) {\n // Without this the edit would sit unsaved until the next keystroke\n // happened to schedule another debounce.\n queuedRef.current = true;\n return;\n }\n const requestPageId = pageId;\n const snapshot = pendingRef.current;\n if (snapshot === savedRef.current) return;\n\n inFlightRef.current = true;\n setSaveStatus(\"saving\");\n try {\n const result = await saveDocument(pageId, snapshot, versionRef.current);\n\n if (activePageRef.current !== requestPageId) return;\n if (result.status === \"saved\") {\n versionRef.current = result.version;\n savedRef.current = snapshot;\n setSaveError(null);\n setSaveStatus(pendingRef.current === snapshot ? \"saved\" : \"dirty\");\n } else if (result.status === \"conflict\") {\n // Someone else won the write; adopt their state rather than\n // silently overwriting it.\n const adopted = {\n elements: result.elements,\n rootStyle: result.rootStyle,\n dataSources: result.dataSources,\n };\n versionRef.current = result.version;\n savedRef.current = adopted;\n dispatch({ type: \"reset\", document: adopted });\n setSaveError(\"This page changed elsewhere and was reloaded.\");\n setSaveStatus(\"conflict\");\n } else {\n setSaveError(result.message);\n setSaveStatus(\"error\");\n }\n } catch (error) {\n console.error(error);\n setSaveError(\"Could not reach the server.\");\n setSaveStatus(\"error\");\n } finally {\n if (activePageRef.current === requestPageId) inFlightRef.current = false;\n }\n }, [pageId, saveDocument]);\n\n // Debounced autosave; re-runs whenever the document changes.\n useEffect(() => {\n if (state.present === savedRef.current) return;\n setSaveStatus((current) => (current === \"saving\" ? current : \"dirty\"));\n\n timerRef.current = setTimeout(() => void persist(), AUTOSAVE_DELAY);\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n };\n }, [state.present, persist]);\n\n // Drain an edit that arrived while the previous save was in flight.\n useEffect(() => {\n if (saveStatus === \"saving\" || !queuedRef.current) return;\n queuedRef.current = false;\n if (pendingRef.current !== savedRef.current) void persist();\n }, [saveStatus, persist]);\n\n // Guard against closing the tab with work that never reached the server.\n useEffect(() => {\n const handler = (event: BeforeUnloadEvent) => {\n if (pendingRef.current === savedRef.current) return;\n event.preventDefault();\n };\n window.addEventListener(\"beforeunload\", handler);\n return () => window.removeEventListener(\"beforeunload\", handler);\n }, []);\n\n const setDocument = useCallback(\n (updater: Updater, options?: { transient?: boolean }) =>\n dispatch({ type: \"set\", updater, transient: options?.transient }),\n [],\n );\n\n const setElements = useCallback(\n (\n updater: CanvasElement[] | ((prev: CanvasElement[]) => CanvasElement[]),\n options?: { transient?: boolean },\n ) =>\n setDocument((doc) => {\n const elements =\n typeof updater === \"function\" ? updater(doc.elements) : updater;\n return elements === doc.elements ? doc : { ...doc, elements };\n }, options),\n [setDocument],\n );\n\n const setRootStyle = useCallback(\n (patch: Partial<RootStyle>) =>\n setDocument((doc) => ({\n ...doc,\n rootStyle: { ...doc.rootStyle, ...patch },\n })),\n [setDocument],\n );\n\n const setDataSources = useCallback(\n (updater: DataSource[] | ((prev: DataSource[]) => DataSource[])) =>\n setDocument((doc) => {\n const dataSources =\n typeof updater === \"function\" ? updater(doc.dataSources) : updater;\n return dataSources === doc.dataSources ? doc : { ...doc, dataSources };\n }),\n [setDocument],\n );\n\n return {\n elements: state.present.elements,\n rootStyle: state.present.rootStyle,\n dataSources: state.present.dataSources,\n setDataSources,\n setElements,\n setRootStyle,\n beginTransaction: useCallback(() => dispatch({ type: \"beginTx\" }), []),\n endTransaction: useCallback(() => dispatch({ type: \"endTx\" }), []),\n undo: useCallback(() => dispatch({ type: \"undo\" }), []),\n redo: useCallback(() => dispatch({ type: \"redo\" }), []),\n canUndo: state.past.length > 0,\n canRedo: state.future.length > 0,\n saveStatus,\n saveError,\n isDirty: state.present !== savedRef.current,\n saveNow: useCallback(() => {\n if (timerRef.current) clearTimeout(timerRef.current);\n void persist();\n }, [persist]),\n };\n}\n", "\"use client\";\n\nimport { IconArrowUp, IconCheck, IconSparkles } from \"@tabler/icons-react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport type { AiDesignPlan } from \"@/lib/editor/ai-types\";\nimport type { Breakpoint, CanvasElement, RootStyle } from \"@/lib/editor/types\";\n\ntype Message = { role: \"user\" | \"assistant\"; text: string; steps?: string[] };\n\nexport type AiDesignRequest = {\n prompt: string;\n breakpoint: Breakpoint;\n history: Message[];\n document: { rootStyle: RootStyle; elements: unknown[] };\n};\n\nexport type AiDesignGenerator = (request: AiDesignRequest) => Promise<AiDesignPlan>;\n\nexport function AiPanel({ pageId, elements, rootStyle, breakpoint, onApply, generate }: { pageId: string; elements: CanvasElement[]; rootStyle: RootStyle; breakpoint: Breakpoint; onApply: (plan: AiDesignPlan) => void; generate?: AiDesignGenerator }) {\n const [messages, setMessages] = useState<Message[]>([]);\n const [input, setInput] = useState(\"\");\n const [busy, setBusy] = useState(false);\n const [phase, setPhase] = useState<\"analyzing\" | \"planning\" | \"building\" | \"polishing\" | null>(null);\n const [error, setError] = useState<string | null>(null);\n const endRef = useRef<HTMLDivElement>(null);\n const [restoredPage, setRestoredPage] = useState<string | null>(null);\n\n useEffect(() => {\n try {\n const saved = localStorage.getItem(`pagiera:ai-chat:${pageId}`);\n setMessages(saved ? (JSON.parse(saved) as Message[]) : []);\n } catch {\n // Corrupt/private storage must not disable the assistant.\n setMessages([]);\n }\n setRestoredPage(pageId);\n }, [pageId]);\n\n useEffect(() => {\n if (restoredPage !== pageId) return;\n try {\n localStorage.setItem(`pagiera:ai-chat:${pageId}`, JSON.stringify(messages.slice(-40)));\n } catch {\n // Storage is an enhancement; the current conversation still works.\n }\n endRef.current?.scrollIntoView({ behavior: \"smooth\", block: \"end\" });\n }, [messages, pageId, restoredPage]);\n\n const submit = async () => {\n const prompt = input.trim();\n if (!prompt || busy) return;\n const nextMessages = [...messages, { role: \"user\" as const, text: prompt }];\n setMessages(nextMessages);\n setInput(\"\");\n setBusy(true);\n setPhase(\"analyzing\");\n setError(null);\n const planningTimer = window.setTimeout(() => setPhase(\"planning\"), 900);\n const buildingTimer = window.setTimeout(() => setPhase(\"building\"), 2200);\n const polishingTimer = window.setTimeout(() => setPhase(\"polishing\"), 6500);\n try {\n const request = { prompt, breakpoint, history: nextMessages.slice(-6), document: { rootStyle, elements: elements.map(({ id, type, name, parentId, content, src, href, base, overrides, hover, press, loop, draggable, styleBindings, componentRole, componentId, variant, interaction, code }) => ({ id, type, name, parentId, content, src, href, base, overrides, hover, press, loop, draggable, styleBindings, componentRole, componentId, variant, interaction, code })) } };\n if (!generate) throw new Error(\"No AI adapter configured.\");\n const response = await generate(request);\n const result: unknown = response;\n if (!result || typeof result !== \"object\" || !(\"operations\" in result) || !Array.isArray(result.operations))\n throw new Error(\"AI ge\u00E7erli bir tasar\u0131m plan\u0131 d\u00F6nd\u00FCrmedi. \u0130ste\u011Fin korundu, tekrar deneyebilirsin.\");\n const plan = result as AiDesignPlan;\n onApply(plan);\n setMessages((current) => [...current, { role: \"assistant\", text: plan.message || `Applied ${plan.operations.length} changes.`, steps: plan.steps }]);\n } catch (reason) {\n setInput(prompt);\n setError(reason instanceof Error ? reason.message : \"AI request failed.\");\n } finally {\n window.clearTimeout(planningTimer);\n window.clearTimeout(buildingTimer);\n window.clearTimeout(polishingTimer);\n setBusy(false);\n setPhase(null);\n }\n };\n\n return <div className=\"flex h-full min-h-0 flex-col overflow-hidden\">\n <div className=\"min-h-0 flex-1 space-y-3 overflow-y-auto p-3\">\n {messages.length === 0 && <div className=\"rounded-xl border border-ed-border bg-ed-subtle p-4\"><IconSparkles size={18} className=\"mb-3 text-ed-accent\" /><p className=\"text-xs font-semibold text-ed-text\">Design with AI</p><p className=\"mt-1 text-[11px] leading-relaxed text-ed-muted\">Describe a section, restyle the page, or ask for a complete landing page. Every change remains undoable.</p><div className=\"mt-3 space-y-1.5\">{[\"Create a dark SaaS hero\", \"Turn this into a portfolio\", \"Improve spacing and typography\"].map((suggestion) => <button key={suggestion} type=\"button\" onClick={() => setInput(suggestion)} className=\"block w-full rounded-lg bg-ed-field px-2.5 py-2 text-left text-[10px] text-ed-muted hover:bg-ed-field-hover hover:text-ed-text\">{suggestion}</button>)}</div></div>}\n {messages.map((message, index) => <div key={`${message.role}-${index}`} className={`flex gap-2.5 ${message.role === \"user\" ? \"justify-end\" : \"items-start\"}`}>\n {message.role === \"assistant\" && <span className=\"flex size-7 shrink-0 items-center justify-center rounded-lg bg-ed-accent/15 text-ed-accent\"><IconSparkles size={14} /></span>}\n <div className={`max-w-[calc(100%-38px)] rounded-2xl px-3 py-2.5 text-[11px] leading-relaxed ${message.role === \"user\" ? \"rounded-br-md bg-ed-accent text-white\" : \"rounded-tl-md border border-ed-border bg-ed-subtle text-ed-text\"}`}>\n {message.steps && message.steps.length > 0 && <div className=\"mb-2.5 space-y-1.5\">{message.steps.map((step, stepIndex) => <div key={step} className=\"flex gap-2 text-[10px] text-ed-muted\"><span className=\"flex size-4 shrink-0 items-center justify-center rounded-full bg-emerald-500/15 text-emerald-400\"><IconCheck size={10} /></span><span><b className=\"text-ed-text\">{stepIndex + 1}.</b> {step}</span></div>)}</div>}\n <p>{message.text}</p>\n </div>\n </div>)}\n {busy && <div className=\"flex items-start gap-2.5\"><span className=\"flex size-7 shrink-0 animate-pulse items-center justify-center rounded-lg bg-ed-accent/15 text-ed-accent\"><IconSparkles size={14} /></span><div className=\"flex-1 rounded-2xl rounded-tl-md border border-ed-border bg-ed-subtle p-3\"><div className=\"space-y-2\">{[[\"analyzing\",\"Analyzing your page\"],[\"planning\",\"Creating an art direction\"],[\"building\",\"Building the layout\"],[\"polishing\",\"Polishing responsive details\"]].map(([key,label], index) => { const order = [\"analyzing\",\"planning\",\"building\",\"polishing\"]; const activeIndex = order.indexOf(phase ?? \"analyzing\"); const done = index < activeIndex; const active = index === activeIndex; return <div key={key} className={`flex items-center gap-2 text-[10px] ${active ? \"text-ed-text\" : done ? \"text-emerald-400\" : \"text-ed-faint\"}`}><span className={`size-1.5 rounded-full ${active ? \"animate-pulse bg-ed-accent\" : done ? \"bg-emerald-400\" : \"bg-ed-border\"}`} />{label}</div>; })}</div></div></div>}\n {error && <p className=\"rounded-lg border border-red-500/20 bg-red-500/10 px-3 py-2 text-[10px] text-red-300\">{error}</p>}\n <div ref={endRef} />\n </div>\n <form className=\"border-t border-ed-border p-3\" onSubmit={(event) => { event.preventDefault(); void submit(); }}><div className=\"flex items-end gap-2 rounded-xl border border-ed-border bg-ed-field p-2 focus-within:border-ed-accent\"><textarea value={input} onChange={(event) => setInput(event.target.value)} onKeyDown={(event) => { if (event.key === \"Enter\" && !event.shiftKey) { event.preventDefault(); void submit(); } }} placeholder=\"Ask AI to design\u2026\" rows={2} className=\"min-h-10 flex-1 resize-none bg-transparent text-[11px] text-ed-text outline-none placeholder:text-ed-faint\" /><button type=\"submit\" disabled={!input.trim() || busy} className=\"flex size-7 shrink-0 items-center justify-center rounded-lg bg-ed-accent text-white disabled:opacity-30\"><IconArrowUp size={14} /></button></div></form>\n </div>;\n}\n", "\"use client\";\n\nimport { IconPalette, IconPlus, IconTrash } from \"@tabler/icons-react\";\nimport { useState } from \"react\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"@/components/ui/select\";\nimport { newId } from \"@/lib/editor/tree\";\nimport type { CanvasElement, DesignVariable, ElementStyle, RootStyle, StyleKey } from \"@/lib/editor/types\";\n\nconst COLOR_PROPERTIES: Array<{ label: string; value: StyleKey }> = [\n { label: \"Background\", value: \"bg\" }, { label: \"Text colour\", value: \"color\" },\n { label: \"Border colour\", value: \"borderC\" },\n];\nconst NUMBER_PROPERTIES: Array<{ label: string; value: StyleKey }> = [\n { label: \"Gap\", value: \"gap\" }, { label: \"Radius\", value: \"radius\" },\n { label: \"Font size\", value: \"fontSize\" }, { label: \"Padding top\", value: \"padT\" },\n];\n\nexport function VariablesPanel({ rootStyle, selectedElement, setRootStyle, setElements }: { rootStyle: RootStyle; selectedElement?: CanvasElement; setRootStyle: (patch: Partial<RootStyle>) => void; setElements: (updater: (elements: CanvasElement[]) => CanvasElement[]) => void }) {\n const variables = rootStyle.variables ?? [];\n const [property, setProperty] = useState<StyleKey>(\"bg\");\n\n const updateVariable = (id: string, patch: Partial<DesignVariable>) => {\n const next = variables.map((variable) => variable.id === id ? { ...variable, ...patch } as DesignVariable : variable);\n const changed = next.find((variable) => variable.id === id);\n setRootStyle({ variables: next });\n if (!changed) return;\n setElements((elements) => elements.map((element) => {\n const keys = Object.entries(element.styleBindings ?? {}).filter(([, variableId]) => variableId === id).map(([key]) => key as StyleKey);\n if (!keys.length) return element;\n const base = { ...element.base } as ElementStyle;\n const mutableBase = base as unknown as Record<string, unknown>;\n for (const key of keys) mutableBase[key] = changed.value;\n return { ...element, base };\n }));\n };\n\n const add = (type: DesignVariable[\"type\"]) => setRootStyle({ variables: [...variables, { id: newId(), name: type === \"color\" ? \"Brand colour\" : \"Spacing\", type, value: type === \"color\" ? \"#8b7bff\" : 16 }] });\n const bind = (variable: DesignVariable) => {\n if (!selectedElement) return;\n const allowed = variable.type === \"color\" ? COLOR_PROPERTIES : NUMBER_PROPERTIES;\n const key = allowed.some((item) => item.value === property) ? property : allowed[0].value;\n setProperty(key);\n setElements((elements) => elements.map((element) => {\n if (element.id !== selectedElement.id) return element;\n const base = { ...element.base } as ElementStyle;\n (base as unknown as Record<string, unknown>)[key] = variable.value;\n return { ...element, base, styleBindings: { ...element.styleBindings, [key]: variable.id } };\n }));\n };\n\n return <div className=\"flex flex-col\">\n <div className=\"border-b border-ed-border p-3\"><div className=\"rounded-xl border border-ed-border bg-ed-subtle p-3\"><IconPalette size={16} className=\"mb-2 text-ed-accent\" /><p className=\"text-[11px] font-semibold text-ed-text\">Design variables</p><p className=\"mt-1 text-[9px] leading-relaxed text-ed-muted\">Bind shared colours and numbers. Editing a variable updates every bound layer.</p></div></div>\n <div className=\"flex gap-1.5 border-b border-ed-border p-3\"><button type=\"button\" onClick={() => add(\"color\")} className=\"flex flex-1 items-center justify-center gap-1 rounded-lg bg-ed-field px-2 py-2 text-[10px] text-ed-muted hover:bg-ed-field-hover hover:text-ed-text\"><IconPlus size={11} /> Colour</button><button type=\"button\" onClick={() => add(\"number\")} className=\"flex flex-1 items-center justify-center gap-1 rounded-lg bg-ed-field px-2 py-2 text-[10px] text-ed-muted hover:bg-ed-field-hover hover:text-ed-text\"><IconPlus size={11} /> Number</button></div>\n {variables.length === 0 ? <p className=\"p-5 text-center text-[10px] text-ed-faint\">No variables yet.</p> : <div className=\"space-y-2 p-3\">{variables.map((variable) => { const options = variable.type === \"color\" ? COLOR_PROPERTIES : NUMBER_PROPERTIES; return <div key={variable.id} className=\"rounded-xl border border-ed-border bg-ed-subtle p-2.5\"><div className=\"flex items-center gap-2\"><input value={variable.name} onChange={(event) => updateVariable(variable.id, { name: event.target.value })} className=\"min-w-0 flex-1 bg-transparent text-[10px] font-medium text-ed-text outline-none\" />{variable.type === \"color\" ? <input type=\"color\" value={String(variable.value)} onChange={(event) => updateVariable(variable.id, { value: event.target.value })} className=\"size-6 cursor-pointer rounded border-0 bg-transparent\" /> : <input type=\"number\" value={Number(variable.value)} onChange={(event) => updateVariable(variable.id, { value: Number(event.target.value) })} className=\"w-14 rounded-md bg-ed-field px-1.5 py-1 text-right text-[10px] text-ed-text outline-none\" />}<button type=\"button\" onClick={() => setRootStyle({ variables: variables.filter((item) => item.id !== variable.id) })} className=\"text-ed-faint hover:text-red-400\"><IconTrash size={12} /></button></div>{selectedElement && <div className=\"mt-2 flex gap-1.5\"><Select value={options.some((item) => item.value === property) ? property : options[0].value} onValueChange={(value) => setProperty(value as StyleKey)}><SelectTrigger className=\"h-7 min-w-0 flex-1\"><SelectValue /></SelectTrigger><SelectContent>{options.map((item) => <SelectItem key={item.value} value={item.value}>{item.label}</SelectItem>)}</SelectContent></Select><button type=\"button\" onClick={() => bind(variable)} className=\"rounded-lg bg-ed-accent px-2 text-[9px] font-medium text-white\">Bind</button></div>}</div>; })}</div>}\n </div>;\n}\n", "\"use client\";\n\nimport { IconArrowRight, IconCheck, IconSparkles } from \"@tabler/icons-react\";\nimport type { SiteTemplateId } from \"@/lib/editor/site-templates\";\n\nconst templates: Array<{ id: SiteTemplateId; name: string; kind: string; pages: string[]; count: string; accent: string; preview: string; title: string }> = [\n { id: \"editorial-blog\", name: \"Field Notes\", kind: \"Dynamic editorial blog\", pages: [\"Home\", \"Journal\", \"Article / :slug\", \"About\"], count: \"4 pages + API\", accent: \"#db4b2d\", preview: \"bg-[#f3efe6] text-[#171714]\", title: \"IDEAS FOR A MORE HUMAN WEB.\" },\n { id: \"orbit-saas\", name: \"Orbit OS\", kind: \"Product & SaaS launch\", pages: [\"Home\", \"Product\", \"Pricing\"], count: \"3 pages\", accent: \"#7357ff\", preview: \"bg-[#070914] text-[#f5f7ff]\", title: \"SHIP THE NEXT VERSION OF YOU.\" },\n { id: \"nocturne\", name: \"Nocturne Studio\", kind: \"Dark editorial portfolio\", pages: [\"Home\", \"Work\", \"Studio\", \"Contact\"], count: \"4 pages\", accent: \"#d7ff3f\", preview: \"bg-[#0b0b0a] text-[#f1f0ea]\", title: \"WE DESIGN THE UNEXPECTED.\" },\n];\n\nexport function TemplatesPanel({ busy, onInstall }: { busy: boolean; onInstall: (id: SiteTemplateId) => void }) {\n return <div className=\"space-y-3 p-3\">\n <div className=\"mb-4 rounded-2xl border border-ed-border bg-ed-subtle p-4\">\n <p className=\"text-xs font-semibold text-ed-text\">Site templates</p>\n <p className=\"mt-1 text-[10px] leading-relaxed text-ed-muted\">Complete editable sites with pages, responsive layouts, motion, tokens and data requests.</p>\n </div>\n {templates.map((template) => <article key={template.id} className=\"overflow-hidden rounded-2xl border border-white/10 bg-[#0b0c0e] shadow-xl\">\n <div className={`relative h-32 overflow-hidden border-b border-white/10 p-4 ${template.preview}`}>\n <div className=\"absolute -right-5 -top-6 size-28 rounded-full blur-3xl opacity-40\" style={{ background: template.accent }} />\n <span className=\"relative font-mono text-[8px] font-bold tracking-[.2em]\" style={{ color: template.accent }}>{template.name.toUpperCase()}</span>\n <p className=\"relative mt-8 max-w-[210px] text-[21px] font-semibold leading-[.9] tracking-[-.07em]\">{template.title}</p>\n </div>\n <div className=\"p-4\">\n <div className=\"flex items-start justify-between gap-3\"><div><h3 className=\"text-[12px] font-semibold text-[#f1f0ea]\">{template.name}</h3><p className=\"mt-1 text-[9px] text-[#96958f]\">{template.kind}</p></div><span className=\"rounded-full px-2 py-1 font-mono text-[8px]\" style={{ color: template.accent, background: `${template.accent}18` }}>{template.count}</span></div>\n <div className=\"mt-4 grid grid-cols-2 gap-2 text-[9px] text-[#96958f]\">{template.pages.map((page) => <span key={page} className=\"flex items-center gap-1.5\"><IconCheck size={10} style={{ color: template.accent }} />{page}</span>)}</div>\n <button type=\"button\" disabled={busy} onClick={() => onInstall(template.id)} className=\"mt-4 flex w-full items-center justify-between rounded-xl px-3 py-2.5 text-[10px] font-extrabold text-white transition hover:brightness-110 disabled:opacity-50\" style={{ background: template.accent }}><span className=\"flex items-center gap-2\"><IconSparkles size={13} />{busy ? \"Installing\u2026\" : \"Install complete site\"}</span><IconArrowRight size={13} /></button>\n </div>\n </article>)}\n </div>;\n}\n", "import PagieraStudio from \"./app/p/editor/editor.tsx\"; export { PagieraStudio }; export default PagieraStudio;"],
5
+ "mappings": "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",
6
+ "names": ["IconCopy", "IconChevronRight", "IconDatabase", "IconPlayerPlay", "IconPlus", "IconSearch", "IconSparkles", "IconTrash", "IconWorld", "IconBox", "IconFile", "IconPalette", "IconX", "AnimatePresence", "motion", "useCallback", "useEffect", "useMemo", "useRef", "useState", "useTransition", "concatArrays", "array1", "array2", "combinedArray", "Array", "length", "i", "createClassValidatorObject", "classGroupId", "validator", "createClassPartObject", "nextPart", "Map", "validators", "CLASS_PART_SEPARATOR", "EMPTY_CONFLICTS", "ARBITRARY_PROPERTY_PREFIX", "createClassGroupUtils", "config", "classMap", "createClassMap", "conflictingClassGroups", "conflictingClassGroupModifiers", "getClassGroupId", "className", "startsWith", "endsWith", "getGroupIdForArbitraryProperty", "classParts", "split", "startIndex", "getGroupRecursive", "getConflictingClassGroupIds", "hasPostfixModifier", "modifierConflicts", "baseConflicts", "classPartObject", "classPathsLength", "currentClassPart", "nextClassPartObject", "get", "result", "undefined", "classRest", "join", "slice", "validatorsLength", "validatorObj", "indexOf", "content", "colonIndex", "property", "theme", "classGroups", "processClassGroups", "group", "processClassesRecursively", "classGroup", "len", "classDefinition", "processClassDefinition", "processStringDefinition", "processFunctionDefinition", "processObjectDefinition", "classPartObjectToEdit", "getPart", "isThemeGetter", "push", "entries", "Object", "key", "value", "path", "current", "parts", "part", "next", "set", "func", "createLruCache", "maxCacheSize", "cacheSize", "cache", "create", "previousCache", "update", "IMPORTANT_MODIFIER", "MODIFIER_SEPARATOR", "EMPTY_MODIFIERS", "createResultObject", "modifiers", "hasImportantModifier", "baseClassName", "maybePostfixModifierPosition", "isExternal", "createParseClassName", "prefix", "experimentalParseClassName", "parseClassName", "bracketDepth", "parenDepth", "modifierStart", "postfixModifierPosition", "index", "currentCharacter", "baseClassNameWithImportantModifier", "fullPrefix", "parseClassNameOriginal", "createSortModifiers", "modifierWeights", "orderSensitiveModifiers", "forEach", "mod", "currentSegment", "modifier", "isArbitrary", "isOrderSensitive", "has", "sort", "createConfigUtils", "sortModifiers", "postfixLookupClassGroupIds", "createPostfixLookupClassGroupIds", "lookup", "classGroupIds", "postfixLookupClassGroups", "SPLIT_CLASSES_REGEX", "mergeClassList", "classList", "configUtils", "classGroupsInConflict", "classNames", "trim", "originalClassName", "baseClassNameWithoutPostfix", "substring", "classGroupIdWithPostfix", "variantModifier", "modifierId", "classId", "conflictGroups", "twJoin", "classLists", "argument", "resolvedValue", "string", "toValue", "mix", "k", "createTailwindMerge", "createConfigFirst", "createConfigRest", "cacheGet", "cacheSet", "functionToCall", "initTailwindMerge", "reduce", "previousConfig", "createConfigCurrent", "tailwindMerge", "cachedResult", "args", "fallbackThemeArr", "fromTheme", "themeGetter", "arbitraryValueRegex", "arbitraryVariableRegex", "fractionRegex", "tshirtUnitRegex", "lengthUnitRegex", "colorFunctionRegex", "shadowRegex", "imageRegex", "isFraction", "test", "isNumber", "Number", "isNaN", "isInteger", "isPercent", "isTshirtSize", "isAny", "isLengthOnly", "isNever", "isShadow", "isImage", "isAnyNonArbitrary", "isArbitraryValue", "isArbitraryVariable", "isNamedContainerQuery", "isArbitrarySize", "getIsArbitraryValue", "isLabelSize", "isArbitraryLength", "isLabelLength", "isArbitraryNumber", "isLabelNumber", "isArbitraryWeight", "isLabelWeight", "isArbitraryFamilyName", "isLabelFamilyName", "isArbitraryPosition", "isLabelPosition", "isArbitraryImage", "isLabelImage", "isArbitraryShadow", "isLabelShadow", "isArbitraryVariableLength", "getIsArbitraryVariable", "isArbitraryVariableFamilyName", "isArbitraryVariablePosition", "isArbitraryVariableSize", "isArbitraryVariableImage", "isArbitraryVariableShadow", "isArbitraryVariableWeight", "testLabel", "testValue", "exec", "shouldMatchNoLabel", "label", "getDefaultConfig", "themeColor", "fromTheme", "themeFont", "themeText", "themeFontWeight", "themeTracking", "themeLeading", "themeBreakpoint", "themeContainer", "themeSpacing", "themeRadius", "themeShadow", "themeInsetShadow", "themeTextShadow", "themeDropShadow", "themeBlur", "themePerspective", "themeAspect", "themeEase", "themeAnimate", "scaleBreak", "scalePosition", "scalePositionWithArbitrary", "isArbitraryVariable", "isArbitraryValue", "scaleOverflow", "scaleOverscroll", "scaleUnambiguousSpacing", "scaleInset", "isFraction", "scaleGridTemplateColsRows", "isInteger", "scaleGridColRowStartAndEnd", "span", "scaleGridColRowStartOrEnd", "scaleGridAutoColsRows", "scaleAlignPrimaryAxis", "scaleAlignSecondaryAxis", "scaleMargin", "scaleSizing", "scaleSizingInline", "scaleSizingBlock", "scaleColor", "scaleBgPosition", "isArbitraryVariablePosition", "isArbitraryPosition", "position", "scaleBgRepeat", "repeat", "scaleBgSize", "isArbitraryVariableSize", "isArbitrarySize", "size", "scaleGradientStopPosition", "isPercent", "isArbitraryVariableLength", "isArbitraryLength", "scaleRadius", "scaleBorderWidth", "isNumber", "scaleLineStyle", "scaleBlendMode", "scaleMaskImagePosition", "scaleBlur", "scaleRotate", "scaleScale", "scaleSkew", "scaleTranslate", "cacheSize", "theme", "animate", "aspect", "blur", "isTshirtSize", "breakpoint", "color", "isAny", "container", "ease", "font", "isAnyNonArbitrary", "leading", "perspective", "radius", "shadow", "spacing", "text", "tracking", "classGroups", "isNamedContainerQuery", "columns", "box", "display", "sr", "float", "clear", "isolation", "object", "overflow", "overscroll", "inset", "start", "end", "top", "right", "bottom", "left", "visibility", "z", "basis", "flex", "grow", "shrink", "order", "col", "row", "gap", "justify", "content", "items", "baseline", "self", "p", "px", "py", "ps", "pe", "pbs", "pbe", "pt", "pr", "pb", "pl", "m", "mx", "my", "ms", "me", "mbs", "mbe", "mt", "mr", "mb", "ml", "inline", "block", "w", "screen", "h", "isArbitraryVariableWeight", "isArbitraryWeight", "isArbitraryVariableFamilyName", "isArbitraryFamilyName", "isArbitraryNumber", "list", "placeholder", "decoration", "indent", "tab", "align", "whitespace", "break", "wrap", "hyphens", "bg", "linear", "to", "radial", "conic", "isArbitraryVariableImage", "isArbitraryImage", "from", "via", "rounded", "border", "divide", "outline", "isArbitraryVariableShadow", "isArbitraryShadow", "ring", "opacity", "mask", "closest", "farthest", "filter", "brightness", "contrast", "grayscale", "invert", "saturate", "sepia", "table", "caption", "transition", "duration", "delay", "backface", "rotate", "scale", "skew", "transform", "origin", "translate", "zoom", "accent", "appearance", "caret", "scheme", "cursor", "resize", "scroll", "scrollbar", "snap", "touch", "select", "fill", "stroke", "conflictingClassGroups", "conflictingClassGroupModifiers", "postfixLookupClassGroups", "orderSensitiveModifiers", "twMerge", "createTailwindMerge", "getDefaultConfig", "hero", "footer", "IconChevronRight", "useState", "useEffect", "useState", "jsx", "jsxs", "useState", "useEffect", "Fragment", "jsx", "jsxs", "node", "useState", "IconChevronRight", "IconPlus", "IconTrash", "AnimatePresence", "motion", "useState", "IconCheck", "IconPlayerPlay", "IconPlus", "IconTrash", "IconX", "AnimatePresence", "motion", "useEffect", "useState", "jsx", "jsxs", "useState", "useEffect", "motion", "IconX", "IconPlayerPlay", "AnimatePresence", "IconCheck", "IconTrash", "IconPlus", "jsx", "jsxs", "useState", "motion", "IconTrash", "IconPlus", "AnimatePresence", "IconChevronRight", "IconPlus", "AnimatePresence", "motion", "useState", "node", "jsx", "jsxs", "useState", "AnimatePresence", "motion", "IconChevronRight", "IconPlus", "IconBox", "IconChevronRight", "IconLayoutRows", "IconPhoto", "IconPlayerPlay", "IconPlus", "IconSearch", "IconSparkles", "IconCheck", "IconTrash", "useState", "Fragment", "jsx", "jsxs", "Fragment", "jsx", "jsxs", "IconBox", "IconLayoutRows", "IconPhoto", "IconSparkles", "IconPlayerPlay", "IconChevronRight", "jsxs", "jsx", "IconCheck", "IconSearch", "useState", "IconTrash", "IconPlus", "IconBox", "useEffect", "useState", "node", "useCallback", "useEffect", "useRef", "useState", "IconArrowUp", "IconCheck", "IconSparkles", "useEffect", "useRef", "useState", "jsx", "jsxs", "IconPlus", "IconTrash", "useState", "jsx", "jsxs", "useState", "IconPlus", "IconTrash", "IconArrowRight", "IconCheck", "IconSparkles", "jsx", "jsxs", "Fragment", "jsx", "jsxs", "useTransition", "useCallback", "document", "useState", "useEffect", "useMemo", "useRef", "node", "dx", "dy", "element", "rect", "x", "y", "IconPlus", "IconWorld", "IconBox", "IconPalette", "IconSparkles", "IconDatabase", "IconFile", "AnimatePresence", "motion", "IconX", "IconSearch", "IconCopy", "IconTrash", "IconPlayerPlay", "IconChevronRight"]
7
+ }