@commercetools-demo/puck-editor 0.6.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +13 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +18 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -4
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/PuckEditor.tsx","../src/config/defaultPuckConfig.ts","../src/fields/fontSizeField.ts","../src/components/Hero.tsx","../src/fields/RichTextField.tsx","../src/utils/sanitizeHtml.ts","../src/components/RichText.tsx","../src/components/Grid.tsx","../src/components/Columns.tsx","../src/fields/ImagePickerField.tsx","../src/components/Image.tsx","../src/components/Button.tsx","../src/components/Card.tsx","../src/components/Spacer.tsx","../src/components/ProductTeaser.tsx","../src/fields/DatasourceField.tsx","../src/components/cms/shared.ts","../src/components/cms/HeroBanner.tsx","../src/components/cms/TextBlock.tsx","../src/components/cms/CategoryGrid.tsx","../src/components/cms/CategoryHero.tsx","../src/components/cms/CheckoutPromoBanner.tsx","../src/components/cms/CountdownBanner.tsx","../src/components/cms/CrossSellBlock.tsx","../src/components/cms/DeliveryMessage.tsx","../src/components/cms/Divider.tsx","../src/components/cms/EmptyState.tsx","../src/components/cms/FAQAccordion.tsx","../src/components/cms/FooterBlock.tsx","../src/components/cms/ImageBlock.tsx","../src/components/cms/NewsletterSignup.tsx","../src/components/cms/ProductBanner.tsx","../src/components/cms/ProductGridHeader.tsx","../src/components/cms/ProductSlider.tsx","../src/components/cms/PromotionalBanner.tsx","../src/components/cms/RelatedProductsSlider.tsx","../src/components/cms/SocialLinks.tsx","../src/components/cms/TabContent.tsx","../src/components/cms/TestimonialsSlider.tsx","../src/components/cms/ThankYouContent.tsx","../src/components/cms/TrustBadges.tsx","../src/components/cms/VideoBlock.tsx","../src/components/cms/WebsiteLogo.tsx","../src/toolbar/EditorToolbar.tsx","../src/toolbar/CreateTemplateDialog.tsx","../src/utils/stripTemplateData.ts","../src/hooks/useDirtyState.ts","../src/overrides/ComponentListSearch.tsx","../src/overrides/NimbusFieldTypes.tsx","../src/EnsureNimbusProvider.tsx","../src/toolbar/UnsavedChangesDialog.tsx","../src/overrides/PropertiesResizer.tsx"],"sourcesContent":["// Main editor component\nexport { PuckEditor } from './PuckEditor';\nexport type { PuckEditorProps } from './PuckEditor';\n\n// Default config (consumers can extend this)\nexport { defaultPuckConfig } from './config/defaultPuckConfig';\n\n// Built-in components (export so consumers can compose custom configs)\nexport {\n Hero,\n RichText,\n Grid,\n Columns,\n Image,\n Button,\n Card,\n Spacer,\n ProductTeaser,\n} from './components';\nexport type {\n HeroProps,\n RichTextProps,\n GridProps,\n ColumnsProps,\n ImageProps,\n ButtonProps,\n CardProps,\n SpacerProps,\n ProductTeaserProps,\n} from './components';\n\n// Custom field components (reuse in your own component configs)\nexport { ImagePickerField } from './fields/ImagePickerField';\nexport type { ImagePickerFieldProps } from './fields/ImagePickerField';\n\nexport { DatasourceField } from './fields/DatasourceField';\nexport type { DatasourceFieldProps, DatasourceValue, DatasourceType } from './fields/DatasourceField';\n\nexport { RichTextField, richTextField } from './fields/RichTextField';\nexport type { RichTextFieldProps } from './fields/RichTextField';\n\nexport { sanitizeHtml } from './utils/sanitizeHtml';\n\n// CMS components\nexport * from './components/cms';\n\n// Toolbar (in case consumers want to render it standalone)\nexport { EditorToolbar } from './toolbar/EditorToolbar';\nexport type { EditorToolbarProps } from './toolbar/EditorToolbar';\n\n// Unsaved-changes navigation guard dialog (Nimbus)\nexport { UnsavedChangesDialog } from './toolbar/UnsavedChangesDialog';\nexport type { UnsavedChangesDialogProps } from './toolbar/UnsavedChangesDialog';\n\n// Create-template dialog (Nimbus) + \"without data\" stripping util\nexport { CreateTemplateDialog } from './toolbar/CreateTemplateDialog';\nexport type { CreateTemplateDialogProps } from './toolbar/CreateTemplateDialog';\nexport { stripPuckDataToTemplate } from './utils/stripTemplateData';\n\n// Dirty-state tracking hook (skips Puck's normalising mount onChange)\nexport { useDirtyState } from './hooks/useDirtyState';\nexport type { DirtyState } from './hooks/useDirtyState';\n\n// Puck overrides — component search panel and filter (reusable in any Puck editor)\nexport {\n ComponentSearchProvider,\n ComponentsPanel,\n ComponentItemFilter,\n} from './overrides/ComponentListSearch';\n\n// Nimbus-styled field-type overrides (text/textarea/select/radio inputs)\nexport { nimbusFieldTypes } from './overrides/NimbusFieldTypes';\n\n// Draggable resize handle for the properties (right) panel\nexport { PropertiesResizer } from './overrides/PropertiesResizer';\nexport type { PropertiesResizerProps } from './overrides/PropertiesResizer';\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { Puck, type Config, type Data } from '@measured/puck';\nimport '@measured/puck/puck.css';\nimport {\n PuckApiProvider,\n usePuckPage,\n usePuckTemplates,\n} from '@commercetools-demo/puck-api';\nimport type { PuckData } from '@commercetools-demo/puck-types';\nimport type { PuckPageVersionEntry } from '@commercetools-demo/puck-types';\nimport {\n VersionHistoryProvider,\n VersionPreviewBanner,\n VersionAwareFieldsPanel,\n VersionHistoryButton,\n useVersionHistoryPanel,\n useVersionDiff,\n} from '@commercetools-demo/puck-version-history';\nimport { defaultPuckConfig } from './config/defaultPuckConfig';\nimport { EditorToolbar } from './toolbar/EditorToolbar';\nimport { CreateTemplateDialog } from './toolbar/CreateTemplateDialog';\nimport { stripPuckDataToTemplate } from './utils/stripTemplateData';\nimport { useDirtyState } from './hooks/useDirtyState';\nimport {\n ComponentSearchProvider,\n ComponentsPanel,\n ComponentItemFilter,\n} from './overrides/ComponentListSearch';\nimport { nimbusFieldTypes } from './overrides/NimbusFieldTypes';\nimport { Stack } from '@commercetools/nimbus';\nimport { EnsureNimbusProvider } from './EnsureNimbusProvider';\n\n// ---------------------------------------------------------------------------\n// Inner component (uses context from PuckApiProvider)\n// ---------------------------------------------------------------------------\n\ninterface PuckEditorInnerProps {\n pageKey: string;\n config: Config;\n onPublish?: (puckData: PuckData) => void;\n onSave?: (puckData: PuckData) => void;\n onError?: (error: Error) => void;\n /** Opens the preview view; when omitted the Preview button is hidden. */\n onPreview?: () => void;\n /** Notifies the host when the unsaved-changes state flips (for nav guards). */\n onDirtyChange?: (isDirty: boolean) => void;\n showPublishButton: boolean;\n autoSaveDebounceMs: number;\n}\n\nconst PuckEditorInner: React.FC<PuckEditorInnerProps> = ({\n pageKey,\n config,\n onPublish,\n onSave,\n onError,\n onPreview,\n onDirtyChange,\n showPublishButton,\n autoSaveDebounceMs: _autoSaveDebounceMs,\n}) => {\n const {\n page,\n states,\n versions,\n saving,\n loading,\n error,\n saveDraft,\n publish,\n revertToPublished,\n loadVersions,\n } = usePuckPage(pageKey);\n\n const { createTemplate } = usePuckTemplates('page');\n\n const latestDataRef = useRef<Data | null>(null);\n const [isApplyingVersion, setIsApplyingVersion] = useState(false);\n // Bumped on revert so the Puck canvas remounts and re-reads the restored data.\n const [reloadNonce, setReloadNonce] = useState(0);\n // \"Create template from this page\" dialog.\n const [templateDialogOpen, setTemplateDialogOpen] = useState(false);\n const [templateSaving, setTemplateSaving] = useState(false);\n\n // Current live data (draft preferred, fallback to page value)\n const currentData: PuckData =\n states.draft?.puckData ??\n page?.puckData ?? {\n content: [],\n root: { props: {} },\n };\n\n // Version history panel state\n const versionHistory = useVersionHistoryPanel({\n versions: versions as PuckPageVersionEntry[],\n loadVersions,\n currentData,\n });\n\n // Unsaved-changes tracking — keyed so a new page / version / revert gets a\n // fresh baseline (and ignores Puck's normalising onChange on mount).\n const canvasKey = `${pageKey}:${versionHistory.selectedVersionId ?? 'current'}:${reloadNonce}`;\n const { isDirty: hasUnsavedChanges, markChange, markSaved } =\n useDirtyState(canvasKey);\n\n // Surface the dirty flag to the host (page-manager) for its nav guard.\n useEffect(() => {\n onDirtyChange?.(hasUnsavedChanges);\n }, [hasUnsavedChanges, onDirtyChange]);\n\n // Diff between selected historical version and current draft\n const diff = useVersionDiff(\n versionHistory.previewData,\n currentData\n );\n\n // Ref so handleChange can read the latest preview state without stale closure\n const isPreviewingRef = useRef(false);\n isPreviewingRef.current = versionHistory.isPreviewingHistory;\n\n // -------------------------------------------------------------------------\n // Normal editor handlers\n // -------------------------------------------------------------------------\n\n const handleChange = useCallback(\n (data: Data) => {\n if (isPreviewingRef.current) return;\n latestDataRef.current = data;\n markChange(data);\n },\n [markChange]\n );\n\n const handleSave = useCallback(async () => {\n const data = latestDataRef.current;\n if (!data) return;\n try {\n await saveDraft(data as PuckData);\n markSaved(data);\n onSave?.(data as PuckData);\n } catch (err) {\n onError?.(err as Error);\n }\n }, [saveDraft, onSave, onError, markSaved]);\n\n const handlePublish = useCallback(async () => {\n try {\n // Publish whatever is currently *saved* as the draft — never the\n // (possibly unsaved) live canvas. The service publishes the persisted\n // page value, so we must not write the canvas here; doing so was what\n // overwrote saved content with stale data on publish.\n await publish(false);\n onPublish?.(currentData);\n } catch (err) {\n onError?.(err as Error);\n }\n }, [publish, onPublish, currentData, onError]);\n\n const handleRevert = useCallback(async () => {\n try {\n await revertToPublished();\n // Force the canvas to remount so it shows the restored published data,\n // and reset the dirty baseline via the changed canvasKey.\n setReloadNonce((n) => n + 1);\n } catch (err) {\n onError?.(err as Error);\n }\n }, [revertToPublished, onError]);\n\n // -------------------------------------------------------------------------\n // Version history handlers\n // -------------------------------------------------------------------------\n\n const handleApplyVersion = useCallback(async () => {\n const versionData = versionHistory.previewData;\n if (!versionData) return;\n setIsApplyingVersion(true);\n try {\n await saveDraft(versionData);\n markSaved(versionData);\n onSave?.(versionData);\n versionHistory.clearSelection();\n } catch (err) {\n onError?.(err as Error);\n } finally {\n setIsApplyingVersion(false);\n }\n }, [versionHistory, saveDraft, onSave, onError, markSaved]);\n\n // -------------------------------------------------------------------------\n // Create template from this page\n // -------------------------------------------------------------------------\n\n const handleCreateTemplate = useCallback(\n async (name: string, withoutData: boolean) => {\n // Prefer the live canvas (may hold unsaved edits); fall back to saved data.\n const source = (latestDataRef.current as PuckData | null) ?? currentData;\n const puckData = withoutData\n ? (stripPuckDataToTemplate(source as Data, config) as PuckData)\n : source;\n setTemplateSaving(true);\n try {\n await createTemplate({ name, kind: 'page', puckData });\n setTemplateDialogOpen(false);\n } catch (err) {\n onError?.(err as Error);\n } finally {\n setTemplateSaving(false);\n }\n },\n [createTemplate, currentData, config, onError]\n );\n\n // -------------------------------------------------------------------------\n // Loading / error states\n // -------------------------------------------------------------------------\n\n if (loading) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100vh',\n fontSize: '16px',\n color: 'var(--puck-color-grey-07)',\n }}\n >\n Loading editor…\n </div>\n );\n }\n\n if (error) {\n return (\n <div\n style={{\n padding: '32px',\n color: 'var(--puck-color-red-07)',\n border: '1px solid var(--puck-color-red-04)',\n borderRadius: '8px',\n margin: '16px',\n }}\n >\n <strong>Error loading page:</strong> {error}\n </div>\n );\n }\n\n // Data shown in the Puck canvas — historical preview takes precedence\n const activeData: PuckData = versionHistory.previewData ?? currentData;\n\n return (\n <VersionHistoryProvider\n diff={diff}\n isPreviewingHistory={versionHistory.isPreviewingHistory}\n versions={versions as PuckPageVersionEntry[]}\n isLoadingVersions={versionHistory.isLoadingVersions}\n selectedVersionId={versionHistory.selectedVersionId}\n isApplying={isApplyingVersion}\n onVersionSelect={versionHistory.selectVersion}\n onApply={() => void handleApplyVersion()}\n onDiscard={versionHistory.clearSelection}\n onLoadVersions={versionHistory.openPanel}\n >\n <ComponentSearchProvider>\n <Puck\n key={`${versionHistory.selectedVersionId ?? 'current'}:${reloadNonce}`}\n config={config}\n data={activeData as Data}\n onChange={handleChange}\n onPublish={() => void handlePublish()}\n overrides={{\n fieldTypes: nimbusFieldTypes,\n header: () =>\n versionHistory.isPreviewingHistory ? (\n <Stack\n gridArea=\"header\"\n direction=\"row\"\n gap=\"200\"\n alignItems=\"center\"\n justifyContent=\"flex-end\"\n padding=\"200\"\n >\n <VersionPreviewBanner\n timestamp={versionHistory.selectedVersion!.timestamp}\n onApply={() => void handleApplyVersion()}\n onDiscard={versionHistory.clearSelection}\n isApplying={isApplyingVersion}\n />\n <VersionHistoryButton disabled={isApplyingVersion} />\n </Stack>\n ) : (\n <EditorToolbar\n title={page?.name ?? pageKey}\n saving={saving}\n isDirty={hasUnsavedChanges}\n states={states}\n onSave={() => void handleSave()}\n onPublish={() => void handlePublish()}\n onRevert={() => void handleRevert()}\n onPreview={onPreview}\n onCreateTemplate={() => setTemplateDialogOpen(true)}\n showPublishButton={showPublishButton}\n />\n ),\n components: ({ children }) => <ComponentsPanel>{children}</ComponentsPanel>,\n componentItem: ({ children, name }) => (\n <ComponentItemFilter name={name}>{children}</ComponentItemFilter>\n ),\n fields: ({ children, isLoading }) => (\n <VersionAwareFieldsPanel isLoading={isLoading}>\n {children}\n </VersionAwareFieldsPanel>\n ),\n }}\n />\n <CreateTemplateDialog\n isOpen={templateDialogOpen}\n onOpenChange={(open) => setTemplateDialogOpen(open)}\n onConfirm={handleCreateTemplate}\n saving={templateSaving}\n />\n </ComponentSearchProvider>\n </VersionHistoryProvider>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Public component (self-contained, wraps PuckApiProvider)\n// ---------------------------------------------------------------------------\n\nexport interface PuckEditorProps {\n /** Service base URL, e.g. \"http://localhost:8080\" */\n baseURL: string;\n /** CommerceTools project key */\n projectKey: string;\n /** Business unit key */\n businessUnitKey: string;\n /** JWT bearer token — required for save/publish mutations */\n jwtToken: string;\n /** Content locale (e.g. \"en-US\") used for locale-aware calls like product search */\n locale?: string;\n /** The key of the puck page to edit */\n pageKey: string;\n /**\n * Puck component config.\n * Defaults to `defaultPuckConfig` (all built-in components).\n * Consumers can extend or replace.\n */\n config?: Config;\n /** Called after a successful publish */\n onPublish?: (puckData: PuckData) => void;\n /** Called after each save */\n onSave?: (puckData: PuckData) => void;\n /** Called when an error occurs */\n onError?: (error: Error) => void;\n /** Opens the preview view; when omitted the toolbar Preview button is hidden. */\n onPreview?: () => void;\n /** Notifies the host when the unsaved-changes state flips (for nav guards). */\n onDirtyChange?: (isDirty: boolean) => void;\n /** Show the Publish button in the toolbar. Default: true */\n showPublishButton?: boolean;\n /** Debounce delay for auto-save in ms. Default: 1500 */\n autoSaveDebounceMs?: number;\n}\n\nexport const PuckEditor: React.FC<PuckEditorProps> = ({\n baseURL,\n projectKey,\n businessUnitKey,\n jwtToken,\n locale,\n pageKey,\n config = defaultPuckConfig,\n onPublish,\n onSave,\n onError,\n onPreview,\n onDirtyChange,\n showPublishButton = true,\n autoSaveDebounceMs = 1500,\n}) => {\n return (\n <PuckApiProvider\n baseURL={baseURL}\n projectKey={projectKey}\n businessUnitKey={businessUnitKey}\n jwtToken={jwtToken}\n locale={locale}\n >\n <EnsureNimbusProvider locale={locale}>\n <PuckEditorInner\n pageKey={pageKey}\n config={config}\n onPublish={onPublish}\n onSave={onSave}\n onError={onError}\n onPreview={onPreview}\n onDirtyChange={onDirtyChange}\n showPublishButton={showPublishButton}\n autoSaveDebounceMs={autoSaveDebounceMs}\n />\n </EnsureNimbusProvider>\n </PuckApiProvider>\n );\n};\n","import React from 'react';\nimport { type Config } from '@measured/puck';\nimport { Hero } from '../components/Hero';\nimport { RichText } from '../components/RichText';\nimport { Grid } from '../components/Grid';\nimport { Columns } from '../components/Columns';\nimport { Image } from '../components/Image';\nimport { Button } from '../components/Button';\nimport { Card } from '../components/Card';\nimport { Spacer } from '../components/Spacer';\nimport { ProductTeaser } from '../components/ProductTeaser';\nimport {\n HeroBanner, TextBlock, CategoryGrid, CategoryHero,\n CheckoutPromoBanner, CountdownBanner, CrossSellBlock, DeliveryMessage,\n Divider, EmptyState, FAQAccordion, FooterBlock, ImageBlock,\n NewsletterSignup, ProductBanner, ProductGridHeader, ProductSlider,\n PromotionalBanner, RelatedProductsSlider, SocialLinks, TabContent,\n TestimonialsSlider, ThankYouContent, TrustBadges, VideoBlock, WebsiteLogo,\n} from '../components/cms';\n\n/**\n * Page content-width scale. `X` is the base column unit; each step doubles up\n * to a wide layout, and `full` removes the constraint (edge-to-edge).\n */\ntype ContentWidth = 'x' | '2x' | '3x' | '4x' | '5x' | '6x' | 'full';\n\nconst CONTENT_WIDTHS: Record<ContentWidth, string> = {\n x: '256px',\n '2x': '512px',\n '3x': '768px',\n '4x': '1024px',\n '5x': '1280px',\n '6x': '1536px',\n full: '100%',\n};\n\n/**\n * Default Puck configuration with built-in components.\n *\n * Consumers can extend this:\n * ```ts\n * import { defaultPuckConfig } from '@commercetools-demo/puck-editor';\n * const myConfig = {\n * ...defaultPuckConfig,\n * components: { ...defaultPuckConfig.components, MyComponent },\n * };\n * ```\n */\nexport const defaultPuckConfig: Config = {\n components: {\n Hero,\n RichText,\n Grid,\n Columns,\n Image,\n Button,\n Card,\n Spacer,\n ProductTeaser,\n // CMS components\n HeroBanner, TextBlock, CategoryGrid, CategoryHero,\n CheckoutPromoBanner, CountdownBanner, CrossSellBlock, DeliveryMessage,\n Divider, EmptyState, FAQAccordion, FooterBlock, ImageBlock,\n NewsletterSignup, ProductBanner, ProductGridHeader, ProductSlider,\n PromotionalBanner, RelatedProductsSlider, SocialLinks, TabContent,\n TestimonialsSlider, ThankYouContent, TrustBadges, VideoBlock, WebsiteLogo,\n },\n // Plain-language groups so the component panel reads cleanly for non-technical\n // authors. Common groups are expanded; the rest start collapsed. Deprecated\n // components live in a hidden category (still render, just not offered).\n categories: {\n layout: {\n title: 'Layout',\n defaultExpanded: false,\n components: ['Grid', 'Card', 'Spacer', 'Divider', 'Columns'],\n },\n text: {\n title: 'Text & Content',\n defaultExpanded: false,\n components: ['RichText', 'TextBlock', 'FAQAccordion', 'TabContent'],\n },\n media: {\n title: 'Media',\n defaultExpanded: false,\n components: ['Image', 'ImageBlock', 'VideoBlock', 'WebsiteLogo'],\n },\n heroBanners: {\n title: 'Hero & Banners',\n defaultExpanded: false,\n components: [\n 'Hero', 'HeroBanner', 'PromotionalBanner', 'CountdownBanner',\n 'CategoryHero', 'CheckoutPromoBanner', 'ProductBanner',\n ],\n },\n products: {\n title: 'Products',\n defaultExpanded: false,\n components: [\n 'ProductTeaser', 'ProductSlider', 'ProductGridHeader',\n 'RelatedProductsSlider', 'CrossSellBlock', 'CategoryGrid',\n ],\n },\n actions: {\n title: 'Buttons & Forms',\n defaultExpanded: false,\n components: ['Button', 'NewsletterSignup'],\n },\n socialProof: {\n title: 'Social Proof & Info',\n defaultExpanded: false,\n components: ['TestimonialsSlider', 'TrustBadges', 'SocialLinks', 'DeliveryMessage'],\n },\n sections: {\n title: 'Page Sections',\n defaultExpanded: false,\n components: ['FooterBlock', 'EmptyState', 'ThankYouContent'],\n },\n // Anything not explicitly categorised (e.g. future components) still shows.\n other: {\n title: 'Other',\n },\n },\n root: {\n fields: {\n title: { type: 'text', label: 'Page Title' },\n backgroundColor: { type: 'text', label: 'Background Color (CSS)' },\n contentWidth: {\n type: 'select',\n label: 'Content Width',\n options: [\n { label: 'X', value: 'x' },\n { label: '2X', value: '2x' },\n { label: '3X', value: '3x' },\n { label: '4X', value: '4x' },\n { label: '5X', value: '5x' },\n { label: '6X', value: '6x' },\n { label: 'Full width', value: 'full' },\n ],\n },\n },\n defaultProps: {\n title: 'New Page',\n backgroundColor: '#ffffff',\n // Default to full-bleed so existing pages render unchanged.\n contentWidth: 'full',\n },\n render: ({ children, backgroundColor, contentWidth }) => {\n const maxWidth = CONTENT_WIDTHS[contentWidth as ContentWidth] ?? '100%';\n const isConstrained = maxWidth !== '100%';\n return React.createElement(\n 'div',\n {\n style: {\n background: backgroundColor ?? '#ffffff',\n minHeight: '100vh',\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n },\n },\n React.createElement(\n 'div',\n {\n style: {\n maxWidth,\n // Centre the content column and give it breathing room on the\n // sides when its width is constrained.\n margin: '0 auto',\n paddingLeft: isConstrained ? '24px' : undefined,\n paddingRight: isConstrained ? '24px' : undefined,\n boxSizing: 'border-box',\n },\n },\n children\n )\n );\n },\n },\n};\n","import type { Field } from '@measured/puck';\n\n/**\n * Reusable font-size control for plain-text component props (headings, labels,\n * etc.). This covers the text elements that aren't edited through the rich-text\n * editor (the Nimbus RichTextInput has no inline font-size control).\n *\n * The stored value is a CSS size string (e.g. \"1.5rem\"); the empty option means\n * \"inherit the component default\", so render with `value || defaultSize`.\n */\nconst FONT_SIZE_OPTIONS = [\n { label: 'Default', value: '' },\n { label: 'Small (0.875rem)', value: '0.875rem' },\n { label: 'Medium (1rem)', value: '1rem' },\n { label: 'Large (1.25rem)', value: '1.25rem' },\n { label: 'X-Large (1.5rem)', value: '1.5rem' },\n { label: '2X-Large (2rem)', value: '2rem' },\n { label: '3X-Large (2.5rem)', value: '2.5rem' },\n { label: '4X-Large (3rem)', value: '3rem' },\n];\n\nexport const FONT_SIZE_FIELD = (label: string): Field => ({\n type: 'select',\n label,\n options: FONT_SIZE_OPTIONS,\n});\n","import React from 'react';\nimport type { ComponentConfig } from '@measured/puck';\nimport { FONT_SIZE_FIELD } from '../fields/fontSizeField';\n\nexport interface HeroProps {\n heading: string;\n headingFontSize?: string;\n subheading?: string;\n subheadingFontSize?: string;\n backgroundImage?: string;\n ctaText?: string;\n ctaUrl?: string;\n layout?: 'centered' | 'left-aligned';\n minHeight?: string;\n}\n\nexport const Hero: ComponentConfig<HeroProps> = {\n label: 'Hero',\n fields: {\n heading: { type: 'text', label: 'Heading' },\n headingFontSize: FONT_SIZE_FIELD('Heading Font Size'),\n subheading: { type: 'textarea', label: 'Subheading' },\n subheadingFontSize: FONT_SIZE_FIELD('Subheading Font Size'),\n backgroundImage: { type: 'text', label: 'Background Image URL' },\n ctaText: { type: 'text', label: 'CTA Button Text' },\n ctaUrl: { type: 'text', label: 'CTA Button URL' },\n layout: {\n type: 'select',\n label: 'Layout',\n options: [\n { value: 'centered', label: 'Centered' },\n { value: 'left-aligned', label: 'Left Aligned' },\n ],\n },\n minHeight: { type: 'text', label: 'Min Height (CSS, e.g. 400px)' },\n },\n defaultProps: {\n heading: 'Welcome',\n layout: 'centered',\n minHeight: '400px',\n },\n render: ({\n heading,\n headingFontSize,\n subheading,\n subheadingFontSize,\n backgroundImage,\n ctaText,\n ctaUrl,\n layout,\n minHeight,\n }) => {\n const isCenter = layout !== 'left-aligned';\n return (\n <section\n style={{\n position: 'relative',\n minHeight: minHeight ?? '400px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: isCenter ? 'center' : 'flex-start',\n padding: '48px 32px',\n backgroundImage: backgroundImage\n ? `url(${backgroundImage})`\n : undefined,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n backgroundColor: backgroundImage ? undefined : '#1a1a2e',\n color: '#fff',\n boxSizing: 'border-box',\n }}\n >\n {backgroundImage && (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n background: 'rgba(0,0,0,0.45)',\n }}\n />\n )}\n <div\n style={{\n position: 'relative',\n maxWidth: '720px',\n textAlign: isCenter ? 'center' : 'left',\n }}\n >\n <h1 style={{ margin: '0 0 16px', fontSize: headingFontSize || '2.5rem', fontWeight: 700 }}>\n {heading}\n </h1>\n {subheading && (\n <p style={{ margin: '0 0 24px', fontSize: subheadingFontSize || '1.2rem', opacity: 0.85 }}>\n {subheading}\n </p>\n )}\n {ctaText && ctaUrl && (\n <a\n href={ctaUrl}\n style={{\n display: 'inline-block',\n padding: '12px 28px',\n background: '#e94560',\n color: '#fff',\n borderRadius: '4px',\n textDecoration: 'none',\n fontWeight: 600,\n }}\n >\n {ctaText}\n </a>\n )}\n </div>\n </section>\n );\n },\n};\n","import React from 'react';\nimport { type CustomField } from '@measured/puck';\nimport { RichTextInput } from '@commercetools/nimbus';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface RichTextFieldProps {\n /** HTML string. */\n value: string | undefined;\n onChange: (value: string) => void;\n}\n\n// ---------------------------------------------------------------------------\n// RichTextField — custom Puck field component (HTML in / HTML out)\n//\n// Thin wrapper around Nimbus `RichTextInput`, which accepts and emits HTML\n// strings (converting to/from its internal Slate representation). The props\n// contract is unchanged, so every consumer (the RichText block and the cms/*\n// components) keeps working without modification, and stored page data needs\n// no migration.\n// ---------------------------------------------------------------------------\n\nexport const RichTextField: React.FC<RichTextFieldProps> = ({ value, onChange }) => (\n <RichTextInput\n value={value ?? ''}\n onChange={onChange}\n placeholder=\"Start typing…\"\n />\n);\n\n/**\n * Puck `custom` field config that renders a rich-text editor (HTML in / out).\n * Use in a component's `fields` for any prop that holds an HTML string, e.g.\n * fields: { body: richTextField('Body') }\n */\nexport const richTextField = (label: string): CustomField<string> => ({\n type: 'custom',\n label,\n render: ({ value, onChange }) => (\n <RichTextField value={value} onChange={onChange} />\n ),\n});\n","import DOMPurify from 'isomorphic-dompurify';\n\n/**\n * Sanitize rich-text HTML before it is injected via dangerouslySetInnerHTML.\n *\n * RichText/TextBlock/Card store author-controlled HTML produced by the TipTap\n * editor, but content can also arrive from imports or older data, so we always\n * sanitize at render time. isomorphic-dompurify works in both the browser and\n * during SSR, so this is safe wherever the renderer runs.\n *\n * `style` and `class` are allowed because the editor emits inline styles\n * (e.g. font-size from the typography control) and structural classes.\n */\nexport const sanitizeHtml = (html: string | undefined | null): string => {\n if (!html) return '';\n return DOMPurify.sanitize(html, {\n USE_PROFILES: { html: true },\n ADD_ATTR: ['target', 'rel'],\n });\n};\n","import React from 'react';\nimport type { ComponentConfig } from '@measured/puck';\nimport { RichTextField } from '../fields/RichTextField';\nimport { sanitizeHtml } from '../utils/sanitizeHtml';\n\nexport interface RichTextProps {\n content: string;\n align?: 'left' | 'center' | 'right';\n maxWidth?: string;\n padding?: string;\n}\n\nexport const RichText: ComponentConfig<RichTextProps> = {\n label: 'Rich Text',\n fields: {\n content: {\n type: 'custom',\n label: 'Content',\n render: ({ value, onChange }) => (\n <RichTextField value={value as string} onChange={onChange} />\n ),\n },\n align: {\n type: 'select',\n label: 'Text Alignment',\n options: [\n { value: 'left', label: 'Left' },\n { value: 'center', label: 'Center' },\n { value: 'right', label: 'Right' },\n ],\n },\n maxWidth: { type: 'text', label: 'Max Width (CSS)' },\n padding: { type: 'text', label: 'Padding (CSS)' },\n },\n defaultProps: {\n content: '<p>Add your content here…</p>',\n align: 'left',\n padding: '32px',\n },\n render: ({ content, align, maxWidth, padding }) => (\n <div\n style={{\n padding: padding ?? '32px',\n textAlign: align ?? 'left',\n maxWidth: maxWidth,\n margin: maxWidth ? '0 auto' : undefined,\n boxSizing: 'border-box',\n }}\n // HTML from the rich-text editor, sanitized before injection\n dangerouslySetInnerHTML={{ __html: sanitizeHtml(content) }}\n />\n ),\n};\n","import React from 'react';\nimport { DropZone, type ComponentConfig } from '@measured/puck';\n\nexport interface GridProps {\n columnCount?: 1 | 2 | 3 | 4 | 5 | 6;\n rowCount?: 1 | 2 | 3 | 4 | 5 | 6;\n gap?: string;\n padding?: string;\n}\n\nconst COUNT_OPTIONS = [1, 2, 3, 4, 5, 6].map((n) => ({\n value: n,\n label: String(n),\n}));\n\n/**\n * Grid — a layout container that lays out a `columnCount` × `rowCount` matrix\n * of drop zones. Each cell is an independent Puck DropZone, so components can be\n * dropped into any cell. (Renamed from \"Columns\"; rows added.)\n *\n * This render function is shared by the editor and the Puck renderer\n * (puck-renderer runs the same config), so updating it here updates both.\n */\nexport const Grid: ComponentConfig<GridProps> = {\n label: 'Grid',\n fields: {\n columnCount: {\n type: 'select',\n label: 'Number of Columns',\n options: COUNT_OPTIONS,\n },\n rowCount: {\n type: 'select',\n label: 'Number of Rows',\n options: COUNT_OPTIONS,\n },\n gap: { type: 'text', label: 'Gap (CSS)' },\n padding: { type: 'text', label: 'Padding (CSS)' },\n },\n defaultProps: {\n columnCount: 2,\n rowCount: 1,\n gap: '16px',\n padding: '16px',\n },\n render: ({ columnCount = 2, rowCount = 1, gap = '16px', padding = '16px' }) => {\n const cols = Math.max(1, columnCount);\n const rows = Math.max(1, rowCount);\n const cells = Array.from({ length: cols * rows }, (_, i) => i);\n return (\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: `repeat(${cols}, 1fr)`,\n gridTemplateRows: `repeat(${rows}, minmax(40px, auto))`,\n gap,\n padding,\n boxSizing: 'border-box',\n }}\n >\n {cells.map((i) => (\n <div key={i}>\n {/* Cells are indexed row-major: cell-0 = row 0 col 0, etc. */}\n <DropZone zone={`cell-${i}`} />\n </div>\n ))}\n </div>\n );\n },\n};\n","import React from 'react';\nimport { DropZone, type ComponentConfig } from '@measured/puck';\n\nexport interface ColumnsProps {\n columnCount?: 2 | 3 | 4;\n gap?: string;\n padding?: string;\n}\n\n/**\n * @deprecated Use `Grid` instead (columns + rows). `Columns` is kept registered\n * for backward compatibility so pages saved with the original component (and its\n * `column-N` drop zones) keep rendering. Prefer Grid for new content.\n */\nexport const Columns: ComponentConfig<ColumnsProps> = {\n label: 'Columns',\n fields: {\n columnCount: {\n type: 'select',\n label: 'Number of Columns',\n options: [\n { value: 2, label: '2 Columns' },\n { value: 3, label: '3 Columns' },\n { value: 4, label: '4 Columns' },\n ],\n },\n gap: { type: 'text', label: 'Column Gap (CSS)' },\n padding: { type: 'text', label: 'Padding (CSS)' },\n },\n defaultProps: {\n columnCount: 2,\n gap: '16px',\n padding: '16px',\n },\n render: ({ columnCount = 2, gap = '16px', padding = '16px' }) => {\n const cols = Array.from({ length: columnCount }, (_, i) => i);\n return (\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: `repeat(${columnCount}, 1fr)`,\n gap,\n padding,\n boxSizing: 'border-box',\n }}\n >\n {cols.map((i) => (\n <div key={i}>\n <DropZone zone={`column-${i}`} />\n </div>\n ))}\n </div>\n );\n },\n};\n","import React, {\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { useMediaLibrary } from '@commercetools-demo/puck-api';\nimport type { MediaFile } from '@commercetools-demo/puck-types';\nimport {\n Button,\n FormField,\n Icon,\n IconButton,\n LoadingSpinner,\n Stack,\n Text,\n TextInput,\n} from '@commercetools/nimbus';\nimport { Close } from '@commercetools/nimbus-icons';\n\n// ---------------------------------------------------------------------------\n// Upload modal\n// ---------------------------------------------------------------------------\n\ninterface UploadModalProps {\n uploading: boolean;\n error: string | null;\n onUpload: (file: File, title: string, description: string) => void;\n onClose: () => void;\n}\n\nconst UploadModal: React.FC<UploadModalProps> = ({\n uploading,\n error,\n onUpload,\n onClose,\n}) => {\n const [file, setFile] = useState<File | null>(null);\n const [title, setTitle] = useState('');\n const [description, setDescription] = useState('');\n const [dragging, setDragging] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const handleFile = (f: File) => {\n setFile(f);\n if (!title) setTitle(f.name);\n };\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n setDragging(false);\n const f = e.dataTransfer.files[0];\n if (f) handleFile(f);\n };\n\n return (\n <div\n style={{\n position: 'fixed',\n inset: 0,\n background: 'rgba(0,0,0,0.5)',\n zIndex: 9999,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n onClick={(e) => e.target === e.currentTarget && onClose()}\n >\n <div\n style={{\n background: '#fff',\n borderRadius: '8px',\n width: '640px',\n maxWidth: '95vw',\n maxHeight: '85vh',\n display: 'flex',\n flexDirection: 'column',\n boxShadow: '0 20px 60px rgba(0,0,0,0.3)',\n }}\n >\n {/* Header */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '16px 20px',\n borderBottom: '1px solid #e5e7eb',\n }}\n >\n <Text as=\"h4\" fontSize=\"xl\" fontWeight=\"700\">Upload a file</Text>\n <IconButton aria-label=\"Close\" variant=\"ghost\" size=\"xs\" onPress={onClose}>\n <Close />\n </IconButton>\n </div>\n\n {/* Body */}\n <div style={{ flex: 1, overflow: 'auto', padding: '20px' }}>\n <Stack direction=\"column\" gap=\"400\">\n <FormField.Root>\n <FormField.Label>Title</FormField.Label>\n <FormField.Input>\n <TextInput\n value={title}\n onChange={(value) => setTitle(value)}\n placeholder=\"File title\"\n />\n </FormField.Input>\n </FormField.Root>\n <FormField.Root>\n <FormField.Label>Description</FormField.Label>\n <FormField.Input>\n <TextInput\n value={description}\n onChange={(value) => setDescription(value)}\n placeholder=\"Optional description\"\n />\n </FormField.Input>\n </FormField.Root>\n <div\n style={{\n border: dragging ? '2px dashed #3b82f6' : '2px dashed #d1d5db',\n borderRadius: '6px',\n padding: '24px',\n textAlign: 'center',\n cursor: 'pointer',\n color: dragging ? '#3b82f6' : '#6b7280',\n fontSize: '13px',\n transition: 'border-color .2s',\n }}\n onClick={() => inputRef.current?.click()}\n onDragOver={(e) => { e.preventDefault(); setDragging(true); }}\n onDragLeave={() => setDragging(false)}\n onDrop={handleDrop}\n >\n {file ? (\n <>\n <div>📎 {file.name}</div>\n <div style={{ fontSize: '11px', marginTop: '4px', color: '#9ca3af' }}>\n {(file.size / 1024).toFixed(0)} KB\n </div>\n </>\n ) : (\n <div>📁 Click or drag & drop to select a file</div>\n )}\n <input\n ref={inputRef}\n type=\"file\"\n accept=\"image/*\"\n style={{ display: 'none' }}\n onChange={(e) => {\n const f = e.target.files?.[0];\n if (f) handleFile(f);\n }}\n />\n </div>\n {error && <Text color=\"critical.11\">{error}</Text>}\n </Stack>\n </div>\n\n {/* Footer */}\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '12px 20px',\n borderTop: '1px solid #e5e7eb',\n gap: '12px',\n }}\n >\n <Text fontSize=\"sm\" color=\"neutral.11\" truncate>\n {file?.name ?? 'No file selected'}\n </Text>\n <Stack direction=\"row\" gap=\"200\">\n <Button variant=\"outline\" onPress={onClose}>Cancel</Button>\n <Button\n variant=\"solid\"\n isDisabled={!file || uploading}\n onPress={() => file && onUpload(file, title, description)}\n >\n {uploading ? 'Uploading…' : 'Upload'}\n </Button>\n </Stack>\n </div>\n </div>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Library modal\n// ---------------------------------------------------------------------------\n\ninterface LibraryModalProps {\n files: MediaFile[];\n pagination: { currentPage: number; totalPages: number };\n loading: boolean;\n error: string | null;\n onNextPage: () => void;\n onPrevPage: () => void;\n onSelect: (file: MediaFile) => void;\n onClose: () => void;\n}\n\nconst LibraryModal: React.FC<LibraryModalProps> = ({\n files,\n pagination,\n loading,\n error,\n onNextPage,\n onPrevPage,\n onSelect,\n onClose,\n}) => {\n const [selected, setSelected] = useState<MediaFile | null>(null);\n\n const handleConfirm = () => {\n if (selected) onSelect(selected);\n };\n\n return (\n <div\n style={{\n position: 'fixed',\n inset: 0,\n background: 'rgba(0,0,0,0.5)',\n zIndex: 9999,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n onClick={(e) => e.target === e.currentTarget && onClose()}\n >\n <div\n style={{\n background: '#fff',\n borderRadius: '8px',\n width: '640px',\n maxWidth: '95vw',\n maxHeight: '85vh',\n display: 'flex',\n flexDirection: 'column',\n boxShadow: '0 20px 60px rgba(0,0,0,0.3)',\n }}\n >\n {/* Header */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '16px 20px',\n borderBottom: '1px solid #e5e7eb',\n }}\n >\n <Text as=\"h4\" fontSize=\"xl\" fontWeight=\"700\">Select from Media Library</Text>\n <IconButton aria-label=\"Close\" variant=\"ghost\" size=\"xs\" onPress={onClose}>\n <Close />\n </IconButton>\n </div>\n\n {/* Body */}\n <div style={{ flex: 1, overflow: 'auto', padding: '20px' }}>\n {loading ? (\n <div style={{ display: 'flex', justifyContent: 'center', padding: '32px' }}>\n <LoadingSpinner />\n </div>\n ) : files.length === 0 ? (\n <Text color=\"neutral.11\">No files found.</Text>\n ) : (\n <Stack direction=\"column\" gap=\"400\">\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(110px, 1fr))',\n gap: '12px',\n }}\n >\n {files.map((file) => (\n <div\n key={file.url}\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n cursor: 'pointer',\n border: `2px solid ${selected?.url === file.url ? '#3b82f6' : 'transparent'}`,\n borderRadius: '6px',\n padding: '6px',\n background: selected?.url === file.url ? 'rgba(59,130,246,0.07)' : '#f9fafb',\n }}\n onClick={() => setSelected(file)}\n title={file.title ?? file.name}\n >\n {file.isImage ? (\n <img\n src={file.url}\n alt={file.name}\n style={{ width: '80px', height: '80px', objectFit: 'cover', borderRadius: '4px', background: '#e5e7eb' }}\n />\n ) : (\n <div\n style={{\n width: '80px',\n height: '80px',\n borderRadius: '4px',\n background: '#e5e7eb',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '28px',\n }}\n >\n 📄\n </div>\n )}\n <div\n style={{\n marginTop: '6px',\n fontSize: '11px',\n textAlign: 'center',\n maxWidth: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n color: '#374151',\n }}\n >\n {file.title ?? file.name}\n </div>\n </div>\n ))}\n </div>\n\n {pagination.totalPages > 1 && (\n <Stack direction=\"row\" gap=\"200\" alignItems=\"center\" justifyContent=\"center\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n isDisabled={pagination.currentPage <= 1}\n onPress={onPrevPage}\n >\n ← Prev\n </Button>\n <Text fontSize=\"sm\" color=\"neutral.11\">\n {pagination.currentPage} / {pagination.totalPages}\n </Text>\n <Button\n variant=\"outline\"\n size=\"sm\"\n isDisabled={pagination.currentPage >= pagination.totalPages}\n onPress={onNextPage}\n >\n Next →\n </Button>\n </Stack>\n )}\n </Stack>\n )}\n {error && <Text color=\"critical.11\">{error}</Text>}\n </div>\n\n {/* Footer */}\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '12px 20px',\n borderTop: '1px solid #e5e7eb',\n gap: '12px',\n }}\n >\n <Text fontSize=\"sm\" color=\"neutral.11\" truncate>\n {selected ? (selected.title ?? selected.name) : 'Nothing selected'}\n </Text>\n <Stack direction=\"row\" gap=\"200\">\n <Button variant=\"outline\" onPress={onClose}>Cancel</Button>\n <Button variant=\"solid\" isDisabled={!selected} onPress={handleConfirm}>\n Select\n </Button>\n </Stack>\n </div>\n </div>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// ImagePickerField — the Puck custom field component\n// ---------------------------------------------------------------------------\n\nexport interface ImagePickerFieldProps {\n value: string;\n onChange: (value: string) => void;\n /** Only show images (default: true) */\n imagesOnly?: boolean;\n}\n\nexport const ImagePickerField: React.FC<ImagePickerFieldProps> = ({\n value,\n onChange,\n imagesOnly = true,\n}) => {\n const {\n files,\n pagination,\n loading,\n uploading,\n error,\n fetchMedia,\n uploadFile,\n loadNextPage,\n loadPreviousPage,\n } = useMediaLibrary();\n\n const [showUpload, setShowUpload] = useState(false);\n const [showLibrary, setShowLibrary] = useState(false);\n\n const extensions = imagesOnly ? ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg'] : [];\n\n const openLibrary = useCallback(() => {\n void fetchMedia(extensions, 1, 20);\n setShowLibrary(true);\n }, [fetchMedia, extensions]);\n\n const handleUpload = useCallback(\n async (file: File, title: string, description: string) => {\n const mediaFile = await uploadFile(file, title, description);\n onChange(mediaFile.url);\n setShowUpload(false);\n },\n [uploadFile, onChange]\n );\n\n const handleSelect = useCallback(\n (file: MediaFile) => {\n onChange(file.url);\n setShowLibrary(false);\n },\n [onChange]\n );\n\n // Close modals on Escape\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setShowUpload(false);\n setShowLibrary(false);\n }\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, []);\n\n return (\n <Stack direction=\"column\" gap=\"200\">\n {value ? (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '10px',\n padding: '8px',\n border: '1px solid #d1d5db',\n borderRadius: '6px',\n background: '#f9fafb',\n }}\n >\n <img\n src={value}\n alt=\"Selected image preview\"\n style={{ width: '48px', height: '48px', objectFit: 'cover', borderRadius: '4px', flexShrink: 0 }}\n />\n <div style={{ flex: 1, minWidth: 0 }}>\n <Text fontSize=\"sm\" color=\"neutral.11\" truncate>{value}</Text>\n </div>\n <Button variant=\"ghost\" colorPalette=\"critical\" size=\"xs\" onPress={() => onChange('')}>\n Remove\n </Button>\n </div>\n ) : (\n <Text fontSize=\"sm\" color=\"neutral.11\">No image selected</Text>\n )}\n\n <Stack direction=\"row\" gap=\"200\">\n <Button variant=\"outline\" onPress={() => setShowUpload(true)}>Upload</Button>\n <Button variant=\"solid\" onPress={openLibrary}>Media Library</Button>\n </Stack>\n\n {showUpload && (\n <UploadModal\n uploading={uploading}\n error={error}\n onUpload={(file, title, desc) => void handleUpload(file, title, desc)}\n onClose={() => setShowUpload(false)}\n />\n )}\n\n {showLibrary && (\n <LibraryModal\n files={files}\n pagination={pagination}\n loading={loading}\n error={error}\n onNextPage={() => void loadNextPage(extensions)}\n onPrevPage={() => void loadPreviousPage(extensions)}\n onSelect={handleSelect}\n onClose={() => setShowLibrary(false)}\n />\n )}\n </Stack>\n );\n};\n","import React from 'react';\nimport type { ComponentConfig } from '@measured/puck';\nimport { ImagePickerField } from '../fields/ImagePickerField';\n\nexport interface ImageProps {\n src: string;\n alt?: string;\n caption?: string;\n width?: string;\n height?: string;\n objectFit?: 'cover' | 'contain' | 'fill';\n borderRadius?: string;\n align?: 'left' | 'center' | 'right';\n}\n\nexport const Image: ComponentConfig<ImageProps> = {\n label: 'Image',\n fields: {\n src: {\n type: 'custom',\n label: 'Image',\n render: ({ value, onChange }) => (\n <ImagePickerField\n value={value as string}\n onChange={onChange}\n imagesOnly={true}\n />\n ),\n },\n alt: { type: 'text', label: 'Alt Text' },\n caption: { type: 'text', label: 'Caption' },\n width: { type: 'text', label: 'Width (CSS, e.g. 100%)' },\n height: { type: 'text', label: 'Height (CSS, e.g. 300px)' },\n objectFit: {\n type: 'select',\n label: 'Object Fit',\n options: [\n { value: 'cover', label: 'Cover' },\n { value: 'contain', label: 'Contain' },\n { value: 'fill', label: 'Fill' },\n ],\n },\n borderRadius: { type: 'text', label: 'Border Radius (CSS)' },\n align: {\n type: 'select',\n label: 'Alignment',\n options: [\n { value: 'left', label: 'Left' },\n { value: 'center', label: 'Center' },\n { value: 'right', label: 'Right' },\n ],\n },\n },\n defaultProps: {\n src: '',\n alt: '',\n width: '100%',\n objectFit: 'cover',\n align: 'center',\n },\n render: ({ src, alt, caption, width, height, objectFit, borderRadius, align }) => (\n <figure\n style={{\n margin: 0,\n padding: '16px',\n textAlign: align ?? 'center',\n boxSizing: 'border-box',\n }}\n >\n {src ? (\n <img\n src={src}\n alt={alt ?? ''}\n style={{\n width: width ?? '100%',\n height: height,\n objectFit: objectFit ?? 'cover',\n borderRadius,\n display: 'inline-block',\n maxWidth: '100%',\n }}\n />\n ) : (\n <div\n style={{\n width: width ?? '100%',\n height: height ?? '200px',\n background: '#e0e0e0',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: '#888',\n fontSize: '14px',\n borderRadius,\n }}\n >\n No image selected\n </div>\n )}\n {caption && (\n <figcaption\n style={{ marginTop: '8px', fontSize: '14px', color: '#666' }}\n >\n {caption}\n </figcaption>\n )}\n </figure>\n ),\n};\n","import React from 'react';\nimport type { ComponentConfig } from '@measured/puck';\nimport { FONT_SIZE_FIELD } from '../fields/fontSizeField';\n\nexport interface ButtonProps {\n label: string;\n href?: string;\n variant?: 'primary' | 'secondary' | 'outline';\n size?: 'sm' | 'md' | 'lg';\n fontSize?: string;\n align?: 'left' | 'center' | 'right';\n openInNewTab?: boolean;\n}\n\nconst VARIANT_STYLES: Record<string, React.CSSProperties> = {\n primary: { background: '#1a1a2e', color: '#fff', border: '2px solid #1a1a2e' },\n secondary: { background: '#e94560', color: '#fff', border: '2px solid #e94560' },\n outline: { background: 'transparent', color: '#1a1a2e', border: '2px solid #1a1a2e' },\n};\n\nconst SIZE_STYLES: Record<string, React.CSSProperties> = {\n sm: { padding: '6px 16px', fontSize: '14px' },\n md: { padding: '10px 24px', fontSize: '16px' },\n lg: { padding: '14px 32px', fontSize: '18px' },\n};\n\nexport const Button: ComponentConfig<ButtonProps> = {\n label: 'Button',\n fields: {\n label: { type: 'text', label: 'Button Label' },\n href: { type: 'text', label: 'Link URL' },\n variant: {\n type: 'select',\n label: 'Variant',\n options: [\n { value: 'primary', label: 'Primary' },\n { value: 'secondary', label: 'Secondary' },\n { value: 'outline', label: 'Outline' },\n ],\n },\n size: {\n type: 'select',\n label: 'Size',\n options: [\n { value: 'sm', label: 'Small' },\n { value: 'md', label: 'Medium' },\n { value: 'lg', label: 'Large' },\n ],\n },\n fontSize: FONT_SIZE_FIELD('Font Size Override'),\n align: {\n type: 'select',\n label: 'Alignment',\n options: [\n { value: 'left', label: 'Left' },\n { value: 'center', label: 'Center' },\n { value: 'right', label: 'Right' },\n ],\n },\n openInNewTab: { type: 'radio', label: 'Open in New Tab', options: [\n { value: true, label: 'Yes' },\n { value: false, label: 'No' },\n ]},\n },\n defaultProps: {\n label: 'Click me',\n variant: 'primary',\n size: 'md',\n align: 'left',\n openInNewTab: false,\n },\n render: ({ label, href, variant = 'primary', size = 'md', fontSize, align = 'left', openInNewTab }) => (\n <div style={{ padding: '12px 16px', textAlign: align, boxSizing: 'border-box' }}>\n <a\n href={href ?? '#'}\n target={openInNewTab ? '_blank' : undefined}\n rel={openInNewTab ? 'noopener noreferrer' : undefined}\n style={{\n display: 'inline-block',\n borderRadius: '4px',\n textDecoration: 'none',\n fontWeight: 600,\n cursor: 'pointer',\n ...VARIANT_STYLES[variant],\n ...SIZE_STYLES[size],\n ...(fontSize ? { fontSize } : {}),\n }}\n >\n {label}\n </a>\n </div>\n ),\n};\n","import React from 'react';\nimport type { ComponentConfig } from '@measured/puck';\nimport { RichTextField } from '../fields/RichTextField';\nimport { sanitizeHtml } from '../utils/sanitizeHtml';\nimport { FONT_SIZE_FIELD } from '../fields/fontSizeField';\n\nexport interface CardProps {\n title: string;\n titleFontSize?: string;\n body?: string;\n imageUrl?: string;\n ctaText?: string;\n ctaUrl?: string;\n shadow?: boolean;\n borderRadius?: string;\n}\n\nexport const Card: ComponentConfig<CardProps> = {\n label: 'Card',\n fields: {\n title: { type: 'text', label: 'Title' },\n titleFontSize: FONT_SIZE_FIELD('Title Font Size'),\n body: {\n type: 'custom',\n label: 'Body Text',\n render: ({ value, onChange }) => (\n <RichTextField value={value as string} onChange={onChange} />\n ),\n },\n imageUrl: { type: 'text', label: 'Image URL' },\n ctaText: { type: 'text', label: 'CTA Text' },\n ctaUrl: { type: 'text', label: 'CTA URL' },\n shadow: {\n type: 'radio',\n label: 'Drop Shadow',\n options: [\n { value: true, label: 'Yes' },\n { value: false, label: 'No' },\n ],\n },\n borderRadius: { type: 'text', label: 'Border Radius (CSS)' },\n },\n defaultProps: {\n title: 'Card Title',\n body: 'Card description goes here.',\n shadow: true,\n borderRadius: '8px',\n },\n render: ({ title, titleFontSize, body, imageUrl, ctaText, ctaUrl, shadow, borderRadius }) => (\n <div\n style={{\n border: '1px solid #e0e0e0',\n borderRadius: borderRadius ?? '8px',\n overflow: 'hidden',\n boxShadow: shadow ? '0 2px 8px rgba(0,0,0,0.12)' : undefined,\n background: '#fff',\n margin: '8px',\n boxSizing: 'border-box',\n }}\n >\n {imageUrl && (\n <img\n src={imageUrl}\n alt={title}\n style={{ width: '100%', height: '200px', objectFit: 'cover', display: 'block' }}\n />\n )}\n <div style={{ padding: '16px' }}>\n <h3 style={{ margin: '0 0 8px', fontSize: titleFontSize || '1.1rem' }}>{title}</h3>\n {body && (\n <div\n style={{ margin: '0 0 16px', color: '#555', fontSize: '14px' }}\n dangerouslySetInnerHTML={{ __html: sanitizeHtml(body) }}\n />\n )}\n {ctaText && ctaUrl && (\n <a\n href={ctaUrl}\n style={{\n color: '#e94560',\n fontWeight: 600,\n textDecoration: 'none',\n fontSize: '14px',\n }}\n >\n {ctaText} →\n </a>\n )}\n </div>\n </div>\n ),\n};\n","import React from 'react';\nimport type { ComponentConfig } from '@measured/puck';\n\nexport interface SpacerProps {\n height?: string;\n showLine?: boolean;\n lineColor?: string;\n}\n\nexport const Spacer: ComponentConfig<SpacerProps> = {\n label: 'Spacer',\n fields: {\n height: { type: 'text', label: 'Height (CSS, e.g. 48px)' },\n showLine: {\n type: 'radio',\n label: 'Show Divider Line',\n options: [\n { value: true, label: 'Yes' },\n { value: false, label: 'No' },\n ],\n },\n lineColor: { type: 'text', label: 'Line Color (CSS color)' },\n },\n defaultProps: {\n height: '48px',\n showLine: false,\n lineColor: '#e0e0e0',\n },\n render: ({ height = '48px', showLine = false, lineColor = '#e0e0e0' }) => (\n <div\n style={{\n height,\n display: 'flex',\n alignItems: 'center',\n padding: '0 16px',\n boxSizing: 'border-box',\n }}\n >\n {showLine && (\n <hr style={{ width: '100%', border: 'none', borderTop: `1px solid ${lineColor}` }} />\n )}\n </div>\n ),\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { useDatasource } from '@commercetools-demo/puck-api';\nimport { DatasourceField, type DatasourceValue } from '../fields/DatasourceField';\nimport { richTextField } from '../fields/RichTextField';\nimport {\n productLinkDefaults,\n productLinkFields,\n resolveProductLink,\n type ProductLinkProps,\n} from './cms/shared';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface ProductTeaserProps extends ProductLinkProps {\n datasource: DatasourceValue;\n richText: string;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\ninterface ProductProjection {\n name?: Record<string, string>;\n masterVariant?: {\n images?: Array<{ url: string }>;\n prices?: Array<{\n value: { centAmount: number; currencyCode: string; fractionDigits: number };\n }>;\n };\n}\n\nconst getLocalizedName = (name?: Record<string, string>): string => {\n if (!name) return '';\n return name['en'] ?? name['en-US'] ?? Object.values(name)[0] ?? '';\n};\n\nconst formatPrice = (\n centAmount: number,\n currencyCode: string,\n fractionDigits: number\n): string => {\n const amount = centAmount / Math.pow(10, fractionDigits);\n return `${currencyCode} ${amount.toFixed(fractionDigits)}`;\n};\n\n// ---------------------------------------------------------------------------\n// Render — a proper React component so hooks work\n// ---------------------------------------------------------------------------\n\nconst ProductTeaserRender: React.FC<ProductTeaserProps> = ({\n datasource,\n richText,\n linkWith,\n baseUrl,\n}) => {\n // Skip the hook fetch when the server has already pre-resolved the data.\n const hasPreResolved = datasource?.resolvedData != null;\n const { data: fetchedData, loading, error } = useDatasource(\n hasPreResolved ? undefined : datasource?.type,\n hasPreResolved ? [] : (datasource?.skus ?? [])\n );\n\n const data = hasPreResolved ? datasource.resolvedData : fetchedData;\n\n // For products-by-sku the service returns an array; for product-by-sku a single object.\n const product: ProductProjection | null = data\n ? Array.isArray(data)\n ? (data[0] as ProductProjection) ?? null\n : (data as ProductProjection)\n : null;\n\n const imageUrl = product?.masterVariant?.images?.[0]?.url;\n const priceValue = product?.masterVariant?.prices?.[0]?.value;\n const productName = getLocalizedName(product?.name);\n const href = product ? resolveProductLink(product, linkWith, baseUrl) : undefined;\n\n return (\n <div\n style={{\n display: 'flex',\n gap: '24px',\n padding: '16px',\n alignItems: 'flex-start',\n fontFamily: 'inherit',\n }}\n >\n {/* Left: product image */}\n <div style={{ flexShrink: 0, width: '200px' }}>\n {loading ? (\n <div\n style={{\n width: '200px',\n height: '200px',\n background: '#f3f4f6',\n borderRadius: '8px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: '#9ca3af',\n fontSize: '13px',\n }}\n >\n Loading…\n </div>\n ) : imageUrl ? (\n <a href={href} style={{ display: 'block' }}>\n <img\n src={imageUrl}\n alt={productName}\n style={{\n width: '200px',\n height: '200px',\n objectFit: 'cover',\n borderRadius: '8px',\n display: 'block',\n }}\n />\n </a>\n ) : (\n <div\n style={{\n width: '200px',\n height: '200px',\n background: '#f3f4f6',\n borderRadius: '8px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: '#9ca3af',\n fontSize: '13px',\n }}\n >\n {error ? 'Error loading product' : 'No product selected'}\n </div>\n )}\n </div>\n\n {/* Right: rich text + price stacked */}\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n flex: 1,\n minWidth: 0,\n }}\n >\n {richText ? (\n <div dangerouslySetInnerHTML={{ __html: richText }} />\n ) : (\n <div style={{ color: '#9ca3af', fontSize: '13px' }}>\n No description\n </div>\n )}\n\n {priceValue && (\n <div\n style={{\n fontSize: '20px',\n fontWeight: 700,\n color: '#111827',\n }}\n >\n {formatPrice(\n priceValue.centAmount,\n priceValue.currencyCode,\n priceValue.fractionDigits\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Puck component config\n// ---------------------------------------------------------------------------\n\nexport const ProductTeaser: ComponentConfig<ProductTeaserProps> = {\n label: 'Product Teaser',\n fields: {\n datasource: {\n type: 'custom',\n label: 'Product Datasource',\n render: ({ value, onChange }) => (\n <DatasourceField value={value} onChange={onChange} />\n ),\n },\n richText: richTextField('Rich Text'),\n ...productLinkFields,\n },\n defaultProps: {\n datasource: { type: 'product-by-sku', skus: [''] },\n richText: '',\n ...productLinkDefaults,\n },\n render: (props) => <ProductTeaserRender {...props} />,\n};\n","import React, { useState } from 'react';\nimport { Button, FormField, Icon, Select, Stack, Text, TextInput } from '@commercetools/nimbus';\nimport { Close } from '@commercetools/nimbus-icons';\nimport { useProductSearch } from '@commercetools-demo/puck-api';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type DatasourceType = 'product-by-sku' | 'products-by-sku';\n\nexport interface DatasourceValue {\n type: DatasourceType;\n skus: string[];\n /** Pre-resolved by the server on published/preview endpoints — use directly in render. */\n resolvedData?: unknown;\n}\n\nexport interface DatasourceFieldProps {\n value: DatasourceValue | undefined;\n onChange: (value: DatasourceValue) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nconst TYPE_OPTIONS = [\n { value: 'product-by-sku', label: 'Product by SKU' },\n { value: 'products-by-sku', label: 'Products by SKU' },\n];\n\nconst EMPTY_VALUE: DatasourceValue = { type: 'product-by-sku', skus: [''] };\n\n// ---------------------------------------------------------------------------\n// ProductSearchPicker — typeahead search for product selection (task #4)\n// ---------------------------------------------------------------------------\n\ninterface ProductSearchPickerProps {\n /** SKUs already selected, so we can mark them in the results. */\n selectedSkus: string[];\n onSelect: (sku: string) => void;\n}\n\nconst ProductSearchPicker: React.FC<ProductSearchPickerProps> = ({\n selectedSkus,\n onSelect,\n}) => {\n const [query, setQuery] = useState('');\n const { results, loading, error } = useProductSearch(query);\n\n return (\n <Stack direction=\"column\" gap=\"100\">\n <FormField.Root>\n <FormField.Label>Search products</FormField.Label>\n <FormField.Input>\n <TextInput\n placeholder=\"Search by product name…\"\n value={query}\n onChange={(value) => setQuery(value)}\n />\n </FormField.Input>\n </FormField.Root>\n\n {query.trim() !== '' && (\n <div\n role=\"listbox\"\n aria-label=\"Product search results\"\n aria-busy={loading}\n style={{\n maxHeight: 220,\n overflowY: 'auto',\n border: '1px solid var(--color-neutral-90, #e0e0e0)',\n borderRadius: 'var(--border-radius-4, 4px)',\n background: 'var(--color-surface, #fff)',\n }}\n >\n {loading && (\n <div style={{ padding: 8, fontSize: 13, color: 'var(--color-neutral-40, #666)' }}>\n Searching…\n </div>\n )}\n {error && (\n <div style={{ padding: 8, fontSize: 13, color: 'var(--color-error, #c0392b)' }}>\n {error}\n </div>\n )}\n {!loading && !error && results.length === 0 && (\n <div style={{ padding: 8, fontSize: 13, color: 'var(--color-neutral-40, #666)' }}>\n No products found\n </div>\n )}\n {results.map((product) => {\n const sku = product.sku;\n const alreadySelected = !!sku && selectedSkus.includes(sku);\n return (\n <button\n key={product.id}\n type=\"button\"\n role=\"option\"\n aria-selected={alreadySelected}\n disabled={!sku}\n onClick={() => sku && onSelect(sku)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n width: '100%',\n padding: 8,\n border: 'none',\n borderBottom: '1px solid var(--color-neutral-95, #f4f4f4)',\n background: alreadySelected\n ? 'var(--color-primary-95, #e6eefb)'\n : 'transparent',\n cursor: sku ? 'pointer' : 'not-allowed',\n textAlign: 'left',\n }}\n >\n {product.image ? (\n <img\n src={product.image}\n alt=\"\"\n style={{ width: 32, height: 32, objectFit: 'cover', borderRadius: 4, flexShrink: 0 }}\n />\n ) : (\n <span\n aria-hidden=\"true\"\n style={{ width: 32, height: 32, background: 'var(--color-neutral-95, #f4f4f4)', borderRadius: 4, flexShrink: 0 }}\n />\n )}\n <span style={{ flex: 1, minWidth: 0 }}>\n <span style={{ display: 'block', fontSize: 13, fontWeight: 600, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n {product.name ?? '(unnamed product)'}\n </span>\n <span style={{ display: 'block', fontSize: 11, color: 'var(--color-neutral-40, #666)' }}>\n {sku ? `SKU: ${sku}` : 'No SKU on master variant'}\n </span>\n </span>\n {alreadySelected && (\n <span style={{ fontSize: 11, color: 'var(--color-primary, #1a1a2e)' }}>Added</span>\n )}\n </button>\n );\n })}\n </div>\n )}\n </Stack>\n );\n};\n\n// ---------------------------------------------------------------------------\n// DatasourceField — custom Puck field component\n// ---------------------------------------------------------------------------\n\nexport const DatasourceField: React.FC<DatasourceFieldProps> = ({\n value,\n onChange,\n}) => {\n const current: DatasourceValue = value ?? EMPTY_VALUE;\n const selectedSkus = current.skus.filter(Boolean);\n\n const removeSkuValue = (sku: string) => {\n const updated = current.skus.filter((s) => s !== sku);\n onChange({ ...current, skus: updated.length > 0 ? updated : [''] });\n };\n\n // Add a SKU chosen from the product-search picker.\n const selectProduct = (sku: string) => {\n if (current.type === 'product-by-sku') {\n onChange({ ...current, skus: [sku] });\n return;\n }\n const existing = current.skus.filter(Boolean);\n if (existing.includes(sku)) return;\n onChange({ ...current, skus: [...existing, sku] });\n };\n\n return (\n <Stack direction=\"column\" gap=\"200\">\n <FormField.Root>\n <FormField.Label>Datasource type</FormField.Label>\n <FormField.Input>\n <Select.Root\n selectedKey={current.type}\n onSelectionChange={(key) => {\n const newType = key as DatasourceType;\n onChange({\n type: newType,\n skus: newType === 'product-by-sku' ? [current.skus[0] ?? ''] : current.skus,\n });\n }}\n >\n <Select.Options>\n {TYPE_OPTIONS.map((o) => (\n <Select.Option key={o.value} id={o.value}>{o.label}</Select.Option>\n ))}\n </Select.Options>\n </Select.Root>\n </FormField.Input>\n </FormField.Root>\n\n <ProductSearchPicker\n selectedSkus={selectedSkus}\n onSelect={selectProduct}\n />\n\n <Stack direction=\"column\" gap=\"100\">\n <Text fontSize=\"sm\" fontWeight=\"700\">\n {current.type === 'product-by-sku' ? 'Selected product' : 'Selected products'}\n </Text>\n {selectedSkus.length === 0 ? (\n <Text fontSize=\"sm\" color=\"neutral.11\">\n No product selected — search above to add one.\n </Text>\n ) : (\n <Stack direction=\"column\" gap=\"100\">\n {selectedSkus.map((sku) => (\n <Stack key={sku} direction=\"row\" gap=\"100\" alignItems=\"center\" justifyContent=\"space-between\">\n <span\n style={{\n flex: 1,\n minWidth: 0,\n fontSize: 13,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n SKU: {sku}\n </span>\n <Button\n variant=\"ghost\"\n colorPalette=\"critical\"\n size=\"xs\"\n onPress={() => removeSkuValue(sku)}\n >\n <Icon as={Close} /> Remove\n </Button>\n </Stack>\n ))}\n </Stack>\n )}\n </Stack>\n </Stack>\n );\n};\n","// Shared helpers used across CMS Puck components\nimport type { Fields } from '@measured/puck';\n\nexport const getLocalizedText = (obj?: Record<string, string> | null): string => {\n if (!obj) return '';\n return obj['en-US'] ?? obj['en'] ?? Object.values(obj)[0] ?? '';\n};\n\nexport const formatPrice = (\n centAmount: number,\n currencyCode = 'USD',\n fractionDigits = 2\n): string => {\n const amount = centAmount / Math.pow(10, fractionDigits);\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: currencyCode,\n }).format(amount);\n};\n\nexport const getFirstPrice = (\n product: unknown\n): { centAmount: number; currencyCode: string; fractionDigits: number } | null => {\n const p = product as any;\n return p?.masterVariant?.prices?.[0]?.value ?? null;\n};\n\nexport const getProductImage = (product: unknown): string | null => {\n const p = product as any;\n return p?.masterVariant?.images?.[0]?.url ?? null;\n};\n\nexport const getProductName = (product: unknown): string => {\n const p = product as any;\n return getLocalizedText(p?.name) || 'Product';\n};\n\nexport const getProductSlug = (product: unknown): string => {\n const p = product as any;\n return getLocalizedText(p?.slug) || p?.id || '#';\n};\n\nexport const getProductSku = (product: unknown): string => {\n const p = product as any;\n return p?.masterVariant?.sku ?? '';\n};\n\n/** How a product link is built — from the product slug or its SKU. */\nexport type ProductLinkWith = 'slug' | 'sku';\n\n/**\n * Build a storefront link to a product.\n *\n * Joins a sanitised base URL with the product's slug or SKU. The base is\n * trimmed, stripped of leading/trailing slashes and collapsed of any double\n * slashes, then re-prefixed with a single \"/\", e.g.\n * resolveProductLink(p, 'sku', '/product/') → '/product/123' (sku 123)\n * resolveProductLink(p, 'slug', '/slug/p/') → '/slug/p/test' (slug \"test\")\n */\nexport const resolveProductLink = (\n product: unknown,\n linkWith: ProductLinkWith = 'slug',\n baseUrl = '/p'\n): string => {\n const p = product as any;\n const slug = getLocalizedText(p?.slug);\n const sku = getProductSku(product);\n const id = (p?.id as string) ?? '';\n // Chosen identifier, falling back to the product id / the other identifier.\n const identifier = (linkWith === 'sku' ? sku : slug) || id || slug || sku;\n\n const base =\n '/' +\n String(baseUrl ?? '')\n .trim()\n .replace(/^\\/+|\\/+$/g, '')\n .replace(/\\/{2,}/g, '/');\n const cleanId = String(identifier ?? '')\n .trim()\n .replace(/^\\/+|\\/+$/g, '');\n\n return (cleanId ? `${base}/${cleanId}` : base).replace(/\\/{2,}/g, '/');\n};\n\n/** Props every product-linking component shares. */\nexport interface ProductLinkProps {\n linkWith: ProductLinkWith;\n baseUrl: string;\n}\n\n/** Puck field definitions for the shared link props — spread into a component's `fields`. */\nexport const productLinkFields: Fields<ProductLinkProps> = {\n linkWith: {\n type: 'radio',\n label: 'Link products by',\n options: [\n { value: 'slug', label: 'Slug' },\n { value: 'sku', label: 'SKU' },\n ],\n },\n baseUrl: {\n type: 'text',\n label: 'Link base URL',\n },\n};\n\n/** Default values for the shared link props — spread into a component's defaultProps. */\nexport const productLinkDefaults: ProductLinkProps = {\n linkWith: 'slug',\n baseUrl: '/p',\n};\n\n// Colour palette shared across components\nexport const colors = {\n primary: '#2c5530',\n primaryHover: '#1e3a21',\n lightBg: '#f0f7f0',\n lightBorder: '#c8e6c8',\n text: '#333',\n textMuted: '#666',\n border: '#eee',\n bg: '#f5f5f5',\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { ImagePickerField } from '../../fields/ImagePickerField';\n\nexport interface HeroBannerProps {\n title: string;\n subtitle: string;\n image: string;\n}\n\nexport const HeroBanner: ComponentConfig<HeroBannerProps> = {\n label: 'Hero Banner',\n fields: {\n title: { type: 'text', label: 'Title' },\n subtitle: { type: 'text', label: 'Subtitle' },\n image: {\n type: 'custom',\n label: 'Image',\n render: ({ value, onChange }) => (\n <ImagePickerField value={value ?? ''} onChange={onChange} />\n ),\n },\n },\n defaultProps: { title: '', subtitle: '', image: '' },\n render: ({ title, subtitle, image }) => (\n <div\n style={{\n position: 'relative',\n width: '100%',\n paddingBottom: '56.25%',\n overflow: 'hidden',\n backgroundColor: '#f0f0f0',\n }}\n >\n {image && (\n <img\n src={image}\n alt={title || 'Hero banner'}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n objectPosition: 'center',\n }}\n />\n )}\n {/* dark overlay */}\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n background: 'rgba(0,0,0,0.3)',\n zIndex: 1,\n }}\n />\n <div\n style={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%,-50%)',\n textAlign: 'center',\n color: 'white',\n zIndex: 2,\n padding: '2rem',\n maxWidth: '90%',\n }}\n >\n {title && (\n <h1\n style={{\n fontSize: '3rem',\n fontWeight: 'bold',\n margin: '0 0 1rem 0',\n textShadow: '2px 2px 4px rgba(0,0,0,0.7)',\n }}\n >\n {title}\n </h1>\n )}\n {subtitle && (\n <p\n style={{\n fontSize: '1.25rem',\n margin: 0,\n textShadow: '1px 1px 2px rgba(0,0,0,0.7)',\n opacity: 0.95,\n }}\n >\n {subtitle}\n </p>\n )}\n </div>\n </div>\n ),\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { RichTextField } from '../../fields/RichTextField';\nimport { sanitizeHtml } from '../../utils/sanitizeHtml';\n\nexport interface TextBlockProps {\n content: string;\n}\n\nexport const TextBlock: ComponentConfig<TextBlockProps> = {\n label: 'Text Block',\n fields: {\n content: {\n type: 'custom',\n label: 'Content',\n render: ({ value, onChange }) => (\n <RichTextField value={value as string} onChange={onChange} />\n ),\n },\n },\n defaultProps: { content: '' },\n render: ({ content }) => {\n if (!content) return <></>;\n return (\n <div\n dangerouslySetInnerHTML={{ __html: sanitizeHtml(content) }}\n style={{\n maxWidth: '720px',\n margin: '0 auto',\n padding: '1.5rem 1rem',\n lineHeight: 1.6,\n color: '#333',\n }}\n />\n );\n },\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { ImagePickerField } from '../../fields/ImagePickerField';\n\nexport interface CategoryGridProps {\n category1Image: string; category1Label: string; category1Link: string;\n category2Image: string; category2Label: string; category2Link: string;\n category3Image: string; category3Label: string; category3Link: string;\n category4Image: string; category4Label: string; category4Link: string;\n}\n\nconst imgField = (label: string) => ({\n type: 'custom' as const,\n label,\n render: ({ value, onChange }: { value: string; onChange: (v: string) => void }) => (\n <ImagePickerField value={value ?? ''} onChange={onChange} />\n ),\n});\n\nexport const CategoryGrid: ComponentConfig<CategoryGridProps> = {\n label: 'Category Grid',\n fields: {\n category1Image: imgField('Category 1 Image'),\n category1Label: { type: 'text', label: 'Category 1 Label' },\n category1Link: { type: 'text', label: 'Category 1 Link' },\n category2Image: imgField('Category 2 Image'),\n category2Label: { type: 'text', label: 'Category 2 Label' },\n category2Link: { type: 'text', label: 'Category 2 Link' },\n category3Image: imgField('Category 3 Image'),\n category3Label: { type: 'text', label: 'Category 3 Label' },\n category3Link: { type: 'text', label: 'Category 3 Link' },\n category4Image: imgField('Category 4 Image'),\n category4Label: { type: 'text', label: 'Category 4 Label' },\n category4Link: { type: 'text', label: 'Category 4 Link' },\n },\n defaultProps: {\n category1Image: '', category1Label: '', category1Link: '',\n category2Image: '', category2Label: '', category2Link: '',\n category3Image: '', category3Label: '', category3Link: '',\n category4Image: '', category4Label: '', category4Link: '',\n },\n render: (props) => {\n const categories = [\n [props.category1Image, props.category1Label, props.category1Link],\n [props.category2Image, props.category2Label, props.category2Link],\n [props.category3Image, props.category3Label, props.category3Link],\n [props.category4Image, props.category4Label, props.category4Link],\n ].filter(([, label, link]) => label && link) as [string, string, string][];\n\n if (categories.length === 0) return (\n <div style={{ padding: '2rem', textAlign: 'center', color: '#999', fontSize: '13px' }}>\n No categories configured\n </div>\n );\n\n return (\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(200px, 1fr))',\n gap: '1.5rem',\n padding: '2rem 1rem',\n }}\n >\n {categories.map(([image, label, link], i) => (\n <a\n key={i}\n href={link}\n style={{\n display: 'block',\n textAlign: 'center',\n textDecoration: 'none',\n color: 'inherit',\n borderRadius: '8px',\n overflow: 'hidden',\n boxShadow: '0 2px 8px rgba(0,0,0,0.1)',\n }}\n >\n <div style={{ aspectRatio: '1', background: '#f0f0f0', overflow: 'hidden' }}>\n {image && (\n <img\n src={image}\n alt={label}\n style={{ width: '100%', height: '100%', objectFit: 'cover' }}\n />\n )}\n </div>\n <span\n style={{\n display: 'block',\n padding: '1rem',\n fontWeight: 600,\n color: '#333',\n }}\n >\n {label}\n </span>\n </a>\n ))}\n </div>\n );\n },\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { ImagePickerField } from '../../fields/ImagePickerField';\n\nexport interface CategoryHeroProps {\n title: string;\n subtitle: string;\n image: string;\n ctaText: string;\n ctaLink: string;\n}\n\nexport const CategoryHero: ComponentConfig<CategoryHeroProps> = {\n label: 'Category Hero',\n fields: {\n title: { type: 'text', label: 'Title' },\n subtitle: { type: 'text', label: 'Subtitle' },\n image: {\n type: 'custom', label: 'Background Image',\n render: ({ value, onChange }) => <ImagePickerField value={value ?? ''} onChange={onChange} />,\n },\n ctaText: { type: 'text', label: 'CTA Text' },\n ctaLink: { type: 'text', label: 'CTA Link' },\n },\n defaultProps: { title: '', subtitle: '', image: '', ctaText: '', ctaLink: '' },\n render: ({ title, subtitle, image, ctaText, ctaLink }) => (\n <div\n style={{\n position: 'relative',\n minHeight: '220px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: '#f0f0f0',\n borderRadius: '8px',\n overflow: 'hidden',\n margin: '1rem 0',\n }}\n >\n {image && (\n <img\n src={image}\n alt={title || 'Category'}\n style={{\n position: 'absolute',\n top: 0, left: 0,\n width: '100%', height: '100%',\n objectFit: 'cover',\n opacity: 0.85,\n }}\n />\n )}\n <div style={{ position: 'absolute', inset: 0, background: 'rgba(0,0,0,0.25)' }} />\n <div\n style={{\n position: 'relative',\n zIndex: 1,\n textAlign: 'center',\n padding: '2rem',\n color: 'white',\n textShadow: '0 1px 3px rgba(0,0,0,0.5)',\n }}\n >\n {title && <h1 style={{ fontSize: '2.5rem', marginBottom: '0.5rem' }}>{title}</h1>}\n {subtitle && <p style={{ fontSize: '1.1rem', marginBottom: '1rem' }}>{subtitle}</p>}\n {ctaText && ctaLink && (\n <a\n href={ctaLink}\n style={{\n display: 'inline-block',\n background: 'white',\n color: '#2c5530',\n padding: '0.75rem 2rem',\n borderRadius: '4px',\n textDecoration: 'none',\n fontWeight: 600,\n }}\n >\n {ctaText}\n </a>\n )}\n </div>\n </div>\n ),\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\n\nexport interface CheckoutPromoBannerProps {\n title: string;\n message: string;\n ctaText: string;\n ctaLink: string;\n}\n\nexport const CheckoutPromoBanner: ComponentConfig<CheckoutPromoBannerProps> = {\n label: 'Checkout Promo Banner',\n fields: {\n title: { type: 'text', label: 'Title' },\n message: { type: 'text', label: 'Message' },\n ctaText: { type: 'text', label: 'CTA Text' },\n ctaLink: { type: 'text', label: 'CTA Link' },\n },\n defaultProps: { title: '', message: '', ctaText: '', ctaLink: '' },\n render: ({ title, message, ctaText, ctaLink }) => {\n if (!title && !message && !ctaText) return <></>;\n return (\n <div\n style={{\n padding: '1rem 1.25rem',\n background: '#f0f7f0',\n border: '1px solid #c8e6c8',\n borderRadius: '4px',\n marginBottom: '1rem',\n fontSize: '0.95rem',\n }}\n >\n {title && (\n <div style={{ fontWeight: 600, color: '#2c5530', marginBottom: '0.25rem' }}>\n {title}\n </div>\n )}\n {message && <p style={{ margin: '0 0 0.5rem 0', color: '#333' }}>{message}</p>}\n {ctaText && ctaLink && (\n <a href={ctaLink} style={{ color: '#2c5530', fontWeight: 600, textDecoration: 'none' }}>\n {ctaText}\n </a>\n )}\n </div>\n );\n },\n};\n","import React, { useEffect, useState } from 'react';\nimport { type ComponentConfig } from '@measured/puck';\n\nexport interface CountdownBannerProps {\n headline: string;\n subline: string;\n endDate: string;\n ctaText: string;\n ctaLink: string;\n background: string;\n}\n\nconst calcTimeLeft = (endDate: string): string => {\n if (!endDate) return '';\n const end = new Date(endDate);\n const now = new Date();\n if (end <= now) return 'Offer ended';\n const diff = end.getTime() - now.getTime();\n const d = Math.floor(diff / 86_400_000);\n const h = Math.floor((diff % 86_400_000) / 3_600_000);\n const m = Math.floor((diff % 3_600_000) / 60_000);\n const s = Math.floor((diff % 60_000) / 1_000);\n if (d > 0) return `${d}d ${h}h ${m}m left`;\n if (h > 0) return `${h}h ${m}m ${s}s left`;\n return `${m}m ${s}s left`;\n};\n\nconst CountdownRender: React.FC<CountdownBannerProps> = ({\n headline, subline, endDate, ctaText, ctaLink, background,\n}) => {\n const [timeLeft, setTimeLeft] = useState(() => calcTimeLeft(endDate));\n useEffect(() => {\n if (!endDate) return;\n const id = setInterval(() => setTimeLeft(calcTimeLeft(endDate)), 1000);\n return () => clearInterval(id);\n }, [endDate]);\n\n return (\n <div\n style={{\n background: background || '#2c5530',\n color: 'white',\n padding: '2rem 1rem',\n textAlign: 'center',\n borderRadius: '4px',\n margin: '1rem 0',\n }}\n >\n {headline && <h2 style={{ fontSize: '1.75rem', marginBottom: '0.5rem' }}>{headline}</h2>}\n {subline && <p style={{ fontSize: '1rem', opacity: 0.9, marginBottom: '1rem' }}>{subline}</p>}\n {timeLeft && (\n <p style={{ fontSize: '1.25rem', fontWeight: 600, margin: '0 0 1rem 0', letterSpacing: '0.05em' }}>\n {timeLeft}\n </p>\n )}\n {ctaText && ctaLink && (\n <a\n href={ctaLink}\n style={{\n display: 'inline-block',\n background: 'white',\n color: '#2c5530',\n padding: '0.75rem 2rem',\n borderRadius: '4px',\n textDecoration: 'none',\n fontWeight: 600,\n }}\n >\n {ctaText}\n </a>\n )}\n </div>\n );\n};\n\nexport const CountdownBanner: ComponentConfig<CountdownBannerProps> = {\n label: 'Countdown Banner',\n fields: {\n headline: { type: 'text', label: 'Headline' },\n subline: { type: 'text', label: 'Subline' },\n endDate: { type: 'text', label: 'End Date (ISO, e.g. 2025-12-31T23:59:59)' },\n ctaText: { type: 'text', label: 'CTA Text' },\n ctaLink: { type: 'text', label: 'CTA Link' },\n background: { type: 'text', label: 'Background Color' },\n },\n defaultProps: {\n headline: '', subline: '', endDate: '', ctaText: '', ctaLink: '', background: '#2c5530',\n },\n render: (props) => <CountdownRender {...props} />,\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { useDatasource } from '@commercetools-demo/puck-api';\nimport { DatasourceField, type DatasourceValue } from '../../fields/DatasourceField';\nimport {\n formatPrice,\n getFirstPrice,\n getLocalizedText,\n getProductImage,\n productLinkDefaults,\n productLinkFields,\n resolveProductLink,\n type ProductLinkProps,\n} from './shared';\n\nexport interface CrossSellBlockProps extends ProductLinkProps {\n title: string;\n products: DatasourceValue;\n ctaText: string;\n}\n\nconst CrossSellRender: React.FC<CrossSellBlockProps> = ({ title, products, ctaText, linkWith, baseUrl }) => {\n const hasPreResolved = products?.resolvedData != null;\n const { data: fetchedData, loading } = useDatasource(\n hasPreResolved ? undefined : products?.type,\n hasPreResolved ? [] : (products?.skus ?? [])\n );\n const items: unknown[] = hasPreResolved\n ? (Array.isArray(products.resolvedData) ? products.resolvedData : [])\n : (Array.isArray(fetchedData) ? fetchedData : []);\n\n if (!loading && items.length === 0) return null;\n\n return (\n <div style={{ padding: '2rem 0', borderTop: '1px solid #eee' }}>\n {title && <h3 style={{ fontSize: '1.5rem', marginBottom: '1.5rem', color: '#333' }}>{title || 'Frequently bought together'}</h3>}\n {loading && <div style={{ color: '#999', padding: '1rem' }}>Loading…</div>}\n {items.length > 0 && (\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(180px, 1fr))',\n gap: '1rem',\n }}\n >\n {items.map((product, i) => {\n const name = getLocalizedText((product as any)?.name);\n const imageUrl = getProductImage(product);\n const priceVal = getFirstPrice(product);\n return (\n <a\n key={(product as any)?.id ?? i}\n href={resolveProductLink(product, linkWith, baseUrl)}\n style={{\n textAlign: 'center',\n textDecoration: 'none',\n color: 'inherit',\n padding: '1rem',\n borderRadius: '8px',\n border: '1px solid #eee',\n }}\n >\n <div style={{ height: '120px', marginBottom: '0.75rem', display: 'flex', alignItems: 'center', justifyContent: 'center', background: '#f9f9f9', borderRadius: '4px' }}>\n {imageUrl\n ? <img src={imageUrl} alt={name} style={{ maxWidth: '100%', maxHeight: '100%', objectFit: 'contain' }} />\n : null\n }\n </div>\n <div style={{ fontWeight: 600, fontSize: '0.95rem', marginBottom: '0.25rem' }}>{name}</div>\n {priceVal && (\n <div style={{ fontSize: '1.1rem', color: '#2c5530', fontWeight: 'bold' }}>\n {formatPrice(priceVal.centAmount, priceVal.currencyCode, priceVal.fractionDigits)}\n </div>\n )}\n </a>\n );\n })}\n </div>\n )}\n {ctaText && (\n <a href=\"#\" style={{ display: 'inline-block', marginTop: '1rem', color: '#2c5530', fontWeight: 600, textDecoration: 'none' }}>\n {ctaText}\n </a>\n )}\n </div>\n );\n};\n\nexport const CrossSellBlock: ComponentConfig<CrossSellBlockProps> = {\n label: 'Cross-Sell Block',\n fields: {\n title: { type: 'text', label: 'Title' },\n products: {\n type: 'custom', label: 'Products',\n render: ({ value, onChange }) => <DatasourceField value={value} onChange={onChange} />,\n },\n ctaText: { type: 'text', label: 'CTA Text' },\n ...productLinkFields,\n },\n defaultProps: {\n title: 'Frequently bought together',\n products: { type: 'products-by-sku', skus: [''] },\n ctaText: '',\n ...productLinkDefaults,\n },\n render: (props) => <CrossSellRender {...props} />,\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\n\nexport interface DeliveryMessageProps {\n message: string;\n threshold: string;\n}\n\nexport const DeliveryMessage: ComponentConfig<DeliveryMessageProps> = {\n label: 'Delivery Message',\n fields: {\n message: { type: 'text', label: 'Message (use $XX for threshold)' },\n threshold: { type: 'text', label: 'Threshold Amount (e.g. 50)' },\n },\n defaultProps: { message: 'Free delivery on orders over $50', threshold: '' },\n render: ({ message, threshold }) => {\n if (!message) return <></>;\n const text = threshold\n ? message.replace(/\\$\\d+/g, `$${threshold}`)\n : message;\n return (\n <div\n style={{\n padding: '0.75rem 1rem',\n background: '#f0f7f0',\n borderRadius: '4px',\n fontSize: '0.95rem',\n color: '#2c5530',\n }}\n >\n {text}\n </div>\n );\n },\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\n\nexport interface DividerProps {\n lineStyle: 'solid' | 'dashed' | 'dotted';\n spacing: string;\n}\n\nexport const Divider: ComponentConfig<DividerProps> = {\n label: 'Divider',\n fields: {\n lineStyle: {\n type: 'select',\n label: 'Line Style',\n options: [\n { value: 'solid', label: 'Solid' },\n { value: 'dashed', label: 'Dashed' },\n { value: 'dotted', label: 'Dotted' },\n ],\n },\n spacing: { type: 'text', label: 'Spacing (px)' },\n },\n defaultProps: { lineStyle: 'solid', spacing: '24' },\n render: ({ lineStyle, spacing }) => {\n const s = parseInt(spacing, 10) || 24;\n return (\n <hr\n style={{\n border: 'none',\n borderTop: `1px ${lineStyle} #ddd`,\n margin: `${s / 2}px 0`,\n }}\n />\n );\n },\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { ImagePickerField } from '../../fields/ImagePickerField';\n\nexport interface EmptyStateProps {\n image: string;\n title: string;\n description: string;\n ctaText: string;\n ctaLink: string;\n}\n\nexport const EmptyState: ComponentConfig<EmptyStateProps> = {\n label: 'Empty State',\n fields: {\n image: {\n type: 'custom', label: 'Image',\n render: ({ value, onChange }) => <ImagePickerField value={value ?? ''} onChange={onChange} />,\n },\n title: { type: 'text', label: 'Title' },\n description: { type: 'text', label: 'Description' },\n ctaText: { type: 'text', label: 'CTA Text' },\n ctaLink: { type: 'text', label: 'CTA Link' },\n },\n defaultProps: { image: '', title: '', description: '', ctaText: '', ctaLink: '' },\n render: ({ image, title, description, ctaText, ctaLink }) => (\n <div style={{ textAlign: 'center', padding: '3rem 1rem' }}>\n {image && (\n <img\n src={image}\n alt={title || 'Empty state'}\n style={{ maxWidth: '200px', height: 'auto', marginBottom: '1.5rem', opacity: 0.8 }}\n />\n )}\n {title && <h2 style={{ fontSize: '1.5rem', color: '#333', marginBottom: '0.5rem' }}>{title}</h2>}\n {description && (\n <p style={{ color: '#666', marginBottom: '1.5rem', maxWidth: '400px', margin: '0 auto 1.5rem' }}>\n {description}\n </p>\n )}\n {ctaText && ctaLink && (\n <a\n href={ctaLink}\n style={{\n display: 'inline-block',\n background: '#2c5530',\n color: 'white',\n padding: '0.75rem 2rem',\n borderRadius: '4px',\n textDecoration: 'none',\n fontWeight: 600,\n }}\n >\n {ctaText}\n </a>\n )}\n </div>\n ),\n};\n","import React, { useState } from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { richTextField } from '../../fields/RichTextField';\n\nexport interface FAQAccordionProps {\n question1: string; answer1: string;\n question2: string; answer2: string;\n question3: string; answer3: string;\n question4: string; answer4: string;\n}\n\nconst FAQRender: React.FC<FAQAccordionProps> = (props) => {\n const items = [\n [props.question1, props.answer1],\n [props.question2, props.answer2],\n [props.question3, props.answer3],\n [props.question4, props.answer4],\n ].filter(([q]) => q) as [string, string][];\n\n const [open, setOpen] = useState<number | null>(null);\n\n if (items.length === 0) return (\n <div style={{ padding: '1rem', color: '#999', fontSize: '13px' }}>No FAQ items configured</div>\n );\n\n return (\n <div style={{ border: '1px solid #eee', borderRadius: '8px', overflow: 'hidden' }}>\n {items.map(([question, answer], i) => (\n <div key={i} style={{ borderBottom: i < items.length - 1 ? '1px solid #eee' : 'none' }}>\n <button\n onClick={() => setOpen(open === i ? null : i)}\n style={{\n width: '100%',\n padding: '1rem 1.25rem',\n textAlign: 'left',\n fontWeight: 600,\n fontSize: '1rem',\n background: '#fafafa',\n border: 'none',\n cursor: 'pointer',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n {question}\n <span style={{ fontSize: '1.2rem', lineHeight: 1 }}>{open === i ? '−' : '+'}</span>\n </button>\n {open === i && answer && (\n <div\n dangerouslySetInnerHTML={{ __html: answer }}\n style={{\n padding: '1rem 1.25rem',\n background: 'white',\n fontSize: '0.95rem',\n lineHeight: 1.5,\n color: '#555',\n }}\n />\n )}\n </div>\n ))}\n </div>\n );\n};\n\nexport const FAQAccordion: ComponentConfig<FAQAccordionProps> = {\n label: 'FAQ Accordion',\n fields: {\n question1: { type: 'text', label: 'Question 1' },\n answer1: richTextField('Answer 1'),\n question2: { type: 'text', label: 'Question 2' },\n answer2: richTextField('Answer 2'),\n question3: { type: 'text', label: 'Question 3' },\n answer3: richTextField('Answer 3'),\n question4: { type: 'text', label: 'Question 4' },\n answer4: richTextField('Answer 4'),\n },\n defaultProps: {\n question1: '', answer1: '',\n question2: '', answer2: '',\n question3: '', answer3: '',\n question4: '', answer4: '',\n },\n render: (props) => <FAQRender {...props} />,\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { richTextField } from '../../fields/RichTextField';\n\nexport interface FooterBlockProps {\n column1: string;\n column2: string;\n column3: string;\n copyright: string;\n}\n\nexport const FooterBlock: ComponentConfig<FooterBlockProps> = {\n label: 'Footer Block',\n fields: {\n column1: richTextField('Column 1'),\n column2: richTextField('Column 2'),\n column3: richTextField('Column 3'),\n copyright: { type: 'text', label: 'Copyright Text' },\n },\n defaultProps: { column1: '', column2: '', column3: '', copyright: '' },\n render: ({ column1, column2, column3, copyright }) => {\n const columns = [column1, column2, column3].filter(Boolean);\n return (\n <footer style={{ background: '#333', color: '#eee', padding: '2rem 1rem', marginTop: '3rem' }}>\n {columns.length > 0 && (\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: `repeat(${columns.length}, 1fr)`,\n gap: '2rem',\n maxWidth: '1200px',\n margin: '0 auto 2rem',\n }}\n >\n {columns.map((html, i) => (\n <div\n key={i}\n dangerouslySetInnerHTML={{ __html: html }}\n style={{ fontSize: '0.9rem', lineHeight: 1.6 }}\n />\n ))}\n </div>\n )}\n {copyright && (\n <p style={{ textAlign: 'center', fontSize: '0.85rem', color: '#999', margin: 0 }}>\n {copyright}\n </p>\n )}\n </footer>\n );\n },\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { ImagePickerField } from '../../fields/ImagePickerField';\n\nexport interface ImageBlockProps {\n image: string;\n caption: string;\n link: string;\n}\n\nexport const ImageBlock: ComponentConfig<ImageBlockProps> = {\n label: 'Image Block',\n fields: {\n image: {\n type: 'custom', label: 'Image',\n render: ({ value, onChange }) => <ImagePickerField value={value ?? ''} onChange={onChange} />,\n },\n caption: { type: 'text', label: 'Caption' },\n link: { type: 'text', label: 'Link URL' },\n },\n defaultProps: { image: '', caption: '', link: '' },\n render: ({ image, caption, link }) => {\n if (!image) return (\n <div style={{ padding: '2rem', textAlign: 'center', color: '#999', background: '#f5f5f5', borderRadius: '4px' }}>\n No image selected\n </div>\n );\n const img = (\n <img\n src={image}\n alt={caption || 'Image'}\n style={{ maxWidth: '100%', height: 'auto', borderRadius: '4px' }}\n />\n );\n return (\n <figure style={{ margin: '1rem 0', textAlign: 'center' }}>\n {link ? <a href={link} style={{ display: 'inline-block' }}>{img}</a> : img}\n {caption && (\n <figcaption style={{ marginTop: '0.5rem', fontSize: '0.9rem', color: '#666' }}>\n {caption}\n </figcaption>\n )}\n </figure>\n );\n },\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\n\nexport interface NewsletterSignupProps {\n title: string;\n subtitle: string;\n ctaText: string;\n placeholder: string;\n}\n\nexport const NewsletterSignup: ComponentConfig<NewsletterSignupProps> = {\n label: 'Newsletter Signup',\n fields: {\n title: { type: 'text', label: 'Title' },\n subtitle: { type: 'text', label: 'Subtitle' },\n ctaText: { type: 'text', label: 'Button Text' },\n placeholder: { type: 'text', label: 'Input Placeholder' },\n },\n defaultProps: { title: '', subtitle: '', ctaText: 'Subscribe', placeholder: 'Enter your email' },\n render: ({ title, subtitle, ctaText, placeholder }) => (\n <div\n style={{\n textAlign: 'center',\n padding: '2rem 1rem',\n background: '#f5f5f5',\n borderRadius: '8px',\n maxWidth: '480px',\n margin: '0 auto',\n }}\n >\n {title && <h3 style={{ fontSize: '1.5rem', marginBottom: '0.5rem', color: '#333' }}>{title}</h3>}\n {subtitle && <p style={{ fontSize: '0.95rem', color: '#666', marginBottom: '1.5rem' }}>{subtitle}</p>}\n <form\n onSubmit={(e) => e.preventDefault()}\n style={{ display: 'flex', gap: '0.5rem', flexWrap: 'wrap', justifyContent: 'center' }}\n >\n <input\n type=\"email\"\n placeholder={placeholder}\n aria-label=\"Email\"\n style={{\n padding: '0.75rem 1rem',\n border: '1px solid #ddd',\n borderRadius: '4px',\n fontSize: '1rem',\n minWidth: '200px',\n }}\n />\n <button\n type=\"submit\"\n style={{\n padding: '0.75rem 1.5rem',\n background: '#2c5530',\n color: 'white',\n border: 'none',\n borderRadius: '4px',\n fontWeight: 600,\n cursor: 'pointer',\n }}\n >\n {ctaText || 'Subscribe'}\n </button>\n </form>\n </div>\n ),\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { useDatasource } from '@commercetools-demo/puck-api';\nimport { DatasourceField, type DatasourceValue } from '../../fields/DatasourceField';\nimport { richTextField } from '../../fields/RichTextField';\nimport {\n formatPrice,\n getFirstPrice,\n getLocalizedText,\n productLinkDefaults,\n productLinkFields,\n resolveProductLink,\n type ProductLinkProps,\n} from './shared';\n\nexport interface ProductBannerProps extends ProductLinkProps {\n title: string;\n description: string;\n ctaText: string;\n ctaLink: string;\n product: DatasourceValue;\n productOnLeft: boolean;\n background: string;\n}\n\nconst ProductBannerRender: React.FC<ProductBannerProps> = ({\n title, description, ctaText, ctaLink, product, productOnLeft, background, linkWith, baseUrl,\n}) => {\n const hasPreResolved = product?.resolvedData != null;\n const { data: fetchedData, loading } = useDatasource(\n hasPreResolved ? undefined : product?.type,\n hasPreResolved ? [] : (product?.skus ?? [])\n );\n const raw = hasPreResolved ? product.resolvedData : fetchedData;\n const p = raw as any;\n\n const name = getLocalizedText(p?.name);\n const description2 = getLocalizedText(p?.description);\n const imageUrl = p?.masterVariant?.images?.[0]?.url;\n const sku = p?.masterVariant?.sku;\n const priceVal = getFirstPrice(p);\n const productHref = p ? resolveProductLink(p, linkWith, baseUrl) : undefined;\n\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n minHeight: '400px',\n backgroundColor: background || '#f5f5f5',\n padding: '2rem',\n borderRadius: '2px',\n margin: '1rem 0',\n gap: '2rem',\n flexDirection: productOnLeft ? 'row-reverse' : 'row',\n flexWrap: 'wrap',\n }}\n >\n {/* Content side */}\n <div style={{ flex: 1, minWidth: '200px' }}>\n {title && <h2 style={{ fontSize: '2rem', fontWeight: 'bold', marginBottom: '1rem', color: '#333' }}>{title}</h2>}\n {description && (\n <div\n dangerouslySetInnerHTML={{ __html: description }}\n style={{ marginBottom: '2rem', color: '#555', lineHeight: 1.6 }}\n />\n )}\n {ctaText && ctaLink && (\n <a\n href={ctaLink}\n style={{\n display: 'inline-block',\n backgroundColor: '#2c5530',\n color: 'white',\n padding: '0.75rem 2rem',\n borderRadius: '2px',\n textDecoration: 'none',\n fontWeight: 600,\n }}\n >\n {ctaText}\n </a>\n )}\n </div>\n\n {/* Product side */}\n <div style={{ flex: 1, minWidth: '200px', display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n {loading && <div style={{ color: '#999', padding: '2rem' }}>Loading product…</div>}\n {name && (\n <a href={productHref} style={{ textDecoration: 'none', color: 'inherit' }}>\n <h3 style={{ fontSize: '1.5rem', fontWeight: 600, marginBottom: '0.5rem', textAlign: 'center' }}>{name}</h3>\n </a>\n )}\n {description2 && <p style={{ fontSize: '0.9rem', color: '#666', textAlign: 'center', marginBottom: '1rem', fontStyle: 'italic' }}>{description2}</p>}\n {imageUrl && (\n <a href={productHref} style={{ display: 'block', marginBottom: '1rem' }}>\n <img\n src={imageUrl}\n alt={name || 'Product'}\n style={{ maxWidth: '100%', maxHeight: '300px', objectFit: 'cover', borderRadius: '2px', boxShadow: '0 4px 12px rgba(0,0,0,0.1)', display: 'block' }}\n />\n </a>\n )}\n {priceVal && (\n <span\n style={{\n fontSize: '1.25rem',\n fontWeight: 'bold',\n color: '#2c5530',\n background: 'rgba(255,255,255,0.8)',\n padding: '0.5rem 1rem',\n borderRadius: '2px',\n marginBottom: '0.5rem',\n }}\n >\n {formatPrice(priceVal.centAmount, priceVal.currencyCode, priceVal.fractionDigits)}\n </span>\n )}\n {sku && (\n <span style={{ fontSize: '0.85rem', color: '#666', background: 'rgba(255,255,255,0.6)', padding: '0.25rem 0.75rem', borderRadius: '2px' }}>\n SKU: {sku}\n </span>\n )}\n {!loading && !p && (\n <div style={{ color: '#999', fontSize: '13px', padding: '2rem', textAlign: 'center' }}>No product selected</div>\n )}\n </div>\n </div>\n );\n};\n\nexport const ProductBanner: ComponentConfig<ProductBannerProps> = {\n label: 'Product Banner',\n fields: {\n title: { type: 'text', label: 'Title' },\n description: richTextField('Description'),\n ctaText: { type: 'text', label: 'CTA Text' },\n ctaLink: { type: 'text', label: 'CTA Link' },\n product: {\n type: 'custom', label: 'Product',\n render: ({ value, onChange }) => <DatasourceField value={value} onChange={onChange} />,\n },\n productOnLeft: {\n type: 'radio', label: 'Product Position',\n options: [\n { value: false, label: 'Product on Right' },\n { value: true, label: 'Product on Left' },\n ],\n },\n background: { type: 'text', label: 'Background Color' },\n ...productLinkFields,\n },\n defaultProps: {\n title: '',\n description: '',\n ctaText: '',\n ctaLink: '',\n product: { type: 'product-by-sku', skus: [''] },\n productOnLeft: false,\n background: '#f5f5f5',\n ...productLinkDefaults,\n },\n render: (props) => <ProductBannerRender {...props} />,\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { richTextField } from '../../fields/RichTextField';\n\nexport interface ProductGridHeaderProps {\n title: string;\n description: string;\n}\n\nexport const ProductGridHeader: ComponentConfig<ProductGridHeaderProps> = {\n label: 'Product Grid Header',\n fields: {\n title: { type: 'text', label: 'Title' },\n description: richTextField('Description'),\n },\n defaultProps: { title: '', description: '' },\n render: ({ title, description }) => (\n <div style={{ marginBottom: '2rem', padding: '0 1rem' }}>\n {title && (\n <h1 style={{ fontSize: '2rem', fontWeight: 'bold', color: '#333', marginBottom: '0.75rem' }}>\n {title}\n </h1>\n )}\n {description && (\n <div\n dangerouslySetInnerHTML={{ __html: description }}\n style={{ fontSize: '1rem', color: '#666', lineHeight: 1.5, maxWidth: '720px' }}\n />\n )}\n </div>\n ),\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { useDatasource } from '@commercetools-demo/puck-api';\nimport { DatasourceField, type DatasourceValue } from '../../fields/DatasourceField';\nimport {\n formatPrice,\n getFirstPrice,\n getLocalizedText,\n getProductImage,\n productLinkDefaults,\n productLinkFields,\n resolveProductLink,\n type ProductLinkProps,\n} from './shared';\n\nexport interface ProductSliderProps extends ProductLinkProps {\n title: string;\n subtitle: string;\n products: DatasourceValue;\n}\n\nconst ProductSliderRender: React.FC<ProductSliderProps> = ({ title, subtitle, products, linkWith, baseUrl }) => {\n const hasPreResolved = products?.resolvedData != null;\n const { data: fetchedData, loading } = useDatasource(\n hasPreResolved ? undefined : products?.type,\n hasPreResolved ? [] : (products?.skus ?? [])\n );\n const items: unknown[] = hasPreResolved\n ? (Array.isArray(products.resolvedData) ? products.resolvedData : [])\n : (Array.isArray(fetchedData) ? fetchedData : []);\n\n return (\n <div style={{ padding: '2rem 0' }}>\n {(title || subtitle) && (\n <div style={{ textAlign: 'center', marginBottom: '1.5rem' }}>\n {title && <h2 style={{ fontSize: '2rem', fontWeight: 'bold', color: '#333', marginBottom: '0.5rem' }}>{title}</h2>}\n {subtitle && <p style={{ fontSize: '1.1rem', color: '#666', margin: 0 }}>{subtitle}</p>}\n </div>\n )}\n {loading && <div style={{ textAlign: 'center', color: '#999', padding: '2rem' }}>Loading products…</div>}\n {!loading && items.length === 0 && (\n <div style={{ textAlign: 'center', color: '#999', padding: '2rem', fontSize: '13px' }}>No products configured</div>\n )}\n {items.length > 0 && (\n <div\n style={{\n display: 'flex',\n gap: '1rem',\n overflowX: 'auto',\n scrollSnapType: 'x mandatory',\n paddingBottom: '1rem',\n }}\n >\n {items.map((product, i) => {\n const name = getLocalizedText((product as any)?.name);\n const desc = getLocalizedText((product as any)?.description);\n const imageUrl = getProductImage(product);\n const priceVal = getFirstPrice(product);\n return (\n <a\n key={(product as any)?.id ?? i}\n href={resolveProductLink(product, linkWith, baseUrl)}\n style={{\n flex: '0 0 280px',\n background: 'white',\n borderRadius: '12px',\n boxShadow: '0 4px 12px rgba(0,0,0,0.1)',\n overflow: 'hidden',\n textDecoration: 'none',\n color: 'inherit',\n scrollSnapAlign: 'start',\n }}\n >\n <div style={{ width: '100%', height: '200px', background: '#f5f5f5', display: 'flex', alignItems: 'center', justifyContent: 'center', overflow: 'hidden' }}>\n {imageUrl\n ? <img src={imageUrl} alt={name} style={{ width: '100%', height: '100%', objectFit: 'contain' }} />\n : <span style={{ color: '#999', fontSize: '0.85rem' }}>No image</span>\n }\n </div>\n <div style={{ padding: '1.5rem' }}>\n <h3 style={{ fontSize: '1.1rem', fontWeight: 600, color: '#333', marginBottom: '0.5rem', lineHeight: 1.3 }}>{name}</h3>\n {desc && (\n <p style={{ fontSize: '0.9rem', color: '#666', marginBottom: '1rem', display: '-webkit-box', WebkitLineClamp: 2, WebkitBoxOrient: 'vertical', overflow: 'hidden' }}>\n {desc}\n </p>\n )}\n {priceVal && (\n <div style={{ fontSize: '1.2rem', fontWeight: 'bold', color: '#2c5530' }}>\n {formatPrice(priceVal.centAmount, priceVal.currencyCode, priceVal.fractionDigits)}\n </div>\n )}\n </div>\n </a>\n );\n })}\n </div>\n )}\n </div>\n );\n};\n\nexport const ProductSlider: ComponentConfig<ProductSliderProps> = {\n label: 'Product Slider',\n fields: {\n title: { type: 'text', label: 'Title' },\n subtitle: { type: 'text', label: 'Subtitle' },\n products: {\n type: 'custom', label: 'Products',\n render: ({ value, onChange }) => <DatasourceField value={value} onChange={onChange} />,\n },\n ...productLinkFields,\n },\n defaultProps: {\n title: '',\n subtitle: '',\n products: { type: 'products-by-sku', skus: [''] },\n ...productLinkDefaults,\n },\n render: (props) => <ProductSliderRender {...props} />,\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { ImagePickerField } from '../../fields/ImagePickerField';\n\nexport interface PromotionalBannerProps {\n image: string;\n title: string;\n subtitle: string;\n ctaText: string;\n ctaLink: string;\n background: string;\n}\n\nexport const PromotionalBanner: ComponentConfig<PromotionalBannerProps> = {\n label: 'Promotional Banner',\n fields: {\n image: {\n type: 'custom', label: 'Image',\n render: ({ value, onChange }) => <ImagePickerField value={value ?? ''} onChange={onChange} />,\n },\n title: { type: 'text', label: 'Title' },\n subtitle: { type: 'text', label: 'Subtitle' },\n ctaText: { type: 'text', label: 'CTA Text' },\n ctaLink: { type: 'text', label: 'CTA Link' },\n background: { type: 'text', label: 'Background Color' },\n },\n defaultProps: { image: '', title: '', subtitle: '', ctaText: '', ctaLink: '', background: '#f5f5f5' },\n render: ({ image, title, subtitle, ctaText, ctaLink, background }) => (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '280px',\n backgroundColor: background || '#f5f5f5',\n padding: '2rem',\n borderRadius: '2px',\n margin: '1rem 0',\n gap: '2rem',\n flexWrap: 'wrap',\n }}\n >\n {image && (\n <div style={{ flex: '0 0 auto', maxWidth: '40%' }}>\n <img src={image} alt={title || 'Promo'} style={{ maxWidth: '100%', height: 'auto', borderRadius: '2px' }} />\n </div>\n )}\n <div style={{ flex: 1, minWidth: '200px' }}>\n {title && <h2 style={{ fontSize: '1.75rem', fontWeight: 'bold', marginBottom: '0.5rem', color: '#333' }}>{title}</h2>}\n {subtitle && <p style={{ fontSize: '1rem', color: '#666', marginBottom: '1rem' }}>{subtitle}</p>}\n {ctaText && ctaLink && (\n <a\n href={ctaLink}\n style={{\n display: 'inline-block',\n backgroundColor: '#2c5530',\n color: 'white',\n padding: '0.75rem 2rem',\n borderRadius: '2px',\n textDecoration: 'none',\n fontWeight: 600,\n }}\n >\n {ctaText}\n </a>\n )}\n </div>\n </div>\n ),\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { useDatasource } from '@commercetools-demo/puck-api';\nimport { DatasourceField, type DatasourceValue } from '../../fields/DatasourceField';\nimport {\n formatPrice,\n getFirstPrice,\n getLocalizedText,\n getProductImage,\n productLinkDefaults,\n productLinkFields,\n resolveProductLink,\n type ProductLinkProps,\n} from './shared';\n\nexport interface RelatedProductsSliderProps extends ProductLinkProps {\n title: string;\n subtitle: string;\n products: DatasourceValue;\n}\n\nconst RelatedProductsRender: React.FC<RelatedProductsSliderProps> = ({ title, subtitle, products, linkWith, baseUrl }) => {\n const hasPreResolved = products?.resolvedData != null;\n const { data: fetchedData, loading } = useDatasource(\n hasPreResolved ? undefined : products?.type,\n hasPreResolved ? [] : (products?.skus ?? [])\n );\n const items: unknown[] = hasPreResolved\n ? (Array.isArray(products.resolvedData) ? products.resolvedData : [])\n : (Array.isArray(fetchedData) ? fetchedData : []);\n\n if (!loading && items.length === 0) return null;\n\n return (\n <div style={{ padding: '2rem 0' }}>\n {(title || subtitle) && (\n <div style={{ textAlign: 'center', marginBottom: '1.5rem' }}>\n {title && <h2 style={{ fontSize: '2rem', fontWeight: 'bold', color: '#333', marginBottom: '0.5rem' }}>{title}</h2>}\n {subtitle && <p style={{ fontSize: '1.1rem', color: '#666', margin: 0 }}>{subtitle}</p>}\n </div>\n )}\n {loading && <div style={{ textAlign: 'center', color: '#999', padding: '2rem' }}>Loading…</div>}\n {items.length > 0 && (\n <div\n style={{\n display: 'flex',\n gap: '1rem',\n overflowX: 'auto',\n scrollSnapType: 'x mandatory',\n paddingBottom: '1rem',\n }}\n >\n {items.map((product, i) => {\n const name = getLocalizedText((product as any)?.name);\n const imageUrl = getProductImage(product);\n const priceVal = getFirstPrice(product);\n return (\n <a\n key={(product as any)?.id ?? i}\n href={resolveProductLink(product, linkWith, baseUrl)}\n style={{\n flex: '0 0 280px',\n background: 'white',\n borderRadius: '12px',\n boxShadow: '0 4px 12px rgba(0,0,0,0.1)',\n overflow: 'hidden',\n textDecoration: 'none',\n color: 'inherit',\n scrollSnapAlign: 'start',\n }}\n >\n <div style={{ width: '100%', height: '200px', background: '#f5f5f5', display: 'flex', alignItems: 'center', justifyContent: 'center', overflow: 'hidden' }}>\n {imageUrl\n ? <img src={imageUrl} alt={name} style={{ width: '100%', height: '100%', objectFit: 'contain' }} />\n : <span style={{ color: '#999', fontSize: '0.85rem' }}>No image</span>\n }\n </div>\n <div style={{ padding: '1.5rem' }}>\n <h3 style={{ fontSize: '1.1rem', fontWeight: 600, color: '#333', marginBottom: '0.5rem' }}>{name}</h3>\n {priceVal && (\n <div style={{ fontSize: '1.2rem', fontWeight: 'bold', color: '#2c5530' }}>\n {formatPrice(priceVal.centAmount, priceVal.currencyCode, priceVal.fractionDigits)}\n </div>\n )}\n </div>\n </a>\n );\n })}\n </div>\n )}\n </div>\n );\n};\n\nexport const RelatedProductsSlider: ComponentConfig<RelatedProductsSliderProps> = {\n label: 'Related Products',\n fields: {\n title: { type: 'text', label: 'Title' },\n subtitle: { type: 'text', label: 'Subtitle' },\n products: {\n type: 'custom', label: 'Products',\n render: ({ value, onChange }) => <DatasourceField value={value} onChange={onChange} />,\n },\n ...productLinkFields,\n },\n defaultProps: {\n title: 'Related Products',\n subtitle: '',\n products: { type: 'products-by-sku', skus: [''] },\n ...productLinkDefaults,\n },\n render: (props) => <RelatedProductsRender {...props} />,\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\n\nexport interface SocialLinksProps {\n link1Label: string; link1Url: string;\n link2Label: string; link2Url: string;\n link3Label: string; link3Url: string;\n link4Label: string; link4Url: string;\n}\n\nexport const SocialLinks: ComponentConfig<SocialLinksProps> = {\n label: 'Social Links',\n fields: {\n link1Label: { type: 'text', label: 'Link 1 Label' },\n link1Url: { type: 'text', label: 'Link 1 URL' },\n link2Label: { type: 'text', label: 'Link 2 Label' },\n link2Url: { type: 'text', label: 'Link 2 URL' },\n link3Label: { type: 'text', label: 'Link 3 Label' },\n link3Url: { type: 'text', label: 'Link 3 URL' },\n link4Label: { type: 'text', label: 'Link 4 Label' },\n link4Url: { type: 'text', label: 'Link 4 URL' },\n },\n defaultProps: {\n link1Label: '', link1Url: '',\n link2Label: '', link2Url: '',\n link3Label: '', link3Url: '',\n link4Label: '', link4Url: '',\n },\n render: (props) => {\n const links = [\n [props.link1Label, props.link1Url],\n [props.link2Label, props.link2Url],\n [props.link3Label, props.link3Url],\n [props.link4Label, props.link4Url],\n ].filter(([label, url]) => label && url) as [string, string][];\n if (links.length === 0) return <></>;\n return (\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: '1rem', padding: '0.5rem 0' }}>\n {links.map(([label, url], i) => (\n <a\n key={i}\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{ color: '#2c5530', textDecoration: 'none', fontWeight: 500, fontSize: '0.95rem' }}\n >\n {label}\n </a>\n ))}\n </div>\n );\n },\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { richTextField } from '../../fields/RichTextField';\n\nexport interface TabContentProps {\n tabLabel: string;\n content: string;\n}\n\nexport const TabContent: ComponentConfig<TabContentProps> = {\n label: 'Tab Content',\n fields: {\n tabLabel: { type: 'text', label: 'Tab Label' },\n content: richTextField('Content'),\n },\n defaultProps: { tabLabel: '', content: '' },\n render: ({ tabLabel, content }) => {\n if (!content) return <></>;\n return (\n <div style={{ padding: '1.5rem 0', lineHeight: 1.6, color: '#333' }}>\n {tabLabel && <h3 style={{ marginBottom: '1rem' }}>{tabLabel}</h3>}\n <div dangerouslySetInnerHTML={{ __html: content }} />\n </div>\n );\n },\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\n\nexport interface TestimonialsSliderProps {\n quote1: string; author1: string; role1: string;\n quote2: string; author2: string; role2: string;\n quote3: string; author3: string; role3: string;\n}\n\nexport const TestimonialsSlider: ComponentConfig<TestimonialsSliderProps> = {\n label: 'Testimonials',\n fields: {\n quote1: { type: 'textarea', label: 'Quote 1' },\n author1: { type: 'text', label: 'Author 1' },\n role1: { type: 'text', label: 'Role 1' },\n quote2: { type: 'textarea', label: 'Quote 2' },\n author2: { type: 'text', label: 'Author 2' },\n role2: { type: 'text', label: 'Role 2' },\n quote3: { type: 'textarea', label: 'Quote 3' },\n author3: { type: 'text', label: 'Author 3' },\n role3: { type: 'text', label: 'Role 3' },\n },\n defaultProps: {\n quote1: '', author1: '', role1: '',\n quote2: '', author2: '', role2: '',\n quote3: '', author3: '', role3: '',\n },\n render: (props) => {\n const items = [\n [props.quote1, props.author1, props.role1],\n [props.quote2, props.author2, props.role2],\n [props.quote3, props.author3, props.role3],\n ].filter(([q]) => q) as [string, string, string][];\n if (items.length === 0) return <></>;\n return (\n <div style={{ padding: '2rem 1rem', background: '#f9f9f9', borderRadius: '8px', margin: '1rem 0' }}>\n {items.map(([quote, author, role], i) => (\n <div key={i} style={{ marginBottom: i < items.length - 1 ? '2rem' : 0 }}>\n <blockquote\n style={{\n fontSize: '1.15rem',\n fontStyle: 'italic',\n color: '#444',\n margin: '0 0 0.75rem 0',\n paddingLeft: '1rem',\n borderLeft: '4px solid #2c5530',\n }}\n >\n {quote}\n </blockquote>\n {author && (\n <cite style={{ fontStyle: 'normal', fontSize: '0.95rem', fontWeight: 600, color: '#333' }}>\n — {author}\n {role && <span style={{ fontWeight: 'normal', color: '#666' }}> ({role})</span>}\n </cite>\n )}\n </div>\n ))}\n </div>\n );\n },\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { richTextField } from '../../fields/RichTextField';\n\nexport interface ThankYouContentProps {\n headline: string;\n message: string;\n ctaText: string;\n ctaLink: string;\n}\n\nexport const ThankYouContent: ComponentConfig<ThankYouContentProps> = {\n label: 'Thank You Content',\n fields: {\n headline: { type: 'text', label: 'Headline' },\n message: richTextField('Message'),\n ctaText: { type: 'text', label: 'CTA Text' },\n ctaLink: { type: 'text', label: 'CTA Link' },\n },\n defaultProps: { headline: 'Thank you for your order!', message: '', ctaText: '', ctaLink: '' },\n render: ({ headline, message, ctaText, ctaLink }) => (\n <div style={{ textAlign: 'center', padding: '3rem 1rem', maxWidth: '560px', margin: '0 auto' }}>\n {headline && (\n <h1 style={{ fontSize: '2rem', color: '#2c5530', marginBottom: '1rem' }}>{headline}</h1>\n )}\n {message && (\n <div\n dangerouslySetInnerHTML={{ __html: message }}\n style={{ fontSize: '1rem', lineHeight: 1.6, color: '#555', marginBottom: '2rem' }}\n />\n )}\n {ctaText && ctaLink && (\n <a\n href={ctaLink}\n style={{\n display: 'inline-block',\n background: '#2c5530',\n color: 'white',\n padding: '0.75rem 2rem',\n borderRadius: '4px',\n textDecoration: 'none',\n fontWeight: 600,\n }}\n >\n {ctaText}\n </a>\n )}\n </div>\n ),\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { ImagePickerField } from '../../fields/ImagePickerField';\n\nexport interface TrustBadgesProps {\n badge1Icon: string; badge1Label: string;\n badge2Icon: string; badge2Label: string;\n badge3Icon: string; badge3Label: string;\n badge4Icon: string; badge4Label: string;\n}\n\nconst iconField = (label: string) => ({\n type: 'custom' as const,\n label,\n render: ({ value, onChange }: { value: string; onChange: (v: string) => void }) => (\n <ImagePickerField value={value ?? ''} onChange={onChange} />\n ),\n});\n\nexport const TrustBadges: ComponentConfig<TrustBadgesProps> = {\n label: 'Trust Badges',\n fields: {\n badge1Icon: iconField('Badge 1 Icon'),\n badge1Label: { type: 'text', label: 'Badge 1 Label' },\n badge2Icon: iconField('Badge 2 Icon'),\n badge2Label: { type: 'text', label: 'Badge 2 Label' },\n badge3Icon: iconField('Badge 3 Icon'),\n badge3Label: { type: 'text', label: 'Badge 3 Label' },\n badge4Icon: iconField('Badge 4 Icon'),\n badge4Label: { type: 'text', label: 'Badge 4 Label' },\n },\n defaultProps: {\n badge1Icon: '', badge1Label: '',\n badge2Icon: '', badge2Label: '',\n badge3Icon: '', badge3Label: '',\n badge4Icon: '', badge4Label: '',\n },\n render: (props) => {\n const badges = [\n [props.badge1Icon, props.badge1Label],\n [props.badge2Icon, props.badge2Label],\n [props.badge3Icon, props.badge3Label],\n [props.badge4Icon, props.badge4Label],\n ].filter(([, label]) => label) as [string, string][];\n if (badges.length === 0) return <></>;\n return (\n <div\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'center',\n gap: '2rem',\n padding: '2rem 1rem',\n background: '#f9f9f9',\n borderRadius: '4px',\n }}\n >\n {badges.map(([icon, label], i) => (\n <div key={i} style={{ display: 'flex', alignItems: 'center', gap: '0.75rem' }}>\n {icon && (\n <img\n src={icon}\n alt={label}\n style={{ width: '40px', height: '40px', objectFit: 'contain' }}\n />\n )}\n <span style={{ fontSize: '0.95rem', fontWeight: 500, color: '#333' }}>{label}</span>\n </div>\n ))}\n </div>\n );\n },\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { ImagePickerField } from '../../fields/ImagePickerField';\n\nexport interface VideoBlockProps {\n videoUrl: string;\n posterImage: string;\n title: string;\n caption: string;\n}\n\nexport const VideoBlock: ComponentConfig<VideoBlockProps> = {\n label: 'Video Block',\n fields: {\n videoUrl: { type: 'text', label: 'Video URL' },\n posterImage: {\n type: 'custom', label: 'Poster Image',\n render: ({ value, onChange }) => <ImagePickerField value={value ?? ''} onChange={onChange} />,\n },\n title: { type: 'text', label: 'Title' },\n caption: { type: 'text', label: 'Caption' },\n },\n defaultProps: { videoUrl: '', posterImage: '', title: '', caption: '' },\n render: ({ videoUrl, posterImage, title, caption }) => {\n if (!videoUrl) return (\n <div style={{ padding: '2rem', textAlign: 'center', color: '#999', background: '#f5f5f5', borderRadius: '8px' }}>\n No video URL configured\n </div>\n );\n return (\n <div style={{ margin: '1.5rem 0' }}>\n <div\n style={{\n position: 'relative',\n paddingBottom: '56.25%',\n height: 0,\n overflow: 'hidden',\n background: '#000',\n borderRadius: '8px',\n }}\n >\n <video\n src={videoUrl}\n poster={posterImage || undefined}\n controls\n preload=\"metadata\"\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n objectFit: 'contain',\n }}\n />\n </div>\n {title && <h4 style={{ marginTop: '0.75rem', fontSize: '1.1rem', color: '#333' }}>{title}</h4>}\n {caption && <p style={{ fontSize: '0.9rem', color: '#666', marginTop: '0.25rem' }}>{caption}</p>}\n </div>\n );\n },\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { ImagePickerField } from '../../fields/ImagePickerField';\n\nexport interface WebsiteLogoProps {\n logo: string;\n maxWidth: string;\n maxHeight: string;\n}\n\nexport const WebsiteLogo: ComponentConfig<WebsiteLogoProps> = {\n label: 'Website Logo',\n fields: {\n logo: {\n type: 'custom', label: 'Logo',\n render: ({ value, onChange }) => <ImagePickerField value={value ?? ''} onChange={onChange} />,\n },\n maxWidth: { type: 'text', label: 'Max Width (px)' },\n maxHeight: { type: 'text', label: 'Max Height (px)' },\n },\n defaultProps: { logo: '', maxWidth: '180', maxHeight: '50' },\n render: ({ logo, maxWidth, maxHeight }) => {\n if (!logo) return (\n <div style={{ width: `${parseInt(maxWidth, 10) || 180}px`, height: `${parseInt(maxHeight, 10) || 50}px`, background: '#f0f0f0', borderRadius: '4px' }} />\n );\n return (\n <div\n style={{\n maxWidth: `${parseInt(maxWidth, 10) || 180}px`,\n maxHeight: `${parseInt(maxHeight, 10) || 50}px`,\n }}\n >\n <img\n src={logo}\n alt=\"Logo\"\n style={{ width: '100%', height: '100%', objectFit: 'contain' }}\n />\n </div>\n );\n },\n};\n","import React from 'react';\nimport type { PuckStateInfo } from '@commercetools-demo/puck-types';\nimport { usePuck } from '@measured/puck';\nimport { useVersionHistoryContext } from '@commercetools-demo/puck-version-history';\nimport {\n Badge,\n Button,\n Icon,\n IconButton,\n Menu,\n Stack,\n Text,\n} from '@commercetools/nimbus';\nimport {\n History,\n MoreVert,\n PostAdd,\n Redo,\n SettingsBackupRestore,\n Tune,\n Undo,\n Category,\n Visibility,\n} from '@commercetools/nimbus-icons';\n\nexport interface EditorToolbarProps {\n /** Page / content name shown centred in the bar. */\n title: string;\n saving: boolean;\n isDirty: boolean;\n states: PuckStateInfo;\n onSave: () => void;\n onPublish: () => void;\n onRevert: () => void;\n /** When provided, renders a Preview button that opens the preview view. */\n onPreview?: () => void;\n /** When provided, adds a \"Create a template from this…\" overflow-menu item. */\n onCreateTemplate?: () => void;\n /** Label for the create-template menu item. */\n createTemplateLabel?: string;\n showPublishButton: boolean;\n}\n\n/**\n * Full replacement for Puck's header (wired via the `header` override).\n *\n * Layout: undo/redo + panel toggle on the left, the document name with its\n * status badges centred, and the Save / Publish / Preview actions plus an\n * overflow menu (version history, revert) on the right.\n */\nexport const EditorToolbar: React.FC<EditorToolbarProps> = ({\n title,\n saving,\n isDirty,\n states,\n onSave,\n onPublish,\n onRevert,\n onPreview,\n onCreateTemplate,\n createTemplateLabel = 'Create a template from this page',\n showPublishButton,\n}) => {\n const { dispatch, appState, history } = usePuck();\n const { isHistoryTabActive, openHistoryTab, closeHistoryTab } =\n useVersionHistoryContext();\n\n const hasDraft = Boolean(states.draft);\n const hasPublished = Boolean(states.published);\n const canRevert = hasDraft && hasPublished;\n\n const toggleHistory = () =>\n isHistoryTabActive ? closeHistoryTab() : openHistoryTab();\n\n const toggleLeftPanel = () =>\n dispatch({\n type: 'setUi',\n ui: { leftSideBarVisible: !appState.ui.leftSideBarVisible },\n });\n\n const toggleRightPanel = () =>\n dispatch({\n type: 'setUi',\n ui: { rightSideBarVisible: !appState.ui.rightSideBarVisible },\n });\n\n return (\n <div\n style={{\n // Claim the \"header\" cell of Puck's PuckLayout-inner grid — the default\n // <header> gets this via a CSS class we no longer render.\n gridArea: 'header',\n background: 'var(--puck-color-white, #fff)',\n borderBottom: '1px solid var(--puck-color-grey-09, #e2e2e2)',\n padding: '8px 12px',\n }}\n >\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'minmax(0, 1fr) auto minmax(0, 1fr)',\n alignItems: 'center',\n gap: '12px',\n }}\n >\n {/* LEFT — panel toggle + undo / redo */}\n <Stack direction=\"row\" gap=\"100\" alignItems=\"center\" justifyContent=\"flex-start\">\n <IconButton\n aria-label=\"Toggle components panel\"\n variant=\"ghost\"\n size=\"xs\"\n onPress={toggleLeftPanel}\n >\n <Category />\n </IconButton>\n <IconButton\n aria-label=\"Toggle properties panel\"\n variant=\"ghost\"\n size=\"xs\"\n onPress={toggleRightPanel}\n >\n <Tune />\n </IconButton>\n <IconButton\n aria-label=\"Undo\"\n variant=\"ghost\"\n size=\"xs\"\n isDisabled={!history.hasPast}\n onPress={() => history.back()}\n >\n <Undo />\n </IconButton>\n <IconButton\n aria-label=\"Redo\"\n variant=\"ghost\"\n size=\"xs\"\n isDisabled={!history.hasFuture}\n onPress={() => history.forward()}\n >\n <Redo />\n </IconButton>\n </Stack>\n\n {/* CENTER — document name + status badges */}\n <Stack direction=\"row\" gap=\"200\" alignItems=\"center\" justifyContent=\"center\">\n <Text fontWeight=\"700\" truncate>\n {title}\n </Text>\n <Stack direction=\"row\" gap=\"100\" alignItems=\"center\">\n {saving && (\n <Badge colorPalette=\"warning\" size=\"xs\">\n Saving…\n </Badge>\n )}\n {!saving && isDirty && (\n <Badge colorPalette=\"neutral\" size=\"xs\">\n Unsaved\n </Badge>\n )}\n {!saving && !isDirty && hasDraft && (\n <Badge colorPalette=\"info\" size=\"xs\">\n Draft\n </Badge>\n )}\n {hasPublished && (\n <Badge colorPalette=\"positive\" size=\"xs\">\n Published\n </Badge>\n )}\n </Stack>\n </Stack>\n\n {/* RIGHT — preview / save / publish + overflow menu */}\n <Stack direction=\"row\" gap=\"200\" alignItems=\"center\" justifyContent=\"flex-end\">\n {onPreview && (\n <Button variant=\"ghost\" size=\"xs\" onPress={onPreview} isDisabled={saving}>\n <Icon as={Visibility} /> Preview\n </Button>\n )}\n <Button\n variant=\"outline\"\n size=\"xs\"\n onPress={onSave}\n isDisabled={!isDirty || saving}\n >\n Save\n </Button>\n {showPublishButton && (\n <Button variant=\"solid\" size=\"xs\" onPress={onPublish} isDisabled={saving}>\n Publish\n </Button>\n )}\n <Menu.Root\n onAction={(key) => {\n if (key === 'history') toggleHistory();\n else if (key === 'revert') onRevert();\n else if (key === 'create-template') onCreateTemplate?.();\n }}\n >\n <Menu.Trigger asChild>\n <IconButton\n aria-label=\"More options\"\n variant=\"ghost\"\n size=\"xs\"\n isDisabled={saving}\n >\n <MoreVert />\n </IconButton>\n </Menu.Trigger>\n <Menu.Content>\n <Menu.Item id=\"history\">\n <Icon slot=\"icon\">\n <History />\n </Icon>\n <Text slot=\"label\">\n {isHistoryTabActive ? 'Hide version history' : 'Version history'}\n </Text>\n </Menu.Item>\n {canRevert && (\n <Menu.Item id=\"revert\">\n <Icon slot=\"icon\">\n <SettingsBackupRestore />\n </Icon>\n <Text slot=\"label\">Revert to published</Text>\n </Menu.Item>\n )}\n {onCreateTemplate && (\n <Menu.Item id=\"create-template\">\n <Icon slot=\"icon\">\n <PostAdd />\n </Icon>\n <Text slot=\"label\">{createTemplateLabel}</Text>\n </Menu.Item>\n )}\n </Menu.Content>\n </Menu.Root>\n </Stack>\n </div>\n </div>\n );\n};\n","import React, { useEffect, useState } from 'react';\nimport {\n Button,\n Checkbox,\n Dialog,\n FormField,\n Stack,\n Text,\n TextInput,\n} from '@commercetools/nimbus';\n\nexport interface CreateTemplateDialogProps {\n /** Whether the dialog is visible. */\n isOpen: boolean;\n /** Called when the dialog requests to open/close (backdrop, Esc, Cancel). */\n onOpenChange: (isOpen: boolean) => void;\n /**\n * Called when the user confirms. `withoutData` reflects the\n * \"Create template without data\" checkbox (default checked).\n */\n onConfirm: (name: string, withoutData: boolean) => void | Promise<void>;\n /** Disables the form while the template is being created. */\n saving?: boolean;\n}\n\n/**\n * Nimbus dialog for \"Create a template from this page/content\". Collects a\n * template name and whether to strip component data before saving.\n */\nexport const CreateTemplateDialog: React.FC<CreateTemplateDialogProps> = ({\n isOpen,\n onOpenChange,\n onConfirm,\n saving = false,\n}) => {\n const [name, setName] = useState('');\n const [withoutData, setWithoutData] = useState(true);\n const [error, setError] = useState('');\n\n // Reset the form each time the dialog opens.\n useEffect(() => {\n if (isOpen) {\n setName('');\n setWithoutData(true);\n setError('');\n }\n }, [isOpen]);\n\n const handleConfirm = () => {\n if (!name.trim()) {\n setError('Name is required');\n return;\n }\n setError('');\n void onConfirm(name.trim(), withoutData);\n };\n\n return (\n <Dialog.Root isOpen={isOpen} onOpenChange={onOpenChange}>\n <Dialog.Content>\n <Dialog.Header>\n <Dialog.Title>Create a new template</Dialog.Title>\n <Dialog.CloseTrigger />\n </Dialog.Header>\n <Dialog.Body>\n <Stack direction=\"column\" gap=\"400\">\n <FormField.Root isRequired>\n <FormField.Label>Name</FormField.Label>\n <FormField.Input>\n <TextInput\n value={name}\n onChange={(v) => setName(v)}\n placeholder=\"e.g. Landing page\"\n autoFocus\n />\n </FormField.Input>\n </FormField.Root>\n <Checkbox\n isSelected={withoutData}\n onChange={(selected) => setWithoutData(selected)}\n isDisabled={saving}\n >\n Create template without data\n </Checkbox>\n {error && <Text color=\"critical.11\">{error}</Text>}\n </Stack>\n </Dialog.Body>\n <Dialog.Footer>\n <Button slot=\"close\" variant=\"outline\" isDisabled={saving}>\n Cancel\n </Button>\n <Button variant=\"solid\" onPress={handleConfirm} isDisabled={saving}>\n {saving ? 'Creating…' : 'Create'}\n </Button>\n </Dialog.Footer>\n </Dialog.Content>\n </Dialog.Root>\n );\n};\n","import type { Config, ComponentData, Data } from '@measured/puck';\n\n/**\n * Produce a \"without data\" copy of Puck data for use as a template.\n *\n * Each **leaf** component's props are reset to its config `defaultProps` (so a\n * new page created from the template shows the component's default contents,\n * not the source page's data). **Container** components — those that hold child\n * components in a zone — keep their props, so structural fields (e.g. a Grid's\n * `columnCount`) survive and the nested layout renders correctly.\n *\n * Nested components live in a flat `data.zones` map keyed `\"<parentId>:<zone>\"`;\n * `<parentId>` is the parent component's `props.id`. Every component's\n * `props.id` is always preserved so those zone keys stay consistent.\n */\nexport function stripPuckDataToTemplate(data: Data, config: Config): Data {\n const zones = data.zones ?? {};\n\n // Ids of components that own at least one non-empty zone → keep their props.\n const containerIds = new Set(\n Object.entries(zones)\n .filter(([, components]) => components.length > 0)\n .map(([zoneKey]) => zoneKey.slice(0, zoneKey.indexOf(':')))\n );\n\n const strip = (component: ComponentData): ComponentData => {\n const { id } = component.props;\n if (containerIds.has(id)) {\n // Container: preserve props so its zones keep rendering.\n return component;\n }\n const defaults =\n (config.components?.[component.type]?.defaultProps as\n | Record<string, unknown>\n | undefined) ?? {};\n // Reset to the component's default props, keeping its id so zone keys\n // (`\"<id>:<zone>\"`) stay consistent.\n return { ...component, props: { ...defaults, id } };\n };\n\n return {\n ...data,\n content: data.content.map(strip),\n root: { ...data.root, props: { ...(config.root?.defaultProps ?? {}) } },\n ...(data.zones && {\n zones: Object.fromEntries(\n Object.entries(zones).map(([zoneKey, components]) => [\n zoneKey,\n components.map(strip),\n ])\n ),\n }),\n };\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\nexport interface DirtyState {\n /** True when the canvas differs from the last saved / loaded baseline. */\n isDirty: boolean;\n /**\n * Feed every Puck `onChange` payload through this. The very first call after\n * a (re)load establishes the baseline and is treated as \"clean\" — Puck emits\n * an `onChange` on mount while it normalises the incoming data, and that must\n * not be mistaken for an edit by the user.\n */\n markChange: (data: unknown) => void;\n /** Mark the current data as the saved baseline (call after a successful save). */\n markSaved: (data: unknown) => void;\n}\n\n/**\n * Tracks whether the Puck canvas has unsaved edits.\n *\n * Puck is an uncontrolled editor that fires `onChange` once on mount (to report\n * its normalised version of the initial data). Naively flagging the editor\n * dirty on the first `onChange` makes a freshly-opened page look \"Unsaved\" even\n * though nothing was touched. We instead capture that first payload as the\n * baseline and only flag dirty when a later payload diverges from it.\n *\n * `resetKey` should change whenever the document shown in the canvas is swapped\n * out (different page/content, or a historical version applied) so a new\n * baseline is captured for the new document.\n */\nexport const useDirtyState = (resetKey: string): DirtyState => {\n const [isDirty, setIsDirty] = useState(false);\n const baselineRef = useRef<string | null>(null);\n\n useEffect(() => {\n // New document mounted — drop the old baseline and wait for the next\n // `onChange` (Puck's normalised mount payload) to set a fresh one.\n baselineRef.current = null;\n setIsDirty(false);\n }, [resetKey]);\n\n const markChange = useCallback((data: unknown) => {\n const serialized = JSON.stringify(data);\n if (baselineRef.current === null) {\n baselineRef.current = serialized;\n return;\n }\n setIsDirty(serialized !== baselineRef.current);\n }, []);\n\n const markSaved = useCallback((data: unknown) => {\n baselineRef.current = JSON.stringify(data);\n setIsDirty(false);\n }, []);\n\n return { isDirty, markChange, markSaved };\n};\n","import React, {\n createContext,\n useContext,\n useEffect,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\nimport { usePuck } from '@measured/puck';\nimport { IconButton, TextInput } from '@commercetools/nimbus';\nimport { Close } from '@commercetools/nimbus-icons';\nimport {\n useVersionHistoryContext,\n VersionHistorySidebarContent,\n} from '@commercetools-demo/puck-version-history';\n\n// ---------------------------------------------------------------------------\n// Component search context\n// ---------------------------------------------------------------------------\n\ninterface ComponentSearchContextValue {\n search: string;\n setSearch: (value: string) => void;\n}\n\nexport const ComponentSearchContext = createContext<ComponentSearchContextValue>({\n search: '',\n setSearch: () => {},\n});\n\nexport const ComponentSearchProvider: React.FC<{ children: ReactNode }> = ({ children }) => {\n const [search, setSearch] = useState('');\n return (\n <ComponentSearchContext.Provider value={{ search, setSearch }}>\n {children}\n </ComponentSearchContext.Provider>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Tab button — matches Puck's own Inspector/Outline tab style\n// ---------------------------------------------------------------------------\n\nconst SidebarTab: React.FC<{\n label: string;\n isActive: boolean;\n onClick: () => void;\n}> = ({ label, isActive, onClick }) => (\n <button\n type=\"button\"\n aria-label={`Show ${label.toLowerCase()} panel`}\n aria-pressed={isActive}\n title={`Show ${label.toLowerCase()} panel`}\n onClick={onClick}\n style={{\n flex: 1,\n padding: '8px 12px',\n border: 'none',\n borderBottom: isActive\n ? '2px solid var(--puck-color-azure-07, #1a73e8)'\n : '2px solid transparent',\n background: 'none',\n cursor: 'pointer',\n fontSize: '0.775rem',\n fontWeight: isActive ? 700 : 500,\n color: isActive\n ? 'var(--puck-color-azure-07, #1a73e8)'\n : 'var(--puck-color-grey-07, #374151)',\n transition: 'color 0.12s, border-color 0.12s',\n }}\n >\n {label}\n </button>\n);\n\n// Remap the `expanded` flag of every category in Puck's componentList UI state.\nconst remapExpanded = (\n componentList: Record<string, { expanded?: boolean }> | undefined,\n next: (key: string, current: boolean) => boolean\n): Record<string, { expanded?: boolean }> =>\n Object.fromEntries(\n Object.entries(componentList ?? {}).map(([key, value]) => [\n key,\n { ...value, expanded: next(key, !!value.expanded) },\n ])\n );\n\n// ---------------------------------------------------------------------------\n// ComponentsPanel override — tabs: \"Components\" | \"History\"\n//\n// CSS trick: Puck's Drawer renders each item as a direct `div` child of the\n// `[data-puck-dnd]` container (flex, gap:12px). When an item is hidden we\n// inject a `data-hidden-component` span; the `:has()` rule sets that wrapper\n// to `display:none` so it's removed from the flex flow entirely.\n// ---------------------------------------------------------------------------\n\nexport const ComponentsPanel: React.FC<{ children: ReactNode }> = ({ children }) => {\n const { search, setSearch } = useContext(ComponentSearchContext);\n const { isHistoryTabActive, openHistoryTab, closeHistoryTab } = useVersionHistoryContext();\n const { dispatch, appState } = usePuck();\n\n // Categories start collapsed for a tidy panel, but a search must never hide a\n // match inside a collapsed group — so expand everything while searching and\n // restore the author's prior expansion when the search is cleared.\n const searching = search.trim() !== '';\n const expansionSnapshot = useRef<Record<string, boolean> | null>(null);\n\n useEffect(() => {\n const componentList = (appState?.ui?.componentList ?? {}) as Record<\n string,\n { expanded?: boolean }\n >;\n if (searching) {\n if (expansionSnapshot.current === null) {\n expansionSnapshot.current = Object.fromEntries(\n Object.entries(componentList).map(([k, v]) => [k, !!v.expanded])\n );\n dispatch({\n type: 'setUi',\n ui: (prev) => ({\n componentList: remapExpanded(prev.componentList, () => true),\n }),\n });\n }\n } else if (expansionSnapshot.current) {\n const snap = expansionSnapshot.current;\n dispatch({\n type: 'setUi',\n ui: (prev) => ({\n componentList: remapExpanded(\n prev.componentList,\n (key, current) => snap[key] ?? current\n ),\n }),\n });\n expansionSnapshot.current = null;\n }\n // Only react to the search on/off transition.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [searching]);\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', height: '100%' }}>\n {/* Remove hidden DrawerItem wrappers from the flex layout, tighten the\n vertical padding on each draggable component, and trim the wide\n horizontal padding around the canvas so it gets more width.\n `PuckCanvas_` (underscore) matches only the outer canvas element, not\n its `PuckCanvas-*` children. */}\n <style>{`\n [data-puck-dnd] > div:has([data-hidden-component]) { display: none !important; }\n [class*=\"DrawerItem-draggable\"] { padding-top: 6px !important; padding-bottom: 6px !important; }\n [class*=\"PuckCanvas_\"] { padding-left: 4px !important; padding-right: 4px !important; }\n /* Make Puck fill its embedding container instead of 100dvh (which\n overflows below the app's nav bars and hides the sidebars' scroll).\n Puck nests unclassed wrapper divs between .Puck and the layout grid,\n so a height:100% chain breaks; pinning the inner grid to the\n container with absolute inset:0 bypasses those wrappers entirely.\n Scoped to .puck-editor-fill so standalone usage keeps 100dvh. */\n .puck-editor-fill { position: relative; }\n .puck-editor-fill [class*=\"PuckLayout-inner\"] {\n position: absolute !important;\n inset: 0 !important;\n height: auto !important;\n }\n /* Resizable properties (right) panel: override only the last grid track\n with a user-controlled width var (set by PropertiesResizer), falling\n back to Puck's default sidebar width. Two states: both panels open,\n and right-only (left collapsed). */\n .puck-editor-fill [class*=\"PuckLayout--leftSideBarVisible\"][class*=\"PuckLayout--rightSideBarVisible\"] [class*=\"PuckLayout-inner\"] {\n grid-template-columns: var(--puck-side-bar-width) var(--puck-frame-width) var(--puck-properties-width, var(--puck-side-bar-width)) !important;\n }\n .puck-editor-fill [class*=\"PuckLayout--rightSideBarVisible\"]:not([class*=\"PuckLayout--leftSideBarVisible\"]) [class*=\"PuckLayout-inner\"] {\n grid-template-columns: 0 var(--puck-frame-width) var(--puck-properties-width, var(--puck-side-bar-width)) !important;\n }\n /* Drag handle on the panel's left edge. */\n .puck-props-resizer::before {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n left: 3px;\n width: 1px;\n background: var(--puck-color-grey-09, #e2e2e2);\n transition: background-color 0.12s, width 0.12s, left 0.12s;\n }\n .puck-props-resizer:hover::before,\n .puck-props-resizer:active::before {\n left: 2px;\n width: 3px;\n background: var(--puck-color-azure-07, #1a73e8);\n }\n `}</style>\n\n {/* Tab bar */}\n <div\n style={{\n display: 'flex',\n borderBottom: '1px solid var(--puck-color-grey-04, #e5e7eb)',\n flexShrink: 0,\n }}\n >\n <SidebarTab\n label=\"Components\"\n isActive={!isHistoryTabActive}\n onClick={closeHistoryTab}\n />\n <SidebarTab\n label=\"History\"\n isActive={isHistoryTabActive}\n onClick={openHistoryTab}\n />\n </div>\n\n {isHistoryTabActive ? (\n /* History tab content */\n <div style={{ flex: 1, padding: '12px', overflowY: 'auto' }}>\n <VersionHistorySidebarContent />\n </div>\n ) : (\n /* Components tab content */\n <>\n {/* Sticky search bar */}\n <div\n style={{\n flexShrink: 0,\n padding: '0',\n margin: '12px 0',\n background: 'var(--puck-color-white, #fff)',\n position: 'sticky',\n top: 0,\n zIndex: 1,\n }}\n >\n <label\n htmlFor=\"puck-component-search\"\n style={{\n position: 'absolute',\n width: 1,\n height: 1,\n padding: 0,\n margin: -1,\n overflow: 'hidden',\n clip: 'rect(0 0 0 0)',\n whiteSpace: 'nowrap',\n border: 0,\n }}\n >\n Search components\n </label>\n <TextInput\n id=\"puck-component-search\"\n placeholder=\"Search components…\"\n value={search}\n onChange={(value) => setSearch(value)}\n width=\"100%\"\n trailingElement={\n search !== '' ? (\n <IconButton\n aria-label=\"Clear search\"\n variant=\"ghost\"\n colorPalette=\"neutral\"\n size=\"2xs\"\n onPress={() => setSearch('')}\n >\n <Close />\n </IconButton>\n ) : undefined\n }\n />\n </div>\n\n {/* Scrollable component list */}\n <div style={{ flex: 1, overflowY: 'auto' }}>{children}</div>\n </>\n )}\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// ComponentItemFilter — hides non-matching items when searching\n// ---------------------------------------------------------------------------\n\nexport const ComponentItemFilter: React.FC<{ children: ReactNode; name: string }> = ({\n children,\n name,\n}) => {\n const { search } = useContext(ComponentSearchContext);\n const isHidden = search.trim() !== '' && !name.toLowerCase().includes(search.toLowerCase());\n\n if (isHidden) {\n return <span data-hidden-component />;\n }\n return <>{children}</>;\n};\n","import React from 'react';\nimport type {\n Field,\n FieldProps,\n Overrides,\n RadioField,\n SelectField,\n} from '@measured/puck';\nimport {\n MultilineTextInput,\n RadioInput,\n Select,\n TextInput,\n} from '@commercetools/nimbus';\n\n// ---------------------------------------------------------------------------\n// Nimbus field-type overrides\n//\n// Puck renders its built-in field inputs (text / textarea / select / radio)\n// with its own plain HTML controls, which look nothing like the rest of the\n// app. `overrides.fieldTypes` lets us swap just the input for the Nimbus\n// equivalent while still reusing Puck's label wrapper (passed in as `Label`),\n// so labels stay consistent and stored data is untouched. `custom` fields\n// (DatasourceField, RichTextField, ImagePickerField) bypass this entirely.\n// ---------------------------------------------------------------------------\n\ntype LabelComp = React.ComponentType<{\n label?: string;\n icon?: React.ReactNode;\n el?: 'label' | 'div';\n readOnly?: boolean;\n children?: React.ReactNode;\n}>;\n\n/** Extra props Puck injects at runtime that aren't part of the public FieldProps type. */\ntype Extra = {\n name: string;\n label?: string;\n readOnly?: boolean;\n children?: React.ReactNode;\n Label?: LabelComp;\n};\n\ntype RenderProps<V = unknown, F = Field> = FieldProps<F, V> & Extra;\n\n/** Reuses Puck's own label wrapper (or renders bare when there's no label). */\nconst FieldShell: React.FC<{\n Label?: LabelComp;\n label?: string;\n name: string;\n readOnly?: boolean;\n children: React.ReactNode;\n}> = ({ Label, label, name, readOnly, children }) => {\n if (!Label) return <>{children}</>;\n // `el=\"div\"` avoids wrapping interactive React-Aria groups (select/radio) in a <label>.\n return (\n <Label label={label || name} el=\"div\" readOnly={readOnly}>\n {children}\n </Label>\n );\n};\n\nconst TextFieldOverride: React.FC<RenderProps<string>> = ({\n value,\n onChange,\n label,\n name,\n readOnly,\n id,\n Label,\n}) => (\n <FieldShell Label={Label} label={label} name={name} readOnly={readOnly}>\n <TextInput\n id={id}\n value={value ?? ''}\n onChange={(v) => onChange(v)}\n isDisabled={readOnly}\n width=\"100%\"\n />\n </FieldShell>\n);\n\nconst TextareaFieldOverride: React.FC<RenderProps<string>> = ({\n value,\n onChange,\n label,\n name,\n readOnly,\n id,\n Label,\n}) => (\n <FieldShell Label={Label} label={label} name={name} readOnly={readOnly}>\n <MultilineTextInput\n id={id}\n value={value ?? ''}\n onChange={(v) => onChange(v)}\n isDisabled={readOnly}\n rows={4}\n width=\"100%\"\n />\n </FieldShell>\n);\n\nconst SelectFieldOverride: React.FC<RenderProps<string | number | boolean, SelectField>> = ({\n field,\n value,\n onChange,\n label,\n name,\n readOnly,\n Label,\n}) => {\n const options = field.options ?? [];\n return (\n <FieldShell Label={Label} label={label} name={name} readOnly={readOnly}>\n <Select.Root\n aria-label={label || name}\n selectedKey={value == null ? undefined : String(value)}\n isDisabled={readOnly}\n onSelectionChange={(key) => {\n const opt = options.find((o) => String(o.value) === String(key));\n onChange(opt ? opt.value : (key as string));\n }}\n >\n <Select.Options>\n {options.map((o) => (\n <Select.Option key={String(o.value)} id={String(o.value)}>\n {o.label}\n </Select.Option>\n ))}\n </Select.Options>\n </Select.Root>\n </FieldShell>\n );\n};\n\nconst RadioFieldOverride: React.FC<RenderProps<string | number | boolean, RadioField>> = ({\n field,\n value,\n onChange,\n label,\n name,\n readOnly,\n Label,\n}) => {\n const options = field.options ?? [];\n return (\n <FieldShell Label={Label} label={label} name={name} readOnly={readOnly}>\n <RadioInput.Root\n aria-label={label || name}\n value={String(value ?? '')}\n isDisabled={readOnly}\n onChange={(key) => {\n const opt = options.find((o) => String(o.value) === key);\n onChange(opt ? opt.value : key);\n }}\n >\n {options.map((o) => (\n <RadioInput.Option key={String(o.value)} value={String(o.value)}>\n {o.label}\n </RadioInput.Option>\n ))}\n </RadioInput.Root>\n </FieldShell>\n );\n};\n\nexport const nimbusFieldTypes: NonNullable<Overrides['fieldTypes']> = {\n text: TextFieldOverride,\n textarea: TextareaFieldOverride,\n select: SelectFieldOverride,\n radio: RadioFieldOverride,\n};\n","import React, { type PropsWithChildren } from 'react';\nimport { NimbusProvider } from '@commercetools/nimbus';\n\n/**\n * Ensures a Nimbus context (theme + Chakra + React Aria i18n) exists for the\n * Nimbus components rendered by this package.\n *\n * NimbusProvider is safe to nest: locale overrides the nearest ancestor, color\n * mode is global, and the Inter font links are deduplicated across instances.\n * That lets each top-level mountable component wrap itself so it works\n * standalone, while still composing cleanly when a host already mounted one.\n */\nexport const EnsureNimbusProvider: React.FC<PropsWithChildren<{ locale?: string }>> = ({\n locale = 'en',\n children,\n}) => <NimbusProvider locale={locale}>{children}</NimbusProvider>;\n","import React from 'react';\nimport { Button, Dialog, Stack, Text } from '@commercetools/nimbus';\n\nexport interface UnsavedChangesDialogProps {\n /** Whether the dialog is visible. */\n isOpen: boolean;\n /** Called when the dialog requests to open/close (backdrop, Esc, Stay). */\n onOpenChange: (isOpen: boolean) => void;\n /** Called when the user confirms they want to leave and discard changes. */\n onConfirm: () => void;\n}\n\n/**\n * Nimbus confirmation shown when the user tries to navigate away from an editor\n * that has unsaved changes. Replaces the native `window.confirm` so the warning\n * matches the rest of the editor chrome.\n */\nexport const UnsavedChangesDialog: React.FC<UnsavedChangesDialogProps> = ({\n isOpen,\n onOpenChange,\n onConfirm,\n}) => (\n <Dialog.Root isOpen={isOpen} onOpenChange={onOpenChange}>\n <Dialog.Content>\n <Dialog.Header>\n <Dialog.Title>Discard unsaved changes?</Dialog.Title>\n <Dialog.CloseTrigger />\n </Dialog.Header>\n <Dialog.Body>\n <Stack direction=\"column\" gap=\"200\">\n <Text>\n You have unsaved changes on this page. If you leave now, those\n changes will be lost.\n </Text>\n </Stack>\n </Dialog.Body>\n <Dialog.Footer>\n <Button slot=\"close\" variant=\"outline\">\n Stay on page\n </Button>\n <Button\n colorPalette=\"critical\"\n onPress={() => {\n onOpenChange(false);\n onConfirm();\n }}\n >\n Leave & discard\n </Button>\n </Dialog.Footer>\n </Dialog.Content>\n </Dialog.Root>\n);\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\n\nconst STORAGE_KEY = 'puck-properties-width';\n\nexport interface PropertiesResizerProps {\n /** Smallest allowed width in px. */\n minWidth?: number;\n /** Largest allowed width in px. */\n maxWidth?: number;\n}\n\ninterface HandleBox {\n top: number;\n left: number;\n height: number;\n}\n\nconst sameBox = (a: HandleBox | null, b: HandleBox | null) =>\n a === b ||\n (!!a && !!b && a.top === b.top && a.left === b.left && a.height === b.height);\n\n/**\n * Draggable divider that resizes the Puck properties (right) panel.\n *\n * Render it as a child of the `.puck-editor-fill` container (a sibling of the\n * Puck editor). It writes the chosen width to a `--puck-properties-width` CSS\n * variable on that container — the grid-template override in\n * ComponentListSearch's injected `<style>` reads it to size only the right\n * column, leaving the left panel and canvas alone. The handle is positioned\n * over the panel's left edge by measuring the live sidebar, and hides itself\n * when the panel is collapsed. The width persists in localStorage.\n */\nexport const PropertiesResizer: React.FC<PropertiesResizerProps> = ({\n minWidth = 240,\n maxWidth = 680,\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n const boxRef = useRef<HandleBox | null>(null);\n const [box, setBox] = useState<HandleBox | null>(null);\n\n const els = useCallback(() => {\n const handle = ref.current;\n const fill = (handle?.closest('.puck-editor-fill') ?? null) as HTMLElement | null;\n const sidebar = (fill?.querySelector('[class*=\"PuckLayout-rightSideBar\"]') ??\n null) as HTMLElement | null;\n return { fill, sidebar };\n }, []);\n\n const measure = useCallback(() => {\n const { fill, sidebar } = els();\n let next: HandleBox | null = null;\n if (fill && sidebar) {\n const fr = fill.getBoundingClientRect();\n const sr = sidebar.getBoundingClientRect();\n // width < 2 ⇒ the panel is collapsed (grid track is 0) — hide the handle.\n if (sr.width >= 2) {\n next = { top: sr.top - fr.top, left: sr.left - fr.left, height: sr.height };\n }\n }\n if (!sameBox(boxRef.current, next)) {\n boxRef.current = next;\n setBox(next);\n }\n }, [els]);\n\n useEffect(() => {\n const { fill, sidebar } = els();\n // Restore the persisted width.\n const saved = Number(localStorage.getItem(STORAGE_KEY));\n if (fill && saved >= minWidth && saved <= maxWidth) {\n fill.style.setProperty('--puck-properties-width', `${saved}px`);\n }\n measure();\n const ro = new ResizeObserver(() => measure());\n if (fill) ro.observe(fill);\n if (sidebar) ro.observe(sidebar);\n window.addEventListener('resize', measure);\n // Re-measure periodically to track panel toggles / Puck remounts cheaply\n // (guarded setState means this only re-renders when geometry changes).\n const interval = window.setInterval(measure, 400);\n return () => {\n ro.disconnect();\n window.removeEventListener('resize', measure);\n window.clearInterval(interval);\n };\n }, [els, measure, minWidth, maxWidth]);\n\n const startDrag = useCallback(\n (e: React.PointerEvent) => {\n e.preventDefault();\n const handle = ref.current;\n const { fill } = els();\n if (!fill || !handle) return;\n\n // Capture the pointer to the handle. The Puck canvas is an <iframe>;\n // without capture, moving the cursor over it routes pointermove/pointerup\n // to the iframe's document and the drag never ends. Capture forces every\n // pointer event to the handle regardless of what's underneath.\n try {\n handle.setPointerCapture(e.pointerId);\n } catch {\n /* ignore — capture is best-effort */\n }\n // Belt-and-suspenders: stop the iframe(s) from swallowing events too.\n const iframes = Array.from(\n fill.querySelectorAll('iframe')\n ) as HTMLIFrameElement[];\n iframes.forEach((f) => (f.style.pointerEvents = 'none'));\n\n const onMove = (ev: PointerEvent) => {\n const fr = fill.getBoundingClientRect();\n const w = Math.max(\n minWidth,\n Math.min(maxWidth, Math.round(fr.right - ev.clientX))\n );\n fill.style.setProperty('--puck-properties-width', `${w}px`);\n measure();\n };\n const onUp = (ev: PointerEvent) => {\n try {\n handle.releasePointerCapture(ev.pointerId);\n } catch {\n /* ignore */\n }\n iframes.forEach((f) => (f.style.pointerEvents = ''));\n const w = parseInt(\n fill.style.getPropertyValue('--puck-properties-width'),\n 10\n );\n if (w) localStorage.setItem(STORAGE_KEY, String(w));\n handle.removeEventListener('pointermove', onMove);\n handle.removeEventListener('pointerup', onUp);\n handle.removeEventListener('pointercancel', onUp);\n document.body.style.userSelect = '';\n document.body.style.cursor = '';\n };\n\n document.body.style.userSelect = 'none';\n document.body.style.cursor = 'col-resize';\n // With pointer capture these fire on the handle even over the iframe.\n handle.addEventListener('pointermove', onMove);\n handle.addEventListener('pointerup', onUp);\n handle.addEventListener('pointercancel', onUp);\n },\n [els, measure, minWidth, maxWidth]\n );\n\n return (\n <div\n ref={ref}\n className=\"puck-props-resizer\"\n onPointerDown={startDrag}\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label=\"Resize properties panel\"\n style={\n box\n ? {\n position: 'absolute',\n top: box.top,\n left: box.left - 3,\n height: box.height,\n width: 7,\n cursor: 'col-resize',\n zIndex: 20,\n touchAction: 'none',\n }\n : { display: 'none' }\n }\n />\n );\n};\n"],"mappings":"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","names":["Button","import_react","import_puck","import_puck_api","import_puck_version_history","import_react","import_jsx_runtime","DOMPurify","import_jsx_runtime","import_jsx_runtime","import_puck","import_jsx_runtime","import_nimbus","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","Button","import_jsx_runtime","import_jsx_runtime","import_puck_api","import_react","import_nimbus","import_nimbus_icons","import_puck_api","import_jsx_runtime","import_jsx_runtime","formatPrice","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_puck_api","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_puck_api","import_jsx_runtime","import_jsx_runtime","import_puck_api","import_jsx_runtime","import_jsx_runtime","import_puck_api","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","Button","React","import_puck","import_nimbus","import_nimbus_icons","import_jsx_runtime","import_react","import_nimbus","import_jsx_runtime","import_react","import_react","import_puck","import_nimbus","import_nimbus_icons","import_puck_version_history","import_jsx_runtime","import_nimbus","import_jsx_runtime","import_nimbus","import_nimbus","import_jsx_runtime","import_jsx_runtime","import_nimbus","import_jsx_runtime","import_react","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/PuckEditor.tsx","../src/config/defaultPuckConfig.ts","../src/fields/fontSizeField.ts","../src/components/Hero.tsx","../src/fields/RichTextField.tsx","../src/utils/sanitizeHtml.ts","../src/components/RichText.tsx","../src/components/Grid.tsx","../src/components/Columns.tsx","../src/fields/ImagePickerField.tsx","../src/components/Image.tsx","../src/components/Button.tsx","../src/components/Card.tsx","../src/components/Spacer.tsx","../src/components/ProductTeaser.tsx","../src/fields/DatasourceField.tsx","../src/components/cms/shared.ts","../src/components/cms/HeroBanner.tsx","../src/components/cms/TextBlock.tsx","../src/components/cms/CategoryGrid.tsx","../src/components/cms/CategoryHero.tsx","../src/components/cms/CheckoutPromoBanner.tsx","../src/components/cms/CountdownBanner.tsx","../src/components/cms/CrossSellBlock.tsx","../src/components/cms/DeliveryMessage.tsx","../src/components/cms/Divider.tsx","../src/components/cms/EmptyState.tsx","../src/components/cms/FAQAccordion.tsx","../src/components/cms/FooterBlock.tsx","../src/components/cms/ImageBlock.tsx","../src/components/cms/NewsletterSignup.tsx","../src/components/cms/ProductBanner.tsx","../src/components/cms/ProductGridHeader.tsx","../src/components/cms/ProductSlider.tsx","../src/components/cms/PromotionalBanner.tsx","../src/components/cms/RelatedProductsSlider.tsx","../src/components/cms/SocialLinks.tsx","../src/components/cms/TabContent.tsx","../src/components/cms/TestimonialsSlider.tsx","../src/components/cms/ThankYouContent.tsx","../src/components/cms/TrustBadges.tsx","../src/components/cms/VideoBlock.tsx","../src/components/cms/WebsiteLogo.tsx","../src/toolbar/EditorToolbar.tsx","../src/toolbar/CreateTemplateDialog.tsx","../src/utils/stripTemplateData.ts","../src/hooks/useDirtyState.ts","../src/overrides/ComponentListSearch.tsx","../src/overrides/NimbusFieldTypes.tsx","../src/EnsureNimbusProvider.tsx","../src/toolbar/UnsavedChangesDialog.tsx","../src/overrides/PropertiesResizer.tsx"],"sourcesContent":["// Main editor component\nexport { PuckEditor } from './PuckEditor';\nexport type { PuckEditorProps } from './PuckEditor';\n\n// Default config (consumers can extend this)\nexport { defaultPuckConfig } from './config/defaultPuckConfig';\n\n// Built-in components (export so consumers can compose custom configs)\nexport {\n Hero,\n RichText,\n Grid,\n Columns,\n Image,\n Button,\n Card,\n Spacer,\n ProductTeaser,\n} from './components';\nexport type {\n HeroProps,\n RichTextProps,\n GridProps,\n ColumnsProps,\n ImageProps,\n ButtonProps,\n CardProps,\n SpacerProps,\n ProductTeaserProps,\n} from './components';\n\n// Custom field components (reuse in your own component configs)\nexport { ImagePickerField } from './fields/ImagePickerField';\nexport type { ImagePickerFieldProps } from './fields/ImagePickerField';\n\nexport { DatasourceField } from './fields/DatasourceField';\nexport type { DatasourceFieldProps, DatasourceValue, DatasourceType } from './fields/DatasourceField';\n\nexport { RichTextField, richTextField } from './fields/RichTextField';\nexport type { RichTextFieldProps } from './fields/RichTextField';\n\nexport { sanitizeHtml } from './utils/sanitizeHtml';\n\n// CMS components\nexport * from './components/cms';\n\n// Toolbar (in case consumers want to render it standalone)\nexport { EditorToolbar } from './toolbar/EditorToolbar';\nexport type { EditorToolbarProps } from './toolbar/EditorToolbar';\n\n// Unsaved-changes navigation guard dialog (Nimbus)\nexport { UnsavedChangesDialog } from './toolbar/UnsavedChangesDialog';\nexport type { UnsavedChangesDialogProps } from './toolbar/UnsavedChangesDialog';\n\n// Create-template dialog (Nimbus) + \"without data\" stripping util\nexport { CreateTemplateDialog } from './toolbar/CreateTemplateDialog';\nexport type { CreateTemplateDialogProps } from './toolbar/CreateTemplateDialog';\nexport { stripPuckDataToTemplate } from './utils/stripTemplateData';\n\n// Dirty-state tracking hook (skips Puck's normalising mount onChange)\nexport { useDirtyState } from './hooks/useDirtyState';\nexport type { DirtyState } from './hooks/useDirtyState';\n\n// Puck overrides — component search panel and filter (reusable in any Puck editor)\nexport {\n ComponentSearchProvider,\n ComponentsPanel,\n ComponentItemFilter,\n} from './overrides/ComponentListSearch';\n\n// Nimbus-styled field-type overrides (text/textarea/select/radio inputs)\nexport { nimbusFieldTypes } from './overrides/NimbusFieldTypes';\n\n// Draggable resize handle for the properties (right) panel\nexport { PropertiesResizer } from './overrides/PropertiesResizer';\nexport type { PropertiesResizerProps } from './overrides/PropertiesResizer';\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { Puck, type Config, type Data } from '@measured/puck';\nimport '@measured/puck/puck.css';\nimport {\n PuckApiProvider,\n usePuckPage,\n usePuckTemplates,\n} from '@commercetools-demo/puck-api';\nimport type { PuckData } from '@commercetools-demo/puck-types';\nimport type { PuckPageVersionEntry } from '@commercetools-demo/puck-types';\nimport {\n VersionHistoryProvider,\n VersionPreviewBanner,\n VersionAwareFieldsPanel,\n VersionHistoryButton,\n useVersionHistoryPanel,\n useVersionDiff,\n} from '@commercetools-demo/puck-version-history';\nimport { defaultPuckConfig } from './config/defaultPuckConfig';\nimport { EditorToolbar } from './toolbar/EditorToolbar';\nimport { CreateTemplateDialog } from './toolbar/CreateTemplateDialog';\nimport { stripPuckDataToTemplate } from './utils/stripTemplateData';\nimport { useDirtyState } from './hooks/useDirtyState';\nimport {\n ComponentSearchProvider,\n ComponentsPanel,\n ComponentItemFilter,\n} from './overrides/ComponentListSearch';\nimport { nimbusFieldTypes } from './overrides/NimbusFieldTypes';\nimport { Stack } from '@commercetools/nimbus';\nimport { EnsureNimbusProvider } from './EnsureNimbusProvider';\n\n// ---------------------------------------------------------------------------\n// Inner component (uses context from PuckApiProvider)\n// ---------------------------------------------------------------------------\n\ninterface PuckEditorInnerProps {\n pageKey: string;\n config: Config;\n onPublish?: (puckData: PuckData) => void;\n onSave?: (puckData: PuckData) => void;\n onError?: (error: Error) => void;\n /** Opens the preview view; when omitted the Preview button is hidden. */\n onPreview?: () => void;\n /** Notifies the host when the unsaved-changes state flips (for nav guards). */\n onDirtyChange?: (isDirty: boolean) => void;\n showPublishButton: boolean;\n autoSaveDebounceMs: number;\n}\n\nconst PuckEditorInner: React.FC<PuckEditorInnerProps> = ({\n pageKey,\n config,\n onPublish,\n onSave,\n onError,\n onPreview,\n onDirtyChange,\n showPublishButton,\n autoSaveDebounceMs: _autoSaveDebounceMs,\n}) => {\n const {\n page,\n states,\n versions,\n saving,\n loading,\n error,\n saveDraft,\n publish,\n revertToPublished,\n loadVersions,\n } = usePuckPage(pageKey);\n\n const { createTemplate } = usePuckTemplates('page');\n\n const latestDataRef = useRef<Data | null>(null);\n const [isApplyingVersion, setIsApplyingVersion] = useState(false);\n // Bumped on revert so the Puck canvas remounts and re-reads the restored data.\n const [reloadNonce, setReloadNonce] = useState(0);\n // \"Create template from this page\" dialog.\n const [templateDialogOpen, setTemplateDialogOpen] = useState(false);\n const [templateSaving, setTemplateSaving] = useState(false);\n\n // Current live data (draft preferred, fallback to page value)\n const currentData: PuckData =\n states.draft?.puckData ??\n page?.puckData ?? {\n content: [],\n root: { props: {} },\n };\n\n // Version history panel state\n const versionHistory = useVersionHistoryPanel({\n versions: versions as PuckPageVersionEntry[],\n loadVersions,\n currentData,\n });\n\n // Unsaved-changes tracking — keyed so a new page / version / revert gets a\n // fresh baseline (and ignores Puck's normalising onChange on mount).\n const canvasKey = `${pageKey}:${versionHistory.selectedVersionId ?? 'current'}:${reloadNonce}`;\n const { isDirty: hasUnsavedChanges, markChange, markSaved } =\n useDirtyState(canvasKey);\n\n // Surface the dirty flag to the host (page-manager) for its nav guard.\n useEffect(() => {\n onDirtyChange?.(hasUnsavedChanges);\n }, [hasUnsavedChanges, onDirtyChange]);\n\n // Diff between selected historical version and current draft\n const diff = useVersionDiff(\n versionHistory.previewData,\n currentData\n );\n\n // Ref so handleChange can read the latest preview state without stale closure\n const isPreviewingRef = useRef(false);\n isPreviewingRef.current = versionHistory.isPreviewingHistory;\n\n // -------------------------------------------------------------------------\n // Normal editor handlers\n // -------------------------------------------------------------------------\n\n const handleChange = useCallback(\n (data: Data) => {\n if (isPreviewingRef.current) return;\n latestDataRef.current = data;\n markChange(data);\n },\n [markChange]\n );\n\n const handleSave = useCallback(async () => {\n const data = latestDataRef.current;\n if (!data) return;\n try {\n await saveDraft(data as PuckData);\n markSaved(data);\n onSave?.(data as PuckData);\n } catch (err) {\n onError?.(err as Error);\n }\n }, [saveDraft, onSave, onError, markSaved]);\n\n const handlePublish = useCallback(async () => {\n try {\n // Publish whatever is currently *saved* as the draft — never the\n // (possibly unsaved) live canvas. The service publishes the persisted\n // page value, so we must not write the canvas here; doing so was what\n // overwrote saved content with stale data on publish.\n await publish(false);\n onPublish?.(currentData);\n } catch (err) {\n onError?.(err as Error);\n }\n }, [publish, onPublish, currentData, onError]);\n\n const handleRevert = useCallback(async () => {\n try {\n await revertToPublished();\n // Force the canvas to remount so it shows the restored published data,\n // and reset the dirty baseline via the changed canvasKey.\n setReloadNonce((n) => n + 1);\n } catch (err) {\n onError?.(err as Error);\n }\n }, [revertToPublished, onError]);\n\n // -------------------------------------------------------------------------\n // Version history handlers\n // -------------------------------------------------------------------------\n\n const handleApplyVersion = useCallback(async () => {\n const versionData = versionHistory.previewData;\n if (!versionData) return;\n setIsApplyingVersion(true);\n try {\n await saveDraft(versionData);\n markSaved(versionData);\n onSave?.(versionData);\n versionHistory.clearSelection();\n } catch (err) {\n onError?.(err as Error);\n } finally {\n setIsApplyingVersion(false);\n }\n }, [versionHistory, saveDraft, onSave, onError, markSaved]);\n\n // -------------------------------------------------------------------------\n // Create template from this page\n // -------------------------------------------------------------------------\n\n const handleCreateTemplate = useCallback(\n async (name: string, withoutData: boolean) => {\n // Prefer the live canvas (may hold unsaved edits); fall back to saved data.\n const source = (latestDataRef.current as PuckData | null) ?? currentData;\n const puckData = withoutData\n ? (stripPuckDataToTemplate(source as Data, config) as PuckData)\n : source;\n setTemplateSaving(true);\n try {\n await createTemplate({ name, kind: 'page', puckData });\n setTemplateDialogOpen(false);\n } catch (err) {\n onError?.(err as Error);\n } finally {\n setTemplateSaving(false);\n }\n },\n [createTemplate, currentData, config, onError]\n );\n\n // -------------------------------------------------------------------------\n // Loading / error states\n // -------------------------------------------------------------------------\n\n if (loading) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100vh',\n fontSize: '16px',\n color: 'var(--puck-color-grey-07)',\n }}\n >\n Loading editor…\n </div>\n );\n }\n\n if (error) {\n return (\n <div\n style={{\n padding: '32px',\n color: 'var(--puck-color-red-07)',\n border: '1px solid var(--puck-color-red-04)',\n borderRadius: '8px',\n margin: '16px',\n }}\n >\n <strong>Error loading page:</strong> {error}\n </div>\n );\n }\n\n // Data shown in the Puck canvas — historical preview takes precedence\n const activeData: PuckData = versionHistory.previewData ?? currentData;\n\n return (\n <VersionHistoryProvider\n diff={diff}\n isPreviewingHistory={versionHistory.isPreviewingHistory}\n versions={versions as PuckPageVersionEntry[]}\n isLoadingVersions={versionHistory.isLoadingVersions}\n selectedVersionId={versionHistory.selectedVersionId}\n isApplying={isApplyingVersion}\n onVersionSelect={versionHistory.selectVersion}\n onApply={() => void handleApplyVersion()}\n onDiscard={versionHistory.clearSelection}\n onLoadVersions={versionHistory.openPanel}\n >\n <ComponentSearchProvider>\n <Puck\n key={`${versionHistory.selectedVersionId ?? 'current'}:${reloadNonce}`}\n config={config}\n data={activeData as Data}\n onChange={handleChange}\n onPublish={() => void handlePublish()}\n overrides={{\n fieldTypes: nimbusFieldTypes,\n header: () =>\n versionHistory.isPreviewingHistory ? (\n <Stack\n gridArea=\"header\"\n direction=\"row\"\n gap=\"200\"\n alignItems=\"center\"\n justifyContent=\"flex-end\"\n padding=\"200\"\n >\n <VersionPreviewBanner\n timestamp={versionHistory.selectedVersion!.timestamp}\n onApply={() => void handleApplyVersion()}\n onDiscard={versionHistory.clearSelection}\n isApplying={isApplyingVersion}\n />\n <VersionHistoryButton disabled={isApplyingVersion} />\n </Stack>\n ) : (\n <EditorToolbar\n title={page?.name ?? pageKey}\n saving={saving}\n isDirty={hasUnsavedChanges}\n states={states}\n onSave={() => void handleSave()}\n onPublish={() => void handlePublish()}\n onRevert={() => void handleRevert()}\n onPreview={onPreview}\n onCreateTemplate={() => setTemplateDialogOpen(true)}\n showPublishButton={showPublishButton}\n />\n ),\n components: ({ children }) => <ComponentsPanel>{children}</ComponentsPanel>,\n componentItem: ({ children, name }) => (\n <ComponentItemFilter name={name}>{children}</ComponentItemFilter>\n ),\n fields: ({ children, isLoading }) => (\n <VersionAwareFieldsPanel isLoading={isLoading}>\n {children}\n </VersionAwareFieldsPanel>\n ),\n }}\n />\n <CreateTemplateDialog\n isOpen={templateDialogOpen}\n onOpenChange={(open) => setTemplateDialogOpen(open)}\n onConfirm={handleCreateTemplate}\n saving={templateSaving}\n />\n </ComponentSearchProvider>\n </VersionHistoryProvider>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Public component (self-contained, wraps PuckApiProvider)\n// ---------------------------------------------------------------------------\n\nexport interface PuckEditorProps {\n /** Service base URL, e.g. \"http://localhost:8080\" */\n baseURL: string;\n /** CommerceTools project key */\n projectKey: string;\n /** Business unit key */\n businessUnitKey: string;\n /** JWT bearer token — required for save/publish mutations */\n jwtToken: string;\n /** Content locale (e.g. \"en-US\") used for locale-aware calls like product search */\n locale?: string;\n /** The key of the puck page to edit */\n pageKey: string;\n /**\n * Puck component config.\n * Defaults to `defaultPuckConfig` (all built-in components).\n * Consumers can extend or replace.\n */\n config?: Config;\n /** Called after a successful publish */\n onPublish?: (puckData: PuckData) => void;\n /** Called after each save */\n onSave?: (puckData: PuckData) => void;\n /** Called when an error occurs */\n onError?: (error: Error) => void;\n /** Opens the preview view; when omitted the toolbar Preview button is hidden. */\n onPreview?: () => void;\n /** Notifies the host when the unsaved-changes state flips (for nav guards). */\n onDirtyChange?: (isDirty: boolean) => void;\n /** Show the Publish button in the toolbar. Default: true */\n showPublishButton?: boolean;\n /** Debounce delay for auto-save in ms. Default: 1500 */\n autoSaveDebounceMs?: number;\n}\n\nexport const PuckEditor: React.FC<PuckEditorProps> = ({\n baseURL,\n projectKey,\n businessUnitKey,\n jwtToken,\n locale,\n pageKey,\n config = defaultPuckConfig,\n onPublish,\n onSave,\n onError,\n onPreview,\n onDirtyChange,\n showPublishButton = true,\n autoSaveDebounceMs = 1500,\n}) => {\n return (\n <PuckApiProvider\n baseURL={baseURL}\n projectKey={projectKey}\n businessUnitKey={businessUnitKey}\n jwtToken={jwtToken}\n locale={locale}\n >\n <EnsureNimbusProvider locale={locale}>\n <PuckEditorInner\n pageKey={pageKey}\n config={config}\n onPublish={onPublish}\n onSave={onSave}\n onError={onError}\n onPreview={onPreview}\n onDirtyChange={onDirtyChange}\n showPublishButton={showPublishButton}\n autoSaveDebounceMs={autoSaveDebounceMs}\n />\n </EnsureNimbusProvider>\n </PuckApiProvider>\n );\n};\n","import React from 'react';\nimport { type Config } from '@measured/puck';\nimport { Hero } from '../components/Hero';\nimport { RichText } from '../components/RichText';\nimport { Grid } from '../components/Grid';\nimport { Columns } from '../components/Columns';\nimport { Image } from '../components/Image';\nimport { Button } from '../components/Button';\nimport { Card } from '../components/Card';\nimport { Spacer } from '../components/Spacer';\nimport { ProductTeaser } from '../components/ProductTeaser';\nimport {\n HeroBanner, TextBlock, CategoryGrid, CategoryHero,\n CheckoutPromoBanner, CountdownBanner, CrossSellBlock, DeliveryMessage,\n Divider, EmptyState, FAQAccordion, FooterBlock, ImageBlock,\n NewsletterSignup, ProductBanner, ProductGridHeader, ProductSlider,\n PromotionalBanner, RelatedProductsSlider, SocialLinks, TabContent,\n TestimonialsSlider, ThankYouContent, TrustBadges, VideoBlock, WebsiteLogo,\n} from '../components/cms';\n\n/**\n * Page content-width scale. `X` is the base column unit; each step doubles up\n * to a wide layout, and `full` removes the constraint (edge-to-edge).\n */\ntype ContentWidth = 'x' | '2x' | '3x' | '4x' | '5x' | '6x' | 'full';\n\nconst CONTENT_WIDTHS: Record<ContentWidth, string> = {\n x: '256px',\n '2x': '512px',\n '3x': '768px',\n '4x': '1024px',\n '5x': '1280px',\n '6x': '1536px',\n full: '100%',\n};\n\n/**\n * Default Puck configuration with built-in components.\n *\n * Consumers can extend this:\n * ```ts\n * import { defaultPuckConfig } from '@commercetools-demo/puck-editor';\n * const myConfig = {\n * ...defaultPuckConfig,\n * components: { ...defaultPuckConfig.components, MyComponent },\n * };\n * ```\n */\nexport const defaultPuckConfig: Config = {\n components: {\n Hero,\n RichText,\n Grid,\n Columns,\n Image,\n Button,\n Card,\n Spacer,\n ProductTeaser,\n // CMS components\n HeroBanner, TextBlock, CategoryGrid, CategoryHero,\n CheckoutPromoBanner, CountdownBanner, CrossSellBlock, DeliveryMessage,\n Divider, EmptyState, FAQAccordion, FooterBlock, ImageBlock,\n NewsletterSignup, ProductBanner, ProductGridHeader, ProductSlider,\n PromotionalBanner, RelatedProductsSlider, SocialLinks, TabContent,\n TestimonialsSlider, ThankYouContent, TrustBadges, VideoBlock, WebsiteLogo,\n },\n // Plain-language groups so the component panel reads cleanly for non-technical\n // authors. Common groups are expanded; the rest start collapsed. Deprecated\n // components live in a hidden category (still render, just not offered).\n categories: {\n layout: {\n title: 'Layout',\n defaultExpanded: false,\n components: ['Grid', 'Card', 'Spacer', 'Divider', 'Columns'],\n },\n text: {\n title: 'Text & Content',\n defaultExpanded: false,\n components: ['RichText', 'TextBlock', 'FAQAccordion', 'TabContent'],\n },\n media: {\n title: 'Media',\n defaultExpanded: false,\n components: ['Image', 'ImageBlock', 'VideoBlock', 'WebsiteLogo'],\n },\n heroBanners: {\n title: 'Hero & Banners',\n defaultExpanded: false,\n components: [\n 'Hero', 'HeroBanner', 'PromotionalBanner', 'CountdownBanner',\n 'CategoryHero', 'CheckoutPromoBanner', 'ProductBanner',\n ],\n },\n products: {\n title: 'Products',\n defaultExpanded: false,\n components: [\n 'ProductTeaser', 'ProductSlider', 'ProductGridHeader',\n 'RelatedProductsSlider', 'CrossSellBlock', 'CategoryGrid',\n ],\n },\n actions: {\n title: 'Buttons & Forms',\n defaultExpanded: false,\n components: ['Button', 'NewsletterSignup'],\n },\n socialProof: {\n title: 'Social Proof & Info',\n defaultExpanded: false,\n components: ['TestimonialsSlider', 'TrustBadges', 'SocialLinks', 'DeliveryMessage'],\n },\n sections: {\n title: 'Page Sections',\n defaultExpanded: false,\n components: ['FooterBlock', 'EmptyState', 'ThankYouContent'],\n },\n // Anything not explicitly categorised (e.g. future components) still shows.\n other: {\n title: 'Other',\n },\n },\n root: {\n fields: {\n title: { type: 'text', label: 'Page Title' },\n backgroundColor: { type: 'text', label: 'Background Color (CSS)' },\n contentWidth: {\n type: 'select',\n label: 'Content Width',\n options: [\n { label: 'X', value: 'x' },\n { label: '2X', value: '2x' },\n { label: '3X', value: '3x' },\n { label: '4X', value: '4x' },\n { label: '5X', value: '5x' },\n { label: '6X', value: '6x' },\n { label: 'Full width', value: 'full' },\n ],\n },\n },\n defaultProps: {\n title: 'New Page',\n backgroundColor: '#ffffff',\n // Default to full-bleed so existing pages render unchanged.\n contentWidth: 'full',\n },\n render: ({ children, backgroundColor, contentWidth }) => {\n const maxWidth = CONTENT_WIDTHS[contentWidth as ContentWidth] ?? '100%';\n const isConstrained = maxWidth !== '100%';\n return React.createElement(\n 'div',\n {\n style: {\n background: backgroundColor ?? '#ffffff',\n minHeight: '100vh',\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n },\n },\n React.createElement(\n 'div',\n {\n style: {\n maxWidth,\n // Centre the content column and give it breathing room on the\n // sides when its width is constrained.\n margin: '0 auto',\n paddingLeft: isConstrained ? '24px' : undefined,\n paddingRight: isConstrained ? '24px' : undefined,\n boxSizing: 'border-box',\n },\n },\n children\n )\n );\n },\n },\n};\n","import type { Field } from '@measured/puck';\n\n/**\n * Reusable font-size control for plain-text component props (headings, labels,\n * etc.). This covers the text elements that aren't edited through the rich-text\n * editor (the Nimbus RichTextInput has no inline font-size control).\n *\n * The stored value is a CSS size string (e.g. \"1.5rem\"); the empty option means\n * \"inherit the component default\", so render with `value || defaultSize`.\n */\nconst FONT_SIZE_OPTIONS = [\n { label: 'Default', value: '' },\n { label: 'Small (0.875rem)', value: '0.875rem' },\n { label: 'Medium (1rem)', value: '1rem' },\n { label: 'Large (1.25rem)', value: '1.25rem' },\n { label: 'X-Large (1.5rem)', value: '1.5rem' },\n { label: '2X-Large (2rem)', value: '2rem' },\n { label: '3X-Large (2.5rem)', value: '2.5rem' },\n { label: '4X-Large (3rem)', value: '3rem' },\n];\n\nexport const FONT_SIZE_FIELD = (label: string): Field => ({\n type: 'select',\n label,\n options: FONT_SIZE_OPTIONS,\n});\n","import React from 'react';\nimport type { ComponentConfig } from '@measured/puck';\nimport { FONT_SIZE_FIELD } from '../fields/fontSizeField';\n\nexport interface HeroProps {\n heading: string;\n headingFontSize?: string;\n subheading?: string;\n subheadingFontSize?: string;\n backgroundImage?: string;\n ctaText?: string;\n ctaUrl?: string;\n layout?: 'centered' | 'left-aligned';\n minHeight?: string;\n}\n\nexport const Hero: ComponentConfig<HeroProps> = {\n label: 'Hero',\n fields: {\n heading: { type: 'text', label: 'Heading' },\n headingFontSize: FONT_SIZE_FIELD('Heading Font Size'),\n subheading: { type: 'textarea', label: 'Subheading' },\n subheadingFontSize: FONT_SIZE_FIELD('Subheading Font Size'),\n backgroundImage: { type: 'text', label: 'Background Image URL' },\n ctaText: { type: 'text', label: 'CTA Button Text' },\n ctaUrl: { type: 'text', label: 'CTA Button URL' },\n layout: {\n type: 'select',\n label: 'Layout',\n options: [\n { value: 'centered', label: 'Centered' },\n { value: 'left-aligned', label: 'Left Aligned' },\n ],\n },\n minHeight: { type: 'text', label: 'Min Height (CSS, e.g. 400px)' },\n },\n defaultProps: {\n heading: 'Welcome',\n layout: 'centered',\n minHeight: '400px',\n },\n render: ({\n heading,\n headingFontSize,\n subheading,\n subheadingFontSize,\n backgroundImage,\n ctaText,\n ctaUrl,\n layout,\n minHeight,\n }) => {\n const isCenter = layout !== 'left-aligned';\n return (\n <section\n style={{\n position: 'relative',\n minHeight: minHeight ?? '400px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: isCenter ? 'center' : 'flex-start',\n padding: '48px 32px',\n backgroundImage: backgroundImage\n ? `url(${backgroundImage})`\n : undefined,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n backgroundColor: backgroundImage ? undefined : '#1a1a2e',\n color: '#fff',\n boxSizing: 'border-box',\n }}\n >\n {backgroundImage && (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n background: 'rgba(0,0,0,0.45)',\n }}\n />\n )}\n <div\n style={{\n position: 'relative',\n maxWidth: '720px',\n textAlign: isCenter ? 'center' : 'left',\n }}\n >\n <h1 style={{ margin: '0 0 16px', fontSize: headingFontSize || '2.5rem', fontWeight: 700 }}>\n {heading}\n </h1>\n {subheading && (\n <p style={{ margin: '0 0 24px', fontSize: subheadingFontSize || '1.2rem', opacity: 0.85 }}>\n {subheading}\n </p>\n )}\n {ctaText && ctaUrl && (\n <a\n href={ctaUrl}\n style={{\n display: 'inline-block',\n padding: '12px 28px',\n background: '#e94560',\n color: '#fff',\n borderRadius: '4px',\n textDecoration: 'none',\n fontWeight: 600,\n }}\n >\n {ctaText}\n </a>\n )}\n </div>\n </section>\n );\n },\n};\n","import React from 'react';\nimport { type CustomField } from '@measured/puck';\nimport { RichTextInput } from '@commercetools/nimbus';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface RichTextFieldProps {\n /** HTML string. */\n value: string | undefined;\n onChange: (value: string) => void;\n}\n\n// ---------------------------------------------------------------------------\n// RichTextField — custom Puck field component (HTML in / HTML out)\n//\n// Thin wrapper around Nimbus `RichTextInput`, which accepts and emits HTML\n// strings (converting to/from its internal Slate representation). The props\n// contract is unchanged, so every consumer (the RichText block and the cms/*\n// components) keeps working without modification, and stored page data needs\n// no migration.\n// ---------------------------------------------------------------------------\n\nexport const RichTextField: React.FC<RichTextFieldProps> = ({ value, onChange }) => (\n <RichTextInput\n value={value ?? ''}\n onChange={onChange}\n placeholder=\"Start typing…\"\n />\n);\n\n/**\n * Puck `custom` field config that renders a rich-text editor (HTML in / out).\n * Use in a component's `fields` for any prop that holds an HTML string, e.g.\n * fields: { body: richTextField('Body') }\n */\nexport const richTextField = (label: string): CustomField<string> => ({\n type: 'custom',\n label,\n render: ({ value, onChange }) => (\n <RichTextField value={value} onChange={onChange} />\n ),\n});\n","import DOMPurify from 'isomorphic-dompurify';\n\n/**\n * Sanitize rich-text HTML before it is injected via dangerouslySetInnerHTML.\n *\n * RichText/TextBlock/Card store author-controlled HTML produced by the TipTap\n * editor, but content can also arrive from imports or older data, so we always\n * sanitize at render time. isomorphic-dompurify works in both the browser and\n * during SSR, so this is safe wherever the renderer runs.\n *\n * `style` and `class` are allowed because the editor emits inline styles\n * (e.g. font-size from the typography control) and structural classes.\n */\nexport const sanitizeHtml = (html: string | undefined | null): string => {\n if (!html) return '';\n return DOMPurify.sanitize(html, {\n USE_PROFILES: { html: true },\n ADD_ATTR: ['target', 'rel'],\n });\n};\n","import React from 'react';\nimport type { ComponentConfig } from '@measured/puck';\nimport { RichTextField } from '../fields/RichTextField';\nimport { sanitizeHtml } from '../utils/sanitizeHtml';\n\nexport interface RichTextProps {\n content: string;\n align?: 'left' | 'center' | 'right';\n maxWidth?: string;\n padding?: string;\n}\n\nexport const RichText: ComponentConfig<RichTextProps> = {\n label: 'Rich Text',\n fields: {\n content: {\n type: 'custom',\n label: 'Content',\n render: ({ value, onChange }) => (\n <RichTextField value={value as string} onChange={onChange} />\n ),\n },\n align: {\n type: 'select',\n label: 'Text Alignment',\n options: [\n { value: 'left', label: 'Left' },\n { value: 'center', label: 'Center' },\n { value: 'right', label: 'Right' },\n ],\n },\n maxWidth: { type: 'text', label: 'Max Width (CSS)' },\n padding: { type: 'text', label: 'Padding (CSS)' },\n },\n defaultProps: {\n content: '<p>Add your content here…</p>',\n align: 'left',\n padding: '32px',\n },\n render: ({ content, align, maxWidth, padding }) => (\n <div\n style={{\n padding: padding ?? '32px',\n textAlign: align ?? 'left',\n maxWidth: maxWidth,\n margin: maxWidth ? '0 auto' : undefined,\n boxSizing: 'border-box',\n }}\n // HTML from the rich-text editor, sanitized before injection\n dangerouslySetInnerHTML={{ __html: sanitizeHtml(content) }}\n />\n ),\n};\n","import React from 'react';\nimport { DropZone, type ComponentConfig } from '@measured/puck';\n\nexport interface GridProps {\n columnCount?: 1 | 2 | 3 | 4 | 5 | 6;\n rowCount?: 1 | 2 | 3 | 4 | 5 | 6;\n gap?: string;\n padding?: string;\n}\n\nconst COUNT_OPTIONS = [1, 2, 3, 4, 5, 6].map((n) => ({\n value: n,\n label: String(n),\n}));\n\n/**\n * Grid — a layout container that lays out a `columnCount` × `rowCount` matrix\n * of drop zones. Each cell is an independent Puck DropZone, so components can be\n * dropped into any cell. (Renamed from \"Columns\"; rows added.)\n *\n * This render function is shared by the editor and the Puck renderer\n * (puck-renderer runs the same config), so updating it here updates both.\n */\nexport const Grid: ComponentConfig<GridProps> = {\n label: 'Grid',\n fields: {\n columnCount: {\n type: 'select',\n label: 'Number of Columns',\n options: COUNT_OPTIONS,\n },\n rowCount: {\n type: 'select',\n label: 'Number of Rows',\n options: COUNT_OPTIONS,\n },\n gap: { type: 'text', label: 'Gap (CSS)' },\n padding: { type: 'text', label: 'Padding (CSS)' },\n },\n defaultProps: {\n columnCount: 2,\n rowCount: 1,\n gap: '16px',\n padding: '16px',\n },\n render: ({ columnCount = 2, rowCount = 1, gap = '16px', padding = '16px' }) => {\n const cols = Math.max(1, columnCount);\n const rows = Math.max(1, rowCount);\n const cells = Array.from({ length: cols * rows }, (_, i) => i);\n return (\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: `repeat(${cols}, 1fr)`,\n gridTemplateRows: `repeat(${rows}, minmax(40px, auto))`,\n gap,\n padding,\n boxSizing: 'border-box',\n }}\n >\n {cells.map((i) => (\n <div key={i}>\n {/* Cells are indexed row-major: cell-0 = row 0 col 0, etc. */}\n <DropZone zone={`cell-${i}`} />\n </div>\n ))}\n </div>\n );\n },\n};\n","import React from 'react';\nimport { DropZone, type ComponentConfig } from '@measured/puck';\n\nexport interface ColumnsProps {\n columnCount?: 2 | 3 | 4;\n gap?: string;\n padding?: string;\n}\n\n/**\n * @deprecated Use `Grid` instead (columns + rows). `Columns` is kept registered\n * for backward compatibility so pages saved with the original component (and its\n * `column-N` drop zones) keep rendering. Prefer Grid for new content.\n */\nexport const Columns: ComponentConfig<ColumnsProps> = {\n label: 'Columns',\n fields: {\n columnCount: {\n type: 'select',\n label: 'Number of Columns',\n options: [\n { value: 2, label: '2 Columns' },\n { value: 3, label: '3 Columns' },\n { value: 4, label: '4 Columns' },\n ],\n },\n gap: { type: 'text', label: 'Column Gap (CSS)' },\n padding: { type: 'text', label: 'Padding (CSS)' },\n },\n defaultProps: {\n columnCount: 2,\n gap: '16px',\n padding: '16px',\n },\n render: ({ columnCount = 2, gap = '16px', padding = '16px' }) => {\n const cols = Array.from({ length: columnCount }, (_, i) => i);\n return (\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: `repeat(${columnCount}, 1fr)`,\n gap,\n padding,\n boxSizing: 'border-box',\n }}\n >\n {cols.map((i) => (\n <div key={i}>\n <DropZone zone={`column-${i}`} />\n </div>\n ))}\n </div>\n );\n },\n};\n","import React, {\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { useMediaLibrary } from '@commercetools-demo/puck-api';\nimport type { MediaFile } from '@commercetools-demo/puck-types';\nimport {\n Button,\n FormField,\n Icon,\n IconButton,\n LoadingSpinner,\n Stack,\n Text,\n TextInput,\n} from '@commercetools/nimbus';\nimport { Close } from '@commercetools/nimbus-icons';\n\n// ---------------------------------------------------------------------------\n// Upload modal\n// ---------------------------------------------------------------------------\n\ninterface UploadModalProps {\n uploading: boolean;\n error: string | null;\n onUpload: (file: File, title: string, description: string) => void;\n onClose: () => void;\n}\n\nconst UploadModal: React.FC<UploadModalProps> = ({\n uploading,\n error,\n onUpload,\n onClose,\n}) => {\n const [file, setFile] = useState<File | null>(null);\n const [title, setTitle] = useState('');\n const [description, setDescription] = useState('');\n const [dragging, setDragging] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const handleFile = (f: File) => {\n setFile(f);\n if (!title) setTitle(f.name);\n };\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n setDragging(false);\n const f = e.dataTransfer.files[0];\n if (f) handleFile(f);\n };\n\n return (\n <div\n style={{\n position: 'fixed',\n inset: 0,\n background: 'rgba(0,0,0,0.5)',\n zIndex: 9999,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n onClick={(e) => e.target === e.currentTarget && onClose()}\n >\n <div\n style={{\n background: '#fff',\n borderRadius: '8px',\n width: '640px',\n maxWidth: '95vw',\n maxHeight: '85vh',\n display: 'flex',\n flexDirection: 'column',\n boxShadow: '0 20px 60px rgba(0,0,0,0.3)',\n }}\n >\n {/* Header */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '16px 20px',\n borderBottom: '1px solid #e5e7eb',\n }}\n >\n <Text as=\"h4\" fontSize=\"xl\" fontWeight=\"700\">Upload a file</Text>\n <IconButton aria-label=\"Close\" variant=\"ghost\" size=\"xs\" onPress={onClose}>\n <Close />\n </IconButton>\n </div>\n\n {/* Body */}\n <div style={{ flex: 1, overflow: 'auto', padding: '20px' }}>\n <Stack direction=\"column\" gap=\"400\">\n <FormField.Root>\n <FormField.Label>Title</FormField.Label>\n <FormField.Input>\n <TextInput\n value={title}\n onChange={(value) => setTitle(value)}\n placeholder=\"File title\"\n />\n </FormField.Input>\n </FormField.Root>\n <FormField.Root>\n <FormField.Label>Description</FormField.Label>\n <FormField.Input>\n <TextInput\n value={description}\n onChange={(value) => setDescription(value)}\n placeholder=\"Optional description\"\n />\n </FormField.Input>\n </FormField.Root>\n <div\n style={{\n border: dragging ? '2px dashed #3b82f6' : '2px dashed #d1d5db',\n borderRadius: '6px',\n padding: '24px',\n textAlign: 'center',\n cursor: 'pointer',\n color: dragging ? '#3b82f6' : '#6b7280',\n fontSize: '13px',\n transition: 'border-color .2s',\n }}\n onClick={() => inputRef.current?.click()}\n onDragOver={(e) => { e.preventDefault(); setDragging(true); }}\n onDragLeave={() => setDragging(false)}\n onDrop={handleDrop}\n >\n {file ? (\n <>\n <div>📎 {file.name}</div>\n <div style={{ fontSize: '11px', marginTop: '4px', color: '#9ca3af' }}>\n {(file.size / 1024).toFixed(0)} KB\n </div>\n </>\n ) : (\n <div>📁 Click or drag & drop to select a file</div>\n )}\n <input\n ref={inputRef}\n type=\"file\"\n accept=\"image/*\"\n style={{ display: 'none' }}\n onChange={(e) => {\n const f = e.target.files?.[0];\n if (f) handleFile(f);\n }}\n />\n </div>\n {error && <Text color=\"critical.11\">{error}</Text>}\n </Stack>\n </div>\n\n {/* Footer */}\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '12px 20px',\n borderTop: '1px solid #e5e7eb',\n gap: '12px',\n }}\n >\n <Text fontSize=\"sm\" color=\"neutral.11\" truncate>\n {file?.name ?? 'No file selected'}\n </Text>\n <Stack direction=\"row\" gap=\"200\">\n <Button variant=\"outline\" onPress={onClose}>Cancel</Button>\n <Button\n variant=\"solid\"\n isDisabled={!file || uploading}\n onPress={() => file && onUpload(file, title, description)}\n >\n {uploading ? 'Uploading…' : 'Upload'}\n </Button>\n </Stack>\n </div>\n </div>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Library modal\n// ---------------------------------------------------------------------------\n\ninterface LibraryModalProps {\n files: MediaFile[];\n pagination: { currentPage: number; totalPages: number };\n loading: boolean;\n error: string | null;\n onNextPage: () => void;\n onPrevPage: () => void;\n onSelect: (file: MediaFile) => void;\n onClose: () => void;\n}\n\nconst LibraryModal: React.FC<LibraryModalProps> = ({\n files,\n pagination,\n loading,\n error,\n onNextPage,\n onPrevPage,\n onSelect,\n onClose,\n}) => {\n const [selected, setSelected] = useState<MediaFile | null>(null);\n\n const handleConfirm = () => {\n if (selected) onSelect(selected);\n };\n\n return (\n <div\n style={{\n position: 'fixed',\n inset: 0,\n background: 'rgba(0,0,0,0.5)',\n zIndex: 9999,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n onClick={(e) => e.target === e.currentTarget && onClose()}\n >\n <div\n style={{\n background: '#fff',\n borderRadius: '8px',\n width: '640px',\n maxWidth: '95vw',\n maxHeight: '85vh',\n display: 'flex',\n flexDirection: 'column',\n boxShadow: '0 20px 60px rgba(0,0,0,0.3)',\n }}\n >\n {/* Header */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '16px 20px',\n borderBottom: '1px solid #e5e7eb',\n }}\n >\n <Text as=\"h4\" fontSize=\"xl\" fontWeight=\"700\">Select from Media Library</Text>\n <IconButton aria-label=\"Close\" variant=\"ghost\" size=\"xs\" onPress={onClose}>\n <Close />\n </IconButton>\n </div>\n\n {/* Body */}\n <div style={{ flex: 1, overflow: 'auto', padding: '20px' }}>\n {loading ? (\n <div style={{ display: 'flex', justifyContent: 'center', padding: '32px' }}>\n <LoadingSpinner />\n </div>\n ) : files.length === 0 ? (\n <Text color=\"neutral.11\">No files found.</Text>\n ) : (\n <Stack direction=\"column\" gap=\"400\">\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(110px, 1fr))',\n gap: '12px',\n }}\n >\n {files.map((file) => (\n <div\n key={file.url}\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n cursor: 'pointer',\n border: `2px solid ${selected?.url === file.url ? '#3b82f6' : 'transparent'}`,\n borderRadius: '6px',\n padding: '6px',\n background: selected?.url === file.url ? 'rgba(59,130,246,0.07)' : '#f9fafb',\n }}\n onClick={() => setSelected(file)}\n title={file.title ?? file.name}\n >\n {file.isImage ? (\n <img\n src={file.url}\n alt={file.name}\n style={{ width: '80px', height: '80px', objectFit: 'cover', borderRadius: '4px', background: '#e5e7eb' }}\n />\n ) : (\n <div\n style={{\n width: '80px',\n height: '80px',\n borderRadius: '4px',\n background: '#e5e7eb',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '28px',\n }}\n >\n 📄\n </div>\n )}\n <div\n style={{\n marginTop: '6px',\n fontSize: '11px',\n textAlign: 'center',\n maxWidth: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n color: '#374151',\n }}\n >\n {file.title ?? file.name}\n </div>\n </div>\n ))}\n </div>\n\n {pagination.totalPages > 1 && (\n <Stack direction=\"row\" gap=\"200\" alignItems=\"center\" justifyContent=\"center\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n isDisabled={pagination.currentPage <= 1}\n onPress={onPrevPage}\n >\n ← Prev\n </Button>\n <Text fontSize=\"sm\" color=\"neutral.11\">\n {pagination.currentPage} / {pagination.totalPages}\n </Text>\n <Button\n variant=\"outline\"\n size=\"sm\"\n isDisabled={pagination.currentPage >= pagination.totalPages}\n onPress={onNextPage}\n >\n Next →\n </Button>\n </Stack>\n )}\n </Stack>\n )}\n {error && <Text color=\"critical.11\">{error}</Text>}\n </div>\n\n {/* Footer */}\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '12px 20px',\n borderTop: '1px solid #e5e7eb',\n gap: '12px',\n }}\n >\n <Text fontSize=\"sm\" color=\"neutral.11\" truncate>\n {selected ? (selected.title ?? selected.name) : 'Nothing selected'}\n </Text>\n <Stack direction=\"row\" gap=\"200\">\n <Button variant=\"outline\" onPress={onClose}>Cancel</Button>\n <Button variant=\"solid\" isDisabled={!selected} onPress={handleConfirm}>\n Select\n </Button>\n </Stack>\n </div>\n </div>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// ImagePickerField — the Puck custom field component\n// ---------------------------------------------------------------------------\n\nexport interface ImagePickerFieldProps {\n value: string;\n onChange: (value: string) => void;\n /** Only show images (default: true) */\n imagesOnly?: boolean;\n}\n\nexport const ImagePickerField: React.FC<ImagePickerFieldProps> = ({\n value,\n onChange,\n imagesOnly = true,\n}) => {\n const {\n files,\n pagination,\n loading,\n uploading,\n error,\n fetchMedia,\n uploadFile,\n loadNextPage,\n loadPreviousPage,\n } = useMediaLibrary();\n\n const [showUpload, setShowUpload] = useState(false);\n const [showLibrary, setShowLibrary] = useState(false);\n\n const extensions = imagesOnly ? ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg'] : [];\n\n const openLibrary = useCallback(() => {\n void fetchMedia(extensions, 1, 20);\n setShowLibrary(true);\n }, [fetchMedia, extensions]);\n\n const handleUpload = useCallback(\n async (file: File, title: string, description: string) => {\n const mediaFile = await uploadFile(file, title, description);\n onChange(mediaFile.url);\n setShowUpload(false);\n },\n [uploadFile, onChange]\n );\n\n const handleSelect = useCallback(\n (file: MediaFile) => {\n onChange(file.url);\n setShowLibrary(false);\n },\n [onChange]\n );\n\n // Close modals on Escape\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setShowUpload(false);\n setShowLibrary(false);\n }\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, []);\n\n return (\n <Stack direction=\"column\" gap=\"200\">\n {value ? (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '10px',\n padding: '8px',\n border: '1px solid #d1d5db',\n borderRadius: '6px',\n background: '#f9fafb',\n }}\n >\n <img\n src={value}\n alt=\"Selected image preview\"\n style={{ width: '48px', height: '48px', objectFit: 'cover', borderRadius: '4px', flexShrink: 0 }}\n />\n <div style={{ flex: 1, minWidth: 0 }}>\n <Text fontSize=\"sm\" color=\"neutral.11\" truncate>{value}</Text>\n </div>\n <Button variant=\"ghost\" colorPalette=\"critical\" size=\"xs\" onPress={() => onChange('')}>\n Remove\n </Button>\n </div>\n ) : (\n <Text fontSize=\"sm\" color=\"neutral.11\">No image selected</Text>\n )}\n\n <Stack direction=\"row\" gap=\"200\">\n <Button variant=\"outline\" onPress={() => setShowUpload(true)}>Upload</Button>\n <Button variant=\"solid\" onPress={openLibrary}>Media Library</Button>\n </Stack>\n\n {showUpload && (\n <UploadModal\n uploading={uploading}\n error={error}\n onUpload={(file, title, desc) => void handleUpload(file, title, desc)}\n onClose={() => setShowUpload(false)}\n />\n )}\n\n {showLibrary && (\n <LibraryModal\n files={files}\n pagination={pagination}\n loading={loading}\n error={error}\n onNextPage={() => void loadNextPage(extensions)}\n onPrevPage={() => void loadPreviousPage(extensions)}\n onSelect={handleSelect}\n onClose={() => setShowLibrary(false)}\n />\n )}\n </Stack>\n );\n};\n","import React from 'react';\nimport type { ComponentConfig } from '@measured/puck';\nimport { ImagePickerField } from '../fields/ImagePickerField';\n\nexport interface ImageProps {\n src: string;\n alt?: string;\n caption?: string;\n width?: string;\n height?: string;\n objectFit?: 'cover' | 'contain' | 'fill';\n borderRadius?: string;\n align?: 'left' | 'center' | 'right';\n}\n\nexport const Image: ComponentConfig<ImageProps> = {\n label: 'Image',\n fields: {\n src: {\n type: 'custom',\n label: 'Image',\n render: ({ value, onChange }) => (\n <ImagePickerField\n value={value as string}\n onChange={onChange}\n imagesOnly={true}\n />\n ),\n },\n alt: { type: 'text', label: 'Alt Text' },\n caption: { type: 'text', label: 'Caption' },\n width: { type: 'text', label: 'Width (CSS, e.g. 100%)' },\n height: { type: 'text', label: 'Height (CSS, e.g. 300px)' },\n objectFit: {\n type: 'select',\n label: 'Object Fit',\n options: [\n { value: 'cover', label: 'Cover' },\n { value: 'contain', label: 'Contain' },\n { value: 'fill', label: 'Fill' },\n ],\n },\n borderRadius: { type: 'text', label: 'Border Radius (CSS)' },\n align: {\n type: 'select',\n label: 'Alignment',\n options: [\n { value: 'left', label: 'Left' },\n { value: 'center', label: 'Center' },\n { value: 'right', label: 'Right' },\n ],\n },\n },\n defaultProps: {\n src: '',\n alt: '',\n width: '100%',\n objectFit: 'cover',\n align: 'center',\n },\n render: ({ src, alt, caption, width, height, objectFit, borderRadius, align }) => (\n <figure\n style={{\n margin: 0,\n padding: '16px',\n textAlign: align ?? 'center',\n boxSizing: 'border-box',\n }}\n >\n {src ? (\n <img\n src={src}\n alt={alt ?? ''}\n style={{\n width: width ?? '100%',\n height: height,\n objectFit: objectFit ?? 'cover',\n borderRadius,\n display: 'inline-block',\n maxWidth: '100%',\n }}\n />\n ) : (\n <div\n style={{\n width: width ?? '100%',\n height: height ?? '200px',\n background: '#e0e0e0',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: '#888',\n fontSize: '14px',\n borderRadius,\n }}\n >\n No image selected\n </div>\n )}\n {caption && (\n <figcaption\n style={{ marginTop: '8px', fontSize: '14px', color: '#666' }}\n >\n {caption}\n </figcaption>\n )}\n </figure>\n ),\n};\n","import React from 'react';\nimport type { ComponentConfig } from '@measured/puck';\nimport { FONT_SIZE_FIELD } from '../fields/fontSizeField';\n\nexport interface ButtonProps {\n label: string;\n href?: string;\n variant?: 'primary' | 'secondary' | 'outline';\n size?: 'sm' | 'md' | 'lg';\n fontSize?: string;\n align?: 'left' | 'center' | 'right';\n openInNewTab?: boolean;\n}\n\nconst VARIANT_STYLES: Record<string, React.CSSProperties> = {\n primary: { background: '#1a1a2e', color: '#fff', border: '2px solid #1a1a2e' },\n secondary: { background: '#e94560', color: '#fff', border: '2px solid #e94560' },\n outline: { background: 'transparent', color: '#1a1a2e', border: '2px solid #1a1a2e' },\n};\n\nconst SIZE_STYLES: Record<string, React.CSSProperties> = {\n sm: { padding: '6px 16px', fontSize: '14px' },\n md: { padding: '10px 24px', fontSize: '16px' },\n lg: { padding: '14px 32px', fontSize: '18px' },\n};\n\nexport const Button: ComponentConfig<ButtonProps> = {\n label: 'Button',\n fields: {\n label: { type: 'text', label: 'Button Label' },\n href: { type: 'text', label: 'Link URL' },\n variant: {\n type: 'select',\n label: 'Variant',\n options: [\n { value: 'primary', label: 'Primary' },\n { value: 'secondary', label: 'Secondary' },\n { value: 'outline', label: 'Outline' },\n ],\n },\n size: {\n type: 'select',\n label: 'Size',\n options: [\n { value: 'sm', label: 'Small' },\n { value: 'md', label: 'Medium' },\n { value: 'lg', label: 'Large' },\n ],\n },\n fontSize: FONT_SIZE_FIELD('Font Size Override'),\n align: {\n type: 'select',\n label: 'Alignment',\n options: [\n { value: 'left', label: 'Left' },\n { value: 'center', label: 'Center' },\n { value: 'right', label: 'Right' },\n ],\n },\n openInNewTab: { type: 'radio', label: 'Open in New Tab', options: [\n { value: true, label: 'Yes' },\n { value: false, label: 'No' },\n ]},\n },\n defaultProps: {\n label: 'Click me',\n variant: 'primary',\n size: 'md',\n align: 'left',\n openInNewTab: false,\n },\n render: ({ label, href, variant = 'primary', size = 'md', fontSize, align = 'left', openInNewTab }) => (\n <div style={{ padding: '12px 16px', textAlign: align, boxSizing: 'border-box' }}>\n <a\n href={href ?? '#'}\n target={openInNewTab ? '_blank' : undefined}\n rel={openInNewTab ? 'noopener noreferrer' : undefined}\n style={{\n display: 'inline-block',\n borderRadius: '4px',\n textDecoration: 'none',\n fontWeight: 600,\n cursor: 'pointer',\n ...VARIANT_STYLES[variant],\n ...SIZE_STYLES[size],\n ...(fontSize ? { fontSize } : {}),\n }}\n >\n {label}\n </a>\n </div>\n ),\n};\n","import React from 'react';\nimport type { ComponentConfig } from '@measured/puck';\nimport { RichTextField } from '../fields/RichTextField';\nimport { sanitizeHtml } from '../utils/sanitizeHtml';\nimport { FONT_SIZE_FIELD } from '../fields/fontSizeField';\n\nexport interface CardProps {\n title: string;\n titleFontSize?: string;\n body?: string;\n imageUrl?: string;\n ctaText?: string;\n ctaUrl?: string;\n shadow?: boolean;\n borderRadius?: string;\n}\n\nexport const Card: ComponentConfig<CardProps> = {\n label: 'Card',\n fields: {\n title: { type: 'text', label: 'Title' },\n titleFontSize: FONT_SIZE_FIELD('Title Font Size'),\n body: {\n type: 'custom',\n label: 'Body Text',\n render: ({ value, onChange }) => (\n <RichTextField value={value as string} onChange={onChange} />\n ),\n },\n imageUrl: { type: 'text', label: 'Image URL' },\n ctaText: { type: 'text', label: 'CTA Text' },\n ctaUrl: { type: 'text', label: 'CTA URL' },\n shadow: {\n type: 'radio',\n label: 'Drop Shadow',\n options: [\n { value: true, label: 'Yes' },\n { value: false, label: 'No' },\n ],\n },\n borderRadius: { type: 'text', label: 'Border Radius (CSS)' },\n },\n defaultProps: {\n title: 'Card Title',\n body: 'Card description goes here.',\n shadow: true,\n borderRadius: '8px',\n },\n render: ({ title, titleFontSize, body, imageUrl, ctaText, ctaUrl, shadow, borderRadius }) => (\n <div\n style={{\n border: '1px solid #e0e0e0',\n borderRadius: borderRadius ?? '8px',\n overflow: 'hidden',\n boxShadow: shadow ? '0 2px 8px rgba(0,0,0,0.12)' : undefined,\n background: '#fff',\n margin: '8px',\n boxSizing: 'border-box',\n }}\n >\n {imageUrl && (\n <img\n src={imageUrl}\n alt={title}\n style={{ width: '100%', height: '200px', objectFit: 'cover', display: 'block' }}\n />\n )}\n <div style={{ padding: '16px' }}>\n <h3 style={{ margin: '0 0 8px', fontSize: titleFontSize || '1.1rem' }}>{title}</h3>\n {body && (\n <div\n style={{ margin: '0 0 16px', color: '#555', fontSize: '14px' }}\n dangerouslySetInnerHTML={{ __html: sanitizeHtml(body) }}\n />\n )}\n {ctaText && ctaUrl && (\n <a\n href={ctaUrl}\n style={{\n color: '#e94560',\n fontWeight: 600,\n textDecoration: 'none',\n fontSize: '14px',\n }}\n >\n {ctaText} →\n </a>\n )}\n </div>\n </div>\n ),\n};\n","import React from 'react';\nimport type { ComponentConfig } from '@measured/puck';\n\nexport interface SpacerProps {\n height?: string;\n showLine?: boolean;\n lineColor?: string;\n}\n\nexport const Spacer: ComponentConfig<SpacerProps> = {\n label: 'Spacer',\n fields: {\n height: { type: 'text', label: 'Height (CSS, e.g. 48px)' },\n showLine: {\n type: 'radio',\n label: 'Show Divider Line',\n options: [\n { value: true, label: 'Yes' },\n { value: false, label: 'No' },\n ],\n },\n lineColor: { type: 'text', label: 'Line Color (CSS color)' },\n },\n defaultProps: {\n height: '48px',\n showLine: false,\n lineColor: '#e0e0e0',\n },\n render: ({ height = '48px', showLine = false, lineColor = '#e0e0e0' }) => (\n <div\n style={{\n height,\n display: 'flex',\n alignItems: 'center',\n padding: '0 16px',\n boxSizing: 'border-box',\n }}\n >\n {showLine && (\n <hr style={{ width: '100%', border: 'none', borderTop: `1px solid ${lineColor}` }} />\n )}\n </div>\n ),\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { useDatasource } from '@commercetools-demo/puck-api';\nimport { DatasourceField, type DatasourceValue } from '../fields/DatasourceField';\nimport { richTextField } from '../fields/RichTextField';\nimport {\n productLinkDefaults,\n productLinkFields,\n resolveProductLink,\n type ProductLinkProps,\n} from './cms/shared';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface ProductTeaserProps extends ProductLinkProps {\n datasource: DatasourceValue;\n richText: string;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\ninterface ProductProjection {\n name?: Record<string, string>;\n masterVariant?: {\n images?: Array<{ url: string }>;\n prices?: Array<{\n value: { centAmount: number; currencyCode: string; fractionDigits: number };\n }>;\n };\n}\n\nconst getLocalizedName = (name?: Record<string, string>): string => {\n if (!name) return '';\n return name['en'] ?? name['en-US'] ?? Object.values(name)[0] ?? '';\n};\n\nconst formatPrice = (\n centAmount: number,\n currencyCode: string,\n fractionDigits: number\n): string => {\n const amount = centAmount / Math.pow(10, fractionDigits);\n return `${currencyCode} ${amount.toFixed(fractionDigits)}`;\n};\n\n// ---------------------------------------------------------------------------\n// Render — a proper React component so hooks work\n// ---------------------------------------------------------------------------\n\nconst ProductTeaserRender: React.FC<ProductTeaserProps> = ({\n datasource,\n richText,\n linkWith,\n baseUrl,\n}) => {\n // Skip the hook fetch when the server has already pre-resolved the data.\n const hasPreResolved = datasource?.resolvedData != null;\n const { data: fetchedData, loading, error } = useDatasource(\n hasPreResolved ? undefined : datasource?.type,\n hasPreResolved ? [] : (datasource?.skus ?? [])\n );\n\n const data = hasPreResolved ? datasource.resolvedData : fetchedData;\n\n // For products-by-sku the service returns an array; for product-by-sku a single object.\n const product: ProductProjection | null = data\n ? Array.isArray(data)\n ? (data[0] as ProductProjection) ?? null\n : (data as ProductProjection)\n : null;\n\n const imageUrl = product?.masterVariant?.images?.[0]?.url;\n const priceValue = product?.masterVariant?.prices?.[0]?.value;\n const productName = getLocalizedName(product?.name);\n const href = product ? resolveProductLink(product, linkWith, baseUrl) : undefined;\n\n return (\n <div\n style={{\n display: 'flex',\n gap: '24px',\n padding: '16px',\n alignItems: 'flex-start',\n fontFamily: 'inherit',\n }}\n >\n {/* Left: product image */}\n <div style={{ flexShrink: 0, width: '200px' }}>\n {loading ? (\n <div\n style={{\n width: '200px',\n height: '200px',\n background: '#f3f4f6',\n borderRadius: '8px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: '#9ca3af',\n fontSize: '13px',\n }}\n >\n Loading…\n </div>\n ) : imageUrl ? (\n <a href={href} style={{ display: 'block' }}>\n <img\n src={imageUrl}\n alt={productName}\n style={{\n width: '200px',\n height: '200px',\n objectFit: 'cover',\n borderRadius: '8px',\n display: 'block',\n }}\n />\n </a>\n ) : (\n <div\n style={{\n width: '200px',\n height: '200px',\n background: '#f3f4f6',\n borderRadius: '8px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: '#9ca3af',\n fontSize: '13px',\n }}\n >\n {error ? 'Error loading product' : 'No product selected'}\n </div>\n )}\n </div>\n\n {/* Right: rich text + price stacked */}\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n flex: 1,\n minWidth: 0,\n }}\n >\n {richText ? (\n <div dangerouslySetInnerHTML={{ __html: richText }} />\n ) : (\n <div style={{ color: '#9ca3af', fontSize: '13px' }}>\n No description\n </div>\n )}\n\n {priceValue && (\n <div\n style={{\n fontSize: '20px',\n fontWeight: 700,\n color: '#111827',\n }}\n >\n {formatPrice(\n priceValue.centAmount,\n priceValue.currencyCode,\n priceValue.fractionDigits\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Puck component config\n// ---------------------------------------------------------------------------\n\nexport const ProductTeaser: ComponentConfig<ProductTeaserProps> = {\n label: 'Product Teaser',\n fields: {\n datasource: {\n type: 'custom',\n label: 'Product Datasource',\n render: ({ value, onChange }) => (\n <DatasourceField value={value} onChange={onChange} />\n ),\n },\n richText: richTextField('Rich Text'),\n ...productLinkFields,\n },\n defaultProps: {\n datasource: { type: 'product-by-sku', skus: [''] },\n richText: '',\n ...productLinkDefaults,\n },\n render: (props) => <ProductTeaserRender {...props} />,\n};\n","import React, { useState } from 'react';\nimport { Button, FormField, Icon, Select, Stack, Text, TextInput } from '@commercetools/nimbus';\nimport { Close } from '@commercetools/nimbus-icons';\nimport { useProductSearch } from '@commercetools-demo/puck-api';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type DatasourceType = 'product-by-sku' | 'products-by-sku';\n\nexport interface DatasourceValue {\n type: DatasourceType;\n skus: string[];\n /** Pre-resolved by the server on published/preview endpoints — use directly in render. */\n resolvedData?: unknown;\n}\n\nexport interface DatasourceFieldProps {\n value: DatasourceValue | undefined;\n onChange: (value: DatasourceValue) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nconst TYPE_OPTIONS = [\n { value: 'product-by-sku', label: 'Product by SKU' },\n { value: 'products-by-sku', label: 'Products by SKU' },\n];\n\nconst EMPTY_VALUE: DatasourceValue = { type: 'product-by-sku', skus: [''] };\n\n// ---------------------------------------------------------------------------\n// ProductSearchPicker — typeahead search for product selection (task #4)\n// ---------------------------------------------------------------------------\n\ninterface ProductSearchPickerProps {\n /** SKUs already selected, so we can mark them in the results. */\n selectedSkus: string[];\n onSelect: (sku: string) => void;\n}\n\nconst ProductSearchPicker: React.FC<ProductSearchPickerProps> = ({\n selectedSkus,\n onSelect,\n}) => {\n const [query, setQuery] = useState('');\n const { results, loading, error } = useProductSearch(query);\n\n return (\n <Stack direction=\"column\" gap=\"100\">\n <FormField.Root>\n <FormField.Label>Search products</FormField.Label>\n <FormField.Input>\n <TextInput\n placeholder=\"Search by product name…\"\n value={query}\n onChange={(value) => setQuery(value)}\n />\n </FormField.Input>\n </FormField.Root>\n\n {query.trim() !== '' && (\n <div\n role=\"listbox\"\n aria-label=\"Product search results\"\n aria-busy={loading}\n style={{\n maxHeight: 220,\n overflowY: 'auto',\n border: '1px solid var(--color-neutral-90, #e0e0e0)',\n borderRadius: 'var(--border-radius-4, 4px)',\n background: 'var(--color-surface, #fff)',\n }}\n >\n {loading && (\n <div style={{ padding: 8, fontSize: 13, color: 'var(--color-neutral-40, #666)' }}>\n Searching…\n </div>\n )}\n {error && (\n <div style={{ padding: 8, fontSize: 13, color: 'var(--color-error, #c0392b)' }}>\n {error}\n </div>\n )}\n {!loading && !error && results.length === 0 && (\n <div style={{ padding: 8, fontSize: 13, color: 'var(--color-neutral-40, #666)' }}>\n No products found\n </div>\n )}\n {results.map((product) => {\n const sku = product.sku;\n const alreadySelected = !!sku && selectedSkus.includes(sku);\n return (\n <button\n key={product.id}\n type=\"button\"\n role=\"option\"\n aria-selected={alreadySelected}\n disabled={!sku}\n onClick={() => sku && onSelect(sku)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n width: '100%',\n padding: 8,\n border: 'none',\n borderBottom: '1px solid var(--color-neutral-95, #f4f4f4)',\n background: alreadySelected\n ? 'var(--color-primary-95, #e6eefb)'\n : 'transparent',\n cursor: sku ? 'pointer' : 'not-allowed',\n textAlign: 'left',\n }}\n >\n {product.image ? (\n <img\n src={product.image}\n alt=\"\"\n style={{ width: 32, height: 32, objectFit: 'cover', borderRadius: 4, flexShrink: 0 }}\n />\n ) : (\n <span\n aria-hidden=\"true\"\n style={{ width: 32, height: 32, background: 'var(--color-neutral-95, #f4f4f4)', borderRadius: 4, flexShrink: 0 }}\n />\n )}\n <span style={{ flex: 1, minWidth: 0 }}>\n <span style={{ display: 'block', fontSize: 13, fontWeight: 600, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n {product.name ?? '(unnamed product)'}\n </span>\n <span style={{ display: 'block', fontSize: 11, color: 'var(--color-neutral-40, #666)' }}>\n {sku ? `SKU: ${sku}` : 'No SKU on master variant'}\n </span>\n </span>\n {alreadySelected && (\n <span style={{ fontSize: 11, color: 'var(--color-primary, #1a1a2e)' }}>Added</span>\n )}\n </button>\n );\n })}\n </div>\n )}\n </Stack>\n );\n};\n\n// ---------------------------------------------------------------------------\n// DatasourceField — custom Puck field component\n// ---------------------------------------------------------------------------\n\nexport const DatasourceField: React.FC<DatasourceFieldProps> = ({\n value,\n onChange,\n}) => {\n const current: DatasourceValue = value ?? EMPTY_VALUE;\n const selectedSkus = current.skus.filter(Boolean);\n\n const removeSkuValue = (sku: string) => {\n const updated = current.skus.filter((s) => s !== sku);\n onChange({ ...current, skus: updated.length > 0 ? updated : [''] });\n };\n\n // Add a SKU chosen from the product-search picker.\n const selectProduct = (sku: string) => {\n if (current.type === 'product-by-sku') {\n onChange({ ...current, skus: [sku] });\n return;\n }\n const existing = current.skus.filter(Boolean);\n if (existing.includes(sku)) return;\n onChange({ ...current, skus: [...existing, sku] });\n };\n\n return (\n <Stack direction=\"column\" gap=\"200\">\n <FormField.Root>\n <FormField.Label>Datasource type</FormField.Label>\n <FormField.Input>\n <Select.Root\n selectedKey={current.type}\n onSelectionChange={(key) => {\n const newType = key as DatasourceType;\n onChange({\n type: newType,\n skus: newType === 'product-by-sku' ? [current.skus[0] ?? ''] : current.skus,\n });\n }}\n >\n <Select.Options>\n {TYPE_OPTIONS.map((o) => (\n <Select.Option key={o.value} id={o.value}>{o.label}</Select.Option>\n ))}\n </Select.Options>\n </Select.Root>\n </FormField.Input>\n </FormField.Root>\n\n <ProductSearchPicker\n selectedSkus={selectedSkus}\n onSelect={selectProduct}\n />\n\n <Stack direction=\"column\" gap=\"100\">\n <Text fontSize=\"sm\" fontWeight=\"700\">\n {current.type === 'product-by-sku' ? 'Selected product' : 'Selected products'}\n </Text>\n {selectedSkus.length === 0 ? (\n <Text fontSize=\"sm\" color=\"neutral.11\">\n No product selected — search above to add one.\n </Text>\n ) : (\n <Stack direction=\"column\" gap=\"100\">\n {selectedSkus.map((sku) => (\n <Stack key={sku} direction=\"row\" gap=\"100\" alignItems=\"center\" justifyContent=\"space-between\">\n <span\n style={{\n flex: 1,\n minWidth: 0,\n fontSize: 13,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n SKU: {sku}\n </span>\n <Button\n variant=\"ghost\"\n colorPalette=\"critical\"\n size=\"xs\"\n onPress={() => removeSkuValue(sku)}\n >\n <Icon as={Close} /> Remove\n </Button>\n </Stack>\n ))}\n </Stack>\n )}\n </Stack>\n </Stack>\n );\n};\n","// Shared helpers used across CMS Puck components\nimport type { Fields } from '@measured/puck';\n\nexport const getLocalizedText = (obj?: Record<string, string> | null): string => {\n if (!obj) return '';\n return obj['en-US'] ?? obj['en'] ?? Object.values(obj)[0] ?? '';\n};\n\nexport const formatPrice = (\n centAmount: number,\n currencyCode = 'USD',\n fractionDigits = 2\n): string => {\n const amount = centAmount / Math.pow(10, fractionDigits);\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: currencyCode,\n }).format(amount);\n};\n\nexport const getFirstPrice = (\n product: unknown\n): { centAmount: number; currencyCode: string; fractionDigits: number } | null => {\n const p = product as any;\n return p?.masterVariant?.prices?.[0]?.value ?? null;\n};\n\nexport const getProductImage = (product: unknown): string | null => {\n const p = product as any;\n return p?.masterVariant?.images?.[0]?.url ?? null;\n};\n\nexport const getProductName = (product: unknown): string => {\n const p = product as any;\n return getLocalizedText(p?.name) || 'Product';\n};\n\nexport const getProductSlug = (product: unknown): string => {\n const p = product as any;\n return getLocalizedText(p?.slug) || p?.id || '#';\n};\n\nexport const getProductSku = (product: unknown): string => {\n const p = product as any;\n return p?.masterVariant?.sku ?? '';\n};\n\n/** How a product link is built — from the product slug or its SKU. */\nexport type ProductLinkWith = 'slug' | 'sku';\n\n/**\n * Build a storefront link to a product.\n *\n * Joins a sanitised base URL with the product's slug or SKU. The base is\n * trimmed, stripped of leading/trailing slashes and collapsed of any double\n * slashes, then re-prefixed with a single \"/\", e.g.\n * resolveProductLink(p, 'sku', '/product/') → '/product/123' (sku 123)\n * resolveProductLink(p, 'slug', '/slug/p/') → '/slug/p/test' (slug \"test\")\n */\nexport const resolveProductLink = (\n product: unknown,\n linkWith: ProductLinkWith = 'slug',\n baseUrl = '/p'\n): string => {\n const p = product as any;\n const slug = getLocalizedText(p?.slug);\n const sku = getProductSku(product);\n const id = (p?.id as string) ?? '';\n // Chosen identifier, falling back to the product id / the other identifier.\n const identifier = (linkWith === 'sku' ? sku : slug) || id || slug || sku;\n\n const base =\n '/' +\n String(baseUrl ?? '')\n .trim()\n .replace(/^\\/+|\\/+$/g, '')\n .replace(/\\/{2,}/g, '/');\n const cleanId = String(identifier ?? '')\n .trim()\n .replace(/^\\/+|\\/+$/g, '');\n\n return (cleanId ? `${base}/${cleanId}` : base).replace(/\\/{2,}/g, '/');\n};\n\n/** Props every product-linking component shares. */\nexport interface ProductLinkProps {\n linkWith: ProductLinkWith;\n baseUrl: string;\n}\n\n/** Puck field definitions for the shared link props — spread into a component's `fields`. */\nexport const productLinkFields: Fields<ProductLinkProps> = {\n linkWith: {\n type: 'radio',\n label: 'Link products by',\n options: [\n { value: 'slug', label: 'Slug' },\n { value: 'sku', label: 'SKU' },\n ],\n },\n baseUrl: {\n type: 'text',\n label: 'Link base URL',\n },\n};\n\n/** Default values for the shared link props — spread into a component's defaultProps. */\nexport const productLinkDefaults: ProductLinkProps = {\n linkWith: 'slug',\n baseUrl: '/p',\n};\n\n// Colour palette shared across components\nexport const colors = {\n primary: '#2c5530',\n primaryHover: '#1e3a21',\n lightBg: '#f0f7f0',\n lightBorder: '#c8e6c8',\n text: '#333',\n textMuted: '#666',\n border: '#eee',\n bg: '#f5f5f5',\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { ImagePickerField } from '../../fields/ImagePickerField';\n\nexport interface HeroBannerProps {\n title: string;\n subtitle: string;\n image: string;\n}\n\nexport const HeroBanner: ComponentConfig<HeroBannerProps> = {\n label: 'Hero Banner',\n fields: {\n title: { type: 'text', label: 'Title' },\n subtitle: { type: 'text', label: 'Subtitle' },\n image: {\n type: 'custom',\n label: 'Image',\n render: ({ value, onChange }) => (\n <ImagePickerField value={value ?? ''} onChange={onChange} />\n ),\n },\n },\n defaultProps: { title: '', subtitle: '', image: '' },\n render: ({ title, subtitle, image }) => (\n <div\n style={{\n position: 'relative',\n width: '100%',\n paddingBottom: '56.25%',\n overflow: 'hidden',\n backgroundColor: '#f0f0f0',\n }}\n >\n {image && (\n <img\n src={image}\n alt={title || 'Hero banner'}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n objectPosition: 'center',\n }}\n />\n )}\n {/* dark overlay */}\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n background: 'rgba(0,0,0,0.3)',\n zIndex: 1,\n }}\n />\n <div\n style={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%,-50%)',\n textAlign: 'center',\n color: 'white',\n zIndex: 2,\n padding: '2rem',\n maxWidth: '90%',\n }}\n >\n {title && (\n <h1\n style={{\n fontSize: '3rem',\n fontWeight: 'bold',\n margin: '0 0 1rem 0',\n textShadow: '2px 2px 4px rgba(0,0,0,0.7)',\n }}\n >\n {title}\n </h1>\n )}\n {subtitle && (\n <p\n style={{\n fontSize: '1.25rem',\n margin: 0,\n textShadow: '1px 1px 2px rgba(0,0,0,0.7)',\n opacity: 0.95,\n }}\n >\n {subtitle}\n </p>\n )}\n </div>\n </div>\n ),\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { RichTextField } from '../../fields/RichTextField';\nimport { sanitizeHtml } from '../../utils/sanitizeHtml';\n\nexport interface TextBlockProps {\n content: string;\n}\n\nexport const TextBlock: ComponentConfig<TextBlockProps> = {\n label: 'Text Block',\n fields: {\n content: {\n type: 'custom',\n label: 'Content',\n render: ({ value, onChange }) => (\n <RichTextField value={value as string} onChange={onChange} />\n ),\n },\n },\n defaultProps: { content: '' },\n render: ({ content }) => {\n if (!content) return <></>;\n return (\n <div\n dangerouslySetInnerHTML={{ __html: sanitizeHtml(content) }}\n style={{\n maxWidth: '720px',\n margin: '0 auto',\n padding: '1.5rem 1rem',\n lineHeight: 1.6,\n color: '#333',\n }}\n />\n );\n },\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { ImagePickerField } from '../../fields/ImagePickerField';\n\nexport interface CategoryGridProps {\n category1Image: string; category1Label: string; category1Link: string;\n category2Image: string; category2Label: string; category2Link: string;\n category3Image: string; category3Label: string; category3Link: string;\n category4Image: string; category4Label: string; category4Link: string;\n}\n\nconst imgField = (label: string) => ({\n type: 'custom' as const,\n label,\n render: ({ value, onChange }: { value: string; onChange: (v: string) => void }) => (\n <ImagePickerField value={value ?? ''} onChange={onChange} />\n ),\n});\n\nexport const CategoryGrid: ComponentConfig<CategoryGridProps> = {\n label: 'Category Grid',\n fields: {\n category1Image: imgField('Category 1 Image'),\n category1Label: { type: 'text', label: 'Category 1 Label' },\n category1Link: { type: 'text', label: 'Category 1 Link' },\n category2Image: imgField('Category 2 Image'),\n category2Label: { type: 'text', label: 'Category 2 Label' },\n category2Link: { type: 'text', label: 'Category 2 Link' },\n category3Image: imgField('Category 3 Image'),\n category3Label: { type: 'text', label: 'Category 3 Label' },\n category3Link: { type: 'text', label: 'Category 3 Link' },\n category4Image: imgField('Category 4 Image'),\n category4Label: { type: 'text', label: 'Category 4 Label' },\n category4Link: { type: 'text', label: 'Category 4 Link' },\n },\n defaultProps: {\n category1Image: '', category1Label: '', category1Link: '',\n category2Image: '', category2Label: '', category2Link: '',\n category3Image: '', category3Label: '', category3Link: '',\n category4Image: '', category4Label: '', category4Link: '',\n },\n render: (props) => {\n const categories = [\n [props.category1Image, props.category1Label, props.category1Link],\n [props.category2Image, props.category2Label, props.category2Link],\n [props.category3Image, props.category3Label, props.category3Link],\n [props.category4Image, props.category4Label, props.category4Link],\n ].filter(([, label, link]) => label && link) as [string, string, string][];\n\n if (categories.length === 0) return (\n <div style={{ padding: '2rem', textAlign: 'center', color: '#999', fontSize: '13px' }}>\n No categories configured\n </div>\n );\n\n return (\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(200px, 1fr))',\n gap: '1.5rem',\n padding: '2rem 1rem',\n }}\n >\n {categories.map(([image, label, link], i) => (\n <a\n key={i}\n href={link}\n style={{\n display: 'block',\n textAlign: 'center',\n textDecoration: 'none',\n color: 'inherit',\n borderRadius: '8px',\n overflow: 'hidden',\n boxShadow: '0 2px 8px rgba(0,0,0,0.1)',\n }}\n >\n <div style={{ aspectRatio: '1', background: '#f0f0f0', overflow: 'hidden' }}>\n {image && (\n <img\n src={image}\n alt={label}\n style={{ width: '100%', height: '100%', objectFit: 'cover' }}\n />\n )}\n </div>\n <span\n style={{\n display: 'block',\n padding: '1rem',\n fontWeight: 600,\n color: '#333',\n }}\n >\n {label}\n </span>\n </a>\n ))}\n </div>\n );\n },\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { ImagePickerField } from '../../fields/ImagePickerField';\n\nexport interface CategoryHeroProps {\n title: string;\n subtitle: string;\n image: string;\n ctaText: string;\n ctaLink: string;\n}\n\nexport const CategoryHero: ComponentConfig<CategoryHeroProps> = {\n label: 'Category Hero',\n fields: {\n title: { type: 'text', label: 'Title' },\n subtitle: { type: 'text', label: 'Subtitle' },\n image: {\n type: 'custom', label: 'Background Image',\n render: ({ value, onChange }) => <ImagePickerField value={value ?? ''} onChange={onChange} />,\n },\n ctaText: { type: 'text', label: 'CTA Text' },\n ctaLink: { type: 'text', label: 'CTA Link' },\n },\n defaultProps: { title: '', subtitle: '', image: '', ctaText: '', ctaLink: '' },\n render: ({ title, subtitle, image, ctaText, ctaLink }) => (\n <div\n style={{\n position: 'relative',\n minHeight: '220px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: '#f0f0f0',\n borderRadius: '8px',\n overflow: 'hidden',\n margin: '1rem 0',\n }}\n >\n {image && (\n <img\n src={image}\n alt={title || 'Category'}\n style={{\n position: 'absolute',\n top: 0, left: 0,\n width: '100%', height: '100%',\n objectFit: 'cover',\n opacity: 0.85,\n }}\n />\n )}\n <div style={{ position: 'absolute', inset: 0, background: 'rgba(0,0,0,0.25)' }} />\n <div\n style={{\n position: 'relative',\n zIndex: 1,\n textAlign: 'center',\n padding: '2rem',\n color: 'white',\n textShadow: '0 1px 3px rgba(0,0,0,0.5)',\n }}\n >\n {title && <h1 style={{ fontSize: '2.5rem', marginBottom: '0.5rem' }}>{title}</h1>}\n {subtitle && <p style={{ fontSize: '1.1rem', marginBottom: '1rem' }}>{subtitle}</p>}\n {ctaText && ctaLink && (\n <a\n href={ctaLink}\n style={{\n display: 'inline-block',\n background: 'white',\n color: '#2c5530',\n padding: '0.75rem 2rem',\n borderRadius: '4px',\n textDecoration: 'none',\n fontWeight: 600,\n }}\n >\n {ctaText}\n </a>\n )}\n </div>\n </div>\n ),\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\n\nexport interface CheckoutPromoBannerProps {\n title: string;\n message: string;\n ctaText: string;\n ctaLink: string;\n}\n\nexport const CheckoutPromoBanner: ComponentConfig<CheckoutPromoBannerProps> = {\n label: 'Checkout Promo Banner',\n fields: {\n title: { type: 'text', label: 'Title' },\n message: { type: 'text', label: 'Message' },\n ctaText: { type: 'text', label: 'CTA Text' },\n ctaLink: { type: 'text', label: 'CTA Link' },\n },\n defaultProps: { title: '', message: '', ctaText: '', ctaLink: '' },\n render: ({ title, message, ctaText, ctaLink }) => {\n if (!title && !message && !ctaText) return <></>;\n return (\n <div\n style={{\n padding: '1rem 1.25rem',\n background: '#f0f7f0',\n border: '1px solid #c8e6c8',\n borderRadius: '4px',\n marginBottom: '1rem',\n fontSize: '0.95rem',\n }}\n >\n {title && (\n <div style={{ fontWeight: 600, color: '#2c5530', marginBottom: '0.25rem' }}>\n {title}\n </div>\n )}\n {message && <p style={{ margin: '0 0 0.5rem 0', color: '#333' }}>{message}</p>}\n {ctaText && ctaLink && (\n <a href={ctaLink} style={{ color: '#2c5530', fontWeight: 600, textDecoration: 'none' }}>\n {ctaText}\n </a>\n )}\n </div>\n );\n },\n};\n","import React, { useEffect, useState } from 'react';\nimport { type ComponentConfig } from '@measured/puck';\n\nexport interface CountdownBannerProps {\n headline: string;\n subline: string;\n endDate: string;\n ctaText: string;\n ctaLink: string;\n background: string;\n}\n\nconst calcTimeLeft = (endDate: string): string => {\n if (!endDate) return '';\n const end = new Date(endDate);\n const now = new Date();\n if (end <= now) return 'Offer ended';\n const diff = end.getTime() - now.getTime();\n const d = Math.floor(diff / 86_400_000);\n const h = Math.floor((diff % 86_400_000) / 3_600_000);\n const m = Math.floor((diff % 3_600_000) / 60_000);\n const s = Math.floor((diff % 60_000) / 1_000);\n if (d > 0) return `${d}d ${h}h ${m}m left`;\n if (h > 0) return `${h}h ${m}m ${s}s left`;\n return `${m}m ${s}s left`;\n};\n\nconst CountdownRender: React.FC<CountdownBannerProps> = ({\n headline, subline, endDate, ctaText, ctaLink, background,\n}) => {\n const [timeLeft, setTimeLeft] = useState(() => calcTimeLeft(endDate));\n useEffect(() => {\n if (!endDate) return;\n const id = setInterval(() => setTimeLeft(calcTimeLeft(endDate)), 1000);\n return () => clearInterval(id);\n }, [endDate]);\n\n return (\n <div\n style={{\n background: background || '#2c5530',\n color: 'white',\n padding: '2rem 1rem',\n textAlign: 'center',\n borderRadius: '4px',\n margin: '1rem 0',\n }}\n >\n {headline && <h2 style={{ fontSize: '1.75rem', marginBottom: '0.5rem' }}>{headline}</h2>}\n {subline && <p style={{ fontSize: '1rem', opacity: 0.9, marginBottom: '1rem' }}>{subline}</p>}\n {timeLeft && (\n <p style={{ fontSize: '1.25rem', fontWeight: 600, margin: '0 0 1rem 0', letterSpacing: '0.05em' }}>\n {timeLeft}\n </p>\n )}\n {ctaText && ctaLink && (\n <a\n href={ctaLink}\n style={{\n display: 'inline-block',\n background: 'white',\n color: '#2c5530',\n padding: '0.75rem 2rem',\n borderRadius: '4px',\n textDecoration: 'none',\n fontWeight: 600,\n }}\n >\n {ctaText}\n </a>\n )}\n </div>\n );\n};\n\nexport const CountdownBanner: ComponentConfig<CountdownBannerProps> = {\n label: 'Countdown Banner',\n fields: {\n headline: { type: 'text', label: 'Headline' },\n subline: { type: 'text', label: 'Subline' },\n endDate: { type: 'text', label: 'End Date (ISO, e.g. 2025-12-31T23:59:59)' },\n ctaText: { type: 'text', label: 'CTA Text' },\n ctaLink: { type: 'text', label: 'CTA Link' },\n background: { type: 'text', label: 'Background Color' },\n },\n defaultProps: {\n headline: '', subline: '', endDate: '', ctaText: '', ctaLink: '', background: '#2c5530',\n },\n render: (props) => <CountdownRender {...props} />,\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { useDatasource } from '@commercetools-demo/puck-api';\nimport { DatasourceField, type DatasourceValue } from '../../fields/DatasourceField';\nimport {\n formatPrice,\n getFirstPrice,\n getLocalizedText,\n getProductImage,\n productLinkDefaults,\n productLinkFields,\n resolveProductLink,\n type ProductLinkProps,\n} from './shared';\n\nexport interface CrossSellBlockProps extends ProductLinkProps {\n title: string;\n products: DatasourceValue;\n ctaText: string;\n}\n\nconst CrossSellRender: React.FC<CrossSellBlockProps> = ({ title, products, ctaText, linkWith, baseUrl }) => {\n const hasPreResolved = products?.resolvedData != null;\n const { data: fetchedData, loading } = useDatasource(\n hasPreResolved ? undefined : products?.type,\n hasPreResolved ? [] : (products?.skus ?? [])\n );\n const items: unknown[] = hasPreResolved\n ? (Array.isArray(products.resolvedData) ? products.resolvedData : [])\n : (Array.isArray(fetchedData) ? fetchedData : []);\n\n if (!loading && items.length === 0) return null;\n\n return (\n <div style={{ padding: '2rem 0', borderTop: '1px solid #eee' }}>\n {title && <h3 style={{ fontSize: '1.5rem', marginBottom: '1.5rem', color: '#333' }}>{title || 'Frequently bought together'}</h3>}\n {loading && <div style={{ color: '#999', padding: '1rem' }}>Loading…</div>}\n {items.length > 0 && (\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(180px, 1fr))',\n gap: '1rem',\n }}\n >\n {items.map((product, i) => {\n const name = getLocalizedText((product as any)?.name);\n const imageUrl = getProductImage(product);\n const priceVal = getFirstPrice(product);\n return (\n <a\n key={(product as any)?.id ?? i}\n href={resolveProductLink(product, linkWith, baseUrl)}\n style={{\n textAlign: 'center',\n textDecoration: 'none',\n color: 'inherit',\n padding: '1rem',\n borderRadius: '8px',\n border: '1px solid #eee',\n }}\n >\n <div style={{ height: '120px', marginBottom: '0.75rem', display: 'flex', alignItems: 'center', justifyContent: 'center', background: '#f9f9f9', borderRadius: '4px' }}>\n {imageUrl\n ? <img src={imageUrl} alt={name} style={{ maxWidth: '100%', maxHeight: '100%', objectFit: 'contain' }} />\n : null\n }\n </div>\n <div style={{ fontWeight: 600, fontSize: '0.95rem', marginBottom: '0.25rem' }}>{name}</div>\n {priceVal && (\n <div style={{ fontSize: '1.1rem', color: '#2c5530', fontWeight: 'bold' }}>\n {formatPrice(priceVal.centAmount, priceVal.currencyCode, priceVal.fractionDigits)}\n </div>\n )}\n </a>\n );\n })}\n </div>\n )}\n {ctaText && (\n <a href=\"#\" style={{ display: 'inline-block', marginTop: '1rem', color: '#2c5530', fontWeight: 600, textDecoration: 'none' }}>\n {ctaText}\n </a>\n )}\n </div>\n );\n};\n\nexport const CrossSellBlock: ComponentConfig<CrossSellBlockProps> = {\n label: 'Cross-Sell Block',\n fields: {\n title: { type: 'text', label: 'Title' },\n products: {\n type: 'custom', label: 'Products',\n render: ({ value, onChange }) => <DatasourceField value={value} onChange={onChange} />,\n },\n ctaText: { type: 'text', label: 'CTA Text' },\n ...productLinkFields,\n },\n defaultProps: {\n title: 'Frequently bought together',\n products: { type: 'products-by-sku', skus: [''] },\n ctaText: '',\n ...productLinkDefaults,\n },\n render: (props) => <CrossSellRender {...props} />,\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\n\nexport interface DeliveryMessageProps {\n message: string;\n threshold: string;\n}\n\nexport const DeliveryMessage: ComponentConfig<DeliveryMessageProps> = {\n label: 'Delivery Message',\n fields: {\n message: { type: 'text', label: 'Message (use $XX for threshold)' },\n threshold: { type: 'text', label: 'Threshold Amount (e.g. 50)' },\n },\n defaultProps: { message: 'Free delivery on orders over $50', threshold: '' },\n render: ({ message, threshold }) => {\n if (!message) return <></>;\n const text = threshold\n ? message.replace(/\\$\\d+/g, `$${threshold}`)\n : message;\n return (\n <div\n style={{\n padding: '0.75rem 1rem',\n background: '#f0f7f0',\n borderRadius: '4px',\n fontSize: '0.95rem',\n color: '#2c5530',\n }}\n >\n {text}\n </div>\n );\n },\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\n\nexport interface DividerProps {\n lineStyle: 'solid' | 'dashed' | 'dotted';\n spacing: string;\n}\n\nexport const Divider: ComponentConfig<DividerProps> = {\n label: 'Divider',\n fields: {\n lineStyle: {\n type: 'select',\n label: 'Line Style',\n options: [\n { value: 'solid', label: 'Solid' },\n { value: 'dashed', label: 'Dashed' },\n { value: 'dotted', label: 'Dotted' },\n ],\n },\n spacing: { type: 'text', label: 'Spacing (px)' },\n },\n defaultProps: { lineStyle: 'solid', spacing: '24' },\n render: ({ lineStyle, spacing }) => {\n const s = parseInt(spacing, 10) || 24;\n return (\n <hr\n style={{\n border: 'none',\n borderTop: `1px ${lineStyle} #ddd`,\n margin: `${s / 2}px 0`,\n }}\n />\n );\n },\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { ImagePickerField } from '../../fields/ImagePickerField';\n\nexport interface EmptyStateProps {\n image: string;\n title: string;\n description: string;\n ctaText: string;\n ctaLink: string;\n}\n\nexport const EmptyState: ComponentConfig<EmptyStateProps> = {\n label: 'Empty State',\n fields: {\n image: {\n type: 'custom', label: 'Image',\n render: ({ value, onChange }) => <ImagePickerField value={value ?? ''} onChange={onChange} />,\n },\n title: { type: 'text', label: 'Title' },\n description: { type: 'text', label: 'Description' },\n ctaText: { type: 'text', label: 'CTA Text' },\n ctaLink: { type: 'text', label: 'CTA Link' },\n },\n defaultProps: { image: '', title: '', description: '', ctaText: '', ctaLink: '' },\n render: ({ image, title, description, ctaText, ctaLink }) => (\n <div style={{ textAlign: 'center', padding: '3rem 1rem' }}>\n {image && (\n <img\n src={image}\n alt={title || 'Empty state'}\n style={{ maxWidth: '200px', height: 'auto', marginBottom: '1.5rem', opacity: 0.8 }}\n />\n )}\n {title && <h2 style={{ fontSize: '1.5rem', color: '#333', marginBottom: '0.5rem' }}>{title}</h2>}\n {description && (\n <p style={{ color: '#666', marginBottom: '1.5rem', maxWidth: '400px', margin: '0 auto 1.5rem' }}>\n {description}\n </p>\n )}\n {ctaText && ctaLink && (\n <a\n href={ctaLink}\n style={{\n display: 'inline-block',\n background: '#2c5530',\n color: 'white',\n padding: '0.75rem 2rem',\n borderRadius: '4px',\n textDecoration: 'none',\n fontWeight: 600,\n }}\n >\n {ctaText}\n </a>\n )}\n </div>\n ),\n};\n","import React, { useState } from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { richTextField } from '../../fields/RichTextField';\n\nexport interface FAQAccordionProps {\n question1: string; answer1: string;\n question2: string; answer2: string;\n question3: string; answer3: string;\n question4: string; answer4: string;\n}\n\nconst FAQRender: React.FC<FAQAccordionProps> = (props) => {\n const items = [\n [props.question1, props.answer1],\n [props.question2, props.answer2],\n [props.question3, props.answer3],\n [props.question4, props.answer4],\n ].filter(([q]) => q) as [string, string][];\n\n const [open, setOpen] = useState<number | null>(null);\n\n if (items.length === 0) return (\n <div style={{ padding: '1rem', color: '#999', fontSize: '13px' }}>No FAQ items configured</div>\n );\n\n return (\n <div style={{ border: '1px solid #eee', borderRadius: '8px', overflow: 'hidden' }}>\n {items.map(([question, answer], i) => (\n <div key={i} style={{ borderBottom: i < items.length - 1 ? '1px solid #eee' : 'none' }}>\n <button\n onClick={() => setOpen(open === i ? null : i)}\n style={{\n width: '100%',\n padding: '1rem 1.25rem',\n textAlign: 'left',\n fontWeight: 600,\n fontSize: '1rem',\n background: '#fafafa',\n border: 'none',\n cursor: 'pointer',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n {question}\n <span style={{ fontSize: '1.2rem', lineHeight: 1 }}>{open === i ? '−' : '+'}</span>\n </button>\n {open === i && answer && (\n <div\n dangerouslySetInnerHTML={{ __html: answer }}\n style={{\n padding: '1rem 1.25rem',\n background: 'white',\n fontSize: '0.95rem',\n lineHeight: 1.5,\n color: '#555',\n }}\n />\n )}\n </div>\n ))}\n </div>\n );\n};\n\nexport const FAQAccordion: ComponentConfig<FAQAccordionProps> = {\n label: 'FAQ Accordion',\n fields: {\n question1: { type: 'text', label: 'Question 1' },\n answer1: richTextField('Answer 1'),\n question2: { type: 'text', label: 'Question 2' },\n answer2: richTextField('Answer 2'),\n question3: { type: 'text', label: 'Question 3' },\n answer3: richTextField('Answer 3'),\n question4: { type: 'text', label: 'Question 4' },\n answer4: richTextField('Answer 4'),\n },\n defaultProps: {\n question1: '', answer1: '',\n question2: '', answer2: '',\n question3: '', answer3: '',\n question4: '', answer4: '',\n },\n render: (props) => <FAQRender {...props} />,\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { richTextField } from '../../fields/RichTextField';\n\nexport interface FooterBlockProps {\n column1: string;\n column2: string;\n column3: string;\n copyright: string;\n}\n\nexport const FooterBlock: ComponentConfig<FooterBlockProps> = {\n label: 'Footer Block',\n fields: {\n column1: richTextField('Column 1'),\n column2: richTextField('Column 2'),\n column3: richTextField('Column 3'),\n copyright: { type: 'text', label: 'Copyright Text' },\n },\n defaultProps: { column1: '', column2: '', column3: '', copyright: '' },\n render: ({ column1, column2, column3, copyright }) => {\n const columns = [column1, column2, column3].filter(Boolean);\n return (\n <footer style={{ background: '#333', color: '#eee', padding: '2rem 1rem', marginTop: '3rem' }}>\n {columns.length > 0 && (\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: `repeat(${columns.length}, 1fr)`,\n gap: '2rem',\n maxWidth: '1200px',\n margin: '0 auto 2rem',\n }}\n >\n {columns.map((html, i) => (\n <div\n key={i}\n dangerouslySetInnerHTML={{ __html: html }}\n style={{ fontSize: '0.9rem', lineHeight: 1.6 }}\n />\n ))}\n </div>\n )}\n {copyright && (\n <p style={{ textAlign: 'center', fontSize: '0.85rem', color: '#999', margin: 0 }}>\n {copyright}\n </p>\n )}\n </footer>\n );\n },\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { ImagePickerField } from '../../fields/ImagePickerField';\n\nexport interface ImageBlockProps {\n image: string;\n caption: string;\n link: string;\n}\n\nexport const ImageBlock: ComponentConfig<ImageBlockProps> = {\n label: 'Image Block',\n fields: {\n image: {\n type: 'custom', label: 'Image',\n render: ({ value, onChange }) => <ImagePickerField value={value ?? ''} onChange={onChange} />,\n },\n caption: { type: 'text', label: 'Caption' },\n link: { type: 'text', label: 'Link URL' },\n },\n defaultProps: { image: '', caption: '', link: '' },\n render: ({ image, caption, link }) => {\n if (!image) return (\n <div style={{ padding: '2rem', textAlign: 'center', color: '#999', background: '#f5f5f5', borderRadius: '4px' }}>\n No image selected\n </div>\n );\n const img = (\n <img\n src={image}\n alt={caption || 'Image'}\n style={{ maxWidth: '100%', height: 'auto', borderRadius: '4px' }}\n />\n );\n return (\n <figure style={{ margin: '1rem 0', textAlign: 'center' }}>\n {link ? <a href={link} style={{ display: 'inline-block' }}>{img}</a> : img}\n {caption && (\n <figcaption style={{ marginTop: '0.5rem', fontSize: '0.9rem', color: '#666' }}>\n {caption}\n </figcaption>\n )}\n </figure>\n );\n },\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\n\nexport interface NewsletterSignupProps {\n title: string;\n subtitle: string;\n ctaText: string;\n placeholder: string;\n}\n\nexport const NewsletterSignup: ComponentConfig<NewsletterSignupProps> = {\n label: 'Newsletter Signup',\n fields: {\n title: { type: 'text', label: 'Title' },\n subtitle: { type: 'text', label: 'Subtitle' },\n ctaText: { type: 'text', label: 'Button Text' },\n placeholder: { type: 'text', label: 'Input Placeholder' },\n },\n defaultProps: { title: '', subtitle: '', ctaText: 'Subscribe', placeholder: 'Enter your email' },\n render: ({ title, subtitle, ctaText, placeholder }) => (\n <div\n style={{\n textAlign: 'center',\n padding: '2rem 1rem',\n background: '#f5f5f5',\n borderRadius: '8px',\n maxWidth: '480px',\n margin: '0 auto',\n }}\n >\n {title && <h3 style={{ fontSize: '1.5rem', marginBottom: '0.5rem', color: '#333' }}>{title}</h3>}\n {subtitle && <p style={{ fontSize: '0.95rem', color: '#666', marginBottom: '1.5rem' }}>{subtitle}</p>}\n <form\n onSubmit={(e) => e.preventDefault()}\n style={{ display: 'flex', gap: '0.5rem', flexWrap: 'wrap', justifyContent: 'center' }}\n >\n <input\n type=\"email\"\n placeholder={placeholder}\n aria-label=\"Email\"\n style={{\n padding: '0.75rem 1rem',\n border: '1px solid #ddd',\n borderRadius: '4px',\n fontSize: '1rem',\n minWidth: '200px',\n }}\n />\n <button\n type=\"submit\"\n style={{\n padding: '0.75rem 1.5rem',\n background: '#2c5530',\n color: 'white',\n border: 'none',\n borderRadius: '4px',\n fontWeight: 600,\n cursor: 'pointer',\n }}\n >\n {ctaText || 'Subscribe'}\n </button>\n </form>\n </div>\n ),\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { useDatasource } from '@commercetools-demo/puck-api';\nimport { DatasourceField, type DatasourceValue } from '../../fields/DatasourceField';\nimport { richTextField } from '../../fields/RichTextField';\nimport {\n formatPrice,\n getFirstPrice,\n getLocalizedText,\n productLinkDefaults,\n productLinkFields,\n resolveProductLink,\n type ProductLinkProps,\n} from './shared';\n\nexport interface ProductBannerProps extends ProductLinkProps {\n title: string;\n description: string;\n ctaText: string;\n ctaLink: string;\n product: DatasourceValue;\n productOnLeft: boolean;\n background: string;\n}\n\nconst ProductBannerRender: React.FC<ProductBannerProps> = ({\n title, description, ctaText, ctaLink, product, productOnLeft, background, linkWith, baseUrl,\n}) => {\n const hasPreResolved = product?.resolvedData != null;\n const { data: fetchedData, loading } = useDatasource(\n hasPreResolved ? undefined : product?.type,\n hasPreResolved ? [] : (product?.skus ?? [])\n );\n const raw = hasPreResolved ? product.resolvedData : fetchedData;\n const p = raw as any;\n\n const name = getLocalizedText(p?.name);\n const description2 = getLocalizedText(p?.description);\n const imageUrl = p?.masterVariant?.images?.[0]?.url;\n const sku = p?.masterVariant?.sku;\n const priceVal = getFirstPrice(p);\n const productHref = p ? resolveProductLink(p, linkWith, baseUrl) : undefined;\n\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n minHeight: '400px',\n backgroundColor: background || '#f5f5f5',\n padding: '2rem',\n borderRadius: '2px',\n margin: '1rem 0',\n gap: '2rem',\n flexDirection: productOnLeft ? 'row-reverse' : 'row',\n flexWrap: 'wrap',\n }}\n >\n {/* Content side */}\n <div style={{ flex: 1, minWidth: '200px' }}>\n {title && <h2 style={{ fontSize: '2rem', fontWeight: 'bold', marginBottom: '1rem', color: '#333' }}>{title}</h2>}\n {description && (\n <div\n dangerouslySetInnerHTML={{ __html: description }}\n style={{ marginBottom: '2rem', color: '#555', lineHeight: 1.6 }}\n />\n )}\n {ctaText && ctaLink && (\n <a\n href={ctaLink}\n style={{\n display: 'inline-block',\n backgroundColor: '#2c5530',\n color: 'white',\n padding: '0.75rem 2rem',\n borderRadius: '2px',\n textDecoration: 'none',\n fontWeight: 600,\n }}\n >\n {ctaText}\n </a>\n )}\n </div>\n\n {/* Product side */}\n <div style={{ flex: 1, minWidth: '200px', display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n {loading && <div style={{ color: '#999', padding: '2rem' }}>Loading product…</div>}\n {name && (\n <a href={productHref} style={{ textDecoration: 'none', color: 'inherit' }}>\n <h3 style={{ fontSize: '1.5rem', fontWeight: 600, marginBottom: '0.5rem', textAlign: 'center' }}>{name}</h3>\n </a>\n )}\n {description2 && <p style={{ fontSize: '0.9rem', color: '#666', textAlign: 'center', marginBottom: '1rem', fontStyle: 'italic' }}>{description2}</p>}\n {imageUrl && (\n <a href={productHref} style={{ display: 'block', marginBottom: '1rem' }}>\n <img\n src={imageUrl}\n alt={name || 'Product'}\n style={{ maxWidth: '100%', maxHeight: '300px', objectFit: 'cover', borderRadius: '2px', boxShadow: '0 4px 12px rgba(0,0,0,0.1)', display: 'block' }}\n />\n </a>\n )}\n {priceVal && (\n <span\n style={{\n fontSize: '1.25rem',\n fontWeight: 'bold',\n color: '#2c5530',\n background: 'rgba(255,255,255,0.8)',\n padding: '0.5rem 1rem',\n borderRadius: '2px',\n marginBottom: '0.5rem',\n }}\n >\n {formatPrice(priceVal.centAmount, priceVal.currencyCode, priceVal.fractionDigits)}\n </span>\n )}\n {sku && (\n <span style={{ fontSize: '0.85rem', color: '#666', background: 'rgba(255,255,255,0.6)', padding: '0.25rem 0.75rem', borderRadius: '2px' }}>\n SKU: {sku}\n </span>\n )}\n {!loading && !p && (\n <div style={{ color: '#999', fontSize: '13px', padding: '2rem', textAlign: 'center' }}>No product selected</div>\n )}\n </div>\n </div>\n );\n};\n\nexport const ProductBanner: ComponentConfig<ProductBannerProps> = {\n label: 'Product Banner',\n fields: {\n title: { type: 'text', label: 'Title' },\n description: richTextField('Description'),\n ctaText: { type: 'text', label: 'CTA Text' },\n ctaLink: { type: 'text', label: 'CTA Link' },\n product: {\n type: 'custom', label: 'Product',\n render: ({ value, onChange }) => <DatasourceField value={value} onChange={onChange} />,\n },\n productOnLeft: {\n type: 'radio', label: 'Product Position',\n options: [\n { value: false, label: 'Product on Right' },\n { value: true, label: 'Product on Left' },\n ],\n },\n background: { type: 'text', label: 'Background Color' },\n ...productLinkFields,\n },\n defaultProps: {\n title: '',\n description: '',\n ctaText: '',\n ctaLink: '',\n product: { type: 'product-by-sku', skus: [''] },\n productOnLeft: false,\n background: '#f5f5f5',\n ...productLinkDefaults,\n },\n render: (props) => <ProductBannerRender {...props} />,\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { richTextField } from '../../fields/RichTextField';\n\nexport interface ProductGridHeaderProps {\n title: string;\n description: string;\n}\n\nexport const ProductGridHeader: ComponentConfig<ProductGridHeaderProps> = {\n label: 'Product Grid Header',\n fields: {\n title: { type: 'text', label: 'Title' },\n description: richTextField('Description'),\n },\n defaultProps: { title: '', description: '' },\n render: ({ title, description }) => (\n <div style={{ marginBottom: '2rem', padding: '0 1rem' }}>\n {title && (\n <h1 style={{ fontSize: '2rem', fontWeight: 'bold', color: '#333', marginBottom: '0.75rem' }}>\n {title}\n </h1>\n )}\n {description && (\n <div\n dangerouslySetInnerHTML={{ __html: description }}\n style={{ fontSize: '1rem', color: '#666', lineHeight: 1.5, maxWidth: '720px' }}\n />\n )}\n </div>\n ),\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { useDatasource } from '@commercetools-demo/puck-api';\nimport { DatasourceField, type DatasourceValue } from '../../fields/DatasourceField';\nimport {\n formatPrice,\n getFirstPrice,\n getLocalizedText,\n getProductImage,\n productLinkDefaults,\n productLinkFields,\n resolveProductLink,\n type ProductLinkProps,\n} from './shared';\n\nexport interface ProductSliderProps extends ProductLinkProps {\n title: string;\n subtitle: string;\n products: DatasourceValue;\n}\n\nconst ProductSliderRender: React.FC<ProductSliderProps> = ({ title, subtitle, products, linkWith, baseUrl }) => {\n const hasPreResolved = products?.resolvedData != null;\n const { data: fetchedData, loading } = useDatasource(\n hasPreResolved ? undefined : products?.type,\n hasPreResolved ? [] : (products?.skus ?? [])\n );\n const items: unknown[] = hasPreResolved\n ? (Array.isArray(products.resolvedData) ? products.resolvedData : [])\n : (Array.isArray(fetchedData) ? fetchedData : []);\n\n return (\n <div style={{ padding: '2rem 0' }}>\n {(title || subtitle) && (\n <div style={{ textAlign: 'center', marginBottom: '1.5rem' }}>\n {title && <h2 style={{ fontSize: '2rem', fontWeight: 'bold', color: '#333', marginBottom: '0.5rem' }}>{title}</h2>}\n {subtitle && <p style={{ fontSize: '1.1rem', color: '#666', margin: 0 }}>{subtitle}</p>}\n </div>\n )}\n {loading && <div style={{ textAlign: 'center', color: '#999', padding: '2rem' }}>Loading products…</div>}\n {!loading && items.length === 0 && (\n <div style={{ textAlign: 'center', color: '#999', padding: '2rem', fontSize: '13px' }}>No products configured</div>\n )}\n {items.length > 0 && (\n <div\n style={{\n display: 'flex',\n gap: '1rem',\n overflowX: 'auto',\n scrollSnapType: 'x mandatory',\n paddingBottom: '1rem',\n }}\n >\n {items.map((product, i) => {\n const name = getLocalizedText((product as any)?.name);\n const desc = getLocalizedText((product as any)?.description);\n const imageUrl = getProductImage(product);\n const priceVal = getFirstPrice(product);\n return (\n <a\n key={(product as any)?.id ?? i}\n href={resolveProductLink(product, linkWith, baseUrl)}\n style={{\n flex: '0 0 280px',\n background: 'white',\n borderRadius: '12px',\n boxShadow: '0 4px 12px rgba(0,0,0,0.1)',\n overflow: 'hidden',\n textDecoration: 'none',\n color: 'inherit',\n scrollSnapAlign: 'start',\n }}\n >\n <div style={{ width: '100%', height: '200px', background: '#f5f5f5', display: 'flex', alignItems: 'center', justifyContent: 'center', overflow: 'hidden' }}>\n {imageUrl\n ? <img src={imageUrl} alt={name} style={{ width: '100%', height: '100%', objectFit: 'contain' }} />\n : <span style={{ color: '#999', fontSize: '0.85rem' }}>No image</span>\n }\n </div>\n <div style={{ padding: '1.5rem' }}>\n <h3 style={{ fontSize: '1.1rem', fontWeight: 600, color: '#333', marginBottom: '0.5rem', lineHeight: 1.3 }}>{name}</h3>\n {desc && (\n <p style={{ fontSize: '0.9rem', color: '#666', marginBottom: '1rem', display: '-webkit-box', WebkitLineClamp: 2, WebkitBoxOrient: 'vertical', overflow: 'hidden' }}>\n {desc}\n </p>\n )}\n {priceVal && (\n <div style={{ fontSize: '1.2rem', fontWeight: 'bold', color: '#2c5530' }}>\n {formatPrice(priceVal.centAmount, priceVal.currencyCode, priceVal.fractionDigits)}\n </div>\n )}\n </div>\n </a>\n );\n })}\n </div>\n )}\n </div>\n );\n};\n\nexport const ProductSlider: ComponentConfig<ProductSliderProps> = {\n label: 'Product Slider',\n fields: {\n title: { type: 'text', label: 'Title' },\n subtitle: { type: 'text', label: 'Subtitle' },\n products: {\n type: 'custom', label: 'Products',\n render: ({ value, onChange }) => <DatasourceField value={value} onChange={onChange} />,\n },\n ...productLinkFields,\n },\n defaultProps: {\n title: '',\n subtitle: '',\n products: { type: 'products-by-sku', skus: [''] },\n ...productLinkDefaults,\n },\n render: (props) => <ProductSliderRender {...props} />,\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { ImagePickerField } from '../../fields/ImagePickerField';\n\nexport interface PromotionalBannerProps {\n image: string;\n title: string;\n subtitle: string;\n ctaText: string;\n ctaLink: string;\n background: string;\n}\n\nexport const PromotionalBanner: ComponentConfig<PromotionalBannerProps> = {\n label: 'Promotional Banner',\n fields: {\n image: {\n type: 'custom', label: 'Image',\n render: ({ value, onChange }) => <ImagePickerField value={value ?? ''} onChange={onChange} />,\n },\n title: { type: 'text', label: 'Title' },\n subtitle: { type: 'text', label: 'Subtitle' },\n ctaText: { type: 'text', label: 'CTA Text' },\n ctaLink: { type: 'text', label: 'CTA Link' },\n background: { type: 'text', label: 'Background Color' },\n },\n defaultProps: { image: '', title: '', subtitle: '', ctaText: '', ctaLink: '', background: '#f5f5f5' },\n render: ({ image, title, subtitle, ctaText, ctaLink, background }) => (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '280px',\n backgroundColor: background || '#f5f5f5',\n padding: '2rem',\n borderRadius: '2px',\n margin: '1rem 0',\n gap: '2rem',\n flexWrap: 'wrap',\n }}\n >\n {image && (\n <div style={{ flex: '0 0 auto', maxWidth: '40%' }}>\n <img src={image} alt={title || 'Promo'} style={{ maxWidth: '100%', height: 'auto', borderRadius: '2px' }} />\n </div>\n )}\n <div style={{ flex: 1, minWidth: '200px' }}>\n {title && <h2 style={{ fontSize: '1.75rem', fontWeight: 'bold', marginBottom: '0.5rem', color: '#333' }}>{title}</h2>}\n {subtitle && <p style={{ fontSize: '1rem', color: '#666', marginBottom: '1rem' }}>{subtitle}</p>}\n {ctaText && ctaLink && (\n <a\n href={ctaLink}\n style={{\n display: 'inline-block',\n backgroundColor: '#2c5530',\n color: 'white',\n padding: '0.75rem 2rem',\n borderRadius: '2px',\n textDecoration: 'none',\n fontWeight: 600,\n }}\n >\n {ctaText}\n </a>\n )}\n </div>\n </div>\n ),\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { useDatasource } from '@commercetools-demo/puck-api';\nimport { DatasourceField, type DatasourceValue } from '../../fields/DatasourceField';\nimport {\n formatPrice,\n getFirstPrice,\n getLocalizedText,\n getProductImage,\n productLinkDefaults,\n productLinkFields,\n resolveProductLink,\n type ProductLinkProps,\n} from './shared';\n\nexport interface RelatedProductsSliderProps extends ProductLinkProps {\n title: string;\n subtitle: string;\n products: DatasourceValue;\n}\n\nconst RelatedProductsRender: React.FC<RelatedProductsSliderProps> = ({ title, subtitle, products, linkWith, baseUrl }) => {\n const hasPreResolved = products?.resolvedData != null;\n const { data: fetchedData, loading } = useDatasource(\n hasPreResolved ? undefined : products?.type,\n hasPreResolved ? [] : (products?.skus ?? [])\n );\n const items: unknown[] = hasPreResolved\n ? (Array.isArray(products.resolvedData) ? products.resolvedData : [])\n : (Array.isArray(fetchedData) ? fetchedData : []);\n\n if (!loading && items.length === 0) return null;\n\n return (\n <div style={{ padding: '2rem 0' }}>\n {(title || subtitle) && (\n <div style={{ textAlign: 'center', marginBottom: '1.5rem' }}>\n {title && <h2 style={{ fontSize: '2rem', fontWeight: 'bold', color: '#333', marginBottom: '0.5rem' }}>{title}</h2>}\n {subtitle && <p style={{ fontSize: '1.1rem', color: '#666', margin: 0 }}>{subtitle}</p>}\n </div>\n )}\n {loading && <div style={{ textAlign: 'center', color: '#999', padding: '2rem' }}>Loading…</div>}\n {items.length > 0 && (\n <div\n style={{\n display: 'flex',\n gap: '1rem',\n overflowX: 'auto',\n scrollSnapType: 'x mandatory',\n paddingBottom: '1rem',\n }}\n >\n {items.map((product, i) => {\n const name = getLocalizedText((product as any)?.name);\n const imageUrl = getProductImage(product);\n const priceVal = getFirstPrice(product);\n return (\n <a\n key={(product as any)?.id ?? i}\n href={resolveProductLink(product, linkWith, baseUrl)}\n style={{\n flex: '0 0 280px',\n background: 'white',\n borderRadius: '12px',\n boxShadow: '0 4px 12px rgba(0,0,0,0.1)',\n overflow: 'hidden',\n textDecoration: 'none',\n color: 'inherit',\n scrollSnapAlign: 'start',\n }}\n >\n <div style={{ width: '100%', height: '200px', background: '#f5f5f5', display: 'flex', alignItems: 'center', justifyContent: 'center', overflow: 'hidden' }}>\n {imageUrl\n ? <img src={imageUrl} alt={name} style={{ width: '100%', height: '100%', objectFit: 'contain' }} />\n : <span style={{ color: '#999', fontSize: '0.85rem' }}>No image</span>\n }\n </div>\n <div style={{ padding: '1.5rem' }}>\n <h3 style={{ fontSize: '1.1rem', fontWeight: 600, color: '#333', marginBottom: '0.5rem' }}>{name}</h3>\n {priceVal && (\n <div style={{ fontSize: '1.2rem', fontWeight: 'bold', color: '#2c5530' }}>\n {formatPrice(priceVal.centAmount, priceVal.currencyCode, priceVal.fractionDigits)}\n </div>\n )}\n </div>\n </a>\n );\n })}\n </div>\n )}\n </div>\n );\n};\n\nexport const RelatedProductsSlider: ComponentConfig<RelatedProductsSliderProps> = {\n label: 'Related Products',\n fields: {\n title: { type: 'text', label: 'Title' },\n subtitle: { type: 'text', label: 'Subtitle' },\n products: {\n type: 'custom', label: 'Products',\n render: ({ value, onChange }) => <DatasourceField value={value} onChange={onChange} />,\n },\n ...productLinkFields,\n },\n defaultProps: {\n title: 'Related Products',\n subtitle: '',\n products: { type: 'products-by-sku', skus: [''] },\n ...productLinkDefaults,\n },\n render: (props) => <RelatedProductsRender {...props} />,\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\n\nexport interface SocialLinksProps {\n link1Label: string; link1Url: string;\n link2Label: string; link2Url: string;\n link3Label: string; link3Url: string;\n link4Label: string; link4Url: string;\n}\n\nexport const SocialLinks: ComponentConfig<SocialLinksProps> = {\n label: 'Social Links',\n fields: {\n link1Label: { type: 'text', label: 'Link 1 Label' },\n link1Url: { type: 'text', label: 'Link 1 URL' },\n link2Label: { type: 'text', label: 'Link 2 Label' },\n link2Url: { type: 'text', label: 'Link 2 URL' },\n link3Label: { type: 'text', label: 'Link 3 Label' },\n link3Url: { type: 'text', label: 'Link 3 URL' },\n link4Label: { type: 'text', label: 'Link 4 Label' },\n link4Url: { type: 'text', label: 'Link 4 URL' },\n },\n defaultProps: {\n link1Label: '', link1Url: '',\n link2Label: '', link2Url: '',\n link3Label: '', link3Url: '',\n link4Label: '', link4Url: '',\n },\n render: (props) => {\n const links = [\n [props.link1Label, props.link1Url],\n [props.link2Label, props.link2Url],\n [props.link3Label, props.link3Url],\n [props.link4Label, props.link4Url],\n ].filter(([label, url]) => label && url) as [string, string][];\n if (links.length === 0) return <></>;\n return (\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: '1rem', padding: '0.5rem 0' }}>\n {links.map(([label, url], i) => (\n <a\n key={i}\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{ color: '#2c5530', textDecoration: 'none', fontWeight: 500, fontSize: '0.95rem' }}\n >\n {label}\n </a>\n ))}\n </div>\n );\n },\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { richTextField } from '../../fields/RichTextField';\n\nexport interface TabContentProps {\n tabLabel: string;\n content: string;\n}\n\nexport const TabContent: ComponentConfig<TabContentProps> = {\n label: 'Tab Content',\n fields: {\n tabLabel: { type: 'text', label: 'Tab Label' },\n content: richTextField('Content'),\n },\n defaultProps: { tabLabel: '', content: '' },\n render: ({ tabLabel, content }) => {\n if (!content) return <></>;\n return (\n <div style={{ padding: '1.5rem 0', lineHeight: 1.6, color: '#333' }}>\n {tabLabel && <h3 style={{ marginBottom: '1rem' }}>{tabLabel}</h3>}\n <div dangerouslySetInnerHTML={{ __html: content }} />\n </div>\n );\n },\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\n\nexport interface TestimonialsSliderProps {\n quote1: string; author1: string; role1: string;\n quote2: string; author2: string; role2: string;\n quote3: string; author3: string; role3: string;\n}\n\nexport const TestimonialsSlider: ComponentConfig<TestimonialsSliderProps> = {\n label: 'Testimonials',\n fields: {\n quote1: { type: 'textarea', label: 'Quote 1' },\n author1: { type: 'text', label: 'Author 1' },\n role1: { type: 'text', label: 'Role 1' },\n quote2: { type: 'textarea', label: 'Quote 2' },\n author2: { type: 'text', label: 'Author 2' },\n role2: { type: 'text', label: 'Role 2' },\n quote3: { type: 'textarea', label: 'Quote 3' },\n author3: { type: 'text', label: 'Author 3' },\n role3: { type: 'text', label: 'Role 3' },\n },\n defaultProps: {\n quote1: '', author1: '', role1: '',\n quote2: '', author2: '', role2: '',\n quote3: '', author3: '', role3: '',\n },\n render: (props) => {\n const items = [\n [props.quote1, props.author1, props.role1],\n [props.quote2, props.author2, props.role2],\n [props.quote3, props.author3, props.role3],\n ].filter(([q]) => q) as [string, string, string][];\n if (items.length === 0) return <></>;\n return (\n <div style={{ padding: '2rem 1rem', background: '#f9f9f9', borderRadius: '8px', margin: '1rem 0' }}>\n {items.map(([quote, author, role], i) => (\n <div key={i} style={{ marginBottom: i < items.length - 1 ? '2rem' : 0 }}>\n <blockquote\n style={{\n fontSize: '1.15rem',\n fontStyle: 'italic',\n color: '#444',\n margin: '0 0 0.75rem 0',\n paddingLeft: '1rem',\n borderLeft: '4px solid #2c5530',\n }}\n >\n {quote}\n </blockquote>\n {author && (\n <cite style={{ fontStyle: 'normal', fontSize: '0.95rem', fontWeight: 600, color: '#333' }}>\n — {author}\n {role && <span style={{ fontWeight: 'normal', color: '#666' }}> ({role})</span>}\n </cite>\n )}\n </div>\n ))}\n </div>\n );\n },\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { richTextField } from '../../fields/RichTextField';\n\nexport interface ThankYouContentProps {\n headline: string;\n message: string;\n ctaText: string;\n ctaLink: string;\n}\n\nexport const ThankYouContent: ComponentConfig<ThankYouContentProps> = {\n label: 'Thank You Content',\n fields: {\n headline: { type: 'text', label: 'Headline' },\n message: richTextField('Message'),\n ctaText: { type: 'text', label: 'CTA Text' },\n ctaLink: { type: 'text', label: 'CTA Link' },\n },\n defaultProps: { headline: 'Thank you for your order!', message: '', ctaText: '', ctaLink: '' },\n render: ({ headline, message, ctaText, ctaLink }) => (\n <div style={{ textAlign: 'center', padding: '3rem 1rem', maxWidth: '560px', margin: '0 auto' }}>\n {headline && (\n <h1 style={{ fontSize: '2rem', color: '#2c5530', marginBottom: '1rem' }}>{headline}</h1>\n )}\n {message && (\n <div\n dangerouslySetInnerHTML={{ __html: message }}\n style={{ fontSize: '1rem', lineHeight: 1.6, color: '#555', marginBottom: '2rem' }}\n />\n )}\n {ctaText && ctaLink && (\n <a\n href={ctaLink}\n style={{\n display: 'inline-block',\n background: '#2c5530',\n color: 'white',\n padding: '0.75rem 2rem',\n borderRadius: '4px',\n textDecoration: 'none',\n fontWeight: 600,\n }}\n >\n {ctaText}\n </a>\n )}\n </div>\n ),\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { ImagePickerField } from '../../fields/ImagePickerField';\n\nexport interface TrustBadgesProps {\n badge1Icon: string; badge1Label: string;\n badge2Icon: string; badge2Label: string;\n badge3Icon: string; badge3Label: string;\n badge4Icon: string; badge4Label: string;\n}\n\nconst iconField = (label: string) => ({\n type: 'custom' as const,\n label,\n render: ({ value, onChange }: { value: string; onChange: (v: string) => void }) => (\n <ImagePickerField value={value ?? ''} onChange={onChange} />\n ),\n});\n\nexport const TrustBadges: ComponentConfig<TrustBadgesProps> = {\n label: 'Trust Badges',\n fields: {\n badge1Icon: iconField('Badge 1 Icon'),\n badge1Label: { type: 'text', label: 'Badge 1 Label' },\n badge2Icon: iconField('Badge 2 Icon'),\n badge2Label: { type: 'text', label: 'Badge 2 Label' },\n badge3Icon: iconField('Badge 3 Icon'),\n badge3Label: { type: 'text', label: 'Badge 3 Label' },\n badge4Icon: iconField('Badge 4 Icon'),\n badge4Label: { type: 'text', label: 'Badge 4 Label' },\n },\n defaultProps: {\n badge1Icon: '', badge1Label: '',\n badge2Icon: '', badge2Label: '',\n badge3Icon: '', badge3Label: '',\n badge4Icon: '', badge4Label: '',\n },\n render: (props) => {\n const badges = [\n [props.badge1Icon, props.badge1Label],\n [props.badge2Icon, props.badge2Label],\n [props.badge3Icon, props.badge3Label],\n [props.badge4Icon, props.badge4Label],\n ].filter(([, label]) => label) as [string, string][];\n if (badges.length === 0) return <></>;\n return (\n <div\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'center',\n gap: '2rem',\n padding: '2rem 1rem',\n background: '#f9f9f9',\n borderRadius: '4px',\n }}\n >\n {badges.map(([icon, label], i) => (\n <div key={i} style={{ display: 'flex', alignItems: 'center', gap: '0.75rem' }}>\n {icon && (\n <img\n src={icon}\n alt={label}\n style={{ width: '40px', height: '40px', objectFit: 'contain' }}\n />\n )}\n <span style={{ fontSize: '0.95rem', fontWeight: 500, color: '#333' }}>{label}</span>\n </div>\n ))}\n </div>\n );\n },\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { ImagePickerField } from '../../fields/ImagePickerField';\n\nexport interface VideoBlockProps {\n videoUrl: string;\n posterImage: string;\n title: string;\n caption: string;\n}\n\nexport const VideoBlock: ComponentConfig<VideoBlockProps> = {\n label: 'Video Block',\n fields: {\n videoUrl: { type: 'text', label: 'Video URL' },\n posterImage: {\n type: 'custom', label: 'Poster Image',\n render: ({ value, onChange }) => <ImagePickerField value={value ?? ''} onChange={onChange} />,\n },\n title: { type: 'text', label: 'Title' },\n caption: { type: 'text', label: 'Caption' },\n },\n defaultProps: { videoUrl: '', posterImage: '', title: '', caption: '' },\n render: ({ videoUrl, posterImage, title, caption }) => {\n if (!videoUrl) return (\n <div style={{ padding: '2rem', textAlign: 'center', color: '#999', background: '#f5f5f5', borderRadius: '8px' }}>\n No video URL configured\n </div>\n );\n return (\n <div style={{ margin: '1.5rem 0' }}>\n <div\n style={{\n position: 'relative',\n paddingBottom: '56.25%',\n height: 0,\n overflow: 'hidden',\n background: '#000',\n borderRadius: '8px',\n }}\n >\n <video\n src={videoUrl}\n poster={posterImage || undefined}\n controls\n preload=\"metadata\"\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n objectFit: 'contain',\n }}\n />\n </div>\n {title && <h4 style={{ marginTop: '0.75rem', fontSize: '1.1rem', color: '#333' }}>{title}</h4>}\n {caption && <p style={{ fontSize: '0.9rem', color: '#666', marginTop: '0.25rem' }}>{caption}</p>}\n </div>\n );\n },\n};\n","import React from 'react';\nimport { type ComponentConfig } from '@measured/puck';\nimport { ImagePickerField } from '../../fields/ImagePickerField';\n\nexport interface WebsiteLogoProps {\n logo: string;\n maxWidth: string;\n maxHeight: string;\n}\n\nexport const WebsiteLogo: ComponentConfig<WebsiteLogoProps> = {\n label: 'Website Logo',\n fields: {\n logo: {\n type: 'custom', label: 'Logo',\n render: ({ value, onChange }) => <ImagePickerField value={value ?? ''} onChange={onChange} />,\n },\n maxWidth: { type: 'text', label: 'Max Width (px)' },\n maxHeight: { type: 'text', label: 'Max Height (px)' },\n },\n defaultProps: { logo: '', maxWidth: '180', maxHeight: '50' },\n render: ({ logo, maxWidth, maxHeight }) => {\n if (!logo) return (\n <div style={{ width: `${parseInt(maxWidth, 10) || 180}px`, height: `${parseInt(maxHeight, 10) || 50}px`, background: '#f0f0f0', borderRadius: '4px' }} />\n );\n return (\n <div\n style={{\n maxWidth: `${parseInt(maxWidth, 10) || 180}px`,\n maxHeight: `${parseInt(maxHeight, 10) || 50}px`,\n }}\n >\n <img\n src={logo}\n alt=\"Logo\"\n style={{ width: '100%', height: '100%', objectFit: 'contain' }}\n />\n </div>\n );\n },\n};\n","import React from 'react';\nimport type { PuckStateInfo } from '@commercetools-demo/puck-types';\nimport { usePuck } from '@measured/puck';\nimport { useVersionHistoryContext } from '@commercetools-demo/puck-version-history';\nimport {\n Badge,\n Button,\n Icon,\n IconButton,\n Menu,\n Stack,\n Text,\n} from '@commercetools/nimbus';\nimport {\n History,\n MoreVert,\n PostAdd,\n Redo,\n SettingsBackupRestore,\n Tune,\n Undo,\n Category,\n Visibility,\n} from '@commercetools/nimbus-icons';\n\nexport interface EditorToolbarProps {\n /** Page / content name shown centred in the bar. */\n title: string;\n saving: boolean;\n isDirty: boolean;\n states: PuckStateInfo;\n onSave: () => void;\n onPublish: () => void;\n onRevert: () => void;\n /** When provided, renders a Preview button that opens the preview view. */\n onPreview?: () => void;\n /** When provided, adds a \"Create a template from this…\" overflow-menu item. */\n onCreateTemplate?: () => void;\n /** Label for the create-template menu item. */\n createTemplateLabel?: string;\n showPublishButton: boolean;\n}\n\n/**\n * Full replacement for Puck's header (wired via the `header` override).\n *\n * Layout: undo/redo + panel toggle on the left, the document name with its\n * status badges centred, and the Save / Publish / Preview actions plus an\n * overflow menu (version history, revert) on the right.\n */\nexport const EditorToolbar: React.FC<EditorToolbarProps> = ({\n title,\n saving,\n isDirty,\n states,\n onSave,\n onPublish,\n onRevert,\n onPreview,\n onCreateTemplate,\n createTemplateLabel = 'Create a template from this page',\n showPublishButton,\n}) => {\n const { dispatch, appState, history } = usePuck();\n const { isHistoryTabActive, openHistoryTab, closeHistoryTab } =\n useVersionHistoryContext();\n\n const hasDraft = Boolean(states.draft);\n const hasPublished = Boolean(states.published);\n const canRevert = hasDraft && hasPublished;\n\n const toggleHistory = () =>\n isHistoryTabActive ? closeHistoryTab() : openHistoryTab();\n\n const toggleLeftPanel = () =>\n dispatch({\n type: 'setUi',\n ui: { leftSideBarVisible: !appState.ui.leftSideBarVisible },\n });\n\n const toggleRightPanel = () =>\n dispatch({\n type: 'setUi',\n ui: { rightSideBarVisible: !appState.ui.rightSideBarVisible },\n });\n\n return (\n <div\n style={{\n // Claim the \"header\" cell of Puck's PuckLayout-inner grid — the default\n // <header> gets this via a CSS class we no longer render.\n gridArea: 'header',\n background: 'var(--puck-color-white, #fff)',\n borderBottom: '1px solid var(--puck-color-grey-09, #e2e2e2)',\n padding: '8px 12px',\n }}\n >\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'minmax(0, 1fr) auto minmax(0, 1fr)',\n alignItems: 'center',\n gap: '12px',\n }}\n >\n {/* LEFT — panel toggle + undo / redo */}\n <Stack direction=\"row\" gap=\"100\" alignItems=\"center\" justifyContent=\"flex-start\">\n <IconButton\n aria-label=\"Toggle components panel\"\n variant=\"ghost\"\n size=\"xs\"\n onPress={toggleLeftPanel}\n >\n <Category />\n </IconButton>\n <IconButton\n aria-label=\"Toggle properties panel\"\n variant=\"ghost\"\n size=\"xs\"\n onPress={toggleRightPanel}\n >\n <Tune />\n </IconButton>\n <IconButton\n aria-label=\"Undo\"\n variant=\"ghost\"\n size=\"xs\"\n isDisabled={!history.hasPast}\n onPress={() => history.back()}\n >\n <Undo />\n </IconButton>\n <IconButton\n aria-label=\"Redo\"\n variant=\"ghost\"\n size=\"xs\"\n isDisabled={!history.hasFuture}\n onPress={() => history.forward()}\n >\n <Redo />\n </IconButton>\n </Stack>\n\n {/* CENTER — document name + status badges */}\n <Stack direction=\"row\" gap=\"200\" alignItems=\"center\" justifyContent=\"center\">\n <Text fontWeight=\"700\" truncate>\n {title}\n </Text>\n <Stack direction=\"row\" gap=\"100\" alignItems=\"center\">\n {saving && (\n <Badge colorPalette=\"warning\" size=\"xs\">\n Saving…\n </Badge>\n )}\n {!saving && isDirty && (\n <Badge colorPalette=\"neutral\" size=\"xs\">\n Unsaved\n </Badge>\n )}\n {!saving && !isDirty && hasDraft && (\n <Badge colorPalette=\"info\" size=\"xs\">\n Draft\n </Badge>\n )}\n {hasPublished && (\n <Badge colorPalette=\"positive\" size=\"xs\">\n Published\n </Badge>\n )}\n </Stack>\n </Stack>\n\n {/* RIGHT — preview / save / publish + overflow menu */}\n <Stack direction=\"row\" gap=\"200\" alignItems=\"center\" justifyContent=\"flex-end\">\n {onPreview && (\n <Button variant=\"ghost\" size=\"xs\" onPress={onPreview} isDisabled={saving}>\n <Icon as={Visibility} /> Preview\n </Button>\n )}\n <Button\n variant=\"outline\"\n size=\"xs\"\n onPress={onSave}\n isDisabled={!isDirty || saving}\n >\n Save\n </Button>\n {showPublishButton && (\n <Button variant=\"solid\" size=\"xs\" onPress={onPublish} isDisabled={saving}>\n Publish\n </Button>\n )}\n <Menu.Root\n onAction={(key) => {\n if (key === 'history') toggleHistory();\n else if (key === 'revert') onRevert();\n else if (key === 'create-template') onCreateTemplate?.();\n }}\n >\n <Menu.Trigger asChild>\n <IconButton\n aria-label=\"More options\"\n variant=\"ghost\"\n size=\"xs\"\n isDisabled={saving}\n >\n <MoreVert />\n </IconButton>\n </Menu.Trigger>\n <Menu.Content>\n <Menu.Item id=\"history\">\n <Icon slot=\"icon\">\n <History />\n </Icon>\n <Text slot=\"label\">\n {isHistoryTabActive ? 'Hide version history' : 'Version history'}\n </Text>\n </Menu.Item>\n {canRevert && (\n <Menu.Item id=\"revert\">\n <Icon slot=\"icon\">\n <SettingsBackupRestore />\n </Icon>\n <Text slot=\"label\">Revert to published</Text>\n </Menu.Item>\n )}\n {onCreateTemplate && (\n <Menu.Item id=\"create-template\">\n <Icon slot=\"icon\">\n <PostAdd />\n </Icon>\n <Text slot=\"label\">{createTemplateLabel}</Text>\n </Menu.Item>\n )}\n </Menu.Content>\n </Menu.Root>\n </Stack>\n </div>\n </div>\n );\n};\n","import React, { useEffect, useState } from 'react';\nimport {\n Button,\n Checkbox,\n Dialog,\n FormField,\n Stack,\n Text,\n TextInput,\n} from '@commercetools/nimbus';\n\nexport interface CreateTemplateDialogProps {\n /** Whether the dialog is visible. */\n isOpen: boolean;\n /** Called when the dialog requests to open/close (backdrop, Esc, Cancel). */\n onOpenChange: (isOpen: boolean) => void;\n /**\n * Called when the user confirms. `withoutData` reflects the\n * \"Create template without data\" checkbox (default checked).\n */\n onConfirm: (name: string, withoutData: boolean) => void | Promise<void>;\n /** Disables the form while the template is being created. */\n saving?: boolean;\n}\n\n/**\n * Nimbus dialog for \"Create a template from this page/content\". Collects a\n * template name and whether to strip component data before saving.\n */\nexport const CreateTemplateDialog: React.FC<CreateTemplateDialogProps> = ({\n isOpen,\n onOpenChange,\n onConfirm,\n saving = false,\n}) => {\n const [name, setName] = useState('');\n const [withoutData, setWithoutData] = useState(true);\n const [error, setError] = useState('');\n\n // Reset the form each time the dialog opens.\n useEffect(() => {\n if (isOpen) {\n setName('');\n setWithoutData(true);\n setError('');\n }\n }, [isOpen]);\n\n const handleConfirm = () => {\n if (!name.trim()) {\n setError('Name is required');\n return;\n }\n setError('');\n void onConfirm(name.trim(), withoutData);\n };\n\n return (\n <Dialog.Root isOpen={isOpen} onOpenChange={onOpenChange}>\n <Dialog.Content>\n <Dialog.Header>\n <Dialog.Title>Create a new template</Dialog.Title>\n <Dialog.CloseTrigger />\n </Dialog.Header>\n <Dialog.Body>\n <Stack direction=\"column\" gap=\"400\">\n <FormField.Root isRequired>\n <FormField.Label>Name</FormField.Label>\n <FormField.Input>\n <TextInput\n value={name}\n onChange={(v) => setName(v)}\n placeholder=\"e.g. Landing page\"\n autoFocus\n />\n </FormField.Input>\n </FormField.Root>\n <Checkbox\n isSelected={withoutData}\n onChange={(selected) => setWithoutData(selected)}\n isDisabled={saving}\n >\n Create template without data\n </Checkbox>\n {error && <Text color=\"critical.11\">{error}</Text>}\n </Stack>\n </Dialog.Body>\n <Dialog.Footer>\n <Button slot=\"close\" variant=\"outline\" isDisabled={saving}>\n Cancel\n </Button>\n <Button variant=\"solid\" onPress={handleConfirm} isDisabled={saving}>\n {saving ? 'Creating…' : 'Create'}\n </Button>\n </Dialog.Footer>\n </Dialog.Content>\n </Dialog.Root>\n );\n};\n","import type { Config, ComponentData, Data } from '@measured/puck';\n\n/**\n * Produce a \"without data\" copy of Puck data for use as a template.\n *\n * Each **leaf** component's props are reset to its config `defaultProps` (so a\n * new page created from the template shows the component's default contents,\n * not the source page's data). **Container** components — those that hold child\n * components in a zone — keep their props, so structural fields (e.g. a Grid's\n * `columnCount`) survive and the nested layout renders correctly.\n *\n * Nested components live in a flat `data.zones` map keyed `\"<parentId>:<zone>\"`;\n * `<parentId>` is the parent component's `props.id`. Every component's\n * `props.id` is always preserved so those zone keys stay consistent.\n */\nexport function stripPuckDataToTemplate(data: Data, config: Config): Data {\n const zones = data.zones ?? {};\n\n // Ids of components that own at least one non-empty zone → keep their props.\n const containerIds = new Set(\n Object.entries(zones)\n .filter(([, components]) => components.length > 0)\n .map(([zoneKey]) => zoneKey.slice(0, zoneKey.indexOf(':')))\n );\n\n const strip = (component: ComponentData): ComponentData => {\n const { id } = component.props;\n if (containerIds.has(id)) {\n // Container: preserve props so its zones keep rendering.\n return component;\n }\n const defaults =\n (config.components?.[component.type]?.defaultProps as\n | Record<string, unknown>\n | undefined) ?? {};\n // Reset to the component's default props, keeping its id so zone keys\n // (`\"<id>:<zone>\"`) stay consistent.\n return { ...component, props: { ...defaults, id } };\n };\n\n return {\n ...data,\n content: data.content.map(strip),\n root: { ...data.root, props: { ...(config.root?.defaultProps ?? {}) } },\n ...(data.zones && {\n zones: Object.fromEntries(\n Object.entries(zones).map(([zoneKey, components]) => [\n zoneKey,\n components.map(strip),\n ])\n ),\n }),\n };\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\nexport interface DirtyState {\n /** True when the canvas differs from the last saved / loaded baseline. */\n isDirty: boolean;\n /**\n * Feed every Puck `onChange` payload through this. The very first call after\n * a (re)load establishes the baseline and is treated as \"clean\" — Puck emits\n * an `onChange` on mount while it normalises the incoming data, and that must\n * not be mistaken for an edit by the user.\n */\n markChange: (data: unknown) => void;\n /** Mark the current data as the saved baseline (call after a successful save). */\n markSaved: (data: unknown) => void;\n}\n\n/**\n * Tracks whether the Puck canvas has unsaved edits.\n *\n * Puck is an uncontrolled editor that fires `onChange` once on mount (to report\n * its normalised version of the initial data). Naively flagging the editor\n * dirty on the first `onChange` makes a freshly-opened page look \"Unsaved\" even\n * though nothing was touched. We instead capture that first payload as the\n * baseline and only flag dirty when a later payload diverges from it.\n *\n * `resetKey` should change whenever the document shown in the canvas is swapped\n * out (different page/content, or a historical version applied) so a new\n * baseline is captured for the new document.\n */\nexport const useDirtyState = (resetKey: string): DirtyState => {\n const [isDirty, setIsDirty] = useState(false);\n const baselineRef = useRef<string | null>(null);\n\n useEffect(() => {\n // New document mounted — drop the old baseline and wait for the next\n // `onChange` (Puck's normalised mount payload) to set a fresh one.\n baselineRef.current = null;\n setIsDirty(false);\n }, [resetKey]);\n\n const markChange = useCallback((data: unknown) => {\n const serialized = JSON.stringify(data);\n if (baselineRef.current === null) {\n baselineRef.current = serialized;\n return;\n }\n setIsDirty(serialized !== baselineRef.current);\n }, []);\n\n const markSaved = useCallback((data: unknown) => {\n baselineRef.current = JSON.stringify(data);\n setIsDirty(false);\n }, []);\n\n return { isDirty, markChange, markSaved };\n};\n","import React, {\n createContext,\n useContext,\n useEffect,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\nimport { usePuck } from '@measured/puck';\nimport { IconButton, TextInput } from '@commercetools/nimbus';\nimport { Close } from '@commercetools/nimbus-icons';\nimport {\n useVersionHistoryContext,\n VersionHistorySidebarContent,\n} from '@commercetools-demo/puck-version-history';\n\n// ---------------------------------------------------------------------------\n// Component search context\n// ---------------------------------------------------------------------------\n\ninterface ComponentSearchContextValue {\n search: string;\n setSearch: (value: string) => void;\n}\n\nexport const ComponentSearchContext = createContext<ComponentSearchContextValue>({\n search: '',\n setSearch: () => {},\n});\n\nexport const ComponentSearchProvider: React.FC<{ children: ReactNode }> = ({ children }) => {\n const [search, setSearch] = useState('');\n return (\n <ComponentSearchContext.Provider value={{ search, setSearch }}>\n {children}\n </ComponentSearchContext.Provider>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Tab button — matches Puck's own Inspector/Outline tab style\n// ---------------------------------------------------------------------------\n\nconst SidebarTab: React.FC<{\n label: string;\n isActive: boolean;\n onClick: () => void;\n}> = ({ label, isActive, onClick }) => (\n <button\n type=\"button\"\n aria-label={`Show ${label.toLowerCase()} panel`}\n aria-pressed={isActive}\n title={`Show ${label.toLowerCase()} panel`}\n onClick={onClick}\n style={{\n flex: 1,\n padding: '8px 12px',\n border: 'none',\n borderBottom: isActive\n ? '2px solid var(--puck-color-azure-07, #1a73e8)'\n : '2px solid transparent',\n background: 'none',\n cursor: 'pointer',\n fontSize: '0.775rem',\n fontWeight: isActive ? 700 : 500,\n color: isActive\n ? 'var(--puck-color-azure-07, #1a73e8)'\n : 'var(--puck-color-grey-07, #374151)',\n transition: 'color 0.12s, border-color 0.12s',\n }}\n >\n {label}\n </button>\n);\n\n// Remap the `expanded` flag of every category in Puck's componentList UI state.\nconst remapExpanded = (\n componentList: Record<string, { expanded?: boolean }> | undefined,\n next: (key: string, current: boolean) => boolean\n): Record<string, { expanded?: boolean }> =>\n Object.fromEntries(\n Object.entries(componentList ?? {}).map(([key, value]) => [\n key,\n { ...value, expanded: next(key, !!value.expanded) },\n ])\n );\n\n// ---------------------------------------------------------------------------\n// ComponentsPanel override — tabs: \"Components\" | \"History\"\n//\n// CSS trick: Puck's Drawer renders each item as a direct `div` child of the\n// `[data-puck-dnd]` container (flex, gap:12px). When an item is hidden we\n// inject a `data-hidden-component` span; the `:has()` rule sets that wrapper\n// to `display:none` so it's removed from the flex flow entirely.\n// ---------------------------------------------------------------------------\n\nexport const ComponentsPanel: React.FC<{ children: ReactNode }> = ({ children }) => {\n const { search, setSearch } = useContext(ComponentSearchContext);\n const { isHistoryTabActive, openHistoryTab, closeHistoryTab } = useVersionHistoryContext();\n const { dispatch, appState } = usePuck();\n\n // Categories start collapsed for a tidy panel, but a search must never hide a\n // match inside a collapsed group — so expand everything while searching and\n // restore the author's prior expansion when the search is cleared.\n const searching = search.trim() !== '';\n const expansionSnapshot = useRef<Record<string, boolean> | null>(null);\n\n useEffect(() => {\n const componentList = (appState?.ui?.componentList ?? {}) as Record<\n string,\n { expanded?: boolean }\n >;\n if (searching) {\n if (expansionSnapshot.current === null) {\n expansionSnapshot.current = Object.fromEntries(\n Object.entries(componentList).map(([k, v]) => [k, !!v.expanded])\n );\n dispatch({\n type: 'setUi',\n ui: (prev) => ({\n componentList: remapExpanded(prev.componentList, () => true),\n }),\n });\n }\n } else if (expansionSnapshot.current) {\n const snap = expansionSnapshot.current;\n dispatch({\n type: 'setUi',\n ui: (prev) => ({\n componentList: remapExpanded(\n prev.componentList,\n (key, current) => snap[key] ?? current\n ),\n }),\n });\n expansionSnapshot.current = null;\n }\n // Only react to the search on/off transition.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [searching]);\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', height: '100%' }}>\n {/* Remove hidden DrawerItem wrappers from the flex layout, tighten the\n vertical padding on each draggable component, and trim the wide\n horizontal padding around the canvas so it gets more width.\n `PuckCanvas_` (underscore) matches only the outer canvas element, not\n its `PuckCanvas-*` children. */}\n <style>{`\n [data-puck-dnd] > div:has([data-hidden-component]) { display: none !important; }\n [class*=\"DrawerItem-draggable\"] { padding-top: 6px !important; padding-bottom: 6px !important; }\n [class*=\"PuckCanvas_\"] { padding-left: 4px !important; padding-right: 4px !important; }\n /* Make Puck fill its embedding container instead of 100dvh (which\n overflows below the app's nav bars and hides the sidebars' scroll).\n Puck nests unclassed wrapper divs between .Puck and the layout grid,\n so a height:100% chain breaks; pinning the inner grid to the\n container with absolute inset:0 bypasses those wrappers entirely.\n Scoped to .puck-editor-fill so standalone usage keeps 100dvh. */\n .puck-editor-fill { position: relative; }\n .puck-editor-fill [class*=\"PuckLayout-inner\"] {\n position: absolute !important;\n inset: 0 !important;\n height: auto !important;\n }\n /* Resizable properties (right) panel: override only the last grid track\n with a user-controlled width var (set by PropertiesResizer), falling\n back to Puck's default sidebar width. Two states: both panels open,\n and right-only (left collapsed). */\n .puck-editor-fill [class*=\"PuckLayout--leftSideBarVisible\"][class*=\"PuckLayout--rightSideBarVisible\"] [class*=\"PuckLayout-inner\"] {\n grid-template-columns: var(--puck-side-bar-width) var(--puck-frame-width) var(--puck-properties-width, var(--puck-side-bar-width)) !important;\n }\n .puck-editor-fill [class*=\"PuckLayout--rightSideBarVisible\"]:not([class*=\"PuckLayout--leftSideBarVisible\"]) [class*=\"PuckLayout-inner\"] {\n grid-template-columns: 0 var(--puck-frame-width) var(--puck-properties-width, var(--puck-side-bar-width)) !important;\n }\n /* Drag handle on the panel's left edge. */\n .puck-props-resizer::before {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n left: 3px;\n width: 1px;\n background: var(--puck-color-grey-09, #e2e2e2);\n transition: background-color 0.12s, width 0.12s, left 0.12s;\n }\n .puck-props-resizer:hover::before,\n .puck-props-resizer:active::before {\n left: 2px;\n width: 3px;\n background: var(--puck-color-azure-07, #1a73e8);\n }\n `}</style>\n\n {/* Tab bar */}\n <div\n style={{\n display: 'flex',\n borderBottom: '1px solid var(--puck-color-grey-04, #e5e7eb)',\n flexShrink: 0,\n }}\n >\n <SidebarTab\n label=\"Components\"\n isActive={!isHistoryTabActive}\n onClick={closeHistoryTab}\n />\n <SidebarTab\n label=\"History\"\n isActive={isHistoryTabActive}\n onClick={openHistoryTab}\n />\n </div>\n\n {isHistoryTabActive ? (\n /* History tab content */\n <div style={{ flex: 1, padding: '12px', overflowY: 'auto' }}>\n <VersionHistorySidebarContent />\n </div>\n ) : (\n /* Components tab content */\n <>\n {/* Sticky search bar */}\n <div\n style={{\n flexShrink: 0,\n padding: '0',\n margin: '12px 0',\n background: 'var(--puck-color-white, #fff)',\n position: 'sticky',\n top: 0,\n zIndex: 1,\n }}\n >\n <label\n htmlFor=\"puck-component-search\"\n style={{\n position: 'absolute',\n width: 1,\n height: 1,\n padding: 0,\n margin: -1,\n overflow: 'hidden',\n clip: 'rect(0 0 0 0)',\n whiteSpace: 'nowrap',\n border: 0,\n }}\n >\n Search components\n </label>\n <TextInput\n id=\"puck-component-search\"\n placeholder=\"Search components…\"\n value={search}\n onChange={(value) => setSearch(value)}\n width=\"100%\"\n trailingElement={\n search !== '' ? (\n <IconButton\n aria-label=\"Clear search\"\n variant=\"ghost\"\n colorPalette=\"neutral\"\n size=\"2xs\"\n onPress={() => setSearch('')}\n >\n <Close />\n </IconButton>\n ) : undefined\n }\n />\n </div>\n\n {/* Scrollable component list */}\n <div style={{ flex: 1, overflowY: 'auto' }}>{children}</div>\n </>\n )}\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// ComponentItemFilter — hides non-matching items when searching\n// ---------------------------------------------------------------------------\n\nexport const ComponentItemFilter: React.FC<{ children: ReactNode; name: string }> = ({\n children,\n name,\n}) => {\n const { search } = useContext(ComponentSearchContext);\n const isHidden = search.trim() !== '' && !name.toLowerCase().includes(search.toLowerCase());\n\n if (isHidden) {\n return <span data-hidden-component />;\n }\n return <>{children}</>;\n};\n","import React from 'react';\nimport type {\n Field,\n FieldProps,\n Overrides,\n RadioField,\n SelectField,\n} from '@measured/puck';\nimport {\n MultilineTextInput,\n RadioInput,\n Select,\n TextInput,\n} from '@commercetools/nimbus';\n\n// ---------------------------------------------------------------------------\n// Nimbus field-type overrides\n//\n// Puck renders its built-in field inputs (text / textarea / select / radio)\n// with its own plain HTML controls, which look nothing like the rest of the\n// app. `overrides.fieldTypes` lets us swap just the input for the Nimbus\n// equivalent while still reusing Puck's label wrapper (passed in as `Label`),\n// so labels stay consistent and stored data is untouched. `custom` fields\n// (DatasourceField, RichTextField, ImagePickerField) bypass this entirely.\n// ---------------------------------------------------------------------------\n\ntype LabelComp = React.ComponentType<{\n label?: string;\n icon?: React.ReactNode;\n el?: 'label' | 'div';\n readOnly?: boolean;\n children?: React.ReactNode;\n}>;\n\n/** Extra props Puck injects at runtime that aren't part of the public FieldProps type. */\ntype Extra = {\n name: string;\n label?: string;\n readOnly?: boolean;\n children?: React.ReactNode;\n Label?: LabelComp;\n};\n\ntype RenderProps<V = unknown, F = Field> = FieldProps<F, V> & Extra;\n\n/** Reuses Puck's own label wrapper (or renders bare when there's no label). */\nconst FieldShell: React.FC<{\n Label?: LabelComp;\n label?: string;\n name: string;\n readOnly?: boolean;\n children: React.ReactNode;\n}> = ({ Label, label, name, readOnly, children }) => {\n if (!Label) return <>{children}</>;\n // `el=\"div\"` avoids wrapping interactive React-Aria groups (select/radio) in a <label>.\n return (\n <Label label={label || name} el=\"div\" readOnly={readOnly}>\n {children}\n </Label>\n );\n};\n\nconst TextFieldOverride: React.FC<RenderProps<string>> = ({\n value,\n onChange,\n label,\n name,\n readOnly,\n id,\n Label,\n}) => (\n <FieldShell Label={Label} label={label} name={name} readOnly={readOnly}>\n <TextInput\n id={id}\n value={value ?? ''}\n onChange={(v) => onChange(v)}\n isDisabled={readOnly}\n width=\"100%\"\n />\n </FieldShell>\n);\n\nconst TextareaFieldOverride: React.FC<RenderProps<string>> = ({\n value,\n onChange,\n label,\n name,\n readOnly,\n id,\n Label,\n}) => (\n <FieldShell Label={Label} label={label} name={name} readOnly={readOnly}>\n <MultilineTextInput\n id={id}\n value={value ?? ''}\n onChange={(v) => onChange(v)}\n isDisabled={readOnly}\n rows={4}\n width=\"100%\"\n />\n </FieldShell>\n);\n\nconst SelectFieldOverride: React.FC<RenderProps<string | number | boolean, SelectField>> = ({\n field,\n value,\n onChange,\n label,\n name,\n readOnly,\n Label,\n}) => {\n const options = field.options ?? [];\n return (\n <FieldShell Label={Label} label={label} name={name} readOnly={readOnly}>\n <Select.Root\n aria-label={label || name}\n selectedKey={value == null ? undefined : String(value)}\n isDisabled={readOnly}\n onSelectionChange={(key) => {\n const opt = options.find((o) => String(o.value) === String(key));\n onChange(opt ? opt.value : (key as string));\n }}\n >\n <Select.Options>\n {options.map((o) => (\n <Select.Option key={String(o.value)} id={String(o.value)}>\n {o.label}\n </Select.Option>\n ))}\n </Select.Options>\n </Select.Root>\n </FieldShell>\n );\n};\n\nconst RadioFieldOverride: React.FC<RenderProps<string | number | boolean, RadioField>> = ({\n field,\n value,\n onChange,\n label,\n name,\n readOnly,\n Label,\n}) => {\n const options = field.options ?? [];\n return (\n <FieldShell Label={Label} label={label} name={name} readOnly={readOnly}>\n <RadioInput.Root\n aria-label={label || name}\n value={String(value ?? '')}\n isDisabled={readOnly}\n onChange={(key) => {\n const opt = options.find((o) => String(o.value) === key);\n onChange(opt ? opt.value : key);\n }}\n >\n {options.map((o) => (\n <RadioInput.Option key={String(o.value)} value={String(o.value)}>\n {o.label}\n </RadioInput.Option>\n ))}\n </RadioInput.Root>\n </FieldShell>\n );\n};\n\nexport const nimbusFieldTypes: NonNullable<Overrides['fieldTypes']> = {\n text: TextFieldOverride,\n textarea: TextareaFieldOverride,\n select: SelectFieldOverride,\n radio: RadioFieldOverride,\n};\n","import React, { type PropsWithChildren } from 'react';\nimport { ChakraProvider, createSystem } from '@chakra-ui/react/styled-system';\nimport {\n NimbusI18nProvider,\n _RegionProvider,\n system as nimbusSystem,\n} from '@commercetools/nimbus';\n\n\nconst SCOPED_SYSTEM_KEY = Symbol.for(\n '@commercetools-demo/puck:nimbus-scoped-system'\n);\n\nconst globalScope = globalThis as unknown as Record<\n symbol,\n ReturnType<typeof createSystem> | undefined\n>;\n\nconst scopedSystem: ReturnType<typeof createSystem> =\n globalScope[SCOPED_SYSTEM_KEY] ??\n (globalScope[SCOPED_SYSTEM_KEY] = createSystem({\n // `_config` is the fully-merged Nimbus + Chakra config used to build the\n // stock system; reusing it keeps all Nimbus theming intact.\n ...(nimbusSystem as unknown as { _config: Record<string, unknown> })._config,\n preflight: false,\n globalCss: {},\n }));\n\nexport const EnsureNimbusProvider: React.FC<PropsWithChildren<{ locale?: string }>> = ({\n locale = 'en',\n children,\n}) => (\n <ChakraProvider value={scopedSystem}>\n <NimbusI18nProvider locale={locale}>\n <_RegionProvider>{children}</_RegionProvider>\n </NimbusI18nProvider>\n </ChakraProvider>\n);\n","import React from 'react';\nimport { Button, Dialog, Stack, Text } from '@commercetools/nimbus';\n\nexport interface UnsavedChangesDialogProps {\n /** Whether the dialog is visible. */\n isOpen: boolean;\n /** Called when the dialog requests to open/close (backdrop, Esc, Stay). */\n onOpenChange: (isOpen: boolean) => void;\n /** Called when the user confirms they want to leave and discard changes. */\n onConfirm: () => void;\n}\n\n/**\n * Nimbus confirmation shown when the user tries to navigate away from an editor\n * that has unsaved changes. Replaces the native `window.confirm` so the warning\n * matches the rest of the editor chrome.\n */\nexport const UnsavedChangesDialog: React.FC<UnsavedChangesDialogProps> = ({\n isOpen,\n onOpenChange,\n onConfirm,\n}) => (\n <Dialog.Root isOpen={isOpen} onOpenChange={onOpenChange}>\n <Dialog.Content>\n <Dialog.Header>\n <Dialog.Title>Discard unsaved changes?</Dialog.Title>\n <Dialog.CloseTrigger />\n </Dialog.Header>\n <Dialog.Body>\n <Stack direction=\"column\" gap=\"200\">\n <Text>\n You have unsaved changes on this page. If you leave now, those\n changes will be lost.\n </Text>\n </Stack>\n </Dialog.Body>\n <Dialog.Footer>\n <Button slot=\"close\" variant=\"outline\">\n Stay on page\n </Button>\n <Button\n colorPalette=\"critical\"\n onPress={() => {\n onOpenChange(false);\n onConfirm();\n }}\n >\n Leave & discard\n </Button>\n </Dialog.Footer>\n </Dialog.Content>\n </Dialog.Root>\n);\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\n\nconst STORAGE_KEY = 'puck-properties-width';\n\nexport interface PropertiesResizerProps {\n /** Smallest allowed width in px. */\n minWidth?: number;\n /** Largest allowed width in px. */\n maxWidth?: number;\n}\n\ninterface HandleBox {\n top: number;\n left: number;\n height: number;\n}\n\nconst sameBox = (a: HandleBox | null, b: HandleBox | null) =>\n a === b ||\n (!!a && !!b && a.top === b.top && a.left === b.left && a.height === b.height);\n\n/**\n * Draggable divider that resizes the Puck properties (right) panel.\n *\n * Render it as a child of the `.puck-editor-fill` container (a sibling of the\n * Puck editor). It writes the chosen width to a `--puck-properties-width` CSS\n * variable on that container — the grid-template override in\n * ComponentListSearch's injected `<style>` reads it to size only the right\n * column, leaving the left panel and canvas alone. The handle is positioned\n * over the panel's left edge by measuring the live sidebar, and hides itself\n * when the panel is collapsed. The width persists in localStorage.\n */\nexport const PropertiesResizer: React.FC<PropertiesResizerProps> = ({\n minWidth = 240,\n maxWidth = 680,\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n const boxRef = useRef<HandleBox | null>(null);\n const [box, setBox] = useState<HandleBox | null>(null);\n\n const els = useCallback(() => {\n const handle = ref.current;\n const fill = (handle?.closest('.puck-editor-fill') ?? null) as HTMLElement | null;\n const sidebar = (fill?.querySelector('[class*=\"PuckLayout-rightSideBar\"]') ??\n null) as HTMLElement | null;\n return { fill, sidebar };\n }, []);\n\n const measure = useCallback(() => {\n const { fill, sidebar } = els();\n let next: HandleBox | null = null;\n if (fill && sidebar) {\n const fr = fill.getBoundingClientRect();\n const sr = sidebar.getBoundingClientRect();\n // width < 2 ⇒ the panel is collapsed (grid track is 0) — hide the handle.\n if (sr.width >= 2) {\n next = { top: sr.top - fr.top, left: sr.left - fr.left, height: sr.height };\n }\n }\n if (!sameBox(boxRef.current, next)) {\n boxRef.current = next;\n setBox(next);\n }\n }, [els]);\n\n useEffect(() => {\n const { fill, sidebar } = els();\n // Restore the persisted width.\n const saved = Number(localStorage.getItem(STORAGE_KEY));\n if (fill && saved >= minWidth && saved <= maxWidth) {\n fill.style.setProperty('--puck-properties-width', `${saved}px`);\n }\n measure();\n const ro = new ResizeObserver(() => measure());\n if (fill) ro.observe(fill);\n if (sidebar) ro.observe(sidebar);\n window.addEventListener('resize', measure);\n // Re-measure periodically to track panel toggles / Puck remounts cheaply\n // (guarded setState means this only re-renders when geometry changes).\n const interval = window.setInterval(measure, 400);\n return () => {\n ro.disconnect();\n window.removeEventListener('resize', measure);\n window.clearInterval(interval);\n };\n }, [els, measure, minWidth, maxWidth]);\n\n const startDrag = useCallback(\n (e: React.PointerEvent) => {\n e.preventDefault();\n const handle = ref.current;\n const { fill } = els();\n if (!fill || !handle) return;\n\n // Capture the pointer to the handle. The Puck canvas is an <iframe>;\n // without capture, moving the cursor over it routes pointermove/pointerup\n // to the iframe's document and the drag never ends. Capture forces every\n // pointer event to the handle regardless of what's underneath.\n try {\n handle.setPointerCapture(e.pointerId);\n } catch {\n /* ignore — capture is best-effort */\n }\n // Belt-and-suspenders: stop the iframe(s) from swallowing events too.\n const iframes = Array.from(\n fill.querySelectorAll('iframe')\n ) as HTMLIFrameElement[];\n iframes.forEach((f) => (f.style.pointerEvents = 'none'));\n\n const onMove = (ev: PointerEvent) => {\n const fr = fill.getBoundingClientRect();\n const w = Math.max(\n minWidth,\n Math.min(maxWidth, Math.round(fr.right - ev.clientX))\n );\n fill.style.setProperty('--puck-properties-width', `${w}px`);\n measure();\n };\n const onUp = (ev: PointerEvent) => {\n try {\n handle.releasePointerCapture(ev.pointerId);\n } catch {\n /* ignore */\n }\n iframes.forEach((f) => (f.style.pointerEvents = ''));\n const w = parseInt(\n fill.style.getPropertyValue('--puck-properties-width'),\n 10\n );\n if (w) localStorage.setItem(STORAGE_KEY, String(w));\n handle.removeEventListener('pointermove', onMove);\n handle.removeEventListener('pointerup', onUp);\n handle.removeEventListener('pointercancel', onUp);\n document.body.style.userSelect = '';\n document.body.style.cursor = '';\n };\n\n document.body.style.userSelect = 'none';\n document.body.style.cursor = 'col-resize';\n // With pointer capture these fire on the handle even over the iframe.\n handle.addEventListener('pointermove', onMove);\n handle.addEventListener('pointerup', onUp);\n handle.addEventListener('pointercancel', onUp);\n },\n [els, measure, minWidth, maxWidth]\n );\n\n return (\n <div\n ref={ref}\n className=\"puck-props-resizer\"\n onPointerDown={startDrag}\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label=\"Resize properties panel\"\n style={\n box\n ? {\n position: 'absolute',\n top: box.top,\n left: box.left - 3,\n height: box.height,\n width: 7,\n cursor: 'col-resize',\n zIndex: 20,\n touchAction: 'none',\n }\n : { display: 'none' }\n }\n />\n );\n};\n"],"mappings":"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","names":["Button","import_react","import_puck","import_puck_api","import_puck_version_history","import_react","import_jsx_runtime","DOMPurify","import_jsx_runtime","import_jsx_runtime","import_puck","import_jsx_runtime","import_nimbus","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","Button","import_jsx_runtime","import_jsx_runtime","import_puck_api","import_react","import_nimbus","import_nimbus_icons","import_puck_api","import_jsx_runtime","import_jsx_runtime","formatPrice","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_puck_api","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_puck_api","import_jsx_runtime","import_jsx_runtime","import_puck_api","import_jsx_runtime","import_jsx_runtime","import_puck_api","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","Button","React","import_puck","import_nimbus","import_nimbus_icons","import_jsx_runtime","import_react","import_nimbus","import_jsx_runtime","import_react","import_react","import_puck","import_nimbus","import_nimbus_icons","import_puck_version_history","import_jsx_runtime","import_nimbus","import_jsx_runtime","import_nimbus","import_nimbus","import_jsx_runtime","nimbusSystem","import_jsx_runtime","import_nimbus","import_jsx_runtime","import_react","import_jsx_runtime"]}
|