@frontlit/page-builder 0.1.0-alpha.5 → 0.1.0-alpha.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/blocks/index.d.ts +1 -1
- package/dist/blocks/index.js +3 -3
- package/dist/builder/index.js +6 -6
- package/dist/{chunk-LMCEOWQG.js → chunk-HEKBPKGS.js} +6 -6
- package/dist/{chunk-LMCEOWQG.js.map → chunk-HEKBPKGS.js.map} +1 -1
- package/dist/{chunk-USPQ3AOW.js → chunk-I2LRKHSL.js} +6 -6
- package/dist/{chunk-USPQ3AOW.js.map → chunk-I2LRKHSL.js.map} +1 -1
- package/dist/{chunk-J7Z4UW45.js → chunk-KRQWGGAJ.js} +353 -8
- package/dist/chunk-KRQWGGAJ.js.map +1 -0
- package/dist/{chunk-BBI7UHOA.js → chunk-LL6CG6KH.js} +3 -3
- package/dist/{chunk-BBI7UHOA.js.map → chunk-LL6CG6KH.js.map} +1 -1
- package/dist/{chunk-36QHCIPM.js → chunk-QMUIISN3.js} +5 -93
- package/dist/chunk-QMUIISN3.js.map +1 -0
- package/dist/{chunk-5J6TLS5U.js → chunk-XQE4RVNO.js} +5 -5
- package/dist/chunk-XQE4RVNO.js.map +1 -0
- package/dist/components/index.d.ts +1 -1
- package/dist/components/index.js +3 -3
- package/dist/{image-Bk8kPXwP.d.ts → image-Cv0aSUHD.d.ts} +3 -1
- package/dist/index.js +6 -6
- package/dist/primitives/index.d.ts +70 -1
- package/dist/primitives/index.js +1 -1
- package/dist/renderer/index.js +5 -5
- package/dist/server/index.js +10 -5
- package/dist/server/index.js.map +1 -1
- package/dist/server/islands/code-snippet.js +1 -1
- package/dist/server/islands/code-snippet.js.map +1 -1
- package/dist/server/islands/header-mobile-menu.js +1 -1
- package/dist/server/islands/header-mobile-menu.js.map +1 -1
- package/dist/server/islands/tabs.d.ts +23 -0
- package/dist/server/islands/tabs.js +86 -0
- package/dist/server/islands/tabs.js.map +1 -0
- package/dist/server/primitives.d.ts +83 -1
- package/dist/server/primitives.js +253 -35
- package/dist/server/primitives.js.map +1 -1
- package/dist/styles.css +78 -0
- package/package.json +1 -1
- package/dist/chunk-36QHCIPM.js.map +0 -1
- package/dist/chunk-5J6TLS5U.js.map +0 -1
- package/dist/chunk-J7Z4UW45.js.map +0 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { ThemeModeSwitcher } from './chunk-
|
|
3
|
-
import { DataSlot, CodeSnippetBlock, Embed, Marquee, MediaBlock, Grid, RichText, Footer, SupportForm, EmailForm, Banner, Pricing, Faq, Featured, Content, Hero, Header } from './chunk-
|
|
4
|
-
import { PageBuilderLinkProvider } from './chunk-
|
|
5
|
-
import { cn } from './chunk-
|
|
2
|
+
import { ThemeModeSwitcher } from './chunk-LL6CG6KH.js';
|
|
3
|
+
import { DataSlot, CodeSnippetBlock, Embed, Marquee, MediaBlock, Grid, RichText, Footer, SupportForm, EmailForm, Banner, Pricing, Faq, Featured, Content, Hero, Header } from './chunk-XQE4RVNO.js';
|
|
4
|
+
import { PageBuilderLinkProvider } from './chunk-QMUIISN3.js';
|
|
5
|
+
import { cn } from './chunk-KRQWGGAJ.js';
|
|
6
6
|
import { useRef, useId, useEffect } from 'react';
|
|
7
7
|
import { Settings2, ArrowUp, ArrowDown, Trash2, Plus } from 'lucide-react';
|
|
8
8
|
import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
|
|
@@ -334,5 +334,5 @@ function PageRenderer({
|
|
|
334
334
|
}
|
|
335
335
|
|
|
336
336
|
export { EditableBlock, LAYOUT_BLOCK_NAMES, NON_ADDABLE_BLOCK_NAMES, PageRenderer, blockRegistry, generateThemeStyles, getAddableBlocks, getWidget, registerBlock, resolveThemeColor };
|
|
337
|
-
//# sourceMappingURL=chunk-
|
|
338
|
-
//# sourceMappingURL=chunk-
|
|
337
|
+
//# sourceMappingURL=chunk-I2LRKHSL.js.map
|
|
338
|
+
//# sourceMappingURL=chunk-I2LRKHSL.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/registry-names.ts","../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-USPQ3AOW.js","sourcesContent":["/** Blocks placed outside the normal flow by the renderer. */\nexport const LAYOUT_BLOCK_NAMES = [\"header\", \"footer\"];\n","import type { Widget } from \"./models\";\nimport { LAYOUT_BLOCK_NAMES } from \"./registry-names\";\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 CodeSnippetBlock,\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 \"code-snippet\": CodeSnippetBlock,\n \"data-slot\": DataSlot,\n};\n\nexport { LAYOUT_BLOCK_NAMES };\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(`A page-builder block named \\\"${name}\\\" is already registered.`);\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 * 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 icon={Settings2} label=\"Edit settings\" onClick={onSelect} />\n <ToolbarButton icon={ArrowUp} label=\"Move up\" onClick={onMoveUp} />\n <ToolbarButton icon={ArrowDown} label=\"Move down\" onClick={onMoveDown} />\n <ToolbarButton icon={Trash2} label=\"Delete\" onClick={onDelete} />\n </div>\n </div>\n {children}\n {/* z-30: stay above the next block's (invisible) toolbar, which overlaps this strip. */}\n {onAddBelow && (\n <div className=\"pointer-events-none absolute inset-x-0 -bottom-3 z-30 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\nconst SHORT_OR_LONG_HEX = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i;\nconst HEX_WITH_ALPHA = /^#([0-9a-f]{4}|[0-9a-f]{8})$/i;\nconst CSS_COLOR_FUNCTION =\n /^(oklch|oklab|lab|lch|hwb|hsla?|rgba?|color)\\(\\s*[-+0-9a-z%.,/\\s]+\\)$/i;\n\n/**\n * Turns a theme colour into a CSS colour value, or \"\" when it isn't a\n * colour we can use. Hex (the stored format) is converted to hsl();\n * modern CSS colour functions such as `oklch(...)` are passed through.\n */\nexport function resolveThemeColor(value?: string): string {\n const color = value?.trim();\n if (!color) return \"\";\n if (SHORT_OR_LONG_HEX.test(color)) {\n return `hsl(${formatHSL(convert.hex.hsl(color.replace(\"#\", \"\")))})`;\n }\n if (HEX_WITH_ALPHA.test(color) || CSS_COLOR_FUNCTION.test(color)) return color;\n return \"\";\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(theme: Theme, selector = \".pb-theme\"): 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: ${resolveThemeColor(c.background)};\n --foreground: ${resolveThemeColor(c.foreground)};\n --card: ${resolveThemeColor(c.card)};\n --card-foreground: ${resolveThemeColor(c.cardForeground)};\n --popover: ${resolveThemeColor(c.popover)};\n --popover-foreground: ${resolveThemeColor(c.popoverForeground)};\n --primary: ${resolveThemeColor(c.primary)};\n --primary-foreground: ${resolveThemeColor(c.primaryForeground)};\n --secondary: ${resolveThemeColor(c.secondary)};\n --secondary-foreground: ${resolveThemeColor(c.secondaryForeground)};\n --muted: ${resolveThemeColor(c.muted)};\n --muted-foreground: ${resolveThemeColor(c.mutedForeground)};\n --accent: ${resolveThemeColor(c.accent)};\n --accent-foreground: ${resolveThemeColor(c.accentForeground)};\n --destructive: ${resolveThemeColor(c.destructive)};\n --border: ${resolveThemeColor(c.border)};\n --input: ${resolveThemeColor(c.input)};\n --ring: ${resolveThemeColor(c.ring)};\n --chart-1: ${resolveThemeColor(c.chart1)};\n --chart-2: ${resolveThemeColor(c.chart2)};\n --chart-3: ${resolveThemeColor(c.chart3)};\n --chart-4: ${resolveThemeColor(c.chart4)};\n --chart-5: ${resolveThemeColor(c.chart5)};\n --sidebar-background: ${resolveThemeColor(c.sidebar)};\n --sidebar-foreground: ${resolveThemeColor(c.sidebarForeground)};\n --sidebar-primary: ${resolveThemeColor(c.sidebarPrimary)};\n --sidebar-primary-foreground: ${resolveThemeColor(c.sidebarPrimaryForeground)};\n --sidebar-accent: ${resolveThemeColor(c.sidebarAccent)};\n --sidebar-accent-foreground: ${resolveThemeColor(c.sidebarAccentForeground)};\n --sidebar-border: ${resolveThemeColor(c.sidebarBorder)};\n --sidebar-ring: ${resolveThemeColor(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 { ThemeModeSwitcher } from \"../components/theme-mode-switcher\";\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 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 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((widget) => !LAYOUT_BLOCK_NAMES.includes(widget.name));\n\n const themeSwitcher = onThemeModeChange ? (\n <ThemeModeSwitcher\n resolved={nextTheme}\n onToggle={() => onThemeModeChange(nextTheme === \"dark\" ? \"light\" : \"dark\")}\n theme={theme.theme}\n size=\"sm\"\n variant=\"outline\"\n />\n ) : undefined;\n\n const resolvedPageData: PageData = {\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 ? () => onMoveWidgetUp?.(instance.widgetId) : undefined\n }\n onMoveDown={\n options.allowDown ? () => onMoveWidgetDown?.(instance.widgetId) : undefined\n }\n onDelete={\n !options.locked ? () => onDeleteWidget?.(instance.widgetId) : 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 themeSwitcher={themeSwitcher}\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 {/* Emitted first so the variables exist before any content paints. */}\n {injectThemeStyles && (\n <style>{generateThemeStyles(theme, themeSelector)}</style>\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: instance.moveable && 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 </div>\n </PageBuilderLinkProvider>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/registry-names.ts","../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-I2LRKHSL.js","sourcesContent":["/** Blocks placed outside the normal flow by the renderer. */\nexport const LAYOUT_BLOCK_NAMES = [\"header\", \"footer\"];\n","import type { Widget } from \"./models\";\nimport { LAYOUT_BLOCK_NAMES } from \"./registry-names\";\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 CodeSnippetBlock,\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 \"code-snippet\": CodeSnippetBlock,\n \"data-slot\": DataSlot,\n};\n\nexport { LAYOUT_BLOCK_NAMES };\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(`A page-builder block named \\\"${name}\\\" is already registered.`);\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 * 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 icon={Settings2} label=\"Edit settings\" onClick={onSelect} />\n <ToolbarButton icon={ArrowUp} label=\"Move up\" onClick={onMoveUp} />\n <ToolbarButton icon={ArrowDown} label=\"Move down\" onClick={onMoveDown} />\n <ToolbarButton icon={Trash2} label=\"Delete\" onClick={onDelete} />\n </div>\n </div>\n {children}\n {/* z-30: stay above the next block's (invisible) toolbar, which overlaps this strip. */}\n {onAddBelow && (\n <div className=\"pointer-events-none absolute inset-x-0 -bottom-3 z-30 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\nconst SHORT_OR_LONG_HEX = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i;\nconst HEX_WITH_ALPHA = /^#([0-9a-f]{4}|[0-9a-f]{8})$/i;\nconst CSS_COLOR_FUNCTION =\n /^(oklch|oklab|lab|lch|hwb|hsla?|rgba?|color)\\(\\s*[-+0-9a-z%.,/\\s]+\\)$/i;\n\n/**\n * Turns a theme colour into a CSS colour value, or \"\" when it isn't a\n * colour we can use. Hex (the stored format) is converted to hsl();\n * modern CSS colour functions such as `oklch(...)` are passed through.\n */\nexport function resolveThemeColor(value?: string): string {\n const color = value?.trim();\n if (!color) return \"\";\n if (SHORT_OR_LONG_HEX.test(color)) {\n return `hsl(${formatHSL(convert.hex.hsl(color.replace(\"#\", \"\")))})`;\n }\n if (HEX_WITH_ALPHA.test(color) || CSS_COLOR_FUNCTION.test(color)) return color;\n return \"\";\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(theme: Theme, selector = \".pb-theme\"): 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: ${resolveThemeColor(c.background)};\n --foreground: ${resolveThemeColor(c.foreground)};\n --card: ${resolveThemeColor(c.card)};\n --card-foreground: ${resolveThemeColor(c.cardForeground)};\n --popover: ${resolveThemeColor(c.popover)};\n --popover-foreground: ${resolveThemeColor(c.popoverForeground)};\n --primary: ${resolveThemeColor(c.primary)};\n --primary-foreground: ${resolveThemeColor(c.primaryForeground)};\n --secondary: ${resolveThemeColor(c.secondary)};\n --secondary-foreground: ${resolveThemeColor(c.secondaryForeground)};\n --muted: ${resolveThemeColor(c.muted)};\n --muted-foreground: ${resolveThemeColor(c.mutedForeground)};\n --accent: ${resolveThemeColor(c.accent)};\n --accent-foreground: ${resolveThemeColor(c.accentForeground)};\n --destructive: ${resolveThemeColor(c.destructive)};\n --border: ${resolveThemeColor(c.border)};\n --input: ${resolveThemeColor(c.input)};\n --ring: ${resolveThemeColor(c.ring)};\n --chart-1: ${resolveThemeColor(c.chart1)};\n --chart-2: ${resolveThemeColor(c.chart2)};\n --chart-3: ${resolveThemeColor(c.chart3)};\n --chart-4: ${resolveThemeColor(c.chart4)};\n --chart-5: ${resolveThemeColor(c.chart5)};\n --sidebar-background: ${resolveThemeColor(c.sidebar)};\n --sidebar-foreground: ${resolveThemeColor(c.sidebarForeground)};\n --sidebar-primary: ${resolveThemeColor(c.sidebarPrimary)};\n --sidebar-primary-foreground: ${resolveThemeColor(c.sidebarPrimaryForeground)};\n --sidebar-accent: ${resolveThemeColor(c.sidebarAccent)};\n --sidebar-accent-foreground: ${resolveThemeColor(c.sidebarAccentForeground)};\n --sidebar-border: ${resolveThemeColor(c.sidebarBorder)};\n --sidebar-ring: ${resolveThemeColor(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 { ThemeModeSwitcher } from \"../components/theme-mode-switcher\";\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 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 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((widget) => !LAYOUT_BLOCK_NAMES.includes(widget.name));\n\n const themeSwitcher = onThemeModeChange ? (\n <ThemeModeSwitcher\n resolved={nextTheme}\n onToggle={() => onThemeModeChange(nextTheme === \"dark\" ? \"light\" : \"dark\")}\n theme={theme.theme}\n size=\"sm\"\n variant=\"outline\"\n />\n ) : undefined;\n\n const resolvedPageData: PageData = {\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 ? () => onMoveWidgetUp?.(instance.widgetId) : undefined\n }\n onMoveDown={\n options.allowDown ? () => onMoveWidgetDown?.(instance.widgetId) : undefined\n }\n onDelete={\n !options.locked ? () => onDeleteWidget?.(instance.widgetId) : 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 themeSwitcher={themeSwitcher}\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 {/* Emitted first so the variables exist before any content paints. */}\n {injectThemeStyles && (\n <style>{generateThemeStyles(theme, themeSelector)}</style>\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: instance.moveable && 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 </div>\n </PageBuilderLinkProvider>\n );\n}\n"]}
|
|
@@ -552,6 +552,66 @@ var Checkbox = React7.forwardRef(({ className, theme, ...props }, ref) => {
|
|
|
552
552
|
);
|
|
553
553
|
});
|
|
554
554
|
Checkbox.displayName = CheckboxPrimitive.Root.displayName;
|
|
555
|
+
function Collapsible({
|
|
556
|
+
summary,
|
|
557
|
+
children,
|
|
558
|
+
defaultOpen,
|
|
559
|
+
variant = "bordered",
|
|
560
|
+
id,
|
|
561
|
+
theme,
|
|
562
|
+
className
|
|
563
|
+
}) {
|
|
564
|
+
const card = theme?.interactives?.card;
|
|
565
|
+
const typography = theme?.typography?.text2;
|
|
566
|
+
return /* @__PURE__ */ jsxs(
|
|
567
|
+
"details",
|
|
568
|
+
{
|
|
569
|
+
id,
|
|
570
|
+
open: defaultOpen,
|
|
571
|
+
className: cn(
|
|
572
|
+
"group min-w-0",
|
|
573
|
+
variant === "bordered" && [
|
|
574
|
+
"border border-border bg-card text-card-foreground",
|
|
575
|
+
card?.border?.radius ?? "rounded-md"
|
|
576
|
+
],
|
|
577
|
+
className
|
|
578
|
+
),
|
|
579
|
+
children: [
|
|
580
|
+
/* @__PURE__ */ jsxs(
|
|
581
|
+
"summary",
|
|
582
|
+
{
|
|
583
|
+
className: cn(
|
|
584
|
+
"flex cursor-pointer list-none items-center gap-2 text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring [&::-webkit-details-marker]:hidden",
|
|
585
|
+
variant === "bordered" ? "px-3 py-2" : "py-1",
|
|
586
|
+
typography?.fontFamily,
|
|
587
|
+
typography?.fontSize ?? "text-sm",
|
|
588
|
+
typography?.letterSpacing
|
|
589
|
+
),
|
|
590
|
+
children: [
|
|
591
|
+
/* @__PURE__ */ jsx(
|
|
592
|
+
ChevronRight,
|
|
593
|
+
{
|
|
594
|
+
"aria-hidden": "true",
|
|
595
|
+
className: "h-4 w-4 shrink-0 text-muted-foreground transition-transform group-open:rotate-90"
|
|
596
|
+
}
|
|
597
|
+
),
|
|
598
|
+
/* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1", children: summary })
|
|
599
|
+
]
|
|
600
|
+
}
|
|
601
|
+
),
|
|
602
|
+
/* @__PURE__ */ jsx(
|
|
603
|
+
"div",
|
|
604
|
+
{
|
|
605
|
+
className: cn(
|
|
606
|
+
variant === "bordered" ? "border-t border-border p-3" : "pl-6 pt-1"
|
|
607
|
+
),
|
|
608
|
+
children
|
|
609
|
+
}
|
|
610
|
+
)
|
|
611
|
+
]
|
|
612
|
+
}
|
|
613
|
+
);
|
|
614
|
+
}
|
|
555
615
|
var DialogThemeContext = React7.createContext(void 0);
|
|
556
616
|
function useDialogTheme(providedTheme) {
|
|
557
617
|
const contextTheme = React7.useContext(DialogThemeContext);
|
|
@@ -777,7 +837,7 @@ function Drawer({
|
|
|
777
837
|
setContainer(root ?? null);
|
|
778
838
|
}, []);
|
|
779
839
|
return /* @__PURE__ */ jsxs(Sheet, { open, onOpenChange: setOpen, children: [
|
|
780
|
-
/* @__PURE__ */ jsx(
|
|
840
|
+
/* @__PURE__ */ jsx("span", { ref: triggerWrapRef, className: "contents", children: /* @__PURE__ */ jsx(SheetTrigger, { asChild: true, children: trigger }) }),
|
|
781
841
|
/* @__PURE__ */ jsx(
|
|
782
842
|
SheetContent,
|
|
783
843
|
{
|
|
@@ -1048,7 +1108,7 @@ function CodeSnippet({ code, prompt, theme, className }) {
|
|
|
1048
1108
|
"pre",
|
|
1049
1109
|
{
|
|
1050
1110
|
className: cn(
|
|
1051
|
-
"min-w-0 flex-1 overflow-x-auto whitespace-pre px-4 py-3 text-left",
|
|
1111
|
+
"min-w-0 flex-1 overflow-x-auto whitespace-pre px-4 py-3 text-left [scrollbar-color:var(--border)_transparent] [scrollbar-width:thin]",
|
|
1052
1112
|
typography?.fontFamily ?? "font-jetbrains-mono",
|
|
1053
1113
|
typography?.fontSize ?? "text-sm",
|
|
1054
1114
|
typography?.fontWeight,
|
|
@@ -1110,17 +1170,150 @@ var Header3 = createHeading(
|
|
|
1110
1170
|
"scroll-m-20 text-2xl font-semibold tracking-normal",
|
|
1111
1171
|
(theme) => theme?.typography?.header3
|
|
1112
1172
|
);
|
|
1113
|
-
var
|
|
1173
|
+
var registry = globalThis;
|
|
1174
|
+
function setImageAttributesResolver(resolver) {
|
|
1175
|
+
registry.__frontlitImageResolver = resolver;
|
|
1176
|
+
}
|
|
1177
|
+
function resolveImageAttributes(input) {
|
|
1178
|
+
return registry.__frontlitImageResolver?.(input) ?? null;
|
|
1179
|
+
}
|
|
1180
|
+
var roundedMap = {
|
|
1181
|
+
0: "rounded-none",
|
|
1182
|
+
1: "rounded-sm",
|
|
1183
|
+
2: "rounded",
|
|
1184
|
+
3: "rounded-md",
|
|
1185
|
+
4: "rounded-lg",
|
|
1186
|
+
5: "rounded-xl",
|
|
1187
|
+
6: "rounded-2xl",
|
|
1188
|
+
7: "rounded-3xl",
|
|
1189
|
+
8: "rounded-full"
|
|
1190
|
+
};
|
|
1191
|
+
var objectFitClass = {
|
|
1192
|
+
cover: "object-cover",
|
|
1193
|
+
contain: "object-contain",
|
|
1194
|
+
fill: "object-fill",
|
|
1195
|
+
none: "object-none",
|
|
1196
|
+
"scale-down": "object-scale-down"
|
|
1197
|
+
};
|
|
1198
|
+
var Image2 = (props) => {
|
|
1199
|
+
const {
|
|
1200
|
+
src,
|
|
1201
|
+
alt = "",
|
|
1202
|
+
defaultImage,
|
|
1203
|
+
priority = false,
|
|
1204
|
+
loading = priority ? "eager" : "lazy",
|
|
1205
|
+
sizes,
|
|
1206
|
+
noDefaultImage = false,
|
|
1207
|
+
className = "",
|
|
1208
|
+
classes = "",
|
|
1209
|
+
width = "w-full",
|
|
1210
|
+
height = "h-auto",
|
|
1211
|
+
objectFit = "cover",
|
|
1212
|
+
borderRadius
|
|
1213
|
+
} = props;
|
|
1214
|
+
const source = src || defaultImage;
|
|
1215
|
+
const radiusClass = typeof borderRadius === "number" ? roundedMap[borderRadius] ?? "rounded" : borderRadius;
|
|
1216
|
+
if (!source) {
|
|
1217
|
+
if (noDefaultImage) return null;
|
|
1218
|
+
return /* @__PURE__ */ jsx(
|
|
1219
|
+
"div",
|
|
1220
|
+
{
|
|
1221
|
+
className: cn(
|
|
1222
|
+
"relative aspect-video overflow-hidden bg-muted",
|
|
1223
|
+
width,
|
|
1224
|
+
height,
|
|
1225
|
+
radiusClass,
|
|
1226
|
+
classes,
|
|
1227
|
+
className
|
|
1228
|
+
)
|
|
1229
|
+
}
|
|
1230
|
+
);
|
|
1231
|
+
}
|
|
1232
|
+
const optimized = resolveImageAttributes({ src: source, alt, sizes, priority });
|
|
1233
|
+
return /* @__PURE__ */ jsx(
|
|
1234
|
+
"div",
|
|
1235
|
+
{
|
|
1236
|
+
className: cn(
|
|
1237
|
+
"relative aspect-video overflow-hidden",
|
|
1238
|
+
width,
|
|
1239
|
+
height,
|
|
1240
|
+
radiusClass,
|
|
1241
|
+
classes,
|
|
1242
|
+
className
|
|
1243
|
+
),
|
|
1244
|
+
children: /* @__PURE__ */ jsx(
|
|
1245
|
+
"img",
|
|
1246
|
+
{
|
|
1247
|
+
src: source,
|
|
1248
|
+
alt,
|
|
1249
|
+
sizes,
|
|
1250
|
+
loading,
|
|
1251
|
+
decoding: "async",
|
|
1252
|
+
fetchPriority: priority ? "high" : void 0,
|
|
1253
|
+
...optimized,
|
|
1254
|
+
className: cn(
|
|
1255
|
+
"absolute inset-0 h-full w-full",
|
|
1256
|
+
radiusClass,
|
|
1257
|
+
objectFitClass[objectFit]
|
|
1258
|
+
)
|
|
1259
|
+
}
|
|
1260
|
+
)
|
|
1261
|
+
}
|
|
1262
|
+
);
|
|
1263
|
+
};
|
|
1264
|
+
var Image3 = ({
|
|
1114
1265
|
src,
|
|
1115
1266
|
alt = "",
|
|
1116
1267
|
className = "",
|
|
1117
1268
|
theme,
|
|
1269
|
+
priority = false,
|
|
1270
|
+
sizes,
|
|
1118
1271
|
...props
|
|
1119
1272
|
}) => {
|
|
1120
1273
|
const cardStyles = theme?.interactives?.card;
|
|
1121
1274
|
const classes = cn("w-full object-cover", cardStyles?.border?.radius, className);
|
|
1122
|
-
|
|
1275
|
+
const optimized = resolveImageAttributes({ src, alt, sizes, priority });
|
|
1276
|
+
return /* @__PURE__ */ jsx(
|
|
1277
|
+
"img",
|
|
1278
|
+
{
|
|
1279
|
+
src,
|
|
1280
|
+
alt,
|
|
1281
|
+
sizes,
|
|
1282
|
+
loading: priority ? "eager" : "lazy",
|
|
1283
|
+
decoding: "async",
|
|
1284
|
+
fetchPriority: priority ? "high" : void 0,
|
|
1285
|
+
className: classes,
|
|
1286
|
+
...props,
|
|
1287
|
+
...optimized
|
|
1288
|
+
}
|
|
1289
|
+
);
|
|
1123
1290
|
};
|
|
1291
|
+
function InlineCode({
|
|
1292
|
+
children,
|
|
1293
|
+
theme,
|
|
1294
|
+
variant = "default",
|
|
1295
|
+
className,
|
|
1296
|
+
...props
|
|
1297
|
+
}) {
|
|
1298
|
+
const typography = theme?.typography?.code;
|
|
1299
|
+
return /* @__PURE__ */ jsx(
|
|
1300
|
+
"code",
|
|
1301
|
+
{
|
|
1302
|
+
className: cn(
|
|
1303
|
+
// Code is literal: never inherit a theme's uppercase captions.
|
|
1304
|
+
"break-words normal-case",
|
|
1305
|
+
typography?.fontFamily ?? "font-jetbrains-mono",
|
|
1306
|
+
// Relative to the surrounding text; the theme's code size is for blocks.
|
|
1307
|
+
"text-[0.875em]",
|
|
1308
|
+
typography?.letterSpacing,
|
|
1309
|
+
variant === "default" ? "rounded bg-muted px-1 py-0.5 text-foreground" : "text-muted-foreground",
|
|
1310
|
+
className
|
|
1311
|
+
),
|
|
1312
|
+
...props,
|
|
1313
|
+
children
|
|
1314
|
+
}
|
|
1315
|
+
);
|
|
1316
|
+
}
|
|
1124
1317
|
var Input = React7.forwardRef(
|
|
1125
1318
|
({ className, type, ...props }, ref) => {
|
|
1126
1319
|
return /* @__PURE__ */ jsx(
|
|
@@ -1268,6 +1461,36 @@ var Link = ({
|
|
|
1268
1461
|
}
|
|
1269
1462
|
);
|
|
1270
1463
|
};
|
|
1464
|
+
var NativeSelect = React7__default.forwardRef(
|
|
1465
|
+
({ className, theme, children, ...props }, ref) => {
|
|
1466
|
+
const input = theme?.interactives?.input;
|
|
1467
|
+
const typography = theme?.typography?.input;
|
|
1468
|
+
return /* @__PURE__ */ jsx(
|
|
1469
|
+
"select",
|
|
1470
|
+
{
|
|
1471
|
+
ref,
|
|
1472
|
+
className: cn(
|
|
1473
|
+
"flex min-h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-base leading-normal text-foreground ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
|
|
1474
|
+
typography?.fontFamily,
|
|
1475
|
+
typography?.fontSize,
|
|
1476
|
+
typography?.fontWeight,
|
|
1477
|
+
typography?.letterSpacing,
|
|
1478
|
+
input?.padding?.x,
|
|
1479
|
+
input?.padding?.y,
|
|
1480
|
+
input?.border?.width,
|
|
1481
|
+
input?.border?.style,
|
|
1482
|
+
input?.border?.radius,
|
|
1483
|
+
input?.shadow,
|
|
1484
|
+
input?.custom,
|
|
1485
|
+
className
|
|
1486
|
+
),
|
|
1487
|
+
...props,
|
|
1488
|
+
children
|
|
1489
|
+
}
|
|
1490
|
+
);
|
|
1491
|
+
}
|
|
1492
|
+
);
|
|
1493
|
+
NativeSelect.displayName = "NativeSelect";
|
|
1271
1494
|
var PopoverThemeContext = React7.createContext(void 0);
|
|
1272
1495
|
function usePopoverTheme(providedTheme) {
|
|
1273
1496
|
const contextTheme = React7.useContext(PopoverThemeContext);
|
|
@@ -1459,7 +1682,9 @@ var Section = ({
|
|
|
1459
1682
|
"div",
|
|
1460
1683
|
{
|
|
1461
1684
|
className: cn(
|
|
1462
|
-
|
|
1685
|
+
// Clips like overflow-hidden without becoming a scroll
|
|
1686
|
+
// container, so sticky children (docs sidebars) still stick.
|
|
1687
|
+
"mx-auto z-[3] relative overflow-clip",
|
|
1463
1688
|
`lg:${theme?.structure?.page?.width || "max-w-6xl"}`,
|
|
1464
1689
|
theme?.structure?.section?.padding?.x || "px-4",
|
|
1465
1690
|
theme?.structure?.section?.padding?.y || "py-4"
|
|
@@ -1722,6 +1947,126 @@ var Switch2 = React7__default.forwardRef(({ className = "", theme, ...props }, r
|
|
|
1722
1947
|
);
|
|
1723
1948
|
return /* @__PURE__ */ jsx(Switch, { ref, className: classes, ...props });
|
|
1724
1949
|
});
|
|
1950
|
+
function Table({ columns, rows, theme, className }) {
|
|
1951
|
+
const typography = theme?.typography?.text2;
|
|
1952
|
+
const card = theme?.interactives?.card;
|
|
1953
|
+
const text = cn(
|
|
1954
|
+
typography?.fontFamily,
|
|
1955
|
+
typography?.fontSize ?? "text-sm",
|
|
1956
|
+
typography?.lineHeight,
|
|
1957
|
+
typography?.letterSpacing
|
|
1958
|
+
);
|
|
1959
|
+
return /* @__PURE__ */ jsx(
|
|
1960
|
+
"div",
|
|
1961
|
+
{
|
|
1962
|
+
className: cn(
|
|
1963
|
+
"w-full min-w-0 overflow-hidden border border-border",
|
|
1964
|
+
card?.border?.radius ?? "rounded-md",
|
|
1965
|
+
className
|
|
1966
|
+
),
|
|
1967
|
+
children: /* @__PURE__ */ jsxs("table", { className: cn("block w-full border-collapse md:table", text), children: [
|
|
1968
|
+
/* @__PURE__ */ jsx("thead", { className: "hidden md:table-header-group", children: /* @__PURE__ */ jsx("tr", { className: "border-b border-border bg-muted/50", children: columns.map((column) => /* @__PURE__ */ jsx(
|
|
1969
|
+
"th",
|
|
1970
|
+
{
|
|
1971
|
+
scope: "col",
|
|
1972
|
+
className: cn(
|
|
1973
|
+
"px-3 py-2 text-left font-medium text-muted-foreground",
|
|
1974
|
+
column.className
|
|
1975
|
+
),
|
|
1976
|
+
children: column.label
|
|
1977
|
+
},
|
|
1978
|
+
column.key
|
|
1979
|
+
)) }) }),
|
|
1980
|
+
/* @__PURE__ */ jsx("tbody", { className: "block md:table-row-group", children: rows.map((row, index) => /* @__PURE__ */ jsx(
|
|
1981
|
+
"tr",
|
|
1982
|
+
{
|
|
1983
|
+
className: "block border-b border-border px-3 py-2 last:border-b-0 md:table-row md:p-0",
|
|
1984
|
+
children: columns.map((column) => /* @__PURE__ */ jsx(
|
|
1985
|
+
"td",
|
|
1986
|
+
{
|
|
1987
|
+
"data-label": column.label,
|
|
1988
|
+
className: cn(
|
|
1989
|
+
"block min-w-0 break-words py-1 align-top text-foreground before:mr-2 before:text-muted-foreground before:content-[attr(data-label)':'] md:table-cell md:px-3 md:py-2 md:before:content-none",
|
|
1990
|
+
column.className
|
|
1991
|
+
),
|
|
1992
|
+
children: row[column.key]
|
|
1993
|
+
},
|
|
1994
|
+
column.key
|
|
1995
|
+
))
|
|
1996
|
+
},
|
|
1997
|
+
index
|
|
1998
|
+
)) })
|
|
1999
|
+
] })
|
|
2000
|
+
}
|
|
2001
|
+
);
|
|
2002
|
+
}
|
|
2003
|
+
function Tabs({ items, label, defaultIndex = 0, theme, className }) {
|
|
2004
|
+
const [active, setActive] = React7__default.useState(
|
|
2005
|
+
Math.min(Math.max(defaultIndex, 0), Math.max(items.length - 1, 0))
|
|
2006
|
+
);
|
|
2007
|
+
const id = React7__default.useId();
|
|
2008
|
+
const tabs = React7__default.useRef([]);
|
|
2009
|
+
const typography = theme?.typography?.text2;
|
|
2010
|
+
const select = (index) => {
|
|
2011
|
+
const next = (index + items.length) % items.length;
|
|
2012
|
+
setActive(next);
|
|
2013
|
+
tabs.current[next]?.focus();
|
|
2014
|
+
};
|
|
2015
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("flex min-w-0 flex-col gap-3", className), children: [
|
|
2016
|
+
/* @__PURE__ */ jsx(
|
|
2017
|
+
"div",
|
|
2018
|
+
{
|
|
2019
|
+
role: "tablist",
|
|
2020
|
+
"aria-label": label,
|
|
2021
|
+
className: "flex min-w-0 gap-1 overflow-x-auto overflow-y-hidden border-b border-border [scrollbar-width:none]",
|
|
2022
|
+
onKeyDown: (event) => {
|
|
2023
|
+
if (event.key === "ArrowRight") select(active + 1);
|
|
2024
|
+
else if (event.key === "ArrowLeft") select(active - 1);
|
|
2025
|
+
else if (event.key === "Home") select(0);
|
|
2026
|
+
else if (event.key === "End") select(items.length - 1);
|
|
2027
|
+
else return;
|
|
2028
|
+
event.preventDefault();
|
|
2029
|
+
},
|
|
2030
|
+
children: items.map((item, index) => /* @__PURE__ */ jsx(
|
|
2031
|
+
"button",
|
|
2032
|
+
{
|
|
2033
|
+
ref: (element) => {
|
|
2034
|
+
tabs.current[index] = element;
|
|
2035
|
+
},
|
|
2036
|
+
type: "button",
|
|
2037
|
+
role: "tab",
|
|
2038
|
+
id: `${id}-tab-${index}`,
|
|
2039
|
+
"aria-selected": index === active,
|
|
2040
|
+
"aria-controls": `${id}-panel-${index}`,
|
|
2041
|
+
tabIndex: index === active ? 0 : -1,
|
|
2042
|
+
onClick: () => setActive(index),
|
|
2043
|
+
className: cn(
|
|
2044
|
+
"shrink-0 whitespace-nowrap border-b-2 px-2 py-1.5 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring",
|
|
2045
|
+
typography?.fontFamily,
|
|
2046
|
+
typography?.fontSize ?? "text-sm",
|
|
2047
|
+
typography?.letterSpacing,
|
|
2048
|
+
index === active ? "border-primary font-medium text-foreground" : "border-transparent text-muted-foreground hover:text-foreground"
|
|
2049
|
+
),
|
|
2050
|
+
children: item.label
|
|
2051
|
+
},
|
|
2052
|
+
index
|
|
2053
|
+
))
|
|
2054
|
+
}
|
|
2055
|
+
),
|
|
2056
|
+
items.map((item, index) => /* @__PURE__ */ jsx(
|
|
2057
|
+
"div",
|
|
2058
|
+
{
|
|
2059
|
+
role: "tabpanel",
|
|
2060
|
+
id: `${id}-panel-${index}`,
|
|
2061
|
+
"aria-labelledby": `${id}-tab-${index}`,
|
|
2062
|
+
hidden: index !== active,
|
|
2063
|
+
className: "min-w-0",
|
|
2064
|
+
children: item.content
|
|
2065
|
+
},
|
|
2066
|
+
index
|
|
2067
|
+
))
|
|
2068
|
+
] });
|
|
2069
|
+
}
|
|
1725
2070
|
var Text1 = ({
|
|
1726
2071
|
children,
|
|
1727
2072
|
className = "",
|
|
@@ -3413,6 +3758,6 @@ var TooltipContent = React7.forwardRef(({ className, sideOffset = 6, theme: prov
|
|
|
3413
3758
|
});
|
|
3414
3759
|
TooltipContent.displayName = TooltipPrimitive.Content.displayName;
|
|
3415
3760
|
|
|
3416
|
-
export { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, Avatar, AvatarFallback, AvatarImage, Badge2 as Badge, Button, Button2, Caption, Checkbox, CodeSnippet, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Display, Drawer, DropdownMenu, DropdownMenuArrow, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Header1, Header2, Header3, Header4, Image2 as Image, Input2 as Input, Label3 as Label, Link, PageCard, PageCardContent, PageCardHeader, PageCardImage, Popover, PopoverAnchor, PopoverClose, PopoverContent, PopoverPortal, PopoverTrigger, Preheader, RadioGroup2 as RadioGroup, RadioGroupItem, Section, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator3 as Separator, Subheader1, Subheader2, Switch, Switch2, TAILWIND_TEXT_PX, Text1, Text2, Textarea, Tooltip, TooltipContent, TooltipPortal, TooltipProvider, TooltipTrigger, cn, createHeading, fluidFontSize, themes };
|
|
3417
|
-
//# sourceMappingURL=chunk-
|
|
3418
|
-
//# sourceMappingURL=chunk-
|
|
3761
|
+
export { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, Avatar, AvatarFallback, AvatarImage, Badge2 as Badge, Button, Button2, Caption, Checkbox, CodeSnippet, Collapsible, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Display, Drawer, DropdownMenu, DropdownMenuArrow, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Header1, Header2, Header3, Header4, Image2 as Image, Image3 as Image2, InlineCode, Input2 as Input, Label3 as Label, Link, NativeSelect, PageCard, PageCardContent, PageCardHeader, PageCardImage, Popover, PopoverAnchor, PopoverClose, PopoverContent, PopoverPortal, PopoverTrigger, Preheader, RadioGroup2 as RadioGroup, RadioGroupItem, Section, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator3 as Separator, Subheader1, Subheader2, Switch, Switch2, TAILWIND_TEXT_PX, Table, Tabs, Text1, Text2, Textarea, Tooltip, TooltipContent, TooltipPortal, TooltipProvider, TooltipTrigger, cn, createHeading, fluidFontSize, resolveImageAttributes, roundedMap, setImageAttributesResolver, themes };
|
|
3762
|
+
//# sourceMappingURL=chunk-KRQWGGAJ.js.map
|
|
3763
|
+
//# sourceMappingURL=chunk-KRQWGGAJ.js.map
|