@frontlit/page-builder 0.1.0-alpha.1 → 0.1.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -2
- package/dist/blocks/index.d.ts +7 -5
- package/dist/blocks/index.js +4 -3
- package/dist/builder/index.d.ts +5 -7
- package/dist/builder/index.js +6 -5
- package/dist/{button-C3VrMJkr.d.ts → button-Bzt1GDO-.d.ts} +2 -2
- package/dist/{chunk-GTY75HW2.js → chunk-ATNM5JHI.js} +2 -2
- package/dist/chunk-ATNM5JHI.js.map +1 -0
- package/dist/{chunk-7W6Q4WA7.js → chunk-H4P5MFJI.js} +89 -73
- package/dist/chunk-H4P5MFJI.js.map +1 -0
- package/dist/{chunk-SSQWYMQR.js → chunk-HDINUNI2.js} +11 -39
- package/dist/chunk-HDINUNI2.js.map +1 -0
- package/dist/{chunk-MO76KZY2.js → chunk-KQKSLI3L.js} +339 -314
- package/dist/chunk-KQKSLI3L.js.map +1 -0
- package/dist/{chunk-RBJBODQP.js → chunk-SGNRWWG3.js} +1931 -919
- package/dist/chunk-SGNRWWG3.js.map +1 -0
- package/dist/{chunk-7KIX4WAO.js → chunk-UO7XGBGM.js} +439 -535
- package/dist/chunk-UO7XGBGM.js.map +1 -0
- package/dist/chunk-XU7ALPGQ.js +22 -0
- package/dist/chunk-XU7ALPGQ.js.map +1 -0
- package/dist/components/index.d.ts +3 -3
- package/dist/components/index.js +3 -2
- package/dist/data-slots.d.ts +3 -3
- package/dist/data-slots.js +1 -1
- package/dist/{image-D7GlnOio.d.ts → image-DAWVx1zQ.d.ts} +3 -2
- package/dist/index.d.ts +7 -7
- package/dist/index.js +7 -6
- package/dist/media-CnLImjVC.d.ts +21 -0
- package/dist/models/index.d.ts +5 -5
- package/dist/models/index.js +1 -0
- package/dist/{page-DfVl_aHX.d.ts → page-W3hQga4w.d.ts} +2 -3
- package/dist/primitives/index.d.ts +251 -60
- package/dist/primitives/index.js +2 -1
- package/dist/renderer/index.d.ts +3 -3
- package/dist/renderer/index.js +5 -4
- package/dist/{section-background-BgOCp5l3.d.ts → section-background-MsdE40Rk.d.ts} +1 -1
- package/dist/styles.css +3896 -8303
- package/dist/{theme-style-39nxXQy0.d.ts → theme-style-Cbl7NM-T.d.ts} +23 -1
- package/dist/theme.css +174 -191
- package/dist/{widget--uEOpdq3.d.ts → widget-B_RoG6se.d.ts} +10 -6
- package/package.json +21 -10
- package/dist/chunk-7KIX4WAO.js.map +0 -1
- package/dist/chunk-7W6Q4WA7.js.map +0 -1
- package/dist/chunk-GTY75HW2.js.map +0 -1
- package/dist/chunk-MO76KZY2.js.map +0 -1
- package/dist/chunk-RBJBODQP.js.map +0 -1
- package/dist/chunk-SSQWYMQR.js.map +0 -1
- package/dist/fonts/montserrat/montserrat-latin-100-normal.woff2 +0 -0
- package/dist/fonts/montserrat/montserrat-latin-200-normal.woff2 +0 -0
- package/dist/fonts/montserrat/montserrat-latin-300-normal.woff2 +0 -0
- package/dist/fonts/montserrat/montserrat-latin-400-normal.woff2 +0 -0
- package/dist/fonts/montserrat/montserrat-latin-500-normal.woff2 +0 -0
- package/dist/fonts/montserrat/montserrat-latin-600-normal.woff2 +0 -0
- package/dist/fonts/montserrat/montserrat-latin-700-normal.woff2 +0 -0
- package/dist/fonts/montserrat/montserrat-latin-800-normal.woff2 +0 -0
- package/dist/fonts/montserrat/montserrat-latin-900-normal.woff2 +0 -0
- package/dist/fonts/source-sans-3/source-sans-3-latin-400-normal.woff2 +0 -0
- package/dist/media-Njv378j7.d.ts +0 -13
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/sandboxed-embed.tsx","../src/utils/extract-video-id.ts","../src/components/video-with-preview.tsx","../src/components/image.tsx","../src/components/nav-link.tsx","../src/components/theme-mode-switcher.tsx"],"names":["useState","useEffect","jsx","Button"],"mappings":"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","file":"chunk-7W6Q4WA7.js","sourcesContent":["import React, { useEffect, useId, useRef, useState } from \"react\";\n\ninterface SandboxedEmbedProps {\n content: string;\n className?: string;\n style?: React.CSSProperties;\n id?: string;\n}\n\nexport const SandboxedEmbed = ({\n content,\n className,\n style,\n id,\n}: SandboxedEmbedProps) => {\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const [height, setHeight] = useState(\"100px\");\n const generatedId = useId();\n const iframeId = id || generatedId;\n\n useEffect(() => {\n const handleMessage = (event: MessageEvent) => {\n if (\n event.data?.type === \"embed-resize\" &&\n event.data?.id === iframeId &&\n event.data?.height\n ) {\n setHeight(`${event.data.height}px`);\n }\n };\n\n window.addEventListener(\"message\", handleMessage);\n return () => window.removeEventListener(\"message\", handleMessage);\n }, [iframeId]);\n\n const srcDoc = `\n <!DOCTYPE html>\n <html>\n <head>\n <style>\n html, body { margin: 0; padding: 0; overflow: hidden; }\n #content-wrapper { overflow: hidden; height: auto; }\n </style>\n </head>\n <body>\n <div id=\"content-wrapper\">\n ${content || \"\"}\n </div>\n <script>\n const iframeId = \"${iframeId}\";\n \n function sendHeight() {\n const wrapper = document.getElementById('content-wrapper');\n const height = wrapper ? wrapper.scrollHeight : document.body.scrollHeight;\n window.parent.postMessage({ type: \"embed-resize\", id: iframeId, height: height }, \"*\");\n }\n\n // Use a ResizeObserver to detect size changes\n const resizeObserver = new ResizeObserver(entries => {\n sendHeight();\n });\n const target = document.getElementById('content-wrapper') || document.body;\n resizeObserver.observe(target);\n \n // Use MutationObserver to detect DOM changes\n const mutationObserver = new MutationObserver(() => {\n sendHeight();\n });\n mutationObserver.observe(target, { childList: true, subtree: true, attributes: true });\n \n // Poll for a few seconds to catch late-loading content\n let interval = setInterval(sendHeight, 500);\n setTimeout(() => clearInterval(interval), 10000);\n \n window.addEventListener('load', sendHeight);\n window.addEventListener('resize', sendHeight);\n \n // Initial send\n sendHeight();\n </script>\n </body>\n </html>\n `;\n\n return (\n <iframe\n ref={iframeRef}\n srcDoc={srcDoc}\n className={className}\n style={{\n width: \"100%\",\n height: height,\n border: \"none\",\n ...style,\n }}\n sandbox=\"allow-scripts allow-popups allow-forms allow-same-origin\"\n title=\"Embedded Content\"\n />\n );\n};\n","export type SupportedVideoPlatform = \"youtube\" | \"vimeo\";\n\nconst YOUTUBE_HOSTNAMES = new Set([\n \"youtube.com\",\n \"www.youtube.com\",\n \"m.youtube.com\",\n \"music.youtube.com\",\n \"youtube-nocookie.com\",\n \"www.youtube-nocookie.com\",\n \"youtu.be\",\n]);\n\nconst VIMEO_HOSTNAMES = new Set([\n \"vimeo.com\",\n \"www.vimeo.com\",\n \"player.vimeo.com\",\n]);\n\nconst isNumeric = (value: string) => /^\\d+$/.test(value);\n\nconst extractYouTubeVideoId = (parsedUrl: URL) => {\n const hostname = parsedUrl.hostname.toLowerCase();\n\n if (!YOUTUBE_HOSTNAMES.has(hostname)) {\n return null;\n }\n\n if (hostname === \"youtu.be\") {\n return parsedUrl.pathname.split(\"/\").filter(Boolean)[0] || null;\n }\n\n if (parsedUrl.pathname === \"/watch\") {\n return parsedUrl.searchParams.get(\"v\");\n }\n\n const pathParts = parsedUrl.pathname.split(\"/\").filter(Boolean);\n const firstPart = pathParts[0];\n const secondPart = pathParts[1];\n\n if (\n (firstPart === \"embed\" ||\n firstPart === \"v\" ||\n firstPart === \"shorts\" ||\n firstPart === \"live\") &&\n secondPart\n ) {\n return secondPart;\n }\n\n return null;\n};\n\nconst extractVimeoVideoId = (parsedUrl: URL) => {\n const hostname = parsedUrl.hostname.toLowerCase();\n\n if (!VIMEO_HOSTNAMES.has(hostname)) {\n return null;\n }\n\n const pathParts = parsedUrl.pathname.split(\"/\").filter(Boolean);\n\n for (let index = pathParts.length - 1; index >= 0; index--) {\n if (isNumeric(pathParts[index])) {\n return pathParts[index];\n }\n }\n\n return null;\n};\n\nexport function extractVideoId(\n url?: string,\n platform?: SupportedVideoPlatform,\n) {\n if (!url) {\n return null;\n }\n\n const normalizedUrl = /^[a-z][a-z\\d+\\-.]*:\\/\\//i.test(url)\n ? url\n : `https://${url}`;\n\n try {\n const parsedUrl = new URL(normalizedUrl);\n\n if (platform === \"youtube\") {\n return extractYouTubeVideoId(parsedUrl);\n }\n\n if (platform === \"vimeo\") {\n return extractVimeoVideoId(parsedUrl);\n }\n\n return (\n extractYouTubeVideoId(parsedUrl) || extractVimeoVideoId(parsedUrl)\n );\n } catch {\n return null;\n }\n}\n","import { useState, useEffect } from \"react\";\nimport { Play, X } from \"lucide-react\";\nimport { extractVideoId } from \"../utils\";\n\ntype VideoType = \"youtube\" | \"vimeo\" | \"self-hosted\";\n\nexport type AspectRatio =\n | \"16/9\" // Widescreen\n | \"4/3\" // Standard\n | \"1/1\" // Square\n | \"21/9\" // Ultrawide\n | \"9/16\" // Vertical\n | \"2/1\" // Panoramic\n | \"3/2\" // Classic\n | string; // Allow custom aspect ratios\n\nexport interface VideoThumbnailProps {\n title?: string;\n thumbnailUrl?: string;\n videoUrl: string;\n aspectRatio?: AspectRatio;\n modal?: boolean;\n}\n\nexport function VideoWithPreview({\n title = \"Video\",\n thumbnailUrl,\n videoUrl = \"https://www.youtube.com/watch?v=7OP2bU9RWVE\",\n aspectRatio = \"16/9\",\n modal = false,\n}: VideoThumbnailProps) {\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [isPlaying, setIsPlaying] = useState(false);\n const [vimeoThumbnail, setVimeoThumbnail] = useState<string | null>(null);\n\n const detectVideoType = (): VideoType => {\n if (extractVideoId(videoUrl, \"youtube\")) {\n return \"youtube\";\n }\n\n if (extractVideoId(videoUrl, \"vimeo\")) {\n return \"vimeo\";\n }\n\n return \"self-hosted\";\n };\n\n const videoType = detectVideoType();\n\n const getVideoId = () => {\n if (videoType === \"youtube\") {\n return extractVideoId(videoUrl, \"youtube\");\n }\n\n if (videoType === \"vimeo\") {\n return extractVideoId(videoUrl, \"vimeo\");\n }\n\n return null;\n };\n\n // Fetch Vimeo thumbnail if needed\n useEffect(() => {\n const fetchVimeoThumbnail = async () => {\n // Skip fetching if a thumbnail URL is already provided\n if (thumbnailUrl || videoType !== \"vimeo\") return;\n\n const videoId = getVideoId();\n if (!videoId) return;\n\n try {\n // Use Vimeo's oEmbed API to get thumbnail (no token required)\n const response = await fetch(\n `https://vimeo.com/api/oembed.json?url=https://vimeo.com/${videoId}`,\n );\n\n if (response.ok) {\n const data = await response.json();\n setVimeoThumbnail(data.thumbnail_url);\n }\n } catch (error) {\n console.error(\"Error fetching Vimeo thumbnail:\", error);\n }\n };\n\n fetchVimeoThumbnail();\n }, [videoUrl, videoType, thumbnailUrl]);\n\n // Get the appropriate thumbnail URL\n const getThumbnailUrl = () => {\n // If a thumbnail URL is explicitly provided, use that\n if (thumbnailUrl) return thumbnailUrl;\n\n // For YouTube videos, generate thumbnail URL\n if (videoType === \"youtube\") {\n const videoId = getVideoId();\n if (videoId) {\n return `https://img.youtube.com/vi/${videoId}/hqdefault.jpg`;\n }\n }\n\n // For Vimeo videos, use the fetched thumbnail\n if (videoType === \"vimeo\" && vimeoThumbnail) {\n return vimeoThumbnail;\n }\n\n // Fall back to placeholder\n return \"/placeholder.svg?height=480&width=854\";\n };\n\n // Lock body scroll when modal is open\n useEffect(() => {\n if (isModalOpen) {\n document.body.style.overflow = \"hidden\";\n } else {\n document.body.style.overflow = \"\";\n }\n\n return () => {\n document.body.style.overflow = \"\";\n };\n }, [isModalOpen]);\n\n // Get embed URL based on video type\n const getEmbedUrl = () => {\n const videoId = getVideoId();\n // Add autoplay parameter for in-place videos\n const shouldAutoplay = isPlaying;\n\n if (videoType === \"youtube\") {\n if (videoId) {\n return `https://www.youtube.com/embed/${videoId}${shouldAutoplay ? \"?autoplay=1\" : \"\"}`;\n }\n\n // If we couldn't extract the ID but it's a YouTube URL, try to use it directly\n const hasParams = videoUrl.includes(\"?\");\n return (\n videoUrl +\n (shouldAutoplay && !hasParams\n ? \"?autoplay=1\"\n : shouldAutoplay && hasParams\n ? \"&autoplay=1\"\n : \"\")\n );\n }\n\n if (videoType === \"vimeo\" && videoId) {\n return `https://player.vimeo.com/video/${videoId}${shouldAutoplay ? \"?autoplay=1\" : \"\"}`;\n }\n\n // For self-hosted videos, return the URL as is\n return videoUrl;\n };\n\n // Calculate aspect ratio style\n const aspectRatioStyle = () => {\n if (!aspectRatio.includes(\"/\")) return {};\n\n const [width, height] = aspectRatio.split(\"/\").map(Number);\n if (!width || !height) return {};\n\n return {\n aspectRatio: `${width}/${height}`,\n };\n };\n\n // Handle thumbnail click\n const handleThumbnailClick = () => {\n if (modal) {\n setIsModalOpen(true);\n } else {\n setIsPlaying(true);\n }\n };\n\n return (\n <div className={aspectRatio === \"9/16\" ? \"max-w-xs mx-auto\" : \"\"}>\n {/* Thumbnail with play button or in-place video */}\n <div\n className=\"relative overflow-hidden\"\n style={aspectRatioStyle()}\n >\n {!modal && isPlaying ? (\n // In-place video player\n <div className=\"w-full h-full\">\n {videoType !== \"self-hosted\" ? (\n <iframe\n src={getEmbedUrl()}\n className=\"w-full h-full\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n ></iframe>\n ) : (\n <video\n src={videoUrl}\n controls\n controlsList=\"nodownload\" // eslint-disable-line react/no-unknown-property\n onContextMenu={(e) => e.preventDefault()}\n autoPlay\n className=\"w-full h-full\"\n >\n Your browser does not support the video tag.\n </video>\n )}\n </div>\n ) : (\n // Thumbnail with play button\n <div\n className=\"cursor-pointer group w-full h-full\"\n onClick={handleThumbnailClick}\n >\n <img\n src={getThumbnailUrl() || \"/placeholder.svg\"}\n alt={`Thumbnail for ${title}`}\n className=\"w-full h-full object-cover transition-transform duration-300 group-hover:scale-105\"\n />\n <div className=\"absolute inset-0 bg-black/30 flex items-center justify-center\">\n <div className=\"relative\">\n {/* Smaller grayish concentric wave animation */}\n <span className=\"absolute -inset-1.5 rounded-full bg-gray-200/50 animate-pulse duration-[3000ms]\"></span>\n\n {/* Play button */}\n <div className=\"relative z-1 rounded-full bg-primary p-4 text-primary-foreground\">\n <Play\n className=\"h-8 w-8\"\n fill=\"currentColor\"\n />\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n\n {/* Custom Video Modal (only used when modal is true) */}\n {modal && isModalOpen && (\n <div className=\"fixed inset-0 bg-black/95 z-50 flex items-center justify-center p-4 sm:p-6 md:p-10\">\n <button\n onClick={() => setIsModalOpen(false)}\n className=\"absolute top-2 right-2 sm:top-4 sm:right-4 text-white hover:text-gray-300 focus:outline-none z-10\"\n aria-label=\"Close\"\n >\n <X className=\"h-6 w-6 sm:h-8 sm:w-8\" />\n </button>\n\n <div\n className=\"w-full max-w-xl sm:max-w-2xl md:max-w-3xl\"\n style={aspectRatioStyle()}\n >\n {videoType !== \"self-hosted\" ? (\n // YouTube or Vimeo video\n <iframe\n src={getEmbedUrl()}\n className=\"w-full h-full\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n ></iframe>\n ) : (\n // Self-hosted video\n <video\n src={videoUrl}\n controls\n controlsList=\"nodownload\" // eslint-disable-line react/no-unknown-property\n onContextMenu={(e) => e.preventDefault()}\n autoPlay\n className=\"w-full h-full\"\n >\n Your browser does not support the video tag.\n </video>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n","export type ImageObjectFit =\n | \"cover\"\n | \"contain\"\n | \"fill\"\n | \"none\"\n | \"scale-down\";\n\ninterface ImgProps {\n src: string;\n classes?: string;\n alt?: string;\n defaultImage?: string;\n loading?: \"eager\" | \"lazy\";\n height?: string;\n sizes?: `${string}vw`;\n width?: string;\n borderRadius?: number;\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 loading = \"lazy\",\n noDefaultImage = false,\n className = \"\",\n classes = \"\",\n width = \"w-full\",\n height = \"h-auto\",\n objectFit = \"cover\",\n } = props;\n const source = src || defaultImage;\n\n if (!source) {\n if (noDefaultImage) return null;\n return (\n <div\n className={`relative ${width} ${height} aspect-video overflow-hidden bg-muted ${classes} ${className}`}\n />\n );\n }\n\n return (\n <div\n className={`relative ${width} ${height} aspect-video overflow-hidden ${classes} ${className}`}\n >\n <img\n src={source}\n alt={alt}\n loading={loading}\n className={`absolute inset-0 h-full w-full ${objectFitClass[objectFit]}`}\n />\n </div>\n );\n};\n","\"use client\";\n\nimport * as React from \"react\";\n\nexport interface PageBuilderLinkProps {\n href: string;\n children?: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n onClick?: React.MouseEventHandler<HTMLAnchorElement>;\n target?: string;\n rel?: string;\n}\n\n/**\n * Optional host-supplied link. Next.js apps can pass `next/link`; Vite / Remix\n * / plain React hosts can omit it and NavLink will render a native `<a>`.\n */\nexport type PageBuilderLinkComponent =\n React.ComponentType<PageBuilderLinkProps>;\n\nconst PageBuilderLinkContext =\n React.createContext<PageBuilderLinkComponent | null>(null);\n\nexport function PageBuilderLinkProvider({\n component,\n children,\n}: {\n component?: PageBuilderLinkComponent | null;\n children: React.ReactNode;\n}) {\n return (\n <PageBuilderLinkContext.Provider value={component ?? null}>\n {children}\n </PageBuilderLinkContext.Provider>\n );\n}\n\nexport function usePageBuilderLinkComponent() {\n return React.useContext(PageBuilderLinkContext);\n}\n\ninterface NavLinkProps {\n href: string;\n children?: React.ReactNode;\n openInSameTab?: boolean;\n style?: React.CSSProperties;\n className?: string;\n onClick?: () => void;\n}\n\n/**\n * A navigation-aware link used inside block widgets. In-page anchors scroll\n * to the target. Internal paths (`/...`) use the host `linkComponent` when\n * one is provided (e.g. Next.js `Link`); everything else is a native `<a>`.\n */\nexport function NavLink({\n href,\n children,\n openInSameTab = true,\n style,\n className = \"\",\n onClick,\n}: NavLinkProps) {\n const LinkComponent = usePageBuilderLinkComponent();\n const isInternal = Boolean(href && href.startsWith(\"/\"));\n const isInPageNavigation = Boolean(href && href.startsWith(\"#\"));\n const target = openInSameTab ? undefined : \"_blank\";\n const rel = target === \"_blank\" ? \"noopener noreferrer\" : undefined;\n const handleClick: React.MouseEventHandler<HTMLAnchorElement> = () => {\n onClick?.();\n };\n\n if (!isInPageNavigation && isInternal && LinkComponent) {\n return (\n <LinkComponent\n href={href}\n style={style}\n className={className}\n onClick={handleClick}\n target={target}\n rel={rel}\n >\n {children}\n </LinkComponent>\n );\n }\n\n return (\n <a\n href={href}\n style={style}\n className={className}\n target={target}\n rel={rel}\n onClick={handleClick}\n >\n {children}\n </a>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useState } from \"react\";\nimport { Moon, Sun } from \"lucide-react\";\nimport { Button, type ButtonProps } from \"../primitives\";\nimport { Button as ChromeButton } from \"../primitives/components/ui/button\";\nimport type { ThemeStyle } from \"../models\";\nimport type { ResolvedColorMode } from \"../utils\";\n\n/**\n * Light / dark toggle. Public sites pass `theme` so the button uses\n * page-builder primitives; the builder chrome omits it and matches the\n * other icon buttons in the top bar.\n *\n * Preference starts as system (OS). The first click pins an explicit\n * light or dark side; later clicks flip between those two.\n */\nexport function ThemeModeSwitcher({\n resolved,\n onToggle,\n theme,\n className,\n size,\n variant,\n}: {\n resolved: ResolvedColorMode;\n onToggle: () => void;\n theme?: ThemeStyle;\n className?: string;\n size?: ButtonProps[\"size\"];\n variant?: ButtonProps[\"variant\"];\n}) {\n const [mounted, setMounted] = useState(false);\n useEffect(() => {\n setMounted(true);\n }, []);\n const painted = mounted ? resolved : \"light\";\n const next = painted === \"dark\" ? \"light\" : \"dark\";\n const label =\n next === \"dark\" ? \"Switch to dark mode\" : \"Switch to light mode\";\n const Icon = painted === \"dark\" ? Sun : Moon;\n\n if (theme) {\n return (\n <Button\n type=\"button\"\n variant={variant ?? \"outline\"}\n size={size ?? \"sm\"}\n theme={theme}\n title={label}\n aria-label={label}\n className={className}\n onClick={onToggle}\n >\n <Icon className=\"h-4 w-4\" />\n </Button>\n );\n }\n\n return (\n <ChromeButton\n type=\"button\"\n variant=\"outline\"\n size=\"icon\"\n title={label}\n aria-label={label}\n className={className}\n onClick={onToggle}\n >\n <Icon className=\"h-4 w-4\" />\n </ChromeButton>\n );\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/data-slots.ts"],"names":[],"mappings":";AAyBA,eAAsB,aAAA,CAClB,MAAA,EACA,OAAA,EACA,QAAA,EACkC;AAClC,EAAA,MAAM,QAAQ,MAAA,CAAO,MAAA,CAAO,CAAC,QAAA,KAAa,QAAA,CAAS,SAAS,WAAW,CAAA;AACvE,EAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,GAAA;AAAA,IAC3B,KAAA,CAAM,GAAA,CAAI,OAAO,QAAA,KAAa;AAC1B,MAAA,MAAM,IAAA,GAAO,SAAS,QAAA,EAAU,IAAA;AAChC,MAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,CAAC,MAAM,OAAO,IAAA;AAC9C,MAAA,MAAM,MAAA,GAAS,QAAQ,IAAI,CAAA;AAC3B,MAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,MAAA,OAAO,CAAC,MAAM,MAAM,MAAA,CAAO,EAAE,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,CAAC,CAAA;AAAA,IAC5D,CAAC;AAAA,GACL;AACA,EAAA,MAAM,SAAoC,EAAC;AAC3C,EAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC1B,IAAA,IAAI,OAAO,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA,GAAI,MAAM,CAAC,CAAA;AAAA,EACzC;AACA,EAAA,OAAO,MAAA;AACX","file":"chunk-GTY75HW2.js","sourcesContent":["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"]}
|