@riverbankcms/sdk 0.22.0 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/README.md +15 -0
  2. package/dist/_dts/blocks/src/system/defineBlock.d.ts +2 -2
  3. package/dist/_dts/blocks/src/system/fragments/utils/toRepeaterSchema.d.ts +1 -0
  4. package/dist/_dts/blocks/src/system/manifest/fieldPath.d.ts +1 -1
  5. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +3 -3
  6. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +20 -6
  7. package/dist/_dts/sdk/src/components.d.ts +1 -1
  8. package/dist/_dts/sdk/src/manifest/prompt/examples/types.d.ts +1 -1
  9. package/dist/_dts/sdk/src/manifest/validation/output-schema.d.ts +1 -1
  10. package/dist/_dts/sdk/src/rendering/components/Layout.d.ts +13 -2
  11. package/dist/_dts/sdk/src/rendering/server.d.ts +1 -1
  12. package/dist/_dts/sdk/src/version.d.ts +1 -1
  13. package/dist/_dts/sdk/src/zod/titleSourceSchema.d.ts +3 -0
  14. package/dist/cli/index.js +38 -16
  15. package/dist/cli/index.js.map +1 -1
  16. package/dist/client/client.js +16 -4
  17. package/dist/client/client.js.map +1 -1
  18. package/dist/client/client.mjs +16 -4
  19. package/dist/client/client.mjs.map +1 -1
  20. package/dist/client/hooks.js +15 -3
  21. package/dist/client/hooks.js.map +1 -1
  22. package/dist/client/hooks.mjs +15 -3
  23. package/dist/client/hooks.mjs.map +1 -1
  24. package/dist/server/{chunk-QE4VT6ZZ.js → chunk-2VZTRLVN.js} +2 -2
  25. package/dist/server/{chunk-QE4VT6ZZ.js.map → chunk-2VZTRLVN.js.map} +1 -1
  26. package/dist/server/{chunk-2M7734OW.mjs → chunk-2Y65RENO.mjs} +2 -2
  27. package/dist/server/{chunk-ZUEYJXML.js → chunk-36KFN6AU.js} +6 -6
  28. package/dist/server/{chunk-ZUEYJXML.js.map → chunk-36KFN6AU.js.map} +1 -1
  29. package/dist/server/{chunk-53NRFMMN.js → chunk-377J7BKC.js} +16 -4
  30. package/dist/server/chunk-377J7BKC.js.map +1 -0
  31. package/dist/server/chunk-3OR6EF3W.js +11 -0
  32. package/dist/server/chunk-3OR6EF3W.js.map +1 -0
  33. package/dist/server/chunk-3YMYSDUU.mjs +7 -0
  34. package/dist/server/{chunk-VHVKDZCV.mjs.map → chunk-3YMYSDUU.mjs.map} +1 -1
  35. package/dist/server/{chunk-WUAHP5L2.mjs → chunk-7NJZJL2D.mjs} +4 -4
  36. package/dist/server/{chunk-PY2A4FGZ.js → chunk-ACLGZTVX.js} +3 -3
  37. package/dist/server/{chunk-PY2A4FGZ.js.map → chunk-ACLGZTVX.js.map} +1 -1
  38. package/dist/server/{chunk-D5NOG6VZ.mjs → chunk-DHFU2AQ7.mjs} +2 -2
  39. package/dist/server/{chunk-7XBBV6UY.mjs → chunk-DWMPTB3G.mjs} +2 -2
  40. package/dist/server/{chunk-J2ZBKZVF.mjs → chunk-E5G5COYU.mjs} +21 -15
  41. package/dist/server/chunk-E5G5COYU.mjs.map +1 -0
  42. package/dist/server/{chunk-H3SRB5G4.js → chunk-EFQNS3HS.js} +6 -6
  43. package/dist/server/{chunk-H3SRB5G4.js.map → chunk-EFQNS3HS.js.map} +1 -1
  44. package/dist/server/{chunk-PTHRXZUJ.js → chunk-END3H7C6.js} +32 -26
  45. package/dist/server/chunk-END3H7C6.js.map +1 -0
  46. package/dist/server/{chunk-TOBOHAEX.js → chunk-FKMJDBEA.js} +5 -5
  47. package/dist/server/{chunk-TOBOHAEX.js.map → chunk-FKMJDBEA.js.map} +1 -1
  48. package/dist/server/{chunk-TU3WAJPX.js → chunk-GTE6ZI5W.js} +13 -10
  49. package/dist/server/chunk-GTE6ZI5W.js.map +1 -0
  50. package/dist/server/{chunk-ZIY3QZJ3.mjs → chunk-HQZKJ5MH.mjs} +2 -2
  51. package/dist/server/{chunk-UK7SLIIG.js → chunk-IH2NRKKI.js} +3 -3
  52. package/dist/server/{chunk-UK7SLIIG.js.map → chunk-IH2NRKKI.js.map} +1 -1
  53. package/dist/server/{chunk-OPW33AGO.mjs → chunk-JMKX5FTE.mjs} +16 -4
  54. package/dist/server/chunk-JMKX5FTE.mjs.map +1 -0
  55. package/dist/server/{chunk-RVLBSKSU.mjs → chunk-KNF42IKQ.mjs} +2 -2
  56. package/dist/server/{chunk-7ORXXMTP.js → chunk-QIBPYE44.js} +9 -9
  57. package/dist/server/{chunk-7ORXXMTP.js.map → chunk-QIBPYE44.js.map} +1 -1
  58. package/dist/server/{chunk-3Z25JQ6H.mjs → chunk-QOBADLB4.mjs} +2 -2
  59. package/dist/server/{chunk-OOIGZH5B.mjs → chunk-RFQZDDUM.mjs} +2 -2
  60. package/dist/server/{chunk-33KZRQJY.mjs → chunk-T3ZGODHW.mjs} +2 -2
  61. package/dist/server/{chunk-CCAD7BUN.mjs → chunk-TCRV6VRW.mjs} +8 -5
  62. package/dist/server/chunk-TCRV6VRW.mjs.map +1 -0
  63. package/dist/server/{chunk-Z4AMGXH2.js → chunk-UZMAP5RH.js} +3 -3
  64. package/dist/server/{chunk-Z4AMGXH2.js.map → chunk-UZMAP5RH.js.map} +1 -1
  65. package/dist/server/chunk-VRDQJRYS.mjs +11 -0
  66. package/dist/server/chunk-VRDQJRYS.mjs.map +1 -0
  67. package/dist/server/{chunk-V5EQHRVR.js → chunk-WEEEYI47.js} +4 -4
  68. package/dist/server/{chunk-V5EQHRVR.js.map → chunk-WEEEYI47.js.map} +1 -1
  69. package/dist/server/{chunk-KAVH2CX7.js → chunk-X5XHOSOM.js} +49 -49
  70. package/dist/server/{chunk-KAVH2CX7.js.map → chunk-X5XHOSOM.js.map} +1 -1
  71. package/dist/server/components.js +5 -5
  72. package/dist/server/components.mjs +4 -4
  73. package/dist/server/config-validation.js +6 -5
  74. package/dist/server/config-validation.js.map +1 -1
  75. package/dist/server/config-validation.mjs +5 -4
  76. package/dist/server/config.js +6 -5
  77. package/dist/server/config.js.map +1 -1
  78. package/dist/server/config.mjs +5 -4
  79. package/dist/server/config.mjs.map +1 -1
  80. package/dist/server/data.js +3 -3
  81. package/dist/server/data.mjs +2 -2
  82. package/dist/server/index.js +4 -4
  83. package/dist/server/index.mjs +3 -3
  84. package/dist/server/{loadPage-3F57VAE2.mjs → loadPage-EZXWZ7SJ.mjs} +4 -4
  85. package/dist/server/{loadPage-JRS5JUAY.js → loadPage-G74D6VXZ.js} +5 -5
  86. package/dist/server/{loadPage-JRS5JUAY.js.map → loadPage-G74D6VXZ.js.map} +1 -1
  87. package/dist/server/next.js +17 -17
  88. package/dist/server/next.mjs +7 -7
  89. package/dist/server/page-converter.js +16 -10
  90. package/dist/server/page-converter.js.map +1 -1
  91. package/dist/server/page-converter.mjs +9 -3
  92. package/dist/server/page-converter.mjs.map +1 -1
  93. package/dist/server/prebuild.js +3 -3
  94. package/dist/server/prebuild.mjs +2 -2
  95. package/dist/server/rendering/server.js +7 -7
  96. package/dist/server/rendering/server.mjs +6 -6
  97. package/dist/server/rendering.js +9 -9
  98. package/dist/server/rendering.mjs +8 -8
  99. package/dist/server/routing.js +1 -1
  100. package/dist/server/routing.mjs +1 -1
  101. package/dist/server/server.js +7 -7
  102. package/dist/server/server.mjs +6 -6
  103. package/dist/server/theme-bridge.js +10 -10
  104. package/dist/server/theme-bridge.mjs +2 -2
  105. package/dist/server/theme.js +4 -4
  106. package/dist/server/theme.mjs +2 -2
  107. package/package.json +1 -1
  108. package/dist/server/chunk-53NRFMMN.js.map +0 -1
  109. package/dist/server/chunk-CCAD7BUN.mjs.map +0 -1
  110. package/dist/server/chunk-J2ZBKZVF.mjs.map +0 -1
  111. package/dist/server/chunk-OPW33AGO.mjs.map +0 -1
  112. package/dist/server/chunk-PTHRXZUJ.js.map +0 -1
  113. package/dist/server/chunk-TU3WAJPX.js.map +0 -1
  114. package/dist/server/chunk-VHVKDZCV.mjs +0 -7
  115. /package/dist/server/{chunk-2M7734OW.mjs.map → chunk-2Y65RENO.mjs.map} +0 -0
  116. /package/dist/server/{chunk-WUAHP5L2.mjs.map → chunk-7NJZJL2D.mjs.map} +0 -0
  117. /package/dist/server/{chunk-D5NOG6VZ.mjs.map → chunk-DHFU2AQ7.mjs.map} +0 -0
  118. /package/dist/server/{chunk-7XBBV6UY.mjs.map → chunk-DWMPTB3G.mjs.map} +0 -0
  119. /package/dist/server/{chunk-ZIY3QZJ3.mjs.map → chunk-HQZKJ5MH.mjs.map} +0 -0
  120. /package/dist/server/{chunk-RVLBSKSU.mjs.map → chunk-KNF42IKQ.mjs.map} +0 -0
  121. /package/dist/server/{chunk-3Z25JQ6H.mjs.map → chunk-QOBADLB4.mjs.map} +0 -0
  122. /package/dist/server/{chunk-OOIGZH5B.mjs.map → chunk-RFQZDDUM.mjs.map} +0 -0
  123. /package/dist/server/{chunk-33KZRQJY.mjs.map → chunk-T3ZGODHW.mjs.map} +0 -0
  124. /package/dist/server/{loadPage-3F57VAE2.mjs.map → loadPage-EZXWZ7SJ.mjs.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../blocks/src/system/node/schema.ts","../../../blocks/src/system/manifest/schema.ts","../../../blocks/src/system/node/typeBasedLayout.ts","../../../blocks/src/system/manifest/augmentManifest.ts","../../../blocks/src/system/manifest/registry.ts","../../../blocks/src/utils/env.ts","../../../blocks/src/system/node/types.ts","../../../blocks/src/system/node/builder.ts","../../../blocks/src/system/node/fragments/backgroundLayer.ts","../../../blocks/src/system/node/fragments/headingGroup.ts","../../../blocks/src/system/node/fragments/sectionContainer.ts","../../../blocks/src/system/node/fragments/styledContainer.ts","../../../blocks/src/system/spacing.ts","../../../blocks/src/system/node/fragments/styledSection.ts","../../../blocks/src/system/node/fragments/ctaButton.ts","../../../blocks/src/system/node/fragments/ctaRow.ts","../../../blocks/src/system/node/fragments/navRow.ts","../../../blocks/src/system/node/fragments/footerNav.ts","../../../blocks/src/system/transforms/registry/core.ts","../../../blocks/src/system/transforms/registry/_utils/colorResolution.ts","../../../blocks/src/system/theme/blockColorTokens.ts","../../../blocks/src/system/transforms/registry/boxStyles.ts","../../../blocks/src/system/node/fragments/responsiveTwoColumn.ts","../../../blocks/src/system/node/fragments/styledCard.ts","../../../blocks/src/system/node/fragments/typography.ts","../../../blocks/src/system/fragments/types.ts","../../../blocks/src/system/fragments/builder.ts","../../../blocks/src/system/fragments/library/bodyCopy.ts","../../../blocks/src/system/fragments/library/heroCopy.ts","../../../blocks/src/system/fields/button.ts","../../../blocks/src/system/fields/ctas.ts","../../../blocks/src/system/fragments/library/ctaRow.ts","../../../blocks/src/system/fragments/library/heroCtaRow.ts","../../../blocks/src/system/fragments/library/ctaCopy.ts","../../../blocks/src/system/fragments/library/testimonialsHeading.ts","../../../blocks/src/system/fragments/library/testimonialsCarousel.ts","../../../blocks/src/system/fragments/library/formCopy.ts","../../../blocks/src/system/helpers/api-bindings.ts","../../../blocks/src/system/fragments/library/formEmbed.ts","../../../blocks/src/system/fragments/library/footerBottomText.ts","../../../blocks/src/system/fragments/library/blogFeaturedPost.ts","../../../blocks/src/system/fragments/library/blogListGrid.ts","../../../blocks/src/system/fragments/library/blogListStack.ts","../../../blocks/src/system/fragments/library/faqHeading.ts","../../../blocks/src/system/fragments/library/faqAccordion.ts","../../../blocks/src/system/fragments/library/card.ts","../../../blocks/src/system/fragments/library/heading.ts","../../../blocks/src/system/fragments/library/richText.ts","../../../blocks/src/system/fragments/utils/toRepeaterSchema.ts","../../../blocks/src/system/fragments/library/heroLayoutControls.ts","../../../blocks/src/system/fragments/library/quote.ts","../../../blocks/src/system/fragments/library/image.ts","../../../blocks/src/system/fragments/library/videoEmbed.ts","../../../blocks/src/system/fragments/library/columnContent.ts","../../../blocks/src/system/fragments/library/newsletterCopy.ts","../../../blocks/src/system/fragments/library/newsletterForm.ts","../../../blocks/src/system/fragments/library/teamMember.ts","../../../blocks/src/system/constants/background.ts","../../../blocks/src/system/fields/background.ts","../../../blocks/src/system/fields/boxStyles.ts","../../../blocks/src/system/defineBlock.ts","../../../blocks/src/system/blocks/hero.ts","../../../blocks/src/system/blocks/body-text.ts","../../../blocks/src/system/blocks/blog-post.tsx","../../../blocks/src/system/blocks/blog-placeholder.ts","../../../blocks/src/system/blocks/blog-listing.ts","../../../blocks/src/system/blocks/cta-full.ts","../../../blocks/src/system/blocks/form.tsx","../../../blocks/src/system/blocks/faq.ts","../../../blocks/src/system/transforms/registry/formatting.ts","../../../blocks/src/system/transforms/registry/ui.ts","../../../blocks/src/system/transforms/registry/layout.ts","../../../blocks/src/system/transforms/registry/media.ts","../../../blocks/src/system/transforms/registry/content.ts","../../../blocks/src/system/transforms/typed.ts","../../../blocks/src/system/blocks/site-header.ts","../../../blocks/src/system/blocks/site-footer-nav-groups-layout.ts","../../../blocks/src/system/blocks/site-footer.ts","../../../blocks/src/system/blocks/testimonials.tsx","../../../blocks/src/system/blocks/columns.ts","../../../blocks/src/system/blocks/shared/fragmentCollection.ts","../../../blocks/src/system/blocks/collection.ts","../../../blocks/src/system/fields/carousel.ts","../../../blocks/src/system/fields/imageLayout.ts","../../../blocks/src/system/blocks/media-text.ts","../../../blocks/src/system/blocks/appointment-booking.tsx","../../../blocks/src/system/blocks/event-registration.ts","../../../blocks/src/system/blocks/events/shared/schemas.ts","../../../blocks/src/lib/media.ts","../../../blocks/src/system/blocks/events/shared/fields.ts","../../../blocks/src/system/blocks/courses/shared/schemas.ts","../../../blocks/src/system/blocks/course-registration.ts","../../../blocks/src/system/blocks/event-details.ts","../../../blocks/src/system/blocks/shop.ts","../../../blocks/src/system/blocks/course-details.ts","../../../blocks/src/system/blocks/events/event-spotlight.ts","../../../blocks/src/system/blocks/events/event-listing.ts","../../../blocks/src/system/blocks/events/event-calendar.ts","../../../blocks/src/system/blocks/embed.ts","../../../blocks/src/system/blocks/image-gallery.ts","../../../blocks/src/system/blocks/video-grid.ts","../../../blocks/src/system/blocks/customer-portal.ts","../../../blocks/src/system/blocks/newsletter-signup.ts","../../../blocks/src/system/blocks/team-members.ts","../../../blocks/src/system/blocks/index.ts","../../../blocks/src/system/registry.ts","../../../blocks/src/system/theme/tokens.ts","../../../blocks/src/system/transforms/registry/background.ts","../../../blocks/src/system/links/resolve.ts","../../../blocks/src/system/transforms/registry/links.ts","../../../blocks/src/system/transforms/registry/index.ts"],"sourcesContent":["import { z } from \"zod\";\n\nconst transformStepSchema = z.object({\n id: z.string().min(1, \"Transform requires an identifier\"),\n options: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const bindingPathSchema = z\n .string()\n .min(1, \"Binding path is required\")\n .regex(/[A-Za-z0-9_\\.$\\[\\]/-]+/, \"Binding path contains invalid characters\");\n\nexport const bindingSchema = z.object({\n from: bindingPathSchema,\n fallback: z.unknown().optional(),\n transforms: transformStepSchema.array().default([]),\n pick: z.enum([\"value\", \"collection\", \"context\"]).default(\"value\"),\n coerce: z.enum([\"number\", \"boolean\", \"string\"]).optional(),\n});\n\nexport type Binding = z.input<typeof bindingSchema>;\n\nexport const repeatSchema = z.object({\n collection: bindingSchema,\n itemName: z.string().min(1).default(\"item\"),\n indexName: z.string().min(1).default(\"index\"),\n limit: z.number().int().positive().optional(),\n sortBy: z\n .object({\n path: bindingPathSchema,\n direction: z.enum([\"asc\", \"desc\"]).default(\"asc\"),\n })\n .optional(),\n});\n\nexport type RepeatConfig = z.input<typeof repeatSchema>;\n\nexport const conditionSchema = z.object({\n when: bindingSchema,\n equals: z.unknown().optional(),\n not: z.boolean().default(false),\n});\n\nexport type ConditionConfig = z.input<typeof conditionSchema>;\n\nexport const dataScopeSchema = z.object({\n name: z.string().min(1),\n from: bindingSchema,\n});\n\nexport type DataScope = z.input<typeof dataScopeSchema>;\n\nexport const nodePropsSchema = z.record(z.string(), z.unknown()).default({});\n\nexport type NodeDefinition = {\n type: string;\n key?: string;\n props?: Record<string, unknown>;\n children?: NodeDefinition[];\n $bind?: Binding;\n $repeat?: RepeatConfig;\n $when?: ConditionConfig;\n $scopes?: DataScope[];\n // Legacy node shape support: some manifests still place props at the top level\n // rather than under `props`. Runtime currently treats unknown keys as props.\n [key: string]: unknown;\n};\n\nexport const nodeSchema: z.ZodType<NodeDefinition> = z.object({\n type: z.string().min(1, \"Node type is required\"),\n key: z.string().optional(),\n props: nodePropsSchema.optional(),\n children: z.lazy(() => nodeSchema.array().default([])).optional(),\n $bind: bindingSchema.optional(),\n $repeat: repeatSchema.optional(),\n $when: conditionSchema.optional(),\n $scopes: dataScopeSchema.array().optional(),\n});\n\nexport const nodeTreeSchema = nodeSchema.array().or(nodeSchema);\n\nexport type NodeTree = z.input<typeof nodeTreeSchema>;\n\nexport const NodeSchema = nodeSchema;\nexport const NodeTreeSchema = nodeTreeSchema;\n","import { z } from \"zod\";\nimport { NodeTreeSchema } from \"../node\";\nimport type { NodeDefinition } from \"../node\";\nimport type { SupportedLoaderEndpoint } from \"../data/loaderEndpoints\";\n\n/**\n * Visibility levels gate editor access to fields/slots.\n */\nexport const visibilityLevels = [\"admin\", \"designer\", \"author\"] as const;\nexport type VisibilityLevel = (typeof visibilityLevels)[number];\n\n// metadata has been removed from BlockManifest. Use manifest.title/description\n// directly for any display purposes.\n\nconst mediaDeliverySchema = z.object({\n sizes: z.string().optional(),\n widthCandidates: z.array(z.number().int().positive()).optional(),\n maxCssWidth: z.number().positive().optional(),\n maxCssHeight: z.number().positive().optional(),\n strategy: z.enum(['default', 'columnsAuto', 'imageGalleryVariant']).optional(),\n strategyOptions: z.record(z.string(), z.unknown()).optional(),\n})\n\nconst uiSchema = z\n .object({\n widget: z.string().optional(),\n // Container/widget presets (used by Group/Repeater widgets themselves, not for widget selection)\n preset: z.enum(['disclosure']).optional(),\n flattenInRepeater: z.boolean().optional(),\n hidden: z.boolean().optional(),\n hideLabel: z.boolean().optional(),\n hideDescription: z.boolean().optional(),\n showCharCount: z\n .union([z.number().int().positive(), z.object({ max: z.number().int().positive() })])\n .optional(),\n showSlugPreview: z.boolean().optional(),\n variant: z.enum(['full', 'inline', 'limited', 'media']).optional(),\n richTextVariant: z.enum(['full', 'inline', 'limited', 'media']).optional(),\n cropEditorMode: z.enum(['dialog', 'inline']).optional(),\n cropEditorAutoOpen: z.boolean().optional(),\n mediaPickerAutoOpen: z.boolean().optional(),\n showMediaPreview: z.boolean().optional(),\n showMediaOverlayActions: z.boolean().optional(),\n mediaDelivery: mediaDeliverySchema.optional(),\n mediaDeliveryByVariant: z\n .record(\n z.string(),\n mediaDeliverySchema,\n )\n .optional(),\n // Optional input hints for validators/widgets\n inputType: z.enum(['text', 'email', 'tel', 'number']).optional(),\n min: z.number().optional(),\n max: z.number().optional(),\n step: z.number().optional(),\n showValue: z.boolean().optional(),\n pattern: z.string().optional(),\n placeholder: z.string().optional(),\n visibleWhen: z\n .object({\n field: z.string().min(1),\n equals: z.any().optional(),\n notEquals: z.any().optional(),\n oneOf: z.array(z.any()).optional(),\n notIn: z.array(z.any()).optional(),\n })\n .optional(),\n // Modal configuration for modal and group fields\n modalConfig: z\n .object({\n buttonLabel: z.string().optional(),\n description: z.string().optional(),\n buttonVariant: z.enum(['default', 'outline']).optional(),\n showCustomizedIndicator: z.boolean().optional(),\n maxWidth: z.string().optional(),\n })\n .optional(),\n // Background field configuration\n allowedTypes: z.array(z.enum(['color', 'gradient', 'image'])).optional(),\n // Tab group configuration\n fullWidth: z.boolean().optional(),\n // Field layout configuration\n row: z.string().optional(),\n colSpan: z.number().int().min(1).max(4).optional(),\n // Group layout configuration\n layout: z.enum(['stack', 'grid']).optional(),\n columns: z.number().int().min(2).max(4).optional(),\n // Named grid presets for GroupField grid layout.\n // Use these for common responsive patterns to avoid embedding Tailwind strings in manifests.\n gridColsPreset: z\n .enum([\n 'simple2', // base 1 col -> sm 2 cols\n 'simple3', // base 1 col -> sm 2 cols -> md 3 cols\n 'simple4', // base 1 col -> sm 2 cols -> lg 4 cols\n 'buttonCtaRow', // CTA/button row with compact label/link widths on lg+\n ])\n .optional(),\n // Responsive grid columns for GroupField grid layout (mobile-first).\n // Uses Tailwind breakpoints; when provided, GroupField will build the appropriate\n // `grid-cols-*` classes from this config.\n gridColumns: z\n .object({\n base: z.number().int().min(1).max(4).optional(),\n sm: z.number().int().min(1).max(4).optional(),\n md: z.number().int().min(1).max(4).optional(),\n lg: z.number().int().min(1).max(4).optional(),\n xl: z.number().int().min(1).max(4).optional(),\n })\n .optional(),\n // Group grid override: allows custom responsive grid column classes (e.g. unequal column widths)\n gridColsClassName: z.string().optional(),\n // Repeater presentation presets\n repeaterPreset: z.enum(['thumbnailGrid']).optional(),\n thumbnailField: z.string().optional(),\n thumbnailAltField: z.string().optional(),\n thumbnailLabelField: z.string().optional(),\n thumbnailCardDensity: z.enum(['compact', 'comfortable']).optional(),\n // Icon picker configuration (used when ui.widget === 'iconPicker')\n iconPickerPreset: z.enum(['cta']).optional(),\n // Entry picker configuration\n contentTypeField: z.string().optional(),\n fixedContentType: z.string().optional(),\n valueFrom: z.enum(['id', 'identifier', 'slug']).optional(),\n // Render in block header instead of form body (used for section styles)\n renderInHeader: z.boolean().optional(),\n // Semantic field intent for content-first form routing and settings tab grouping\n intent: z.enum(['content', 'display', 'behavior', 'style']).optional(),\n })\n .partial();\n\nconst baseFieldSchema = z.object({\n id: z.string().min(1, \"Field id is required\"),\n label: z.string().min(1, \"Field label is required\"),\n description: z.string().optional(),\n visibleRoles: z.array(z.enum(visibilityLevels)).optional(),\n defaultValue: z.any().optional(),\n required: z.boolean().default(false),\n ui: uiSchema.optional(),\n});\n\nconst textFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"text\"),\n multiline: z.boolean().default(false),\n maxLength: z.number().int().positive().optional(),\n});\n\nconst richTextFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"richText\"),\n});\n\nconst mediaFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"media\"),\n mediaKinds: z.array(z.enum([\"image\", \"video\"])).default([\"image\"]),\n aspectRatio: z.string().optional(),\n});\n\nconst booleanFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"boolean\"),\n});\n\nconst dateFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"date\"),\n});\n\nconst timeFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"time\"),\n});\n\nconst dateTimeFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"datetime\"),\n});\n\nconst slugFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"slug\"),\n sourceFieldId: z.string().min(1).optional(),\n statusFieldId: z.string().min(1).optional(),\n maxLength: z.number().int().positive().optional(),\n});\n\nconst urlFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"url\"),\n allowRelative: z.boolean().default(false),\n});\n\nconst linkFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"link\"),\n});\n\nconst selectFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"select\"),\n options: z.array(z.object({\n value: z.string(),\n label: z.string(),\n description: z.string().optional(),\n icon: z.string().optional(),\n })).min(1),\n multiple: z.boolean().default(false),\n});\n\nconst referenceFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"reference\"),\n referenceKind: z.string().min(1),\n allowManualEntry: z.boolean().default(false),\n});\n\n/**\n * Item type schema for polymorphic repeaters.\n * Each type has a label, optional icon, and its own field schema.\n */\nconst itemTypeSchema = z.object({\n label: z.string().min(1),\n icon: z.string().optional(),\n fields: z.lazy(() => getFieldSchemaInternal().array().min(1, \"Item type requires at least one field\")),\n});\n\n/**\n * Repeater fields allow nesting of other fields within them.\n * This enables complex layouts and structures by repeating a set of fields.\n *\n * Supports two modes:\n * 1. Monomorphic (default): All items have the same schema\n * 2. Polymorphic: Items can be different types (e.g., card, quote, stat)\n *\n * Uses z.lazy() to allow mutual recursion.\n */\nconst repeaterFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"repeater\"),\n itemLabel: z.string().default(\"Item\"),\n itemLabelSource: z.string().optional(),\n minItems: z.number().int().min(0).default(0),\n maxItems: z.number().int().positive().optional(),\n\n // Monomorphic mode\n schema: z.object({\n fields: z.lazy(() => getFieldSchemaInternal().array().min(1, \"Repeater requires at least one field\")),\n }).optional(),\n\n // Polymorphic mode\n polymorphic: z.boolean().optional(),\n itemTypes: z.record(z.string(), itemTypeSchema).optional(),\n allowConversion: z.boolean().default(true),\n}).refine(\n (data) => {\n // Either schema OR (polymorphic + itemTypes) must be present\n const hasSchema = data.schema !== undefined;\n const hasPolymorphic = data.polymorphic === true && data.itemTypes !== undefined;\n return hasSchema !== hasPolymorphic; // XOR: exactly one must be true\n },\n {\n message: \"Repeater must have either 'schema' (monomorphic) or 'polymorphic: true' with 'itemTypes' (polymorphic)\",\n }\n).refine(\n (data) => {\n const labelField = data.ui?.thumbnailLabelField\n if (!labelField) {\n return true\n }\n\n const schemaFields = (\n data.schema as { fields?: Array<{ id?: string; type?: string }> } | undefined\n )?.fields\n if (!schemaFields) {\n return true\n }\n\n const field = schemaFields.find((candidate: { id?: string; type?: string }) => candidate.id === labelField)\n return field?.type === 'text'\n },\n {\n message: \"ui.thumbnailLabelField must reference a text field in the repeater schema\",\n path: ['ui', 'thumbnailLabelField'],\n }\n);\n\nconst groupFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"group\"),\n schema: z.object({\n fields: z.lazy(() => getFieldSchemaInternal().array().min(1, \"Group requires at least one field\")),\n }),\n});\n\nconst modalFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"modal\"),\n schema: z.object({\n fields: z.lazy(() => getFieldSchemaInternal().array().min(1, \"Modal requires at least one field\")),\n }),\n});\n\nconst numberFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"number\"),\n min: z.number().optional(),\n max: z.number().optional(),\n step: z.number().optional(),\n});\n\nconst tabDefinitionSchema = z.object({\n id: z.string().min(1),\n label: z.string().min(1),\n icon: z.string().optional(),\n description: z.string().optional(),\n fields: z.lazy(() => getFieldSchemaInternal().array()),\n /** SDK section option that controls tab visibility based on site config */\n sdkSectionOption: z.enum(['backgroundColor', 'backgroundGradient', 'backgroundImage']).optional(),\n});\n\nconst tabGroupFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"tabGroup\"),\n tabs: z.array(tabDefinitionSchema).min(1, \"TabGroup requires at least one tab\"),\n activeTabField: z.string().optional(),\n});\n\nconst presetOptionSchema = z.object({\n value: z.string(),\n label: z.string(),\n});\n\nconst presetOrCustomFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"presetOrCustom\"),\n presets: z.array(presetOptionSchema).min(1, \"PresetOrCustom requires at least one preset\"),\n customInput: z.object({\n placeholder: z.string().optional(),\n pattern: z.string().optional(),\n helpText: z.string().optional(),\n }).optional(),\n});\n\nconst contentTypeSelectFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"contentTypeSelect\"),\n /** Filter: all, routable (hasPages=true), nonRoutable (hasPages=false) */\n filter: z.enum([\"all\", \"routable\", \"nonRoutable\"]).default(\"all\"),\n});\n\nconst entryPickerFieldSchema = baseFieldSchema.extend({\n type: z.literal(\"entryPicker\"),\n});\n\ntype FieldSchemaMembers = readonly [\n typeof textFieldSchema,\n typeof richTextFieldSchema,\n typeof mediaFieldSchema,\n typeof booleanFieldSchema,\n typeof numberFieldSchema,\n typeof dateFieldSchema,\n typeof timeFieldSchema,\n typeof dateTimeFieldSchema,\n typeof slugFieldSchema,\n typeof urlFieldSchema,\n typeof linkFieldSchema,\n typeof selectFieldSchema,\n typeof referenceFieldSchema,\n typeof repeaterFieldSchema,\n typeof groupFieldSchema,\n typeof modalFieldSchema,\n typeof tabGroupFieldSchema,\n typeof presetOrCustomFieldSchema,\n typeof contentTypeSelectFieldSchema,\n typeof entryPickerFieldSchema,\n];\n\ntype FieldSchemaUnion = z.ZodDiscriminatedUnion<FieldSchemaMembers, \"type\">;\n\n// Cached instance for lazy initialization\nlet _fieldSchemaInternal: FieldSchemaUnion | null = null;\n\nfunction getFieldSchemaInternal(): FieldSchemaUnion {\n // Lazy initialization to avoid module-level circular reference issues\n // when bundled into a single file\n if (_fieldSchemaInternal) {\n return _fieldSchemaInternal;\n }\n\n // INTENTIONAL: Zod's discriminatedUnion return type doesn't match our FieldSchemaUnion alias\n // due to complex recursive type inference. The runtime behavior is correct.\n _fieldSchemaInternal = z.discriminatedUnion(\"type\", [\n textFieldSchema,\n richTextFieldSchema,\n mediaFieldSchema,\n booleanFieldSchema,\n numberFieldSchema,\n dateFieldSchema,\n timeFieldSchema,\n dateTimeFieldSchema,\n slugFieldSchema,\n urlFieldSchema,\n linkFieldSchema,\n selectFieldSchema,\n referenceFieldSchema,\n repeaterFieldSchema,\n groupFieldSchema,\n modalFieldSchema,\n tabGroupFieldSchema,\n presetOrCustomFieldSchema,\n contentTypeSelectFieldSchema,\n entryPickerFieldSchema,\n ]) as FieldSchemaUnion;\n\n return _fieldSchemaInternal;\n}\n\n// Getter function for programmatic access\nexport function getFieldSchema(): FieldSchemaUnion {\n return getFieldSchemaInternal();\n}\n\n// Lazy proxy that forwards all method calls to getFieldSchemaInternal()\n// This allows backward compatibility with code using fieldSchema.array(), .parse(), etc.\n// The actual schema is only created when a method is first called\nexport const fieldSchema: FieldSchemaUnion = new Proxy({} as FieldSchemaUnion, {\n get(_, prop: keyof FieldSchemaUnion) {\n const schema = getFieldSchemaInternal();\n const value = schema[prop];\n // Bind functions to the schema so `this` works correctly\n return typeof value === 'function' ? value.bind(schema) : value;\n },\n // Forward has checks to the real schema\n has(_, prop) {\n return prop in getFieldSchemaInternal();\n },\n});\n\nexport type FieldSchema = FieldSchemaUnion;\n\nexport function parseFieldDefinition(input: unknown): FieldDefinition {\n return fieldSchema.parse(input) as FieldDefinition;\n}\n\nexport function parseFieldDefinitions(input: unknown[]): FieldDefinition[] {\n return fieldSchema.array().parse(input) as FieldDefinition[];\n}\n\nexport type TextFieldDefinition = z.output<typeof textFieldSchema>;\nexport type RichTextFieldDefinition = z.output<typeof richTextFieldSchema>;\nexport type MediaFieldDefinition = z.output<typeof mediaFieldSchema>;\nexport type BooleanFieldDefinition = z.output<typeof booleanFieldSchema>;\nexport type NumberFieldDefinition = z.output<typeof numberFieldSchema>;\nexport type DateFieldDefinition = z.output<typeof dateFieldSchema>;\nexport type TimeFieldDefinition = z.output<typeof timeFieldSchema>;\nexport type DateTimeFieldDefinition = z.output<typeof dateTimeFieldSchema>;\nexport type SlugFieldDefinition = z.output<typeof slugFieldSchema>;\nexport type UrlFieldDefinition = z.output<typeof urlFieldSchema>;\nexport type LinkFieldDefinition = z.output<typeof linkFieldSchema>;\nexport type SelectFieldDefinition = z.output<typeof selectFieldSchema>;\nexport type ReferenceFieldDefinition = z.output<typeof referenceFieldSchema>;\nexport type ItemTypeDefinition = {\n label: string;\n icon?: string;\n fields: FieldDefinition[];\n};\n\nexport type RepeaterFieldDefinition = Omit<z.output<typeof repeaterFieldSchema>, \"schema\" | \"itemTypes\"> & {\n schema?: {\n fields: FieldDefinition[];\n };\n itemTypes?: Record<string, ItemTypeDefinition>;\n};\n\nexport type GroupFieldDefinition = Omit<z.output<typeof groupFieldSchema>, \"schema\"> & {\n schema: {\n fields: FieldDefinition[];\n };\n};\n\nexport type ModalFieldDefinition = Omit<z.output<typeof modalFieldSchema>, \"schema\"> & {\n schema: {\n fields: FieldDefinition[];\n };\n};\n\nexport type TabDefinition = {\n id: string;\n label: string;\n icon?: string;\n description?: string;\n fields: FieldDefinition[];\n /**\n * Optional SDK section option that controls tab visibility.\n * When set, the tab is only shown when the SDK sectionOptions[key] is not false.\n */\n sdkSectionOption?: 'backgroundColor' | 'backgroundGradient' | 'backgroundImage';\n};\n\nexport type TabGroupFieldDefinition = Omit<z.output<typeof tabGroupFieldSchema>, \"tabs\"> & {\n tabs: TabDefinition[];\n};\n\nexport type PresetOption = {\n value: string;\n label: string;\n};\n\nexport type PresetOrCustomFieldDefinition = z.output<typeof presetOrCustomFieldSchema>;\n\nexport type ContentTypeSelectFieldDefinition = z.output<typeof contentTypeSelectFieldSchema>;\n\nexport type EntryPickerFieldDefinition = z.output<typeof entryPickerFieldSchema>;\n\nexport type FieldDefinition =\n | TextFieldDefinition\n | RichTextFieldDefinition\n | MediaFieldDefinition\n | BooleanFieldDefinition\n | NumberFieldDefinition\n | DateFieldDefinition\n | TimeFieldDefinition\n | DateTimeFieldDefinition\n | SlugFieldDefinition\n | UrlFieldDefinition\n | LinkFieldDefinition\n | SelectFieldDefinition\n | ReferenceFieldDefinition\n | RepeaterFieldDefinition\n | GroupFieldDefinition\n | ModalFieldDefinition\n | TabGroupFieldDefinition\n | PresetOrCustomFieldDefinition\n | ContentTypeSelectFieldDefinition\n | EntryPickerFieldDefinition;\n\n/**\n * Union type of all possible block field types.\n * Extracted from FieldDefinition for use in type compatibility checks.\n */\nexport type BlockFieldType = FieldDefinition['type'];\n\nexport const slotSchema = z.object({\n id: z.string().min(1),\n label: z.string().min(1),\n allowedKinds: z.array(z.string()).default([]),\n min: z.number().int().min(0).default(0),\n max: z.number().int().positive().optional(),\n help: z.string().optional(),\n visibleRoles: z.array(z.enum(visibilityLevels)).optional(),\n});\n\nexport type SlotDefinition = z.infer<typeof slotSchema>;\n\nconst typographyTokens = [\"display\", \"heading\", \"subheading\", \"body\", \"caption\"] as const;\nconst colorTokens = [\"background\", \"surface\", \"foreground\", \"accent\", \"muted\"] as const;\nconst spacingTokens = [\"none\", \"xs\", \"sm\", \"md\", \"lg\", \"xl\"] as const;\nconst radiusTokens = [\"none\", \"sm\", \"md\", \"lg\", \"full\"] as const;\n\nexport const styleTokenSchema = z.object({\n background: z.enum(colorTokens).optional(),\n foreground: z.enum(colorTokens).optional(),\n border: z.enum(colorTokens).optional(),\n typography: z.enum(typographyTokens).optional(),\n spacing: z.enum(spacingTokens).optional(),\n radius: z.enum(radiusTokens).optional(),\n});\n\nexport type StyleTokenConfig = z.infer<typeof styleTokenSchema>;\n\nexport const behaviourSchema = z.object({\n supportsThemeSwitching: z.boolean().default(true),\n inlineEditing: z.boolean().default(false),\n animation: z.boolean().default(false),\n // Hide from block picker palettes (e.g., header/footer system blocks)\n paletteHidden: z.boolean().default(false),\n // Block manages its own wrapper (for sticky/fixed positioning)\n managesOwnWrapper: z.boolean().optional(),\n});\n\nexport type BehaviourConfig = z.infer<typeof behaviourSchema>;\n\n// Block discovery and organization metadata\nexport const blockCategoryEnum = z.enum(['marketing', 'content', 'blog', 'media', 'layout', 'interactive']);\nexport type BlockCategory = z.infer<typeof blockCategoryEnum>;\n\nexport const manifestSchema = z.object({\n name: z.string().min(1),\n version: z.string().min(1),\n title: z.string().min(1),\n titleSource: z.string().optional(),\n description: z.string().optional(),\n component: z.string().min(1),\n fields: fieldSchema.array().default([]),\n slots: slotSchema.array().default([]),\n styleTokens: styleTokenSchema.optional(),\n behaviours: behaviourSchema.optional(),\n layout: NodeTreeSchema.optional(),\n /**\n * Optional list of nested field paths that should be surfaced in the main form body\n * as \"shortcuts\" (render-only). These paths should refer to existing data within the\n * block content object (e.g. `_sectionStyles.background.image`).\n *\n * The original fields remain available in settings for power users.\n */\n promotedFields: z.array(z.string().min(1)).optional(),\n // Block variants system\n variants: z.record(z.string(), NodeTreeSchema).optional(),\n defaultVariant: z.string().optional(),\n variantOptions: z\n .record(\n z.string(),\n z\n .object({\n label: z.string().optional(),\n description: z.string().optional(),\n icon: z.string().optional(),\n })\n .optional(),\n )\n .optional(),\n // Discovery metadata\n category: blockCategoryEnum.optional(),\n contentTypes: z.array(z.string()).optional(),\n tags: z.array(z.string()).optional(),\n icon: z.string().optional(),\n});\n\nexport type BlockManifest = Omit<z.infer<typeof manifestSchema>, 'fields'> & {\n fields: FieldDefinition[];\n};\n\n// ============================================================================\n// SDK Custom Block Types\n// ============================================================================\n\n/**\n * Whitelisted CMS loader endpoints for SDK custom blocks.\n *\n * The canonical list is SUPPORTED_LOADER_ENDPOINTS in @riverbankcms/blocks/system/data.\n * SDK validation derives its Zod schema from that constant, ensuring runtime and\n * compile-time consistency.\n *\n * Supported endpoints:\n * - listPublishedEntries: Fetch published content entries\n * - getPublishedEntryPreview: Fetch a single entry by slug\n * - listPublicEvents: Fetch public calendar events\n * - getPublicFormById: Fetch a form configuration\n * - getPublicBookingServices: Fetch booking services\n */\nexport type SdkLoaderEndpoint = SupportedLoaderEndpoint;\n\n/**\n * A binding expression for dynamic loader params.\n *\n * Bindings resolve at runtime from block content or page context:\n * - `content.fieldName` - Value from block's content field\n * - `$root.siteId` - Site ID from page context\n * - `$root.pageId` - Page ID from page context\n * - `$root.previewStage` - 'published' or 'preview'\n */\nexport type ParamBinding = {\n $bind: {\n /** Path to bind from (e.g., 'content.categoryId', '$root.siteId') */\n from: string;\n /** Fallback value if binding resolves to undefined */\n fallback?: string;\n };\n};\n\n/**\n * A loader param value can be static or a binding expression.\n */\nexport type LoaderParamValue = string | number | boolean | ParamBinding;\n\n/**\n * Config-based data loader for SDK custom blocks.\n *\n * Config loaders are declarative and restricted to whitelisted CMS endpoints.\n * They execute server-side during loadPage().\n */\nexport interface SdkConfigLoader {\n /** Whitelisted CMS endpoint to call */\n endpoint: SdkLoaderEndpoint;\n\n /**\n * Parameters to pass to the endpoint.\n * Values can be static or use bindings for dynamic resolution.\n */\n params: Record<string, LoaderParamValue>;\n\n /**\n * Execution mode.\n * Currently only 'server' is implemented - loaders run during loadPage().\n * 'client' is reserved for future client-side refresh functionality.\n * @default 'server'\n */\n mode?: 'server' | 'client';\n}\n\n/**\n * SDK Custom Block Definition\n *\n * Used by SDK sites to define entirely new blocks in their riverbank.config.ts.\n * These blocks:\n * - Have their own field schemas (using standard FieldDefinition format)\n * - Appear in the CMS block picker alongside system blocks\n * - Are edited using CMS-generated forms (existing infrastructure)\n * - Can be rendered via:\n * - `layout` field (declarative node tree - no React code needed)\n * - `blockOverrides` on the SDK site (custom React component)\n *\n * Block IDs must start with 'custom.' to distinguish from system blocks.\n */\nexport interface SdkCustomBlock {\n /** Block ID - MUST start with 'custom.' (e.g., 'custom.team-member') */\n id: `custom.${string}`;\n\n /** Display title in block picker */\n title: string;\n\n /** Field ID to use as block title in lists (must match a field id) */\n titleSource?: string;\n\n /** Description shown in block picker */\n description?: string;\n\n /** Category for block picker organization */\n category: BlockCategory;\n\n /** Lucide icon name */\n icon?: string;\n\n /** Search tags for block discovery */\n tags?: string[];\n\n /** Field definitions - uses same type as system blocks */\n fields: FieldDefinition[];\n\n /**\n * Config-based data loaders for CMS endpoints.\n *\n * Keys are loader names (e.g., 'posts', 'events').\n * Data is available in the component as `data.{key}`.\n *\n * @example\n * ```typescript\n * dataLoaders: {\n * events: {\n * endpoint: 'listPublicEvents',\n * params: {\n * siteId: { $bind: { from: '$root.siteId' } },\n * limit: { $bind: { from: 'content.limit', fallback: '5' } },\n * },\n * },\n * }\n * ```\n */\n dataLoaders?: Record<string, SdkConfigLoader>;\n\n /**\n * Optional declarative layout using the node DSL.\n *\n * When present, the block can be rendered without a React blockOverride.\n * The layout defines the component tree using node types like 'section',\n * 'stack', 'text', etc. with bindings to field content.\n *\n * If layout is absent, the block MUST be rendered via blockOverrides.\n *\n * @example\n * ```typescript\n * layout: {\n * type: 'section',\n * children: [\n * {\n * type: 'text',\n * props: { as: 'h1' },\n * $bind: { from: 'content.headline' }\n * },\n * {\n * type: 'text',\n * $bind: { from: 'content.subheadline' }\n * }\n * ]\n * }\n * ```\n */\n layout?: NodeDefinition;\n\n /**\n * Optional layout variants.\n *\n * When provided, the renderer selects the active variant via:\n * 1) content.variant\n * 2) content.layout (legacy)\n * 3) defaultVariant\n * 4) first key in variants\n */\n variants?: Record<string, NodeDefinition>;\n\n /** Default variant key (must exist in variants when provided) */\n defaultVariant?: string;\n\n /**\n * Optional metadata for variant selector UI.\n *\n * Allows overriding auto-generated labels and providing descriptions/icons.\n */\n variantOptions?: Record<string, { label?: string; description?: string; icon?: string }>;\n}\n","import type { NodeDefinition } from './schema';\n\n/**\n * Creates conditional layout branches based on item type.\n * Used for polymorphic repeaters where each item type has a different layout.\n *\n * @param itemTypesMap - Map of type IDs to their layout definitions\n * @param options - Configuration options\n * @returns Array of conditional node definitions\n *\n * @example\n * ```typescript\n * // In a repeater with items: [{_type: 'card', ...}, {_type: 'quote', ...}]\n * const children = typeBasedLayout({\n * card: stack({}, [\n * text({ as: 'h3' }, bind('item.title')),\n * richText({}, bind('item.body'))\n * ]),\n * quote: stack({}, [\n * richText({}, bind('item.text')),\n * text({ className: 'author' }, bind('item.author'))\n * ])\n * }, { itemName: 'item' });\n * ```\n */\nexport function typeBasedLayout(\n itemTypesMap: Record<string, NodeDefinition | NodeDefinition[]>,\n options?: {\n /**\n * Name of the repeater item variable (default: 'item')\n */\n itemName?: string;\n }\n): NodeDefinition[] {\n const itemName = options?.itemName ?? 'item';\n\n const result = Object.entries(itemTypesMap).map(([typeId, layout]) => {\n // Unwrap single-element arrays (fragments return [NodeDefinition])\n const node = Array.isArray(layout)\n ? (layout.length === 0\n ? { type: 'div', children: [] }\n : layout.length === 1\n ? (layout[0] ?? { type: 'div', children: [] })\n : { type: 'div', children: layout })\n : layout;\n\n return {\n ...node,\n $when: {\n when: { from: `${itemName}._type` },\n equals: typeId\n }\n };\n });\n\n return result;\n}\n","import type { BlockManifest, FieldDefinition, SelectFieldDefinition } from './schema';\nimport type { StyleGroups } from '../../theme/schema';\n\n/**\n * Augments a block manifest with synthetic fields and other transformations.\n * This should be called at the block definition level, not at runtime.\n *\n * Current augmentations:\n * - Adds a variant select field if the manifest has multiple variants\n *\n * Future augmentations might include:\n * - Theme field injection\n * - Spacing/layout presets\n * - Animation controls\n */\nexport function augmentManifest(manifest: BlockManifest): BlockManifest {\n let augmentedFields = manifest.fields ?? [];\n\n // Add variant field if block has multiple variants\n const variantField = createVariantField(manifest);\n if (variantField) {\n augmentedFields = [variantField, ...augmentedFields];\n }\n\n return {\n ...manifest,\n fields: augmentedFields,\n };\n}\n\n/**\n * Creates a synthetic variant field definition when a manifest has variants.\n */\nfunction createVariantField(manifest: BlockManifest): FieldDefinition | null {\n if (!manifest.variants || Object.keys(manifest.variants).length <= 1) {\n return null;\n }\n\n // Avoid injecting a duplicate variant field if the manifest already defines one.\n // This helps with backward compatibility for SDK custom blocks that manually\n // included a `variant` select field before variants were first-class.\n if (manifest.fields?.some((f) => f.id === 'variant')) {\n return null;\n }\n\n const variantKeys = Object.keys(manifest.variants);\n\n const field: FieldDefinition = {\n id: 'variant',\n type: 'select',\n label: 'Variant',\n description: 'Choose a layout variant for this block',\n ui: {\n intent: 'display',\n },\n required: false,\n defaultValue: manifest.defaultVariant ?? variantKeys[0],\n options: variantKeys.map((key) => {\n const meta = manifest.variantOptions?.[key];\n return {\n value: key,\n label: meta?.label ?? formatKeyAsLabel(key),\n ...(meta?.description ? { description: meta.description } : {}),\n ...(meta?.icon ? { icon: meta.icon } : {}),\n };\n }),\n multiple: false,\n };\n\n return field;\n}\n\n/**\n * Formats a key (variant name, style group, etc.) into a human-readable label.\n * Converts camelCase, snake_case, and kebab-case to Title Case.\n *\n * @example\n * formatKeyAsLabel('splitReverse') // → 'Split Reverse'\n * formatKeyAsLabel('bold_headline') // → 'Bold Headline'\n * formatKeyAsLabel('bold-headline') // → 'Bold Headline'\n * formatKeyAsLabel('classic') // → 'Classic'\n */\nfunction formatKeyAsLabel(key: string): string {\n return key\n .replace(/([A-Z])/g, ' $1') // camelCase → space before capitals\n .replace(/[-_]/g, ' ') // snake_case and kebab-case → spaces\n .trim()\n .split(' ')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ');\n}\n\n/**\n * Augments a block manifest with a styleGroup field when the theme defines\n * style groups for the given block kind.\n *\n * Style groups are visual presets (unlike variants which change layout/structure).\n * The selected style group renders as a `data-style-group` attribute on the block\n * wrapper, targetable in `blockCustomCssRules`.\n *\n * This function is idempotent - it won't add a duplicate styleGroup field.\n *\n * @param manifest - The block manifest to augment\n * @param styleGroups - Theme's styleGroups config (blockKind -> group names)\n * @param blockKind - The block kind to look up (e.g., 'hero', 'body-text').\n * May include 'block.' prefix which will be stripped.\n * @returns The augmented manifest (or original if no style groups defined)\n *\n * @example\n * ```typescript\n * const augmented = augmentManifestWithStyleGroups(\n * heroManifest,\n * { hero: ['bold', 'minimal', 'featured'] },\n * 'hero'\n * );\n * // Adds a styleGroup select field with options: bold, minimal, featured\n * ```\n */\nexport function augmentManifestWithStyleGroups(\n manifest: BlockManifest,\n styleGroups: StyleGroups | undefined,\n blockKind: string\n): BlockManifest {\n // blockKind may include \"block.\" prefix from registry; normalize to just the kind\n const cleanKind = blockKind.replace(/^block\\./, '');\n const groups = styleGroups?.[cleanKind];\n\n // No style groups defined for this block kind\n if (!groups || groups.length === 0) {\n return manifest;\n }\n\n // Idempotency check: don't add if styleGroup field already present\n if (manifest.fields?.some((f) => f.id === 'styleGroup')) {\n return manifest;\n }\n\n const styleGroupField: SelectFieldDefinition = {\n id: 'styleGroup',\n type: 'select',\n label: 'Style',\n description: 'Apply a visual style preset to this block',\n ui: {\n intent: 'style',\n },\n required: false,\n options: groups.map((g) => ({\n value: g,\n label: formatKeyAsLabel(g),\n })),\n multiple: false,\n };\n\n return {\n ...manifest,\n fields: [...(manifest.fields ?? []), styleGroupField],\n };\n}\n","import type { BlockManifest } from './schema';\n\nconst REGISTRY_SYMBOL = Symbol.for('@riverbankcms/blocks/manifest-registry');\n\ntype ManifestRegistryStore = Map<string, BlockManifest>;\n\ninterface ManifestRegistryGlobal extends Record<PropertyKey, unknown> {\n [REGISTRY_SYMBOL]?: ManifestRegistryStore;\n}\n\nconst isVitest =\n typeof process !== 'undefined' &&\n typeof process.env !== 'undefined' &&\n process.env.VITEST === 'true';\n\nconst globalScope = globalThis as ManifestRegistryGlobal;\n\n// In production builds, the registry intentionally lives on `globalThis` to avoid duplication\n// when the package is bundled multiple times. In Vitest, that can cause unbounded growth\n// across the full suite (since `globalThis` is not reset between files), so keep it local.\nconst manifestStore: ManifestRegistryStore = isVitest\n ? new Map()\n : (globalScope[REGISTRY_SYMBOL] ??= new Map());\n\nexport function registerManifest(manifest: BlockManifest): BlockManifest {\n manifestStore.set(manifest.name, manifest);\n return manifest;\n}\n\nexport function getManifestByName(name: string): BlockManifest | undefined {\n return manifestStore.get(name);\n}\n\nexport function hasManifest(name: string): boolean {\n return manifestStore.has(name);\n}\n\nexport function listManifests(): BlockManifest[] {\n return Array.from(manifestStore.values());\n}\n\nexport function clearManifestRegistry(): void {\n const env = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env?.NODE_ENV;\n if (env === 'production') {\n return;\n }\n\n manifestStore.clear();\n}\n","/**\n * Environment detection utilities\n *\n * Provides type-safe environment detection without relying on `any`-typed globals.\n */\n\n/**\n * Check if the current environment is development.\n *\n * Returns true if NODE_ENV is not 'production', or if NODE_ENV cannot be determined\n * (which is the safe default for validation and warnings).\n *\n * @returns true if in development mode, false if in production\n */\nexport function isDevEnvironment(): boolean {\n try {\n // Try to access process.env.NODE_ENV safely\n if (typeof process !== 'undefined' && process.env?.NODE_ENV !== undefined) {\n return process.env.NODE_ENV !== 'production'\n }\n // If process.env is unavailable (e.g., browser context), assume dev (safe default)\n return true\n } catch {\n // If accessing process throws (strict browser context), assume dev (safe default)\n return true\n }\n}\n","/**\n * Type-safe node builder types\n *\n * These types prevent common mistakes like putting 'children' in props\n * by explicitly excluding reserved keys at compile time.\n */\n\nimport type { NodeDefinition } from './schema'\nimport { isDevEnvironment } from '../../utils/env'\n\n/**\n * Reserved keys that should NEVER appear in node props.\n * These are top-level NodeDefinition properties that would conflict if placed in props.\n *\n * Note: 'type' is NOT included because components may legitimately need a 'type' prop\n * (e.g., Accordion needs type=\"single\"). The NodeDefinition.type is separate from props.type.\n */\ntype ReservedNodeKeys =\n | 'children'\n | 'key'\n | '$bind'\n | '$when'\n | '$repeat'\n | '$scopes'\n\n/**\n * List of reserved keys (for runtime validation).\n * Kept in sync with the ReservedNodeKeys type above.\n */\nconst RESERVED_KEYS: readonly ReservedNodeKeys[] = [\n 'children',\n 'key',\n '$bind',\n '$when',\n '$repeat',\n '$scopes',\n] as const\n\n/**\n * Props type that explicitly excludes reserved keys.\n * This makes it a compile-time error to pass children, $bind, etc. in props.\n *\n * @example\n * // ✅ OK\n * const props: NodeProps = { className: 'flex', gap: 'md' }\n *\n * // ❌ Type error - 'children' is not allowed in props\n * const props: NodeProps = { className: 'flex', children: [...] }\n */\nexport type NodeProps = Record<string, unknown> & {\n [K in ReservedNodeKeys]?: never\n}\n\n/**\n * Type-safe version of the el() function signature.\n * Ensures props cannot contain reserved keys.\n */\nexport type ElementBuilder = (\n type: string,\n props?: NodeProps | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: Array<(node: NodeDefinition) => NodeDefinition>\n) => NodeDefinition\n\n/**\n * Type guard to check if props contain reserved keys at runtime.\n * Use this in development mode to catch bugs early.\n *\n * @param props - Props object to validate\n * @returns Array of reserved keys found in props, or empty array if none\n */\nexport function findReservedKeysInProps(props: Record<string, unknown> | null | undefined): ReservedNodeKeys[] {\n if (!props) return []\n\n return RESERVED_KEYS.filter(key => key in props) as ReservedNodeKeys[]\n}\n\n/**\n * Validates that props don't contain reserved keys.\n * Throws in development, warns in production.\n *\n * @param props - Props to validate\n * @param context - Context for error message (e.g., \"el('grid', ...)\")\n */\nexport function validateProps(\n props: Record<string, unknown> | null | undefined,\n context: string = 'node builder'\n): void {\n const reserved = findReservedKeysInProps(props)\n\n if (reserved.length === 0) return\n\n const message = `[blocks:${context}] Reserved keys found in props: ${reserved.join(', ')}. ` +\n `These should be passed as separate parameters or modifiers, not in props. ` +\n `For example, 'children' should be the 3rd parameter to el(), not in the props object.`\n\n if (isDevEnvironment()) {\n throw new TypeError(message)\n } else {\n console.error(message)\n }\n}\n\n/**\n * Helper type to infer proper props for specific node types.\n * Can be extended to provide type-specific prop validation.\n */\nexport type NodeTypeProps<T extends string> = T extends 'grid'\n ? NodeProps & {\n cols?: unknown\n gap?: unknown\n }\n : T extends 'stack' | 'inline'\n ? NodeProps & {\n gap?: unknown\n align?: unknown\n justify?: unknown\n className?: unknown\n }\n : T extends 'text' | 'richText'\n ? NodeProps & {\n as?: string\n className?: unknown\n // These were previously used in a few blocks but are ignored by the Text primitive.\n // Prefer semantic tags (h1-h6/p/etc) + theme CSS (rb-prose-* / block-static hook classes).\n size?: never\n weight?: never\n }\n : NodeProps\n","import { NodeSchema, type Binding, type DataScope, type NodeDefinition } from './schema'\nimport { validateProps, type NodeProps } from './types'\nimport { isDevEnvironment } from '../../utils/env'\n\n// Modifier function that mutates or augments a node definition\nexport type NodeModifier = (node: NodeDefinition) => NodeDefinition\n\nfunction normalizeChildren(children?: Array<NodeDefinition | null | undefined>): NodeDefinition[] | undefined {\n if (!children) return undefined\n const flat = children.flat().filter(Boolean) as NodeDefinition[]\n return flat.length > 0 ? flat : undefined\n}\n\nexport function el(\n type: string,\n props?: NodeProps | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n): NodeDefinition {\n // Validate that reserved keys aren't in props (throws in dev, warns in prod)\n validateProps(props, `el('${type}', ...)`)\n\n const node: NodeDefinition = {\n type,\n ...(props && Object.keys(props).length > 0 ? { props } : {}),\n ...(children && children.length ? { children: normalizeChildren(children) } : {}),\n }\n\n if (mods && mods.length > 0) {\n // Filter out any non-function values (e.g., undefined, null)\n const validMods = mods.filter((mod): mod is NodeModifier => typeof mod === 'function')\n if (validMods.length > 0) {\n const modified = validMods.reduce((acc, fn) => fn(acc), node)\n return devValidate(modified)\n }\n }\n return devValidate(node)\n}\n\n// Convenience element helpers for common primitives\nexport const section = (\n props?: NodeProps | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n) => el('section', props, children, ...mods)\n\nexport const headerSection = (\n props?: NodeProps | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n) => el('headerSection', props, children, ...mods)\n\nexport const stack = (\n props?: NodeProps | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n) => el('stack', props, children, ...mods)\n\nexport const inline = (\n props?: NodeProps | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n) => el('inline', props, children, ...mods)\n\nexport const accordion = (\n props?: NodeProps | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n) => el('accordion', props, children, ...mods)\n\nexport const accordionItem = (\n props?: NodeProps | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n) => el('accordionItem', props, children, ...mods)\n\nexport const carousel = (\n props?: NodeProps | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n) => el('carousel', props, children, ...mods)\n\nexport const text = (\n props?: (NodeProps & { size?: never; weight?: never }) | null,\n ...mods: NodeModifier[]\n) => el('text', props, undefined, ...mods)\n\nexport const richText = (\n props?: (NodeProps & { size?: never; weight?: never }) | null,\n ...mods: NodeModifier[]\n) => el('richText', props, undefined, ...mods)\n\nexport const icon = (\n props?: NodeProps | null,\n ...mods: NodeModifier[]\n) => el('icon', props, undefined, ...mods)\n\nexport const media = (\n props?: NodeProps | null,\n ...mods: NodeModifier[]\n) => el('media', props, undefined, ...mods)\n\nexport const videoEmbed = (\n props?: NodeProps | null,\n ...mods: NodeModifier[]\n) => el('videoEmbed', props, undefined, ...mods)\n\nexport const spinner = (\n props?: NodeProps | null,\n ...mods: NodeModifier[]\n) => el('spinner', props, undefined, ...mods)\n\nexport const button = (\n props?: NodeProps | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n) => el('button', props, children, ...mods)\n\nexport const link = (\n props?: NodeProps | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n) => el('link', props, children, ...mods)\n\nexport const form = (\n props?: NodeProps | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n) => el('form', props, children, ...mods)\n\nexport const bookingForm = (\n props?: NodeProps | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n) => el('booking-form', props, children, ...mods)\n\nexport const eventList = (\n props?: NodeProps | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n) => el('event-list', props, children, ...mods)\n\nexport const eventRegistration = (\n props?: NodeProps | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n) => el('event-registration', props, children, ...mods)\n\nexport const shop = (\n props?: NodeProps | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n) => el('shop', props, children, ...mods)\n\nexport const customerPortal = (\n props?: NodeProps | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n) => el('customer-portal', props, children, ...mods)\n\n// Course enrollment form with sessions display and payment integration\nexport const courseRegistration = (\n props?: NodeProps | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n) => el('course-registration', props, children, ...mods)\n\n// Modifiers\nexport function bind(\n from: string,\n options?: {\n fallback?: unknown;\n transforms?: Array<{ id: string; options?: Record<string, unknown> }>;\n pick?: 'value' | 'collection' | 'context';\n coerce?: 'number' | 'boolean' | 'string';\n },\n): NodeModifier {\n return (node) => ({\n ...node,\n $bind: {\n from,\n ...(options?.fallback !== undefined ? { fallback: options.fallback } : {}),\n ...(options?.transforms ? { transforms: options.transforms } : {}),\n ...(options?.pick ? { pick: options.pick } : {}),\n ...(options?.coerce ? { coerce: options.coerce } : {}),\n },\n })\n}\n\nexport function when(path: string, options?: { equals?: unknown; not?: boolean }): NodeModifier {\n return (node) => ({\n ...node,\n $when: {\n when: { from: path },\n ...(options?.equals !== undefined ? { equals: options.equals } : {}),\n ...(options?.not ? { not: true } : {}),\n },\n })\n}\n\nexport function scopes(entries: Array<{ name: string; from: Binding }>): NodeModifier {\n const scoped: DataScope[] = entries.map((entry) => ({\n name: entry.name,\n from: {\n from: entry.from.from,\n transforms: entry.from.transforms ?? [],\n pick: entry.from.pick ?? 'value',\n ...(entry.from.fallback !== undefined ? { fallback: entry.from.fallback } : {}),\n ...(entry.from.coerce ? { coerce: entry.from.coerce } : {}),\n },\n }))\n\n return (node) => ({\n ...node,\n $scopes: scoped,\n })\n}\n\nexport function repeat(\n collectionPath: string,\n itemName: string = 'item',\n options?: { indexName?: string; limit?: number; sortBy?: { path: string; direction?: 'asc' | 'desc' } },\n): NodeModifier {\n return (node) => ({\n ...node,\n $repeat: {\n collection: { from: collectionPath, pick: 'collection' },\n itemName,\n ...(options?.indexName ? { indexName: options.indexName } : {}),\n ...(options?.limit ? { limit: options.limit } : {}),\n ...(options?.sortBy\n ? { sortBy: { path: options.sortBy.path, direction: options.sortBy.direction ?? 'asc' } }\n : {}),\n },\n })\n}\n\nexport function props(extra: Record<string, unknown>): NodeModifier {\n // Validate that reserved keys aren't being injected via the modifier\n validateProps(extra, 'props() modifier')\n\n return (node) => ({\n ...node,\n props: { ...(node.props ?? {}), ...extra },\n })\n}\n\ntype AccordionListOptions = {\n collection: string\n itemName?: string\n indexName?: string\n accordionProps?: NodeProps | null\n itemProps?: NodeProps | null\n triggerFrom: string\n contentFrom?: string\n valueFrom?: string | null\n}\n\nexport function accordionList(\n {\n collection,\n itemName = 'item',\n indexName,\n accordionProps = null,\n itemProps = null,\n triggerFrom,\n contentFrom,\n valueFrom,\n }: AccordionListOptions,\n ...mods: NodeModifier[]\n) {\n const resolvedIndexName = indexName ?? `${itemName}Index`\n const resolvedValuePath = valueFrom === null ? null : (valueFrom ?? resolvedIndexName)\n\n const baseItemProps: Record<string, unknown> = {\n ...(itemProps ?? {}),\n trigger: { $bind: { from: triggerFrom } },\n }\n\n if (contentFrom) {\n baseItemProps.content = { $bind: { from: contentFrom } }\n }\n\n if (resolvedValuePath) {\n baseItemProps.value = { $bind: { from: resolvedValuePath } }\n }\n\n return accordion(\n accordionProps ?? undefined,\n [\n accordionItem(\n baseItemProps,\n undefined,\n repeat(collection, itemName, { indexName: resolvedIndexName }),\n ),\n ],\n ...mods,\n )\n}\n\n// Dev-time validation against NodeSchema\nfunction devValidate(node: NodeDefinition): NodeDefinition {\n try {\n if (isDevEnvironment()) {\n const res = NodeSchema.safeParse(node)\n if (!res.success) {\n console.warn('[blocks:builder] Invalid node produced by builder', res.error.format())\n }\n }\n } catch {\n // noop: avoid crashing if zod or env is unavailable in certain runtimes\n }\n return node\n}\n","import { el, media, when, bind } from \"../builder\";\nimport type { NodeDefinition } from \"../schema\";\n\n/**\n * Options for customizing the appearance of background layers.\n */\nexport type BackgroundLayerOptions = {\n /**\n * CSS class applied to the color/gradient layer container.\n * This layer renders solid colors and gradients.\n *\n * @default 'background-style rb-absolute rb-inset-0 rb-z-neg-10 rb-h-full rb-w-full rb-pointer-events-none'\n */\n styleClassName?: string;\n\n /**\n * Base CSS classes applied to the background image element.\n * This layer renders background images with dynamic positioning based on scale.\n *\n * Note: Do NOT include positioning (inset-0), sizing (h-full w-full), object-fit, or opacity.\n * Those properties are applied dynamically via transforms:\n * - Positioning/sizing: background.resolveImageClassName (based on scale)\n * - Visual properties: background.resolveImageStyle (object-fit, opacity, width/height)\n *\n * @default 'rb-absolute rb-z-neg-10'\n */\n imageClassName?: string;\n\n /**\n * CSS class applied to the overlay layer container.\n * This layer renders color/gradient overlays on top of background images.\n *\n * @default 'background-overlay rb-absolute rb-inset-0 rb-z-neg-10 rb-h-full rb-w-full rb-pointer-events-none'\n */\n overlayClassName?: string;\n\n /**\n * Fallback background token applied to the style layer when no background is configured.\n *\n * This should be a palette token (e.g. 'background', 'surface') or a raw CSS\n * value via `raw:*`.\n */\n fallbackToken?: string;\n};\n\n/**\n * Creates background layer nodes for rendering backgrounds from field data.\n *\n * This helper generates three nodes:\n * 1. A style layer (div) that renders solid colors and gradients\n * 2. An image layer that conditionally renders background images\n * 3. An overlay layer (div) that renders color/gradient overlays on images\n *\n * The layers are designed to be placed behind content (z-index -10) and work\n * with data from `sectionStylesField`, `containerStylesField`, or `cardStylesField`.\n *\n * Layer stacking order (all use -z-10, stacking determined by DOM order):\n * - Content (default z-index, rendered last)\n * - Overlay layer (rendered third, above image due to DOM order)\n * - Image layer (rendered second)\n * - Style layer (rendered first, at bottom)\n *\n * @param path - The data path to the background field (e.g., '_sectionStyles.background')\n * @param options - Optional customization for layer appearance\n * @returns Array of three NodeDefinition objects: [styleLayer, imageLayer, overlayLayer]\n *\n * @example\n * // Basic usage in a block\n * const heroBackgroundNodes = backgroundLayer('_sectionStyles.background')\n *\n * @example\n * // Custom styling\n * const customBackgroundNodes = backgroundLayer('_sectionStyles.background', {\n * imageClassName: 'rb-absolute rb-inset-0 rb-z-neg-10 rb-h-full rb-w-full rb-object-cover rb-opacity-30'\n * })\n *\n * @example\n * // In a block layout\n * const layout = section(\n * { background: 'background' },\n * [\n * ...backgroundLayer('_sectionStyles.background'),\n * sectionContainer([])\n * ]\n * )\n */\nexport function backgroundLayer(\n path: string,\n options: BackgroundLayerOptions = {},\n): NodeDefinition[] {\n const {\n styleClassName = \"background-style rb-absolute rb-inset-0 rb-z-neg-10 rb-h-full rb-w-full rb-pointer-events-none\",\n imageClassName,\n overlayClassName = \"background-overlay rb-absolute rb-inset-0 rb-z-neg-10 rb-h-full rb-w-full rb-pointer-events-none\",\n fallbackToken,\n } = options;\n\n const styleLayer = el(\"div\", {\n className: styleClassName,\n style: {\n $bind: {\n from: path,\n transforms: [\n {\n id: \"background.resolveStyle\",\n ...(typeof fallbackToken === \"string\" && fallbackToken.trim().length > 0\n ? { options: { fallbackToken: fallbackToken.trim() } }\n : {}),\n },\n ],\n },\n },\n });\n\n const imageLayer = createBackgroundImageNode(path, imageClassName);\n\n const overlayLayer = createBackgroundOverlayNode(path, overlayClassName);\n\n return [styleLayer, imageLayer, overlayLayer];\n}\n\n/**\n * Creates a media node for rendering a background image with conditional rendering.\n *\n * This helper creates a media element that:\n * - Only renders when the image path has a value (via `when` modifier)\n * - Binds to the image data at the specified path (via `bind` modifier)\n * - Applies the provided CSS class for positioning and styling\n * - Applies advanced image options (object-fit, object-position, opacity) via transform\n *\n * Used internally by `backgroundLayer()` but can be used independently for custom layouts.\n *\n * @param path - The data path to the background field (e.g., '_sectionStyles.background')\n * @param className - CSS class for the image element\n * @returns A media NodeDefinition with conditional rendering and data binding\n *\n * @example\n * // Standalone usage\n * const imageNode = createBackgroundImageNode('_sectionStyles.background')\n *\n * @example\n * // Custom styling\n * const imageNode = createBackgroundImageNode(\n * '_sectionStyles.background',\n * 'rb-absolute rb-inset-0 rb-h-full rb-w-full'\n * )\n */\nexport function createBackgroundImageNode(\n path: string,\n baseClassName: string = \"rb-absolute rb-z-neg-10\",\n): NodeDefinition {\n const imagePath = `${path}.image`;\n\n // Note: Visual properties (object-fit, opacity, scale) are applied dynamically.\n // className: Resolved via background.resolveImageClassName based on scale\n // style: Resolved via background.resolveImageStyle for object-fit, opacity, width/height\n return media(\n {\n className: {\n $bind: {\n from: path,\n transforms: [\n {\n id: \"background.resolveImageClassName\",\n options: { baseClass: `background-image ${baseClassName}` },\n },\n ],\n },\n },\n style: {\n $bind: {\n from: path,\n transforms: [{ id: \"background.resolveImageStyle\" }],\n },\n },\n },\n when(imagePath),\n bind(imagePath),\n );\n}\n\n/**\n * Creates a div node for rendering color/gradient overlays on background images.\n *\n * This helper creates a div element that:\n * - Is always present in the DOM but invisible when no overlay is configured\n * - Binds to the overlay data at `${path}.overlay`\n * - Applies color/gradient via `background.resolveOverlayStyle` transform\n *\n * The overlay appears above the image due to DOM order (both use -z-10).\n * When no overlay is configured, the transform returns {} making the div invisible.\n *\n * Used internally by `backgroundLayer()` but can be used independently for custom layouts.\n *\n * @param path - The data path to the background field (e.g., '_sectionStyles.background')\n * @param className - CSS class for the overlay element\n * @returns A div NodeDefinition with style binding\n *\n * @example\n * // Standalone usage\n * const overlayNode = createBackgroundOverlayNode('_sectionStyles.background')\n */\nexport function createBackgroundOverlayNode(\n path: string,\n className: string = \"background-overlay rb-absolute rb-inset-0 rb-z-neg-10 rb-h-full rb-w-full rb-pointer-events-none\",\n): NodeDefinition {\n const overlayPath = `${path}.overlay`;\n\n return el(\"div\", {\n className,\n style: {\n $bind: {\n from: overlayPath,\n transforms: [{ id: \"background.resolveOverlayStyle\" }],\n },\n },\n });\n}\n","import { stack, text, when, bind } from '../builder'\nimport type { NodeDefinition } from '../schema'\n\nexport function headingGroup(opts: {\n eyebrowPath?: string\n titlePath: string\n containerClass?: string\n className?: string\n eyebrowClass?: string\n titleClass?: string\n eyebrowStyle?: Record<string, unknown>\n titleStyle?: Record<string, unknown>\n}): NodeDefinition {\n const {\n eyebrowPath,\n titlePath,\n containerClass = 'text-center',\n className,\n // rb-eyebrow: typography, heading-eyebrow: color (in blocks-static/hero.css)\n eyebrowClass = 'rb-eyebrow heading-eyebrow',\n // h2 gets size/weight from theme typography CSS, color from blocks-static/index.css\n titleClass = 'heading-title',\n eyebrowStyle,\n titleStyle,\n } = opts\n\n const finalContainerClass = className ? `${containerClass} ${className}` : containerClass\n\n return stack({ gap: 'sm', className: finalContainerClass }, [\n eyebrowPath ? text({ as: 'p', className: eyebrowClass, style: eyebrowStyle }, when(eyebrowPath), bind(eyebrowPath)) : null,\n text({ as: 'h2', className: titleClass, style: titleStyle }, bind(titlePath)),\n ])\n}\n","import { stack } from '../builder'\nimport type { NodeDefinition } from '../schema'\n\n/**\n * Creates a centered container with responsive max-width.\n *\n * By default, uses Tailwind's responsive `container` class which provides:\n * - sm: max-w-640px\n * - md: max-w-768px\n * - lg: max-w-1024px\n * - xl: max-w-1280px\n * - 2xl: max-w-1536px\n *\n * When `bindFrom` points to _containerStyles with fullWidth=true, switches to `w-full`\n * for edge-to-edge content without horizontal constraints.\n *\n * @param children - Child nodes to render inside container\n * @param opts - Configuration options\n * @param opts.gap - Vertical spacing between children (default: 'md')\n * @param opts.align - Horizontal alignment (default: undefined)\n * @param opts.className - Additional static classes\n * @param opts.bindFrom - Data path for container styles (default: '_containerStyles')\n * @returns A stack NodeDefinition configured as a responsive container\n */\nexport function sectionContainer(\n children: Array<NodeDefinition | null | undefined>,\n opts?: {\n gap?: 'sm' | 'md' | 'lg' | 'xl'\n align?: 'start' | 'center' | 'end'\n className?: string\n bindFrom?: string\n },\n): NodeDefinition {\n const gap = opts?.gap ?? 'md'\n const align = opts?.align\n const bindFrom = opts?.bindFrom ?? '_containerStyles'\n const additionalClasses = opts?.className ?? ''\n\n return stack(\n {\n gap,\n className: {\n $bind: {\n from: bindFrom,\n transforms: [\n {\n id: 'containerStyles.resolveClassName',\n options: { baseClass: additionalClasses },\n },\n ],\n fallback: additionalClasses ? `container mx-auto ${additionalClasses}` : 'container mx-auto',\n },\n },\n ...(align ? { align } : {}),\n },\n children,\n )\n}\n\n","import type { NodeDefinition } from '../schema';\nimport { el } from '../builder';\nimport { backgroundLayer } from './backgroundLayer';\n\nexport type StyledContainerConfig = {\n /**\n * Content nodes to render inside the container.\n *\n * Note: `styledContainer` is a visual wrapper (width + backgrounds + box styles).\n * If you need vertical spacing between multiple children, wrap them in a `stack(...)`.\n */\n children: NodeDefinition | NodeDefinition[];\n\n /**\n * Override the root node type.\n *\n * Default: 'div'. Use 'stack' when you need stack-only props like `gap`/`justify`\n * on the same element that owns container styles/backgrounds.\n */\n rootType?: 'div' | 'stack';\n\n /**\n * Additional props applied to the root node.\n *\n * Note: `className` and `style` are owned by this fragment (bindings), so any\n * provided `className`/`style` will be ignored.\n */\n rootProps?: Record<string, unknown>;\n\n /**\n * Path to the container styles data in the content (e.g., '_containerStyles').\n * @default '_containerStyles'\n */\n bindFrom?: string;\n\n /**\n * Base CSS classes always applied to the container element.\n *\n * This element is the containing block for absolute-positioned background layers.\n * We default to `rb-overflow-hidden` so background layers clip correctly\n * (especially with rounded corners + scaled images).\n *\n * @default 'rb-relative rb-isolate rb-overflow-hidden'\n */\n baseClassName?: string;\n\n /**\n * CSS class to apply to background image layer.\n * @default 'rb-absolute rb-z-neg-10'\n */\n imageClassName?: string;\n};\n\n/**\n * Create a constrained container wrapper with optional background layers and box styles.\n *\n * This is the inner counterpart to `styledSection()`:\n * - `styledSection()` binds `_sectionStyles` to the full-width section wrapper.\n * - `styledContainer()` binds `_containerStyles` to a constrained wrapper inside the section.\n *\n * The intended DOM layering is:\n * - section (full-bleed background)\n * - .background-style (section)\n * - .rb-container (container background + spacing + rounding + shadow)\n * - .background-style (container)\n * - content\n */\nexport function styledContainer(config: StyledContainerConfig): NodeDefinition {\n const {\n children,\n rootType = 'div',\n rootProps,\n bindFrom = '_containerStyles',\n baseClassName = 'rb-relative rb-isolate rb-overflow-hidden',\n imageClassName = 'rb-absolute rb-z-neg-10',\n } = config;\n\n const backgroundNodes = backgroundLayer(`${bindFrom}.background`, {\n imageClassName,\n });\n\n const childrenArray = Array.isArray(children) ? children : [children];\n\n // Prevent consumers from accidentally overriding bindings.\n const { className: _ignoredClassName, style: _ignoredStyle, ...safeRootProps } =\n (rootProps ?? {}) as Record<string, unknown>;\n\n return el(\n rootType,\n {\n ...safeRootProps,\n style: {\n $bind: {\n from: `${bindFrom}.background`,\n transforms: [{ id: 'background.resolveColorsStyle' }],\n },\n },\n className: {\n $bind: {\n from: bindFrom,\n transforms: [\n {\n id: 'containerStyles.resolveBoxClassName',\n options: { baseClass: baseClassName },\n },\n ],\n fallback: `${baseClassName} rb-container`,\n },\n },\n },\n [...backgroundNodes, ...childrenArray],\n );\n}\n","/**\n * Type-safe spacing system for sections and containers.\n *\n * This module provides:\n * - Semantic spacing values (none, compact, cozy, medium, comfortable, spacious)\n * - Type-safe mappings to CSS class tokens\n * - Runtime validation via type guards\n * - Separate handling for section (vertical) vs container (all-sides) spacing\n *\n * Type Safety Guarantees:\n * - Type is derived from data (single source of truth)\n * - Maps are validated for completeness at compile time\n * - Runtime validation available via isSemanticSpacing()\n */\n\n/**\n * Single source of truth for semantic spacing values.\n * The SemanticSpacing type is derived from this array to ensure they stay in sync.\n *\n * Adding a new spacing value:\n * 1. Add it to this array\n * 2. TypeScript will error until you update both spacing maps\n * 3. No way to get out of sync\n */\nconst SEMANTIC_SPACING_VALUES = [\n \"none\", // No padding\n \"compact\", // Minimal padding\n \"cozy\", // Small but comfortable\n \"medium\", // Standard spacing (default for most blocks)\n \"comfortable\", // Generous spacing\n \"spacious\", // Maximum spacing\n] as const;\n\n/**\n * Semantic spacing values used across the block system.\n * These abstract away the specific CSS classes and provide a consistent vocabulary.\n *\n * This type is derived from SEMANTIC_SPACING_VALUES to ensure compile-time safety.\n */\nexport type SemanticSpacing = (typeof SEMANTIC_SPACING_VALUES)[number];\n\n/**\n * Runtime type guard for validating spacing values.\n * Use this at system boundaries where data enters from external sources.\n *\n * @param value - Unknown value to validate\n * @returns true if value is a valid SemanticSpacing, with type narrowing\n *\n * @example\n * const userInput = 'medium';\n * if (isSemanticSpacing(userInput)) {\n * // TypeScript knows userInput is SemanticSpacing here\n * const classes = resolveSpacing(userInput, 'y');\n * }\n */\nexport function isSemanticSpacing(value: unknown): value is SemanticSpacing {\n return (\n typeof value === \"string\" &&\n (SEMANTIC_SPACING_VALUES as readonly string[]).includes(value)\n );\n}\n\n/**\n * Spacing axis determines which sides receive padding.\n * - 'y': Vertical only (py-*) - used for sections\n * - 'all': All sides (p-*) - used for containers/cards\n */\nexport type SpacingAxis = \"y\" | \"all\";\n\n/**\n * Type-safe mapping from semantic spacing to CSS classes for sections (y-axis).\n *\n * Sections use vertical padding only to control spacing between blocks.\n * Horizontal padding (px-6) is handled separately via baseClass.\n *\n * The `satisfies` operator ensures all SemanticSpacing values are present at compile time.\n * TypeScript will error if any spacing value is missing or if extra keys exist.\n */\nexport const SECTION_SPACING_MAP = {\n none: \"rb-section-pad-none\",\n compact: \"rb-section-pad-compact\",\n cozy: \"rb-section-pad-cozy\",\n medium: \"rb-section-pad-medium\",\n comfortable: \"rb-section-pad-comfortable\",\n spacious: \"rb-section-pad-spacious\",\n} as const satisfies Record<SemanticSpacing, string>;\n\n/**\n * Type-safe mapping from semantic spacing to CSS classes for containers (all sides).\n *\n * Containers use padding on all sides for internal content spacing.\n *\n * The `satisfies` operator ensures all SemanticSpacing values are present at compile time.\n */\nexport const CONTAINER_SPACING_MAP = {\n none: \"rb-container-pad-none\",\n compact: \"rb-container-pad-compact\",\n cozy: \"rb-container-pad-cozy\",\n medium: \"rb-container-pad-medium\",\n comfortable: \"rb-container-pad-comfortable\",\n spacious: \"rb-container-pad-spacious\",\n} as const satisfies Record<SemanticSpacing, string>;\n\n/**\n * Resolve semantic spacing to CSS classes based on axis.\n *\n * This function guarantees that valid SemanticSpacing values always return a result.\n * Since spacing is typed, there's no need for fallback logic.\n *\n * @param spacing - Semantic spacing value (validated at compile time)\n * @param axis - Which axis to apply padding ('y' for sections, 'all' for containers)\n * @returns CSS class token string\n *\n * @example\n * resolveSpacing('medium', 'y') // => 'rb-section-pad-medium'\n * resolveSpacing('medium', 'all') // => 'rb-container-pad-medium'\n * resolveSpacing('compact') // => 'rb-section-pad-compact' (defaults to 'y' axis)\n */\nexport function resolveSpacing(\n spacing: SemanticSpacing,\n axis: SpacingAxis = \"y\",\n): string {\n const map = axis === \"y\" ? SECTION_SPACING_MAP : CONTAINER_SPACING_MAP;\n return map[spacing];\n}\n\n/**\n * Resolve semantic spacing to section CSS classes (vertical padding only).\n * More explicit alternative to resolveSpacing(spacing, 'y').\n *\n * @param spacing - Semantic spacing value\n * @returns CSS class token string for section padding\n *\n * @example\n * resolveSectionSpacing('medium') // => 'rb-section-pad-medium'\n */\nexport function resolveSectionSpacing(spacing: SemanticSpacing): string {\n return SECTION_SPACING_MAP[spacing];\n}\n\n/**\n * Resolve semantic spacing to container CSS classes (all-sides padding).\n * More explicit alternative to resolveSpacing(spacing, 'all').\n *\n * @param spacing - Semantic spacing value\n * @returns CSS class token string for container padding\n *\n * @example\n * resolveContainerSpacing('medium') // => 'rb-container-pad-medium'\n */\nexport function resolveContainerSpacing(spacing: SemanticSpacing): string {\n return CONTAINER_SPACING_MAP[spacing];\n}\n\n/**\n * Default spacing value for sections when not explicitly configured.\n */\nexport const DEFAULT_SECTION_SPACING: SemanticSpacing = \"medium\";\n\n/**\n * Default spacing value for containers when not explicitly configured.\n */\nexport const DEFAULT_CONTAINER_SPACING: SemanticSpacing = \"medium\";\n","import type { NodeDefinition } from '../schema';\nimport { section } from '../builder';\nimport { backgroundLayer } from './backgroundLayer';\nimport type { SemanticSpacing } from '../../spacing';\nimport { DEFAULT_SECTION_SPACING } from '../../spacing';\n\n/**\n * Configuration for creating a styled section with background support.\n */\nexport type StyledSectionConfig = {\n /**\n * Content nodes to render inside the section.\n * Can be a single node, array of nodes, or empty array.\n */\n children: NodeDefinition | NodeDefinition[];\n\n /**\n * Base horizontal padding class (e.g., 'rb-px-6', 'rb-px-8').\n * This provides consistent horizontal constraints across sections.\n * Removed when fullWidth is enabled in _containerStyles.\n * @default 'rb-px-6'\n */\n baseClass?: string;\n\n /**\n * Semantic vertical spacing value for the section.\n * Uses semantic values (none, compact, cozy, medium, comfortable, spacious)\n * which are transformed to CSS-only `rb-*` classes.\n *\n * @default 'medium' (resolves to `rb-section-pad-medium`)\n */\n spacing?: SemanticSpacing;\n\n /**\n * Theme background token to apply.\n * Used as a fallback background when no background is configured in data.\n *\n * Note: this should be a palette token (e.g. 'background', 'surface') or a raw\n * CSS value via `raw:*`.\n *\n * @default 'background'\n */\n background?: string;\n\n /**\n * Path to the section styles data in the content (e.g., '_sectionStyles').\n * This path is used for binding className, allowOverflow, and background layers.\n * @default '_sectionStyles'\n */\n bindFrom?: string;\n\n /**\n * CSS class to apply to background image layer.\n * @default 'rb-absolute rb-z-neg-10'\n */\n imageClassName?: string;\n\n /**\n * Optional path to a boolean flag in block content that should trigger\n * full-width section behavior (removing horizontal `rb-px-*` classes).\n *\n * Useful for blocks that expose a simple boolean (e.g. `fullBleed`) instead\n * of a full `_containerStyles` object.\n */\n fullWidthPath?: string;\n};\n\n/**\n * Create a styled section with automatic background layer and spacing bindings.\n *\n * This helper encapsulates the common pattern of:\n * - Creating a section wrapper with background theme\n * - Adding background color/gradient/image layers\n * - Binding className to section styles with transform\n * - Binding allowOverflow for background positioning\n * - Wrapping content children\n *\n * Use this helper to eliminate 25+ lines of boilerplate section setup code.\n *\n * @example\n * // Basic usage with default spacing\n * const layout = styledSection({\n * children: sectionContainer(contentNodes, { gap: 'md' }),\n * });\n *\n * @example\n * // Custom spacing and base padding\n * const compactLayout = styledSection({\n * children: sectionContainer(contentNodes, { gap: 'sm' }),\n * baseClass: 'rb-px-8',\n * spacing: 'compact',\n * });\n *\n * @example\n * // Multiple children\n * const layout = styledSection({\n * children: [\n * heading({ text: 'Title' }),\n * sectionContainer(contentNodes, { gap: 'md' }),\n * ],\n * });\n *\n * @example\n * // Custom binding path (for nested sections)\n * const nestedSection = styledSection({\n * children: content,\n * bindFrom: 'container.styles',\n * });\n */\nexport function styledSection(config: StyledSectionConfig): NodeDefinition {\n const {\n children,\n baseClass = 'rb-px-6',\n spacing = DEFAULT_SECTION_SPACING,\n background = 'background',\n bindFrom = '_sectionStyles',\n imageClassName = 'rb-absolute rb-z-neg-10',\n fullWidthPath,\n } = config;\n\n // Create background layers (color/gradient + image)\n const backgroundNodes = backgroundLayer(`${bindFrom}.background`, {\n imageClassName,\n fallbackToken: background,\n });\n\n // Normalize children to array\n const childrenArray = Array.isArray(children) ? children : [children];\n\n // Create section with background, className binding, and allowOverflow binding\n return section(\n {\n style: {\n $bind: {\n from: `${bindFrom}.background`,\n transforms: [\n {\n id: 'sectionStyles.resolveColorsStyle',\n },\n ],\n },\n },\n className: {\n $bind: {\n from: bindFrom,\n transforms: [\n {\n id: 'sectionStyles.resolveClassName',\n options: { baseClass, defaultSpacing: spacing, fullWidthPath },\n },\n ],\n // No fallback needed - transform handles all cases via defaultSpacing\n },\n },\n allowOverflow: {\n $bind: {\n from: `${bindFrom}.background`,\n transforms: [{ id: 'background.resolveAllowOverflow' }],\n fallback: false,\n },\n },\n },\n [\n ...backgroundNodes,\n ...childrenArray,\n ],\n );\n}\n","import { button, icon, text, bind, when, repeat } from \"../builder\";\nimport type { NodeDefinition } from \"../schema\";\n\n// Single CTA button primitive.\n// - Uses `variantId` (unprefixed) + `button-{variantId}` class for theme compatibility\n// - Uses `size` to add `btn-{size}` class (theme buttons sizing)\n// - Accepts optional icons and when-path\n// - Can optionally repeat over a collection when `repeatFrom` is provided\nexport function ctaButton(opts?: {\n basePath?: string;\n linkPath?: string;\n labelPath?: string;\n variantPath?: string;\n sizePath?: string;\n iconLeftPath?: string;\n iconRightPath?: string;\n whenPath?: string;\n repeatFrom?: { collectionPath: string; itemName?: string };\n className?: string;\n variantFallback?: string;\n}): NodeDefinition {\n const base = opts?.basePath ?? \"cta\";\n const linkPath = opts?.linkPath ?? `${base}.link`;\n const labelPath = opts?.labelPath ?? `${base}.label`;\n const variantPath = opts?.variantPath ?? `${base}.variant`;\n const sizePath = opts?.sizePath ?? `${base}.size`;\n const iconLeftPath = opts?.iconLeftPath ?? `${base}.iconLeft`;\n const iconRightPath = opts?.iconRightPath ?? `${base}.iconRight`;\n const whenPath = opts?.whenPath ?? labelPath;\n\n const leftIcon = icon(\n { className: \"rb-mr-2 rb-h-4 rb-w-4 rb-inline-block\" },\n when(iconLeftPath),\n bind(iconLeftPath),\n );\n const rightIcon = icon(\n { className: \"rb-ml-2 rb-h-4 rb-w-4 rb-inline-block\" },\n when(iconRightPath),\n bind(iconRightPath),\n );\n const label = text({ as: \"span\" }, bind(labelPath));\n\n const node = button(\n {\n variantId: {\n $bind: {\n from: variantPath,\n fallback: opts?.variantFallback ?? \"primary\",\n },\n },\n size: {\n $bind: {\n from: sizePath,\n },\n },\n ...(opts?.className ? { className: opts.className } : {}),\n href: { $bind: { from: linkPath, transforms: [{ id: \"links.resolve\" }] } },\n linkRequired: true,\n },\n [leftIcon, label, rightIcon],\n );\n\n // Apply repeat to the node if requested\n if (opts?.repeatFrom) {\n return button(\n node.props ?? {},\n node.children,\n repeat(opts.repeatFrom.collectionPath, opts.repeatFrom.itemName ?? base),\n );\n }\n return button(node.props ?? {}, node.children, when(whenPath));\n}\n","import { inline, when } from '../builder'\nimport type { Binding, NodeDefinition } from '../schema'\nimport { ctaButton } from './ctaButton'\n\ntype Bindable<T> = T | { $bind: Binding }\n\n// Renders a single inline container whose children are the repeated CTA buttons.\n// Button styling uses theme-friendly Tailwind utility classes (mapped to CSS vars),\n// selected by a simple transform keyed by `variant`.\nexport function ctaRow(opts?: {\n collectionPath?: string\n itemName?: string\n gap?: 'sm' | 'md' | 'lg'\n justify?: Bindable<'start' | 'center' | 'end'>\n containerClassName?: string\n}): NodeDefinition {\n const collectionPath = opts?.collectionPath ?? 'content.ctas'\n const item = opts?.itemName ?? 'cta'\n const gap = opts?.gap ?? 'sm'\n const justify = opts?.justify ?? 'center'\n // flex-wrap now in blocks-static/index.css for .cta-row\n const containerClassName = ['cta-row', opts?.containerClassName].filter(Boolean).join(' ')\n\n return inline(\n { gap, justify, className: containerClassName },\n [\n ctaButton({ basePath: item, repeatFrom: { collectionPath, itemName: item } }),\n ],\n when(collectionPath),\n )\n}\n","import {\n bind,\n button,\n el,\n inline,\n link,\n repeat,\n stack,\n text,\n when,\n} from \"../builder\";\nimport type { NodeDefinition } from \"../schema\";\n\nexport function navRow(opts?: {\n collectionPath?: string;\n itemName?: string;\n gap?: \"sm\" | \"md\" | \"lg\";\n align?: \"start\" | \"center\" | \"end\";\n className?: string;\n linkClassName?: string | Record<string, unknown>;\n}): NodeDefinition {\n const collectionPath = opts?.collectionPath ?? \"menu.items\";\n const itemName = opts?.itemName ?? \"navItem\";\n const childItemName = `${itemName}Child`;\n const dropdownMenuId = {\n $bind: { from: `${itemName}.id` },\n $prepend: \"nav-dropdown-menu-\",\n };\n\n const gap = opts?.gap ?? \"md\";\n const align = opts?.align ?? \"end\";\n const className = [\"rb-items-center rb-flex-wrap\", opts?.className]\n .filter(Boolean)\n .join(\" \")\n .trim();\n\n const linkClassName =\n opts?.linkClassName ??\n \"header-nav-link rb-inline-flex rb-items-center rb-px-4 rb-py-2 rb-nav-text transition-theme-standard\";\n\n const simpleLink = link(\n {\n className: linkClassName,\n href: { $bind: { from: `${itemName}.link`, transforms: [{ id: \"links.resolve\" }] } },\n linkRequired: true,\n target: { $bind: { from: `${itemName}.target` } },\n rel: { $bind: { from: `${itemName}.rel` } },\n \"data-active\": { $bind: { from: `${itemName}.active` } },\n },\n [text({ as: \"span\" }, bind(`${itemName}.label`))],\n when(`${itemName}.children`, { not: true }),\n );\n\n const dropdownCaret = el(\"div\", {\n className: \"nav-caret\",\n \"aria-hidden\": \"true\",\n });\n\n // Dropdown child links - text size controlled by theme's dropdownStyle.textSize\n const dropdownLinks = link(\n {\n className:\n \"nav-dropdown-link rb-block rb-w-full rb-px-4 rb-py-2 transition-theme-standard\",\n href: { $bind: { from: `${childItemName}.link`, transforms: [{ id: \"links.resolve\" }] } },\n linkRequired: true,\n target: { $bind: { from: `${childItemName}.target` } },\n rel: { $bind: { from: `${childItemName}.rel` } },\n \"data-active\": { $bind: { from: `${childItemName}.active` } },\n },\n [text({ as: \"span\" }, bind(`${childItemName}.label`))],\n repeat(`${itemName}.children`, childItemName),\n );\n\n const dropdown = el(\n \"div\",\n { className: \"nav-dropdown rb-relative\" },\n [\n button(\n {\n type: \"button\",\n variantId: \"\",\n className: [\"nav-dropdown-trigger\", linkClassName]\n .filter(Boolean)\n .join(\" \"),\n \"aria-haspopup\": \"menu\",\n \"aria-expanded\": \"false\",\n \"aria-controls\": dropdownMenuId,\n },\n [text({ as: \"span\" }, bind(`${itemName}.label`)), dropdownCaret],\n ),\n el(\n \"div\",\n {\n className:\n \"nav-dropdown-menu rb-absolute rb-left-0 rb-top-full rb-z-50 rb-hidden rb-min-w-12rem rb-overflow-hidden\",\n id: dropdownMenuId,\n },\n [dropdownLinks],\n ),\n ],\n when(`${itemName}.children`),\n );\n\n const item = el(\n \"div\",\n { className: \"nav-row-item rb-relative\" },\n [simpleLink, dropdown],\n repeat(collectionPath, itemName),\n );\n\n return inline({ gap, align, className }, [item], when(collectionPath));\n}\n\nexport function navColumn(opts?: {\n collectionPath?: string;\n itemName?: string;\n className?: string;\n linkClassName?: string;\n childLinkClassName?: string;\n triggerClassName?: string;\n childrenClassName?: string;\n}): NodeDefinition {\n const collectionPath = opts?.collectionPath ?? \"menu.items\";\n const itemName = opts?.itemName ?? \"navItem\";\n const childItemName = `${itemName}Child`;\n const childrenId = {\n $bind: { from: `${itemName}.id` },\n $prepend: \"nav-mobile-children-\",\n };\n\n const className = [\"nav-mobile-list\", opts?.className]\n .filter(Boolean)\n .join(\" \")\n .trim();\n const linkClassName =\n opts?.linkClassName ??\n \"nav-mobile-link rb-block rb-w-full rb-nav-text-mobile\";\n // Child links - text size controlled by theme's dropdownStyle.textSize\n const childLinkClassName =\n opts?.childLinkClassName ??\n \"nav-mobile-child-link rb-block rb-w-full\";\n const triggerClassName =\n opts?.triggerClassName ??\n \"nav-mobile-trigger rb-flex rb-w-full rb-items-center rb-justify-between rb-nav-text-mobile\";\n const childrenClassName =\n opts?.childrenClassName ?? \"nav-mobile-children rb-hidden rb-pl-4\";\n\n const dropdownCaret = el(\"div\", {\n className: \"nav-caret\",\n \"aria-hidden\": \"true\",\n });\n\n const simpleLink = link(\n {\n className: linkClassName,\n href: { $bind: { from: `${itemName}.link`, transforms: [{ id: \"links.resolve\" }] } },\n linkRequired: true,\n target: { $bind: { from: `${itemName}.target` } },\n rel: { $bind: { from: `${itemName}.rel` } },\n \"data-active\": { $bind: { from: `${itemName}.active` } },\n },\n [text({ as: \"span\" }, bind(`${itemName}.label`))],\n when(`${itemName}.children`, { not: true }),\n );\n\n const childLinks = link(\n {\n className: childLinkClassName,\n href: { $bind: { from: `${childItemName}.link`, transforms: [{ id: \"links.resolve\" }] } },\n linkRequired: true,\n target: { $bind: { from: `${childItemName}.target` } },\n rel: { $bind: { from: `${childItemName}.rel` } },\n \"data-active\": { $bind: { from: `${childItemName}.active` } },\n },\n [text({ as: \"span\" }, bind(`${childItemName}.label`))],\n repeat(`${itemName}.children`, childItemName),\n );\n\n const dropdown = el(\n \"div\",\n { className: \"nav-mobile-dropdown\", \"data-nav-mobile-dropdown\": \"true\" },\n [\n button(\n {\n type: \"button\",\n variantId: \"\",\n className: triggerClassName,\n \"aria-expanded\": \"false\",\n \"aria-controls\": childrenId,\n \"data-nav-mobile-trigger\": \"true\",\n },\n [text({ as: \"span\" }, bind(`${itemName}.label`)), dropdownCaret],\n ),\n el(\n \"div\",\n {\n className: childrenClassName,\n id: childrenId,\n \"data-nav-mobile-children\": \"true\",\n },\n [childLinks],\n ),\n ],\n when(`${itemName}.children`),\n );\n\n const item = el(\n \"div\",\n { className: \"nav-mobile-item\" },\n [simpleLink, dropdown],\n repeat(collectionPath, itemName),\n );\n\n return stack(\n { className, gap: \"sm\", align: \"stretch\" },\n [item],\n when(collectionPath),\n );\n}\n","import {\n bind,\n el,\n link,\n repeat,\n stack,\n text,\n when,\n} from \"../builder\";\nimport type { NodeDefinition } from \"../schema\";\n\ntype FooterNavMode = \"all\" | \"links-only\" | \"flatten\";\n\ntype FooterNavOpts = {\n collectionPath?: string;\n itemName?: string;\n gap?: \"sm\" | \"md\" | \"lg\";\n className?: unknown;\n linkClassName?: string;\n childLinkClassName?: string;\n labelClassName?: string;\n /**\n * - `all`: Render root links and dropdown labels + children (expanded).\n * - `links-only`: Render only root links (no dropdowns/children).\n * - `flatten`: Render root links and dropdown children as a flat list (no dropdown labels).\n */\n mode?: FooterNavMode;\n};\n\ntype FooterNavCommon = {\n collectionPath: string;\n itemName: string;\n childItemName: string;\n gap: \"sm\" | \"md\" | \"lg\";\n className: unknown;\n linkClassName: string;\n childLinkClassName: string;\n labelClassName: string;\n};\n\nfunction buildFooterNavAll(common: FooterNavCommon): NodeDefinition {\n const { collectionPath, itemName, childItemName } = common;\n\n const simpleLink = link(\n {\n className: common.linkClassName,\n href: {\n $bind: {\n from: `${itemName}.link`,\n transforms: [{ id: \"links.resolve\" }],\n },\n },\n linkRequired: true,\n target: { $bind: { from: `${itemName}.target` } },\n rel: { $bind: { from: `${itemName}.rel` } },\n \"data-active\": { $bind: { from: `${itemName}.active` } },\n },\n [text({ as: \"span\" }, bind(`${itemName}.label`))],\n when(`${itemName}.children`, { not: true }),\n );\n\n const childLinks = link(\n {\n className: common.childLinkClassName,\n href: {\n $bind: {\n from: `${childItemName}.link`,\n transforms: [{ id: \"links.resolve\" }],\n },\n },\n linkRequired: true,\n target: { $bind: { from: `${childItemName}.target` } },\n rel: { $bind: { from: `${childItemName}.rel` } },\n \"data-active\": { $bind: { from: `${childItemName}.active` } },\n },\n [text({ as: \"span\" }, bind(`${childItemName}.label`))],\n repeat(`${itemName}.children`, childItemName),\n );\n\n const parentWithChildren = el(\n \"div\",\n { className: \"footer-nav-group\" },\n [\n el(\n \"span\",\n { className: common.labelClassName },\n [text({ as: \"span\" }, bind(`${itemName}.label`))],\n ),\n el(\n \"div\",\n { className: \"footer-nav-children rb-pl-4 rb-mt-1\" },\n [childLinks],\n ),\n ],\n when(`${itemName}.children`),\n );\n\n const item = el(\n \"div\",\n { className: \"footer-nav-item\" },\n [simpleLink, parentWithChildren],\n repeat(collectionPath, itemName),\n );\n\n return stack(\n { className: common.className, gap: common.gap, align: \"stretch\" },\n [item],\n when(collectionPath),\n );\n}\n\nfunction buildFooterNavLinksOnly(common: FooterNavCommon): NodeDefinition {\n const { collectionPath, itemName } = common;\n\n const simpleLink = link(\n {\n className: common.linkClassName,\n href: {\n $bind: {\n from: `${itemName}.link`,\n transforms: [{ id: \"links.resolve\" }],\n },\n },\n linkRequired: true,\n target: { $bind: { from: `${itemName}.target` } },\n rel: { $bind: { from: `${itemName}.rel` } },\n \"data-active\": { $bind: { from: `${itemName}.active` } },\n },\n [text({ as: \"span\" }, bind(`${itemName}.label`))],\n when(`${itemName}.children`, { not: true }),\n );\n\n const item = el(\n \"div\",\n { className: \"footer-nav-item\" },\n [simpleLink],\n repeat(collectionPath, itemName),\n // Avoid rendering empty wrappers for dropdown items\n when(`${itemName}.children`, { not: true }),\n );\n\n return stack(\n { className: common.className, gap: common.gap, align: \"stretch\" },\n [item],\n when(collectionPath),\n );\n}\n\nfunction buildFooterNavFlatten(common: FooterNavCommon): NodeDefinition {\n const { collectionPath, itemName, childItemName } = common;\n\n const simpleLink = link(\n {\n className: common.linkClassName,\n href: {\n $bind: {\n from: `${itemName}.link`,\n transforms: [{ id: \"links.resolve\" }],\n },\n },\n linkRequired: true,\n target: { $bind: { from: `${itemName}.target` } },\n rel: { $bind: { from: `${itemName}.rel` } },\n \"data-active\": { $bind: { from: `${itemName}.active` } },\n },\n [text({ as: \"span\" }, bind(`${itemName}.label`))],\n when(`${itemName}.children`, { not: true }),\n );\n\n const flattenedChildLinks = link(\n {\n className: common.linkClassName,\n href: {\n $bind: {\n from: `${childItemName}.link`,\n transforms: [{ id: \"links.resolve\" }],\n },\n },\n linkRequired: true,\n target: { $bind: { from: `${childItemName}.target` } },\n rel: { $bind: { from: `${childItemName}.rel` } },\n \"data-active\": { $bind: { from: `${childItemName}.active` } },\n },\n [text({ as: \"span\" }, bind(`${childItemName}.label`))],\n repeat(`${itemName}.children`, childItemName),\n when(`${itemName}.children`),\n );\n\n const item = el(\n \"div\",\n { className: \"footer-nav-item rb-contents\" },\n [simpleLink, flattenedChildLinks],\n repeat(collectionPath, itemName),\n );\n\n return stack(\n { className: common.className, gap: common.gap, align: \"stretch\" },\n [item],\n when(collectionPath),\n );\n}\n\n/**\n * Footer navigation component that renders children expanded (not as dropdowns).\n *\n * Unlike navRow which uses hover dropdowns, footerNav:\n * - Uses vertical stack layout\n * - Shows children always visible with indentation\n * - Parent items with children become non-clickable labels\n */\nexport function footerNav(opts?: FooterNavOpts): NodeDefinition {\n const mode: FooterNavMode = opts?.mode ?? \"all\";\n\n const collectionPath = opts?.collectionPath ?? \"footerMenu.items\";\n const itemName = opts?.itemName ?? \"footerNavItem\";\n\n const className =\n typeof opts?.className === \"string\"\n ? [\"footer-nav\", opts.className].filter(Boolean).join(\" \").trim()\n : (opts?.className ?? \"footer-nav\");\n\n const common: FooterNavCommon = {\n collectionPath,\n itemName,\n childItemName: `${itemName}Child`,\n gap: opts?.gap ?? \"sm\",\n className,\n linkClassName:\n opts?.linkClassName ??\n \"footer-nav-link rb-nav-text transition-theme-standard\",\n childLinkClassName:\n opts?.childLinkClassName ??\n \"footer-nav-child-link rb-caption transition-theme-standard rb-block\",\n labelClassName:\n opts?.labelClassName ??\n \"footer-nav-label rb-label\",\n };\n\n if (mode === \"links-only\") return buildFooterNavLinksOnly(common);\n if (mode === \"flatten\") return buildFooterNavFlatten(common);\n return buildFooterNavAll(common);\n}\n","import type { z } from \"zod\";\nimport type { ThemeTokens } from \"../../theme\";\n\ntype BivariantCallback<TArgs extends unknown[], TResult> = {\n bivarianceHack(...args: TArgs): TResult\n}[\"bivarianceHack\"]\n\nexport type RouteMapEntry =\n | string\n | {\n path?: string | null;\n href?: string | null;\n url?: string | null;\n draftPath?: string | null;\n [key: string]: unknown;\n };\n\nexport type RouteMap = Record<string, RouteMapEntry>;\n\n/** Maps page identifier to routeId for page link resolution */\nexport type PageIdentifierMap = Record<string, string>;\n\n/** Maps contentType -> identifier -> routeId for entry link resolution */\nexport type EntryIdentifierMap = Record<string, Record<string, string>>;\n\nexport type TransformContext = {\n theme: ThemeTokens;\n locale?: string;\n stage?: \"preview\" | \"published\";\n /**\n * Optional binding-local data object (typically block content) that\n * transforms can use to resolve sibling fields.\n */\n data?: Record<string, unknown>;\n routes?: RouteMap;\n /** Page identifier -> routeId lookup for { kind: 'page' } links */\n pagesByIdentifier?: PageIdentifierMap;\n /** ContentType -> identifier -> routeId lookup for { kind: 'entry' } links */\n entriesByIdentifier?: EntryIdentifierMap;\n /** Read-only runtime view model for content-aware transforms */\n viewModel?: Record<string, unknown>;\n};\n\nexport type TransformHandler<TOptions = unknown> = BivariantCallback<\n [value: unknown, options: TOptions, context: TransformContext],\n unknown\n>;\n\nexport type TransformDefinition<TOptions = unknown> = {\n id: string;\n summary?: string;\n kind: \"formatter\" | \"collection\" | \"string\" | \"html\";\n schema?: z.ZodType<TOptions>;\n run: TransformHandler<TOptions>;\n};\n\nexport type TransformRegistry = Map<string, TransformDefinition<unknown>>;\n\n/**\n * Safely narrows unknown values to partial object shapes used by transforms.\n * Arrays are intentionally excluded.\n */\nexport function asPartialObject<T>(value: unknown): Partial<T> | undefined {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return undefined;\n }\n return value as Partial<T>;\n}\n\nexport function runTransforms(\n value: unknown,\n transforms: Array<{ id: string; options?: unknown }> | undefined,\n context: TransformContext,\n registry: TransformRegistry\n) {\n if (!transforms?.length) return value;\n return transforms.reduce((acc, step) => {\n const transform = registry.get(step.id);\n if (!transform) {\n throw new Error(`Unknown transform: ${step.id}`);\n }\n const options = transform.schema ? transform.schema.parse(step.options ?? {}) : (step.options ?? {});\n return transform.run(acc, options, context);\n }, value);\n}\n\nexport function createTransformRegistry(\n definitions: Iterable<TransformDefinition<unknown>>\n): TransformRegistry {\n const registry: TransformRegistry = new Map();\n for (const definition of definitions) {\n if (registry.has(definition.id)) continue;\n registry.set(definition.id, definition);\n }\n return registry;\n}\n\nexport function mergeTransformRegistries(\n ...registries: TransformRegistry[]\n): TransformRegistry {\n const merged: TransformRegistry = new Map();\n for (const registry of registries) {\n for (const [id, definition] of registry.entries()) {\n if (merged.has(id)) continue;\n merged.set(id, definition);\n }\n }\n return merged;\n}\n","import { rgbColorValue } from '../../../../theme/utils/colorStyles';\n\n/**\n * Resolve a token-like value into a CSS color string.\n *\n * Supports:\n * - Theme palette tokens (e.g. \"primary\", \"surface\", \"primary/50\")\n * - Raw CSS via `raw:*`\n * - Literal CSS values (hex/rgb/hsl/transparent/etc) passed through as-is\n */\nexport function resolveBackgroundColorValue(\n tokenOrCssValue: string,\n context?: { theme?: { palette?: Record<string, string> } },\n): string {\n const trimmed = tokenOrCssValue.trim();\n if (!trimmed) return '';\n\n // Raw CSS value bypass (rgbColorValue handles raw:*)\n if (trimmed.startsWith('raw:')) {\n return rgbColorValue(trimmed);\n }\n\n // Exact palette token\n if (context?.theme?.palette?.[trimmed]) {\n return rgbColorValue(trimmed);\n }\n\n // Token with opacity: {token}/{0-100} (e.g. surface/95)\n if (trimmed.includes('/')) {\n const [base, opacity] = trimmed.split('/');\n const alpha = Number(opacity) / 100;\n if (base && !Number.isNaN(alpha) && context?.theme?.palette?.[base]) {\n return rgbColorValue(trimmed);\n }\n }\n\n // Common keywords that may not appear in palette\n if (trimmed === 'transparent') {\n return 'transparent';\n }\n\n // Assume it's a literal CSS color (hex/rgb/hsl/etc.)\n return trimmed;\n}\n\n","export const blockColorTokenNames = [\n \"text\",\n \"heading\",\n \"mutedText\",\n \"surface\",\n \"background\",\n \"foreground\",\n \"border\",\n \"primary\",\n \"secondary\",\n \"accent\",\n \"success\",\n \"warning\",\n \"info\",\n \"error\",\n \"destructive\",\n \"scrim\",\n \"shadow\",\n\n // Common \"on*\" tokens used when rendering colored chips/badges.\n \"onPrimary\",\n \"onSecondary\",\n \"onAccent\",\n \"onSuccess\",\n \"onWarning\",\n \"onInfo\",\n \"onError\",\n \"onDestructive\",\n] as const;\n\nexport type BlockColorTokenName = (typeof blockColorTokenNames)[number];\n\nexport type BlockColorToken =\n | BlockColorTokenName\n | `${BlockColorTokenName}/${number}`;\n\nexport function isBlockColorTokenName(\n value: string,\n): value is BlockColorTokenName {\n return (blockColorTokenNames as readonly string[]).includes(value);\n}\n\nconst blockColorTokenNameSet = new Set<string>(\n blockColorTokenNames as readonly string[],\n);\n\nfunction parseOpacityPercent(source: string): number | null {\n const trimmed = source.trim();\n if (!trimmed) return null;\n\n // Intentionally disallow scientific notation and stray characters.\n if (!/^\\d{1,3}(?:\\.\\d+)?$/.test(trimmed)) return null;\n\n const value = Number(trimmed);\n if (!Number.isFinite(value)) return null;\n if (value < 0 || value > 100) return null;\n return value;\n}\n\nexport function isBlockColorToken(value: unknown): value is BlockColorToken {\n if (typeof value !== \"string\") return false;\n const trimmed = value.trim();\n if (!trimmed) return false;\n\n const [name, opacityRaw, extra] = trimmed.split(\"/\");\n if (extra !== undefined) return false;\n if (!name) return false;\n if (!blockColorTokenNameSet.has(name)) return false;\n\n if (opacityRaw === undefined) return true;\n return parseOpacityPercent(opacityRaw) !== null;\n}\n\nexport function parseBlockColorToken(value: unknown): BlockColorToken | null {\n if (!isBlockColorToken(value)) return null;\n return value.trim() as BlockColorToken;\n}\n\nexport function asBlockColorToken(value: string): BlockColorToken {\n const parsed = parseBlockColorToken(value);\n if (!parsed) {\n throw new Error(\n `Invalid BlockColorToken: \"${value}\". Expected one of: ${blockColorTokenNames.join(\", \")} (optionally with \"/{opacity%}\")`,\n );\n }\n return parsed;\n}\n\nexport function unsafeAsBlockColorToken(value: string): BlockColorToken {\n // Escape hatch: prefer parseBlockColorToken/asBlockColorToken at runtime boundaries.\n return value as BlockColorToken;\n}\n","import { asPartialObject, type TransformDefinition } from \"./core\";\nimport type { SemanticSpacing } from \"../../spacing\";\nimport { resolveSpacing, isSemanticSpacing } from \"../../spacing\";\nimport { rgbColorValue } from \"../../../theme/utils/colorStyles\";\nimport { resolveBackgroundColorValue } from \"./_utils/colorResolution\";\nimport { parseBlockColorToken } from \"../../theme/blockColorTokens\";\n\n/**\n * Maps semantic spacing values to CSS-only `rb-*` spacing classes.\n *\n * Semantic values: none, compact, cozy, medium, comfortable, spacious\n * These are defined centrally in system/spacing.ts\n *\n * For sections (axis: 'y'), this resolves to `rb-section-pad-*`.\n * For containers/cards (axis: 'all'), this resolves to `rb-container-pad-*`.\n *\n * Runtime validation ensures invalid spacing values are caught early.\n */\nexport const spacingTransform: TransformDefinition<{\n axis?: \"y\" | \"all\";\n baseClass?: string;\n}> = {\n id: \"boxStyles.spacing\",\n kind: \"string\",\n summary: \"Map semantic spacing value to rb-* spacing classes\",\n run: (value, options, _context) => {\n const axis = options?.axis ?? \"all\";\n const baseClass = options?.baseClass ?? \"\";\n\n // Handle null/undefined/empty values\n if (!value || typeof value !== \"string\") {\n return baseClass.trim() || \"\";\n }\n\n const trimmed = value.trim();\n\n // Validate spacing value at runtime\n if (!isSemanticSpacing(trimmed)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n `[spacing] Invalid spacing value: \"${trimmed}\". Expected one of: none, compact, cozy, medium, comfortable, spacious.`,\n );\n }\n return baseClass.trim() || \"\";\n }\n\n // TypeScript now knows trimmed is SemanticSpacing\n const spacingClass = resolveSpacing(trimmed, axis);\n\n // Combine base class with spacing class\n return baseClass ? `${baseClass.trim()} ${spacingClass}` : spacingClass;\n },\n};\n\n/**\n * Applies shadow class when raised is true.\n *\n * Uses rb-shadow-md (defined in `src/theme/rb-utilities.css`) when the theme's\n * medium shadow token is enabled.\n */\nexport const raisedTransform: TransformDefinition<{ baseClass?: string }> = {\n id: \"boxStyles.raised\",\n kind: \"string\",\n summary: \"Apply custom CSS shadow class when raised is true\",\n run: (value, options, context) => {\n const baseClass = options.baseClass ?? \"\";\n\n // Only apply shadow if value is explicitly true\n if (value !== true) {\n return baseClass.trim() || \"\";\n }\n\n // Get shadow from theme (default to 'medium')\n const shadowValue = context.theme?.shadow?.medium;\n if (!shadowValue || shadowValue === \"none\") {\n return baseClass.trim() || \"\";\n }\n\n // Use theme-driven shadow class (defined in src/theme/rb-utilities.css)\n const shadowClass = \"rb-shadow-md\";\n\n return baseClass ? `${baseClass.trim()} ${shadowClass}` : shadowClass;\n },\n};\n\n/**\n * Maps rounded corner values to custom CSS border radius classes.\n *\n * Rounded values:\n * - 'none' → no border radius\n * - 'sm' → rb-rounded-sm\n * - 'md' → rb-rounded-md\n * - 'lg' → rb-rounded-lg\n * - 'xl' → rb-rounded-xl\n * - '2xl' → rb-rounded-2xl\n * - 'full' → rb-rounded-full\n *\n * These classes are defined in theme CSS (`src/theme/rb-utilities.css`).\n */\nexport const roundedTransform: TransformDefinition<{ baseClass?: string }> = {\n id: \"boxStyles.rounded\",\n kind: \"string\",\n summary: \"Map rounded value to custom CSS border radius class\",\n run: (value, options, _context) => {\n const baseClass = options.baseClass ?? \"\";\n\n // Handle null/undefined/empty/'none' values\n if (!value || value === \"none\") {\n return baseClass.trim() || \"\";\n }\n\n if (typeof value !== \"string\") {\n return baseClass.trim() || \"\";\n }\n\n const rounded = value.trim();\n\n // Map rounded values to rb-* classes (defined in src/theme/rb-utilities.css)\n const roundedMap: Record<string, string> = {\n sm: \"rb-rounded-sm\",\n md: \"rb-rounded-md\",\n lg: \"rb-rounded-lg\",\n xl: \"rb-rounded-xl\",\n \"2xl\": \"rb-rounded-2xl\",\n full: \"rb-rounded-full\",\n };\n\n const roundedClass = roundedMap[rounded];\n if (!roundedClass) {\n // Unknown rounded value - return base class only\n return baseClass.trim() || \"\";\n }\n\n // Combine base class with rounded class\n return baseClass ? `${baseClass.trim()} ${roundedClass}` : roundedClass;\n },\n};\n\n/**\n * Composite transform that handles all box style properties at once.\n *\n * Takes a box styles object like:\n * ```\n * {\n * spacing: 'comfortable',\n * raised: true,\n * rounded: 'lg'\n * }\n * ```\n *\n * And outputs combined `rb-*` classes (plus any provided baseClass).\n */\nexport const boxStylesCompositeTransform: TransformDefinition<{\n axis?: \"y\" | \"all\";\n baseClass?: string;\n}> = {\n id: \"boxStyles.all\",\n kind: \"string\",\n summary: \"Composite transform for all box style properties\",\n run: (value, options, context) => {\n if (!value || typeof value !== \"object\") {\n return options.baseClass?.trim() || \"\";\n }\n\n const input = value as Record<string, unknown>;\n const axis = options.axis ?? \"all\";\n let baseClass = options.baseClass ?? \"\";\n\n const classes: string[] = [];\n\n const border =\n input.border && typeof input.border === \"object\"\n ? (input.border as Record<string, unknown>)\n : null;\n\n const borderEnabled = border ? (border.enabled as unknown) : undefined;\n const borderWidth = border ? border.width : undefined;\n\n const borderOverride =\n borderEnabled === false\n ? \"rb-border-0\"\n : borderEnabled === true\n ? borderWidth === \"2\"\n ? \"rb-border-2\"\n : borderWidth === \"3\"\n ? \"rb-border-3\"\n : borderWidth === \"none\"\n ? \"rb-border-0\"\n : \"rb-border\"\n : null;\n\n if (borderOverride) {\n baseClass = baseClass\n .split(/\\s+/)\n .filter((token) => token && !/^rb-border(?:-(?:0|2|3))?$/.test(token))\n .join(\" \");\n }\n\n // Add base class if provided\n if (baseClass) classes.push(baseClass);\n\n if (borderOverride) {\n classes.push(borderOverride);\n }\n\n // Apply spacing transform\n const spacing =\n typeof input.spacing === \"string\" ? input.spacing.trim() : null;\n if (spacing) {\n const spacingResult = spacingTransform.run(\n spacing,\n { axis, baseClass: \"\" },\n context,\n );\n if (typeof spacingResult === \"string\" && spacingResult) {\n classes.push(spacingResult);\n }\n }\n\n // Apply raised transform\n if (input.raised === true) {\n const raisedResult = raisedTransform.run(\n true,\n { baseClass: \"\" },\n context,\n );\n if (typeof raisedResult === \"string\" && raisedResult) {\n classes.push(raisedResult);\n }\n }\n\n // Apply rounded transform\n const rounded =\n typeof input.rounded === \"string\" ? input.rounded.trim() : null;\n if (rounded && rounded !== \"none\") {\n const roundedResult = roundedTransform.run(\n rounded,\n { baseClass: \"\" },\n context,\n );\n if (typeof roundedResult === \"string\" && roundedResult) {\n classes.push(roundedResult);\n }\n }\n\n return classes.join(\" \").trim() || \"\";\n },\n};\n\nexport const boxStylesBorderColorTransform: TransformDefinition<{\n fallbackToken?: string;\n returnEmptyForDefault?: boolean;\n}> = {\n id: \"boxStyles.borderColor\",\n kind: \"string\",\n summary: \"Resolve border color from box styles border.colorToken\",\n run: (value, options, _context) => {\n const fallbackToken = options?.fallbackToken ?? \"border\";\n const returnEmptyForDefault = options?.returnEmptyForDefault ?? false;\n\n // Check if user has explicitly configured a border color\n let explicitToken: string | null = null;\n\n const input = asPartialObject<Record<string, unknown>>(value);\n if (input) {\n const border =\n input.border && typeof input.border === \"object\"\n ? (input.border as Record<string, unknown>)\n : null;\n\n if (\n border &&\n border.enabled === true &&\n typeof border.colorToken === \"string\" &&\n border.colorToken.trim()\n ) {\n explicitToken = border.colorToken.trim();\n }\n }\n\n // If user explicitly set a color, always return it\n if (explicitToken) {\n const parsed = parseBlockColorToken(explicitToken);\n if (parsed) return rgbColorValue(parsed);\n }\n\n // If returnEmptyForDefault is true, return empty string so CSS can handle the default\n if (returnEmptyForDefault) {\n return \"\";\n }\n\n // Otherwise return the fallback token color (legacy behavior)\n const parsedFallback = parseBlockColorToken(fallbackToken);\n return rgbColorValue(parsedFallback ?? \"border\");\n },\n};\n\ntype SectionClassNameOptions = {\n baseClass?: string;\n containerStylesPath?: string;\n fullWidthPath?: string;\n defaultSpacing?: SemanticSpacing;\n};\n\nfunction readPath(\n source: Record<string, unknown> | undefined,\n path: string,\n): unknown {\n if (!source || !path) return undefined;\n if (!path.includes(\".\")) return source[path];\n\n return path.split(\".\").reduce<unknown>((acc, segment) => {\n if (\n acc &&\n typeof acc === \"object\" &&\n segment in (acc as Record<string, unknown>)\n ) {\n return (acc as Record<string, unknown>)[segment];\n }\n return undefined;\n }, source);\n}\n\n/**\n * Composite transform for section className.\n *\n * Responsibilities:\n * 1. Extracts spacing from _sectionStyles or uses defaultSpacing\n * 2. Converts semantic spacing to CSS classes via resolveSpacing()\n * 3. Respects fullWidth setting from containerStyles (removes `rb-px-*` classes)\n * 4. Combines base class with spacing classes\n *\n * This transform ensures sections always have proper padding even when:\n * - _sectionStyles doesn't exist (uses defaultSpacing)\n * - _sectionStyles exists but spacing is undefined (uses defaultSpacing)\n * - _sectionStyles.spacing is explicitly set (uses that value)\n */\nexport const sectionClassNameTransform: TransformDefinition<SectionClassNameOptions> =\n {\n id: \"sectionStyles.resolveClassName\",\n kind: \"string\",\n summary: \"Resolve section className from spacing and fullWidth setting\",\n run: (value, options, context) => {\n const baseClass = options?.baseClass ?? \"\";\n const containerStylesPath =\n options?.containerStylesPath ?? \"_containerStyles\";\n const defaultSpacing = options?.defaultSpacing;\n const fullWidthPath = options?.fullWidthPath;\n\n // Check if fullWidth is enabled in containerStyles\n // The data property is added at runtime during block rendering\n const contextData = context.data;\n const containerStylesValue = readPath(contextData, containerStylesPath);\n const containerStyles =\n containerStylesValue && typeof containerStylesValue === \"object\"\n ? (containerStylesValue as { fullWidth?: boolean })\n : undefined;\n const fullWidthFromContainerStyles = containerStyles?.fullWidth === true;\n const fullWidthFromPath = fullWidthPath\n ? readPath(contextData, fullWidthPath) === true\n : false;\n const fullWidth = fullWidthFromContainerStyles || fullWidthFromPath;\n\n // If fullWidth is true, remove horizontal padding classes from baseClass\n let adjustedBaseClass = baseClass;\n if (fullWidth && baseClass) {\n // Remove rb-px-* classes when fullWidth is enabled\n adjustedBaseClass = baseClass\n .split(\" \")\n .filter((cls: string) => !cls.startsWith(\"rb-px-\"))\n .join(\" \")\n .trim();\n }\n\n const classes: string[] = [];\n\n // Extract spacing from _sectionStyles if it exists\n let spacing: SemanticSpacing | null = null;\n const input = asPartialObject<Record<string, unknown>>(value);\n if (input && typeof input.spacing === \"string\") {\n // Validate spacing value at runtime\n if (isSemanticSpacing(input.spacing)) {\n spacing = input.spacing;\n } else if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n `[sectionStyles] Invalid spacing value in _sectionStyles: \"${input.spacing}\". Expected one of: none, compact, cozy, medium, comfortable, spacious.`,\n );\n }\n }\n\n // Add adjusted base class (e.g., 'px-6' or '' if fullWidth)\n if (adjustedBaseClass) classes.push(adjustedBaseClass);\n\n // Determine effective spacing:\n // 1. Use explicit spacing from _sectionStyles if set and valid\n // 2. Otherwise use defaultSpacing from config\n // 3. If neither, no spacing classes are added\n const effectiveSpacing = spacing ?? defaultSpacing;\n\n if (effectiveSpacing) {\n // Convert semantic spacing to CSS classes\n // TypeScript knows effectiveSpacing is SemanticSpacing\n const spacingClass = resolveSpacing(effectiveSpacing, \"y\");\n classes.push(spacingClass);\n }\n\n return classes.join(\" \").trim();\n },\n };\n\ntype ContainerClassNameOptions = {\n baseClass?: string;\n};\n\n/**\n * Composite transform for container className.\n * Determines whether to use the default `rb-container` (centered with max-width)\n * or full-width mode (edge-to-edge).\n *\n * Used for dynamically building container element className based on fullWidth setting.\n */\nexport const containerStylesResolveClassName: TransformDefinition<ContainerClassNameOptions> =\n {\n id: \"containerStyles.resolveClassName\",\n kind: \"string\",\n summary: \"Resolve container className based on fullWidth setting\",\n run: (value, options, _context) => {\n const baseClass = options?.baseClass ?? \"\";\n\n // If no _containerStyles object exists, use default container behavior\n if (!value || typeof value !== \"object\") {\n const defaultClass = \"rb-container\";\n return baseClass ? `${baseClass} ${defaultClass}`.trim() : defaultClass;\n }\n\n const input = value as Record<string, unknown>;\n const fullWidth = input.fullWidth === true;\n\n const classes: string[] = [];\n\n // Add base class if provided\n if (baseClass) classes.push(baseClass);\n\n // Add container or full-width class\n if (fullWidth) {\n // Full-width mode: no max-width constraint\n classes.push(\"rb-container-full\");\n } else {\n // Default mode: responsive container with max-width\n classes.push(\"rb-container\");\n }\n\n return classes.join(\" \").trim();\n },\n };\n\n/**\n * Composite transform for container className with box styles.\n *\n * Combines:\n * - Container width constraint: `rb-container` / `rb-container-full`\n * - Box styles: spacing (padding), raised (shadow), rounded (radius)\n *\n * Intended for the element that owns the container background layers so that:\n * - background paints within the constrained width\n * - background includes the container padding\n */\nexport const containerStylesResolveBoxClassName: TransformDefinition<ContainerClassNameOptions> =\n {\n id: \"containerStyles.resolveBoxClassName\",\n kind: \"string\",\n summary:\n \"Resolve container className including rb-container and box styles\",\n run: (value, options, context) => {\n const baseClass = options?.baseClass ?? \"\";\n\n // Determine width class (defaults to constrained).\n let widthClass = \"rb-container\";\n const input = asPartialObject<Record<string, unknown>>(value);\n if (input) {\n if (input.fullWidth === true) {\n widthClass = \"rb-container-full\";\n }\n }\n\n const combinedBase = [baseClass, widthClass]\n .filter(Boolean)\n .join(\" \")\n .trim();\n\n // Apply spacing/raised/rounded (and ignore unknown properties).\n return boxStylesCompositeTransform.run(\n value,\n { axis: \"all\", baseClass: combinedBase },\n context,\n );\n },\n };\n\ntype SectionTextColorOptions = {\n /**\n * Optional fallback token to use when no explicit textColor is set.\n * When omitted, the transform returns an empty style object.\n */\n fallbackToken?: string;\n};\n\n/**\n * Resolves section text color style object.\n *\n * The value should be the `_sectionStyles.background.textColor` token.\n * Returns an empty object when unset so the section inherits text color.\n *\n * Outputs both `color` and `--section-text-color` CSS variable so that\n * headings (which have explicit color rules in typography CSS) can inherit\n * the section's text color via the CSS variable cascade.\n */\nexport const sectionTextColorStyleTransform: TransformDefinition<SectionTextColorOptions> =\n {\n id: \"sectionStyles.resolveTextColorStyle\",\n kind: \"formatter\",\n summary: \"Resolve section text color token into a style object\",\n run: (value, options, _context) => {\n const fallbackToken = options?.fallbackToken;\n\n if (typeof value === \"string\" && value.trim()) {\n const colorValue = rgbColorValue(value.trim());\n return {\n color: colorValue,\n \"--section-text-color\": colorValue,\n };\n }\n\n if (typeof fallbackToken === \"string\" && fallbackToken.trim()) {\n const colorValue = rgbColorValue(fallbackToken.trim());\n return {\n color: colorValue,\n \"--section-text-color\": colorValue,\n };\n }\n\n return {};\n },\n };\n\ntype SectionHeadingColorOptions = {\n /**\n * Optional fallback token to use when no explicit headingColor is set.\n * When omitted, the transform returns an empty style object.\n */\n fallbackToken?: string;\n};\n\n/**\n * Resolves section heading color style object.\n *\n * The value should be the `_sectionStyles.background.headingColor` token.\n * Returns an empty object when unset so headings inherit from textColor or default.\n *\n * Outputs `--section-heading-color` CSS variable which typography CSS can use\n * to style headings differently from body text within a section.\n */\nexport const sectionHeadingColorStyleTransform: TransformDefinition<SectionHeadingColorOptions> =\n {\n id: \"sectionStyles.resolveHeadingColorStyle\",\n kind: \"formatter\",\n summary: \"Resolve section heading color token into a style object\",\n run: (value, options, _context) => {\n const fallbackToken = options?.fallbackToken;\n\n if (typeof value === \"string\" && value.trim()) {\n const colorValue = rgbColorValue(value.trim());\n return {\n \"--section-heading-color\": colorValue,\n };\n }\n\n if (typeof fallbackToken === \"string\" && fallbackToken.trim()) {\n const colorValue = rgbColorValue(fallbackToken.trim());\n return {\n \"--section-heading-color\": colorValue,\n };\n }\n\n return {};\n },\n };\n\n/**\n * Resolves section text and heading colors from the background object.\n *\n * The value should be the full `_sectionStyles.background` object.\n * Outputs:\n * - `color` and `--section-text-color` from background.textColor\n * - `--section-heading-color` from background.headingColor (falls back to textColor if not set)\n *\n * This combined transform replaces separate textColor/headingColor transforms\n * when both need to be applied to the same style prop.\n */\nexport const sectionColorsStyleTransform: TransformDefinition<\n Record<string, never>\n> = {\n id: \"sectionStyles.resolveColorsStyle\",\n kind: \"formatter\",\n summary: \"Resolve section text and heading colors into a style object\",\n run: (value, _options, context) => {\n // Keep behavior aligned with `background.resolveColorsStyle`:\n // allow literal CSS values (hex/rgb/hsl/transparent) in addition to palette tokens.\n if (!value || typeof value !== \"object\") {\n return {};\n }\n\n const bg = value as Record<string, unknown>;\n const textColor =\n typeof bg.textColor === \"string\" ? bg.textColor.trim() : null;\n const headingColor =\n typeof bg.headingColor === \"string\" ? bg.headingColor.trim() : null;\n\n const style: Record<string, string> = {};\n\n // Apply text color\n if (textColor) {\n const resolvedText = resolveBackgroundColorValue(textColor, context);\n if (resolvedText) {\n style.color = resolvedText;\n style[\"--section-text-color\"] = resolvedText;\n\n // Apply heading color (or fall back to text color)\n if (headingColor) {\n const resolvedHeading = resolveBackgroundColorValue(\n headingColor,\n context,\n );\n if (resolvedHeading) {\n style[\"--section-heading-color\"] = resolvedHeading;\n }\n } else {\n style[\"--section-heading-color\"] = resolvedText;\n }\n }\n }\n\n return style;\n },\n};\n\n/**\n * Maps semantic gap values to theme-aware gap classes.\n *\n * The classes use --space-mult multiplier for theme-aware sizing.\n */\nexport const GAP_CLASS_MAP = {\n none: \"rb-gap-semantic-none\",\n compact: \"rb-gap-semantic-compact\",\n cozy: \"rb-gap-semantic-cozy\",\n medium: \"rb-gap-semantic-medium\",\n comfortable: \"rb-gap-semantic-comfortable\",\n spacious: \"rb-gap-semantic-spacious\",\n} as const satisfies Record<SemanticSpacing, string>;\n\n/**\n * Maps semantic gap values to CSS gap values (for inline styles).\n *\n * Uses calc() with --space-mult for theme-aware sizing.\n * Mobile values; use media queries or responsive CSS for desktop scaling.\n */\nexport const GAP_VALUE_MAP = {\n none: \"0\",\n compact: \"calc(1rem * var(--space-mult, 1))\",\n cozy: \"calc(1.75rem * var(--space-mult, 1))\",\n medium: \"calc(2.75rem * var(--space-mult, 1))\",\n comfortable: \"calc(4.5rem * var(--space-mult, 1))\",\n spacious: \"calc(6.5rem * var(--space-mult, 1))\",\n} as const satisfies Record<SemanticSpacing, string>;\n\ntype SemanticGapOptions = {\n /** Fallback gap when value is invalid or undefined */\n fallback?: SemanticSpacing;\n};\n\n/**\n * Maps semantic gap value to theme-aware gap class.\n *\n * Use this transform for binding gap to a content field.\n * The output classes use CSS calc() with --space-mult for theme-aware sizing.\n */\nexport const semanticGapTransform: TransformDefinition<SemanticGapOptions> = {\n id: \"boxStyles.semanticGap\",\n kind: \"string\",\n summary: \"Map semantic gap value to theme-aware gap class\",\n run: (value, options, _context) => {\n const fallback = options?.fallback ?? \"medium\";\n const gap = isSemanticSpacing(value) ? value : fallback;\n return GAP_CLASS_MAP[gap];\n },\n};\n\n/**\n * Maps semantic gap value to CSS gap value (for inline styles).\n *\n * Use this transform when binding gap as an inline style rather than a class.\n * The output values use CSS calc() with --space-mult for theme-aware sizing.\n */\nexport const semanticGapValueTransform: TransformDefinition<SemanticGapOptions> =\n {\n id: \"boxStyles.semanticGapValue\",\n kind: \"string\",\n summary: \"Map semantic gap value to CSS gap value for inline styles\",\n run: (value, options, _context) => {\n const fallback = options?.fallback ?? \"medium\";\n const gap = isSemanticSpacing(value) ? value : fallback;\n return GAP_VALUE_MAP[gap];\n },\n };\n\nexport const boxStylesTransforms: TransformDefinition<unknown>[] = [\n spacingTransform as TransformDefinition<unknown>,\n raisedTransform as TransformDefinition<unknown>,\n roundedTransform as TransformDefinition<unknown>,\n boxStylesCompositeTransform as TransformDefinition<unknown>,\n boxStylesBorderColorTransform as TransformDefinition<unknown>,\n sectionClassNameTransform as TransformDefinition<unknown>,\n containerStylesResolveClassName as TransformDefinition<unknown>,\n containerStylesResolveBoxClassName as TransformDefinition<unknown>,\n sectionTextColorStyleTransform as TransformDefinition<unknown>,\n sectionHeadingColorStyleTransform as TransformDefinition<unknown>,\n sectionColorsStyleTransform as TransformDefinition<unknown>,\n semanticGapTransform as TransformDefinition<unknown>,\n semanticGapValueTransform as TransformDefinition<unknown>,\n];\n","import type { NodeDefinition } from '../schema'\nimport type { SemanticSpacing } from '../../spacing'\nimport { el } from '../builder'\nimport { GAP_VALUE_MAP } from '../../transforms/registry/boxStyles'\n\ntype NodeElementProps = Record<string, unknown>\n\ntype ResponsiveTwoColumnConfig = {\n image: NodeDefinition\n text: NodeDefinition\n ratioFrom: string\n imagePositionFrom: string\n /** Static gap class (used when gapFrom is not provided) */\n gapClassName?: string\n /** Bind path for dynamic gap (e.g., \"content.gap\") */\n gapFrom?: string\n /** Fallback gap when gapFrom value is null/undefined */\n gapFallback?: SemanticSpacing\n containerClassName?: string\n imageWrapperClassName?: string\n textWrapperClassName?: string\n}\n\nexport function responsiveTwoColumn({\n image,\n text,\n ratioFrom,\n imagePositionFrom,\n gapClassName = 'rb-gap-6',\n gapFrom,\n gapFallback = 'comfortable',\n containerClassName = 'rb-flex rb-flex-col rb-md-flex-row',\n imageWrapperClassName = 'rb-w-full rb-shrink-0',\n textWrapperClassName = 'rb-w-full rb-min-w-0 rb-flex-1',\n}: ResponsiveTwoColumnConfig): NodeDefinition {\n // When gapFrom is provided, use dynamic gap via inline style\n // Otherwise use static gapClassName in the class list\n const useStaticGap = !gapFrom\n const baseClass = useStaticGap\n ? `${containerClassName} ${gapClassName}`.trim()\n : containerClassName\n\n const props: NodeElementProps = {\n className: {\n $bind: {\n from: imagePositionFrom,\n transforms: [\n {\n id: 'ui.twoColumnContainerClass',\n options: {\n base: baseClass,\n reverseClass: 'rb-md-flex-row-reverse',\n },\n },\n ],\n fallback: baseClass,\n },\n },\n }\n\n // Add dynamic gap style when gapFrom is provided\n if (gapFrom) {\n props.style = {\n gap: {\n $bind: {\n from: gapFrom,\n transforms: [\n {\n id: 'boxStyles.semanticGapValue',\n options: { fallback: gapFallback },\n },\n ],\n fallback: GAP_VALUE_MAP[gapFallback],\n },\n },\n }\n }\n\n return el(\n 'div',\n props,\n [\n el(\n 'div',\n {\n className: imageWrapperClassName,\n style: {\n flexBasis: {\n $bind: {\n from: ratioFrom,\n transforms: [{ id: 'ui.twoColumnFlexBasis', options: { side: 'image' } }],\n fallback: '50%',\n },\n },\n },\n },\n [image],\n ),\n el(\n 'div',\n {\n className: textWrapperClassName,\n style: {\n flexBasis: {\n $bind: {\n from: ratioFrom,\n transforms: [{ id: 'ui.twoColumnFlexBasis', options: { side: 'text' } }],\n fallback: '50%',\n },\n },\n },\n },\n [text],\n ),\n ],\n )\n}\n","import type { CSSProperties } from \"react\";\nimport type { NodeDefinition } from \"../schema\";\nimport { el, type NodeModifier } from \"../builder\";\nimport { backgroundLayer } from \"./backgroundLayer\";\n\nexport function styledCard(\n children: Array<NodeDefinition | null | undefined>,\n opts: {\n stylesFrom: string;\n backgroundFrom: string;\n baseClassName?: string;\n style?: CSSProperties;\n },\n ...mods: NodeModifier[]\n): NodeDefinition {\n const baseClassName =\n opts.baseClassName ?? \"rb-relative rb-isolate rb-overflow-hidden rb-border\";\n\n // Default background layer uses CSS class instead of inline style (allows theme overrides).\n // Uses rb-bg-surface which sets background-color: rgb(var(--tb-surface)).\n const defaultBackgroundLayer = el(\"div\", {\n className:\n \"rb-absolute rb-inset-0 rb-z-neg-10 rb-h-full rb-w-full rb-pointer-events-none rb-bg-surface\",\n });\n\n const backgroundNodes = backgroundLayer(opts.backgroundFrom);\n\n // Only set borderColor inline when user explicitly configures it via _cardStyles.border.\n // Otherwise, let CSS handle it via variables (allows theme overrides).\n const style: Record<string, unknown> = {\n ...(opts.style ?? {}),\n borderColor: {\n $bind: {\n from: opts.stylesFrom,\n transforms: [\n {\n id: \"boxStyles.borderColor\",\n options: { returnEmptyForDefault: true },\n },\n ],\n // No fallback - let CSS handle the default border color\n },\n },\n };\n\n return el(\n \"div\",\n {\n className: {\n $bind: {\n from: opts.stylesFrom,\n transforms: [\n {\n id: \"boxStyles.all\",\n options: { axis: \"all\", baseClass: baseClassName },\n },\n ],\n fallback: baseClassName,\n },\n },\n ...(style ? { style } : {}),\n },\n [defaultBackgroundLayer, ...backgroundNodes, ...children],\n ...mods,\n );\n}\n","import { text, type NodeModifier } from \"../builder\";\nimport type { NodeProps } from \"../types\";\nimport type { NodeDefinition } from \"../schema\";\n\nimport { textColorStyle } from \"../../../theme/utils/colorStyles\";\nimport type { BlockColorToken } from \"../../theme/blockColorTokens\";\n\ntype BaseTextOpts = NodeProps & {\n as?: string;\n className?: string;\n color?: BlockColorToken;\n};\n\nfunction mergeClassName(base: string, extra?: string): string {\n return [base, extra ?? \"\"].filter(Boolean).join(\" \");\n}\n\nexport function captionText(\n opts?: BaseTextOpts | null,\n ...mods: NodeModifier[]\n): NodeDefinition {\n const {\n as: asProp,\n className: classNameProp,\n color,\n ...rest\n } = (opts ?? {}) as BaseTextOpts;\n const as = asProp ?? \"p\";\n const className = mergeClassName(\"rb-caption\", classNameProp);\n const style = textColorStyle(color ?? \"mutedText\");\n\n return text({ ...rest, as, className, style }, ...mods);\n}\n\nexport function labelText(\n opts?: BaseTextOpts | null,\n ...mods: NodeModifier[]\n): NodeDefinition {\n const {\n as: asProp,\n className: classNameProp,\n color,\n ...rest\n } = (opts ?? {}) as BaseTextOpts;\n const as = asProp ?? \"p\";\n const className = mergeClassName(\"rb-label\", classNameProp);\n const style = textColorStyle(color ?? \"mutedText\");\n\n return text({ ...rest, as, className, style }, ...mods);\n}\n","import { z } from \"zod\";\n\nimport { fieldSchema, parseFieldDefinitions, type FieldDefinition } from \"../manifest/schema\";\nimport {\n NodeSchema,\n type NodeDefinition,\n type Binding,\n type RepeatConfig,\n type ConditionConfig,\n type DataScope,\n} from \"../node\";\n\nconst FRAGMENT_ID_PATTERN = /^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?$/i;\nconst FIELD_ID_PATTERN = /^[a-z][a-zA-Z0-9_-]*$/;\n\nconst dataLoaderSchema = z.object({\n endpoint: z.string().min(1, \"Fragment data loader requires an endpoint\"),\n params: z.record(z.string(), z.unknown()).default({}),\n mode: z.enum([\"server\", \"client\"]).default(\"server\"),\n});\n\nconst fragmentDataSchema = z.object({\n key: z.string().min(1, \"Fragment data key is required\"),\n loader: dataLoaderSchema.optional(),\n});\n\nexport type FragmentDataConfigInput = z.input<typeof fragmentDataSchema>;\nexport type FragmentDataConfig = z.output<typeof fragmentDataSchema>;\n\nexport type FragmentConfig = {\n id: string;\n title?: string;\n description?: string;\n category?: \"content\" | \"media\" | \"interactive\" | \"layout\";\n icon?: string;\n fields?: z.input<typeof fieldSchema>[];\n layout: NodeDefinition | NodeDefinition[];\n data?: FragmentDataConfigInput;\n};\n\nexport type FragmentDefinition = Omit<FragmentConfig, \"fields\" | \"layout\" | \"data\"> & {\n fields: FieldDefinition[];\n layout: NodeDefinition[];\n data?: FragmentDataConfig;\n};\n\nconst fragmentConfigSchema = z.object({\n id: z\n .string()\n .min(1, \"Fragment id is required\")\n .regex(FRAGMENT_ID_PATTERN, \"Fragment id must be alphanumeric with optional . _ - separators\"),\n title: z.string().optional(),\n description: z.string().optional(),\n category: z.enum([\"content\", \"media\", \"interactive\", \"layout\"]).optional(),\n icon: z.string().optional(),\n fields: fieldSchema.array().default([]),\n layout: z\n .union([NodeSchema, NodeSchema.array()])\n .transform((value): NodeDefinition[] => (Array.isArray(value) ? value : [value])),\n data: fragmentDataSchema.optional(),\n});\n\nexport class FragmentConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"FragmentConfigError\";\n }\n}\n\nexport function defineFragment(config: FragmentConfig): FragmentDefinition {\n const parsed = fragmentConfigSchema.parse(config);\n\n const fields = parseFieldDefinitions(parsed.fields);\n\n validateFieldDefinitions(fields, parsed.id);\n\n return {\n ...parsed,\n fields: fields.map((field: FieldDefinition) => cloneFieldDefinition(field)),\n layout: parsed.layout.map((node: NodeDefinition) => ({ ...node })),\n };\n}\n\nexport function scopeFragmentFields(fragment: FragmentDefinition, scope: string): FieldDefinition[] {\n const normalizedScope = scope.trim();\n if (!normalizedScope) {\n return fragment.fields.map((field: FieldDefinition) => cloneFieldDefinition(field));\n }\n return fragment.fields.map((field: FieldDefinition) => prefixFieldId(field, normalizedScope));\n}\n\nexport function scopeFragmentLayout(fragment: FragmentDefinition, scope: string): NodeDefinition[] {\n const normalizedScope = scope.trim();\n return fragment.layout.map((node: NodeDefinition) => cloneAndScopeNode(node, normalizedScope));\n}\n\nfunction validateFieldDefinitions(fields: FieldDefinition[], fragmentId: string): void {\n const seen = new Set<string>();\n\n for (const field of fields) {\n if (field.id.includes(\".\")) {\n throw new FragmentConfigError(\n `Field \"${field.id}\" in fragment \"${fragmentId}\" should not include dot notation; the builder scopes fields automatically.`,\n );\n }\n if (!FIELD_ID_PATTERN.test(field.id)) {\n throw new FragmentConfigError(\n `Field \"${field.id}\" in fragment \"${fragmentId}\" must start with a letter and contain only alphanumeric, \"_\", or \"-\".`,\n );\n }\n if (seen.has(field.id)) {\n throw new FragmentConfigError(\n `Duplicate field id \"${field.id}\" found in fragment \"${fragmentId}\". Field ids must be unique per fragment.`,\n );\n }\n seen.add(field.id);\n }\n}\n\nfunction prefixFieldId(field: FieldDefinition, scope: string): FieldDefinition {\n const cloned = cloneFieldDefinition(field);\n cloned.id = `${scope}.${field.id}`;\n\n cloned.defaultValue = cloneUnknown(cloned.defaultValue);\n cloned.visibleRoles = cloned.visibleRoles ? [...cloned.visibleRoles] : undefined;\n cloned.ui = cloneUnknown(cloned.ui);\n\n return cloned;\n}\n\nfunction cloneFieldDefinition(field: FieldDefinition): FieldDefinition {\n switch (field.type) {\n case \"repeater\":\n if (field.polymorphic && field.itemTypes) {\n // Polymorphic repeater: clone itemTypes\n return {\n ...field,\n polymorphic: true as const,\n itemTypes: Object.fromEntries(\n Object.entries(field.itemTypes).map(([key, itemType]) => [\n key,\n {\n ...itemType,\n fields: itemType.fields.map(cloneFieldDefinition),\n },\n ])\n ),\n } as FieldDefinition;\n } else if (field.schema) {\n // Monomorphic repeater: clone schema\n return {\n ...field,\n schema: {\n fields: field.schema.fields.map(cloneFieldDefinition),\n },\n } as FieldDefinition;\n }\n // Fallback (shouldn't happen due to XOR validation)\n return { ...field } as FieldDefinition;\n case \"group\":\n return {\n ...field,\n schema: {\n fields: field.schema.fields.map(cloneFieldDefinition),\n },\n };\n default:\n return { ...field };\n }\n}\n\nfunction cloneUnknown<T>(value: T): T {\n if (value == null || typeof value !== \"object\") {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((entry: unknown) => cloneUnknown(entry)) as T;\n }\n return { ...(value as Record<string, unknown>) } as T;\n}\n\nfunction cloneAndScopeNode(node: NodeDefinition, scope: string): NodeDefinition {\n const cloned: NodeDefinition = {\n ...node,\n };\n\n if (node.children) {\n cloned.children = node.children.map((child: NodeDefinition) => cloneAndScopeNode(child, scope));\n }\n\n if (node.props) {\n cloned.props = scopePropBindings(node.props, scope);\n }\n\n if (node.$bind) {\n cloned.$bind = scopeBinding(node.$bind, scope);\n }\n\n if (node.$repeat) {\n cloned.$repeat = scopeRepeat(node.$repeat, scope);\n }\n\n if (node.$when) {\n cloned.$when = scopeCondition(node.$when, scope);\n }\n\n if (node.$scopes) {\n cloned.$scopes = node.$scopes.map((entry: DataScope) => ({\n name: entry.name,\n from: scopeBinding(entry.from, scope),\n }));\n }\n\n return cloned;\n}\n\nfunction scopeBinding(binding: Binding, scope: string): Binding {\n const cloned: Binding = {\n ...binding,\n transforms: binding.transforms?.map(\n (step: { id: string; options?: Record<string, unknown> }) => ({ ...step }),\n ) ?? [],\n };\n\n cloned.from = scopeContentPath(binding.from, scope);\n\n return cloned;\n}\n\nfunction scopeRepeat(repeat: RepeatConfig, scope: string): RepeatConfig {\n const cloned: RepeatConfig = {\n ...repeat,\n collection: scopeBinding(repeat.collection, scope),\n };\n\n if (repeat.sortBy) {\n cloned.sortBy = {\n ...repeat.sortBy,\n path: scopeContentPath(repeat.sortBy.path, scope),\n };\n }\n\n return cloned;\n}\n\nfunction scopeCondition(condition: ConditionConfig, scope: string): ConditionConfig {\n return {\n ...condition,\n when: scopeBinding(condition.when, scope),\n };\n}\n\nfunction scopePropBindings(input: Record<string, unknown>, scope: string): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(input)) {\n result[key] = scopePropValue(value, scope);\n }\n return result;\n}\n\nfunction scopePropValue(value: unknown, scope: string): unknown {\n if (Array.isArray(value)) {\n return value.map((entry: unknown) => scopePropValue(entry, scope));\n }\n if (value && typeof value === \"object\") {\n if (\"$bind\" in (value as Record<string, unknown>)) {\n const bindingConfig = (value as { $bind: Binding }).$bind;\n return {\n $bind: scopeBinding(bindingConfig, scope),\n };\n }\n const result: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value as Record<string, unknown>)) {\n result[key] = scopePropValue(entry, scope);\n }\n return result;\n }\n return value;\n}\n\nfunction scopeContentPath(path: string, scope: string): string {\n if (!scope || scope.length === 0) {\n return path;\n }\n if (path === \"content\") {\n return `content.${scope}`;\n }\n if (path.startsWith(\"content.\")) {\n const remainder = path.slice(\"content.\".length);\n return remainder.length > 0 ? `content.${scope}.${remainder}` : `content.${scope}`;\n }\n if (path.startsWith(\"content[\")) {\n return path.replace(/^content/, `content.${scope}`);\n }\n // Handle $root paths - don't scope them\n if (path.startsWith(\"$root.\")) {\n return path;\n }\n // Handle scope-qualified paths like \"item.label\" - don't rescope them\n // These are paths that reference other scopes (item, index, etc.)\n // We detect them by checking if they contain a dot (indicating scope.field pattern)\n // but don't start with content/$ root (which we handle above)\n if (path.includes('.')) {\n return path;\n }\n // Handle simple relative paths (field names without dots) - add content.scope prefix\n // e.g., \"media\" with scope \"background\" becomes \"content.background.media\"\n return `content.${scope}.${path}`;\n}\n","import type { BlockManifest } from \"../manifest\";\nimport type { FieldDefinition } from \"../manifest/schema\";\nimport type { NodeDefinition } from \"../node\";\nimport {\n type FragmentDefinition,\n type FragmentDataConfig,\n scopeFragmentFields,\n scopeFragmentLayout,\n} from \"./types\";\n\ntype FragmentInstanceConfig = {\n fragment: FragmentDefinition;\n scope?: string;\n dataKey?: string;\n fieldPriority?: number;\n};\n\nexport type MaterializedFragment = {\n fragment: FragmentDefinition;\n scope: string;\n fields: FieldDefinition[];\n layout: NodeDefinition[];\n data?: FragmentDataConfig;\n fieldPriority: number;\n};\n\nexport type FragmentComposition = {\n fields: FieldDefinition[];\n layout: NodeDefinition[];\n data: MaterializedFragment[\"data\"][];\n scopes: string[];\n};\n\nexport type FragmentDataLoaders = Record<\n string,\n {\n endpoint: string;\n params: Record<string, unknown>;\n mode: \"server\" | \"client\";\n }\n>;\n\nexport class FragmentCompositionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"FragmentCompositionError\";\n }\n}\n\nconst DOT_SCOPE_REGEX = /^[A-Za-z0-9_.-]*$/;\n\nexport function materializeFragment(config: FragmentInstanceConfig): MaterializedFragment {\n const scope = normalizeScope(config.scope);\n const fields = scopeFragmentFields(config.fragment, scope);\n const layout = scopeFragmentLayout(config.fragment, scope);\n const fieldPriority = config.fieldPriority ?? 0;\n\n let data: FragmentDataConfig | undefined;\n if (config.fragment.data) {\n const key = config.dataKey ?? config.fragment.data.key;\n if (!key || typeof key !== \"string\") {\n throw new FragmentCompositionError(\n `Fragment \"${config.fragment.id}\" requires a data key to compose.`,\n );\n }\n data = {\n key,\n loader: config.fragment.data.loader ? { ...config.fragment.data.loader } : undefined,\n };\n }\n\n return {\n fragment: config.fragment,\n scope,\n fields,\n layout,\n data,\n fieldPriority,\n };\n}\n\nexport function composeFragments(instances: FragmentInstanceConfig[]): FragmentComposition {\n type FieldEntry = {\n id: string;\n field: FieldDefinition;\n priority: number;\n order: number;\n };\n\n const fieldEntries: FieldEntry[] = [];\n const layouts: NodeDefinition[] = [];\n const dataEntries: FragmentDataConfig[] = [];\n const scopes: string[] = [];\n const seenFieldIds = new Set<string>();\n let fieldOrder = 0;\n\n for (const instance of instances) {\n const materialized = materializeFragment(instance);\n\n for (const field of materialized.fields) {\n if (seenFieldIds.has(field.id)) {\n throw new FragmentCompositionError(\n `Duplicate field id \"${field.id}\" when composing fragments.`,\n );\n }\n seenFieldIds.add(field.id);\n fieldEntries.push({\n id: field.id,\n field,\n priority: materialized.fieldPriority,\n order: fieldOrder++,\n });\n }\n\n scopes.push(materialized.scope);\n layouts.push(...materialized.layout);\n\n if (materialized.data) {\n if (dataEntries.find((entry) => entry.key === materialized.data?.key)) {\n throw new FragmentCompositionError(\n `Duplicate fragment data key \"${materialized.data.key}\" detected.`,\n );\n }\n dataEntries.push(materialized.data);\n }\n }\n\n return {\n fields: fieldEntries\n .sort((a, b) => {\n if (a.priority !== b.priority) {\n return a.priority - b.priority;\n }\n return a.order - b.order;\n })\n .map((entry) => entry.field),\n layout: layouts,\n data: dataEntries,\n scopes,\n };\n}\n\nexport function applyFragmentsToManifest(\n manifest: BlockManifest,\n composition: FragmentComposition,\n): BlockManifest {\n return {\n ...manifest,\n fields: [...composition.fields, ...(manifest.fields ?? [])],\n layout: manifest.layout ?? normalizeLayout(composition.layout),\n };\n}\n\nfunction normalizeScope(scope?: string): string {\n if (!scope) return \"\";\n const trimmed = scope.trim();\n if (!DOT_SCOPE_REGEX.test(trimmed)) {\n throw new FragmentCompositionError(\n `Fragment scope \"${scope}\" contains invalid characters. Use alphanumeric, \".\", \"-\", or \"_\".`,\n );\n }\n return trimmed;\n}\n\nfunction normalizeLayout(layout: NodeDefinition[]): NodeDefinition | NodeDefinition[] {\n if (layout.length === 0) {\n return [];\n }\n if (layout.length === 1) {\n return layout[0] as NodeDefinition;\n }\n return layout;\n}\n\nexport function buildFragmentDataLoaders(\n composition: FragmentComposition,\n): FragmentDataLoaders {\n const loaders: FragmentDataLoaders = {};\n for (const entry of composition.data) {\n if (!entry?.loader) continue;\n loaders[entry.key] = {\n endpoint: entry.loader.endpoint,\n params: { ...(entry.loader.params ?? {}) },\n mode: entry.loader.mode ?? \"server\",\n };\n }\n return loaders;\n}\n","import { defineFragment, type FragmentDefinition } from \"../types\";\nimport { stack, text, richText, bind, when } from \"../../node/builder\";\n\nexport const bodyCopyFragment: FragmentDefinition = defineFragment({\n id: \"bodyCopy\",\n title: \"Body Copy\",\n description: \"Heading, rich text body, and alignment controls.\",\n fields: [\n {\n id: \"heading\",\n type: \"text\",\n label: \"Heading\",\n description: \"Optional heading displayed above the body copy.\",\n },\n {\n id: \"body\",\n type: \"richText\",\n label: \"Body\",\n required: true,\n },\n {\n id: \"alignment\",\n type: \"select\",\n label: \"Text alignment\",\n required: false,\n defaultValue: \"left\",\n ui: { intent: \"display\" },\n options: [\n { value: \"left\", label: \"Left\" },\n { value: \"center\", label: \"Center\" },\n ],\n },\n ],\n layout: stack(\n {\n gap: \"md\",\n // Container max-width now in blocks-static/index.css\n className: \"body-copy-container\",\n align: {\n $bind: {\n from: \"content.alignment\",\n transforms: [{ id: \"ui.stackAlignFromAlignment\" }],\n fallback: \"start\",\n },\n },\n },\n [\n text(\n {\n as: \"h2\",\n // h2 gets size/weight from theme typography CSS\n // Color from blocks-static/index.css, alignment from binding\n className: {\n $bind: {\n from: \"content.alignment\",\n transforms: [\n {\n id: \"ui.headingClassFromAlignment\",\n options: {\n base: \"body-copy-heading\",\n },\n },\n ],\n fallback: \"body-copy-heading\",\n },\n },\n },\n when(\"content.heading\"),\n bind(\"content.heading\"),\n ),\n richText(\n {\n // Color from blocks-static/index.css (.body-copy-body), prose for typography\n className: {\n $bind: {\n from: \"content.alignment\",\n transforms: [\n {\n id: \"ui.bodyClassFromAlignment\",\n options: {\n base: \"body-copy-body rb-prose rb-max-w-none\",\n },\n },\n ],\n fallback:\n \"body-copy-body rb-prose rb-max-w-none\",\n },\n },\n },\n bind(\"content.body\"),\n ),\n ],\n ),\n});\n","import { defineFragment, type FragmentDefinition } from \"../types\";\nimport { text, bind, when } from \"../../node/builder\";\n\nexport const heroCopyFragment: FragmentDefinition = defineFragment({\n id: \"heroCopy\",\n title: \"Hero Copy\",\n description: \"Eyebrow, headline, and subheadline copy for hero layouts.\",\n fields: [\n {\n id: \"eyebrow\",\n type: \"text\",\n label: \"Eyebrow\",\n description: \"Optional short line above the headline\",\n visibleRoles: [\"designer\", \"admin\"],\n },\n {\n id: \"headline\",\n type: \"text\",\n label: \"Headline\",\n required: true,\n maxLength: 120,\n },\n {\n id: \"subheadline\",\n type: \"text\",\n label: \"Subheadline\",\n multiline: true,\n maxLength: 280,\n },\n ],\n layout: [\n text(\n {\n as: \"p\",\n // rb-eyebrow: typography, hero-eyebrow: color (in blocks-static/hero.css)\n className: \"rb-eyebrow hero-eyebrow\",\n },\n when(\"content.eyebrow\"),\n bind(\"content.eyebrow\"),\n ),\n text(\n {\n as: \"h1\",\n // heading-display: uses fluid typography from theme (--fs-h1-display-fluid)\n // Color in blocks-static/index.css (.hero-headline)\n className: \"hero-headline heading-display\",\n },\n bind(\"content.headline\"),\n ),\n text(\n {\n as: \"p\",\n // Typography styles in blocks-static/index.css (.hero-subheadline)\n className: \"hero-subheadline\",\n },\n when(\"content.subheadline\"),\n bind(\"content.subheadline\"),\n ),\n ],\n});\n","import type { FieldDefinition, GroupFieldDefinition } from '../manifest/schema'\n\nexport type ButtonOptions = {\n variants?: { value: string; label: string }[]\n defaultVariant?: string\n includeSize?: boolean\n defaultSize?: 'sm' | 'md' | 'lg' | 'xl'\n showGroupLabel?: boolean\n groupId?: string\n groupLabel?: string\n flattenInRepeater?: boolean\n}\n\nexport function createButtonGroup(options: ButtonOptions = {}): GroupFieldDefinition {\n const {\n variants = [\n { value: 'primary', label: 'Primary' },\n { value: 'secondary', label: 'Secondary' },\n { value: 'outline', label: 'Outline' },\n ],\n defaultVariant,\n includeSize = false,\n defaultSize = 'md',\n showGroupLabel = false,\n groupId = 'button',\n groupLabel = 'Button',\n flattenInRepeater = true,\n } = options\n\n // Content fields shown inline.\n const mainFields: FieldDefinition[] = [\n {\n id: 'label',\n type: 'text',\n label: 'Label',\n required: true,\n multiline: false,\n maxLength: 40,\n ui: { row: 'primary' },\n },\n {\n id: 'link',\n type: 'link',\n label: 'Link',\n required: true,\n ui: { row: 'primary' },\n },\n {\n id: 'variant',\n type: 'select',\n label: 'Style',\n options: variants,\n required: false,\n multiple: false,\n ...(defaultVariant ? { defaultValue: defaultVariant } : {}),\n ui: { intent: 'style', widget: 'buttonVariant' },\n },\n ...(includeSize\n ? ([\n {\n id: '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 { value: 'xl', label: 'Extra Large' },\n ],\n required: false,\n multiple: false,\n defaultValue: defaultSize,\n ui: { intent: 'style' },\n } satisfies FieldDefinition,\n ] as FieldDefinition[])\n : []),\n ]\n\n // Icon fields are settings-only (hidden behind the group settings modal).\n const iconFields: FieldDefinition[] = [\n {\n id: 'iconLeft',\n type: 'text',\n label: 'Left icon',\n required: false,\n multiline: false,\n maxLength: 64,\n ui: { intent: 'style', widget: 'iconPicker', iconPickerPreset: 'cta' },\n },\n {\n id: 'iconRight',\n type: 'text',\n label: 'Right icon',\n required: false,\n multiline: false,\n maxLength: 64,\n ui: { intent: 'style', widget: 'iconPicker', iconPickerPreset: 'cta' },\n },\n ]\n\n return {\n id: groupId,\n type: 'group',\n label: groupLabel,\n ui: {\n layout: 'grid',\n columns: 2,\n gridColsPreset: 'simple2',\n gridColumns: {\n base: 1,\n sm: 2,\n },\n flattenInRepeater,\n hideLabel: !showGroupLabel,\n },\n schema: { fields: [...mainFields, ...iconFields] },\n required: false,\n }\n}\n","import type { FieldDefinition } from '../manifest/schema'\nimport { createButtonGroup, type ButtonOptions } from './button'\n\ntype CtasOptions = {\n id?: string\n label?: string\n itemLabel?: string\n minItems?: number\n maxItems?: number\n button?: ButtonOptions\n}\n\nexport function createCtasRepeater(options: CtasOptions = {}): FieldDefinition {\n const {\n id = 'ctas',\n label = 'Calls to action',\n itemLabel = 'CTA',\n minItems = 0,\n maxItems,\n button,\n } = options\n\n return {\n id,\n type: 'repeater',\n label,\n itemLabel,\n itemLabelSource: 'label',\n minItems,\n maxItems,\n schema: {\n fields: [\n createButtonGroup({\n showGroupLabel: false,\n flattenInRepeater: true,\n ...(button ?? {}),\n }),\n ],\n },\n } as FieldDefinition\n}\n","import { defineFragment, type FragmentDefinition } from \"../types\";\nimport { ctaRow } from \"../../node/fragments\";\nimport { createCtasRepeater } from \"../../fields/ctas\";\n\nexport const ctaRowFragment: FragmentDefinition = defineFragment({\n id: \"ctaRow\",\n title: \"CTA Row\",\n description: \"Repeatable calls to action rendered inline.\",\n fields: [createCtasRepeater({ label: \"Calls to action\", itemLabel: \"CTA\", maxItems: 3 })],\n layout: [\n ctaRow({ collectionPath: \"content.ctas\", itemName: \"cta\", justify: \"center\" }),\n ],\n});\n","import { defineFragment, type FragmentDefinition } from \"../types\";\nimport { ctaRow } from \"../../node/fragments\";\nimport { createCtasRepeater } from \"../../fields/ctas\";\n\nexport const heroCtaRowFragment: FragmentDefinition = defineFragment({\n id: \"heroCtaRow\",\n title: \"Hero CTAs\",\n description: \"Repeatable hero calls to action rendered inline.\",\n fields: [\n createCtasRepeater({\n label: \"Calls to action\",\n itemLabel: \"CTA\",\n maxItems: 3,\n button: {\n variants: [\n { value: \"default\", label: \"Default\" },\n { value: \"primary\", label: \"Primary\" },\n { value: \"secondary\", label: \"Secondary\" },\n { value: \"outline\", label: \"Outline\" },\n ],\n defaultVariant: \"default\",\n includeSize: true,\n defaultSize: \"lg\",\n },\n }),\n ],\n layout: [\n ctaRow({\n collectionPath: \"content.ctas\",\n itemName: \"cta\",\n justify: {\n $bind: {\n from: \"content\",\n transforms: [{ id: \"ui.heroCtaJustify\" }],\n fallback: \"center\",\n },\n },\n }),\n ],\n});\n","import { defineFragment, type FragmentDefinition } from \"../types\";\nimport { headingGroup } from \"../../node/fragments\";\nimport { richText, bind, when } from \"../../node/builder\";\n\nexport const ctaCopyFragment: FragmentDefinition = defineFragment({\n id: \"ctaCopy\",\n title: \"CTA Copy\",\n description: \"Eyebrow, title, and supporting rich text for CTA layouts.\",\n fields: [\n {\n id: \"eyebrow\",\n type: \"text\",\n label: \"Eyebrow\",\n description: \"Optional short line above the title\",\n visibleRoles: [\"designer\", \"admin\"],\n },\n {\n id: \"title\",\n type: \"text\",\n label: \"Title\",\n required: true,\n maxLength: 120,\n },\n {\n id: \"content\",\n type: \"richText\",\n label: \"Copy\",\n description: \"Short paragraph of supporting copy.\",\n },\n ],\n layout: [\n headingGroup({\n eyebrowPath: \"content.eyebrow\",\n titlePath: \"content.title\",\n className: \"cta-heading\",\n }),\n richText(\n {\n // Typography from prose, color from blocks-static/index.css\n className:\n \"cta-content rb-prose rb-mx-auto rb-max-w-none\",\n },\n when(\"content.content\"),\n bind(\"content.content\"),\n ),\n ],\n});\n","import { defineFragment, type FragmentDefinition } from \"../types\";\nimport { stack, text, bind, when } from \"../../node/builder\";\nimport { textColorStyle } from \"../../../theme/utils/colorStyles\";\n\nexport const testimonialsHeadingFragment: FragmentDefinition = defineFragment({\n id: \"testimonialsHeading\",\n title: \"Testimonials Heading\",\n description: \"Heading and subheading copy for testimonials section.\",\n fields: [\n {\n id: \"heading\",\n type: \"text\",\n label: \"Heading\",\n description: \"Optional block heading displayed above the testimonials.\",\n },\n {\n id: \"subheading\",\n type: \"text\",\n label: \"Description\",\n multiline: true,\n description: \"Optional supporting copy shown below the heading.\",\n },\n ],\n layout: [\n stack(\n { gap: \"md\", className: \"rb-mx-auto rb-max-w-2xl rb-text-center\" },\n [\n text(\n // h2 now gets size/weight from theme typography CSS\n { as: \"h2\" },\n when(\"content.heading\"),\n bind(\"content.heading\"),\n ),\n text(\n {\n as: \"p\",\n // Keep base prose defaults, then opt into larger lead-copy sizing for this section intro.\n className: \"rb-prose rb-prose-lg rb-prose-xl-sm\",\n style: textColorStyle('mutedText'),\n },\n when(\"content.subheading\"),\n bind(\"content.subheading\"),\n ),\n ],\n ),\n ],\n});\n","import { defineFragment, type FragmentDefinition } from \"../types\";\nimport type { NodeDefinition } from \"../../node\";\nimport {\n carousel,\n stack,\n richText,\n bind,\n when,\n inline,\n media,\n repeat,\n text,\n el,\n props as withProps,\n scopes,\n type NodeModifier,\n} from \"../../node/builder\";\nimport { textColorStyle } from \"../../../theme/utils/colorStyles\";\nimport { captionText, styledCard } from \"../../node/fragments\";\n\n// Grid primitive helper (node builder doesn't expose grid directly)\nconst grid = (\n props?: Record<string, unknown> | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n) => el(\"grid\", props ?? undefined, children ?? undefined, ...mods);\n\n/**\n * Build attribution nodes for testimonial cards.\n * Handles name, job title, company, and avatar with different layout modes.\n */\nexport function buildAttributionNodes(): NodeDefinition[] {\n const name = text(\n {\n as: \"strong\",\n className: \"rb-block\",\n style: textColorStyle(\"text\"),\n },\n bind(\"testimonial.content.name\", { fallback: \"Anonymous\" }),\n );\n\n const jobTitle = captionText(\n null,\n when(\"testimonial.content.jobTitle\"),\n bind(\"testimonial.content.jobTitle\"),\n );\n\n const company = captionText(\n null,\n when(\"testimonial.content.company\"),\n bind(\"testimonial.content.company\"),\n );\n\n const avatar = media(\n { className: \"rb-testimonial-avatar rb-object-cover\" },\n bind(\"testimonial.content.headshot\", { transforms: [{ id: \"media.fromUrl\" }] }),\n when(\"testimonial.content.headshot\"),\n );\n\n const aboveCentered = stack(\n { gap: \"sm\", className: \"rb-items-center rb-text-center\" },\n [avatar, stack({ gap: \"xs\", className: \"rb-items-center\" }, [name, jobTitle, company])],\n );\n\n // Back-compat: if `avatarLayout` is missing, treat it as above-centered.\n const aboveCenteredLegacy = when(\"avatarLayout\", { not: true })(aboveCentered);\n const aboveCenteredExplicit = when(\"avatarLayout\", { equals: \"above-centered\" })(aboveCentered);\n\n const inlineLeft = inline(\n { gap: \"md\", className: \"rb-items-center\" },\n [avatar, stack({ gap: \"xs\" }, [name, jobTitle, company])],\n when(\"avatarLayout\", { equals: \"inline-left\" }),\n );\n\n const hidden = stack(\n { gap: \"xs\", className: \"rb-text-center\" },\n [name, jobTitle, company],\n when(\"avatarLayout\", { equals: \"hidden\" }),\n );\n\n return [aboveCenteredLegacy, aboveCenteredExplicit, inlineLeft, hidden];\n}\n\n/**\n * Build a testimonial card with quote, body text, and attribution.\n * Used by all layout variants (carousel, grid, featured).\n */\nexport function buildTestimonialCard(\n _options?: { featured?: boolean },\n ...mods: NodeModifier[]\n): NodeDefinition {\n const quoteMark = text(\n { as: \"span\", className: \"rb-testimonial-quote\", \"aria-hidden\": \"true\" },\n withProps({ value: \"“\" }),\n );\n\n const body = richText(\n {\n className: \"rb-prose rb-max-w-none\",\n style: textColorStyle(\"text\"),\n },\n bind(\"testimonial.content.body\"),\n when(\"testimonial.content.body\"),\n );\n\n return styledCard(\n [\n stack(\n { gap: \"lg\", className: \"rb-h-full rb-justify-between\" },\n [\n stack({ gap: \"md\" }, [quoteMark, body]),\n el(\"div\", { className: \"rb-testimonial-attribution\" }, buildAttributionNodes()),\n ],\n ),\n ],\n {\n stylesFrom: \"content._cardStyles\",\n backgroundFrom: \"content._cardStyles.background\",\n baseClassName:\n \"rb-testimonial-card rb-relative rb-isolate rb-flex rb-h-full rb-flex-col rb-overflow-hidden rb-p-8 rb-shadow-sm\",\n },\n ...mods,\n );\n}\n\n/**\n * Build carousel layout for testimonials.\n * Renders testimonials in a swipeable carousel with controls.\n */\nexport function buildCarouselLayout(): NodeDefinition {\n return carousel(\n {\n className: \"rb-mt-12 rb-testimonials-carousel\",\n // Responsive slidesToShow: mobile is required, tablet/desktop are optional overrides\n // Empty string values are treated as \"inherit from previous breakpoint\"\n slidesToShow: {\n mobile: { $bind: { from: \"slidesToShow\", fallback: 1 } },\n tablet: { $bind: { from: \"slidesToShowTablet\" } },\n desktop: { $bind: { from: \"slidesToShowDesktop\" } },\n },\n transition: { $bind: { from: \"transition\", fallback: \"slide\" } },\n showControls: true,\n showDots: { $bind: { from: \"showDots\", fallback: false } },\n autoplay: { $bind: { from: \"autoplay\", fallback: false } },\n autoplayDelay: { $bind: { from: \"autoplayDelay\", fallback: 5000, coerce: \"number\" } },\n arrowVisibility: {\n $bind: { from: \"arrowVisibility\", fallback: \"always\" },\n },\n loop: true,\n },\n [buildTestimonialCard({}, repeat(\"data.entries\", \"testimonial\"))],\n );\n}\n\n/**\n * Build grid layout for testimonials.\n * Renders testimonials in a responsive grid with configurable columns.\n */\nexport function buildGridLayout(): NodeDefinition {\n return el(\n \"div\",\n { className: \"rb-mt-12 rb-testimonials-carousel\" },\n [\n // 2 columns\n grid(\n { gap: \"lg\", cols: { base: 1, sm: 2 } },\n [buildTestimonialCard({}, repeat(\"data.entries\", \"testimonial\"))],\n when(\"gridColumns\", { equals: \"2\" }),\n ),\n // 3 columns (default when unset)\n grid(\n { gap: \"lg\", cols: { base: 1, sm: 2, lg: 3 } },\n [buildTestimonialCard({}, repeat(\"data.entries\", \"testimonial\"))],\n when(\"gridColumns\", { equals: \"3\" }),\n ),\n // 4 columns\n grid(\n { gap: \"lg\", cols: { base: 1, sm: 2, lg: 3, xl: 4 } },\n [buildTestimonialCard({}, repeat(\"data.entries\", \"testimonial\"))],\n when(\"gridColumns\", { equals: \"4\" }),\n ),\n // Fallback to 3 columns when gridColumns is not set\n grid(\n { gap: \"lg\", cols: { base: 1, sm: 2, lg: 3 } },\n [buildTestimonialCard({}, repeat(\"data.entries\", \"testimonial\"))],\n when(\"gridColumns\", { not: true }),\n ),\n ],\n );\n}\n\n/**\n * Build featured layout for testimonials.\n * Renders a single featured testimonial with larger styling.\n */\nexport function buildFeaturedLayout(): NodeDefinition {\n return el(\n \"div\",\n { className: \"rb-mt-12 rb-testimonials-carousel\" },\n [\n // Use manually picked featured entry when available\n el(\n \"div\",\n null,\n [buildTestimonialCard({ featured: true })],\n scopes([\n {\n name: \"testimonial\",\n from: { from: \"data.featured[0]\", transforms: [], pick: \"value\" },\n },\n ]),\n when(\"data.featured[0]\"),\n ),\n // Fall back to first entry when no featured entry is picked\n el(\n \"div\",\n null,\n [buildTestimonialCard({ featured: true })],\n scopes([\n {\n name: \"testimonial\",\n from: { from: \"data.entries[0]\", transforms: [], pick: \"value\" },\n },\n ]),\n when(\"data.featured[0]\", { not: true }),\n ),\n ],\n );\n}\n\n/**\n * Fragment definition for testimonials carousel.\n * Provides field definitions and data loader configuration.\n *\n * Layout is managed at the block level using the exported layout builder functions\n * (buildCarouselLayout, buildGridLayout, buildFeaturedLayout) combined with the\n * variant system via createBlockManifest().\n */\nexport const testimonialsCarouselFragment: FragmentDefinition = defineFragment({\n id: \"testimonialsCarousel\",\n title: \"Testimonials\",\n description: \"Testimonials layout with variant support (carousel, grid, featured).\",\n fields: [\n {\n id: \"slidesToShow\",\n type: \"select\",\n label: \"Slides per view (mobile)\",\n description: \"Number of testimonials visible on small screens.\",\n defaultValue: \"1\",\n options: [\n { value: \"1\", label: \"1\" },\n { value: \"2\", label: \"2\" },\n { value: \"3\", label: \"3\" },\n ],\n ui: { intent: \"display\", visibleWhen: { field: \"variant\", equals: \"carousel\" } },\n },\n {\n id: \"slidesToShowTablet\",\n type: \"select\",\n label: \"Slides per view (tablet)\",\n description: \"Number of testimonials visible on medium screens. If not set, uses the mobile value.\",\n options: [\n { value: \"\", label: \"Same as mobile\" },\n { value: \"1\", label: \"1\" },\n { value: \"2\", label: \"2\" },\n { value: \"3\", label: \"3\" },\n ],\n ui: { intent: \"display\", visibleWhen: { field: \"variant\", equals: \"carousel\" } },\n },\n {\n id: \"slidesToShowDesktop\",\n type: \"select\",\n label: \"Slides per view (desktop)\",\n description: \"Number of testimonials visible on large screens. If not set, uses the tablet value.\",\n options: [\n { value: \"\", label: \"Same as tablet\" },\n { value: \"1\", label: \"1\" },\n { value: \"2\", label: \"2\" },\n { value: \"3\", label: \"3\" },\n ],\n ui: { intent: \"display\", visibleWhen: { field: \"variant\", equals: \"carousel\" } },\n },\n {\n id: \"transition\",\n type: \"select\",\n label: \"Transition\",\n defaultValue: \"slide\",\n options: [\n { value: \"slide\", label: \"Slide\" },\n { value: \"fade\", label: \"Fade\" },\n ],\n ui: { intent: \"display\", visibleWhen: { field: \"variant\", equals: \"carousel\" } },\n },\n {\n id: \"showDots\",\n type: \"boolean\",\n label: \"Show dots\",\n defaultValue: false,\n ui: { intent: \"display\", visibleWhen: { field: \"variant\", equals: \"carousel\" } },\n },\n {\n id: \"autoplay\",\n type: \"boolean\",\n label: \"Autoplay\",\n defaultValue: false,\n ui: { intent: \"behavior\", visibleWhen: { field: \"variant\", equals: \"carousel\" } },\n },\n {\n id: \"autoplayDelay\",\n type: \"select\",\n label: \"Autoplay delay\",\n defaultValue: \"5000\",\n options: [\n { value: \"3000\", label: \"3 seconds\" },\n { value: \"5000\", label: \"5 seconds\" },\n { value: \"7000\", label: \"7 seconds\" },\n { value: \"10000\", label: \"10 seconds\" },\n ],\n ui: { intent: \"behavior\", visibleWhen: { field: \"variant\", equals: \"carousel\" } },\n },\n {\n id: \"arrowVisibility\",\n type: \"select\",\n label: \"Arrow visibility\",\n defaultValue: \"always\",\n options: [\n { value: \"always\", label: \"Always visible\" },\n { value: \"hover\", label: \"Show on hover\" },\n ],\n ui: { intent: \"display\", visibleWhen: { field: \"variant\", equals: \"carousel\" } },\n },\n {\n id: \"maxEntries\",\n type: \"select\",\n label: \"Testimonials to load\",\n defaultValue: \"6\",\n ui: { intent: \"display\" },\n options: [\n { value: \"3\", label: \"3 testimonials\" },\n { value: \"6\", label: \"6 testimonials\" },\n { value: \"9\", label: \"9 testimonials\" },\n ],\n },\n ],\n // Layout is now managed at the block level via variants\n layout: [],\n data: {\n key: \"entries\",\n loader: {\n endpoint: \"listPublishedEntries\",\n params: {\n type: \"testimonial\",\n siteId: { $bind: { from: \"$root.siteId\" } },\n limit: { $bind: { from: \"maxEntries\", fallback: \"6\" } },\n stage: { $bind: { from: \"$root.previewStage\", fallback: \"published\" } },\n },\n mode: \"server\",\n },\n },\n});\n","import { defineFragment, type FragmentDefinition } from \"../types\";\nimport { text, richText, bind, when } from \"../../node/builder\";\n\nexport const formCopyFragment: FragmentDefinition = defineFragment({\n id: \"formCopy\",\n title: \"Form Copy\",\n description: \"Optional title and introduction content for form blocks.\",\n fields: [\n {\n id: \"title\",\n type: \"text\",\n label: \"Title\",\n },\n {\n id: \"intro\",\n type: \"richText\",\n label: \"Intro\",\n description: \"Optional introduction above the form.\",\n },\n ],\n layout: [\n text(\n {\n as: \"h2\",\n // Typography and color in blocks-static/index.css\n className: \"form-copy-title\",\n },\n when(\"content.title\"),\n bind(\"content.title\"),\n ),\n richText(\n {\n // Typography and color in blocks-static/index.css\n className: \"form-copy-intro rb-prose rb-max-w-none\",\n },\n when(\"content.intro\"),\n bind(\"content.intro\"),\n ),\n ],\n});\n","/**\n * Standard bindings for blocks that require API access.\n *\n * Blocks that hydrate on the client and make API calls (forms, booking,\n * events, customer portal, etc.) need siteId and apiBaseUrl passed from\n * the server context. This helper ensures these bindings are never forgotten.\n *\n * @example\n * ```tsx\n * import { withApiBindings } from '../helpers/api-bindings'\n *\n * // In block layout definition:\n * el('customer-portal', withApiBindings({\n * showPasses: true,\n * showMemberships: true,\n * }))\n * ```\n */\n\n/**\n * Binding object shape used in block layouts.\n * Maps to values from the $root context at render time.\n */\nexport type ApiBinding = {\n $bind: {\n from: string;\n fallback?: unknown;\n };\n};\n\n/**\n * Standard API bindings that all interactive blocks need.\n */\nexport const apiBindings = {\n siteId: { $bind: { from: '$root.siteId' } },\n apiBaseUrl: { $bind: { from: '$root.apiBaseUrl' } },\n} as const satisfies Record<string, ApiBinding>;\n\nexport type WithApiBindingsOptions = {\n /**\n * Whether to include `apiBaseUrl` binding.\n *\n * Some blocks use the Block API Client via `BlockApiProvider` and no longer\n * need `apiBaseUrl` passed as a prop.\n */\n includeApiBaseUrl?: boolean;\n};\n\n/**\n * Merge API bindings with block-specific props.\n *\n * Use this for any block that hydrates and makes API calls.\n * The helper ensures siteId and apiBaseUrl are always included,\n * preventing runtime errors from missing bindings.\n *\n * @param props - Block-specific props to merge with API bindings\n * @returns Props with siteId and apiBaseUrl bindings included\n */\nexport function withApiBindings<T extends Record<string, unknown>>(\n props: T,\n options: { includeApiBaseUrl: false }\n): T & Pick<typeof apiBindings, 'siteId'>;\nexport function withApiBindings<T extends Record<string, unknown>>(\n props: T,\n options?: WithApiBindingsOptions\n): T & typeof apiBindings;\nexport function withApiBindings<T extends Record<string, unknown>>(\n props: T,\n options?: WithApiBindingsOptions\n): T & Partial<typeof apiBindings> {\n const includeApiBaseUrl = options?.includeApiBaseUrl ?? true;\n const bindings = includeApiBaseUrl\n ? apiBindings\n : ({ siteId: apiBindings.siteId } as const);\n\n return { ...bindings, ...props };\n}\n","import { defineFragment, type FragmentDefinition } from \"../types\";\nimport { form, bind } from \"../../node/builder\";\nimport { withApiBindings } from \"../../helpers/api-bindings\";\n\nexport const formEmbedFragment: FragmentDefinition = defineFragment({\n id: \"formEmbed\",\n title: \"Form Embed\",\n description: \"Embeds a saved form with configurable submit button copy.\",\n fields: [\n {\n id: \"formSlug\",\n type: \"reference\",\n label: \"Form\",\n description: \"Pick a saved form to render.\",\n required: true,\n referenceKind: \"form\",\n allowManualEntry: false,\n ui: { intent: \"behavior\" },\n },\n {\n id: \"submitLabel\",\n type: \"text\",\n label: \"Submit button label\",\n defaultValue: \"Submit\",\n },\n {\n id: \"successMessage\",\n type: \"text\",\n label: \"Success message\",\n description: \"Shown after successful submit (handled by page or block).\",\n },\n ],\n layout: [\n form(\n withApiBindings({\n spamProtectionEnabled: { $bind: { from: \"$root.spamProtectionEnabled\" } },\n submitLabel: { $bind: { from: \"submitLabel\" } },\n successMessage: { $bind: { from: \"successMessage\" } },\n }),\n [],\n bind(\"data.form\"),\n ),\n ],\n data: {\n key: \"form\",\n loader: {\n endpoint: \"getPublicFormById\",\n params: {\n formSlug: { $bind: { from: \"formSlug\" } },\n },\n mode: \"server\",\n },\n },\n});\n","import { defineFragment, type FragmentDefinition } from \"../types\";\nimport { richText, bind, when } from \"../../node/builder\";\nimport { textColorStyle } from \"../../../theme/utils/colorStyles\";\n\nexport const footerBottomTextFragment: FragmentDefinition = defineFragment({\n id: \"footerBottomText\",\n title: \"Footer Text\",\n description: \"Rich text content for the main footer body and optional bottom bar.\",\n fields: [\n {\n id: \"bodyText\",\n type: \"richText\",\n label: \"Body text\",\n description: \"Appears in the main footer area.\",\n ui: { variant: \"limited\" },\n },\n {\n id: \"bottomText\",\n type: \"richText\",\n label: \"Bottom bar text\",\n description: \"Appears in the optional footer bottom bar.\",\n ui: { variant: \"limited\" },\n },\n ],\n layout: [\n richText(\n {\n className:\n \"rb-prose rb-prose-sm rb-mx-auto rb-max-w-3xl rb-text-center\",\n style: textColorStyle(\"text/80\"),\n },\n when(\"bodyText\"),\n bind(\"bodyText\", {\n transforms: [\n {\n id: \"content.interpolateRichTextTokens\",\n options: {\n tokens: [\"year\", \"site_name\"],\n },\n },\n ],\n }),\n ),\n richText(\n {\n className:\n \"rb-prose rb-prose-sm rb-mx-auto rb-max-w-3xl rb-text-center\",\n style: textColorStyle(\"text/80\"),\n },\n when(\"bottomText\"),\n bind(\"bottomText\", {\n transforms: [\n {\n id: \"content.interpolateRichTextTokens\",\n options: {\n tokens: [\"year\", \"site_name\"],\n },\n },\n ],\n }),\n ),\n ],\n});\n","import { defineFragment, type FragmentDefinition } from \"../types\";\nimport { sectionContainer } from \"../../node/fragments\";\nimport {\n stack,\n text,\n link,\n media,\n when,\n bind,\n props as withProps,\n} from \"../../node/builder\";\nimport {\n borderColorStyle,\n backgroundColorStyle,\n textColorStyle,\n mergeStyles,\n} from \"../../../theme/utils/colorStyles\";\n\nexport const blogFeaturedPostFragment: FragmentDefinition = defineFragment({\n id: \"blogFeaturedPost\",\n title: \"Featured Blog Post\",\n description: \"Featured blog post card with title and preview content.\",\n fields: [\n {\n id: \"title\",\n type: \"text\",\n label: \"Block title\",\n description: \"Displayed above the featured blog post.\",\n defaultValue: \"Latest post\",\n maxLength: 120,\n },\n {\n id: \"postSlug\",\n type: \"reference\",\n label: \"Blog post\",\n description: \"Pick the blog post to feature in this block.\",\n required: true,\n referenceKind: \"post\",\n allowManualEntry: false,\n ui: { intent: \"behavior\" },\n },\n ],\n layout: [\n sectionContainer(\n [\n stack({ gap: \"sm\", className: \"rb-md-w-1\\/3\" }, [\n text(\n {\n as: \"h2\",\n // h2 now gets size/weight from theme typography CSS\n style: textColorStyle(\"heading\"),\n },\n bind(\"title\", { fallback: \"Latest post\" }), // Relative path\n ),\n ]),\n stack({ gap: \"md\", className: \"rb-flex-1\" }, [\n stack(\n {\n gap: \"md\",\n className: \"rb-rounded-2xl rb-border rb-p-6 rb-shadow-sm\",\n style: mergeStyles(\n borderColorStyle(\"border\"),\n backgroundColorStyle(\"surface\"),\n ),\n },\n [\n link(\n {\n className:\n \"rb-block rb-overflow-hidden rb-rounded-xl rb-border\",\n style: borderColorStyle(\"border/60\"),\n href: { $bind: { from: \"post.path\" } },\n },\n [\n media(\n { className: \"rb-h-56 rb-w-full rb-object-cover\" },\n bind(\"post.image\", {\n transforms: [{ id: \"media.fromUrl\" }],\n }),\n ),\n ],\n when(\"post.image\"),\n ),\n stack({ gap: \"sm\" }, [\n link(\n {\n className:\n \"rb-block hover:rb-opacity-80\",\n style: textColorStyle(\"heading\"),\n href: { $bind: { from: \"post.path\" } },\n },\n [text({ as: \"h2\" }, bind(\"post.title\"))],\n ),\n text(\n {\n as: \"p\",\n className: \"rb-caption\",\n style: textColorStyle(\"mutedText\"),\n },\n when(\"post.publishedAt\"),\n bind(\"post.publishedAt\", {\n transforms: [{ id: \"date.formatShort\" }],\n }),\n ),\n text(\n {\n as: \"p\",\n style: textColorStyle(\"text/80\"),\n },\n bind(\"post.excerpt\", {\n fallback: \"Select a blog post to display its preview.\",\n }),\n ),\n link(\n {\n className:\n \"rb-inline-flex rb-items-center rb-caption rb-hover-opacity-80\",\n style: textColorStyle(\"primary\"),\n href: { $bind: { from: \"post.path\" } },\n },\n [text({ as: \"strong\" }, withProps({ value: \"Read more →\" }))],\n ),\n ]),\n ],\n when(\"post\"),\n ),\n stack(\n {\n gap: \"sm\",\n className:\n \"rb-rounded-xl rb-border rb-border-dashed rb-p-6\",\n style: mergeStyles(\n borderColorStyle(\"border\"),\n backgroundColorStyle(\"surface\"),\n textColorStyle(\"mutedText\"),\n ),\n },\n [\n text(\n { as: \"p\" },\n withProps({\n value: \"Select a blog post to display its preview.\",\n }),\n ),\n ],\n when(\"post\", { not: true }),\n ),\n ]),\n ],\n {\n gap: \"lg\",\n className: \"rb-w-full rb-md-flex-row rb-md-items-start rb-md-gap-10\",\n },\n ),\n ],\n data: {\n key: \"post\",\n loader: {\n endpoint: \"getPublishedEntryPreview\",\n params: {\n type: \"post\",\n slug: { $bind: { from: \"postSlug\" } },\n siteId: { $bind: { from: \"$root.siteId\" } },\n },\n mode: \"server\",\n },\n },\n});\n","import { defineFragment, type FragmentDefinition } from \"../types\";\nimport {\n stack,\n text,\n link,\n media,\n when,\n bind,\n el,\n repeat,\n button,\n type NodeModifier,\n} from \"../../node/builder\";\nimport {\n backgroundColorStyle,\n borderColorStyle,\n mergeStyles,\n textColorStyle,\n} from \"../../../theme/utils/colorStyles\";\n\n// Grid primitive helper\nconst grid = (\n props?: Record<string, unknown> | null,\n children?: Array<\n import(\"../../node\").NodeDefinition | null | undefined\n > | null,\n ...mods: NodeModifier[]\n) => el(\"grid\", props ?? undefined, children ?? undefined, ...mods);\n\nexport const blogListGridFragment: FragmentDefinition = defineFragment({\n id: \"blogListGrid\",\n title: \"Blog List Grid\",\n description: \"Grid layout for displaying blog posts as cards with images.\",\n fields: [\n {\n id: \"columns\",\n type: \"select\",\n label: \"Grid columns\",\n description: \"Number of columns in the grid layout.\",\n defaultValue: \"3\",\n ui: { intent: \"display\" },\n options: [\n { value: \"2\", label: \"2 columns\" },\n { value: \"3\", label: \"3 columns\" },\n { value: \"4\", label: \"4 columns\" },\n ],\n },\n {\n id: \"showImages\",\n type: \"boolean\",\n label: \"Show images\",\n description: \"Display featured images for each post.\",\n defaultValue: true,\n ui: { intent: \"display\" },\n },\n {\n id: \"showExcerpts\",\n type: \"boolean\",\n label: \"Show excerpts\",\n description: \"Display post preview text.\",\n defaultValue: true,\n ui: { intent: \"display\" },\n },\n {\n id: \"showDates\",\n type: \"boolean\",\n label: \"Show dates\",\n description: \"Display publish dates.\",\n defaultValue: true,\n ui: { intent: \"display\" },\n },\n ],\n layout: [\n // Grid container\n grid(\n {\n className:\n \"rb-grid rb-grid-cols-1 rb-gap-8 rb-md-grid-cols-2 rb-lg-grid-cols-3\",\n },\n [\n // Individual post card\n stack(\n {\n gap: \"md\",\n className:\n \"rb-flex rb-flex-col rb-overflow-hidden rb-border rb-shadow-sm rb-transition-shadow hover:rb-shadow-md\",\n style: mergeStyles(\n borderColorStyle(\"border\"),\n backgroundColorStyle(\"surface\"),\n { borderRadius: \"var(--radius-card)\" },\n ),\n },\n [\n // Featured image\n link(\n {\n className: \"rb-block rb-overflow-hidden\",\n href: { $bind: { from: \"post.path\" } },\n },\n [\n media(\n {\n className:\n \"rb-h-48 rb-w-full rb-object-cover rb-transition-transform rb-hover-scale-105\",\n },\n bind(\"post.image\", {\n transforms: [\n {\n id: \"media.fromUrl\",\n options: { width: 768, height: 432, quality: 80, resize: \"cover\" },\n },\n ],\n }),\n ),\n ],\n when(\"post.image\"),\n when(\"content.showImages\"),\n ),\n\n // Post content\n stack({ gap: \"sm\", className: \"rb-flex-1 rb-p-6\" }, [\n // Title\n link(\n {\n href: { $bind: { from: \"post.path\" } },\n className:\n \"rb-block rb-transition-colors hover:rb-opacity-80\",\n style: textColorStyle(\"heading\"),\n },\n [text({ as: \"h3\" }, bind(\"post.title\"))],\n ),\n\n // Date\n text(\n {\n as: \"time\",\n className: \"rb-caption rb-italic\",\n style: textColorStyle(\"mutedText\"),\n },\n bind(\"post.publishedAt\", {\n transforms: [{ id: \"date.formatShort\" }],\n }),\n when(\"post.publishedAt\"),\n when(\"content.showDates\"),\n ),\n\n // Excerpt\n text(\n {\n as: \"p\",\n className: \"rb-mt-2 rb-line-clamp-4\",\n style: textColorStyle(\"text/80\"),\n },\n bind(\"post.excerpt\"),\n when(\"post.excerpt\"),\n when(\"content.showExcerpts\"),\n ),\n\n // Read more button\n button(\n {\n href: { $bind: { from: \"post.path\" } },\n className: \"rb-self-start\",\n },\n [\n text(\n { as: \"span\" },\n bind(\"content.readMoreText\", { fallback: \"Read more →\" }),\n ),\n ],\n ),\n ]),\n ],\n repeat(\"data.posts\", \"post\"),\n ),\n ],\n ),\n ],\n data: {\n key: \"posts\",\n loader: {\n endpoint: \"listPublishedEntries\",\n params: {\n type: \"post\",\n siteId: { $bind: { from: \"$root.siteId\" } },\n limit: { $bind: { from: \"postsPerPage\", fallback: \"12\" } },\n stage: { $bind: { from: \"$root.previewStage\", fallback: \"published\" } },\n },\n mode: \"server\",\n },\n },\n});\n","import {\n bind,\n inline,\n link,\n media,\n repeat,\n stack,\n text,\n when,\n button,\n} from \"../../node/builder\";\nimport { defineFragment, type FragmentDefinition } from \"../types\";\nimport {\n borderColorStyle,\n backgroundColorStyle,\n mergeStyles,\n textColorStyle,\n} from \"../../../theme/utils/colorStyles\";\n\nexport const blogListStackFragment: FragmentDefinition = defineFragment({\n id: \"blogListStack\",\n title: \"Blog List Stack\",\n description:\n \"Vertical list layout for displaying blog posts with optional thumbnails.\",\n fields: [\n {\n id: \"showImages\",\n type: \"boolean\",\n label: \"Show images\",\n description: \"Display thumbnail images for each post.\",\n defaultValue: true,\n ui: { intent: \"display\" },\n },\n {\n id: \"showExcerpts\",\n type: \"boolean\",\n label: \"Show excerpts\",\n description: \"Display post preview text.\",\n defaultValue: true,\n ui: { intent: \"display\" },\n },\n {\n id: \"showDates\",\n type: \"boolean\",\n label: \"Show dates\",\n description: \"Display publish dates.\",\n defaultValue: true,\n ui: { intent: \"display\" },\n },\n ],\n layout: [\n // Vertical stack container\n stack({ gap: \"lg\", className: \"rb-max-w-3xl\" }, [\n // Individual post row\n inline(\n {\n gap: \"lg\",\n className: \"rb-items-start rb-border-b rb-pb-6 rb-last-border-b-0\",\n style: borderColorStyle(\"border\"),\n },\n [\n // Optional thumbnail (left-aligned)\n link(\n {\n href: { $bind: { from: \"post.path\" } },\n className:\n \"rb-shrink-0 rb-overflow-hidden rb-border\",\n style: mergeStyles(\n borderColorStyle(\"border\"),\n backgroundColorStyle(\"surface\"),\n { borderRadius: \"var(--radius-card)\" },\n ),\n },\n [\n media(\n {\n className:\n \"rb-h-28 rb-w-28 rb-sm-h-32 rb-sm-w-32 rb-object-cover rb-transition-transform rb-motion-safe-hover-scale-105\",\n },\n bind(\"post.image\", {\n transforms: [\n {\n id: \"media.fromUrl\",\n options: { width: 256, height: 256, quality: 80, resize: \"cover\" },\n },\n ],\n }),\n ),\n ],\n when(\"post.image\"),\n when(\"content.showImages\"),\n ),\n\n // Post content (grows to fill space)\n stack({ gap: \"sm\", className: \"rb-flex-1 rb-min-w-0\" }, [\n // Title\n link(\n {\n href: { $bind: { from: \"post.path\" } },\n className:\n \"rb-block rb-transition-colors hover:rb-opacity-80\",\n style: textColorStyle(\"heading\"),\n },\n [text({ as: \"h3\" }, bind(\"post.title\"))],\n ),\n\n // Date\n text(\n {\n as: \"time\",\n className: \"rb-caption rb-italic\",\n style: textColorStyle(\"mutedText\"),\n },\n bind(\"post.publishedAt\", {\n transforms: [{ id: \"date.formatShort\" }],\n }),\n when(\"post.publishedAt\"),\n when(\"content.showDates\"),\n ),\n\n // Excerpt\n text(\n {\n as: \"p\",\n className: \"rb-line-clamp-3\",\n style: textColorStyle(\"text/80\"),\n },\n bind(\"post.excerpt\"),\n when(\"post.excerpt\"),\n when(\"content.showExcerpts\"),\n ),\n\n // Read more button\n button(\n {\n href: { $bind: { from: \"post.path\" } },\n className: \"rb-self-start\",\n },\n [\n text(\n { as: \"span\" },\n bind(\"content.readMoreText\", { fallback: \"Read more →\" }),\n ),\n ],\n ),\n ]),\n ],\n repeat(\"data.posts\", \"post\"),\n ),\n ]),\n ],\n data: {\n key: \"posts\",\n loader: {\n endpoint: \"listPublishedEntries\",\n params: {\n type: \"post\",\n siteId: { $bind: { from: \"$root.siteId\" } },\n limit: { $bind: { from: \"postsPerPage\", fallback: \"12\" } },\n stage: { $bind: { from: \"$root.previewStage\", fallback: \"published\" } },\n },\n mode: \"server\",\n },\n },\n});\n","import { defineFragment, type FragmentDefinition } from \"../types\";\nimport { stack, text, richText, bind, when } from \"../../node/builder\";\nimport { textColorStyle } from \"../../../theme/utils/colorStyles\";\n\nexport const faqHeadingFragment: FragmentDefinition = defineFragment({\n id: \"faqHeading\",\n title: \"FAQ Heading\",\n description: \"Optional eyebrow, title, and description for FAQ sections.\",\n fields: [\n {\n id: \"eyebrow\",\n type: \"text\",\n label: \"Eyebrow\",\n description: \"Short label displayed above the title.\",\n visibleRoles: [\"designer\", \"admin\"],\n maxLength: 60,\n },\n {\n id: \"title\",\n type: \"text\",\n label: \"Title\",\n required: false,\n maxLength: 120,\n },\n {\n id: \"description\",\n type: \"richText\",\n label: \"Description\",\n required: false,\n ui: { variant: \"limited\" },\n },\n ],\n layout: stack(\n {\n gap: \"sm\",\n className: \"rb-mx-auto rb-max-w-3xl rb-text-center rb-mb-4\",\n },\n [\n text(\n {\n as: \"p\",\n // Color is theme-owned (see theme/blocks-static/hero.css .heading-eyebrow)\n className: \"faq-eyebrow rb-eyebrow heading-eyebrow\",\n },\n when(\"content.eyebrow\"),\n bind(\"content.eyebrow\"),\n ),\n text(\n {\n as: \"h2\",\n // h2 now gets size/weight from theme typography CSS\n className: \"faq-title\",\n },\n when(\"content.title\"),\n bind(\"content.title\"),\n ),\n richText(\n {\n className:\n \"faq-description rb-prose rb-mx-auto rb-max-w-none\",\n style: textColorStyle(\"mutedText\"),\n },\n when(\"content.description\"),\n bind(\"content.description\"),\n ),\n ],\n ),\n});\n","import { accordionList } from \"../../node/builder\";\nimport { defineFragment, type FragmentDefinition } from \"../types\";\n\nexport const faqAccordionFragment: FragmentDefinition = defineFragment({\n id: \"faqAccordion\",\n title: \"FAQ Accordion\",\n description: \"Expandable list of question and answer pairs.\",\n fields: [\n {\n id: \"items\",\n type: \"repeater\",\n label: \"FAQ items\",\n itemLabel: \"FAQ item\",\n itemLabelSource: \"question\",\n minItems: 1,\n maxItems: 30,\n schema: {\n fields: [\n {\n id: \"question\",\n type: \"text\",\n label: \"Question\",\n required: true,\n maxLength: 160,\n },\n {\n id: \"answer\",\n type: \"richText\",\n label: \"Answer\",\n required: true,\n ui: { variant: \"limited\" },\n },\n ],\n },\n },\n ],\n layout: accordionList({\n collection: \"content.items\",\n itemName: \"faqItem\",\n indexName: \"faqIndex\",\n accordionProps: {\n className: \"accordion-root\", // CSS-first: all styling handled by theme CSS\n type: \"single\",\n collapsible: true,\n },\n itemProps: {\n className: \"accordion-item\",\n iconStyle: { $bind: { from: \"theme.accordions.icon.style\" } }, // Pass icon style from theme\n },\n triggerFrom: \"faqItem.question\",\n contentFrom: \"faqItem.answer\",\n }),\n});\n","import { defineFragment, type FragmentDefinition } from \"../types\";\nimport { stack, text, richText, media, bind, when } from \"../../node/builder\";\nimport { createCtasRepeater } from \"../../fields/ctas\";\nimport { ctaRow } from \"../../node/fragments/ctaRow\";\nimport { textColorStyle } from \"../../../theme/utils/colorStyles\";\n\n/**\n * Card fragment - flexible content card with title, body, optional media, and action buttons\n *\n * Features:\n * - Featured media (image/video) with configurable aspect ratio\n * - Title and rich text body\n * - Call-to-action buttons (0-3)\n * - Variant-based styling from theme (background, spacing, elevation, rounded corners)\n *\n * Card styling is managed through CSS generation at build-time (generateCardCss).\n * Each card uses:\n * - .card-{variant} - Container styles (background, border, shadow, radius)\n * - .card-media - Media corners matching container\n * - .card-content - Padding based on variant spacing\n *\n * This CSS-first approach eliminates runtime transforms for styling.\n */\nexport const cardFragment: FragmentDefinition = defineFragment({\n id: \"card\",\n title: \"Card\",\n description:\n \"Content card with optional media, title, body, and action buttons\",\n category: \"content\",\n icon: \"LayoutCard\",\n fields: [\n {\n id: \"media\",\n type: \"media\",\n label: \"Featured media\",\n description: \"Image or video displayed at top of card\",\n required: false,\n mediaKinds: [\"image\", \"video\"],\n },\n\t {\n\t id: \"aspectRatio\",\n\t type: \"select\",\n\t label: \"Media aspect ratio\",\n\t defaultValue: \"auto\",\n\t ui: { intent: \"display\", visibleWhen: { field: \"media\", notEquals: null } },\n options: [\n { value: \"auto\", label: \"Auto\" },\n { value: \"16/9\", label: \"16:9 (Landscape)\" },\n { value: \"4/3\", label: \"4:3 (Standard)\" },\n { value: \"1/1\", label: \"1:1 (Square)\" },\n { value: \"3/4\", label: \"3:4 (Portrait)\" },\n ],\n\t },\n\t {\n\t id: \"title\",\n\t type: \"text\",\n\t label: \"Title\",\n required: true,\n maxLength: 120,\n },\n {\n id: \"body\",\n type: \"richText\",\n label: \"Body\",\n description: \"Main card content\",\n },\n createCtasRepeater({\n id: \"ctas\",\n label: \"Action buttons\",\n itemLabel: \"Button\",\n minItems: 0,\n maxItems: 3,\n }),\n {\n id: \"variant\",\n type: \"select\",\n label: \"Card variant\",\n description: \"Choose a card style from your theme\",\n required: false,\n defaultValue: \"default\",\n options: [\n { value: \"default\", label: \"Default\" },\n { value: \"variant1\", label: \"Variant 1\" },\n { value: \"variant2\", label: \"Variant 2\" },\n ],\n ui: { intent: \"style\" },\n },\n ],\n layout: stack(\n {\n gap: \"none\",\n className: {\n $bind: {\n from: \"variant\",\n fallback: \"default\",\n },\n $prepend: \"card-\",\n },\n },\n [\n // Featured media at top (conditional) - full width, no padding\n // CSS handles corner radius via .card-{variant} .card-media selector\n media(\n {\n className: \"card-media rb-w-full rb-h-auto rb-object-cover\",\n style: {\n aspectRatio: { $bind: { from: \"aspectRatio\" } },\n },\n },\n when(\"media\"),\n bind(\"media\"),\n ),\n // Content wrapper with padding based on variant\n // CSS handles padding via .card-{variant} .card-content selector\n stack(\n {\n gap: \"sm\",\n className: \"card-content\",\n },\n [\n text(\n {\n as: \"h3\",\n className: \"card-title\",\n },\n bind(\"title\"),\n ),\n richText(\n {\n className: \"card-body rb-prose rb-max-w-none\",\n style: textColorStyle(\"mutedText\"),\n },\n when(\"body\"),\n bind(\"body\"),\n ),\n // Action buttons at bottom (conditional)\n ctaRow({\n collectionPath: \"ctas\",\n itemName: \"cta\",\n gap: \"sm\",\n justify: \"start\",\n containerClassName: \"rb-mt-2\",\n }),\n ],\n ),\n ],\n ),\n});\n","import { defineFragment, type FragmentDefinition } from '../types';\nimport { text, bind } from '../../node/builder';\n\n/**\n * Heading fragment - simple text heading with configurable level\n */\nexport const headingFragment: FragmentDefinition = defineFragment({\n id: 'heading',\n title: 'Heading',\n description: 'Text heading',\n category: 'content',\n icon: 'Heading',\n fields: [\n {\n id: 'text',\n type: 'text',\n label: 'Heading text',\n required: true,\n maxLength: 200,\n },\n {\n id: 'level',\n type: 'select',\n label: 'Heading level',\n defaultValue: 'h2',\n ui: { intent: 'display' },\n options: [\n { value: 'h1', label: 'H1 (Large)' },\n { value: 'h2', label: 'H2 (Medium)' },\n { value: 'h3', label: 'H3 (Small)' },\n ],\n },\n ],\n layout: text(\n {\n as: { $bind: { from: 'level' } }, // Relative path - resolves to current scope\n className: 'fragment-heading',\n },\n bind('text'), // Relative path - resolves to current scope\n ),\n});\n","import { defineFragment, type FragmentDefinition } from \"../types\";\nimport { richText, bind } from \"../../node/builder\";\n\n/**\n * Rich text fragment - formatted text content\n */\nexport const richTextFragment: FragmentDefinition = defineFragment({\n id: \"richText\",\n title: \"Rich Text\",\n description: \"Formatted text with markdown\",\n category: \"content\",\n icon: \"FileText\",\n fields: [\n {\n id: \"content\",\n type: \"richText\",\n label: \"Content\",\n required: true,\n },\n ],\n layout: richText(\n {\n className: \"fragment-richtext rb-prose rb-prose-neutral\",\n },\n bind(\"content\"), // Relative path - resolves to current scope\n ),\n});\n","import type { FragmentDefinition } from '../types';\nimport type { FieldDefinition, RepeaterFieldDefinition } from '../../manifest/schema';\n\n/**\n * Converts a record of fragments into a polymorphic repeater field definition.\n * This allows fragments to be used in blocks via repeaters with type selection.\n *\n * @example\n * ```typescript\n * const field = fragmentsToRepeaterField(\n * 'items',\n * 'Column content',\n * {\n * card: cardFragment,\n * quote: quoteFragment,\n * stat: statFragment\n * },\n * { minItems: 0, maxItems: 50 }\n * );\n * ```\n */\nexport function fragmentsToRepeaterField(\n id: string,\n label: string,\n fragments: Record<string, FragmentDefinition>,\n options: {\n minItems?: number;\n maxItems?: number;\n itemLabel?: string;\n description?: string;\n allowConversion?: boolean;\n commonFields?: FieldDefinition[];\n } = {}\n): RepeaterFieldDefinition {\n const commonFields = options.commonFields ?? [];\n\n return {\n id,\n type: 'repeater',\n label,\n description: options.description,\n polymorphic: true,\n itemLabel: options.itemLabel ?? 'Item',\n itemLabelSource: '_type',\n minItems: options.minItems ?? 0,\n maxItems: options.maxItems,\n allowConversion: options.allowConversion ?? true,\n required: false,\n itemTypes: Object.fromEntries(\n Object.entries(fragments).map(([typeId, fragment]) => [\n typeId,\n {\n label: fragment.title ?? typeId,\n icon: fragment.icon,\n fields: [...commonFields, ...fragment.fields],\n }\n ])\n )\n };\n}\n","import { defineFragment, type FragmentDefinition } from \"../types\";\n\nexport const heroLayoutControlsFragment: FragmentDefinition = defineFragment({\n id: \"heroLayoutControls\",\n title: \"Hero Layout\",\n description: \"Alignment and content width controls for hero layouts.\",\n fields: [\n {\n id: \"contentAlignment\",\n type: \"select\",\n label: \"Content alignment\",\n description: \"Horizontal text alignment and content positioning.\",\n required: false,\n ui: { intent: \"display\" },\n options: [\n { value: \"left\", label: \"Left\" },\n { value: \"center\", label: \"Center\" },\n { value: \"right\", label: \"Right\" },\n ],\n },\n {\n id: \"verticalAlignment\",\n type: \"select\",\n label: \"Vertical alignment\",\n description: \"Where the content sits vertically within the hero.\",\n required: false,\n ui: { intent: \"display\" },\n options: [\n { value: \"top\", label: \"Top\" },\n { value: \"center\", label: \"Center\" },\n { value: \"bottom\", label: \"Bottom\" },\n ],\n },\n {\n id: \"contentMaxWidth\",\n type: \"select\",\n label: \"Content max width\",\n description: \"Constrain the width of the hero content for tighter layouts.\",\n required: false,\n ui: { intent: \"display\" },\n options: [\n { value: \"default\", label: \"Default\" },\n { value: \"narrow\", label: \"Narrow\" },\n { value: \"medium\", label: \"Medium\" },\n { value: \"wide\", label: \"Wide\" },\n ],\n },\n ],\n // Fields-only fragment: no layout nodes.\n layout: [],\n});\n\n","import { defineFragment, type FragmentDefinition } from \"../types\";\nimport { bind, richText, stack, text, when } from \"../../node/builder\";\n\n/**\n * Quote fragment - semantic quote body with optional attribution lines.\n * Useful in split layouts (for example quote + image columns).\n */\nexport const quoteFragment: FragmentDefinition = defineFragment({\n id: \"quote\",\n title: \"Quote\",\n description: \"Quoted text with optional attribution\",\n category: \"content\",\n icon: \"MessageSquareQuote\",\n fields: [\n {\n id: \"quote\",\n type: \"richText\",\n label: \"Quote\",\n required: true,\n },\n {\n id: \"attribution\",\n type: \"text\",\n label: \"Attribution\",\n description: \"Name of the person being quoted\",\n maxLength: 120,\n },\n {\n id: \"attributionMeta\",\n type: \"text\",\n label: \"Attribution details\",\n description: \"Role, business name, or other context\",\n maxLength: 160,\n },\n ],\n layout: stack(\n {\n gap: \"md\",\n className: \"fragment-quote rb-h-full rb-flex-1\",\n },\n [\n richText(\n {\n className: \"fragment-quote-body rb-prose rb-prose-neutral rb-max-w-none\",\n },\n bind(\"quote\"),\n ),\n stack(\n { gap: \"xs\", className: \"fragment-quote-attribution rb-mt-auto\" },\n [\n text(\n { as: \"strong\", className: \"rb-block\" },\n bind(\"attribution\"),\n when(\"attribution\"),\n ),\n text(\n { as: \"p\", className: \"rb-caption rb-opacity-80\" },\n bind(\"attributionMeta\"),\n when(\"attributionMeta\"),\n ),\n ],\n ),\n ],\n ),\n});\n","import { defineFragment, type FragmentDefinition } from \"../types\";\nimport { stack, media, text, bind, when, el } from \"../../node/builder\";\nimport { textColorStyle } from \"../../../theme/utils/colorStyles\";\n\n/**\n * Image fragment - single image with optional caption and aspect ratio control\n */\nexport const imageFragment: FragmentDefinition = defineFragment({\n id: \"image\",\n title: \"Image\",\n description: \"Image with optional caption\",\n category: \"content\",\n icon: \"Image\",\n fields: [\n {\n id: \"image\",\n type: \"media\",\n label: \"Image\",\n required: true,\n mediaKinds: [\"image\"],\n },\n {\n id: \"caption\",\n type: \"text\",\n label: \"Caption\",\n required: false,\n maxLength: 200,\n },\n {\n id: \"aspectRatio\",\n type: \"select\",\n label: \"Aspect ratio\",\n defaultValue: \"auto\",\n ui: { intent: \"display\" },\n options: [\n { value: \"auto\", label: \"Auto\" },\n { value: \"16/9\", label: \"16:9 (Landscape)\" },\n { value: \"4/3\", label: \"4:3 (Standard)\" },\n { value: \"1/1\", label: \"1:1 (Square)\" },\n { value: \"3/4\", label: \"3:4 (Portrait)\" },\n ],\n },\n ],\n // When used inside equal-height editorial grids (e.g. Columns with equalHeight),\n // the fragment should be able to stretch to fill the tile height.\n layout: stack({ gap: \"sm\", className: \"rb-h-full rb-flex-1\" }, [\n el(\n \"figure\",\n {\n className: {\n $bind: {\n from: \"aspectRatio\",\n transforms: [\n {\n id: \"ui.imageFragmentClass\",\n options: {\n base: \"fragment-image-frame rb-w-full\",\n whenAuto: \"\",\n whenFixed: \"rb-overflow-hidden rb-h-full\",\n },\n },\n ],\n fallback: \"fragment-image-frame rb-w-full\",\n },\n },\n style: {\n aspectRatio: { $bind: { from: \"aspectRatio\" } },\n },\n },\n [\n media(\n {\n className: {\n $bind: {\n from: \"aspectRatio\",\n transforms: [\n {\n id: \"ui.imageFragmentClass\",\n options: {\n base: \"fragment-image rb-w-full rb-object-cover\",\n whenAuto: \"rb-h-auto\",\n whenFixed: \"rb-h-full\",\n },\n },\n ],\n fallback: \"fragment-image rb-w-full rb-h-auto rb-object-cover\",\n },\n },\n size: {\n $bind: {\n from: \"aspectRatio\",\n transforms: [{ id: \"ui.imageFragmentSize\" }],\n fallback: { width: 1920, quality: 85, resize: \"contain\" },\n },\n },\n },\n bind(\"image\"),\n ),\n ],\n ),\n text(\n {\n as: \"p\",\n className: \"image-caption rb-caption rb-text-center\",\n style: textColorStyle(\"mutedText\"),\n },\n when(\"caption\"),\n bind(\"caption\"),\n ),\n ]),\n});\n","import { defineFragment, type FragmentDefinition } from \"../types\";\nimport { stack, videoEmbed, text, bind, when } from \"../../node/builder\";\nimport { textColorStyle } from \"../../../theme/utils/colorStyles\";\n\n/**\n * Video embed fragment - YouTube/Vimeo/Instagram embed with optional caption\n */\nexport const videoEmbedFragment: FragmentDefinition = defineFragment({\n id: \"videoEmbed\",\n title: \"Video\",\n description: \"YouTube, Vimeo, or Instagram embed\",\n category: \"media\",\n icon: \"Video\",\n fields: [\n {\n id: \"url\",\n type: \"url\",\n label: \"Video URL\",\n required: true,\n description: \"YouTube, Vimeo, or Instagram URL\",\n },\n {\n id: \"caption\",\n type: \"text\",\n label: \"Caption\",\n required: false,\n maxLength: 200,\n },\n {\n id: \"aspectRatio\",\n type: \"select\",\n label: \"Aspect ratio\",\n defaultValue: \"16/9\",\n ui: { intent: \"display\" },\n options: [\n { value: \"16/9\", label: \"16:9 (Widescreen)\" },\n { value: \"4/3\", label: \"4:3 (Standard)\" },\n { value: \"1/1\", label: \"1:1 (Square)\" },\n { value: \"21/9\", label: \"21:9 (Ultrawide)\" },\n ],\n },\n ],\n layout: stack({ gap: \"sm\" }, [\n videoEmbed(\n {\n className: \"fragment-video rb-w-full rb-rounded-lg rb-overflow-hidden\",\n style: {\n aspectRatio: { $bind: { from: \"aspectRatio\" } },\n },\n },\n bind(\"url\"),\n ),\n text(\n {\n as: \"p\",\n className: \"video-caption rb-caption rb-text-center\",\n style: textColorStyle(\"mutedText\"),\n },\n when(\"caption\"),\n bind(\"caption\"),\n ),\n ]),\n});\n","import { defineFragment, type FragmentDefinition } from '../types';\nimport { repeat, stack } from '../../node/builder';\nimport { fragmentsToRepeaterField } from '../utils/toRepeaterSchema';\nimport { imageFragment } from './image';\nimport { videoEmbedFragment } from './videoEmbed';\nimport { headingFragment } from './heading';\nimport { richTextFragment } from './richText';\nimport { quoteFragment } from './quote';\nimport { typeBasedLayout } from '../../node';\n\n/**\n * Column content fragment - represents a single column with nested items.\n * Each column can contain a flexible stack of images, headings, and rich text.\n */\nexport const columnContentFragment: FragmentDefinition = defineFragment({\n id: 'columnContent',\n title: 'Column',\n description: 'A single column with customizable content',\n category: 'layout',\n icon: 'RectangleVertical',\n fields: [\n fragmentsToRepeaterField(\n 'items',\n 'Column items',\n {\n image: imageFragment,\n videoEmbed: videoEmbedFragment,\n heading: headingFragment,\n richText: richTextFragment,\n quote: quoteFragment,\n },\n {\n minItems: 0,\n maxItems: 20,\n itemLabel: 'Item',\n description: 'Add content to this column',\n }\n ),\n ],\n layout: stack(\n { gap: 'md', className: 'rb-h-full rb-flex-1' },\n [\n stack(\n { gap: 'md', className: 'rb-h-full rb-flex-1' },\n typeBasedLayout(\n {\n image: imageFragment.layout,\n videoEmbed: videoEmbedFragment.layout,\n heading: headingFragment.layout,\n richText: richTextFragment.layout,\n quote: quoteFragment.layout,\n },\n { itemName: 'item' }\n ),\n repeat('items', 'item')\n ),\n ]\n ),\n});\n","import { defineFragment, type FragmentDefinition } from \"../types\";\nimport { text, richText, bind, when } from \"../../node/builder\";\n\nexport const newsletterCopyFragment: FragmentDefinition = defineFragment({\n id: \"newsletterCopy\",\n title: \"Newsletter Copy\",\n description: \"Optional title and description for newsletter signup blocks.\",\n fields: [\n {\n id: \"title\",\n type: \"text\",\n label: \"Title\",\n defaultValue: \"Subscribe to our newsletter\",\n },\n {\n id: \"subtitle\",\n type: \"richText\",\n label: \"Subtitle\",\n description: \"Optional description below the title.\",\n },\n ],\n layout: [\n text(\n {\n as: \"h2\",\n className: \"newsletter-copy-title\",\n },\n when(\"content.title\"),\n bind(\"content.title\"),\n ),\n richText(\n {\n className: \"newsletter-copy-subtitle rb-prose rb-max-w-none\",\n },\n when(\"content.subtitle\"),\n bind(\"content.subtitle\"),\n ),\n ],\n});\n","import { defineFragment, type FragmentDefinition } from \"../types\";\nimport { el } from \"../../node/builder\";\nimport { withApiBindings } from \"../../helpers/api-bindings\";\n\n/**\n * Newsletter Form Fragment\n *\n * Embeds a newsletter signup form with configurable presets.\n * The form is rendered by the `newsletter-form` node component.\n */\nexport const newsletterFormFragment: FragmentDefinition = defineFragment({\n id: \"newsletterForm\",\n title: \"Newsletter Form\",\n description: \"Newsletter subscription form with preset field configurations.\",\n fields: [\n {\n id: \"listId\",\n type: \"reference\",\n label: \"Newsletter list\",\n description: \"Select the list new subscribers should be added to.\",\n required: true,\n referenceKind: \"newsletterList\",\n allowManualEntry: false,\n ui: { intent: \"behavior\" },\n },\n {\n id: \"preset\",\n type: \"select\",\n label: \"Form fields\",\n description: \"Choose which fields to collect.\",\n defaultValue: \"emailOnly\",\n ui: { intent: \"display\" },\n options: [\n { value: \"emailOnly\", label: \"Email only\" },\n { value: \"emailName\", label: \"Email + Name\" },\n { value: \"emailFirstLast\", label: \"Email + First/Last Name\" },\n { value: \"emailNameCompany\", label: \"Email + Name + Company (B2B)\" },\n ],\n },\n {\n id: \"includePhone\",\n type: \"boolean\",\n label: \"Include phone field (optional)\",\n description: \"Adds an optional phone field to the selected preset (never required).\",\n defaultValue: false,\n ui: { intent: \"display\" },\n },\n {\n id: \"buttonLabel\",\n type: \"text\",\n label: \"Button label\",\n defaultValue: \"Subscribe\",\n },\n {\n id: \"successMessage\",\n type: \"text\",\n label: \"Success message\",\n description: \"Shown after successful subscription.\",\n defaultValue: \"Thanks for subscribing!\",\n },\n {\n id: \"privacyNote\",\n type: \"text\",\n label: \"Privacy note\",\n description: \"Optional small text below the form (e.g., privacy policy link).\",\n },\n {\n id: \"tags\",\n type: \"text\",\n label: \"Tags (optional)\",\n description: \"Optional tags to apply on subscribe (comma or semicolon separated).\",\n },\n ],\n layout: [\n el(\n 'newsletter-form',\n withApiBindings({\n listId: { $bind: { from: \"listId\" } },\n preset: { $bind: { from: \"preset\" } },\n includePhone: { $bind: { from: \"includePhone\" } },\n buttonLabel: { $bind: { from: \"buttonLabel\" } },\n successMessage: { $bind: { from: \"successMessage\" } },\n privacyNote: { $bind: { from: \"privacyNote\" } },\n tags: { $bind: { from: \"tags\" } },\n spamProtectionEnabled: { $bind: { from: \"$root.spamProtectionEnabled\" } },\n }),\n [],\n ),\n ],\n});\n","import { defineFragment, type FragmentDefinition } from \"../types\";\nimport { el, stack, text, richText, media, bind, when } from \"../../node/builder\";\n\nexport const teamMemberFragment: FragmentDefinition = defineFragment({\n id: \"teamMember\",\n title: \"Team member\",\n description: \"Team member with photo, name, role, and bio.\",\n category: \"content\",\n icon: \"User\",\n fields: [\n {\n id: \"photo\",\n type: \"media\",\n label: \"Photo\",\n required: false,\n mediaKinds: [\"image\"],\n },\n {\n id: \"name\",\n type: \"text\",\n label: \"Name\",\n required: true,\n maxLength: 120,\n },\n {\n id: \"role\",\n type: \"text\",\n label: \"Role\",\n required: false,\n maxLength: 120,\n },\n {\n id: \"bio\",\n type: \"richText\",\n label: \"Bio\",\n required: false,\n ui: { variant: \"limited\" },\n },\n ],\n layout: stack(\n { gap: \"sm\", className: \"rb-team-member rb-items-center rb-text-center\" },\n [\n el(\"div\", { className: \"rb-team-member-photo-wrap rb-w-full\" }, [\n media(\n {\n // Responsive square thumbnail: width comes from the layout, height from aspect-ratio.\n // Shape/padding are controlled by the Team Members block wrapper via CSS.\n className: \"rb-team-member-photo rb-w-full rb-object-cover\",\n style: { aspectRatio: \"1 / 1\" },\n // Keep thumbnails modest; the grid rarely displays them above ~300-400px.\n size: { width: 600, height: 600, quality: 85, resize: \"cover\" },\n },\n when(\"photo\"),\n bind(\"photo\"),\n ),\n ]),\n text({ as: \"h3\" }, bind(\"name\")),\n text({ as: \"p\", className: \"rb-team-member-role\" }, when(\"role\"), bind(\"role\")),\n richText(\n { className: \"rb-prose rb-max-w-none\" },\n when(\"bio\"),\n bind(\"bio\"),\n ),\n ],\n ),\n});\n","/**\n * @file Defines constants for the background field, ensuring a single source of truth\n * for presets used in both the field definition and the style transforms.\n */\n\nexport const BACKGROUND_POSITION_PRESETS = [\n { value: \"center\", label: \"Center\" },\n { value: \"top\", label: \"Top\" },\n { value: \"top left\", label: \"Top Left\" },\n { value: \"top right\", label: \"Top Right\" },\n { value: \"bottom\", label: \"Bottom\" },\n { value: \"bottom left\", label: \"Bottom Left\" },\n { value: \"bottom right\", label: \"Bottom Right\" },\n { value: \"left\", label: \"Left\" },\n { value: \"right\", label: \"Right\" },\n // The following are valid keywords but are not included in the UI to reduce clutter.\n // They are included here to ensure the transform logic can correctly identify them as presets.\n { value: \"top center\", label: \"Top Center\" },\n { value: \"bottom center\", label: \"Bottom Center\" },\n { value: \"left center\", label: \"Left Center\" },\n { value: \"right center\", label: \"Right Center\" },\n { value: \"left top\", label: \"Left Top\" },\n { value: \"right top\", label: \"Right Top\" },\n { value: \"left bottom\", label: \"Left Bottom\" },\n { value: \"right bottom\", label: \"Right Bottom\" },\n] as const;\n\nexport const BACKGROUND_POSITION_PRESET_VALUES =\n BACKGROUND_POSITION_PRESETS.map((p) => p.value);\n\n/**\n * Maps position keywords to rb-* anchor positioning classes.\n * Used for positioning scaled/overflow images within their containers.\n */\nexport const POSITION_TO_ANCHOR_CLASSES: Record<string, string> = {\n center: \"rb-anchor-center\",\n top: \"rb-anchor-top\",\n \"top center\": \"rb-anchor-top\",\n bottom: \"rb-anchor-bottom\",\n \"bottom center\": \"rb-anchor-bottom\",\n left: \"rb-anchor-left\",\n \"left center\": \"rb-anchor-left\",\n right: \"rb-anchor-right\",\n \"right center\": \"rb-anchor-right\",\n \"top left\": \"rb-anchor-top-left\",\n \"left top\": \"rb-anchor-top-left\",\n \"top right\": \"rb-anchor-top-right\",\n \"right top\": \"rb-anchor-top-right\",\n \"bottom left\": \"rb-anchor-bottom-left\",\n \"left bottom\": \"rb-anchor-bottom-left\",\n \"bottom right\": \"rb-anchor-bottom-right\",\n \"right bottom\": \"rb-anchor-bottom-right\",\n};\n\n/** Default anchor classes when position is null or unrecognized */\nexport const DEFAULT_ANCHOR_CLASSES = \"rb-anchor-center\";\n\n/**\n * Gets rb-* anchor positioning classes for a position keyword.\n * Used for positioning scaled/overflow background images.\n */\nexport function getAnchorClasses(position: string | null): string {\n if (!position) return DEFAULT_ANCHOR_CLASSES;\n const normalized = position.toLowerCase().trim();\n return POSITION_TO_ANCHOR_CLASSES[normalized] ?? DEFAULT_ANCHOR_CLASSES;\n}\n","import { BACKGROUND_POSITION_PRESETS } from '../constants/background';\nimport type { FieldDefinition, TabDefinition, TabGroupFieldDefinition } from '../manifest/schema'\n\n/**\n * Widget name constants for background fields.\n *\n * These match the keys expected in widgetOverrides.\n *\n * IMPORTANT: These values MUST match WIDGET_NAMES in:\n * `packages/block-form/src/widgets/constants.ts`\n *\n * Duplicated here to avoid circular dependency (blocks cannot import block-form).\n */\nconst BACKGROUND_WIDGETS = {\n COLOR: 'backgroundColor',\n GRADIENT: 'backgroundGradient',\n} as const\n\ntype BackgroundFieldOptions = {\n id?: string\n label?: string\n allowColor?: boolean\n allowGradient?: boolean\n allowImage?: boolean\n includeAdvanced?: boolean\n}\n\n/**\n * Creates a TabGroupField for background configuration\n * with Color/Gradient/Image tabs and advanced image options.\n *\n * ## Data Structure\n *\n * This factory sets `activeTabField: 'type'`. The 'type' field is NOT explicitly\n * declared but is managed implicitly by TabGroupField. When the user switches tabs,\n * the widget writes the tab ID to the path `{id}.type`.\n *\n * The stored data structure is:\n * ```typescript\n * {\n * type: 'color' | 'gradient' | 'image', // Managed by TabGroupField\n * color?: string, // From Color tab\n * gradient?: string, // From Gradient tab (CSS value)\n * image?: MediaReference, // From Image tab\n * objectFit?: 'fill' | 'fit' | 'original' | 'custom',\n * scale?: string,\n * position?: string,\n * opacity?: number,\n * overlay?: { // Image overlay (when includeAdvanced)\n * type: 'color' | 'gradient' | 'none',\n * color?: string, // Token or hex\n * gradient?: string, // CSS gradient\n * opacity?: number, // 0-100\n * },\n * }\n * ```\n *\n * ## SDK Filtering\n *\n * Each tab has an `sdkSectionOption` that allows SDK sites to control tab visibility:\n * - `backgroundColor` - Controls Color tab\n * - `backgroundGradient` - Controls Gradient tab\n * - `backgroundImage` - Controls Image tab\n *\n * @param options - Configuration options\n * @param options.id - Field ID (default: 'background')\n * @param options.label - Field label (default: 'Background')\n * @param options.allowColor - Include Color tab (default: true)\n * @param options.allowGradient - Include Gradient tab (default: true)\n * @param options.allowImage - Include Image tab (default: true)\n * @param options.includeAdvanced - Include advanced image options (default: false)\n */\nexport function createBackgroundField(options: BackgroundFieldOptions = {}): TabGroupFieldDefinition {\n const {\n id = 'background',\n label = 'Background',\n allowColor = true,\n allowGradient = true,\n allowImage = true,\n includeAdvanced = false,\n } = options\n\n const tabs: TabDefinition[] = []\n\n const textColorField: FieldDefinition = {\n id: 'textColor',\n type: 'text' as const,\n label: 'Text color',\n description: 'Optional text color token to use on top of this background.',\n required: false,\n multiline: false,\n ui: {\n widget: BACKGROUND_WIDGETS.COLOR,\n },\n }\n\n const headingColorField: FieldDefinition = {\n id: 'headingColor',\n type: 'text' as const,\n label: 'Heading color',\n description: 'Optional color token for headings. Falls back to text color if not set.',\n required: false,\n multiline: false,\n ui: {\n widget: BACKGROUND_WIDGETS.COLOR,\n },\n }\n\n // Color tab\n if (allowColor) {\n tabs.push({\n id: 'color',\n label: 'Color',\n description: 'Solid color background using theme tokens or custom colors',\n sdkSectionOption: 'backgroundColor',\n fields: [\n {\n id: 'color',\n type: 'text' as const,\n label: 'Color',\n description: 'Select a background color from the available options.',\n required: false,\n multiline: false,\n ui: {\n widget: BACKGROUND_WIDGETS.COLOR,\n },\n },\n textColorField,\n headingColorField,\n ],\n })\n }\n\n // Gradient tab\n if (allowGradient) {\n tabs.push({\n id: 'gradient',\n label: 'Gradient',\n description: 'CSS gradient background',\n sdkSectionOption: 'backgroundGradient',\n fields: [\n {\n id: 'gradient',\n type: 'text' as const,\n label: 'Gradient',\n description: 'Select a gradient from theme presets.',\n required: false,\n multiline: false,\n ui: {\n widget: BACKGROUND_WIDGETS.GRADIENT,\n },\n },\n textColorField,\n headingColorField,\n ],\n })\n }\n\n // Image tab\n if (allowImage) {\n const imageFields: FieldDefinition[] = [\n {\n id: 'image',\n type: 'media' as const,\n label: 'Image',\n mediaKinds: ['image'],\n required: false,\n },\n textColorField,\n headingColorField,\n ]\n\n // Advanced image options\n if (includeAdvanced) {\n const objectFitField: FieldDefinition = {\n id: 'objectFit',\n type: 'select',\n label: 'Image Sizing',\n description: 'How the image should be sized and positioned.',\n required: false,\n multiple: false,\n options: [\n { value: 'fill', label: 'Fill (cover)' },\n { value: 'fit', label: 'Fit (contain)' },\n { value: 'original', label: 'Original size' },\n { value: 'custom', label: 'Scale up' },\n ],\n }\n\n const scaleField: FieldDefinition = {\n id: 'scale',\n type: 'presetOrCustom',\n label: 'Scale',\n description: 'Image scale amount.',\n required: false,\n ui: {\n visibleWhen: {\n field: 'objectFit',\n equals: 'custom',\n },\n },\n presets: [\n { value: '125', label: '125%' },\n { value: '150', label: '150%' },\n { value: '175', label: '175%' },\n { value: '200', label: '200%' },\n ],\n customInput: {\n placeholder: 'e.g., 800px, 50vw, 175%',\n helpText: 'Enter a custom size using %, px, vh, vw, rem, or em units',\n },\n }\n\n const positionField: FieldDefinition = {\n id: 'position',\n type: 'presetOrCustom',\n label: 'Position',\n description: 'Anchor point for scaled images. For \"Fill\" mode, the image focus point (if set) takes precedence.',\n required: false,\n presets: [...BACKGROUND_POSITION_PRESETS],\n customInput: {\n placeholder: 'e.g., 25% 75%, top 20px left 50px',\n helpText: 'Enter a custom CSS background-position value',\n },\n }\n\n const opacityField: FieldDefinition = {\n id: 'opacity',\n type: 'number',\n label: 'Opacity',\n description: 'Image opacity (0-100).',\n required: false,\n ui: {\n widget: 'slider',\n min: 0,\n max: 100,\n step: 5,\n },\n }\n\n // Overlay fields - for adding color/gradient overlay on top of image\n const overlayTypeField: FieldDefinition = {\n id: 'overlay.type',\n type: 'select',\n label: 'Overlay',\n description: 'Add a color or gradient overlay on top of the image.',\n required: false,\n multiple: false,\n options: [\n { value: 'none', label: 'None' },\n { value: 'color', label: 'Color' },\n { value: 'gradient', label: 'Gradient' },\n ],\n }\n\n const overlayColorField: FieldDefinition = {\n id: 'overlay.color',\n type: 'text' as const,\n label: 'Overlay color',\n required: false,\n multiline: false,\n ui: {\n widget: BACKGROUND_WIDGETS.COLOR,\n // 'type' not 'overlay.type' - fields are siblings under overlay.*\n visibleWhen: { field: 'type', equals: 'color' },\n },\n }\n\n const overlayGradientField: FieldDefinition = {\n id: 'overlay.gradient',\n type: 'text' as const,\n label: 'Overlay gradient',\n required: false,\n multiline: false,\n ui: {\n widget: BACKGROUND_WIDGETS.GRADIENT,\n // 'type' not 'overlay.type' - fields are siblings under overlay.*\n visibleWhen: { field: 'type', equals: 'gradient' },\n },\n }\n\n const overlayOpacityField: FieldDefinition = {\n id: 'overlay.opacity',\n type: 'number',\n label: 'Overlay opacity',\n description: 'Overlay opacity (0-100).',\n required: false,\n ui: {\n widget: 'slider',\n min: 0,\n max: 100,\n step: 5,\n // 'type' not 'overlay.type' - fields are siblings under overlay.*\n visibleWhen: { field: 'type', oneOf: ['color', 'gradient'] },\n },\n }\n\n imageFields.push(\n objectFitField,\n scaleField,\n positionField,\n opacityField,\n overlayTypeField,\n overlayColorField,\n overlayGradientField,\n overlayOpacityField\n )\n }\n\n tabs.push({\n id: 'image',\n label: 'Image',\n description: includeAdvanced\n ? 'Background image with advanced controls'\n : 'Background image',\n sdkSectionOption: 'backgroundImage',\n fields: imageFields,\n })\n }\n\n return {\n id,\n type: 'tabGroup' as const,\n label,\n required: false,\n tabs,\n activeTabField: 'type',\n ui: {\n hideLabel: false,\n },\n } satisfies TabGroupFieldDefinition\n}\n","import type { FieldDefinition, ModalFieldDefinition } from '../manifest/schema'\nimport type { Media } from '../../lib/media'\nimport { createBackgroundField } from './background'\n\n/**\n * Options for customizing a section styles field.\n */\ntype SectionStylesOptions = {\n /** Field ID (default: '_sectionStyles') */\n id?: string\n /** Field label (default: 'Section styles') */\n label?: string\n /** Whether to include background field (default: true) */\n includeBackground?: boolean\n /** Whether to render in block header (default: true) */\n renderInHeader?: boolean\n}\n\n/**\n * Options for customizing a container styles field.\n */\ntype BoxStylesUiOptions = {\n /** Whether to render in block header */\n renderInHeader?: boolean\n /** Field intent for editor grouping */\n intent?: 'content' | 'display' | 'behavior' | 'style'\n}\n\ntype ContainerStylesOptions = {\n /** Field ID (default: '_containerStyles') */\n id?: string\n /** Field label (default: 'Container styles') */\n label?: string\n /** Whether to include background field (default: true) */\n includeBackground?: boolean\n} & BoxStylesUiOptions\n\n/**\n * Options for customizing a card styles field.\n */\ntype CardStylesOptions = {\n /** Field ID (default: '_cardStyles') */\n id?: string\n /** Field label (default: 'Card styles') */\n label?: string\n /** Whether to include background field (default: true) */\n includeBackground?: boolean\n} & BoxStylesUiOptions\n\n/**\n * Content type for section styles field (_sectionStyles).\n * Use this in block content types to get proper typing for section styling.\n *\n * @example\n * ```typescript\n * import type { SectionStylesContent } from '../fields/boxStyles'\n *\n * export type MyBlockContent = {\n * heading?: string | null\n * _sectionStyles?: SectionStylesContent\n * }\n * ```\n */\nexport type SectionStylesContent = {\n background?: {\n type?: 'color' | 'gradient' | 'image'\n color?: string | null\n /** CSS gradient string (e.g., \"linear-gradient(...)\") */\n gradient?: string | null\n image?: Media | null\n objectFit?: 'fill' | 'fit' | 'original' | 'custom' | null\n scale?: string | null\n position?: string | null\n opacity?: number | null\n overlay?: {\n type?: 'none' | 'color' | 'gradient' | null\n color?: string | null\n /** CSS gradient string (e.g., \"linear-gradient(...)\") */\n gradient?: string | null\n opacity?: number | null\n } | null\n textColor?: string | null\n /** Optional color token for headings. Falls back to textColor if not set. */\n headingColor?: string | null\n } | null\n spacing?: string | null\n} | null\n\nexport type CardStylesContent = {\n background?: Record<string, unknown> | null\n border?: {\n enabled?: boolean | null\n width?: 'none' | '1' | '2' | '3' | null\n colorToken?: string | null\n } | null\n spacing?: string | null\n raised?: boolean | null\n rounded?: string | null\n} | null\n\nexport type ContainerStylesContent = {\n background?: Record<string, unknown> | null\n spacing?: string | null\n raised?: boolean | null\n rounded?: string | null\n fullWidth?: boolean | null\n} | null\n\n/**\n * Internal discriminator for box style types.\n * @internal\n */\ntype BoxStyleType = 'container' | 'card'\n\n/**\n * Internal helper to create box styles with depth (container or card).\n *\n * Both containers and cards support:\n * - Background (color/gradient/image with advanced options)\n * - Inner spacing (padding)\n * - Raised (elevation shadow)\n * - Rounded corners (border radius)\n *\n * This function is used internally by `containerStylesField()` and `cardStylesField()`\n * to avoid code duplication while maintaining separate public APIs.\n *\n * @internal\n * @param type - Box style type discriminator ('container' or 'card')\n * @param options - Customization options passed from public field helpers\n * @returns A modal FieldDefinition with depth-specific fields\n */\nfunction createBoxStylesFieldWithDepth(\n type: BoxStyleType,\n options: ContainerStylesOptions | CardStylesOptions = {}\n): ModalFieldDefinition {\n const defaults = {\n container: {\n id: '_containerStyles',\n label: 'Container styles',\n contextName: 'container',\n },\n card: {\n id: '_cardStyles',\n label: 'Card styles',\n contextName: 'card',\n },\n }\n\n const {\n id = defaults[type].id,\n label = defaults[type].label,\n includeBackground = true,\n renderInHeader,\n intent,\n } = options\n\n const contextName = defaults[type].contextName\n const fields: FieldDefinition[] = []\n\n // Background (color/gradient/image with advanced options)\n if (includeBackground) {\n fields.push(\n createBackgroundField({\n id: 'background',\n label: 'Background',\n allowColor: true,\n allowGradient: true,\n allowImage: true,\n includeAdvanced: true,\n }),\n )\n }\n\n // Horizontal + vertical spacing\n fields.push({\n id: 'spacing',\n type: 'select',\n label: 'Inner spacing',\n description: `Padding for the ${contextName}.`,\n required: false,\n multiple: false,\n options: [\n { value: 'none', label: 'None' },\n { value: 'compact', label: 'Compact' },\n { value: 'cozy', label: 'Cozy' },\n { value: 'medium', label: 'Medium' },\n { value: 'comfortable', label: 'Comfortable' },\n { value: 'spacious', label: 'Spacious' },\n ],\n })\n\n // Border control (cards only; containers inherit from theme or container usage)\n if (type === 'card') {\n fields.push({\n id: 'border',\n type: 'group',\n label: 'Border',\n required: false,\n schema: {\n fields: [\n {\n id: 'enabled',\n type: 'boolean',\n label: 'Show border',\n description: 'When unset, the card inherits its border from the block/theme defaults.',\n required: false,\n },\n {\n id: 'width',\n type: 'select',\n label: 'Border width',\n required: false,\n multiple: false,\n options: [\n { value: 'none', label: 'None' },\n { value: '1', label: 'Thin (1px)' },\n { value: '2', label: 'Medium (2px)' },\n { value: '3', label: 'Thick (3px)' },\n ],\n ui: {\n visibleWhen: { field: 'enabled', equals: true },\n },\n },\n {\n id: 'colorToken',\n type: 'text',\n label: 'Border color token',\n description: 'Theme token for the border color (e.g. border, primary/30).',\n required: false,\n multiline: false,\n defaultValue: 'border',\n ui: {\n visibleWhen: { field: 'enabled', equals: true },\n },\n },\n ],\n },\n })\n }\n\n // Raised toggle (applies theme shadow)\n fields.push({\n id: 'raised',\n type: 'boolean',\n label: 'Raised',\n description: `Add shadow depth to the ${contextName}.`,\n required: false,\n })\n\n // Rounded corners\n fields.push({\n id: 'rounded',\n type: 'select',\n label: 'Rounded corners',\n description: 'Border radius size.',\n required: false,\n multiple: false,\n options: [\n { value: 'none', label: 'None' },\n { value: 'sm', label: 'Small' },\n { value: 'md', label: 'Medium' },\n { value: 'lg', label: 'Large' },\n { value: 'xl', label: 'Extra Large' },\n { value: '2xl', label: 'Extra Extra Large' },\n { value: 'full', label: 'Fully Rounded' },\n ],\n })\n\n // Full-width toggle (only for containers, not cards)\n if (type === 'container') {\n fields.push({\n id: 'fullWidth',\n type: 'boolean',\n label: 'Full width',\n description: 'Extend content edge-to-edge (removes container max-width and all horizontal padding).',\n required: false,\n defaultValue: false,\n })\n }\n\n return {\n id,\n type: 'modal',\n label,\n required: false,\n schema: { fields },\n ui: {\n ...(typeof renderInHeader === 'boolean' ? { renderInHeader } : {}),\n ...(intent ? { intent } : {}),\n modalConfig: {\n buttonLabel: label,\n description: `Configure background, spacing, elevation, and rounded corners for the ${contextName}.`,\n buttonVariant: 'outline' as const,\n showCustomizedIndicator: true,\n },\n },\n }\n}\n\n/**\n * Creates a modal field group for styling full-width sections.\n *\n * Section styles include:\n * - Background (color/gradient/image with advanced options)\n * - Inner spacing (vertical padding)\n *\n * Sections are full-width wrappers that span the entire viewport, so they don't\n * support rounded corners or elevation shadows (unlike containers and cards).\n *\n * Use with the `backgroundLayer()` helper to render backgrounds in the block layout.\n *\n * @param options - Customization options for the field\n * @param options.id - Field ID (default: '_sectionStyles')\n * @param options.label - Field label (default: 'Section styles')\n * @param options.includeBackground - Whether to include background field (default: true)\n * @returns A modal FieldDefinition that can be added to a block's fields array\n *\n * @example\n * // Basic usage in a block\n * const fields = [\n * // ... other fields\n * sectionStylesField({\n * id: '_sectionStyles',\n * label: 'Section styles',\n * }),\n * ]\n *\n * @example\n * // In the layout, use backgroundLayer() to render\n * const layout = section(\n * { background: 'background' },\n * [\n * ...backgroundLayer('_sectionStyles.background'),\n * sectionContainer([])\n * ]\n * )\n *\n * @see {@link containerStylesField} for constrained-width containers with elevation\n * @see {@link cardStylesField} for repeater items with elevation\n * @see {@link backgroundLayer} for rendering backgrounds in layouts\n */\nexport function sectionStylesField(options: SectionStylesOptions = {}): ModalFieldDefinition {\n const {\n id = '_sectionStyles',\n label = 'Section styles',\n includeBackground = true,\n renderInHeader = true,\n } = options\n\n const fields: FieldDefinition[] = []\n\n // Background (color/gradient/image with advanced options)\n if (includeBackground) {\n fields.push(\n createBackgroundField({\n id: 'background',\n label: 'Background',\n allowColor: true,\n allowGradient: true,\n allowImage: true,\n includeAdvanced: true,\n }),\n )\n }\n\n // Vertical spacing (maps to theme spacing tokens)\n fields.push({\n id: 'spacing',\n type: 'select',\n label: 'Inner spacing',\n description: 'Vertical padding for the section.',\n required: false,\n multiple: false,\n options: [\n { value: 'none', label: 'None' },\n { value: 'compact', label: 'Compact' },\n { value: 'cozy', label: 'Cozy' },\n { value: 'medium', label: 'Medium' },\n { value: 'comfortable', label: 'Comfortable' },\n { value: 'spacious', label: 'Spacious' },\n ],\n })\n\n return {\n id,\n type: 'modal',\n label,\n required: false,\n schema: { fields },\n ui: {\n // Render in block header instead of form body\n renderInHeader,\n intent: 'style',\n modalConfig: {\n buttonLabel: label,\n description: 'Configure background and spacing for this section.',\n buttonVariant: 'outline' as const,\n showCustomizedIndicator: true,\n },\n },\n }\n}\n\n/**\n * Creates a modal field group for styling constrained-width containers.\n *\n * Container styles include:\n * - Background (color/gradient/image with advanced options)\n * - Inner spacing (padding)\n * - Raised (elevation shadow for visual depth)\n * - Rounded corners (border radius)\n *\n * Containers have constrained width (max-w-*) and are centered within their parent.\n * Use for content areas that need visual separation or elevation from the page background.\n *\n * @param options - Customization options for the field\n * @param options.id - Field ID (default: '_containerStyles')\n * @param options.label - Field label (default: 'Container styles')\n * @param options.includeBackground - Whether to include background field (default: true)\n * @returns A modal FieldDefinition that can be added to a block's fields array\n *\n * @example\n * // Basic usage in a block\n * const fields = [\n * // ... other fields\n * containerStylesField({\n * id: '_containerStyles',\n * label: 'Container styles',\n * }),\n * ]\n *\n * @see {@link sectionStylesField} for full-width sections\n * @see {@link cardStylesField} for repeater items with the same styling options\n * @see {@link backgroundLayer} for rendering backgrounds in layouts\n */\nexport function containerStylesField(options: ContainerStylesOptions = {}): ModalFieldDefinition {\n return createBoxStylesFieldWithDepth('container', options)\n}\n\n/**\n * Creates a modal field group for styling individual cards in repeaters.\n *\n * Card styles include:\n * - Background (color/gradient/image with advanced options)\n * - Inner spacing (padding)\n * - Raised (elevation shadow for visual depth)\n * - Rounded corners (border radius)\n *\n * Cards are used in repeaters (e.g., columns, grids, carousels) and have the same\n * styling options as containers. Each card instance can be styled independently.\n *\n * **Important:** When used in fragments (not blocks), the field ID must start with\n * a letter (e.g., 'styles', 'cardStyles') - do NOT use a leading underscore like '_cardStyles'.\n *\n * @param options - Customization options for the field\n * @param options.id - Field ID (default: '_cardStyles' for blocks, 'styles' recommended for fragments)\n * @param options.label - Field label (default: 'Card styles')\n * @param options.includeBackground - Whether to include background field (default: true)\n * @returns A modal FieldDefinition that can be added to a block or fragment's fields array\n *\n * @example\n * // In a fragment (e.g., card.ts)\n * const cardFragment = defineFragment({\n * id: 'card',\n * fields: [\n * { id: 'title', type: 'text', label: 'Title' },\n * { id: 'body', type: 'richText', label: 'Body' },\n * cardStylesField({\n * id: 'styles', // No leading underscore for fragments!\n * label: 'Card styles',\n * }),\n * ],\n * layout: stack({ gap: 'md' }, [\n * text({ as: 'h3' }, bind('title')),\n * richText({}, bind('body')),\n * ]),\n * })\n *\n * @example\n * // In a block\n * const fields = [\n * // ... other fields\n * cardStylesField({\n * id: '_cardStyles', // Can use underscore in blocks\n * label: 'Card styles',\n * }),\n * ]\n *\n * @see {@link sectionStylesField} for full-width sections\n * @see {@link containerStylesField} for constrained-width containers\n * @see {@link backgroundLayer} for rendering backgrounds in layouts\n */\nexport function cardStylesField(options: CardStylesOptions = {}): ModalFieldDefinition {\n return createBoxStylesFieldWithDepth('card', options)\n}\n","import type { BlockManifest, BlockCategory, FieldDefinition, StyleTokenConfig, BehaviourConfig } from './manifest/schema';\nimport { parseFieldDefinitions } from './manifest/schema';\nimport type { NodeDefinition } from './node';\nimport { composeFragments, type FragmentDefinition } from './fragments';\nimport { containerStylesField, sectionStylesField } from './fields/boxStyles';\nimport { augmentManifest } from './manifest/augmentManifest';\n\n/**\n * Configuration for defining a block using the defineBlock helper.\n * Provides smart defaults and handles fragment composition automatically.\n */\nexport type BlockConfig = {\n // Required fields\n /** Block identifier (e.g., 'block.hero') */\n id: string;\n /** Manifest version (defaults to '0.1.0' for system blocks) */\n version?: string;\n /** Human-readable title (e.g., 'Hero') */\n title: string;\n /** Block category for organization */\n category: BlockCategory;\n\n // Fragment composition (auto-handles field assembly)\n /** Fragments to compose into this block */\n fragments?: Array<{\n fragment: FragmentDefinition;\n fieldPriority?: number;\n scope?: string;\n dataKey?: string;\n }>;\n\n // Layout definition\n /** Block layout (NodeDefinition or array) */\n layout: NodeDefinition | NodeDefinition[];\n\n // Optional: variants\n /** Layout variants (e.g., { classic: layout1, minimal: layout2 }) */\n variants?: Record<string, NodeDefinition>;\n /** Default variant key */\n defaultVariant?: string;\n /**\n * Variant metadata for editor UI.\n * Allows overriding auto-generated labels and optionally providing a description/icon.\n */\n variantOptions?: Record<string, { label?: string; description?: string; icon?: string }>;\n\n // Optional: additional fields beyond fragments\n /** Additional fields to include (fragments are added automatically) */\n additionalFields?: FieldDefinition[];\n\n /**\n * Optional list of nested field paths to surface in the main form body as shortcuts.\n * These paths must already exist in the block's data shape (no data duplication).\n *\n * Example: `['_sectionStyles.background.image']`\n */\n promotedFields?: string[];\n\n // Optional: skip section styles field\n /** If true, don't automatically add sectionStylesField */\n skipSectionStyles?: boolean;\n\n /**\n * If true, add `_containerStyles` to the block settings (style tab).\n * This enables contained/inner backgrounds via `styledContainer()`.\n */\n includeContainerStyles?: boolean;\n\n // Optional: overrides for defaults\n /** Block description */\n description?: string;\n /** Field ID to use as block title in lists (e.g., 'headline') */\n titleSource?: string;\n /** Search/filter tags */\n tags?: string[];\n /** Icon name (Lucide icon) */\n icon?: string;\n /** Style token mappings */\n styleTokens?: StyleTokenConfig;\n /** Behavior flags */\n behaviours?: BehaviourConfig;\n /** Hide from block picker palettes */\n paletteHidden?: boolean;\n /** Block manages its own wrapper (for sticky/fixed positioning) */\n managesOwnWrapper?: boolean;\n /** Content types this block is compatible with */\n contentTypes?: string[];\n};\n\n/**\n * Create a block manifest with smart defaults and automatic fragment composition.\n *\n * This helper reduces block definition boilerplate by:\n * - Composing fragments and managing field priorities automatically\n * - Adding section styles field by default\n * - Providing sensible defaults for manifest properties\n * - Auto-deriving component names from block IDs\n * - Handling manifest augmentation (variant selector, etc.)\n *\n * @example\n * ```typescript\n * export const heroManifest = createBlockManifest({\n * id: 'block.hero',\n * title: 'Hero',\n * category: 'layout',\n * fragments: [\n * { fragment: heroCopyFragment, priority: 0 },\n * { fragment: ctaRowFragment, priority: 2 },\n * ],\n * layout: styledSection({\n * children: sectionContainer(nodes, { gap: 'md' }),\n * }),\n * tags: ['header', 'banner', 'landing'],\n * icon: 'Sparkles',\n * });\n * ```\n */\nexport function createBlockManifest(config: BlockConfig): BlockManifest {\n // 1. Compose fragments + section styles\n const composition = config.fragments ? composeFragments(config.fragments) : { fields: [], layout: [], data: [], scopes: [] };\n\n const allFields: FieldDefinition[] = [\n ...composition.fields,\n ...(config.additionalFields ?? []),\n ];\n\n // Add container styles field when a block opts in to contained backgrounds.\n // Insert before _sectionStyles so section styles remains the last field.\n if (config.includeContainerStyles) {\n allFields.push(\n containerStylesField({\n id: '_containerStyles',\n label: 'Container styles',\n renderInHeader: true,\n intent: 'style',\n }),\n );\n }\n\n // Add section styles field unless explicitly skipped\n // This allows users to customize section spacing and background via the editor.\n // Even when auto-added, blocks get sensible defaults via the transform's defaultSpacing option.\n // The pattern:\n // 1. Block defines layout with styledSection({ spacing: 'medium' })\n // 2. createBlockManifest auto-adds _sectionStyles field (unless skipSectionStyles: true)\n // 3. Transform uses defaultSpacing when _sectionStyles.spacing is undefined\n // 4. Users can override spacing via the editor if needed\n if (!config.skipSectionStyles) {\n allFields.push(\n sectionStylesField({\n id: '_sectionStyles',\n label: 'Section styles',\n }),\n );\n }\n\n const fields = parseFieldDefinitions(allFields);\n\n // 2. Build layout (with variants if provided)\n const layout = config.layout;\n const variants = config.variants;\n\n // 3. Build behaviours object (from explicit config or shortcut flags)\n let behaviours: BehaviourConfig | undefined = config.behaviours;\n if (!behaviours && (config.paletteHidden !== undefined || config.managesOwnWrapper !== undefined)) {\n behaviours = {\n supportsThemeSwitching: true,\n inlineEditing: true,\n animation: true,\n paletteHidden: config.paletteHidden ?? false,\n managesOwnWrapper: config.managesOwnWrapper ?? false,\n };\n }\n\n // 4. Apply defaults and create manifest\n const manifest: BlockManifest = {\n name: config.id,\n version: config.version ?? '0.1.0',\n title: config.title,\n titleSource: config.titleSource,\n description: config.description ?? '',\n component: deriveComponentName(config.id),\n fields,\n slots: [], // Always empty\n styleTokens: config.styleTokens,\n behaviours,\n category: config.category,\n contentTypes: config.contentTypes,\n tags: config.tags ?? [],\n icon: config.icon ?? 'Box',\n layout,\n variants,\n defaultVariant: config.defaultVariant,\n variantOptions: config.variantOptions,\n promotedFields: config.promotedFields,\n };\n\n // 5. Augment manifest (adds variant selector field, etc.)\n return augmentManifest(manifest);\n}\n\n/**\n * Derive component name from block ID.\n *\n * Converts block IDs to component names by:\n * 1. Removing the 'block.' prefix\n * 2. Converting kebab-case and camelCase to dot.notation\n * 3. Adding '.default' suffix\n *\n * Examples:\n * - 'block.hero' → 'hero.default'\n * - 'block.cta-full' → 'cta.full.default'\n * - 'block.site-header' → 'site.header.default'\n */\nfunction deriveComponentName(id: string): string {\n // Remove 'block.' prefix\n const base = id.replace(/^block\\./, '');\n\n // Convert kebab-case to dot.separated first:\n // cta-full → cta.full\n // site-header → site.header\n //\n // Then convert camelCase to dot.separated:\n // ctaFull → cta.full\n // siteHeader → site.header\n const dotSeparated = base\n .replace(/-/g, '.')\n .replace(/([a-z])([A-Z])/g, '$1.$2')\n .toLowerCase();\n\n // Always add .default suffix for consistency\n return `${dotSeparated}.default`;\n}\n","import type { Media } from \"../../lib/media\";\nimport type { NodeDefinition } from \"../node\";\nimport type { SystemBlockDefinition } from \"../registry\";\nimport type { BlockManifest } from \"../manifest/schema\";\nimport type { ContainerStylesContent, SectionStylesContent } from \"../fields/boxStyles\";\nimport type { LinkValue } from \"../types/link\";\nimport type { CtaIconName } from \"../icons/cta\";\nimport { styledContainer } from \"../node/fragments\";\nimport { styledSection } from \"../node/fragments/styledSection\";\nimport { createBlockManifest } from \"../defineBlock\";\nimport { stack } from \"../node/builder\";\nimport {\n composeFragments,\n heroCopyFragment,\n heroCtaRowFragment,\n heroLayoutControlsFragment,\n} from \"../fragments\";\n\n// Compose fragments to get layout nodes\nconst heroCopyAndCta = composeFragments([\n { fragment: heroCopyFragment },\n { fragment: heroCtaRowFragment },\n]);\n\nconst heroContentNodes = heroCopyAndCta.layout;\n\nfunction heroContainerStack(children: NodeDefinition[], gap: \"sm\" | \"md\"): NodeDefinition {\n return styledContainer({\n rootType: \"stack\",\n rootProps: {\n gap: \"none\",\n justify: {\n $bind: {\n from: \"content\",\n transforms: [{ id: \"ui.heroStackJustifyFromVerticalAlignment\" }],\n fallback: \"start\",\n },\n },\n },\n children: stack(\n {\n gap,\n className: {\n $bind: {\n from: \"content\",\n transforms: [\n {\n id: \"ui.heroContentWrapperClass\",\n options: { base: \"rb-w-full\" },\n },\n ],\n fallback: \"rb-w-full rb-text-center\",\n },\n },\n },\n children,\n ),\n });\n}\n\n// Variant: Classic (centered, full padding - current default)\nconst classicLayout: NodeDefinition = styledSection({\n children: heroContainerStack(heroContentNodes, \"md\"),\n // styledContainer (rb-container) already provides horizontal padding\n baseClass: \"\",\n});\n\n// Variant: Micro (compact with reduced padding)\nconst microLayout: NodeDefinition = styledSection({\n children: heroContainerStack(heroContentNodes, \"sm\"),\n // styledContainer (rb-container) already provides horizontal padding\n baseClass: \"\",\n spacing: \"compact\",\n});\n\n/**\n * Shared split layout for both split and splitReverse variants.\n * Both variants use the same structure (two-column grid with text on left).\n * The background image is rendered as an absolute-positioned layer,\n * so there's no visual difference between split/splitReverse currently.\n */\nconst splitLayoutBase: NodeDefinition = styledSection({\n children: styledContainer({\n children: {\n type: \"grid\",\n props: {\n cols: { base: 1, md: 2 },\n gap: \"lg\",\n className: {\n $bind: {\n from: \"content\",\n transforms: [\n {\n id: \"ui.heroGridClassFromVerticalAlignment\",\n options: { base: \"rb-mx-auto rb-max-w-7xl\" },\n },\n ],\n fallback: \"rb-mx-auto rb-max-w-7xl rb-items-center\",\n },\n },\n },\n children: [\n {\n type: \"stack\",\n gap: \"md\",\n className: {\n $bind: {\n from: \"content\",\n transforms: [\n {\n id: \"ui.heroContentWrapperClass\",\n options: { base: \"rb-w-full\" },\n },\n ],\n fallback: \"rb-w-full rb-text-left\",\n },\n },\n children: heroContentNodes,\n },\n ],\n },\n }),\n // styledContainer (rb-container) provides horizontal padding\n baseClass: \"\",\n});\n\n// Variant: Split (two-column with text on left)\n// Note: Currently identical to splitReverse since media is absolute-positioned\nconst splitLayout: NodeDefinition = splitLayoutBase;\n\n// Variant: Split-reverse (two-column with text on left)\n// Note: Currently identical to split since media is absolute-positioned\nconst splitReverseLayout: NodeDefinition = splitLayoutBase;\n\nexport const heroManifest: BlockManifest = createBlockManifest({\n id: \"block.hero\",\n title: \"Hero\",\n titleSource: \"headline\",\n category: \"layout\",\n includeContainerStyles: true,\n promotedFields: [\"_sectionStyles.background.image\"],\n\n fragments: [\n { fragment: heroCopyFragment, fieldPriority: 0 },\n { fragment: heroLayoutControlsFragment, fieldPriority: 1 },\n { fragment: heroCtaRowFragment, fieldPriority: 2 },\n ],\n\n layout: classicLayout,\n\n variants: {\n classic: classicLayout,\n micro: microLayout,\n split: splitLayout,\n splitReverse: splitReverseLayout,\n },\n defaultVariant: \"classic\",\n\n description: \"Hero section with headline, subtitle, and repeatable CTAs.\",\n tags: [\"header\", \"banner\", \"landing\", \"introduction\", \"welcome\", \"splash\", \"headline\"],\n icon: \"Sparkles\",\n styleTokens: {\n typography: \"display\",\n spacing: \"xl\",\n },\n});\n\nexport type HeroManifest = typeof heroManifest;\n\nexport type HeroCta = {\n label: string;\n link: LinkValue;\n /** Button variant ID - matches theme.buttons.variants[].id */\n variant?: string;\n /** Button size ID - matches theme.buttons.sizes */\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n iconLeft?: CtaIconName | null;\n iconRight?: CtaIconName | null;\n};\n\nexport type HeroCtaInput = Partial<HeroCta>;\n\nexport type HeroContent = {\n eyebrow?: string;\n headline: string;\n subheadline?: string;\n contentAlignment?: \"left\" | \"center\" | \"right\";\n verticalAlignment?: \"top\" | \"center\" | \"bottom\";\n contentMaxWidth?: \"default\" | \"narrow\" | \"medium\" | \"wide\";\n _sectionStyles?: SectionStylesContent;\n _containerStyles?: ContainerStylesContent;\n ctas?: HeroCtaInput[];\n};\n\nexport type HeroMedia = Media;\n\nexport const heroBlockDefinition: SystemBlockDefinition<HeroContent> = {\n manifest: heroManifest,\n};\n","import type { BlockManifest } from \"../manifest\";\nimport type { TipTapNode } from \"../manifest/richTextSchema\";\nimport type { SystemBlockDefinition } from \"../registry\";\nimport { styledSection } from \"../node/fragments/styledSection\";\nimport { createBlockManifest } from \"../defineBlock\";\nimport { bodyCopyFragment, composeFragments } from \"../fragments\";\nimport { stack } from \"../node/builder\";\n\n// Compose fragments to get layout nodes\nconst bodyCopyComposition = composeFragments([{ fragment: bodyCopyFragment }]);\n\n// Prose: content inside rb-container for consistent left-edge alignment with other blocks.\n// We remove the section's horizontal padding (baseClass: '') since rb-container provides its own.\nconst proseLayout = styledSection({\n children: stack({ className: \"rb-container\" }, bodyCopyComposition.layout),\n spacing: \"medium\",\n baseClass: \"\",\n});\n\n// Intro: centered content without rb-container wrapper.\n// Uses section's horizontal padding and CSS centers the body-copy-container.\nconst introLayout = styledSection({\n children: stack({ className: \"rb-container\" }, bodyCopyComposition.layout),\n spacing: \"medium\",\n baseClass: \"\",\n});\n\n// Narrow: left-aligned with shorter measure for lead paragraphs.\nconst narrowLayout = styledSection({\n children: stack({ className: \"rb-container\" }, bodyCopyComposition.layout),\n spacing: \"medium\",\n baseClass: \"\",\n});\n\nexport const bodyTextManifest: BlockManifest = createBlockManifest({\n id: \"block.body-text\",\n title: \"Body Text\",\n titleSource: \"heading\",\n category: \"content\",\n\n fragments: [\n { fragment: bodyCopyFragment, fieldPriority: 0 },\n ],\n\n layout: proseLayout,\n variants: {\n prose: proseLayout,\n intro: introLayout,\n narrow: narrowLayout,\n },\n defaultVariant: \"prose\",\n variantOptions: {\n prose: {\n label: \"Prose\",\n description: \"Long-form rich text for pages and posts.\",\n icon: \"Type\",\n },\n intro: {\n label: \"Intro\",\n description: \"Narrower, larger text for above-the-fold intros.\",\n icon: \"AlignCenter\",\n },\n narrow: {\n label: \"Narrow\",\n description: \"Left-aligned lead copy with a shorter max width.\",\n icon: \"AlignLeft\",\n },\n },\n\n description: \"Simple text block with optional heading and alignment controls.\",\n tags: [\"text\", \"paragraph\", \"content\", \"copy\", \"article\", \"writing\", \"rich-text\"],\n icon: \"Type\",\n styleTokens: {\n spacing: \"md\",\n },\n});\n\nexport type BodyTextManifest = typeof bodyTextManifest;\n\nexport type BodyTextAlignment = \"left\" | \"center\";\n\nexport type BodyTextContent = {\n variant?: \"prose\" | \"intro\" | \"narrow\" | null;\n heading?: string | null;\n body: TipTapNode;\n alignment?: BodyTextAlignment | null;\n};\n\nexport const bodyTextBlockDefinition: SystemBlockDefinition<BodyTextContent> = {\n manifest: bodyTextManifest,\n};\n","import { z } from \"zod\";\n\nimport type { BlockManifest } from \"../manifest/schema\";\nimport type { NodeDefinition } from \"../node\";\nimport type { SystemBlockDefinition } from \"../registry\";\nimport { section } from \"../node/builder\";\nimport {\n composeFragments,\n buildFragmentDataLoaders,\n blogFeaturedPostFragment,\n} from \"../fragments\";\nimport { createBlockManifest } from \"../defineBlock\";\n\nconst composition = composeFragments([{ fragment: blogFeaturedPostFragment }]);\n\nconst blogPostLayout: NodeDefinition = section(\n { background: \"background\", className: \"rb-px-6 rb-py-12\" },\n [...composition.layout],\n);\n\nexport const blogPostManifest: BlockManifest = createBlockManifest({\n id: \"block.blog-post\",\n version: \"0.1.0\",\n title: \"Blog post\",\n description: \"Highlights a single blog post with title, image, and excerpt.\",\n category: \"blog\",\n contentTypes: [\"post\"],\n tags: [\"blog\", \"post\", \"featured\", \"highlight\", \"article\", \"single\"],\n icon: \"FileText\",\n styleTokens: {\n background: \"surface\",\n typography: \"body\",\n spacing: \"md\",\n },\n behaviours: {\n supportsThemeSwitching: true,\n inlineEditing: false,\n animation: false,\n paletteHidden: false,\n },\n additionalFields: composition.fields,\n layout: blogPostLayout,\n});\n\nexport type BlogPostContent = {\n title?: string | null;\n postSlug?: string | null;\n};\n\nexport const blogPostDataSchema = z.object({\n id: z.string(),\n title: z.string(),\n slug: z.string(),\n path: z.string(),\n excerpt: z.string().nullable().optional(),\n image: z\n .object({\n url: z.string().optional().nullable(),\n alt: z.string().optional().nullable(),\n })\n .nullable()\n .optional(),\n publishedAt: z.string().nullable().optional(),\n});\n\nexport type BlogPostData = z.infer<typeof blogPostDataSchema>;\n\n// Component is provided by the default factory; view model is purely content + loader data\n\nexport const blogPostBlockDefinition: SystemBlockDefinition<BlogPostContent> = {\n manifest: blogPostManifest,\n dataSchemas: { post: blogPostDataSchema.optional() },\n dataLoaders: buildFragmentDataLoaders(composition),\n};\n","import { parseFieldDefinition } from \"../manifest/schema\";\nimport type { BlockManifest } from \"../manifest\";\nimport type { NodeDefinition } from \"../node\";\nimport {\n el,\n section,\n stack,\n text,\n bind,\n repeat,\n type NodeModifier,\n} from \"../node/builder\";\nimport type { SystemBlockDefinition } from \"../registry\";\nimport { createBlockManifest } from \"../defineBlock\";\nimport { captionText } from \"../node/fragments\";\nimport {\n backgroundColorStyle,\n borderColorStyle,\n textColorStyle,\n mergeStyles,\n} from \"../../theme/utils/colorStyles\";\n\ntype BlogPlaceholderCard = {\n title: string;\n summary: string;\n};\n\nexport type BlogPlaceholderContent = {\n eyebrow?: string | null;\n heading?: string | null;\n description?: string | null;\n cards?: BlogPlaceholderCard[];\n note?: string | null;\n};\n\nconst grid = (\n props?: Record<string, unknown> | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n) => el(\"grid\", props ?? undefined, children ?? undefined, ...mods);\n\nconst blogPlaceholderLayout: NodeDefinition = section(\n {\n background: \"surface\",\n className: \"rb-px-6 rb-py-16 rb-sm-py-20 rb-md-py-24\",\n }, // Semantic: comfortable + extra md padding\n [\n stack(\n {\n gap: \"sm\",\n align: \"center\",\n className: \"rb-mx-auto rb-max-w-3xl rb-text-center\",\n },\n [\n text(\n {\n as: \"p\",\n className: \"rb-eyebrow\",\n style: textColorStyle(\"mutedText\"),\n },\n bind(\"content.eyebrow\"),\n ),\n text(\n {\n as: \"h2\",\n style: textColorStyle(\"text\"),\n },\n bind(\"content.heading\"),\n ),\n text(\n {\n as: \"p\",\n style: textColorStyle(\"mutedText\"),\n },\n bind(\"content.description\"),\n ),\n ],\n ),\n grid(\n { className: \"rb-mt-10 rb-gap-6 rb-sm-grid-cols-2 rb-lg-grid-cols-3\" },\n [\n stack(\n {\n gap: \"sm\",\n className:\n \"rb-rounded-xl rb-border rb-p-6 rb-text-left rb-shadow-sm\",\n style: mergeStyles(\n borderColorStyle(\"border/60\"),\n backgroundColorStyle(\"background\"),\n ),\n },\n [\n text(\n {\n as: \"h3\",\n style: textColorStyle(\"text\"),\n },\n bind(\"item.title\"),\n ),\n text(\n {\n as: \"p\",\n className: \"rb-caption\",\n style: textColorStyle(\"mutedText\"),\n },\n bind(\"item.summary\"),\n ),\n ],\n repeat(\"content.cards\", \"item\", { limit: 6 }),\n ),\n ],\n ),\n stack(\n { gap: \"xs\", align: \"center\", className: \"rb-mt-10 rb-text-center\" },\n [\n captionText(null, bind(\"content.note\")),\n ],\n ),\n ],\n);\n\nexport const blogPlaceholderManifest: BlockManifest = createBlockManifest({\n id: \"block.blog-placeholder\",\n title: \"Blog placeholder\",\n category: \"blog\",\n\n // Skip section styles - this block has custom layout with fixed styling\n skipSectionStyles: true,\n\n // Custom fields for blog placeholder content\n additionalFields: [\n parseFieldDefinition({\n id: \"eyebrow\",\n type: \"text\",\n label: \"Eyebrow\",\n description: \"Short label displayed above the heading.\",\n }),\n parseFieldDefinition({\n id: \"heading\",\n type: \"text\",\n label: \"Heading\",\n required: true,\n }),\n parseFieldDefinition({\n id: \"description\",\n type: \"text\",\n label: \"Description\",\n multiline: true,\n }),\n parseFieldDefinition({\n id: \"cards\",\n type: \"repeater\",\n label: \"Placeholder cards\",\n itemLabel: \"Placeholder\",\n schema: {\n fields: [\n { id: \"title\", type: \"text\", label: \"Title\", required: true },\n {\n id: \"summary\",\n type: \"text\",\n label: \"Summary\",\n multiline: true,\n required: true,\n },\n ],\n },\n }),\n parseFieldDefinition({\n id: \"note\",\n type: \"text\",\n label: \"Footer note\",\n description: \"Optional helper text displayed below the cards.\",\n }),\n ],\n\n layout: blogPlaceholderLayout,\n\n description: \"Starter layout shown until real blog content replaces it.\",\n styleTokens: {\n background: \"surface\",\n spacing: \"lg\",\n },\n paletteHidden: true,\n});\n\nexport const blogPlaceholderBlockDefinition: SystemBlockDefinition<BlogPlaceholderContent> =\n {\n manifest: blogPlaceholderManifest,\n };\n","import { z } from \"zod\";\nimport { parseFieldDefinition } from \"../manifest/schema\";\nimport type { BlockManifest, FieldDefinition } from \"../manifest/schema\";\nimport type { NodeDefinition } from \"../node\";\nimport type { SystemBlockDefinition } from \"../registry\";\nimport { section, stack, text, bind, when } from \"../node/builder\";\nimport {\n backgroundColorStyle,\n borderColorStyle,\n textColorStyle,\n mergeStyles,\n} from \"../../theme/utils/colorStyles\";\nimport {\n composeFragments,\n buildFragmentDataLoaders,\n blogListGridFragment,\n blogListStackFragment,\n} from \"../fragments\";\nimport { createBlockManifest } from \"../defineBlock\";\n\n// Compose both layout fragments WITHOUT scopes\nconst gridComposition = composeFragments([{ fragment: blogListGridFragment }]);\nconst stackComposition = composeFragments([\n { fragment: blogListStackFragment },\n]);\n\n// Build unified field list\n// Combine fields from both fragments, removing duplicates\nconst fragmentFields = [...gridComposition.fields, ...stackComposition.fields];\nconst uniqueFields = fragmentFields.filter(\n (field, index, self) => index === self.findIndex((f) => f.id === field.id),\n);\n\n// Build layout with conditional rendering\nconst blogListingLayout: NodeDefinition = section(\n {\n background: \"background\",\n className: \"rb-py-12 rb-sm-py-16 rb-md-py-20\",\n }, // Semantic: medium + extra md padding\n [\n stack(\n { className: \"rb-container\" },\n [\n // Grid layout (conditionally shown)\n ...gridComposition.layout.map((node) => ({\n ...node,\n $when: {\n when: { from: \"content.layout\" },\n equals: \"grid\",\n },\n })),\n\n // Stack layout (conditionally shown)\n ...stackComposition.layout.map((node) => ({\n ...node,\n $when: {\n when: { from: \"content.layout\" },\n equals: \"stack\",\n },\n })),\n\n // Empty state (shown when no posts)\n stack(\n {\n gap: \"sm\",\n className:\n \"rb-max-w-3xl rb-border rb-border-dashed rb-p-12\",\n style: mergeStyles(\n borderColorStyle(\"border\"),\n backgroundColorStyle(\"surface\"),\n { borderRadius: \"var(--radius-card)\" },\n ),\n },\n [\n text(\n {\n as: \"p\",\n style: textColorStyle(\"mutedText\"),\n },\n bind(\"content.emptyMessage\", { fallback: \"No posts published yet.\" }),\n ),\n ],\n when(\"data.posts\", { not: true }),\n ),\n ],\n ),\n ],\n);\n\nexport const blogListingManifest: BlockManifest = createBlockManifest({\n id: \"block.blog-listing\",\n title: \"Blog listing\",\n category: \"blog\",\n\n // Skip section styles - this block has layout-specific fields instead\n skipSectionStyles: true,\n\n // Custom fields for blog listing configuration\n additionalFields: [\n parseFieldDefinition({\n id: \"layout\",\n type: \"select\",\n label: \"Layout\",\n description: \"Choose how blog posts are displayed.\",\n defaultValue: \"grid\",\n options: [\n { value: \"grid\", label: \"Grid (cards)\" },\n { value: \"stack\", label: \"Stack (vertical list)\" },\n ],\n ui: { intent: \"display\" },\n }),\n // Grid-specific column field (only visible when layout is grid)\n ...gridComposition.fields\n .filter((f) => f.id === \"columns\")\n .map((f) => ({\n ...f,\n ui: {\n ...f.ui,\n intent: \"display\",\n visibleWhen: { field: \"layout\", equals: \"grid\" },\n },\n }) as FieldDefinition),\n parseFieldDefinition({\n id: \"postsPerPage\",\n type: \"select\",\n label: \"Posts to display\",\n description: \"Number of posts to show on this page.\",\n defaultValue: \"12\",\n options: [\n { value: \"6\", label: \"6 posts\" },\n { value: \"12\", label: \"12 posts\" },\n { value: \"24\", label: \"24 posts\" },\n { value: \"48\", label: \"48 posts\" },\n ],\n ui: { intent: \"display\" },\n }),\n // Shared toggle fields from fragments (now unscoped)\n ...uniqueFields\n .filter((f) =>\n [\"showImages\", \"showExcerpts\", \"showDates\"].includes(f.id),\n )\n .map((f) => ({\n ...f,\n ui: {\n ...(f.ui ?? {}),\n intent: \"display\",\n },\n }) as FieldDefinition),\n parseFieldDefinition({\n id: \"readMoreText\",\n type: \"text\",\n label: \"Read more text\",\n description: \"Text for the read more button.\",\n defaultValue: \"Read more →\",\n maxLength: 40,\n }),\n parseFieldDefinition({\n id: \"emptyMessage\",\n type: \"text\",\n label: \"Empty state message\",\n description: \"Message shown when no posts are available.\",\n defaultValue: \"No posts published yet.\",\n maxLength: 200,\n ui: { intent: \"display\" },\n }),\n ],\n\n layout: blogListingLayout,\n\n description: \"Display a collection of blog posts in grid or stack layout.\",\n contentTypes: [\"post\"],\n tags: [\n \"blog\",\n \"posts\",\n \"articles\",\n \"news\",\n \"archive\",\n \"listing\",\n \"feed\",\n \"index\",\n ],\n icon: \"Newspaper\",\n styleTokens: {\n background: \"surface\",\n spacing: \"lg\",\n },\n});\n\nexport type BlogListingContent = {\n layout?: \"grid\" | \"stack\" | null;\n columns?: \"2\" | \"3\" | \"4\" | null;\n postsPerPage?: \"6\" | \"12\" | \"24\" | \"48\" | null;\n showImages?: boolean | null;\n showExcerpts?: boolean | null;\n showDates?: boolean | null;\n readMoreText?: string | null;\n emptyMessage?: string | null;\n};\n\nexport type BlogPostListEntry = {\n id: string;\n slug: string;\n path: string;\n title: string;\n excerpt: string | null;\n publishedAt: string | null;\n updatedAt: string;\n status: string;\n image?: {\n url: string;\n alt?: string | null;\n } | null;\n};\n\nconst blogPostListEntrySchema = z.object({\n id: z.string(),\n slug: z.string(),\n path: z.string(),\n title: z.string(),\n excerpt: z.string().nullable().optional(),\n publishedAt: z.string().nullable().optional(),\n updatedAt: z.string(),\n status: z.string(),\n image: z\n .object({\n url: z.string(),\n alt: z.string().nullable().optional(),\n })\n .nullable()\n .optional(),\n});\n\nexport const blogListingBlockDefinition: SystemBlockDefinition<BlogListingContent> =\n {\n manifest: blogListingManifest,\n dataSchemas: {\n posts: z.array(blogPostListEntrySchema).optional(),\n },\n dataLoaders: buildFragmentDataLoaders(gridComposition), // Use grid composition for loader config (same for both)\n };\n","import type { SystemBlockDefinition } from \"../registry\";\nimport type { BlockManifest } from \"../manifest/schema\";\nimport type { SectionStylesContent } from \"../fields/boxStyles\";\nimport { sectionContainer } from \"../node/fragments\";\nimport { styledSection } from \"../node/fragments/styledSection\";\nimport { createBlockManifest } from \"../defineBlock\";\nimport {\n composeFragments,\n ctaCopyFragment,\n ctaRowFragment,\n} from \"../fragments\";\n\n// Compose fragments to get layout nodes\nconst ctaComposition = composeFragments([\n { fragment: ctaCopyFragment },\n { fragment: ctaRowFragment },\n]);\n\nexport const ctaFullManifest: BlockManifest = createBlockManifest({\n id: \"block.cta-full\",\n title: \"Full-width CTA\",\n category: \"marketing\",\n\n fragments: [\n { fragment: ctaCopyFragment, fieldPriority: 0 },\n { fragment: ctaRowFragment, fieldPriority: 2 },\n ],\n\n layout: styledSection({\n children: sectionContainer(ctaComposition.layout, {\n gap: \"md\",\n className: \"rb-relative rb-text-center\",\n }),\n baseClass: \"\",\n }),\n\n description: \"Centered call to action with optional background image.\",\n tags: [\"cta\", \"call-to-action\", \"button\", \"conversion\", \"action\", \"sign-up\", \"get-started\"],\n icon: \"Target\",\n});\n\nexport type CtaFullContent = {\n eyebrow?: string | null;\n title: string;\n content?: unknown;\n _sectionStyles?: SectionStylesContent;\n ctas?: Array<{ label?: string | null; href?: string | null }>;\n};\n\nexport const ctaFullBlockDefinition: SystemBlockDefinition<CtaFullContent> = {\n manifest: ctaFullManifest,\n};\n","import { z } from \"zod\";\n\nimport type { BlockManifest } from \"../manifest/schema\";\nimport type { SystemBlockDefinition } from \"../registry\";\nimport type { SectionStylesContent } from \"../fields/boxStyles\";\nimport { sectionContainer } from \"../node/fragments\";\nimport { styledSection } from \"../node/fragments/styledSection\";\nimport { createBlockManifest } from \"../defineBlock\";\nimport {\n composeFragments,\n buildFragmentDataLoaders,\n formCopyFragment,\n formEmbedFragment,\n} from \"../fragments\";\n\nconst formComposition = composeFragments([\n { fragment: formCopyFragment },\n { fragment: formEmbedFragment },\n]);\n\nconst formLayout = styledSection({\n children: sectionContainer(formComposition.layout, { gap: \"lg\" }),\n baseClass: \"\",\n spacing: \"medium\",\n background: \"surface\",\n});\n\nconst dataLoaders = buildFragmentDataLoaders(formComposition);\n\nexport const formManifest: BlockManifest = createBlockManifest({\n id: \"block.form\",\n title: \"Form\",\n titleSource: \"title\",\n description: \"Renders a saved form definition with server-side submit.\",\n fragments: [\n { fragment: formCopyFragment },\n { fragment: formEmbedFragment },\n ],\n layout: formLayout,\n styleTokens: { background: \"surface\", typography: \"body\", spacing: \"md\" },\n behaviours: { supportsThemeSwitching: true, inlineEditing: false, animation: false, paletteHidden: false },\n category: \"interactive\",\n tags: [\"form\", \"contact\", \"input\", \"submit\", \"fields\", \"signup\", \"lead-capture\"],\n icon: \"FormInput\",\n});\n\n/**\n * Rich text document structure (ProseMirror format)\n */\nexport type RichTextDoc = {\n type: 'doc';\n content?: Array<{\n type: string;\n content?: Array<{\n type: string;\n text?: string;\n [key: string]: unknown;\n }>;\n [key: string]: unknown;\n }>;\n};\n\nexport type FormBlockContent = {\n title?: string | null;\n intro?: RichTextDoc | null;\n formSlug: string;\n submitLabel?: string | null;\n successMessage?: string | null;\n _sectionStyles?: SectionStylesContent;\n};\n\nexport const formDataSchema = z.object({\n id: z.string(),\n siteId: z.string(),\n userId: z.string(),\n name: z.string(),\n slug: z.string(),\n schemaJson: z.any(),\n settingsJson: z.any().optional(),\n createdAt: z.string(),\n updatedAt: z.string(),\n});\n\nexport type FormData = z.infer<typeof formDataSchema>;\n\nexport const formBlockDefinition: SystemBlockDefinition<FormBlockContent> = {\n manifest: formManifest,\n dataSchemas: { form: formDataSchema.optional() },\n dataLoaders,\n};\n","import type { SystemBlockDefinition } from \"../registry\";\nimport type { BlockManifest } from \"../manifest/schema\";\nimport { styledContainer } from \"../node/fragments\";\nimport { styledSection } from \"../node/fragments/styledSection\";\nimport { createBlockManifest } from \"../defineBlock\";\nimport { composeFragments, faqHeadingFragment, faqAccordionFragment } from \"../fragments\";\nimport { stack } from \"../node/builder\";\nimport type { ContainerStylesContent } from \"../fields/boxStyles\";\n\n// Compose fragments to get layout nodes\nconst faqComposition = composeFragments([\n { fragment: faqHeadingFragment, fieldPriority: 0 },\n { fragment: faqAccordionFragment, fieldPriority: 1 },\n]);\n\nexport const faqManifest: BlockManifest = createBlockManifest({\n id: \"block.faq\",\n title: \"FAQ\",\n titleSource: \"title\",\n category: \"content\",\n includeContainerStyles: true,\n\n fragments: [\n { fragment: faqHeadingFragment, fieldPriority: 0 },\n { fragment: faqAccordionFragment, fieldPriority: 1 },\n ],\n\n layout: styledSection({\n children: styledContainer({\n baseClassName: \"rb-relative rb-isolate\",\n children: stack({ gap: \"xl\", className: \"rb-w-full rb-max-w-4xl rb-mx-auto\" }, faqComposition.layout),\n }),\n baseClass: \"\",\n }),\n\n description: \"Accordion of frequently asked questions and answers.\",\n tags: [\"faq\", \"questions\", \"answers\", \"help\", \"support\", \"accordion\", \"q&a\"],\n icon: \"HelpCircle\",\n});\n\nexport type FaqItem = {\n question: string;\n answer: unknown;\n};\n\nexport type FaqContent = {\n eyebrow?: string | null;\n title?: string | null;\n description?: unknown;\n items?: FaqItem[] | null;\n _containerStyles?: ContainerStylesContent;\n};\n\nexport const faqBlockDefinition: SystemBlockDefinition<FaqContent> = {\n manifest: faqManifest,\n};\n","import { z } from \"zod\";\nimport type { TransformDefinition } from \"./core\";\n\nexport const uppercaseTransform: TransformDefinition = {\n id: \"string.uppercase\",\n kind: \"string\",\n summary: \"Uppercase text\",\n run: (value) => (typeof value === \"string\" ? value.toUpperCase() : value),\n};\n\nexport const fallbackTransform: TransformDefinition<{ fallback: unknown }> = {\n id: \"value.fallback\",\n kind: \"formatter\",\n summary: \"Provide fallback when value is null or undefined\",\n schema: z.object({ fallback: z.unknown() }),\n run: (value, options) => (value === null || value === undefined || value === \"\" ? options.fallback : value),\n};\n\nexport const dateFormatShort: TransformDefinition = {\n id: \"date.formatShort\",\n kind: \"formatter\",\n summary: \"Format ISO date string into short human-readable label\",\n run: (value) => {\n if (typeof value !== \"string\" || !value) return null;\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return null;\n try {\n return new Intl.DateTimeFormat(undefined, { month: \"short\", day: \"numeric\", year: \"numeric\" }).format(date);\n } catch {\n return null;\n }\n },\n};\n\nexport const arrayLengthTransform: TransformDefinition = {\n id: \"array.length\",\n kind: \"formatter\",\n summary: \"Get the length of an array\",\n run: (value) => (Array.isArray(value) ? value.length : 0),\n};\n\nexport const jsonArrayTransform: TransformDefinition = {\n id: \"value.jsonArray\",\n kind: \"formatter\",\n summary: \"Wrap a value (or entryId objects) into a JSON array string\",\n run: (value) => {\n // Empty → empty string (so downstream can omit/ignore)\n if (value === null || value === undefined || value === \"\") return \"\";\n\n // Common case: UUID string → [\"uuid\"]\n if (typeof value === \"string\") {\n return JSON.stringify([value]);\n }\n\n // Array input: strings or objects like { entryId: \"uuid\" }\n if (Array.isArray(value)) {\n const items = value\n .map((item) => {\n if (typeof item === \"string\") return item;\n if (item && typeof item === \"object\" && \"entryId\" in (item as Record<string, unknown>)) {\n const entryId = (item as { entryId?: unknown }).entryId;\n return typeof entryId === \"string\" ? entryId : null;\n }\n return null;\n })\n .filter((item): item is string => typeof item === \"string\" && item.trim().length > 0);\n\n return items.length > 0 ? JSON.stringify(items) : \"\";\n }\n\n return \"\";\n },\n};\n\nconst marqueeLoopOptionsSchema = z.object({\n minItems: z.number().int().min(1).default(10),\n});\n\nexport const marqueeLoopTransform: TransformDefinition<\n z.infer<typeof marqueeLoopOptionsSchema>\n> = {\n id: \"array.marqueeLoop\",\n kind: \"collection\",\n summary:\n \"Repeat an array to a minimum length, then duplicate it for seamless marquee looping\",\n schema: marqueeLoopOptionsSchema,\n run: (value, options) => {\n if (!Array.isArray(value) || value.length === 0) return [];\n\n const minItems = options?.minItems ?? 10;\n\n // Repeat the original sequence until we have enough items for a smooth loop.\n // Then duplicate once more so the track contains two identical halves.\n const base: unknown[] = [];\n while (base.length < minItems) {\n base.push(...value);\n if (base.length > 1000) break; // safety guard against pathological input/options\n }\n\n return [...base, ...base];\n },\n};\n\nexport const formattingTransforms = [\n uppercaseTransform,\n fallbackTransform,\n dateFormatShort,\n arrayLengthTransform,\n jsonArrayTransform,\n marqueeLoopTransform,\n] satisfies ReadonlyArray<TransformDefinition<unknown>>;\n","import { z } from \"zod\";\nimport { asPartialObject, type TransformDefinition } from \"./core\";\nimport type { HeaderNavStyle, ThemeHeader } from \"../../../theme/schema\";\nimport { rgbColorValue } from \"../../../theme/utils/colorStyles\";\nimport { parseBlockColorToken } from \"../../theme/blockColorTokens\";\n\nconst joinClasses = (parts: Array<string | null | undefined>) =>\n parts\n .filter(\n (part): part is string =>\n typeof part === \"string\" && part.trim().length > 0,\n )\n .join(\" \")\n .replace(/\\s+/g, \" \")\n .trim();\n\nconst imageGalleryCornerClassMap: Record<string, string> = {\n none: \"\",\n sm: \"rb-rounded-sm\",\n md: \"rb-rounded-md\",\n lg: \"rb-rounded-lg\",\n xl: \"rb-rounded-xl\",\n \"2xl\": \"rb-rounded-2xl\",\n \"3xl\": \"rb-rounded-3xl\",\n};\n\nconst parseRatio = (raw: unknown): { w: number; h: number } | null => {\n if (typeof raw !== \"string\") return null;\n const value = raw.trim();\n if (!value || value === \"auto\") return null;\n const [wRaw, hRaw] = value.split(\"/\").map((part) => part.trim());\n const w = Number(wRaw);\n const h = Number(hRaw);\n if (!Number.isFinite(w) || !Number.isFinite(h)) return null;\n if (w <= 0 || h <= 0) return null;\n return { w, h };\n};\n\nconst ratioToHeightFactor = (raw: unknown): string => {\n const ratio = parseRatio(raw);\n if (!ratio) return \"1\";\n return String(ratio.h / ratio.w);\n};\n\nfunction resolveBorderColorValue(\n border: Record<string, unknown>,\n): string | undefined {\n if (border.enabled === false) return undefined;\n\n const rawColorToken =\n typeof border.colorToken === \"string\" ? border.colorToken.trim() : \"\";\n const parsed = rawColorToken ? parseBlockColorToken(rawColorToken) : null;\n const baseName = (parsed ? parsed.split(\"/\")[0] : null) ?? \"accent\";\n\n const opacityRaw = typeof border.opacity === \"number\" ? border.opacity : 30;\n const opacity = Math.max(0, Math.min(100, opacityRaw));\n\n return rgbColorValue(`${baseName}/${opacity}`);\n}\n\n/**\n * Get nav link classes based on nav style\n * Simplified version that reads navStyle enum from theme\n */\nfunction getNavStyleClasses(navStyle: HeaderNavStyle): string {\n const baseClasses =\n \"rb-inline-flex rb-items-center rb-gap-2 rb-px-3 rb-py-2 rb-transition-colors\";\n\n switch (navStyle) {\n case \"minimal\":\n return baseClasses;\n\n case \"underline\":\n return `${baseClasses} rb-nav-underline rb-nav-underline-offset-4`;\n\n case \"underline-grow\":\n return `${baseClasses} nav-underline-grow nav-underline-active`;\n\n case \"capsule\":\n return \"rb-inline-flex rb-items-center rb-gap-2 rb-transition-colors rb-rounded-full rb-px-3 rb-py-1.5\";\n\n case \"scale\":\n return `${baseClasses} rb-transform-gpu rb-will-change-transform rb-motion-safe-hover-scale-105`;\n\n case \"frosted\":\n return \"rb-inline-flex rb-items-center rb-gap-2 rb-transition-colors rb-rounded-lg rb-px-3 rb-py-1.5\";\n\n case \"solid\":\n return baseClasses; // No border-radius class needed for sharp corners (default)\n\n default:\n return baseClasses;\n }\n}\n\nconst headerNavClassOptionsSchema = z.object({\n base: z.string().optional(),\n});\n\nexport const headerNavLinkClassTransform: TransformDefinition<\n z.infer<typeof headerNavClassOptionsSchema>\n> = {\n id: \"ui.headerNavLinkClass\",\n kind: \"string\",\n summary: \"Compose header navigation link classes from theme navStyle\",\n schema: headerNavClassOptionsSchema,\n run: (value, options) => {\n const header = asPartialObject<ThemeHeader>(value);\n\n // Get nav style from header or default to 'minimal'\n const navStyle = header?.navStyle ?? \"minimal\";\n\n // Get base classes from nav style\n const styleClasses = getNavStyleClasses(navStyle);\n\n return joinClasses([styleClasses, options?.base]);\n },\n};\n\nexport const headingClassFromAlignment: TransformDefinition<{ base: string }> =\n {\n id: \"ui.headingClassFromAlignment\",\n kind: \"string\",\n summary: \"Append text alignment class to a base heading class\",\n run: (value, options) => {\n const align =\n typeof value === \"string\" && value === \"center\" ? \"center\" : \"left\";\n const alignClass = align === \"center\" ? \"rb-text-center\" : \"rb-text-left\";\n return `${options.base} ${alignClass}`.trim();\n },\n };\n\nexport const bodyClassFromAlignment: TransformDefinition<{ base: string }> = {\n id: \"ui.bodyClassFromAlignment\",\n kind: \"string\",\n summary: \"Append body alignment helper classes to a base class\",\n run: (value, options) => {\n const align =\n typeof value === \"string\" && value === \"center\" ? \"center\" : \"left\";\n const extra = align === \"center\" ? \"rb-mx-auto rb-text-center\" : \"\";\n return `${options.base} ${extra}`.trim();\n },\n};\n\nexport const stackAlignFromAlignment: TransformDefinition = {\n id: \"ui.stackAlignFromAlignment\",\n kind: \"string\",\n summary: \"Map text alignment to stack alignment value\",\n run: (value) => (value === \"center\" ? \"center\" : \"start\"),\n};\n\ntype HeroContentAlignment = \"left\" | \"center\" | \"right\";\ntype HeroVerticalAlignment = \"top\" | \"center\" | \"bottom\";\ntype HeroContentMaxWidth = \"default\" | \"narrow\" | \"medium\" | \"wide\";\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction readString(\n obj: Record<string, unknown>,\n key: string,\n): string | undefined {\n const v = obj[key];\n return typeof v === \"string\" ? v : undefined;\n}\n\nfunction resolveHeroVariant(content: Record<string, unknown>): string | null {\n const variant = readString(content, \"variant\");\n if (variant && variant.trim()) return variant.trim();\n // Legacy \"layout\" field support (some older blocks used layout instead of variant)\n const layout = readString(content, \"layout\");\n if (layout && layout.trim()) return layout.trim();\n return null;\n}\n\nfunction resolveHeroContentAlignment(\n content: Record<string, unknown>,\n): HeroContentAlignment {\n const raw = readString(content, \"contentAlignment\");\n if (raw === \"left\" || raw === \"center\" || raw === \"right\") return raw;\n\n const variant = resolveHeroVariant(content);\n // Preserve existing behavior:\n // - classic/micro: centered text\n // - split/splitReverse: left aligned\n if (variant === \"split\" || variant === \"splitReverse\") return \"left\";\n return \"center\";\n}\n\nfunction resolveHeroVerticalAlignment(\n content: Record<string, unknown>,\n): HeroVerticalAlignment {\n const raw = readString(content, \"verticalAlignment\");\n if (raw === \"top\" || raw === \"center\" || raw === \"bottom\") return raw;\n\n const variant = resolveHeroVariant(content);\n // Preserve existing behavior:\n // - classic/micro: justify-start (top)\n // - split/splitReverse: items-center (center)\n if (variant === \"split\" || variant === \"splitReverse\") return \"center\";\n return \"top\";\n}\n\nfunction resolveHeroContentMaxWidth(\n content: Record<string, unknown>,\n): HeroContentMaxWidth {\n const raw = readString(content, \"contentMaxWidth\");\n if (\n raw === \"default\" ||\n raw === \"narrow\" ||\n raw === \"medium\" ||\n raw === \"wide\"\n )\n return raw;\n return \"default\";\n}\n\nconst heroContentWrapperClassSchema = z.object({\n base: z.string().optional(),\n});\n\nexport const heroContentWrapperClassTransform: TransformDefinition<\n z.infer<typeof heroContentWrapperClassSchema>\n> = {\n id: \"ui.heroContentWrapperClass\",\n kind: \"string\",\n summary:\n \"Resolve hero content wrapper className from alignment + max width controls\",\n schema: heroContentWrapperClassSchema,\n run: (value, options, context) => {\n const content = isPlainObject(value)\n ? value\n : isPlainObject(context.data)\n ? context.data\n : {};\n\n const alignment = resolveHeroContentAlignment(content);\n const maxWidth = resolveHeroContentMaxWidth(content);\n\n const textAlignClass =\n alignment === \"center\"\n ? \"rb-text-center\"\n : alignment === \"right\"\n ? \"rb-text-right\"\n : \"rb-text-left\";\n\n // Only apply a max width when explicitly selected; default relies on rb-container.\n const maxWidthClass =\n maxWidth === \"narrow\"\n ? \"rb-max-w-2xl\"\n : maxWidth === \"medium\"\n ? \"rb-max-w-3xl\"\n : maxWidth === \"wide\"\n ? \"rb-max-w-5xl\"\n : \"\";\n\n // Position constrained wrappers within their parent (flex/grid safe).\n // Left: no auto margins, Center: mx-auto, Right: ml-auto.\n const positionClass =\n alignment === \"center\"\n ? \"rb-mx-auto\"\n : alignment === \"right\"\n ? \"rb-ml-auto\"\n : \"\";\n\n return joinClasses([\n options?.base,\n textAlignClass,\n maxWidthClass,\n positionClass,\n ]);\n },\n};\n\nexport const heroCtaJustifyTransform: TransformDefinition = {\n id: \"ui.heroCtaJustify\",\n kind: \"string\",\n summary: \"Map hero contentAlignment to CTA row justify value\",\n run: (value, _options, context) => {\n const content = isPlainObject(value)\n ? value\n : isPlainObject(context.data)\n ? context.data\n : {};\n const alignment = resolveHeroContentAlignment(content);\n return alignment === \"left\"\n ? \"start\"\n : alignment === \"right\"\n ? \"end\"\n : \"center\";\n },\n};\n\nexport const heroStackJustifyFromVerticalAlignmentTransform: TransformDefinition =\n {\n id: \"ui.heroStackJustifyFromVerticalAlignment\",\n kind: \"string\",\n summary: \"Map hero verticalAlignment to stack justify value\",\n run: (value, _options, context) => {\n const content = isPlainObject(value)\n ? value\n : isPlainObject(context.data)\n ? context.data\n : {};\n const vertical = resolveHeroVerticalAlignment(content);\n return vertical === \"top\"\n ? \"start\"\n : vertical === \"bottom\"\n ? \"end\"\n : \"center\";\n },\n };\n\nconst heroGridClassFromVerticalAlignmentSchema = z.object({\n base: z.string(),\n});\n\nexport const heroGridClassFromVerticalAlignmentTransform: TransformDefinition<\n z.infer<typeof heroGridClassFromVerticalAlignmentSchema>\n> = {\n id: \"ui.heroGridClassFromVerticalAlignment\",\n kind: \"string\",\n summary:\n \"Append align-items class for hero split layouts based on verticalAlignment\",\n schema: heroGridClassFromVerticalAlignmentSchema,\n run: (value, options, context) => {\n const content = isPlainObject(value)\n ? value\n : isPlainObject(context.data)\n ? context.data\n : {};\n const vertical = resolveHeroVerticalAlignment(content);\n\n const itemsClass =\n vertical === \"top\"\n ? \"rb-items-start\"\n : vertical === \"bottom\"\n ? \"rb-items-end\"\n : \"rb-items-center\";\n\n return joinClasses([options.base, itemsClass]);\n },\n};\n\nconst imageFragmentClassOptionsSchema = z.object({\n base: z.string(),\n whenAuto: z.string(),\n whenFixed: z.string(),\n});\n\nexport const imageFragmentClassTransform: TransformDefinition<\n z.infer<typeof imageFragmentClassOptionsSchema>\n> = {\n id: \"ui.imageFragmentClass\",\n kind: \"string\",\n summary: \"Return different classes based on aspectRatio (auto vs fixed)\",\n schema: imageFragmentClassOptionsSchema,\n run: (value, options) => {\n const aspectRatio = typeof value === \"string\" ? value.trim() : \"auto\";\n const isAuto = aspectRatio === \"\" || aspectRatio === \"auto\";\n return joinClasses([\n options.base,\n isAuto ? options.whenAuto : options.whenFixed,\n ]);\n },\n};\n\nconst imageFragmentSizeOptionsSchema = z.object({\n max: z.number().int().positive().default(1920),\n quality: z.number().int().min(1).max(100).default(85),\n});\n\nexport const imageFragmentSizeTransform: TransformDefinition<\n z.infer<typeof imageFragmentSizeOptionsSchema>\n> = {\n id: \"ui.imageFragmentSize\",\n kind: \"formatter\",\n summary: \"Derive Supabase render size options from an aspect ratio\",\n schema: imageFragmentSizeOptionsSchema,\n run: (value, options) => {\n const ratio = parseRatio(value);\n const max = options.max ?? 1920;\n const quality = options.quality ?? 85;\n\n // Auto: preserve original aspect ratio and avoid server-side cropping.\n if (!ratio) {\n return { width: max, quality, resize: \"contain\" as const };\n }\n\n // Fixed ratio: request a crop render so object-fit cover isn't letterboxed.\n // Keep the larger dimension at `max` to avoid over-fetching pixels.\n const isPortrait = ratio.h > ratio.w;\n const width = isPortrait ? Math.round((max * ratio.w) / ratio.h) : max;\n const height = isPortrait ? max : Math.round((max * ratio.h) / ratio.w);\n\n return { width, height, quality, resize: \"cover\" as const };\n },\n};\n\nconst conditionalClassOptionsSchema = z.object({\n whenTrue: z.string(),\n whenFalse: z.string(),\n});\n\nexport const conditionalClassTransform: TransformDefinition<\n z.infer<typeof conditionalClassOptionsSchema>\n> = {\n id: \"ui.conditionalClass\",\n kind: \"string\",\n summary: \"Return different classes based on boolean value\",\n schema: conditionalClassOptionsSchema,\n run: (value, options) => {\n const isTrue = typeof value === \"boolean\" ? value : Boolean(value);\n return isTrue ? options.whenTrue : options.whenFalse;\n },\n};\n\nconst twoColumnContainerClassOptionsSchema = z.object({\n base: z.string(),\n reverseClass: z.string(),\n});\n\nexport const twoColumnContainerClassTransform: TransformDefinition<\n z.infer<typeof twoColumnContainerClassOptionsSchema>\n> = {\n id: \"ui.twoColumnContainerClass\",\n kind: \"string\",\n summary: \"Append a desktop row-reverse class based on imagePosition\",\n schema: twoColumnContainerClassOptionsSchema,\n run: (value, options) => {\n const position = value === \"right\" ? \"right\" : \"left\";\n return joinClasses([\n options.base,\n position === \"right\" ? options.reverseClass : null,\n ]);\n },\n};\n\nconst twoColumnFlexBasisOptionsSchema = z.object({\n side: z.enum([\"image\", \"text\"]),\n});\n\nexport const twoColumnFlexBasisTransform: TransformDefinition<\n z.infer<typeof twoColumnFlexBasisOptionsSchema>\n> = {\n id: \"ui.twoColumnFlexBasis\",\n kind: \"string\",\n summary:\n \"Map a ratio string to a flex-basis percentage for a 2-column layout\",\n schema: twoColumnFlexBasisOptionsSchema,\n run: (value, options) => {\n const ratio = typeof value === \"string\" ? value.trim() : \"1/2\";\n\n const imagePercent =\n ratio === \"1/4\"\n ? 25\n : ratio === \"1/3\"\n ? 33.333\n : ratio === \"2/5\"\n ? 40\n : ratio === \"2/3\"\n ? 66.667\n : 50;\n\n const percent =\n options.side === \"image\" ? imagePercent : 100 - imagePercent;\n return `${percent}%`;\n },\n};\n\nconst columnsDesktopSpanClassOptionsSchema = z.object({\n base: z.string().optional(),\n});\n\nexport const columnsDesktopSpanClassTransform: TransformDefinition<\n z.infer<typeof columnsDesktopSpanClassOptionsSchema>\n> = {\n id: \"ui.columnsDesktopSpanClass\",\n kind: \"string\",\n summary: \"Append lg col-span class for editorial column layouts\",\n schema: columnsDesktopSpanClassOptionsSchema,\n run: (value, options) => {\n const raw = typeof value === \"string\" ? value.trim() : \"\";\n const spanClass =\n raw === \"2\"\n ? \"rb-lg-col-span-2\"\n : raw === \"3\"\n ? \"rb-lg-col-span-3\"\n : raw === \"4\"\n ? \"rb-lg-col-span-4\"\n : \"rb-lg-col-span-1\";\n\n return joinClasses([options.base, spanClass]);\n },\n};\n\nconst resolveColumnsGridCols = (\n content: Record<string, unknown>,\n): { base: number; md?: number; lg?: number; xl?: number } => {\n const items = Array.isArray(content.columns) ? content.columns : [];\n const count = Math.min(4, Math.max(1, items.length || 1));\n const configuredDesktopColumnsRaw =\n typeof content.desktopColumns === \"string\"\n ? content.desktopColumns\n : \"auto\";\n\n const desktopColumns =\n configuredDesktopColumnsRaw === \"2\"\n ? 2\n : configuredDesktopColumnsRaw === \"3\"\n ? 3\n : configuredDesktopColumnsRaw === \"4\"\n ? 4\n : count;\n\n if (desktopColumns <= 1) {\n return { base: 1 };\n }\n if (desktopColumns === 2) {\n return { base: 1, md: 2 };\n }\n if (desktopColumns === 3) {\n return { base: 1, md: 2, lg: 3 };\n }\n return { base: 1, md: 2, lg: 3, xl: 4 };\n};\n\nexport const columnsGridColsTransform: TransformDefinition = {\n id: \"ui.columnsGridCols\",\n kind: \"formatter\",\n summary: \"Resolve responsive grid column counts for columns block\",\n run: (value) => {\n const content = asPartialObject<Record<string, unknown>>(value) ?? {};\n return resolveColumnsGridCols(content);\n },\n};\n\nexport const columnsColsAtTransform: TransformDefinition<{\n breakpoint: \"mobile\" | \"md\" | \"lg\" | \"xl\";\n}> = {\n id: \"ui.columnsColsAt\",\n kind: \"formatter\",\n summary: \"Resolve columns count for a specific breakpoint\",\n schema: z.object({\n breakpoint: z.enum([\"mobile\", \"md\", \"lg\", \"xl\"]),\n }),\n run: (value, options) => {\n const content = asPartialObject<Record<string, unknown>>(value) ?? {};\n const cols = resolveColumnsGridCols(content);\n const mobile = cols.base;\n const md = cols.md ?? mobile;\n const lg = cols.lg ?? md;\n const xl = cols.xl ?? lg;\n\n const resolved =\n options.breakpoint === \"mobile\"\n ? mobile\n : options.breakpoint === \"md\"\n ? md\n : options.breakpoint === \"lg\"\n ? lg\n : xl;\n\n return String(resolved);\n },\n};\n\nexport const ratioToHeightFactorTransform: TransformDefinition = {\n id: \"ui.ratioToHeightFactor\",\n kind: \"formatter\",\n summary:\n \"Convert a width/height aspect ratio string to a height factor (h/w)\",\n run: (value) => ratioToHeightFactor(value),\n};\n\nexport const uiTransforms = [\n headerNavLinkClassTransform,\n headingClassFromAlignment,\n bodyClassFromAlignment,\n stackAlignFromAlignment,\n heroContentWrapperClassTransform,\n heroCtaJustifyTransform,\n heroStackJustifyFromVerticalAlignmentTransform,\n heroGridClassFromVerticalAlignmentTransform,\n imageFragmentClassTransform,\n imageFragmentSizeTransform,\n conditionalClassTransform,\n twoColumnContainerClassTransform,\n twoColumnFlexBasisTransform,\n columnsDesktopSpanClassTransform,\n columnsGridColsTransform,\n columnsColsAtTransform,\n ratioToHeightFactorTransform,\n {\n id: \"ui.imageGalleryFilterClass\",\n kind: \"string\",\n summary: \"Map image filter selection to rb-* filter utility class\",\n run: (value) => {\n const filter = typeof value === \"string\" ? value.trim() : \"none\";\n switch (filter) {\n case \"grayscale\":\n return \"rb-filter-grayscale\";\n case \"grayscale-hover-reveal\":\n return \"rb-filter-grayscale-hover-reveal\";\n case \"sepia\":\n return \"rb-filter-sepia\";\n case \"none\":\n default:\n return \"\";\n }\n },\n } satisfies TransformDefinition,\n {\n id: \"ui.imageGalleryTileClass\",\n kind: \"string\",\n summary: \"Compose image gallery tile wrapper classes (border + corners)\",\n run: (value) => {\n const content = asPartialObject<Record<string, unknown>>(value) ?? {};\n\n const corners =\n typeof content.imageCorners === \"string\" ? content.imageCorners : \"3xl\";\n const cornersClass =\n imageGalleryCornerClassMap[corners] ?? \"rb-rounded-3xl\";\n\n const border =\n content.imageBorder && typeof content.imageBorder === \"object\"\n ? (content.imageBorder as Record<string, unknown>)\n : {};\n const borderEnabled = border.enabled !== false;\n const borderWidth = typeof border.width === \"string\" ? border.width : \"2\";\n const borderClass = !borderEnabled\n ? \"\"\n : borderWidth === \"1\"\n ? \"rb-border\"\n : borderWidth === \"2\"\n ? \"rb-border-2\"\n : borderWidth === \"3\"\n ? \"rb-border-3\"\n : \"rb-border-2\";\n\n return joinClasses([\n \"rb-overflow-hidden\",\n \"rb-relative\",\n cornersClass,\n borderClass,\n ]);\n },\n } satisfies TransformDefinition,\n {\n id: \"ui.imageGalleryTileStyle\",\n kind: \"formatter\",\n summary: \"Build image gallery tile inline styles (border color)\",\n run: (value) => {\n const content = asPartialObject<Record<string, unknown>>(value) ?? {};\n const border =\n content.imageBorder && typeof content.imageBorder === \"object\"\n ? (content.imageBorder as Record<string, unknown>)\n : {};\n\n const borderColor = resolveBorderColorValue(border);\n return borderColor ? { borderColor } : undefined;\n },\n } satisfies TransformDefinition,\n {\n id: \"ui.imageGalleryMarqueeTileStyle\",\n kind: \"formatter\",\n summary: \"Build marquee tile inline styles (border + fixed size)\",\n run: (value) => {\n const content = asPartialObject<Record<string, unknown>>(value) ?? {};\n\n const size =\n typeof content.marqueeImageSize === \"string\"\n ? content.marqueeImageSize\n : \"md\";\n const pixels =\n size === \"sm\" ? 200 : size === \"lg\" ? 320 : size === \"xl\" ? 400 : 256;\n\n const style: Record<string, unknown> = {\n width: `${pixels}px`,\n height: `${pixels}px`,\n };\n\n const border =\n content.imageBorder && typeof content.imageBorder === \"object\"\n ? (content.imageBorder as Record<string, unknown>)\n : {};\n\n const borderColor = resolveBorderColorValue(border);\n if (borderColor) style.borderColor = borderColor;\n\n return style;\n },\n } satisfies TransformDefinition,\n {\n id: \"ui.imageGalleryMarqueeDuration\",\n kind: \"string\",\n summary: \"Map marquee speed selection to CSS duration\",\n run: (value) => {\n const speed = typeof value === \"string\" ? value.trim() : \"medium\";\n return speed === \"slow\" ? \"60s\" : speed === \"fast\" ? \"20s\" : \"40s\";\n },\n } satisfies TransformDefinition,\n {\n id: \"ui.imageGalleryMarqueeDirection\",\n kind: \"string\",\n summary: \"Map marquee direction selection to animation-direction\",\n run: (value) => (value === \"right\" ? \"reverse\" : \"normal\"),\n } satisfies TransformDefinition,\n] satisfies ReadonlyArray<TransformDefinition<unknown>>;\n","import { z } from \"zod\";\nimport { featuresFromHex } from \"../../../theme/palette/utils/colorConversion\";\nimport type { ThemeFooter, ThemeHeader } from \"../../../theme/schema\";\nimport type { ThemeTokens } from \"../../theme\";\nimport { asPartialObject, type TransformDefinition } from \"./core\";\nimport {\n backgroundColorStyle,\n borderColorStyle,\n mergeStyles,\n textColorStyle,\n} from \"../../../theme/utils/colorStyles\";\n\nconst joinClasses = (parts: Array<string | null | undefined>) =>\n parts\n .filter(\n (part): part is string =>\n typeof part === \"string\" && part.trim().length > 0,\n )\n .join(\" \")\n .replace(/\\s+/g, \" \")\n .trim();\n\nconst maxWidthClassSchema = z.object({\n base: z.string().optional(),\n container: z.string().optional(),\n full: z.string().optional(),\n});\n\nexport const maxWidthClassTransform: TransformDefinition<\n z.infer<typeof maxWidthClassSchema>\n> = {\n id: \"layout.maxWidthClass\",\n kind: \"string\",\n summary: \"Resolve layout container width classes for site chrome blocks\",\n schema: maxWidthClassSchema,\n run: (value, options) => {\n const base = options.base ?? \"\";\n const variant =\n typeof value === \"string\" && value === \"full\" ? \"full\" : \"container\";\n const container = options.container ?? \"rb-container\";\n const full = options.full ?? \"rb-container-full\";\n const chosen = variant === \"full\" ? full : container;\n return joinClasses([base, chosen]);\n },\n};\n\nconst headerRootClassSchema = z.object({\n base: z.string().optional(),\n sticky: z.string().optional(),\n stickyTransparent: z.string().optional(),\n invert: z.string().optional(),\n});\n\ntype HeaderRootOptions = z.infer<typeof headerRootClassSchema>;\n\nexport type HeaderVisualStyles = ReturnType<typeof resolveHeaderVisualStyles>;\n\nexport function resolveBackgroundVisualStyles(\n backgroundColor: string | undefined,\n tokens: ThemeTokens,\n defaultToken = \"surface\",\n) {\n const backgroundToken =\n typeof backgroundColor === \"string\" && backgroundColor.trim().length > 0\n ? backgroundColor\n : defaultToken;\n\n if (backgroundToken === \"transparent\") {\n return {\n backgroundToken,\n paletteHex: null as string | null,\n backgroundHex: null as string | null,\n isBackgroundDark: false,\n textColorToken: \"text\" as const,\n textColorOverride: null as string | null,\n isTransparent: true,\n };\n }\n\n const paletteHex = tokens.palette[backgroundToken];\n const fallbackHex =\n paletteHex ??\n tokens.palette.surface ??\n tokens.color[\"surface/base\"] ??\n tokens.color[\"background/base\"] ??\n \"#ffffff\";\n\n const baseBackgroundHex =\n tokens.color[\"background/base\"] ??\n tokens.palette.surface ??\n tokens.color[\"surface/base\"] ??\n \"#ffffff\";\n\n const backgroundTone = detectTone(fallbackHex);\n const baseTone = detectTone(baseBackgroundHex);\n\n const needsContrast = Boolean(\n backgroundTone && baseTone && backgroundTone !== baseTone,\n );\n const textColorOverride = needsContrast\n ? backgroundTone === \"dark\"\n ? \"#ffffff\"\n : \"#000000\"\n : null;\n\n return {\n backgroundToken,\n paletteHex,\n backgroundHex: fallbackHex,\n isBackgroundDark: backgroundTone === \"dark\",\n textColorToken: needsContrast ? undefined : (\"text\" as const),\n textColorOverride,\n isTransparent: false,\n };\n}\n\nexport function resolveHeaderVisualStyles(\n header: Partial<ThemeHeader> | undefined,\n tokens: ThemeTokens,\n) {\n const navContainerType = header?.navContainer?.type ?? \"none\";\n const hasContainedNav =\n navContainerType === \"glass\" || navContainerType === \"pill\";\n\n if (hasContainedNav) {\n return {\n backgroundToken: \"transparent\",\n paletteHex: null,\n backgroundHex: null,\n isBackgroundDark: false,\n textColorToken: \"text\" as const,\n textColorOverride: null,\n isTransparent: true,\n } as const;\n }\n\n const background = header?.background;\n\n // Extract color token from background object\n let colorToken: string | undefined;\n if (!background || background.type === \"color\") {\n colorToken = background?.color ?? \"surface\";\n } else if (background.type === \"gradient\" && background.gradient) {\n // For gradients, use first stop color for contrast calculation\n colorToken = background.gradient.stops[0]?.color ?? \"surface\";\n } else if (background.type === \"image\") {\n // For images, use a neutral default for contrast calculation\n colorToken = \"neutral-900\"; // Assume dark background for images\n }\n\n const visuals = resolveBackgroundVisualStyles(colorToken, tokens);\n\n return visuals;\n}\n\nfunction detectTone(hex: string | null): \"light\" | \"dark\" | null {\n if (!hex) return null;\n try {\n return featuresFromHex(hex).Y < 0.5 ? \"dark\" : \"light\";\n } catch {\n return null;\n }\n}\n\nexport const headerRootClassTransform: TransformDefinition<HeaderRootOptions> =\n {\n id: \"layout.headerRootClass\",\n kind: \"string\",\n summary: \"Compose header root classes from positioning and shrink options\",\n schema: headerRootClassSchema,\n run: (value, options, context) => {\n const config = {\n // Note: border and shadow are handled by generateHeaderCss.ts, not utility classes\n base: \"header-root rb-z-40 rb-w-full transition-theme\",\n sticky: \"rb-sticky rb-top-0\",\n stickyTransparent: \"rb-sticky rb-top-0\",\n fixed: \"rb-fixed rb-top-0 rb-left-0 rb-right-0\",\n shrink: \"rb-header-shrink\",\n // Blur/background tint are handled by generateHeaderCss.ts (via ::before),\n // to avoid backdrop-filter creating a containing block for the fixed mobile overlay.\n blur: \"\",\n blurSupport: \"\",\n\n ...options,\n };\n\n const content = asPartialObject<Record<string, unknown>>(value) ?? {};\n const positioning =\n typeof content.positioning === \"string\"\n ? content.positioning\n : \"static\";\n const shrinkOnScroll = Boolean(content.shrinkOnScroll);\n const header = asPartialObject<ThemeHeader>(value);\n const visuals = resolveHeaderVisualStyles(header, context.theme);\n const navContainerType = header?.navContainer?.type ?? \"none\";\n const hasContainedNav = navContainerType === \"glass\" || navContainerType === \"pill\";\n const backgroundClass =\n visuals.isTransparent || hasContainedNav ? \"rb-bg-transparent\" : null;\n\n // Border styling is handled by generateHeaderCss.ts, not utility classes\n const classes = [\n config.base,\n backgroundClass,\n ];\n\n if (!hasContainedNav) {\n if (config.blur) classes.push(config.blur);\n if (config.blurSupport) classes.push(config.blurSupport);\n }\n\n // Add positioning classes\n if (positioning === \"sticky\") {\n classes.push(\n visuals.isTransparent ? config.stickyTransparent : config.sticky,\n );\n } else if (positioning === \"fixed\") {\n classes.push(config.fixed);\n }\n\n // Add shrink classes if enabled and positioning is sticky or fixed\n if (\n shrinkOnScroll &&\n (positioning === \"sticky\" || positioning === \"fixed\")\n ) {\n classes.push(config.shrink);\n }\n\n // Add variant class for CSS targeting (e.g., vertical variants need different shrink behavior)\n // NOTE: Keep this list in sync with ThemeHeader['variant'] in schema.ts\n const VALID_VARIANTS = [\"classic\", \"centered\", \"transparent\", \"floating\", \"editorial\"] as const;\n const variant = header?.variant;\n if (variant && VALID_VARIANTS.includes(variant as (typeof VALID_VARIANTS)[number])) {\n classes.push(`header-variant-${variant}`);\n }\n\n return joinClasses(classes);\n },\n };\n\nconst footerRootClassSchema = z.object({\n base: z.string().optional(),\n surface: z.string().optional(),\n tokenPrefix: z.string().optional(),\n transparent: z.string().optional(),\n});\n\nexport const footerRootClassTransform: TransformDefinition<\n z.infer<typeof footerRootClassSchema>\n> = {\n id: \"layout.footerRootClass\",\n kind: \"string\",\n summary: \"Compose footer root classes with optional inversion\",\n schema: footerRootClassSchema,\n run: (value, options, context) => {\n const config = {\n base: \"rb-w-full rb-border-t transition-theme\",\n transparent: \"rb-bg-transparent\",\n ...options,\n };\n const footer = asPartialObject<ThemeFooter>(value);\n const background = footer?.background;\n const colorToken = extractBackgroundColorToken(background, \"surface\");\n\n const visuals = resolveBackgroundVisualStyles(colorToken, context.theme);\n const backgroundClass = visuals.isTransparent ? config.transparent : null;\n\n return joinClasses([config.base, backgroundClass]);\n },\n};\n\nexport const headerRootStyleTransform: TransformDefinition = {\n id: \"layout.headerRootStyle\",\n kind: \"formatter\",\n summary: \"Compose header root inline styles for dynamic colors\",\n run: (value, _options, context) => {\n const header = asPartialObject<ThemeHeader>(value);\n const background = header?.background;\n const colorToken = extractBackgroundColorToken(background, \"surface\");\n const visuals = resolveBackgroundVisualStyles(colorToken, context.theme);\n\n const styleParts = [];\n\n if (visuals.textColorOverride) {\n styleParts.push({ color: visuals.textColorOverride });\n } else if (visuals.textColorToken) {\n styleParts.push(textColorStyle(visuals.textColorToken));\n }\n\n const borderColorToken = header?.border?.colorToken ?? \"border\";\n styleParts.push(borderColorStyle(borderColorToken));\n\n return mergeStyles(...styleParts);\n },\n};\n\nexport const footerRootStyleTransform: TransformDefinition = {\n id: \"layout.footerRootStyle\",\n kind: \"formatter\",\n summary: \"Compose footer root inline styles for dynamic colors\",\n run: (value, _options, context) => {\n const footer = asPartialObject<ThemeFooter>(value);\n const background = footer?.background;\n const colorToken = extractBackgroundColorToken(background, \"surface\");\n const visuals = resolveBackgroundVisualStyles(colorToken, context.theme);\n\n const styleParts = [];\n\n if (!visuals.isTransparent) {\n if (!background || background.type === \"color\") {\n const token = background?.color ?? \"surface\";\n styleParts.push(backgroundColorStyle(token));\n }\n }\n\n if (visuals.textColorOverride) {\n styleParts.push({ color: visuals.textColorOverride });\n } else if (visuals.textColorToken) {\n styleParts.push(textColorStyle(visuals.textColorToken));\n }\n\n styleParts.push(borderColorStyle(\"border\"));\n\n return mergeStyles(...styleParts);\n },\n};\n\nconst footerSpacingClassXMap: Record<string, string> = {\n none: \"rb-px-0\",\n tight: \"rb-px-2\",\n compact: \"rb-px-4\",\n default: \"rb-px-6\",\n relaxed: \"rb-px-8\",\n spacious: \"rb-px-12\",\n};\n\nconst footerSpacingClassYMap: Record<string, string> = {\n none: \"rb-py-0\",\n tight: \"rb-py-2\",\n compact: \"rb-py-4\",\n default: \"rb-py-6\",\n relaxed: \"rb-py-8\",\n spacious: \"rb-py-12\",\n};\n\nconst footerGapXClassMap: Record<string, string> = {\n none: \"rb-gap-x-0\",\n tight: \"rb-gap-x-2\",\n compact: \"rb-gap-x-4\",\n default: \"rb-gap-x-6\",\n relaxed: \"rb-gap-x-8\",\n spacious: \"rb-gap-x-12\",\n};\n\nconst footerGapYClassMap: Record<string, string> = {\n none: \"rb-gap-y-0\",\n tight: \"rb-gap-y-2\",\n compact: \"rb-gap-y-3\",\n default: \"rb-gap-y-4\",\n relaxed: \"rb-gap-y-6\",\n spacious: \"rb-gap-y-8\",\n};\n\nconst footerAlignClassMap: Record<string, string> = {\n start: \"rb-justify-start\",\n center: \"rb-justify-center\",\n end: \"rb-justify-end\",\n \"space-between\": \"rb-justify-between\",\n};\n\nconst footerBottomBarClassSchema = z.object({\n base: z.string().optional(),\n});\n\nexport const footerBottomBarClassTransform: TransformDefinition<\n z.infer<typeof footerBottomBarClassSchema>\n> = {\n id: \"layout.footerBottomBarClass\",\n kind: \"string\",\n summary: \"Compose footer bottom bar classes from theme controls\",\n schema: footerBottomBarClassSchema,\n run: (value, options) => {\n const footer = asPartialObject<ThemeFooter>(value);\n const bottomBar = footer?.bottomBar;\n const textAlign = bottomBar?.textAlign ?? \"center\";\n const alignClass =\n textAlign === \"left\"\n ? \"rb-text-left\"\n : textAlign === \"right\"\n ? \"rb-text-right\"\n : \"rb-text-center\";\n const px = footerSpacingClassXMap[bottomBar?.paddingX ?? \"default\"] ?? \"rb-px-6\";\n const py = footerSpacingClassYMap[bottomBar?.paddingY ?? \"default\"] ?? \"rb-py-6\";\n\n return joinClasses([\n options.base ?? \"rb-w-full rb-border-t\",\n alignClass,\n px,\n py,\n ]);\n },\n};\n\nconst footerBottomBarContainerClassSchema = z.object({\n base: z.string().optional(),\n fullBleed: z.string().optional(),\n contained: z.string().optional(),\n});\n\nexport const footerBottomBarContainerClassTransform: TransformDefinition<\n z.infer<typeof footerBottomBarContainerClassSchema>\n> = {\n id: \"layout.footerBottomBarContainerClass\",\n kind: \"string\",\n summary: \"Resolve full-bleed vs contained bottom bar container classes\",\n schema: footerBottomBarContainerClassSchema,\n run: (value, options) => {\n const footer = asPartialObject<ThemeFooter>(value);\n const fullBleed = Boolean(footer?.bottomBar?.fullBleed);\n return joinClasses([\n options.base ?? \"\",\n fullBleed\n ? (options.fullBleed ?? \"rb-w-full\")\n : (options.contained ?? \"rb-container\"),\n ]);\n },\n};\n\nexport const footerBottomBarStyleTransform: TransformDefinition = {\n id: \"layout.footerBottomBarStyle\",\n kind: \"formatter\",\n summary: \"Compose footer bottom bar style from theme controls\",\n run: (value, _options, context) => {\n const footer = asPartialObject<ThemeFooter>(value);\n const bottomBar = footer?.bottomBar;\n\n const styleParts = [];\n\n const background = bottomBar?.background;\n if (background?.type === \"color\") {\n styleParts.push(backgroundColorStyle(background.color ?? \"surface\"));\n }\n\n if (bottomBar?.textColor) {\n styleParts.push(textColorStyle(bottomBar.textColor));\n }\n\n const borderColorToken = bottomBar?.borderTop?.colorToken;\n if (borderColorToken) {\n styleParts.push(borderColorStyle(borderColorToken));\n } else {\n styleParts.push(borderColorStyle(\"border\"));\n }\n\n const borderWidth = bottomBar?.borderTop?.width;\n if (borderWidth && borderWidth !== \"none\") {\n styleParts.push({\n borderTopWidth:\n borderWidth === \"thin\"\n ? \"1px\"\n : borderWidth === \"medium\"\n ? \"2px\"\n : \"3px\",\n });\n } else if (borderWidth === \"none\") {\n styleParts.push({ borderTopWidth: \"0px\" });\n }\n\n // Preserve sufficient contrast fallback when no explicit text color is provided.\n if (!bottomBar?.textColor) {\n const colorToken = extractBackgroundColorToken(background, \"surface\");\n const visuals = resolveBackgroundVisualStyles(colorToken, context.theme);\n if (visuals.textColorOverride) {\n styleParts.push({ color: visuals.textColorOverride });\n } else if (visuals.textColorToken) {\n styleParts.push(textColorStyle(visuals.textColorToken));\n }\n }\n\n return mergeStyles(...styleParts);\n },\n};\n\nexport const footerSplitNavSingleClassTransform: TransformDefinition = {\n id: \"layout.footerSplitNavSingleClass\",\n kind: \"string\",\n summary: \"Compose split-footer nav classes from navLayout controls (single render path)\",\n run: (value) => {\n const navLayout = asPartialObject<ThemeFooter[\"navLayout\"]>(value);\n const mode = navLayout?.layout ?? \"stack\";\n\n const alignClass = footerAlignClassMap[navLayout?.align ?? \"start\"] ?? \"rb-justify-start\";\n const gapX = footerGapXClassMap[navLayout?.gapX ?? \"default\"] ?? \"rb-gap-x-6\";\n const gapY = footerGapYClassMap[navLayout?.gapY ?? \"compact\"] ?? \"rb-gap-y-3\";\n\n if (mode === \"stack\") {\n return \"rb-w-full rb-space-y-3 rb-text-left\";\n }\n if (mode === \"inline\") {\n return joinClasses([\n \"rb-flex rb-flex-row rb-flex-nowrap rb-items-center rb-overflow-x-auto rb-text-left\",\n alignClass,\n gapX,\n ]);\n }\n return joinClasses([\n \"rb-flex rb-flex-row rb-flex-wrap rb-items-center rb-text-left\",\n alignClass,\n gapX,\n gapY,\n ]);\n },\n};\n\nconst footerLogoClassSchema = z.object({\n base: z.string().optional(),\n});\n\nexport const footerLogoClassTransform: TransformDefinition<\n z.infer<typeof footerLogoClassSchema>\n> = {\n id: \"layout.footerLogoClass\",\n kind: \"string\",\n summary: \"Compose split-footer logo wrapper classes from footer.logo controls\",\n schema: footerLogoClassSchema,\n run: (value, options) => {\n const logo = asPartialObject<ThemeFooter[\"logo\"]>(value);\n\n const placement = logo?.placement ?? \"right\";\n const align = logo?.align ?? \"end\";\n const hiddenClass = logo?.showLogo === false ? \"rb-hidden\" : null;\n\n const orderClass =\n placement === \"left\" || placement === \"above\"\n ? \"rb-md-order-first\"\n : \"rb-md-order-last\";\n const selfAlignClass =\n align === \"start\"\n ? \"rb-self-start rb-text-left\"\n : align === \"center\"\n ? \"rb-self-center rb-text-center\"\n : \"rb-self-end rb-text-right\";\n\n return joinClasses([\n options.base ??\n \"footer-logo rb-inline-flex rb-items-center rb-justify-end rb-gap-3 rb-no-underline rb-transition-opacity rb-hover-opacity-80\",\n orderClass,\n selfAlignClass,\n hiddenClass,\n ]);\n },\n};\n\nconst footerLogoMediaClassSchema = z.object({\n base: z.string().optional(),\n});\n\nexport const footerLogoMediaClassTransform: TransformDefinition<\n z.infer<typeof footerLogoMediaClassSchema>\n> = {\n id: \"layout.footerLogoMediaClass\",\n kind: \"string\",\n summary: \"Compose footer logo image classes from size controls\",\n schema: footerLogoMediaClassSchema,\n run: (_value, options) => {\n // Intentional pass-through for now: class-only hook reserved for future\n // block-kind/variant-specific overrides in the transform layer.\n return joinClasses([options.base ?? \"rb-w-auto\"]);\n },\n};\n\nfunction shouldShowFooterLogoText(footer: Partial<ThemeFooter> | undefined): boolean {\n if (!footer) return false;\n const explicit = footer.logo?.showLogoText;\n const legacy = footer.showLogoText === true;\n return explicit === true || (explicit === undefined && legacy);\n}\n\nexport const footerLogoTextVisibleTransform: TransformDefinition = {\n id: \"layout.footerLogoTextVisible\",\n kind: \"formatter\",\n summary: \"Return whether footer logo text should render\",\n run: (value) => {\n const footer = asPartialObject<ThemeFooter>(value);\n return shouldShowFooterLogoText(footer);\n },\n};\n\nfunction extractBackgroundColorToken(\n background: ThemeHeader[\"background\"] | ThemeFooter[\"background\"] | undefined,\n fallback: string,\n) {\n if (!background || background.type === \"color\") {\n return background?.color ?? fallback;\n }\n if (background.type === \"gradient\" && background.gradient) {\n return background.gradient.stops[0]?.color ?? fallback;\n }\n if (background.type === \"image\") {\n return \"neutral-900\";\n }\n return fallback;\n}\n\nexport const layoutTransforms = [\n maxWidthClassTransform,\n headerRootClassTransform,\n footerRootClassTransform,\n headerRootStyleTransform,\n footerRootStyleTransform,\n footerBottomBarClassTransform,\n footerBottomBarContainerClassTransform,\n footerBottomBarStyleTransform,\n footerSplitNavSingleClassTransform,\n footerLogoClassTransform,\n footerLogoMediaClassTransform,\n footerLogoTextVisibleTransform,\n] satisfies ReadonlyArray<TransformDefinition<unknown>>;\n","import { z } from \"zod\";\nimport type { TransformDefinition } from \"./core\";\n\ntype MediaFromUrlOptions = {\n width?: number;\n height?: number;\n quality?: number;\n resize?: \"cover\" | \"contain\" | \"fill\";\n};\n\nconst mediaFromUrlOptionsSchema = z.object({\n width: z.number().int().positive().optional(),\n height: z.number().int().positive().optional(),\n quality: z.number().int().min(1).max(100).optional(),\n resize: z.enum([\"cover\", \"contain\", \"fill\"]).optional(),\n});\n\nfunction maybeBuildSupabaseTransformUrl(\n inputUrl: string,\n options: MediaFromUrlOptions,\n): string {\n const width = options.width;\n const height = options.height;\n const quality = options.quality;\n const resize = options.resize;\n\n // Only use transform endpoint when we have dimensions.\n if (!width && !height) return inputUrl;\n\n let url: URL;\n try {\n url = new URL(inputUrl);\n } catch {\n return inputUrl;\n }\n\n const marker = \"/storage/v1/object/public/\";\n const idx = url.pathname.indexOf(marker);\n if (idx === -1) return inputUrl;\n\n const remainder = url.pathname.slice(idx + marker.length);\n const parts = remainder.split(\"/\").filter(Boolean);\n const bucket = parts[0];\n const path = parts.slice(1).join(\"/\");\n if (!bucket || !path) return inputUrl;\n\n url.pathname = `/storage/v1/render/image/public/${bucket}/${path}`;\n url.search = \"\";\n\n if (width) url.searchParams.set(\"width\", String(width));\n if (height) url.searchParams.set(\"height\", String(height));\n if (quality) url.searchParams.set(\"quality\", String(quality));\n if (resize) url.searchParams.set(\"resize\", resize);\n\n return url.toString();\n}\n\nexport const mediaFromUrl: TransformDefinition<MediaFromUrlOptions> = {\n id: \"media.fromUrl\",\n kind: \"formatter\",\n summary: \"Convert {url, alt} into Media image\",\n schema: mediaFromUrlOptionsSchema,\n run: (value, options) => {\n if (!value || typeof value !== \"object\") return null;\n const record = value as Record<string, unknown>;\n const url = record.url;\n const alt = record.alt;\n if (typeof url !== \"string\" || url.trim() === \"\") return null;\n const nextUrl = maybeBuildSupabaseTransformUrl(url, options);\n return { type: \"image\", src: nextUrl, alt: typeof alt === \"string\" ? alt : \"\" };\n },\n};\n\nexport const mediaTransforms = [mediaFromUrl] satisfies ReadonlyArray<TransformDefinition<unknown>>;\n","import { z } from \"zod\";\nimport type { TransformContext, TransformDefinition } from \"./core\";\nimport { isRecord } from \"../../../lib/typeGuards\";\n\nconst supportedRichTextTokenSchema = z.enum([\"year\", \"site_name\"]);\n\nconst interpolateRichTextTokensOptionsSchema = z.object({\n tokens: z.array(supportedRichTextTokenSchema).default([\"year\", \"site_name\"]),\n});\n\ntype InterpolateRichTextTokensOptions = z.infer<\n typeof interpolateRichTextTokensOptionsSchema\n>;\n\nconst richTextTokenPattern = /\\{\\{\\s*([a-zA-Z0-9_]+)\\s*\\}\\}/g;\n\ntype RichTextNode = Record<string, unknown>;\n\nfunction getSiteName(context: TransformContext): string | null {\n const viewModel = context.viewModel;\n if (!isRecord(viewModel)) return null;\n\n const site = viewModel.site;\n if (isRecord(site) && typeof site.title === \"string\") {\n const title = site.title.trim();\n return title.length > 0 ? title : null;\n }\n\n const root = viewModel.$root;\n if (isRecord(root)) {\n const rootSite = root.site;\n if (isRecord(rootSite) && typeof rootSite.title === \"string\") {\n const title = rootSite.title.trim();\n if (title.length > 0) return title;\n }\n\n const rootSiteName = root.siteName;\n if (typeof rootSiteName === \"string\") {\n const siteName = rootSiteName.trim();\n if (siteName.length > 0) return siteName;\n }\n }\n\n return null;\n}\n\nfunction replaceTokenText(\n input: string,\n allowedTokens: Set<string>,\n tokenValues: Record<string, string | null>,\n): string {\n return input.replace(richTextTokenPattern, (fullMatch, rawToken) => {\n const token = String(rawToken ?? \"\").trim();\n if (!allowedTokens.has(token)) return fullMatch;\n\n const resolved = tokenValues[token];\n if (resolved === null || resolved === undefined) return fullMatch;\n return resolved;\n });\n}\n\nfunction visitRichTextNode(\n node: unknown,\n allowedTokens: Set<string>,\n tokenValues: Record<string, string | null>,\n): unknown {\n if (!isRecord(node)) return node;\n\n let changed = false;\n const nextNode: RichTextNode = { ...node };\n\n if (nextNode.type === \"text\" && typeof nextNode.text === \"string\") {\n const nextText = replaceTokenText(nextNode.text, allowedTokens, tokenValues);\n if (nextText !== nextNode.text) {\n nextNode.text = nextText;\n changed = true;\n }\n }\n\n const originalContent = nextNode.content;\n if (Array.isArray(originalContent)) {\n const nextContent = originalContent.map((child) =>\n visitRichTextNode(child, allowedTokens, tokenValues),\n );\n const contentChanged = nextContent.some(\n (child, index) => child !== originalContent[index],\n );\n if (contentChanged) {\n nextNode.content = nextContent;\n changed = true;\n }\n }\n\n return changed ? nextNode : node;\n}\n\nfunction interpolateRichTextTokens(\n value: unknown,\n options: InterpolateRichTextTokensOptions,\n context: TransformContext,\n): unknown {\n if (!isRecord(value)) return value;\n\n const allowedTokens = new Set<string>(options.tokens);\n const tokenValues: Record<string, string | null> = {\n year: String(new Date().getFullYear()),\n site_name: getSiteName(context),\n };\n\n if (isRecord(value.doc)) {\n const nextDoc = visitRichTextNode(value.doc, allowedTokens, tokenValues);\n if (nextDoc === value.doc) return value;\n return { ...value, doc: nextDoc };\n }\n\n return visitRichTextNode(value, allowedTokens, tokenValues);\n}\n\nexport const interpolateRichTextTokensTransform: TransformDefinition<\n InterpolateRichTextTokensOptions\n> = {\n id: \"content.interpolateRichTextTokens\",\n kind: \"formatter\",\n summary: \"Interpolate allowed tokens inside rich-text text nodes\",\n schema: interpolateRichTextTokensOptionsSchema,\n run: (value, options, context) =>\n interpolateRichTextTokens(value, options, context),\n};\n\nexport const contentTransforms = [\n interpolateRichTextTokensTransform,\n] satisfies ReadonlyArray<TransformDefinition<unknown>>;\n","import type { TransformDefinition } from \"./registry/core\";\nimport { uppercaseTransform, fallbackTransform, dateFormatShort } from \"./registry/formatting\";\nimport {\n headerNavLinkClassTransform,\n headingClassFromAlignment,\n bodyClassFromAlignment,\n stackAlignFromAlignment,\n heroContentWrapperClassTransform,\n heroCtaJustifyTransform,\n heroStackJustifyFromVerticalAlignmentTransform,\n heroGridClassFromVerticalAlignmentTransform,\n conditionalClassTransform,\n twoColumnContainerClassTransform,\n twoColumnFlexBasisTransform,\n} from \"./registry/ui\";\nimport {\n maxWidthClassTransform,\n headerRootClassTransform,\n footerRootClassTransform,\n headerRootStyleTransform,\n footerRootStyleTransform,\n footerBottomBarClassTransform,\n footerBottomBarContainerClassTransform,\n footerBottomBarStyleTransform,\n footerSplitNavSingleClassTransform,\n footerLogoClassTransform,\n footerLogoMediaClassTransform,\n footerLogoTextVisibleTransform,\n} from \"./registry/layout\";\nimport { mediaFromUrl } from \"./registry/media\";\nimport { semanticGapTransform, semanticGapValueTransform } from \"./registry/boxStyles\";\nimport { interpolateRichTextTokensTransform } from \"./registry/content\";\n\n// Canonical map of built-in transforms. Keys are the literal IDs.\n// Note: ui.buttonClass removed - styling now handled by CSS generation at build time\nexport const transformDefinitions = {\n \"string.uppercase\": uppercaseTransform,\n \"value.fallback\": fallbackTransform,\n \"ui.headerNavLinkClass\": headerNavLinkClassTransform,\n \"layout.maxWidthClass\": maxWidthClassTransform,\n \"layout.headerRootClass\": headerRootClassTransform,\n \"layout.footerRootClass\": footerRootClassTransform,\n \"layout.headerRootStyle\": headerRootStyleTransform,\n \"layout.footerRootStyle\": footerRootStyleTransform,\n \"layout.footerBottomBarClass\": footerBottomBarClassTransform,\n \"layout.footerBottomBarContainerClass\": footerBottomBarContainerClassTransform,\n \"layout.footerBottomBarStyle\": footerBottomBarStyleTransform,\n \"layout.footerSplitNavSingleClass\": footerSplitNavSingleClassTransform,\n \"layout.footerLogoClass\": footerLogoClassTransform,\n \"layout.footerLogoMediaClass\": footerLogoMediaClassTransform,\n \"layout.footerLogoTextVisible\": footerLogoTextVisibleTransform,\n \"ui.headingClassFromAlignment\": headingClassFromAlignment,\n \"ui.bodyClassFromAlignment\": bodyClassFromAlignment,\n \"ui.stackAlignFromAlignment\": stackAlignFromAlignment,\n \"ui.heroContentWrapperClass\": heroContentWrapperClassTransform,\n \"ui.heroCtaJustify\": heroCtaJustifyTransform,\n \"ui.heroStackJustifyFromVerticalAlignment\": heroStackJustifyFromVerticalAlignmentTransform,\n \"ui.heroGridClassFromVerticalAlignment\": heroGridClassFromVerticalAlignmentTransform,\n \"ui.conditionalClass\": conditionalClassTransform,\n \"ui.twoColumnContainerClass\": twoColumnContainerClassTransform,\n \"ui.twoColumnFlexBasis\": twoColumnFlexBasisTransform,\n \"media.fromUrl\": mediaFromUrl,\n \"date.formatShort\": dateFormatShort,\n \"content.interpolateRichTextTokens\": interpolateRichTextTokensTransform,\n \"boxStyles.semanticGap\": semanticGapTransform,\n \"boxStyles.semanticGapValue\": semanticGapValueTransform,\n} as const;\n\nexport type TransformId = keyof typeof transformDefinitions;\n\ntype OptionsOf<T> = T extends TransformDefinition<infer O> ? O : never;\n\nexport type TransformOptionsById = {\n [K in TransformId]: OptionsOf<(typeof transformDefinitions)[K]>;\n};\n\nexport type TransformStep<K extends TransformId = TransformId> = {\n id: K;\n options?: TransformOptionsById[K];\n};\n\n// Convenience helpers for declaring transform pipelines in a type‑safe way.\nexport function tx<K extends TransformId>(id: K, options?: TransformOptionsById[K]): TransformStep<K> {\n return { id, options };\n}\n\nexport function pipe<T extends readonly TransformStep[]>(...steps: T): T {\n return steps;\n}\n\nexport function bindProp(\n from: string,\n opts?: { transforms?: readonly TransformStep[] | TransformStep[]; fallback?: unknown; pick?: \"value\" | \"collection\" | \"context\" }\n) {\n return {\n $bind: {\n from,\n ...(opts?.transforms ? { transforms: [...opts.transforms] } : {}),\n ...(opts?.fallback !== undefined ? { fallback: opts.fallback } : {}),\n ...(opts?.pick ? { pick: opts.pick } : {}),\n },\n } as const;\n}\n","import type { BlockManifest } from \"../manifest/schema\";\nimport type { NodeDefinition } from \"../node\";\nimport {\n bind,\n headerSection,\n inline,\n link,\n media,\n stack,\n text,\n when,\n props as withProps,\n} from \"../node/builder\";\nimport { navRow, navColumn, ctaButton } from \"../node/fragments\";\nimport type { SystemBlockDefinition } from \"../registry\";\nimport { bindProp, pipe, tx } from \"../transforms/typed\";\nimport { createBlockManifest } from \"../defineBlock\";\nimport {\n borderColorStyle,\n mergeStyles,\n textColorStyle,\n} from \"../../theme/utils/colorStyles\";\n// Mobile panel background/text colors come from CSS (theme-configurable via header.dropdownStyle)\n\nconst logoRow = link(\n {\n href: \"/\",\n className:\n \"header-logo rb-flex rb-min-w-0 rb-items-center rb-gap-3 rb-no-underline rb-transition-opacity rb-hover-opacity-80\",\n },\n [\n media(\n {\n className:\n \"rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300\",\n },\n when(\"content.logo\"),\n bind(\"content.logo\"),\n ),\n // Logo text font-size controlled by CSS (styles.css) for shrink transitions\n text(\n {\n as: \"strong\",\n className: \"header-logo-text rb-truncate\",\n },\n bind(\"site.title\", { fallback: \"Your Site\" }),\n ),\n ],\n);\n\nconst centeredLogoRow = link(\n {\n href: \"/\",\n className:\n \"header-logo rb-flex rb-items-center rb-justify-center rb-gap-3 rb-text-center rb-no-underline rb-transition-opacity rb-hover-opacity-80\",\n },\n [\n media(\n {\n className:\n \"rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300\",\n },\n when(\"content.logo\"),\n bind(\"content.logo\"),\n ),\n // Logo text font-size controlled by CSS (styles.css) for shrink transitions\n text(\n { as: \"strong\", className: \"header-logo-text\" },\n bind(\"site.title\", { fallback: \"Your Site\" }),\n ),\n ],\n);\n\n// Shared nav row configuration\nconst createNavRow = (\n className: string,\n align: \"start\" | \"center\" | \"end\" = \"end\",\n) =>\n navRow({\n className: `${className} header-nav-row`,\n align,\n linkClassName:\n \"header-nav-link rb-inline-flex rb-items-center rb-px-4 rb-py-2 rb-nav-text transition-theme-standard\",\n });\n\nconst headerCta = ctaButton({\n basePath: \"menu.ctaItem\",\n whenPath: \"menu.ctaItem.label\",\n variantPath: \"menu.ctaItem.variant\",\n linkPath: \"menu.ctaItem.link\",\n className: \"header-cta btn-sm rb-hidden rb-lg-inline-flex rb-ml-6\",\n});\n\nconst mobileCta = ctaButton({\n basePath: \"menu.ctaItem\",\n whenPath: \"menu.ctaItem.label\",\n variantPath: \"menu.ctaItem.variant\",\n linkPath: \"menu.ctaItem.link\",\n className: \"nav-mobile-cta btn-md rb-w-full\",\n});\n\nconst mobileToggleIcon = stack({ gap: \"xs\", className: \"nav-mobile-icon\" }, [\n {\n type: \"div\",\n props: { className: \"nav-mobile-bar nav-mobile-bar-top rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current\" },\n },\n {\n type: \"div\",\n props: { className: \"nav-mobile-bar nav-mobile-bar-middle rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current\" },\n },\n {\n type: \"div\",\n props: { className: \"nav-mobile-bar nav-mobile-bar-bottom rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current\" },\n },\n]);\n\nconst mobileToggleButton = {\n type: \"button\",\n props: {\n type: \"button\",\n variantId: \"\",\n className:\n \"nav-mobile-toggle rb-inline-flex rb-h-10 rb-w-10 rb-items-center rb-justify-center rb-rounded-md transition-theme-standard rb-lg-hidden\",\n \"aria-label\": \"Open menu\",\n \"aria-expanded\": \"false\",\n \"aria-controls\": \"nav-mobile-overlay\",\n \"data-nav-mobile-toggle\": \"true\",\n },\n children: [mobileToggleIcon],\n} as NodeDefinition;\n\nconst mobileOverlayToggleButton = {\n type: \"button\",\n props: {\n type: \"button\",\n variantId: \"\",\n className:\n \"nav-mobile-toggle rb-inline-flex rb-h-10 rb-w-10 rb-items-center rb-justify-center rb-rounded-md transition-theme-standard\",\n \"aria-label\": \"Open menu\",\n \"aria-expanded\": \"false\",\n \"aria-controls\": \"nav-mobile-overlay\",\n \"data-nav-mobile-toggle\": \"true\",\n },\n children: [mobileToggleIcon],\n} as NodeDefinition;\n\nconst mobileNavList = navColumn({\n className: \"rb-mt-6\",\n linkClassName:\n \"nav-mobile-link rb-block rb-w-full rb-py-3 rb-nav-text-mobile transition-theme-standard\",\n childLinkClassName:\n \"nav-mobile-child-link rb-block rb-w-full rb-py-2 rb-nav-text transition-theme-standard\",\n triggerClassName:\n \"nav-mobile-trigger rb-flex rb-w-full rb-items-center rb-justify-between rb-py-3 rb-nav-text-mobile transition-theme-standard\",\n childrenClassName: \"nav-mobile-children rb-hidden rb-pl-4\",\n});\n\nconst mobileOverlayHeader = inline(\n {\n className:\n bindProp(\"$root.theme.header.maxWidth\", {\n transforms: pipe(\n tx(\"layout.maxWidthClass\", {\n base: \"rb-header-layout rb-flex rb-w-full rb-items-center rb-justify-between rb-border-b rb-py-4\",\n }),\n ),\n fallback:\n \"rb-container rb-header-layout rb-flex rb-w-full rb-items-center rb-justify-between rb-border-b rb-py-4\",\n }),\n align: \"center\",\n justify: \"between\",\n style: borderColorStyle(\"border\"),\n },\n [logoRow, mobileOverlayToggleButton],\n);\n\nconst mobileOverlayBody = stack(\n { className: \"rb-flex-1 rb-px-6 rb-py-6\", gap: \"md\", align: \"stretch\" },\n [\n mobileNavList,\n { type: \"div\", props: { className: \"rb-mt-4\" }, children: [mobileCta] },\n ],\n);\n\nconst mobileOverlay = {\n type: \"div\",\n props: {\n id: \"nav-mobile-overlay\",\n className:\n \"nav-mobile-overlay rb-fixed rb-inset-0 rb-z-50 rb-lg-hidden\",\n role: \"dialog\",\n \"aria-modal\": \"true\",\n \"aria-hidden\": \"true\",\n \"data-nav-mobile-overlay\": \"true\",\n },\n children: [\n {\n type: \"div\",\n props: {\n className: \"nav-mobile-backdrop rb-absolute rb-inset-0 rb-bg-black-40\",\n \"data-nav-mobile-backdrop\": \"true\",\n },\n },\n {\n type: \"div\",\n props: {\n className:\n \"nav-mobile-panel rb-relative rb-z-10 rb-flex rb-h-full rb-flex-col rb-overflow-y-auto\",\n },\n children: [mobileOverlayHeader, mobileOverlayBody],\n },\n ],\n} as NodeDefinition;\n\nconst mobileHeaderBar = inline(\n {\n className: bindProp(\"$root.theme.header.maxWidth\", {\n transforms: pipe(\n tx(\"layout.maxWidthClass\", {\n base: \"rb-header-layout rb-flex rb-w-full rb-items-center rb-justify-between rb-lg-hidden\",\n }),\n ),\n fallback:\n \"rb-container rb-header-layout rb-flex rb-w-full rb-items-center rb-justify-between rb-lg-hidden\",\n }),\n align: \"center\",\n justify: \"between\",\n },\n [logoRow, mobileToggleButton],\n);\n\n// Classic variant: logo left, nav right (horizontal inline layout)\nconst classicLayout = inline(\n {\n className: bindProp(\"$root.theme.header.maxWidth\", {\n transforms: pipe(\n tx(\"layout.maxWidthClass\", {\n base: \"rb-header-layout rb-hidden rb-lg-flex rb-w-full rb-items-center rb-gap-6\",\n }),\n ),\n fallback:\n \"rb-container rb-header-layout rb-hidden rb-lg-flex rb-w-full rb-items-center rb-gap-6\",\n }),\n align: \"center\",\n },\n [\n logoRow,\n createNavRow(\"rb-ml-auto rb-hidden rb-lg-flex rb-gap-6\"),\n headerCta,\n ],\n when(\"$root.theme.header.variant\", { equals: \"classic\" }),\n);\n\n// Centered variant: logo centered, nav below (vertical stack layout)\nconst centeredLayout = stack(\n {\n gap: \"md\",\n align: \"center\",\n className: bindProp(\"$root.theme.header.maxWidth\", {\n transforms: pipe(\n tx(\"layout.maxWidthClass\", {\n base: \"rb-header-layout rb-hidden rb-lg-flex rb-w-full rb-flex-col rb-items-center rb-gap-5 rb-text-center\",\n }),\n ),\n fallback:\n \"rb-container rb-header-layout rb-hidden rb-lg-flex rb-w-full rb-flex-col rb-items-center rb-gap-5 rb-text-center\",\n }),\n },\n [\n centeredLogoRow,\n createNavRow(\n \"rb-hidden rb-lg-flex rb-flex-wrap rb-justify-center rb-gap-x-6 rb-gap-y-3\",\n \"center\",\n ),\n ],\n when(\"$root.theme.header.variant\", { equals: \"centered\" }),\n);\n\n// Transparent variant: logo left, nav right (horizontal inline, transparent bg)\nconst transparentLayout = inline(\n {\n className: bindProp(\"$root.theme.header.maxWidth\", {\n transforms: pipe(\n tx(\"layout.maxWidthClass\", {\n base: \"rb-header-layout rb-hidden rb-lg-flex rb-w-full rb-items-center rb-gap-6\",\n }),\n ),\n fallback:\n \"rb-container rb-header-layout rb-hidden rb-lg-flex rb-w-full rb-items-center rb-gap-6\",\n }),\n align: \"center\",\n },\n [\n logoRow,\n createNavRow(\"rb-ml-auto rb-hidden rb-lg-flex rb-gap-6\"),\n headerCta,\n ],\n when(\"$root.theme.header.variant\", { equals: \"transparent\" }),\n);\n\n// Floating variant: absolute positioned with padding + rounded container\nconst floatingLayout = inline(\n {\n className: bindProp(\"$root.theme.header.maxWidth\", {\n transforms: pipe(\n tx(\"layout.maxWidthClass\", {\n base: \"rb-header-layout header-floating-container rb-absolute rb-left-1/2 rb-top-4 rb-hidden rb-w-calc-100-minus-2rem rb-max-w-7xl rb-translate-x-neg-1/2 rb-items-center rb-gap-6 rb-px-6 rb-lg-flex\",\n container: \"\",\n full: \"\",\n }),\n ),\n fallback:\n \"rb-header-layout header-floating-container rb-absolute rb-left-1/2 rb-top-4 rb-hidden rb-w-calc-100-minus-2rem rb-max-w-7xl rb-translate-x-neg-1/2 rb-items-center rb-gap-6 rb-px-6 rb-lg-flex\",\n }),\n align: \"center\",\n },\n [\n logoRow,\n createNavRow(\"rb-ml-auto rb-hidden rb-lg-flex rb-gap-6\"),\n headerCta,\n ],\n when(\"$root.theme.header.variant\", { equals: \"floating\" }),\n);\n\n// Editorial variant: centered logo with nav split left/right or large centered logo with nav below\nconst editorialLayout = stack(\n {\n gap: \"md\",\n align: \"center\",\n className: bindProp(\"$root.theme.header.maxWidth\", {\n transforms: pipe(\n tx(\"layout.maxWidthClass\", {\n base: \"rb-header-layout rb-hidden rb-lg-flex rb-w-full rb-flex-col rb-items-center rb-gap-6 rb-text-center\",\n }),\n ),\n fallback:\n \"rb-container rb-header-layout rb-hidden rb-lg-flex rb-w-full rb-flex-col rb-items-center rb-gap-6 rb-text-center\",\n }),\n },\n [\n centeredLogoRow,\n createNavRow(\n \"rb-hidden rb-lg-flex rb-flex-wrap rb-justify-center rb-gap-x-8 rb-gap-y-3\",\n \"center\",\n ),\n ],\n when(\"$root.theme.header.variant\", { equals: \"editorial\" }),\n);\n\n// Root section contains all variant layouts\nconst headerLayout: NodeDefinition = headerSection(\n {\n background: \"background\",\n allowOverflow: true,\n className: bindProp(\"$root.theme.header\", {\n transforms: pipe(tx(\"layout.headerRootClass\")),\n fallback:\n \"header-root rb-z-40 rb-w-full transition-theme\",\n }),\n style: bindProp(\"$root.theme.header\", {\n transforms: pipe(tx(\"layout.headerRootStyle\")),\n fallback: mergeStyles(\n textColorStyle(\"text\"),\n borderColorStyle(\"border\"),\n ),\n }),\n },\n [\n mobileHeaderBar,\n classicLayout,\n centeredLayout,\n transparentLayout,\n floatingLayout,\n editorialLayout,\n mobileOverlay,\n ],\n withProps({\n \"data-site-header\": \"true\",\n }),\n);\n\nexport const siteHeaderManifest: BlockManifest = createBlockManifest({\n id: \"block.site-header\",\n title: \"Site Header\",\n category: \"layout\",\n\n // Skip section styles - this block uses theme-based styling\n skipSectionStyles: true,\n // Block manages its own wrapper - enables sticky positioning\n managesOwnWrapper: true,\n\n layout: headerLayout,\n\n description: \"Site-wide header with logo, navigation, and optional CTA.\",\n styleTokens: {\n spacing: \"sm\",\n },\n paletteHidden: true,\n});\n\nexport type SiteHeaderManifest = typeof siteHeaderManifest;\n\nexport type SiteHeaderVariant =\n | \"classic\"\n | \"centered\"\n | \"transparent\"\n | \"floating\"\n | \"editorial\";\n\n// Header has no content fields - variant comes from theme.header.variant\n// CTA is handled via navigation items with is_cta flag\nexport type SiteHeaderContent = Record<string, never>;\n\nexport const siteHeaderBlockDefinition: SystemBlockDefinition<SiteHeaderContent> =\n {\n manifest: siteHeaderManifest,\n };\n","import type { NodeDefinition } from \"../node\";\nimport { bind, link, repeat, stack, text, when } from \"../node/builder\";\nimport { textColorStyle } from \"../../theme/utils/colorStyles\";\n\nexport const footerNavGroupsLayout: NodeDefinition = stack(\n {\n gap: \"lg\",\n align: \"start\",\n className: \"rb-grid rb-gap-8 rb-md-grid-cols-3\",\n },\n [\n stack(\n { gap: \"md\", align: \"start\", className: \"rb-text-left\" },\n [\n text(\n {\n as: \"h3\",\n className: \"rb-label\",\n style: textColorStyle(\"text/70\"),\n },\n when(\"group.label\"),\n bind(\"group.label\"),\n ),\n stack(\n { gap: \"sm\", align: \"start\", className: \"rb-space-y-2\" },\n [\n link(\n {\n className: \"rb-block rb-nav-text transition-theme rb-hover-opacity-80\",\n style: textColorStyle(\"text\"),\n href: {\n $bind: {\n from: \"entry.link\",\n transforms: [{ id: \"links.resolve\" }],\n },\n },\n linkRequired: true,\n target: { $bind: { from: \"entry.target\" } },\n rel: { $bind: { from: \"entry.rel\" } },\n },\n [text({ as: \"span\" }, bind(\"entry.label\"))],\n repeat(\"group.children\", \"entry\"),\n ),\n ],\n ),\n ],\n repeat(\"footerMenu.groups\", \"group\"),\n ),\n ],\n when(\"footerMenu.groups\"),\n);\n","import { footerNav } from \"../node/fragments\";\nimport type { BlockManifest } from \"../manifest/schema\";\nimport type { NodeDefinition } from \"../node\";\nimport { bind, inline, link, media, section, stack, text, when } from \"../node/builder\";\nimport type { NodeModifier } from \"../node/builder\";\nimport type { SystemBlockDefinition } from \"../registry\";\nimport { footerBottomTextFragment, materializeFragment } from \"../fragments\";\nimport { createBlockManifest } from \"../defineBlock\";\nimport { footerNavGroupsLayout } from \"./site-footer-nav-groups-layout\";\nimport {\n backgroundColorStyle,\n borderColorStyle,\n mergeStyles,\n textColorStyle,\n} from \"../../theme/utils/colorStyles\";\n\nconst footerTextLayout = (): NodeDefinition[] =>\n materializeFragment({ fragment: footerBottomTextFragment }).layout;\n\nconst whenTransformed = (\n from: string,\n transformId: string,\n equals: unknown = true,\n): NodeModifier => (node) => ({\n ...node,\n $when: {\n when: {\n from,\n transforms: [{ id: transformId }],\n },\n equals,\n },\n});\n\nconst bottomBarTextLayout = (): NodeDefinition[] => {\n const layout = footerTextLayout();\n const bottomTextNode = layout[1];\n return bottomTextNode ? [bottomTextNode] : [];\n};\n\nconst bodyTextLayout = (): NodeDefinition[] => {\n const layout = footerTextLayout();\n const bodyTextNode = layout[0];\n return bodyTextNode ? [bodyTextNode] : [];\n};\n\nconst inlineBottomTextLayout = (): NodeDefinition[] => {\n const layout = footerTextLayout();\n const bottomTextNode = layout[1];\n if (!bottomTextNode) return [];\n return [\n when(\"$root.theme.footer.bottomBar.enabled\", { equals: true, not: true })(bottomTextNode),\n ];\n};\n\nconst simpleFooterLayout = stack(\n {\n gap: \"md\",\n align: \"center\",\n className: {\n $bind: {\n from: \"$root.theme.footer.maxWidth\",\n transforms: [\n {\n id: \"layout.maxWidthClass\",\n options: {\n base: \"rb-flex rb-w-full rb-flex-col rb-items-center rb-gap-4 rb-py-10 rb-text-center\",\n },\n },\n ],\n fallback:\n \"rb-container rb-flex rb-w-full rb-flex-col rb-items-center rb-gap-4 rb-py-10 rb-text-center\",\n },\n },\n },\n [\n footerNav({\n collectionPath: \"footerMenu.items\",\n mode: \"flatten\",\n className: \"rb-flex rb-flex-wrap rb-justify-center rb-gap-x-6 rb-gap-y-3\",\n linkClassName:\n \"footer-nav-link rb-inline-flex rb-items-center rb-px-4 rb-py-2 rb-nav-text transition-theme-standard\",\n }),\n ...bodyTextLayout(),\n ...inlineBottomTextLayout(),\n ],\n when(\"$root.theme.footer.variant\", { equals: \"simple\" }),\n);\n\nconst columnsFooterLayout = stack(\n {\n gap: \"xl\",\n align: \"start\",\n className: {\n $bind: {\n from: \"$root.theme.footer.maxWidth\",\n transforms: [\n {\n id: \"layout.maxWidthClass\",\n options: {\n base: \"rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12\",\n },\n },\n ],\n fallback:\n \"rb-container rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12\",\n },\n },\n },\n [\n footerNavGroupsLayout,\n inline(\n {\n className:\n \"rb-flex rb-w-full rb-flex-wrap rb-items-center rb-justify-between rb-gap-4\",\n },\n [\n text(\n {\n as: \"strong\",\n className: \"rb-block rb-nav-text\",\n style: textColorStyle(\"text\"),\n },\n whenTransformed(\"$root.theme.footer\", \"layout.footerLogoTextVisible\"),\n bind(\"site.title\", { fallback: \"Your Site\" }),\n ),\n footerNav({\n collectionPath: \"footerMenu.items\",\n mode: \"links-only\",\n className:\n \"rb-flex rb-flex-wrap rb-justify-end rb-gap-x-6 rb-gap-y-3\",\n linkClassName:\n \"footer-nav-link rb-inline-flex rb-items-center rb-px-4 rb-py-2 rb-nav-text transition-theme-standard\",\n }),\n ],\n ),\n ...bodyTextLayout(),\n ...inlineBottomTextLayout(),\n ],\n when(\"$root.theme.footer.variant\", { equals: \"columns\" }),\n);\n\nconst splitFooterLayout = stack(\n {\n gap: \"xl\",\n align: \"start\",\n className: {\n $bind: {\n from: \"$root.theme.footer.maxWidth\",\n transforms: [\n {\n id: \"layout.maxWidthClass\",\n options: {\n base: \"rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12\",\n },\n },\n ],\n fallback:\n \"rb-container rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12\",\n },\n },\n },\n [\n inline(\n {\n className:\n \"rb-flex rb-w-full rb-flex-col rb-items-start rb-justify-between rb-gap-8 rb-md-flex-row rb-md-items-end\",\n },\n [\n stack(\n {},\n [\n footerNav({\n collectionPath: \"footerMenu.items\",\n mode: \"flatten\",\n className: {\n $bind: {\n from: \"$root.theme.footer.navLayout\",\n transforms: [{ id: \"layout.footerSplitNavSingleClass\" }],\n fallback: \"rb-w-full rb-space-y-3 rb-text-left\",\n },\n },\n linkClassName:\n \"footer-nav-link rb-inline-flex rb-items-center rb-whitespace-nowrap rb-nav-text transition-theme-standard\",\n }),\n ],\n ),\n link(\n {\n href: \"/\",\n className: {\n $bind: {\n from: \"$root.theme.footer.logo\",\n transforms: [{ id: \"layout.footerLogoClass\" }],\n fallback:\n \"footer-logo rb-inline-flex rb-items-center rb-justify-end rb-gap-3 rb-self-end rb-no-underline rb-text-right rb-transition-opacity rb-hover-opacity-80\",\n },\n },\n },\n [\n media(\n {\n className: {\n $bind: {\n from: \"$root.theme.footer.logo\",\n transforms: [{ id: \"layout.footerLogoMediaClass\" }],\n fallback: \"rb-w-auto\",\n },\n },\n },\n when(\"content.logo\"),\n bind(\"content.logo\"),\n ),\n stack(\n { className: \"rb-contents\" },\n [\n media(\n {\n className: {\n $bind: {\n from: \"$root.theme.footer.logo\",\n transforms: [{ id: \"layout.footerLogoMediaClass\" }],\n fallback: \"rb-w-auto\",\n },\n },\n },\n when(\"site.logo\"),\n bind(\"site.logo\"),\n ),\n ],\n when(\"content.logo\", { not: true }),\n ),\n text(\n {\n as: \"strong\",\n className: \"footer-logo-text rb-nav-text\",\n },\n whenTransformed(\"$root.theme.footer\", \"layout.footerLogoTextVisible\"),\n bind(\"site.title\", { fallback: \"Your Site\" }),\n ),\n ],\n ),\n ],\n ),\n ...inlineBottomTextLayout(),\n ],\n when(\"$root.theme.footer.variant\", { equals: \"split\" }),\n);\n\nconst footerLayout: NodeDefinition = section(\n {\n background: \"background\",\n className: {\n $bind: {\n from: \"$root.theme.footer\",\n transforms: [\n {\n id: \"layout.footerRootClass\",\n },\n ],\n fallback: \"rb-w-full rb-border-t transition-theme\",\n },\n },\n style: {\n $bind: {\n from: \"$root.theme.footer\",\n transforms: [\n {\n id: \"layout.footerRootStyle\",\n },\n ],\n fallback: mergeStyles(\n backgroundColorStyle(\"surface\"),\n textColorStyle(\"text\"),\n borderColorStyle(\"border\"),\n ),\n },\n },\n },\n [\n simpleFooterLayout,\n columnsFooterLayout,\n splitFooterLayout,\n stack(\n {\n className: {\n $bind: {\n from: \"$root.theme.footer\",\n transforms: [{ id: \"layout.footerBottomBarClass\" }],\n fallback: \"rb-w-full rb-border-t rb-py-5\",\n },\n },\n style: {\n $bind: {\n from: \"$root.theme.footer\",\n transforms: [{ id: \"layout.footerBottomBarStyle\" }],\n },\n },\n },\n [\n stack(\n {\n className: {\n $bind: {\n from: \"$root.theme.footer\",\n transforms: [{ id: \"layout.footerBottomBarContainerClass\" }],\n fallback: \"rb-container\",\n },\n },\n },\n [...bottomBarTextLayout()],\n ),\n ],\n when(\"$root.theme.footer.bottomBar.enabled\", { equals: true }),\n ),\n ],\n);\n\nexport const siteFooterManifest: BlockManifest = createBlockManifest({\n id: \"block.site-footer\",\n title: \"Site Footer\",\n category: \"layout\",\n\n // Use fragment for bottom text only (footer links are driven by footer navigation)\n fragments: [{ fragment: footerBottomTextFragment, fieldPriority: 0 }],\n\n // Skip section styles - this block uses theme-based styling\n skipSectionStyles: true,\n\n layout: footerLayout,\n\n description: \"Site-wide footer with navigation links and optional columns.\",\n styleTokens: {\n spacing: \"md\",\n },\n paletteHidden: true,\n});\n\nexport type SiteFooterVariant = \"simple\" | \"columns\" | \"split\";\n\nexport type SiteFooterContent = {\n bodyText?: unknown;\n bottomText?: unknown;\n};\n\nexport const siteFooterBlockDefinition: SystemBlockDefinition<SiteFooterContent> =\n {\n manifest: siteFooterManifest,\n };\n","import type { BlockManifest } from '../manifest/schema'\nimport { parseFieldDefinitions } from '../manifest/schema'\nimport type { NodeDefinition } from '../node'\nimport { styledContainer } from '../node/fragments'\nimport { styledSection } from '../node/fragments/styledSection'\nimport { cardStylesField, type CardStylesContent, type ContainerStylesContent, type SectionStylesContent } from '../fields/boxStyles'\nimport type { BlockDataLoader, SystemBlockDefinition } from '../registry'\nimport { createBlockManifest } from '../defineBlock'\nimport { stack } from '../node/builder'\nimport {\n testimonialsHeadingFragment,\n testimonialsCarouselFragment,\n buildCarouselLayout,\n buildGridLayout,\n buildFeaturedLayout,\n} from '../fragments'\n\n/**\n * Wrap a variant layout with the standard testimonials section structure.\n * This provides consistent background, padding, and heading across all variants.\n * Uses styledSection() to properly bind _sectionStyles (background + spacing).\n */\nconst wrapVariant = (variantLayout: NodeDefinition): NodeDefinition =>\n styledSection({\n children: styledContainer({\n children: stack(\n { gap: 'xl', className: 'rb-relative' },\n [\n ...testimonialsHeadingFragment.layout,\n variantLayout,\n ],\n ),\n }),\n // styledContainer (rb-container) already provides horizontal padding\n baseClass: '',\n spacing: 'comfortable',\n imageClassName: 'rb-absolute rb-inset-0 rb-z-neg-10 rb-h-full rb-w-full rb-object-cover rb-opacity-50',\n })\n\n// Build layouts for each variant\nconst carouselLayout = wrapVariant(buildCarouselLayout())\nconst gridLayout = wrapVariant(buildGridLayout())\nconst featuredLayout = wrapVariant(buildFeaturedLayout())\n\n// Additional fields not from fragments (using fieldSchema.parse for type safety)\nconst additionalFields = parseFieldDefinitions([\n // Heading fields from fragment\n ...testimonialsHeadingFragment.fields,\n\n // Avatar layout (shared across all variants)\n {\n id: 'avatarLayout',\n type: 'select',\n label: 'Avatar layout',\n description: 'Controls where the headshot appears in testimonial cards.',\n defaultValue: 'above-centered',\n options: [\n { value: 'above-centered', label: 'Above (centered)' },\n { value: 'inline-left', label: 'Inline (left)' },\n { value: 'hidden', label: 'Hidden' },\n ],\n ui: { intent: 'display' as const },\n },\n\n // Grid-specific: column count\n {\n id: 'gridColumns',\n type: 'select',\n label: 'Grid columns',\n description: 'Number of columns in the grid layout.',\n defaultValue: '3',\n options: [\n { value: '2', label: '2 columns' },\n { value: '3', label: '3 columns' },\n { value: '4', label: '4 columns' },\n ],\n ui: {\n intent: 'display' as const,\n visibleWhen: { field: 'variant', equals: 'grid' },\n },\n },\n\n // Featured-specific: entry picker\n {\n id: 'featuredEntryId',\n type: 'entryPicker',\n label: 'Featured testimonial',\n description: 'Choose which testimonial entry to feature (falls back to the first available).',\n required: false,\n ui: {\n fixedContentType: 'testimonial',\n visibleWhen: { field: 'variant', equals: 'featured' },\n },\n },\n\n // Carousel-specific fields (from fragment)\n ...testimonialsCarouselFragment.fields,\n\n // Card styles\n (() => {\n const field = cardStylesField({\n id: '_cardStyles',\n label: 'Testimonial card styles',\n })\n return {\n ...field,\n ui: {\n ...(field.ui ?? {}),\n intent: 'style' as const,\n },\n }\n })(),\n])\n\n// Data loaders: entries loader from fragment + featured entry loader\nconst entriesLoader = testimonialsCarouselFragment.data?.loader\nconst dataLoaders: Record<string, BlockDataLoader> = {\n ...(entriesLoader ? { entries: entriesLoader } : {}),\n // Featured entry loader - only fetches when picker is set\n featured: {\n endpoint: 'listPublishedEntries',\n when: { $bind: { from: 'featuredEntryId', fallback: '' } },\n params: {\n type: 'testimonial',\n siteId: { $bind: { from: '$root.siteId' } },\n limit: '1',\n stage: { $bind: { from: '$root.previewStage', fallback: 'published' } },\n mode: {\n $bind: {\n from: 'featuredEntryId',\n fallback: '',\n transforms: [\n {\n id: 'ui.conditionalClass',\n options: { whenTrue: 'manual', whenFalse: '' },\n },\n ],\n },\n },\n entryIds: { $bind: { from: 'featuredEntryId', fallback: '', transforms: [{ id: 'value.jsonArray' }] } },\n },\n mode: 'server',\n },\n}\n\nexport const testimonialsManifest: BlockManifest = createBlockManifest({\n id: 'block.testimonials',\n title: 'Testimonials',\n category: 'marketing',\n includeContainerStyles: true,\n\n // Default layout (used when no variant specified)\n layout: carouselLayout,\n\n // Variant system - enables the variant switcher control in the editor\n variants: {\n carousel: carouselLayout,\n grid: gridLayout,\n featured: featuredLayout,\n },\n defaultVariant: 'carousel',\n variantOptions: {\n carousel: {\n label: 'Carousel',\n description: 'Swipeable carousel with controls',\n icon: 'GalleryHorizontal',\n },\n grid: {\n label: 'Grid',\n description: 'Responsive grid layout',\n icon: 'Grid',\n },\n featured: {\n label: 'Featured',\n description: 'Single featured testimonial',\n icon: 'Star',\n },\n },\n\n // Fields (variant field is auto-generated by augmentManifest)\n additionalFields,\n\n description: 'Display customer testimonials in carousel, grid, or featured layouts.',\n tags: ['testimonials', 'reviews', 'quotes', 'feedback', 'social-proof', 'customers', 'carousel'],\n icon: 'MessageSquareQuote',\n styleTokens: {\n background: 'surface',\n typography: 'body',\n spacing: 'lg',\n },\n behaviours: {\n supportsThemeSwitching: true,\n inlineEditing: false,\n animation: true,\n paletteHidden: false,\n },\n})\n\nexport type TestimonialsBlockContent = {\n variant?: 'carousel' | 'grid' | 'featured' | null\n heading?: string | null\n subheading?: string | null\n avatarLayout?: 'above-centered' | 'inline-left' | 'hidden' | null\n gridColumns?: '2' | '3' | '4' | null\n featuredEntryId?: string | null\n /** Slides visible on mobile (small screens) */\n slidesToShow?: number | string | null\n /** Slides visible on tablet (medium screens) - overrides mobile if set */\n slidesToShowTablet?: number | string | null\n /** Slides visible on desktop (large screens) - overrides tablet if set */\n slidesToShowDesktop?: number | string | null\n transition?: 'slide' | 'fade' | null\n showDots?: boolean | null\n autoplay?: boolean | null\n autoplayDelay?: number | string | null\n arrowVisibility?: 'always' | 'hover' | null\n maxEntries?: number | string | null\n _cardStyles?: CardStylesContent\n _sectionStyles?: SectionStylesContent\n _containerStyles?: ContainerStylesContent\n}\n\nexport type TestimonialEntryContent = {\n name?: string | null\n jobTitle?: string | null\n company?: string | null\n headshot?: {\n url?: string | null\n alt?: string | null\n } | null\n body?: unknown\n}\n\nexport type TestimonialEntry = {\n id: string\n slug: string | null\n path: string\n publishedAt: string | null\n status: string\n excerpt: string\n routeId: string | null\n content: TestimonialEntryContent\n}\n\nexport const testimonialsBlockDefinition: SystemBlockDefinition<TestimonialsBlockContent> = {\n manifest: testimonialsManifest,\n dataLoaders,\n}\n","import { cardFragment, columnContentFragment, fragmentsToRepeaterField } from '../fragments';\nimport { parseFieldDefinition, type BlockManifest } from '../manifest/schema';\nimport type { SystemBlockDefinition } from '../registry';\nimport { createBlockManifest } from '../defineBlock';\nimport { typeBasedLayout } from '../node';\nimport { el } from '../node/builder';\nimport { styledSection, sectionContainer } from '../node/fragments';\nimport type { SemanticSpacing } from '../spacing';\n\nconst columnsLayout = styledSection({\n children: sectionContainer(\n [\n el('grid',\n {\n className: {\n $bind: {\n from: 'content.equalHeight',\n transforms: [\n {\n id: 'ui.conditionalClass',\n options: {\n whenTrue: 'rb-items-stretch rb-columns-equal-height',\n whenFalse: 'rb-items-stretch',\n },\n },\n ],\n fallback: 'rb-items-stretch',\n },\n },\n style: {\n \"--rb-columns-cols-mobile\": {\n $bind: {\n from: \"content\",\n transforms: [{ id: \"ui.columnsColsAt\", options: { breakpoint: \"mobile\" } }],\n fallback: \"1\",\n },\n },\n \"--rb-columns-cols-md\": {\n $bind: {\n from: \"content\",\n transforms: [{ id: \"ui.columnsColsAt\", options: { breakpoint: \"md\" } }],\n fallback: \"1\",\n },\n },\n \"--rb-columns-cols-lg\": {\n $bind: {\n from: \"content\",\n transforms: [{ id: \"ui.columnsColsAt\", options: { breakpoint: \"lg\" } }],\n fallback: \"1\",\n },\n },\n \"--rb-columns-cols-xl\": {\n $bind: {\n from: \"content\",\n transforms: [{ id: \"ui.columnsColsAt\", options: { breakpoint: \"xl\" } }],\n fallback: \"1\",\n },\n },\n \"--rb-columns-tile-ar\": {\n $bind: {\n from: \"content.equalHeightAspectRatio\",\n transforms: [{ id: \"ui.ratioToHeightFactor\" }],\n fallback: \"1\",\n },\n },\n },\n cols: {\n $bind: {\n from: 'content',\n transforms: [{ id: 'ui.columnsGridCols' }],\n },\n },\n gap: { $bind: { from: 'content.gap' } },\n },\n [\n {\n type: 'stack',\n props: {\n gap: 'md',\n className: {\n $bind: {\n from: 'column.desktopSpan',\n transforms: [\n {\n id: 'ui.columnsDesktopSpanClass',\n options: { base: 'rb-h-full rb-items-stretch' },\n },\n ],\n fallback: 'rb-h-full rb-items-stretch',\n },\n },\n },\n children: typeBasedLayout(\n {\n card: cardFragment.layout,\n columnContent: columnContentFragment.layout,\n },\n { itemName: 'column' }\n ),\n $repeat: {\n collection: { from: 'content.columns' },\n itemName: 'column',\n },\n },\n ]\n ),\n ],\n { gap: 'md' }\n ),\n baseClass: '',\n spacing: 'medium',\n});\n\nexport const columnsManifest: BlockManifest = createBlockManifest({\n id: 'block.columns',\n title: 'Columns',\n category: 'layout',\n\n // Custom fields for columns configuration\n additionalFields: [\n parseFieldDefinition({\n id: 'equalHeight',\n type: 'boolean',\n label: 'Equal height tiles',\n description: 'Force all columns in this row to the same height (useful for editorial image/quote grids).',\n defaultValue: false,\n ui: { intent: 'display' },\n }),\n parseFieldDefinition({\n id: 'equalHeightAspectRatio',\n type: 'select',\n label: 'Tile aspect ratio',\n description: 'When equal height tiles are enabled, this controls the tile height based on a single desktop column width.',\n defaultValue: '3/4',\n ui: { intent: 'display' },\n options: [\n { value: '16/9', label: '16:9 (Landscape)' },\n { value: '4/3', label: '4:3 (Standard)' },\n { value: '1/1', label: '1:1 (Square)' },\n { value: '3/4', label: '3:4 (Portrait)' },\n ],\n }),\n parseFieldDefinition({\n id: 'desktopColumns',\n type: 'select',\n label: 'Desktop columns',\n description: 'Auto uses item count. Set this to create editorial layouts with column spans.',\n defaultValue: 'auto',\n options: [\n { value: 'auto', label: 'Auto' },\n { value: '2', label: '2 columns' },\n { value: '3', label: '3 columns' },\n { value: '4', label: '4 columns' },\n ],\n }),\n parseFieldDefinition({\n id: 'gap',\n type: 'select',\n label: 'Gap between columns',\n defaultValue: 'medium',\n ui: { intent: 'display' },\n options: [\n { value: 'none', label: 'None' },\n { value: 'compact', label: 'Compact' },\n { value: 'cozy', label: 'Cozy' },\n { value: 'medium', label: 'Medium' },\n { value: 'comfortable', label: 'Comfortable' },\n { value: 'spacious', label: 'Spacious' },\n ],\n }),\n fragmentsToRepeaterField(\n 'columns',\n 'Columns',\n {\n card: cardFragment,\n columnContent: columnContentFragment,\n },\n {\n minItems: 0,\n // Allow longer editorial grids (e.g. multiple rows with spans).\n maxItems: 12,\n itemLabel: 'Column',\n description: 'Add or remove columns (up to 12)',\n commonFields: [\n parseFieldDefinition({\n id: 'desktopSpan',\n type: 'select',\n label: 'Desktop span',\n description: 'How many desktop grid columns this item should span.',\n defaultValue: '',\n options: [\n { value: '', label: 'Auto (1)' },\n { value: '2', label: 'Span 2' },\n { value: '3', label: 'Span 3' },\n { value: '4', label: 'Span 4' },\n ],\n }),\n ],\n }\n ),\n ],\n\n layout: columnsLayout,\n\n description: 'Multi-column layout with customizable content per column',\n tags: ['columns', 'grid', 'layout', 'flexible', 'multi-column'],\n icon: 'Columns',\n styleTokens: {\n spacing: 'lg',\n },\n});\n\nexport type ColumnsContent = {\n equalHeight?: boolean;\n equalHeightAspectRatio?: '16/9' | '4/3' | '1/1' | '3/4';\n desktopColumns?: 'auto' | '2' | '3' | '4';\n gap?: SemanticSpacing;\n columns: Array<\n | {\n _type: 'card';\n desktopSpan?: '' | '2' | '3' | '4';\n media?: unknown;\n aspectRatio?: '16/9' | '4/3' | '1/1' | '3/4' | 'auto';\n title: string;\n body?: unknown;\n ctas?: Array<unknown>;\n variant?: string;\n }\n | {\n _type: 'columnContent';\n desktopSpan?: '' | '2' | '3' | '4';\n items: Array<{ _type: string; [key: string]: unknown }>;\n }\n >;\n};\n\nexport const columnsBlockDefinition: SystemBlockDefinition<ColumnsContent> = {\n manifest: columnsManifest,\n};\n","import type { FragmentDefinition } from \"../../fragments\";\nimport { typeBasedLayout } from \"../../node\";\nimport type { NodeDefinition } from \"../../node\";\n\nexport function repeaterFragmentLayout(args: {\n collectionPath: string;\n itemName: string;\n fragments: Record<string, FragmentDefinition>;\n /** Override the layout node for specific fragment types instead of using the fragment's own layout. */\n layoutOverrides?: Record<string, NodeDefinition>;\n itemGap?: string;\n itemClassName?: string;\n}): NodeDefinition {\n const layouts: Record<string, NodeDefinition | NodeDefinition[]> = {};\n for (const [key, fragment] of Object.entries(args.fragments)) {\n layouts[key] = args.layoutOverrides?.[key] ?? fragment.layout;\n }\n\n return {\n type: \"stack\",\n props: {\n gap: args.itemGap ?? \"md\",\n className: args.itemClassName,\n },\n children: typeBasedLayout(layouts, { itemName: args.itemName }),\n $repeat: {\n collection: { from: args.collectionPath, pick: \"collection\" },\n itemName: args.itemName,\n },\n };\n}\n\n","import {\n cardFragment,\n fragmentsToRepeaterField,\n headingFragment,\n imageFragment,\n richTextFragment,\n teamMemberFragment,\n} from \"../fragments\";\nimport { parseFieldDefinition, type BlockManifest } from \"../manifest/schema\";\nimport type { SystemBlockDefinition } from \"../registry\";\nimport { createBlockManifest } from \"../defineBlock\";\nimport { el } from \"../node/builder\";\nimport { styledSection, sectionContainer } from \"../node/fragments\";\nimport type { SemanticSpacing } from \"../spacing\";\nimport { repeaterFragmentLayout } from \"./shared/fragmentCollection\";\n\nconst ITEM_NAME = \"item\";\n\nconst collectionFragments = {\n card: cardFragment,\n image: imageFragment,\n heading: headingFragment,\n richText: richTextFragment,\n teamMember: teamMemberFragment,\n};\n\nconst repeatedItemsNode = repeaterFragmentLayout({\n collectionPath: \"content.items\",\n itemName: ITEM_NAME,\n fragments: collectionFragments,\n itemGap: \"md\",\n});\n\nconst gridLayoutNode = el(\n \"grid\",\n {\n cols: {\n $bind: {\n from: \"content.columns\",\n fallback: 3,\n coerce: \"number\",\n },\n },\n gap: { $bind: { from: \"content.gap\", fallback: \"medium\" } },\n },\n [repeatedItemsNode],\n);\n\nconst stackLayoutNode = {\n type: \"stack\",\n props: {\n gap: { $bind: { from: \"content.gap\", fallback: \"medium\" } },\n },\n children: [repeatedItemsNode],\n};\n\nconst collectionLayout = styledSection({\n children: sectionContainer(\n [\n {\n ...gridLayoutNode,\n $when: { when: { from: \"content.layout\" }, equals: \"grid\" },\n },\n {\n ...stackLayoutNode,\n $when: { when: { from: \"content.layout\" }, equals: \"stack\" },\n },\n ],\n { gap: \"md\" },\n ),\n baseClass: \"\",\n spacing: \"comfortable\",\n});\n\nexport const collectionManifest: BlockManifest = createBlockManifest({\n id: \"block.collection\",\n title: \"Collection\",\n category: \"layout\",\n\n additionalFields: [\n parseFieldDefinition({\n id: \"layout\",\n type: \"select\",\n label: \"Layout\",\n defaultValue: \"grid\",\n options: [\n { value: \"grid\", label: \"Grid\" },\n { value: \"stack\", label: \"Stack\" },\n ],\n ui: { intent: \"display\" },\n }),\n parseFieldDefinition({\n id: \"columns\",\n type: \"select\",\n label: \"Columns\",\n description: \"Number of columns in the grid layout.\",\n defaultValue: \"3\",\n options: [\n { value: \"2\", label: \"2 columns\" },\n { value: \"3\", label: \"3 columns\" },\n { value: \"4\", label: \"4 columns\" },\n ],\n ui: {\n intent: \"display\",\n visibleWhen: { field: \"layout\", equals: \"grid\" },\n },\n }),\n parseFieldDefinition({\n id: \"gap\",\n type: \"select\",\n label: \"Gap\",\n defaultValue: \"medium\",\n options: [\n { value: \"none\", label: \"None\" },\n { value: \"compact\", label: \"Compact\" },\n { value: \"cozy\", label: \"Cozy\" },\n { value: \"medium\", label: \"Medium\" },\n { value: \"comfortable\", label: \"Comfortable\" },\n { value: \"spacious\", label: \"Spacious\" },\n ],\n ui: { intent: \"display\" },\n }),\n fragmentsToRepeaterField(\n \"items\",\n \"Items\",\n collectionFragments,\n {\n minItems: 0,\n maxItems: 50,\n itemLabel: \"Item\",\n description: \"Add items to this collection.\",\n },\n ),\n ],\n\n layout: collectionLayout,\n\n description: \"Repeat items in a grid or stack layout.\",\n tags: [\"collection\", \"grid\", \"stack\", \"repeater\"],\n icon: \"LayoutList\",\n styleTokens: { spacing: \"lg\" },\n});\n\nexport type CollectionContent = {\n layout?: \"grid\" | \"stack\" | null;\n columns?: string | number | null;\n gap?: SemanticSpacing;\n items: Array<{ _type: string; [key: string]: unknown }>;\n};\n\nexport const collectionBlockDefinition: SystemBlockDefinition<CollectionContent> =\n {\n manifest: collectionManifest,\n };\n","import type { FieldDefinition } from '../manifest/schema'\n\nexport type CarouselBehaviorFieldIds = {\n transition: string\n showDots: string\n autoplay: string\n autoplayDelay: string\n arrowVisibility: string\n}\n\nexport type CreateCarouselBehaviorFieldsOptions = {\n ids?: Partial<CarouselBehaviorFieldIds>\n defaults?: Partial<{\n transition: 'slide' | 'fade'\n showDots: boolean\n autoplay: boolean\n autoplayDelay: '3000' | '5000' | '7000' | '10000'\n arrowVisibility: 'always' | 'hover' | 'never'\n }>\n ui?: Partial<{\n intent: 'content' | 'display' | 'behavior' | 'style'\n }>\n}\n\nconst delayOptions: Array<{ value: '3000' | '5000' | '7000' | '10000'; label: string }> = [\n { value: '3000', label: '3 seconds' },\n { value: '5000', label: '5 seconds' },\n { value: '7000', label: '7 seconds' },\n { value: '10000', label: '10 seconds' },\n]\n\nexport function createCarouselBehaviorFields(\n options: CreateCarouselBehaviorFieldsOptions = {},\n): FieldDefinition[] {\n const ids: CarouselBehaviorFieldIds = {\n transition: options.ids?.transition ?? 'transition',\n showDots: options.ids?.showDots ?? 'showDots',\n autoplay: options.ids?.autoplay ?? 'autoplay',\n autoplayDelay: options.ids?.autoplayDelay ?? 'autoplayDelay',\n arrowVisibility: options.ids?.arrowVisibility ?? 'arrowVisibility',\n }\n\n const defaults = {\n transition: options.defaults?.transition ?? 'slide',\n showDots: options.defaults?.showDots ?? true,\n autoplay: options.defaults?.autoplay ?? false,\n autoplayDelay: options.defaults?.autoplayDelay ?? '5000',\n arrowVisibility: options.defaults?.arrowVisibility ?? 'hover',\n } as const\n\n const intent = options.ui?.intent ?? ('behavior' as const)\n\n const fields: FieldDefinition[] = [\n {\n id: ids.transition,\n type: 'select',\n label: 'Transition',\n description: 'Animation style between slides.',\n required: false,\n defaultValue: defaults.transition,\n multiple: false,\n options: [\n { value: 'slide', label: 'Slide' },\n { value: 'fade', label: 'Fade' },\n ],\n ui: { intent },\n },\n {\n id: ids.showDots,\n type: 'boolean',\n label: 'Show dots',\n required: false,\n defaultValue: defaults.showDots,\n ui: { intent },\n },\n {\n id: ids.autoplay,\n type: 'boolean',\n label: 'Autoplay',\n required: false,\n defaultValue: defaults.autoplay,\n ui: { intent },\n },\n {\n id: ids.autoplayDelay,\n type: 'select',\n label: 'Autoplay delay',\n required: false,\n defaultValue: defaults.autoplayDelay,\n multiple: false,\n options: delayOptions,\n ui: {\n intent,\n visibleWhen: { field: ids.autoplay, equals: true },\n },\n },\n {\n id: ids.arrowVisibility,\n type: 'select',\n label: 'Arrow visibility',\n required: false,\n defaultValue: defaults.arrowVisibility,\n multiple: false,\n options: [\n { value: 'hover', label: 'Show on hover' },\n { value: 'always', label: 'Always visible' },\n { value: 'never', label: 'Never' },\n ],\n ui: { intent },\n },\n ]\n\n return fields\n}\n\n","import type { FieldDefinition } from '../manifest/schema'\n\nexport type ImageColSize = '1/4' | '1/3' | '2/5' | '1/2' | '2/3'\n\ntype ImageColSizeFieldOptions = Readonly<{\n id?: string\n label?: string\n description?: string\n defaultValue?: ImageColSize\n uiIntent?: 'display' | 'style'\n visibleWhen?: unknown\n}>\n\nexport function createImageColSizeField(\n options: ImageColSizeFieldOptions = {},\n): FieldDefinition {\n const {\n id = 'imageColSize',\n label = 'Image column size',\n description = 'Controls how large the image/thumbnail column is at desktop breakpoints.',\n defaultValue = '1/3',\n uiIntent = 'display',\n visibleWhen,\n } = options\n\n return {\n id,\n type: 'select',\n label,\n description,\n required: false,\n defaultValue,\n multiple: false,\n options: [\n { value: '1/4', label: 'Small (1/4)' },\n { value: '1/3', label: 'Medium (1/3)' },\n { value: '2/5', label: 'Large (2/5)' },\n { value: '1/2', label: 'Extra large (1/2)' },\n { value: '2/3', label: 'Huge (2/3)' },\n ],\n ui: {\n intent: uiIntent,\n ...(visibleWhen ? { visibleWhen } : {}),\n },\n } as FieldDefinition\n}\n\nexport type ImagePosition = 'left' | 'right' | 'alternate'\n\ntype ImagePositionFieldOptions = Readonly<{\n id?: string\n label?: string\n description?: string\n defaultValue?: Exclude<ImagePosition, 'alternate'> | ImagePosition\n includeAlternate?: boolean\n uiIntent?: 'display' | 'style'\n visibleWhen?: unknown\n}>\n\nexport function createImagePositionField(\n options: ImagePositionFieldOptions = {},\n): FieldDefinition {\n const {\n id = 'imagePosition',\n label = 'Image position',\n description = 'Choose which side the image appears on.',\n defaultValue = 'left',\n includeAlternate = false,\n uiIntent = 'display',\n visibleWhen,\n } = options\n\n const positionOptions = [\n { value: 'left', label: 'Left' },\n { value: 'right', label: 'Right' },\n ...(includeAlternate ? [{ value: 'alternate', label: 'Alternate' }] : []),\n ] as const\n\n return {\n id,\n type: 'select',\n label,\n description,\n required: false,\n defaultValue,\n multiple: false,\n // Spread to get a mutable array type without unsafe casts.\n options: [...positionOptions],\n ui: {\n intent: uiIntent,\n ...(visibleWhen ? { visibleWhen } : {}),\n },\n } as FieldDefinition\n}\n","import type { BlockManifest } from \"../manifest\";\nimport type { TipTapNode } from \"../manifest/richTextSchema\";\nimport type { SystemBlockDefinition } from \"../registry\";\nimport type { SemanticSpacing } from \"../spacing\";\nimport { createBlockManifest } from \"../defineBlock\";\nimport {\n styledSection,\n responsiveTwoColumn,\n styledCard,\n styledContainer,\n} from \"../node/fragments\";\nimport type { NodeModifier } from \"../node/builder\";\nimport { bind, carousel, el, media, repeat, richText, text, when } from \"../node/builder\";\nimport { cardStylesField } from \"../fields/boxStyles\";\nimport { createCarouselBehaviorFields } from \"../fields/carousel\";\nimport {\n createImageColSizeField,\n createImagePositionField,\n type ImageColSize,\n} from \"../fields/imageLayout\";\n\ntype MediaTextAlignment = \"left\" | \"center\";\ntype MediaTextImagePosition = \"left\" | \"right\";\ntype MediaTextAspectRatio = \"auto\" | \"16/9\" | \"4/3\" | \"1/1\" | \"3/4\";\n\nconst textCardStylesField = (() => {\n const field = cardStylesField({\n id: \"_textCardStyles\",\n label: \"Text card styles\",\n });\n return {\n ...field,\n ui: {\n ...(field.ui ?? {}),\n intent: \"style\" as const,\n visibleWhen: { field: \"wrapTextInCard\", equals: true },\n },\n };\n})();\n\nexport const mediaTextManifest: BlockManifest = createBlockManifest({\n id: \"block.media-text\",\n title: \"Media Text\",\n category: \"layout\",\n includeContainerStyles: true,\n\n additionalFields: [\n {\n id: \"images\",\n type: \"repeater\",\n label: \"Images\",\n required: false,\n itemLabel: \"Image\",\n minItems: 0,\n maxItems: 6,\n allowConversion: true,\n ui: {\n intent: \"content\",\n repeaterPreset: \"thumbnailGrid\",\n thumbnailField: \"image\",\n },\n schema: {\n fields: [\n {\n id: \"image\",\n type: \"media\",\n label: \"Image\",\n required: true,\n mediaKinds: [\"image\"],\n },\n ],\n },\n },\n {\n id: \"title\",\n type: \"text\",\n label: \"Title\",\n required: false,\n multiline: false,\n maxLength: 120,\n },\n {\n id: \"titleAlignment\",\n type: \"select\",\n label: \"Title alignment\",\n required: false,\n defaultValue: \"left\",\n multiple: false,\n options: [\n { value: \"left\", label: \"Left\" },\n { value: \"center\", label: \"Center\" },\n ],\n ui: { intent: \"display\" },\n },\n createImagePositionField({\n id: \"imagePosition\",\n label: \"Image position\",\n defaultValue: \"left\",\n uiIntent: \"display\",\n }),\n {\n id: \"gap\",\n type: \"select\",\n label: \"Gap between media and text\",\n required: false,\n defaultValue: \"comfortable\",\n multiple: false,\n options: [\n { value: \"none\", label: \"None\" },\n { value: \"compact\", label: \"Compact\" },\n { value: \"cozy\", label: \"Cozy\" },\n { value: \"medium\", label: \"Medium\" },\n { value: \"comfortable\", label: \"Comfortable\" },\n { value: \"spacious\", label: \"Spacious\" },\n ],\n ui: { intent: \"display\" },\n },\n {\n // NOTE: Field id remains `ratio` for stored content compatibility.\n // This is the shared “image column size” control used across blocks.\n ...createImageColSizeField({\n id: \"ratio\",\n label: \"Image column size\",\n defaultValue: \"1/2\",\n uiIntent: \"display\",\n }),\n },\n ...createCarouselBehaviorFields({\n ids: {\n transition: \"carouselTransition\",\n autoplay: \"carouselAutoplay\",\n autoplayDelay: \"carouselAutoplayDelay\",\n arrowVisibility: \"carouselArrowVisibility\",\n showDots: \"showDots\",\n },\n defaults: {\n showDots: true,\n arrowVisibility: \"hover\",\n autoplayDelay: \"5000\",\n transition: \"slide\",\n },\n ui: { intent: \"behavior\" },\n }),\n {\n id: \"aspectRatio\",\n type: \"select\",\n label: \"Image aspect ratio\",\n description: \"Crop image to a consistent aspect ratio.\",\n required: false,\n defaultValue: \"auto\",\n multiple: false,\n options: [\n { value: \"auto\", label: \"Auto (original)\" },\n { value: \"16/9\", label: \"16:9 (Landscape)\" },\n { value: \"4/3\", label: \"4:3 (Standard)\" },\n { value: \"1/1\", label: \"1:1 (Square)\" },\n { value: \"3/4\", label: \"3:4 (Portrait)\" },\n ],\n ui: {\n intent: \"display\",\n visibleWhen: { field: \"images\", notEquals: null },\n },\n },\n {\n id: \"text\",\n type: \"richText\",\n label: \"Text\",\n required: true,\n ui: {\n richTextVariant: \"full\",\n },\n },\n {\n id: \"wrapTextInCard\",\n type: \"boolean\",\n label: \"Wrap text in card\",\n required: false,\n defaultValue: false,\n ui: { intent: \"display\" },\n },\n textCardStylesField,\n ],\n\n ...(() => {\n const imagesLengthBinding = {\n from: \"content.images\",\n transforms: [{ id: \"array.length\" }],\n fallback: 0,\n };\n\n const whenImagesLength = (equals: number, options?: { not?: boolean }): NodeModifier => (node) => ({\n ...node,\n $when: {\n when: imagesLengthBinding,\n equals,\n ...(options?.not ? { not: true } : {}),\n },\n });\n\n const defaultTextColumn = el(\"div\", {}, [\n styledCard(\n [\n richText(\n {\n className: \"rb-prose rb-max-w-none\",\n },\n bind(\"content.text\"),\n ),\n ],\n {\n stylesFrom: \"content._textCardStyles\",\n backgroundFrom: \"content._textCardStyles.background\",\n },\n when(\"content.wrapTextInCard\"),\n ),\n richText(\n {\n className: \"rb-prose rb-max-w-none\",\n },\n when(\"content.wrapTextInCard\", { not: true }),\n bind(\"content.text\"),\n ),\n ]);\n\n const defaultImageCommonProps = {\n className: \"rb-w-full rb-h-auto rb-object-cover\",\n style: {\n aspectRatio: { $bind: { from: \"content.aspectRatio\" } },\n },\n } as const;\n\n const defaultSingleImage = media(defaultImageCommonProps, bind(\"content.images[0].image\"));\n\n const defaultCarouselImages = carousel(\n {\n className: \"rb-media-text-carousel\",\n transition: { $bind: { from: \"content.carouselTransition\", fallback: \"slide\" } },\n showDots: { $bind: { from: \"content.showDots\", fallback: true } },\n autoplay: { $bind: { from: \"content.carouselAutoplay\", fallback: false } },\n autoplayDelay: { $bind: { from: \"content.carouselAutoplayDelay\", fallback: 5000, coerce: \"number\" } },\n arrowVisibility: { $bind: { from: \"content.carouselArrowVisibility\", fallback: \"hover\" } },\n showControls: true,\n loop: true,\n slidesToShow: 1,\n },\n [media(defaultImageCommonProps, bind(\"item.image\"), repeat(\"content.images\", \"item\"))],\n );\n\n const defaultImagesLayout = el(\n \"div\",\n {},\n [\n responsiveTwoColumn({\n image: el(\"div\", {}, [\n el(\"div\", {}, [defaultSingleImage], whenImagesLength(1)),\n el(\"div\", {}, [defaultCarouselImages], whenImagesLength(1, { not: true })),\n ]),\n text: defaultTextColumn,\n ratioFrom: \"content.ratio\",\n imagePositionFrom: \"content.imagePosition\",\n containerClassName: \"rb-flex rb-flex-col rb-md-flex-row\",\n gapFrom: \"content.gap\",\n gapFallback: \"comfortable\",\n imageWrapperClassName: \"rb-w-full rb-shrink-0\",\n textWrapperClassName: \"rb-w-full rb-min-w-0 rb-flex-1\",\n }),\n ],\n whenImagesLength(0, { not: true }),\n );\n\n const defaultLegacyImageLayout = el(\n \"div\",\n {},\n [\n // NOTE: Node $when currently supports a single predicate. Nest wrappers to express\n // AND conditions (images.length === 0 AND legacy content.image exists).\n el(\n \"div\",\n {},\n [\n responsiveTwoColumn({\n image: media(defaultImageCommonProps, bind(\"content.image\")),\n text: defaultTextColumn,\n ratioFrom: \"content.ratio\",\n imagePositionFrom: \"content.imagePosition\",\n containerClassName: \"rb-flex rb-flex-col rb-md-flex-row\",\n gapFrom: \"content.gap\",\n gapFallback: \"comfortable\",\n imageWrapperClassName: \"rb-w-full rb-shrink-0\",\n textWrapperClassName: \"rb-w-full rb-min-w-0 rb-flex-1\",\n }),\n ],\n when(\"content.image\"),\n ),\n ],\n whenImagesLength(0),\n );\n\n const defaultTextOnlyLayout = el(\n \"div\",\n {},\n [\n // NOTE: Node $when currently supports a single predicate. Nest wrappers to express\n // AND conditions (images.length === 0 AND legacy content.image is missing).\n el(\n \"div\",\n {},\n [\n styledCard(\n [\n richText(\n {\n className: \"rb-prose rb-max-w-none\",\n },\n bind(\"content.text\"),\n ),\n ],\n {\n stylesFrom: \"content._textCardStyles\",\n backgroundFrom: \"content._textCardStyles.background\",\n },\n when(\"content.wrapTextInCard\"),\n ),\n richText(\n {\n className: \"rb-prose rb-max-w-none\",\n },\n when(\"content.wrapTextInCard\", { not: true }),\n bind(\"content.text\"),\n ),\n ],\n when(\"content.image\", { not: true }),\n ),\n ],\n whenImagesLength(0),\n );\n\n const defaultInner = el(\"div\", {}, [defaultImagesLayout, defaultLegacyImageLayout, defaultTextOnlyLayout]);\n\n const defaultLayout = styledSection({\n children: styledContainer({\n rootType: \"stack\",\n rootProps: { gap: \"lg\" },\n children: [\n text(\n {\n as: \"h2\",\n className: {\n $bind: {\n from: \"content.titleAlignment\",\n transforms: [\n {\n id: \"ui.headingClassFromAlignment\",\n options: { base: \"\" },\n },\n ],\n fallback: \"\",\n },\n },\n },\n when(\"content.title\"),\n bind(\"content.title\"),\n ),\n defaultInner,\n ],\n }),\n // styledContainer (rb-container) already provides horizontal padding\n baseClass: \"\",\n spacing: \"medium\",\n });\n\n // Variant: flush (container background, no gap at md, image fills height)\n const flushTextColumn = el(\n \"div\",\n { className: \"rb-flex rb-flex-col rb-gap-4 rb-items-stretch rb-justify-start rb-min-w-0 rb-p-6 rb-sm-p-8\" },\n [\n text({ as: \"h2\", className: \"rb-text-left\" }, when(\"content.title\"), bind(\"content.title\")),\n el(\"div\", { className: \"rb-border-t\", style: { paddingTop: \"1.5rem\" } }, [\n richText({ className: \"rb-prose rb-max-w-none\" }, bind(\"content.text\")),\n ]),\n ],\n );\n\n // Flush layout where the title lives above the media (within the container background),\n // so it reads as part of the media column rather than the text column.\n const flushTextColumnNoTitle = el(\n \"div\",\n { className: \"rb-flex rb-flex-col rb-gap-4 rb-items-stretch rb-justify-start rb-min-w-0 rb-p-6 rb-sm-p-8\" },\n [\n el(\"div\", { className: \"rb-border-t\", style: { paddingTop: \"1.5rem\" } }, [\n richText({ className: \"rb-prose rb-max-w-none\" }, bind(\"content.text\")),\n ]),\n ],\n );\n\n const flushImageCommonProps = {\n className: \"rb-w-full rb-h-full rb-object-cover\",\n // Force a portrait crop regardless of the original asset aspect ratio.\n // The layout height is text-driven; the image fills that height via CSS.\n size: { width: 1440, height: 1920, quality: 85, resize: \"cover\" },\n } as const;\n\n const flushSingleImage = media(flushImageCommonProps, bind(\"content.images[0].image\"));\n const flushCarouselImages = carousel(\n {\n className: \"rb-media-text-carousel rb-media-text-carousel--fill rb-carousel-dots-overlay rb-h-full rb-w-full\",\n transition: { $bind: { from: \"content.carouselTransition\", fallback: \"slide\" } },\n showDots: { $bind: { from: \"content.showDots\", fallback: true } },\n autoplay: { $bind: { from: \"content.carouselAutoplay\", fallback: true } },\n autoplayDelay: { $bind: { from: \"content.carouselAutoplayDelay\", fallback: 12000, coerce: \"number\" } },\n arrowVisibility: { $bind: { from: \"content.carouselArrowVisibility\", fallback: \"hover\" } },\n showControls: true,\n loop: true,\n slidesToShow: 1,\n },\n [media(flushImageCommonProps, bind(\"item.image\"), repeat(\"content.images\", \"item\"))],\n );\n\n const flushImagesLayoutTitleInText = el(\n \"div\",\n {},\n [\n responsiveTwoColumn({\n image: el(\"div\", { className: \"rb-h-full\" }, [\n el(\"div\", { className: \"rb-h-full\" }, [flushSingleImage], whenImagesLength(1)),\n el(\"div\", { className: \"rb-h-full\" }, [flushCarouselImages], whenImagesLength(1, { not: true })),\n ]),\n text: flushTextColumn,\n ratioFrom: \"content.ratio\",\n imagePositionFrom: \"content.imagePosition\",\n containerClassName: \"rb-flex rb-flex-col rb-md-flex-row rb-items-stretch\",\n gapClassName: \"rb-gap-6 rb-md-gap-0\",\n imageWrapperClassName: \"rb-w-full rb-shrink-0 rb-overflow-hidden\",\n textWrapperClassName: \"rb-w-full rb-min-w-0 rb-flex-1\",\n }),\n ],\n whenImagesLength(0, { not: true }),\n );\n\n const flushImagesLayoutTitleOverMedia = el(\n \"div\",\n {},\n [\n // Title as a full-width row inside the container background.\n el(\n \"div\",\n { className: \"rb-p-6 rb-sm-p-8 rb-pb-4\" },\n [\n text(\n { as: \"h2\", className: \"rb-text-left\" },\n when(\"content.title\"),\n bind(\"content.title\"),\n ),\n ],\n ),\n responsiveTwoColumn({\n image: el(\"div\", { className: \"rb-h-full rb-flex-1 rb-min-h-0 rb-overflow-hidden\" }, [\n el(\"div\", { className: \"rb-h-full\" }, [flushSingleImage], whenImagesLength(1)),\n el(\"div\", { className: \"rb-h-full\" }, [flushCarouselImages], whenImagesLength(1, { not: true })),\n ]),\n text: flushTextColumnNoTitle,\n ratioFrom: \"content.ratio\",\n imagePositionFrom: \"content.imagePosition\",\n containerClassName: \"rb-flex rb-flex-col rb-md-flex-row rb-items-stretch\",\n gapClassName: \"rb-gap-6 rb-md-gap-0\",\n // Padding around both columns so the background contains the image + text.\n imageWrapperClassName:\n \"rb-w-full rb-shrink-0 rb-px-6 rb-sm-px-8 rb-pb-6 rb-sm-pb-8\",\n textWrapperClassName:\n \"rb-w-full rb-min-w-0 rb-flex-1 rb-px-6 rb-sm-px-8 rb-pb-6 rb-sm-pb-8\",\n }),\n ],\n whenImagesLength(0, { not: true }),\n );\n\n const flushTextOnlyLayout = el(\n \"div\",\n {},\n [\n richText({ className: \"rb-prose rb-max-w-none\" }, bind(\"content.text\")),\n ],\n whenImagesLength(0),\n );\n\n const flushLayout = styledSection({\n children: styledContainer({\n rootType: \"stack\",\n rootProps: { gap: \"none\" },\n // DX: reuse existing fields to switch between the two layouts.\n // - imagePosition=\"left\" (or unset): title above media + padded media (contained by background)\n // - imagePosition=\"right\": title in text column + flush media (no padding)\n children: [\n el(\"div\", {}, [flushImagesLayoutTitleInText], when(\"content.imagePosition\", { equals: \"right\" })),\n el(\"div\", {}, [flushImagesLayoutTitleOverMedia], when(\"content.imagePosition\", { equals: \"right\", not: true })),\n flushTextOnlyLayout,\n ],\n }),\n baseClass: \"\",\n spacing: \"medium\",\n });\n\n return {\n layout: defaultLayout,\n variants: {\n default: defaultLayout,\n flushCardCarousel: flushLayout,\n },\n defaultVariant: \"default\",\n variantOptions: {\n default: { label: \"Default\" },\n flushCardCarousel: { label: \"Flush card + carousel\" },\n },\n };\n })(),\n\n description:\n \"Two columns: image/carousel + rich text (with optional section title).\",\n tags: [\"media\", \"image\", \"carousel\", \"text\", \"two-column\", \"layout\"],\n icon: \"Columns\",\n});\n\nexport type MediaTextContent = {\n title?: string | null;\n titleAlignment?: MediaTextAlignment | null;\n imagePosition?: MediaTextImagePosition | null;\n gap?: SemanticSpacing | null;\n ratio?: ImageColSize | null;\n aspectRatio?: MediaTextAspectRatio | null;\n images?: Array<{ image: unknown | null }> | null;\n carouselTransition?: \"slide\" | \"fade\" | null;\n carouselAutoplay?: boolean | null;\n carouselAutoplayDelay?: \"3000\" | \"5000\" | \"7000\" | \"10000\" | null;\n carouselArrowVisibility?: \"always\" | \"hover\" | \"never\" | null;\n showDots?: boolean | null;\n /** Legacy field retained for expand/contract migrations; not shown in editor. */\n image?: unknown | null;\n text: TipTapNode;\n wrapTextInCard?: boolean | null;\n _textCardStyles?: unknown;\n};\n\nexport const mediaTextBlockDefinition: SystemBlockDefinition<MediaTextContent> =\n {\n manifest: mediaTextManifest,\n };\n","import { z } from \"zod\";\n\nimport type { BlockManifest } from \"../manifest/schema\";\nimport type { SystemBlockDefinition } from \"../registry\";\nimport { text, richText, bookingForm } from \"../node/builder\";\nimport { bind, when } from \"../node/builder\";\nimport { styledSection } from \"../node/fragments/styledSection\";\nimport { sectionContainer } from \"../node/fragments\";\nimport { sectionStylesField, type SectionStylesContent } from \"../fields/boxStyles\";\nimport { createBlockManifest } from \"../defineBlock\";\n\n/**\n * Appointment Booking Block (v2.0.0)\n *\n * This block creates a multi-step booking flow that references a booking form\n * for customer information fields. The booking form determines which services\n * can be booked and contains all field customization.\n *\n * Flow:\n * 1. Service/Resource Selection (if form allows multiple services)\n * 2. Date & Time Slot Picker (hardcoded, not customizable)\n * 3. Customer Information (from booking form fields)\n * 4. Confirmation\n *\n * The block no longer uses fragment composition - instead it dynamically\n * loads the booking form definition and renders its fields.\n */\nexport const appointmentBookingManifest: BlockManifest = createBlockManifest({\n id: \"block.appointment-booking\",\n version: \"2.0.0\", // Major version bump - breaking change from v1\n title: \"Appointment Booking\",\n titleSource: \"heading\",\n description: \"Multi-step appointment booking with customizable form fields\",\n skipSectionStyles: true,\n additionalFields: [\n {\n id: \"formId\",\n type: \"reference\",\n label: \"Booking Form\",\n description: \"Select which booking form to use for collecting customer information\",\n required: true,\n referenceKind: \"bookingForm\",\n allowManualEntry: false,\n ui: { intent: \"behavior\" },\n },\n {\n id: \"heading\",\n type: \"text\",\n label: \"Heading\",\n description: \"Main heading shown at the top of the booking flow\",\n required: false,\n multiline: false,\n defaultValue: \"Book an Appointment\",\n },\n {\n id: \"description\",\n type: \"richText\",\n label: \"Description\",\n description: \"Optional description or instructions for users\",\n required: false,\n },\n sectionStylesField({\n id: '_sectionStyles',\n label: 'Section styles',\n }),\n ],\n styleTokens: { background: \"surface\", typography: \"body\", spacing: \"md\" },\n behaviours: { supportsThemeSwitching: true, inlineEditing: false, animation: false, paletteHidden: false },\n category: \"interactive\",\n tags: [\"booking\", \"appointment\", \"calendar\", \"scheduling\", \"reservation\"],\n icon: \"Calendar\",\n layout: [\n styledSection({\n children: sectionContainer([\n // Optional heading\n text(\n { as: \"h2\" },\n bind(\"content.heading\"),\n when(\"content.heading\")\n ),\n\n // Optional description\n richText(\n {},\n bind(\"content.description\"),\n when(\"content.description\")\n ),\n\n // The booking form component - loads booking form by ID and renders multi-step flow\n bookingForm({\n siteId: { $bind: { from: \"$root.siteId\" } },\n formId: { $bind: { from: \"content.formId\" } },\n form: { $bind: { from: \"data.form\" } },\n services: { $bind: { from: \"data.services\" } },\n }),\n ], {\n gap: \"lg\",\n }),\n baseClass: \"\",\n spacing: \"spacious\",\n }),\n ],\n});\n\nexport type AppointmentBookingContent = {\n formId: string; // NEW - reference to booking form\n heading?: string | null;\n description?: unknown; // Rich text\n // REMOVED: serviceId, resourceId, submitLabel, successMessage, timezone\n // These now come from the booking form settings\n _sectionStyles?: SectionStylesContent;\n};\n\nexport const availabilityDataSchema = z.object({\n slots: z.array(z.object({\n startAt: z.string(),\n endAt: z.string(),\n resourceId: z.string(),\n })),\n});\n\nexport type AvailabilityData = z.infer<typeof availabilityDataSchema>;\n\nexport const appointmentBookingBlockDefinition: SystemBlockDefinition<AppointmentBookingContent> = {\n manifest: appointmentBookingManifest,\n dataSchemas: { availability: availabilityDataSchema.optional() },\n dataLoaders: {\n form: {\n endpoint: 'getPublicFormById',\n params: {\n formId: { $bind: { from: 'content.formId' } },\n },\n mode: 'server',\n },\n services: {\n endpoint: 'getPublicBookingServices',\n params: {\n siteId: { $bind: { from: '$root.siteId' } },\n },\n mode: 'server',\n },\n },\n};\n","import { z } from \"zod\";\n\nimport type { BlockManifest } from \"../manifest/schema\";\nimport type { SystemBlockDefinition } from \"../registry\";\nimport { text, richText, eventRegistration } from \"../node/builder\";\nimport { bind, when } from \"../node/builder\";\nimport { styledSection } from \"../node/fragments/styledSection\";\nimport { sectionContainer } from \"../node/fragments\";\nimport type { SectionStylesContent } from \"../fields/boxStyles\";\nimport { withApiBindings } from \"../helpers/api-bindings\";\n// Import shared event types\nimport { publicEventSchema, type PublicEvent } from \"./events/shared\";\nimport { createBlockManifest } from \"../defineBlock\";\n\n/**\n * Event Registration Block\n *\n * Multi-step registration form for events. Can be placed on event content type\n * templates or standalone pages.\n *\n * Features:\n * - Occurrence selection (if not pre-selected via URL)\n * - Ticket quantity selection\n * - Attendee information form\n * - Confirmation display\n *\n * Context:\n * - When placed on an event template with occurrence URL (/events/yoga/2025-01-15),\n * the occurrence is pre-selected from route context\n * - When on event template without occurrence, shows occurrence picker\n * - When standalone, shows full event + occurrence picker\n */\nexport const eventRegistrationManifest: BlockManifest = createBlockManifest({\n id: \"block.event-registration\",\n version: \"1.0.0\",\n title: \"Event Registration\",\n titleSource: \"heading\",\n description: \"Multi-step event registration form\",\n category: \"interactive\",\n tags: [\"events\", \"registration\", \"booking\", \"form\", \"signup\"],\n icon: \"ClipboardList\",\n styleTokens: { background: \"surface\", typography: \"body\", spacing: \"md\" },\n behaviours: {\n supportsThemeSwitching: true,\n inlineEditing: false,\n animation: false,\n paletteHidden: false,\n },\n additionalFields: [\n {\n id: \"heading\",\n type: \"text\",\n label: \"Heading\",\n description: \"Main heading for the registration form\",\n required: false,\n multiline: false,\n defaultValue: \"Register for this event\",\n },\n {\n id: \"description\",\n type: \"richText\",\n label: \"Description\",\n description: \"Optional introductory text\",\n required: false,\n },\n {\n id: \"maxTickets\",\n type: \"select\",\n label: \"Max tickets per registration\",\n description: \"Maximum tickets a person can register for\",\n required: false,\n multiple: false,\n defaultValue: \"5\",\n options: [\n { value: \"1\", label: \"1 ticket\" },\n { value: \"2\", label: \"2 tickets\" },\n { value: \"3\", label: \"3 tickets\" },\n { value: \"5\", label: \"5 tickets\" },\n { value: \"10\", label: \"10 tickets\" },\n ],\n ui: { intent: \"display\" },\n },\n {\n id: \"showVenue\",\n type: \"boolean\",\n label: \"Show venue\",\n description: \"Display venue information\",\n required: false,\n defaultValue: true,\n ui: { intent: \"display\" },\n },\n {\n id: \"showCapacity\",\n type: \"boolean\",\n label: \"Show available spots\",\n description: \"Display remaining capacity\",\n required: false,\n defaultValue: true,\n ui: { intent: \"display\" },\n },\n {\n id: \"successMessage\",\n type: \"text\",\n label: \"Success message\",\n description: \"Message shown after successful registration\",\n required: false,\n multiline: true,\n defaultValue: \"Thank you for registering! Check your email for confirmation details.\",\n maxLength: 500,\n },\n // waitlistMessage field hidden — waitlisting is currently disabled\n {\n id: \"buttonText\",\n type: \"text\",\n label: \"Submit button text\",\n description: \"Text for the registration submit button\",\n required: false,\n multiline: false,\n defaultValue: \"Complete Registration\",\n maxLength: 40,\n },\n {\n id: \"buttonVariant\",\n type: \"select\",\n label: \"Button style\",\n description: \"Choose a button style from your theme\",\n required: false,\n multiple: false,\n defaultValue: \"primary\",\n options: [\n { value: \"primary\", label: \"Primary\" },\n { value: \"secondary\", label: \"Secondary\" },\n { value: \"outline\", label: \"Outline\" },\n ],\n ui: { intent: \"style\" },\n },\n ],\n layout: [\n styledSection({\n baseClass: \"\",\n spacing: \"spacious\",\n children: sectionContainer(\n [\n // Optional heading\n text({ as: \"h2\" }, bind(\"content.heading\"), when(\"content.heading\")),\n\n // Optional description\n richText(\n { className: \"rb-prose rb-max-w-none\" },\n bind(\"content.description\"),\n when(\"content.description\")\n ),\n\n // Event registration form component\n eventRegistration(\n withApiBindings({\n // Pre-selected occurrence from route context (if available)\n occurrenceContext: { $bind: { from: \"$root.occurrenceContext\" } },\n // Event data from content entry context (if on event template)\n contentEntry: { $bind: { from: \"$root.contentEntry\" } },\n // Portal auth token (from $root context, null if not authenticated)\n portalToken: { $bind: { from: \"$root.portalToken\", fallback: null } },\n // Content configuration\n maxTickets: { $bind: { from: \"content.maxTickets\", fallback: \"5\" } },\n showVenue: { $bind: { from: \"content.showVenue\" } },\n showCapacity: { $bind: { from: \"content.showCapacity\" } },\n successMessage: { $bind: { from: \"content.successMessage\" } },\n waitlistMessage: { $bind: { from: \"content.waitlistMessage\" } },\n buttonText: {\n $bind: {\n from: \"content.buttonText\",\n fallback: \"Complete Registration\",\n },\n },\n buttonVariant: {\n $bind: { from: \"content.buttonVariant\", fallback: \"primary\" },\n },\n // Event data from loader\n events: { $bind: { from: \"data.events\" } },\n // Stage for preview mode (allows registering for draft events)\n stage: {\n $bind: { from: \"$root.previewStage\", fallback: \"published\" },\n },\n }),\n ),\n ],\n {\n gap: \"lg\",\n },\n ),\n }),\n ],\n});\n\nexport type EventRegistrationContent = {\n heading?: string | null;\n description?: unknown; // Rich text\n maxTickets?: \"1\" | \"2\" | \"3\" | \"5\" | \"10\" | null;\n showVenue?: boolean | null;\n showCapacity?: boolean | null;\n successMessage?: string | null;\n waitlistMessage?: string | null;\n buttonText?: string | null;\n buttonVariant?: \"primary\" | \"secondary\" | \"outline\" | null;\n _sectionStyles?: SectionStylesContent;\n};\n\n// Re-export PublicEvent type for convenience\nexport type { PublicEvent };\n\n/**\n * Schema for occurrence context from route resolver\n *\n * Flat structure passed from PageRenderer.$root.occurrenceContext\n */\nexport const occurrenceContextSchema = z.object({\n /** Unique identifier for this occurrence */\n id: z.string(),\n /** The event series this occurrence belongs to */\n seriesId: z.string(),\n /** ISO 8601 datetime when the occurrence starts */\n startsAt: z.string(),\n /** ISO 8601 datetime when the occurrence ends */\n endsAt: z.string(),\n /** Override capacity for this specific occurrence (null = use series default) */\n capacityOverride: z.number().nullable().optional(),\n /** Field-level overrides: { title?, description?, venueId?, etc. } */\n overrides: z.record(z.string(), z.unknown()).nullable().optional(),\n}).nullable();\n\nexport type OccurrenceContext = z.infer<typeof occurrenceContextSchema>;\n\nexport const eventRegistrationBlockDefinition: SystemBlockDefinition<EventRegistrationContent> = {\n manifest: eventRegistrationManifest,\n dataSchemas: {\n events: z.array(publicEventSchema).optional(),\n occurrenceContext: occurrenceContextSchema.optional(),\n },\n dataLoaders: {\n // Load events for occurrence selection\n // This is needed when block is on a standalone page or event template without occurrence in URL\n events: {\n endpoint: 'listPublicEvents',\n params: {\n siteId: { $bind: { from: '$root.siteId' } },\n limit: '50', // Get more events for selection\n stage: { $bind: { from: '$root.previewStage', fallback: 'published' } },\n // When rendering on an event content entry page, scope the list to that entry so\n // the wizard always includes the current event (and avoids stale cached \"all events\" responses).\n entryId: { $bind: { from: '$root.contentEntry._entryId', fallback: '' } },\n },\n mode: 'server',\n },\n },\n};\n","import { z } from 'zod';\nimport { mediaSchema } from '../../../../lib/media';\n\n/**\n * Zod schema for venue data\n */\nexport const eventVenueSchema = z.object({\n id: z.string(),\n name: z.string(),\n address: z.string().nullable(),\n location: z.object({\n lat: z.number(),\n lng: z.number(),\n }).nullable(),\n});\n\n/**\n * Zod schema for event category data\n */\nexport const eventCategorySchema = z.object({\n id: z.string(),\n name: z.string(),\n color: z.string().nullable(),\n});\n\n/**\n * Pricing type for public events\n */\nexport const pricingTypeSchema = z.enum(['free', 'paid', 'pass_only', 'membership_only']);\n\n/**\n * Access restriction type for public events\n */\nexport const accessRestrictionSchema = z.enum(['none', 'category']);\n\n/**\n * Zod schema for public event data\n */\nexport const publicEventSchema = z.object({\n kind: z.enum(['event', 'course_session']).optional(),\n id: z.string(),\n occurrenceId: z.string(),\n seriesId: z.string(),\n title: z.string(),\n description: z.string().nullable(),\n presentation: z.object({\n title: z.string().nullable().optional(),\n summary: z.string().nullable().optional(),\n image: mediaSchema.nullable().optional(),\n tags: z.array(z.string()).optional(),\n ctaLabel: z.string().nullable().optional(),\n badges: z.array(z.string()).optional(),\n }).optional(),\n slug: z.string(),\n path: z.string(),\n requiresRegistration: z.boolean(),\n startsAt: z.string(),\n endsAt: z.string(),\n capacity: z.number().nullable(),\n registeredCount: z.number(),\n availableSpots: z.number().nullable(),\n venue: eventVenueSchema.nullable(),\n eventCategory: eventCategorySchema.nullable(),\n status: z.enum(['active', 'draft', 'archived']).optional(),\n siteTimezone: z.string().optional(),\n // Pricing & access fields\n pricingType: pricingTypeSchema,\n price: z.number().nullable(),\n currency: z.string(),\n accessRestriction: accessRestrictionSchema,\n allowedCategoryIds: z.array(z.string()),\n requireGuestDetails: z.boolean().optional(),\n acceptsPasses: z.boolean().optional(),\n acceptsMemberships: z.boolean().optional(),\n course: z.object({\n id: z.string(),\n priceCents: z.number().nullable(),\n currency: z.string(),\n enrollmentOpen: z.boolean(),\n }).nullable().optional(),\n});\n\n/**\n * Schema for an array of public events\n */\nexport const publicEventsArraySchema = z.array(publicEventSchema);\n\n/**\n * Type exports for use in components\n */\nexport type PublicEventPricingType = z.infer<typeof pricingTypeSchema>;\nexport type PublicEventAccessRestriction = z.infer<typeof accessRestrictionSchema>;\n","import z from \"zod\";\n\nconst hotspotSchema = z.object({\n x: z.number().min(0).max(1),\n y: z.number().min(0).max(1),\n radius: z.number().optional(),\n})\n\nconst rotationSchema = z.union([z.literal(0), z.literal(90), z.literal(180), z.literal(270)])\nconst rectSchema = z.tuple([z.number(), z.number(), z.number(), z.number()])\n\nconst aspectCropSchema = z.object({\n aspect: z.preprocess((value) => (value == null ? undefined : value), z.string().optional()),\n rect: z.preprocess((value) => (value == null ? undefined : value), rectSchema.optional()),\n hotspot: z.preprocess((value) => (value == null ? undefined : value), hotspotSchema.optional()),\n rotation: z.preprocess((value) => (value == null ? undefined : value), rotationSchema.optional()),\n})\n\nconst transformSchema = z\n .object({\n aspectCrops: z\n .preprocess((value) => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return undefined\n }\n return value\n }, z.record(z.string(), aspectCropSchema.catch({})))\n .optional(),\n rect: rectSchema.optional(),\n hotspot: hotspotSchema.optional(),\n rotation: rotationSchema.optional(),\n })\n\nexport const mediaSchema = z.object({\n type: z.enum([\"image\", \"video\"]),\n purpose: z.string().optional(),\n placeholder: z.boolean().default(true).optional(),\n assetId: z.string().optional(),\n identifier: z.string().optional(),\n src: z.string().optional(),\n alt: z.string().optional(),\n width: z.number().optional(),\n height: z.number().optional(),\n storageBucket: z.string().optional(),\n storagePath: z.string().optional(),\n transform: transformSchema.optional(),\n});\n\nexport type Media = z.infer<typeof mediaSchema>;\n","import type { BlockManifest } from '../../../manifest/schema';\n\ntype ManifestField = BlockManifest['fields'][number];\n\n/**\n * Shared card styling fields for event blocks\n */\nexport const cardStylingFields: ManifestField[] = [\n {\n id: 'cardVariant',\n type: 'select',\n label: 'Card style',\n description: 'Choose a card style from your theme',\n required: false,\n multiple: false,\n defaultValue: 'default',\n options: [\n { value: 'default', label: 'Default' },\n { value: 'variant1', label: 'Variant 1' },\n { value: 'variant2', label: 'Variant 2' },\n ],\n ui: { intent: 'style' as const },\n },\n {\n id: 'buttonVariant',\n type: 'select',\n label: 'Button style',\n description: 'Choose a button style from your theme',\n required: false,\n multiple: false,\n defaultValue: 'primary',\n options: [\n { value: 'primary', label: 'Primary' },\n { value: 'secondary', label: 'Secondary' },\n { value: 'outline', label: 'Outline' },\n { value: 'link', label: 'Link' },\n ],\n ui: { intent: 'style' as const },\n },\n {\n id: 'buttonText',\n type: 'text',\n label: 'Button text',\n description: 'Text for the event action button',\n required: false,\n multiline: false,\n defaultValue: 'View event',\n maxLength: 40,\n },\n];\n\n/**\n * Shared event display option fields\n */\nexport const eventDisplayFields: ManifestField[] = [\n {\n id: 'showVenue',\n type: 'boolean',\n label: 'Show venue',\n description: 'Display venue name and address',\n required: false,\n defaultValue: true,\n ui: { intent: 'display' as const },\n },\n {\n id: 'showMap',\n type: 'boolean',\n label: 'Show venue map',\n description: 'Display a map when the event has a venue with location coordinates',\n required: false,\n defaultValue: true,\n ui: { intent: 'display' as const },\n },\n {\n id: 'showCapacity',\n type: 'boolean',\n label: 'Show available spots',\n description: 'Display remaining capacity',\n required: false,\n defaultValue: true,\n ui: { intent: 'display' as const },\n },\n];\n\n/**\n * Empty state field for when no events are available\n */\nexport const emptyStateField: ManifestField = {\n id: 'emptyMessage',\n type: 'text',\n label: 'Empty state message',\n description: 'Message when no upcoming events',\n required: false,\n multiline: false,\n defaultValue: 'No upcoming events scheduled.',\n maxLength: 200,\n ui: { intent: 'display' as const },\n};\n\n/**\n * Section heading and description fields\n */\nexport const sectionHeaderFields = (defaultHeading: string): ManifestField[] => [\n {\n id: 'heading',\n type: 'text',\n label: 'Heading',\n description: 'Main heading for the events section',\n required: false,\n multiline: false,\n defaultValue: defaultHeading,\n },\n {\n id: 'description',\n type: 'richText',\n label: 'Description',\n description: 'Optional introductory text',\n required: false,\n },\n];\n\n/**\n * Layout selection field with grid/stack options\n */\nexport const layoutField: ManifestField = {\n id: 'layout',\n type: 'select',\n label: 'Layout',\n description: 'Choose how events are displayed',\n required: false,\n multiple: false,\n defaultValue: 'grid',\n options: [\n { value: 'grid', label: 'Grid (cards)' },\n { value: 'stack', label: 'Stack (vertical list)' },\n ],\n ui: { intent: 'display' as const },\n};\n\n/**\n * Column count field for grid layouts (conditional on layout='grid')\n */\nexport const columnsField = (options: string[] = ['2', '3', '4']): ManifestField => ({\n id: 'columns',\n type: 'select',\n label: 'Columns',\n description: 'Number of columns in grid layout',\n required: false,\n multiple: false,\n defaultValue: '3',\n ui: {\n intent: 'display' as const,\n visibleWhen: { field: 'layout', equals: 'grid' },\n },\n options: options.map((n) => ({ value: n, label: `${n} columns` })),\n});\n","import { z } from 'zod';\n\n/**\n * Zod schema for course venue data\n */\nexport const courseVenueSchema = z.object({\n id: z.string(),\n name: z.string(),\n address: z.string().nullable(),\n});\n\n/**\n * Zod schema for course session (occurrence) data\n */\nexport const courseSessionSchema = z.object({\n id: z.string(),\n startsAt: z.string(),\n endsAt: z.string(),\n capacityOverride: z.number().nullable().optional(),\n overrides: z.record(z.string(), z.unknown()).nullable().optional(),\n});\n\n/**\n * Zod schema for public course data\n */\nexport const publicCourseSchema = z.object({\n id: z.string(),\n title: z.string(),\n slug: z.string(),\n description: z.unknown().nullable(),\n enrollmentOpen: z.boolean(),\n priceCents: z.number().nullable(),\n currency: z.string(),\n enrollmentCapacity: z.number().nullable(),\n acceptsMemberships: z.boolean(),\n status: z.enum(['active', 'draft', 'cancelled']),\n sessionsCount: z.number(),\n enrolledCount: z.number(),\n availableSpots: z.number().nullable(),\n sessions: z.array(courseSessionSchema),\n venue: courseVenueSchema.nullable(),\n contentEntryId: z.string().nullable(),\n});\n\n/**\n * Schema for an array of public courses\n */\nexport const publicCoursesArraySchema = z.array(publicCourseSchema);\n","import type { BlockManifest } from \"../manifest/schema\";\nimport type { SystemBlockDefinition } from \"../registry\";\nimport { text, richText, courseRegistration } from \"../node/builder\";\nimport { bind, when } from \"../node/builder\";\nimport { styledSection } from \"../node/fragments/styledSection\";\nimport { sectionContainer } from \"../node/fragments\";\nimport type { SectionStylesContent } from \"../fields/boxStyles\";\nimport { withApiBindings } from \"../helpers/api-bindings\";\n// Import shared course types and schemas\nimport { publicCoursesArraySchema } from \"./courses/shared\";\nimport { createBlockManifest } from \"../defineBlock\";\n// Re-export for external consumers\nexport { type PublicCourse, type CourseSession, type CourseVenue, type CourseStatus } from \"./courses/shared\";\n\n/**\n * Course Registration Block\n *\n * Registration form for multi-session courses. Customers enroll once\n * and are automatically added to all course sessions.\n *\n * Key differences from Event Registration:\n * - No occurrence selection (all sessions included)\n * - No ticket quantity (enrollment is binary)\n * - No pass payment option (passes not valid for courses)\n * - Shows all session dates upfront\n * - Membership-based payment if course accepts memberships\n *\n * Context:\n * - When placed on a course content type template, the course is\n * pre-selected from route context ($root.contentEntry)\n * - Can also be placed on standalone pages with course selection\n */\nexport const courseRegistrationManifest: BlockManifest = createBlockManifest({\n id: \"block.course-registration\",\n version: \"1.0.0\",\n title: \"Course Registration\",\n titleSource: \"heading\",\n description: \"Enrollment form for multi-session courses\",\n category: \"interactive\",\n tags: [\"courses\", \"enrollment\", \"booking\", \"form\", \"signup\", \"education\"],\n icon: \"GraduationCap\",\n styleTokens: { background: \"surface\", typography: \"body\", spacing: \"md\" },\n behaviours: {\n supportsThemeSwitching: true,\n inlineEditing: false,\n animation: false,\n paletteHidden: false,\n },\n additionalFields: [\n {\n id: \"heading\",\n type: \"text\",\n label: \"Heading\",\n description: \"Main heading for the registration form\",\n required: false,\n multiline: false,\n defaultValue: \"Enroll in this course\",\n },\n {\n id: \"description\",\n type: \"richText\",\n label: \"Description\",\n description: \"Optional introductory text\",\n required: false,\n },\n {\n id: \"showSessions\",\n type: \"boolean\",\n label: \"Show sessions\",\n description: \"Display the list of course sessions\",\n required: false,\n defaultValue: true,\n ui: { intent: \"display\" },\n },\n {\n id: \"showPrice\",\n type: \"boolean\",\n label: \"Show price\",\n description: \"Display the course price\",\n required: false,\n defaultValue: true,\n ui: { intent: \"display\" },\n },\n {\n id: \"showCapacity\",\n type: \"boolean\",\n label: \"Show available spots\",\n description: \"Display remaining enrollment capacity\",\n required: false,\n defaultValue: true,\n ui: { intent: \"display\" },\n },\n {\n id: \"showVenue\",\n type: \"boolean\",\n label: \"Show venue\",\n description: \"Display venue information\",\n required: false,\n defaultValue: true,\n ui: { intent: \"display\" },\n },\n {\n id: \"successMessage\",\n type: \"text\",\n label: \"Success message\",\n description: \"Message shown after successful enrollment\",\n required: false,\n multiline: true,\n defaultValue: \"You're enrolled! Check your email for confirmation and session details.\",\n maxLength: 500,\n },\n {\n id: \"waitlistMessage\",\n type: \"text\",\n label: \"Waitlist message\",\n description: \"Message when added to waitlist\",\n required: false,\n multiline: true,\n defaultValue: \"You've been added to the waitlist. We'll notify you if a spot opens up.\",\n maxLength: 500,\n },\n {\n id: \"membershipMessage\",\n type: \"text\",\n label: \"Membership enrollment message\",\n description: \"Message when enrolled using a membership\",\n required: false,\n multiline: true,\n defaultValue: \"Enrolled using your membership! Check your email for session details.\",\n maxLength: 500,\n },\n {\n id: \"buttonText\",\n type: \"text\",\n label: \"Submit button text\",\n description: \"Text for the enrollment submit button\",\n required: false,\n multiline: false,\n defaultValue: \"Complete Enrollment\",\n maxLength: 40,\n },\n {\n id: \"buttonVariant\",\n type: \"select\",\n label: \"Button style\",\n description: \"Choose a button style from your theme\",\n required: false,\n multiple: false,\n defaultValue: \"primary\",\n options: [\n { value: \"primary\", label: \"Primary\" },\n { value: \"secondary\", label: \"Secondary\" },\n { value: \"outline\", label: \"Outline\" },\n ],\n ui: { intent: \"style\" },\n },\n ],\n layout: [\n styledSection({\n baseClass: \"\",\n spacing: \"spacious\",\n children: sectionContainer(\n [\n // Optional heading\n text({ as: \"h2\" }, bind(\"content.heading\"), when(\"content.heading\")),\n\n // Optional description\n richText(\n { className: \"rb-prose rb-max-w-none\" },\n bind(\"content.description\"),\n when(\"content.description\")\n ),\n\n // Course registration form component\n courseRegistration(\n withApiBindings({\n // Course data from content entry context (if on course template)\n contentEntry: { $bind: { from: \"$root.contentEntry\" } },\n entrySubrouteContext: {\n $bind: { from: \"$root.entrySubrouteContext\", fallback: null },\n },\n // Portal auth token (from $root context, null if not authenticated)\n portalToken: {\n $bind: { from: \"$root.portalToken\", fallback: null },\n },\n // Content configuration\n showSessions: { $bind: { from: \"content.showSessions\" } },\n showPrice: { $bind: { from: \"content.showPrice\" } },\n showCapacity: { $bind: { from: \"content.showCapacity\" } },\n showVenue: { $bind: { from: \"content.showVenue\" } },\n successMessage: { $bind: { from: \"content.successMessage\" } },\n waitlistMessage: { $bind: { from: \"content.waitlistMessage\" } },\n membershipMessage: {\n $bind: { from: \"content.membershipMessage\" },\n },\n buttonText: {\n $bind: { from: \"content.buttonText\", fallback: \"Complete Enrollment\" },\n },\n buttonVariant: {\n $bind: { from: \"content.buttonVariant\", fallback: \"primary\" },\n },\n // Course data from loader\n courses: { $bind: { from: \"data.courses\" } },\n // Stage for preview mode (allows enrolling in draft courses)\n stage: {\n $bind: { from: \"$root.previewStage\", fallback: \"published\" },\n },\n }),\n ),\n ],\n {\n gap: \"lg\",\n },\n ),\n }),\n ],\n});\n\nexport type CourseRegistrationContent = {\n heading?: string | null;\n description?: unknown; // Rich text\n showSessions?: boolean | null;\n showPrice?: boolean | null;\n showCapacity?: boolean | null;\n showVenue?: boolean | null;\n successMessage?: string | null;\n waitlistMessage?: string | null;\n membershipMessage?: string | null;\n buttonText?: string | null;\n buttonVariant?: \"primary\" | \"secondary\" | \"outline\" | null;\n _sectionStyles?: SectionStylesContent;\n};\n\nexport const courseRegistrationBlockDefinition: SystemBlockDefinition<CourseRegistrationContent> = {\n manifest: courseRegistrationManifest,\n dataSchemas: {\n courses: publicCoursesArraySchema.optional(),\n },\n dataLoaders: {\n // Load courses for selection\n // When placed on a standalone page, allows selecting from available courses\n // When on a course content type template, the course is pre-selected via contentEntry\n courses: {\n endpoint: 'listPublicCourses',\n params: {\n siteId: { $bind: { from: '$root.siteId' } },\n limit: '50',\n stage: { $bind: { from: '$root.previewStage', fallback: 'published' } },\n },\n mode: 'server',\n },\n },\n};\n","import { z } from \"zod\";\n\nimport type { BlockManifest } from \"../manifest/schema\";\nimport type { SystemBlockDefinition } from \"../registry\";\nimport { text, el } from \"../node/builder\";\nimport { bind, when } from \"../node/builder\";\nimport { styledSection } from \"../node/fragments/styledSection\";\nimport { sectionContainer } from \"../node/fragments\";\nimport type { SectionStylesContent } from \"../fields/boxStyles\";\nimport { publicEventsArraySchema } from \"./events/shared\";\nimport { publicPassProductSchema, publicMembershipProductSchema } from \"./shop\";\nimport { createBlockManifest } from \"../defineBlock\";\n\n/**\n * Event Details Block\n *\n * Displays logistics for an event:\n * - Selected occurrence (from `$root.occurrenceContext`) or next upcoming occurrence\n * - Venue + embedded map\n * - Other upcoming dates in the same series (excluding selected/next)\n *\n * Intended for use on event templates, but can also be placed on standalone pages.\n */\nexport const eventDetailsManifest: BlockManifest = createBlockManifest({\n id: \"block.event-details\",\n version: \"1.0.0\",\n title: \"Event Details\",\n titleSource: \"heading\",\n description: \"Date/time, venue, map, and other dates for an event\",\n category: \"content\",\n tags: [\"events\", \"venue\", \"map\", \"schedule\", \"dates\"],\n icon: \"MapPin\",\n styleTokens: { background: \"surface\", typography: \"body\", spacing: \"md\" },\n behaviours: {\n supportsThemeSwitching: true,\n inlineEditing: false,\n animation: false,\n paletteHidden: false,\n },\n additionalFields: [\n {\n id: \"heading\",\n type: \"text\",\n label: \"Heading\",\n description: \"Optional heading shown above event details\",\n required: false,\n multiline: false,\n defaultValue: \"Event details\",\n },\n {\n id: \"showVenue\",\n type: \"boolean\",\n label: \"Show venue\",\n required: false,\n defaultValue: true,\n ui: { intent: \"display\" },\n },\n {\n id: \"showMap\",\n type: \"boolean\",\n label: \"Show map\",\n description: \"Embed a map when the venue has coordinates\",\n required: false,\n defaultValue: true,\n ui: { intent: \"display\" },\n },\n {\n id: \"showOtherDates\",\n type: \"boolean\",\n label: \"Show other dates\",\n required: false,\n defaultValue: true,\n ui: { intent: \"display\" },\n },\n {\n id: \"otherDatesLimit\",\n type: \"select\",\n label: \"Other dates limit\",\n required: false,\n multiple: false,\n defaultValue: \"5\",\n options: [\n { value: \"3\", label: \"3 dates\" },\n { value: \"5\", label: \"5 dates\" },\n { value: \"10\", label: \"10 dates\" },\n ],\n ui: { intent: \"display\" },\n },\n {\n id: \"showCost\",\n type: \"boolean\",\n label: \"Show cost\",\n description: \"Display ticket price for paid events\",\n required: false,\n defaultValue: true,\n ui: { intent: \"display\" },\n },\n {\n id: \"showAcceptedPasses\",\n type: \"boolean\",\n label: \"Show accepted passes\",\n description: \"Display passes that can be used for this event\",\n required: false,\n defaultValue: true,\n ui: { intent: \"display\" },\n },\n {\n id: \"showAcceptedMemberships\",\n type: \"boolean\",\n label: \"Show accepted memberships\",\n description: \"Display memberships that grant access to this event\",\n required: false,\n defaultValue: true,\n ui: { intent: \"display\" },\n },\n ],\n layout: [\n styledSection({\n baseClass: \"\",\n spacing: \"spacious\",\n children: sectionContainer(\n [\n text({ as: \"h2\" }, bind(\"content.heading\"), when(\"content.heading\")),\n el(\"event-details\", {\n occurrenceContext: {\n $bind: { from: \"$root.occurrenceContext\", fallback: null },\n },\n contentEntry: { $bind: { from: \"$root.contentEntry\", fallback: null } },\n events: { $bind: { from: \"data.events\" } },\n showVenue: { $bind: { from: \"content.showVenue\" } },\n showMap: { $bind: { from: \"content.showMap\" } },\n showOtherDates: { $bind: { from: \"content.showOtherDates\" } },\n otherDatesLimit: {\n $bind: { from: \"content.otherDatesLimit\", fallback: \"5\" },\n },\n showCost: { $bind: { from: \"content.showCost\", fallback: true } },\n showAcceptedPasses: {\n $bind: { from: \"content.showAcceptedPasses\", fallback: true },\n },\n showAcceptedMemberships: {\n $bind: { from: \"content.showAcceptedMemberships\", fallback: true },\n },\n sitePasses: { $bind: { from: \"data.sitePasses\" } },\n siteMemberships: { $bind: { from: \"data.siteMemberships\" } },\n }),\n ],\n { gap: \"lg\" },\n ),\n }),\n ],\n});\n\nexport type EventDetailsContent = {\n heading?: string | null;\n showVenue?: boolean | null;\n showMap?: boolean | null;\n showOtherDates?: boolean | null;\n otherDatesLimit?: \"3\" | \"5\" | \"10\" | null;\n showCost?: boolean | null;\n showAcceptedPasses?: boolean | null;\n showAcceptedMemberships?: boolean | null;\n _sectionStyles?: SectionStylesContent;\n};\n\nconst occurrenceContextSchema = z.object({\n id: z.string(),\n seriesId: z.string(),\n startsAt: z.string(),\n endsAt: z.string(),\n capacityOverride: z.number().nullable().optional(),\n overrides: z.record(z.string(), z.unknown()).nullable().optional(),\n}).nullable();\n\nexport const eventDetailsBlockDefinition: SystemBlockDefinition<EventDetailsContent> = {\n manifest: eventDetailsManifest,\n dataSchemas: {\n events: publicEventsArraySchema.optional(),\n occurrenceContext: occurrenceContextSchema.optional(),\n sitePasses: z.object({ passes: z.array(publicPassProductSchema) }).optional(),\n siteMemberships: z.object({ memberships: z.array(publicMembershipProductSchema) }).optional(),\n },\n dataLoaders: {\n events: {\n endpoint: \"listPublicEvents\",\n params: {\n siteId: { $bind: { from: \"$root.siteId\" } },\n stage: { $bind: { from: \"$root.previewStage\", fallback: \"published\" } },\n limit: \"25\",\n entryId: { $bind: { from: \"$root.contentEntry._entryId\" } },\n seriesId: { $bind: { from: \"$root.occurrenceContext.seriesId\" } },\n includeOccurrenceId: { $bind: { from: \"$root.occurrenceContext.id\" } },\n },\n mode: \"server\",\n },\n sitePasses: {\n endpoint: \"listPublicPasses\",\n params: {\n siteId: { $bind: { from: \"$root.siteId\" } },\n },\n mode: \"server\",\n },\n siteMemberships: {\n endpoint: \"listPublicMemberships\",\n params: {\n siteId: { $bind: { from: \"$root.siteId\" } },\n },\n mode: \"server\",\n },\n },\n};\n","import { z } from \"zod\";\n\nimport type { BlockManifest } from \"../manifest/schema\";\nimport type { SystemBlockDefinition } from \"../registry\";\nimport { shop } from \"../node/builder\";\nimport { styledSection } from \"../node/fragments/styledSection\";\nimport { sectionContainer } from \"../node/fragments\";\nimport { sectionStylesField, type SectionStylesContent } from \"../fields/boxStyles\";\nimport { withApiBindings } from \"../helpers/api-bindings\";\nimport { createBlockManifest } from \"../defineBlock\";\n\n/**\n * Shop Block\n *\n * Displays purchasable passes and memberships for a site.\n * Can be embedded on any page to create a storefront.\n *\n * Features:\n * - Browse passes and memberships (no login required)\n * - Filter by category\n * - Configurable layout (grid/list)\n * - Checkout flow with email/name collection\n * - Duplicate membership detection\n *\n * Security Model:\n * - Browsing is public (no auth required)\n * - Purchase creates customer on-demand via email\n * - Stripe handles payment security\n */\nexport const shopManifest: BlockManifest = createBlockManifest({\n id: \"block.shop\",\n version: \"1.0.0\",\n title: \"Product Shop\",\n titleSource: \"passesHeading\",\n description: \"Display passes and memberships for purchase\",\n skipSectionStyles: true,\n additionalFields: [\n {\n id: \"showPasses\",\n type: \"boolean\",\n label: \"Show passes\",\n description: \"Display class passes for purchase\",\n required: false,\n defaultValue: true,\n ui: { intent: \"display\" },\n },\n {\n id: \"showMemberships\",\n type: \"boolean\",\n label: \"Show memberships\",\n description: \"Display memberships for purchase\",\n required: false,\n defaultValue: true,\n ui: { intent: \"display\" },\n },\n {\n id: \"layout\",\n type: \"select\",\n label: \"Layout\",\n description: \"How to display products\",\n required: false,\n multiple: false,\n defaultValue: \"grid\",\n options: [\n { value: \"grid\", label: \"Grid\" },\n { value: \"list\", label: \"List\" },\n ],\n ui: { intent: \"display\" },\n },\n {\n id: \"columns\",\n type: \"select\",\n label: \"Grid columns\",\n description: \"Number of columns in grid layout\",\n required: false,\n multiple: false,\n defaultValue: \"2\",\n options: [\n { value: \"1\", label: \"1 column\" },\n { value: \"2\", label: \"2 columns\" },\n { value: \"3\", label: \"3 columns\" },\n { value: \"4\", label: \"4 columns\" },\n ],\n ui: { intent: \"display\" },\n },\n {\n id: \"showDescriptions\",\n type: \"boolean\",\n label: \"Show descriptions\",\n description: \"Display product descriptions\",\n required: false,\n defaultValue: true,\n ui: { intent: \"display\" },\n },\n {\n id: \"showValidityPeriod\",\n type: \"boolean\",\n label: \"Show validity period\",\n description: \"Display pass expiration info (e.g., 'Valid for 30 days')\",\n required: false,\n defaultValue: true,\n ui: { intent: \"display\" },\n },\n {\n id: \"showPricePerClass\",\n type: \"boolean\",\n label: \"Show price per class\",\n description: \"Display calculated price per credit for passes\",\n required: false,\n defaultValue: true,\n ui: { intent: \"display\" },\n },\n {\n id: \"passesHeading\",\n type: \"text\",\n label: \"Passes heading\",\n description: \"Heading for the passes section\",\n required: false,\n multiline: false,\n defaultValue: \"Class Passes\",\n maxLength: 100,\n },\n {\n id: \"membershipsHeading\",\n type: \"text\",\n label: \"Memberships heading\",\n description: \"Heading for the memberships section\",\n required: false,\n multiline: false,\n defaultValue: \"Memberships\",\n maxLength: 100,\n },\n {\n id: \"buyButtonText\",\n type: \"text\",\n label: \"Buy button text\",\n description: \"Text for pass purchase button\",\n required: false,\n multiline: false,\n defaultValue: \"Buy Now\",\n maxLength: 40,\n },\n {\n id: \"subscribeButtonText\",\n type: \"text\",\n label: \"Subscribe button text\",\n description: \"Text for membership subscribe button\",\n required: false,\n multiline: false,\n defaultValue: \"Subscribe\",\n maxLength: 40,\n },\n {\n id: \"emptyStateText\",\n type: \"text\",\n label: \"Empty state text\",\n description: \"Message when no products are available\",\n required: false,\n multiline: false,\n defaultValue: \"No products available at this time.\",\n maxLength: 200,\n },\n sectionStylesField({\n id: '_sectionStyles',\n label: 'Section styles',\n }),\n ],\n styleTokens: { background: \"surface\", typography: \"body\", spacing: \"md\" },\n behaviours: { supportsThemeSwitching: true, inlineEditing: false, animation: false, paletteHidden: false },\n category: \"interactive\",\n tags: [\"shop\", \"passes\", \"memberships\", \"booking\", \"purchase\", \"store\"],\n icon: \"ShoppingBag\",\n layout: [\n styledSection({\n baseClass: \"\",\n spacing: \"spacious\",\n children: sectionContainer([\n // Shop component\n shop(withApiBindings({\n // Configuration\n showPasses: { $bind: { from: \"content.showPasses\", fallback: true } },\n showMemberships: { $bind: { from: \"content.showMemberships\", fallback: true } },\n layout: { $bind: { from: \"content.layout\", fallback: \"grid\" } },\n columns: { $bind: { from: \"content.columns\", fallback: \"2\" } },\n showDescriptions: { $bind: { from: \"content.showDescriptions\", fallback: true } },\n showValidityPeriod: { $bind: { from: \"content.showValidityPeriod\", fallback: true } },\n showPricePerClass: { $bind: { from: \"content.showPricePerClass\", fallback: true } },\n // Text customization\n passesHeading: { $bind: { from: \"content.passesHeading\", fallback: \"Class Passes\" } },\n membershipsHeading: { $bind: { from: \"content.membershipsHeading\", fallback: \"Memberships\" } },\n buyButtonText: { $bind: { from: \"content.buyButtonText\", fallback: \"Buy Now\" } },\n subscribeButtonText: { $bind: { from: \"content.subscribeButtonText\", fallback: \"Subscribe\" } },\n emptyStateText: { $bind: { from: \"content.emptyStateText\", fallback: \"No products available at this time.\" } },\n // Data from loaders\n passes: { $bind: { from: \"data.passes\" } },\n memberships: { $bind: { from: \"data.memberships\" } },\n })),\n ], {\n gap: \"lg\",\n }),\n }),\n ],\n});\n\nexport type ShopContent = {\n showPasses?: boolean | null;\n showMemberships?: boolean | null;\n layout?: \"grid\" | \"list\" | null;\n columns?: \"1\" | \"2\" | \"3\" | \"4\" | null;\n showDescriptions?: boolean | null;\n showValidityPeriod?: boolean | null;\n showPricePerClass?: boolean | null;\n passesHeading?: string | null;\n membershipsHeading?: string | null;\n buyButtonText?: string | null;\n subscribeButtonText?: string | null;\n emptyStateText?: string | null;\n _sectionStyles?: SectionStylesContent;\n};\n\n/**\n * Public pass product for shop display\n */\nexport const publicPassProductSchema = z.object({\n id: z.string(),\n name: z.string(),\n description: z.string().nullable(),\n price: z.number(), // cents\n currency: z.string(),\n creditsTotal: z.number(),\n pricePerCredit: z.number(),\n validDays: z.number().nullable(),\n eligibleCategoryIds: z.array(z.string()),\n eligibleCategoryNames: z.array(z.string()),\n});\n\nexport type PublicPassProduct = z.infer<typeof publicPassProductSchema>;\n\n/**\n * Public membership product for shop display\n */\nexport const publicMembershipProductSchema = z.object({\n id: z.string(),\n name: z.string(),\n description: z.string().nullable(),\n price: z.number(), // cents\n currency: z.string(),\n billingInterval: z.enum([\"month\", \"year\"]),\n eligibleCategoryIds: z.array(z.string()),\n eligibleCategoryNames: z.array(z.string()),\n});\n\nexport type PublicMembershipProduct = z.infer<typeof publicMembershipProductSchema>;\n\nexport const shopBlockDefinition: SystemBlockDefinition<ShopContent> = {\n manifest: shopManifest,\n dataSchemas: {\n passes: z.array(publicPassProductSchema).optional(),\n memberships: z.array(publicMembershipProductSchema).optional(),\n },\n dataLoaders: {\n // Load passes for display\n passes: {\n endpoint: 'listPublicPasses',\n params: {\n siteId: { $bind: { from: '$root.siteId' } },\n },\n mode: 'server',\n },\n // Load memberships for display\n memberships: {\n endpoint: 'listPublicMemberships',\n params: {\n siteId: { $bind: { from: '$root.siteId' } },\n },\n mode: 'server',\n },\n },\n};\n","import type { BlockManifest } from \"../manifest/schema\";\nimport type { SystemBlockDefinition } from \"../registry\";\nimport { text, el, bind, when } from \"../node/builder\";\nimport { styledSection } from \"../node/fragments/styledSection\";\nimport { sectionContainer } from \"../node/fragments\";\nimport type { SectionStylesContent } from \"../fields/boxStyles\";\nimport { publicCoursesArraySchema } from \"./courses/shared\";\nimport { createBlockManifest } from \"../defineBlock\";\n\n/**\n * Course Details Block\n *\n * Displays logistics for a course:\n * - Sessions (date/time list)\n * - Venue\n * - Price + capacity + enrollment status\n *\n * Intended for use on course templates, but can also be placed on standalone pages.\n */\nexport const courseDetailsManifest: BlockManifest = createBlockManifest({\n id: \"block.course-details\",\n version: \"1.0.0\",\n title: \"Course Details\",\n titleSource: \"heading\",\n description: \"Schedule, venue, price, and enrollment status for a course\",\n category: \"content\",\n tags: [\"courses\", \"schedule\", \"sessions\", \"venue\", \"pricing\"],\n icon: \"GraduationCap\",\n styleTokens: { background: \"surface\", typography: \"body\", spacing: \"md\" },\n behaviours: {\n supportsThemeSwitching: true,\n inlineEditing: false,\n animation: false,\n paletteHidden: false,\n },\n additionalFields: [\n {\n id: \"heading\",\n type: \"text\",\n label: \"Heading\",\n description: \"Optional heading shown above course details\",\n required: false,\n multiline: false,\n defaultValue: \"Course details\",\n },\n {\n id: \"courseSlug\",\n type: \"text\",\n label: \"Course slug (optional)\",\n description:\n \"Select a course by slug when not used on a course template route\",\n required: false,\n multiline: false,\n ui: { intent: \"behavior\" },\n },\n {\n id: \"showTitle\",\n type: \"boolean\",\n label: \"Show course title\",\n required: false,\n defaultValue: false,\n ui: { intent: \"display\" },\n },\n {\n id: \"showDescription\",\n type: \"boolean\",\n label: \"Show course description\",\n description:\n \"Render the course description from the bookings course record\",\n required: false,\n defaultValue: false,\n ui: { intent: \"display\" },\n },\n {\n id: \"showSessions\",\n type: \"boolean\",\n label: \"Show sessions\",\n required: false,\n defaultValue: true,\n ui: { intent: \"display\" },\n },\n {\n id: \"sessionsLimit\",\n type: \"select\",\n label: \"Sessions limit\",\n required: false,\n multiple: false,\n defaultValue: \"10\",\n options: [\n { value: \"3\", label: \"3 sessions\" },\n { value: \"5\", label: \"5 sessions\" },\n { value: \"10\", label: \"10 sessions\" },\n { value: \"all\", label: \"All sessions\" },\n ],\n ui: { intent: \"display\" },\n },\n {\n id: \"showVenue\",\n type: \"boolean\",\n label: \"Show venue\",\n required: false,\n defaultValue: true,\n ui: { intent: \"display\" },\n },\n {\n id: \"showPrice\",\n type: \"boolean\",\n label: \"Show price\",\n required: false,\n defaultValue: true,\n ui: { intent: \"display\" },\n },\n {\n id: \"showCapacity\",\n type: \"boolean\",\n label: \"Show capacity\",\n required: false,\n defaultValue: true,\n ui: { intent: \"display\" },\n },\n {\n id: \"showEnrollmentStatus\",\n type: \"boolean\",\n label: \"Show enrollment status\",\n required: false,\n defaultValue: true,\n ui: { intent: \"display\" },\n },\n {\n id: \"showMembershipNote\",\n type: \"boolean\",\n label: \"Show membership note\",\n description: \"Indicate when memberships can be used for free enrollment\",\n required: false,\n defaultValue: true,\n ui: { intent: \"display\" },\n },\n ],\n layout: [\n styledSection({\n baseClass: \"\",\n spacing: \"spacious\",\n children: sectionContainer(\n [\n text({ as: \"h2\" }, bind(\"content.heading\"), when(\"content.heading\")),\n el(\"course-details\", {\n contentEntry: {\n $bind: { from: \"$root.contentEntry\", fallback: null },\n },\n entrySubrouteContext: {\n $bind: { from: \"$root.entrySubrouteContext\", fallback: null },\n },\n courses: { $bind: { from: \"data.courses\" } },\n courseSlug: { $bind: { from: \"content.courseSlug\", fallback: null } },\n showTitle: { $bind: { from: \"content.showTitle\", fallback: false } },\n showDescription: {\n $bind: { from: \"content.showDescription\", fallback: false },\n },\n showSessions: {\n $bind: { from: \"content.showSessions\", fallback: true },\n },\n sessionsLimit: {\n $bind: { from: \"content.sessionsLimit\", fallback: \"10\" },\n },\n showVenue: { $bind: { from: \"content.showVenue\", fallback: true } },\n showPrice: { $bind: { from: \"content.showPrice\", fallback: true } },\n showCapacity: {\n $bind: { from: \"content.showCapacity\", fallback: true },\n },\n showEnrollmentStatus: {\n $bind: { from: \"content.showEnrollmentStatus\", fallback: true },\n },\n showMembershipNote: {\n $bind: { from: \"content.showMembershipNote\", fallback: true },\n },\n }),\n ],\n { gap: \"lg\" },\n ),\n }),\n ],\n});\n\nexport type CourseDetailsContent = {\n heading?: string | null;\n courseSlug?: string | null;\n showTitle?: boolean | null;\n showDescription?: boolean | null;\n showSessions?: boolean | null;\n sessionsLimit?: \"3\" | \"5\" | \"10\" | \"all\" | null;\n showVenue?: boolean | null;\n showPrice?: boolean | null;\n showCapacity?: boolean | null;\n showEnrollmentStatus?: boolean | null;\n showMembershipNote?: boolean | null;\n _sectionStyles?: SectionStylesContent;\n};\n\nexport const courseDetailsBlockDefinition: SystemBlockDefinition<CourseDetailsContent> = {\n manifest: courseDetailsManifest,\n dataSchemas: {\n courses: publicCoursesArraySchema.optional(),\n },\n dataLoaders: {\n courses: {\n endpoint: \"listPublicCourses\",\n params: {\n siteId: { $bind: { from: \"$root.siteId\" } },\n limit: \"50\",\n stage: { $bind: { from: \"$root.previewStage\", fallback: \"published\" } },\n },\n mode: \"server\",\n },\n },\n};\n","import type { BlockManifest } from \"../../manifest/schema\";\nimport type { SystemBlockDefinition } from \"../../registry\";\nimport { text, richText, el } from \"../../node/builder\";\nimport { bind, when } from \"../../node/builder\";\nimport { styledSection } from \"../../node/fragments/styledSection\";\nimport { sectionContainer } from \"../../node/fragments\";\nimport { sectionStylesField, type SectionStylesContent } from \"../../fields/boxStyles\";\nimport { createBlockManifest } from \"../../defineBlock\";\nimport {\n publicEventsArraySchema,\n sectionHeaderFields,\n layoutField,\n columnsField,\n cardStylingFields,\n eventDisplayFields,\n emptyStateField,\n} from \"./shared\";\n\n/**\n * Event Spotlight Block\n *\n * Displays a simple list of 1-6 featured upcoming events.\n * Ideal for homepages or landing pages to highlight upcoming events.\n *\n * Features:\n * - Server-side only (static, no interactivity)\n * - Grid or stack layout\n * - Configurable event count (1-6)\n * - Theme-aware card and button styling\n */\nexport const eventSpotlightManifest: BlockManifest = createBlockManifest({\n id: \"block.event-spotlight\",\n version: \"1.0.0\",\n title: \"Event Spotlight\",\n titleSource: \"heading\",\n description: \"Feature a few upcoming events on your homepage\",\n skipSectionStyles: true,\n additionalFields: [\n ...sectionHeaderFields(\"Upcoming Events\"),\n {\n id: \"maxEvents\",\n type: \"select\",\n label: \"Events to display\",\n description: \"Number of events to show\",\n required: false,\n multiple: false,\n defaultValue: \"3\",\n options: [\n { value: \"1\", label: \"1 event\" },\n { value: \"2\", label: \"2 events\" },\n { value: \"3\", label: \"3 events\" },\n { value: \"4\", label: \"4 events\" },\n { value: \"5\", label: \"5 events\" },\n { value: \"6\", label: \"6 events\" },\n ],\n ui: { intent: \"display\" as const },\n },\n layoutField,\n columnsField([\"2\", \"3\"]),\n ...cardStylingFields,\n ...eventDisplayFields,\n emptyStateField,\n sectionStylesField({\n id: '_sectionStyles',\n label: 'Section styles',\n }),\n ],\n styleTokens: { background: \"surface\", typography: \"body\", spacing: \"md\" },\n behaviours: { supportsThemeSwitching: true, inlineEditing: false, animation: false, paletteHidden: false },\n category: \"interactive\",\n tags: [\"events\", \"featured\", \"homepage\", \"spotlight\", \"upcoming\"],\n icon: \"Star\",\n layout: [\n styledSection({\n children: sectionContainer([\n // Optional heading\n text(\n { as: \"h2\" },\n bind(\"content.heading\"),\n when(\"content.heading\")\n ),\n\n // Optional description\n richText(\n { className: \"rb-prose rb-max-w-none\" },\n bind(\"content.description\"),\n when(\"content.description\")\n ),\n\n // Event spotlight component\n el(\"event-spotlight\", {\n events: { $bind: { from: \"data.events\" } },\n layout: { $bind: { from: \"content.layout\", fallback: \"grid\" } },\n columns: { $bind: { from: \"content.columns\", fallback: \"3\" } },\n cardVariant: { $bind: { from: \"content.cardVariant\", fallback: \"default\" } },\n buttonVariant: { $bind: { from: \"content.buttonVariant\", fallback: \"primary\" } },\n buttonText: { $bind: { from: \"content.buttonText\", fallback: \"View event\" } },\n showVenue: { $bind: { from: \"content.showVenue\" } },\n showMap: { $bind: { from: \"content.showMap\" } },\n showCapacity: { $bind: { from: \"content.showCapacity\" } },\n emptyMessage: { $bind: { from: \"content.emptyMessage\" } },\n }),\n ], {\n gap: \"lg\",\n }),\n // sectionContainer (rb-container) already provides horizontal padding\n baseClass: \"\",\n spacing: \"comfortable\",\n }),\n ],\n});\n\nexport type EventSpotlightContent = {\n heading?: string | null;\n description?: unknown; // Rich text\n maxEvents?: \"1\" | \"2\" | \"3\" | \"4\" | \"5\" | \"6\" | null;\n layout?: \"grid\" | \"stack\" | null;\n columns?: \"2\" | \"3\" | null;\n cardVariant?: \"default\" | \"variant1\" | \"variant2\" | null;\n buttonVariant?: \"primary\" | \"secondary\" | \"outline\" | \"link\" | null;\n buttonText?: string | null;\n showVenue?: boolean | null;\n showMap?: boolean | null;\n showCapacity?: boolean | null;\n emptyMessage?: string | null;\n _sectionStyles?: SectionStylesContent;\n};\n\nexport const eventSpotlightBlockDefinition: SystemBlockDefinition<EventSpotlightContent> = {\n manifest: eventSpotlightManifest,\n dataSchemas: {\n events: publicEventsArraySchema.optional(),\n },\n dataLoaders: {\n events: {\n endpoint: 'listPublicEvents',\n params: {\n siteId: { $bind: { from: '$root.siteId' } },\n limit: { $bind: { from: 'content.maxEvents', fallback: '3' } },\n stage: { $bind: { from: '$root.previewStage', fallback: 'published' } },\n },\n mode: 'server',\n },\n },\n};\n","import type { BlockManifest } from \"../../manifest/schema\";\nimport type { SystemBlockDefinition } from \"../../registry\";\nimport { text, richText, el } from \"../../node/builder\";\nimport { bind, when } from \"../../node/builder\";\nimport { styledSection } from \"../../node/fragments/styledSection\";\nimport { sectionContainer } from \"../../node/fragments\";\nimport { sectionStylesField, type SectionStylesContent } from \"../../fields/boxStyles\";\nimport { withApiBindings } from \"../../helpers/api-bindings\";\nimport { createBlockManifest } from \"../../defineBlock\";\nimport {\n publicEventsArraySchema,\n sectionHeaderFields,\n layoutField,\n columnsField,\n cardStylingFields,\n eventDisplayFields,\n emptyStateField,\n} from \"./shared\";\n\n/**\n * Event Listing Block\n *\n * Displays a paginated list of events with a \"load more\" button.\n * Ideal for dedicated events pages showing all upcoming events.\n *\n * Features:\n * - Server-side initial load\n * - Client-side \"load more\" pagination\n * - Grid or stack layout\n * - Configurable initial load and page sizes\n * - Theme-aware card and button styling\n */\nexport const eventListingManifest: BlockManifest = createBlockManifest({\n id: \"block.event-listing\",\n version: \"1.0.0\",\n title: \"Event Listing\",\n titleSource: \"heading\",\n description: \"Paginated list of all upcoming events\",\n // Preserve legacy section styles field configuration (renderInHeader: false).\n skipSectionStyles: true,\n additionalFields: [\n ...sectionHeaderFields(\"All Events\"),\n ...(() => {\n const columns = columnsField([\"2\", \"3\", \"4\"])\n return [\n {\n ...layoutField,\n ui: { ...(layoutField.ui ?? {}), intent: 'display' as const },\n },\n {\n ...columns,\n ui: { ...(columns.ui ?? {}), intent: 'display' as const },\n },\n ]\n })(),\n {\n id: \"eventsPerPage\",\n type: \"select\",\n label: \"Events per page\",\n description: \"Number of events to load at a time\",\n required: false,\n multiple: false,\n defaultValue: \"12\",\n options: [\n { value: \"3\", label: \"3 events\" },\n { value: \"6\", label: \"6 events\" },\n { value: \"12\", label: \"12 events\" },\n { value: \"24\", label: \"24 events\" },\n ],\n ui: { intent: 'display' as const },\n },\n {\n id: \"paginationMode\",\n type: \"select\",\n label: \"More events\",\n description: \"How to access events beyond the initial list\",\n required: false,\n multiple: false,\n defaultValue: \"loadMore\",\n options: [\n { value: \"loadMore\", label: \"Load more button\" },\n { value: \"seeAllLink\", label: \"Link to another page\" },\n ],\n ui: { intent: 'display' as const },\n },\n {\n id: \"seeAllUrl\",\n type: \"link\",\n label: \"See all destination\",\n required: false,\n ui: {\n intent: 'display' as const,\n visibleWhen: {\n field: \"paginationMode\",\n equals: \"seeAllLink\",\n },\n },\n },\n {\n id: \"loadMoreText\",\n type: \"text\",\n label: \"Button text\",\n description: \"Text for the pagination button or link\",\n required: false,\n multiline: false,\n defaultValue: \"Load more events\",\n maxLength: 40,\n },\n ...cardStylingFields.map((field) => ({\n ...field,\n ui: { ...(field.ui ?? {}), intent: 'style' as const },\n })),\n ...eventDisplayFields.map((field) => ({\n ...field,\n ui: { ...(field.ui ?? {}), intent: 'display' as const },\n })),\n {\n ...emptyStateField,\n ui: { ...(emptyStateField.ui ?? {}), intent: 'display' as const },\n },\n sectionStylesField({\n id: '_sectionStyles',\n label: 'Section styles',\n renderInHeader: false,\n }),\n ],\n styleTokens: { background: \"surface\", typography: \"body\", spacing: \"md\" },\n behaviours: { supportsThemeSwitching: true, inlineEditing: false, animation: false, paletteHidden: false },\n category: \"interactive\",\n tags: [\"events\", \"listing\", \"paginated\", \"archive\", \"all-events\"],\n icon: \"List\",\n layout: [\n styledSection({\n children: sectionContainer([\n // Optional heading\n text(\n { as: \"h2\" },\n bind(\"content.heading\"),\n when(\"content.heading\")\n ),\n\n // Optional description\n richText(\n { className: \"rb-prose rb-max-w-none\" },\n bind(\"content.description\"),\n when(\"content.description\")\n ),\n\n // Event listing component with pagination\n el(\"event-listing\", withApiBindings({\n events: { $bind: { from: \"data.events\" } },\n stage: { $bind: { from: \"$root.previewStage\", fallback: \"published\" } },\n layout: { $bind: { from: \"content.layout\", fallback: \"grid\" } },\n columns: { $bind: { from: \"content.columns\", fallback: \"3\" } },\n eventsPerPage: { $bind: { from: \"content.eventsPerPage\", fallback: \"12\" } },\n paginationMode: { $bind: { from: \"content.paginationMode\", fallback: \"loadMore\" } },\n seeAllUrl: { $bind: { from: \"content.seeAllUrl\", transforms: [{ id: \"links.resolve\" }] } },\n loadMoreText: { $bind: { from: \"content.loadMoreText\", fallback: \"Load more events\" } },\n cardVariant: { $bind: { from: \"content.cardVariant\", fallback: \"default\" } },\n buttonVariant: { $bind: { from: \"content.buttonVariant\", fallback: \"primary\" } },\n buttonText: { $bind: { from: \"content.buttonText\", fallback: \"View event\" } },\n showVenue: { $bind: { from: \"content.showVenue\" } },\n showMap: { $bind: { from: \"content.showMap\" } },\n showCapacity: { $bind: { from: \"content.showCapacity\" } },\n emptyMessage: { $bind: { from: \"content.emptyMessage\" } },\n })),\n ], {\n gap: \"lg\",\n }),\n // sectionContainer (rb-container) already provides horizontal padding\n baseClass: \"\",\n spacing: \"comfortable\",\n }),\n ],\n});\n\nexport type EventListingContent = {\n heading?: string | null;\n description?: unknown; // Rich text\n layout?: \"grid\" | \"stack\" | null;\n columns?: \"2\" | \"3\" | \"4\" | null;\n eventsPerPage?: \"3\" | \"6\" | \"12\" | \"24\" | null;\n paginationMode?: \"loadMore\" | \"seeAllLink\" | null;\n seeAllUrl?: string | null;\n loadMoreText?: string | null;\n cardVariant?: \"default\" | \"variant1\" | \"variant2\" | null;\n buttonVariant?: \"primary\" | \"secondary\" | \"outline\" | \"link\" | null;\n buttonText?: string | null;\n showVenue?: boolean | null;\n showMap?: boolean | null;\n showCapacity?: boolean | null;\n emptyMessage?: string | null;\n _sectionStyles?: SectionStylesContent;\n};\n\nexport const eventListingBlockDefinition: SystemBlockDefinition<EventListingContent> = {\n manifest: eventListingManifest,\n dataSchemas: {\n events: publicEventsArraySchema.optional(),\n },\n dataLoaders: {\n events: {\n endpoint: 'listPublicEvents',\n params: {\n siteId: { $bind: { from: '$root.siteId' } },\n limit: { $bind: { from: 'content.eventsPerPage', fallback: '12' } },\n stage: { $bind: { from: '$root.previewStage', fallback: 'published' } },\n },\n mode: 'server',\n },\n },\n};\n","import type { BlockManifest } from \"../../manifest/schema\";\nimport type { SystemBlockDefinition } from \"../../registry\";\nimport { text, richText, el } from \"../../node/builder\";\nimport { bind, when } from \"../../node/builder\";\nimport { styledSection } from \"../../node/fragments/styledSection\";\nimport { sectionContainer } from \"../../node/fragments\";\nimport { sectionStylesField, type SectionStylesContent } from \"../../fields/boxStyles\";\nimport { withApiBindings } from \"../../helpers/api-bindings\";\nimport { createBlockManifest } from \"../../defineBlock\";\nimport {\n publicEventsArraySchema,\n sectionHeaderFields,\n cardStylingFields,\n emptyStateField,\n} from \"./shared\";\nimport type {\n DisplayMode,\n EventLayout,\n ColumnOption,\n WeekStart,\n FilterAutoShow,\n CalendarTabViews,\n ButtonVariant,\n} from \"./shared/types\";\n\n/**\n * Event Calendar Block\n *\n * Displays events in multiple view modes with optional filtering.\n *\n * Display Modes:\n * - Combined (default): Tabbed view with List + Calendar tabs\n * - Month: Full month calendar grid\n * - Week: Week calendar view\n * - List: Chronological list with load-more pagination\n *\n * Features:\n * - Category and venue filtering (list views)\n * - Interactive calendar navigation (prev/next/today)\n * - Pre-fetches events for smooth navigation\n * - Configurable week start day\n * - Theme-aware styling\n */\nexport const eventCalendarManifest: BlockManifest = createBlockManifest({\n id: \"block.event-calendar\",\n version: \"3.3.0\",\n title: \"Event Calendar\",\n titleSource: \"heading\",\n description: \"Display events with calendar, list, or combined views with filtering\",\n // Preserve legacy section styles field configuration (renderInHeader: false).\n skipSectionStyles: true,\n additionalFields: [\n ...sectionHeaderFields(\"Event Calendar\"),\n\n // Display Mode (replaces calendarView)\n {\n id: \"displayMode\",\n type: \"select\",\n label: \"Display mode\",\n description: \"How events are displayed\",\n required: false,\n multiple: false,\n defaultValue: \"combined\",\n options: [\n { value: \"combined\", label: \"Combined (List + Calendar tabs)\" },\n { value: \"month\", label: \"Month calendar\" },\n { value: \"week\", label: \"Week calendar\" },\n { value: \"list\", label: \"List\" },\n ],\n ui: { intent: 'display' as const },\n },\n\n // List options (visible when displayMode is list or combined)\n {\n id: \"listLayout\",\n type: \"select\",\n label: \"List layout\",\n description: \"Layout style for list view\",\n required: false,\n multiple: false,\n defaultValue: \"stack\",\n options: [\n { value: \"stack\", label: \"Stack (full-width cards)\" },\n { value: \"grid\", label: \"Grid\" },\n ],\n ui: { intent: 'display' as const, visibleWhen: { field: \"displayMode\", oneOf: [\"combined\", \"list\"] } },\n },\n {\n id: \"listColumns\",\n type: \"select\",\n label: \"Grid columns\",\n description: \"Number of columns in grid layout\",\n required: false,\n multiple: false,\n defaultValue: \"3\",\n options: [\n { value: \"2\", label: \"2 columns\" },\n { value: \"3\", label: \"3 columns\" },\n { value: \"4\", label: \"4 columns\" },\n ],\n ui: { intent: 'display' as const, visibleWhen: { field: \"listLayout\", equals: \"grid\" } },\n },\n {\n id: \"eventsPerPage\",\n type: \"select\",\n label: \"Events per page\",\n description: \"Number of events to load initially\",\n required: false,\n multiple: false,\n defaultValue: \"12\",\n options: [\n { value: \"6\", label: \"6\" },\n { value: \"12\", label: \"12\" },\n { value: \"24\", label: \"24\" },\n ],\n ui: { intent: 'display' as const, visibleWhen: { field: \"displayMode\", oneOf: [\"combined\", \"list\"] } },\n },\n {\n id: \"loadMoreText\",\n type: \"text\",\n label: \"Load more button text\",\n description: \"Text for the load more button\",\n required: false,\n multiline: false,\n defaultValue: \"Load more events\",\n ui: { intent: 'content' as const, visibleWhen: { field: \"displayMode\", oneOf: [\"combined\", \"list\"] } },\n },\n\n // Calendar options\n {\n id: \"startOfWeek\",\n type: \"select\",\n label: \"Week starts on\",\n description: \"First day of the week\",\n required: false,\n multiple: false,\n defaultValue: \"monday\",\n options: [\n { value: \"sunday\", label: \"Sunday\" },\n { value: \"monday\", label: \"Monday\" },\n ],\n ui: { intent: 'display' as const, visibleWhen: { field: \"displayMode\", oneOf: [\"combined\", \"month\", \"week\"] } },\n },\n\n // Combined mode options\n {\n id: \"calendarTabViews\",\n type: \"select\",\n label: \"Calendar tab views\",\n description: \"Which calendar views to show in the Calendar tab\",\n required: false,\n multiple: false,\n defaultValue: \"both\",\n options: [\n { value: \"both\", label: \"Month + Week toggle\" },\n { value: \"month\", label: \"Month only\" },\n { value: \"week\", label: \"Week only\" },\n ],\n ui: { intent: 'display' as const, visibleWhen: { field: \"displayMode\", equals: \"combined\" } },\n },\n\n // Filtering options\n {\n id: \"showFilters\",\n type: \"boolean\",\n label: \"Show filters\",\n description: \"Show category/venue filters in list views\",\n required: false,\n defaultValue: true,\n ui: { intent: 'display' as const, visibleWhen: { field: \"displayMode\", oneOf: [\"combined\", \"list\"] } },\n },\n {\n id: \"showCategoryFilter\",\n type: \"select\",\n label: \"Show category filter\",\n description: \"When to show the category filter dropdown\",\n required: false,\n multiple: false,\n defaultValue: \"auto\",\n options: [\n { value: \"auto\", label: \"Auto (when >1 category has events)\" },\n { value: \"always\", label: \"Always\" },\n { value: \"never\", label: \"Never\" },\n ],\n ui: { intent: 'display' as const, visibleWhen: { field: \"displayMode\", oneOf: [\"combined\", \"list\"] } },\n },\n {\n id: \"showVenueFilter\",\n type: \"boolean\",\n label: \"Show venue filter\",\n description: \"Show venue filter dropdown in list views\",\n required: false,\n defaultValue: false,\n ui: { intent: 'display' as const, visibleWhen: { field: \"displayMode\", oneOf: [\"combined\", \"list\"] } },\n },\n\n // Block-level pre-filtering\n {\n id: \"filterCategoryIds\",\n type: \"text\",\n label: \"Pre-filter by categories\",\n description: \"Comma-separated category IDs to restrict events (leave empty for all)\",\n required: false,\n multiline: false,\n maxLength: 1000,\n ui: { intent: 'display' as const },\n },\n {\n id: \"filterVenueId\",\n type: \"text\",\n label: \"Pre-filter by venue\",\n description: \"Venue ID to restrict events (leave empty for all)\",\n required: false,\n multiline: false,\n maxLength: 100,\n ui: { intent: 'display' as const },\n },\n\n // Card styling\n ...cardStylingFields\n .filter((f) => f.id === 'buttonVariant' || f.id === 'buttonText')\n .map((field) => ({\n ...field,\n ui: { ...(field.ui ?? {}), intent: (field.id === 'buttonVariant' ? 'style' : 'content') as 'style' | 'content' },\n })),\n {\n ...emptyStateField,\n ui: { ...(emptyStateField.ui ?? {}), intent: 'display' as const },\n },\n sectionStylesField({\n id: '_sectionStyles',\n label: 'Section styles',\n renderInHeader: false,\n }),\n ],\n styleTokens: { background: \"surface\", typography: \"body\", spacing: \"md\" },\n behaviours: { supportsThemeSwitching: true, inlineEditing: false, animation: false, paletteHidden: false },\n category: \"interactive\",\n tags: [\"events\", \"calendar\", \"month\", \"week\", \"schedule\", \"interactive\", \"list\", \"filter\"],\n icon: \"CalendarDays\",\n layout: [\n styledSection({\n children: sectionContainer([\n // Optional heading\n text(\n { as: \"h2\" },\n bind(\"content.heading\"),\n when(\"content.heading\")\n ),\n\n // Optional description\n richText(\n { className: \"rb-prose rb-max-w-none\" },\n bind(\"content.description\"),\n when(\"content.description\")\n ),\n\n // Event calendar component (handles all display modes)\n el(\"event-calendar\", withApiBindings({\n events: { $bind: { from: \"data.events\" } },\n stage: { $bind: { from: \"$root.previewStage\", fallback: \"published\" } },\n // Display mode\n displayMode: { $bind: { from: \"content.displayMode\", fallback: \"combined\" } },\n // List options\n listLayout: { $bind: { from: \"content.listLayout\" } },\n listColumns: { $bind: { from: \"content.listColumns\" } },\n // Legacy compatibility: older event-calendar content used layout/columns\n layout: { $bind: { from: \"content.layout\" } },\n columns: { $bind: { from: \"content.columns\" } },\n eventsPerPage: { $bind: { from: \"content.eventsPerPage\", fallback: \"12\" } },\n loadMoreText: { $bind: { from: \"content.loadMoreText\", fallback: \"Load more events\" } },\n // Calendar options\n startOfWeek: { $bind: { from: \"content.startOfWeek\", fallback: \"monday\" } },\n calendarTabViews: { $bind: { from: \"content.calendarTabViews\", fallback: \"both\" } },\n // Filtering options\n showFilters: { $bind: { from: \"content.showFilters\", fallback: true } },\n showCategoryFilter: { $bind: { from: \"content.showCategoryFilter\", fallback: \"auto\" } },\n showVenueFilter: { $bind: { from: \"content.showVenueFilter\", fallback: false } },\n filterCategoryIds: { $bind: { from: \"content.filterCategoryIds\" } },\n filterVenueId: { $bind: { from: \"content.filterVenueId\" } },\n // Styling\n buttonVariant: { $bind: { from: \"content.buttonVariant\", fallback: \"primary\" } },\n buttonText: { $bind: { from: \"content.buttonText\", fallback: \"View event\" } },\n emptyMessage: { $bind: { from: \"content.emptyMessage\" } },\n })),\n ], {\n gap: \"lg\",\n }),\n // sectionContainer (rb-container) already provides horizontal padding\n baseClass: \"\",\n spacing: \"comfortable\",\n }),\n ],\n});\n\nexport type EventCalendarContent = {\n heading?: string | null;\n description?: unknown; // Rich text\n // Display mode\n displayMode?: DisplayMode | null;\n // List options\n listLayout?: EventLayout | null;\n listColumns?: ColumnOption | null;\n // Legacy list options (pre-v3.3)\n layout?: EventLayout | null;\n columns?: ColumnOption | null;\n eventsPerPage?: '6' | '12' | '24' | null;\n loadMoreText?: string | null;\n // Calendar options\n startOfWeek?: WeekStart | null;\n calendarTabViews?: CalendarTabViews | null;\n // Filtering\n showFilters?: boolean | null;\n showCategoryFilter?: FilterAutoShow | null;\n showVenueFilter?: boolean | null;\n filterCategoryIds?: string | null;\n filterVenueId?: string | null;\n // Styling\n buttonVariant?: ButtonVariant | null;\n buttonText?: string | null;\n emptyMessage?: string | null;\n _sectionStyles?: SectionStylesContent;\n};\n\nexport const eventCalendarBlockDefinition: SystemBlockDefinition<EventCalendarContent> = {\n manifest: eventCalendarManifest,\n dataSchemas: {\n events: publicEventsArraySchema.optional(),\n },\n dataLoaders: {\n events: {\n endpoint: 'listPublicEvents',\n params: {\n siteId: { $bind: { from: '$root.siteId' } },\n // Pre-fetch events - limit varies by mode but default to high for calendar\n limit: 100,\n stage: { $bind: { from: '$root.previewStage', fallback: 'published' } },\n // Pass filter params if configured\n categoryIds: { $bind: { from: 'content.filterCategoryIds' } },\n venueId: { $bind: { from: 'content.filterVenueId' } },\n },\n mode: 'server',\n },\n },\n};\n","import { z } from \"zod\";\nimport { parseFieldDefinition } from \"../manifest/schema\";\nimport type { BlockManifest, FieldDefinition } from \"../manifest/schema\";\nimport type { SystemBlockDefinition } from \"../registry\";\nimport { stack, text, bind, when, repeat, el } from \"../node/builder\";\nimport { styledSection, sectionContainer } from \"../node/fragments\";\nimport { createBlockManifest } from \"../defineBlock\";\nimport {\n textColorStyle,\n borderColorStyle,\n backgroundColorStyle,\n mergeStyles,\n} from \"../../theme/utils/colorStyles\";\n\n/**\n * Embed block - enables embedding content entries from any content type.\n *\n * This block is designed to be overridden by SDK sites. The default layout\n * is a simple placeholder that shows basic entry information. Sites should\n * use blockOverrides to provide custom renderers based on content.layout.\n *\n * Example SDK usage:\n * ```tsx\n * <Page\n * {...pageData}\n * blockOverrides={{\n * embed: EmbedRenderer,\n * }}\n * />\n * ```\n *\n * The EmbedRenderer receives:\n * - content: EmbedContent with heading, layout, contentType, etc.\n * - data: { entries: ContentEntry[] }\n * - theme: Theme tokens\n */\n\n// Additional fields for the embed block\nconst embedFields: FieldDefinition[] = [\n // Section heading\n parseFieldDefinition({\n id: \"heading\",\n type: \"text\",\n label: \"Heading\",\n description: \"Optional section title displayed above the content.\",\n required: false,\n maxLength: 120,\n }),\n parseFieldDefinition({\n id: \"subheading\",\n type: \"richText\",\n label: \"Subheading\",\n description: \"Optional section description below the heading.\",\n required: false,\n ui: { variant: \"limited\" },\n }),\n\n // Content source\n parseFieldDefinition({\n id: \"contentType\",\n type: \"contentTypeSelect\",\n label: \"Content type\",\n description: \"Select the content type to embed.\",\n required: true,\n filter: \"all\",\n ui: { intent: \"behavior\" },\n }),\n parseFieldDefinition({\n id: \"mode\",\n type: \"select\",\n label: \"Selection mode\",\n description: \"How to select which entries to display.\",\n required: true,\n defaultValue: \"query\",\n options: [\n { value: \"query\", label: \"Query (automatic)\" },\n { value: \"manual\", label: \"Manual (pick entries)\" },\n ],\n ui: { intent: \"behavior\" },\n }),\n\n // Query mode options\n parseFieldDefinition({\n id: \"limit\",\n type: \"select\",\n label: \"Limit\",\n description: \"Maximum number of entries to display.\",\n defaultValue: \"10\",\n options: [\n { value: \"3\", label: \"3 entries\" },\n { value: \"6\", label: \"6 entries\" },\n { value: \"10\", label: \"10 entries\" },\n { value: \"20\", label: \"20 entries\" },\n { value: \"50\", label: \"50 entries\" },\n ],\n ui: {\n intent: \"display\",\n visibleWhen: { field: \"mode\", equals: \"query\" },\n },\n }),\n parseFieldDefinition({\n id: \"orderBy\",\n type: \"select\",\n label: \"Order by\",\n description: \"How to sort the entries.\",\n defaultValue: \"order\",\n options: [\n { value: \"order\", label: \"Custom order field\" },\n { value: \"newest\", label: \"Newest first\" },\n { value: \"oldest\", label: \"Oldest first\" },\n { value: \"title\", label: \"Title (A-Z)\" },\n ],\n ui: {\n intent: \"display\",\n visibleWhen: { field: \"mode\", equals: \"query\" },\n },\n }),\n\n // Manual mode options - entry references\n parseFieldDefinition({\n id: \"entries\",\n type: \"repeater\",\n label: \"Entries\",\n description: \"Select specific entries to display.\",\n required: false,\n itemLabel: \"Entry\",\n minItems: 1,\n maxItems: 20,\n schema: {\n fields: [\n {\n id: \"entryId\",\n type: \"entryPicker\",\n label: \"Entry\",\n description: \"Select a content entry to embed (stored by identifier for cross-environment portability).\",\n required: true,\n ui: {\n contentTypeField: \"contentType\",\n valueFrom: \"identifier\",\n },\n },\n ],\n },\n ui: {\n intent: \"display\",\n visibleWhen: { field: \"mode\", equals: \"manual\" },\n },\n }),\n\n // Layout selection - SDK sites can provide custom options via blockFieldOptions\n parseFieldDefinition({\n id: \"layout\",\n type: \"select\",\n label: \"Layout\",\n description: \"Select a layout style for displaying the embedded content.\",\n defaultValue: \"list\",\n options: [\n { value: \"list\", label: \"List\" },\n { value: \"grid\", label: \"Grid\" },\n { value: \"carousel\", label: \"Carousel\" },\n { value: \"team\", label: \"Team\" },\n ],\n ui: {\n intent: \"display\",\n widget: \"sdkSelect\", // Use SDK-aware widget for site-specific options\n },\n }),\n\n // Empty state\n parseFieldDefinition({\n id: \"emptyMessage\",\n type: \"text\",\n label: \"Empty state message\",\n description: \"Message shown when no entries are available.\",\n defaultValue: \"No entries found.\",\n maxLength: 200,\n ui: { intent: \"display\" },\n }),\n];\n\n// Default layout - a simple placeholder that sites should override\nconst embedLayout = styledSection({\n children: sectionContainer([\n // Heading\n text(\n {\n as: \"h2\",\n style: textColorStyle(\"heading\"),\n },\n bind(\"content.heading\"),\n when(\"content.heading\"),\n ),\n\n // Subheading\n el(\n \"richText\",\n {\n className: \"rb-mt-2 rb-prose rb-max-w-none\",\n style: textColorStyle(\"mutedText\"),\n },\n undefined,\n bind(\"content.subheading\"),\n when(\"content.subheading\"),\n ),\n\n // Default entry rendering - a simple list\n // Sites should override this with custom layouts via blockOverrides\n // Outer stack provides gap between repeated entry cards\n stack(\n { gap: \"md\", className: \"rb-mt-8\" },\n [\n // Entry card (repeated for each entry)\n stack(\n {\n gap: \"sm\",\n className: \"rb-rounded-lg rb-border rb-p-4 rb-shadow-sm\",\n style: mergeStyles(\n borderColorStyle(\"border\"),\n backgroundColorStyle(\"surface\"),\n ),\n },\n [\n text(\n {\n as: \"h3\",\n style: textColorStyle(\"heading\"),\n },\n bind(\"entry.title\"),\n ),\n text(\n {\n as: \"p\",\n className: \"rb-caption\",\n style: textColorStyle(\"mutedText\"),\n },\n bind(\"entry.slug\"),\n when(\"entry.slug\"),\n ),\n ],\n repeat(\"data.entries\", \"entry\"),\n ),\n ],\n when(\"data.entries\"),\n ),\n\n // Empty state\n stack(\n {\n gap: \"sm\",\n className: \"rb-py-12 rb-text-center\",\n },\n [\n text(\n {\n as: \"p\",\n style: textColorStyle(\"mutedText\"),\n },\n bind(\"content.emptyMessage\", { fallback: \"No entries found.\" }),\n ),\n ],\n when(\"data.entries\", { not: true }),\n ),\n ]),\n baseClass: \"\",\n spacing: \"comfortable\",\n});\n\nexport const embedManifest: BlockManifest = createBlockManifest({\n id: \"block.embed\",\n title: \"Embed Content\",\n category: \"content\",\n titleSource: \"heading\",\n\n additionalFields: embedFields,\n layout: embedLayout,\n\n description:\n \"Embed content entries from any content type. Sites provide custom layouts via block overrides.\",\n tags: [\"embed\", \"content\", \"dynamic\", \"collection\", \"entries\", \"listing\"],\n icon: \"LayoutList\",\n styleTokens: {\n spacing: \"lg\",\n },\n});\n\nexport type EmbedContent = {\n // Section heading\n heading?: string | null;\n subheading?: unknown; // TipTap richText\n\n // Content source\n contentType: string;\n mode: \"query\" | \"manual\";\n\n // Query mode options\n limit?: string | null;\n orderBy?: \"order\" | \"newest\" | \"oldest\" | \"title\" | null;\n\n // Manual mode options\n entries?: Array<{ entryId: string }> | null;\n\n // Layout\n layout?: string | null;\n\n // Empty state\n emptyMessage?: string | null;\n};\n\nexport type EmbedEntry = {\n id: string;\n identifier: string;\n title: string;\n slug?: string | null;\n content?: Record<string, unknown>;\n publishedAt?: string | null;\n};\n\nconst embedEntrySchema = z.object({\n id: z.string(),\n identifier: z.string(),\n title: z.string(),\n slug: z.string().nullable().optional(),\n content: z.record(z.string(), z.unknown()).optional(),\n publishedAt: z.string().nullable().optional(),\n});\n\nexport const embedBlockDefinition: SystemBlockDefinition<EmbedContent> = {\n manifest: embedManifest,\n dataSchemas: {\n entries: z.array(embedEntrySchema).optional(),\n },\n dataLoaders: {\n entries: {\n endpoint: \"listPublishedEntries\",\n params: {\n type: { $bind: { from: \"contentType\" } },\n siteId: { $bind: { from: \"$root.siteId\" } },\n limit: { $bind: { from: \"limit\", fallback: \"10\" } },\n orderBy: { $bind: { from: \"orderBy\", fallback: \"order\" } },\n stage: { $bind: { from: \"$root.previewStage\", fallback: \"published\" } },\n // Manual mode entry IDs - loader should handle this\n entryIds: { $bind: { from: \"entries\", transforms: [{ id: \"value.jsonArray\" }] } },\n mode: { $bind: { from: \"mode\" } },\n },\n mode: \"server\",\n },\n },\n};\n","import type { BlockManifest } from \"../manifest/schema\";\nimport { parseFieldDefinitions } from \"../manifest/schema\";\nimport type { NodeDefinition } from \"../node\";\nimport type { SystemBlockDefinition } from \"../registry\";\nimport type { Media } from \"../../lib/media\";\nimport {\n stack,\n text,\n media,\n carousel,\n el,\n bind,\n when,\n repeat,\n} from \"../node/builder\";\nimport {\n textColorStyle,\n borderColorStyle,\n backgroundColorStyle,\n mergeStyles,\n} from \"../../theme/utils/colorStyles\";\nimport { createBlockManifest } from \"../defineBlock\";\nimport type { NodeModifier } from \"../node/builder\";\nimport { styledSection } from \"../node/fragments\";\nimport type { SectionStylesContent } from \"../fields/boxStyles\";\n\n// Grid primitive helper (same pattern as blogListGrid.ts)\nconst grid = (\n props?: Record<string, unknown> | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n) => el(\"grid\", props ?? undefined, children ?? undefined, ...mods);\n\n// Local container helper (rb-utilities based; avoids Tailwind's `container` class)\nconst galleryContainer = (\n children: Array<NodeDefinition | null | undefined>,\n opts?: {\n gap?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n fullWidth?: boolean;\n className?: string;\n },\n): NodeDefinition => {\n const gap = opts?.gap ?? \"md\";\n const withExtraClass = (baseClass: string) =>\n opts?.className ? `${baseClass} ${opts.className}` : baseClass;\n\n if (opts?.fullWidth) {\n return stack({ gap, className: withExtraClass(\"rb-container-bleed\") }, children);\n }\n\n return stack(\n {\n gap,\n className: {\n $bind: {\n from: \"content.fullBleed\",\n transforms: [\n {\n id: \"ui.conditionalClass\",\n options: {\n whenTrue: withExtraClass(\"rb-container-bleed\"),\n whenFalse: withExtraClass(\"rb-container\"),\n },\n },\n ],\n fallback: withExtraClass(\"rb-container\"),\n },\n },\n },\n children,\n );\n};\n\n// Gallery item with image and optional caption\nconst galleryItem = (options: {\n imageClassName: string;\n bindAspectRatio: boolean;\n containerClassName?: string;\n}): NodeDefinition =>\n stack(\n { gap: \"xs\", className: options.containerClassName },\n [\n el(\n \"figure\",\n {\n className: {\n $bind: {\n from: \"content\",\n transforms: [{ id: \"ui.imageGalleryTileClass\" }],\n fallback: \"rb-overflow-hidden rb-relative rb-rounded-3xl rb-border-2\",\n },\n },\n style: {\n $bind: {\n from: \"content\",\n transforms: [{ id: \"ui.imageGalleryTileStyle\" }],\n },\n },\n },\n [\n media(\n {\n className: {\n $bind: {\n from: \"content.imageFilter\",\n transforms: [{ id: \"ui.imageGalleryFilterClass\" }],\n fallback: \"\",\n },\n $prepend: `${options.imageClassName} `,\n },\n ...(options.bindAspectRatio && {\n style: { aspectRatio: { $bind: { from: \"content.aspectRatio\" } } },\n }),\n },\n bind(\"item.image\"),\n ),\n ],\n ),\n text(\n {\n as: \"figcaption\",\n className: \"rb-caption rb-text-center\",\n style: textColorStyle(\"mutedText\"),\n },\n bind(\"item.caption\"),\n when(\"item.caption\"),\n ),\n ],\n repeat(\"content.images\", \"item\"),\n );\n\n// Grid layout - responsive 3-column grid\nconst gridLayout: NodeDefinition = grid(\n {\n className:\n \"rb-grid rb-grid-cols-1 rb-gap-4 rb-sm-grid-cols-2 rb-md-grid-cols-3\",\n },\n [\n galleryItem({\n imageClassName: \"rb-w-full rb-h-full rb-object-cover\",\n bindAspectRatio: true,\n }),\n ],\n);\n\n// Carousel layout\nconst carouselLayout: NodeDefinition = carousel(\n {\n className: {\n $bind: {\n from: \"content.fullBleed\",\n transforms: [\n {\n id: \"ui.conditionalClass\",\n options: {\n whenTrue: \"rb-image-gallery-carousel rb-image-gallery-carousel--full-bleed\",\n whenFalse: \"rb-image-gallery-carousel\",\n },\n },\n ],\n fallback: \"rb-image-gallery-carousel\",\n },\n },\n slidesToShow: {\n mobile: { $bind: { from: \"content.slidesToShow\", fallback: 1 } },\n tablet: { $bind: { from: \"content.slidesToShowTablet\" } },\n desktop: { $bind: { from: \"content.slidesToShowDesktop\" } },\n },\n transition: { $bind: { from: \"content.transition\", fallback: \"slide\" } },\n showControls: { $bind: { from: \"content.showControls\", fallback: true } },\n showDots: { $bind: { from: \"content.showDots\", fallback: false } },\n autoplay: { $bind: { from: \"content.autoplay\", fallback: false } },\n autoplayDelay: {\n $bind: { from: \"content.autoplayDelay\", fallback: 5000, coerce: \"number\" },\n },\n arrowVisibility: {\n $bind: { from: \"content.arrowVisibility\", fallback: \"always\" },\n },\n loop: { $bind: { from: \"content.loop\", fallback: true } },\n },\n [\n galleryItem({\n imageClassName: \"rb-w-full rb-h-full rb-object-cover\",\n bindAspectRatio: true,\n }),\n ],\n);\n\n// Masonry layout using CSS columns\nconst masonryLayout: NodeDefinition = el(\n \"div\",\n {\n style: {\n columns: \"3 250px\",\n columnGap: \"1rem\",\n },\n },\n [\n galleryItem({\n imageClassName: \"rb-w-full rb-h-auto\",\n bindAspectRatio: false, // Masonry uses original aspect ratios\n containerClassName: \"rb-mb-4 rb-break-inside-avoid\",\n }),\n ],\n);\n\n// Marquee layout - infinite scroll\nconst marqueeTileBase: NodeDefinition = stack(\n {\n gap: \"xs\",\n className: \"rb-flex-shrink-0\",\n },\n [\n el(\n \"figure\",\n {\n className: {\n $bind: {\n from: \"content\",\n transforms: [{ id: \"ui.imageGalleryTileClass\" }],\n fallback: \"rb-overflow-hidden rb-relative rb-rounded-3xl rb-border-2\",\n },\n },\n style: {\n $bind: {\n from: \"content\",\n transforms: [{ id: \"ui.imageGalleryMarqueeTileStyle\" }],\n },\n },\n },\n [\n media(\n {\n className: {\n $bind: {\n from: \"content.imageFilter\",\n transforms: [{ id: \"ui.imageGalleryFilterClass\" }],\n fallback: \"\",\n },\n $prepend: \"rb-w-full rb-h-full rb-object-cover \",\n },\n style: { aspectRatio: \"1 / 1\" },\n },\n bind(\"item.image\"),\n ),\n ],\n ),\n text(\n {\n as: \"figcaption\",\n className: \"rb-caption rb-text-center\",\n style: textColorStyle(\"mutedText\"),\n },\n bind(\"item.caption\"),\n when(\"item.caption\"),\n ),\n ],\n);\n\nconst marqueeTile: NodeDefinition = {\n ...marqueeTileBase,\n $repeat: {\n collection: {\n from: \"content.images\",\n pick: \"collection\",\n transforms: [{ id: \"array.marqueeLoop\", options: { minItems: 10 } }],\n },\n itemName: \"item\",\n indexName: \"index\",\n },\n};\n\nconst marqueeLayout: NodeDefinition = el(\n \"div\",\n {\n className: {\n $bind: {\n from: \"content.marqueePauseOnHover\",\n transforms: [\n {\n id: \"ui.conditionalClass\",\n options: {\n whenTrue: \"rb-image-gallery-marquee rb-marquee-pause-on-hover\",\n whenFalse: \"rb-image-gallery-marquee\",\n },\n },\n ],\n fallback: \"rb-image-gallery-marquee\",\n },\n $prepend: \"rb-py-4 \",\n },\n },\n [\n el(\n \"div\",\n {\n className:\n \"rb-flex rb-animate-marquee rb-transform-gpu rb-will-change-transform\",\n style: {\n \"--rb-marquee-duration\": {\n $bind: {\n from: \"content.marqueeSpeed\",\n transforms: [{ id: \"ui.imageGalleryMarqueeDuration\" }],\n fallback: \"40s\",\n },\n },\n \"--rb-marquee-direction\": {\n $bind: {\n from: \"content.marqueeDirection\",\n transforms: [{ id: \"ui.imageGalleryMarqueeDirection\" }],\n fallback: \"normal\",\n },\n },\n },\n },\n [marqueeTile],\n ),\n ],\n);\n\n// Empty state - shows when images is null, undefined, or empty array\nconst emptyState: NodeDefinition = {\n type: \"stack\",\n props: {\n align: \"center\",\n gap: \"md\",\n className:\n \"rb-py-12 rb-text-center rb-rounded-xl rb-border rb-border-dashed\",\n style: mergeStyles(\n borderColorStyle(\"border\"),\n backgroundColorStyle(\"surface\"),\n ),\n },\n children: [\n {\n type: \"text\",\n props: {\n as: \"p\",\n style: textColorStyle(\"mutedText\"),\n },\n $bind: {\n from: \"content.emptyMessage\",\n fallback: \"Add images to create your gallery\",\n },\n },\n ],\n // Show when array length is 0 (handles undefined, null, and empty array)\n $when: {\n when: {\n from: \"content.images\",\n transforms: [{ id: \"array.length\" }],\n },\n equals: 0,\n },\n};\n\nconst wrapVariant = (\n layout: NodeDefinition,\n opts?: { fullWidth?: boolean; className?: string },\n): NodeDefinition =>\n styledSection({\n children: galleryContainer([layout, emptyState], {\n gap: \"md\",\n fullWidth: opts?.fullWidth,\n className: opts?.className,\n }),\n // galleryContainer (rb-container / rb-container-full) already provides horizontal padding\n baseClass: \"\",\n spacing: \"medium\",\n background: \"background\",\n });\n\n// Field definitions\nconst fields = parseFieldDefinitions([\n {\n id: \"images\",\n type: \"repeater\",\n label: \"Images\",\n itemLabel: \"Image\",\n minItems: 0,\n maxItems: 24,\n ui: {\n repeaterPreset: \"thumbnailGrid\",\n thumbnailField: \"image\",\n thumbnailAltField: \"caption\",\n thumbnailLabelField: \"caption\",\n thumbnailCardDensity: \"compact\",\n },\n schema: {\n fields: [\n {\n id: \"image\",\n type: \"media\",\n label: \"Image\",\n required: true,\n mediaKinds: [\"image\"],\n },\n {\n id: \"caption\",\n type: \"text\",\n label: \"Caption\",\n description: \"Optional caption displayed below the image and used as the editor card label\",\n maxLength: 200,\n },\n ],\n },\n },\n {\n id: \"fullBleed\",\n type: \"boolean\",\n label: \"Full bleed\",\n description:\n \"Extend the gallery edge-to-edge by removing section side padding and container max-width.\",\n defaultValue: false,\n ui: {\n visibleWhen: { field: \"variant\", notIn: [\"marquee\"] },\n },\n },\n {\n id: \"aspectRatio\",\n type: \"select\",\n label: \"Aspect ratio\",\n description: \"Crop images to a consistent aspect ratio.\",\n defaultValue: \"1/1\",\n options: [\n { value: \"auto\", label: \"Original\" },\n { value: \"1/1\", label: \"1:1 (Square)\" },\n { value: \"4/3\", label: \"4:3 (Standard)\" },\n { value: \"16/9\", label: \"16:9 (Widescreen)\" },\n { value: \"3/2\", label: \"3:2 (Classic)\" },\n { value: \"3/4\", label: \"3:4 (Portrait)\" },\n ],\n ui: {\n intent: \"display\" as const,\n visibleWhen: { field: \"variant\", notIn: [\"masonry\", \"marquee\"] },\n },\n },\n {\n id: \"slidesToShow\",\n type: \"select\",\n label: \"Images per view (mobile)\",\n description: \"Number of images visible at once on small screens.\",\n defaultValue: \"1\",\n options: [\n { value: \"1\", label: \"One at a time\" },\n { value: \"2\", label: \"Two at a time\" },\n { value: \"3\", label: \"Three at a time\" },\n ],\n ui: {\n intent: \"display\" as const,\n visibleWhen: { field: \"variant\", equals: \"carousel\" },\n },\n },\n {\n id: \"slidesToShowTablet\",\n type: \"select\",\n label: \"Images per view (tablet)\",\n description: \"Number of images visible on medium screens.\",\n options: [\n { value: \"\", label: \"Same as mobile\" },\n { value: \"1\", label: \"One at a time\" },\n { value: \"2\", label: \"Two at a time\" },\n { value: \"3\", label: \"Three at a time\" },\n ],\n ui: {\n visibleWhen: { field: \"variant\", equals: \"carousel\" },\n },\n },\n {\n id: \"slidesToShowDesktop\",\n type: \"select\",\n label: \"Images per view (desktop)\",\n description: \"Number of images visible on large screens.\",\n options: [\n { value: \"\", label: \"Same as tablet\" },\n { value: \"1\", label: \"One at a time\" },\n { value: \"2\", label: \"Two at a time\" },\n { value: \"3\", label: \"Three at a time\" },\n ],\n ui: {\n visibleWhen: { field: \"variant\", equals: \"carousel\" },\n },\n },\n {\n id: \"transition\",\n type: \"select\",\n label: \"Transition\",\n description: \"Animation style between slides.\",\n defaultValue: \"slide\",\n options: [\n { value: \"slide\", label: \"Slide\" },\n { value: \"fade\", label: \"Fade\" },\n ],\n ui: {\n intent: \"display\" as const,\n visibleWhen: { field: \"variant\", equals: \"carousel\" },\n },\n },\n {\n id: \"showControls\",\n type: \"boolean\",\n label: \"Show arrows\",\n defaultValue: true,\n ui: {\n visibleWhen: { field: \"variant\", equals: \"carousel\" },\n },\n },\n {\n id: \"showDots\",\n type: \"boolean\",\n label: \"Show dots\",\n defaultValue: false,\n ui: {\n visibleWhen: { field: \"variant\", equals: \"carousel\" },\n },\n },\n {\n id: \"autoplay\",\n type: \"boolean\",\n label: \"Autoplay\",\n defaultValue: false,\n ui: {\n visibleWhen: { field: \"variant\", equals: \"carousel\" },\n },\n },\n {\n id: \"autoplayDelay\",\n type: \"select\",\n label: \"Autoplay delay\",\n defaultValue: \"5000\",\n options: [\n { value: \"3000\", label: \"3 seconds\" },\n { value: \"5000\", label: \"5 seconds\" },\n { value: \"7000\", label: \"7 seconds\" },\n { value: \"10000\", label: \"10 seconds\" },\n ],\n ui: {\n visibleWhen: { field: \"variant\", equals: \"carousel\" },\n },\n },\n {\n id: \"arrowVisibility\",\n type: \"select\",\n label: \"Arrow visibility\",\n defaultValue: \"always\",\n options: [\n { value: \"always\", label: \"Always visible\" },\n { value: \"hover\", label: \"Show on hover\" },\n ],\n ui: {\n visibleWhen: { field: \"variant\", equals: \"carousel\" },\n },\n },\n {\n id: \"loop\",\n type: \"boolean\",\n label: \"Loop slides\",\n defaultValue: true,\n ui: {\n visibleWhen: { field: \"variant\", equals: \"carousel\" },\n },\n },\n {\n id: \"marqueeDirection\",\n type: \"select\",\n label: \"Scroll direction\",\n options: [\n { value: \"left\", label: \"Left\" },\n { value: \"right\", label: \"Right\" },\n ],\n defaultValue: \"left\",\n ui: {\n intent: \"display\" as const,\n visibleWhen: { field: \"variant\", equals: \"marquee\" },\n },\n },\n {\n id: \"marqueeSpeed\",\n type: \"select\",\n label: \"Scroll speed\",\n options: [\n { value: \"slow\", label: \"Slow (60s)\" },\n { value: \"medium\", label: \"Medium (40s)\" },\n { value: \"fast\", label: \"Fast (20s)\" },\n ],\n defaultValue: \"medium\",\n ui: {\n intent: \"display\" as const,\n visibleWhen: { field: \"variant\", equals: \"marquee\" },\n },\n },\n {\n id: \"marqueePauseOnHover\",\n type: \"boolean\",\n label: \"Pause on hover\",\n defaultValue: true,\n ui: {\n intent: \"behavior\" as const,\n visibleWhen: { field: \"variant\", equals: \"marquee\" },\n },\n },\n {\n id: \"marqueeImageSize\",\n type: \"select\",\n label: \"Image size\",\n options: [\n { value: \"sm\", label: \"Small (200px)\" },\n { value: \"md\", label: \"Medium (256px)\" },\n { value: \"lg\", label: \"Large (320px)\" },\n { value: \"xl\", label: \"Extra large (400px)\" },\n ],\n defaultValue: \"md\",\n ui: {\n intent: \"display\" as const,\n visibleWhen: { field: \"variant\", equals: \"marquee\" },\n },\n },\n {\n id: \"imageFilter\",\n type: \"select\",\n label: \"Image filter\",\n options: [\n { value: \"none\", label: \"None\" },\n { value: \"grayscale\", label: \"Grayscale\" },\n { value: \"grayscale-hover-reveal\", label: \"Grayscale (color on hover)\" },\n { value: \"sepia\", label: \"Sepia\" },\n ],\n defaultValue: \"grayscale-hover-reveal\",\n ui: {\n intent: \"style\" as const,\n },\n },\n {\n id: \"imageBorder\",\n type: \"group\",\n label: \"Image border\",\n schema: {\n fields: [\n { id: \"enabled\", type: \"boolean\", label: \"Show border\", defaultValue: true },\n {\n id: \"colorToken\",\n type: \"text\",\n label: \"Border color\",\n defaultValue: \"accent\",\n ui: {\n widget: \"backgroundColor\",\n },\n },\n {\n id: \"opacity\",\n type: \"number\",\n label: \"Border opacity\",\n defaultValue: 30,\n ui: {\n min: 0,\n max: 100,\n },\n },\n {\n id: \"width\",\n type: \"select\",\n label: \"Border width\",\n options: [\n { value: \"1\", label: \"Thin (1px)\" },\n { value: \"2\", label: \"Medium (2px)\" },\n { value: \"3\", label: \"Thick (3px)\" },\n ],\n defaultValue: \"2\",\n },\n ],\n },\n ui: {\n intent: \"style\" as const,\n },\n },\n {\n id: \"imageCorners\",\n type: \"select\",\n label: \"Image corners\",\n options: [\n { value: \"none\", label: \"Square\" },\n { value: \"sm\", label: \"Slightly rounded\" },\n { value: \"md\", label: \"Rounded\" },\n { value: \"lg\", label: \"More rounded\" },\n { value: \"xl\", label: \"Very rounded\" },\n { value: \"2xl\", label: \"Extra rounded\" },\n { value: \"3xl\", label: \"Maximum rounded\" },\n ],\n defaultValue: \"3xl\",\n ui: {\n intent: \"style\" as const,\n },\n },\n]);\n\nconst baseImageGalleryManifest = createBlockManifest({\n id: \"block.image-gallery\",\n title: \"Image Gallery\",\n category: \"content\",\n\n additionalFields: fields,\n\n layout: wrapVariant(gridLayout),\n variants: {\n grid: wrapVariant(gridLayout),\n carousel: wrapVariant(carouselLayout),\n masonry: wrapVariant(masonryLayout),\n marquee: wrapVariant(marqueeLayout, {\n fullWidth: true,\n className: \"rb-image-gallery-marquee-container\",\n }),\n },\n defaultVariant: \"grid\",\n variantOptions: {\n grid: {\n label: \"Grid\",\n description: \"Responsive grid of images\",\n icon: \"Grid\",\n },\n carousel: {\n label: \"Carousel\",\n description: \"Swipeable carousel with controls\",\n icon: \"GalleryHorizontal\",\n },\n masonry: {\n label: \"Masonry\",\n description: \"Pinterest-style columns\",\n icon: \"Columns\",\n },\n marquee: {\n label: \"Marquee (infinite scroll)\",\n description: \"Infinite horizontal scrolling gallery\",\n icon: \"Repeat\",\n },\n },\n\n description:\n \"Display a collection of images in grid, carousel, masonry, or marquee layout.\",\n tags: [\"gallery\", \"images\", \"photos\", \"carousel\", \"grid\", \"masonry\", \"marquee\", \"media\"],\n icon: \"Images\",\n styleTokens: {\n background: \"surface\",\n spacing: \"md\",\n },\n});\n\nexport const imageGalleryManifest: BlockManifest = baseImageGalleryManifest;\n\nexport type ImageGalleryContent = {\n variant?: \"grid\" | \"carousel\" | \"masonry\" | \"marquee\" | null;\n fullBleed?: boolean | null;\n aspectRatio?: \"auto\" | \"1/1\" | \"4/3\" | \"16/9\" | \"3/2\" | \"3/4\" | null;\n slidesToShow?: \"1\" | \"2\" | \"3\" | null;\n slidesToShowTablet?: \"\" | \"1\" | \"2\" | \"3\" | null;\n slidesToShowDesktop?: \"\" | \"1\" | \"2\" | \"3\" | null;\n transition?: \"slide\" | \"fade\" | null;\n showControls?: boolean | null;\n showDots?: boolean | null;\n autoplay?: boolean | null;\n autoplayDelay?: \"3000\" | \"5000\" | \"7000\" | \"10000\" | null;\n arrowVisibility?: \"always\" | \"hover\" | null;\n loop?: boolean | null;\n marqueeDirection?: \"left\" | \"right\" | null;\n marqueeSpeed?: \"slow\" | \"medium\" | \"fast\" | null;\n marqueePauseOnHover?: boolean | null;\n marqueeImageSize?: \"sm\" | \"md\" | \"lg\" | \"xl\" | null;\n imageFilter?: \"none\" | \"grayscale\" | \"grayscale-hover-reveal\" | \"sepia\" | null;\n imageBorder?: {\n enabled?: boolean | null;\n colorToken?: string | null;\n opacity?: number | null;\n width?: \"1\" | \"2\" | \"3\" | null;\n } | null;\n imageCorners?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\" | null;\n images?: Array<{\n image?: Media | null;\n caption?: string | null;\n }> | null;\n _sectionStyles?: SectionStylesContent;\n};\n\nexport const imageGalleryBlockDefinition: SystemBlockDefinition<ImageGalleryContent> =\n {\n manifest: imageGalleryManifest,\n };\n","import type { BlockManifest } from \"../manifest/schema\";\nimport { parseFieldDefinitions } from \"../manifest/schema\";\nimport type { NodeDefinition } from \"../node\";\nimport type { SystemBlockDefinition } from \"../registry\";\nimport {\n section,\n stack,\n text,\n videoEmbed,\n el,\n bind,\n when,\n repeat,\n} from \"../node/builder\";\nimport { sectionContainer } from \"../node/fragments\";\nimport {\n textColorStyle,\n borderColorStyle,\n backgroundColorStyle,\n mergeStyles,\n} from \"../../theme/utils/colorStyles\";\nimport { createBlockManifest } from \"../defineBlock\";\nimport type { NodeModifier } from \"../node/builder\";\n\n// Grid primitive helper\nconst grid = (\n props?: Record<string, unknown> | null,\n children?: Array<NodeDefinition | null | undefined> | null,\n ...mods: NodeModifier[]\n) => el(\"grid\", props ?? undefined, children ?? undefined, ...mods);\n\n// Video item with embed and optional caption\nconst videoItem = (options: { containerClassName?: string }): NodeDefinition =>\n stack(\n { gap: \"xs\", className: options.containerClassName },\n [\n videoEmbed(\n {\n className: \"rb-w-full rb-rounded-lg rb-overflow-hidden\",\n style: {\n aspectRatio: { $bind: { from: \"item.aspectRatio\", fallback: \"16/9\" } },\n },\n },\n bind(\"item.url\"),\n when(\"item.aspectRatio\"),\n ),\n videoEmbed(\n {\n className: \"rb-w-full rb-rounded-lg rb-overflow-hidden\",\n style: {\n aspectRatio: { $bind: { from: \"content.aspectRatio\", fallback: \"16/9\" } },\n },\n },\n bind(\"item.url\"),\n when(\"item.aspectRatio\", { not: true }),\n ),\n text(\n {\n as: \"figcaption\",\n className: \"rb-caption rb-text-center\",\n style: textColorStyle(\"mutedText\"),\n },\n bind(\"item.caption\"),\n when(\"item.caption\"),\n ),\n ],\n repeat(\"content.videos\", \"item\"),\n );\n\n// Grid layout with configurable columns\nconst gridColumnsClass = (columns: number): string => {\n switch (columns) {\n case 1:\n return \"rb-grid rb-grid-cols-1 rb-gap-6\";\n case 2:\n return \"rb-grid rb-grid-cols-1 rb-gap-6 rb-sm-grid-cols-2\";\n case 3:\n return \"rb-grid rb-grid-cols-1 rb-gap-6 rb-sm-grid-cols-2 rb-md-grid-cols-3\";\n case 4:\n return \"rb-grid rb-grid-cols-1 rb-gap-6 rb-sm-grid-cols-2 rb-lg-grid-cols-4\";\n default:\n return \"rb-grid rb-grid-cols-1 rb-gap-6 rb-sm-grid-cols-2 rb-md-grid-cols-3\";\n }\n};\n\n// Create grid layouts for each column option\nconst createGridLayout = (columns: number): NodeDefinition =>\n grid(\n {\n className: gridColumnsClass(columns),\n },\n [videoItem({})],\n when(\"content.columns\", { equals: String(columns) }),\n );\n\nconst gridLayout1: NodeDefinition = createGridLayout(1);\nconst gridLayout2: NodeDefinition = createGridLayout(2);\nconst gridLayout3: NodeDefinition = createGridLayout(3);\nconst gridLayout4: NodeDefinition = createGridLayout(4);\n\n// Empty state\nconst emptyState: NodeDefinition = {\n type: \"stack\",\n props: {\n align: \"center\",\n gap: \"md\",\n className:\n \"rb-py-12 rb-text-center rb-rounded-xl rb-border rb-border-dashed\",\n style: mergeStyles(\n borderColorStyle(\"border\"),\n backgroundColorStyle(\"surface\"),\n ),\n },\n children: [\n {\n type: \"text\",\n props: {\n as: \"p\",\n style: textColorStyle(\"mutedText\"),\n },\n $bind: {\n from: \"content.emptyMessage\",\n fallback: \"Add videos to create your gallery\",\n },\n },\n ],\n $when: {\n when: {\n from: \"content.videos\",\n transforms: [{ id: \"array.length\" }],\n },\n equals: 0,\n },\n};\n\n// Heading section\nconst headingSection: NodeDefinition = stack(\n { gap: \"sm\", className: \"rb-text-center rb-mb-8\" },\n [\n text(\n {\n as: \"h2\",\n style: textColorStyle(\"heading\"),\n },\n bind(\"content.heading\"),\n when(\"content.heading\"),\n ),\n text(\n {\n as: \"p\",\n className: \"rb-max-w-2xl rb-mx-auto\",\n style: textColorStyle(\"text\"),\n },\n bind(\"content.subheading\"),\n when(\"content.subheading\"),\n ),\n ],\n);\n\n// Main layout\nconst videoGridLayout: NodeDefinition = section(\n {\n background: \"background\",\n className: \"rb-py-12 rb-sm-py-16 rb-md-py-20\",\n },\n [\n sectionContainer(\n [\n headingSection,\n gridLayout1,\n gridLayout2,\n gridLayout3,\n gridLayout4,\n emptyState,\n ],\n { gap: \"md\" },\n ),\n ],\n);\n\n// Field definitions\nconst fields = parseFieldDefinitions([\n {\n id: \"heading\",\n type: \"text\",\n label: \"Heading\",\n description: \"Optional section title.\",\n maxLength: 100,\n },\n {\n id: \"subheading\",\n type: \"text\",\n label: \"Subheading\",\n description: \"Optional description below the heading.\",\n maxLength: 200,\n },\n {\n id: \"columns\",\n type: \"select\",\n label: \"Columns\",\n description: \"Number of videos per row.\",\n defaultValue: \"3\",\n options: [\n { value: \"1\", label: \"1 column\" },\n { value: \"2\", label: \"2 columns\" },\n { value: \"3\", label: \"3 columns\" },\n { value: \"4\", label: \"4 columns\" },\n ],\n ui: { intent: \"display\" },\n },\n {\n id: \"aspectRatio\",\n type: \"select\",\n label: \"Aspect ratio\",\n description: \"Video display ratio.\",\n defaultValue: \"16/9\",\n options: [\n { value: \"16/9\", label: \"16:9 (Widescreen)\" },\n { value: \"4/3\", label: \"4:3 (Standard)\" },\n { value: \"1/1\", label: \"1:1 (Square)\" },\n { value: \"3/4\", label: \"3:4 (Portrait)\" },\n { value: \"9/16\", label: \"9:16 (Shorts / Vertical)\" },\n { value: \"21/9\", label: \"21:9 (Ultrawide)\" },\n ],\n ui: { intent: \"display\" },\n },\n {\n id: \"videos\",\n type: \"repeater\",\n label: \"Videos\",\n itemLabel: \"Video\",\n minItems: 0,\n maxItems: 12,\n schema: {\n fields: [\n {\n id: \"url\",\n type: \"url\",\n label: \"Video URL\",\n required: true,\n description: \"YouTube, Vimeo, or Instagram URL\",\n },\n {\n id: \"aspectRatio\",\n type: \"select\",\n label: \"Aspect ratio override\",\n description: \"Override the block aspect ratio for this video (useful for mixed landscape + shorts).\",\n defaultValue: \"\",\n options: [\n { value: \"\", label: \"Use block setting\" },\n { value: \"16/9\", label: \"16:9 (Widescreen)\" },\n { value: \"4/3\", label: \"4:3 (Standard)\" },\n { value: \"1/1\", label: \"1:1 (Square)\" },\n { value: \"3/4\", label: \"3:4 (Portrait)\" },\n { value: \"9/16\", label: \"9:16 (Shorts / Vertical)\" },\n { value: \"21/9\", label: \"21:9 (Ultrawide)\" },\n ],\n },\n {\n id: \"caption\",\n type: \"text\",\n label: \"Caption\",\n description: \"Optional caption displayed below the video\",\n maxLength: 200,\n },\n ],\n },\n },\n {\n id: \"emptyMessage\",\n type: \"text\",\n label: \"Empty state message\",\n description: \"Message shown when no videos are added.\",\n defaultValue: \"Add videos to create your gallery\",\n maxLength: 100,\n ui: { intent: \"display\" },\n },\n]);\n\nexport const videoGridManifest: BlockManifest = createBlockManifest({\n id: \"block.video-grid\",\n title: \"Video Grid\",\n category: \"media\",\n\n skipSectionStyles: true,\n\n additionalFields: fields,\n\n layout: videoGridLayout,\n\n description:\n \"Display a collection of YouTube, Vimeo, and Instagram videos in a responsive grid.\",\n tags: [\"video\", \"youtube\", \"vimeo\", \"instagram\", \"gallery\", \"grid\", \"media\", \"embed\"],\n icon: \"Video\",\n styleTokens: {\n background: \"surface\",\n spacing: \"md\",\n },\n});\n\nexport type VideoGridContent = {\n heading?: string | null;\n subheading?: string | null;\n columns?: \"1\" | \"2\" | \"3\" | \"4\" | null;\n aspectRatio?: \"16/9\" | \"4/3\" | \"1/1\" | \"3/4\" | \"9/16\" | \"21/9\" | null;\n videos?: Array<{\n url?: string | null;\n aspectRatio?: \"\" | \"16/9\" | \"4/3\" | \"1/1\" | \"3/4\" | \"9/16\" | \"21/9\" | null;\n caption?: string | null;\n }> | null;\n emptyMessage?: string | null;\n};\n\nexport const videoGridBlockDefinition: SystemBlockDefinition<VideoGridContent> =\n {\n manifest: videoGridManifest,\n };\n","import type { BlockManifest } from \"../manifest/schema\";\nimport type { SystemBlockDefinition } from \"../registry\";\nimport { customerPortal } from \"../node/builder\";\nimport { styledSection } from \"../node/fragments/styledSection\";\nimport { sectionContainer } from \"../node/fragments\";\nimport { sectionStylesField, type SectionStylesContent } from \"../fields/boxStyles\";\nimport { withApiBindings } from \"../helpers/api-bindings\";\nimport { createBlockManifest } from \"../defineBlock\";\n\n/**\n * Customer Portal Block\n *\n * Provides authenticated customer access to their passes, memberships,\n * event registrations, appointments, and profile.\n *\n * Features:\n * - Inline magic link authentication (no separate login page)\n * - Passes with credit balance and expiry\n * - Memberships with status and renewal info\n * - Event registrations (upcoming/past) with cancel\n * - Appointments (upcoming/past) with cancel\n * - Profile viewing and editing\n *\n * Security Model:\n * - Server component checks for `booking_session` cookie\n * - Client component fetches data via /api/portal/* proxy routes\n * - All data fetches use credentials: 'include' for cookie forwarding\n * - Profile edits require valid session\n *\n * Theme Integration:\n * - Uses --cp-* CSS custom properties\n * - Inherits from --tb-* theme palette vars\n * - Fully themeable cards, badges, buttons, tabs\n */\nexport const customerPortalManifest: BlockManifest = createBlockManifest({\n id: \"block.customer-portal\",\n version: \"1.0.0\",\n title: \"Customer Portal\",\n titleSource: \"loginTitle\",\n description: \"Customer portal for passes, memberships, events, and appointments\",\n skipSectionStyles: true,\n additionalFields: [\n // Section toggles\n {\n id: \"showPasses\",\n type: \"boolean\",\n label: \"Show passes\",\n description: \"Display customer's purchased passes\",\n required: false,\n defaultValue: true,\n ui: { intent: \"display\" },\n },\n {\n id: \"showMemberships\",\n type: \"boolean\",\n label: \"Show memberships\",\n description: \"Display customer's active memberships\",\n required: false,\n defaultValue: true,\n ui: { intent: \"display\" },\n },\n {\n id: \"showEvents\",\n type: \"boolean\",\n label: \"Show events\",\n description: \"Display customer's event registrations\",\n required: false,\n defaultValue: true,\n ui: { intent: \"display\" },\n },\n {\n id: \"showAppointments\",\n type: \"boolean\",\n label: \"Show appointments\",\n description: \"Display customer's appointments\",\n required: false,\n defaultValue: false,\n ui: { intent: \"display\" },\n },\n {\n id: \"showProfile\",\n type: \"boolean\",\n label: \"Show profile\",\n description: \"Allow customer to view and edit profile\",\n required: false,\n defaultValue: true,\n ui: { intent: \"display\" },\n },\n // Login text customization\n {\n id: \"loginTitle\",\n type: \"text\",\n label: \"Login title\",\n description: \"Heading shown on login form\",\n required: false,\n multiline: false,\n defaultValue: \"Customer Portal\",\n maxLength: 100,\n },\n {\n id: \"loginSubtitle\",\n type: \"text\",\n label: \"Login subtitle\",\n description: \"Subheading shown on login form\",\n required: false,\n multiline: false,\n defaultValue: \"Enter your email to access your account\",\n maxLength: 200,\n },\n {\n id: \"loginButtonText\",\n type: \"text\",\n label: \"Login button text\",\n description: \"Text for the login button\",\n required: false,\n multiline: false,\n defaultValue: \"Send Magic Link\",\n maxLength: 40,\n },\n // Tab labels\n {\n id: \"passesTabLabel\",\n type: \"text\",\n label: \"Passes tab label\",\n description: \"Label for the passes tab\",\n required: false,\n multiline: false,\n defaultValue: \"Passes\",\n maxLength: 40,\n },\n {\n id: \"membershipsTabLabel\",\n type: \"text\",\n label: \"Memberships tab label\",\n description: \"Label for the memberships tab\",\n required: false,\n multiline: false,\n defaultValue: \"Memberships\",\n maxLength: 40,\n },\n {\n id: \"eventsTabLabel\",\n type: \"text\",\n label: \"Bookings tab label\",\n description: \"Label for the bookings/events tab\",\n required: false,\n multiline: false,\n defaultValue: \"Bookings\",\n maxLength: 40,\n },\n {\n id: \"appointmentsTabLabel\",\n type: \"text\",\n label: \"Appointments tab label\",\n description: \"Label for the appointments tab\",\n required: false,\n multiline: false,\n defaultValue: \"Appointments\",\n maxLength: 40,\n },\n {\n id: \"profileTabLabel\",\n type: \"text\",\n label: \"Profile tab label\",\n description: \"Label for the profile tab\",\n required: false,\n multiline: false,\n defaultValue: \"Profile\",\n maxLength: 40,\n },\n // Empty state messages\n {\n id: \"emptyPassesMessage\",\n type: \"text\",\n label: \"Empty passes message\",\n description: \"Message when no passes are available\",\n required: false,\n multiline: false,\n defaultValue: \"You don't have any passes yet.\",\n maxLength: 200,\n },\n {\n id: \"emptyMembershipsMessage\",\n type: \"text\",\n label: \"Empty memberships message\",\n description: \"Message when no memberships are available\",\n required: false,\n multiline: false,\n defaultValue: \"You don't have any active memberships.\",\n maxLength: 200,\n },\n {\n id: \"emptyEventsMessage\",\n type: \"text\",\n label: \"Empty events message\",\n description: \"Message when no event registrations exist\",\n required: false,\n multiline: false,\n defaultValue: \"You're not registered for any events.\",\n maxLength: 200,\n },\n {\n id: \"emptyAppointmentsMessage\",\n type: \"text\",\n label: \"Empty appointments message\",\n description: \"Message when no appointments exist\",\n required: false,\n multiline: false,\n defaultValue: \"You don't have any appointments scheduled.\",\n maxLength: 200,\n },\n sectionStylesField({\n id: '_sectionStyles',\n label: 'Section styles',\n }),\n ],\n styleTokens: { background: \"surface\", typography: \"body\", spacing: \"md\" },\n behaviours: { supportsThemeSwitching: true, inlineEditing: false, animation: false, paletteHidden: false },\n category: \"interactive\",\n tags: [\"portal\", \"customer\", \"account\", \"passes\", \"memberships\", \"booking\", \"profile\"],\n icon: \"User\",\n layout: [\n styledSection({\n baseClass: \"\",\n spacing: \"spacious\",\n children: sectionContainer([\n customerPortal(withApiBindings({\n // Portal session token (from $root context, null if not authenticated)\n portalToken: { $bind: { from: '$root.portalToken', fallback: null } },\n // Section toggles\n showPasses: { $bind: { from: \"content.showPasses\", fallback: true } },\n showMemberships: { $bind: { from: \"content.showMemberships\", fallback: true } },\n showEvents: { $bind: { from: \"content.showEvents\", fallback: true } },\n showAppointments: { $bind: { from: \"content.showAppointments\", fallback: false } },\n showProfile: { $bind: { from: \"content.showProfile\", fallback: true } },\n // Login text\n loginTitle: { $bind: { from: \"content.loginTitle\", fallback: \"Customer Portal\" } },\n loginSubtitle: { $bind: { from: \"content.loginSubtitle\", fallback: \"Enter your email to access your account\" } },\n loginButtonText: { $bind: { from: \"content.loginButtonText\", fallback: \"Send Magic Link\" } },\n // Tab labels\n passesTabLabel: { $bind: { from: \"content.passesTabLabel\", fallback: \"Passes\" } },\n membershipsTabLabel: { $bind: { from: \"content.membershipsTabLabel\", fallback: \"Memberships\" } },\n eventsTabLabel: { $bind: { from: \"content.eventsTabLabel\", fallback: \"Bookings\" } },\n appointmentsTabLabel: { $bind: { from: \"content.appointmentsTabLabel\", fallback: \"Appointments\" } },\n profileTabLabel: { $bind: { from: \"content.profileTabLabel\", fallback: \"Profile\" } },\n // Empty state messages\n emptyPassesMessage: { $bind: { from: \"content.emptyPassesMessage\", fallback: \"You don't have any passes yet.\" } },\n emptyMembershipsMessage: { $bind: { from: \"content.emptyMembershipsMessage\", fallback: \"You don't have any active memberships.\" } },\n emptyEventsMessage: { $bind: { from: \"content.emptyEventsMessage\", fallback: \"You're not registered for any events.\" } },\n emptyAppointmentsMessage: { $bind: { from: \"content.emptyAppointmentsMessage\", fallback: \"You don't have any appointments scheduled.\" } },\n })),\n ], {\n gap: \"lg\",\n }),\n }),\n ],\n});\n\nexport type CustomerPortalContent = {\n showPasses?: boolean | null;\n showMemberships?: boolean | null;\n showEvents?: boolean | null;\n showAppointments?: boolean | null;\n showProfile?: boolean | null;\n loginTitle?: string | null;\n loginSubtitle?: string | null;\n loginButtonText?: string | null;\n passesTabLabel?: string | null;\n membershipsTabLabel?: string | null;\n eventsTabLabel?: string | null;\n appointmentsTabLabel?: string | null;\n profileTabLabel?: string | null;\n emptyPassesMessage?: string | null;\n emptyMembershipsMessage?: string | null;\n emptyEventsMessage?: string | null;\n emptyAppointmentsMessage?: string | null;\n _sectionStyles?: SectionStylesContent;\n};\n\n/**\n * Customer portal block definition.\n * No data loaders - data is fetched client-side with session cookie.\n */\nexport const customerPortalBlockDefinition: SystemBlockDefinition<CustomerPortalContent> = {\n manifest: customerPortalManifest,\n // No dataSchemas or dataLoaders - portal fetches data client-side\n // to properly include the booking_session cookie\n};\n","import type { SystemBlockDefinition } from \"../registry\";\nimport type { BlockManifest } from \"../manifest/schema\";\nimport type { SectionStylesContent } from \"../fields/boxStyles\";\nimport { sectionContainer } from \"../node/fragments\";\nimport { styledSection } from \"../node/fragments/styledSection\";\nimport { createBlockManifest } from \"../defineBlock\";\nimport {\n composeFragments,\n newsletterCopyFragment,\n newsletterFormFragment,\n} from \"../fragments\";\n\n// ============================================================================\n// Layout Composition\n// ============================================================================\n\n// Compose fragments for stacked (default) variant\nconst stackedComposition = composeFragments([\n { fragment: newsletterCopyFragment },\n { fragment: newsletterFormFragment },\n]);\n\nconst stackedLayout = styledSection({\n children: sectionContainer(stackedComposition.layout, {\n gap: \"md\",\n className: \"rb-text-center newsletter-stacked\",\n }),\n baseClass: \"\",\n spacing: \"medium\",\n background: \"surface\",\n});\n\n// Inline variant: horizontal layout (email + button side by side)\nconst inlineLayout = styledSection({\n children: sectionContainer(stackedComposition.layout, {\n gap: \"md\",\n className: \"newsletter-inline\",\n }),\n baseClass: \"\",\n spacing: \"medium\",\n background: \"surface\",\n});\n\n// ============================================================================\n// Block Manifest\n// ============================================================================\n\nexport const newsletterSignupManifest: BlockManifest = createBlockManifest({\n id: \"block.newsletter-signup\",\n title: \"Newsletter Signup\",\n titleSource: \"title\",\n description: \"Newsletter subscription form with configurable field presets.\",\n category: \"interactive\",\n\n fragments: [\n { fragment: newsletterCopyFragment, fieldPriority: 0 },\n { fragment: newsletterFormFragment, fieldPriority: 1 },\n ],\n\n layout: stackedLayout,\n\n variants: {\n stacked: stackedLayout,\n inline: inlineLayout,\n },\n\n defaultVariant: \"stacked\",\n\n variantOptions: {\n stacked: {\n label: \"Stacked\",\n description: \"Vertical layout with fields stacked\",\n },\n inline: {\n label: \"Inline\",\n description: \"Horizontal layout (email + button side by side)\",\n },\n },\n\n styleTokens: {\n background: \"surface\",\n typography: \"body\",\n spacing: \"md\",\n },\n\n behaviours: {\n supportsThemeSwitching: true,\n inlineEditing: false,\n animation: false,\n paletteHidden: false,\n },\n\n tags: [\n \"newsletter\",\n \"signup\",\n \"email\",\n \"subscribe\",\n \"subscription\",\n \"mailchimp\",\n \"marketing\",\n \"lead-capture\",\n ],\n\n icon: \"Mail\",\n});\n\n// ============================================================================\n// Content Type\n// ============================================================================\n\n/**\n * Rich text document structure (ProseMirror format)\n */\ntype NewsletterRichTextDoc = {\n type: 'doc';\n content?: Array<{\n type: string;\n content?: Array<{\n type: string;\n text?: string;\n [key: string]: unknown;\n }>;\n [key: string]: unknown;\n }>;\n};\n\nexport type NewsletterSignupPreset =\n | 'emailOnly'\n | 'emailName'\n | 'emailFirstLast'\n | 'emailNameCompany';\n\nexport type NewsletterSignupContent = {\n title?: string | null;\n subtitle?: NewsletterRichTextDoc | null;\n preset: NewsletterSignupPreset;\n buttonLabel?: string | null;\n successMessage?: string | null;\n privacyNote?: string | null;\n _sectionStyles?: SectionStylesContent;\n};\n\n// ============================================================================\n// Block Definition\n// ============================================================================\n\nexport const newsletterSignupBlockDefinition: SystemBlockDefinition<NewsletterSignupContent> = {\n manifest: newsletterSignupManifest,\n};\n","import { fragmentsToRepeaterField, teamMemberFragment } from \"../fragments\";\nimport { parseFieldDefinition, type BlockManifest } from \"../manifest/schema\";\nimport type { SystemBlockDefinition } from \"../registry\";\nimport { createBlockManifest } from \"../defineBlock\";\nimport {\n el,\n stack,\n text,\n richText,\n media,\n bind,\n when,\n} from \"../node/builder\";\nimport { styledSection, sectionContainer } from \"../node/fragments\";\nimport type { SemanticSpacing } from \"../spacing\";\nimport { repeaterFragmentLayout } from \"./shared/fragmentCollection\";\nimport type { NodeDefinition } from \"../node\";\nimport {\n createImageColSizeField,\n createImagePositionField,\n type ImageColSize,\n} from \"../fields/imageLayout\";\n\nconst ITEM_NAME = \"member\";\n\ntype ThumbnailShape = \"round\" | \"rounded\" | \"square\";\ntype LayoutAlign = \"center\" | \"left\";\ntype LayoutWidth = \"full\" | \"lg-3-4-left\";\ntype ThumbnailPadding = \"none\" | \"sm\" | \"md\" | \"lg\";\ntype StackImagePosition = \"left\" | \"right\" | \"alternate\";\ntype StackContentAlignment = \"top\" | \"center\";\n\n// Shared heading node\nconst headingNode = text(\n { as: \"h2\" },\n bind(\"content.heading\"),\n when(\"content.heading\"),\n);\n\n// Wrap each variant in consistent section structure\nconst wrapVariant = (variantLayout: NodeDefinition): NodeDefinition =>\n styledSection({\n children: sectionContainer(\n [\n\t stack(\n\t {\n\t gap: \"md\",\n\t className: \"rb-team-members\",\n \"data-layout-align\": {\n $bind: {\n from: \"content.layoutAlign\",\n fallback: \"center\" satisfies LayoutAlign,\n },\n },\n \"data-layout-width\": {\n $bind: {\n from: \"content.layoutWidth\",\n fallback: \"full\" satisfies LayoutWidth,\n },\n },\n \"data-image-col-size\": {\n $bind: {\n from: \"content.imageColSize\",\n fallback: \"1/3\" satisfies ImageColSize,\n },\n },\n \"data-thumb-shape\": {\n $bind: {\n from: \"content.thumbnailShape\",\n fallback: \"round\" satisfies ThumbnailShape,\n },\n },\n \"data-thumb-pad\": {\n\t $bind: {\n\t from: \"content.thumbnailPadding\",\n\t fallback: \"sm\" satisfies ThumbnailPadding,\n\t },\n\t },\n \"data-stack-image-position\": {\n $bind: {\n from: \"content.stackImagePosition\",\n fallback: \"left\" satisfies StackImagePosition,\n },\n },\n \"data-stack-content-align\": {\n $bind: {\n from: \"content.stackContentAlignment\",\n fallback: \"top\" satisfies StackContentAlignment,\n },\n },\n\t },\n\t [headingNode, variantLayout],\n\t ),\n\t ],\n\t { gap: \"md\" },\n ),\n baseClass: \"\",\n spacing: \"comfortable\",\n });\n\n// Stack layout for individual team members (horizontal: photo left, text right)\nconst teamMemberStackLayout: NodeDefinition = el(\n \"div\",\n {\n className:\n \"rb-team-member rb-team-member--stack rb-flex rb-flex-col rb-md-flex-row rb-items-start rb-gap-3\",\n },\n [\n el(\n \"div\",\n {\n className: \"rb-team-member-photo-col rb-w-full rb-shrink-0\",\n },\n [\n el(\"div\", { className: \"rb-team-member-photo-wrap rb-w-full\" }, [\n media(\n {\n className: \"rb-team-member-photo rb-w-full rb-object-cover\",\n style: { aspectRatio: \"1 / 1\" },\n size: { width: 600, height: 600, quality: 85, resize: \"cover\" },\n },\n when(\"photo\"),\n bind(\"photo\"),\n ),\n ]),\n ],\n ),\n stack({ gap: \"sm\", className: \"rb-team-member-body rb-flex-1 rb-min-w-0\" }, [\n text({ as: \"h3\" }, bind(\"name\")),\n text(\n { as: \"p\", className: \"rb-team-member-role\" },\n when(\"role\"),\n bind(\"role\"),\n ),\n richText(\n { className: \"rb-prose rb-max-w-none\" },\n when(\"bio\"),\n bind(\"bio\"),\n ),\n ]),\n ],\n);\n\n// Grid variant — uses fragment's own layout\nconst gridMembersNode = repeaterFragmentLayout({\n collectionPath: \"content.members\",\n itemName: ITEM_NAME,\n fragments: { teamMember: teamMemberFragment },\n itemGap: \"sm\",\n});\n\nconst gridVariant = wrapVariant(\n el(\n \"grid\",\n {\n cols: {\n $bind: {\n from: \"content.columns\",\n fallback: 3,\n coerce: \"number\",\n },\n },\n gap: { $bind: { from: \"content.gap\", fallback: \"medium\" } },\n },\n [gridMembersNode],\n ),\n);\n\n// Stack variant — uses horizontal layout override\nconst stackMembersNode = repeaterFragmentLayout({\n collectionPath: \"content.members\",\n itemName: ITEM_NAME,\n fragments: { teamMember: teamMemberFragment },\n layoutOverrides: { teamMember: teamMemberStackLayout },\n itemGap: \"sm\",\n});\n\nconst stackVariant = wrapVariant({\n type: \"stack\",\n props: {\n gap: { $bind: { from: \"content.gap\", fallback: \"medium\" } },\n },\n children: [stackMembersNode],\n});\n\nexport const teamMembersManifest: BlockManifest = createBlockManifest({\n id: \"block.team-members\",\n title: \"Team Members\",\n category: \"content\",\n\n titleSource: \"heading\",\n\n additionalFields: [\n parseFieldDefinition({\n id: \"heading\",\n type: \"text\",\n label: \"Heading\",\n required: false,\n maxLength: 120,\n }),\n parseFieldDefinition({\n id: \"layoutAlign\",\n type: \"select\",\n label: \"Alignment\",\n defaultValue: \"center\",\n options: [\n { value: \"center\", label: \"Center\" },\n { value: \"left\", label: \"Left\" },\n ],\n ui: { intent: \"display\", visibleWhen: { field: \"variant\", equals: \"grid\" } },\n }),\n parseFieldDefinition({\n id: \"layoutWidth\",\n type: \"select\",\n label: \"Width\",\n defaultValue: \"full\",\n options: [\n { value: \"full\", label: \"Full width\" },\n { value: \"lg-3-4-left\", label: \"3/4 (lg+) left\" },\n ],\n ui: { intent: \"display\" },\n }),\n parseFieldDefinition({\n id: \"thumbnailShape\",\n type: \"select\",\n label: \"Thumbnail shape\",\n defaultValue: \"round\",\n options: [\n { value: \"round\", label: \"Round\" },\n { value: \"rounded\", label: \"Rounded\" },\n { value: \"square\", label: \"Square\" },\n ],\n ui: { intent: \"display\" },\n }),\n parseFieldDefinition({\n id: \"thumbnailPadding\",\n type: \"select\",\n label: \"Thumbnail padding\",\n defaultValue: \"sm\",\n options: [\n { value: \"none\", label: \"None\" },\n { value: \"sm\", label: \"Small\" },\n { value: \"md\", label: \"Medium\" },\n { value: \"lg\", label: \"Large\" },\n ],\n ui: { intent: \"display\" },\n }),\n createImageColSizeField({\n id: \"imageColSize\",\n label: \"Thumbnail size\",\n defaultValue: \"1/3\",\n uiIntent: \"display\",\n }),\n createImagePositionField({\n id: \"stackImagePosition\",\n label: \"Stack image position\",\n defaultValue: \"left\",\n includeAlternate: true,\n uiIntent: \"display\",\n visibleWhen: { field: \"variant\", equals: \"stack\" },\n }),\n parseFieldDefinition({\n id: \"stackContentAlignment\",\n type: \"select\",\n label: \"Stack content alignment\",\n defaultValue: \"top\",\n options: [\n { value: \"top\", label: \"Top\" },\n { value: \"center\", label: \"Center\" },\n ],\n ui: { intent: \"display\", visibleWhen: { field: \"variant\", equals: \"stack\" } },\n }),\n parseFieldDefinition({\n id: \"columns\",\n type: \"select\",\n label: \"Columns\",\n defaultValue: \"3\",\n options: [\n { value: \"2\", label: \"2 columns\" },\n { value: \"3\", label: \"3 columns\" },\n { value: \"4\", label: \"4 columns\" },\n ],\n ui: {\n intent: \"display\",\n visibleWhen: { field: \"variant\", equals: \"grid\" },\n },\n }),\n parseFieldDefinition({\n id: \"gap\",\n type: \"select\",\n label: \"Gap\",\n defaultValue: \"medium\",\n options: [\n { value: \"none\", label: \"None\" },\n { value: \"compact\", label: \"Compact\" },\n { value: \"cozy\", label: \"Cozy\" },\n { value: \"medium\", label: \"Medium\" },\n { value: \"comfortable\", label: \"Comfortable\" },\n { value: \"spacious\", label: \"Spacious\" },\n ],\n ui: { intent: \"display\" },\n }),\n fragmentsToRepeaterField(\n \"members\",\n \"Team members\",\n { teamMember: teamMemberFragment },\n {\n minItems: 0,\n maxItems: 50,\n itemLabel: \"Team member\",\n description: \"Add people to this section.\",\n },\n ),\n ],\n\n layout: gridVariant,\n\n variants: {\n grid: gridVariant,\n stack: stackVariant,\n },\n defaultVariant: \"grid\",\n variantOptions: {\n grid: {\n label: \"Grid\",\n description: \"Members in a responsive grid\",\n icon: \"Grid3X3\",\n },\n stack: {\n label: \"Stack\",\n description: \"Members in a stacked list with photo + bio\",\n icon: \"List\",\n },\n },\n\n description: \"Show your team members in a grid or stacked list.\",\n tags: [\"team\", \"people\", \"members\"],\n icon: \"Users\",\n styleTokens: { spacing: \"lg\" },\n});\n\nexport type TeamMembersContent = {\n heading?: string | null;\n layoutAlign?: LayoutAlign | null;\n layoutWidth?: LayoutWidth | null;\n thumbnailShape?: ThumbnailShape | null;\n thumbnailPadding?: ThumbnailPadding | null;\n imageColSize?: ImageColSize | null;\n stackImagePosition?: StackImagePosition | null;\n stackContentAlignment?: StackContentAlignment | null;\n columns?: string | number | null;\n gap?: SemanticSpacing;\n members: Array<{\n _type: \"teamMember\";\n name: string;\n role?: string | null;\n bio?: unknown;\n photo?: unknown;\n }>;\n};\n\nexport const teamMembersBlockDefinition: SystemBlockDefinition<TeamMembersContent> =\n {\n manifest: teamMembersManifest,\n };\n","import { registerBlockDefinition, type SystemBlockDefinition } from \"../registry\";\nimport { heroBlockDefinition } from \"./hero\";\nimport { bodyTextBlockDefinition } from \"./body-text\";\nimport { blogPostBlockDefinition } from \"./blog-post\";\nimport { blogPlaceholderBlockDefinition } from \"./blog-placeholder\";\nimport { blogListingBlockDefinition } from \"./blog-listing\";\nimport { ctaFullBlockDefinition } from \"./cta-full\";\nimport { formBlockDefinition } from \"./form\";\nimport { faqBlockDefinition } from \"./faq\";\nimport { siteHeaderBlockDefinition } from \"./site-header\";\nimport { siteFooterBlockDefinition } from \"./site-footer\";\nimport { testimonialsBlockDefinition } from \"./testimonials\";\nimport { columnsBlockDefinition } from \"./columns\";\nimport { collectionBlockDefinition } from \"./collection\";\nimport { mediaTextBlockDefinition } from \"./media-text\";\nimport { appointmentBookingBlockDefinition } from \"./appointment-booking\";\nimport { eventRegistrationBlockDefinition } from \"./event-registration\";\nimport { courseRegistrationBlockDefinition } from \"./course-registration\";\nimport { eventDetailsBlockDefinition } from \"./event-details\";\nimport { courseDetailsBlockDefinition } from \"./course-details\";\nimport {\n eventSpotlightBlockDefinition,\n eventListingBlockDefinition,\n eventCalendarBlockDefinition,\n} from \"./events\";\nimport { embedBlockDefinition } from \"./embed\";\nimport { imageGalleryBlockDefinition } from \"./image-gallery\";\nimport { videoGridBlockDefinition } from \"./video-grid\";\nimport { shopBlockDefinition } from \"./shop\";\nimport { customerPortalBlockDefinition } from \"./customer-portal\";\nimport { newsletterSignupBlockDefinition } from \"./newsletter-signup\";\nimport { teamMembersBlockDefinition } from \"./team-members\";\n\nexport const systemBlockDefinitions: SystemBlockDefinition<unknown>[] = [\n heroBlockDefinition,\n bodyTextBlockDefinition,\n blogPostBlockDefinition,\n blogPlaceholderBlockDefinition,\n blogListingBlockDefinition,\n ctaFullBlockDefinition,\n formBlockDefinition,\n faqBlockDefinition,\n siteHeaderBlockDefinition,\n siteFooterBlockDefinition,\n testimonialsBlockDefinition,\n columnsBlockDefinition,\n collectionBlockDefinition,\n mediaTextBlockDefinition,\n appointmentBookingBlockDefinition,\n eventRegistrationBlockDefinition,\n eventDetailsBlockDefinition,\n courseRegistrationBlockDefinition,\n courseDetailsBlockDefinition,\n // Event display blocks (3 specialized blocks)\n eventSpotlightBlockDefinition,\n eventListingBlockDefinition,\n eventCalendarBlockDefinition,\n // Friendly wrapper blocks\n teamMembersBlockDefinition,\n // Content embedding\n embedBlockDefinition,\n // Image gallery\n imageGalleryBlockDefinition,\n // Video grid\n videoGridBlockDefinition,\n // Shop for passes/memberships\n shopBlockDefinition,\n // Customer portal\n customerPortalBlockDefinition,\n // Newsletter signup\n newsletterSignupBlockDefinition,\n];\n\nlet defaultsRegistered = false;\n\nexport function ensureSystemBlockDefinitionsRegistered(): void {\n if (defaultsRegistered) {\n return;\n }\n defaultsRegistered = true;\n for (const definition of systemBlockDefinitions) {\n registerBlockDefinition(definition);\n }\n}\n\nexport function resetSystemBlockDefinitionRegistration(): void {\n defaultsRegistered = false;\n}\n\nexport * from \"./hero\";\nexport * from \"./body-text\";\nexport * from \"./blog-post\";\nexport * from \"./blog-placeholder\";\nexport * from \"./blog-listing\";\nexport * from \"./cta-full\";\nexport * from \"./form\";\nexport * from \"./faq\";\nexport * from \"./site-header\";\nexport * from \"./site-footer\";\nexport * from \"./testimonials\";\nexport * from \"./columns\";\nexport * from \"./collection\";\nexport * from \"./media-text\";\nexport * from \"./appointment-booking\";\nexport * from \"./event-registration\";\nexport * from \"./event-details\";\nexport * from \"./course-registration\";\nexport * from \"./course-details\";\nexport * from \"./events\";\nexport * from \"./embed\";\nexport * from \"./team-members\";\nexport * from \"./image-gallery\";\nexport * from \"./video-grid\";\nexport * from \"./shop\";\nexport * from \"./customer-portal\";\nexport * from \"./newsletter-signup\";\n","import type { ComponentType, ReactNode } from 'react';\nimport type { z } from 'zod';\n\nimport type { BlockManifest } from './manifest';\nimport { registerManifest } from './manifest';\nimport { ensureSystemBlockDefinitionsRegistered, resetSystemBlockDefinitionRegistration } from './blocks';\nimport type { ResolverContext } from './runtime';\nimport type { ThemeTokens } from './theme';\nimport type { TransformRegistry } from './transforms';\nimport type { Theme } from '../theme/schema';\n\nexport type BlockRenderOptions = Omit<ResolverContext, 'viewModel'>;\n\n// Unified render options used by helpers (prefer this over per-block options)\nexport type RenderOptions = Partial<BlockRenderOptions> & {\n viewModelOverrides?: Record<string, unknown>;\n data?: Record<string, unknown>;\n themeConfig?: Theme;\n};\n\nexport type SystemBlockRenderer<TContent = Record<string, unknown>> = (\n content: TContent,\n options?: RenderOptions\n) => ReactNode;\n\n// Legacy loader cache types removed with new registry adoption\n\nexport type SystemBlockComponentProps<\n TContent = Record<string, unknown>\n> = {\n content: TContent;\n theme?: ThemeTokens;\n themeConfig?: Theme;\n registry?: ResolverContext['registry'];\n transforms?: TransformRegistry;\n viewModelOverrides?: Record<string, unknown>;\n data?: Record<string, unknown>;\n // Optional base path for binding-derived editor paths, e.g., `blocks.<blockId>.`\n pathBase?: string;\n // Optional block metadata for editor-aware registries\n blockId?: string | null;\n blockKind?: string;\n // Optional template bindings for reverse field mapping (entry editing)\n blockBindings?: Record<string, unknown>;\n // Editable metadata keys for this render context (used to gate inline meta editing)\n editableRouteMetadataFieldIds?: ResolverContext['editableRouteMetadataFieldIds'];\n // Optional fragment registry for fragment renderer nodes\n fragmentRegistry?: ResolverContext['fragmentRegistry'];\n};\n\nexport type SystemBlockComponent<\n TContent = Record<string, unknown>\n> = ComponentType<\n SystemBlockComponentProps<TContent>\n>;\n\nexport type BlockDataLoader = {\n endpoint: string;\n params: Record<string, unknown>;\n mode?: 'server' | 'client';\n /**\n * Optional guard for whether this loader should execute.\n *\n * This is resolved with the same binding system as params, using:\n * - `content.*` (block content)\n * - `$root.*` (siteId/pageId/previewStage)\n *\n * If the resolved value is falsy, the loader is skipped.\n */\n when?: unknown;\n};\n\nexport type SystemBlockDefinition<\n TContent = Record<string, unknown>\n> = {\n manifest: BlockManifest;\n normalizeContent?: (content: unknown) => TContent;\n dataSchemas?: Record<string, z.ZodTypeAny>;\n dataLoaders?: Record<string, BlockDataLoader>;\n};\n\ntype BlockDefinitionMap = Map<string, SystemBlockDefinition<unknown>>;\n\nexport type BlockDescriptor = {\n name: string;\n title: string;\n description?: string;\n category?: string;\n contentTypes?: string[];\n tags?: string[];\n icon?: string;\n definition: SystemBlockDefinition<unknown>;\n /**\n * Where this block comes from:\n * - 'system': Built-in blocks from @riverbankcms/blocks\n * - 'sdk': Custom blocks from SDK site's riverbank.config.ts\n * - 'database': Custom blocks from site_custom_blocks table\n */\n source?: 'system' | 'sdk' | 'database';\n};\n\nconst REGISTRY_SYMBOL = Symbol.for('@riverbankcms/blocks/system/definitions');\n\ninterface BlockRegistryGlobal extends Record<PropertyKey, unknown> {\n [REGISTRY_SYMBOL]?: BlockDefinitionMap;\n}\n\nconst isVitest =\n typeof process !== 'undefined' &&\n typeof process.env !== 'undefined' &&\n process.env.VITEST === 'true';\n\nconst globalScope = globalThis as BlockRegistryGlobal;\n\n// In production builds, the registry intentionally lives on `globalThis` to avoid duplication\n// when the package is bundled multiple times. In Vitest, that can cause unbounded growth\n// across the full suite (since `globalThis` is not reset between files), so keep it local.\nconst blockStore: BlockDefinitionMap = isVitest ? new Map() : (globalScope[REGISTRY_SYMBOL] ??= new Map());\n\nfunction ensureDefaults(): void {\n ensureSystemBlockDefinitionsRegistered();\n}\n\nexport function registerBlockDefinition<TContent>(\n definition: SystemBlockDefinition<TContent>,\n): SystemBlockDefinition<TContent> {\n registerManifest(definition.manifest);\n blockStore.set(definition.manifest.name, definition);\n return definition;\n}\n\nexport function getBlockDefinition(name: string): SystemBlockDefinition<unknown> | undefined {\n ensureDefaults();\n return blockStore.get(name);\n}\n\nexport function hasBlockDefinition(name: string): boolean {\n ensureDefaults();\n return blockStore.has(name);\n}\n\nexport function listBlockDefinitions(): SystemBlockDefinition<unknown>[] {\n ensureDefaults();\n return Array.from(blockStore.values());\n}\n\nexport function listBlockDescriptors(): BlockDescriptor[] {\n return listBlockDefinitions()\n .filter((d) => d.manifest.behaviours?.paletteHidden !== true)\n .map((definition) => ({\n name: definition.manifest.name,\n title: definition.manifest.title,\n description: definition.manifest.description,\n category: definition.manifest.category,\n contentTypes: definition.manifest.contentTypes,\n tags: definition.manifest.tags,\n icon: definition.manifest.icon,\n definition,\n source: 'system' as const,\n }));\n}\n\nexport function clearBlockDefinitions(): void {\n const env = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env?.NODE_ENV;\n if (env === \"production\") {\n return;\n }\n blockStore.clear();\n resetSystemBlockDefinitionRegistration();\n}\n","export const colorTokens = [\n \"background/base\",\n \"background/elevated\",\n \"surface/base\",\n \"surface/subtle\",\n \"surface/inverted\",\n \"content/primary\",\n \"content/secondary\",\n \"accent/primary\",\n \"accent/secondary\",\n \"border/base\",\n] as const;\n\nexport const typographyTokens = [\n \"display/hero\",\n \"display/section\",\n \"heading/large\",\n \"heading/medium\",\n \"heading/small\",\n \"body/normal\",\n \"body/small\",\n \"caption\",\n] as const;\n\nexport const spacingTokens = [\"none\", \"3xs\", \"2xs\", \"xs\", \"sm\", \"md\", \"lg\", \"xl\", \"2xl\", \"3xl\"] as const;\nexport const radiusTokens = [\"none\", \"xs\", \"sm\", \"md\", \"lg\", \"pill\", \"full\"] as const;\nexport const shadowTokens = [\"none\", \"soft\", \"medium\", \"strong\"] as const;\n\nexport type ThemeTokens = {\n color: Record<(typeof colorTokens)[number], string>;\n typography: Record<(typeof typographyTokens)[number], { fontSize: string; lineHeight: string; fontWeight?: string }>;\n spacing: Record<(typeof spacingTokens)[number], string>;\n radius: Record<(typeof radiusTokens)[number], string>;\n shadow: Record<(typeof shadowTokens)[number], string>;\n palette: Record<string, string>;\n // Note: buttons and cards removed - only needed for CSS generation, not runtime transforms\n};\n\nexport const defaultThemeTokens: ThemeTokens = {\n color: {\n \"background/base\": \"#ffffff\",\n \"background/elevated\": \"#f5f5f5\",\n \"surface/base\": \"#ffffff\",\n \"surface/subtle\": \"#f9f9fb\",\n \"surface/inverted\": \"#111111\",\n \"content/primary\": \"#111111\",\n \"content/secondary\": \"#3f3f46\",\n \"accent/primary\": \"#2563eb\",\n \"accent/secondary\": \"#1d4ed8\",\n \"border/base\": \"#e5e7eb\",\n },\n typography: {\n \"display/hero\": { fontSize: \"clamp(48px, 8vw, 96px)\", lineHeight: \"1.05\", fontWeight: \"700\" },\n \"display/section\": { fontSize: \"clamp(40px, 6vw, 72px)\", lineHeight: \"1.1\", fontWeight: \"700\" },\n \"heading/large\": { fontSize: \"clamp(32px, 4vw, 48px)\", lineHeight: \"1.2\", fontWeight: \"600\" },\n \"heading/medium\": { fontSize: \"clamp(24px, 3vw, 32px)\", lineHeight: \"1.25\", fontWeight: \"600\" },\n \"heading/small\": { fontSize: \"20px\", lineHeight: \"1.3\", fontWeight: \"600\" },\n \"body/normal\": { fontSize: \"16px\", lineHeight: \"1.6\", fontWeight: \"400\" },\n \"body/small\": { fontSize: \"14px\", lineHeight: \"1.5\", fontWeight: \"400\" },\n caption: { fontSize: \"12px\", lineHeight: \"1.4\", fontWeight: \"500\" },\n },\n spacing: {\n none: \"0px\",\n \"3xs\": \"4px\",\n \"2xs\": \"8px\",\n xs: \"12px\",\n sm: \"16px\",\n md: \"24px\",\n lg: \"32px\",\n xl: \"40px\",\n \"2xl\": \"56px\",\n \"3xl\": \"72px\",\n },\n radius: {\n none: \"0px\",\n xs: \"2px\",\n sm: \"4px\",\n md: \"8px\",\n lg: \"12px\",\n pill: \"999px\",\n full: \"9999px\",\n },\n shadow: {\n none: \"none\",\n soft: \"0px 2px 8px rgba(15, 23, 42, 0.08)\",\n medium: \"0px 6px 18px rgba(15, 23, 42, 0.12)\",\n strong: \"0px 12px 36px rgba(15, 23, 42, 0.16)\",\n },\n palette: {\n surface: \"#ffffff\",\n \"neutral-50\": \"#f9fafb\",\n \"neutral-900\": \"#111827\",\n primary: \"#2563eb\",\n \"primary-50\": \"#eff6ff\",\n \"primary-500\": \"#2563eb\",\n \"primary-900\": \"#1d4ed8\",\n secondary: \"#9333ea\",\n \"secondary-50\": \"#f3e8ff\",\n \"secondary-500\": \"#9333ea\",\n \"secondary-900\": \"#4c1d95\",\n accent: \"#f97316\",\n \"accent-50\": \"#fff7ed\",\n \"accent-500\": \"#f97316\",\n \"accent-900\": \"#7c2d12\",\n },\n};\n","import { BACKGROUND_POSITION_PRESET_VALUES, getAnchorClasses } from '../../constants/background';\nimport type { TransformDefinition } from \"./core\";\nimport { resolveBackgroundColorValue } from './_utils/colorResolution';\nimport { mediaSchema } from '../../../lib/media';\nimport { computeMediaTransformStyle } from '../../runtime/nodes/media';\n\nconst isString = (value: unknown): value is string => typeof value === \"string\" && value.trim().length > 0;\nconst isNumber = (value: unknown): value is number => typeof value === \"number\" && !isNaN(value);\n\n/**\n * Transform for resolving inline styles on <img> elements from background data.\n * Converts advanced image options to object-fit, object-position, opacity, and scale (width/height).\n * Note: Preset positions are handled via className (anchor positioning), but custom values are applied as object-position.\n */\nconst resolveImageStyleTransform: TransformDefinition = {\n id: \"background.resolveImageStyle\",\n kind: \"formatter\",\n summary: \"Resolve inline styles for background image elements\",\n run: (value, _options, _context) => {\n if (!value || typeof value !== \"object\") return {};\n const input = value as Record<string, unknown>;\n const objectFit = isString(input.objectFit) ? input.objectFit.trim() : null;\n const opacity = isNumber(input.opacity) ? input.opacity : isString(input.opacity) ? parseFloat(input.opacity) : null;\n const position = isString(input.position) ? input.position.trim() : null;\n\n // Parse scale - supports \"150%\", \"200px\", \"50vh\", or plain \"150\"\n // Only applies when objectFit is 'custom' or 'original'\n let scaleValue: string | null = null;\n if (objectFit === 'custom' || objectFit === 'original') {\n if (isString(input.scale)) {\n const scaleStr = input.scale.trim();\n if (scaleStr) {\n // If it has units (%, px, vh, etc), use as-is\n if (/\\d+(%|px|vh|vw|rem|em)$/.test(scaleStr)) {\n scaleValue = scaleStr;\n } else {\n // Plain number - treat as percentage\n const num = parseFloat(scaleStr);\n if (!isNaN(num)) {\n scaleValue = `${num}%`;\n }\n }\n }\n }\n }\n\n const style: Record<string, string> = {};\n\n // Map objectFit values to CSS object-fit (default to cover to prevent stretching)\n switch (objectFit) {\n case 'fill':\n case null:\n // Default to cover - prevents image stretching when no value selected\n style.objectFit = 'cover';\n break;\n case 'fit':\n style.objectFit = 'contain';\n break;\n case 'original':\n case 'custom':\n style.objectFit = 'none';\n break;\n default:\n // Fallback for legacy values (cover, contain, none)\n style.objectFit = objectFit;\n }\n\n // Apply opacity\n if (opacity !== null && opacity >= 0 && opacity <= 100) {\n style.opacity = String(opacity / 100);\n }\n\n // Apply scale via width/height (only for custom/original sizing)\n if (scaleValue) {\n style.width = scaleValue;\n style.height = scaleValue;\n }\n\n // Apply object-position for custom values\n if (position && !(BACKGROUND_POSITION_PRESET_VALUES as readonly string[]).includes(position)) {\n style.objectPosition = position;\n }\n\n // Merge canonical media transform styles (hotspot + rotation) when a valid media object is present.\n // This keeps background-image node transforms aligned with MediaNode/resolveBackground behavior.\n const parsedMedia = mediaSchema.safeParse(input.image);\n if (parsedMedia.success) {\n const mergedStyle = computeMediaTransformStyle(parsedMedia.data, style);\n if (mergedStyle) {\n Object.assign(style, mergedStyle);\n }\n }\n\n return style;\n },\n};\n\n/**\n * Transform for resolving className on <img> elements based on objectFit, scale, and position.\n * - 'fill' (cover) and 'fit' (contain): uses inset-0 to fill container\n * - 'original' and 'custom': uses anchor positioning when scale is set\n */\nconst resolveImageClassNameTransform: TransformDefinition<{ baseClass?: string }> = {\n id: \"background.resolveImageClassName\",\n kind: \"string\",\n summary: \"Resolve className for background image based on objectFit, scale and position\",\n run: (value, options, _context) => {\n const baseClass = options?.baseClass ?? 'rb-absolute rb-z-neg-10';\n if (!value || typeof value !== \"object\") {\n return `${baseClass} rb-inset-0 rb-h-full rb-w-full`;\n }\n\n const input = value as Record<string, unknown>;\n const objectFit = isString(input.objectFit) ? input.objectFit.trim() : null;\n const position = isString(input.position) ? input.position.trim() : null;\n\n // For 'fill' (cover), 'fit' (contain), or no value (default to cover), always use inset-0\n if (objectFit === 'fill' || objectFit === 'fit' || objectFit === null) {\n return `${baseClass} rb-inset-0 rb-h-full rb-w-full rb-object-${objectFit === 'fit' ? 'contain' : 'cover'}`;\n }\n\n // For 'original' and 'custom', check if scale is set\n let needsAnchoring = false;\n if (objectFit === 'custom' || objectFit === 'original') {\n if (isString(input.scale)) {\n const scaleStr = input.scale.trim();\n if (scaleStr) {\n needsAnchoring = true;\n }\n }\n }\n\n // If no scale set for original/custom, still fill container\n if (!needsAnchoring) {\n return `${baseClass} rb-inset-0 rb-h-full rb-w-full`;\n }\n\n // Scale is set: use anchor positioning based on position field\n const isPreset = position && (BACKGROUND_POSITION_PRESET_VALUES as readonly string[]).includes(position);\n const isCustom = position && !isPreset;\n\n if (isCustom) {\n // If position is custom, no anchor classes are needed as object-position is used.\n return baseClass;\n }\n\n // Otherwise, it's a preset or null, so apply anchor classes (getAnchorClasses handles null by defaulting to center)\n const anchorClasses = getAnchorClasses(position);\n return `${baseClass} ${anchorClasses}`;\n }\n};\n\n/**\n * Transform for resolving inline styles on background overlay layers.\n * Returns {} when no overlay is configured (making the div invisible).\n */\nconst resolveOverlayStyleTransform: TransformDefinition = {\n id: \"background.resolveOverlayStyle\",\n kind: \"formatter\",\n summary: \"Resolve inline styles for background overlay\",\n run: (value, _options, context) => {\n if (!value || typeof value !== \"object\") return {};\n const input = value as Record<string, unknown>;\n\n const overlayType = isString(input.type) ? input.type.trim() : null;\n if (!overlayType || overlayType === 'none') return {};\n\n const color = isString(input.color) ? input.color.trim() : null;\n const gradient = isString(input.gradient) ? input.gradient.trim() : null;\n const opacity = isNumber(input.opacity) ? input.opacity :\n isString(input.opacity) ? parseFloat(input.opacity) : null;\n\n const style: Record<string, string> = {};\n\n if (overlayType === 'color' && color) {\n // Check if it's a theme token\n const resolved = context?.theme?.palette?.[color];\n style.backgroundColor = resolved ?? color;\n }\n\n if (overlayType === 'gradient' && gradient) {\n style.backgroundImage = gradient;\n }\n\n if (opacity !== null && opacity >= 0 && opacity <= 100) {\n style.opacity = String(opacity / 100);\n }\n\n return style;\n },\n};\n\n// Heterogeneous array of transforms with different option types\nexport const backgroundTransforms: TransformDefinition<unknown>[] = [\n {\n id: \"background.resolveStyle\",\n kind: \"formatter\",\n summary: \"Resolve inline styles for background color/gradient layers\",\n run: (value, options, context) => {\n const fallbackToken =\n (options as { fallbackToken?: string } | undefined)?.fallbackToken;\n\n if (!value || typeof value !== \"object\") {\n if (typeof fallbackToken === 'string' && fallbackToken.trim().length > 0) {\n const resolved = resolveBackgroundColorValue(fallbackToken, context);\n return resolved ? { backgroundColor: resolved } : {};\n }\n return {};\n }\n const input = value as Record<string, unknown>;\n const color = isString(input.color) ? input.color.trim() : null;\n const gradient = isString(input.gradient) ? input.gradient.trim() : null;\n const opacity = isNumber(input.opacity) ? input.opacity : isString(input.opacity) ? parseFloat(input.opacity) : null;\n\n const style: Record<string, string> = {};\n\n if (color) {\n style.backgroundColor = resolveBackgroundColorValue(color, context);\n } else if (!gradient && typeof fallbackToken === 'string' && fallbackToken.trim().length > 0) {\n const resolved = resolveBackgroundColorValue(fallbackToken, context);\n if (resolved) style.backgroundColor = resolved;\n }\n\n if (gradient) {\n style.backgroundImage = gradient;\n }\n\n if (opacity !== null && opacity >= 0 && opacity <= 100) {\n style.opacity = String(opacity / 100);\n }\n\n return style;\n },\n },\n {\n id: 'background.resolveColorsStyle',\n kind: 'formatter',\n summary: 'Resolve text + heading colors from a background object into scoped CSS vars',\n run: (value, _options, context) => {\n if (!value || typeof value !== 'object') {\n return {};\n }\n\n const input = value as Record<string, unknown>;\n const textColor = isString(input.textColor) ? input.textColor.trim() : null;\n const headingColor = isString(input.headingColor) ? input.headingColor.trim() : null;\n\n const style: Record<string, string> = {};\n\n if (textColor) {\n const resolvedText = resolveBackgroundColorValue(textColor, context);\n if (resolvedText) {\n style.color = resolvedText;\n style['--section-text-color'] = resolvedText;\n\n if (headingColor) {\n const resolvedHeading = resolveBackgroundColorValue(headingColor, context);\n if (resolvedHeading) {\n style['--section-heading-color'] = resolvedHeading;\n }\n } else {\n style['--section-heading-color'] = resolvedText;\n }\n }\n }\n\n return style;\n },\n },\n {\n id: 'background.resolveAllowOverflow',\n kind: 'formatter',\n summary: 'Resolve allowOverflow from background config (explicit overflow or scaled image)',\n run: (value) => {\n if (!value || typeof value !== 'object') return false;\n const input = value as Record<string, unknown>;\n\n if (input.overflow === true) return true;\n\n const objectFit = isString(input.objectFit) ? input.objectFit.trim() : null;\n const scale =\n isString(input.scale) ? input.scale.trim()\n : isNumber(input.scale) ? String(input.scale)\n : null;\n\n const needsOverflow = Boolean(\n (objectFit === 'custom' || objectFit === 'original') &&\n scale &&\n scale.trim().length > 0,\n );\n\n return needsOverflow;\n },\n },\n resolveImageStyleTransform,\n resolveImageClassNameTransform,\n resolveOverlayStyleTransform,\n];\n","import type { EntryIdentifierMap, PageIdentifierMap, RouteMap } from \"../transforms/registry/core\";\nimport {\n extractRouteHref,\n extractRouteUpdatedAt,\n resolveRouteTargetForStage as resolveRouteTargetForStageShared,\n} from \"@riverbankcms/link-routing\";\nimport { isRecord } from \"../../lib/typeGuards\";\n\ntype LinkRecord = Record<string, unknown>;\ntype RenderStage = \"preview\" | \"published\";\n\nexport type LinkResolverContext = {\n routes?: RouteMap;\n pagesByIdentifier?: PageIdentifierMap;\n entriesByIdentifier?: EntryIdentifierMap;\n stage?: RenderStage;\n};\n\nexport type ResolvedRouteTarget = {\n routeId: string;\n href: string;\n updatedAt: string | null;\n};\n\nexport function extractHref(candidate: unknown, stage: RenderStage = \"published\"): string | null {\n return extractRouteHref(candidate, stage);\n}\n\nexport function extractUpdatedAt(candidate: unknown): string | null {\n return extractRouteUpdatedAt(candidate);\n}\n\nexport function resolveRouteTarget(routeIdValue: unknown, routes?: RouteMap): ResolvedRouteTarget | null {\n return resolveRouteTargetForStage(routeIdValue, routes, \"published\");\n}\n\nexport function resolveRouteTargetForStage(\n routeIdValue: unknown,\n routes: RouteMap | undefined,\n stageInput: RenderStage | undefined,\n): ResolvedRouteTarget | null {\n return resolveRouteTargetForStageShared(routeIdValue, routes, stageInput);\n}\n\nexport function resolvePageRouteTarget(link: LinkRecord, context: LinkResolverContext): ResolvedRouteTarget | null {\n if (typeof link.routeId === \"string\" && link.routeId.trim().length > 0) {\n const existing = resolveRouteTargetForStage(link.routeId, context.routes, context.stage);\n if (existing) return existing;\n }\n\n const identifier = typeof link.identifier === \"string\" ? link.identifier : null;\n if (!identifier || !context.pagesByIdentifier) {\n return null;\n }\n\n const routeId = context.pagesByIdentifier[identifier];\n if (!routeId) {\n return null;\n }\n\n return resolveRouteTargetForStage(routeId, context.routes, context.stage);\n}\n\nexport function resolveEntryRouteTarget(link: LinkRecord, context: LinkResolverContext): ResolvedRouteTarget | null {\n if (typeof link.routeId === \"string\" && link.routeId.trim().length > 0) {\n const existing = resolveRouteTargetForStage(link.routeId, context.routes, context.stage);\n if (existing) return existing;\n }\n\n const contentType = typeof link.contentType === \"string\" ? link.contentType : null;\n const identifier = typeof link.identifier === \"string\" ? link.identifier : null;\n if (!contentType || !identifier || !context.entriesByIdentifier) {\n return null;\n }\n\n const entryMap = context.entriesByIdentifier[contentType];\n if (!entryMap) {\n return null;\n }\n\n const routeId = entryMap[identifier];\n if (!routeId) {\n return null;\n }\n\n return resolveRouteTargetForStage(routeId, context.routes, context.stage);\n}\n\nexport function resolveFallbackHref(link: LinkRecord): string | null {\n if (typeof link.href !== \"string\") {\n return null;\n }\n const href = link.href.trim();\n return href.length > 0 ? href : null;\n}\n\nexport function isPlainRecord(value: unknown): value is LinkRecord {\n return isRecord(value);\n}\n","import type { TransformContext, TransformDefinition } from \"./core\";\nimport {\n resolveEntryRouteTarget,\n resolveFallbackHref,\n resolvePageRouteTarget,\n resolveRouteTargetForStage,\n} from \"../../links/resolve\";\n\ntype LinkRecord = Record<string, unknown>;\n\n/** Resolve internal link via routeId lookup, falling back to href */\nfunction resolveInternalLink(link: LinkRecord, context: TransformContext): string | null {\n const resolved = resolveRouteFromMap(link.routeId, context);\n if (resolved) return resolved;\n return resolveFallbackHref(link);\n}\n\nfunction resolveRouteFromMap(routeIdValue: unknown, context: TransformContext): string | null {\n return resolveRouteTargetForStage(routeIdValue, context.routes, context.stage)?.href ?? null;\n}\n\n/** Resolve page identifier link via pagesByIdentifier lookup */\nfunction resolvePageLink(link: LinkRecord, context: TransformContext): string | null {\n const resolved = resolvePageRouteTarget(link, context);\n if (resolved) return resolved.href;\n return resolveFallbackHref(link);\n}\n\n/** Resolve entry identifier link via entriesByIdentifier lookup */\nfunction resolveEntryLink(link: LinkRecord, context: TransformContext): string | null {\n const resolved = resolveEntryRouteTarget(link, context);\n if (resolved) return resolved.href;\n return resolveFallbackHref(link);\n}\n\n/** Resolve external or url link by returning trimmed href */\nfunction resolveExternalLink(link: LinkRecord): string | null {\n return resolveFallbackHref(link);\n}\n\nexport const resolveLinkTransform: TransformDefinition = {\n id: \"links.resolve\",\n kind: \"formatter\",\n summary: \"Resolve LinkValue objects to href strings using the route map\",\n run: (value, _options, context) => {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n\n const link = value as LinkRecord;\n const kind = typeof link.kind === \"string\" ? link.kind : null;\n\n if (kind === \"internal\") return resolveInternalLink(link, context);\n if (kind === \"page\") return resolvePageLink(link, context);\n if (kind === \"entry\") return resolveEntryLink(link, context);\n if (kind === \"external\" || kind === \"url\") return resolveExternalLink(link);\n\n // Handle pre-resolved links (simple { href } objects without kind)\n // These come from buildMenu() which pre-resolves all hrefs\n if (!kind && typeof link.href === \"string\") {\n return resolveExternalLink(link);\n }\n\n return null;\n },\n};\n\nexport const linkLabelTransform: TransformDefinition = {\n id: \"links.label\",\n kind: \"formatter\",\n summary: \"Extract a human-readable label from link objects\",\n run: (value) => {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n\n const link = value as LinkRecord;\n\n // Prefer explicit label (common in generated manifests / page converter output)\n if (typeof link.label === \"string\") {\n const label = link.label.trim();\n if (label.length > 0) return label;\n }\n\n // Internal link values include a title\n if (typeof link.title === \"string\") {\n const title = link.title.trim();\n if (title.length > 0) return title;\n }\n\n // Page/entry identifiers can be a usable label fallback\n if (typeof link.identifier === \"string\") {\n const identifier = link.identifier.trim();\n if (identifier.length > 0) return identifier;\n }\n\n // Last resort: show href (still better than [object Object])\n if (typeof link.href === \"string\") {\n const href = link.href.trim();\n if (href.length > 0) return href;\n }\n\n return null;\n },\n};\n\nexport const linksTransforms = [resolveLinkTransform, linkLabelTransform] satisfies ReadonlyArray<\n TransformDefinition<unknown>\n>;\n","import { createTransformRegistry } from \"./core\";\nimport { formattingTransforms } from \"./formatting\";\nimport { layoutTransforms } from \"./layout\";\nimport { uiTransforms } from \"./ui\";\nimport { mediaTransforms } from \"./media\";\nimport { backgroundTransforms } from \"./background\";\nimport { linksTransforms } from \"./links\";\nimport { boxStylesTransforms } from \"./boxStyles\";\nimport { contentTransforms } from \"./content\";\n\nexport const builtinTransformDefinitions = [\n ...formattingTransforms,\n ...layoutTransforms,\n ...uiTransforms,\n ...mediaTransforms,\n ...backgroundTransforms,\n ...linksTransforms,\n ...boxStylesTransforms,\n ...contentTransforms,\n];\n\nexport const defaultTransforms = createTransformRegistry(builtinTransformDefinitions);\n\nexport {\n formattingTransforms,\n layoutTransforms,\n uiTransforms,\n mediaTransforms,\n backgroundTransforms,\n linksTransforms,\n boxStylesTransforms,\n contentTransforms,\n};\n"],"mappings":"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","names":["z","z","z","props","props","props","props","text","props","z","z","fields","repeat","fields","scopes","composition","button","props","props","grid","props","fields","composition","fields","z","z","grid","props","z","z","z","z","z","z","z","z","joinClasses","z","z","z","z","classicLayout","dataLoaders","fields","z","z","z","z","z","z","z","z","z","z","z","occurrenceContextSchema","z","z","z","grid","props","gridLayout","carouselLayout","wrapVariant","grid","props","gridLayout2","emptyState","fields","ITEM_NAME","wrapVariant","REGISTRY_SYMBOL","isVitest","globalScope","resolveRouteTargetForStage","link","link","resolveRouteTargetForStage"]}