@frontlit/page-builder 0.1.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +97 -0
  3. package/dist/alignment-dZDzN96G.d.ts +5 -0
  4. package/dist/blocks/index.d.ts +255 -0
  5. package/dist/blocks/index.js +6 -0
  6. package/dist/blocks/index.js.map +1 -0
  7. package/dist/builder/index.d.ts +240 -0
  8. package/dist/builder/index.js +8 -0
  9. package/dist/builder/index.js.map +1 -0
  10. package/dist/button-C3VrMJkr.d.ts +20 -0
  11. package/dist/chunk-7KIX4WAO.js +4229 -0
  12. package/dist/chunk-7KIX4WAO.js.map +1 -0
  13. package/dist/chunk-7W6Q4WA7.js +515 -0
  14. package/dist/chunk-7W6Q4WA7.js.map +1 -0
  15. package/dist/chunk-GTY75HW2.js +22 -0
  16. package/dist/chunk-GTY75HW2.js.map +1 -0
  17. package/dist/chunk-MO76KZY2.js +3580 -0
  18. package/dist/chunk-MO76KZY2.js.map +1 -0
  19. package/dist/chunk-RBJBODQP.js +2011 -0
  20. package/dist/chunk-RBJBODQP.js.map +1 -0
  21. package/dist/chunk-RUYOL7JZ.js +4 -0
  22. package/dist/chunk-RUYOL7JZ.js.map +1 -0
  23. package/dist/chunk-SSQWYMQR.js +393 -0
  24. package/dist/chunk-SSQWYMQR.js.map +1 -0
  25. package/dist/color-mode-DIEEt9WP.d.ts +3 -0
  26. package/dist/components/index.d.ts +36 -0
  27. package/dist/components/index.js +5 -0
  28. package/dist/components/index.js.map +1 -0
  29. package/dist/data-slots.d.ts +25 -0
  30. package/dist/data-slots.js +3 -0
  31. package/dist/data-slots.js.map +1 -0
  32. package/dist/fonts/alegreya/alegreya-latin-variable.woff2 +0 -0
  33. package/dist/fonts/bebas-neue/bebas-neue-latin-400-normal.woff2 +0 -0
  34. package/dist/fonts/inter/inter-latin-variable.woff2 +0 -0
  35. package/dist/fonts/lato/lato-latin-100-normal.woff2 +0 -0
  36. package/dist/fonts/lato/lato-latin-300-normal.woff2 +0 -0
  37. package/dist/fonts/lato/lato-latin-400-normal.woff2 +0 -0
  38. package/dist/fonts/lato/lato-latin-700-normal.woff2 +0 -0
  39. package/dist/fonts/lato/lato-latin-900-normal.woff2 +0 -0
  40. package/dist/fonts/merriweather/merriweather-latin-variable.woff2 +0 -0
  41. package/dist/fonts/montserrat/montserrat-latin-100-normal.woff2 +0 -0
  42. package/dist/fonts/montserrat/montserrat-latin-200-normal.woff2 +0 -0
  43. package/dist/fonts/montserrat/montserrat-latin-300-normal.woff2 +0 -0
  44. package/dist/fonts/montserrat/montserrat-latin-400-normal.woff2 +0 -0
  45. package/dist/fonts/montserrat/montserrat-latin-500-normal.woff2 +0 -0
  46. package/dist/fonts/montserrat/montserrat-latin-600-normal.woff2 +0 -0
  47. package/dist/fonts/montserrat/montserrat-latin-700-normal.woff2 +0 -0
  48. package/dist/fonts/montserrat/montserrat-latin-800-normal.woff2 +0 -0
  49. package/dist/fonts/montserrat/montserrat-latin-900-normal.woff2 +0 -0
  50. package/dist/fonts/montserrat/montserrat-latin-variable.woff2 +0 -0
  51. package/dist/fonts/mulish/mulish-latin-variable.woff2 +0 -0
  52. package/dist/fonts/noto-sans/noto-sans-latin-variable.woff2 +0 -0
  53. package/dist/fonts/nunito/nunito-latin-variable.woff2 +0 -0
  54. package/dist/fonts/open-sans/open-sans-latin-variable.woff2 +0 -0
  55. package/dist/fonts/oswald/oswald-latin-variable.woff2 +0 -0
  56. package/dist/fonts/playfair-display/playfair-display-latin-variable.woff2 +0 -0
  57. package/dist/fonts/poppins/poppins-latin-100-normal.woff2 +0 -0
  58. package/dist/fonts/poppins/poppins-latin-200-normal.woff2 +0 -0
  59. package/dist/fonts/poppins/poppins-latin-300-normal.woff2 +0 -0
  60. package/dist/fonts/poppins/poppins-latin-400-normal.woff2 +0 -0
  61. package/dist/fonts/poppins/poppins-latin-500-normal.woff2 +0 -0
  62. package/dist/fonts/poppins/poppins-latin-600-normal.woff2 +0 -0
  63. package/dist/fonts/poppins/poppins-latin-700-normal.woff2 +0 -0
  64. package/dist/fonts/poppins/poppins-latin-800-normal.woff2 +0 -0
  65. package/dist/fonts/poppins/poppins-latin-900-normal.woff2 +0 -0
  66. package/dist/fonts/pt-sans/pt-sans-latin-400-normal.woff2 +0 -0
  67. package/dist/fonts/pt-sans/pt-sans-latin-700-normal.woff2 +0 -0
  68. package/dist/fonts/quicksand/quicksand-latin-variable.woff2 +0 -0
  69. package/dist/fonts/raleway/raleway-latin-variable.woff2 +0 -0
  70. package/dist/fonts/roboto/roboto-latin-variable.woff2 +0 -0
  71. package/dist/fonts/roboto-slab/roboto-slab-latin-variable.woff2 +0 -0
  72. package/dist/fonts/rubik/rubik-latin-variable.woff2 +0 -0
  73. package/dist/fonts/source-sans-3/source-sans-3-latin-400-normal.woff2 +0 -0
  74. package/dist/fonts/source-sans-3/source-sans-3-latin-variable.woff2 +0 -0
  75. package/dist/fonts/source-serif-4/source-serif-4-latin-variable.woff2 +0 -0
  76. package/dist/fonts/work-sans/work-sans-latin-variable.woff2 +0 -0
  77. package/dist/image-D7GlnOio.d.ts +30 -0
  78. package/dist/index.d.ts +59 -0
  79. package/dist/index.js +10 -0
  80. package/dist/index.js.map +1 -0
  81. package/dist/media-Njv378j7.d.ts +13 -0
  82. package/dist/models/index.d.ts +8 -0
  83. package/dist/models/index.js +4 -0
  84. package/dist/models/index.js.map +1 -0
  85. package/dist/nav-link-BfxvQ1s6.d.ts +37 -0
  86. package/dist/page-DfVl_aHX.d.ts +26 -0
  87. package/dist/primitives/index.d.ts +140 -0
  88. package/dist/primitives/index.js +4 -0
  89. package/dist/primitives/index.js.map +1 -0
  90. package/dist/renderer/index.d.ts +81 -0
  91. package/dist/renderer/index.js +7 -0
  92. package/dist/renderer/index.js.map +1 -0
  93. package/dist/section-background-BgOCp5l3.d.ts +50 -0
  94. package/dist/styles.css +15322 -0
  95. package/dist/theme-style-39nxXQy0.d.ts +141 -0
  96. package/dist/theme.css +242 -0
  97. package/dist/widget--uEOpdq3.d.ts +105 -0
  98. package/package.json +142 -0
@@ -0,0 +1,393 @@
1
+ "use client";
2
+ import { DataSlot, Embed, Marquee, MediaBlock, Grid, RichText, Footer, SupportForm, EmailForm, Banner, Pricing, Faq, Featured, Content, Hero, Header } from './chunk-7KIX4WAO.js';
3
+ import { PageBuilderLinkProvider } from './chunk-7W6Q4WA7.js';
4
+ import { cn } from './chunk-RBJBODQP.js';
5
+ import React, { useRef, useId, useEffect } from 'react';
6
+ import { Settings2, ArrowUp, ArrowDown, Plus, Trash2 } from 'lucide-react';
7
+ import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
8
+ import convert from 'color-convert';
9
+
10
+ // src/registry.ts
11
+ var blockRegistry = {
12
+ header: Header,
13
+ hero: Hero,
14
+ content: Content,
15
+ featured: Featured,
16
+ faq: Faq,
17
+ pricing: Pricing,
18
+ banner: Banner,
19
+ "email-form": EmailForm,
20
+ "support-form": SupportForm,
21
+ footer: Footer,
22
+ "rich-text": RichText,
23
+ grid: Grid,
24
+ media: MediaBlock,
25
+ marquee: Marquee,
26
+ embed: Embed,
27
+ "data-slot": DataSlot
28
+ };
29
+ var LAYOUT_BLOCK_NAMES = ["header", "footer"];
30
+ var NON_ADDABLE_BLOCK_NAMES = [...LAYOUT_BLOCK_NAMES, "data-slot"];
31
+ function registerBlock(widget) {
32
+ const name = widget.metadata.name.trim();
33
+ if (!name) {
34
+ throw new Error("A page-builder block must have a non-empty name.");
35
+ }
36
+ if (blockRegistry[name]) {
37
+ throw new Error(
38
+ `A page-builder block named "${name}" is already registered.`
39
+ );
40
+ }
41
+ if (NON_ADDABLE_BLOCK_NAMES.includes(name)) {
42
+ throw new Error(
43
+ `"${name}" is a reserved page-builder block name and cannot be registered by a host application.`
44
+ );
45
+ }
46
+ blockRegistry[name] = widget;
47
+ }
48
+ function getWidget(name) {
49
+ return blockRegistry[name];
50
+ }
51
+ function getAddableBlocks() {
52
+ return Object.values(blockRegistry).filter(
53
+ (widget) => !NON_ADDABLE_BLOCK_NAMES.includes(widget.metadata.name)
54
+ );
55
+ }
56
+ function ToolbarButton({
57
+ icon: Icon,
58
+ label,
59
+ onClick
60
+ }) {
61
+ if (!onClick) return null;
62
+ return /* @__PURE__ */ jsx(
63
+ "button",
64
+ {
65
+ type: "button",
66
+ title: label,
67
+ "aria-label": label,
68
+ className: "inline-flex h-7 w-7 items-center justify-center rounded bg-background text-foreground shadow-sm hover:bg-muted",
69
+ onClick: (e) => {
70
+ e.stopPropagation();
71
+ onClick();
72
+ },
73
+ children: /* @__PURE__ */ jsx(Icon, { className: "h-3.5 w-3.5" })
74
+ }
75
+ );
76
+ }
77
+ function DeleteButton({ onDelete }) {
78
+ const [confirming, setConfirming] = React.useState(false);
79
+ React.useEffect(() => {
80
+ if (!confirming) return;
81
+ const timeout = setTimeout(() => setConfirming(false), 3e3);
82
+ return () => clearTimeout(timeout);
83
+ }, [confirming]);
84
+ if (!onDelete) return null;
85
+ if (confirming) {
86
+ return /* @__PURE__ */ jsx(
87
+ "button",
88
+ {
89
+ type: "button",
90
+ title: "Confirm delete",
91
+ "aria-label": "Confirm delete",
92
+ className: "inline-flex h-7 items-center justify-center rounded bg-destructive px-2 text-xs font-medium text-destructive-foreground shadow-sm hover:bg-destructive/90",
93
+ onMouseLeave: () => setConfirming(false),
94
+ onClick: (e) => {
95
+ e.stopPropagation();
96
+ setConfirming(false);
97
+ onDelete();
98
+ },
99
+ children: "Sure?"
100
+ }
101
+ );
102
+ }
103
+ return /* @__PURE__ */ jsx(
104
+ "button",
105
+ {
106
+ type: "button",
107
+ title: "Delete",
108
+ "aria-label": "Delete",
109
+ className: "inline-flex h-7 w-7 items-center justify-center rounded bg-background text-foreground shadow-sm hover:bg-muted",
110
+ onClick: (e) => {
111
+ e.stopPropagation();
112
+ setConfirming(true);
113
+ },
114
+ children: /* @__PURE__ */ jsx(Trash2, { className: "h-3.5 w-3.5" })
115
+ }
116
+ );
117
+ }
118
+ function EditableBlock({
119
+ children,
120
+ editing,
121
+ containerRef,
122
+ selected,
123
+ highlighted,
124
+ label,
125
+ onSelect,
126
+ onMoveUp,
127
+ onMoveDown,
128
+ onDelete,
129
+ onAddBelow
130
+ }) {
131
+ if (!editing) {
132
+ return /* @__PURE__ */ jsx(Fragment, { children });
133
+ }
134
+ return /* @__PURE__ */ jsxs(
135
+ "div",
136
+ {
137
+ ref: containerRef,
138
+ className: cn(
139
+ "group/block relative outline outline-1 outline-transparent transition-colors hover:outline-primary/40",
140
+ selected && "outline-2 outline-primary",
141
+ highlighted && "outline-2 outline-primary/70"
142
+ ),
143
+ onClick: onSelect,
144
+ children: [
145
+ /* @__PURE__ */ jsx(
146
+ "div",
147
+ {
148
+ "aria-hidden": true,
149
+ className: cn(
150
+ "pointer-events-none absolute inset-0 z-10 bg-primary/10 opacity-0 transition-opacity duration-500",
151
+ highlighted && "opacity-100"
152
+ )
153
+ }
154
+ ),
155
+ /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-x-0 top-0 z-20 flex justify-center opacity-0 transition-opacity group-hover/block:opacity-100", children: /* @__PURE__ */ jsxs("div", { className: "pointer-events-auto flex items-center gap-1 rounded-b-md border border-t-0 border-border bg-background px-1.5 py-1 shadow-sm", children: [
156
+ label && /* @__PURE__ */ jsx("span", { className: "px-1.5 text-xs font-medium text-muted-foreground", children: label }),
157
+ /* @__PURE__ */ jsx(
158
+ ToolbarButton,
159
+ {
160
+ icon: Settings2,
161
+ label: "Edit settings",
162
+ onClick: onSelect
163
+ }
164
+ ),
165
+ /* @__PURE__ */ jsx(
166
+ ToolbarButton,
167
+ {
168
+ icon: ArrowUp,
169
+ label: "Move up",
170
+ onClick: onMoveUp
171
+ }
172
+ ),
173
+ /* @__PURE__ */ jsx(
174
+ ToolbarButton,
175
+ {
176
+ icon: ArrowDown,
177
+ label: "Move down",
178
+ onClick: onMoveDown
179
+ }
180
+ ),
181
+ /* @__PURE__ */ jsx(DeleteButton, { onDelete })
182
+ ] }) }),
183
+ children,
184
+ onAddBelow && /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-x-0 -bottom-3 z-20 flex justify-center opacity-0 transition-opacity group-hover/block:opacity-100", children: /* @__PURE__ */ jsx(
185
+ "button",
186
+ {
187
+ type: "button",
188
+ title: "Add block below",
189
+ "aria-label": "Add block below",
190
+ className: "pointer-events-auto inline-flex h-6 w-6 items-center justify-center rounded-full border border-border bg-background text-foreground shadow-sm hover:bg-primary hover:text-primary-foreground",
191
+ onClick: (e) => {
192
+ e.stopPropagation();
193
+ onAddBelow();
194
+ },
195
+ children: /* @__PURE__ */ jsx(Plus, { className: "h-3.5 w-3.5" })
196
+ }
197
+ ) })
198
+ ]
199
+ }
200
+ );
201
+ }
202
+ function formatHSL(hsl) {
203
+ return `${hsl[0]} ${hsl[1]}% ${hsl[2]}%`;
204
+ }
205
+ function cssColorFromHex(hex) {
206
+ if (!hex) return "";
207
+ try {
208
+ return `hsl(${formatHSL(convert.hex.hsl(hex.replace("#", "")))})`;
209
+ } catch {
210
+ return "";
211
+ }
212
+ }
213
+ function generateThemeStyles(theme, selector = ".pb-theme") {
214
+ const colors = theme?.theme?.colors;
215
+ if (!colors) {
216
+ return "";
217
+ }
218
+ const { light, dark } = colors;
219
+ if (!light || !dark) {
220
+ return "";
221
+ }
222
+ const block = (c) => `
223
+ --background: ${cssColorFromHex(c.background)};
224
+ --foreground: ${cssColorFromHex(c.foreground)};
225
+ --card: ${cssColorFromHex(c.card)};
226
+ --card-foreground: ${cssColorFromHex(c.cardForeground)};
227
+ --popover: ${cssColorFromHex(c.popover)};
228
+ --popover-foreground: ${cssColorFromHex(c.popoverForeground)};
229
+ --primary: ${cssColorFromHex(c.primary)};
230
+ --primary-foreground: ${cssColorFromHex(c.primaryForeground)};
231
+ --secondary: ${cssColorFromHex(c.secondary)};
232
+ --secondary-foreground: ${cssColorFromHex(c.secondaryForeground)};
233
+ --muted: ${cssColorFromHex(c.muted)};
234
+ --muted-foreground: ${cssColorFromHex(c.mutedForeground)};
235
+ --accent: ${cssColorFromHex(c.accent)};
236
+ --accent-foreground: ${cssColorFromHex(c.accentForeground)};
237
+ --destructive: ${cssColorFromHex(c.destructive)};
238
+ --border: ${cssColorFromHex(c.border)};
239
+ --input: ${cssColorFromHex(c.input)};
240
+ --ring: ${cssColorFromHex(c.ring)};
241
+ --chart-1: ${cssColorFromHex(c.chart1)};
242
+ --chart-2: ${cssColorFromHex(c.chart2)};
243
+ --chart-3: ${cssColorFromHex(c.chart3)};
244
+ --chart-4: ${cssColorFromHex(c.chart4)};
245
+ --chart-5: ${cssColorFromHex(c.chart5)};
246
+ --sidebar-background: ${cssColorFromHex(c.sidebar)};
247
+ --sidebar-foreground: ${cssColorFromHex(c.sidebarForeground)};
248
+ --sidebar-primary: ${cssColorFromHex(c.sidebarPrimary)};
249
+ --sidebar-primary-foreground: ${cssColorFromHex(c.sidebarPrimaryForeground)};
250
+ --sidebar-accent: ${cssColorFromHex(c.sidebarAccent)};
251
+ --sidebar-accent-foreground: ${cssColorFromHex(c.sidebarAccentForeground)};
252
+ --sidebar-border: ${cssColorFromHex(c.sidebarBorder)};
253
+ --sidebar-ring: ${cssColorFromHex(c.sidebarRing)};
254
+ --shadow-2xs: ${c.shadow2xs ?? ""};
255
+ --shadow-xs: ${c.shadowXs ?? ""};
256
+ --shadow-sm: ${c.shadowSm ?? ""};
257
+ --shadow-md: ${c.shadowMd ?? ""};
258
+ --shadow-lg: ${c.shadowLg ?? ""};
259
+ --shadow-xl: ${c.shadowXl ?? ""};
260
+ --shadow-2xl: ${c.shadow2xl ?? ""};
261
+ `;
262
+ return `
263
+ ${selector} {
264
+ ${block(light)}
265
+ }
266
+ ${selector}:is(.dark, .dark *) {
267
+ ${block(dark)}
268
+ }
269
+ `;
270
+ }
271
+ function PageRenderer({
272
+ layout,
273
+ theme,
274
+ pageData,
275
+ children,
276
+ dataSlots,
277
+ nextTheme = "light",
278
+ themeMode = "light",
279
+ onThemeModeChange,
280
+ editing = false,
281
+ selectedWidgetId,
282
+ highlightedWidgetId,
283
+ onSelectWidget,
284
+ onMoveWidgetUp,
285
+ onMoveWidgetDown,
286
+ onDeleteWidget,
287
+ onAddWidgetBelow,
288
+ injectThemeStyles = true,
289
+ linkComponent,
290
+ className
291
+ }) {
292
+ const blockRefs = useRef(/* @__PURE__ */ new Map());
293
+ const themeScope = `pb-${useId().replace(/[^a-zA-Z0-9_-]/g, "")}`;
294
+ const themeSelector = `[data-pb-theme="${themeScope}"]`;
295
+ useEffect(() => {
296
+ if (!highlightedWidgetId) return;
297
+ blockRefs.current.get(highlightedWidgetId)?.scrollIntoView({ behavior: "smooth", block: "nearest" });
298
+ }, [highlightedWidgetId, layout]);
299
+ const header = layout.find((widget) => widget.name === "header");
300
+ const footer = layout.find((widget) => widget.name === "footer");
301
+ const body = layout.filter(
302
+ (widget) => !LAYOUT_BLOCK_NAMES.includes(widget.name)
303
+ );
304
+ const resolvedPageData = {
305
+ pageType: "site",
306
+ ...pageData
307
+ };
308
+ function renderInstance(instance, options) {
309
+ const definition = getWidget(instance.name);
310
+ if (!definition) return null;
311
+ const Widget = definition.widget;
312
+ const settings = {
313
+ ...definition.getDefaultSettings?.(),
314
+ ...instance.settings
315
+ };
316
+ return /* @__PURE__ */ jsx(
317
+ EditableBlock,
318
+ {
319
+ editing,
320
+ containerRef: (node) => {
321
+ if (node) {
322
+ blockRefs.current.set(instance.widgetId, node);
323
+ } else {
324
+ blockRefs.current.delete(instance.widgetId);
325
+ }
326
+ },
327
+ selected: selectedWidgetId === instance.widgetId,
328
+ highlighted: highlightedWidgetId === instance.widgetId,
329
+ label: definition.metadata.displayName,
330
+ onSelect: () => onSelectWidget?.(instance.widgetId),
331
+ onMoveUp: options.allowUp ? () => onMoveWidgetUp?.(instance.widgetId) : void 0,
332
+ onMoveDown: options.allowDown ? () => onMoveWidgetDown?.(instance.widgetId) : void 0,
333
+ onDelete: !options.locked ? () => onDeleteWidget?.(instance.widgetId) : void 0,
334
+ onAddBelow: options.allowAddBelow && onAddWidgetBelow ? () => onAddWidgetBelow(instance.widgetId) : void 0,
335
+ children: /* @__PURE__ */ jsx(
336
+ Widget,
337
+ {
338
+ settings,
339
+ state: { theme },
340
+ pageData: resolvedPageData,
341
+ data: instance.name === "data-slot" ? dataSlots?.[String(settings.slot ?? "")] : void 0,
342
+ editing,
343
+ nextTheme,
344
+ themeMode,
345
+ setThemeMode: onThemeModeChange,
346
+ toggleTheme: onThemeModeChange ? () => onThemeModeChange(
347
+ nextTheme === "dark" ? "light" : "dark"
348
+ ) : void 0
349
+ }
350
+ )
351
+ },
352
+ instance.widgetId
353
+ );
354
+ }
355
+ return /* @__PURE__ */ jsx(PageBuilderLinkProvider, { component: linkComponent, children: /* @__PURE__ */ jsxs(
356
+ "div",
357
+ {
358
+ "data-pb-theme": themeScope,
359
+ className: cn(
360
+ "pb-theme flex min-h-full flex-col bg-background text-foreground",
361
+ nextTheme === "dark" && "dark",
362
+ className
363
+ ),
364
+ children: [
365
+ header && renderInstance(header, {
366
+ allowUp: false,
367
+ allowDown: false,
368
+ locked: true,
369
+ allowAddBelow: true
370
+ }),
371
+ /* @__PURE__ */ jsx("div", { className: "flex flex-1 flex-col", children: children !== void 0 && !body.some((instance) => instance.name === "data-slot") ? children : body.map(
372
+ (instance, index) => renderInstance(instance, {
373
+ allowUp: instance.moveable && index !== 0,
374
+ allowDown: instance.moveable && index !== body.length - 1,
375
+ locked: !instance.deletable,
376
+ allowAddBelow: true
377
+ })
378
+ ) }),
379
+ footer && renderInstance(footer, {
380
+ allowUp: false,
381
+ allowDown: false,
382
+ locked: true,
383
+ allowAddBelow: false
384
+ }),
385
+ injectThemeStyles && /* @__PURE__ */ jsx("style", { children: generateThemeStyles(theme, themeSelector) })
386
+ ]
387
+ }
388
+ ) });
389
+ }
390
+
391
+ export { EditableBlock, LAYOUT_BLOCK_NAMES, NON_ADDABLE_BLOCK_NAMES, PageRenderer, blockRegistry, generateThemeStyles, getAddableBlocks, getWidget, registerBlock };
392
+ //# sourceMappingURL=chunk-SSQWYMQR.js.map
393
+ //# sourceMappingURL=chunk-SSQWYMQR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/registry.ts","../src/renderer/editable-block.tsx","../src/renderer/generate-theme-styles.ts","../src/renderer/page-renderer.tsx"],"names":["jsx","jsxs"],"mappings":"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","file":"chunk-SSQWYMQR.js","sourcesContent":["import type { Widget } from \"./models\";\nimport {\n Header,\n Hero,\n Content,\n Featured,\n Faq,\n Pricing,\n Banner,\n EmailForm,\n SupportForm,\n Footer,\n RichText,\n Grid,\n MediaBlock,\n Marquee,\n Embed,\n DataSlot,\n} from \"./blocks\";\n\n/**\n * Every block available to the page builder, keyed by its\n * `metadata.name`. `header` and `footer` are singleton, layout-level\n * blocks placed outside the normal flow by the renderer.\n */\nexport const blockRegistry: Record<string, Widget<any>> = {\n header: Header,\n hero: Hero,\n content: Content,\n featured: Featured,\n faq: Faq,\n pricing: Pricing,\n banner: Banner,\n \"email-form\": EmailForm,\n \"support-form\": SupportForm,\n footer: Footer,\n \"rich-text\": RichText,\n grid: Grid,\n media: MediaBlock,\n marquee: Marquee,\n embed: Embed,\n \"data-slot\": DataSlot,\n};\n\nexport const LAYOUT_BLOCK_NAMES = [\"header\", \"footer\"];\nexport const NON_ADDABLE_BLOCK_NAMES = [...LAYOUT_BLOCK_NAMES, \"data-slot\"];\n\n/**\n * Adds a host application's block to the shared renderer and builder\n * registry. Register blocks while the application module initializes, before\n * rendering either `PageBuilder` or `PageRenderer`.\n *\n * Built-in names are intentionally protected: a persisted page must always\n * have one stable implementation for a block name. Give host blocks a\n * namespaced name such as `acme-event-list`.\n */\nexport function registerBlock(widget: Widget<any>): void {\n const name = widget.metadata.name.trim();\n if (!name) {\n throw new Error(\"A page-builder block must have a non-empty name.\");\n }\n if (blockRegistry[name]) {\n throw new Error(\n `A page-builder block named \\\"${name}\\\" is already registered.`,\n );\n }\n if (NON_ADDABLE_BLOCK_NAMES.includes(name)) {\n throw new Error(\n `\\\"${name}\\\" is a reserved page-builder block name and cannot be registered by a host application.`,\n );\n }\n blockRegistry[name] = widget;\n}\n\nexport function getWidget(name: string): Widget<any> | undefined {\n return blockRegistry[name];\n}\n\n/** Blocks a user can add to the body of a page. */\nexport function getAddableBlocks(): Widget<any>[] {\n return Object.values(blockRegistry).filter(\n (widget) => !NON_ADDABLE_BLOCK_NAMES.includes(widget.metadata.name),\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { ArrowDown, ArrowUp, Plus, Settings2, Trash2 } from \"lucide-react\";\nimport { cn } from \"../primitives/lib/utils\";\n\nexport interface EditableBlockProps {\n children: React.ReactNode;\n editing: boolean;\n /** Ref to the wrapper element so the canvas can scroll the block into view. */\n containerRef?: React.Ref<HTMLDivElement>;\n selected?: boolean;\n /** Draws a temporary attention flash, e.g. right after the block was moved. */\n highlighted?: boolean;\n label?: string;\n onSelect?: () => void;\n onMoveUp?: () => void;\n onMoveDown?: () => void;\n onDelete?: () => void;\n onAddBelow?: () => void;\n}\n\nfunction ToolbarButton({\n icon: Icon,\n label,\n onClick,\n}: {\n icon: React.ComponentType<{ className?: string }>;\n label: string;\n onClick?: () => void;\n}) {\n if (!onClick) return null;\n return (\n <button\n type=\"button\"\n title={label}\n aria-label={label}\n className=\"inline-flex h-7 w-7 items-center justify-center rounded bg-background text-foreground shadow-sm hover:bg-muted\"\n onClick={(e) => {\n e.stopPropagation();\n onClick();\n }}\n >\n <Icon className=\"h-3.5 w-3.5\" />\n </button>\n );\n}\n\n/**\n * Two-click delete: first click arms the button (\"Sure?\"), second click\n * actually deletes. Disarms after a short delay or when the pointer leaves.\n */\nfunction DeleteButton({ onDelete }: { onDelete?: () => void }) {\n const [confirming, setConfirming] = React.useState(false);\n\n React.useEffect(() => {\n if (!confirming) return;\n const timeout = setTimeout(() => setConfirming(false), 3000);\n return () => clearTimeout(timeout);\n }, [confirming]);\n\n if (!onDelete) return null;\n\n if (confirming) {\n return (\n <button\n type=\"button\"\n title=\"Confirm delete\"\n aria-label=\"Confirm delete\"\n className=\"inline-flex h-7 items-center justify-center rounded bg-destructive px-2 text-xs font-medium text-destructive-foreground shadow-sm hover:bg-destructive/90\"\n onMouseLeave={() => setConfirming(false)}\n onClick={(e) => {\n e.stopPropagation();\n setConfirming(false);\n onDelete();\n }}\n >\n Sure?\n </button>\n );\n }\n\n return (\n <button\n type=\"button\"\n title=\"Delete\"\n aria-label=\"Delete\"\n className=\"inline-flex h-7 w-7 items-center justify-center rounded bg-background text-foreground shadow-sm hover:bg-muted\"\n onClick={(e) => {\n e.stopPropagation();\n setConfirming(true);\n }}\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n );\n}\n\n/**\n * Wraps a rendered block with hover/selection affordances when the page\n * builder is in editing mode. In non-editing (plain display) mode it's a\n * transparent passthrough.\n */\nexport function EditableBlock({\n children,\n editing,\n containerRef,\n selected,\n highlighted,\n label,\n onSelect,\n onMoveUp,\n onMoveDown,\n onDelete,\n onAddBelow,\n}: EditableBlockProps) {\n if (!editing) {\n return <>{children}</>;\n }\n\n return (\n <div\n ref={containerRef}\n className={cn(\n \"group/block relative outline outline-1 outline-transparent transition-colors hover:outline-primary/40\",\n selected && \"outline-2 outline-primary\",\n highlighted && \"outline-2 outline-primary/70\",\n )}\n onClick={onSelect}\n >\n <div\n aria-hidden\n className={cn(\n \"pointer-events-none absolute inset-0 z-10 bg-primary/10 opacity-0 transition-opacity duration-500\",\n highlighted && \"opacity-100\",\n )}\n />\n <div className=\"pointer-events-none absolute inset-x-0 top-0 z-20 flex justify-center opacity-0 transition-opacity group-hover/block:opacity-100\">\n <div className=\"pointer-events-auto flex items-center gap-1 rounded-b-md border border-t-0 border-border bg-background px-1.5 py-1 shadow-sm\">\n {label && (\n <span className=\"px-1.5 text-xs font-medium text-muted-foreground\">\n {label}\n </span>\n )}\n <ToolbarButton\n icon={Settings2}\n label=\"Edit settings\"\n onClick={onSelect}\n />\n <ToolbarButton\n icon={ArrowUp}\n label=\"Move up\"\n onClick={onMoveUp}\n />\n <ToolbarButton\n icon={ArrowDown}\n label=\"Move down\"\n onClick={onMoveDown}\n />\n <DeleteButton onDelete={onDelete} />\n </div>\n </div>\n {children}\n {onAddBelow && (\n <div className=\"pointer-events-none absolute inset-x-0 -bottom-3 z-20 flex justify-center opacity-0 transition-opacity group-hover/block:opacity-100\">\n <button\n type=\"button\"\n title=\"Add block below\"\n aria-label=\"Add block below\"\n className=\"pointer-events-auto inline-flex h-6 w-6 items-center justify-center rounded-full border border-border bg-background text-foreground shadow-sm hover:bg-primary hover:text-primary-foreground\"\n onClick={(e) => {\n e.stopPropagation();\n onAddBelow();\n }}\n >\n <Plus className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n )}\n </div>\n );\n}\n","import convert, { HSL } from \"color-convert\";\nimport type { Theme } from \"../models\";\n\nfunction formatHSL(hsl: HSL): string {\n return `${hsl[0]} ${hsl[1]}% ${hsl[2]}%`;\n}\n\nfunction cssColorFromHex(hex?: string): string {\n if (!hex) return \"\";\n try {\n return `hsl(${formatHSL(convert.hex.hsl(hex.replace(\"#\", \"\")))})`;\n } catch {\n return \"\";\n }\n}\n\n/**\n * Generates full CSS color values for the custom properties every primitive\n * reads. Full colors (rather than bare HSL channels) let the renderer coexist\n * with Tailwind v4 hosts whose semantic utilities use `var(--primary)` while\n * still accepting CourseLit-derived hex theme data.\n *\n * Callers rendering more than one theme in a document should pass a unique\n * selector so one renderer cannot overwrite another renderer's variables.\n */\nexport function generateThemeStyles(\n theme: Theme,\n selector = \".pb-theme\",\n): string {\n const colors = theme?.theme?.colors;\n if (!colors) {\n return \"\";\n }\n\n const { light, dark } = colors;\n if (!light || !dark) {\n return \"\";\n }\n\n const block = (c: typeof light) => `\n --background: ${cssColorFromHex(c.background)};\n --foreground: ${cssColorFromHex(c.foreground)};\n --card: ${cssColorFromHex(c.card)};\n --card-foreground: ${cssColorFromHex(c.cardForeground)};\n --popover: ${cssColorFromHex(c.popover)};\n --popover-foreground: ${cssColorFromHex(c.popoverForeground)};\n --primary: ${cssColorFromHex(c.primary)};\n --primary-foreground: ${cssColorFromHex(c.primaryForeground)};\n --secondary: ${cssColorFromHex(c.secondary)};\n --secondary-foreground: ${cssColorFromHex(c.secondaryForeground)};\n --muted: ${cssColorFromHex(c.muted)};\n --muted-foreground: ${cssColorFromHex(c.mutedForeground)};\n --accent: ${cssColorFromHex(c.accent)};\n --accent-foreground: ${cssColorFromHex(c.accentForeground)};\n --destructive: ${cssColorFromHex(c.destructive)};\n --border: ${cssColorFromHex(c.border)};\n --input: ${cssColorFromHex(c.input)};\n --ring: ${cssColorFromHex(c.ring)};\n --chart-1: ${cssColorFromHex(c.chart1)};\n --chart-2: ${cssColorFromHex(c.chart2)};\n --chart-3: ${cssColorFromHex(c.chart3)};\n --chart-4: ${cssColorFromHex(c.chart4)};\n --chart-5: ${cssColorFromHex(c.chart5)};\n --sidebar-background: ${cssColorFromHex(c.sidebar)};\n --sidebar-foreground: ${cssColorFromHex(c.sidebarForeground)};\n --sidebar-primary: ${cssColorFromHex(c.sidebarPrimary)};\n --sidebar-primary-foreground: ${cssColorFromHex(c.sidebarPrimaryForeground)};\n --sidebar-accent: ${cssColorFromHex(c.sidebarAccent)};\n --sidebar-accent-foreground: ${cssColorFromHex(c.sidebarAccentForeground)};\n --sidebar-border: ${cssColorFromHex(c.sidebarBorder)};\n --sidebar-ring: ${cssColorFromHex(c.sidebarRing)};\n --shadow-2xs: ${c.shadow2xs ?? \"\"};\n --shadow-xs: ${c.shadowXs ?? \"\"};\n --shadow-sm: ${c.shadowSm ?? \"\"};\n --shadow-md: ${c.shadowMd ?? \"\"};\n --shadow-lg: ${c.shadowLg ?? \"\"};\n --shadow-xl: ${c.shadowXl ?? \"\"};\n --shadow-2xl: ${c.shadow2xl ?? \"\"};\n `;\n\n return `\n ${selector} {\n ${block(light)}\n }\n ${selector}:is(.dark, .dark *) {\n ${block(dark)}\n }\n `;\n}\n","\"use client\";\n\nimport React, { useEffect, useId, useRef } from \"react\";\nimport type { PageData, Theme, WidgetInstance } from \"../models\";\nimport { getWidget, LAYOUT_BLOCK_NAMES } from \"../registry\";\nimport { EditableBlock } from \"./editable-block\";\nimport { generateThemeStyles } from \"./generate-theme-styles\";\nimport { cn } from \"../primitives/lib/utils\";\nimport {\n PageBuilderLinkProvider,\n type PageBuilderLinkComponent,\n} from \"../components/nav-link\";\n\nexport interface PageRendererProps {\n layout: WidgetInstance[];\n theme: Theme;\n pageData?: PageData;\n /** Optional content rendered between the shared header and footer. */\n children?: React.ReactNode;\n /** Host-resolved data keyed by a generic data-slot's configured name. */\n dataSlots?: Record<string, React.ReactNode>;\n /** Resolved palette currently painted (`system` is already applied). */\n nextTheme?: \"light\" | \"dark\";\n /** Visitor or preview preference, including follow-the-OS. */\n themeMode?: \"light\" | \"dark\" | \"system\";\n onThemeModeChange?: (mode: \"light\" | \"dark\" | \"system\") => void;\n /** When true, renders hover controls (edit/move/delete/add) for use inside the builder canvas. */\n editing?: boolean;\n selectedWidgetId?: string;\n /** Widget to briefly highlight, e.g. right after it was moved. */\n highlightedWidgetId?: string;\n onSelectWidget?: (widgetId: string) => void;\n onMoveWidgetUp?: (widgetId: string) => void;\n onMoveWidgetDown?: (widgetId: string) => void;\n onDeleteWidget?: (widgetId: string) => void;\n onAddWidgetBelow?: (widgetId: string) => void;\n /** Injects the theme's generated CSS custom properties as a `<style>` tag. Disable if the host app renders it elsewhere. */\n injectThemeStyles?: boolean;\n /**\n * Optional host link (e.g. Next.js `Link`) used for internal `/...` paths\n * inside block widgets. Omit it to render native `<a>` tags — no\n * framework dependency.\n */\n linkComponent?: PageBuilderLinkComponent;\n className?: string;\n}\n\n/**\n * Renders a page's widget layout using the block registry. Used both for\n * plain (non-editable) display and, with `editing`, as the live canvas\n * inside the page builder.\n */\nexport function PageRenderer({\n layout,\n theme,\n pageData,\n children,\n dataSlots,\n nextTheme = \"light\",\n themeMode = \"light\",\n onThemeModeChange,\n editing = false,\n selectedWidgetId,\n highlightedWidgetId,\n onSelectWidget,\n onMoveWidgetUp,\n onMoveWidgetDown,\n onDeleteWidget,\n onAddWidgetBelow,\n injectThemeStyles = true,\n linkComponent,\n className,\n}: PageRendererProps) {\n // Refs to each block's wrapper, keyed by widget id. Refs (unlike DOM\n // attribute lookups) stay correct even when SSR and client render\n // different generated widget ids.\n const blockRefs = useRef(new Map<string, HTMLDivElement>());\n const themeScope = `pb-${useId().replace(/[^a-zA-Z0-9_-]/g, \"\")}`;\n const themeSelector = `[data-pb-theme=\"${themeScope}\"]`;\n\n // Keep the highlighted (just-moved) block in view. Keyed on `layout` too\n // so repeated move clicks on the same widget re-scroll as it travels.\n useEffect(() => {\n if (!highlightedWidgetId) return;\n blockRefs.current\n .get(highlightedWidgetId)\n ?.scrollIntoView({ behavior: \"smooth\", block: \"nearest\" });\n }, [highlightedWidgetId, layout]);\n\n const header = layout.find((widget) => widget.name === \"header\");\n const footer = layout.find((widget) => widget.name === \"footer\");\n const body = layout.filter(\n (widget) => !LAYOUT_BLOCK_NAMES.includes(widget.name),\n );\n\n const resolvedPageData: PageData = {\n pageType: \"site\",\n ...pageData,\n };\n\n function renderInstance(\n instance: WidgetInstance,\n options: {\n allowUp: boolean;\n allowDown: boolean;\n locked: boolean;\n allowAddBelow: boolean;\n },\n ) {\n const definition = getWidget(instance.name);\n if (!definition) return null;\n\n const Widget = definition.widget;\n const settings = {\n ...definition.getDefaultSettings?.(),\n ...instance.settings,\n };\n\n return (\n <EditableBlock\n key={instance.widgetId}\n editing={editing}\n containerRef={(node) => {\n if (node) {\n blockRefs.current.set(instance.widgetId, node);\n } else {\n blockRefs.current.delete(instance.widgetId);\n }\n }}\n selected={selectedWidgetId === instance.widgetId}\n highlighted={highlightedWidgetId === instance.widgetId}\n label={definition.metadata.displayName}\n onSelect={() => onSelectWidget?.(instance.widgetId)}\n onMoveUp={\n options.allowUp\n ? () => onMoveWidgetUp?.(instance.widgetId)\n : undefined\n }\n onMoveDown={\n options.allowDown\n ? () => onMoveWidgetDown?.(instance.widgetId)\n : undefined\n }\n onDelete={\n !options.locked\n ? () => onDeleteWidget?.(instance.widgetId)\n : undefined\n }\n onAddBelow={\n options.allowAddBelow && onAddWidgetBelow\n ? () => onAddWidgetBelow(instance.widgetId)\n : undefined\n }\n >\n <Widget\n settings={settings as any}\n state={{ theme }}\n pageData={resolvedPageData}\n data={\n instance.name === \"data-slot\"\n ? dataSlots?.[String(settings.slot ?? \"\")]\n : undefined\n }\n editing={editing}\n nextTheme={nextTheme}\n themeMode={themeMode}\n setThemeMode={onThemeModeChange}\n toggleTheme={\n onThemeModeChange\n ? () =>\n onThemeModeChange(\n nextTheme === \"dark\" ? \"light\" : \"dark\",\n )\n : undefined\n }\n />\n </EditableBlock>\n );\n }\n\n return (\n <PageBuilderLinkProvider component={linkComponent}>\n <div\n data-pb-theme={themeScope}\n className={cn(\n \"pb-theme flex min-h-full flex-col bg-background text-foreground\",\n nextTheme === \"dark\" && \"dark\",\n className,\n )}\n >\n {header &&\n renderInstance(header, {\n allowUp: false,\n allowDown: false,\n locked: true,\n allowAddBelow: true,\n })}\n <div className=\"flex flex-1 flex-col\">\n {children !== undefined &&\n !body.some((instance) => instance.name === \"data-slot\")\n ? children\n : body.map((instance, index) =>\n renderInstance(instance, {\n allowUp: instance.moveable && index !== 0,\n allowDown:\n instance.moveable &&\n index !== body.length - 1,\n locked: !instance.deletable,\n allowAddBelow: true,\n }),\n )}\n </div>\n {footer &&\n renderInstance(footer, {\n allowUp: false,\n allowDown: false,\n locked: true,\n allowAddBelow: false,\n })}\n {injectThemeStyles && (\n <style>{generateThemeStyles(theme, themeSelector)}</style>\n )}\n </div>\n </PageBuilderLinkProvider>\n );\n}\n"]}
@@ -0,0 +1,3 @@
1
+ type ResolvedColorMode = "light" | "dark";
2
+
3
+ export type { ResolvedColorMode as R };
@@ -0,0 +1,36 @@
1
+ import React__default from 'react';
2
+ export { A as AspectRatio, I as Image, a as ImageObjectFit, V as VideoThumbnailProps, b as VideoWithPreview } from '../image-D7GlnOio.js';
3
+ export { N as NavLink, P as PageBuilderLinkComponent, a as PageBuilderLinkProps, b as PageBuilderLinkProvider, u as usePageBuilderLinkComponent } from '../nav-link-BfxvQ1s6.js';
4
+ import { T as ThemeStyle } from '../theme-style-39nxXQy0.js';
5
+ import { B as ButtonProps } from '../button-C3VrMJkr.js';
6
+ import { R as ResolvedColorMode } from '../color-mode-DIEEt9WP.js';
7
+ export { TextRenderer, truncateTextEditorContent } from '@frontlit/text-editor';
8
+ import 'class-variance-authority/types';
9
+ import 'class-variance-authority';
10
+
11
+ interface SandboxedEmbedProps {
12
+ content: string;
13
+ className?: string;
14
+ style?: React__default.CSSProperties;
15
+ id?: string;
16
+ }
17
+ declare const SandboxedEmbed: ({ content, className, style, id, }: SandboxedEmbedProps) => React__default.JSX.Element;
18
+
19
+ /**
20
+ * Light / dark toggle. Public sites pass `theme` so the button uses
21
+ * page-builder primitives; the builder chrome omits it and matches the
22
+ * other icon buttons in the top bar.
23
+ *
24
+ * Preference starts as system (OS). The first click pins an explicit
25
+ * light or dark side; later clicks flip between those two.
26
+ */
27
+ declare function ThemeModeSwitcher({ resolved, onToggle, theme, className, size, variant, }: {
28
+ resolved: ResolvedColorMode;
29
+ onToggle: () => void;
30
+ theme?: ThemeStyle;
31
+ className?: string;
32
+ size?: ButtonProps["size"];
33
+ variant?: ButtonProps["variant"];
34
+ }): React__default.JSX.Element;
35
+
36
+ export { SandboxedEmbed, ThemeModeSwitcher };
@@ -0,0 +1,5 @@
1
+ "use client";
2
+ export { Image, NavLink, PageBuilderLinkProvider, SandboxedEmbed, TextRenderer, ThemeModeSwitcher, VideoWithPreview, truncateTextEditorContent, usePageBuilderLinkComponent } from '../chunk-7W6Q4WA7.js';
3
+ import '../chunk-RBJBODQP.js';
4
+ //# sourceMappingURL=index.js.map
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -0,0 +1,25 @@
1
+ import { ReactNode } from 'react';
2
+ import { d as WidgetInstance, P as PageData } from './widget--uEOpdq3.js';
3
+ import './section-background-BgOCp5l3.js';
4
+ import './theme-style-39nxXQy0.js';
5
+
6
+ /** Context supplied to a host application's data-slot loader. */
7
+ interface DataSlotLoadRequest {
8
+ /** The slot identifier declared in `instance.settings.slot`. */
9
+ slot: string;
10
+ /** The full persisted block configuration. */
11
+ instance: WidgetInstance;
12
+ /** Page context supplied by the host renderer. */
13
+ pageData: PageData;
14
+ }
15
+ /** A host-owned resolver for one named data slot. */
16
+ type DataSlotLoader = (request: DataSlotLoadRequest) => ReactNode | Promise<ReactNode>;
17
+ type DataSlotLoaders = Readonly<Record<string, DataSlotLoader>>;
18
+ /**
19
+ * Resolves generic data-slot blocks before passing their output to
20
+ * `PageRenderer`. The page-builder package deliberately does not fetch data
21
+ * or understand a host application's domain model.
22
+ */
23
+ declare function loadDataSlots(layout: readonly WidgetInstance[], loaders: DataSlotLoaders, pageData: PageData): Promise<Record<string, ReactNode>>;
24
+
25
+ export { type DataSlotLoadRequest, type DataSlotLoader, type DataSlotLoaders, loadDataSlots };
@@ -0,0 +1,3 @@
1
+ export { loadDataSlots } from './chunk-GTY75HW2.js';
2
+ //# sourceMappingURL=data-slots.js.map
3
+ //# sourceMappingURL=data-slots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"data-slots.js"}