@riverbankcms/sdk 0.145.0 → 0.146.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 (159) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/{PreviewEditorSidebar-O-V6Pl5a.mjs → PreviewEditorSidebar-kg2r2Fyi.mjs} +4 -4
  3. package/dist/{PreviewEditorUI-1UlX_9cw.mjs → PreviewEditorUI-sWMLp5dT.mjs} +3 -3
  4. package/dist/{PreviewQueryProvider-BxGwdOCV.mjs → PreviewQueryProvider-Cg51xq1w.mjs} +1 -1
  5. package/dist/{SdkPreviewModeRuntime-DYbA_4iv.mjs → SdkPreviewModeRuntime-h2ti3Hch.mjs} +280 -182
  6. package/dist/{SiteChromeCustomizeContext-CNTKQ9nx.mjs → SiteChromeCustomizeContext-DEACFH9m.mjs} +1330 -734
  7. package/dist/_dts/ai/src/contracts/proposals.d.ts +924 -0
  8. package/dist/_dts/ai/src/contracts/siteStyleProposalSchemas.d.ts +84 -0
  9. package/dist/_dts/api/src/bookingConfig.d.ts +8 -1
  10. package/dist/_dts/api/src/bookingManagementEndpoints.d.ts +8 -14
  11. package/dist/_dts/api/src/bookingManagementEventEndpointTypes.d.ts +45 -1
  12. package/dist/_dts/api/src/clientErrorReporting.d.ts +50 -0
  13. package/dist/_dts/api/src/communications.d.ts +20 -4
  14. package/dist/_dts/api/src/contentRuntime.d.ts +3 -7
  15. package/dist/_dts/api/src/endpoints.d.ts +223 -88
  16. package/dist/_dts/api/src/event-visibility.d.ts +20 -0
  17. package/dist/_dts/api/src/eventManagementContracts.d.ts +56 -3
  18. package/dist/_dts/api/src/eventManagementEndpointDefinitions.d.ts +24 -0
  19. package/dist/_dts/api/src/eventPageWords.d.ts +19 -0
  20. package/dist/_dts/api/src/eventSeriesRegistrationEndpointDefinitions.d.ts +14 -0
  21. package/dist/_dts/api/src/index.d.ts +7 -1
  22. package/dist/_dts/api/src/indexCoreTypes.d.ts +1 -1
  23. package/dist/_dts/api/src/indexExtendedTypes.d.ts +1 -1
  24. package/dist/_dts/api/src/launchReadiness.d.ts +20 -2
  25. package/dist/_dts/api/src/launchRequirementPriority.d.ts +3 -0
  26. package/dist/_dts/api/src/newsletterCampaignCommandEndpoints.d.ts +13 -0
  27. package/dist/_dts/api/src/newsletterEndpointDefinitions.d.ts +42 -0
  28. package/dist/_dts/api/src/occurrenceScheduling.d.ts +10 -0
  29. package/dist/_dts/api/src/pageSurfaceEndpoints.d.ts +44 -0
  30. package/dist/_dts/api/src/participantMessaging.d.ts +11 -1
  31. package/dist/_dts/api/src/sdk-event-upsert.d.ts +40 -1
  32. package/dist/_dts/api/src/sdkContracts.d.ts +3 -42
  33. package/dist/_dts/api/src/sdkCourseBooking.d.ts +30 -0
  34. package/dist/_dts/api/src/sdkEventEndpointDefinitions.d.ts +76 -0
  35. package/dist/_dts/api/src/sdkEventLifecycle.d.ts +37 -0
  36. package/dist/_dts/api/src/sdkManagedEventContracts.d.ts +18 -0
  37. package/dist/_dts/api/src/sdkPageDesign.d.ts +388 -0
  38. package/dist/_dts/api/src/sdkPageDesignEndpointDefinitions.d.ts +22 -0
  39. package/dist/_dts/api/src/sdkPullEventContracts.d.ts +46 -0
  40. package/dist/_dts/api/src/siteAddressEndpoints.d.ts +29 -0
  41. package/dist/_dts/api/src/siteManagementEndpointDefinitions.d.ts +49 -0
  42. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +2 -32
  43. package/dist/_dts/api/src/siteOnboarding.d.ts +75 -9
  44. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +1 -1
  45. package/dist/_dts/api/src/types.d.ts +7 -1
  46. package/dist/_dts/api/src/wholeSeriesRuns.d.ts +14 -0
  47. package/dist/_dts/blocks/src/index.d.ts +2 -0
  48. package/dist/_dts/blocks/src/pageRenderAdmission.d.ts +10 -0
  49. package/dist/_dts/blocks/src/pageRendererContracts.d.ts +3 -1
  50. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +27 -5
  51. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +14 -1
  52. package/dist/_dts/blocks/src/system/icons/social.d.ts +1 -1
  53. package/dist/_dts/blocks/src/system/registry.d.ts +1 -1
  54. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/eventSourceRecovery.d.ts +1 -0
  55. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCollectionContract.d.ts +20 -4
  56. package/dist/_dts/blocks/src/system/runtime/nodes/form.fields.d.ts +5 -0
  57. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.block-submission.d.ts +36 -0
  58. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.client.d.ts +1 -1
  59. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.interactive.d.ts +6 -1
  60. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.parts.d.ts +46 -0
  61. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.types.d.ts +2 -1
  62. package/dist/_dts/blocks/src/system/runtime/resolver.d.ts +2 -1
  63. package/dist/_dts/blocks/src/system/runtime/shared/components/CheckboxChoice.d.ts +18 -0
  64. package/dist/_dts/blocks/src/system/runtime/shared/components/index.d.ts +1 -0
  65. package/dist/_dts/content-editor/src/index.d.ts +1 -0
  66. package/dist/_dts/content-editor/src/primitives/previewEditableOutline.d.ts +2 -0
  67. package/dist/_dts/content-editor/src/ui/editorBlockEquality.d.ts +3 -0
  68. package/dist/_dts/content-editor/src/ui/editorSnapshot.d.ts +3 -5
  69. package/dist/_dts/core/src/block-content-identity.d.ts +5 -0
  70. package/dist/_dts/core/src/editor-state.d.ts +2 -7
  71. package/dist/_dts/core/src/index.d.ts +1 -0
  72. package/dist/_dts/core/src/mailing-list-submission.d.ts +3 -1
  73. package/dist/_dts/core/src/public-event-booking-availability.d.ts +20 -1
  74. package/dist/_dts/core/src/public-profile.d.ts +3 -1
  75. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +49 -2
  76. package/dist/_dts/editor-blocks/src/BlockEditor.d.ts +3 -0
  77. package/dist/_dts/editor-blocks/src/block-editor/EmptyState.d.ts +13 -1
  78. package/dist/_dts/editor-blocks/src/block-editor/types.d.ts +2 -8
  79. package/dist/_dts/editor-blocks/src/index.d.ts +1 -0
  80. package/dist/_dts/preview-next/src/client/blocks/composer/types.d.ts +3 -4
  81. package/dist/_dts/preview-next/src/client/preview/PreviewEntryControllerProvider.d.ts +1 -2
  82. package/dist/_dts/sdk/src/next/renderSdkContent.d.ts +0 -1
  83. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +2 -2
  84. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +2 -2
  85. package/dist/_dts/sdk/src/rendering/helpers/loadContent.d.ts +6 -1
  86. package/dist/_dts/sdk/src/rendering/helpers/loadPage.d.ts +5 -2
  87. package/dist/_dts/sdk/src/rendering/helpers/pageRuntimeSupport.d.ts +6 -1
  88. package/dist/_dts/sdk/src/rendering/helpers/templateContent.d.ts +2 -0
  89. package/dist/_dts/sdk/src/rendering/hooks/useContent.d.ts +5 -1
  90. package/dist/_dts/sdk/src/rendering/hooks/usePage.d.ts +5 -1
  91. package/dist/_dts/sdk/src/version.d.ts +1 -1
  92. package/dist/_dts/surfaces/src/index.d.ts +9 -0
  93. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  94. package/dist/_dts/theme-core/src/inputs/checkable.d.ts +42 -0
  95. package/dist/_dts/theme-core/src/inputs/inputGroup.d.ts +19 -0
  96. package/dist/_dts/ui/src/navigation-tabs.d.ts +2 -1
  97. package/dist/client/{BookingConsentAgreement-DlVOmpW4.mjs → BookingConsentAgreement-BQKL045f.mjs} +2 -2
  98. package/dist/client/CheckboxChoice--W2n6yKs.mjs +24 -0
  99. package/dist/client/{DiscountCodeDisclosure-T9q623PQ.mjs → DiscountCodeDisclosure-CsOtjFY7.mjs} +1 -1
  100. package/dist/client/{EventCombined.client-DnsUeONl.mjs → EventCombined.client-BdRjVbhH.mjs} +6 -6
  101. package/dist/client/{EventListing.client-CNBFqJS4.mjs → EventListing.client-DBxC6xOU.mjs} +2 -2
  102. package/dist/client/{LeafletStaticMap-C7higg52.mjs → LeafletStaticMap-mHEJKrTs.mjs} +1 -1
  103. package/dist/client/{ThemedButton-LAJTNrS8.mjs → ThemedButton-CE5KYT6z.mjs} +1 -1
  104. package/dist/client/{accordion-BcNF9TjX.mjs → accordion-BEQNSptH.mjs} +1 -1
  105. package/dist/client/{bookingForm-BUaQ3S03.mjs → bookingForm-AMr-s5vw.mjs} +33 -52
  106. package/dist/client/bookings.mjs +48 -46
  107. package/dist/client/{carousel-CTdF6e0V.mjs → carousel-Bbt_QgJy.mjs} +1 -1
  108. package/dist/client/{cart-pGtyf_XU.mjs → cart-CnWi30zJ.mjs} +3 -3
  109. package/dist/client/{checkout-Da9WSn7Y.mjs → checkout-f3nkWgd4.mjs} +3 -3
  110. package/dist/client/client.mjs +1611 -815
  111. package/dist/client/{context-BFeY_Wbm.mjs → context-Bc8T6pCe.mjs} +1 -1
  112. package/dist/client/{dates-BhwVSxDg.mjs → dates-DUsCEzLb.mjs} +2 -3
  113. package/dist/client/{eventCalendar-BAtdnR4s.mjs → eventCalendar-CKwgXui5.mjs} +9 -9
  114. package/dist/client/{eventCombined-RksA3tRC.mjs → eventCombined-CBAOSTGR.mjs} +4 -4
  115. package/dist/client/{eventDetails-BB9hB4wR.mjs → eventDetails-Dh-_WiBD.mjs} +4 -4
  116. package/dist/client/{eventListing-BpJBkviM.mjs → eventListing-CA3frIH5.mjs} +4 -4
  117. package/dist/client/{eventRegistration-B18jFq_o.mjs → eventRegistration-BHtsgdcg.mjs} +21 -22
  118. package/dist/client/{form-Dodt8Y8t.mjs → form-C2h3YAcg.mjs} +135 -104
  119. package/dist/client/{headerSection-B0qj9ttg.mjs → headerSection-lwMuMTH9.mjs} +3 -3
  120. package/dist/client/hooks.mjs +489 -65
  121. package/dist/client/{locationMap-gn-iMk7a.mjs → locationMap-DJ2bLODV.mjs} +3 -3
  122. package/dist/client/{newsletterForm-oByLdFkr.mjs → newsletterForm-8Pu5K32g.mjs} +203 -101
  123. package/dist/client/{pricing-BOU0_Hai.mjs → pricing-HHx3IgBz.mjs} +1 -1
  124. package/dist/client/{productDetail-D9v1zH2j.mjs → productDetail-C_1odnAf.mjs} +3 -3
  125. package/dist/client/{productList-D-mItx1n.mjs → productList-CtCv-Nmx.mjs} +3 -3
  126. package/dist/client/{propsDecoder-C3TP_z4x.mjs → propsDecoder-Dcgsncxb.mjs} +40 -23
  127. package/dist/client/rendering/client.mjs +490 -457
  128. package/dist/client/rendering/islands.mjs +17 -17
  129. package/dist/client/rendering.mjs +1515 -628
  130. package/dist/client/{routeIslandApiConfig-DzN1W0sq.mjs → routeIslandApiConfig-CWLP7wu3.mjs} +1 -1
  131. package/dist/client/{scrollToBlock-CWs8EIdo.mjs → scrollToBlock-BNgaEUpo.mjs} +1 -1
  132. package/dist/client/{shop-Dufw7N7o.mjs → shop-DQXrQ8kJ.mjs} +7 -7
  133. package/dist/client/{shop-commerce-gklw_hLF.mjs → shop-commerce-B88zmWWo.mjs} +6 -6
  134. package/dist/client/{shop-commerce-store-Sf1eyTaZ.mjs → shop-commerce-store-DtSfkKuX.mjs} +1 -1
  135. package/dist/client/{shopShared-B5nyA41S.mjs → shopShared-cuaONpkJ.mjs} +4 -4
  136. package/dist/client/{useEventFilters-CLL829vy.mjs → useEventFilters-Bukew6Gb.mjs} +6 -6
  137. package/dist/preview-next/before-render.mjs +368 -103
  138. package/dist/preview-next/client/runtime.mjs +4 -4
  139. package/dist/preview-next/editor-base.css +11 -0
  140. package/dist/preview-next/keepAlive.mjs +328 -103
  141. package/dist/preview-next/middleware.mjs +329 -103
  142. package/dist/{previewAuthStore-BxAFlu-j.mjs → previewAuthStore-h5IgbSp4.mjs} +353 -103
  143. package/dist/{sdk-runtime-D0uZFev7.mjs → sdk-runtime-DTc1uIXn.mjs} +2 -2
  144. package/dist/{separator-EvdCAn4V.mjs → separator-BpHS1KZK.mjs} +1 -1
  145. package/dist/server/components.mjs +1376 -331
  146. package/dist/server/config-validation.mjs +405 -27
  147. package/dist/server/config.mjs +405 -27
  148. package/dist/server/data.mjs +405 -27
  149. package/dist/server/index.mjs +370 -104
  150. package/dist/server/next.mjs +1430 -463
  151. package/dist/server/page-converter.mjs +36 -25
  152. package/dist/server/prebuild.mjs +1 -1
  153. package/dist/server/rendering/server.mjs +1374 -331
  154. package/dist/server/rendering.mjs +1436 -364
  155. package/dist/server/routing.mjs +476 -43
  156. package/dist/server/server.mjs +504 -169
  157. package/dist/server/theme-bridge.mjs +467 -111
  158. package/dist/styles/index.css +186 -65
  159. package/package.json +1 -1
@@ -11911,6 +11911,270 @@ const curatedSiteStyles = [
11911
11911
  ];
11912
11912
  new Map(curatedSiteStyles.map((style) => [style.id, style]));
11913
11913
  //#endregion
11914
+ //#region ../theme-core/src/inputs/checkable.ts
11915
+ /**
11916
+ * Checkbox and radio CSS shared by the full theme generator and the SDK
11917
+ * theme bridge, so both render the same customer-facing controls.
11918
+ *
11919
+ * Emits:
11920
+ * - .form-checkbox / .form-radio: the controls themselves. The tick and dot
11921
+ * are drawn with ::before so their colour comes from theme tokens rather
11922
+ * than a baked-in SVG.
11923
+ * - .form-check: a label row holding a control and its text. The control
11924
+ * lines up with the first line of text, so long labels wrap cleanly.
11925
+ * - .form-check--tile: a bordered, fully clickable panel for agreements
11926
+ * (booking consent, consent fields) that tints when ticked.
11927
+ */
11928
+ const CHECKABLE_SIZE = "1.375rem";
11929
+ /** Never fully round: a round checkbox reads as a radio. */
11930
+ const CHECKBOX_RADIUS = {
11931
+ square: "0",
11932
+ soft: "0.25rem",
11933
+ rounded: "0.375rem",
11934
+ pill: "0.375rem"
11935
+ };
11936
+ /** Tiles hold wrapping text, so pill themes get a generous radius, not a capsule. */
11937
+ const TILE_RADIUS = {
11938
+ square: "0",
11939
+ soft: "0.5rem",
11940
+ rounded: "0.75rem",
11941
+ pill: "1rem"
11942
+ };
11943
+ const ON_ACCENT_TOKENS = {
11944
+ primary: "onPrimary",
11945
+ secondary: "onSecondary",
11946
+ accent: "onAccent"
11947
+ };
11948
+ /**
11949
+ * Colour for the tick/dot drawn on top of the accent fill. Uses the palette's
11950
+ * matching "on" token where there is one, falling back to white.
11951
+ */
11952
+ /** The accent at full strength: `primary/70` becomes `primary`. */
11953
+ function solidAccentToken(accentToken) {
11954
+ const parsed = parseColorTokenParts(accentToken);
11955
+ return parsed.kind === "token" ? parsed.token : accentToken;
11956
+ }
11957
+ function checkableMarkColor(accentToken) {
11958
+ const parsed = parseColorTokenParts(accentToken);
11959
+ const onToken = parsed.kind === "token" ? ON_ACCENT_TOKENS[parsed.token] : void 0;
11960
+ return onToken ? `rgb(var(--tb-${onToken}, 255 255 255))` : "rgb(255 255 255)";
11961
+ }
11962
+ function checkableSelectors(root) {
11963
+ return {
11964
+ checkbox: `${root} .form-checkbox`,
11965
+ radio: `${root} .form-radio`,
11966
+ check: `${root} .form-check`,
11967
+ tile: `${root} .form-check--tile`
11968
+ };
11969
+ }
11970
+ /** The box and circle themselves, unchecked. */
11971
+ function controlBaseCss(sel, input) {
11972
+ const border = input.borderWidth === "0" ? "1px" : input.borderWidth;
11973
+ return [
11974
+ `${sel.checkbox},
11975
+ ${sel.radio} {
11976
+ appearance: none;
11977
+ display: inline-grid;
11978
+ place-content: center;
11979
+ width: ${CHECKABLE_SIZE};
11980
+ height: ${CHECKABLE_SIZE};
11981
+ margin: 0;
11982
+ flex-shrink: 0;
11983
+ border: ${border} solid ${input.borderColor};
11984
+ background-color: ${input.background};
11985
+ color: inherit;
11986
+ cursor: pointer;
11987
+ transition: background-color 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease;
11988
+ }`,
11989
+ `${sel.checkbox} {
11990
+ border-radius: ${CHECKBOX_RADIUS[input.corners]};
11991
+ }`,
11992
+ `${sel.radio} {
11993
+ border-radius: 9999px;
11994
+ }`
11995
+ ];
11996
+ }
11997
+ /** The tick and dot, drawn with ::before so their colour is a theme token. */
11998
+ function controlMarkCss(sel, accentToken) {
11999
+ return [
12000
+ `${sel.checkbox}::before,
12001
+ ${sel.radio}::before {
12002
+ content: "";
12003
+ background-color: ${checkableMarkColor(accentToken)};
12004
+ transform: scale(0);
12005
+ transition: transform 0.12s ease;
12006
+ }`,
12007
+ `${sel.checkbox}::before {
12008
+ width: 0.75rem;
12009
+ height: 0.75rem;
12010
+ clip-path: polygon(14% 52%, 0 67%, 38% 100%, 100% 22%, 85% 8%, 37% 70%);
12011
+ }`,
12012
+ `${sel.radio}::before {
12013
+ width: 0.5rem;
12014
+ height: 0.5rem;
12015
+ border-radius: 9999px;
12016
+ }`
12017
+ ];
12018
+ }
12019
+ function controlStateCss(sel, input) {
12020
+ const accent = rgbColorValue(solidAccentToken(input.accentToken));
12021
+ return [
12022
+ `${sel.checkbox}:hover,
12023
+ ${sel.radio}:hover,
12024
+ ${sel.check}:hover > .form-checkbox,
12025
+ ${sel.check}:hover > .form-radio {
12026
+ border-color: ${accent};
12027
+ }`,
12028
+ `${sel.checkbox}:checked,
12029
+ ${sel.radio}:checked {
12030
+ background-color: ${accent};
12031
+ border-color: ${accent};
12032
+ }`,
12033
+ `${sel.checkbox}:checked::before,
12034
+ ${sel.radio}:checked::before {
12035
+ transform: scale(1);
12036
+ }`,
12037
+ `${sel.checkbox}:focus-visible,
12038
+ ${sel.radio}:focus-visible {
12039
+ outline: 2px solid ${accent};
12040
+ outline-offset: 2px;
12041
+ }`,
12042
+ `${sel.checkbox}:disabled,
12043
+ ${sel.radio}:disabled {
12044
+ opacity: 0.5;
12045
+ cursor: not-allowed;
12046
+ }`
12047
+ ];
12048
+ }
12049
+ /** Label row: control lined up with the first line of wrapping text. */
12050
+ function checkRowCss(sel) {
12051
+ return [
12052
+ `${sel.check} {
12053
+ display: flex;
12054
+ align-items: flex-start;
12055
+ gap: 0.75rem;
12056
+ line-height: 1.5;
12057
+ cursor: pointer;
12058
+ }`,
12059
+ `${sel.check} > .form-checkbox,
12060
+ ${sel.check} > .form-radio {
12061
+ margin-top: 0.0625rem;
12062
+ margin-top: max(0px, calc((1lh - ${CHECKABLE_SIZE}) / 2));
12063
+ }`,
12064
+ `${sel.check}:has(> :disabled) {
12065
+ cursor: not-allowed;
12066
+ }`
12067
+ ];
12068
+ }
12069
+ function agreementTileCss(sel, input) {
12070
+ const accent = rgbColorValue(solidAccentToken(input.accentToken));
12071
+ return [
12072
+ `${sel.tile} {
12073
+ padding: 0.875rem 1rem;
12074
+ border: 1px solid color-mix(in srgb, currentColor 22%, transparent);
12075
+ border-radius: ${TILE_RADIUS[input.corners]};
12076
+ transition: border-color 0.15s ease, background-color 0.15s ease;
12077
+ }`,
12078
+ `${sel.tile}:hover {
12079
+ border-color: color-mix(in srgb, ${accent} 55%, transparent);
12080
+ }`,
12081
+ `${sel.tile}:has(> .form-checkbox:checked) {
12082
+ border-color: ${accent};
12083
+ background-color: color-mix(in srgb, ${accent} 7%, transparent);
12084
+ }`,
12085
+ `${sel.tile}:has(> .form-checkbox[aria-invalid="true"]) {
12086
+ border-color: ${input.errorColor};
12087
+ }`
12088
+ ];
12089
+ }
12090
+ function checkableMediaCss(sel) {
12091
+ return [`@media (prefers-reduced-motion: reduce) {
12092
+ ${sel.checkbox}, ${sel.radio}, ${sel.checkbox}::before, ${sel.radio}::before, ${sel.tile} {
12093
+ transition: none;
12094
+ }
12095
+ }`, `@media (forced-colors: active) {
12096
+ ${sel.checkbox}::before,
12097
+ ${sel.radio}::before {
12098
+ background-color: CanvasText;
12099
+ }
12100
+ }`];
12101
+ }
12102
+ /**
12103
+ * Exposes the accent and mark colours so other choice controls (newsletter
12104
+ * topic chips) match the checkboxes without re-deriving the theme tokens.
12105
+ */
12106
+ function checkableVarsCss(input) {
12107
+ return [`${input.root} {
12108
+ --rb-check-accent: ${rgbColorValue(solidAccentToken(input.accentToken))};
12109
+ --rb-check-mark: ${checkableMarkColor(input.accentToken)};
12110
+ }`];
12111
+ }
12112
+ function generateCheckableCss(input) {
12113
+ const sel = checkableSelectors(input.root);
12114
+ return [
12115
+ ...checkableVarsCss(input),
12116
+ ...controlBaseCss(sel, input),
12117
+ ...controlMarkCss(sel, input.accentToken),
12118
+ ...controlStateCss(sel, input),
12119
+ ...checkRowCss(sel),
12120
+ ...agreementTileCss(sel, input),
12121
+ ...checkableMediaCss(sel)
12122
+ ].join("\n\n");
12123
+ }
12124
+ //#endregion
12125
+ //#region ../theme-core/src/inputs/inputGroup.ts
12126
+ /**
12127
+ * Input group: a field and an action (usually a themed button) sharing one
12128
+ * input-styled shell, e.g. the newsletter email + Sign up row.
12129
+ *
12130
+ * The shell `.form-input-group` takes the theme's `.form-input` rules (the
12131
+ * generators add it to that selector list, plus focus and error), so it
12132
+ * follows the site's input background, border, corners and shadow. This file
12133
+ * only adds the layout overrides and the borderless inner field.
12134
+ */
12135
+ const INPUT_GROUP_SELECTOR = ".form-input-group";
12136
+ /** Shell focus ring follows the field only, not the button beside it. */
12137
+ const INPUT_GROUP_FOCUS_SELECTOR = ".form-input-group:has(> .form-input-group-field:focus-visible)";
12138
+ const INPUT_GROUP_ERROR_SELECTOR = ".form-input-group:has(> .form-input-group-field[aria-invalid=\"true\"])";
12139
+ const GROUP_INSET = "0.25rem";
12140
+ /**
12141
+ * @param root - scoped root selector
12142
+ * @param padding - the theme's input padding shorthand (`block inline`), so the
12143
+ * inner field's text sits where a plain input's text would.
12144
+ */
12145
+ function generateInputGroupCss(root, padding) {
12146
+ const [block = padding, inline = block] = padding.trim().split(/\s+/);
12147
+ return `${root} .form-input-group {
12148
+ display: flex;
12149
+ align-items: stretch;
12150
+ gap: ${GROUP_INSET};
12151
+ padding: ${GROUP_INSET};
12152
+ }
12153
+
12154
+ ${root} .form-input-group-field {
12155
+ flex: 1 1 auto;
12156
+ min-width: 0;
12157
+ margin: 0;
12158
+ border: 0;
12159
+ border-radius: 0;
12160
+ background: transparent;
12161
+ box-shadow: none;
12162
+ outline: none;
12163
+ color: inherit;
12164
+ font: inherit;
12165
+ padding: calc(${block} - ${GROUP_INSET}) calc(${inline} - ${GROUP_INSET});
12166
+ }
12167
+
12168
+ ${root} .form-input-group-field::placeholder {
12169
+ color: inherit;
12170
+ opacity: 0.6;
12171
+ }
12172
+
12173
+ ${root} .form-input-group > :not(.form-input-group-field) {
12174
+ flex-shrink: 0;
12175
+ }`;
12176
+ }
12177
+ //#endregion
11914
12178
  //#region ../theme-core/src/status/generateStatusCss.ts
11915
12179
  /**
11916
12180
  * Corner radius map - derives alert border-radius from theme.corners
@@ -13213,6 +13477,9 @@ const containerResponsiveThemeCss = `/*
13213
13477
  .rb-h-4 {
13214
13478
  height: 1rem;
13215
13479
  }
13480
+ .rb-h-5 {
13481
+ height: 1.25rem;
13482
+ }
13216
13483
  .rb-h-8 {
13217
13484
  height: 2rem;
13218
13485
  }
@@ -17178,6 +17445,10 @@ const containerResponsiveThemeCss = `/*
17178
17445
  margin-bottom: 0.25rem;
17179
17446
  }
17180
17447
 
17448
+ :where(.theme-scope) :where([data-block='event-registration']) .er-consent-check {
17449
+ margin-top: 0.75rem;
17450
+ }
17451
+
17181
17452
  :where(.theme-scope) :where([data-block='event-registration']) .er-required {
17182
17453
  color: var(--er-required);
17183
17454
  }
@@ -21897,13 +22168,6 @@ const containerResponsiveThemeCss = `/*
21897
22168
  margin: 0;
21898
22169
  }
21899
22170
 
21900
- /* Inline field (checkbox, radio with label) */
21901
- :where(.theme-scope) :where([data-block="form"]) .fb-inline {
21902
- display: flex;
21903
- align-items: center;
21904
- gap: 0.5rem;
21905
- }
21906
-
21907
22171
  /* Success state */
21908
22172
  :where(.theme-scope) :where([data-block="form"]) .fb-success {
21909
22173
  background-color: var(--fb-success-bg);
@@ -24020,9 +24284,11 @@ const containerResponsiveThemeCss = `/*
24020
24284
  */
24021
24285
 
24022
24286
  /* Newsletter copy styling */
24287
+ /* Size only: weight, family and colour come from the theme's heading styles */
24023
24288
  :where(.theme-scope) :where([data-block="newsletter-signup"]) .newsletter-copy-title {
24024
- font-size: 1.5rem;
24025
- font-weight: 600;
24289
+ font-size: clamp(1.75rem, 1.35rem + 1.6vw, 2.5rem);
24290
+ line-height: 1.15;
24291
+ text-wrap: balance;
24026
24292
  }
24027
24293
 
24028
24294
  :where(.theme-scope) :where([data-block="newsletter-signup"]) .newsletter-copy-subtitle {
@@ -24046,37 +24312,150 @@ const containerResponsiveThemeCss = `/*
24046
24312
  gap: var(--rb-gap-sm, 0.75rem);
24047
24313
  }
24048
24314
 
24049
- /* Individual field styling */
24315
+ /* Extra preset fields (name, company...). Labels are visually hidden, so
24316
+ these sit in a row above the email entry. */
24317
+ :where(.theme-scope) .newsletter-extra-fields {
24318
+ display: grid;
24319
+ grid-template-columns: repeat(auto-fit, minmax(min(12rem, 100%), 1fr));
24320
+ gap: 0.5rem;
24321
+ }
24322
+
24050
24323
  :where(.theme-scope) .newsletter-field {
24051
24324
  display: flex;
24052
24325
  flex-direction: column;
24053
24326
  gap: 0.25rem;
24327
+ text-align: left;
24054
24328
  }
24055
24329
 
24056
- /* Topic choices (visitor picks what to hear about). Same treatment as the
24057
- form block's .fb-fieldset / .fb-inline, defined here because the newsletter
24058
- form also renders inside contact-newsletter and the site footer. */
24059
- :where(.theme-scope) .newsletter-topics {
24330
+ /* Email entry: the email field and the themed submit button share one shell.
24331
+ The shell's look (background, border, corners, focus ring) comes from the
24332
+ theme's input system via .form-input-group; this only handles layout. */
24333
+ :where(.theme-scope) .newsletter-entry {
24334
+ container-type: inline-size;
24060
24335
  display: flex;
24061
24336
  flex-direction: column;
24062
- gap: 0.5rem;
24337
+ gap: 0.375rem;
24338
+ text-align: left;
24339
+ }
24340
+
24341
+ :where(.theme-scope) .newsletter-entry-group > button {
24342
+ white-space: nowrap;
24343
+ }
24344
+
24345
+ /* Too narrow for field and button side by side (phones, footer columns):
24346
+ stack them inside the shell and keep pill themes from turning the taller
24347
+ shell into a capsule. */
24348
+ @container (max-width: 22rem) {
24349
+ :where(.theme-scope) .newsletter-entry .newsletter-entry-group {
24350
+ flex-direction: column;
24351
+ border-radius: min(var(--rb-input-radius, 0.5rem), 1rem);
24352
+ }
24353
+
24354
+ :where(.theme-scope) .newsletter-entry .newsletter-entry-group > button {
24355
+ width: 100%;
24356
+ justify-content: center;
24357
+ }
24358
+ }
24359
+
24360
+ /* Topic choices (visitor picks what to hear about) as toggle chips. Each chip
24361
+ is a real checkbox underneath; the chip is its visible face. */
24362
+ :where(.theme-scope) .newsletter-topics {
24063
24363
  border: none;
24064
24364
  padding: 0;
24065
24365
  margin: 0;
24066
24366
  min-width: 0;
24067
24367
  }
24068
24368
 
24069
- :where(.theme-scope) .newsletter-topics > legend {
24369
+ :where(.theme-scope) .newsletter-topics-legend {
24070
24370
  padding: 0;
24071
- margin-bottom: 0.25rem;
24371
+ margin-bottom: 0.625rem;
24372
+ font-size: 0.9375rem;
24373
+ color: var(--rb-surface-text-color, rgb(var(--tb-text, 17 24 39)));
24072
24374
  }
24073
24375
 
24074
- :where(.theme-scope) .newsletter-topic-choice {
24376
+ :where(.theme-scope) .newsletter-topic-chips {
24075
24377
  display: flex;
24076
- align-items: center;
24378
+ flex-wrap: wrap;
24077
24379
  gap: 0.5rem;
24078
24380
  }
24079
24381
 
24382
+ :where(.theme-scope) .newsletter-stacked .newsletter-topics-legend {
24383
+ width: 100%;
24384
+ }
24385
+
24386
+ :where(.theme-scope) .newsletter-stacked .newsletter-topic-chips {
24387
+ justify-content: center;
24388
+ }
24389
+
24390
+ :where(.theme-scope) .newsletter-topic-chip {
24391
+ position: relative;
24392
+ display: inline-flex;
24393
+ }
24394
+
24395
+ :where(.theme-scope) .newsletter-topic-chip > input {
24396
+ position: absolute;
24397
+ inset: 0;
24398
+ width: 100%;
24399
+ height: 100%;
24400
+ margin: 0;
24401
+ opacity: 0;
24402
+ cursor: pointer;
24403
+ }
24404
+
24405
+ :where(.theme-scope) .newsletter-topic-chip > span {
24406
+ display: inline-flex;
24407
+ align-items: center;
24408
+ gap: 0.375rem;
24409
+ padding: 0.4375rem 0.9375rem;
24410
+ border: 1px solid color-mix(in srgb, currentColor 35%, transparent);
24411
+ border-radius: var(--rb-button-radius, var(--rb-input-radius, 9999px));
24412
+ font-size: 0.9375rem;
24413
+ line-height: 1.3;
24414
+ color: var(--rb-surface-text-color, rgb(var(--tb-text, 17 24 39)));
24415
+ transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease;
24416
+ }
24417
+
24418
+ /* Tick that grows in when the chip is on */
24419
+ :where(.theme-scope) .newsletter-topic-chip > span::before {
24420
+ content: "";
24421
+ width: 0;
24422
+ height: 0.7em;
24423
+ background-color: currentColor;
24424
+ clip-path: polygon(14% 52%, 0 67%, 38% 100%, 100% 22%, 85% 8%, 37% 70%);
24425
+ transition: width 0.15s ease;
24426
+ }
24427
+
24428
+ :where(.theme-scope) .newsletter-topic-chip:hover > span {
24429
+ border-color: currentColor;
24430
+ }
24431
+
24432
+ /* Same accent and mark colours as the theme's checkboxes */
24433
+ :where(.theme-scope) .newsletter-topic-chip > input:checked + span {
24434
+ background-color: var(--rb-check-accent, rgb(var(--tb-primary)));
24435
+ border-color: var(--rb-check-accent, rgb(var(--tb-primary)));
24436
+ color: var(--rb-check-mark, rgb(var(--tb-onPrimary, 255 255 255)));
24437
+ }
24438
+
24439
+ :where(.theme-scope) .newsletter-topic-chip > input:checked + span::before {
24440
+ width: 0.7em;
24441
+ }
24442
+
24443
+ :where(.theme-scope) .newsletter-topic-chip > input:focus-visible + span {
24444
+ outline: 2px solid var(--rb-check-accent, rgb(var(--tb-primary)));
24445
+ outline-offset: 2px;
24446
+ }
24447
+
24448
+ :where(.theme-scope) .newsletter-topic-chip > input:disabled + span {
24449
+ opacity: 0.6;
24450
+ }
24451
+
24452
+ @media (prefers-reduced-motion: reduce) {
24453
+ :where(.theme-scope) .newsletter-topic-chip > span,
24454
+ :where(.theme-scope) .newsletter-topic-chip > span::before {
24455
+ transition: none;
24456
+ }
24457
+ }
24458
+
24080
24459
  /* Error panel and field notes. The form block scopes these to its own
24081
24460
  data-block, so the newsletter form (which also renders in the footer)
24082
24461
  needs its own copy of the treatment. */
@@ -24094,13 +24473,7 @@ const containerResponsiveThemeCss = `/*
24094
24473
  color: var(--fb-error-text);
24095
24474
  }
24096
24475
 
24097
- /* Required indicator */
24098
- :where(.theme-scope) .newsletter-required {
24099
- color: rgb(var(--tb-primary));
24100
- margin-left: 0.125rem;
24101
- }
24102
-
24103
- /* Submit button container */
24476
+ /* Submit button container (only when a preset has no email field) */
24104
24477
  :where(.theme-scope) .newsletter-submit {
24105
24478
  margin-top: 0.5rem;
24106
24479
  }
@@ -24112,52 +24485,29 @@ const containerResponsiveThemeCss = `/*
24112
24485
  justify-content: center;
24113
24486
  }
24114
24487
 
24115
- /* Privacy note */
24488
+ /* Privacy note: quieter than the intro so the entry row leads */
24116
24489
  :where(.theme-scope) .newsletter-privacy-note {
24117
24490
  margin-top: 0.75rem;
24118
- font-size: 1rem;
24119
- line-height: 1.6;
24120
- color: var(--rb-surface-text-color, rgb(var(--tb-text, 17 24 39)));
24491
+ font-size: 0.8125rem;
24492
+ line-height: 1.5;
24493
+ color: var(--rb-surface-supporting-color, var(--rb-surface-text-color, rgb(var(--tb-text, 17 24 39))));
24494
+ opacity: 0.85;
24121
24495
  text-align: center;
24122
24496
  }
24123
24497
 
24124
24498
  /* =============================================================================
24125
- * Inline Variant - Horizontal layout
24499
+ * Inline Variant - left-aligned, wider entry row
24126
24500
  * =============================================================================
24127
24501
  */
24128
24502
 
24129
- :where(.theme-scope) .newsletter-inline .newsletter-form-fields {
24130
- flex-direction: row;
24131
- align-items: flex-end;
24132
- flex-wrap: wrap;
24133
- gap: var(--rb-gap-sm, 0.75rem);
24134
- }
24135
-
24136
- :where(.theme-scope) .newsletter-inline .newsletter-field {
24137
- flex: 1 1 auto;
24138
- min-width: 10rem;
24139
- }
24140
-
24141
- :where(.theme-scope) .newsletter-inline .newsletter-submit {
24142
- margin-top: 0;
24143
- flex-shrink: 0;
24144
- }
24145
-
24146
- :where(.theme-scope) .newsletter-inline .newsletter-topics {
24147
- flex-basis: 100%;
24503
+ :where(.theme-scope) .newsletter-inline .newsletter-form {
24504
+ max-width: 40rem;
24505
+ margin-left: 0;
24506
+ margin-right: 0;
24148
24507
  }
24149
24508
 
24150
- /* Mobile fallback for inline variant */
24151
- @container rb-site (max-width: 640px) {
24152
- @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
24153
- :where(.theme-scope) .newsletter-inline .newsletter-form-fields {
24154
- flex-direction: column;
24155
- }
24156
-
24157
- :where(.theme-scope) .newsletter-inline .newsletter-field {
24158
- min-width: 100%;
24159
- }
24160
- }
24509
+ :where(.theme-scope) .newsletter-inline .newsletter-privacy-note {
24510
+ text-align: left;
24161
24511
  }
24162
24512
 
24163
24513
  /* =============================================================================
@@ -24295,12 +24645,6 @@ const containerResponsiveThemeCss = `/*
24295
24645
  margin: 0;
24296
24646
  }
24297
24647
 
24298
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-inline {
24299
- display: flex;
24300
- align-items: center;
24301
- gap: 0.5rem;
24302
- }
24303
-
24304
24648
  :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-success,
24305
24649
  :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-error,
24306
24650
  :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-empty {
@@ -26197,6 +26541,44 @@ const containerResponsiveThemeCss = `/*
26197
26541
  flex: 0 0 auto;
26198
26542
  }
26199
26543
  }
26544
+ }
26545
+
26546
+ /* =============================================================================
26547
+ * Site footer: social links
26548
+ *
26549
+ * Icon links get a 40px tap target with a hairline ring drawn from the link's
26550
+ * own colour, so it follows the footer's text colour on any surface. Links
26551
+ * without an icon (unknown platforms) stay plain text.
26552
+ * =============================================================================
26553
+ */
26554
+
26555
+ :where(.theme-scope) .rb-footer-socials {
26556
+ display: flex;
26557
+ flex-wrap: wrap;
26558
+ align-items: center;
26559
+ gap: 0.75rem 1.25rem;
26560
+ }
26561
+
26562
+ :where(.theme-scope) .rb-footer-social-link:has(> .rb-footer-social-icon) {
26563
+ display: inline-grid;
26564
+ place-items: center;
26565
+ width: 2.5rem;
26566
+ height: 2.5rem;
26567
+ border: 1px solid color-mix(in srgb, currentColor 22%, transparent);
26568
+ border-radius: 9999px;
26569
+ }
26570
+
26571
+ :where(.theme-scope) .rb-footer-socials:has(.rb-footer-social-icon) {
26572
+ gap: 0.5rem;
26573
+ }
26574
+
26575
+ :where(.theme-scope) .rb-footer-social-link:has(> .rb-footer-social-icon):hover {
26576
+ border-color: currentColor;
26577
+ }
26578
+
26579
+ :where(.theme-scope) .rb-footer-social-icon {
26580
+ width: 1.5rem;
26581
+ height: 1.5rem;
26200
26582
  }`;
26201
26583
  //#endregion
26202
26584
  //#region ../theme-core/src/ThemeScopeCore.tsx
@@ -26446,6 +26828,7 @@ const BORDER_WIDTH_MAP = {
26446
26828
  medium: "2px",
26447
26829
  thick: "4px"
26448
26830
  };
26831
+ const INPUT_PADDING = "0.5rem 0.75rem";
26449
26832
  const SHADOW_VALUES = {
26450
26833
  none: "none",
26451
26834
  low: "0 1px 2px rgba(0,0,0,0.04)",
@@ -26479,16 +26862,18 @@ function generateInputCoreCss(scopeId, settings) {
26479
26862
  color: rgb(var(--tb-${settings.textToken}));
26480
26863
  border: ${borderWidth} solid rgb(var(--tb-${settings.borderToken}));
26481
26864
  border-radius: ${borderRadius};
26482
- padding: 0.5rem 0.75rem;
26865
+ padding: ${INPUT_PADDING};
26483
26866
  font-size: 1rem;
26484
26867
  width: 100%;
26485
26868
  outline: none;
26486
26869
  transition: border-color 0.2s ease, box-shadow 0.2s ease;
26487
26870
  ${settings.shadow !== "none" ? `box-shadow: ${SHADOW_VALUES[settings.shadow]};` : ""}
26488
26871
  `.trim();
26489
- cssBlocks.push(`${root} .form-input {
26872
+ cssBlocks.push(`${root} .form-input,
26873
+ ${root} ${INPUT_GROUP_SELECTOR} {
26490
26874
  ${sharedInputRules}
26491
26875
  }`);
26876
+ cssBlocks.push(generateInputGroupCss(root, INPUT_PADDING));
26492
26877
  cssBlocks.push(`${root} .form-textarea {
26493
26878
  ${sharedInputRules}
26494
26879
  resize: vertical;
@@ -26505,14 +26890,16 @@ function generateInputCoreCss(scopeId, settings) {
26505
26890
  }`);
26506
26891
  cssBlocks.push(`${root} .form-input:focus-visible,
26507
26892
  ${root} .form-textarea:focus-visible,
26508
- ${root} .form-select:focus-visible {
26893
+ ${root} .form-select:focus-visible,
26894
+ ${root} ${INPUT_GROUP_FOCUS_SELECTOR} {
26509
26895
  outline: none;
26510
26896
  box-shadow: 0 0 0 ${settings.focusRingWidth}px rgb(var(--tb-${settings.focusRingToken}));
26511
26897
  border-color: rgb(var(--tb-${settings.focusRingToken}));
26512
26898
  }`);
26513
26899
  cssBlocks.push(`${root} .form-input[aria-invalid="true"],
26514
26900
  ${root} .form-textarea[aria-invalid="true"],
26515
- ${root} .form-select[aria-invalid="true"] {
26901
+ ${root} .form-select[aria-invalid="true"],
26902
+ ${root} ${INPUT_GROUP_ERROR_SELECTOR} {
26516
26903
  border-color: rgb(var(--tb-${settings.errorBorderToken}));
26517
26904
  color: rgb(var(--tb-${settings.errorTextToken}));
26518
26905
  }`);
@@ -26524,46 +26911,15 @@ ${root} .form-select:disabled {
26524
26911
  opacity: 0.6;
26525
26912
  cursor: not-allowed;
26526
26913
  }`);
26527
- cssBlocks.push(`${root} .form-checkbox {
26528
- appearance: none;
26529
- width: 1.125rem;
26530
- height: 1.125rem;
26531
- flex-shrink: 0;
26532
- border: ${borderWidth} solid rgb(var(--tb-${settings.borderToken}));
26533
- border-radius: 0.25rem;
26534
- background-color: rgb(var(--tb-${settings.backgroundToken}));
26535
- cursor: pointer;
26536
- transition: background-color 0.2s ease, border-color 0.2s ease;
26537
- }`);
26538
- cssBlocks.push(`${root} .form-radio {
26539
- appearance: none;
26540
- width: 1.125rem;
26541
- height: 1.125rem;
26542
- flex-shrink: 0;
26543
- border: ${borderWidth} solid rgb(var(--tb-${settings.borderToken}));
26544
- border-radius: 9999px;
26545
- background-color: rgb(var(--tb-${settings.backgroundToken}));
26546
- cursor: pointer;
26547
- transition: background-color 0.2s ease, border-color 0.2s ease;
26548
- }`);
26549
- cssBlocks.push(`${root} .form-checkbox:checked {
26550
- background-color: rgb(var(--tb-${settings.focusRingToken}));
26551
- border-color: rgb(var(--tb-${settings.focusRingToken}));
26552
- background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e");
26553
- background-size: 100% 100%;
26554
- background-position: center;
26555
- background-repeat: no-repeat;
26556
- }`);
26557
- cssBlocks.push(`${root} .form-radio:checked {
26558
- background-color: rgb(var(--tb-${settings.focusRingToken}));
26559
- border-color: rgb(var(--tb-${settings.focusRingToken}));
26560
- background-image: radial-gradient(circle, white 40%, transparent 40%);
26561
- }`);
26562
- cssBlocks.push(`${root} .form-checkbox:focus-visible,
26563
- ${root} .form-radio:focus-visible {
26564
- outline: none;
26565
- box-shadow: 0 0 0 ${settings.focusRingWidth}px rgb(var(--tb-${settings.focusRingToken}));
26566
- }`);
26914
+ cssBlocks.push(generateCheckableCss({
26915
+ root,
26916
+ borderWidth,
26917
+ borderColor: `rgb(var(--tb-${settings.borderToken}))`,
26918
+ background: `rgb(var(--tb-${settings.backgroundToken}))`,
26919
+ corners: settings.corners,
26920
+ accentToken: settings.focusRingToken,
26921
+ errorColor: `rgb(var(--tb-${settings.errorBorderToken}))`
26922
+ }));
26567
26923
  return cssBlocks.join("\n\n");
26568
26924
  }
26569
26925
  /**