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.
- package/README.md +528 -0
- package/dist/adapters.d.ts +89 -0
- package/dist/adapters.d.ts.map +1 -0
- package/dist/adapters.js +2 -0
- package/dist/adapters.js.map +1 -0
- package/dist/client.d.ts +22 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +33 -0
- package/dist/client.js.map +1 -0
- package/dist/data.js +210 -0
- package/dist/data.js.map +7 -0
- package/dist/document.d.ts +63 -0
- package/dist/document.d.ts.map +1 -0
- package/dist/document.js +25 -0
- package/dist/document.js.map +1 -0
- package/dist/editor.d.ts +14 -0
- package/dist/editor.d.ts.map +1 -0
- package/dist/editor.js +59 -0
- package/dist/editor.js.map +1 -0
- package/dist/full-editor.d.ts +53 -0
- package/dist/full-editor.js +11117 -0
- package/dist/full-editor.js.map +7 -0
- package/dist/full.css +3498 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/app/api/ai-design/route.d.ts +3 -0
- package/dist/internal/app/api/ai-design/route.d.ts.map +1 -0
- package/dist/internal/app/api/ai-design/route.js +165 -0
- package/dist/internal/app/api/ai-design/route.js.map +1 -0
- package/dist/internal/app/p/editor/ai-panel.d.ts +27 -0
- package/dist/internal/app/p/editor/ai-panel.d.ts.map +1 -0
- package/dist/internal/app/p/editor/ai-panel.js +77 -0
- package/dist/internal/app/p/editor/ai-panel.js.map +1 -0
- package/dist/internal/app/p/editor/data-modal.d.ts +26 -0
- package/dist/internal/app/p/editor/data-modal.d.ts.map +1 -0
- package/dist/internal/app/p/editor/data-modal.js +94 -0
- package/dist/internal/app/p/editor/data-modal.js.map +1 -0
- package/dist/internal/app/p/editor/data-panel.d.ts +18 -0
- package/dist/internal/app/p/editor/data-panel.d.ts.map +1 -0
- package/dist/internal/app/p/editor/data-panel.js +45 -0
- package/dist/internal/app/p/editor/data-panel.js.map +1 -0
- package/dist/internal/app/p/editor/editor.d.ts +51 -0
- package/dist/internal/app/p/editor/editor.d.ts.map +1 -0
- package/dist/internal/app/p/editor/editor.js +1551 -0
- package/dist/internal/app/p/editor/editor.js.map +1 -0
- package/dist/internal/app/p/editor/fields.d.ts +111 -0
- package/dist/internal/app/p/editor/fields.d.ts.map +1 -0
- package/dist/internal/app/p/editor/fields.js +141 -0
- package/dist/internal/app/p/editor/fields.js.map +1 -0
- package/dist/internal/app/p/editor/inspector.d.ts +38 -0
- package/dist/internal/app/p/editor/inspector.d.ts.map +1 -0
- package/dist/internal/app/p/editor/inspector.js +336 -0
- package/dist/internal/app/p/editor/inspector.js.map +1 -0
- package/dist/internal/app/p/editor/library.d.ts +18 -0
- package/dist/internal/app/p/editor/library.d.ts.map +1 -0
- package/dist/internal/app/p/editor/library.js +61 -0
- package/dist/internal/app/p/editor/library.js.map +1 -0
- package/dist/internal/app/p/editor/parts.d.ts +75 -0
- package/dist/internal/app/p/editor/parts.d.ts.map +1 -0
- package/dist/internal/app/p/editor/parts.js +261 -0
- package/dist/internal/app/p/editor/parts.js.map +1 -0
- package/dist/internal/app/p/editor/templates-panel.d.ts +6 -0
- package/dist/internal/app/p/editor/templates-panel.d.ts.map +1 -0
- package/dist/internal/app/p/editor/templates-panel.js +12 -0
- package/dist/internal/app/p/editor/templates-panel.js.map +1 -0
- package/dist/internal/app/p/editor/use-canvas-view.d.ts +24 -0
- package/dist/internal/app/p/editor/use-canvas-view.d.ts.map +1 -0
- package/dist/internal/app/p/editor/use-canvas-view.js +242 -0
- package/dist/internal/app/p/editor/use-canvas-view.js.map +1 -0
- package/dist/internal/app/p/editor/use-editor.d.ts +48 -0
- package/dist/internal/app/p/editor/use-editor.d.ts.map +1 -0
- package/dist/internal/app/p/editor/use-editor.js +224 -0
- package/dist/internal/app/p/editor/use-editor.js.map +1 -0
- package/dist/internal/app/p/editor/variables-panel.d.ts +8 -0
- package/dist/internal/app/p/editor/variables-panel.d.ts.map +1 -0
- package/dist/internal/app/p/editor/variables-panel.js +52 -0
- package/dist/internal/app/p/editor/variables-panel.js.map +1 -0
- package/dist/internal/components/ui/select.d.ts +12 -0
- package/dist/internal/components/ui/select.d.ts.map +1 -0
- package/dist/internal/components/ui/select.js +32 -0
- package/dist/internal/components/ui/select.js.map +1 -0
- package/dist/internal/drizzle/index.d.ts +6 -0
- package/dist/internal/drizzle/index.d.ts.map +1 -0
- package/dist/internal/drizzle/index.js +20 -0
- package/dist/internal/drizzle/index.js.map +1 -0
- package/dist/internal/drizzle/schema.d.ts +405 -0
- package/dist/internal/drizzle/schema.d.ts.map +1 -0
- package/dist/internal/drizzle/schema.js +70 -0
- package/dist/internal/drizzle/schema.js.map +1 -0
- package/dist/internal/lib/data/context.d.ts +8 -0
- package/dist/internal/lib/data/context.d.ts.map +1 -0
- package/dist/internal/lib/data/context.js +17 -0
- package/dist/internal/lib/data/context.js.map +1 -0
- package/dist/internal/lib/data/source.d.ts +54 -0
- package/dist/internal/lib/data/source.d.ts.map +1 -0
- package/dist/internal/lib/data/source.js +229 -0
- package/dist/internal/lib/data/source.js.map +1 -0
- package/dist/internal/lib/editor/ai-types.d.ts +44 -0
- package/dist/internal/lib/editor/ai-types.d.ts.map +1 -0
- package/dist/internal/lib/editor/ai-types.js +2 -0
- package/dist/internal/lib/editor/ai-types.js.map +1 -0
- package/dist/internal/lib/editor/arrange.d.ts +12 -0
- package/dist/internal/lib/editor/arrange.d.ts.map +1 -0
- package/dist/internal/lib/editor/arrange.js +72 -0
- package/dist/internal/lib/editor/arrange.js.map +1 -0
- package/dist/internal/lib/editor/cascade.d.ts +39 -0
- package/dist/internal/lib/editor/cascade.d.ts.map +1 -0
- package/dist/internal/lib/editor/cascade.js +86 -0
- package/dist/internal/lib/editor/cascade.js.map +1 -0
- package/dist/internal/lib/editor/icon.d.ts +6 -0
- package/dist/internal/lib/editor/icon.d.ts.map +1 -0
- package/dist/internal/lib/editor/icon.js +13 -0
- package/dist/internal/lib/editor/icon.js.map +1 -0
- package/dist/internal/lib/editor/presets.d.ts +10 -0
- package/dist/internal/lib/editor/presets.d.ts.map +1 -0
- package/dist/internal/lib/editor/presets.js +83 -0
- package/dist/internal/lib/editor/presets.js.map +1 -0
- package/dist/internal/lib/editor/showcase.d.ts +14 -0
- package/dist/internal/lib/editor/showcase.d.ts.map +1 -0
- package/dist/internal/lib/editor/showcase.js +219 -0
- package/dist/internal/lib/editor/showcase.js.map +1 -0
- package/dist/internal/lib/editor/site-templates.d.ts +4 -0
- package/dist/internal/lib/editor/site-templates.d.ts.map +1 -0
- package/dist/internal/lib/editor/site-templates.js +156 -0
- package/dist/internal/lib/editor/site-templates.js.map +1 -0
- package/dist/internal/lib/editor/snap.d.ts +34 -0
- package/dist/internal/lib/editor/snap.d.ts.map +1 -0
- package/dist/internal/lib/editor/snap.js +70 -0
- package/dist/internal/lib/editor/snap.js.map +1 -0
- package/dist/internal/lib/editor/style.d.ts +53 -0
- package/dist/internal/lib/editor/style.d.ts.map +1 -0
- package/dist/internal/lib/editor/style.js +313 -0
- package/dist/internal/lib/editor/style.js.map +1 -0
- package/dist/internal/lib/editor/tree.d.ts +72 -0
- package/dist/internal/lib/editor/tree.d.ts.map +1 -0
- package/dist/internal/lib/editor/tree.js +301 -0
- package/dist/internal/lib/editor/tree.js.map +1 -0
- package/dist/internal/lib/editor/types.d.ts +273 -0
- package/dist/internal/lib/editor/types.d.ts.map +1 -0
- package/dist/internal/lib/editor/types.js +411 -0
- package/dist/internal/lib/editor/types.js.map +1 -0
- package/dist/internal/lib/editor/validate.d.ts +20 -0
- package/dist/internal/lib/editor/validate.d.ts.map +1 -0
- package/dist/internal/lib/editor/validate.js +467 -0
- package/dist/internal/lib/editor/validate.js.map +1 -0
- package/dist/internal/lib/pages.d.ts +83 -0
- package/dist/internal/lib/pages.d.ts.map +1 -0
- package/dist/internal/lib/pages.js +294 -0
- package/dist/internal/lib/pages.js.map +1 -0
- package/dist/internal/lib/render/bind.d.ts +18 -0
- package/dist/internal/lib/render/bind.d.ts.map +1 -0
- package/dist/internal/lib/render/bind.js +28 -0
- package/dist/internal/lib/render/bind.js.map +1 -0
- package/dist/internal/lib/render/css.d.ts +31 -0
- package/dist/internal/lib/render/css.d.ts.map +1 -0
- package/dist/internal/lib/render/css.js +239 -0
- package/dist/internal/lib/render/css.js.map +1 -0
- package/dist/internal/lib/render/load-data.d.ts +15 -0
- package/dist/internal/lib/render/load-data.d.ts.map +1 -0
- package/dist/internal/lib/render/load-data.js +39 -0
- package/dist/internal/lib/render/load-data.js.map +1 -0
- package/dist/internal/lib/render/page-render.d.ts +17 -0
- package/dist/internal/lib/render/page-render.d.ts.map +1 -0
- package/dist/internal/lib/render/page-render.js +117 -0
- package/dist/internal/lib/render/page-render.js.map +1 -0
- package/dist/internal/lib/utils.d.ts +3 -0
- package/dist/internal/lib/utils.d.ts.map +1 -0
- package/dist/internal/lib/utils.js +6 -0
- package/dist/internal/lib/utils.js.map +1 -0
- package/dist/manrope-data.d.ts +3 -0
- package/dist/manrope-data.d.ts.map +1 -0
- package/dist/manrope-data.js +3 -0
- package/dist/manrope-data.js.map +1 -0
- package/dist/page.d.ts +9 -0
- package/dist/page.d.ts.map +1 -0
- package/dist/page.js +148 -0
- package/dist/page.js.map +1 -0
- package/dist/provider.d.ts +14 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +45 -0
- package/dist/provider.js.map +1 -0
- package/dist/runtime.d.ts +8 -0
- package/dist/runtime.js +717 -0
- package/dist/runtime.js.map +7 -0
- package/dist/server.d.ts +31 -0
- package/dist/server.js +2267 -0
- package/dist/server.js.map +7 -0
- package/dist/styles.css +300 -0
- package/package.json +94 -0
- package/thumbnail.png +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/internal/lib/editor/types.ts", "../src/internal/drizzle/schema.ts", "../src/internal/drizzle/index.ts", "../src/internal/lib/pages.ts", "../src/internal/lib/editor/validate.ts", "../src/internal/lib/data/source.ts", "../src/internal/lib/editor/tree.ts", "../src/internal/lib/editor/showcase.ts", "../src/internal/lib/editor/site-templates.ts", "../src/internal/app/api/ai-design/route.ts", "../src/internal/lib/render/load-data.ts", "../src/server-source.ts", "../src/manrope-data.ts"],
|
|
4
|
+
"sourcesContent": ["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 index,\n integer,\n jsonb,\n pgTable,\n text,\n timestamp,\n uniqueIndex,\n uuid,\n} from \"drizzle-orm/pg-core\";\nimport {\n type CanvasElement,\n type DataSource,\n DEFAULT_ROOT_STYLE,\n type RootStyle,\n} from \"../lib/editor/types\";\n\nexport const sites = pgTable(\n \"sites\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n name: text(\"name\").notNull(),\n slug: text(\"slug\").notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true })\n .notNull()\n .defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true })\n .notNull()\n .defaultNow(),\n },\n (t) => [uniqueIndex(\"sites_slug_key\").on(t.slug)],\n);\n\nexport const pages = pgTable(\n \"pages\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n siteId: uuid(\"site_id\")\n .notNull()\n .references(() => sites.id, { onDelete: \"cascade\" }),\n name: text(\"name\").notNull(),\n slug: text(\"slug\").notNull(),\n /**\n * Flat list of canvas elements; nesting is expressed through\n * `parentId`, mirroring the editor's in-memory state exactly so a save\n * is a single atomic write instead of a per-element diff.\n */\n elements: jsonb(\"elements\").$type<CanvasElement[]>().notNull().default([]),\n /** Page-level container settings: max width, background, root layout. */\n rootStyle: jsonb(\"root_style\")\n .$type<RootStyle>()\n .notNull()\n .default(DEFAULT_ROOT_STYLE),\n /** JSON endpoints this page pulls content from. */\n dataSources: jsonb(\"data_sources\").$type<DataSource[]>().notNull().default([]),\n /** Bumped on every write; used for optimistic concurrency on save. */\n version: integer(\"version\").notNull().default(1),\n /**\n * Snapshot taken by Publish. The public site reads these columns, so\n * drafts never leak before the author is ready.\n */\n publishedElements: jsonb(\"published_elements\").$type<CanvasElement[]>(),\n publishedRootStyle: jsonb(\"published_root_style\").$type<RootStyle>(),\n publishedDataSources: jsonb(\"published_data_sources\").$type<DataSource[]>(),\n publishedAt: timestamp(\"published_at\", { withTimezone: true }),\n createdAt: timestamp(\"created_at\", { withTimezone: true })\n .notNull()\n .defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true })\n .notNull()\n .defaultNow(),\n },\n (t) => [\n uniqueIndex(\"pages_site_id_slug_key\").on(t.siteId, t.slug),\n index(\"pages_site_id_idx\").on(t.siteId),\n ],\n);\n\n/**\n * Append-only snapshot taken on each successful save, so undo survives a\n * reload and a bad autosave can be rolled back.\n */\nexport const pageRevisions = pgTable(\n \"page_revisions\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n pageId: uuid(\"page_id\")\n .notNull()\n .references(() => pages.id, { onDelete: \"cascade\" }),\n version: integer(\"version\").notNull(),\n elements: jsonb(\"elements\").$type<CanvasElement[]>().notNull(),\n rootStyle: jsonb(\"root_style\").$type<RootStyle>(),\n createdAt: timestamp(\"created_at\", { withTimezone: true })\n .notNull()\n .defaultNow(),\n },\n (t) => [index(\"page_revisions_page_id_created_at_idx\").on(t.pageId, t.createdAt)],\n);\n\nexport type Site = typeof sites.$inferSelect;\nexport type Page = typeof pages.$inferSelect;\nexport type PageRevision = typeof pageRevisions.$inferSelect;\n", "import { drizzle } from \"drizzle-orm/node-postgres\";\nimport { Pool } from \"pg\";\n\nconst connectionString = process.env.DATABASE_URL;\n\nif (!connectionString) {\n throw new Error(\n \"DATABASE_URL is not set. Copy .env.example to .env.local and start Postgres with `docker compose up -d`.\",\n );\n}\n\n/**\n * Next's dev server re-evaluates modules on every hot reload, which would open\n * a fresh pool each time and exhaust Postgres connections. Cache it on\n * globalThis so reloads reuse the same pool.\n */\nconst globalForDb = globalThis as unknown as { pagieraPool?: Pool };\n\nconst pool =\n globalForDb.pagieraPool ??\n new Pool({ connectionString, max: 10, idleTimeoutMillis: 30_000 });\n\nif (process.env.NODE_ENV !== \"production\") {\n globalForDb.pagieraPool = pool;\n}\n\nexport const db = drizzle({ client: pool });\n\nexport * from \"./schema\";\n", "import { and, asc, desc, eq, isNotNull, ne, notInArray, sql } from \"drizzle-orm\";\nimport { db } from \"@/drizzle\";\nimport { type Page, pageRevisions, pages, sites } from \"@/drizzle/schema\";\nimport {\n type CanvasElement,\n type DataSource,\n DEFAULT_ROOT_STYLE,\n type RootStyle,\n} from \"@/lib/editor/types\";\nimport type { SiteTemplatePage } from \"@/lib/editor/showcase\";\n\nexport const DEFAULT_SITE_SLUG = \"default\";\nexport const DEFAULT_PAGE_SLUG = \"home\";\n\n/** How many autosave snapshots to retain per page before pruning the oldest. */\nconst REVISION_LIMIT = 50;\n\nexport type PageSummary = {\n id: string;\n name: string;\n slug: string;\n publishedAt: Date | null;\n updatedAt: Date;\n};\n\nasync function getDefaultSiteId() {\n const [existing] = await db\n .select({ id: sites.id })\n .from(sites)\n .where(eq(sites.slug, DEFAULT_SITE_SLUG))\n .limit(1);\n if (existing) return existing.id;\n\n await db\n .insert(sites)\n .values({ name: \"Default site\", slug: DEFAULT_SITE_SLUG })\n .onConflictDoNothing({ target: sites.slug });\n\n const [created] = await db\n .select({ id: sites.id })\n .from(sites)\n .where(eq(sites.slug, DEFAULT_SITE_SLUG))\n .limit(1);\n if (!created) throw new Error(\"Failed to create the default site\");\n return created.id;\n}\n\nexport async function listPages(): Promise<PageSummary[]> {\n const siteId = await getDefaultSiteId();\n return db\n .select({\n id: pages.id,\n name: pages.name,\n slug: pages.slug,\n publishedAt: pages.publishedAt,\n updatedAt: pages.updatedAt,\n })\n .from(pages)\n .where(eq(pages.siteId, siteId))\n .orderBy(asc(pages.createdAt));\n}\n\n/**\n * Every page's element tree, for the cross-page component library. Kept\n * separate from `listPages` because it pulls the whole document and only the\n * library needs that.\n */\nexport async function listPageDocuments() {\n const siteId = await getDefaultSiteId();\n return db\n .select({ id: pages.id, name: pages.name, elements: pages.elements })\n .from(pages)\n .where(eq(pages.siteId, siteId))\n .orderBy(asc(pages.createdAt));\n}\n\nexport async function getPage(pageId: string): Promise<Page | undefined> {\n const [page] = await db\n .select()\n .from(pages)\n .where(eq(pages.id, pageId))\n .limit(1);\n return page;\n}\n\n/** The published snapshot for a public URL, or undefined when unpublished. */\nexport async function getPublishedPage(slug: string) {\n const siteId = await getDefaultSiteId();\n const [page] = await db\n .select({\n name: pages.name,\n elements: pages.publishedElements,\n rootStyle: pages.publishedRootStyle,\n dataSources: pages.publishedDataSources,\n publishedAt: pages.publishedAt,\n })\n .from(pages)\n .where(\n and(\n eq(pages.siteId, siteId),\n eq(pages.slug, slug),\n isNotNull(pages.publishedAt),\n ),\n )\n .limit(1);\n\n if (!page?.elements) return undefined;\n return {\n name: page.name,\n elements: page.elements,\n rootStyle: page.rootStyle ?? DEFAULT_ROOT_STYLE,\n dataSources: page.dataSources ?? [],\n publishedAt: page.publishedAt,\n };\n}\n\nexport async function listPublishedSlugs() {\n const siteId = await getDefaultSiteId();\n return db\n .select({ slug: pages.slug })\n .from(pages)\n .where(and(eq(pages.siteId, siteId), isNotNull(pages.publishedAt)));\n}\n\n/**\n * Returns the page the editor opens by default, creating it on first run so a\n * fresh clone has something to edit.\n */\nexport async function getOrCreateDefaultPage(): Promise<Page> {\n const siteId = await getDefaultSiteId();\n\n const [existing] = await db\n .select()\n .from(pages)\n .where(and(eq(pages.siteId, siteId), eq(pages.slug, DEFAULT_PAGE_SLUG)))\n .limit(1);\n if (existing) return existing;\n\n await db\n .insert(pages)\n .values({\n siteId,\n name: \"Home\",\n slug: DEFAULT_PAGE_SLUG,\n elements: [],\n rootStyle: DEFAULT_ROOT_STYLE,\n })\n .onConflictDoNothing({ target: [pages.siteId, pages.slug] });\n\n const [page] = await db\n .select()\n .from(pages)\n .where(and(eq(pages.siteId, siteId), eq(pages.slug, DEFAULT_PAGE_SLUG)))\n .limit(1);\n if (!page) throw new Error(\"Failed to create the default page\");\n return page;\n}\n\n/* ------------------------------------------------------------------- writes */\n\nexport type SaveResult =\n | { status: \"saved\"; version: number }\n /** Another writer advanced the page; carries the winning state. */\n | {\n status: \"conflict\";\n version: number;\n elements: CanvasElement[];\n rootStyle: RootStyle;\n dataSources: DataSource[];\n };\n\nexport async function savePageDocument(\n pageId: string,\n elements: CanvasElement[],\n rootStyle: RootStyle,\n dataSources: DataSource[],\n expectedVersion: number,\n): Promise<SaveResult> {\n const [updated] = await db\n .update(pages)\n .set({\n elements,\n rootStyle,\n dataSources,\n version: sql`${pages.version} + 1`,\n updatedAt: new Date(),\n })\n .where(and(eq(pages.id, pageId), eq(pages.version, expectedVersion)))\n .returning({ version: pages.version });\n\n if (!updated) {\n const [current] = await db\n .select({\n version: pages.version,\n elements: pages.elements,\n rootStyle: pages.rootStyle,\n dataSources: pages.dataSources,\n })\n .from(pages)\n .where(eq(pages.id, pageId))\n .limit(1);\n\n if (!current) throw new Error(`Page ${pageId} no longer exists`);\n return {\n status: \"conflict\",\n version: current.version,\n elements: current.elements,\n rootStyle: current.rootStyle ?? DEFAULT_ROOT_STYLE,\n dataSources: current.dataSources ?? [],\n };\n }\n\n await db\n .insert(pageRevisions)\n .values({ pageId, version: updated.version, elements, rootStyle });\n await pruneRevisions(pageId);\n\n return { status: \"saved\", version: updated.version };\n}\n\n/** Copies the current draft into the published columns. */\nexport async function publishPage(pageId: string) {\n const [updated] = await db\n .update(pages)\n .set({\n publishedElements: sql`${pages.elements}`,\n publishedRootStyle: sql`${pages.rootStyle}`,\n publishedDataSources: sql`${pages.dataSources}`,\n publishedAt: new Date(),\n })\n .where(eq(pages.id, pageId))\n .returning({ slug: pages.slug, publishedAt: pages.publishedAt });\n\n return updated;\n}\n\nexport async function unpublishPage(pageId: string) {\n await db\n .update(pages)\n .set({\n publishedAt: null,\n publishedElements: null,\n publishedRootStyle: null,\n publishedDataSources: null,\n })\n .where(eq(pages.id, pageId));\n}\n\nexport async function createPage(name: string, slug: string) {\n const siteId = await getDefaultSiteId();\n const [created] = await db\n .insert(pages)\n .values({\n siteId,\n name,\n slug,\n elements: [],\n rootStyle: DEFAULT_ROOT_STYLE,\n })\n .onConflictDoNothing({ target: [pages.siteId, pages.slug] })\n .returning({ id: pages.id });\n\n return created?.id;\n}\n\n/** Atomically replaces the current site's pages with a complete template. */\nexport async function installTemplatePages(templatePages: SiteTemplatePage[]) {\n const siteId = await getDefaultSiteId();\n if (templatePages.length === 0) return undefined;\n if (!templatePages.some((template) => template.slug === DEFAULT_PAGE_SLUG)) {\n throw new Error(\"Every site template must include a home page.\");\n }\n return db.transaction(async (tx) => {\n // Revisions are removed by the FK cascade. If insertion fails, the\n // transaction restores every previous page instead of leaving an\n // empty project behind.\n await tx.delete(pages).where(eq(pages.siteId, siteId));\n const created = await tx.insert(pages).values(templatePages.map((template) => ({\n siteId,\n name: template.name,\n slug: template.slug,\n elements: template.elements,\n rootStyle: template.rootStyle,\n dataSources: template.dataSources ?? [],\n }))).returning({ id: pages.id, slug: pages.slug });\n return created.find((page) => page.slug === templatePages[0].slug)?.id;\n });\n}\n\nexport async function duplicatePage(pageId: string, name: string, slug: string) {\n const source = await getPage(pageId);\n if (!source) return undefined;\n\n const [created] = await db\n .insert(pages)\n .values({\n siteId: source.siteId,\n name,\n slug,\n elements: source.elements,\n rootStyle: source.rootStyle ?? DEFAULT_ROOT_STYLE,\n })\n .onConflictDoNothing({ target: [pages.siteId, pages.slug] })\n .returning({ id: pages.id });\n\n return created?.id;\n}\n\nexport async function renamePage(pageId: string, name: string, slug: string) {\n const current = await getPage(pageId);\n if (!current || (current.slug === DEFAULT_PAGE_SLUG && slug !== DEFAULT_PAGE_SLUG)) return undefined;\n const [updated] = await db\n .update(pages)\n .set({ name, slug, updatedAt: new Date() })\n .where(eq(pages.id, pageId))\n .returning({ id: pages.id });\n return updated?.id;\n}\n\n/** Refuses to delete the last page, so the editor always has something to open. */\nexport async function deletePage(pageId: string) {\n const siteId = await getDefaultSiteId();\n await getOrCreateDefaultPage();\n const [target] = await db\n .select({ slug: pages.slug })\n .from(pages)\n .where(and(eq(pages.siteId, siteId), eq(pages.id, pageId)))\n .limit(1);\n if (!target) return { deleted: false as const, reason: \"not-found\" as const };\n if (target.slug === DEFAULT_PAGE_SLUG) {\n return { deleted: false as const, reason: \"home-required\" as const };\n }\n const remaining = await db\n .select({ id: pages.id })\n .from(pages)\n .where(and(eq(pages.siteId, siteId), ne(pages.id, pageId)))\n .limit(1);\n\n if (remaining.length === 0) return { deleted: false as const, reason: \"last-page\" as const };\n\n await db.delete(pages).where(eq(pages.id, pageId));\n return { deleted: true as const, fallbackId: remaining[0].id };\n}\n\nasync function pruneRevisions(pageId: string) {\n const keep = await db\n .select({ id: pageRevisions.id })\n .from(pageRevisions)\n .where(eq(pageRevisions.pageId, pageId))\n .orderBy(desc(pageRevisions.createdAt))\n .limit(REVISION_LIMIT);\n\n if (keep.length < REVISION_LIMIT) return;\n\n await db.delete(pageRevisions).where(\n and(\n eq(pageRevisions.pageId, pageId),\n notInArray(\n pageRevisions.id,\n keep.map((r) => r.id),\n ),\n ),\n );\n}\n", "import {\n BASE_STYLE,\n DATA_SOURCE_NOT_FOUND_BEHAVIORS,\n type DataSource,\n HTTP_METHODS,\n type RequestPair,\n type Breakpoint,\n type CanvasElement,\n DEFAULT_BREAKPOINTS,\n DEFAULT_ROOT_STYLE,\n ELEMENT_TYPES,\n type ElementStyle,\n type ElementType,\n type RootStyle,\n STYLE_KEYS,\n type StyleKey,\n} from \"./types\";\n\nexport const MAX_ELEMENTS = 2000;\nconst MAX_CONTENT = 10_000;\nconst MAX_SHORT_STRING = 200;\nconst MAX_URL = 2048;\nconst COORD_LIMIT = 100_000;\n\nconst ELEMENT_TYPE_SET: ReadonlySet<string> = new Set(ELEMENT_TYPES);\n\nexport class InvalidElementsError extends Error {}\n\n/* ------------------------------------------------------------------ scalars */\n\nfunction num(value: unknown, fallback: number, min: number, max: number) {\n const n = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(n)) return fallback;\n return Math.min(max, Math.max(min, n));\n}\n\n/** Older AI/preset builds wrote CSS scale multipliers (1.03) while the editor\n * stores percentages (103). Normalize those documents as they are loaded. */\nfunction scalePercent(value: unknown, fallback: number) {\n const parsed = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(parsed)) return fallback;\n const normalized = parsed > 0 && parsed <= 5 ? parsed * 100 : parsed;\n return Math.min(500, Math.max(1, normalized));\n}\n\nfunction str(value: unknown, max: number) {\n if (typeof value !== \"string\") return undefined;\n return value.length > max ? value.slice(0, max) : value;\n}\n\nfunction oneOf<T extends string>(\n value: unknown,\n allowed: readonly T[],\n fallback: T,\n): T {\n return typeof value === \"string\" && (allowed as readonly string[]).includes(value)\n ? (value as T)\n : fallback;\n}\n\n/**\n * Colours, gradients, shadows and font stacks are written into a stylesheet on\n * the published page, so a value carrying `;` or `}` could close the rule and\n * inject arbitrary CSS. Strip the characters that can escape a declaration.\n */\nfunction cssValue(value: unknown, fallback: string) {\n const raw = str(value, MAX_SHORT_STRING);\n if (raw === undefined) return fallback;\n const cleaned = raw.replace(/[;{}<>\\\\]/g, \"\").replace(/@import/gi, \"\");\n return cleaned.trim();\n}\n\n/**\n * Only http(s) and data: images are allowed through. Anything else \u2014 most\n * importantly `javascript:` \u2014 is dropped rather than rendered into an href.\n */\nfunction safeUrl(value: unknown): string | undefined {\n const raw = str(value, MAX_URL);\n if (!raw) return undefined;\n const trimmed = raw.trim();\n if (trimmed === \"\") return \"\";\n // Relative links stay relative; they cannot carry a scheme.\n if (trimmed.startsWith(\"/\") || trimmed.startsWith(\"#\")) return trimmed;\n if (/^https?:\\/\\//i.test(trimmed)) return trimmed;\n if (/^data:image\\//i.test(trimmed)) return trimmed;\n return undefined;\n}\n\n/** Safe for interpolation into `url(\"\u2026\")`. */\nfunction imageUrl(value: unknown) {\n const raw = safeUrl(value);\n if (!raw) return \"\";\n return /[\"'()\\\\]/.test(raw) ? \"\" : raw;\n}\n\n/**\n * A binding is a dotted field path such as `author.name`. Restricting the\n * alphabet keeps it a lookup and nothing more.\n */\nfunction bindingPath(value: unknown) {\n const raw = str(value, MAX_SHORT_STRING)?.trim();\n if (!raw) return undefined;\n return /^[A-Za-z0-9_$][A-Za-z0-9_$.-]*$/.test(raw) ? raw : undefined;\n}\n\n/* -------------------------------------------------------------------- style */\n\nfunction parseStyle(input: unknown, base: ElementStyle): ElementStyle {\n const raw = (input && typeof input === \"object\" ? input : {}) as Record<\n string,\n unknown\n >;\n\n return {\n x: num(raw.x, base.x, -COORD_LIMIT, COORD_LIMIT),\n y: num(raw.y, base.y, -COORD_LIMIT, COORD_LIMIT),\n constraintX: oneOf(\n raw.constraintX,\n [\"start\", \"center\", \"end\", \"stretch\"],\n base.constraintX,\n ),\n constraintY: oneOf(\n raw.constraintY,\n [\"start\", \"center\", \"end\", \"stretch\"],\n base.constraintY,\n ),\n w: num(raw.w, base.w, 1, COORD_LIMIT),\n h: num(raw.h, base.h, 1, COORD_LIMIT),\n widthMode: oneOf(raw.widthMode, [\"fixed\", \"fill\", \"auto\"], base.widthMode),\n heightMode: oneOf(raw.heightMode, [\"fixed\", \"fill\", \"auto\"], base.heightMode),\n\n layout: oneOf(raw.layout, [\"absolute\", \"stack\"], base.layout),\n direction: oneOf(raw.direction, [\"row\", \"column\"], base.direction),\n gap: num(raw.gap, base.gap, 0, 999),\n padT: num(raw.padT, base.padT, 0, 9999),\n padR: num(raw.padR, base.padR, 0, 9999),\n padB: num(raw.padB, base.padB, 0, 9999),\n padL: num(raw.padL, base.padL, 0, 9999),\n justify: oneOf(raw.justify, [\"start\", \"center\", \"end\", \"between\"], base.justify),\n align: oneOf(raw.align, [\"start\", \"center\", \"end\", \"stretch\"], base.align),\n wrap: raw.wrap === true,\n columns: num(raw.columns, base.columns, 1, 12),\n\n bg: cssValue(raw.bg, base.bg),\n gradient: cssValue(raw.gradient, base.gradient),\n color: cssValue(raw.color, base.color),\n radius: num(raw.radius, base.radius, 0, 9999),\n opacity: num(raw.opacity, base.opacity, 0, 100),\n borderW: num(raw.borderW, base.borderW, 0, 999),\n borderC: cssValue(raw.borderC, base.borderC),\n borderStyle: oneOf(raw.borderStyle, [\"solid\", \"dashed\", \"dotted\"], base.borderStyle),\n shadow: cssValue(raw.shadow, base.shadow),\n rotate: num(raw.rotate, base.rotate, -360, 360),\n\n fontFamily: cssValue(raw.fontFamily, base.fontFamily),\n fontSize: num(raw.fontSize, base.fontSize, 1, 999),\n fontWeight: cssValue(raw.fontWeight, base.fontWeight),\n lineHeight: num(raw.lineHeight, base.lineHeight, 0.5, 10),\n letterSpacing: num(raw.letterSpacing, base.letterSpacing, -50, 50),\n textAlign: oneOf(raw.textAlign, [\"left\", \"center\", \"right\", \"justify\"], base.textAlign),\n textTransform: oneOf(\n raw.textTransform,\n [\"none\", \"uppercase\", \"lowercase\", \"capitalize\"],\n base.textTransform,\n ),\n\n overflow: oneOf(raw.overflow, [\"visible\", \"hidden\", \"auto\", \"scroll\"] as const, base.overflow),\n position: oneOf(raw.position, [\"static\", \"sticky\"] as const, base.position),\n stickyOffset: num(raw.stickyOffset, base.stickyOffset, -9999, 9999),\n bgImage: raw.bgImage === undefined ? base.bgImage : imageUrl(raw.bgImage),\n bgSize: oneOf(raw.bgSize, [\"cover\", \"contain\", \"auto\"] as const, base.bgSize),\n bgPosition: cssValue(raw.bgPosition, base.bgPosition),\n blur: num(raw.blur, base.blur, 0, 200),\n backdropBlur: num(raw.backdropBlur, base.backdropBlur, 0, 200),\n blendMode: oneOf(\n raw.blendMode,\n [\"normal\",\"multiply\",\"screen\",\"overlay\",\"darken\",\"lighten\",\"difference\",\"luminosity\"] as const,\n base.blendMode,\n ),\n scale: scalePercent(raw.scale, base.scale),\n aspectRatio: /^\\d{1,3}\\/\\d{1,3}$/.test(String(raw.aspectRatio ?? \"\"))\n ? String(raw.aspectRatio)\n : raw.aspectRatio === undefined\n ? base.aspectRatio\n : \"\",\n\n entrance: oneOf(\n raw.entrance,\n [\"none\", \"fade\", \"up\", \"down\", \"left\", \"right\", \"zoom\"] as const,\n base.entrance,\n ),\n entranceDuration: num(raw.entranceDuration, base.entranceDuration, 50, 5000),\n entranceDelay: num(raw.entranceDelay, base.entranceDelay, 0, 5000),\n entranceCurve: oneOf(raw.entranceCurve, [\"ease\", \"spring\"], base.entranceCurve),\n entranceBezier: cssValue(raw.entranceBezier, base.entranceBezier),\n springStiffness: num(raw.springStiffness, base.springStiffness, 1, 1000),\n springDamping: num(raw.springDamping, base.springDamping, 1, 100),\n cursor: oneOf(raw.cursor, [\"auto\", \"default\", \"pointer\", \"text\", \"grab\", \"zoom-in\", \"none\"], base.cursor),\n\n hidden: raw.hidden === true,\n };\n}\n\n/** Keeps only the keys the caller actually set, so the cascade stays intact. */\nfunction parsePartialStyle(\n input: unknown,\n base: ElementStyle,\n): Partial<ElementStyle> {\n if (!input || typeof input !== \"object\") return {};\n const raw = input as Record<string, unknown>;\n const full = parseStyle(raw, base);\n\n const partial: Partial<ElementStyle> = {};\n for (const key of STYLE_KEYS) {\n if (raw[key] !== undefined) {\n // `as never` narrows the union assignment that TS cannot follow\n // across a generic key.\n partial[key] = full[key] as never;\n }\n }\n return partial;\n}\n\n/* ----------------------------------------------------------------- elements */\n\n/**\n * Server Actions are reachable by direct POST, so anything arriving from the\n * client is untrusted. This narrows an unknown payload to a well-formed\n * element list: unknown keys are dropped, numbers clamped, unsafe URLs\n * removed, and orphaned or cyclic `parentId` links severed.\n */\nexport function parseElements(\n input: unknown,\n /** Whichever breakpoint holds the shared values; it owns `base`, so it can\n * never also carry an override. */\n baseBreakpointId = \"desktop\",\n): CanvasElement[] {\n if (!Array.isArray(input)) {\n throw new InvalidElementsError(\"elements must be an array\");\n }\n if (input.length > MAX_ELEMENTS) {\n throw new InvalidElementsError(\n `a page cannot hold more than ${MAX_ELEMENTS} elements`,\n );\n }\n\n const seen = new Set<string>();\n const parsed: CanvasElement[] = [];\n\n for (const raw of input) {\n if (!raw || typeof raw !== \"object\") continue;\n const el = upgradeLegacy(raw as Record<string, unknown>);\n\n const id = str(el.id, MAX_SHORT_STRING);\n if (!id || seen.has(id)) continue;\n if (typeof el.type !== \"string\" || !ELEMENT_TYPE_SET.has(el.type)) continue;\n seen.add(id);\n\n const base = parseStyle(el.base, BASE_STYLE);\n\n const overrides: CanvasElement[\"overrides\"] = {};\n if (el.overrides && typeof el.overrides === \"object\") {\n for (const [key, value] of Object.entries(\n el.overrides as Record<string, unknown>,\n )) {\n if (!/^[a-zA-Z0-9_-]{1,60}$/.test(key)) continue;\n if (key === baseBreakpointId) continue;\n const partial = parsePartialStyle(value, base);\n if (Object.keys(partial).length > 0) {\n overrides[key as Breakpoint] = partial;\n }\n }\n }\n\n const hover = parsePartialStyle(el.hover, base);\n const press = parsePartialStyle(el.press, base);\n\n parsed.push({\n id,\n type: el.type as ElementType,\n name: str(el.name, MAX_SHORT_STRING),\n parentId: str(el.parentId, MAX_SHORT_STRING),\n z: num(el.z, 0, 0, MAX_ELEMENTS),\n locked: el.locked === true ? true : undefined,\n componentRole:\n el.componentRole === \"master\" || el.componentRole === \"instance\"\n ? el.componentRole\n : undefined,\n componentId: str(el.componentId, MAX_SHORT_STRING),\n componentSourceId: str(el.componentSourceId, MAX_SHORT_STRING),\n variant: str(el.variant, MAX_SHORT_STRING),\n styleBindings:\n el.styleBindings && typeof el.styleBindings === \"object\"\n ? Object.fromEntries(\n Object.entries(\n el.styleBindings as Record<string, unknown>,\n ).flatMap(([key, value]) =>\n STYLE_KEYS.includes(key as StyleKey) &&\n typeof value === \"string\"\n ? [[key, value.slice(0, MAX_SHORT_STRING)]]\n : [],\n ),\n )\n : undefined,\n\n content: str(el.content, MAX_CONTENT),\n code: str(el.code, MAX_CONTENT),\n src: safeUrl(el.src),\n alt: str(el.alt, MAX_SHORT_STRING),\n objectFit: oneOf(el.objectFit, [\"cover\", \"contain\", \"fill\", \"none\"] as const, \"cover\"),\n iconName: oneOf(el.iconName, [\"star\", \"heart\", \"arrow-right\", \"check\", \"menu\", \"search\"] as const, \"star\"),\n href: safeUrl(el.href),\n sourceId: str(el.sourceId, MAX_SHORT_STRING),\n binding: bindingPath(el.binding),\n target: oneOf(el.target, [\"_self\", \"_blank\"] as const, \"_self\"),\n interaction:\n el.interaction && typeof el.interaction === \"object\"\n ? (() => {\n const interaction = el.interaction as Record<string, unknown>;\n const action = oneOf(\n interaction.action,\n [\"navigate\", \"scroll-to\", \"toggle-layer\", \"show-layer\", \"hide-layer\"] as const,\n \"navigate\",\n );\n const value =\n action !== \"navigate\"\n ? str(interaction.value, MAX_SHORT_STRING)?.replace(/[^a-zA-Z0-9_-]/g, \"\")\n : safeUrl(interaction.value);\n return value\n ? {\n trigger: \"click\" as const,\n action,\n value,\n target: oneOf(\n interaction.target,\n [\"_self\", \"_blank\"] as const,\n \"_self\",\n ),\n }\n : undefined;\n })()\n : undefined,\n\n base,\n overrides: Object.keys(overrides).length > 0 ? overrides : undefined,\n hover: Object.keys(hover).length > 0 ? hover : undefined,\n press: Object.keys(press).length > 0 ? press : undefined,\n loop:\n el.loop && typeof el.loop === \"object\"\n ? {\n type: oneOf((el.loop as Record<string, unknown>).type, [\"pulse\", \"float\", \"spin\"], \"pulse\"),\n duration: num((el.loop as Record<string, unknown>).duration, 1600, 100, 20000),\n }\n : undefined,\n draggable: el.draggable === true ? true : undefined,\n });\n }\n\n return severBrokenParents(parsed);\n}\n\n/**\n * Documents saved before styles moved into `base` stored every style field on\n * the element itself. Lift them so old pages keep working.\n */\nfunction upgradeLegacy(raw: Record<string, unknown>): Record<string, unknown> {\n if (raw.base !== undefined) return raw;\n\n const legacy = raw as Record<string, unknown>;\n return {\n ...legacy,\n base: {\n x: legacy.x,\n y: legacy.y,\n w: legacy.w,\n h: legacy.h,\n heightMode: legacy.autoHeight === true ? \"auto\" : \"fixed\",\n bg: legacy.bg,\n color: legacy.color,\n radius: legacy.radius,\n opacity: legacy.opacity,\n borderW: legacy.borderW,\n borderC: legacy.borderC,\n fontSize: legacy.fontSize,\n fontWeight: legacy.fontWeight,\n hidden: legacy.hidden,\n },\n };\n}\n\n/**\n * Drops `parentId` values that point at a missing element or that would form a\n * cycle, so rendering can never recurse forever.\n */\nfunction severBrokenParents(elements: CanvasElement[]): CanvasElement[] {\n const byId = new Map(elements.map((el) => [el.id, el]));\n\n return elements.map((el) => {\n if (!el.parentId) return el;\n if (el.parentId === el.id || !byId.has(el.parentId)) {\n return { ...el, parentId: undefined };\n }\n\n const visited = new Set<string>([el.id]);\n let cursor = byId.get(el.parentId);\n while (cursor) {\n if (visited.has(cursor.id)) return { ...el, parentId: undefined };\n visited.add(cursor.id);\n cursor = cursor.parentId ? byId.get(cursor.parentId) : undefined;\n }\n return el;\n });\n}\n\n/* --------------------------------------------------------------- root style */\n\nexport function parseRootStyle(input: unknown): RootStyle {\n const raw = (input && typeof input === \"object\" ? input : {}) as Record<\n string,\n unknown\n >;\n const base = DEFAULT_ROOT_STYLE;\n const breakpoints = Array.isArray(raw.breakpoints)\n ? raw.breakpoints\n .slice(0, 12)\n .flatMap((item) => {\n if (!item || typeof item !== \"object\") return [];\n const value = item as Record<string, unknown>;\n const id = str(value.id, 60)?.replace(/[^a-zA-Z0-9_-]/g, \"\");\n const name = str(value.name, 40)?.trim();\n if (!id || !name) return [];\n return [{ id, name, width: num(value.width, 1280, 240, 4000) }];\n })\n : undefined;\n const variables: RootStyle[\"variables\"] = Array.isArray(raw.variables)\n ? raw.variables.slice(0, 100).reduce<NonNullable<RootStyle[\"variables\"]>>((result, item) => {\n if (!item || typeof item !== \"object\") return result;\n const variable = item as Record<string, unknown>;\n const id = str(variable.id, 60);\n const name = str(variable.name, 60)?.trim();\n if (!id || !name) return result;\n if (variable.type === \"color\" && typeof variable.value === \"string\")\n result.push({ id, name, type: \"color\", value: cssValue(variable.value, \"#000000\") });\n if (variable.type === \"number\" && Number.isFinite(Number(variable.value)))\n result.push({ id, name, type: \"number\", value: Number(variable.value) });\n return result;\n }, [])\n : undefined;\n const customFonts: RootStyle[\"customFonts\"] = Array.isArray(raw.customFonts)\n ? raw.customFonts.slice(0, 20).flatMap((item) => {\n if (!item || typeof item !== \"object\") return [];\n const font = item as Record<string, unknown>;\n const id = str(font.id, 60);\n const name = str(font.name, 80)?.trim();\n const url = safeUrl(font.url);\n if (!id || !name || !url || (!/^https?:\\/\\//i.test(url) && !url.startsWith(\"/\"))) return [];\n return [{ id, name, url, weight: num(font.weight, 400, 100, 900), style: oneOf(font.style, [\"normal\", \"italic\"], \"normal\") }];\n })\n : undefined;\n\n return {\n documentMode: oneOf(raw.documentMode, [\"page\", \"component\"], base.documentMode),\n maxWidth: num(raw.maxWidth, base.maxWidth, 1, 4000),\n canvasHeight: num(raw.canvasHeight, base.canvasHeight, 1, 12000),\n fullWidth: raw.fullWidth === true,\n bg: cssValue(raw.bg, base.bg),\n layout: oneOf(raw.layout, [\"absolute\", \"stack\"], base.layout),\n direction: oneOf(raw.direction, [\"row\", \"column\"], base.direction),\n gap: num(raw.gap, base.gap, 0, 999),\n padT: num(raw.padT, base.padT, 0, 9999),\n padR: num(raw.padR, base.padR, 0, 9999),\n padB: num(raw.padB, base.padB, 0, 9999),\n padL: num(raw.padL, base.padL, 0, 9999),\n align: oneOf(raw.align, [\"start\", \"center\", \"end\", \"stretch\"], base.align),\n fontFamily: cssValue(raw.fontFamily, base.fontFamily),\n // A page may define any set of artboards, so the stored list is kept as\n // it comes; only an empty one falls back to the defaults.\n breakpoints: breakpoints?.length ? breakpoints : undefined,\n // The main breakpoint is whichever one holds the shared values. It has\n // to name a breakpoint that exists, or resolution would find nothing.\n baseBreakpointId: (breakpoints ?? DEFAULT_BREAKPOINTS).some(\n (item) => item.id === raw.baseBreakpointId,\n )\n ? (raw.baseBreakpointId as string)\n : undefined,\n variables,\n customFonts,\n };\n}\n\n/**\n * Query params and headers. Values keep their `{{\u2026}}` tokens; encoding and\n * header-injection checks happen at request time in `buildRequest`.\n */\nfunction parsePairs(input: unknown): RequestPair[] {\n if (!Array.isArray(input)) return [];\n const out: RequestPair[] = [];\n for (const raw of input.slice(0, 25)) {\n if (!raw || typeof raw !== \"object\") continue;\n const row = raw as Record<string, unknown>;\n const key = str(row.key, 120)?.trim();\n if (!key) continue;\n out.push({ key, value: str(row.value, 500)?.trim() ?? \"\" });\n }\n return out;\n}\n\n/** Narrows an untrusted payload to the page's data-source list. */\nexport function parseDataSources(input: unknown): DataSource[] {\n if (!Array.isArray(input)) return [];\n const seen = new Set<string>();\n const out: DataSource[] = [];\n\n for (const raw of input.slice(0, 20)) {\n if (!raw || typeof raw !== \"object\") continue;\n const row = raw as Record<string, unknown>;\n const id = str(row.id, MAX_SHORT_STRING);\n if (!id || seen.has(id)) continue;\n seen.add(id);\n\n // The URL is only checked for shape here; `assertFetchableUrl` does the\n // network-safety check at request time, where it cannot be bypassed.\n out.push({\n id,\n name: str(row.name, 120)?.trim() || \"Untitled source\",\n url: str(row.url, MAX_URL)?.trim() ?? \"\",\n path: bindingPath(row.path) ?? \"\",\n method: oneOf(row.method, HTTP_METHODS, \"GET\"),\n body: str(row.body, 20_000)?.trim() ?? \"\",\n params: parsePairs(row.params),\n headers: parsePairs(row.headers),\n onNotFound: oneOf(row.onNotFound, DATA_SOURCE_NOT_FOUND_BEHAVIORS, \"empty\"),\n });\n }\n return out;\n}\n\nconst STATIC_PATH_SEGMENT_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\nconst PARAM_PATH_SEGMENT_RE = /^:[a-z][a-z0-9_]*$/;\n\nexport function parseSlug(input: unknown): string | null {\n const raw = str(input, 200)?.trim().toLowerCase().replace(/^\\/+|\\/+$/g, \"\");\n if (!raw) return null;\n const segments = raw.split(\"/\").map((segment) =>\n segment.startsWith(\":\")\n ? segment\n : segment.replace(/[^a-z0-9]+/g, \"-\").replace(/^-+|-+$/g, \"\"),\n );\n if (segments.some((segment) => !STATIC_PATH_SEGMENT_RE.test(segment) && !PARAM_PATH_SEGMENT_RE.test(segment))) return null;\n const names = segments.filter((segment) => segment.startsWith(\":\")).map((segment) => segment.slice(1));\n if (new Set(names).size !== names.length) return null;\n return segments.join(\"/\");\n}\n\nexport function parseName(input: unknown): string | null {\n const raw = str(input, 120)?.trim();\n return raw && raw.length > 0 ? raw : null;\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 { 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 { 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 { createElement } from \"./tree\";\nimport { DEFAULT_ROOT_STYLE, type CanvasElement, type DataSource, type ElementStyle, type ElementType, type RootStyle } from \"./types\";\nimport { createNocturneSiteTemplate, type SiteTemplatePage } from \"./showcase\";\n\nexport type SiteTemplateId = \"nocturne\" | \"editorial-blog\" | \"orbit-saas\";\n\nfunction el(type: ElementType, name: string, style: Partial<ElementStyle>, content?: string, parentId?: string) {\n const item = createElement(type, { x: 0, y: 0, z: 0, parentId });\n item.name = name;\n item.base = { ...item.base, ...style };\n if (content !== undefined) item.content = content;\n return item;\n}\n\nfunction root(bg: string, ink: string, accent: string): RootStyle {\n return {\n ...DEFAULT_ROOT_STYLE,\n fullWidth: true,\n canvasHeight: 3600,\n bg,\n layout: \"stack\",\n direction: \"column\",\n align: \"stretch\",\n gap: 0,\n padT: 0, padR: 0, padB: 0, padL: 0,\n fontFamily: '\"Manrope Showcase\", sans-serif',\n customFonts: [{ id: \"template-manrope\", name: \"Manrope Showcase\", url: \"/api/pagiera/assets/manrope-variable.woff2\", weight: 400, style: \"normal\" }],\n variables: [\n { id: \"template-bg\", name: \"Template / Background\", type: \"color\", value: bg },\n { id: \"template-ink\", name: \"Template / Ink\", type: \"color\", value: ink },\n { id: \"template-accent\", name: \"Template / Accent\", type: \"color\", value: accent },\n ],\n };\n}\n\nfunction section(elements: CanvasElement[], name: string, bg: string, padding = 64) {\n const item = el(\"Section\", name, { widthMode: \"fill\", heightMode: \"auto\", layout: \"stack\", direction: \"column\", align: \"center\", bg, padT: padding, padR: 32, padB: padding, padL: 32 });\n elements.push(item);\n return item;\n}\n\nfunction container(elements: CanvasElement[], name: string, parentId: string, style: Partial<ElementStyle> = {}) {\n const item = el(\"Container\", name, { widthMode: \"fixed\", w: 1120, heightMode: \"auto\", layout: \"stack\", direction: \"column\", gap: 24, borderW: 0, padT: 0, padR: 0, padB: 0, padL: 0, ...style }, undefined, parentId);\n item.overrides = { tablet: { w: 820 }, mobile: { widthMode: \"fill\", direction: style.direction === \"row\" ? \"column\" : style.direction } };\n elements.push(item);\n return item;\n}\n\nfunction motion(item: CanvasElement, delay = 0) {\n item.base = { ...item.base, entrance: \"up\", entranceDuration: 720, entranceDelay: delay, entranceBezier: \"0.16, 1, 0.3, 1\" };\n return item;\n}\n\nfunction editorialNav(elements: CanvasElement[]) {\n const nav = section(elements, \"Editorial navigation\", \"#f3efe6\", 22);\n const inner = container(elements, \"Navigation inner\", nav.id, { direction: \"row\", justify: \"between\", align: \"center\" });\n elements.push(el(\"Heading\", \"Editorial wordmark\", { widthMode: \"auto\", heightMode: \"auto\", color: \"#171714\", fontSize: 20, fontWeight: \"800\", letterSpacing: -1 }, \"FIELD NOTES\", inner.id));\n const links = el(\"Container\", \"Navigation links\", { widthMode: \"auto\", heightMode: \"auto\", layout: \"stack\", direction: \"row\", gap: 24, borderW: 0, padT: 0, padR: 0, padB: 0, padL: 0 }, undefined, inner.id); links.overrides = { mobile: { hidden: true } }; elements.push(links);\n for (const [label, href] of [[\"Journal\", \"/blog\"], [\"About\", \"/about\"]]) { const link = el(\"Button\", `${label} link`, { widthMode: \"auto\", heightMode: \"auto\", bg: \"transparent\", color: \"#58564f\", padT: 4, padR: 0, padB: 4, padL: 0, fontSize: 13, cursor: \"pointer\" }, label, links.id); link.href = href; link.hover = { color: \"#db4b2d\" }; elements.push(link); }\n}\n\nfunction createEditorialBlogTemplate(): SiteTemplatePage[] {\n const posts: DataSource = { id: \"editorial-posts\", name: \"Published posts\", url: \"https://dummyjson.com/posts\", path: \"posts\", method: \"GET\", params: [{ key: \"limit\", value: \"6\" }] };\n const post: DataSource = { id: \"editorial-post\", name: \"Current post\", url: \"https://dummyjson.com/posts/{{params.slug}}\", path: \"\", method: \"GET\", onNotFound: \"page-404\" };\n const list: CanvasElement[] = []; editorialNav(list);\n const hero = section(list, \"Journal hero\", \"#f3efe6\", 90); const heroIn = container(list, \"Journal hero inner\", hero.id, { gap: 30 });\n list.push(motion(el(\"Text\", \"Issue label\", { widthMode: \"auto\", heightMode: \"auto\", color: \"#db4b2d\", fontSize: 11, fontWeight: \"800\", letterSpacing: 2, textTransform: \"uppercase\" }, \"Independent journal / Vol. 04\", heroIn.id)));\n const title = motion(el(\"Heading\", \"Journal title\", { widthMode: \"fill\", heightMode: \"auto\", color: \"#171714\", fontSize: 96, fontWeight: \"500\", lineHeight: .9, letterSpacing: -7 }, \"IDEAS FOR A\\nMORE HUMAN WEB.\", heroIn.id), 70); title.overrides = { tablet: { fontSize: 68 }, mobile: { fontSize: 48, letterSpacing: -3 } }; list.push(title);\n list.push(motion(el(\"Text\", \"Journal intro\", { widthMode: \"fixed\", w: 570, heightMode: \"auto\", color: \"#656158\", fontSize: 17, lineHeight: 1.7 }, \"Essays on design, technology and the quiet decisions that shape products people choose to keep.\", heroIn.id), 140));\n const feed = section(list, \"Latest writing\", \"#171714\", 90); const feedIn = container(list, \"Feed inner\", feed.id, { gap: 38 });\n list.push(el(\"Heading\", \"Feed title\", { widthMode: \"fill\", heightMode: \"auto\", color: \"#f3efe6\", fontSize: 38, fontWeight: \"600\" }, \"Latest writing\", feedIn.id));\n const repeat = el(\"Repeat\", \"Posts request grid\", { widthMode: \"fill\", heightMode: \"auto\", layout: \"stack\", direction: \"row\", columns: 2, wrap: true, gap: 18 }, undefined, feedIn.id); repeat.sourceId = posts.id; repeat.overrides = { mobile: { columns: 1 } }; list.push(repeat);\n const card = motion(el(\"Container\", \"Post card\", { widthMode: \"fill\", heightMode: \"auto\", layout: \"stack\", direction: \"column\", gap: 20, bg: \"#24231f\", borderW: 1, borderC: \"#393832\", radius: 18, padT: 30, padR: 30, padB: 34, padL: 30 }, undefined, repeat.id)); card.hover = { scale: 101.5, shadow: \"0 24px 70px rgba(0,0,0,.28)\" }; list.push(card);\n const number = el(\"Text\", \"Post number\", { widthMode: \"auto\", heightMode: \"auto\", color: \"#db4b2d\", fontSize: 11, fontWeight: \"800\" }, \"01\", card.id); number.binding = \"id\"; list.push(number);\n const postTitle = el(\"Heading\", \"Post title\", { widthMode: \"fill\", heightMode: \"auto\", color: \"#f3efe6\", fontSize: 27, fontWeight: \"600\", lineHeight: 1.15, letterSpacing: -1 }, \"Article title\", card.id); postTitle.binding = \"title\"; list.push(postTitle);\n const excerpt = el(\"Text\", \"Post excerpt\", { widthMode: \"fill\", heightMode: \"auto\", color: \"#aaa69b\", fontSize: 14, lineHeight: 1.65 }, \"Article excerpt\", card.id); excerpt.binding = \"body\"; list.push(excerpt);\n\n const detail: CanvasElement[] = []; editorialNav(detail);\n const article = section(detail, \"Article\", \"#f3efe6\", 100); const articleIn = container(detail, \"Article inner\", article.id, { w: 820, gap: 34 });\n detail.push(el(\"Text\", \"Dynamic route\", { widthMode: \"auto\", heightMode: \"auto\", color: \"#db4b2d\", fontSize: 11, fontWeight: \"800\", letterSpacing: 1.6, textTransform: \"uppercase\" }, \"Journal / Dynamic article\", articleIn.id));\n const request = el(\"Request\", \"Current post request\", { widthMode: \"fill\", heightMode: \"auto\", layout: \"stack\", direction: \"column\", gap: 34, align: \"stretch\" }, undefined, articleIn.id); request.sourceId = post.id; detail.push(request);\n const detailTitle = motion(el(\"Heading\", \"Dynamic title\", { widthMode: \"fill\", heightMode: \"auto\", color: \"#171714\", fontSize: 68, fontWeight: \"500\", lineHeight: 1, letterSpacing: -4, textTransform: \"capitalize\" }, \"Article title\", request.id)); detailTitle.binding = \"title\"; detail.push(detailTitle);\n const body = el(\"Text\", \"Article body\", { widthMode: \"fill\", heightMode: \"auto\", color: \"#4f4c45\", fontSize: 20, lineHeight: 1.85 }, \"Article body\", request.id); body.binding = \"body\"; detail.push(body);\n\n const about: CanvasElement[] = []; editorialNav(about); const aboutHero = section(about, \"About Field Notes\", \"#db4b2d\", 120); const aboutIn = container(about, \"About inner\", aboutHero.id, { gap: 36 });\n about.push(motion(el(\"Heading\", \"About title\", { widthMode: \"fill\", heightMode: \"auto\", color: \"#171714\", fontSize: 82, fontWeight: \"500\", lineHeight: .95, letterSpacing: -5 }, \"WE WRITE TO\\nNOTICE BETTER.\", aboutIn.id)));\n about.push(el(\"Text\", \"About copy\", { widthMode: \"fixed\", w: 620, heightMode: \"auto\", color: \"#2e261f\", fontSize: 19, lineHeight: 1.75 }, \"Field Notes is an independent publication exploring how thoughtful digital work gets made\u2014and why restraint is often the boldest decision.\", aboutIn.id));\n return [\n { name: \"Home\", slug: \"home\", elements: structuredClone(list), rootStyle: root(\"#f3efe6\", \"#171714\", \"#db4b2d\"), dataSources: [structuredClone(posts)] },\n { name: \"Journal\", slug: \"blog\", elements: list, rootStyle: root(\"#f3efe6\", \"#171714\", \"#db4b2d\"), dataSources: [posts] },\n { name: \"Article\", slug: \"blog/:slug\", elements: detail, rootStyle: root(\"#f3efe6\", \"#171714\", \"#db4b2d\"), dataSources: [post] },\n { name: \"About\", slug: \"about\", elements: about, rootStyle: root(\"#db4b2d\", \"#171714\", \"#f3efe6\"), dataSources: [] },\n ];\n}\n\nfunction createOrbitTemplate(): SiteTemplatePage[] {\n const build = (name: string, slug: string, eyebrow: string, titleText: string, copy: string): SiteTemplatePage => {\n const elements: CanvasElement[] = [];\n const nav = section(elements, \"Orbit navigation\", \"#070914\", 20); const navIn = container(elements, \"Orbit navigation inner\", nav.id, { direction: \"row\", justify: \"between\", align: \"center\" });\n elements.push(el(\"Heading\", \"Orbit logo\", { widthMode: \"auto\", heightMode: \"auto\", color: \"#f5f7ff\", fontSize: 19, fontWeight: \"800\" }, \"ORBIT/OS\", navIn.id));\n const cta = el(\"Button\", \"Navigation action\", { widthMode: \"auto\", heightMode: \"auto\", bg: \"#7357ff\", color: \"#ffffff\", radius: 999, padT: 11, padR: 18, padB: 11, padL: 18, fontSize: 12, fontWeight: \"700\" }, \"Start building\", navIn.id); cta.hover = { scale: 103, shadow: \"0 14px 40px rgba(115,87,255,.35)\" }; elements.push(cta);\n const hero = section(elements, `${name} hero`, \"#070914\", 110); const heroIn = container(elements, \"Orbit hero inner\", hero.id, { align: \"center\", gap: 28 });\n elements.push(motion(el(\"Text\", \"Orbit eyebrow\", { widthMode: \"auto\", heightMode: \"auto\", color: \"#9e8cff\", fontSize: 11, fontWeight: \"800\", letterSpacing: 2, textTransform: \"uppercase\" }, eyebrow, heroIn.id)));\n const heading = motion(el(\"Heading\", \"Orbit heading\", { widthMode: \"fill\", heightMode: \"auto\", color: \"#f5f7ff\", fontSize: 80, fontWeight: \"600\", lineHeight: .95, letterSpacing: -5, textAlign: \"center\" }, titleText, heroIn.id), 70); heading.overrides = { tablet: { fontSize: 62 }, mobile: { fontSize: 44, letterSpacing: -2.5 } }; elements.push(heading);\n elements.push(motion(el(\"Text\", \"Orbit copy\", { widthMode: \"fixed\", w: 620, heightMode: \"auto\", color: \"#9298b3\", fontSize: 17, lineHeight: 1.7, textAlign: \"center\" }, copy, heroIn.id), 140));\n const visual = motion(el(\"Frame\", \"Product interface\", { widthMode: \"fill\", heightMode: \"fixed\", h: 520, bg: \"#101426\", gradient: \"radial-gradient(circle at 50% 0%,rgba(115,87,255,.42),transparent 46%),linear-gradient(145deg,#11162b,#090b16)\", borderW: 1, borderC: \"#282e4d\", radius: 24, shadow: \"0 60px 140px rgba(0,0,0,.48)\", overflow: \"hidden\" }, undefined, heroIn.id), 210); visual.overrides = { mobile: { h: 330 } }; elements.push(visual);\n const metrics = section(elements, \"Product metrics\", \"#0d1020\", 80); const grid = container(elements, \"Metrics grid\", metrics.id, { direction: \"row\", gap: 16 });\n [[\"32%\", \"faster launches\"], [\"4.8\u00D7\", \"team velocity\"], [\"99.99%\", \"platform uptime\"]].forEach(([value, label], index) => { const card = motion(el(\"Container\", `Metric ${index + 1}`, { widthMode: \"fill\", heightMode: \"auto\", layout: \"stack\", direction: \"column\", gap: 9, bg: \"#14182b\", borderW: 1, borderC: \"#272c47\", radius: 18, padT: 28, padR: 28, padB: 28, padL: 28 }, undefined, grid.id), index * 80); elements.push(card, el(\"Heading\", \"Metric value\", { widthMode: \"fill\", heightMode: \"auto\", color: \"#f5f7ff\", fontSize: 36, fontWeight: \"700\" }, value, card.id), el(\"Text\", \"Metric label\", { widthMode: \"fill\", heightMode: \"auto\", color: \"#858ca7\", fontSize: 13 }, label, card.id)); });\n return { name, slug, elements, rootStyle: root(\"#070914\", \"#f5f7ff\", \"#7357ff\"), dataSources: [] };\n };\n return [\n build(\"Home\", \"home\", \"The adaptive product platform\", \"SHIP THE NEXT\\nVERSION OF YOU.\", \"Orbit gives product teams one composable workspace for planning, building and learning\u2014without the operational drag.\"),\n build(\"Product\", \"product\", \"One system, every workflow\", \"FROM SIGNAL\\nTO SHIPPED.\", \"Connect research, decisions, design and delivery in a system that keeps context alive from first insight to final release.\"),\n build(\"Pricing\", \"pricing\", \"Simple by design\", \"PRICING THAT\\nSCALES CALMLY.\", \"Start with the essentials, then expand across teams without surprise platform fees or a maze of artificial limits.\"),\n ];\n}\n\nexport function createSiteTemplate(id: SiteTemplateId): SiteTemplatePage[] {\n if (id === \"nocturne\") return createNocturneSiteTemplate();\n if (id === \"editorial-blog\") return createEditorialBlogTemplate();\n return createOrbitTemplate();\n}\n", "import { createOpenRouter } from \"@openrouter/ai-sdk-provider\";\nimport { generateText, Output } from \"ai\";\nimport { z } from \"zod\";\nimport { ELEMENT_TYPES } from \"@/lib/editor/types\";\n\nexport const maxDuration = 120;\n\nconst styleSchema = z\n .object({\n x: z.number().optional(), y: z.number().optional(), constraintX: z.enum([\"start\", \"center\", \"end\", \"stretch\"]).optional(), constraintY: z.enum([\"start\", \"center\", \"end\", \"stretch\"]).optional(), w: z.number().positive().optional(), h: z.number().positive().optional(),\n widthMode: z.enum([\"fixed\", \"fill\", \"auto\"]).optional(), heightMode: z.enum([\"fixed\", \"fill\", \"auto\"]).optional(),\n layout: z.enum([\"absolute\", \"stack\"]).optional(), direction: z.enum([\"row\", \"column\"]).optional(),\n gap: z.number().nonnegative().optional(), padT: z.number().nonnegative().optional(), padR: z.number().nonnegative().optional(), padB: z.number().nonnegative().optional(), padL: z.number().nonnegative().optional(),\n justify: z.enum([\"start\", \"center\", \"end\", \"between\"]).optional(), align: z.enum([\"start\", \"center\", \"end\", \"stretch\"]).optional(), wrap: z.boolean().optional(), columns: z.number().int().min(1).max(12).optional(),\n bg: z.string().optional(), gradient: z.string().optional(), color: z.string().optional(), radius: z.number().nonnegative().optional(), opacity: z.number().min(0).max(100).optional(),\n borderW: z.number().nonnegative().optional(), borderC: z.string().optional(), borderStyle: z.enum([\"solid\", \"dashed\", \"dotted\"]).optional(), shadow: z.string().optional(), rotate: z.number().optional(),\n fontSize: z.number().positive().optional(), fontWeight: z.string().optional(), lineHeight: z.number().positive().optional(), letterSpacing: z.number().optional(), textAlign: z.enum([\"left\", \"center\", \"right\", \"justify\"]).optional(), textTransform: z.enum([\"none\", \"uppercase\", \"lowercase\", \"capitalize\"]).optional(),\n overflow: z.enum([\"visible\", \"hidden\", \"auto\", \"scroll\"]).optional(), position: z.enum([\"static\", \"sticky\"]).optional(), stickyOffset: z.number().optional(),\n bgImage: z.string().optional(), bgSize: z.enum([\"cover\", \"contain\", \"auto\"]).optional(), bgPosition: z.string().optional(), backdropBlur: z.number().nonnegative().optional(), blur: z.number().nonnegative().optional(), scale: z.number().min(1).max(500).optional().describe(\"Percentage scale: 100 is normal, 102 is two percent larger\"), aspectRatio: z.string().optional(),\n entrance: z.enum([\"none\", \"fade\", \"up\", \"down\", \"left\", \"right\", \"zoom\"]).optional(), entranceDuration: z.number().nonnegative().optional(), entranceDelay: z.number().nonnegative().optional(), entranceCurve: z.enum([\"ease\", \"spring\"]).optional(), entranceBezier: z.string().optional(), springStiffness: z.number().positive().optional(), springDamping: z.number().positive().optional(), cursor: z.enum([\"auto\", \"default\", \"pointer\", \"text\", \"grab\", \"zoom-in\", \"none\"]).optional(), hidden: z.boolean().optional(),\n })\n .strict();\nconst bindingsSchema = z.record(z.string(), z.string().max(60)).optional();\nconst interactionSchema = z.object({ trigger: z.literal(\"click\"), action: z.enum([\"navigate\", \"scroll-to\", \"toggle-layer\", \"show-layer\", \"hide-layer\"]), value: z.string().max(2000), target: z.enum([\"_self\", \"_blank\"]).optional() }).optional();\nconst loopSchema = z.object({ type: z.enum([\"pulse\", \"float\", \"spin\"]), duration: z.number().min(100).max(20000) }).optional();\n\nconst planSchema = z.object({\n message: z.string().max(600),\n steps: z.array(z.string().max(180)).min(1).max(6),\n operations: z.array(\n z.discriminatedUnion(\"kind\", [\n z.object({ kind: z.literal(\"add\"), ref: z.string().min(1).max(60), type: z.enum(ELEMENT_TYPES), parentId: z.string().nullable().optional(), content: z.string().max(5000).optional(), src: z.string().max(2000).optional(), href: z.string().max(2000).optional(), style: styleSchema.optional(), tabletStyle: styleSchema.optional(), mobileStyle: styleSchema.optional(), hoverStyle: styleSchema.optional(), pressStyle: styleSchema.optional(), loop: loopSchema, draggable: z.boolean().optional(), styleBindings: bindingsSchema, interaction: interactionSchema }),\n z.object({ kind: z.literal(\"update\"), id: z.string(), content: z.string().max(5000).optional(), src: z.string().max(2000).optional(), href: z.string().max(2000).optional(), style: styleSchema.optional(), tabletStyle: styleSchema.optional(), mobileStyle: styleSchema.optional(), hoverStyle: styleSchema.optional(), pressStyle: styleSchema.optional(), loop: loopSchema, draggable: z.boolean().optional(), styleBindings: bindingsSchema, interaction: interactionSchema }),\n z.object({ kind: z.literal(\"remove\"), id: z.string() }),\n z.object({ kind: z.literal(\"page\"), style: z.object({ documentMode: z.enum([\"page\", \"component\"]).optional(), maxWidth: z.number().min(1).max(4000).optional(), canvasHeight: z.number().min(1).max(12000).optional(), fullWidth: z.boolean().optional(), bg: z.string().optional(), layout: z.enum([\"absolute\", \"stack\"]).optional(), direction: z.enum([\"row\", \"column\"]).optional(), gap: z.number().nonnegative().optional(), padT: z.number().nonnegative().optional(), padR: z.number().nonnegative().optional(), padB: z.number().nonnegative().optional(), padL: z.number().nonnegative().optional(), align: z.enum([\"start\", \"center\", \"end\", \"stretch\"]).optional(), fontFamily: z.string().optional(), variables: z.array(z.object({ id: z.string().max(60), name: z.string().max(60), type: z.enum([\"color\", \"number\"]), value: z.union([z.string(), z.number()]) })).max(24).optional() }).strict() }),\n ]),\n ).max(100),\n});\n\nconst blueprintSchema = z.object({\n intent: z.enum([\"conversation\", \"modify\", \"build-page\"]),\n direction: z.string().max(500),\n palette: z.object({\n background: z.string(),\n surface: z.string(),\n primary: z.string(),\n text: z.string(),\n muted: z.string(),\n border: z.string(),\n }),\n typography: z.object({\n heading: z.string(),\n body: z.string(),\n scale: z.array(z.number()).min(3).max(7),\n }),\n signature: z.object({\n visualMotif: z.string().max(240),\n heroComposition: z.string().max(320),\n motionRhythm: z.string().max(240),\n avoid: z.array(z.string().max(120)).min(3).max(8),\n }),\n sections: z.array(\n z.object({\n name: z.string(),\n purpose: z.string(),\n composition: z.string(),\n details: z.array(z.string()).min(2).max(8),\n }),\n ).max(12),\n});\n\nexport async function POST(request: Request) {\n const apiKey = process.env.OPENROUTER_API_KEY;\n if (!apiKey) return Response.json({ error: \"OPENROUTER_API_KEY is not configured.\" }, { status: 503 });\n\n try {\n const body = (await request.json()) as { prompt?: unknown; document?: unknown; breakpoint?: unknown; history?: unknown };\n if (typeof body.prompt !== \"string\" || !body.prompt.trim()) return Response.json({ error: \"Prompt is required.\" }, { status: 400 });\n\n const openrouter = createOpenRouter({ apiKey });\n const model = openrouter(\n process.env.OPENROUTER_MODEL ?? \"anthropic/claude-sonnet-4.5\",\n );\n const requestContext = {\n request: body.prompt.slice(0, 4000),\n activeBreakpoint: body.breakpoint,\n recentConversation: body.history,\n document: body.document,\n };\n\n const { output: blueprint } = await generateText({\n model,\n maxRetries: 2,\n maxOutputTokens: 5000,\n output: Output.object({ schema: blueprintSchema, name: \"pagiera_blueprint\" }),\n system: `You are an award-winning digital art director and UX architect. Plan before building.\nCreate a specific, contemporary visual direction\u2014not generic SaaS filler. Establish one exact palette, typography hierarchy, spacing rhythm and a section-by-section composition. The signature must name one repeatable visual motif, a concrete asymmetric hero composition, a motion rhythm and explicit clich\u00E9s to avoid.\nFor a full page, plan 5-8 substantial sections with meaningful visual variety: navigation, hero, proof, editorial or feature storytelling, metrics/testimonial, conversion CTA and footer. Each section needs layered details, not only a heading and paragraph.\nAvoid the default AI look: endless equal cards, centered text in every section, neon purple gradients, excessive pills, fake dashboard rectangles, glow on everything, and identical rounded boxes. Mix editorial whitespace with one or two dense moments. Each section must have a distinct silhouette while sharing the same system.\nUse the existing document intelligently. If the user asks a conversational question, set intent=conversation and keep sections empty. Preserve good existing work unless replacement was requested.\nTreat motion as part of the visual direction: define a restrained entrance rhythm, one shared easing character, and a clear focal moment. Animation must reinforce hierarchy rather than decorate every node.`,\n prompt: JSON.stringify(requestContext).slice(0, 60000),\n });\n\n const { output: draft } = await generateText({\n model,\n maxRetries: 2,\n maxOutputTokens: 24000,\n output: Output.object({ schema: planSchema, name: \"pagiera_design_plan\" }),\n system: `You are Pagiera's senior web designer. Turn the request into precise editor operations.\nUse only existing element IDs from the document for update/remove/parentId. For newly added parents, reference their ref in later parentId fields.\nBuild polished, production-ready layouts with strong hierarchy, spacing, responsive-friendly fill/auto sizing, accessible contrast, and concise real copy. Follow approvedBlueprint.signature literally so the result has an identifiable art direction.\nCompose complete pages from recognizable sections: Navbar, Hero, social proof, feature grid, CTA and Footer. A Navbar is a row Section with justify=between and align=center; a Footer is a spacious Section with grouped link Containers. Do not output a random pile of Text and Button nodes.\nSections and containers should normally use stack layout. Prefer full-width Sections, auto heights and nested Containers. Put siblings in a stack parent rather than positioning them manually.\nUse Frame for bounded visual compositions, Stack for row/column groups, and Grid for repeated cards. For full page builds create page variables for the exact palette and core spacing values, then bind repeated style properties with styleBindings. IDs in styleBindings must match those page variables.\nAlignment rules are strict: justify controls the parent's main axis; align controls its cross axis. To center a column vertically and horizontally use justify=center and align=center. A child with widthMode=fill cannot visibly center on the cross axis, so use fixed/auto for centered content and fill only when it should stretch. Use textAlign=center for centered copy.\nBefore operations, provide 2-6 short implementation steps in the steps field.\nCreate one coherent design system per page: choose exactly one page background, one surface color, one primary accent, one main text color and one muted text color. Reuse those exact values throughout all operations. Do not introduce unrelated colors section by section. Use at most one subtle gradient and only when it supports the chosen palette.\nUse consistent spacing (8/12/16/24/32/48/64/96), restrained radii, modern typography, generous whitespace, and no placeholder copy. Never invent unsupported element types.\nImplement every blueprint section with enough nested elements to make it visually complete. Full-page builds should normally contain 22-55 purposeful operations. Quality, composition and hierarchy matter more than node count. Add responsive tabletStyle/mobileStyle for structural, spacing and typography changes.\nDo not make every section a centered column or every feature an equal card. Use at least three composition patterns across a full page: asymmetric split, editorial text/media, structured grid, horizontal proof strip, oversized statement or layered visual frame. Keep readable content inside a consistent inner Container while Section backgrounds may fill the viewport.\nHeadings should use a deliberate type scale and tight line height; body copy should stay readable and constrained. Buttons must size to content unless intentionally full width on mobile. Never use fixed heights for text-heavy sections.\nCreate Framer-quality motion choreography. Stagger related entranceDelay values by 60-120ms, reuse a coherent entranceBezier, and choose spring only for expressive focal elements. Add restrained hoverStyle to interactive buttons/cards and pressStyle to primary controls. At most one subtle ornamental element may use a pulse, float, or spin loop. Enable draggable only when it has an intentional product interaction. Never animate every element or mix unrelated easing styles.\nScale values are percentages: 100 is the resting size, a subtle hover is 101-103, and a press is 97-99. Never output CSS multipliers such as 1.02 or 0.98.\nUse custom font families already registered in document.rootStyle.customFonts by their exact names when they suit the direction. Never invent a font URL or an unregistered custom family; otherwise use the document's existing font stack.\nUse interaction for real navigation buttons and scroll-to navigation items. Build reusable visual patterns consistently so they can later become component masters and variants.\nResponsive navbars should create the hidden mobile menu layer before the menu trigger, then set the trigger interaction to toggle-layer using that earlier ref. Use show-layer/hide-layer for overlays and close buttons. Tablet/mobile layouts must reorganize rather than merely shrink.\nIf the request is conversational or needs no visual change, return no operations and answer in message. Do not remove existing work unless explicitly asked.`,\n prompt: JSON.stringify({ ...requestContext, approvedBlueprint: blueprint }).slice(0, 90000),\n });\n\n if (!draft) throw new Error(\"The model returned an empty design plan.\");\n\n let finalPlan = draft;\n if (blueprint.intent === \"build-page\" && draft.operations.length > 0) {\n try {\n const { output: polished } = await generateText({\n model,\n maxRetries: 1,\n maxOutputTokens: 26000,\n output: Output.object({ schema: planSchema, name: \"pagiera_polished_design_plan\" }),\n system: `You are the final design director and implementation reviewer for Pagiera. Return a complete replacement plan, not commentary.\nAudit the draft ruthlessly, then rewrite its operations into a refined, buildable landing page. Preserve the user's intent and approved palette, but remove generic AI aesthetics.\n\nQUALITY GATE:\n- Every add parentId must reference an existing document ID or an earlier add ref. Parents always precede children.\n- Page uses stack/column flow. Full-width Sections contain bounded inner Containers. Text-heavy sections use auto height.\n- Desktop composition feels art-directed, not templated. Use varied silhouettes and asymmetric hierarchy without random absolute positioning.\n- Tablet and mobile overrides prevent overflow, collapse rows/grids, reduce padding and maintain readable type. Mobile must never be a scaled-down desktop screenshot.\n- Use one exact color system, one radius language and one shadow language. Remove gratuitous gradients, glass, glow, pills and borders.\n- Motion is a coherent sequence: restrained staggered entrances, meaningful hover/press feedback, no more than one ambient loop.\n- Copy is specific and credible. Remove placeholder metrics, lorem ipsum and repetitive labels.\n- Keep 22-55 purposeful operations when building a full page. Do not lose required sections while simplifying.\n\nReturn only the corrected plan matching the schema. Its message should briefly describe the finished visual direction and its steps should describe what was actually built.`,\n prompt: JSON.stringify({ requestContext, approvedBlueprint: blueprint, draftPlan: draft }).slice(0, 115000),\n });\n if (polished?.operations.length) finalPlan = polished;\n } catch (polishError) {\n console.warn(\"AI polish pass failed; returning valid draft\", polishError);\n }\n }\n\n return Response.json(finalPlan);\n } catch (reason) {\n const rawMessage = reason instanceof Error ? reason.message : \"Unknown AI provider error\";\n console.error(\"AI design request failed\", reason);\n const truncated = /unexpected end|unterminated|parse|json|no object generated|length|token/i.test(rawMessage);\n return Response.json(\n {\n error: truncated\n ? \"AI yan\u0131t\u0131 tamamlanmadan kesildi. \u0130stek otomatik olarak korunuyor; tekrar deneyebilir veya daha k\u00FC\u00E7\u00FCk bir b\u00F6l\u00FCm isteyebilirsin.\"\n : `AI tasar\u0131m\u0131 olu\u015Fturulamad\u0131: ${rawMessage.slice(0, 240)}`,\n code: truncated ? \"INCOMPLETE_AI_RESPONSE\" : \"AI_PROVIDER_ERROR\",\n },\n { status: truncated ? 422 : 502 },\n );\n }\n}\n", "import { DataSourceError, type LoadOptions, loadSource } from \"@/lib/data/source\";\nimport type { CanvasElement, DataSource } from \"@/lib/editor/types\";\nimport type { PageData } from \"./bind\";\n\n/** Signals that a source elected to turn its upstream 404 into a page 404. */\nexport class PageDataNotFoundError extends Error {\n constructor(public readonly sourceId: string) {\n super(`Data source ${sourceId} returned 404.`);\n this.name = \"PageDataNotFoundError\";\n }\n}\n\n/**\n * Fetches every source a page actually uses. Sources nothing references are\n * skipped, and a source that fails yields no rows rather than failing the\n * whole page \u2014 a broken API should not take the site down.\n */\nexport async function loadPageData(\n elements: CanvasElement[],\n sources: DataSource[],\n options?: LoadOptions,\n): Promise<PageData> {\n const used = new Set(\n elements\n .filter((el) => el.sourceId)\n .map((el) => el.sourceId as string),\n );\n const wanted = sources.filter((source) => used.has(source.id) && source.url);\n if (wanted.length === 0) return {};\n\n const results = await Promise.all(\n wanted.map(async (source) => {\n try {\n const { rows } = await loadSource(source, options);\n return [source.id, rows] as const;\n } catch (error) {\n if (\n error instanceof DataSourceError &&\n error.status === 404 &&\n source.onNotFound === \"page-404\"\n ) {\n throw new PageDataNotFoundError(source.id);\n }\n console.warn(\n `Data source \"${source.name}\" failed:`,\n error instanceof DataSourceError ? error.message : error,\n );\n return [source.id, []] as const;\n }\n }),\n );\n\n return Object.fromEntries(results);\n}\n", "import { Pool } from \"pg\";\nimport { createClient, type RedisClientType } from \"redis\";\nimport manropeDataUrl from \"./manrope-data.js\";\n\nexport type PagieraServerConfig = {\n postgresUrl: string;\n redisUrl: string;\n openRouterApiKey: string;\n openRouterModel: string;\n basePath?: string;\n aiRateLimitPerMinute?: number;\n};\n\nconst SCHEMA_SQL = `\nCREATE TABLE IF NOT EXISTS sites (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(), name text NOT NULL, slug text NOT NULL UNIQUE,\n created_at timestamptz NOT NULL DEFAULT now(), updated_at timestamptz NOT NULL DEFAULT now()\n);\nCREATE TABLE IF NOT EXISTS pages (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(), site_id uuid NOT NULL REFERENCES sites(id) ON DELETE CASCADE,\n name text NOT NULL, slug text NOT NULL, elements jsonb NOT NULL DEFAULT '[]', root_style jsonb NOT NULL DEFAULT '{}',\n data_sources jsonb NOT NULL DEFAULT '[]', version integer NOT NULL DEFAULT 1,\n published_elements jsonb, published_root_style jsonb, published_data_sources jsonb, published_at timestamptz,\n created_at timestamptz NOT NULL DEFAULT now(), updated_at timestamptz NOT NULL DEFAULT now(), UNIQUE(site_id, slug)\n);\nCREATE INDEX IF NOT EXISTS pages_site_id_idx ON pages(site_id);\nCREATE TABLE IF NOT EXISTS page_revisions (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(), page_id uuid NOT NULL REFERENCES pages(id) ON DELETE CASCADE,\n version integer NOT NULL, elements jsonb NOT NULL, root_style jsonb, created_at timestamptz NOT NULL DEFAULT now()\n);\nCREATE INDEX IF NOT EXISTS page_revisions_page_id_created_at_idx ON page_revisions(page_id, created_at);\n`;\n\nfunction required(name: string, value: string) {\n if (!value?.trim()) throw new Error(`Pagiera config is missing ${name}.`);\n}\n\nexport async function createPagieraServer(config: PagieraServerConfig) {\n required(\"postgresUrl\", config.postgresUrl);\n required(\"redisUrl\", config.redisUrl);\n required(\"openRouterApiKey\", config.openRouterApiKey);\n required(\"openRouterModel\", config.openRouterModel);\n\n process.env.DATABASE_URL = config.postgresUrl;\n process.env.OPENROUTER_API_KEY = config.openRouterApiKey;\n process.env.OPENROUTER_MODEL = config.openRouterModel;\n\n const pool = new Pool({ connectionString: config.postgresUrl, max: 10, idleTimeoutMillis: 30_000 });\n await pool.query(SCHEMA_SQL);\n const redis = createClient({ url: config.redisUrl }) as RedisClientType;\n redis.on(\"error\", (error) => console.error(\"Pagiera Redis error\", error));\n await redis.connect();\n\n const pages = await import(\"@/lib/pages\");\n const validation = await import(\"@/lib/editor/validate\");\n const sourceRuntime = await import(\"@/lib/data/source\");\n const templates = await import(\"@/lib/editor/site-templates\");\n const ai = await import(\"@/app/api/ai-design/route\");\n const renderData = await import(\"@/lib/render/load-data\");\n const basePath = (config.basePath ?? \"/api/pagiera\").replace(/\\/$/, \"\");\n\n const invalidate = async () => {\n const keys = await redis.keys(\"pagiera:published:*\");\n if (keys.length) await redis.del(keys);\n };\n const bodyOf = async (request: Request) => request.json().catch(() => ({})) as Promise<Record<string, any>>;\n const ok = (value: unknown, status = 200) => Response.json(value, { status });\n const fail = (error: unknown, status = 400) => ok({ error: error instanceof Error ? error.message : String(error) }, status);\n\n function matchPagePath(pattern: string, pathname: string) {\n const patternParts = pattern.split(\"/\").filter(Boolean);\n const pathParts = pathname.split(\"/\").filter(Boolean);\n if (patternParts.length !== pathParts.length) return undefined;\n const params: Record<string, string> = {};\n for (let index = 0; index < patternParts.length; index += 1) {\n const part = patternParts[index];\n const value = pathParts[index];\n if (part.startsWith(\":\")) params[part.slice(1)] = value;\n else if (part !== value) return undefined;\n }\n return params;\n }\n\n async function resolvePublishedPath(pathname: string) {\n const normalized = pathname.replace(/^\\/+|\\/+$/g, \"\") || \"home\";\n const exact = await pages.getPublishedPage(normalized);\n if (exact) return { page: exact, pattern: normalized, params: {} as Record<string, string> };\n const patterns = (await pages.listPublishedSlugs())\n .map((entry: { slug: string }) => entry.slug)\n .filter((slug: string) => slug.includes(\":\"))\n .sort((left: string, right: string) => {\n const staticDifference = right.split(\"/\").filter((part) => !part.startsWith(\":\")).length - left.split(\"/\").filter((part) => !part.startsWith(\":\")).length;\n return staticDifference || right.length - left.length;\n });\n for (const pattern of patterns) {\n const params = matchPagePath(pattern, normalized);\n if (!params) continue;\n const page = await pages.getPublishedPage(pattern);\n if (page) return { page, pattern, params };\n }\n return undefined;\n }\n\n async function getPublishedDocument(slug: string) {\n const normalized = slug.replace(/^\\/+|\\/+$/g, \"\") || \"home\";\n const key = `pagiera:published:${normalized}`;\n const cached = await redis.get(key);\n if (cached) return JSON.parse(cached);\n const resolved = await resolvePublishedPath(normalized);\n if (!resolved) return undefined;\n const document = { ...resolved.page, routePattern: resolved.pattern, routeParams: resolved.params };\n await redis.set(key, JSON.stringify(document), { EX: 60 });\n return document;\n }\n\n async function getPublishedPage(slug: string, context?: Record<string, unknown>) {\n const page = await getPublishedDocument(slug);\n if (!page) return undefined;\n let data;\n try {\n data = await renderData.loadPageData(page.elements, page.dataSources ?? [], {\n context: {\n query: {},\n page: { slug: page.routePattern ?? slug },\n ...(context ?? {}),\n params: { ...(page.routeParams ?? {}), ...((context as any)?.params ?? {}) },\n },\n });\n } catch (error) {\n if (error instanceof renderData.PageDataNotFoundError) return undefined;\n throw error;\n }\n return { ...page, data };\n }\n\n async function getEditorBootstrap(pageId?: string) {\n // Also repairs projects created before Home became mandatory.\n const home = await pages.getOrCreateDefaultPage();\n const page = pageId ? await pages.getPage(pageId) : home;\n if (!page) return undefined;\n return { page, pages: await pages.listPages(), library: await pages.listPageDocuments() };\n }\n\n async function getPreviewPage(pageId: string, context?: Record<string, unknown>) {\n const page = await pages.getPage(pageId);\n if (!page) return undefined;\n let data;\n try {\n data = await renderData.loadPageData(page.elements, page.dataSources ?? [], {\n context: { query: {}, params: {}, page: { slug: page.slug }, ...(context ?? {}) },\n revalidate: false,\n });\n } catch (error) {\n if (error instanceof renderData.PageDataNotFoundError) return undefined;\n throw error;\n }\n return { ...page, data };\n }\n\n async function handle(request: Request): Promise<Response> {\n try {\n const url = new URL(request.url);\n const path = url.pathname.startsWith(basePath) ? url.pathname.slice(basePath.length) || \"/\" : url.pathname;\n const parts = path.split(\"/\").filter(Boolean);\n\n if (request.method === \"GET\" && path === \"/health\") {\n await pool.query(\"SELECT 1\");\n return ok({ status: \"ok\", postgres: true, redis: (await redis.ping()) === \"PONG\", model: config.openRouterModel });\n }\n if (request.method === \"GET\" && path === \"/assets/manrope-variable.woff2\") {\n const encoded = manropeDataUrl.slice(manropeDataUrl.indexOf(\",\") + 1);\n return new Response(Buffer.from(encoded, \"base64\"), {\n headers: {\n \"Content-Type\": \"font/woff2\",\n \"Cache-Control\": \"public, max-age=31536000, immutable\",\n \"Access-Control-Allow-Origin\": \"*\",\n },\n });\n }\n if (request.method === \"GET\" && path === \"/bootstrap\") {\n const bootstrap = await getEditorBootstrap(url.searchParams.get(\"pageId\") ?? undefined);\n return bootstrap ? ok(bootstrap) : fail(\"Page not found\", 404);\n }\n if (request.method === \"GET\" && parts[0] === \"published\" && parts[1]) {\n const page = await getPublishedDocument(parts.slice(1).join(\"/\"));\n if (!page) return fail(\"Published page not found\", 404);\n return ok(page);\n }\n if (request.method === \"GET\" && parts[0] === \"pages\" && parts[1]) {\n const page = await pages.getPage(parts[1]);\n return page ? ok(page) : fail(\"Page not found\", 404);\n }\n if (request.method === \"POST\" && path === \"/pages\") {\n const body = await bodyOf(request); const name = validation.parseName(body.name); const slug = validation.parseSlug(body.slug ?? body.name);\n if (!name || !slug) return fail(\"A valid name and slug are required.\");\n const pageId = await pages.createPage(name, slug); return pageId ? ok({ status: \"ok\", pageId }, 201) : fail(\"Slug already exists\", 409);\n }\n if (parts[0] === \"pages\" && parts[1] && request.method === \"PATCH\" && parts.length === 2) {\n const body = await bodyOf(request); const name = validation.parseName(body.name); const slug = validation.parseSlug(body.slug);\n if (!name || !slug) return fail(\"A valid name and slug are required.\");\n const current = await pages.getPage(parts[1]);\n if (current?.slug === \"home\" && slug !== \"home\") return fail(\"The home page path is required and cannot be changed.\", 409);\n const pageId = await pages.renamePage(parts[1], name, slug); await invalidate(); return pageId ? ok({ status: \"ok\", pageId }) : fail(\"Page not found\", 404);\n }\n if (parts[0] === \"pages\" && parts[1] && request.method === \"DELETE\") {\n const result = await pages.deletePage(parts[1]); await invalidate();\n return result.deleted\n ? ok({ status: \"ok\", pageId: result.fallbackId })\n : fail(result.reason === \"home-required\" ? \"The home page is required and cannot be deleted.\" : \"The final page cannot be deleted\", 409);\n }\n if (parts[0] === \"pages\" && parts[1] && parts[2] === \"save\" && request.method === \"POST\") {\n const body = await bodyOf(request); const document = body.document ?? {};\n return ok(await pages.savePageDocument(parts[1], validation.parseElements(document.elements), validation.parseRootStyle(document.rootStyle), validation.parseDataSources(document.dataSources), Number(body.expectedVersion)));\n }\n if (parts[0] === \"pages\" && parts[1] && parts[2] === \"duplicate\" && request.method === \"POST\") {\n const body = await bodyOf(request); const name = validation.parseName(body.name); const slug = validation.parseSlug(body.slug);\n if (!name || !slug) return fail(\"A valid name and slug are required.\");\n const pageId = await pages.duplicatePage(parts[1], name, slug); return pageId ? ok({ status: \"ok\", pageId }, 201) : fail(\"Could not duplicate page\", 409);\n }\n if (parts[0] === \"pages\" && parts[1] && parts[2] === \"publish\" && request.method === \"POST\") {\n const published = await pages.publishPage(parts[1]); await invalidate(); return published ? ok({ status: \"ok\", slug: published.slug }) : fail(\"Page not found\", 404);\n }\n if (parts[0] === \"pages\" && parts[1] && parts[2] === \"unpublish\" && request.method === \"POST\") {\n await pages.unpublishPage(parts[1]); await invalidate(); return ok({ status: \"ok\" });\n }\n if (parts[0] === \"templates\" && parts[1] && request.method === \"POST\") {\n if (![\"nocturne\", \"editorial-blog\", \"orbit-saas\"].includes(parts[1])) return fail(\"Unknown template\", 404);\n const pageId = await pages.installTemplatePages(templates.createSiteTemplate(parts[1] as \"nocturne\" | \"editorial-blog\" | \"orbit-saas\"));\n await invalidate();\n return ok({ status: \"ok\", pageId });\n }\n if (path === \"/data/preview\" && request.method === \"POST\") {\n const body = await bodyOf(request); const [source] = validation.parseDataSources([body.source]);\n if (!source) return fail(\"Invalid source.\");\n const query = Object.fromEntries(new URLSearchParams(typeof body.sampleQuery === \"string\" ? body.sampleQuery.slice(0, 500) : \"\"));\n const result = await sourceRuntime.loadSource(source, { context: { query, params: {}, page: { slug: \"preview\" } }, revalidate: false });\n return ok({ status: \"ok\", ...result, total: result.rows.length });\n }\n if (path === \"/ai\" && request.method === \"POST\") {\n const ip = request.headers.get(\"x-forwarded-for\")?.split(\",\")[0]?.trim() || \"local\";\n const rateKey = `pagiera:ai-rate:${ip}:${Math.floor(Date.now() / 60_000)}`;\n const count = await redis.incr(rateKey); if (count === 1) await redis.expire(rateKey, 70);\n if (count > (config.aiRateLimitPerMinute ?? 10)) return fail(\"AI rate limit exceeded.\", 429);\n return ai.POST(request);\n }\n return fail(\"Pagiera API route not found\", 404);\n } catch (error) {\n console.error(\"Pagiera API error\", error);\n return fail(error, 500);\n }\n }\n\n return { handle, getEditorBootstrap, getPreviewPage, getPublishedDocument, getPublishedPage, close: async () => { await redis.quit(); await pool.end(); }, redis, pool };\n}\n\nexport function pagieraConfigFromEnv(env: NodeJS.ProcessEnv = process.env): PagieraServerConfig {\n return {\n postgresUrl: env.PAGIERA_POSTGRES_URL ?? env.DATABASE_URL ?? \"\",\n redisUrl: env.PAGIERA_REDIS_URL ?? env.REDIS_URL ?? \"\",\n openRouterApiKey: env.OPENROUTER_API_KEY ?? \"\",\n openRouterModel: env.OPENROUTER_MODEL ?? \"\",\n };\n}\n\n/** Framework adapter for a Next.js catch-all Route Handler. Initialization is lazy and shared. */\nexport function createPagieraRouteHandlers(config: PagieraServerConfig) {\n let server: ReturnType<typeof createPagieraServer> | undefined;\n const handle = async (request: Request) => {\n try {\n return await (await (server ??= getPagieraServer(config))).handle(request);\n } catch (error) {\n server = undefined;\n return Response.json(\n { error: error instanceof Error ? error.message : \"Pagiera server could not start.\" },\n { status: 503 },\n );\n }\n };\n return { GET: handle, POST: handle, PUT: handle, PATCH: handle, DELETE: handle };\n}\n\nconst globalServers = globalThis as typeof globalThis & { __pagieraServers?: Map<string, ReturnType<typeof createPagieraServer>> };\nconst SERVER_RUNTIME_REVISION = 4;\n\n/** Reuses pools and Redis connections across API routes, SSR and development reloads. */\nexport function getPagieraServer(config: PagieraServerConfig) {\n // Include the runtime shape so a Turbopack hot reload cannot hand a newer\n // package an older server object that is missing recently added methods.\n const key = `${SERVER_RUNTIME_REVISION}\\n${config.postgresUrl}\\n${config.redisUrl}\\n${config.openRouterModel}`;\n const servers = globalServers.__pagieraServers ??= new Map();\n let server = servers.get(key);\n if (!server) {\n server = createPagieraServer(config);\n servers.set(key, server);\n server.catch(() => servers.delete(key));\n }\n return server;\n}\n", "const manropeDataUrl = \"data:font/woff2;base64,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\";\nexport default manropeDataUrl;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["el", "text", "section", "container", "index", "root", "index", "el", "Pool", "pool", "Pool", "pages", "index", "getPublishedPage"]
|
|
7
|
+
}
|