@frontlit/page-builder 0.1.0-alpha.5 → 0.1.0-alpha.6

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server/page-renderer.tsx","../../src/registry-names.ts","../../src/renderer/generate-theme-styles.ts","../../src/primitives/lib/utils.ts","../../src/blocks/header/widget.tsx","../../src/components/image.tsx","../../src/primitives/components/ui/badge.tsx","../../src/primitives/badge.tsx","../../src/primitives/components/ui/button.tsx","../../src/primitives/button.tsx","../../src/primitives/caption.tsx","../../src/primitives/heading.tsx","../../src/primitives/header4.tsx","../../src/primitives/card.tsx","../../src/primitives/display.tsx","../../src/primitives/header1.tsx","../../src/primitives/header2.tsx","../../src/primitives/header3.tsx","../../src/primitives/link.tsx","../../src/primitives/preheader.tsx","../../src/primitives/section.tsx","../../src/models/media.ts","../../src/primitives/subheader1.tsx","../../src/primitives/text1.tsx","../../src/primitives/text2.tsx","../../src/blocks/header/header-link.tsx","../../src/blocks/header/github.ts","../../src/utils/generate-unique-id.ts","../../src/blocks/header/defaults.ts","../../src/blocks/_shared/title.ts","../../src/blocks/hero/widget.tsx","../../src/components/text-renderer.ts","../../src/utils/is-video.ts","../../src/blocks/hero/defaults.ts","../../src/blocks/content/widget.tsx","../../src/blocks/content/defaults.ts","../../src/blocks/featured/widget.tsx","../../src/blocks/featured/defaults.ts","../../src/blocks/faq/widget.tsx","../../src/blocks/faq/defaults.ts","../../src/blocks/pricing/widget.tsx","../../src/blocks/pricing/defaults.ts","../../src/blocks/banner/widget.tsx","../../src/blocks/banner/defaults.ts","../../src/blocks/email-form/widget.tsx","../../src/blocks/email-form/defaults.ts","../../src/blocks/support-form/widget.tsx","../../src/blocks/support-form/defaults.ts","../../src/blocks/footer/widget.tsx","../../src/blocks/footer/defaults.ts","../../src/blocks/rich-text/widget.tsx","../../src/blocks/rich-text/defaults.ts","../../src/blocks/grid/widget.tsx","../../src/blocks/grid/defaults.ts","../../src/blocks/media/widget.tsx","../../src/blocks/media/defaults.ts","../../src/blocks/marquee/widget.tsx","../../src/blocks/marquee/defaults.ts","../../src/blocks/embed/widget.tsx","../../src/blocks/embed/defaults.ts","../../src/blocks/code-snippet/widget.tsx","../../src/blocks/code-snippet/defaults.ts","../../src/blocks/data-slot/widget.tsx","../../src/server/registry.ts","../../src/data-slots.ts"],"sourcesContent":["import { useId, type ReactNode } from \"react\";\nimport type { PageData, Theme, WidgetInstance } from \"../models\";\nimport { LAYOUT_BLOCK_NAMES } from \"../registry-names\";\nimport { generateThemeStyles } from \"../renderer/generate-theme-styles\";\nimport { cn } from \"../primitives/lib/utils\";\nimport { serverBlockRegistry } from \"./registry\";\n\nexport interface ServerPageRendererProps {\n layout: WidgetInstance[];\n theme: Theme;\n pageData: PageData;\n /** Content rendered between the shared header and footer. */\n children?: ReactNode;\n /** Host-resolved data keyed by a generic data-slot's configured name. */\n dataSlots?: Record<string, ReactNode>;\n /** Light/dark control for the footer; a client component owned by the host. */\n themeSwitcher?: ReactNode;\n /** Extra content inside the themed root (e.g. a fixed \"Preview\" badge),\n * so it can use the theme's colours. */\n overlay?: ReactNode;\n className?: string;\n}\n\n/**\n * Server-component counterpart of `PageRenderer`. Static blocks render on\n * the server and ship no JavaScript; only the interactive parts (mobile menu,\n * marquee, forms, copy buttons, links) are client islands.\n *\n * Everything crossing into an island must be serialisable, so unlike\n * `PageRenderer` this takes no callbacks. Dark-mode styling is CSS-driven\n * (the `dark` class on an ancestor), so no resolved colour mode is needed.\n */\nexport function ServerPageRenderer({\n layout,\n theme,\n pageData,\n children,\n dataSlots,\n themeSwitcher,\n overlay,\n className,\n}: ServerPageRendererProps) {\n const themeScope = `pb-${useId().replace(/[^a-zA-Z0-9_-]/g, \"\")}`;\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 function renderInstance(instance: WidgetInstance) {\n const definition = serverBlockRegistry[instance.name];\n if (!definition) return null;\n\n const Widget = definition.widget;\n const settings = { ...definition.getDefaultSettings?.(), ...instance.settings };\n\n return (\n <Widget\n key={instance.widgetId}\n settings={settings}\n state={{ theme }}\n pageData={pageData}\n data={\n instance.name === \"data-slot\"\n ? dataSlots?.[String(settings.slot ?? \"\")]\n : undefined\n }\n themeSwitcher={instance.name === \"footer\" ? themeSwitcher : undefined}\n />\n );\n }\n\n return (\n <div\n data-pb-theme={themeScope}\n className={cn(\n \"pb-theme flex min-h-full flex-col bg-background text-foreground\",\n className,\n )}\n >\n {/* Emitted first so the variables exist before any content paints. */}\n <style>{generateThemeStyles(theme, `[data-pb-theme=\"${themeScope}\"]`)}</style>\n {header && renderInstance(header)}\n <div className=\"flex flex-1 flex-col\">\n {children !== undefined &&\n !body.some((instance) => instance.name === \"data-slot\")\n ? children\n : body.map(renderInstance)}\n </div>\n {footer && renderInstance(footer)}\n {overlay}\n </div>\n );\n}\n","/** Blocks placed outside the normal flow by the renderer. */\nexport const LAYOUT_BLOCK_NAMES = [\"header\", \"footer\"];\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","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import React from \"react\";\nimport clsx from \"clsx\";\nimport { Github } from \"lucide-react\";\nimport type { WidgetProps, ThemeStyle } from \"../../models\";\nimport type { HeaderSettings } from \"./settings\";\nimport { Image } from \"../../components/image\";\nimport { NavLink } from \"../../components/nav-link\";\nimport { Button, Header4, Section } from \"../../primitives\";\nimport { HeaderLink } from \"./header-link\";\nimport { HeaderMobileMenu } from \"./mobile-menu\";\nimport { GithubStars } from \"./github-stars\";\nimport { parseGithubRepo } from \"./github\";\n\nexport function HeaderWidget({\n settings: {\n logoCorners,\n links = [],\n ctaLabel,\n ctaHref,\n linkAlignment = \"left\",\n layout = \"fixed\",\n backdropBlur = false,\n githubRepo,\n showGithubStars,\n cssId,\n maxWidth,\n verticalPadding,\n background,\n },\n state: { theme },\n pageData,\n}: WidgetProps<HeaderSettings>) {\n const overriddenTheme: ThemeStyle = JSON.parse(JSON.stringify(theme.theme));\n overriddenTheme.structure.page.width = maxWidth || theme.theme.structure.page.width;\n overriddenTheme.structure.section.padding.y =\n verticalPadding || theme.theme.structure.section.padding.y;\n\n const isFloating = layout === \"floating\";\n const isCentered = layout === \"centered\";\n const isFixed = !isFloating;\n const primaryLinks = links.filter((link) => !link.isButton);\n const buttonLinks = links.filter((link) => link.isButton);\n // The logo and title always come from Branding; an unset one renders nothing.\n const resolvedLogoImage = pageData.siteLogoUrl;\n const resolvedLogoText = pageData.siteTitle;\n const resolvedLogoAlt = pageData.siteLogoAlt || resolvedLogoText || \"\";\n const effectiveLogoCorners = logoCorners ?? 2;\n const hasCta = Boolean(ctaLabel && ctaHref);\n const repo = parseGithubRepo(githubRepo);\n\n const logo = (\n <NavLink href=\"/\" className=\"no-underline\">\n <div className=\"flex items-center gap-2\">\n {resolvedLogoImage && (\n <Image\n src={resolvedLogoImage}\n alt={resolvedLogoAlt}\n width=\"w-8\"\n height=\"h-8\"\n sizes=\"32px\"\n className=\"aspect-square shrink-0\"\n borderRadius={effectiveLogoCorners}\n />\n )}\n {resolvedLogoText && (\n <Header4 theme={overriddenTheme} as=\"span\">\n {resolvedLogoText}\n </Header4>\n )}\n </div>\n </NavLink>\n );\n\n const ctaAndMenu = (\n <div className=\"flex items-center gap-3\">\n {repo && (\n <a\n href={`https://github.com/${repo}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <Button theme={overriddenTheme} variant=\"ghost\" size=\"sm\" className=\"gap-1.5\">\n <Github className=\"h-4 w-4\" aria-hidden />\n <span className=\"sr-only\">GitHub repository</span>\n {showGithubStars && <GithubStars repo={repo} />}\n </Button>\n </a>\n )}\n {buttonLinks.map((link) => (\n <div className=\"hidden lg:!block\" key={link.id}>\n <HeaderLink link={link} theme={overriddenTheme} />\n </div>\n ))}\n {hasCta && (\n <div className=\"hidden lg:!block\">\n <NavLink href={ctaHref}>\n <Button theme={overriddenTheme} size=\"sm\">\n {ctaLabel}\n </Button>\n </NavLink>\n </div>\n )}\n {(links.length > 0 || hasCta) && (\n <div className=\"lg:hidden\">\n <HeaderMobileMenu\n links={links}\n ctaLabel={ctaLabel}\n ctaHref={ctaHref}\n theme={overriddenTheme}\n />\n </div>\n )}\n </div>\n );\n\n let mainContent: React.ReactNode;\n if (isCentered) {\n // Logo centered, nav links split evenly left and right of it — the\n // symmetric header pattern seen on many modern SaaS marketing sites.\n const half = Math.ceil(primaryLinks.length / 2);\n const leftLinks = primaryLinks.slice(0, half);\n const rightLinks = primaryLinks.slice(half);\n mainContent = (\n <div className=\"grid w-full grid-cols-[1fr_auto_1fr] items-center gap-4\">\n <div className=\"hidden items-center justify-end gap-6 lg:!flex\">\n {leftLinks.map((link) => (\n <HeaderLink key={link.id} link={link} theme={overriddenTheme} />\n ))}\n </div>\n <div className=\"flex justify-center\">{logo}</div>\n <div className=\"flex items-center justify-end gap-3\">\n <div className=\"hidden items-center gap-6 lg:!flex\">\n {rightLinks.map((link) => (\n <HeaderLink key={link.id} link={link} theme={overriddenTheme} />\n ))}\n </div>\n {ctaAndMenu}\n </div>\n </div>\n );\n } else {\n mainContent = (\n <div className=\"flex w-full items-center justify-between gap-4\">\n {logo}\n <div\n className={clsx(\n \"hidden items-center gap-6 lg:!flex lg:!grow\",\n linkAlignment === \"right\"\n ? \"justify-end\"\n : linkAlignment === \"center\"\n ? \"justify-center\"\n : \"justify-start\",\n )}\n >\n {primaryLinks.map((link) => (\n <HeaderLink key={link.id} link={link} theme={overriddenTheme} />\n ))}\n </div>\n {ctaAndMenu}\n </div>\n );\n }\n\n return (\n <Section\n theme={overriddenTheme}\n component=\"header\"\n id={cssId}\n background={background}\n className={clsx(\n \"sticky top-0 z-20\",\n isFixed && \"border-b\",\n isFixed && backdropBlur && \"bg-transparent backdrop-blur-2xl\",\n isFixed && !backdropBlur && \"bg-background\",\n !isFixed && \"bg-transparent\",\n )}\n >\n {isFloating ? (\n <div\n className={clsx(\n \"p-2\",\n overriddenTheme.interactives?.card?.border?.width ?? \"border\",\n overriddenTheme.interactives?.card?.border?.radius ?? \"rounded-xl\",\n overriddenTheme.interactives?.card?.border?.style,\n overriddenTheme.interactives?.card?.shadow ?? \"shadow-md\",\n backdropBlur\n ? \"bg-transparent backdrop-blur-2xl\"\n : \"bg-card text-card-foreground\",\n )}\n >\n {mainContent}\n </div>\n ) : (\n mainContent\n )}\n </Section>\n );\n}\n","import type React from \"react\";\nimport { cn } from \"../primitives/lib/utils\";\n\nexport interface ImageAttributesInput {\n src: string;\n alt: string;\n sizes?: string;\n /** Above-the-fold image (e.g. LCP): fetched eagerly at high priority. */\n priority: boolean;\n}\n\n/**\n * Lets a host swap an image's `src`/`srcSet` for its own optimizer's URLs\n * (e.g. Next.js's `getImageProps`) without this package depending on the\n * host framework. Return `null` to keep the original URL.\n */\nexport type ImageAttributesResolver = (\n input: ImageAttributesInput,\n) => React.ImgHTMLAttributes<HTMLImageElement> | null;\n\nlet imageAttributesResolver: ImageAttributesResolver | null = null;\n\n/**\n * Registers the host's resolver. Call once at server start-up; renders that\n * run without one emit the original URL.\n */\nexport function setImageAttributesResolver(resolver: ImageAttributesResolver | null) {\n imageAttributesResolver = resolver;\n}\n\nexport type ImageObjectFit = \"cover\" | \"contain\" | \"fill\" | \"none\" | \"scale-down\";\n\nexport const roundedMap: Record<number, string> = {\n 0: \"rounded-none\",\n 1: \"rounded-sm\",\n 2: \"rounded\",\n 3: \"rounded-md\",\n 4: \"rounded-lg\",\n 5: \"rounded-xl\",\n 6: \"rounded-2xl\",\n 7: \"rounded-3xl\",\n 8: \"rounded-full\",\n};\n\ninterface ImgProps {\n src: string;\n classes?: string;\n alt?: string;\n defaultImage?: string;\n loading?: \"eager\" | \"lazy\";\n /** Marks the image as likely LCP: eager load with high fetch priority. */\n priority?: boolean;\n height?: string;\n sizes?: string;\n width?: string;\n borderRadius?: number | string;\n noDefaultImage?: boolean;\n className?: string;\n objectFit?: ImageObjectFit;\n}\n\nconst objectFitClass: Record<ImageObjectFit, string> = {\n cover: \"object-cover\",\n contain: \"object-contain\",\n fill: \"object-fill\",\n none: \"object-none\",\n \"scale-down\": \"object-scale-down\",\n};\n\nexport const Image = (props: ImgProps) => {\n const {\n src,\n alt = \"\",\n defaultImage,\n priority = false,\n loading = priority ? \"eager\" : \"lazy\",\n sizes,\n noDefaultImage = false,\n className = \"\",\n classes = \"\",\n width = \"w-full\",\n height = \"h-auto\",\n objectFit = \"cover\",\n borderRadius,\n } = props;\n const source = src || defaultImage;\n\n const radiusClass =\n typeof borderRadius === \"number\"\n ? (roundedMap[borderRadius] ?? \"rounded\")\n : borderRadius;\n\n if (!source) {\n if (noDefaultImage) return null;\n return (\n <div\n className={cn(\n \"relative aspect-video overflow-hidden bg-muted\",\n width,\n height,\n radiusClass,\n classes,\n className,\n )}\n />\n );\n }\n\n const optimized = imageAttributesResolver?.({ src: source, alt, sizes, priority });\n\n return (\n <div\n className={cn(\n \"relative aspect-video overflow-hidden\",\n width,\n height,\n radiusClass,\n classes,\n className,\n )}\n >\n <img\n src={source}\n alt={alt}\n sizes={sizes}\n loading={loading}\n decoding=\"async\"\n fetchPriority={priority ? \"high\" : undefined}\n {...optimized}\n className={cn(\n \"absolute inset-0 h-full w-full\",\n radiusClass,\n objectFitClass[objectFit],\n )}\n />\n </div>\n );\n};\n","import { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\nconst badgeVariants = cva(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground hover:bg-primary/80\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n destructive:\n \"border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80\",\n outline: \"text-foreground\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return <div className={cn(badgeVariants({ variant }), className)} {...props} />;\n}\n\nexport { Badge, badgeVariants };\n","import type React from \"react\";\nimport type { ThemeStyle } from \"../models\";\nimport {\n Badge as ShadcnBadge,\n type BadgeProps as ShadcnBadgeProps,\n} from \"./components/ui/badge\";\nimport { cn } from \"./lib/utils\";\n\nexport interface BadgeProps extends Omit<ShadcnBadgeProps, \"variant\"> {\n theme?: ThemeStyle;\n style?: Record<string, string>;\n variant?: \"default\" | \"secondary\" | \"destructive\" | \"outline\";\n}\n\nexport const Badge: React.FC<BadgeProps> = ({\n variant = \"default\",\n children,\n className = \"\",\n style = {},\n theme,\n ...props\n}) => {\n const typographyStyles = theme?.typography?.caption;\n const buttonStyles = theme?.interactives?.button;\n\n const classes = cn(\n // Base styles\n // \"bg-secondary\",\n // Theme typography from caption\n typographyStyles?.fontFamily,\n typographyStyles?.fontSize,\n typographyStyles?.fontWeight,\n typographyStyles?.lineHeight,\n typographyStyles?.letterSpacing,\n typographyStyles?.textTransform,\n buttonStyles?.border?.width,\n buttonStyles?.border?.radius,\n buttonStyles?.border?.style,\n className,\n );\n\n return (\n <ShadcnBadge\n variant={variant}\n className={classes}\n style={{\n ...style,\n backgroundColor: style.backgroundColor,\n color: style.color,\n }}\n {...props}\n >\n {children}\n </ShadcnBadge>\n );\n};\n","import { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary: \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n","import type React from \"react\";\nimport type { ThemeStyle } from \"../models\";\nimport {\n Button as ShadcnButton,\n type ButtonProps as ShadcnButtonProps,\n} from \"./components/ui/button\";\nimport { cn } from \"./lib/utils\";\n\nexport interface ButtonProps extends ShadcnButtonProps {\n theme?: ThemeStyle;\n}\n\nexport const Button: React.FC<ButtonProps> = ({\n variant = \"default\",\n size = \"default\",\n disabled = false,\n children,\n className = \"\",\n theme,\n ...props\n}) => {\n const buttonStyles = theme?.interactives?.button;\n const typographyStyles = theme?.typography?.button;\n const isIcon = size === \"icon\";\n\n const classes = cn(\n // Base styles\n \"\",\n // Theme typography\n typographyStyles?.fontFamily,\n typographyStyles?.fontSize,\n typographyStyles?.fontWeight,\n typographyStyles?.lineHeight,\n typographyStyles?.letterSpacing,\n typographyStyles?.textTransform,\n typographyStyles?.textDecoration,\n typographyStyles?.textOverflow,\n // Theme interactivity. Icon buttons stay square — CTA padding\n // would stretch them off the size=\"icon\" box.\n !isIcon && buttonStyles?.padding?.x,\n !isIcon && buttonStyles?.padding?.y,\n buttonStyles?.border?.width,\n buttonStyles?.border?.radius,\n buttonStyles?.border?.style,\n // buttonStyles?.border?.color,\n buttonStyles?.shadow,\n // Theme disabled states\n disabled && buttonStyles?.disabled?.opacity,\n disabled && buttonStyles?.disabled?.cursor,\n disabled && buttonStyles?.disabled?.color,\n disabled && buttonStyles?.disabled?.background,\n disabled && buttonStyles?.disabled?.border,\n // User overrides\n buttonStyles?.custom,\n className,\n );\n\n return (\n <ShadcnButton\n variant={variant}\n size={size}\n disabled={disabled}\n className={classes}\n {...props}\n >\n {children}\n </ShadcnButton>\n );\n};\n","import type React from \"react\";\nimport { cn } from \"./lib/utils\";\nimport type { TypographyProps } from \"./typography\";\n\nexport const Caption: React.FC<TypographyProps> = ({\n children,\n className = \"\",\n theme,\n ...props\n}) => {\n const typographyStyles = theme?.typography?.caption;\n const classes = cn(\n // Base styles\n \"text-xs leading-7 text-muted-foreground\",\n // Theme overrides\n typographyStyles?.fontFamily,\n typographyStyles?.fontSize,\n typographyStyles?.fontWeight,\n typographyStyles?.lineHeight,\n typographyStyles?.letterSpacing,\n typographyStyles?.textTransform,\n typographyStyles?.textDecoration,\n typographyStyles?.textOverflow,\n className,\n );\n\n return (\n <span className={classes} {...props}>\n {children}\n </span>\n );\n};\n","import type React from \"react\";\nimport type { ThemeStyle, Typography } from \"../models\";\nimport { cn } from \"./lib/utils\";\nimport type { TypographyProps } from \"./typography\";\n\nexport type HeadingTag = \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"span\" | \"div\";\n\nexport interface HeadingProps extends TypographyProps {\n /** Element to render. Lets a block pick its heading level independently of its look. */\n as?: HeadingTag;\n /**\n * Font-size classes that override the theme size. Kept apart from\n * `className` so they are merged before the theme's line-height, which\n * tailwind-merge would otherwise drop.\n */\n sizeClassName?: string;\n}\n\n// Phone and desktop widths the fluid size interpolates between.\nconst FLUID_MIN_VIEWPORT = 360;\nconst FLUID_MAX_VIEWPORT = 1280;\n\n/** px size of each Tailwind text size class. */\nexport const TAILWIND_TEXT_PX: Record<string, number> = {\n \"text-xs\": 12,\n \"text-sm\": 14,\n \"text-base\": 16,\n \"text-lg\": 18,\n \"text-xl\": 20,\n \"text-2xl\": 24,\n \"text-3xl\": 30,\n \"text-4xl\": 36,\n \"text-5xl\": 48,\n \"text-6xl\": 60,\n \"text-7xl\": 72,\n \"text-8xl\": 96,\n \"text-9xl\": 128,\n};\n\nconst rem = (px: number) => `${+(px / 16).toFixed(4)}rem`;\n\n/** CSS `clamp()` growing from `min` px on a phone to `max` px on a desktop. */\nexport function fluidFontSize({ min, max }: { min: number; max: number }): string {\n const slope = (max - min) / (FLUID_MAX_VIEWPORT - FLUID_MIN_VIEWPORT);\n const intercept = min - slope * FLUID_MIN_VIEWPORT;\n return `clamp(${rem(Math.min(min, max))}, ${rem(intercept)} + ${+(slope * 100).toFixed(4)}vw, ${rem(Math.max(min, max))})`;\n}\n\n/**\n * The theme's size for a level as a CSS value, exposed as `--pb-theme-size`\n * so a block's per-breakpoint overrides can fall back to it.\n */\nfunction themeSize(typography?: Typography): string | undefined {\n if (typography?.fluid) return fluidFontSize(typography.fluid);\n const px = TAILWIND_TEXT_PX[typography?.fontSize ?? \"\"];\n return px ? rem(px) : undefined;\n}\n\nexport function createHeading(\n displayName: string,\n defaultTag: HeadingTag,\n baseClasses: string,\n getTypography: (theme?: ThemeStyle) => Typography | undefined,\n): React.FC<HeadingProps> {\n const Heading: React.FC<HeadingProps> = ({\n children,\n className = \"\",\n theme,\n as: Tag = defaultTag,\n sizeClassName,\n style,\n ...props\n }) => {\n const typography = getTypography(theme);\n const fluid = typography?.fluid;\n const classes = cn(\n baseClasses,\n typography?.fontSize,\n // A class (not an inline font-size) so `sizeClassName` still wins.\n fluid && \"text-[length:var(--pb-theme-size)]\",\n sizeClassName,\n typography?.fontFamily,\n typography?.fontWeight,\n typography?.lineHeight,\n typography?.letterSpacing,\n typography?.textTransform,\n typography?.textDecoration,\n typography?.textOverflow,\n className,\n );\n\n return (\n <Tag\n className={classes}\n style={\n { \"--pb-theme-size\": themeSize(typography), ...style } as React.CSSProperties\n }\n {...props}\n >\n {children}\n </Tag>\n );\n };\n Heading.displayName = displayName;\n return Heading;\n}\n","import { createHeading } from \"./heading\";\n\nexport const Header4 = createHeading(\n \"Header4\",\n \"h4\",\n \"scroll-m-20 text-xl font-semibold tracking-normal\",\n (theme) => theme?.typography?.header4,\n);\n","import type React from \"react\";\nimport type { ThemeStyle } from \"../models\";\nimport { Header4 } from \"./header4\";\nimport { cn } from \"./lib/utils\";\n\nexport interface PageCardProps extends React.HTMLAttributes<HTMLDivElement> {\n isLink?: boolean;\n children: React.ReactNode;\n className?: string;\n theme?: ThemeStyle;\n}\n\nexport interface PageCardImageProps extends React.ImgHTMLAttributes<HTMLImageElement> {\n src: string;\n alt: string;\n className?: string;\n theme?: ThemeStyle;\n}\n\nexport interface PageCardContentProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n className?: string;\n theme?: ThemeStyle;\n}\n\nexport interface PageCardHeaderProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n className?: string;\n theme?: ThemeStyle;\n}\n\nexport const PageCard: React.FC<PageCardProps> = ({\n isLink,\n children,\n className = \"\",\n theme,\n ...props\n}) => {\n const cardStyles = theme?.interactives?.card;\n const classes = cn(\n // Base styles\n \"bg-card text-card-foreground\",\n // Theme interactivity\n cardStyles?.border?.width,\n cardStyles?.border?.radius,\n cardStyles?.border?.style,\n cardStyles?.shadow,\n isLink ? \"cursor-pointer\" : \"\",\n // User overrides\n cardStyles?.custom,\n className,\n );\n\n return (\n <div className={classes} {...props}>\n {children}\n </div>\n );\n};\n\nexport const PageCardImage: React.FC<PageCardImageProps> = ({\n src,\n alt,\n className = \"\",\n theme,\n ...props\n}) => {\n // const cardStyles = theme?.interactives?.card;\n const classes = cn(\n // Base styles\n \"w-full\",\n className,\n );\n\n return <img src={src} alt={alt} className={classes} {...props} />;\n};\n\nexport const PageCardContent: React.FC<PageCardContentProps> = ({\n children,\n className = \"\",\n theme,\n ...props\n}) => {\n const cardStyles = theme?.interactives?.card;\n const classes = cn(\n // Base styles\n \"p-4\",\n // Theme interactivity\n cardStyles?.padding?.x,\n cardStyles?.padding?.y,\n className,\n );\n\n return (\n <div className={classes} {...props}>\n {children}\n </div>\n );\n};\n\nexport const PageCardHeader: React.FC<PageCardHeaderProps> = ({\n children,\n className = \"\",\n theme,\n ...props\n}) => {\n const classes = cn(\n // Base styles\n \"pb-4\",\n className,\n );\n\n return (\n <div className={classes} {...props}>\n <Header4 theme={theme}>{children}</Header4>\n </div>\n );\n};\n","import { createHeading } from \"./heading\";\n\n/** Hero-sized headline, styled separately from section H1s. */\nexport const Display = createHeading(\n \"Display\",\n \"h1\",\n \"scroll-m-20 text-balance text-5xl font-bold tracking-tight\",\n (theme) => theme?.typography?.display ?? theme?.typography?.header1,\n);\n","import { createHeading } from \"./heading\";\n\nexport const Header1 = createHeading(\n \"Header1\",\n \"h1\",\n \"scroll-m-20 text-balance text-4xl font-bold tracking-tight\",\n (theme) => theme?.typography?.header1,\n);\n","import { createHeading } from \"./heading\";\n\nexport const Header2 = createHeading(\n \"Header2\",\n \"h2\",\n \"scroll-m-20 text-balance text-3xl font-bold tracking-tight\",\n (theme) => theme?.typography?.header2,\n);\n","import { createHeading } from \"./heading\";\n\nexport const Header3 = createHeading(\n \"Header3\",\n \"h3\",\n \"scroll-m-20 text-2xl font-semibold tracking-normal\",\n (theme) => theme?.typography?.header3,\n);\n","import type React from \"react\";\nimport type { ThemeStyle } from \"../models\";\nimport { cn } from \"./lib/utils\";\n\nexport interface LinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {\n children: React.ReactNode;\n className?: string;\n theme?: ThemeStyle;\n disabled?: boolean;\n style?: React.CSSProperties;\n}\n\nexport const Link: React.FC<LinkProps> = ({\n children,\n className = \"\",\n theme,\n disabled = false,\n style,\n ...props\n}) => {\n const typographyStyles = theme?.typography?.link;\n const linkStyles = theme?.interactives?.link;\n const classes = cn(\n // Base styles\n \"font-medium cursor-pointer\",\n // Theme typography\n typographyStyles?.fontFamily,\n typographyStyles?.fontSize,\n typographyStyles?.fontWeight,\n typographyStyles?.lineHeight,\n typographyStyles?.letterSpacing,\n typographyStyles?.textTransform,\n typographyStyles?.textDecoration,\n typographyStyles?.textOverflow,\n // Theme interactivity\n linkStyles?.padding?.x,\n linkStyles?.padding?.y,\n linkStyles?.border?.width,\n linkStyles?.border?.radius,\n linkStyles?.border?.style,\n // Theme disabled states\n disabled && linkStyles?.disabled?.color,\n disabled && linkStyles?.disabled?.background,\n disabled && linkStyles?.disabled?.border,\n disabled && linkStyles?.disabled?.opacity,\n disabled && linkStyles?.disabled?.cursor,\n // User overrides\n linkStyles?.custom,\n className,\n );\n\n return (\n <span\n className={classes}\n style={{\n ...style,\n textShadow: linkStyles?.textShadow || undefined,\n }}\n {...props}\n >\n {children}\n </span>\n );\n};\n","import type React from \"react\";\nimport { cn } from \"./lib/utils\";\nimport type { TypographyProps } from \"./typography\";\n\nexport const Preheader: React.FC<TypographyProps> = ({\n children,\n className = \"\",\n theme,\n ...props\n}) => {\n const typographyStyles = theme?.typography?.preheader;\n const classes = cn(\n // Base styles\n \"text-sm font-medium uppercase tracking-wide\",\n // Theme typography\n typographyStyles?.fontFamily,\n typographyStyles?.fontSize,\n typographyStyles?.fontWeight,\n typographyStyles?.lineHeight,\n typographyStyles?.letterSpacing,\n typographyStyles?.textTransform,\n typographyStyles?.textDecoration,\n typographyStyles?.textOverflow,\n className,\n );\n\n return (\n <p className={classes} {...props}>\n {children}\n </p>\n );\n};\n","import React from \"react\";\nimport type { SectionBackground, ThemeStyle } from \"../models\";\nimport { getMediaUrl } from \"../models/media\";\nimport { cn } from \"./lib/utils\";\n\ninterface SectionProps extends React.HTMLAttributes<HTMLElement> {\n children: React.ReactNode;\n className?: string;\n theme?: ThemeStyle;\n component?: \"header\" | \"footer\" | \"section\";\n background?: SectionBackground;\n}\n\ntype CssVars = React.CSSProperties & Record<`--${string}`, string | undefined>;\n\n/**\n * Dark-mode variants are resolved in CSS (`dark:` utilities reading custom\n * properties) rather than in JS, so a server-rendered section paints the\n * right palette without knowing the visitor's colour mode.\n */\nfunction resolveBackgroundLayer(background: SectionBackground): {\n className?: string;\n style: CssVars;\n} {\n const attachment = background.backgroundAttachment || \"scroll\";\n\n if (background.type === \"color\") {\n return {\n className:\n \"[background-color:var(--pb-bg)] dark:[background-color:var(--pb-bg-dark,var(--pb-bg))]\",\n style: {\n \"--pb-bg\": background.backgroundColor,\n \"--pb-bg-dark\": background.backgroundColorDark,\n },\n };\n }\n\n if (background.type === \"image\") {\n const bgUrl = getMediaUrl(background.media);\n return {\n style: {\n backgroundImage: bgUrl ? `url(${bgUrl})` : undefined,\n backgroundSize: background.backgroundSize || \"cover\",\n backgroundPosition: background.backgroundPosition || \"center\",\n backgroundRepeat: background.backgroundRepeat || \"no-repeat\",\n backgroundAttachment: attachment,\n maskImage: background.maskImage,\n WebkitMaskImage: background.maskImage,\n },\n };\n }\n\n // Pattern / gradient\n return {\n className:\n \"[background-image:var(--pb-bg-image)] dark:[background-image:var(--pb-bg-image-dark,var(--pb-bg-image))]\",\n style: {\n \"--pb-bg-image\": background.backgroundImage,\n \"--pb-bg-image-dark\": background.backgroundImageDark,\n backgroundSize: background.gradientBackgroundSize || \"cover\",\n backgroundPosition: background.gradientBackgroundPosition || \"center\",\n backgroundRepeat: background.gradientBackgroundRepeat || \"no-repeat\",\n backgroundAttachment: attachment,\n maskImage: background.gradientMaskImage,\n WebkitMaskImage: background.gradientMaskImage,\n },\n };\n}\n\nexport const Section: React.FC<SectionProps> = ({\n children,\n className = \"\",\n theme,\n background,\n component = \"section\",\n ...props\n}) => {\n const classes = cn(\n \"bg-background text-foreground relative\",\n component === \"section\" &&\n theme?.structure?.section?.dividers &&\n \"border-t border-border\",\n className,\n );\n const backgroundLayer = background ? resolveBackgroundLayer(background) : null;\n const isFixed =\n background &&\n background.type !== \"color\" &&\n background.backgroundAttachment === \"fixed\";\n\n return (\n <>\n {React.createElement(\n component as React.ElementType,\n {\n // `overflow-clip` keeps a fixed-attachment layer painted\n // only within the section bounds without creating a new\n // scroll container (unlike overflow-hidden in some cases).\n className: cn(classes, isFixed && \"overflow-clip\"),\n ...props,\n },\n <>\n {backgroundLayer && (\n <div\n aria-hidden\n className={cn(\n \"pointer-events-none absolute inset-0 z-0\",\n backgroundLayer.className,\n )}\n style={backgroundLayer.style}\n />\n )}\n {background && background.type === \"image\" && (\n <div\n aria-hidden\n className=\"pointer-events-none absolute inset-0 z-[1] [background-color:var(--pb-overlay)] dark:[background-color:var(--pb-overlay-dark,var(--pb-overlay))]\"\n style={\n {\n \"--pb-overlay\": background?.overlay?.color,\n \"--pb-overlay-dark\": background?.overlay?.colorDark,\n opacity: background?.overlay?.opacity\n ? background.overlay.opacity / 10\n : 0,\n mixBlendMode: background?.overlay?.blendMode,\n } as CssVars\n }\n />\n )}\n {background && background.type === \"image\" && (\n <div\n aria-hidden\n className=\"pointer-events-none absolute inset-0 z-[2]\"\n style={{\n backdropFilter: background?.blur\n ? `blur(${background?.blur}px)`\n : undefined,\n }}\n />\n )}\n <div\n className={cn(\n \"mx-auto z-[3] relative overflow-hidden\",\n `lg:${theme?.structure?.page?.width || \"max-w-6xl\"}`,\n theme?.structure?.section?.padding?.x || \"px-4\",\n theme?.structure?.section?.padding?.y || \"py-4\",\n )}\n >\n {children}\n </div>\n </>,\n )}\n </>\n );\n};\n","export interface Media {\n [key: string]: unknown;\n mediaId?: string;\n originalFileName?: string;\n fileName?: string;\n mimeType?: string;\n size?: number;\n caption?: string;\n alt?: string;\n /** Public URL of the asset (MediaLit format or generic URL format). */\n file?: string;\n url?: string;\n src?: string;\n /** Thumbnail URL, falls back to `file` or `url` when absent. */\n thumbnail?: string;\n thumbnailUrl?: string;\n}\n\nexport function getMediaUrl(media: unknown): string | null {\n if (!media) return null;\n if (typeof media === \"string\") return media.trim() || null;\n if (typeof media === \"object\") {\n const obj = media as Record<string, unknown>;\n const url = obj.url ?? obj.file ?? obj.src;\n return typeof url === \"string\" && url.trim() ? url.trim() : null;\n }\n return null;\n}\n\nexport function getMediaAlt(media: unknown): string {\n if (!media || typeof media !== \"object\") return \"\";\n const obj = media as Record<string, unknown>;\n const alt = obj.alt ?? obj.caption ?? obj.title;\n return typeof alt === \"string\" ? alt : \"\";\n}\n","import type React from \"react\";\nimport { cn } from \"./lib/utils\";\nimport type { TypographyProps } from \"./typography\";\n\nexport const Subheader1: React.FC<TypographyProps & { component?: \"h5\" | \"span\" }> = ({\n children,\n className = \"\",\n theme,\n component = \"h5\",\n ...props\n}) => {\n const typographyStyles = theme?.typography?.subheader1;\n const classes = cn(\n typographyStyles?.fontFamily || \"font-sans\",\n typographyStyles?.fontSize || \"text-lg\",\n typographyStyles?.fontWeight || \"font-medium\",\n typographyStyles?.lineHeight || \"leading-relaxed\",\n typographyStyles?.letterSpacing || \"tracking-normal\",\n typographyStyles?.textTransform,\n typographyStyles?.textDecoration,\n typographyStyles?.textOverflow,\n className,\n );\n\n return component === \"h5\" ? (\n <h5 className={classes} {...props}>\n {children}\n </h5>\n ) : (\n <span className={classes} {...props}>\n {children}\n </span>\n );\n};\n","import type React from \"react\";\nimport { cn } from \"./lib/utils\";\nimport type { TypographyProps } from \"./typography\";\n\nexport const Text1: React.FC<TypographyProps & { component?: \"p\" | \"span\" }> = ({\n children,\n className = \"\",\n theme,\n component = \"p\",\n ...props\n}) => {\n const typographyStyles = theme?.typography?.text1;\n const classes = cn(\n // Base styles\n \"text-base\",\n // Theme overrides\n typographyStyles?.fontFamily,\n typographyStyles?.fontSize,\n typographyStyles?.fontWeight,\n typographyStyles?.lineHeight,\n typographyStyles?.letterSpacing,\n typographyStyles?.textTransform,\n typographyStyles?.textDecoration,\n typographyStyles?.textOverflow,\n className,\n );\n\n return component === \"p\" ? (\n <p className={classes} {...props}>\n {children}\n </p>\n ) : (\n <span className={classes} {...props}>\n {children}\n </span>\n );\n};\n","import type React from \"react\";\nimport { cn } from \"./lib/utils\";\nimport type { TypographyProps } from \"./typography\";\n\nexport const Text2: React.FC<TypographyProps & { component?: \"p\" | \"span\" }> = ({\n children,\n className = \"\",\n theme,\n component = \"p\",\n ...props\n}) => {\n const typographyStyles = theme?.typography?.text2;\n const classes = cn(\n // Base styles\n \"text-sm\",\n // Theme overrides\n typographyStyles?.fontFamily,\n typographyStyles?.fontSize,\n typographyStyles?.fontWeight,\n typographyStyles?.lineHeight,\n typographyStyles?.letterSpacing,\n typographyStyles?.textTransform,\n typographyStyles?.textDecoration,\n typographyStyles?.textOverflow,\n className,\n );\n\n return component === \"p\" ? (\n <p className={classes} {...props}>\n {children}\n </p>\n ) : (\n <span className={classes} {...props}>\n {children}\n </span>\n );\n};\n","import type { ThemeStyle } from \"../../models\";\nimport type { HeaderNavLink } from \"./settings\";\nimport { NavLink } from \"../../components/nav-link\";\nimport { Button, Link as PrimitiveLink } from \"../../primitives\";\n\nexport function HeaderLink({\n link,\n theme,\n onClick,\n fullWidth = false,\n}: {\n link: HeaderNavLink;\n theme?: ThemeStyle;\n onClick?: () => void;\n /** Mobile menu: button links span the sheet, like the CTA. */\n fullWidth?: boolean;\n}) {\n if (link.isButton) {\n return (\n <NavLink href={link.href} onClick={onClick}>\n <Button\n size={fullWidth ? undefined : \"sm\"}\n theme={theme}\n className={fullWidth ? \"w-full\" : undefined}\n >\n {link.label}\n </Button>\n </NavLink>\n );\n }\n\n return (\n <NavLink href={link.href} onClick={onClick} className=\"no-underline\">\n <PrimitiveLink theme={theme} className=\"no-underline\">\n {link.label}\n </PrimitiveLink>\n </NavLink>\n );\n}\n","/** `owner/repo` from `owner/repo` or a `https://github.com/owner/repo` URL. */\nexport function parseGithubRepo(value?: string): string | undefined {\n const match = value\n ?.trim()\n .match(/^(?:https?:\\/\\/(?:www\\.)?github\\.com\\/)?([\\w.-]+\\/[\\w.-]+?)(?:\\.git)?\\/?$/);\n return match?.[1];\n}\n\n/** 1234 → \"1.2k\", like GitHub's own star count. */\nexport function formatStars(count: number): string {\n return new Intl.NumberFormat(\"en\", {\n notation: \"compact\",\n maximumFractionDigits: 1,\n })\n .format(count)\n .toLowerCase();\n}\n","export function generateUniqueId(): string {\n return Math.random().toString(36).slice(2) + Date.now().toString(36);\n}\n","import type { HeaderSettings } from \"./settings\";\nimport { generateUniqueId } from \"../../utils/generate-unique-id\";\n\nexport const headerDefaults: Partial<HeaderSettings> = {\n logoCorners: 2,\n links: [\n { id: generateUniqueId(), label: \"Features\", href: \"/#features\" },\n { id: generateUniqueId(), label: \"Pricing\", href: \"/#pricing\" },\n { id: generateUniqueId(), label: \"Docs\", href: \"/docs\" },\n { id: generateUniqueId(), label: \"Blog\", href: \"/blog\" },\n ],\n ctaLabel: \"Get started\",\n ctaHref: \"/help\",\n linkAlignment: \"left\",\n layout: \"fixed\",\n backdropBlur: false,\n // Slider value 1. Keeps a new header compact instead of inheriting the\n // theme's content-section padding (`py-12` / slider 5 on most themes).\n verticalPadding: \"py-4\",\n};\n","import React from \"react\";\nimport type { HeadingLevel, ResponsiveTextSize, ThemeStyle } from \"../../models\";\nimport { cn } from \"../../primitives/lib/utils\";\n\n/**\n * Props for a block title: its heading element plus the block's own size\n * overrides. Tablet and desktop use the `md` and `lg` breakpoints; a\n * breakpoint without an override keeps the theme size, read from the\n * heading's `--pb-theme-size`.\n */\nexport function titleProps(\n {\n titleLevel,\n titleSize,\n }: { titleLevel?: HeadingLevel; titleSize?: ResponsiveTextSize },\n defaultLevel: HeadingLevel = \"h2\",\n /** The block's own default size, e.g. a compact layout's `text-xl`. */\n baseSizeClassName?: string,\n): {\n as: HeadingLevel;\n sizeClassName: string;\n style: React.CSSProperties;\n} {\n const { mobile, tablet, desktop } = titleSize ?? {};\n const size = (value?: number) => (value ? `${value}px` : \"var(--pb-theme-size, 1em)\");\n return {\n as: titleLevel ?? defaultLevel,\n sizeClassName: cn(\n baseSizeClassName,\n mobile && \"text-[length:var(--pb-title-mobile)]\",\n (mobile || tablet) && \"md:text-[length:var(--pb-title-tablet)]\",\n (tablet || desktop) && \"lg:text-[length:var(--pb-title-desktop)]\",\n ),\n style: {\n \"--pb-title-mobile\": mobile ? size(mobile) : undefined,\n \"--pb-title-tablet\": mobile || tablet ? size(tablet) : undefined,\n \"--pb-title-desktop\": tablet || desktop ? size(desktop) : undefined,\n } as React.CSSProperties,\n };\n}\n\nconst HIGHLIGHT_CLASSES = {\n color: \"text-primary\",\n marker: \"bg-primary px-[0.15em] text-primary-foreground [box-decoration-break:clone]\",\n};\n\n/**\n * Renders a block title, making words wrapped in `*asterisks*` stand out\n * in the theme's highlight style, e.g. \"Run them *anywhere*\".\n */\nexport function renderTitle(title?: string, theme?: ThemeStyle): React.ReactNode {\n if (!title?.includes(\"*\")) return title;\n const className = HIGHLIGHT_CLASSES[theme?.highlight ?? \"color\"];\n return title\n .split(/(\\*[^*]+\\*)/)\n .map((part, index) =>\n /^\\*[^*]+\\*$/.test(part)\n ? React.createElement(\"span\", { key: index, className }, part.slice(1, -1))\n : part,\n );\n}\n","import React from \"react\";\nimport type { WidgetProps } from \"../../models\";\nimport type { ThemeStyle } from \"../../models\";\nimport { getMediaUrl, getMediaAlt } from \"../../models/media\";\nimport type { HeroSettings } from \"./settings\";\nimport { renderTitle, titleProps } from \"../_shared/title\";\nimport { Image } from \"../../components/image\";\nimport { NavLink } from \"../../components/nav-link\";\nimport { TextRenderer } from \"../../components/text-renderer\";\nimport { VideoWithPreview } from \"../../components/video-with-preview\";\nimport { CodeSnippet } from \"../../primitives/code-snippet\";\nimport { isVideo } from \"../../utils\";\nimport clsx from \"clsx\";\nimport {\n Button,\n Caption,\n Display,\n Preheader,\n Subheader1,\n Section,\n PageCard,\n PageCardContent,\n} from \"../../primitives\";\n\nconst roundedMap: Record<number, string> = {\n 0: \"rounded-none\",\n 1: \"rounded-sm\",\n 2: \"rounded\",\n 3: \"rounded-md\",\n 4: \"rounded-lg\",\n 5: \"rounded-xl\",\n 6: \"rounded-2xl\",\n 7: \"rounded-3xl\",\n 8: \"rounded-full\",\n};\n\nexport function HeroWidget({\n settings: {\n preTitle,\n title,\n description,\n buttonCaption,\n buttonAction,\n media,\n youtubeLink,\n alignment = \"right\",\n mediaRadius = 3,\n contentAlignment = \"left\",\n secondaryButtonAction,\n secondaryButtonCaption,\n smallPrint,\n command,\n titleLevel,\n titleSize,\n cssId,\n maxWidth,\n verticalPadding,\n background,\n layout = \"normal\",\n },\n state: { theme },\n}: WidgetProps<HeroSettings>) {\n const overriddenTheme: ThemeStyle = JSON.parse(JSON.stringify(theme.theme));\n overriddenTheme.structure.page.width = maxWidth || theme.theme.structure.page.width;\n overriddenTheme.structure.section.padding.y =\n verticalPadding || theme.theme.structure.section.padding.y;\n\n const mediaUrl = getMediaUrl(media);\n const hasHeroGraphic = Boolean(youtubeLink || mediaUrl);\n const direction = alignment === \"right\" ? \"md:!flex-row-reverse\" : \"md:!flex-row\";\n const isCentered = layout === \"centered\" || layout === \"media-below\";\n\n const graphic = hasHeroGraphic && (\n <div\n className={`w-full overflow-hidden ${roundedMap[mediaRadius] ?? \"rounded-md\"}`}\n >\n {isVideo(youtubeLink, media) ? (\n <VideoWithPreview\n videoUrl={youtubeLink || mediaUrl || \"\"}\n title={getMediaAlt(media) || (media as any)?.caption || \"\"}\n thumbnailUrl={(media as any)?.thumbnail || (media as any)?.thumbnailUrl || \"\"}\n />\n ) : (\n <Image\n src={mediaUrl || \"\"}\n alt={getMediaAlt(media)}\n borderRadius={mediaRadius}\n // The hero sits at the top of the page, so its image is the LCP.\n priority\n />\n )}\n </div>\n );\n\n const textContent = (\n <div\n className={clsx(\n \"flex flex-col gap-4\",\n isCentered || contentAlignment === \"center\"\n ? \"items-center text-center\"\n : \"items-start justify-center h-full\",\n )}\n >\n {preTitle && (\n <Preheader theme={overriddenTheme} className=\"text-muted-foreground\">\n {preTitle}\n </Preheader>\n )}\n <Display theme={overriddenTheme} {...titleProps({ titleLevel, titleSize }, \"h1\")}>\n {renderTitle(title, overriddenTheme)}\n </Display>\n {description && (\n <Subheader1 theme={overriddenTheme} component=\"span\">\n <TextRenderer json={description} theme={overriddenTheme} />\n </Subheader1>\n )}\n <div\n className={clsx(\n \"flex flex-col md:!flex-row gap-2 w-full\",\n (isCentered || contentAlignment === \"center\") && \"md:!justify-center\",\n )}\n >\n {buttonAction && buttonCaption && (\n <NavLink href={buttonAction}>\n <Button theme={overriddenTheme} className=\"w-full md:min-w-[150px]\">\n {buttonCaption}\n </Button>\n </NavLink>\n )}\n {secondaryButtonAction && secondaryButtonCaption && (\n <NavLink href={secondaryButtonAction}>\n <Button\n theme={overriddenTheme}\n variant=\"secondary\"\n className=\"w-full md:min-w-[150px]\"\n >\n {secondaryButtonCaption}\n </Button>\n </NavLink>\n )}\n </div>\n {command && (\n <CodeSnippet\n code={command}\n prompt=\"$\"\n theme={overriddenTheme}\n className=\"max-w-xl\"\n />\n )}\n {smallPrint && <Caption theme={overriddenTheme}>{smallPrint}</Caption>}\n </div>\n );\n\n let mainContent: React.ReactNode;\n if (layout === \"centered\") {\n // Text-only, no media — the minimalist SaaS hero (Linear, Vercel).\n mainContent = (\n <div className=\"mx-auto flex max-w-2xl flex-col gap-4\">{textContent}</div>\n );\n } else if (layout === \"media-below\") {\n // Centered headline with a large screenshot/media beneath it — the\n // classic \"product hero\" pattern (Stripe, Vercel, Linear).\n mainContent = (\n <div className=\"flex flex-col gap-10\">\n <div className=\"mx-auto flex max-w-2xl flex-col gap-4\">{textContent}</div>\n {graphic && <div className=\"w-full\">{graphic}</div>}\n </div>\n );\n } else {\n mainContent = (\n <div className={clsx(\"flex flex-col gap-8\", direction)}>\n {graphic && <div className=\"w-full md:w-1/2 flex items-center\">{graphic}</div>}\n <div className={`w-full ${hasHeroGraphic ? \"md:w-1/2\" : \"\"}`}>\n {textContent}\n </div>\n </div>\n );\n }\n\n return (\n <Section theme={overriddenTheme} id={cssId} background={background}>\n {layout === \"card\" ? (\n <PageCard theme={overriddenTheme}>\n <PageCardContent theme={overriddenTheme}>{mainContent}</PageCardContent>\n </PageCard>\n ) : (\n mainContent\n )}\n </Section>\n );\n}\n","// Rich-text rendering lives in @frontlit/text-editor.\nexport { TextRenderer } from \"@frontlit/text-editor/renderer\";\n","import type { Media } from \"../models\";\n\nexport function isVideo(youtubeLink?: string, media?: Partial<Media>) {\n return Boolean(\n youtubeLink || (media && RegExp(\"video/\").test(media?.mimeType || \"\")),\n );\n}\n","import type { HeroSettings } from \"./settings\";\n\nexport const heroDefaults: Partial<HeroSettings> = {\n title: \"Run your whole business from one front office\",\n buttonCaption: \"See features\",\n buttonAction: \"/#features\",\n secondaryButtonCaption: \"Read the docs\",\n secondaryButtonAction: \"/docs\",\n alignment: \"right\",\n contentAlignment: \"left\",\n mediaRadius: 3,\n layout: \"normal\",\n};\n","import React from \"react\";\nimport clsx from \"clsx\";\nimport type { WidgetProps, ThemeStyle } from \"../../models\";\nimport { getMediaUrl, getMediaAlt } from \"../../models/media\";\nimport type { ContentSettings } from \"./settings\";\nimport { renderTitle, titleProps } from \"../_shared/title\";\nimport { Image } from \"../../components/image\";\nimport { TextRenderer } from \"../../components/text-renderer\";\nimport { Header2, Section } from \"../../primitives\";\n\nconst roundedMap: Record<number, string> = {\n 0: \"rounded-none\",\n 1: \"rounded-sm\",\n 2: \"rounded\",\n 3: \"rounded-md\",\n 4: \"rounded-lg\",\n 5: \"rounded-xl\",\n 6: \"rounded-2xl\",\n 7: \"rounded-3xl\",\n 8: \"rounded-full\",\n};\n\nexport function ContentWidget({\n settings: {\n title,\n titleLevel,\n titleSize,\n body,\n media,\n alignment = \"left\",\n headerAlignment = \"left\",\n mediaRadius = 3,\n layout = \"side\",\n cssId,\n maxWidth,\n verticalPadding,\n background,\n },\n state: { theme },\n}: WidgetProps<ContentSettings>) {\n const overriddenTheme: ThemeStyle = JSON.parse(JSON.stringify(theme.theme));\n overriddenTheme.structure.page.width = maxWidth || theme.theme.structure.page.width;\n overriddenTheme.structure.section.padding.y =\n verticalPadding || theme.theme.structure.section.padding.y;\n\n const mediaUrl = getMediaUrl(media);\n const mediaAlt = getMediaAlt(media);\n const hasMedia = Boolean(mediaUrl);\n const sideBySide = layout !== \"stacked\" && layout !== \"overlay\";\n const direction = alignment === \"right\" ? \"md:!flex-row-reverse\" : \"md:!flex-row\";\n\n if (layout === \"overlay\") {\n // Media fills the section as a background; the text sits in a card\n // on top — a \"feature spotlight\" pattern common on product pages.\n const textPosition =\n alignment === \"right\" ? \"items-end text-right\" : \"items-start text-left\";\n return (\n <Section theme={overriddenTheme} id={cssId} background={background}>\n <div className=\"relative min-h-[420px] w-full overflow-hidden rounded-xl\">\n {hasMedia && (\n <Image\n src={mediaUrl || \"\"}\n alt={mediaAlt}\n width=\"w-full\"\n height=\"h-full\"\n className=\"absolute inset-0\"\n borderRadius={0}\n />\n )}\n <div className=\"absolute inset-0 bg-gradient-to-t from-black/70 via-black/20 to-transparent\" />\n <div\n className={clsx(\n \"relative flex h-full flex-col justify-end gap-4 p-6 md:p-10\",\n textPosition,\n )}\n >\n <div className=\"max-w-lg text-white\">\n {title && (\n <Header2\n theme={overriddenTheme}\n {...titleProps({ titleLevel, titleSize })}\n >\n {renderTitle(title, overriddenTheme)}\n </Header2>\n )}\n {body && <TextRenderer json={body} theme={overriddenTheme} />}\n </div>\n </div>\n </div>\n </Section>\n );\n }\n\n return (\n <Section theme={overriddenTheme} id={cssId} background={background}>\n <div className={clsx(\"flex flex-col gap-8\", sideBySide && direction)}>\n {hasMedia && (\n <div className={clsx(\"flex w-full items-center\", sideBySide && \"md:w-1/2\")}>\n <div\n className={`w-full overflow-hidden ${\n roundedMap[mediaRadius] ?? \"rounded-md\"\n }`}\n >\n <Image src={mediaUrl || \"\"} alt={mediaAlt} borderRadius={mediaRadius} />\n </div>\n </div>\n )}\n <div className={clsx(\"w-full\", hasMedia && sideBySide && \"md:w-1/2\")}>\n <div\n className={clsx(\n \"flex h-full flex-col justify-center gap-4\",\n headerAlignment === \"center\" ? \"items-center text-center\" : \"items-start\",\n )}\n >\n {title && (\n <Header2\n theme={overriddenTheme}\n {...titleProps({ titleLevel, titleSize })}\n >\n {renderTitle(title, overriddenTheme)}\n </Header2>\n )}\n {body && <TextRenderer json={body} theme={overriddenTheme} />}\n </div>\n </div>\n </div>\n </Section>\n );\n}\n","import type { ContentSettings } from \"./settings\";\n\nexport const contentDefaults: Partial<ContentSettings> = {\n title: \"One dashboard, every channel\",\n body: {\n type: \"doc\",\n content: [\n {\n type: \"paragraph\",\n content: [\n {\n type: \"text\",\n text: \"FrontLit brings your website, content, customer support, and audience engagement into one connected front office.\",\n },\n ],\n },\n ],\n },\n alignment: \"left\",\n headerAlignment: \"left\",\n mediaRadius: 3,\n};\n","import React from \"react\";\nimport clsx from \"clsx\";\nimport * as Icons from \"lucide-react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport type { ThemeStyle, WidgetProps } from \"../../models\";\nimport type { FeaturedSettings } from \"./settings\";\nimport { renderTitle, titleProps } from \"../_shared/title\";\nimport { TextRenderer } from \"../../components/text-renderer\";\nimport {\n Header1,\n Header4,\n PageCard,\n PageCardContent,\n Section,\n Subheader1,\n Text2,\n} from \"../../primitives\";\n\n/**\n * Resolves a lucide-react icon by name, falling back to a safe default when\n * the configured name doesn't match a known icon (e.g. a typo in settings).\n */\nfunction resolveIcon(name?: string): LucideIcon {\n if (!name) return Icons.Sparkles;\n const icon = (Icons as unknown as Record<string, LucideIcon>)[name];\n // Lucide icons are `React.forwardRef` components (objects), not plain\n // functions, so we can't gate on `typeof icon === \"function\"` here.\n return icon ?? Icons.Sparkles;\n}\n\nexport function FeaturedWidget({\n settings: {\n title,\n titleLevel,\n titleSize,\n description,\n headerAlignment = \"center\",\n items,\n layout = \"grid\",\n cssId,\n maxWidth,\n verticalPadding,\n background,\n },\n state: { theme },\n}: WidgetProps<FeaturedSettings>) {\n const overriddenTheme: ThemeStyle = JSON.parse(JSON.stringify(theme.theme));\n overriddenTheme.structure.page.width = maxWidth || theme.theme.structure.page.width;\n overriddenTheme.structure.section.padding.y =\n verticalPadding || theme.theme.structure.section.padding.y;\n\n return (\n <Section theme={overriddenTheme} id={cssId} background={background}>\n <div className=\"flex flex-col gap-8\">\n <div\n className={clsx(\n \"flex flex-col gap-4\",\n headerAlignment === \"center\" ? \"items-center text-center\" : \"items-start\",\n )}\n >\n <Header1 theme={overriddenTheme} {...titleProps({ titleLevel, titleSize })}>\n {renderTitle(title, overriddenTheme)}\n </Header1>\n {description && (\n <Subheader1 theme={overriddenTheme} component=\"span\">\n <TextRenderer json={description} theme={overriddenTheme} />\n </Subheader1>\n )}\n </div>\n {items && items.length > 0 && layout === \"numbered\" && (\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8\">\n {items.map((item, index) => (\n <div key={index} className=\"flex flex-col gap-2\">\n <span className=\"text-3xl font-bold text-primary/30\">\n {String(index + 1).padStart(2, \"0\")}\n </span>\n <Header4 theme={overriddenTheme}>{item.title}</Header4>\n {item.description && (\n <Text2 theme={overriddenTheme}>{item.description}</Text2>\n )}\n </div>\n ))}\n </div>\n )}\n {items && items.length > 0 && layout !== \"numbered\" && (\n <div\n className={clsx(\n layout === \"list\" && \"flex flex-col gap-4\",\n layout === \"compact\" &&\n \"grid grid-cols-2 md:grid-cols-4 gap-4 items-stretch\",\n layout !== \"list\" &&\n layout !== \"compact\" &&\n \"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6 items-stretch\",\n )}\n >\n {items.map((item, index) => {\n const Icon = resolveIcon(item.icon);\n return (\n <PageCard key={index} theme={overriddenTheme}>\n <PageCardContent\n theme={overriddenTheme}\n className={clsx(\n \"h-full flex gap-3\",\n layout === \"list\" ? \"flex-row items-start\" : \"flex-col\",\n layout === \"compact\" && \"items-center text-center gap-2\",\n )}\n >\n <div\n className={clsx(\n \"flex shrink-0 items-center justify-center rounded-md bg-primary/10 text-primary\",\n layout === \"compact\" ? \"h-8 w-8\" : \"h-10 w-10\",\n )}\n >\n <Icon className=\"h-5 w-5\" />\n </div>\n <div\n className={clsx(\n \"flex flex-col gap-2\",\n layout === \"compact\" && \"items-center gap-1\",\n )}\n >\n <Header4 theme={overriddenTheme}>{item.title}</Header4>\n {item.description && layout !== \"compact\" && (\n <Text2 theme={overriddenTheme}>{item.description}</Text2>\n )}\n </div>\n </PageCardContent>\n </PageCard>\n );\n })}\n </div>\n )}\n </div>\n </Section>\n );\n}\n","import type { FeaturedSettings } from \"./settings\";\n\nexport const featuredDefaults: Partial<FeaturedSettings> = {\n title: \"Everything you need to run your business online\",\n headerAlignment: \"center\",\n items: [\n {\n title: \"Website\",\n description: \"Design and publish beautiful pages with a drag-and-drop editor.\",\n icon: \"Globe\",\n },\n {\n title: \"Content\",\n description:\n \"Publish articles, documentation, and product updates from one content system.\",\n icon: \"Newspaper\",\n },\n {\n title: \"Support\",\n description:\n \"Support customers with a shared inbox, ticketing, help center, and AI answers.\",\n icon: \"LifeBuoy\",\n },\n {\n title: \"Engage\",\n description: \"Grow your audience and send email without leaving FrontLit.\",\n icon: \"Mail\",\n },\n ],\n};\n","import React, { useId } from \"react\";\nimport clsx from \"clsx\";\nimport { ChevronDown } from \"lucide-react\";\nimport type { WidgetProps, ThemeStyle } from \"../../models\";\nimport type { FaqSettings } from \"./settings\";\nimport { renderTitle, titleProps } from \"../_shared/title\";\nimport { Header2, Section, Text1 } from \"../../primitives\";\n\nexport function FaqWidget({\n settings: {\n title,\n titleLevel,\n titleSize,\n headerAlignment = \"left\",\n items = [],\n layout = \"list\",\n cssId,\n maxWidth,\n verticalPadding,\n background,\n },\n state: { theme },\n}: WidgetProps<FaqSettings>) {\n const overriddenTheme: ThemeStyle = JSON.parse(JSON.stringify(theme.theme));\n overriddenTheme.structure.page.width = maxWidth || theme.theme.structure.page.width;\n overriddenTheme.structure.section.padding.y =\n verticalPadding || theme.theme.structure.section.padding.y;\n\n // Native <details> keeps every answer in the server-rendered HTML (so\n // crawlers see it) and works without JS; a shared `name` makes them an\n // exclusive accordion.\n const groupName = useId();\n\n return (\n <Section theme={overriddenTheme} id={cssId} background={background}>\n <div className=\"flex flex-col gap-6\">\n {title && (\n <div\n className={clsx(\n \"flex flex-col\",\n headerAlignment === \"center\" ? \"items-center text-center\" : \"items-start\",\n )}\n >\n <Header2 theme={overriddenTheme} {...titleProps({ titleLevel, titleSize })}>\n {renderTitle(title, overriddenTheme)}\n </Header2>\n </div>\n )}\n {items.length > 0 &&\n (() => {\n const renderItem = (item: (typeof items)[number], index: number) => (\n <details\n key={item.id}\n name={groupName}\n open={index === 0}\n className={clsx(\n \"group\",\n layout === \"cards\"\n ? \"rounded-lg border border-border bg-card px-4 py-4\"\n : layout === \"columns\"\n ? \"border-b border-border py-4\"\n : \"py-4\",\n )}\n >\n <summary className=\"flex w-full cursor-pointer list-none items-center justify-between gap-4 text-left [&::-webkit-details-marker]:hidden\">\n <Text1 theme={overriddenTheme} className=\"font-medium\">\n {item.question}\n </Text1>\n <ChevronDown className=\"h-4 w-4 shrink-0 transition-transform group-open:rotate-180\" />\n </summary>\n <div className=\"pt-3\">\n <Text1 theme={overriddenTheme} className=\"text-muted-foreground\">\n {item.answer}\n </Text1>\n </div>\n </details>\n );\n\n if (layout === \"columns\") {\n // Two side-by-side lists — the left column gets\n // the first half of items, the right column the\n // rest, a common layout for FAQ sections with\n // many questions.\n const half = Math.ceil(items.length / 2);\n const left = items.slice(0, half);\n const right = items.slice(half);\n return (\n <div className=\"grid grid-cols-1 gap-x-10 md:grid-cols-2\">\n <div className=\"flex flex-col\">\n {left.map((item, i) => renderItem(item, i))}\n </div>\n <div className=\"flex flex-col\">\n {right.map((item, i) => renderItem(item, half + i))}\n </div>\n </div>\n );\n }\n\n return (\n <div\n className={\n layout === \"cards\"\n ? \"flex flex-col gap-3\"\n : \"flex flex-col divide-y divide-border border-b border-t border-border\"\n }\n >\n {items.map((item, index) => renderItem(item, index))}\n </div>\n );\n })()}\n </div>\n </Section>\n );\n}\n","import type { FaqSettings } from \"./settings\";\nimport { generateUniqueId } from \"../../utils/generate-unique-id\";\n\nexport const faqDefaults: Partial<FaqSettings> = {\n title: \"Frequently asked questions\",\n headerAlignment: \"left\",\n items: [\n {\n id: generateUniqueId(),\n question: \"What can I build with FrontLit?\",\n answer:\n \"A marketing website, articles, documentation, product updates, customer support, and email — all from one connected dashboard.\",\n },\n {\n id: generateUniqueId(),\n question: \"Do I need to know how to code?\",\n answer:\n \"No. Every page is assembled from ready-made blocks like this one, and you can customize copy, media and layout without touching code.\",\n },\n {\n id: generateUniqueId(),\n question: \"Can I use my own domain?\",\n answer:\n \"Yes, every FrontLit site can be connected to a custom domain in a few clicks.\",\n },\n {\n id: generateUniqueId(),\n question: \"Is there a free plan?\",\n answer: \"Yes, you can get started for free and upgrade as your audience grows.\",\n },\n ],\n};\n","import React from \"react\";\nimport clsx from \"clsx\";\nimport type { ThemeStyle, WidgetProps } from \"../../models\";\nimport type { PricingSettings, PricingTier } from \"./settings\";\nimport { PricingPeriodSwitch } from \"./period-switch\";\nimport { renderTitle, titleProps } from \"../_shared/title\";\nimport { NavLink } from \"../../components/nav-link\";\nimport { TextRenderer } from \"../../components/text-renderer\";\nimport {\n Badge,\n Button,\n Header1,\n PageCard,\n PageCardContent,\n PageCardHeader,\n Preheader,\n Section,\n Subheader1,\n Text1,\n Text2,\n} from \"../../primitives\";\n\n// Static class names so Tailwind keeps them. 4+ plans wrap at 4 per row.\nconst lgColumns: Record<number, string> = {\n 1: \"lg:grid-cols-1\",\n 2: \"lg:grid-cols-2\",\n 3: \"lg:grid-cols-3\",\n 4: \"lg:grid-cols-4\",\n};\n\n// With the period switch on, both values are rendered and the wrapper's\n// `data-period` (set by `PricingPeriodSwitch`) picks which one shows.\nconst monthlyOnly = \"group-data-[period=yearly]/pricing:hidden\";\nconst yearlyOnly = \"hidden group-data-[period=yearly]/pricing:block\";\n\nexport function PricingWidget({\n settings: {\n title,\n titleLevel,\n titleSize,\n description,\n headerAlignment = \"center\",\n tiers,\n layout = \"grid\",\n pricingSwitcher,\n monthlyPriceCaption,\n yearlyPriceCaption,\n defaultPeriod = \"yearly\",\n cssId,\n maxWidth,\n verticalPadding,\n background,\n },\n state: { theme },\n}: WidgetProps<PricingSettings>) {\n const overriddenTheme: ThemeStyle = JSON.parse(JSON.stringify(theme.theme));\n overriddenTheme.structure.page.width = maxWidth || theme.theme.structure.page.width;\n overriddenTheme.structure.section.padding.y =\n verticalPadding || theme.theme.structure.section.padding.y;\n\n const plans = tiers && tiers.length > 0 && (\n <div\n className={clsx(\n layout === \"stacked\"\n ? \"mx-auto flex w-full max-w-xl flex-col gap-6\"\n : [\n \"grid grid-cols-1 gap-6 items-stretch\",\n tiers.length === 1 && \"mx-auto w-full max-w-xl\",\n tiers.length >= 2 && \"md:grid-cols-2\",\n lgColumns[Math.min(tiers.length, 4)],\n ],\n )}\n >\n {tiers.map((tier, index) => (\n <PageCard\n key={index}\n theme={overriddenTheme}\n className={clsx(\n tier.highlighted && \"ring-2 ring-primary\",\n layout === \"highlight\" &&\n tier.highlighted &&\n \"relative z-10 shadow-xl md:-translate-y-3\",\n )}\n >\n <PageCardContent\n theme={overriddenTheme}\n className=\"h-full flex flex-col gap-4\"\n >\n <div className=\"flex items-center justify-between gap-2\">\n <Preheader theme={overriddenTheme}>{tier.name}</Preheader>\n {tier.highlighted && <Badge theme={overriddenTheme}>Most popular</Badge>}\n </div>\n <PageCardHeader theme={overriddenTheme}>\n {pricingSwitcher ? (\n <>\n <span className={monthlyOnly}>{tier.price}</span>\n <span className={yearlyOnly}>{tier.priceYearly || tier.price}</span>\n </>\n ) : (\n tier.price\n )}\n </PageCardHeader>\n {tier.description && (\n <Text1 theme={overriddenTheme}>{tier.description}</Text1>\n )}\n {tier.features && tier.features.length > 0 && (\n <div className=\"grow flex flex-col gap-2\">\n {tier.features.map((feature, i) => (\n <Text2 key={i} theme={overriddenTheme}>\n {feature}\n </Text2>\n ))}\n </div>\n )}\n {pricingSwitcher &&\n tier.buttonActionYearly &&\n tier.buttonActionYearly !== tier.buttonAction ? (\n <>\n <TierButton\n tier={tier}\n href={tier.buttonAction}\n className={monthlyOnly}\n theme={overriddenTheme}\n />\n <TierButton\n tier={tier}\n href={tier.buttonActionYearly}\n className={yearlyOnly}\n theme={overriddenTheme}\n />\n </>\n ) : (\n <TierButton\n tier={tier}\n href={tier.buttonAction}\n theme={overriddenTheme}\n />\n )}\n </PageCardContent>\n </PageCard>\n ))}\n </div>\n );\n\n return (\n <Section theme={overriddenTheme} id={cssId} background={background}>\n <div className=\"flex flex-col gap-8\">\n <div\n className={clsx(\n \"flex flex-col gap-4\",\n headerAlignment === \"center\" ? \"items-center text-center\" : \"items-start\",\n )}\n >\n <Header1 theme={overriddenTheme} {...titleProps({ titleLevel, titleSize })}>\n {renderTitle(title, overriddenTheme)}\n </Header1>\n {description && (\n <Subheader1 theme={overriddenTheme} component=\"span\">\n <TextRenderer json={description} theme={overriddenTheme} />\n </Subheader1>\n )}\n </div>\n {tiers &&\n tiers.length > 0 &&\n (pricingSwitcher ? (\n <PricingPeriodSwitch\n defaultPeriod={defaultPeriod}\n monthlyCaption={monthlyPriceCaption || \"Monthly\"}\n yearlyCaption={yearlyPriceCaption || \"Yearly\"}\n theme={overriddenTheme}\n >\n {plans}\n </PricingPeriodSwitch>\n ) : (\n plans\n ))}\n </div>\n </Section>\n );\n}\n\nfunction TierButton({\n tier,\n href,\n className,\n theme,\n}: {\n tier: PricingTier;\n href?: string;\n className?: string;\n theme: ThemeStyle;\n}) {\n if (!href || !tier.buttonCaption) return null;\n return (\n <NavLink href={href} className={clsx(\"w-full mt-auto\", className)}>\n <Button\n theme={theme}\n variant={tier.highlighted ? \"default\" : \"secondary\"}\n className=\"w-full\"\n >\n {tier.buttonCaption}\n </Button>\n </NavLink>\n );\n}\n","import type { PricingSettings } from \"./settings\";\n\nexport const pricingDefaults: Partial<PricingSettings> = {\n title: \"Simple, transparent pricing\",\n headerAlignment: \"center\",\n tiers: [\n {\n name: \"Starter\",\n price: \"$0/mo\",\n description: \"For hobby sites and side projects.\",\n features: [\"1 website\", \"FrontLit branding\", \"Community support\"],\n buttonCaption: \"Get started\",\n buttonAction: \"/help\",\n },\n {\n name: \"Pro\",\n price: \"$29/mo\",\n description: \"For growing businesses that need more.\",\n features: [\"5 websites\", \"Custom domain\", \"Blog + Email\", \"Priority support\"],\n buttonCaption: \"Talk to us\",\n buttonAction: \"/help\",\n highlighted: true,\n },\n {\n name: \"Business\",\n price: \"$79/mo\",\n description: \"For teams that need scale and control.\",\n features: [\n \"Unlimited websites\",\n \"Help desk & chatbot\",\n \"Team seats\",\n \"Dedicated support\",\n ],\n buttonCaption: \"Contact sales\",\n buttonAction: \"/help\",\n },\n ],\n};\n","import React from \"react\";\nimport clsx from \"clsx\";\nimport type { ThemeStyle, WidgetProps } from \"../../models\";\nimport type { BannerSettings } from \"./settings\";\nimport { renderTitle, titleProps } from \"../_shared/title\";\nimport { NavLink } from \"../../components/nav-link\";\nimport { TextRenderer } from \"../../components/text-renderer\";\nimport {\n Button,\n Header1,\n PageCard,\n PageCardContent,\n Section,\n Subheader1,\n} from \"../../primitives\";\n\nexport function BannerWidget({\n settings: {\n title,\n titleLevel,\n titleSize,\n description,\n buttonCaption,\n buttonAction,\n secondaryButtonCaption,\n secondaryButtonAction,\n contentAlignment = \"center\",\n layout = \"stacked\",\n cssId,\n maxWidth,\n verticalPadding,\n background,\n },\n state: { theme },\n}: WidgetProps<BannerSettings>) {\n const overriddenTheme: ThemeStyle = JSON.parse(JSON.stringify(theme.theme));\n overriddenTheme.structure.page.width = maxWidth || theme.theme.structure.page.width;\n overriddenTheme.structure.section.padding.y =\n verticalPadding || theme.theme.structure.section.padding.y;\n\n const isCentered = contentAlignment === \"center\";\n const isSplit = layout === \"split\";\n const isBoxed = layout === \"boxed\";\n\n const heading = (\n <>\n <Header1 theme={overriddenTheme} {...titleProps({ titleLevel, titleSize })}>\n {renderTitle(title, overriddenTheme)}\n </Header1>\n {description && (\n <Subheader1 theme={overriddenTheme} component=\"span\">\n <TextRenderer json={description} theme={overriddenTheme} />\n </Subheader1>\n )}\n </>\n );\n\n const buttons = (buttonAction || secondaryButtonAction) && (\n <div\n className={clsx(\n \"flex flex-col md:!flex-row gap-2 w-full md:w-auto\",\n isSplit ? \"shrink-0\" : \"mt-2\",\n !isSplit && isCentered ? \"md:!justify-center\" : \"\",\n )}\n >\n {buttonAction && buttonCaption && (\n <NavLink href={buttonAction}>\n <Button theme={overriddenTheme} className=\"w-full md:min-w-[150px]\">\n {buttonCaption}\n </Button>\n </NavLink>\n )}\n {secondaryButtonAction && secondaryButtonCaption && (\n <NavLink href={secondaryButtonAction}>\n <Button\n theme={overriddenTheme}\n variant=\"secondary\"\n className=\"w-full md:min-w-[150px]\"\n >\n {secondaryButtonCaption}\n </Button>\n </NavLink>\n )}\n </div>\n );\n\n const content = isSplit ? (\n <div className=\"flex flex-col gap-6 md:!flex-row md:items-center md:justify-between\">\n <div className=\"flex flex-col items-start gap-4\">{heading}</div>\n {buttons}\n </div>\n ) : (\n <div\n className={clsx(\n \"flex flex-col gap-4\",\n isCentered ? \"items-center text-center\" : \"items-start\",\n )}\n >\n {heading}\n {buttons}\n </div>\n );\n\n return (\n <Section theme={overriddenTheme} id={cssId} background={background}>\n {isBoxed ? (\n <PageCard theme={overriddenTheme} className=\"mx-auto max-w-3xl\">\n <PageCardContent\n theme={overriddenTheme}\n className=\"items-center p-8 text-center md:p-12\"\n >\n {content}\n </PageCardContent>\n </PageCard>\n ) : (\n content\n )}\n </Section>\n );\n}\n","import type { BannerSettings } from \"./settings\";\n\nexport const bannerDefaults: Partial<BannerSettings> = {\n title: \"Ready to launch your site?\",\n buttonCaption: \"Contact us\",\n buttonAction: \"/help\",\n secondaryButtonCaption: \"Read the docs\",\n secondaryButtonAction: \"/docs\",\n contentAlignment: \"center\",\n};\n","import React from \"react\";\nimport clsx from \"clsx\";\nimport type { ThemeStyle, WidgetProps } from \"../../models\";\nimport type { EmailFormSettings } from \"./settings\";\nimport { renderTitle, titleProps } from \"../_shared/title\";\nimport { TextRenderer } from \"../../components/text-renderer\";\nimport { Header1, Section, Subheader1 } from \"../../primitives\";\nimport { EmailForm } from \"./form\";\n\nexport function EmailFormWidget({\n settings: {\n title,\n titleLevel,\n titleSize,\n description,\n buttonCaption = \"Subscribe\",\n successMessage = \"Thanks for subscribing!\",\n alignment = \"left\",\n layout = \"stacked\",\n cssId,\n maxWidth,\n verticalPadding,\n background,\n },\n state: { theme },\n pageData,\n editing,\n}: WidgetProps<EmailFormSettings>) {\n const overriddenTheme: ThemeStyle = JSON.parse(JSON.stringify(theme.theme));\n overriddenTheme.structure.page.width = maxWidth || theme.theme.structure.page.width;\n overriddenTheme.structure.section.padding.y =\n verticalPadding || theme.theme.structure.section.padding.y;\n\n const descriptionNode = description && (\n <Subheader1 theme={overriddenTheme} component=\"span\">\n <TextRenderer json={description} theme={overriddenTheme} />\n </Subheader1>\n );\n\n const heading =\n layout === \"inline\" ? (\n <div className=\"flex flex-col gap-1\">\n <Header1\n theme={overriddenTheme}\n {...titleProps({ titleLevel, titleSize }, \"h2\", \"text-xl\")}\n >\n {renderTitle(title, overriddenTheme)}\n </Header1>\n {descriptionNode}\n </div>\n ) : (\n <div\n className={clsx(\n \"flex flex-col gap-4\",\n layout === \"split\" ? \"items-start\" : \"contents\",\n )}\n >\n <Header1 theme={overriddenTheme} {...titleProps({ titleLevel, titleSize })}>\n {renderTitle(title, overriddenTheme)}\n </Header1>\n {descriptionNode}\n </div>\n );\n\n return (\n <Section theme={overriddenTheme} id={cssId} background={background}>\n <EmailForm\n theme={overriddenTheme}\n layout={layout}\n alignment={alignment}\n buttonCaption={buttonCaption}\n successMessage={successMessage}\n pageData={pageData}\n editing={editing}\n heading={heading}\n />\n </Section>\n );\n}\n","import type { EmailFormSettings } from \"./settings\";\n\nexport const emailFormDefaults: Partial<EmailFormSettings> = {\n title: \"Get product updates in your inbox\",\n buttonCaption: \"Subscribe\",\n successMessage: \"Thanks for subscribing! Check your inbox soon.\",\n alignment: \"left\",\n};\n","import React from \"react\";\nimport clsx from \"clsx\";\nimport type { ThemeStyle, WidgetProps } from \"../../models\";\nimport type { SupportFormSettings } from \"./settings\";\nimport { renderTitle, titleProps } from \"../_shared/title\";\nimport { TextRenderer } from \"../../components/text-renderer\";\nimport { Header1, Section, Subheader1 } from \"../../primitives\";\nimport { SupportForm } from \"./form\";\n\nexport function SupportFormWidget({\n settings: {\n title,\n titleLevel,\n titleSize,\n description,\n buttonCaption = \"Submit ticket\",\n successMessage = \"Thanks — we've got your ticket and will reply by email soon.\",\n alignment = \"left\",\n cssId,\n maxWidth,\n verticalPadding,\n background,\n },\n state: { theme },\n pageData,\n editing,\n}: WidgetProps<SupportFormSettings>) {\n const overriddenTheme: ThemeStyle = JSON.parse(JSON.stringify(theme.theme));\n overriddenTheme.structure.page.width = maxWidth || theme.theme.structure.page.width;\n overriddenTheme.structure.section.padding.y =\n verticalPadding || theme.theme.structure.section.padding.y;\n\n const isCentered = alignment === \"center\";\n\n return (\n <Section theme={overriddenTheme} id={cssId} background={background}>\n <div\n className={clsx(\n \"flex flex-col gap-4\",\n isCentered ? \"items-center text-center\" : \"items-start\",\n )}\n >\n <Header1 theme={overriddenTheme} {...titleProps({ titleLevel, titleSize })}>\n {renderTitle(title, overriddenTheme)}\n </Header1>\n {description && (\n <Subheader1 theme={overriddenTheme} component=\"span\">\n <TextRenderer json={description} theme={overriddenTheme} />\n </Subheader1>\n )}\n </div>\n <SupportForm\n theme={overriddenTheme}\n buttonCaption={buttonCaption}\n successMessage={successMessage}\n pageData={pageData}\n editing={editing}\n />\n </Section>\n );\n}\n","import type { SupportFormSettings } from \"./settings\";\n\nexport const supportFormDefaults: Partial<SupportFormSettings> = {\n title: \"Need help?\",\n buttonCaption: \"Submit ticket\",\n successMessage: \"Thanks — we've got your ticket and will reply by email soon.\",\n alignment: \"left\",\n};\n","import React from \"react\";\nimport type { WidgetProps, ThemeStyle } from \"../../models\";\nimport type { FooterSettings } from \"./settings\";\nimport { NavLink } from \"../../components/nav-link\";\nimport {\n Caption,\n Header3,\n Header4,\n Link as PrimitiveLink,\n Section,\n Text2,\n} from \"../../primitives\";\n\nexport function FooterWidget({\n settings: {\n tagline: ownTagline,\n columns = [],\n copyrightText,\n layout = \"columns\",\n showThemeSwitcher = true,\n cssId,\n maxWidth,\n verticalPadding,\n background,\n },\n state: { theme },\n pageData,\n themeSwitcher,\n}: WidgetProps<FooterSettings>) {\n // Logo text is always Branding's title; the tagline falls back to its\n // subtitle. Unset branding renders nothing.\n const logoText = pageData.siteTitle;\n const tagline = ownTagline || pageData.siteSubtitle;\n const overriddenTheme: ThemeStyle = JSON.parse(JSON.stringify(theme.theme));\n overriddenTheme.structure.page.width = maxWidth || theme.theme.structure.page.width;\n overriddenTheme.structure.section.padding.y =\n verticalPadding || theme.theme.structure.section.padding.y;\n\n const colorModeControl = showThemeSwitcher ? themeSwitcher : null;\n\n return (\n <Section\n theme={overriddenTheme}\n component=\"footer\"\n id={cssId}\n background={background}\n className=\"border-t\"\n >\n {layout === \"minimal\" ? (\n <div className=\"flex w-full flex-wrap items-center justify-between gap-4\">\n {logoText && (\n <Header4 theme={overriddenTheme} as=\"p\">\n {logoText}\n </Header4>\n )}\n <div className=\"flex flex-wrap items-center gap-x-6 gap-y-2\">\n {columns.flatMap((column) =>\n column.links.map((link) => (\n <NavLink\n key={`${column.id}-${link.id}`}\n href={link.href}\n className=\"no-underline\"\n >\n <PrimitiveLink theme={overriddenTheme} className=\"text-xs\">\n {link.label}\n </PrimitiveLink>\n </NavLink>\n )),\n )}\n {copyrightText && (\n <Caption theme={overriddenTheme}>{copyrightText}</Caption>\n )}\n {colorModeControl}\n </div>\n </div>\n ) : layout === \"centered\" ? (\n <div className=\"flex w-full flex-col items-center gap-6 text-center\">\n <div className=\"flex max-w-sm flex-col items-center gap-3\">\n {logoText && (\n <Header3 theme={overriddenTheme} as=\"p\">\n {logoText}\n </Header3>\n )}\n {tagline && <Text2 theme={overriddenTheme}>{tagline}</Text2>}\n </div>\n <div className=\"flex flex-wrap justify-center gap-x-6 gap-y-2\">\n {columns.flatMap((column) =>\n column.links.map((link) => (\n <NavLink\n key={`${column.id}-${link.id}`}\n href={link.href}\n className=\"no-underline\"\n >\n <PrimitiveLink theme={overriddenTheme} className=\"text-xs\">\n {link.label}\n </PrimitiveLink>\n </NavLink>\n )),\n )}\n </div>\n </div>\n ) : (\n <div className=\"flex w-full flex-col gap-8 lg:!flex-row lg:justify-between\">\n <div className=\"flex max-w-sm flex-col gap-3\">\n {logoText && (\n <Header3 theme={overriddenTheme} as=\"p\">\n {logoText}\n </Header3>\n )}\n {tagline && <Text2 theme={overriddenTheme}>{tagline}</Text2>}\n </div>\n <div className=\"flex flex-col flex-wrap gap-8 lg:!flex-row\">\n {columns.map((column) => (\n <div key={column.id} className=\"flex flex-col gap-3 lg:min-w-[140px]\">\n <Header4 theme={overriddenTheme} className=\"text-sm\">\n {column.title}\n </Header4>\n <div className=\"flex flex-col gap-2\">\n {column.links.map((link) => (\n <NavLink key={link.id} href={link.href} className=\"no-underline\">\n <PrimitiveLink theme={overriddenTheme} className=\"text-xs\">\n {link.label}\n </PrimitiveLink>\n </NavLink>\n ))}\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n {(copyrightText || colorModeControl) && layout !== \"minimal\" && (\n <div\n className={\n layout === \"centered\"\n ? \"mt-8 flex flex-col items-center gap-4 border-t pt-6 text-center\"\n : \"mt-8 flex items-center justify-between gap-4 border-t pt-6\"\n }\n >\n {copyrightText && <Caption theme={overriddenTheme}>{copyrightText}</Caption>}\n {colorModeControl && (\n <div className={layout === \"centered\" ? undefined : \"ml-auto\"}>\n {colorModeControl}\n </div>\n )}\n </div>\n )}\n </Section>\n );\n}\n","import type { FooterSettings } from \"./settings\";\nimport { generateUniqueId } from \"../../utils/generate-unique-id\";\n\nexport const footerDefaults: Partial<FooterSettings> = {\n showThemeSwitcher: true,\n columns: [\n {\n id: generateUniqueId(),\n title: \"Product\",\n links: [\n {\n id: generateUniqueId(),\n label: \"Features\",\n href: \"/#features\",\n },\n { id: generateUniqueId(), label: \"Pricing\", href: \"/#pricing\" },\n {\n id: generateUniqueId(),\n label: \"Changelog\",\n href: \"/changelog\",\n },\n ],\n },\n {\n id: generateUniqueId(),\n title: \"Resources\",\n links: [\n { id: generateUniqueId(), label: \"Blog\", href: \"/blog\" },\n { id: generateUniqueId(), label: \"Help center\", href: \"/help\" },\n { id: generateUniqueId(), label: \"Docs\", href: \"/docs\" },\n ],\n },\n {\n id: generateUniqueId(),\n title: \"Legal\",\n links: [\n {\n id: generateUniqueId(),\n label: \"Terms of use\",\n href: \"/terms\",\n },\n {\n id: generateUniqueId(),\n label: \"Privacy policy\",\n href: \"/privacy\",\n },\n ],\n },\n ],\n copyrightText: \"© FrontLit. All rights reserved.\",\n};\n","import React from \"react\";\nimport type { ThemeStyle, WidgetProps } from \"../../models\";\nimport type { RichTextSettings } from \"./settings\";\nimport { TextRenderer } from \"../../components/text-renderer\";\nimport { Section, Text1 } from \"../../primitives\";\n\nexport function RichTextWidget({\n settings: { text, alignment = \"left\", cssId, maxWidth, verticalPadding, background },\n state: { theme },\n}: WidgetProps<RichTextSettings>) {\n const overriddenTheme: ThemeStyle = JSON.parse(JSON.stringify(theme.theme));\n overriddenTheme.structure.page.width = maxWidth || theme.theme.structure.page.width;\n overriddenTheme.structure.section.padding.y =\n verticalPadding || theme.theme.structure.section.padding.y;\n\n if (!text) return null;\n\n return (\n <Section theme={overriddenTheme} id={cssId} background={background}>\n <div style={{ textAlign: alignment }}>\n <Text1 theme={overriddenTheme} component=\"span\">\n <TextRenderer json={text} theme={overriddenTheme} />\n </Text1>\n </div>\n </Section>\n );\n}\n","import type { RichTextSettings } from \"./settings\";\n\nexport const richTextDefaults: Partial<RichTextSettings> = {\n text: {\n type: \"doc\",\n content: [\n {\n type: \"paragraph\",\n content: [\n {\n type: \"text\",\n text: \"Write anything here — an announcement, a longer explanation, or a passage of prose that doesn't need a title or media.\",\n },\n ],\n },\n ],\n },\n alignment: \"left\",\n};\n","import React from \"react\";\nimport clsx from \"clsx\";\nimport * as Icons from \"lucide-react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport type { ThemeStyle, WidgetProps } from \"../../models\";\nimport { getMediaUrl, getMediaAlt } from \"../../models/media\";\nimport type { GridItem, GridSettings } from \"./settings\";\nimport { renderTitle, titleProps } from \"../_shared/title\";\nimport { Image } from \"../../components/image\";\nimport { NavLink } from \"../../components/nav-link\";\nimport { TextRenderer } from \"../../components/text-renderer\";\nimport {\n Button,\n Header1,\n Header4,\n PageCard,\n PageCardContent,\n Section,\n Subheader1,\n Text2,\n} from \"../../primitives\";\n\nfunction resolveIcon(name?: string): LucideIcon | null {\n if (!name) return null;\n return (Icons as unknown as Record<string, LucideIcon>)[name] ?? null;\n}\n\nfunction GridItemCard({ item, theme }: { item: GridItem; theme: ThemeStyle }) {\n const Icon = resolveIcon(item.icon);\n const mediaUrl = getMediaUrl(item.media);\n const mediaAlt = getMediaAlt(item.media);\n const hasMedia = Boolean(mediaUrl);\n const isOverlay = item.mediaAlignment === \"overlay\";\n const mediaFirst = item.mediaAlignment !== \"bottom\";\n\n if (isOverlay) {\n const card = (\n <PageCard theme={theme} isLink={Boolean(item.buttonAction)}>\n <div className=\"relative aspect-[4/5] w-full overflow-hidden\">\n {hasMedia && (\n <Image\n src={mediaUrl || \"\"}\n alt={mediaAlt}\n className=\"absolute inset-0\"\n width=\"w-full\"\n height=\"h-full\"\n objectFit=\"cover\"\n borderRadius={0}\n />\n )}\n <div className=\"absolute inset-0 bg-gradient-to-t from-black/70 via-black/10 to-transparent\" />\n <div className=\"absolute inset-x-0 bottom-0 p-4\">\n <Header4 theme={theme} className=\"text-white\">\n {item.title}\n </Header4>\n </div>\n </div>\n </PageCard>\n );\n\n return item.buttonAction ? (\n <NavLink href={item.buttonAction} className=\"block\">\n {card}\n </NavLink>\n ) : (\n card\n );\n }\n\n const media = hasMedia ? (\n <div className=\"overflow-hidden rounded-md\">\n <Image src={mediaUrl || \"\"} alt={mediaAlt} />\n </div>\n ) : Icon ? (\n <div className=\"flex h-10 w-10 items-center justify-center rounded-md bg-primary/10 text-primary\">\n <Icon className=\"h-5 w-5\" />\n </div>\n ) : null;\n\n const text = (\n <div className=\"flex flex-col gap-2\">\n <Header4 theme={theme}>{item.title}</Header4>\n {item.description && <Text2 theme={theme}>{item.description}</Text2>}\n {item.buttonAction && item.buttonCaption && (\n <NavLink href={item.buttonAction} className=\"mt-2\">\n <Button theme={theme} variant=\"secondary\" size=\"sm\">\n {item.buttonCaption}\n </Button>\n </NavLink>\n )}\n </div>\n );\n\n return (\n <PageCard theme={theme}>\n <PageCardContent theme={theme} className=\"flex h-full flex-col gap-3\">\n {mediaFirst ? (\n <>\n {media}\n {text}\n </>\n ) : (\n <>\n {text}\n {media}\n </>\n )}\n </PageCardContent>\n </PageCard>\n );\n}\n\nexport function GridWidget({\n settings: {\n title,\n titleLevel,\n titleSize,\n description,\n headerAlignment = \"center\",\n buttonCaption,\n buttonAction,\n items,\n columns = 3,\n cssId,\n maxWidth,\n verticalPadding,\n background,\n },\n state: { theme },\n}: WidgetProps<GridSettings>) {\n const overriddenTheme: ThemeStyle = JSON.parse(JSON.stringify(theme.theme));\n overriddenTheme.structure.page.width = maxWidth || theme.theme.structure.page.width;\n overriddenTheme.structure.section.padding.y =\n verticalPadding || theme.theme.structure.section.padding.y;\n\n return (\n <Section theme={overriddenTheme} id={cssId} background={background}>\n <div className=\"flex flex-col gap-8\">\n <div\n className={clsx(\n \"flex flex-col gap-4\",\n headerAlignment === \"center\" ? \"items-center text-center\" : \"items-start\",\n )}\n >\n <Header1 theme={overriddenTheme} {...titleProps({ titleLevel, titleSize })}>\n {renderTitle(title, overriddenTheme)}\n </Header1>\n {description && (\n <Subheader1 theme={overriddenTheme} component=\"span\">\n <TextRenderer json={description} theme={overriddenTheme} />\n </Subheader1>\n )}\n {buttonAction && buttonCaption && (\n <NavLink href={buttonAction} className=\"mt-2\">\n <Button theme={overriddenTheme}>{buttonCaption}</Button>\n </NavLink>\n )}\n </div>\n {items && items.length > 0 && (\n <div\n className={clsx(\n \"grid grid-cols-1 md:grid-cols-2 gap-6 items-stretch\",\n columns === 3 ? \"lg:grid-cols-3\" : \"lg:grid-cols-2\",\n )}\n >\n {items.map((item, index) => (\n <GridItemCard key={index} item={item} theme={overriddenTheme} />\n ))}\n </div>\n )}\n </div>\n </Section>\n );\n}\n","import type { GridSettings } from \"./settings\";\n\nexport const gridDefaults: Partial<GridSettings> = {\n title: \"Everything you need, in one place\",\n headerAlignment: \"center\",\n columns: 3,\n items: [\n {\n title: \"Website builder\",\n description: \"Design and publish pages with a drag-and-drop editor.\",\n icon: \"LayoutTemplate\",\n mediaAlignment: \"top\",\n buttonCaption: \"See features\",\n buttonAction: \"/#features\",\n },\n {\n title: \"Blog\",\n description: \"Publish articles and grow your audience.\",\n icon: \"Newspaper\",\n mediaAlignment: \"top\",\n buttonCaption: \"Read articles\",\n buttonAction: \"/blog\",\n },\n {\n title: \"Help desk\",\n description: \"Support your customers with a shared inbox.\",\n icon: \"Headset\",\n mediaAlignment: \"top\",\n buttonCaption: \"Contact us\",\n buttonAction: \"/help\",\n },\n ],\n};\n","import React from \"react\";\nimport type { ThemeStyle, WidgetProps } from \"../../models\";\nimport { getMediaUrl, getMediaAlt } from \"../../models/media\";\nimport type { MediaSettings } from \"./settings\";\nimport { Image } from \"../../components/image\";\nimport { VideoWithPreview } from \"../../components/video-with-preview\";\nimport { isVideo } from \"../../utils\";\nimport { Section } from \"../../primitives\";\nimport { cn } from \"../../primitives/lib/utils\";\n\nconst roundedMap: Record<number, string> = {\n 0: \"rounded-none\",\n 1: \"rounded-sm\",\n 2: \"rounded\",\n 3: \"rounded-md\",\n 4: \"rounded-lg\",\n 5: \"rounded-xl\",\n 6: \"rounded-2xl\",\n 7: \"rounded-3xl\",\n 8: \"rounded-full\",\n};\n\nexport function MediaWidget({\n settings: {\n media,\n youtubeLink,\n mediaRadius = 2,\n aspectRatio = \"16/9\",\n objectFit = \"cover\",\n hasBorder = true,\n playVideoInModal = false,\n cssId,\n maxWidth,\n verticalPadding,\n background,\n },\n state: { theme },\n}: WidgetProps<MediaSettings>) {\n const overriddenTheme: ThemeStyle = JSON.parse(JSON.stringify(theme.theme));\n overriddenTheme.structure.page.width = maxWidth || theme.theme.structure.page.width;\n overriddenTheme.structure.section.padding.y =\n verticalPadding || theme.theme.structure.section.padding.y;\n\n const isVideoContent = isVideo(youtubeLink, media);\n\n return (\n <Section theme={overriddenTheme} id={cssId} background={background}>\n <div\n className={cn(\n \"overflow-hidden\",\n roundedMap[mediaRadius] ?? \"rounded\",\n hasBorder && (overriddenTheme.interactives?.card?.border?.width || \"border\"),\n )}\n >\n {isVideoContent ? (\n <VideoWithPreview\n videoUrl={youtubeLink || getMediaUrl(media) || \"\"}\n title={getMediaAlt(media) || (media as any)?.caption || \"\"}\n thumbnailUrl={\n (media as any)?.thumbnail || (media as any)?.thumbnailUrl || \"\"\n }\n aspectRatio={aspectRatio}\n modal={playVideoInModal}\n />\n ) : (\n <Image\n src={getMediaUrl(media) || \"\"}\n alt={getMediaAlt(media)}\n objectFit={objectFit}\n borderRadius={mediaRadius}\n />\n )}\n </div>\n </Section>\n );\n}\n","import type { MediaSettings } from \"./settings\";\n\nexport const mediaDefaults: Partial<MediaSettings> = {\n mediaRadius: 2,\n aspectRatio: \"16/9\",\n objectFit: \"cover\",\n hasBorder: true,\n playVideoInModal: false,\n};\n","import React from \"react\";\nimport * as Icons from \"lucide-react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport type { ThemeStyle, WidgetProps } from \"../../models\";\nimport type { MarqueeSettings } from \"./settings\";\nimport { NavLink } from \"../../components/nav-link\";\nimport { Section } from \"../../primitives\";\nimport { MarqueeTrack } from \"./marquee-track\";\n\nfunction resolveIcon(name?: string): LucideIcon | null {\n if (!name) return null;\n return (Icons as unknown as Record<string, LucideIcon>)[name] ?? null;\n}\n\nexport function MarqueeWidget({\n settings: {\n items = [],\n direction = \"right\",\n speed = 60,\n pauseOnHover = true,\n fadeWidth = 50,\n itemBackgroundColor,\n itemForegroundColor,\n itemBorderColor,\n itemBorderRadius = 12,\n itemBorderWidth = 1,\n itemBorderStyle = \"solid\",\n cssId,\n maxWidth,\n verticalPadding,\n background,\n },\n state: { theme },\n}: WidgetProps<MarqueeSettings>) {\n const overriddenTheme: ThemeStyle = JSON.parse(JSON.stringify(theme.theme));\n overriddenTheme.structure.page.width = maxWidth || theme.theme.structure.page.width;\n overriddenTheme.structure.section.padding.y =\n verticalPadding || theme.theme.structure.section.padding.y;\n\n if (items.length === 0) return null;\n\n const itemStyle: React.CSSProperties = {\n backgroundColor: itemBackgroundColor || undefined,\n color: itemForegroundColor || undefined,\n borderColor: itemBorderColor || undefined,\n borderRadius: itemBorderRadius,\n borderWidth: itemBorderStyle === \"none\" ? 0 : itemBorderWidth,\n borderStyle: itemBorderStyle === \"none\" ? undefined : itemBorderStyle,\n };\n\n const renderItem = (item: (typeof items)[number]) => {\n const Icon = resolveIcon(item.icon);\n const content = (\n <div\n className=\"mx-2 flex min-h-[80px] min-w-[160px] items-center justify-center px-6\"\n style={itemStyle}\n >\n {Icon ? (\n <Icon className=\"h-8 w-8\" />\n ) : (\n <span className=\"whitespace-nowrap text-sm font-medium\">{item.text}</span>\n )}\n </div>\n );\n return item.href ? (\n <NavLink key={item.id} href={item.href} openInSameTab={false}>\n {content}\n </NavLink>\n ) : (\n <React.Fragment key={item.id}>{content}</React.Fragment>\n );\n };\n\n return (\n <Section theme={overriddenTheme} id={cssId} background={background}>\n <div className=\"relative\" aria-hidden=\"true\">\n <MarqueeTrack speed={speed} direction={direction} pauseOnHover={pauseOnHover}>\n {items.map(renderItem)}\n </MarqueeTrack>\n {fadeWidth > 0 && (\n <>\n <div\n className=\"pointer-events-none absolute inset-y-0 left-0 z-10\"\n style={{\n width: fadeWidth,\n background: \"linear-gradient(to right, var(--background), transparent)\",\n }}\n />\n <div\n className=\"pointer-events-none absolute inset-y-0 right-0 z-10\"\n style={{\n width: fadeWidth,\n background: \"linear-gradient(to left, var(--background), transparent)\",\n }}\n />\n </>\n )}\n </div>\n </Section>\n );\n}\n","import type { MarqueeSettings } from \"./settings\";\nimport { generateUniqueId } from \"../../utils/generate-unique-id\";\n\nexport const marqueeDefaults: Partial<MarqueeSettings> = {\n items: [\n { id: generateUniqueId(), text: \"Website\" },\n { id: generateUniqueId(), text: \"Content\" },\n { id: generateUniqueId(), text: \"Support\" },\n { id: generateUniqueId(), text: \"Engage\" },\n ],\n direction: \"right\",\n speed: 60,\n pauseOnHover: true,\n fadeWidth: 50,\n itemForegroundColor: \"\",\n itemBackgroundColor: \"\",\n itemBorderColor: \"\",\n itemBorderRadius: 12,\n itemBorderWidth: 1,\n itemBorderStyle: \"solid\",\n};\n","import React from \"react\";\nimport { Code2 } from \"lucide-react\";\nimport type { ThemeStyle, WidgetProps } from \"../../models\";\nimport type { EmbedSettings } from \"./settings\";\nimport { InlineEmbed } from \"../../components/inline-embed\";\nimport { Section } from \"../../primitives\";\n\nconst aspectRatioMap: Record<string, number> = {\n \"16:9\": 16 / 9,\n \"4:3\": 4 / 3,\n \"1:1\": 1,\n};\n\nexport function EmbedWidget({\n settings: {\n contentType = \"url\",\n content,\n aspectRatio = \"default\",\n height = 500,\n cssId,\n maxWidth,\n verticalPadding,\n background,\n },\n state: { theme },\n editing,\n}: WidgetProps<EmbedSettings>) {\n const overriddenTheme: ThemeStyle = JSON.parse(JSON.stringify(theme.theme));\n overriddenTheme.structure.page.width = maxWidth || theme.theme.structure.page.width;\n overriddenTheme.structure.section.padding.y =\n verticalPadding || theme.theme.structure.section.padding.y;\n\n if (!content) {\n if (!editing) return null;\n\n return (\n <Section theme={overriddenTheme} id={cssId} background={background}>\n <div className=\"flex min-h-48 flex-col items-center justify-center gap-3 rounded-lg border border-dashed border-border bg-muted/30 px-6 py-12 text-center\">\n <span className=\"flex h-10 w-10 items-center justify-center rounded-full border border-border bg-background text-muted-foreground\">\n <Code2 className=\"h-4 w-4\" />\n </span>\n <div>\n <p className=\"font-semibold text-foreground\">Embed external content</p>\n <p className=\"mt-1 max-w-md text-sm text-muted-foreground\">\n Paste an embed URL or script snippet in the block settings.\n </p>\n </div>\n </div>\n </Section>\n );\n }\n\n const isScript = contentType === \"script\";\n const ratio = aspectRatio !== \"default\" ? aspectRatioMap[aspectRatio] : undefined;\n\n // Snippets size themselves unless an aspect ratio is set; URL iframes need\n // an explicit height.\n const containerStyle: React.CSSProperties = ratio\n ? { position: \"relative\", paddingTop: `${100 / ratio}%` }\n : { position: \"relative\", height: isScript ? undefined : height };\n\n const fillStyle: React.CSSProperties = ratio\n ? { position: \"absolute\", inset: 0, width: \"100%\", height: \"100%\" }\n : { width: \"100%\", height: \"100%\" };\n\n return (\n <Section theme={overriddenTheme} id={cssId} background={background}>\n <div style={containerStyle}>\n {isScript ? (\n <InlineEmbed content={content} style={ratio ? fillStyle : undefined} />\n ) : (\n <iframe\n src={content}\n style={fillStyle}\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n title=\"Embedded content\"\n />\n )}\n {/* Clicks inside an iframe (a URL embed, or one inside a snippet)\n never reach the editor, so cover the embed while editing to let a\n click select the block. */}\n {editing && <div className=\"absolute inset-0\" />}\n </div>\n </Section>\n );\n}\n","import type { EmbedSettings } from \"./settings\";\n\nexport const embedDefaults: Partial<EmbedSettings> = {\n contentType: \"url\",\n content: \"\",\n aspectRatio: \"default\",\n height: 500,\n};\n","import React from \"react\";\nimport clsx from \"clsx\";\nimport type { ThemeStyle, WidgetProps } from \"../../models\";\nimport type { CodeSnippetSettings } from \"./settings\";\nimport { Caption, Section } from \"../../primitives\";\nimport { CodeSnippet } from \"../../primitives/code-snippet\";\n\nexport function CodeSnippetWidget({\n settings: {\n code,\n showPrompt = true,\n caption,\n contentAlignment = \"center\",\n cssId,\n maxWidth,\n verticalPadding,\n background,\n },\n state: { theme },\n}: WidgetProps<CodeSnippetSettings>) {\n const overriddenTheme: ThemeStyle = JSON.parse(JSON.stringify(theme.theme));\n overriddenTheme.structure.page.width = maxWidth || theme.theme.structure.page.width;\n overriddenTheme.structure.section.padding.y =\n verticalPadding || theme.theme.structure.section.padding.y;\n\n if (!code) return null;\n\n return (\n <Section theme={overriddenTheme} id={cssId} background={background}>\n <div\n className={clsx(\n \"flex w-full max-w-2xl flex-col gap-3\",\n contentAlignment === \"center\" ? \"mx-auto items-center\" : \"items-start\",\n )}\n >\n <CodeSnippet\n code={code}\n prompt={showPrompt ? \"$\" : undefined}\n theme={overriddenTheme}\n />\n {caption && <Caption theme={overriddenTheme}>{caption}</Caption>}\n </div>\n </Section>\n );\n}\n","import type { CodeSnippetSettings } from \"./settings\";\n\nexport const codeSnippetDefaults: Partial<CodeSnippetSettings> = {\n code: \"curl -fsSL https://example.com/install.sh | sh\",\n showPrompt: true,\n contentAlignment: \"center\",\n};\n","import React from \"react\";\nimport { LockKeyhole } from \"lucide-react\";\nimport type { ThemeStyle, WidgetDefaultSettings, WidgetProps } from \"../../models\";\nimport { Section } from \"../../primitives\";\n\nexport interface DataSlotSettings extends WidgetDefaultSettings {\n /** Name matched against the host application's data-slot loaders. */\n slot: string;\n}\n\n/**\n * A reserved, host-resolved data region. The host passes its rendered result\n * through `PageRenderer`; the builder shows a generic placeholder instead.\n * Live content uses the same `Section` shell as other blocks so it shares\n * the theme's page width instead of shrink-wrapping to the feed's copy.\n */\nexport function DataSlotWidget({\n data,\n editing,\n settings: { slot, cssId, maxWidth, verticalPadding, background },\n state: { theme },\n}: WidgetProps<DataSlotSettings>) {\n const overriddenTheme: ThemeStyle = JSON.parse(JSON.stringify(theme.theme));\n overriddenTheme.structure.page.width = maxWidth || theme.theme.structure.page.width;\n overriddenTheme.structure.section.padding.y =\n verticalPadding || theme.theme.structure.section.padding.y;\n\n if (data !== undefined) {\n return (\n <Section theme={overriddenTheme} id={cssId} background={background}>\n {data}\n </Section>\n );\n }\n if (!editing) return null;\n\n return (\n <Section\n theme={overriddenTheme}\n id={cssId}\n background={background}\n className=\"border-y border-dashed border-border bg-muted/30\"\n >\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <span className=\"flex h-10 w-10 items-center justify-center rounded-full border border-border bg-background text-muted-foreground\">\n <LockKeyhole className=\"h-4 w-4\" />\n </span>\n <div>\n <p className=\"font-semibold text-foreground\">Data slot</p>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n The embedding application resolves data for {String(slot || \"this slot\")}{\" \"}\n here.\n </p>\n </div>\n </div>\n </Section>\n );\n}\n","import type { ComponentType } from \"react\";\nimport type { WidgetProps } from \"../models\";\nimport { HeaderWidget } from \"../blocks/header/widget\";\nimport { headerDefaults } from \"../blocks/header/defaults\";\nimport { HeroWidget } from \"../blocks/hero/widget\";\nimport { heroDefaults } from \"../blocks/hero/defaults\";\nimport { ContentWidget } from \"../blocks/content/widget\";\nimport { contentDefaults } from \"../blocks/content/defaults\";\nimport { FeaturedWidget } from \"../blocks/featured/widget\";\nimport { featuredDefaults } from \"../blocks/featured/defaults\";\nimport { FaqWidget } from \"../blocks/faq/widget\";\nimport { faqDefaults } from \"../blocks/faq/defaults\";\nimport { PricingWidget } from \"../blocks/pricing/widget\";\nimport { pricingDefaults } from \"../blocks/pricing/defaults\";\nimport { BannerWidget } from \"../blocks/banner/widget\";\nimport { bannerDefaults } from \"../blocks/banner/defaults\";\nimport { EmailFormWidget } from \"../blocks/email-form/widget\";\nimport { emailFormDefaults } from \"../blocks/email-form/defaults\";\nimport { SupportFormWidget } from \"../blocks/support-form/widget\";\nimport { supportFormDefaults } from \"../blocks/support-form/defaults\";\nimport { FooterWidget } from \"../blocks/footer/widget\";\nimport { footerDefaults } from \"../blocks/footer/defaults\";\nimport { RichTextWidget } from \"../blocks/rich-text/widget\";\nimport { richTextDefaults } from \"../blocks/rich-text/defaults\";\nimport { GridWidget } from \"../blocks/grid/widget\";\nimport { gridDefaults } from \"../blocks/grid/defaults\";\nimport { MediaWidget } from \"../blocks/media/widget\";\nimport { mediaDefaults } from \"../blocks/media/defaults\";\nimport { MarqueeWidget } from \"../blocks/marquee/widget\";\nimport { marqueeDefaults } from \"../blocks/marquee/defaults\";\nimport { EmbedWidget } from \"../blocks/embed/widget\";\nimport { embedDefaults } from \"../blocks/embed/defaults\";\nimport { CodeSnippetWidget } from \"../blocks/code-snippet/widget\";\nimport { codeSnippetDefaults } from \"../blocks/code-snippet/defaults\";\nimport { DataSlotWidget } from \"../blocks/data-slot/widget\";\n\n/**\n * What the server renderer needs from a block: the widget and its default\n * settings. The full `blockRegistry` also carries each block's editor, which\n * pulls the builder UI into the bundle, so the server keeps its own lookup.\n * `server-registry.test.ts` keeps the two in step.\n */\nexport interface ServerBlock {\n widget: ComponentType<WidgetProps<any>>;\n getDefaultSettings?: () => object;\n}\n\nexport const serverBlockRegistry: Record<string, ServerBlock> = {\n header: { widget: HeaderWidget, getDefaultSettings: () => headerDefaults },\n hero: { widget: HeroWidget, getDefaultSettings: () => heroDefaults },\n content: { widget: ContentWidget, getDefaultSettings: () => contentDefaults },\n featured: { widget: FeaturedWidget, getDefaultSettings: () => featuredDefaults },\n faq: { widget: FaqWidget, getDefaultSettings: () => faqDefaults },\n pricing: { widget: PricingWidget, getDefaultSettings: () => pricingDefaults },\n banner: { widget: BannerWidget, getDefaultSettings: () => bannerDefaults },\n \"email-form\": {\n widget: EmailFormWidget,\n getDefaultSettings: () => emailFormDefaults,\n },\n \"support-form\": {\n widget: SupportFormWidget,\n getDefaultSettings: () => supportFormDefaults,\n },\n footer: { widget: FooterWidget, getDefaultSettings: () => footerDefaults },\n \"rich-text\": { widget: RichTextWidget, getDefaultSettings: () => richTextDefaults },\n grid: { widget: GridWidget, getDefaultSettings: () => gridDefaults },\n media: { widget: MediaWidget, getDefaultSettings: () => mediaDefaults },\n marquee: { widget: MarqueeWidget, getDefaultSettings: () => marqueeDefaults },\n embed: { widget: EmbedWidget, getDefaultSettings: () => embedDefaults },\n \"code-snippet\": {\n widget: CodeSnippetWidget,\n getDefaultSettings: () => codeSnippetDefaults,\n },\n \"data-slot\": { widget: DataSlotWidget },\n};\n","import type { ReactNode } from \"react\";\nimport type { PageData, WidgetInstance } from \"./models\";\n\n/** Context supplied to a host application's data-slot loader. */\nexport interface DataSlotLoadRequest {\n /** The slot identifier declared in `instance.settings.slot`. */\n slot: string;\n /** The full persisted block configuration. */\n instance: WidgetInstance;\n /** Page context supplied by the host renderer. */\n pageData: PageData;\n}\n\n/** A host-owned resolver for one named data slot. */\nexport type DataSlotLoader = (\n request: DataSlotLoadRequest,\n) => ReactNode | Promise<ReactNode>;\n\nexport type DataSlotLoaders = Readonly<Record<string, DataSlotLoader>>;\n\n/**\n * Resolves generic data-slot blocks before passing their output to\n * `PageRenderer`. The page-builder package deliberately does not fetch data\n * or understand a host application's domain model.\n */\nexport async function loadDataSlots(\n layout: readonly WidgetInstance[],\n loaders: DataSlotLoaders,\n pageData: PageData,\n): Promise<Record<string, ReactNode>> {\n const slots = layout.filter((instance) => instance.name === \"data-slot\");\n const resolved = await Promise.all(\n slots.map(async (instance) => {\n const slot = instance.settings?.slot;\n if (typeof slot !== \"string\" || !slot) return null;\n const loader = loaders[slot];\n if (!loader) return null;\n return [slot, await loader({ slot, instance, pageData })] as const;\n }),\n );\n const output: Record<string, ReactNode> = {};\n for (const entry of resolved) {\n if (entry) output[entry[0]] = entry[1];\n }\n return output;\n}\n"],"mappings":"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","names":["useId","clsx","NavLink","jsx","jsx","Badge","cva","jsx","cva","jsx","Button","jsx","jsx","jsx","jsx","jsx","jsx","React","jsx","React","jsx","jsx","jsx","jsx","Button","jsx","jsxs","NavLink","Button","clsx","React","React","NavLink","clsx","jsx","jsxs","roundedMap","clsx","NavLink","Button","clsx","jsx","jsxs","roundedMap","clsx","clsx","jsx","jsxs","clsx","clsx","jsx","jsxs","clsx","clsx","NavLink","Fragment","jsx","jsxs","clsx","Badge","NavLink","Button","clsx","NavLink","Fragment","jsx","jsxs","clsx","NavLink","Button","clsx","jsx","jsxs","clsx","clsx","jsx","jsxs","clsx","NavLink","jsx","jsxs","NavLink","jsx","clsx","Icons","NavLink","Fragment","jsx","jsxs","resolveIcon","Icons","NavLink","Button","clsx","VideoWithPreview","jsx","roundedMap","VideoWithPreview","React","Icons","NavLink","Fragment","jsx","jsxs","resolveIcon","Icons","NavLink","React","jsx","jsxs","clsx","CodeSnippet","jsx","jsxs","clsx","jsx","jsxs","jsx","jsxs","useId"]}
1
+ {"version":3,"sources":["../../src/server/page-renderer.tsx","../../src/registry-names.ts","../../src/renderer/generate-theme-styles.ts","../../src/primitives/lib/utils.ts","../../src/blocks/header/widget.tsx","../../src/components/image.tsx","../../src/primitives/components/ui/badge.tsx","../../src/primitives/badge.tsx","../../src/primitives/components/ui/button.tsx","../../src/primitives/button.tsx","../../src/primitives/caption.tsx","../../src/primitives/heading.tsx","../../src/primitives/header4.tsx","../../src/primitives/card.tsx","../../src/primitives/display.tsx","../../src/primitives/header1.tsx","../../src/primitives/header2.tsx","../../src/primitives/header3.tsx","../../src/primitives/link.tsx","../../src/primitives/preheader.tsx","../../src/primitives/section.tsx","../../src/models/media.ts","../../src/primitives/subheader1.tsx","../../src/primitives/text1.tsx","../../src/primitives/text2.tsx","../../src/blocks/header/header-link.tsx","../../src/blocks/header/github.ts","../../src/utils/generate-unique-id.ts","../../src/blocks/header/defaults.ts","../../src/blocks/_shared/title.ts","../../src/blocks/hero/widget.tsx","../../src/components/text-renderer.ts","../../src/utils/is-video.ts","../../src/blocks/hero/defaults.ts","../../src/blocks/content/widget.tsx","../../src/blocks/content/defaults.ts","../../src/blocks/featured/widget.tsx","../../src/blocks/featured/defaults.ts","../../src/blocks/faq/widget.tsx","../../src/blocks/faq/defaults.ts","../../src/blocks/pricing/widget.tsx","../../src/blocks/pricing/defaults.ts","../../src/blocks/banner/widget.tsx","../../src/blocks/banner/defaults.ts","../../src/blocks/email-form/widget.tsx","../../src/blocks/email-form/defaults.ts","../../src/blocks/support-form/widget.tsx","../../src/blocks/support-form/defaults.ts","../../src/blocks/footer/widget.tsx","../../src/blocks/footer/defaults.ts","../../src/blocks/rich-text/widget.tsx","../../src/blocks/rich-text/defaults.ts","../../src/blocks/grid/widget.tsx","../../src/blocks/grid/defaults.ts","../../src/blocks/media/widget.tsx","../../src/blocks/media/defaults.ts","../../src/blocks/marquee/widget.tsx","../../src/blocks/marquee/defaults.ts","../../src/blocks/embed/widget.tsx","../../src/blocks/embed/defaults.ts","../../src/blocks/code-snippet/widget.tsx","../../src/blocks/code-snippet/defaults.ts","../../src/blocks/data-slot/widget.tsx","../../src/server/registry.ts","../../src/data-slots.ts"],"sourcesContent":["import { useId, type ReactNode } from \"react\";\nimport type { PageData, Theme, WidgetInstance } from \"../models\";\nimport { LAYOUT_BLOCK_NAMES } from \"../registry-names\";\nimport { generateThemeStyles } from \"../renderer/generate-theme-styles\";\nimport { cn } from \"../primitives/lib/utils\";\nimport { serverBlockRegistry } from \"./registry\";\n\nexport interface ServerPageRendererProps {\n layout: WidgetInstance[];\n theme: Theme;\n pageData: PageData;\n /** Content rendered between the shared header and footer. */\n children?: ReactNode;\n /** Host-resolved data keyed by a generic data-slot's configured name. */\n dataSlots?: Record<string, ReactNode>;\n /** Light/dark control for the footer; a client component owned by the host. */\n themeSwitcher?: ReactNode;\n /** Extra content inside the themed root (e.g. a fixed \"Preview\" badge),\n * so it can use the theme's colours. */\n overlay?: ReactNode;\n className?: string;\n}\n\n/**\n * Server-component counterpart of `PageRenderer`. Static blocks render on\n * the server and ship no JavaScript; only the interactive parts (mobile menu,\n * marquee, forms, copy buttons, links) are client islands.\n *\n * Everything crossing into an island must be serialisable, so unlike\n * `PageRenderer` this takes no callbacks. Dark-mode styling is CSS-driven\n * (the `dark` class on an ancestor), so no resolved colour mode is needed.\n */\nexport function ServerPageRenderer({\n layout,\n theme,\n pageData,\n children,\n dataSlots,\n themeSwitcher,\n overlay,\n className,\n}: ServerPageRendererProps) {\n const themeScope = `pb-${useId().replace(/[^a-zA-Z0-9_-]/g, \"\")}`;\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 function renderInstance(instance: WidgetInstance) {\n const definition = serverBlockRegistry[instance.name];\n if (!definition) return null;\n\n const Widget = definition.widget;\n const settings = { ...definition.getDefaultSettings?.(), ...instance.settings };\n\n return (\n <Widget\n key={instance.widgetId}\n settings={settings}\n state={{ theme }}\n pageData={pageData}\n data={\n instance.name === \"data-slot\"\n ? dataSlots?.[String(settings.slot ?? \"\")]\n : undefined\n }\n themeSwitcher={instance.name === \"footer\" ? themeSwitcher : undefined}\n />\n );\n }\n\n return (\n <div\n data-pb-theme={themeScope}\n className={cn(\n \"pb-theme flex min-h-full flex-col bg-background text-foreground\",\n className,\n )}\n >\n {/* Emitted first so the variables exist before any content paints. */}\n <style>{generateThemeStyles(theme, `[data-pb-theme=\"${themeScope}\"]`)}</style>\n {header && renderInstance(header)}\n <div className=\"flex flex-1 flex-col\">\n {children !== undefined &&\n !body.some((instance) => instance.name === \"data-slot\")\n ? children\n : body.map(renderInstance)}\n </div>\n {footer && renderInstance(footer)}\n {overlay}\n </div>\n );\n}\n","/** Blocks placed outside the normal flow by the renderer. */\nexport const LAYOUT_BLOCK_NAMES = [\"header\", \"footer\"];\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","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import React from \"react\";\nimport clsx from \"clsx\";\nimport { Github } from \"lucide-react\";\nimport type { WidgetProps, ThemeStyle } from \"../../models\";\nimport type { HeaderSettings } from \"./settings\";\nimport { Image } from \"../../components/image\";\nimport { NavLink } from \"../../components/nav-link\";\nimport { Button, Header4, Section } from \"../../primitives\";\nimport { HeaderLink } from \"./header-link\";\nimport { HeaderMobileMenu } from \"./mobile-menu\";\nimport { GithubStars } from \"./github-stars\";\nimport { parseGithubRepo } from \"./github\";\n\nexport function HeaderWidget({\n settings: {\n logoCorners,\n links = [],\n ctaLabel,\n ctaHref,\n linkAlignment = \"left\",\n layout = \"fixed\",\n backdropBlur = false,\n githubRepo,\n showGithubStars,\n cssId,\n maxWidth,\n verticalPadding,\n background,\n },\n state: { theme },\n pageData,\n}: WidgetProps<HeaderSettings>) {\n const overriddenTheme: ThemeStyle = JSON.parse(JSON.stringify(theme.theme));\n overriddenTheme.structure.page.width = maxWidth || theme.theme.structure.page.width;\n overriddenTheme.structure.section.padding.y =\n verticalPadding || theme.theme.structure.section.padding.y;\n\n const isFloating = layout === \"floating\";\n const isCentered = layout === \"centered\";\n const isFixed = !isFloating;\n const primaryLinks = links.filter((link) => !link.isButton);\n const buttonLinks = links.filter((link) => link.isButton);\n // The logo and title always come from Branding; an unset one renders nothing.\n const resolvedLogoImage = pageData.siteLogoUrl;\n const resolvedLogoText = pageData.siteTitle;\n const resolvedLogoAlt = pageData.siteLogoAlt || resolvedLogoText || \"\";\n const effectiveLogoCorners = logoCorners ?? 2;\n const hasCta = Boolean(ctaLabel && ctaHref);\n const repo = parseGithubRepo(githubRepo);\n\n const logo = (\n <NavLink href=\"/\" className=\"no-underline\">\n <div className=\"flex items-center gap-2\">\n {resolvedLogoImage && (\n <Image\n src={resolvedLogoImage}\n alt={resolvedLogoAlt}\n width=\"w-8\"\n height=\"h-8\"\n sizes=\"32px\"\n className=\"aspect-square shrink-0\"\n borderRadius={effectiveLogoCorners}\n />\n )}\n {resolvedLogoText && (\n <Header4 theme={overriddenTheme} as=\"span\">\n {resolvedLogoText}\n </Header4>\n )}\n </div>\n </NavLink>\n );\n\n const ctaAndMenu = (\n <div className=\"flex items-center gap-3\">\n {repo && (\n <a\n href={`https://github.com/${repo}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <Button theme={overriddenTheme} variant=\"ghost\" size=\"sm\" className=\"gap-1.5\">\n <Github className=\"h-4 w-4\" aria-hidden />\n <span className=\"sr-only\">GitHub repository</span>\n {showGithubStars && <GithubStars repo={repo} />}\n </Button>\n </a>\n )}\n {buttonLinks.map((link) => (\n <div className=\"hidden lg:!block\" key={link.id}>\n <HeaderLink link={link} theme={overriddenTheme} />\n </div>\n ))}\n {hasCta && (\n <div className=\"hidden lg:!block\">\n <NavLink href={ctaHref}>\n <Button theme={overriddenTheme} size=\"sm\">\n {ctaLabel}\n </Button>\n </NavLink>\n </div>\n )}\n {(links.length > 0 || hasCta) && (\n <div className=\"lg:hidden\">\n <HeaderMobileMenu\n links={links}\n ctaLabel={ctaLabel}\n ctaHref={ctaHref}\n theme={overriddenTheme}\n />\n </div>\n )}\n </div>\n );\n\n let mainContent: React.ReactNode;\n if (isCentered) {\n // Logo centered, nav links split evenly left and right of it — the\n // symmetric header pattern seen on many modern SaaS marketing sites.\n const half = Math.ceil(primaryLinks.length / 2);\n const leftLinks = primaryLinks.slice(0, half);\n const rightLinks = primaryLinks.slice(half);\n mainContent = (\n <div className=\"grid w-full grid-cols-[1fr_auto_1fr] items-center gap-4\">\n <div className=\"hidden items-center justify-end gap-6 lg:!flex\">\n {leftLinks.map((link) => (\n <HeaderLink key={link.id} link={link} theme={overriddenTheme} />\n ))}\n </div>\n <div className=\"flex justify-center\">{logo}</div>\n <div className=\"flex items-center justify-end gap-3\">\n <div className=\"hidden items-center gap-6 lg:!flex\">\n {rightLinks.map((link) => (\n <HeaderLink key={link.id} link={link} theme={overriddenTheme} />\n ))}\n </div>\n {ctaAndMenu}\n </div>\n </div>\n );\n } else {\n mainContent = (\n <div className=\"flex w-full items-center justify-between gap-4\">\n {logo}\n <div\n className={clsx(\n \"hidden items-center gap-6 lg:!flex lg:!grow\",\n linkAlignment === \"right\"\n ? \"justify-end\"\n : linkAlignment === \"center\"\n ? \"justify-center\"\n : \"justify-start\",\n )}\n >\n {primaryLinks.map((link) => (\n <HeaderLink key={link.id} link={link} theme={overriddenTheme} />\n ))}\n </div>\n {ctaAndMenu}\n </div>\n );\n }\n\n return (\n <Section\n theme={overriddenTheme}\n component=\"header\"\n id={cssId}\n background={background}\n className={clsx(\n \"sticky top-0 z-20\",\n isFixed && \"border-b\",\n isFixed && backdropBlur && \"bg-transparent backdrop-blur-2xl\",\n isFixed && !backdropBlur && \"bg-background\",\n !isFixed && \"bg-transparent\",\n )}\n >\n {isFloating ? (\n <div\n className={clsx(\n \"p-2\",\n overriddenTheme.interactives?.card?.border?.width ?? \"border\",\n overriddenTheme.interactives?.card?.border?.radius ?? \"rounded-xl\",\n overriddenTheme.interactives?.card?.border?.style,\n overriddenTheme.interactives?.card?.shadow ?? \"shadow-md\",\n backdropBlur\n ? \"bg-transparent backdrop-blur-2xl\"\n : \"bg-card text-card-foreground\",\n )}\n >\n {mainContent}\n </div>\n ) : (\n mainContent\n )}\n </Section>\n );\n}\n","import type React from \"react\";\nimport { cn } from \"../primitives/lib/utils\";\n\nexport interface ImageAttributesInput {\n src: string;\n alt: string;\n sizes?: string;\n /** Above-the-fold image (e.g. LCP): fetched eagerly at high priority. */\n priority: boolean;\n}\n\n/**\n * Lets a host swap an image's `src`/`srcSet` for its own optimizer's URLs\n * (e.g. Next.js's `getImageProps`) without this package depending on the\n * host framework. Return `null` to keep the original URL.\n */\nexport type ImageAttributesResolver = (\n input: ImageAttributesInput,\n) => React.ImgHTMLAttributes<HTMLImageElement> | null;\n\n// Kept on `globalThis`: each package entry (`/server`, `/primitives/server`)\n// bundles its own copy of this module, and they must share one resolver.\nconst registry = globalThis as {\n __frontlitImageResolver?: ImageAttributesResolver | null;\n};\n\n/**\n * Registers the host's resolver. Call once at server start-up; renders that\n * run without one emit the original URL.\n */\nexport function setImageAttributesResolver(resolver: ImageAttributesResolver | null) {\n registry.__frontlitImageResolver = resolver;\n}\n\n/** The registered resolver's attributes for an image, if any. */\nexport function resolveImageAttributes(\n input: ImageAttributesInput,\n): React.ImgHTMLAttributes<HTMLImageElement> | null {\n return registry.__frontlitImageResolver?.(input) ?? null;\n}\n\nexport type ImageObjectFit = \"cover\" | \"contain\" | \"fill\" | \"none\" | \"scale-down\";\n\nexport const roundedMap: Record<number, string> = {\n 0: \"rounded-none\",\n 1: \"rounded-sm\",\n 2: \"rounded\",\n 3: \"rounded-md\",\n 4: \"rounded-lg\",\n 5: \"rounded-xl\",\n 6: \"rounded-2xl\",\n 7: \"rounded-3xl\",\n 8: \"rounded-full\",\n};\n\ninterface ImgProps {\n src: string;\n classes?: string;\n alt?: string;\n defaultImage?: string;\n loading?: \"eager\" | \"lazy\";\n /** Marks the image as likely LCP: eager load with high fetch priority. */\n priority?: boolean;\n height?: string;\n sizes?: string;\n width?: string;\n borderRadius?: number | string;\n noDefaultImage?: boolean;\n className?: string;\n objectFit?: ImageObjectFit;\n}\n\nconst objectFitClass: Record<ImageObjectFit, string> = {\n cover: \"object-cover\",\n contain: \"object-contain\",\n fill: \"object-fill\",\n none: \"object-none\",\n \"scale-down\": \"object-scale-down\",\n};\n\nexport const Image = (props: ImgProps) => {\n const {\n src,\n alt = \"\",\n defaultImage,\n priority = false,\n loading = priority ? \"eager\" : \"lazy\",\n sizes,\n noDefaultImage = false,\n className = \"\",\n classes = \"\",\n width = \"w-full\",\n height = \"h-auto\",\n objectFit = \"cover\",\n borderRadius,\n } = props;\n const source = src || defaultImage;\n\n const radiusClass =\n typeof borderRadius === \"number\"\n ? (roundedMap[borderRadius] ?? \"rounded\")\n : borderRadius;\n\n if (!source) {\n if (noDefaultImage) return null;\n return (\n <div\n className={cn(\n \"relative aspect-video overflow-hidden bg-muted\",\n width,\n height,\n radiusClass,\n classes,\n className,\n )}\n />\n );\n }\n\n const optimized = resolveImageAttributes({ src: source, alt, sizes, priority });\n\n return (\n <div\n className={cn(\n \"relative aspect-video overflow-hidden\",\n width,\n height,\n radiusClass,\n classes,\n className,\n )}\n >\n <img\n src={source}\n alt={alt}\n sizes={sizes}\n loading={loading}\n decoding=\"async\"\n fetchPriority={priority ? \"high\" : undefined}\n {...optimized}\n className={cn(\n \"absolute inset-0 h-full w-full\",\n radiusClass,\n objectFitClass[objectFit],\n )}\n />\n </div>\n );\n};\n","import { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\nconst badgeVariants = cva(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground hover:bg-primary/80\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n destructive:\n \"border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80\",\n outline: \"text-foreground\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return <div className={cn(badgeVariants({ variant }), className)} {...props} />;\n}\n\nexport { Badge, badgeVariants };\n","import type React from \"react\";\nimport type { ThemeStyle } from \"../models\";\nimport {\n Badge as ShadcnBadge,\n type BadgeProps as ShadcnBadgeProps,\n} from \"./components/ui/badge\";\nimport { cn } from \"./lib/utils\";\n\nexport interface BadgeProps extends Omit<ShadcnBadgeProps, \"variant\"> {\n theme?: ThemeStyle;\n style?: Record<string, string>;\n variant?: \"default\" | \"secondary\" | \"destructive\" | \"outline\";\n}\n\nexport const Badge: React.FC<BadgeProps> = ({\n variant = \"default\",\n children,\n className = \"\",\n style = {},\n theme,\n ...props\n}) => {\n const typographyStyles = theme?.typography?.caption;\n const buttonStyles = theme?.interactives?.button;\n\n const classes = cn(\n // Base styles\n // \"bg-secondary\",\n // Theme typography from caption\n typographyStyles?.fontFamily,\n typographyStyles?.fontSize,\n typographyStyles?.fontWeight,\n typographyStyles?.lineHeight,\n typographyStyles?.letterSpacing,\n typographyStyles?.textTransform,\n buttonStyles?.border?.width,\n buttonStyles?.border?.radius,\n buttonStyles?.border?.style,\n className,\n );\n\n return (\n <ShadcnBadge\n variant={variant}\n className={classes}\n style={{\n ...style,\n backgroundColor: style.backgroundColor,\n color: style.color,\n }}\n {...props}\n >\n {children}\n </ShadcnBadge>\n );\n};\n","import { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary: \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n","import type React from \"react\";\nimport type { ThemeStyle } from \"../models\";\nimport {\n Button as ShadcnButton,\n type ButtonProps as ShadcnButtonProps,\n} from \"./components/ui/button\";\nimport { cn } from \"./lib/utils\";\n\nexport interface ButtonProps extends ShadcnButtonProps {\n theme?: ThemeStyle;\n}\n\nexport const Button: React.FC<ButtonProps> = ({\n variant = \"default\",\n size = \"default\",\n disabled = false,\n children,\n className = \"\",\n theme,\n ...props\n}) => {\n const buttonStyles = theme?.interactives?.button;\n const typographyStyles = theme?.typography?.button;\n const isIcon = size === \"icon\";\n\n const classes = cn(\n // Base styles\n \"\",\n // Theme typography\n typographyStyles?.fontFamily,\n typographyStyles?.fontSize,\n typographyStyles?.fontWeight,\n typographyStyles?.lineHeight,\n typographyStyles?.letterSpacing,\n typographyStyles?.textTransform,\n typographyStyles?.textDecoration,\n typographyStyles?.textOverflow,\n // Theme interactivity. Icon buttons stay square — CTA padding\n // would stretch them off the size=\"icon\" box.\n !isIcon && buttonStyles?.padding?.x,\n !isIcon && buttonStyles?.padding?.y,\n buttonStyles?.border?.width,\n buttonStyles?.border?.radius,\n buttonStyles?.border?.style,\n // buttonStyles?.border?.color,\n buttonStyles?.shadow,\n // Theme disabled states\n disabled && buttonStyles?.disabled?.opacity,\n disabled && buttonStyles?.disabled?.cursor,\n disabled && buttonStyles?.disabled?.color,\n disabled && buttonStyles?.disabled?.background,\n disabled && buttonStyles?.disabled?.border,\n // User overrides\n buttonStyles?.custom,\n className,\n );\n\n return (\n <ShadcnButton\n variant={variant}\n size={size}\n disabled={disabled}\n className={classes}\n {...props}\n >\n {children}\n </ShadcnButton>\n );\n};\n","import type React from \"react\";\nimport { cn } from \"./lib/utils\";\nimport type { TypographyProps } from \"./typography\";\n\nexport const Caption: React.FC<TypographyProps> = ({\n children,\n className = \"\",\n theme,\n ...props\n}) => {\n const typographyStyles = theme?.typography?.caption;\n const classes = cn(\n // Base styles\n \"text-xs leading-7 text-muted-foreground\",\n // Theme overrides\n typographyStyles?.fontFamily,\n typographyStyles?.fontSize,\n typographyStyles?.fontWeight,\n typographyStyles?.lineHeight,\n typographyStyles?.letterSpacing,\n typographyStyles?.textTransform,\n typographyStyles?.textDecoration,\n typographyStyles?.textOverflow,\n className,\n );\n\n return (\n <span className={classes} {...props}>\n {children}\n </span>\n );\n};\n","import type React from \"react\";\nimport type { ThemeStyle, Typography } from \"../models\";\nimport { cn } from \"./lib/utils\";\nimport type { TypographyProps } from \"./typography\";\n\nexport type HeadingTag = \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"span\" | \"div\";\n\nexport interface HeadingProps extends TypographyProps {\n /** Element to render. Lets a block pick its heading level independently of its look. */\n as?: HeadingTag;\n /**\n * Font-size classes that override the theme size. Kept apart from\n * `className` so they are merged before the theme's line-height, which\n * tailwind-merge would otherwise drop.\n */\n sizeClassName?: string;\n}\n\n// Phone and desktop widths the fluid size interpolates between.\nconst FLUID_MIN_VIEWPORT = 360;\nconst FLUID_MAX_VIEWPORT = 1280;\n\n/** px size of each Tailwind text size class. */\nexport const TAILWIND_TEXT_PX: Record<string, number> = {\n \"text-xs\": 12,\n \"text-sm\": 14,\n \"text-base\": 16,\n \"text-lg\": 18,\n \"text-xl\": 20,\n \"text-2xl\": 24,\n \"text-3xl\": 30,\n \"text-4xl\": 36,\n \"text-5xl\": 48,\n \"text-6xl\": 60,\n \"text-7xl\": 72,\n \"text-8xl\": 96,\n \"text-9xl\": 128,\n};\n\nconst rem = (px: number) => `${+(px / 16).toFixed(4)}rem`;\n\n/** CSS `clamp()` growing from `min` px on a phone to `max` px on a desktop. */\nexport function fluidFontSize({ min, max }: { min: number; max: number }): string {\n const slope = (max - min) / (FLUID_MAX_VIEWPORT - FLUID_MIN_VIEWPORT);\n const intercept = min - slope * FLUID_MIN_VIEWPORT;\n return `clamp(${rem(Math.min(min, max))}, ${rem(intercept)} + ${+(slope * 100).toFixed(4)}vw, ${rem(Math.max(min, max))})`;\n}\n\n/**\n * The theme's size for a level as a CSS value, exposed as `--pb-theme-size`\n * so a block's per-breakpoint overrides can fall back to it.\n */\nfunction themeSize(typography?: Typography): string | undefined {\n if (typography?.fluid) return fluidFontSize(typography.fluid);\n const px = TAILWIND_TEXT_PX[typography?.fontSize ?? \"\"];\n return px ? rem(px) : undefined;\n}\n\nexport function createHeading(\n displayName: string,\n defaultTag: HeadingTag,\n baseClasses: string,\n getTypography: (theme?: ThemeStyle) => Typography | undefined,\n): React.FC<HeadingProps> {\n const Heading: React.FC<HeadingProps> = ({\n children,\n className = \"\",\n theme,\n as: Tag = defaultTag,\n sizeClassName,\n style,\n ...props\n }) => {\n const typography = getTypography(theme);\n const fluid = typography?.fluid;\n const classes = cn(\n baseClasses,\n typography?.fontSize,\n // A class (not an inline font-size) so `sizeClassName` still wins.\n fluid && \"text-[length:var(--pb-theme-size)]\",\n sizeClassName,\n typography?.fontFamily,\n typography?.fontWeight,\n typography?.lineHeight,\n typography?.letterSpacing,\n typography?.textTransform,\n typography?.textDecoration,\n typography?.textOverflow,\n className,\n );\n\n return (\n <Tag\n className={classes}\n style={\n { \"--pb-theme-size\": themeSize(typography), ...style } as React.CSSProperties\n }\n {...props}\n >\n {children}\n </Tag>\n );\n };\n Heading.displayName = displayName;\n return Heading;\n}\n","import { createHeading } from \"./heading\";\n\nexport const Header4 = createHeading(\n \"Header4\",\n \"h4\",\n \"scroll-m-20 text-xl font-semibold tracking-normal\",\n (theme) => theme?.typography?.header4,\n);\n","import type React from \"react\";\nimport type { ThemeStyle } from \"../models\";\nimport { Header4 } from \"./header4\";\nimport { cn } from \"./lib/utils\";\n\nexport interface PageCardProps extends React.HTMLAttributes<HTMLDivElement> {\n isLink?: boolean;\n children: React.ReactNode;\n className?: string;\n theme?: ThemeStyle;\n}\n\nexport interface PageCardImageProps extends React.ImgHTMLAttributes<HTMLImageElement> {\n src: string;\n alt: string;\n className?: string;\n theme?: ThemeStyle;\n}\n\nexport interface PageCardContentProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n className?: string;\n theme?: ThemeStyle;\n}\n\nexport interface PageCardHeaderProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n className?: string;\n theme?: ThemeStyle;\n}\n\nexport const PageCard: React.FC<PageCardProps> = ({\n isLink,\n children,\n className = \"\",\n theme,\n ...props\n}) => {\n const cardStyles = theme?.interactives?.card;\n const classes = cn(\n // Base styles\n \"bg-card text-card-foreground\",\n // Theme interactivity\n cardStyles?.border?.width,\n cardStyles?.border?.radius,\n cardStyles?.border?.style,\n cardStyles?.shadow,\n isLink ? \"cursor-pointer\" : \"\",\n // User overrides\n cardStyles?.custom,\n className,\n );\n\n return (\n <div className={classes} {...props}>\n {children}\n </div>\n );\n};\n\nexport const PageCardImage: React.FC<PageCardImageProps> = ({\n src,\n alt,\n className = \"\",\n theme,\n ...props\n}) => {\n // const cardStyles = theme?.interactives?.card;\n const classes = cn(\n // Base styles\n \"w-full\",\n className,\n );\n\n return <img src={src} alt={alt} className={classes} {...props} />;\n};\n\nexport const PageCardContent: React.FC<PageCardContentProps> = ({\n children,\n className = \"\",\n theme,\n ...props\n}) => {\n const cardStyles = theme?.interactives?.card;\n const classes = cn(\n // Base styles\n \"p-4\",\n // Theme interactivity\n cardStyles?.padding?.x,\n cardStyles?.padding?.y,\n className,\n );\n\n return (\n <div className={classes} {...props}>\n {children}\n </div>\n );\n};\n\nexport const PageCardHeader: React.FC<PageCardHeaderProps> = ({\n children,\n className = \"\",\n theme,\n ...props\n}) => {\n const classes = cn(\n // Base styles\n \"pb-4\",\n className,\n );\n\n return (\n <div className={classes} {...props}>\n <Header4 theme={theme}>{children}</Header4>\n </div>\n );\n};\n","import { createHeading } from \"./heading\";\n\n/** Hero-sized headline, styled separately from section H1s. */\nexport const Display = createHeading(\n \"Display\",\n \"h1\",\n \"scroll-m-20 text-balance text-5xl font-bold tracking-tight\",\n (theme) => theme?.typography?.display ?? theme?.typography?.header1,\n);\n","import { createHeading } from \"./heading\";\n\nexport const Header1 = createHeading(\n \"Header1\",\n \"h1\",\n \"scroll-m-20 text-balance text-4xl font-bold tracking-tight\",\n (theme) => theme?.typography?.header1,\n);\n","import { createHeading } from \"./heading\";\n\nexport const Header2 = createHeading(\n \"Header2\",\n \"h2\",\n \"scroll-m-20 text-balance text-3xl font-bold tracking-tight\",\n (theme) => theme?.typography?.header2,\n);\n","import { createHeading } from \"./heading\";\n\nexport const Header3 = createHeading(\n \"Header3\",\n \"h3\",\n \"scroll-m-20 text-2xl font-semibold tracking-normal\",\n (theme) => theme?.typography?.header3,\n);\n","import type React from \"react\";\nimport type { ThemeStyle } from \"../models\";\nimport { cn } from \"./lib/utils\";\n\nexport interface LinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {\n children: React.ReactNode;\n className?: string;\n theme?: ThemeStyle;\n disabled?: boolean;\n style?: React.CSSProperties;\n}\n\nexport const Link: React.FC<LinkProps> = ({\n children,\n className = \"\",\n theme,\n disabled = false,\n style,\n ...props\n}) => {\n const typographyStyles = theme?.typography?.link;\n const linkStyles = theme?.interactives?.link;\n const classes = cn(\n // Base styles\n \"font-medium cursor-pointer\",\n // Theme typography\n typographyStyles?.fontFamily,\n typographyStyles?.fontSize,\n typographyStyles?.fontWeight,\n typographyStyles?.lineHeight,\n typographyStyles?.letterSpacing,\n typographyStyles?.textTransform,\n typographyStyles?.textDecoration,\n typographyStyles?.textOverflow,\n // Theme interactivity\n linkStyles?.padding?.x,\n linkStyles?.padding?.y,\n linkStyles?.border?.width,\n linkStyles?.border?.radius,\n linkStyles?.border?.style,\n // Theme disabled states\n disabled && linkStyles?.disabled?.color,\n disabled && linkStyles?.disabled?.background,\n disabled && linkStyles?.disabled?.border,\n disabled && linkStyles?.disabled?.opacity,\n disabled && linkStyles?.disabled?.cursor,\n // User overrides\n linkStyles?.custom,\n className,\n );\n\n return (\n <span\n className={classes}\n style={{\n ...style,\n textShadow: linkStyles?.textShadow || undefined,\n }}\n {...props}\n >\n {children}\n </span>\n );\n};\n","import type React from \"react\";\nimport { cn } from \"./lib/utils\";\nimport type { TypographyProps } from \"./typography\";\n\nexport const Preheader: React.FC<TypographyProps> = ({\n children,\n className = \"\",\n theme,\n ...props\n}) => {\n const typographyStyles = theme?.typography?.preheader;\n const classes = cn(\n // Base styles\n \"text-sm font-medium uppercase tracking-wide\",\n // Theme typography\n typographyStyles?.fontFamily,\n typographyStyles?.fontSize,\n typographyStyles?.fontWeight,\n typographyStyles?.lineHeight,\n typographyStyles?.letterSpacing,\n typographyStyles?.textTransform,\n typographyStyles?.textDecoration,\n typographyStyles?.textOverflow,\n className,\n );\n\n return (\n <p className={classes} {...props}>\n {children}\n </p>\n );\n};\n","import React from \"react\";\nimport type { SectionBackground, ThemeStyle } from \"../models\";\nimport { getMediaUrl } from \"../models/media\";\nimport { cn } from \"./lib/utils\";\n\ninterface SectionProps extends React.HTMLAttributes<HTMLElement> {\n children: React.ReactNode;\n className?: string;\n theme?: ThemeStyle;\n component?: \"header\" | \"footer\" | \"section\";\n background?: SectionBackground;\n}\n\ntype CssVars = React.CSSProperties & Record<`--${string}`, string | undefined>;\n\n/**\n * Dark-mode variants are resolved in CSS (`dark:` utilities reading custom\n * properties) rather than in JS, so a server-rendered section paints the\n * right palette without knowing the visitor's colour mode.\n */\nfunction resolveBackgroundLayer(background: SectionBackground): {\n className?: string;\n style: CssVars;\n} {\n const attachment = background.backgroundAttachment || \"scroll\";\n\n if (background.type === \"color\") {\n return {\n className:\n \"[background-color:var(--pb-bg)] dark:[background-color:var(--pb-bg-dark,var(--pb-bg))]\",\n style: {\n \"--pb-bg\": background.backgroundColor,\n \"--pb-bg-dark\": background.backgroundColorDark,\n },\n };\n }\n\n if (background.type === \"image\") {\n const bgUrl = getMediaUrl(background.media);\n return {\n style: {\n backgroundImage: bgUrl ? `url(${bgUrl})` : undefined,\n backgroundSize: background.backgroundSize || \"cover\",\n backgroundPosition: background.backgroundPosition || \"center\",\n backgroundRepeat: background.backgroundRepeat || \"no-repeat\",\n backgroundAttachment: attachment,\n maskImage: background.maskImage,\n WebkitMaskImage: background.maskImage,\n },\n };\n }\n\n // Pattern / gradient\n return {\n className:\n \"[background-image:var(--pb-bg-image)] dark:[background-image:var(--pb-bg-image-dark,var(--pb-bg-image))]\",\n style: {\n \"--pb-bg-image\": background.backgroundImage,\n \"--pb-bg-image-dark\": background.backgroundImageDark,\n backgroundSize: background.gradientBackgroundSize || \"cover\",\n backgroundPosition: background.gradientBackgroundPosition || \"center\",\n backgroundRepeat: background.gradientBackgroundRepeat || \"no-repeat\",\n backgroundAttachment: attachment,\n maskImage: background.gradientMaskImage,\n WebkitMaskImage: background.gradientMaskImage,\n },\n };\n}\n\nexport const Section: React.FC<SectionProps> = ({\n children,\n className = \"\",\n theme,\n background,\n component = \"section\",\n ...props\n}) => {\n const classes = cn(\n \"bg-background text-foreground relative\",\n component === \"section\" &&\n theme?.structure?.section?.dividers &&\n \"border-t border-border\",\n className,\n );\n const backgroundLayer = background ? resolveBackgroundLayer(background) : null;\n const isFixed =\n background &&\n background.type !== \"color\" &&\n background.backgroundAttachment === \"fixed\";\n\n return (\n <>\n {React.createElement(\n component as React.ElementType,\n {\n // `overflow-clip` keeps a fixed-attachment layer painted\n // only within the section bounds without creating a new\n // scroll container (unlike overflow-hidden in some cases).\n className: cn(classes, isFixed && \"overflow-clip\"),\n ...props,\n },\n <>\n {backgroundLayer && (\n <div\n aria-hidden\n className={cn(\n \"pointer-events-none absolute inset-0 z-0\",\n backgroundLayer.className,\n )}\n style={backgroundLayer.style}\n />\n )}\n {background && background.type === \"image\" && (\n <div\n aria-hidden\n className=\"pointer-events-none absolute inset-0 z-[1] [background-color:var(--pb-overlay)] dark:[background-color:var(--pb-overlay-dark,var(--pb-overlay))]\"\n style={\n {\n \"--pb-overlay\": background?.overlay?.color,\n \"--pb-overlay-dark\": background?.overlay?.colorDark,\n opacity: background?.overlay?.opacity\n ? background.overlay.opacity / 10\n : 0,\n mixBlendMode: background?.overlay?.blendMode,\n } as CssVars\n }\n />\n )}\n {background && background.type === \"image\" && (\n <div\n aria-hidden\n className=\"pointer-events-none absolute inset-0 z-[2]\"\n style={{\n backdropFilter: background?.blur\n ? `blur(${background?.blur}px)`\n : undefined,\n }}\n />\n )}\n <div\n className={cn(\n \"mx-auto z-[3] relative overflow-hidden\",\n `lg:${theme?.structure?.page?.width || \"max-w-6xl\"}`,\n theme?.structure?.section?.padding?.x || \"px-4\",\n theme?.structure?.section?.padding?.y || \"py-4\",\n )}\n >\n {children}\n </div>\n </>,\n )}\n </>\n );\n};\n","export interface Media {\n [key: string]: unknown;\n mediaId?: string;\n originalFileName?: string;\n fileName?: string;\n mimeType?: string;\n size?: number;\n caption?: string;\n alt?: string;\n /** Public URL of the asset (MediaLit format or generic URL format). */\n file?: string;\n url?: string;\n src?: string;\n /** Thumbnail URL, falls back to `file` or `url` when absent. */\n thumbnail?: string;\n thumbnailUrl?: string;\n}\n\nexport function getMediaUrl(media: unknown): string | null {\n if (!media) return null;\n if (typeof media === \"string\") return media.trim() || null;\n if (typeof media === \"object\") {\n const obj = media as Record<string, unknown>;\n const url = obj.url ?? obj.file ?? obj.src;\n return typeof url === \"string\" && url.trim() ? url.trim() : null;\n }\n return null;\n}\n\nexport function getMediaAlt(media: unknown): string {\n if (!media || typeof media !== \"object\") return \"\";\n const obj = media as Record<string, unknown>;\n const alt = obj.alt ?? obj.caption ?? obj.title;\n return typeof alt === \"string\" ? alt : \"\";\n}\n","import type React from \"react\";\nimport { cn } from \"./lib/utils\";\nimport type { TypographyProps } from \"./typography\";\n\nexport const Subheader1: React.FC<TypographyProps & { component?: \"h5\" | \"span\" }> = ({\n children,\n className = \"\",\n theme,\n component = \"h5\",\n ...props\n}) => {\n const typographyStyles = theme?.typography?.subheader1;\n const classes = cn(\n typographyStyles?.fontFamily || \"font-sans\",\n typographyStyles?.fontSize || \"text-lg\",\n typographyStyles?.fontWeight || \"font-medium\",\n typographyStyles?.lineHeight || \"leading-relaxed\",\n typographyStyles?.letterSpacing || \"tracking-normal\",\n typographyStyles?.textTransform,\n typographyStyles?.textDecoration,\n typographyStyles?.textOverflow,\n className,\n );\n\n return component === \"h5\" ? (\n <h5 className={classes} {...props}>\n {children}\n </h5>\n ) : (\n <span className={classes} {...props}>\n {children}\n </span>\n );\n};\n","import type React from \"react\";\nimport { cn } from \"./lib/utils\";\nimport type { TypographyProps } from \"./typography\";\n\nexport const Text1: React.FC<TypographyProps & { component?: \"p\" | \"span\" }> = ({\n children,\n className = \"\",\n theme,\n component = \"p\",\n ...props\n}) => {\n const typographyStyles = theme?.typography?.text1;\n const classes = cn(\n // Base styles\n \"text-base\",\n // Theme overrides\n typographyStyles?.fontFamily,\n typographyStyles?.fontSize,\n typographyStyles?.fontWeight,\n typographyStyles?.lineHeight,\n typographyStyles?.letterSpacing,\n typographyStyles?.textTransform,\n typographyStyles?.textDecoration,\n typographyStyles?.textOverflow,\n className,\n );\n\n return component === \"p\" ? (\n <p className={classes} {...props}>\n {children}\n </p>\n ) : (\n <span className={classes} {...props}>\n {children}\n </span>\n );\n};\n","import type React from \"react\";\nimport { cn } from \"./lib/utils\";\nimport type { TypographyProps } from \"./typography\";\n\nexport const Text2: React.FC<TypographyProps & { component?: \"p\" | \"span\" }> = ({\n children,\n className = \"\",\n theme,\n component = \"p\",\n ...props\n}) => {\n const typographyStyles = theme?.typography?.text2;\n const classes = cn(\n // Base styles\n \"text-sm\",\n // Theme overrides\n typographyStyles?.fontFamily,\n typographyStyles?.fontSize,\n typographyStyles?.fontWeight,\n typographyStyles?.lineHeight,\n typographyStyles?.letterSpacing,\n typographyStyles?.textTransform,\n typographyStyles?.textDecoration,\n typographyStyles?.textOverflow,\n className,\n );\n\n return component === \"p\" ? (\n <p className={classes} {...props}>\n {children}\n </p>\n ) : (\n <span className={classes} {...props}>\n {children}\n </span>\n );\n};\n","import type { ThemeStyle } from \"../../models\";\nimport type { HeaderNavLink } from \"./settings\";\nimport { NavLink } from \"../../components/nav-link\";\nimport { Button, Link as PrimitiveLink } from \"../../primitives\";\n\nexport function HeaderLink({\n link,\n theme,\n onClick,\n fullWidth = false,\n}: {\n link: HeaderNavLink;\n theme?: ThemeStyle;\n onClick?: () => void;\n /** Mobile menu: button links span the sheet, like the CTA. */\n fullWidth?: boolean;\n}) {\n if (link.isButton) {\n return (\n <NavLink href={link.href} onClick={onClick}>\n <Button\n size={fullWidth ? undefined : \"sm\"}\n theme={theme}\n className={fullWidth ? \"w-full\" : undefined}\n >\n {link.label}\n </Button>\n </NavLink>\n );\n }\n\n return (\n <NavLink href={link.href} onClick={onClick} className=\"no-underline\">\n <PrimitiveLink theme={theme} className=\"no-underline\">\n {link.label}\n </PrimitiveLink>\n </NavLink>\n );\n}\n","/** `owner/repo` from `owner/repo` or a `https://github.com/owner/repo` URL. */\nexport function parseGithubRepo(value?: string): string | undefined {\n const match = value\n ?.trim()\n .match(/^(?:https?:\\/\\/(?:www\\.)?github\\.com\\/)?([\\w.-]+\\/[\\w.-]+?)(?:\\.git)?\\/?$/);\n return match?.[1];\n}\n\n/** 1234 → \"1.2k\", like GitHub's own star count. */\nexport function formatStars(count: number): string {\n return new Intl.NumberFormat(\"en\", {\n notation: \"compact\",\n maximumFractionDigits: 1,\n })\n .format(count)\n .toLowerCase();\n}\n","export function generateUniqueId(): string {\n return Math.random().toString(36).slice(2) + Date.now().toString(36);\n}\n","import type { HeaderSettings } from \"./settings\";\nimport { generateUniqueId } from \"../../utils/generate-unique-id\";\n\nexport const headerDefaults: Partial<HeaderSettings> = {\n logoCorners: 2,\n links: [\n { id: generateUniqueId(), label: \"Features\", href: \"/#features\" },\n { id: generateUniqueId(), label: \"Pricing\", href: \"/#pricing\" },\n { id: generateUniqueId(), label: \"Docs\", href: \"/docs\" },\n { id: generateUniqueId(), label: \"Blog\", href: \"/blog\" },\n ],\n ctaLabel: \"Get started\",\n ctaHref: \"/help\",\n linkAlignment: \"left\",\n layout: \"fixed\",\n backdropBlur: false,\n // Slider value 1. Keeps a new header compact instead of inheriting the\n // theme's content-section padding (`py-12` / slider 5 on most themes).\n verticalPadding: \"py-4\",\n};\n","import React from \"react\";\nimport type { HeadingLevel, ResponsiveTextSize, ThemeStyle } from \"../../models\";\nimport { cn } from \"../../primitives/lib/utils\";\n\n/**\n * Props for a block title: its heading element plus the block's own size\n * overrides. Tablet and desktop use the `md` and `lg` breakpoints; a\n * breakpoint without an override keeps the theme size, read from the\n * heading's `--pb-theme-size`.\n */\nexport function titleProps(\n {\n titleLevel,\n titleSize,\n }: { titleLevel?: HeadingLevel; titleSize?: ResponsiveTextSize },\n defaultLevel: HeadingLevel = \"h2\",\n /** The block's own default size, e.g. a compact layout's `text-xl`. */\n baseSizeClassName?: string,\n): {\n as: HeadingLevel;\n sizeClassName: string;\n style: React.CSSProperties;\n} {\n const { mobile, tablet, desktop } = titleSize ?? {};\n const size = (value?: number) => (value ? `${value}px` : \"var(--pb-theme-size, 1em)\");\n return {\n as: titleLevel ?? defaultLevel,\n sizeClassName: cn(\n baseSizeClassName,\n mobile && \"text-[length:var(--pb-title-mobile)]\",\n (mobile || tablet) && \"md:text-[length:var(--pb-title-tablet)]\",\n (tablet || desktop) && \"lg:text-[length:var(--pb-title-desktop)]\",\n ),\n style: {\n \"--pb-title-mobile\": mobile ? size(mobile) : undefined,\n \"--pb-title-tablet\": mobile || tablet ? size(tablet) : undefined,\n \"--pb-title-desktop\": tablet || desktop ? size(desktop) : undefined,\n } as React.CSSProperties,\n };\n}\n\nconst HIGHLIGHT_CLASSES = {\n color: \"text-primary\",\n marker: \"bg-primary px-[0.15em] text-primary-foreground [box-decoration-break:clone]\",\n};\n\n/**\n * Renders a block title, making words wrapped in `*asterisks*` stand out\n * in the theme's highlight style, e.g. \"Run them *anywhere*\".\n */\nexport function renderTitle(title?: string, theme?: ThemeStyle): React.ReactNode {\n if (!title?.includes(\"*\")) return title;\n const className = HIGHLIGHT_CLASSES[theme?.highlight ?? \"color\"];\n return title\n .split(/(\\*[^*]+\\*)/)\n .map((part, index) =>\n /^\\*[^*]+\\*$/.test(part)\n ? React.createElement(\"span\", { key: index, className }, part.slice(1, -1))\n : part,\n );\n}\n","import React from \"react\";\nimport type { WidgetProps } from \"../../models\";\nimport type { ThemeStyle } from \"../../models\";\nimport { getMediaUrl, getMediaAlt } from \"../../models/media\";\nimport type { HeroSettings } from \"./settings\";\nimport { renderTitle, titleProps } from \"../_shared/title\";\nimport { Image } from \"../../components/image\";\nimport { NavLink } from \"../../components/nav-link\";\nimport { TextRenderer } from \"../../components/text-renderer\";\nimport { VideoWithPreview } from \"../../components/video-with-preview\";\nimport { CodeSnippet } from \"../../primitives/code-snippet\";\nimport { isVideo } from \"../../utils\";\nimport clsx from \"clsx\";\nimport {\n Button,\n Caption,\n Display,\n Preheader,\n Subheader1,\n Section,\n PageCard,\n PageCardContent,\n} from \"../../primitives\";\n\nconst roundedMap: Record<number, string> = {\n 0: \"rounded-none\",\n 1: \"rounded-sm\",\n 2: \"rounded\",\n 3: \"rounded-md\",\n 4: \"rounded-lg\",\n 5: \"rounded-xl\",\n 6: \"rounded-2xl\",\n 7: \"rounded-3xl\",\n 8: \"rounded-full\",\n};\n\nexport function HeroWidget({\n settings: {\n preTitle,\n title,\n description,\n buttonCaption,\n buttonAction,\n media,\n youtubeLink,\n alignment = \"right\",\n mediaRadius = 3,\n contentAlignment = \"left\",\n secondaryButtonAction,\n secondaryButtonCaption,\n smallPrint,\n command,\n titleLevel,\n titleSize,\n cssId,\n maxWidth,\n verticalPadding,\n background,\n layout = \"normal\",\n },\n state: { theme },\n}: WidgetProps<HeroSettings>) {\n const overriddenTheme: ThemeStyle = JSON.parse(JSON.stringify(theme.theme));\n overriddenTheme.structure.page.width = maxWidth || theme.theme.structure.page.width;\n overriddenTheme.structure.section.padding.y =\n verticalPadding || theme.theme.structure.section.padding.y;\n\n const mediaUrl = getMediaUrl(media);\n const hasHeroGraphic = Boolean(youtubeLink || mediaUrl);\n const direction = alignment === \"right\" ? \"md:!flex-row-reverse\" : \"md:!flex-row\";\n const isCentered = layout === \"centered\" || layout === \"media-below\";\n\n const graphic = hasHeroGraphic && (\n <div\n className={`w-full overflow-hidden ${roundedMap[mediaRadius] ?? \"rounded-md\"}`}\n >\n {isVideo(youtubeLink, media) ? (\n <VideoWithPreview\n videoUrl={youtubeLink || mediaUrl || \"\"}\n title={getMediaAlt(media) || (media as any)?.caption || \"\"}\n thumbnailUrl={(media as any)?.thumbnail || (media as any)?.thumbnailUrl || \"\"}\n />\n ) : (\n <Image\n src={mediaUrl || \"\"}\n alt={getMediaAlt(media)}\n borderRadius={mediaRadius}\n // The hero sits at the top of the page, so its image is the LCP.\n priority\n />\n )}\n </div>\n );\n\n const textContent = (\n <div\n className={clsx(\n \"flex flex-col gap-4\",\n isCentered || contentAlignment === \"center\"\n ? \"items-center text-center\"\n : \"items-start justify-center h-full\",\n )}\n >\n {preTitle && (\n <Preheader theme={overriddenTheme} className=\"text-muted-foreground\">\n {preTitle}\n </Preheader>\n )}\n <Display theme={overriddenTheme} {...titleProps({ titleLevel, titleSize }, \"h1\")}>\n {renderTitle(title, overriddenTheme)}\n </Display>\n {description && (\n <Subheader1 theme={overriddenTheme} component=\"span\">\n <TextRenderer json={description} theme={overriddenTheme} />\n </Subheader1>\n )}\n <div\n className={clsx(\n \"flex flex-col md:!flex-row gap-2 w-full\",\n (isCentered || contentAlignment === \"center\") && \"md:!justify-center\",\n )}\n >\n {buttonAction && buttonCaption && (\n <NavLink href={buttonAction}>\n <Button theme={overriddenTheme} className=\"w-full md:min-w-[150px]\">\n {buttonCaption}\n </Button>\n </NavLink>\n )}\n {secondaryButtonAction && secondaryButtonCaption && (\n <NavLink href={secondaryButtonAction}>\n <Button\n theme={overriddenTheme}\n variant=\"secondary\"\n className=\"w-full md:min-w-[150px]\"\n >\n {secondaryButtonCaption}\n </Button>\n </NavLink>\n )}\n </div>\n {command && (\n <CodeSnippet\n code={command}\n prompt=\"$\"\n theme={overriddenTheme}\n className=\"max-w-xl\"\n />\n )}\n {smallPrint && <Caption theme={overriddenTheme}>{smallPrint}</Caption>}\n </div>\n );\n\n let mainContent: React.ReactNode;\n if (layout === \"centered\") {\n // Text-only, no media — the minimalist SaaS hero (Linear, Vercel).\n mainContent = (\n <div className=\"mx-auto flex max-w-2xl flex-col gap-4\">{textContent}</div>\n );\n } else if (layout === \"media-below\") {\n // Centered headline with a large screenshot/media beneath it — the\n // classic \"product hero\" pattern (Stripe, Vercel, Linear).\n mainContent = (\n <div className=\"flex flex-col gap-10\">\n <div className=\"mx-auto flex max-w-2xl flex-col gap-4\">{textContent}</div>\n {graphic && <div className=\"w-full\">{graphic}</div>}\n </div>\n );\n } else {\n mainContent = (\n <div className={clsx(\"flex flex-col gap-8\", direction)}>\n {graphic && <div className=\"w-full md:w-1/2 flex items-center\">{graphic}</div>}\n <div className={`w-full ${hasHeroGraphic ? \"md:w-1/2\" : \"\"}`}>\n {textContent}\n </div>\n </div>\n );\n }\n\n return (\n <Section theme={overriddenTheme} id={cssId} background={background}>\n {layout === \"card\" ? (\n <PageCard theme={overriddenTheme}>\n <PageCardContent theme={overriddenTheme}>{mainContent}</PageCardContent>\n </PageCard>\n ) : (\n mainContent\n )}\n </Section>\n );\n}\n","// Rich-text rendering lives in @frontlit/text-editor.\nexport { TextRenderer } from \"@frontlit/text-editor/renderer\";\n","import type { Media } from \"../models\";\n\nexport function isVideo(youtubeLink?: string, media?: Partial<Media>) {\n return Boolean(\n youtubeLink || (media && RegExp(\"video/\").test(media?.mimeType || \"\")),\n );\n}\n","import type { HeroSettings } from \"./settings\";\n\nexport const heroDefaults: Partial<HeroSettings> = {\n title: \"Run your whole business from one front office\",\n buttonCaption: \"See features\",\n buttonAction: \"/#features\",\n secondaryButtonCaption: \"Read the docs\",\n secondaryButtonAction: \"/docs\",\n alignment: \"right\",\n contentAlignment: \"left\",\n mediaRadius: 3,\n layout: \"normal\",\n};\n","import React from \"react\";\nimport clsx from \"clsx\";\nimport type { WidgetProps, ThemeStyle } from \"../../models\";\nimport { getMediaUrl, getMediaAlt } from \"../../models/media\";\nimport type { ContentSettings } from \"./settings\";\nimport { renderTitle, titleProps } from \"../_shared/title\";\nimport { Image } from \"../../components/image\";\nimport { TextRenderer } from \"../../components/text-renderer\";\nimport { Header2, Section } from \"../../primitives\";\n\nconst roundedMap: Record<number, string> = {\n 0: \"rounded-none\",\n 1: \"rounded-sm\",\n 2: \"rounded\",\n 3: \"rounded-md\",\n 4: \"rounded-lg\",\n 5: \"rounded-xl\",\n 6: \"rounded-2xl\",\n 7: \"rounded-3xl\",\n 8: \"rounded-full\",\n};\n\nexport function ContentWidget({\n settings: {\n title,\n titleLevel,\n titleSize,\n body,\n media,\n alignment = \"left\",\n headerAlignment = \"left\",\n mediaRadius = 3,\n layout = \"side\",\n cssId,\n maxWidth,\n verticalPadding,\n background,\n },\n state: { theme },\n}: WidgetProps<ContentSettings>) {\n const overriddenTheme: ThemeStyle = JSON.parse(JSON.stringify(theme.theme));\n overriddenTheme.structure.page.width = maxWidth || theme.theme.structure.page.width;\n overriddenTheme.structure.section.padding.y =\n verticalPadding || theme.theme.structure.section.padding.y;\n\n const mediaUrl = getMediaUrl(media);\n const mediaAlt = getMediaAlt(media);\n const hasMedia = Boolean(mediaUrl);\n const sideBySide = layout !== \"stacked\" && layout !== \"overlay\";\n const direction = alignment === \"right\" ? \"md:!flex-row-reverse\" : \"md:!flex-row\";\n\n if (layout === \"overlay\") {\n // Media fills the section as a background; the text sits in a card\n // on top — a \"feature spotlight\" pattern common on product pages.\n const textPosition =\n alignment === \"right\" ? \"items-end text-right\" : \"items-start text-left\";\n return (\n <Section theme={overriddenTheme} id={cssId} background={background}>\n <div className=\"relative min-h-[420px] w-full overflow-hidden rounded-xl\">\n {hasMedia && (\n <Image\n src={mediaUrl || \"\"}\n alt={mediaAlt}\n width=\"w-full\"\n height=\"h-full\"\n className=\"absolute inset-0\"\n borderRadius={0}\n />\n )}\n <div className=\"absolute inset-0 bg-gradient-to-t from-black/70 via-black/20 to-transparent\" />\n <div\n className={clsx(\n \"relative flex h-full flex-col justify-end gap-4 p-6 md:p-10\",\n textPosition,\n )}\n >\n <div className=\"max-w-lg text-white\">\n {title && (\n <Header2\n theme={overriddenTheme}\n {...titleProps({ titleLevel, titleSize })}\n >\n {renderTitle(title, overriddenTheme)}\n </Header2>\n )}\n {body && <TextRenderer json={body} theme={overriddenTheme} />}\n </div>\n </div>\n </div>\n </Section>\n );\n }\n\n return (\n <Section theme={overriddenTheme} id={cssId} background={background}>\n <div className={clsx(\"flex flex-col gap-8\", sideBySide && direction)}>\n {hasMedia && (\n <div className={clsx(\"flex w-full items-center\", sideBySide && \"md:w-1/2\")}>\n <div\n className={`w-full overflow-hidden ${\n roundedMap[mediaRadius] ?? \"rounded-md\"\n }`}\n >\n <Image src={mediaUrl || \"\"} alt={mediaAlt} borderRadius={mediaRadius} />\n </div>\n </div>\n )}\n <div className={clsx(\"w-full\", hasMedia && sideBySide && \"md:w-1/2\")}>\n <div\n className={clsx(\n \"flex h-full flex-col justify-center gap-4\",\n headerAlignment === \"center\" ? \"items-center text-center\" : \"items-start\",\n )}\n >\n {title && (\n <Header2\n theme={overriddenTheme}\n {...titleProps({ titleLevel, titleSize })}\n >\n {renderTitle(title, overriddenTheme)}\n </Header2>\n )}\n {body && <TextRenderer json={body} theme={overriddenTheme} />}\n </div>\n </div>\n </div>\n </Section>\n );\n}\n","import type { ContentSettings } from \"./settings\";\n\nexport const contentDefaults: Partial<ContentSettings> = {\n title: \"One dashboard, every channel\",\n body: {\n type: \"doc\",\n content: [\n {\n type: \"paragraph\",\n content: [\n {\n type: \"text\",\n text: \"FrontLit brings your website, content, customer support, and audience engagement into one connected front office.\",\n },\n ],\n },\n ],\n },\n alignment: \"left\",\n headerAlignment: \"left\",\n mediaRadius: 3,\n};\n","import React from \"react\";\nimport clsx from \"clsx\";\nimport * as Icons from \"lucide-react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport type { ThemeStyle, WidgetProps } from \"../../models\";\nimport type { FeaturedSettings } from \"./settings\";\nimport { renderTitle, titleProps } from \"../_shared/title\";\nimport { TextRenderer } from \"../../components/text-renderer\";\nimport {\n Header1,\n Header4,\n PageCard,\n PageCardContent,\n Section,\n Subheader1,\n Text2,\n} from \"../../primitives\";\n\n/**\n * Resolves a lucide-react icon by name, falling back to a safe default when\n * the configured name doesn't match a known icon (e.g. a typo in settings).\n */\nfunction resolveIcon(name?: string): LucideIcon {\n if (!name) return Icons.Sparkles;\n const icon = (Icons as unknown as Record<string, LucideIcon>)[name];\n // Lucide icons are `React.forwardRef` components (objects), not plain\n // functions, so we can't gate on `typeof icon === \"function\"` here.\n return icon ?? Icons.Sparkles;\n}\n\nexport function FeaturedWidget({\n settings: {\n title,\n titleLevel,\n titleSize,\n description,\n headerAlignment = \"center\",\n items,\n layout = \"grid\",\n cssId,\n maxWidth,\n verticalPadding,\n background,\n },\n state: { theme },\n}: WidgetProps<FeaturedSettings>) {\n const overriddenTheme: ThemeStyle = JSON.parse(JSON.stringify(theme.theme));\n overriddenTheme.structure.page.width = maxWidth || theme.theme.structure.page.width;\n overriddenTheme.structure.section.padding.y =\n verticalPadding || theme.theme.structure.section.padding.y;\n\n return (\n <Section theme={overriddenTheme} id={cssId} background={background}>\n <div className=\"flex flex-col gap-8\">\n <div\n className={clsx(\n \"flex flex-col gap-4\",\n headerAlignment === \"center\" ? \"items-center text-center\" : \"items-start\",\n )}\n >\n <Header1 theme={overriddenTheme} {...titleProps({ titleLevel, titleSize })}>\n {renderTitle(title, overriddenTheme)}\n </Header1>\n {description && (\n <Subheader1 theme={overriddenTheme} component=\"span\">\n <TextRenderer json={description} theme={overriddenTheme} />\n </Subheader1>\n )}\n </div>\n {items && items.length > 0 && layout === \"numbered\" && (\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8\">\n {items.map((item, index) => (\n <div key={index} className=\"flex flex-col gap-2\">\n <span className=\"text-3xl font-bold text-primary/30\">\n {String(index + 1).padStart(2, \"0\")}\n </span>\n <Header4 theme={overriddenTheme}>{item.title}</Header4>\n {item.description && (\n <Text2 theme={overriddenTheme}>{item.description}</Text2>\n )}\n </div>\n ))}\n </div>\n )}\n {items && items.length > 0 && layout !== \"numbered\" && (\n <div\n className={clsx(\n layout === \"list\" && \"flex flex-col gap-4\",\n layout === \"compact\" &&\n \"grid grid-cols-2 md:grid-cols-4 gap-4 items-stretch\",\n layout !== \"list\" &&\n layout !== \"compact\" &&\n \"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6 items-stretch\",\n )}\n >\n {items.map((item, index) => {\n const Icon = resolveIcon(item.icon);\n return (\n <PageCard key={index} theme={overriddenTheme}>\n <PageCardContent\n theme={overriddenTheme}\n className={clsx(\n \"h-full flex gap-3\",\n layout === \"list\" ? \"flex-row items-start\" : \"flex-col\",\n layout === \"compact\" && \"items-center text-center gap-2\",\n )}\n >\n <div\n className={clsx(\n \"flex shrink-0 items-center justify-center rounded-md bg-primary/10 text-primary\",\n layout === \"compact\" ? \"h-8 w-8\" : \"h-10 w-10\",\n )}\n >\n <Icon className=\"h-5 w-5\" />\n </div>\n <div\n className={clsx(\n \"flex flex-col gap-2\",\n layout === \"compact\" && \"items-center gap-1\",\n )}\n >\n <Header4 theme={overriddenTheme}>{item.title}</Header4>\n {item.description && layout !== \"compact\" && (\n <Text2 theme={overriddenTheme}>{item.description}</Text2>\n )}\n </div>\n </PageCardContent>\n </PageCard>\n );\n })}\n </div>\n )}\n </div>\n </Section>\n );\n}\n","import type { FeaturedSettings } from \"./settings\";\n\nexport const featuredDefaults: Partial<FeaturedSettings> = {\n title: \"Everything you need to run your business online\",\n headerAlignment: \"center\",\n items: [\n {\n title: \"Website\",\n description: \"Design and publish beautiful pages with a drag-and-drop editor.\",\n icon: \"Globe\",\n },\n {\n title: \"Content\",\n description:\n \"Publish articles, documentation, and product updates from one content system.\",\n icon: \"Newspaper\",\n },\n {\n title: \"Support\",\n description:\n \"Support customers with a shared inbox, ticketing, help center, and AI answers.\",\n icon: \"LifeBuoy\",\n },\n {\n title: \"Engage\",\n description: \"Grow your audience and send email without leaving FrontLit.\",\n icon: \"Mail\",\n },\n ],\n};\n","import React, { useId } from \"react\";\nimport clsx from \"clsx\";\nimport { ChevronDown } from \"lucide-react\";\nimport type { WidgetProps, ThemeStyle } from \"../../models\";\nimport type { FaqSettings } from \"./settings\";\nimport { renderTitle, titleProps } from \"../_shared/title\";\nimport { Header2, Section, Text1 } from \"../../primitives\";\n\nexport function FaqWidget({\n settings: {\n title,\n titleLevel,\n titleSize,\n headerAlignment = \"left\",\n items = [],\n layout = \"list\",\n cssId,\n maxWidth,\n verticalPadding,\n background,\n },\n state: { theme },\n}: WidgetProps<FaqSettings>) {\n const overriddenTheme: ThemeStyle = JSON.parse(JSON.stringify(theme.theme));\n overriddenTheme.structure.page.width = maxWidth || theme.theme.structure.page.width;\n overriddenTheme.structure.section.padding.y =\n verticalPadding || theme.theme.structure.section.padding.y;\n\n // Native <details> keeps every answer in the server-rendered HTML (so\n // crawlers see it) and works without JS; a shared `name` makes them an\n // exclusive accordion.\n const groupName = useId();\n\n return (\n <Section theme={overriddenTheme} id={cssId} background={background}>\n <div className=\"flex flex-col gap-6\">\n {title && (\n <div\n className={clsx(\n \"flex flex-col\",\n headerAlignment === \"center\" ? \"items-center text-center\" : \"items-start\",\n )}\n >\n <Header2 theme={overriddenTheme} {...titleProps({ titleLevel, titleSize })}>\n {renderTitle(title, overriddenTheme)}\n </Header2>\n </div>\n )}\n {items.length > 0 &&\n (() => {\n const renderItem = (item: (typeof items)[number], index: number) => (\n <details\n key={item.id}\n name={groupName}\n open={index === 0}\n className={clsx(\n \"group\",\n layout === \"cards\"\n ? \"rounded-lg border border-border bg-card px-4 py-4\"\n : layout === \"columns\"\n ? \"border-b border-border py-4\"\n : \"py-4\",\n )}\n >\n <summary className=\"flex w-full cursor-pointer list-none items-center justify-between gap-4 text-left [&::-webkit-details-marker]:hidden\">\n <Text1 theme={overriddenTheme} className=\"font-medium\">\n {item.question}\n </Text1>\n <ChevronDown className=\"h-4 w-4 shrink-0 transition-transform group-open:rotate-180\" />\n </summary>\n <div className=\"pt-3\">\n <Text1 theme={overriddenTheme} className=\"text-muted-foreground\">\n {item.answer}\n </Text1>\n </div>\n </details>\n );\n\n if (layout === \"columns\") {\n // Two side-by-side lists — the left column gets\n // the first half of items, the right column the\n // rest, a common layout for FAQ sections with\n // many questions.\n const half = Math.ceil(items.length / 2);\n const left = items.slice(0, half);\n const right = items.slice(half);\n return (\n <div className=\"grid grid-cols-1 gap-x-10 md:grid-cols-2\">\n <div className=\"flex flex-col\">\n {left.map((item, i) => renderItem(item, i))}\n </div>\n <div className=\"flex flex-col\">\n {right.map((item, i) => renderItem(item, half + i))}\n </div>\n </div>\n );\n }\n\n return (\n <div\n className={\n layout === \"cards\"\n ? \"flex flex-col gap-3\"\n : \"flex flex-col divide-y divide-border border-b border-t border-border\"\n }\n >\n {items.map((item, index) => renderItem(item, index))}\n </div>\n );\n })()}\n </div>\n </Section>\n );\n}\n","import type { FaqSettings } from \"./settings\";\nimport { generateUniqueId } from \"../../utils/generate-unique-id\";\n\nexport const faqDefaults: Partial<FaqSettings> = {\n title: \"Frequently asked questions\",\n headerAlignment: \"left\",\n items: [\n {\n id: generateUniqueId(),\n question: \"What can I build with FrontLit?\",\n answer:\n \"A marketing website, articles, documentation, product updates, customer support, and email — all from one connected dashboard.\",\n },\n {\n id: generateUniqueId(),\n question: \"Do I need to know how to code?\",\n answer:\n \"No. Every page is assembled from ready-made blocks like this one, and you can customize copy, media and layout without touching code.\",\n },\n {\n id: generateUniqueId(),\n question: \"Can I use my own domain?\",\n answer:\n \"Yes, every FrontLit site can be connected to a custom domain in a few clicks.\",\n },\n {\n id: generateUniqueId(),\n question: \"Is there a free plan?\",\n answer: \"Yes, you can get started for free and upgrade as your audience grows.\",\n },\n ],\n};\n","import React from \"react\";\nimport clsx from \"clsx\";\nimport type { ThemeStyle, WidgetProps } from \"../../models\";\nimport type { PricingSettings, PricingTier } from \"./settings\";\nimport { PricingPeriodSwitch } from \"./period-switch\";\nimport { renderTitle, titleProps } from \"../_shared/title\";\nimport { NavLink } from \"../../components/nav-link\";\nimport { TextRenderer } from \"../../components/text-renderer\";\nimport {\n Badge,\n Button,\n Header1,\n PageCard,\n PageCardContent,\n PageCardHeader,\n Preheader,\n Section,\n Subheader1,\n Text1,\n Text2,\n} from \"../../primitives\";\n\n// Static class names so Tailwind keeps them. 4+ plans wrap at 4 per row.\nconst lgColumns: Record<number, string> = {\n 1: \"lg:grid-cols-1\",\n 2: \"lg:grid-cols-2\",\n 3: \"lg:grid-cols-3\",\n 4: \"lg:grid-cols-4\",\n};\n\n// With the period switch on, both values are rendered and the wrapper's\n// `data-period` (set by `PricingPeriodSwitch`) picks which one shows.\nconst monthlyOnly = \"group-data-[period=yearly]/pricing:hidden\";\nconst yearlyOnly = \"hidden group-data-[period=yearly]/pricing:block\";\n\nexport function PricingWidget({\n settings: {\n title,\n titleLevel,\n titleSize,\n description,\n headerAlignment = \"center\",\n tiers,\n layout = \"grid\",\n pricingSwitcher,\n monthlyPriceCaption,\n yearlyPriceCaption,\n defaultPeriod = \"yearly\",\n cssId,\n maxWidth,\n verticalPadding,\n background,\n },\n state: { theme },\n}: WidgetProps<PricingSettings>) {\n const overriddenTheme: ThemeStyle = JSON.parse(JSON.stringify(theme.theme));\n overriddenTheme.structure.page.width = maxWidth || theme.theme.structure.page.width;\n overriddenTheme.structure.section.padding.y =\n verticalPadding || theme.theme.structure.section.padding.y;\n\n const plans = tiers && tiers.length > 0 && (\n <div\n className={clsx(\n layout === \"stacked\"\n ? \"mx-auto flex w-full max-w-xl flex-col gap-6\"\n : [\n \"grid grid-cols-1 gap-6 items-stretch\",\n tiers.length === 1 && \"mx-auto w-full max-w-xl\",\n tiers.length >= 2 && \"md:grid-cols-2\",\n lgColumns[Math.min(tiers.length, 4)],\n ],\n )}\n >\n {tiers.map((tier, index) => (\n <PageCard\n key={index}\n theme={overriddenTheme}\n className={clsx(\n tier.highlighted && \"ring-2 ring-primary\",\n layout === \"highlight\" &&\n tier.highlighted &&\n \"relative z-10 shadow-xl md:-translate-y-3\",\n )}\n >\n <PageCardContent\n theme={overriddenTheme}\n className=\"h-full flex flex-col gap-4\"\n >\n <div className=\"flex items-center justify-between gap-2\">\n <Preheader theme={overriddenTheme}>{tier.name}</Preheader>\n {tier.highlighted && <Badge theme={overriddenTheme}>Most popular</Badge>}\n </div>\n <PageCardHeader theme={overriddenTheme}>\n {pricingSwitcher ? (\n <>\n <span className={monthlyOnly}>{tier.price}</span>\n <span className={yearlyOnly}>{tier.priceYearly || tier.price}</span>\n </>\n ) : (\n tier.price\n )}\n </PageCardHeader>\n {tier.description && (\n <Text1 theme={overriddenTheme}>{tier.description}</Text1>\n )}\n {tier.features && tier.features.length > 0 && (\n <div className=\"grow flex flex-col gap-2\">\n {tier.features.map((feature, i) => (\n <Text2 key={i} theme={overriddenTheme}>\n {feature}\n </Text2>\n ))}\n </div>\n )}\n {pricingSwitcher &&\n tier.buttonActionYearly &&\n tier.buttonActionYearly !== tier.buttonAction ? (\n <>\n <TierButton\n tier={tier}\n href={tier.buttonAction}\n className={monthlyOnly}\n theme={overriddenTheme}\n />\n <TierButton\n tier={tier}\n href={tier.buttonActionYearly}\n className={yearlyOnly}\n theme={overriddenTheme}\n />\n </>\n ) : (\n <TierButton\n tier={tier}\n href={tier.buttonAction}\n theme={overriddenTheme}\n />\n )}\n </PageCardContent>\n </PageCard>\n ))}\n </div>\n );\n\n return (\n <Section theme={overriddenTheme} id={cssId} background={background}>\n <div className=\"flex flex-col gap-8\">\n <div\n className={clsx(\n \"flex flex-col gap-4\",\n headerAlignment === \"center\" ? \"items-center text-center\" : \"items-start\",\n )}\n >\n <Header1 theme={overriddenTheme} {...titleProps({ titleLevel, titleSize })}>\n {renderTitle(title, overriddenTheme)}\n </Header1>\n {description && (\n <Subheader1 theme={overriddenTheme} component=\"span\">\n <TextRenderer json={description} theme={overriddenTheme} />\n </Subheader1>\n )}\n </div>\n {tiers &&\n tiers.length > 0 &&\n (pricingSwitcher ? (\n <PricingPeriodSwitch\n defaultPeriod={defaultPeriod}\n monthlyCaption={monthlyPriceCaption || \"Monthly\"}\n yearlyCaption={yearlyPriceCaption || \"Yearly\"}\n theme={overriddenTheme}\n >\n {plans}\n </PricingPeriodSwitch>\n ) : (\n plans\n ))}\n </div>\n </Section>\n );\n}\n\nfunction TierButton({\n tier,\n href,\n className,\n theme,\n}: {\n tier: PricingTier;\n href?: string;\n className?: string;\n theme: ThemeStyle;\n}) {\n if (!href || !tier.buttonCaption) return null;\n return (\n <NavLink href={href} className={clsx(\"w-full mt-auto\", className)}>\n <Button\n theme={theme}\n variant={tier.highlighted ? \"default\" : \"secondary\"}\n className=\"w-full\"\n >\n {tier.buttonCaption}\n </Button>\n </NavLink>\n );\n}\n","import type { PricingSettings } from \"./settings\";\n\nexport const pricingDefaults: Partial<PricingSettings> = {\n title: \"Simple, transparent pricing\",\n headerAlignment: \"center\",\n tiers: [\n {\n name: \"Starter\",\n price: \"$0/mo\",\n description: \"For hobby sites and side projects.\",\n features: [\"1 website\", \"FrontLit branding\", \"Community support\"],\n buttonCaption: \"Get started\",\n buttonAction: \"/help\",\n },\n {\n name: \"Pro\",\n price: \"$29/mo\",\n description: \"For growing businesses that need more.\",\n features: [\"5 websites\", \"Custom domain\", \"Blog + Email\", \"Priority support\"],\n buttonCaption: \"Talk to us\",\n buttonAction: \"/help\",\n highlighted: true,\n },\n {\n name: \"Business\",\n price: \"$79/mo\",\n description: \"For teams that need scale and control.\",\n features: [\n \"Unlimited websites\",\n \"Help desk & chatbot\",\n \"Team seats\",\n \"Dedicated support\",\n ],\n buttonCaption: \"Contact sales\",\n buttonAction: \"/help\",\n },\n ],\n};\n","import React from \"react\";\nimport clsx from \"clsx\";\nimport type { ThemeStyle, WidgetProps } from \"../../models\";\nimport type { BannerSettings } from \"./settings\";\nimport { renderTitle, titleProps } from \"../_shared/title\";\nimport { NavLink } from \"../../components/nav-link\";\nimport { TextRenderer } from \"../../components/text-renderer\";\nimport {\n Button,\n Header1,\n PageCard,\n PageCardContent,\n Section,\n Subheader1,\n} from \"../../primitives\";\n\nexport function BannerWidget({\n settings: {\n title,\n titleLevel,\n titleSize,\n description,\n buttonCaption,\n buttonAction,\n secondaryButtonCaption,\n secondaryButtonAction,\n contentAlignment = \"center\",\n layout = \"stacked\",\n cssId,\n maxWidth,\n verticalPadding,\n background,\n },\n state: { theme },\n}: WidgetProps<BannerSettings>) {\n const overriddenTheme: ThemeStyle = JSON.parse(JSON.stringify(theme.theme));\n overriddenTheme.structure.page.width = maxWidth || theme.theme.structure.page.width;\n overriddenTheme.structure.section.padding.y =\n verticalPadding || theme.theme.structure.section.padding.y;\n\n const isCentered = contentAlignment === \"center\";\n const isSplit = layout === \"split\";\n const isBoxed = layout === \"boxed\";\n\n const heading = (\n <>\n <Header1 theme={overriddenTheme} {...titleProps({ titleLevel, titleSize })}>\n {renderTitle(title, overriddenTheme)}\n </Header1>\n {description && (\n <Subheader1 theme={overriddenTheme} component=\"span\">\n <TextRenderer json={description} theme={overriddenTheme} />\n </Subheader1>\n )}\n </>\n );\n\n const buttons = (buttonAction || secondaryButtonAction) && (\n <div\n className={clsx(\n \"flex flex-col md:!flex-row gap-2 w-full md:w-auto\",\n isSplit ? \"shrink-0\" : \"mt-2\",\n !isSplit && isCentered ? \"md:!justify-center\" : \"\",\n )}\n >\n {buttonAction && buttonCaption && (\n <NavLink href={buttonAction}>\n <Button theme={overriddenTheme} className=\"w-full md:min-w-[150px]\">\n {buttonCaption}\n </Button>\n </NavLink>\n )}\n {secondaryButtonAction && secondaryButtonCaption && (\n <NavLink href={secondaryButtonAction}>\n <Button\n theme={overriddenTheme}\n variant=\"secondary\"\n className=\"w-full md:min-w-[150px]\"\n >\n {secondaryButtonCaption}\n </Button>\n </NavLink>\n )}\n </div>\n );\n\n const content = isSplit ? (\n <div className=\"flex flex-col gap-6 md:!flex-row md:items-center md:justify-between\">\n <div className=\"flex flex-col items-start gap-4\">{heading}</div>\n {buttons}\n </div>\n ) : (\n <div\n className={clsx(\n \"flex flex-col gap-4\",\n isCentered ? \"items-center text-center\" : \"items-start\",\n )}\n >\n {heading}\n {buttons}\n </div>\n );\n\n return (\n <Section theme={overriddenTheme} id={cssId} background={background}>\n {isBoxed ? (\n <PageCard theme={overriddenTheme} className=\"mx-auto max-w-3xl\">\n <PageCardContent\n theme={overriddenTheme}\n className=\"items-center p-8 text-center md:p-12\"\n >\n {content}\n </PageCardContent>\n </PageCard>\n ) : (\n content\n )}\n </Section>\n );\n}\n","import type { BannerSettings } from \"./settings\";\n\nexport const bannerDefaults: Partial<BannerSettings> = {\n title: \"Ready to launch your site?\",\n buttonCaption: \"Contact us\",\n buttonAction: \"/help\",\n secondaryButtonCaption: \"Read the docs\",\n secondaryButtonAction: \"/docs\",\n contentAlignment: \"center\",\n};\n","import React from \"react\";\nimport clsx from \"clsx\";\nimport type { ThemeStyle, WidgetProps } from \"../../models\";\nimport type { EmailFormSettings } from \"./settings\";\nimport { renderTitle, titleProps } from \"../_shared/title\";\nimport { TextRenderer } from \"../../components/text-renderer\";\nimport { Header1, Section, Subheader1 } from \"../../primitives\";\nimport { EmailForm } from \"./form\";\n\nexport function EmailFormWidget({\n settings: {\n title,\n titleLevel,\n titleSize,\n description,\n buttonCaption = \"Subscribe\",\n successMessage = \"Thanks for subscribing!\",\n alignment = \"left\",\n layout = \"stacked\",\n cssId,\n maxWidth,\n verticalPadding,\n background,\n },\n state: { theme },\n pageData,\n editing,\n}: WidgetProps<EmailFormSettings>) {\n const overriddenTheme: ThemeStyle = JSON.parse(JSON.stringify(theme.theme));\n overriddenTheme.structure.page.width = maxWidth || theme.theme.structure.page.width;\n overriddenTheme.structure.section.padding.y =\n verticalPadding || theme.theme.structure.section.padding.y;\n\n const descriptionNode = description && (\n <Subheader1 theme={overriddenTheme} component=\"span\">\n <TextRenderer json={description} theme={overriddenTheme} />\n </Subheader1>\n );\n\n const heading =\n layout === \"inline\" ? (\n <div className=\"flex flex-col gap-1\">\n <Header1\n theme={overriddenTheme}\n {...titleProps({ titleLevel, titleSize }, \"h2\", \"text-xl\")}\n >\n {renderTitle(title, overriddenTheme)}\n </Header1>\n {descriptionNode}\n </div>\n ) : (\n <div\n className={clsx(\n \"flex flex-col gap-4\",\n layout === \"split\" ? \"items-start\" : \"contents\",\n )}\n >\n <Header1 theme={overriddenTheme} {...titleProps({ titleLevel, titleSize })}>\n {renderTitle(title, overriddenTheme)}\n </Header1>\n {descriptionNode}\n </div>\n );\n\n return (\n <Section theme={overriddenTheme} id={cssId} background={background}>\n <EmailForm\n theme={overriddenTheme}\n layout={layout}\n alignment={alignment}\n buttonCaption={buttonCaption}\n successMessage={successMessage}\n pageData={pageData}\n editing={editing}\n heading={heading}\n />\n </Section>\n );\n}\n","import type { EmailFormSettings } from \"./settings\";\n\nexport const emailFormDefaults: Partial<EmailFormSettings> = {\n title: \"Get product updates in your inbox\",\n buttonCaption: \"Subscribe\",\n successMessage: \"Thanks for subscribing! Check your inbox soon.\",\n alignment: \"left\",\n};\n","import React from \"react\";\nimport clsx from \"clsx\";\nimport type { ThemeStyle, WidgetProps } from \"../../models\";\nimport type { SupportFormSettings } from \"./settings\";\nimport { renderTitle, titleProps } from \"../_shared/title\";\nimport { TextRenderer } from \"../../components/text-renderer\";\nimport { Header1, Section, Subheader1 } from \"../../primitives\";\nimport { SupportForm } from \"./form\";\n\nexport function SupportFormWidget({\n settings: {\n title,\n titleLevel,\n titleSize,\n description,\n buttonCaption = \"Submit ticket\",\n successMessage = \"Thanks — we've got your ticket and will reply by email soon.\",\n alignment = \"left\",\n cssId,\n maxWidth,\n verticalPadding,\n background,\n },\n state: { theme },\n pageData,\n editing,\n}: WidgetProps<SupportFormSettings>) {\n const overriddenTheme: ThemeStyle = JSON.parse(JSON.stringify(theme.theme));\n overriddenTheme.structure.page.width = maxWidth || theme.theme.structure.page.width;\n overriddenTheme.structure.section.padding.y =\n verticalPadding || theme.theme.structure.section.padding.y;\n\n const isCentered = alignment === \"center\";\n\n return (\n <Section theme={overriddenTheme} id={cssId} background={background}>\n <div\n className={clsx(\n \"flex flex-col gap-4\",\n isCentered ? \"items-center text-center\" : \"items-start\",\n )}\n >\n <Header1 theme={overriddenTheme} {...titleProps({ titleLevel, titleSize })}>\n {renderTitle(title, overriddenTheme)}\n </Header1>\n {description && (\n <Subheader1 theme={overriddenTheme} component=\"span\">\n <TextRenderer json={description} theme={overriddenTheme} />\n </Subheader1>\n )}\n </div>\n <SupportForm\n theme={overriddenTheme}\n buttonCaption={buttonCaption}\n successMessage={successMessage}\n pageData={pageData}\n editing={editing}\n />\n </Section>\n );\n}\n","import type { SupportFormSettings } from \"./settings\";\n\nexport const supportFormDefaults: Partial<SupportFormSettings> = {\n title: \"Need help?\",\n buttonCaption: \"Submit ticket\",\n successMessage: \"Thanks — we've got your ticket and will reply by email soon.\",\n alignment: \"left\",\n};\n","import React from \"react\";\nimport type { WidgetProps, ThemeStyle } from \"../../models\";\nimport type { FooterSettings } from \"./settings\";\nimport { NavLink } from \"../../components/nav-link\";\nimport {\n Caption,\n Header3,\n Header4,\n Link as PrimitiveLink,\n Section,\n Text2,\n} from \"../../primitives\";\n\nexport function FooterWidget({\n settings: {\n tagline: ownTagline,\n columns = [],\n copyrightText,\n layout = \"columns\",\n showThemeSwitcher = true,\n cssId,\n maxWidth,\n verticalPadding,\n background,\n },\n state: { theme },\n pageData,\n themeSwitcher,\n}: WidgetProps<FooterSettings>) {\n // Logo text is always Branding's title; the tagline falls back to its\n // subtitle. Unset branding renders nothing.\n const logoText = pageData.siteTitle;\n const tagline = ownTagline || pageData.siteSubtitle;\n const overriddenTheme: ThemeStyle = JSON.parse(JSON.stringify(theme.theme));\n overriddenTheme.structure.page.width = maxWidth || theme.theme.structure.page.width;\n overriddenTheme.structure.section.padding.y =\n verticalPadding || theme.theme.structure.section.padding.y;\n\n const colorModeControl = showThemeSwitcher ? themeSwitcher : null;\n\n return (\n <Section\n theme={overriddenTheme}\n component=\"footer\"\n id={cssId}\n background={background}\n className=\"border-t\"\n >\n {layout === \"minimal\" ? (\n <div className=\"flex w-full flex-wrap items-center justify-between gap-4\">\n {logoText && (\n <Header4 theme={overriddenTheme} as=\"p\">\n {logoText}\n </Header4>\n )}\n <div className=\"flex flex-wrap items-center gap-x-6 gap-y-2\">\n {columns.flatMap((column) =>\n column.links.map((link) => (\n <NavLink\n key={`${column.id}-${link.id}`}\n href={link.href}\n className=\"no-underline\"\n >\n <PrimitiveLink theme={overriddenTheme} className=\"text-xs\">\n {link.label}\n </PrimitiveLink>\n </NavLink>\n )),\n )}\n {copyrightText && (\n <Caption theme={overriddenTheme}>{copyrightText}</Caption>\n )}\n {colorModeControl}\n </div>\n </div>\n ) : layout === \"centered\" ? (\n <div className=\"flex w-full flex-col items-center gap-6 text-center\">\n <div className=\"flex max-w-sm flex-col items-center gap-3\">\n {logoText && (\n <Header3 theme={overriddenTheme} as=\"p\">\n {logoText}\n </Header3>\n )}\n {tagline && <Text2 theme={overriddenTheme}>{tagline}</Text2>}\n </div>\n <div className=\"flex flex-wrap justify-center gap-x-6 gap-y-2\">\n {columns.flatMap((column) =>\n column.links.map((link) => (\n <NavLink\n key={`${column.id}-${link.id}`}\n href={link.href}\n className=\"no-underline\"\n >\n <PrimitiveLink theme={overriddenTheme} className=\"text-xs\">\n {link.label}\n </PrimitiveLink>\n </NavLink>\n )),\n )}\n </div>\n </div>\n ) : (\n <div className=\"flex w-full flex-col gap-8 lg:!flex-row lg:justify-between\">\n <div className=\"flex max-w-sm flex-col gap-3\">\n {logoText && (\n <Header3 theme={overriddenTheme} as=\"p\">\n {logoText}\n </Header3>\n )}\n {tagline && <Text2 theme={overriddenTheme}>{tagline}</Text2>}\n </div>\n <div className=\"flex flex-col flex-wrap gap-8 lg:!flex-row\">\n {columns.map((column) => (\n <div key={column.id} className=\"flex flex-col gap-3 lg:min-w-[140px]\">\n <Header4 theme={overriddenTheme} className=\"text-sm\">\n {column.title}\n </Header4>\n <div className=\"flex flex-col gap-2\">\n {column.links.map((link) => (\n <NavLink key={link.id} href={link.href} className=\"no-underline\">\n <PrimitiveLink theme={overriddenTheme} className=\"text-xs\">\n {link.label}\n </PrimitiveLink>\n </NavLink>\n ))}\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n {(copyrightText || colorModeControl) && layout !== \"minimal\" && (\n <div\n className={\n layout === \"centered\"\n ? \"mt-8 flex flex-col items-center gap-4 border-t pt-6 text-center\"\n : \"mt-8 flex items-center justify-between gap-4 border-t pt-6\"\n }\n >\n {copyrightText && <Caption theme={overriddenTheme}>{copyrightText}</Caption>}\n {colorModeControl && (\n <div className={layout === \"centered\" ? undefined : \"ml-auto\"}>\n {colorModeControl}\n </div>\n )}\n </div>\n )}\n </Section>\n );\n}\n","import type { FooterSettings } from \"./settings\";\nimport { generateUniqueId } from \"../../utils/generate-unique-id\";\n\nexport const footerDefaults: Partial<FooterSettings> = {\n showThemeSwitcher: true,\n columns: [\n {\n id: generateUniqueId(),\n title: \"Product\",\n links: [\n {\n id: generateUniqueId(),\n label: \"Features\",\n href: \"/#features\",\n },\n { id: generateUniqueId(), label: \"Pricing\", href: \"/#pricing\" },\n {\n id: generateUniqueId(),\n label: \"Changelog\",\n href: \"/changelog\",\n },\n ],\n },\n {\n id: generateUniqueId(),\n title: \"Resources\",\n links: [\n { id: generateUniqueId(), label: \"Blog\", href: \"/blog\" },\n { id: generateUniqueId(), label: \"Help center\", href: \"/help\" },\n { id: generateUniqueId(), label: \"Docs\", href: \"/docs\" },\n ],\n },\n {\n id: generateUniqueId(),\n title: \"Legal\",\n links: [\n {\n id: generateUniqueId(),\n label: \"Terms of use\",\n href: \"/terms\",\n },\n {\n id: generateUniqueId(),\n label: \"Privacy policy\",\n href: \"/privacy\",\n },\n ],\n },\n ],\n copyrightText: \"© FrontLit. All rights reserved.\",\n};\n","import React from \"react\";\nimport type { ThemeStyle, WidgetProps } from \"../../models\";\nimport type { RichTextSettings } from \"./settings\";\nimport { TextRenderer } from \"../../components/text-renderer\";\nimport { Section, Text1 } from \"../../primitives\";\n\nexport function RichTextWidget({\n settings: { text, alignment = \"left\", cssId, maxWidth, verticalPadding, background },\n state: { theme },\n}: WidgetProps<RichTextSettings>) {\n const overriddenTheme: ThemeStyle = JSON.parse(JSON.stringify(theme.theme));\n overriddenTheme.structure.page.width = maxWidth || theme.theme.structure.page.width;\n overriddenTheme.structure.section.padding.y =\n verticalPadding || theme.theme.structure.section.padding.y;\n\n if (!text) return null;\n\n return (\n <Section theme={overriddenTheme} id={cssId} background={background}>\n <div style={{ textAlign: alignment }}>\n <Text1 theme={overriddenTheme} component=\"span\">\n <TextRenderer json={text} theme={overriddenTheme} />\n </Text1>\n </div>\n </Section>\n );\n}\n","import type { RichTextSettings } from \"./settings\";\n\nexport const richTextDefaults: Partial<RichTextSettings> = {\n text: {\n type: \"doc\",\n content: [\n {\n type: \"paragraph\",\n content: [\n {\n type: \"text\",\n text: \"Write anything here — an announcement, a longer explanation, or a passage of prose that doesn't need a title or media.\",\n },\n ],\n },\n ],\n },\n alignment: \"left\",\n};\n","import React from \"react\";\nimport clsx from \"clsx\";\nimport * as Icons from \"lucide-react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport type { ThemeStyle, WidgetProps } from \"../../models\";\nimport { getMediaUrl, getMediaAlt } from \"../../models/media\";\nimport type { GridItem, GridSettings } from \"./settings\";\nimport { renderTitle, titleProps } from \"../_shared/title\";\nimport { Image } from \"../../components/image\";\nimport { NavLink } from \"../../components/nav-link\";\nimport { TextRenderer } from \"../../components/text-renderer\";\nimport {\n Button,\n Header1,\n Header4,\n PageCard,\n PageCardContent,\n Section,\n Subheader1,\n Text2,\n} from \"../../primitives\";\n\nfunction resolveIcon(name?: string): LucideIcon | null {\n if (!name) return null;\n return (Icons as unknown as Record<string, LucideIcon>)[name] ?? null;\n}\n\nfunction GridItemCard({ item, theme }: { item: GridItem; theme: ThemeStyle }) {\n const Icon = resolveIcon(item.icon);\n const mediaUrl = getMediaUrl(item.media);\n const mediaAlt = getMediaAlt(item.media);\n const hasMedia = Boolean(mediaUrl);\n const isOverlay = item.mediaAlignment === \"overlay\";\n const mediaFirst = item.mediaAlignment !== \"bottom\";\n\n if (isOverlay) {\n const card = (\n <PageCard theme={theme} isLink={Boolean(item.buttonAction)}>\n <div className=\"relative aspect-[4/5] w-full overflow-hidden\">\n {hasMedia && (\n <Image\n src={mediaUrl || \"\"}\n alt={mediaAlt}\n className=\"absolute inset-0\"\n width=\"w-full\"\n height=\"h-full\"\n objectFit=\"cover\"\n borderRadius={0}\n />\n )}\n <div className=\"absolute inset-0 bg-gradient-to-t from-black/70 via-black/10 to-transparent\" />\n <div className=\"absolute inset-x-0 bottom-0 p-4\">\n <Header4 theme={theme} className=\"text-white\">\n {item.title}\n </Header4>\n </div>\n </div>\n </PageCard>\n );\n\n return item.buttonAction ? (\n <NavLink href={item.buttonAction} className=\"block\">\n {card}\n </NavLink>\n ) : (\n card\n );\n }\n\n const media = hasMedia ? (\n <div className=\"overflow-hidden rounded-md\">\n <Image src={mediaUrl || \"\"} alt={mediaAlt} />\n </div>\n ) : Icon ? (\n <div className=\"flex h-10 w-10 items-center justify-center rounded-md bg-primary/10 text-primary\">\n <Icon className=\"h-5 w-5\" />\n </div>\n ) : null;\n\n const text = (\n <div className=\"flex flex-col gap-2\">\n <Header4 theme={theme}>{item.title}</Header4>\n {item.description && <Text2 theme={theme}>{item.description}</Text2>}\n {item.buttonAction && item.buttonCaption && (\n <NavLink href={item.buttonAction} className=\"mt-2\">\n <Button theme={theme} variant=\"secondary\" size=\"sm\">\n {item.buttonCaption}\n </Button>\n </NavLink>\n )}\n </div>\n );\n\n return (\n <PageCard theme={theme}>\n <PageCardContent theme={theme} className=\"flex h-full flex-col gap-3\">\n {mediaFirst ? (\n <>\n {media}\n {text}\n </>\n ) : (\n <>\n {text}\n {media}\n </>\n )}\n </PageCardContent>\n </PageCard>\n );\n}\n\nexport function GridWidget({\n settings: {\n title,\n titleLevel,\n titleSize,\n description,\n headerAlignment = \"center\",\n buttonCaption,\n buttonAction,\n items,\n columns = 3,\n cssId,\n maxWidth,\n verticalPadding,\n background,\n },\n state: { theme },\n}: WidgetProps<GridSettings>) {\n const overriddenTheme: ThemeStyle = JSON.parse(JSON.stringify(theme.theme));\n overriddenTheme.structure.page.width = maxWidth || theme.theme.structure.page.width;\n overriddenTheme.structure.section.padding.y =\n verticalPadding || theme.theme.structure.section.padding.y;\n\n return (\n <Section theme={overriddenTheme} id={cssId} background={background}>\n <div className=\"flex flex-col gap-8\">\n <div\n className={clsx(\n \"flex flex-col gap-4\",\n headerAlignment === \"center\" ? \"items-center text-center\" : \"items-start\",\n )}\n >\n <Header1 theme={overriddenTheme} {...titleProps({ titleLevel, titleSize })}>\n {renderTitle(title, overriddenTheme)}\n </Header1>\n {description && (\n <Subheader1 theme={overriddenTheme} component=\"span\">\n <TextRenderer json={description} theme={overriddenTheme} />\n </Subheader1>\n )}\n {buttonAction && buttonCaption && (\n <NavLink href={buttonAction} className=\"mt-2\">\n <Button theme={overriddenTheme}>{buttonCaption}</Button>\n </NavLink>\n )}\n </div>\n {items && items.length > 0 && (\n <div\n className={clsx(\n \"grid grid-cols-1 md:grid-cols-2 gap-6 items-stretch\",\n columns === 3 ? \"lg:grid-cols-3\" : \"lg:grid-cols-2\",\n )}\n >\n {items.map((item, index) => (\n <GridItemCard key={index} item={item} theme={overriddenTheme} />\n ))}\n </div>\n )}\n </div>\n </Section>\n );\n}\n","import type { GridSettings } from \"./settings\";\n\nexport const gridDefaults: Partial<GridSettings> = {\n title: \"Everything you need, in one place\",\n headerAlignment: \"center\",\n columns: 3,\n items: [\n {\n title: \"Website builder\",\n description: \"Design and publish pages with a drag-and-drop editor.\",\n icon: \"LayoutTemplate\",\n mediaAlignment: \"top\",\n buttonCaption: \"See features\",\n buttonAction: \"/#features\",\n },\n {\n title: \"Blog\",\n description: \"Publish articles and grow your audience.\",\n icon: \"Newspaper\",\n mediaAlignment: \"top\",\n buttonCaption: \"Read articles\",\n buttonAction: \"/blog\",\n },\n {\n title: \"Help desk\",\n description: \"Support your customers with a shared inbox.\",\n icon: \"Headset\",\n mediaAlignment: \"top\",\n buttonCaption: \"Contact us\",\n buttonAction: \"/help\",\n },\n ],\n};\n","import React from \"react\";\nimport type { ThemeStyle, WidgetProps } from \"../../models\";\nimport { getMediaUrl, getMediaAlt } from \"../../models/media\";\nimport type { MediaSettings } from \"./settings\";\nimport { Image } from \"../../components/image\";\nimport { VideoWithPreview } from \"../../components/video-with-preview\";\nimport { isVideo } from \"../../utils\";\nimport { Section } from \"../../primitives\";\nimport { cn } from \"../../primitives/lib/utils\";\n\nconst roundedMap: Record<number, string> = {\n 0: \"rounded-none\",\n 1: \"rounded-sm\",\n 2: \"rounded\",\n 3: \"rounded-md\",\n 4: \"rounded-lg\",\n 5: \"rounded-xl\",\n 6: \"rounded-2xl\",\n 7: \"rounded-3xl\",\n 8: \"rounded-full\",\n};\n\nexport function MediaWidget({\n settings: {\n media,\n youtubeLink,\n mediaRadius = 2,\n aspectRatio = \"16/9\",\n objectFit = \"cover\",\n hasBorder = true,\n playVideoInModal = false,\n cssId,\n maxWidth,\n verticalPadding,\n background,\n },\n state: { theme },\n}: WidgetProps<MediaSettings>) {\n const overriddenTheme: ThemeStyle = JSON.parse(JSON.stringify(theme.theme));\n overriddenTheme.structure.page.width = maxWidth || theme.theme.structure.page.width;\n overriddenTheme.structure.section.padding.y =\n verticalPadding || theme.theme.structure.section.padding.y;\n\n const isVideoContent = isVideo(youtubeLink, media);\n\n return (\n <Section theme={overriddenTheme} id={cssId} background={background}>\n <div\n className={cn(\n \"overflow-hidden\",\n roundedMap[mediaRadius] ?? \"rounded\",\n hasBorder && (overriddenTheme.interactives?.card?.border?.width || \"border\"),\n )}\n >\n {isVideoContent ? (\n <VideoWithPreview\n videoUrl={youtubeLink || getMediaUrl(media) || \"\"}\n title={getMediaAlt(media) || (media as any)?.caption || \"\"}\n thumbnailUrl={\n (media as any)?.thumbnail || (media as any)?.thumbnailUrl || \"\"\n }\n aspectRatio={aspectRatio}\n modal={playVideoInModal}\n />\n ) : (\n <Image\n src={getMediaUrl(media) || \"\"}\n alt={getMediaAlt(media)}\n objectFit={objectFit}\n borderRadius={mediaRadius}\n />\n )}\n </div>\n </Section>\n );\n}\n","import type { MediaSettings } from \"./settings\";\n\nexport const mediaDefaults: Partial<MediaSettings> = {\n mediaRadius: 2,\n aspectRatio: \"16/9\",\n objectFit: \"cover\",\n hasBorder: true,\n playVideoInModal: false,\n};\n","import React from \"react\";\nimport * as Icons from \"lucide-react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport type { ThemeStyle, WidgetProps } from \"../../models\";\nimport type { MarqueeSettings } from \"./settings\";\nimport { NavLink } from \"../../components/nav-link\";\nimport { Section } from \"../../primitives\";\nimport { MarqueeTrack } from \"./marquee-track\";\n\nfunction resolveIcon(name?: string): LucideIcon | null {\n if (!name) return null;\n return (Icons as unknown as Record<string, LucideIcon>)[name] ?? null;\n}\n\nexport function MarqueeWidget({\n settings: {\n items = [],\n direction = \"right\",\n speed = 60,\n pauseOnHover = true,\n fadeWidth = 50,\n itemBackgroundColor,\n itemForegroundColor,\n itemBorderColor,\n itemBorderRadius = 12,\n itemBorderWidth = 1,\n itemBorderStyle = \"solid\",\n cssId,\n maxWidth,\n verticalPadding,\n background,\n },\n state: { theme },\n}: WidgetProps<MarqueeSettings>) {\n const overriddenTheme: ThemeStyle = JSON.parse(JSON.stringify(theme.theme));\n overriddenTheme.structure.page.width = maxWidth || theme.theme.structure.page.width;\n overriddenTheme.structure.section.padding.y =\n verticalPadding || theme.theme.structure.section.padding.y;\n\n if (items.length === 0) return null;\n\n const itemStyle: React.CSSProperties = {\n backgroundColor: itemBackgroundColor || undefined,\n color: itemForegroundColor || undefined,\n borderColor: itemBorderColor || undefined,\n borderRadius: itemBorderRadius,\n borderWidth: itemBorderStyle === \"none\" ? 0 : itemBorderWidth,\n borderStyle: itemBorderStyle === \"none\" ? undefined : itemBorderStyle,\n };\n\n const renderItem = (item: (typeof items)[number]) => {\n const Icon = resolveIcon(item.icon);\n const content = (\n <div\n className=\"mx-2 flex min-h-[80px] min-w-[160px] items-center justify-center px-6\"\n style={itemStyle}\n >\n {Icon ? (\n <Icon className=\"h-8 w-8\" />\n ) : (\n <span className=\"whitespace-nowrap text-sm font-medium\">{item.text}</span>\n )}\n </div>\n );\n return item.href ? (\n <NavLink key={item.id} href={item.href} openInSameTab={false}>\n {content}\n </NavLink>\n ) : (\n <React.Fragment key={item.id}>{content}</React.Fragment>\n );\n };\n\n return (\n <Section theme={overriddenTheme} id={cssId} background={background}>\n <div className=\"relative\" aria-hidden=\"true\">\n <MarqueeTrack speed={speed} direction={direction} pauseOnHover={pauseOnHover}>\n {items.map(renderItem)}\n </MarqueeTrack>\n {fadeWidth > 0 && (\n <>\n <div\n className=\"pointer-events-none absolute inset-y-0 left-0 z-10\"\n style={{\n width: fadeWidth,\n background: \"linear-gradient(to right, var(--background), transparent)\",\n }}\n />\n <div\n className=\"pointer-events-none absolute inset-y-0 right-0 z-10\"\n style={{\n width: fadeWidth,\n background: \"linear-gradient(to left, var(--background), transparent)\",\n }}\n />\n </>\n )}\n </div>\n </Section>\n );\n}\n","import type { MarqueeSettings } from \"./settings\";\nimport { generateUniqueId } from \"../../utils/generate-unique-id\";\n\nexport const marqueeDefaults: Partial<MarqueeSettings> = {\n items: [\n { id: generateUniqueId(), text: \"Website\" },\n { id: generateUniqueId(), text: \"Content\" },\n { id: generateUniqueId(), text: \"Support\" },\n { id: generateUniqueId(), text: \"Engage\" },\n ],\n direction: \"right\",\n speed: 60,\n pauseOnHover: true,\n fadeWidth: 50,\n itemForegroundColor: \"\",\n itemBackgroundColor: \"\",\n itemBorderColor: \"\",\n itemBorderRadius: 12,\n itemBorderWidth: 1,\n itemBorderStyle: \"solid\",\n};\n","import React from \"react\";\nimport { Code2 } from \"lucide-react\";\nimport type { ThemeStyle, WidgetProps } from \"../../models\";\nimport type { EmbedSettings } from \"./settings\";\nimport { InlineEmbed } from \"../../components/inline-embed\";\nimport { Section } from \"../../primitives\";\n\nconst aspectRatioMap: Record<string, number> = {\n \"16:9\": 16 / 9,\n \"4:3\": 4 / 3,\n \"1:1\": 1,\n};\n\nexport function EmbedWidget({\n settings: {\n contentType = \"url\",\n content,\n aspectRatio = \"default\",\n height = 500,\n cssId,\n maxWidth,\n verticalPadding,\n background,\n },\n state: { theme },\n editing,\n}: WidgetProps<EmbedSettings>) {\n const overriddenTheme: ThemeStyle = JSON.parse(JSON.stringify(theme.theme));\n overriddenTheme.structure.page.width = maxWidth || theme.theme.structure.page.width;\n overriddenTheme.structure.section.padding.y =\n verticalPadding || theme.theme.structure.section.padding.y;\n\n if (!content) {\n if (!editing) return null;\n\n return (\n <Section theme={overriddenTheme} id={cssId} background={background}>\n <div className=\"flex min-h-48 flex-col items-center justify-center gap-3 rounded-lg border border-dashed border-border bg-muted/30 px-6 py-12 text-center\">\n <span className=\"flex h-10 w-10 items-center justify-center rounded-full border border-border bg-background text-muted-foreground\">\n <Code2 className=\"h-4 w-4\" />\n </span>\n <div>\n <p className=\"font-semibold text-foreground\">Embed external content</p>\n <p className=\"mt-1 max-w-md text-sm text-muted-foreground\">\n Paste an embed URL or script snippet in the block settings.\n </p>\n </div>\n </div>\n </Section>\n );\n }\n\n const isScript = contentType === \"script\";\n const ratio = aspectRatio !== \"default\" ? aspectRatioMap[aspectRatio] : undefined;\n\n // Snippets size themselves unless an aspect ratio is set; URL iframes need\n // an explicit height.\n const containerStyle: React.CSSProperties = ratio\n ? { position: \"relative\", paddingTop: `${100 / ratio}%` }\n : { position: \"relative\", height: isScript ? undefined : height };\n\n const fillStyle: React.CSSProperties = ratio\n ? { position: \"absolute\", inset: 0, width: \"100%\", height: \"100%\" }\n : { width: \"100%\", height: \"100%\" };\n\n return (\n <Section theme={overriddenTheme} id={cssId} background={background}>\n <div style={containerStyle}>\n {isScript ? (\n <InlineEmbed content={content} style={ratio ? fillStyle : undefined} />\n ) : (\n <iframe\n src={content}\n style={fillStyle}\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n title=\"Embedded content\"\n />\n )}\n {/* Clicks inside an iframe (a URL embed, or one inside a snippet)\n never reach the editor, so cover the embed while editing to let a\n click select the block. */}\n {editing && <div className=\"absolute inset-0\" />}\n </div>\n </Section>\n );\n}\n","import type { EmbedSettings } from \"./settings\";\n\nexport const embedDefaults: Partial<EmbedSettings> = {\n contentType: \"url\",\n content: \"\",\n aspectRatio: \"default\",\n height: 500,\n};\n","import React from \"react\";\nimport clsx from \"clsx\";\nimport type { ThemeStyle, WidgetProps } from \"../../models\";\nimport type { CodeSnippetSettings } from \"./settings\";\nimport { Caption, Section } from \"../../primitives\";\nimport { CodeSnippet } from \"../../primitives/code-snippet\";\n\nexport function CodeSnippetWidget({\n settings: {\n code,\n showPrompt = true,\n caption,\n contentAlignment = \"center\",\n cssId,\n maxWidth,\n verticalPadding,\n background,\n },\n state: { theme },\n}: WidgetProps<CodeSnippetSettings>) {\n const overriddenTheme: ThemeStyle = JSON.parse(JSON.stringify(theme.theme));\n overriddenTheme.structure.page.width = maxWidth || theme.theme.structure.page.width;\n overriddenTheme.structure.section.padding.y =\n verticalPadding || theme.theme.structure.section.padding.y;\n\n if (!code) return null;\n\n return (\n <Section theme={overriddenTheme} id={cssId} background={background}>\n <div\n className={clsx(\n \"flex w-full max-w-2xl flex-col gap-3\",\n contentAlignment === \"center\" ? \"mx-auto items-center\" : \"items-start\",\n )}\n >\n <CodeSnippet\n code={code}\n prompt={showPrompt ? \"$\" : undefined}\n theme={overriddenTheme}\n />\n {caption && <Caption theme={overriddenTheme}>{caption}</Caption>}\n </div>\n </Section>\n );\n}\n","import type { CodeSnippetSettings } from \"./settings\";\n\nexport const codeSnippetDefaults: Partial<CodeSnippetSettings> = {\n code: \"curl -fsSL https://example.com/install.sh | sh\",\n showPrompt: true,\n contentAlignment: \"center\",\n};\n","import React from \"react\";\nimport { LockKeyhole } from \"lucide-react\";\nimport type { ThemeStyle, WidgetDefaultSettings, WidgetProps } from \"../../models\";\nimport { Section } from \"../../primitives\";\n\nexport interface DataSlotSettings extends WidgetDefaultSettings {\n /** Name matched against the host application's data-slot loaders. */\n slot: string;\n}\n\n/**\n * A reserved, host-resolved data region. The host passes its rendered result\n * through `PageRenderer`; the builder shows a generic placeholder instead.\n * Live content uses the same `Section` shell as other blocks so it shares\n * the theme's page width instead of shrink-wrapping to the feed's copy.\n */\nexport function DataSlotWidget({\n data,\n editing,\n settings: { slot, cssId, maxWidth, verticalPadding, background },\n state: { theme },\n}: WidgetProps<DataSlotSettings>) {\n const overriddenTheme: ThemeStyle = JSON.parse(JSON.stringify(theme.theme));\n overriddenTheme.structure.page.width = maxWidth || theme.theme.structure.page.width;\n overriddenTheme.structure.section.padding.y =\n verticalPadding || theme.theme.structure.section.padding.y;\n\n if (data !== undefined) {\n return (\n <Section theme={overriddenTheme} id={cssId} background={background}>\n {data}\n </Section>\n );\n }\n if (!editing) return null;\n\n return (\n <Section\n theme={overriddenTheme}\n id={cssId}\n background={background}\n className=\"border-y border-dashed border-border bg-muted/30\"\n >\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <span className=\"flex h-10 w-10 items-center justify-center rounded-full border border-border bg-background text-muted-foreground\">\n <LockKeyhole className=\"h-4 w-4\" />\n </span>\n <div>\n <p className=\"font-semibold text-foreground\">Data slot</p>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n The embedding application resolves data for {String(slot || \"this slot\")}{\" \"}\n here.\n </p>\n </div>\n </div>\n </Section>\n );\n}\n","import type { ComponentType } from \"react\";\nimport type { WidgetProps } from \"../models\";\nimport { HeaderWidget } from \"../blocks/header/widget\";\nimport { headerDefaults } from \"../blocks/header/defaults\";\nimport { HeroWidget } from \"../blocks/hero/widget\";\nimport { heroDefaults } from \"../blocks/hero/defaults\";\nimport { ContentWidget } from \"../blocks/content/widget\";\nimport { contentDefaults } from \"../blocks/content/defaults\";\nimport { FeaturedWidget } from \"../blocks/featured/widget\";\nimport { featuredDefaults } from \"../blocks/featured/defaults\";\nimport { FaqWidget } from \"../blocks/faq/widget\";\nimport { faqDefaults } from \"../blocks/faq/defaults\";\nimport { PricingWidget } from \"../blocks/pricing/widget\";\nimport { pricingDefaults } from \"../blocks/pricing/defaults\";\nimport { BannerWidget } from \"../blocks/banner/widget\";\nimport { bannerDefaults } from \"../blocks/banner/defaults\";\nimport { EmailFormWidget } from \"../blocks/email-form/widget\";\nimport { emailFormDefaults } from \"../blocks/email-form/defaults\";\nimport { SupportFormWidget } from \"../blocks/support-form/widget\";\nimport { supportFormDefaults } from \"../blocks/support-form/defaults\";\nimport { FooterWidget } from \"../blocks/footer/widget\";\nimport { footerDefaults } from \"../blocks/footer/defaults\";\nimport { RichTextWidget } from \"../blocks/rich-text/widget\";\nimport { richTextDefaults } from \"../blocks/rich-text/defaults\";\nimport { GridWidget } from \"../blocks/grid/widget\";\nimport { gridDefaults } from \"../blocks/grid/defaults\";\nimport { MediaWidget } from \"../blocks/media/widget\";\nimport { mediaDefaults } from \"../blocks/media/defaults\";\nimport { MarqueeWidget } from \"../blocks/marquee/widget\";\nimport { marqueeDefaults } from \"../blocks/marquee/defaults\";\nimport { EmbedWidget } from \"../blocks/embed/widget\";\nimport { embedDefaults } from \"../blocks/embed/defaults\";\nimport { CodeSnippetWidget } from \"../blocks/code-snippet/widget\";\nimport { codeSnippetDefaults } from \"../blocks/code-snippet/defaults\";\nimport { DataSlotWidget } from \"../blocks/data-slot/widget\";\n\n/**\n * What the server renderer needs from a block: the widget and its default\n * settings. The full `blockRegistry` also carries each block's editor, which\n * pulls the builder UI into the bundle, so the server keeps its own lookup.\n * `server-registry.test.ts` keeps the two in step.\n */\nexport interface ServerBlock {\n widget: ComponentType<WidgetProps<any>>;\n getDefaultSettings?: () => object;\n}\n\nexport const serverBlockRegistry: Record<string, ServerBlock> = {\n header: { widget: HeaderWidget, getDefaultSettings: () => headerDefaults },\n hero: { widget: HeroWidget, getDefaultSettings: () => heroDefaults },\n content: { widget: ContentWidget, getDefaultSettings: () => contentDefaults },\n featured: { widget: FeaturedWidget, getDefaultSettings: () => featuredDefaults },\n faq: { widget: FaqWidget, getDefaultSettings: () => faqDefaults },\n pricing: { widget: PricingWidget, getDefaultSettings: () => pricingDefaults },\n banner: { widget: BannerWidget, getDefaultSettings: () => bannerDefaults },\n \"email-form\": {\n widget: EmailFormWidget,\n getDefaultSettings: () => emailFormDefaults,\n },\n \"support-form\": {\n widget: SupportFormWidget,\n getDefaultSettings: () => supportFormDefaults,\n },\n footer: { widget: FooterWidget, getDefaultSettings: () => footerDefaults },\n \"rich-text\": { widget: RichTextWidget, getDefaultSettings: () => richTextDefaults },\n grid: { widget: GridWidget, getDefaultSettings: () => gridDefaults },\n media: { widget: MediaWidget, getDefaultSettings: () => mediaDefaults },\n marquee: { widget: MarqueeWidget, getDefaultSettings: () => marqueeDefaults },\n embed: { widget: EmbedWidget, getDefaultSettings: () => embedDefaults },\n \"code-snippet\": {\n widget: CodeSnippetWidget,\n getDefaultSettings: () => codeSnippetDefaults,\n },\n \"data-slot\": { widget: DataSlotWidget },\n};\n","import type { ReactNode } from \"react\";\nimport type { PageData, WidgetInstance } from \"./models\";\n\n/** Context supplied to a host application's data-slot loader. */\nexport interface DataSlotLoadRequest {\n /** The slot identifier declared in `instance.settings.slot`. */\n slot: string;\n /** The full persisted block configuration. */\n instance: WidgetInstance;\n /** Page context supplied by the host renderer. */\n pageData: PageData;\n}\n\n/** A host-owned resolver for one named data slot. */\nexport type DataSlotLoader = (\n request: DataSlotLoadRequest,\n) => ReactNode | Promise<ReactNode>;\n\nexport type DataSlotLoaders = Readonly<Record<string, DataSlotLoader>>;\n\n/**\n * Resolves generic data-slot blocks before passing their output to\n * `PageRenderer`. The page-builder package deliberately does not fetch data\n * or understand a host application's domain model.\n */\nexport async function loadDataSlots(\n layout: readonly WidgetInstance[],\n loaders: DataSlotLoaders,\n pageData: PageData,\n): Promise<Record<string, ReactNode>> {\n const slots = layout.filter((instance) => instance.name === \"data-slot\");\n const resolved = await Promise.all(\n slots.map(async (instance) => {\n const slot = instance.settings?.slot;\n if (typeof slot !== \"string\" || !slot) return null;\n const loader = loaders[slot];\n if (!loader) return null;\n return [slot, await loader({ slot, instance, pageData })] as const;\n }),\n );\n const output: Record<string, ReactNode> = {};\n for (const entry of resolved) {\n if (entry) output[entry[0]] = entry[1];\n }\n return output;\n}\n"],"mappings":"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","names":["useId","clsx","NavLink","jsx","jsx","Badge","cva","jsx","cva","jsx","Button","jsx","jsx","jsx","jsx","jsx","jsx","React","jsx","React","jsx","jsx","jsx","jsx","Button","jsx","jsxs","NavLink","Button","clsx","React","React","NavLink","clsx","jsx","jsxs","roundedMap","clsx","NavLink","Button","clsx","jsx","jsxs","roundedMap","clsx","clsx","jsx","jsxs","clsx","clsx","jsx","jsxs","clsx","clsx","NavLink","Fragment","jsx","jsxs","clsx","Badge","NavLink","Button","clsx","NavLink","Fragment","jsx","jsxs","clsx","NavLink","Button","clsx","jsx","jsxs","clsx","clsx","jsx","jsxs","clsx","NavLink","jsx","jsxs","NavLink","jsx","clsx","Icons","NavLink","Fragment","jsx","jsxs","resolveIcon","Icons","NavLink","Button","clsx","VideoWithPreview","jsx","roundedMap","VideoWithPreview","React","Icons","NavLink","Fragment","jsx","jsxs","resolveIcon","Icons","NavLink","React","jsx","jsxs","clsx","CodeSnippet","jsx","jsxs","clsx","jsx","jsxs","jsx","jsxs","useId"]}