@riverbankcms/sdk 0.104.1 → 0.104.3

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 (120) hide show
  1. package/dist/{PreviewEditorSidebar-CmaPXdKu.mjs → PreviewEditorSidebar-CBMhU9p_.mjs} +3 -3
  2. package/dist/{PreviewEditorUI-C5xRTh2b.mjs → PreviewEditorUI-C5KEw4M8.mjs} +2 -2
  3. package/dist/{SdkPreviewModeRuntime-Eks51NcN.mjs → SdkPreviewModeRuntime-Iq12HjL7.mjs} +1142 -177
  4. package/dist/{SiteChromeCustomizeContext-Bt8zb3qu.mjs → SiteChromeCustomizeContext-Cx0NMdyv.mjs} +1640 -877
  5. package/dist/_dts/ai/src/contracts/proposals.d.ts +10 -0
  6. package/dist/_dts/blocks/src/primitives/layout/Grid.d.ts +12 -8
  7. package/dist/_dts/blocks/src/system/blocks/events/event-calendar.d.ts +3 -0
  8. package/dist/_dts/blocks/src/system/blocks/events/shared/layout.d.ts +11 -1
  9. package/dist/_dts/blocks/src/system/blocks/testimonials.d.ts +7 -1
  10. package/dist/_dts/blocks/src/system/constants/events.d.ts +1 -1
  11. package/dist/_dts/blocks/src/system/fragments/library/testimonialsCarousel.d.ts +12 -0
  12. package/dist/_dts/blocks/src/system/node/validation-constants.d.ts +2 -2
  13. package/dist/_dts/blocks/src/system/runtime/nodes/basic.d.ts +14 -0
  14. package/dist/_dts/blocks/src/system/runtime/nodes/buttonAffordance.d.ts +33 -0
  15. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/WeekBoardView.d.ts +28 -0
  16. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCapacity.d.ts +32 -0
  17. package/dist/_dts/blocks/src/system/runtime/nodes/shared/contract-schemas.d.ts +1 -0
  18. package/dist/_dts/blocks/src/system/runtime/nodes/svg.d.ts +77 -0
  19. package/dist/_dts/blocks/src/system/transforms/registry/_utils/surfaceForegroundStyles.d.ts +2 -0
  20. package/dist/_dts/blocks/src/system/transforms/registry/boxStyles.d.ts +3 -40
  21. package/dist/_dts/blocks/src/system/transforms/registry/formatting.d.ts +14 -0
  22. package/dist/_dts/blocks/src/system/transforms/registry/layout.d.ts +11 -0
  23. package/dist/_dts/core/src/branded.d.ts +5 -0
  24. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +18 -0
  25. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +2 -2
  26. package/dist/_dts/sdk/src/version.d.ts +1 -1
  27. package/dist/_dts/theme-core/src/ThemeScope.d.ts +1 -1
  28. package/dist/_dts/theme-core/src/buttons/affordanceIcons.d.ts +29 -0
  29. package/dist/_dts/theme-core/src/buttons/generateButtonCss.d.ts +6 -0
  30. package/dist/_dts/theme-core/src/buttons/index.d.ts +1 -0
  31. package/dist/_dts/theme-core/src/buttons/personalities/flat-ink.d.ts +20 -0
  32. package/dist/_dts/theme-core/src/buttons/personalities/index.d.ts +11 -0
  33. package/dist/_dts/theme-core/src/buttons/personalities/types.d.ts +4 -0
  34. package/dist/_dts/theme-core/src/buttons/types.d.ts +34 -0
  35. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  36. package/dist/_dts/theme-core/src/gradients/types.d.ts +27 -3
  37. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +51 -15
  38. package/dist/_dts/theme-core/src/palette/curated/brand-led.d.ts +13 -0
  39. package/dist/_dts/theme-core/src/palette/curated/index.d.ts +12 -0
  40. package/dist/_dts/theme-core/src/palette/historicalThemePalette.d.ts +44 -0
  41. package/dist/_dts/theme-core/src/palette/index.d.ts +1 -0
  42. package/dist/_dts/theme-core/src/palette/legacySelection.d.ts +13 -2
  43. package/dist/_dts/theme-core/src/palette/persistenceReadSource.d.ts +17 -2
  44. package/dist/_dts/theme-core/src/palette/themePaletteCompatibility.d.ts +3 -4
  45. package/dist/_dts/theme-core/src/runtime/themeCssVarNames.d.ts +1 -0
  46. package/dist/_dts/theme-core/src/schema.d.ts +108 -26
  47. package/dist/_dts/theme-core/src/site-styles/accessibleSurfaces.d.ts +2 -1
  48. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +50 -1
  49. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +2 -2
  50. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +4 -2
  51. package/dist/_dts/theme-core/src/site-styles/headerLooks.d.ts +56 -1
  52. package/dist/_dts/theme-core/src/site-styles/typographyPresets.d.ts +16 -1
  53. package/dist/_dts/theme-core/src/status/index.d.ts +0 -1
  54. package/dist/_dts/theme-core/src/surfaces/foregroundContract.d.ts +19 -0
  55. package/dist/_dts/theme-core/src/surfaces/foregroundRoles.d.ts +9 -0
  56. package/dist/_dts/theme-core/src/surfaces/index.d.ts +2 -0
  57. package/dist/_dts/ui/src/button.d.ts +1 -1
  58. package/dist/cli/index.mjs +1558 -468
  59. package/dist/client/{DiscountCodeDisclosure-Dit2aItR.mjs → DiscountCodeDisclosure-BXM73_E5.mjs} +1 -1
  60. package/dist/client/{EventCombined.client-BnREyCjf.mjs → EventCombined.client-DT5elP7j.mjs} +4 -4
  61. package/dist/client/{EventListing.client-0uHld51x.mjs → EventListing.client-pTYGfV9C.mjs} +2 -2
  62. package/dist/client/{LeafletStaticMap-DJcvSfmj.mjs → LeafletStaticMap-dQrhlUe3.mjs} +1 -1
  63. package/dist/client/{MagicLinkForm-EAsIktfw.mjs → MagicLinkForm-u6Dul4j5.mjs} +2 -2
  64. package/dist/client/{StepIndicator-CRR17tYI.mjs → StepIndicator-nWqineJ2.mjs} +2 -2
  65. package/dist/client/{accordion-B47HIuuH.mjs → accordion-CSJcTUyH.mjs} +1 -1
  66. package/dist/client/{bookingForm-I1E-8F9P.mjs → bookingForm-C73wOuVa.mjs} +6 -6
  67. package/dist/client/bookings.mjs +137 -1
  68. package/dist/client/{buttons-BbPn8OKA.mjs → buttons-DfYyqt8C.mjs} +138 -2
  69. package/dist/client/{carousel-OlM7SyBs.mjs → carousel-fMBb0JSc.mjs} +1 -1
  70. package/dist/client/{cart-BKpG5jz6.mjs → cart-BtaCwT3S.mjs} +3 -3
  71. package/dist/client/{checkout-Dmmr6qoU.mjs → checkout-DkTwZSnh.mjs} +3 -3
  72. package/dist/client/client.mjs +2327 -542
  73. package/dist/client/{colorStyles-DuW4Fjqd.mjs → colorStyles-Wyl6JujD.mjs} +45 -4
  74. package/dist/client/{courseRegistration-CflZiqGk.mjs → courseRegistration-DnLmapJu.mjs} +7 -7
  75. package/dist/client/{eventCalendar-BvoLWcp-.mjs → eventCalendar-BvLOc9KY.mjs} +165 -5
  76. package/dist/client/{eventCombined-DsrO8t_t.mjs → eventCombined-kShgJPQr.mjs} +2 -2
  77. package/dist/client/{eventDetails-C3hxgcJm.mjs → eventDetails-C5NTM0Vo.mjs} +3 -3
  78. package/dist/client/{eventListing-C-hb237X.mjs → eventListing-B82ZdKP6.mjs} +2 -2
  79. package/dist/client/{eventRegistration-B0gyzDGi.mjs → eventRegistration-qJVFqBWo.mjs} +7 -7
  80. package/dist/client/{form-C_RUi6oJ.mjs → form-BvAcKiuu.mjs} +2 -2
  81. package/dist/client/{headerSection-IKQiD2U0.mjs → headerSection-NvAiEHAg.mjs} +3 -3
  82. package/dist/client/hooks.mjs +1034 -356
  83. package/dist/client/{locationMap-8ZBrMzRJ.mjs → locationMap-D0j52xfI.mjs} +3 -3
  84. package/dist/client/{media-CZJKL7fi.mjs → media-BCW_g2cQ.mjs} +1 -1
  85. package/dist/client/{newsletterForm-CYk3ucwj.mjs → newsletterForm-B8_i93qH.mjs} +2 -2
  86. package/dist/client/{pricing-B5GmvfIH.mjs → pricing-DIYnyHOk.mjs} +1 -1
  87. package/dist/client/{productDetail-BjS2Dqzo.mjs → productDetail-w0eAHkuQ.mjs} +3 -3
  88. package/dist/client/{productList-BOHvC8My.mjs → productList-Vsguq5Xt.mjs} +3 -3
  89. package/dist/client/{propsDecoder-WS6UEJwZ.mjs → propsDecoder-CD2pJ1WB.mjs} +37 -2
  90. package/dist/client/rendering/client.mjs +1722 -760
  91. package/dist/client/rendering/islands.mjs +19 -19
  92. package/dist/client/rendering.mjs +2303 -518
  93. package/dist/client/{shop-CON03-wN.mjs → shop-Dgxs-Q8F.mjs} +6 -6
  94. package/dist/client/{shop-commerce-DlqrFgH8.mjs → shop-commerce-DJAhsTaT.mjs} +6 -6
  95. package/dist/client/{shop-commerce-store-l74-Kne6.mjs → shop-commerce-store-CfCXltXW.mjs} +1 -1
  96. package/dist/client/{shopShared-CQheEXSg.mjs → shopShared-CmDcPXUt.mjs} +2 -2
  97. package/dist/client/{useDiscountCodeUi-v6OluyWl.mjs → useDiscountCodeUi-CirrT2bM.mjs} +1 -1
  98. package/dist/client/{useEventFilters-BqSTcNOf.mjs → useEventFilters-CNZxlCcO.mjs} +5 -5
  99. package/dist/client/{usePolling-DMfADjIF.mjs → usePolling-Baks_iBI.mjs} +2 -2
  100. package/dist/preview-next/client/runtime.mjs +3 -3
  101. package/dist/{sdk-runtime-BUmJ0DaT.mjs → sdk-runtime-BfNiFeNJ.mjs} +1 -1
  102. package/dist/{separator-Dd-JYok7.mjs → separator-BhAR_Xmf.mjs} +1 -1
  103. package/dist/server/components.mjs +2293 -531
  104. package/dist/server/config-validation.mjs +1040 -357
  105. package/dist/server/config.mjs +1040 -357
  106. package/dist/server/data.mjs +1034 -356
  107. package/dist/server/index.mjs +1 -1
  108. package/dist/server/next.mjs +2296 -534
  109. package/dist/server/page-converter.mjs +1018 -324
  110. package/dist/server/prebuild.mjs +1 -1
  111. package/dist/server/rendering/server.mjs +2278 -521
  112. package/dist/server/rendering.mjs +2293 -531
  113. package/dist/server/routing.mjs +1092 -338
  114. package/dist/server/server.mjs +1016 -338
  115. package/dist/server/theme-bridge.mjs +1240 -77
  116. package/dist/server/theme.mjs +165 -5
  117. package/dist/styles/index.css +617 -34
  118. package/package.json +1 -1
  119. package/dist/_dts/blocks/src/system/transforms/registry/_utils/sectionForegroundStyles.d.ts +0 -2
  120. package/dist/_dts/theme-core/src/status/contextualColors.d.ts +0 -6
@@ -8005,11 +8005,11 @@ var init_fileStorage = __esmMin((() => {
8005
8005
  var init_fileAssetLegacyProjection = __esmMin((() => {}));
8006
8006
  //#endregion
8007
8007
  //#region ../media-core/src/typeGuards.ts
8008
- function isRecord$49(value) {
8008
+ function isRecord$51(value) {
8009
8009
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
8010
8010
  }
8011
8011
  function asRecord$4(value) {
8012
- return isRecord$49(value) ? value : void 0;
8012
+ return isRecord$51(value) ? value : void 0;
8013
8013
  }
8014
8014
  var init_typeGuards$1 = __esmMin((() => {}));
8015
8015
  function isFileJsonObject(value) {
@@ -8019,7 +8019,7 @@ function isFileJsonValue(value) {
8019
8019
  if (value === null || typeof value === "string" || typeof value === "boolean") return true;
8020
8020
  if (typeof value === "number") return Number.isFinite(value);
8021
8021
  if (Array.isArray(value)) return value.every(isFileJsonValue);
8022
- return isRecord$49(value) && isFileJsonObject(value);
8022
+ return isRecord$51(value) && isFileJsonObject(value);
8023
8023
  }
8024
8024
  var init_filePersistence = __esmMin((() => {
8025
8025
  init_src$4();
@@ -8453,7 +8453,7 @@ function isCmsMediaObjectType(value) {
8453
8453
  return typeof value === "string" && CMS_MEDIA_OBJECT_TYPES.includes(value);
8454
8454
  }
8455
8455
  function isCmsMediaObject(value) {
8456
- if (!isRecord$49(value)) return false;
8456
+ if (!isRecord$51(value)) return false;
8457
8457
  const type = value.type;
8458
8458
  if (!isCmsMediaObjectType(type)) return false;
8459
8459
  if ("attrs" in value) return false;
@@ -8464,7 +8464,7 @@ function collectMediaObjects(value, out, location = "") {
8464
8464
  value.forEach((item, index) => collectMediaObjects(item, out, `${location}[${index}]`));
8465
8465
  return;
8466
8466
  }
8467
- if (!isRecord$49(value)) return;
8467
+ if (!isRecord$51(value)) return;
8468
8468
  if (isCmsMediaObject(value)) out.push({
8469
8469
  obj: value,
8470
8470
  location
@@ -8498,8 +8498,8 @@ function walkAndCollectImageAttrs(value, out, location = "") {
8498
8498
  value.forEach((item, index) => walkAndCollectImageAttrs(item, out, `${location}[${index}]`));
8499
8499
  return;
8500
8500
  }
8501
- if (!isRecord$49(value)) return;
8502
- if (value.type === "image" && isRecord$49(value.attrs)) out.push({
8501
+ if (!isRecord$51(value)) return;
8502
+ if (value.type === "image" && isRecord$51(value.attrs)) out.push({
8503
8503
  attrs: value.attrs,
8504
8504
  location: location ? `${location}.attrs` : "attrs"
8505
8505
  });
@@ -8788,6 +8788,9 @@ var init_validation_constants = __esmMin((() => {
8788
8788
  "richText",
8789
8789
  "media",
8790
8790
  "videoEmbed",
8791
+ "icon",
8792
+ "feature-card-icon",
8793
+ "svg",
8791
8794
  "button",
8792
8795
  "link",
8793
8796
  "carousel",
@@ -8817,11 +8820,13 @@ var init_validation_constants = __esmMin((() => {
8817
8820
  "value.jsonArray",
8818
8821
  "value.csv",
8819
8822
  "array.marqueeLoop",
8823
+ "value.mapToken",
8820
8824
  "layout.maxWidthClass",
8821
8825
  "layout.headerRootClass",
8822
8826
  "layout.footerRootClass",
8823
8827
  "layout.headerRootStyle",
8824
8828
  "layout.headerSectionBackground",
8829
+ "layout.classicNavMode",
8825
8830
  "layout.footerRootStyle",
8826
8831
  "ui.headerNavLinkClass",
8827
8832
  "ui.headingClassFromAlignment",
@@ -10697,7 +10702,7 @@ function getSemanticIconComponent(name) {
10697
10702
  //#endregion
10698
10703
  //#region ../blocks/src/system/icons/value.ts
10699
10704
  const NO_BLOCK_ICON_VALUE = { kind: "none" };
10700
- function isRecord$48(value) {
10705
+ function isRecord$50(value) {
10701
10706
  return typeof value === "object" && value !== null && !Array.isArray(value);
10702
10707
  }
10703
10708
  function parseBlockIconValue(value) {
@@ -10705,7 +10710,7 @@ function parseBlockIconValue(value) {
10705
10710
  kind: "semantic",
10706
10711
  iconId: value
10707
10712
  };
10708
- if (!isRecord$48(value)) return NO_BLOCK_ICON_VALUE;
10713
+ if (!isRecord$50(value)) return NO_BLOCK_ICON_VALUE;
10709
10714
  switch (value.kind) {
10710
10715
  case "none": return NO_BLOCK_ICON_VALUE;
10711
10716
  case "semantic": return isSemanticIconId(value.iconId) ? {
@@ -10778,7 +10783,7 @@ function buildGeneratedBlockIconRenderAssetLookupFromUnknown(value) {
10778
10783
  if (!Array.isArray(value)) return { kind: "invalid_asset_list" };
10779
10784
  const inputs = [];
10780
10785
  for (const [index, item] of value.entries()) {
10781
- if (!isRecord$48(item)) return {
10786
+ if (!isRecord$50(item)) return {
10782
10787
  kind: "invalid_asset_entry",
10783
10788
  index,
10784
10789
  reason: "not_object"
@@ -13195,6 +13200,246 @@ var init_all = __esmMin((() => {
13195
13200
  init_PaletteCard();
13196
13201
  }));
13197
13202
  //#endregion
13203
+ //#region ../theme-core/src/tokens/colorTokenParts.ts
13204
+ function parseOpacityPercent(source) {
13205
+ const trimmed = source.trim();
13206
+ if (!trimmed) return null;
13207
+ if (!/^\d{1,3}(?:\.\d+)?$/.test(trimmed)) return null;
13208
+ const value = Number(trimmed);
13209
+ if (!Number.isFinite(value)) return null;
13210
+ if (value < 0 || value > 100) return null;
13211
+ return value;
13212
+ }
13213
+ function parseColorTokenParts(source) {
13214
+ const trimmed = source.trim();
13215
+ if (trimmed.startsWith("raw:")) return {
13216
+ kind: "raw",
13217
+ value: trimmed.slice(4)
13218
+ };
13219
+ const [token, opacityRaw, extra] = trimmed.split("/");
13220
+ if (!token || extra !== void 0) return {
13221
+ kind: "invalid",
13222
+ token: trimmed
13223
+ };
13224
+ if (opacityRaw === void 0) return {
13225
+ kind: "token",
13226
+ token,
13227
+ opacityPercent: null
13228
+ };
13229
+ const opacityPercent = parseOpacityPercent(opacityRaw);
13230
+ if (opacityPercent === null) return {
13231
+ kind: "invalid",
13232
+ token: trimmed
13233
+ };
13234
+ return {
13235
+ kind: "token",
13236
+ token,
13237
+ opacityPercent
13238
+ };
13239
+ }
13240
+ var init_colorTokenParts = __esmMin((() => {}));
13241
+ function isBlockColorToken(value) {
13242
+ if (typeof value !== "string") return false;
13243
+ const parts = parseColorTokenParts(value);
13244
+ return parts.kind === "token" && blockColorTokenNameSet.has(parts.token);
13245
+ }
13246
+ function parseBlockColorToken(value) {
13247
+ if (!isBlockColorToken(value)) return null;
13248
+ return value.trim();
13249
+ }
13250
+ var blockColorTokenNames, blockColorTokenNameSet;
13251
+ var init_blockColorTokens = __esmMin((() => {
13252
+ init_colorTokenParts();
13253
+ blockColorTokenNames = [
13254
+ "text",
13255
+ "heading",
13256
+ "mutedText",
13257
+ "surface",
13258
+ "background",
13259
+ "foreground",
13260
+ "border",
13261
+ "primary",
13262
+ "secondary",
13263
+ "accent",
13264
+ "success",
13265
+ "warning",
13266
+ "info",
13267
+ "error",
13268
+ "destructive",
13269
+ "scrim",
13270
+ "shadow",
13271
+ "onPrimary",
13272
+ "onSecondary",
13273
+ "onAccent",
13274
+ "onSuccess",
13275
+ "onWarning",
13276
+ "onInfo",
13277
+ "onError",
13278
+ "onDestructive",
13279
+ "onSurface"
13280
+ ];
13281
+ blockColorTokenNameSet = new Set(blockColorTokenNames);
13282
+ }));
13283
+ //#endregion
13284
+ //#region ../theme-core/src/tokens/themeColorTokens.ts
13285
+ function isKnownBaseToken(value) {
13286
+ return themeColorBaseTokenSet.has(value);
13287
+ }
13288
+ function isKnownShadeToken(value) {
13289
+ const match = value.match(/^([a-zA-Z][a-zA-Z0-9]*)(?:-([0-9]{2,3}))$/);
13290
+ if (!match) return false;
13291
+ const [, base, shade] = match;
13292
+ return Boolean(base && shade && isKnownBaseToken(base) && shadeStepSet.has(shade));
13293
+ }
13294
+ function isThemeColorTokenBase(value) {
13295
+ return isKnownBaseToken(value) || isKnownShadeToken(value);
13296
+ }
13297
+ function isThemeColorToken(value) {
13298
+ if (typeof value !== "string") return false;
13299
+ const parts = parseColorTokenParts(value);
13300
+ return parts.kind === "token" && isThemeColorTokenBase(parts.token);
13301
+ }
13302
+ function parseThemeColorToken(value) {
13303
+ if (!isThemeColorToken(value)) return null;
13304
+ return value.trim();
13305
+ }
13306
+ var PALETTE_TOKEN_NAMES, paletteTokenNameSchema, themeColorBaseTokenNames, themeColorBaseTokenSet, themeColorShadeSteps, shadeStepSet, themeColorTokenSchema;
13307
+ var init_themeColorTokens = __esmMin((() => {
13308
+ init_blockColorTokens();
13309
+ init_colorTokenParts();
13310
+ PALETTE_TOKEN_NAMES = [
13311
+ "primary",
13312
+ "primaryForeground",
13313
+ "secondary",
13314
+ "accent",
13315
+ "success",
13316
+ "warning",
13317
+ "destructive",
13318
+ "background",
13319
+ "surface",
13320
+ "surfaceAlt",
13321
+ "muted",
13322
+ "text",
13323
+ "border"
13324
+ ];
13325
+ paletteTokenNameSchema = z$1.enum(PALETTE_TOKEN_NAMES);
13326
+ themeColorBaseTokenNames = [
13327
+ ...PALETTE_TOKEN_NAMES,
13328
+ ...blockColorTokenNames,
13329
+ "white",
13330
+ "neutral",
13331
+ "primaryText",
13332
+ "secondaryForeground",
13333
+ "accentForeground"
13334
+ ];
13335
+ themeColorBaseTokenSet = new Set(themeColorBaseTokenNames);
13336
+ themeColorShadeSteps = [
13337
+ "50",
13338
+ "100",
13339
+ "200",
13340
+ "300",
13341
+ "400",
13342
+ "500",
13343
+ "600",
13344
+ "700",
13345
+ "800",
13346
+ "900",
13347
+ "950"
13348
+ ];
13349
+ shadeStepSet = new Set(themeColorShadeSteps);
13350
+ themeColorTokenSchema = z$1.string().min(1).refine((value) => Boolean(isThemeColorToken(value)), "Expected a known Theme V2 color token");
13351
+ }));
13352
+ //#endregion
13353
+ //#region ../theme-core/src/palette/colors.ts
13354
+ function normalizePaletteHex(value) {
13355
+ if (!NORMALIZABLE_HEX_REGEX.test(value)) return null;
13356
+ const normalized = value.toLowerCase();
13357
+ if (normalized.length === 7) return normalized;
13358
+ const triplet = normalized.slice(1);
13359
+ const red = triplet.charAt(0);
13360
+ const green = triplet.charAt(1);
13361
+ const blue = triplet.charAt(2);
13362
+ return `#${red}${red}${green}${green}${blue}${blue}`;
13363
+ }
13364
+ function paletteColorsFromEntries(entries) {
13365
+ const values = {};
13366
+ for (const entry of entries) {
13367
+ const parsedRole = paletteTokenNameSchema.safeParse(entry.name);
13368
+ if (!parsedRole.success) return {
13369
+ ok: false,
13370
+ error: {
13371
+ kind: "unknown-role",
13372
+ role: entry.name
13373
+ }
13374
+ };
13375
+ const role = parsedRole.data;
13376
+ if (values[role] !== void 0) return {
13377
+ ok: false,
13378
+ error: {
13379
+ kind: "duplicate-role",
13380
+ role
13381
+ }
13382
+ };
13383
+ const hex = normalizePaletteHex(entry.hex);
13384
+ if (!hex) return {
13385
+ ok: false,
13386
+ error: {
13387
+ kind: "invalid-color",
13388
+ role,
13389
+ value: entry.hex
13390
+ }
13391
+ };
13392
+ values[role] = hex;
13393
+ }
13394
+ const missing = PALETTE_TOKEN_NAMES.filter((role) => values[role] === void 0);
13395
+ if (missing.length > 0) return {
13396
+ ok: false,
13397
+ error: {
13398
+ kind: "missing-roles",
13399
+ roles: missing
13400
+ }
13401
+ };
13402
+ return {
13403
+ ok: true,
13404
+ colors: paletteColorsSchema.parse(values)
13405
+ };
13406
+ }
13407
+ function requirePaletteColorsFromEntries(entries) {
13408
+ const result = paletteColorsFromEntries(entries);
13409
+ if (result.ok) return result.colors;
13410
+ throw new Error(`Invalid complete palette: ${result.error.kind}`);
13411
+ }
13412
+ var HEX_COLOR_REGEX, NORMALIZABLE_HEX_REGEX, hexColorSchema$1, paletteModeSchema, paletteColorsSchema, init_colors = __esmMin((() => {
13413
+ init_themeColorTokens();
13414
+ HEX_COLOR_REGEX = /^#[0-9a-f]{6}$/;
13415
+ NORMALIZABLE_HEX_REGEX = /^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i;
13416
+ hexColorSchema$1 = z$1.string().regex(HEX_COLOR_REGEX, "Hex must be #RRGGBB (lowercase)").transform((value) => value);
13417
+ paletteModeSchema = z$1.enum(["light", "dark"]);
13418
+ z$1.string().regex(/^[0-9a-f]{64}$/, "Palette hash must be a lowercase SHA-256 value").transform((value) => value);
13419
+ paletteColorsSchema = z$1.object({
13420
+ primary: hexColorSchema$1,
13421
+ primaryForeground: hexColorSchema$1,
13422
+ secondary: hexColorSchema$1,
13423
+ accent: hexColorSchema$1,
13424
+ success: hexColorSchema$1,
13425
+ warning: hexColorSchema$1,
13426
+ destructive: hexColorSchema$1,
13427
+ background: hexColorSchema$1,
13428
+ surface: hexColorSchema$1,
13429
+ surfaceAlt: hexColorSchema$1,
13430
+ muted: hexColorSchema$1,
13431
+ text: hexColorSchema$1,
13432
+ border: hexColorSchema$1
13433
+ }).strict().transform((value) => value);
13434
+ }));
13435
+ var init_historicalThemePalette = __esmMin((() => {
13436
+ init_themeColorTokens();
13437
+ init_colors();
13438
+ init_colorConversion();
13439
+ init_textColor();
13440
+ new Set(PALETTE_TOKEN_NAMES);
13441
+ }));
13442
+ //#endregion
13198
13443
  //#region ../theme-core/src/palette/types.ts
13199
13444
  var init_types$16 = __esmMin((() => {}));
13200
13445
  //#endregion
@@ -14321,240 +14566,6 @@ var init_browser = __esmMin((() => {
14321
14566
  var init_extractPalette = __esmMin((() => {
14322
14567
  init_browser();
14323
14568
  }));
14324
- //#endregion
14325
- //#region ../theme-core/src/tokens/colorTokenParts.ts
14326
- function parseOpacityPercent(source) {
14327
- const trimmed = source.trim();
14328
- if (!trimmed) return null;
14329
- if (!/^\d{1,3}(?:\.\d+)?$/.test(trimmed)) return null;
14330
- const value = Number(trimmed);
14331
- if (!Number.isFinite(value)) return null;
14332
- if (value < 0 || value > 100) return null;
14333
- return value;
14334
- }
14335
- function parseColorTokenParts(source) {
14336
- const trimmed = source.trim();
14337
- if (trimmed.startsWith("raw:")) return {
14338
- kind: "raw",
14339
- value: trimmed.slice(4)
14340
- };
14341
- const [token, opacityRaw, extra] = trimmed.split("/");
14342
- if (!token || extra !== void 0) return {
14343
- kind: "invalid",
14344
- token: trimmed
14345
- };
14346
- if (opacityRaw === void 0) return {
14347
- kind: "token",
14348
- token,
14349
- opacityPercent: null
14350
- };
14351
- const opacityPercent = parseOpacityPercent(opacityRaw);
14352
- if (opacityPercent === null) return {
14353
- kind: "invalid",
14354
- token: trimmed
14355
- };
14356
- return {
14357
- kind: "token",
14358
- token,
14359
- opacityPercent
14360
- };
14361
- }
14362
- var init_colorTokenParts = __esmMin((() => {}));
14363
- function isBlockColorToken(value) {
14364
- if (typeof value !== "string") return false;
14365
- const parts = parseColorTokenParts(value);
14366
- return parts.kind === "token" && blockColorTokenNameSet.has(parts.token);
14367
- }
14368
- function parseBlockColorToken(value) {
14369
- if (!isBlockColorToken(value)) return null;
14370
- return value.trim();
14371
- }
14372
- var blockColorTokenNames, blockColorTokenNameSet;
14373
- var init_blockColorTokens = __esmMin((() => {
14374
- init_colorTokenParts();
14375
- blockColorTokenNames = [
14376
- "text",
14377
- "heading",
14378
- "mutedText",
14379
- "surface",
14380
- "background",
14381
- "foreground",
14382
- "border",
14383
- "primary",
14384
- "secondary",
14385
- "accent",
14386
- "success",
14387
- "warning",
14388
- "info",
14389
- "error",
14390
- "destructive",
14391
- "scrim",
14392
- "shadow",
14393
- "onPrimary",
14394
- "onSecondary",
14395
- "onAccent",
14396
- "onSuccess",
14397
- "onWarning",
14398
- "onInfo",
14399
- "onError",
14400
- "onDestructive",
14401
- "onSurface"
14402
- ];
14403
- blockColorTokenNameSet = new Set(blockColorTokenNames);
14404
- }));
14405
- //#endregion
14406
- //#region ../theme-core/src/tokens/themeColorTokens.ts
14407
- function isKnownBaseToken(value) {
14408
- return themeColorBaseTokenSet.has(value);
14409
- }
14410
- function isKnownShadeToken(value) {
14411
- const match = value.match(/^([a-zA-Z][a-zA-Z0-9]*)(?:-([0-9]{2,3}))$/);
14412
- if (!match) return false;
14413
- const [, base, shade] = match;
14414
- return Boolean(base && shade && isKnownBaseToken(base) && shadeStepSet.has(shade));
14415
- }
14416
- function isThemeColorTokenBase(value) {
14417
- return isKnownBaseToken(value) || isKnownShadeToken(value);
14418
- }
14419
- function isThemeColorToken(value) {
14420
- if (typeof value !== "string") return false;
14421
- const parts = parseColorTokenParts(value);
14422
- return parts.kind === "token" && isThemeColorTokenBase(parts.token);
14423
- }
14424
- function parseThemeColorToken(value) {
14425
- if (!isThemeColorToken(value)) return null;
14426
- return value.trim();
14427
- }
14428
- var PALETTE_TOKEN_NAMES, paletteTokenNameSchema, themeColorBaseTokenNames, themeColorBaseTokenSet, themeColorShadeSteps, shadeStepSet, themeColorTokenSchema;
14429
- var init_themeColorTokens = __esmMin((() => {
14430
- init_blockColorTokens();
14431
- init_colorTokenParts();
14432
- PALETTE_TOKEN_NAMES = [
14433
- "primary",
14434
- "primaryForeground",
14435
- "secondary",
14436
- "accent",
14437
- "success",
14438
- "warning",
14439
- "destructive",
14440
- "background",
14441
- "surface",
14442
- "surfaceAlt",
14443
- "muted",
14444
- "text",
14445
- "border"
14446
- ];
14447
- paletteTokenNameSchema = z$1.enum(PALETTE_TOKEN_NAMES);
14448
- themeColorBaseTokenNames = [
14449
- ...PALETTE_TOKEN_NAMES,
14450
- ...blockColorTokenNames,
14451
- "white",
14452
- "neutral",
14453
- "primaryText",
14454
- "secondaryForeground",
14455
- "accentForeground"
14456
- ];
14457
- themeColorBaseTokenSet = new Set(themeColorBaseTokenNames);
14458
- themeColorShadeSteps = [
14459
- "50",
14460
- "100",
14461
- "200",
14462
- "300",
14463
- "400",
14464
- "500",
14465
- "600",
14466
- "700",
14467
- "800",
14468
- "900",
14469
- "950"
14470
- ];
14471
- shadeStepSet = new Set(themeColorShadeSteps);
14472
- themeColorTokenSchema = z$1.string().min(1).refine((value) => Boolean(isThemeColorToken(value)), "Expected a known Theme V2 color token");
14473
- }));
14474
- //#endregion
14475
- //#region ../theme-core/src/palette/colors.ts
14476
- function normalizePaletteHex(value) {
14477
- if (!NORMALIZABLE_HEX_REGEX.test(value)) return null;
14478
- const normalized = value.toLowerCase();
14479
- if (normalized.length === 7) return normalized;
14480
- const triplet = normalized.slice(1);
14481
- const red = triplet.charAt(0);
14482
- const green = triplet.charAt(1);
14483
- const blue = triplet.charAt(2);
14484
- return `#${red}${red}${green}${green}${blue}${blue}`;
14485
- }
14486
- function paletteColorsFromEntries(entries) {
14487
- const values = {};
14488
- for (const entry of entries) {
14489
- const parsedRole = paletteTokenNameSchema.safeParse(entry.name);
14490
- if (!parsedRole.success) return {
14491
- ok: false,
14492
- error: {
14493
- kind: "unknown-role",
14494
- role: entry.name
14495
- }
14496
- };
14497
- const role = parsedRole.data;
14498
- if (values[role] !== void 0) return {
14499
- ok: false,
14500
- error: {
14501
- kind: "duplicate-role",
14502
- role
14503
- }
14504
- };
14505
- const hex = normalizePaletteHex(entry.hex);
14506
- if (!hex) return {
14507
- ok: false,
14508
- error: {
14509
- kind: "invalid-color",
14510
- role,
14511
- value: entry.hex
14512
- }
14513
- };
14514
- values[role] = hex;
14515
- }
14516
- const missing = PALETTE_TOKEN_NAMES.filter((role) => values[role] === void 0);
14517
- if (missing.length > 0) return {
14518
- ok: false,
14519
- error: {
14520
- kind: "missing-roles",
14521
- roles: missing
14522
- }
14523
- };
14524
- return {
14525
- ok: true,
14526
- colors: paletteColorsSchema.parse(values)
14527
- };
14528
- }
14529
- function requirePaletteColorsFromEntries(entries) {
14530
- const result = paletteColorsFromEntries(entries);
14531
- if (result.ok) return result.colors;
14532
- throw new Error(`Invalid complete palette: ${result.error.kind}`);
14533
- }
14534
- var HEX_COLOR_REGEX, NORMALIZABLE_HEX_REGEX, hexColorSchema$1, paletteModeSchema, paletteColorsSchema;
14535
- var init_colors = __esmMin((() => {
14536
- init_themeColorTokens();
14537
- HEX_COLOR_REGEX = /^#[0-9a-f]{6}$/;
14538
- NORMALIZABLE_HEX_REGEX = /^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i;
14539
- hexColorSchema$1 = z$1.string().regex(HEX_COLOR_REGEX, "Hex must be #RRGGBB (lowercase)").transform((value) => value);
14540
- paletteModeSchema = z$1.enum(["light", "dark"]);
14541
- z$1.string().regex(/^[0-9a-f]{64}$/, "Palette hash must be a lowercase SHA-256 value").transform((value) => value);
14542
- paletteColorsSchema = z$1.object({
14543
- primary: hexColorSchema$1,
14544
- primaryForeground: hexColorSchema$1,
14545
- secondary: hexColorSchema$1,
14546
- accent: hexColorSchema$1,
14547
- success: hexColorSchema$1,
14548
- warning: hexColorSchema$1,
14549
- destructive: hexColorSchema$1,
14550
- background: hexColorSchema$1,
14551
- surface: hexColorSchema$1,
14552
- surfaceAlt: hexColorSchema$1,
14553
- muted: hexColorSchema$1,
14554
- text: hexColorSchema$1,
14555
- border: hexColorSchema$1
14556
- }).strict().transform((value) => value);
14557
- }));
14558
14569
  var init_editorState = __esmMin((() => {}));
14559
14570
  var init_libraryModel = __esmMin((() => {}));
14560
14571
  var init_themePaletteCompatibility = __esmMin((() => {
@@ -14565,6 +14576,7 @@ var init_legacySelection = __esmMin((() => {
14565
14576
  init_themeColorTokens();
14566
14577
  init_colors();
14567
14578
  init_themePaletteCompatibility();
14579
+ init_historicalThemePalette();
14568
14580
  }));
14569
14581
  //#endregion
14570
14582
  //#region ../theme-core/src/site-styles/styleTags.ts
@@ -14645,7 +14657,7 @@ var init_types$15 = __esmMin((() => {
14645
14657
  }));
14646
14658
  //#endregion
14647
14659
  //#region ../theme-core/src/palette/curated/brand-led.ts
14648
- var brandLedCool, brandLedWarm, brandLedJewel, brandLedBurgundyGold;
14660
+ var brandLedCool, brandLedWarm, brandLedJewel, brandLedSpruce, brandLedBurgundyGold;
14649
14661
  var init_brand_led = __esmMin((() => {
14650
14662
  init_types$15();
14651
14663
  brandLedCool = defineCuratedPalette({
@@ -14843,6 +14855,71 @@ var init_brand_led = __esmMin((() => {
14843
14855
  }
14844
14856
  ]
14845
14857
  });
14858
+ brandLedSpruce = defineCuratedPalette({
14859
+ id: "brand-led-spruce",
14860
+ name: "Brand-led — Spruce",
14861
+ description: "Spruce-ink primary and moss secondary with an amber accent over a green-mist ground and hairline sage borders.",
14862
+ tags: {
14863
+ tone: "classic",
14864
+ energy: "calm",
14865
+ era: "editorial"
14866
+ },
14867
+ mode: "light",
14868
+ colors: [
14869
+ {
14870
+ name: "primary",
14871
+ hex: "#14312b"
14872
+ },
14873
+ {
14874
+ name: "secondary",
14875
+ hex: "#356a59"
14876
+ },
14877
+ {
14878
+ name: "accent",
14879
+ hex: "#f08a4b"
14880
+ },
14881
+ {
14882
+ name: "success",
14883
+ hex: "#356a59"
14884
+ },
14885
+ {
14886
+ name: "warning",
14887
+ hex: "#f08a4b"
14888
+ },
14889
+ {
14890
+ name: "destructive",
14891
+ hex: "#b5561f"
14892
+ },
14893
+ {
14894
+ name: "background",
14895
+ hex: "#ecefe9"
14896
+ },
14897
+ {
14898
+ name: "surface",
14899
+ hex: "#ffffff"
14900
+ },
14901
+ {
14902
+ name: "surfaceAlt",
14903
+ hex: "#f4f6f1"
14904
+ },
14905
+ {
14906
+ name: "muted",
14907
+ hex: "#5c6a64"
14908
+ },
14909
+ {
14910
+ name: "text",
14911
+ hex: "#1c2a26"
14912
+ },
14913
+ {
14914
+ name: "primaryForeground",
14915
+ hex: "#f4f7f1"
14916
+ },
14917
+ {
14918
+ name: "border",
14919
+ hex: "#d7ddd2"
14920
+ }
14921
+ ]
14922
+ });
14846
14923
  brandLedBurgundyGold = defineCuratedPalette({
14847
14924
  id: "brand-led-burgundy-gold",
14848
14925
  name: "Brand-led — Burgundy Gold",
@@ -15795,6 +15872,7 @@ var curatedPalettes, curatedPalettesById, init_curated = __esmMin((() => {
15795
15872
  brandLedWarm,
15796
15873
  brandLedJewel,
15797
15874
  brandLedBurgundyGold,
15875
+ brandLedSpruce,
15798
15876
  warmNeutralClay,
15799
15877
  warmNeutralCream,
15800
15878
  warmNeutralSoftEarth,
@@ -15911,6 +15989,7 @@ var init_palette = __esmMin((() => {
15911
15989
  init_expandPalette();
15912
15990
  init_generateCssVars();
15913
15991
  init_generateShades();
15992
+ init_historicalThemePalette();
15914
15993
  init_neutralScale();
15915
15994
  init_types$16();
15916
15995
  init_utils$5();
@@ -16296,7 +16375,7 @@ function asSpecialVariantId(value) {
16296
16375
  if (value.length === 0) throw new Error("SpecialVariantId must be a non-empty string");
16297
16376
  return value;
16298
16377
  }
16299
- var VARIANT_ROLES, DEFAULT_VARIANT_ALIAS_ID, cornerStyleSchema, shadowSizeSchema, textTransformSchema, fontWeightSchema, buttonTypographySchema, letterSpacingSchema, hoverTransformSchema, hoverColorSchema, buttonPaddingPresetSchema, gradientStyleSchema, gradientSharpnessSchema, prioritySchema, buttonSizeNameSchema, PADDING_TOKEN_PATTERN, paddingShorthandSchema, buttonSizeConfigSchema, buttonSizesSchema, buttonGlobalSettingsSchema, gradientDirectionSchema$1, buttonBackgroundSchema, effectApplicationSchema$1, buttonBorderSchema, variantShadowSchema, variantEffectsSchema, variantSizeOverridesSchema, buttonVariantSchema, buttonSystemSchema;
16378
+ var VARIANT_ROLES, DEFAULT_VARIANT_ALIAS_ID, cornerStyleSchema, shadowSizeSchema, textTransformSchema, fontWeightSchema, buttonTypographySchema, letterSpacingSchema, hoverTransformSchema, hoverColorSchema, buttonPaddingPresetSchema, gradientStyleSchema, gradientSharpnessSchema, prioritySchema, buttonSizeNameSchema, PADDING_TOKEN_PATTERN, paddingShorthandSchema, buttonSizeConfigSchema, buttonSizesSchema, buttonGlobalSettingsSchema, gradientDirectionSchema$1, buttonBackgroundSchema, effectApplicationSchema$1, buttonBorderSchema, buttonVariantAffordanceSchema, variantShadowSchema, variantEffectsSchema, variantSizeOverridesSchema, buttonVariantSchema, buttonSystemSchema;
16300
16379
  var init_types$14 = __esmMin((() => {
16301
16380
  init_themeColorTokens();
16302
16381
  VARIANT_ROLES = [
@@ -16456,6 +16535,10 @@ var init_types$14 = __esmMin((() => {
16456
16535
  widthClass: z$1.string(),
16457
16536
  colorToken: themeColorTokenSchema
16458
16537
  });
16538
+ buttonVariantAffordanceSchema = z$1.object({
16539
+ iconId: z$1.string().min(1),
16540
+ colorToken: themeColorTokenSchema.optional()
16541
+ });
16459
16542
  variantShadowSchema = z$1.object({
16460
16543
  elevation: z$1.enum([
16461
16544
  "none",
@@ -16496,7 +16579,8 @@ var init_types$14 = __esmMin((() => {
16496
16579
  border: buttonBorderSchema.optional(),
16497
16580
  hoverBackgroundToken: z$1.string().optional(),
16498
16581
  effects: variantEffectsSchema.optional(),
16499
- sizes: variantSizeOverridesSchema.optional()
16582
+ sizes: variantSizeOverridesSchema.optional(),
16583
+ affordance: buttonVariantAffordanceSchema.optional()
16500
16584
  });
16501
16585
  buttonSystemSchema = z$1.object({
16502
16586
  global: buttonGlobalSettingsSchema,
@@ -17046,6 +17130,132 @@ var init_editorial_link = __esmMin((() => {
17046
17130
  });
17047
17131
  }));
17048
17132
  //#endregion
17133
+ //#region ../theme-core/src/buttons/personalities/flat-ink.ts
17134
+ var flatInk;
17135
+ var init_flat_ink = __esmMin((() => {
17136
+ init_types$13();
17137
+ flatInk = defineButtonPersonality({
17138
+ id: "flat-ink",
17139
+ name: "Flat Ink",
17140
+ description: "Flat solid-ink primary, hairline ghost secondary, and a single amber accent climax — modest radius, no shadow.",
17141
+ tags: {
17142
+ tone: "classic",
17143
+ energy: "calm",
17144
+ motion: "subtle",
17145
+ era: "editorial"
17146
+ },
17147
+ buttonSystem: {
17148
+ global: {
17149
+ cornerStyle: "rounded",
17150
+ shadow: "low",
17151
+ textTransform: "none",
17152
+ fontWeight: 600,
17153
+ borderWidth: 1,
17154
+ typography: "body",
17155
+ letterSpacing: "tight",
17156
+ paddingPreset: "default",
17157
+ hoverTransform: "lift",
17158
+ hoverColor: "none"
17159
+ },
17160
+ sizes: {
17161
+ sm: {
17162
+ padding: "0.625rem 1.125rem",
17163
+ fontSize: "text-sm"
17164
+ },
17165
+ md: { padding: "0.8125rem 1.375rem" },
17166
+ lg: {
17167
+ padding: "0.9375rem 1.625rem",
17168
+ fontSize: "text-lg"
17169
+ },
17170
+ xl: {
17171
+ padding: "1.0625rem 2rem",
17172
+ fontSize: "text-xl"
17173
+ }
17174
+ },
17175
+ variants: [
17176
+ {
17177
+ id: "primary",
17178
+ name: "Primary",
17179
+ enabled: true,
17180
+ priority: 1,
17181
+ background: {
17182
+ type: "solid",
17183
+ colorToken: "primary"
17184
+ },
17185
+ textColorToken: "primaryForeground",
17186
+ borderRadius: "rounded-lg",
17187
+ affordance: {
17188
+ iconId: "ArrowRight",
17189
+ colorToken: "accent"
17190
+ },
17191
+ shadow: {
17192
+ elevation: "none",
17193
+ softness: null,
17194
+ position: "bottom"
17195
+ },
17196
+ effects: { hover: [{
17197
+ effectId: "lift",
17198
+ options: { translateY: "-2px" }
17199
+ }, {
17200
+ effectId: "background-on-hover",
17201
+ options: { colorToken: "secondary" }
17202
+ }] }
17203
+ },
17204
+ {
17205
+ id: "secondary",
17206
+ name: "Secondary",
17207
+ enabled: true,
17208
+ priority: 2,
17209
+ background: { type: "transparent" },
17210
+ textColorToken: "primary",
17211
+ borderRadius: "rounded-lg",
17212
+ border: {
17213
+ widthClass: "border",
17214
+ colorToken: "border"
17215
+ },
17216
+ shadow: {
17217
+ elevation: "none",
17218
+ softness: null,
17219
+ position: "bottom"
17220
+ },
17221
+ effects: { hover: [{
17222
+ effectId: "lift",
17223
+ options: { translateY: "-2px" }
17224
+ }, {
17225
+ effectId: "background-on-hover",
17226
+ options: { colorToken: "surfaceAlt" }
17227
+ }] }
17228
+ },
17229
+ {
17230
+ id: "accent",
17231
+ name: "Accent",
17232
+ enabled: true,
17233
+ priority: 3,
17234
+ background: {
17235
+ type: "solid",
17236
+ colorToken: "accent"
17237
+ },
17238
+ textColorToken: "accentForeground",
17239
+ borderRadius: "rounded-lg",
17240
+ shadow: {
17241
+ elevation: "none",
17242
+ softness: null,
17243
+ position: "bottom"
17244
+ },
17245
+ affordance: {
17246
+ iconId: "ArrowRight",
17247
+ colorToken: "accentForeground"
17248
+ },
17249
+ effects: { hover: [{
17250
+ effectId: "lift",
17251
+ options: { translateY: "-2px" }
17252
+ }] }
17253
+ }
17254
+ ]
17255
+ }
17256
+ });
17257
+ }));
17258
+ //#endregion
17049
17259
  //#region ../theme-core/src/buttons/personalities/ink-stamp.ts
17050
17260
  var inkStamp;
17051
17261
  var init_ink_stamp = __esmMin((() => {
@@ -17818,6 +18028,7 @@ var init_personalities = __esmMin((() => {
17818
18028
  init_confident_chip();
17819
18029
  init_earth_pill();
17820
18030
  init_editorial_link();
18031
+ init_flat_ink();
17821
18032
  init_ink_stamp();
17822
18033
  init_joy_stamp();
17823
18034
  init_ornate_ritual();
@@ -17832,6 +18043,7 @@ var init_personalities = __esmMin((() => {
17832
18043
  editorialLink,
17833
18044
  pebble,
17834
18045
  inkStamp,
18046
+ flatInk,
17835
18047
  brushedWash,
17836
18048
  showtimePill,
17837
18049
  joyStamp,
@@ -18304,6 +18516,50 @@ function getCompatibleHeaderStyleIds(layoutId) {
18304
18516
  return isHeaderStyleCompatibleWithLayout(getHeaderStyleOrThrow(styleId), layoutId);
18305
18517
  });
18306
18518
  }
18519
+ function applyNavTypography(style, typography) {
18520
+ switch (typography) {
18521
+ case "plain": return style;
18522
+ case "heading": return {
18523
+ ...style,
18524
+ typography: "heading",
18525
+ fontWeight: "medium",
18526
+ letterSpacing: "wide"
18527
+ };
18528
+ case "quiet-caps": return {
18529
+ ...style,
18530
+ textTransform: "uppercase",
18531
+ textSize: "sm",
18532
+ letterSpacing: "wide"
18533
+ };
18534
+ case "brand-caps": return {
18535
+ ...style,
18536
+ textTransform: "uppercase",
18537
+ textSize: "sm",
18538
+ letterSpacing: "wider"
18539
+ };
18540
+ default: return assertNever$19(typography, "Unhandled header nav typography");
18541
+ }
18542
+ }
18543
+ function underlineNavLinkStyle(colorToken, underlineColorToken, typography = "plain") {
18544
+ return applyNavTypography({
18545
+ name: "Underline grow",
18546
+ typography: "body",
18547
+ fontWeight: "medium",
18548
+ textTransform: "none",
18549
+ italic: false,
18550
+ colorToken,
18551
+ padding: "compact",
18552
+ paddingX: "compact",
18553
+ borderRadius: "none",
18554
+ effects: { hover: [{
18555
+ effectId: "nav-underline",
18556
+ options: {
18557
+ style: "grow",
18558
+ ...underlineColorToken ? { colorToken: underlineColorToken } : {}
18559
+ }
18560
+ }] }
18561
+ }, typography);
18562
+ }
18307
18563
  function themedHeaderShadow(theme) {
18308
18564
  switch (theme.shadow.elevation) {
18309
18565
  case "none": return;
@@ -18403,6 +18659,38 @@ function cleanBaseHeader(theme) {
18403
18659
  ctaGap: "default"
18404
18660
  };
18405
18661
  }
18662
+ function classicCenteredNavHeader(theme) {
18663
+ return {
18664
+ ...baseHeader(theme),
18665
+ variant: "classic",
18666
+ navPlacement: "center",
18667
+ positioning: "sticky",
18668
+ shrinkOnScroll: false,
18669
+ background: {
18670
+ type: "color",
18671
+ color: "surface"
18672
+ },
18673
+ textColor: "text",
18674
+ navColor: "text",
18675
+ navStyle: "underline-grow",
18676
+ navWeight: "medium",
18677
+ navLinkStyle: underlineNavLinkStyle("text", "accent"),
18678
+ border: {
18679
+ style: "solid",
18680
+ width: "thin",
18681
+ position: "bottom",
18682
+ colorToken: "border"
18683
+ },
18684
+ ctaTreatment: "primary",
18685
+ ctaVariant: resolveHeaderCtaVariant(theme, "primary"),
18686
+ ctaGap: "default",
18687
+ logoText: {
18688
+ mobileMaxWidth: "sm",
18689
+ mobileWrapLines: 1,
18690
+ hideOnShrink: false
18691
+ }
18692
+ };
18693
+ }
18406
18694
  function serifLineHeader(theme) {
18407
18695
  return {
18408
18696
  ...baseHeader(theme),
@@ -18984,6 +19272,13 @@ var init_headerLooks = __esmMin((() => {
18984
19272
  styleId: asHeaderStyleId("minimal")
18985
19273
  }
18986
19274
  },
19275
+ {
19276
+ lookId: asHeaderLookId("classic-centered-nav"),
19277
+ selection: {
19278
+ layoutId: asHeaderLayoutId("classic"),
19279
+ styleId: asHeaderStyleId("fine-line")
19280
+ }
19281
+ },
18987
19282
  {
18988
19283
  lookId: asHeaderLookId("brand-solid"),
18989
19284
  selection: {
@@ -19050,6 +19345,21 @@ var init_headerLooks = __esmMin((() => {
19050
19345
  logoAccommodations: inlineClassicLogoAccommodations,
19051
19346
  compile: cleanBaseHeader
19052
19347
  },
19348
+ {
19349
+ id: asHeaderLookId("classic-centered-nav"),
19350
+ label: "Centered nav",
19351
+ visualTreatment: "solid-neutral",
19352
+ layoutBehavior: "sticky",
19353
+ configuration: {
19354
+ structure: "inline-classic",
19355
+ treatment: "solid-neutral",
19356
+ behavior: "sticky"
19357
+ },
19358
+ openingRequirement: "none",
19359
+ maxRecommendedNavItems: 6,
19360
+ logoAccommodations: inlineClassicLogoAccommodations,
19361
+ compile: classicCenteredNavHeader
19362
+ },
19053
19363
  {
19054
19364
  id: asHeaderLookId("brand-solid"),
19055
19365
  label: "Brand solid",
@@ -19618,7 +19928,7 @@ function defineTypographyPreset(preset) {
19618
19928
  function findTypographyPreset(id) {
19619
19929
  return typographyPresetsById.get(id);
19620
19930
  }
19621
- var bodyReadablePolicy, headingFlexiblePolicy, displayHeadingPolicy, modernSansTypography, warmRoundedTypography, editorialSerifTypography, classicSerifTypography, luxeContrastTypography, kirtanOrnateTypography, boldDisplayTypography, originalJoyTypography, typographyPresets, typographyPresetsById;
19931
+ var bodyReadablePolicy, headingFlexiblePolicy, displayHeadingPolicy, modernSansTypography, warmRoundedTypography, editorialSerifTypography, classicSerifTypography, luxeContrastTypography, kirtanOrnateTypography, boldDisplayTypography, originalJoyTypography, fulcrumTypography, typographyPresets, typographyPresetsById;
19622
19932
  var init_typographyPresets = __esmMin((() => {
19623
19933
  bodyReadablePolicy = {
19624
19934
  recommendedCategories: ["sans-serif", "serif"],
@@ -19980,6 +20290,49 @@ var init_typographyPresets = __esmMin((() => {
19980
20290
  },
19981
20291
  scale: "balanced"
19982
20292
  };
20293
+ fulcrumTypography = {
20294
+ body: {
20295
+ family: "IBM Plex Sans, system-ui, -apple-system, sans-serif",
20296
+ size: "lg",
20297
+ weight: "regular",
20298
+ lineHeight: "relaxed",
20299
+ letterSpacing: "normal"
20300
+ },
20301
+ headings: {
20302
+ default: {
20303
+ family: "Newsreader, Georgia, \"Times New Roman\", serif",
20304
+ weight: "medium",
20305
+ lineHeight: "normal",
20306
+ letterSpacing: "tight",
20307
+ colorToken: "primary",
20308
+ italic: null,
20309
+ case: null
20310
+ },
20311
+ h1: {
20312
+ size: "2xl",
20313
+ weight: "medium",
20314
+ lineHeight: "normal",
20315
+ letterSpacing: "tight",
20316
+ italic: null
20317
+ },
20318
+ h2: {
20319
+ size: "xl",
20320
+ weight: "medium",
20321
+ lineHeight: "normal",
20322
+ letterSpacing: "tight",
20323
+ italic: null
20324
+ },
20325
+ h3: {
20326
+ size: "md",
20327
+ weight: "semibold",
20328
+ lineHeight: "normal",
20329
+ letterSpacing: "normal",
20330
+ italic: null
20331
+ }
20332
+ },
20333
+ scale: "spacious",
20334
+ eyebrow: { family: "IBM Plex Mono, ui-monospace, \"SF Mono\", monospace" }
20335
+ };
19983
20336
  typographyPresets = [
19984
20337
  defineTypographyPreset({
19985
20338
  id: "typography-preset:modern-sans",
@@ -20239,6 +20592,32 @@ var init_typographyPresets = __esmMin((() => {
20239
20592
  }
20240
20593
  }
20241
20594
  }
20595
+ }),
20596
+ defineTypographyPreset({
20597
+ id: "typography-preset:fulcrum",
20598
+ name: "Fulcrum",
20599
+ description: "Newsreader serif headings over an IBM Plex Sans body, with an IBM Plex Mono eyebrow role for uppercase kickers and mono captions.",
20600
+ defaultFonts: {
20601
+ body: "IBM Plex Sans, system-ui, -apple-system, sans-serif",
20602
+ heading: "Newsreader, Georgia, \"Times New Roman\", serif"
20603
+ },
20604
+ recommendedFonts: {
20605
+ body: [
20606
+ "IBM Plex Sans",
20607
+ "Source Sans 3",
20608
+ "Inter"
20609
+ ],
20610
+ heading: [
20611
+ "Newsreader",
20612
+ "Source Serif 4",
20613
+ "Lora"
20614
+ ]
20615
+ },
20616
+ slotPolicies: {
20617
+ body: bodyReadablePolicy,
20618
+ heading: displayHeadingPolicy
20619
+ },
20620
+ typography: fulcrumTypography
20242
20621
  })
20243
20622
  ];
20244
20623
  typographyPresetsById = new Map(typographyPresets.map((preset) => [preset.id, preset]));
@@ -21576,9 +21955,10 @@ var init_registry$1 = __esmMin((() => {
21576
21955
  }));
21577
21956
  var init_generateEffectsCSS = __esmMin((() => {
21578
21957
  init_registry$1();
21579
- })), init_contrast = __esmMin((() => {})), init_generateDefaultButtonSystem = __esmMin((() => {
21958
+ })), init_contrast = __esmMin((() => {}));
21959
+ var init_generateDefaultButtonSystem = __esmMin((() => {
21580
21960
  init_contrast();
21581
- }));
21961
+ })), init_affordanceIcons = __esmMin((() => {})), AFFORDANCE_SUPPRESS_CLASS;
21582
21962
  var init_generateButtonCss = __esmMin((() => {
21583
21963
  init_types$14();
21584
21964
  init_classNames();
@@ -21587,6 +21967,8 @@ var init_generateButtonCss = __esmMin((() => {
21587
21967
  init_generateEffectsCSS();
21588
21968
  init_constants$2();
21589
21969
  init_generateDefaultButtonSystem();
21970
+ init_affordanceIcons();
21971
+ AFFORDANCE_SUPPRESS_CLASS = "rb-affordance-off";
21590
21972
  buttonSizeNameSchema.options;
21591
21973
  }));
21592
21974
  var init_presets = __esmMin((() => {}));
@@ -21600,6 +21982,7 @@ var init_buttons = __esmMin((() => {
21600
21982
  init_types$14();
21601
21983
  init_classNames();
21602
21984
  init_generateButtonCss();
21985
+ init_affordanceIcons();
21603
21986
  init_generateDefaultButtonSystem();
21604
21987
  init_constants$2();
21605
21988
  init_presets();
@@ -21734,13 +22117,75 @@ var cardVariantRoleValues, boxlessCardVariantValue, legacyCardVariantRoleAliases
21734
22117
  });
21735
22118
  cardSystemSchema = z$1.object({ variants: z$1.array(cardVariantSchema).min(1).max(3) });
21736
22119
  }));
21737
- var init_constants$1 = __esmMin((() => {})), init_generateDefaultCardSystem = __esmMin((() => {})), init_contextualColors = __esmMin((() => {})), init_generateCardCss = __esmMin((() => {
22120
+ var init_constants$1 = __esmMin((() => {}));
22121
+ var init_generateDefaultCardSystem = __esmMin((() => {}));
22122
+ var init_foregroundRoles = __esmMin((() => {}));
22123
+ //#endregion
22124
+ //#region ../theme-core/src/surfaces/foregroundContract.ts
22125
+ function requireSurfaceColorValue(role, value) {
22126
+ const normalized = value.trim();
22127
+ if (normalized.length === 0) throw new RangeError(`Surface foreground ${role} must be a non-empty CSS color.`);
22128
+ return normalized;
22129
+ }
22130
+ function completeSurfaceForegrounds(input) {
22131
+ const text = requireSurfaceColorValue("text", input.text);
22132
+ return {
22133
+ text,
22134
+ heading: input.heading === void 0 ? text : requireSurfaceColorValue("heading", input.heading),
22135
+ link: input.link === void 0 ? text : requireSurfaceColorValue("link", input.link),
22136
+ supporting: input.supporting === void 0 ? text : requireSurfaceColorValue("supporting", input.supporting)
22137
+ };
22138
+ }
22139
+ function surfaceForegroundValue(role, outsideProviderFallback = DEFAULT_ROLE_FALLBACKS[role]) {
22140
+ const roleVariable = SURFACE_FOREGROUND_CSS_VARS[role];
22141
+ const fallback = requireSurfaceColorValue("fallback", outsideProviderFallback);
22142
+ if (role === "text") return `var(${roleVariable}, ${fallback})`;
22143
+ return `var(${roleVariable}, var(${SURFACE_FOREGROUND_CSS_VARS.text}, ${fallback}))`;
22144
+ }
22145
+ function surfaceForegroundValueWithOpacity(role, opacityPercent) {
22146
+ if (!Number.isFinite(opacityPercent) || opacityPercent < 0 || opacityPercent > 100) throw new RangeError("Surface foreground opacity must be between 0 and 100.");
22147
+ return `color-mix(in srgb, ${surfaceForegroundValue(role)} ${opacityPercent}%, transparent)`;
22148
+ }
22149
+ function surfaceForegroundStyle(input) {
22150
+ const foregrounds = completeSurfaceForegrounds(input);
22151
+ return {
22152
+ color: foregrounds.text,
22153
+ [SURFACE_FOREGROUND_CSS_VARS.text]: foregrounds.text,
22154
+ [SURFACE_FOREGROUND_CSS_VARS.heading]: foregrounds.heading,
22155
+ [SURFACE_FOREGROUND_CSS_VARS.link]: foregrounds.link,
22156
+ [SURFACE_FOREGROUND_CSS_VARS.supporting]: foregrounds.supporting
22157
+ };
22158
+ }
22159
+ var SURFACE_FOREGROUND_CSS_VARS, DEFAULT_SURFACE_TEXT_COLOR, DEFAULT_SURFACE_LINK_COLOR, DEFAULT_SURFACE_SUPPORTING_COLOR, DEFAULT_ROLE_FALLBACKS;
22160
+ var init_foregroundContract = __esmMin((() => {
22161
+ init_foregroundRoles();
22162
+ SURFACE_FOREGROUND_CSS_VARS = {
22163
+ text: "--rb-surface-text-color",
22164
+ heading: "--rb-surface-heading-color",
22165
+ link: "--rb-surface-link-color",
22166
+ supporting: "--rb-surface-supporting-color"
22167
+ };
22168
+ DEFAULT_SURFACE_TEXT_COLOR = "rgb(var(--tb-text, 17 24 39))";
22169
+ DEFAULT_SURFACE_LINK_COLOR = "rgb(var(--tb-primary, var(--tb-text, 17 24 39)))";
22170
+ DEFAULT_SURFACE_SUPPORTING_COLOR = "rgb(var(--tb-mutedText, 100 116 139))";
22171
+ DEFAULT_ROLE_FALLBACKS = {
22172
+ text: DEFAULT_SURFACE_TEXT_COLOR,
22173
+ heading: DEFAULT_SURFACE_TEXT_COLOR,
22174
+ link: DEFAULT_SURFACE_LINK_COLOR,
22175
+ supporting: DEFAULT_SURFACE_SUPPORTING_COLOR
22176
+ };
22177
+ })), init_surfaces = __esmMin((() => {
22178
+ init_foregroundContract();
22179
+ init_foregroundRoles();
22180
+ })), init_generateCardCss = __esmMin((() => {
21738
22181
  init_resolver$1();
21739
22182
  init_constants$1();
21740
22183
  init_generateDefaultCardSystem();
21741
- init_contextualColors();
22184
+ init_surfaces();
22185
+ }));
22186
+ var init_core$1 = __esmMin((() => {
22187
+ init_surfaces();
21742
22188
  }));
21743
- var init_core$1 = __esmMin((() => {}));
21744
22189
  //#endregion
21745
22190
  //#region ../theme-core/src/cards/index.ts
21746
22191
  var init_cards = __esmMin((() => {
@@ -21975,16 +22420,22 @@ var init_types$9 = __esmMin((() => {
21975
22420
  /**
21976
22421
  * Gradient configuration types and schemas
21977
22422
  */
21978
- var gradientStopSchema, gradientConfigSchema;
22423
+ var gradientStopSchema, radialGradientShapeSchema, gradientConfigSchema;
21979
22424
  var init_types$8 = __esmMin((() => {
21980
22425
  init_themeColorTokens();
21981
22426
  gradientStopSchema = z$1.object({
21982
22427
  color: themeColorTokenSchema,
21983
22428
  position: z$1.number().min(0).max(100)
21984
22429
  });
22430
+ radialGradientShapeSchema = z$1.enum(["circle", "ellipse"]);
21985
22431
  gradientConfigSchema = z$1.object({
21986
- type: z$1.enum(["linear", "radial"]),
22432
+ type: z$1.enum([
22433
+ "linear",
22434
+ "radial",
22435
+ "conic"
22436
+ ]).default("linear"),
21987
22437
  angle: z$1.number().min(0).max(360).optional(),
22438
+ shape: radialGradientShapeSchema.optional(),
21988
22439
  position: z$1.string().optional(),
21989
22440
  stops: z$1.array(gradientStopSchema).min(2)
21990
22441
  });
@@ -22321,9 +22772,12 @@ function parseToken(source) {
22321
22772
  if (parts.kind === "invalid") return { token: source };
22322
22773
  return {
22323
22774
  token: parts.token,
22324
- alpha: parts.opacityPercent === null ? void 0 : parts.opacityPercent / 100
22775
+ opacityPercent: parts.opacityPercent === null ? void 0 : parts.opacityPercent
22325
22776
  };
22326
22777
  }
22778
+ function surfaceRoleForTextToken(token) {
22779
+ return Object.prototype.hasOwnProperty.call(SURFACE_TEXT_ROLE_BY_TOKEN, token) ? SURFACE_TEXT_ROLE_BY_TOKEN[token] : null;
22780
+ }
22327
22781
  /**
22328
22782
  * Converts a theme color token to a CSS rgb value.
22329
22783
  * This is the primary function for applying theme colors to CSS properties.
@@ -22337,11 +22791,11 @@ function parseToken(source) {
22337
22791
  * rgbColorValue('raw:transparent') // => 'transparent'
22338
22792
  */
22339
22793
  function rgbColorValue(token) {
22340
- const { token: baseToken, alpha, raw } = parseToken(token);
22794
+ const { token: baseToken, opacityPercent, raw } = parseToken(token);
22341
22795
  if (raw) return raw;
22342
22796
  const cssVar = `${COLOR_VAR_PREFIX}${baseToken}`;
22343
- if (alpha === void 0) return `rgb(var(${cssVar}))`;
22344
- return `rgb(var(${cssVar}) / ${alpha})`;
22797
+ if (opacityPercent === void 0) return `rgb(var(${cssVar}))`;
22798
+ return `rgb(var(${cssVar}) / ${opacityPercent / 100})`;
22345
22799
  }
22346
22800
  /**
22347
22801
  * Creates a backgroundColor style object from a theme token.
@@ -22359,6 +22813,9 @@ function backgroundColorStyle(token) {
22359
22813
  * @returns CSSProperties with color
22360
22814
  */
22361
22815
  function textColorStyle(token) {
22816
+ const parsed = parseToken(token);
22817
+ const surfaceRole = parsed.raw ? null : surfaceRoleForTextToken(parsed.token);
22818
+ if (surfaceRole) return { color: parsed.opacityPercent === void 0 ? surfaceForegroundValue(surfaceRole) : surfaceForegroundValueWithOpacity(surfaceRole, parsed.opacityPercent) };
22362
22819
  return { color: rgbColorValue(token) };
22363
22820
  }
22364
22821
  /**
@@ -22394,10 +22851,16 @@ function mergeStyles(...styles) {
22394
22851
  }
22395
22852
  return Object.keys(merged).length ? merged : void 0;
22396
22853
  }
22397
- var COLOR_VAR_PREFIX;
22854
+ var COLOR_VAR_PREFIX, SURFACE_TEXT_ROLE_BY_TOKEN;
22398
22855
  var init_colorStyles = __esmMin((() => {
22856
+ init_surfaces();
22399
22857
  init_colorTokenParts();
22400
22858
  COLOR_VAR_PREFIX = "--tb-";
22859
+ SURFACE_TEXT_ROLE_BY_TOKEN = {
22860
+ text: "text",
22861
+ heading: "heading",
22862
+ mutedText: "supporting"
22863
+ };
22401
22864
  }));
22402
22865
  //#endregion
22403
22866
  //#region ../theme-core/src/utils/tokenOrColor.ts
@@ -22505,7 +22968,7 @@ var init_tokenOrColor = __esmMin((() => {
22505
22968
  "white",
22506
22969
  "yellow"
22507
22970
  ]);
22508
- })), axesSchema, colourHexString, paletteColorSchema, paletteMetaSchema, paletteSchema, typographyStyleSchema, bodyTypographyStyleSchema, headingSizeSchema, headingTypographyOverridesSchema, headingTypographyStyleSchema, proseLinkUnderlineStyleSchema, proseLinkUnderlineThicknessSchema, proseLinkUnderlineOffsetSchema, proseLinkStyleSchema, semanticSpacingSchema, boxRoundedSchema, boxBackgroundOverlaySchema, boxBackgroundSchema, noHeadingDecorationSchema, visibleHeadingDecorationSchema, headingDecorationSchema, headingDecorationOverrideSchema, accordionIconTreatmentSchema, sectionStylesOverrideSchema, containerStylesOverrideSchema, cardBorderOverrideSchema, cardStylesOverrideSchema, blockStyleOverridesSchema, blockThemeOverrideSchema, typographyScaleSchema, typographySchema, spaceSchema, corners, shadow, border, motion, inputStyle, headerVariant, headerPositioning, headerNavStyle, navFontWeight, headerMaxWidth, headerContainerSchema, headerBorderSchema, logoStyleSchema, headerLogoTextSchema, navEffectsSchema, dropdownStyleSchema, headerCtaGapSchema, headerCtaTreatmentSchema, navContainerSchema, headerBackgroundSchema, headerSchema, footerVariant, footerMaxWidth, footerMode, footerNavLayoutMode, footerNavLayoutAlign, footerSpacing, footerLogoPlacement, footerLogoSize, footerLogoMaxHeight, footerBottomTextLinkStyleSchema, footerBottomBarSchema, footerNavLayoutSchema, footerLogoSchema, footerSchema, containerPaddingPresetSchema, layoutSchema, heroTypographySizeSchema, heroTypographyLineHeightSchema, heroResponsiveTypographySchema, heroTypographySchema, heroSchema, bodyTextIntroTypographySizeSchema, bodyTextSchema, gradientsSchema, testimonialQuoteTreatmentSchema, themeSchema;
22971
+ })), axesSchema, colourHexString, paletteColorSchema, paletteMetaSchema, paletteSchema, typographyStyleSchema, bodyTypographyStyleSchema, headingSizeSchema, headingTypographyOverridesSchema, headingTypographyStyleSchema, proseLinkUnderlineStyleSchema, proseLinkUnderlineThicknessSchema, proseLinkUnderlineOffsetSchema, proseLinkStyleSchema, semanticSpacingSchema, boxRoundedSchema, boxBackgroundOverlaySchema, boxBackgroundSchema, noHeadingDecorationSchema, visibleHeadingDecorationSchema, headingDecorationSchema, headingDecorationOverrideSchema, accordionIconTreatmentSchema, sectionStylesOverrideSchema, containerStylesOverrideSchema, cardBorderOverrideSchema, cardStylesOverrideSchema, blockStyleOverridesSchema, blockThemeOverrideSchema, typographyScaleSchema, eyebrowTypographyStyleSchema, typographySchema, spaceSchema, corners, shadow, border, motion, inputStyle, headerVariant, headerPositioning, headerNavStyle, navFontWeight, headerMaxWidth, headerContainerSchema, headerBorderSchema, logoStyleSchema, headerLogoTextSchema, navEffectsSchema, dropdownStyleSchema, headerCtaGapSchema, headerCtaTreatmentSchema, navContainerSchema, headerBackgroundSchema, headerSchema, footerVariant, footerMaxWidth, footerMode, footerNavLayoutMode, footerNavLayoutAlign, footerSpacing, footerLogoPlacement, footerLogoSize, footerLogoMaxHeight, footerBottomTextLinkStyleSchema, footerBottomBarSchema, footerNavLayoutSchema, footerLogoSchema, footerSchema, containerPaddingPresetSchema, layoutSchema, heroTypographySizeSchema, heroTypographyLineHeightSchema, heroResponsiveTypographySchema, heroTypographySchema, heroSchema, bodyTextIntroTypographySizeSchema, bodyTextSchema, gradientsSchema, testimonialQuoteTreatmentSchema, themeSchema;
22509
22972
  var init_schema = __esmMin((() => {
22510
22973
  init_media$2();
22511
22974
  init_buttons();
@@ -22785,6 +23248,7 @@ var init_schema = __esmMin((() => {
22785
23248
  "majorThird",
22786
23249
  "perfectFourth"
22787
23250
  ]);
23251
+ eyebrowTypographyStyleSchema = z$1.object({ family: z$1.string().min(1) });
22788
23252
  typographySchema = z$1.object({
22789
23253
  body: bodyTypographyStyleSchema,
22790
23254
  headings: z$1.object({
@@ -22797,7 +23261,8 @@ var init_schema = __esmMin((() => {
22797
23261
  h6: headingTypographyOverridesSchema.optional()
22798
23262
  }),
22799
23263
  scale: typographyScaleSchema,
22800
- proseLinkStyle: proseLinkStyleSchema.optional()
23264
+ proseLinkStyle: proseLinkStyleSchema.optional(),
23265
+ eyebrow: eyebrowTypographyStyleSchema.optional()
22801
23266
  });
22802
23267
  spaceSchema = z$1.enum([
22803
23268
  "comfortable",
@@ -22822,7 +23287,8 @@ var init_schema = __esmMin((() => {
22822
23287
  "soft",
22823
23288
  "hard"
22824
23289
  ]).nullable(),
22825
- position: z$1.enum(["bottom", "bottom-right"]).default("bottom")
23290
+ position: z$1.enum(["bottom", "bottom-right"]).default("bottom"),
23291
+ colorToken: themeColorTokenSchema.optional()
22826
23292
  });
22827
23293
  border = z$1.object({
22828
23294
  width: z$1.enum([
@@ -23063,6 +23529,7 @@ var init_schema = __esmMin((() => {
23063
23529
  navWeight: navFontWeight.default("medium"),
23064
23530
  navTypography: z$1.enum(["body", "heading"]).optional(),
23065
23531
  navTextSize: navLinkStyleSchema.shape.textSize,
23532
+ navPlacement: z$1.enum(["end", "center"]).optional(),
23066
23533
  container: headerContainerSchema,
23067
23534
  border: headerBorderSchema,
23068
23535
  shadow: componentShadowSchema.optional(),
@@ -23821,7 +24288,8 @@ var init_curatedSiteStyles = __esmMin((() => {
23821
24288
  "site-style:bold-launch",
23822
24289
  "site-style:south-west-twerk-school",
23823
24290
  "site-style:kirtan-ornate",
23824
- "site-style:original-joy"
24291
+ "site-style:original-joy",
24292
+ "site-style:fulcrum"
23825
24293
  ];
23826
24294
  quietBudget = {
23827
24295
  accentDensity: "low",
@@ -25033,6 +25501,104 @@ var init_curatedSiteStyles = __esmMin((() => {
25033
25501
  buttonChoice("showtime-pill")
25034
25502
  ],
25035
25503
  paletteRecommendations: [paletteRecommendation("warm-dark-ember")]
25504
+ }),
25505
+ defineCuratedSiteStyle({
25506
+ id: "site-style:fulcrum",
25507
+ name: "Fulcrum",
25508
+ headingDecoration: {
25509
+ family: "short-center-rule",
25510
+ colorToken: "accent"
25511
+ },
25512
+ description: "Spruce-ink and moss with an amber climax, Newsreader serif over IBM Plex Sans, hairline sage borders and flat buttons — a grounded, editorial physiotherapy skin.",
25513
+ generationBrief: "Use a calm, clinician-led voice: precise, reassuring and specific rather than clinical-cold. Lead with the assessment-treatment-rehab journey, mono uppercase eyebrows for practical labels (hours, registrations, appointment windows), Newsreader serif headings over IBM Plex Sans body, and a single amber call to action as the page climax. Keep proof concrete (registrations, same-week appointments, return-to-activity outcomes) and avoid spa or hard-sell wellness language or medical claims.",
25514
+ siteCreatorSelection: {
25515
+ kind: "site_creator_keyword_heuristic",
25516
+ priority: 28
25517
+ },
25518
+ selectionKeywordRules: [
25519
+ {
25520
+ kind: "substring",
25521
+ value: "physiotherap"
25522
+ },
25523
+ {
25524
+ kind: "word",
25525
+ value: "physio"
25526
+ },
25527
+ {
25528
+ kind: "phrase",
25529
+ value: "sports injury"
25530
+ },
25531
+ {
25532
+ kind: "phrase",
25533
+ value: "rehab clinic"
25534
+ },
25535
+ {
25536
+ kind: "substring",
25537
+ value: "musculoskeletal"
25538
+ },
25539
+ {
25540
+ kind: "phrase",
25541
+ value: "sports therapy"
25542
+ }
25543
+ ],
25544
+ tokenRecipes: {
25545
+ palette: "brand-led",
25546
+ contrast: "standard",
25547
+ radius: "rounded",
25548
+ shadow: "subtle",
25549
+ typography: "serif-editorial",
25550
+ spacing: "airy",
25551
+ motion: "subtle"
25552
+ },
25553
+ compositionBudget: quietBudget,
25554
+ typographyPresetChoices: [
25555
+ typographyChoice("typography-preset:fulcrum"),
25556
+ typographyChoice("typography-preset:editorial-serif"),
25557
+ typographyChoice("typography-preset:modern-sans")
25558
+ ],
25559
+ defaultTypographyPresetId: "typography-preset:fulcrum",
25560
+ themeOverrides: {
25561
+ shadow: { colorToken: "primary" },
25562
+ accordions: {
25563
+ background: null,
25564
+ spacing: "comfortable",
25565
+ corners: "square",
25566
+ border: null,
25567
+ shadow: null,
25568
+ icon: {
25569
+ style: "plus-minus",
25570
+ position: "right",
25571
+ size: "md",
25572
+ colorToken: "accent"
25573
+ },
25574
+ trigger: {
25575
+ textColorToken: "primary",
25576
+ fontWeight: "medium",
25577
+ fontFamily: "heading",
25578
+ fontScale: "md"
25579
+ },
25580
+ hover: { textColorToken: "secondary" },
25581
+ content: { textColorToken: "muted" }
25582
+ },
25583
+ testimonialQuote: serifDisplayQuote
25584
+ },
25585
+ recommendedHeaderLookIds: [
25586
+ "classic-centered-nav",
25587
+ "serif-line",
25588
+ "centered-calm",
25589
+ "clean-base"
25590
+ ],
25591
+ recommendedFooterLookIds: ["footer-editorial-columns", "footer-muted-grounding"],
25592
+ buttonPersonalityChoices: [
25593
+ buttonChoice("flat-ink"),
25594
+ buttonChoice("confident-chip"),
25595
+ buttonChoice("editorial-link")
25596
+ ],
25597
+ paletteRecommendations: [
25598
+ paletteRecommendation("brand-led-spruce"),
25599
+ paletteRecommendation("warm-neutral-forest"),
25600
+ paletteRecommendation("soft-natural-sage")
25601
+ ]
25036
25602
  })
25037
25603
  ];
25038
25604
  curatedSiteStylesById = new Map(curatedSiteStyles.map((style) => [style.id, style]));
@@ -27301,7 +27867,7 @@ var init_themeColorResolution = __esmMin((() => {
27301
27867
  init_tokenOrColor();
27302
27868
  }));
27303
27869
  //#endregion
27304
- //#region ../blocks/src/system/transforms/registry/_utils/sectionForegroundStyles.ts
27870
+ //#region ../blocks/src/system/transforms/registry/_utils/surfaceForegroundStyles.ts
27305
27871
  function readColorToken(input, key) {
27306
27872
  const value = input[key];
27307
27873
  return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
@@ -27310,20 +27876,20 @@ function resolveOptionalForegroundColor(value, context) {
27310
27876
  if (!value) return null;
27311
27877
  return resolveBackgroundColorValue(value, context);
27312
27878
  }
27313
- function resolveSectionForegroundStyles(value, context) {
27879
+ function resolveSurfaceForegroundStyles(value, context) {
27314
27880
  if (!value || typeof value !== "object") return {};
27315
27881
  const input = value;
27316
27882
  const resolvedText = resolveOptionalForegroundColor(readColorToken(input, "textColor"), context);
27317
27883
  if (!resolvedText) return {};
27318
- return {
27319
- color: resolvedText,
27320
- "--section-text-color": resolvedText,
27321
- "--section-heading-color": resolveOptionalForegroundColor(readColorToken(input, "headingColor"), context) ?? resolvedText,
27322
- "--section-link-color": resolveOptionalForegroundColor(readColorToken(input, "linkColor"), context) ?? resolvedText,
27323
- "--section-supporting-color": resolveOptionalForegroundColor(readColorToken(input, "supportingColor"), context) ?? resolvedText
27324
- };
27884
+ return { ...surfaceForegroundStyle({
27885
+ text: resolvedText,
27886
+ heading: resolveOptionalForegroundColor(readColorToken(input, "headingColor"), context) ?? void 0,
27887
+ link: resolveOptionalForegroundColor(readColorToken(input, "linkColor"), context) ?? void 0,
27888
+ supporting: resolveOptionalForegroundColor(readColorToken(input, "supportingColor"), context) ?? void 0
27889
+ }) };
27325
27890
  }
27326
- var init_sectionForegroundStyles = __esmMin((() => {
27891
+ var init_surfaceForegroundStyles = __esmMin((() => {
27892
+ init_surfaces();
27327
27893
  init_themeColorResolution();
27328
27894
  }));
27329
27895
  //#endregion
@@ -27355,7 +27921,7 @@ function isTileTreatment(value) {
27355
27921
  function isEventListTreatment(value) {
27356
27922
  return typeof value === "string" && eventListTreatmentSet.has(value);
27357
27923
  }
27358
- var spacingTransform, raisedTransform, roundedTransform, boxStylesCompositeTransform, cardVariantClassTransform, boxStylesBorderColorTransform, fixedFrameScopeClass, tileTreatmentClassMap, tileTreatmentSet, eventListTreatmentClassMap, eventListTreatmentSet, sectionClassNameTransform, containerStylesResolveClassName, containerStylesResolveBoxClassName, sectionTextColorStyleTransform, sectionHeadingColorStyleTransform, sectionColorsStyleTransform, GAP_CLASS_MAP, GAP_VALUE_MAP, semanticGapTransform, semanticGapValueTransform, boxStylesTransforms;
27924
+ var spacingTransform, raisedTransform, roundedTransform, boxStylesCompositeTransform, cardVariantClassTransform, boxStylesBorderColorTransform, fixedFrameScopeClass, tileTreatmentClassMap, tileTreatmentSet, eventListTreatmentClassMap, eventListTreatmentSet, sectionClassNameTransform, containerStylesResolveClassName, containerStylesResolveBoxClassName, sectionColorsStyleTransform, GAP_CLASS_MAP, GAP_VALUE_MAP, semanticGapTransform, semanticGapValueTransform, boxStylesTransforms;
27359
27925
  var init_boxStyles = __esmMin((() => {
27360
27926
  init_core();
27361
27927
  init_spacing();
@@ -27363,8 +27929,7 @@ var init_boxStyles = __esmMin((() => {
27363
27929
  init_colorStyles();
27364
27930
  init_cards();
27365
27931
  init_blockColorTokens();
27366
- init_themeColorResolution();
27367
- init_sectionForegroundStyles();
27932
+ init_surfaceForegroundStyles();
27368
27933
  spacingTransform = {
27369
27934
  id: "boxStyles.spacing",
27370
27935
  kind: "string",
@@ -27594,45 +28159,11 @@ var init_boxStyles = __esmMin((() => {
27594
28159
  }, context);
27595
28160
  }
27596
28161
  };
27597
- sectionTextColorStyleTransform = {
27598
- id: "sectionStyles.resolveTextColorStyle",
27599
- kind: "formatter",
27600
- summary: "Resolve section text color token into a style object",
27601
- run: (value, options, context) => {
27602
- const fallbackToken = options?.fallbackToken;
27603
- if (typeof value === "string" && value.trim()) {
27604
- const colorValue = resolveBackgroundColorValue(value.trim(), context);
27605
- return {
27606
- color: colorValue,
27607
- "--section-text-color": colorValue
27608
- };
27609
- }
27610
- if (typeof fallbackToken === "string" && fallbackToken.trim()) {
27611
- const colorValue = resolveBackgroundColorValue(fallbackToken.trim(), context);
27612
- return {
27613
- color: colorValue,
27614
- "--section-text-color": colorValue
27615
- };
27616
- }
27617
- return {};
27618
- }
27619
- };
27620
- sectionHeadingColorStyleTransform = {
27621
- id: "sectionStyles.resolveHeadingColorStyle",
27622
- kind: "formatter",
27623
- summary: "Resolve section heading color token into a style object",
27624
- run: (value, options, context) => {
27625
- const fallbackToken = options?.fallbackToken;
27626
- if (typeof value === "string" && value.trim()) return { "--section-heading-color": resolveBackgroundColorValue(value.trim(), context) };
27627
- if (typeof fallbackToken === "string" && fallbackToken.trim()) return { "--section-heading-color": resolveBackgroundColorValue(fallbackToken.trim(), context) };
27628
- return {};
27629
- }
27630
- };
27631
28162
  sectionColorsStyleTransform = {
27632
28163
  id: "sectionStyles.resolveColorsStyle",
27633
28164
  kind: "formatter",
27634
- summary: "Resolve section foreground colors into a style object",
27635
- run: (value, _options, context) => resolveSectionForegroundStyles(value, context)
28165
+ summary: "Resolve surface foreground colors into a style object",
28166
+ run: (value, _options, context) => resolveSurfaceForegroundStyles(value, context)
27636
28167
  };
27637
28168
  GAP_CLASS_MAP = {
27638
28169
  none: "rb-gap-semantic-none",
@@ -27680,8 +28211,6 @@ var init_boxStyles = __esmMin((() => {
27680
28211
  sectionClassNameTransform,
27681
28212
  containerStylesResolveClassName,
27682
28213
  containerStylesResolveBoxClassName,
27683
- sectionTextColorStyleTransform,
27684
- sectionHeadingColorStyleTransform,
27685
28214
  sectionColorsStyleTransform,
27686
28215
  semanticGapTransform,
27687
28216
  semanticGapValueTransform
@@ -28517,7 +29046,29 @@ var init_ctaRow = __esmMin((() => {
28517
29046
  fields: [createCtasRepeater({
28518
29047
  label: "Calls to action",
28519
29048
  itemLabel: "CTA",
28520
- maxItems: 3
29049
+ maxItems: 3,
29050
+ button: { variants: [
29051
+ {
29052
+ value: "primary",
29053
+ label: "Primary"
29054
+ },
29055
+ {
29056
+ value: "secondary",
29057
+ label: "Secondary"
29058
+ },
29059
+ {
29060
+ value: "outline",
29061
+ label: "Outline"
29062
+ },
29063
+ {
29064
+ value: "link",
29065
+ label: "Link"
29066
+ },
29067
+ {
29068
+ value: "accent",
29069
+ label: "Accent"
29070
+ }
29071
+ ] }
28521
29072
  })],
28522
29073
  layout: [ctaRow({
28523
29074
  collectionPath: "content.ctas",
@@ -28820,6 +29371,55 @@ function buildHighlightLayout() {
28820
29371
  function buildGridCardsLayout(className) {
28821
29372
  return el("div", { className }, buildResponsiveGridCards());
28822
29373
  }
29374
+ /**
29375
+ * Build a single "featured editorial" testimonial card.
29376
+ *
29377
+ * This card type deliberately renders NO avatar/headshot: an amber quote mark,
29378
+ * the quote body, then the author name and a context line. Colour + surface
29379
+ * treatment is driven entirely by `variantClass` (see testimonials.css):
29380
+ * - `rb-testimonials-fe-card--feature` → spruce-ink card (dark primary bg)
29381
+ * - `rb-testimonials-fe-card--plain` → white surface card
29382
+ *
29383
+ * Extra modifiers (`repeat`, `when`) are forwarded to the card node so the
29384
+ * caller can drive first-vs-rest branching.
29385
+ */
29386
+ function buildFeaturedEditorialCard(variantClass, ...mods) {
29387
+ const quoteMark = text({
29388
+ as: "span",
29389
+ className: "rb-testimonials-fe-qmark",
29390
+ "aria-hidden": "true"
29391
+ }, props({ value: "“" }));
29392
+ const quote = richText({ className: "rb-testimonials-fe-quote rb-max-w-none" }, bind("testimonial.content.body"), when("testimonial.content.body"));
29393
+ const meta = el("div", { className: "rb-testimonials-fe-meta" }, [text({
29394
+ as: "strong",
29395
+ className: "rb-testimonials-fe-name"
29396
+ }, bind("testimonial.content.name", { fallback: "Anonymous" })), text({
29397
+ as: "span",
29398
+ className: "rb-testimonials-fe-context"
29399
+ }, when("testimonial.content.jobTitle"), bind("testimonial.content.jobTitle"))]);
29400
+ return el("div", { className: `rb-testimonials-fe-card ${variantClass}` }, [
29401
+ quoteMark,
29402
+ quote,
29403
+ meta
29404
+ ], ...mods);
29405
+ }
29406
+ /**
29407
+ * Build the "featured editorial" layout: an asymmetric two-column arrangement
29408
+ * where the FIRST testimonial is a large featured (spruce-ink) card and the
29409
+ * remaining testimonials stack as white cards beside it.
29410
+ *
29411
+ * First-vs-rest branching is done without an offset primitive: the featured
29412
+ * card uses `repeat(..., { limit: 1 })` (entry 0 only), and the rest column
29413
+ * repeats over every entry but skips index 0 via `when("tIndex", { equals: 0,
29414
+ * not: true })`. The `$when` guard is re-evaluated per repeated item with the
29415
+ * index scope in context, so entry 0 produces no node in the rest column.
29416
+ */
29417
+ function buildFeaturedEditorialLayout() {
29418
+ return el("div", { className: "rb-testimonials-fe-grid" }, [buildFeaturedEditorialCard("rb-testimonials-fe-card--feature", repeat("data.entries", "testimonial", { limit: 1 })), el("div", { className: "rb-testimonials-fe-col" }, [buildFeaturedEditorialCard("rb-testimonials-fe-card--plain", repeat("data.entries", "testimonial", { indexName: "tIndex" }), when("tIndex", {
29419
+ equals: 0,
29420
+ not: true
29421
+ }))])]);
29422
+ }
28823
29423
  var grid$4, testimonialsCarouselFragment;
28824
29424
  var init_testimonialsCarousel = __esmMin((() => {
28825
29425
  init_types$5();
@@ -32644,7 +33244,7 @@ const defaultLayout = styledSection({
32644
33244
  children: styledContainer({
32645
33245
  baseClassName: "rb-relative rb-isolate",
32646
33246
  children: stack({
32647
- gap: "xl",
33247
+ gap: "lg",
32648
33248
  className: "rb-w-full rb-max-w-4xl rb-mx-auto"
32649
33249
  }, [headingLayout, accordionLayout])
32650
33250
  }),
@@ -32661,7 +33261,7 @@ const questionColumnsLayout = styledSection({
32661
33261
  children: styledContainer({
32662
33262
  baseClassName: "rb-relative rb-isolate",
32663
33263
  children: stack({
32664
- gap: "xl",
33264
+ gap: "lg",
32665
33265
  className: "rb-w-full"
32666
33266
  }, [headingLayout, questionColumnsAccordionLayout])
32667
33267
  }),
@@ -32826,7 +33426,26 @@ const formattingTransforms = [
32826
33426
  arrayLengthTransform,
32827
33427
  jsonArrayTransform,
32828
33428
  csvTransform,
32829
- marqueeLoopTransform
33429
+ marqueeLoopTransform,
33430
+ {
33431
+ id: "value.mapToken",
33432
+ kind: "formatter",
33433
+ summary: "Map a state/enum value to a theme token colour (rgb(var(--tb-<role>)))",
33434
+ schema: z$1.object({
33435
+ /**
33436
+ * Maps an input state/enum value (stringified) to a theme token ROLE name
33437
+ * (e.g. `secondary`, `accent`, `muted`, `border`). The role is wrapped to
33438
+ * `rgb(var(--tb-<role>))` so the result drops straight into a `style` binding.
33439
+ */
33440
+ cases: z$1.record(z$1.string(), z$1.string()),
33441
+ /** Role used when the value matches no case. Omit to yield `undefined`. */
33442
+ fallback: z$1.string().optional()
33443
+ }),
33444
+ run: (value, options) => {
33445
+ const role = options.cases[String(value)] ?? options.fallback;
33446
+ return role ? `rgb(var(--tb-${role}))` : void 0;
33447
+ }
33448
+ }
32830
33449
  ];
32831
33450
  //#endregion
32832
33451
  //#region ../blocks/src/system/transforms/registry/ui.ts
@@ -33410,6 +34029,7 @@ function splitSiteChromePlacementClasses(className) {
33410
34029
  init_colorConversion();
33411
34030
  init_core();
33412
34031
  init_colorStyles();
34032
+ init_surfaces();
33413
34033
  const joinClasses$4 = (parts) => parts.filter((part) => typeof part === "string" && part.trim().length > 0).join(" ").replace(/\s+/g, " ").trim();
33414
34034
  function resolveHeaderBrandDisplay(logo) {
33415
34035
  const display = logo?.brandDisplay ?? "logo-plus-title";
@@ -33479,6 +34099,26 @@ const headerLogoTextVisibleTransform = {
33479
34099
  return resolveHeaderBrandDisplay(asPartialObject(value)) !== "logo-only";
33480
34100
  }
33481
34101
  };
34102
+ /**
34103
+ * Selects which classic-layout nav row should render.
34104
+ *
34105
+ * - `'inline'` → classic variant with the historical logo-left / nav-right row
34106
+ * - `'centered'`→ classic variant with a centred (flex-1) nav and a right CTA
34107
+ * - `'other'` → not a classic variant (centered/floating/transparent handle it)
34108
+ *
34109
+ * Consumed by the site-header block's `$when` gates so the two classic rows are
34110
+ * mutually exclusive without introducing a new top-level header variant.
34111
+ */
34112
+ const classicNavModeTransform = {
34113
+ id: "layout.classicNavMode",
34114
+ kind: "formatter",
34115
+ summary: "Resolve which classic-layout nav row to render",
34116
+ run: (value) => {
34117
+ const header = asPartialObject(value);
34118
+ if (header?.variant !== "classic") return "other";
34119
+ return header?.navPlacement === "center" ? "centered" : "inline";
34120
+ }
34121
+ };
33482
34122
  const maxWidthClassTransform = {
33483
34123
  id: "layout.maxWidthClass",
33484
34124
  kind: "string",
@@ -33661,8 +34301,9 @@ const footerRootStyleTransform = {
33661
34301
  styleParts.push(backgroundColorStyle(token));
33662
34302
  }
33663
34303
  }
33664
- if (visuals.textColorOverride) styleParts.push({ color: visuals.textColorOverride });
33665
- else if (visuals.textColorToken) styleParts.push(textColorStyle(visuals.textColorToken));
34304
+ const foreground = visuals.textColorOverride ?? (visuals.textColorToken ? rgbColorValue(visuals.textColorToken) : null);
34305
+ if (!visuals.isTransparent && foreground) styleParts.push(surfaceForegroundStyle({ text: foreground }));
34306
+ else if (foreground) styleParts.push({ color: foreground });
33666
34307
  styleParts.push(borderColorStyle("border"));
33667
34308
  return mergeStyles(...styleParts);
33668
34309
  }
@@ -33748,18 +34389,16 @@ const footerBottomBarStyleTransform = {
33748
34389
  const styleParts = [];
33749
34390
  const background = bottomBar?.background;
33750
34391
  if (background?.type === "color") styleParts.push(backgroundColorStyle(background.color ?? "surface"));
33751
- if (bottomBar?.textColor) styleParts.push(textColorStyle(bottomBar.textColor));
33752
34392
  const borderColorToken = bottomBar?.borderTop?.colorToken;
33753
34393
  if (borderColorToken) styleParts.push(borderColorStyle(borderColorToken));
33754
34394
  else styleParts.push(borderColorStyle("border"));
33755
34395
  const borderWidth = bottomBar?.borderTop?.width;
33756
34396
  if (borderWidth && borderWidth !== "none") styleParts.push({ borderTopWidth: borderWidth === "thin" ? "1px" : borderWidth === "medium" ? "2px" : "3px" });
33757
34397
  else if (borderWidth === "none") styleParts.push({ borderTopWidth: "0px" });
33758
- if (!bottomBar?.textColor) {
33759
- const visuals = resolveBackgroundVisualStyles(extractBackgroundColorToken(background, "surface"), context.theme);
33760
- if (visuals.textColorOverride) styleParts.push({ color: visuals.textColorOverride });
33761
- else if (visuals.textColorToken) styleParts.push(textColorStyle(visuals.textColorToken));
33762
- }
34398
+ const visuals = resolveBackgroundVisualStyles(extractBackgroundColorToken(background, "surface"), context.theme);
34399
+ const foreground = bottomBar?.textColor ? rgbColorValue(bottomBar.textColor) : visuals.textColorOverride ?? (visuals.textColorToken ? rgbColorValue(visuals.textColorToken) : null);
34400
+ if (background?.type === "color" && foreground) styleParts.push(surfaceForegroundStyle({ text: foreground }));
34401
+ else if (foreground && bottomBar?.textColor) styleParts.push({ color: foreground });
33763
34402
  return mergeStyles(...styleParts);
33764
34403
  }
33765
34404
  };
@@ -33894,6 +34533,7 @@ const layoutTransforms = [
33894
34533
  headerLogoClassTransform,
33895
34534
  headerLogoMediaClassTransform,
33896
34535
  headerLogoTextVisibleTransform,
34536
+ classicNavModeTransform,
33897
34537
  footerRootClassTransform,
33898
34538
  headerRootStyleTransform,
33899
34539
  headerSectionBackgroundTransform,
@@ -34330,7 +34970,18 @@ const classicLayout = inline({
34330
34970
  logoRow,
34331
34971
  createNavRow(`rb-ml-auto ${desktopOnlyDisplay("flex")} rb-gap-6`),
34332
34972
  headerCta
34333
- ], when("$root.theme.header.variant", { equals: "classic" }));
34973
+ ], whenTransformed$1("$root.theme.header", "layout.classicNavMode", "inline"));
34974
+ const classicCenteredNavLayout = inline({
34975
+ className: bindProp("$root.theme.header.maxWidth", {
34976
+ transforms: pipe(tx("layout.maxWidthClass", { base: `rb-header-layout ${desktopOnlyDisplay("flex")} rb-w-full rb-items-center rb-gap-6` })),
34977
+ fallback: `rb-container rb-header-layout ${desktopOnlyDisplay("flex")} rb-w-full rb-items-center rb-gap-6`
34978
+ }),
34979
+ align: "center"
34980
+ }, [
34981
+ logoRow,
34982
+ createNavRow(`rb-flex-1 rb-justify-center ${desktopOnlyDisplay("flex")} rb-gap-6`, "center"),
34983
+ headerCta
34984
+ ], whenTransformed$1("$root.theme.header", "layout.classicNavMode", "centered"));
34334
34985
  const centeredLayout = stack({
34335
34986
  gap: "md",
34336
34987
  align: "center",
@@ -34405,6 +35056,7 @@ const siteHeaderBlockDefinition = { manifest: createBlockManifest({
34405
35056
  }, [
34406
35057
  mobileHeaderBar,
34407
35058
  classicLayout,
35059
+ classicCenteredNavLayout,
34408
35060
  centeredLayout,
34409
35061
  transparentLayout,
34410
35062
  floatingLayout,
@@ -34452,6 +35104,7 @@ init_builder$1();
34452
35104
  init_fragments();
34453
35105
  init_defineBlock();
34454
35106
  init_colorStyles();
35107
+ init_surfaces();
34455
35108
  const footerTextLayout = () => materializeFragment({ fragment: footerBottomTextFragment }).layout;
34456
35109
  const whenTransformed = (from, transformId, equals = true) => (node) => ({
34457
35110
  ...node,
@@ -34621,7 +35274,7 @@ const footerLayout = section$1({
34621
35274
  style: { $bind: {
34622
35275
  from: "$root.theme.footer",
34623
35276
  transforms: [{ id: "layout.footerRootStyle" }],
34624
- fallback: mergeStyles(backgroundColorStyle("surface"), textColorStyle("text"), borderColorStyle("border"))
35277
+ fallback: mergeStyles(backgroundColorStyle("surface"), surfaceForegroundStyle({ text: "rgb(var(--tb-text))" }), borderColorStyle("border"))
34625
35278
  } }
34626
35279
  }, [
34627
35280
  simpleFooterLayout,
@@ -34683,7 +35336,7 @@ const backgroundImageClassName = "rb-absolute rb-inset-0 rb-z-neg-10 rb-h-full r
34683
35336
  */
34684
35337
  const wrapVariant$2 = (variantLayout) => styledSection({
34685
35338
  children: styledContainer({ children: stack({
34686
- gap: "xl",
35339
+ gap: "lg",
34687
35340
  className: "rb-relative"
34688
35341
  }, [...testimonialsHeadingFragment.layout, variantLayout]) }),
34689
35342
  baseClass: "",
@@ -34709,6 +35362,27 @@ const splitGridLayout = styledSection({
34709
35362
  spacing: "comfortable",
34710
35363
  imageClassName: backgroundImageClassName
34711
35364
  });
35365
+ const featuredEditorialHead = el("div", { className: "rb-testimonials-fe-head" }, [text({
35366
+ as: "h2",
35367
+ className: "rb-text-left",
35368
+ headingDecoration: "off"
35369
+ }, when("content.heading"), bind("content.heading")), el("div", { className: "rb-testimonials-fe-leadin" }, [text({
35370
+ as: "p",
35371
+ className: "rb-prose",
35372
+ style: textColorStyle("mutedText")
35373
+ }, when("content.subheading"), bind("content.subheading"))])]);
35374
+ const featuredEditorialLayout = styledSection({
35375
+ children: styledContainer({
35376
+ baseClassName: "rb-relative rb-isolate",
35377
+ children: stack({
35378
+ gap: "lg",
35379
+ className: "rb-relative"
35380
+ }, [featuredEditorialHead, buildFeaturedEditorialLayout()])
35381
+ }),
35382
+ baseClass: "",
35383
+ spacing: "comfortable",
35384
+ imageClassName: backgroundImageClassName
35385
+ });
34712
35386
  const additionalFields = parseFieldDefinitions([
34713
35387
  ...testimonialsHeadingFragment.fields,
34714
35388
  {
@@ -34796,6 +35470,7 @@ const testimonialsBlockDefinition = {
34796
35470
  carousel: carouselLayout$1,
34797
35471
  grid: gridLayout$1,
34798
35472
  "split-grid": splitGridLayout,
35473
+ "featured-editorial": featuredEditorialLayout,
34799
35474
  highlight: highlightLayout
34800
35475
  },
34801
35476
  defaultVariant: "carousel",
@@ -34815,6 +35490,11 @@ const testimonialsBlockDefinition = {
34815
35490
  description: "Heading on the left with testimonial cards on the right",
34816
35491
  icon: "PanelLeft"
34817
35492
  },
35493
+ "featured-editorial": {
35494
+ label: "Featured editorial",
35495
+ description: "A large featured ink quote beside a column of stacked cards (no avatars)",
35496
+ icon: "Quote"
35497
+ },
34818
35498
  highlight: {
34819
35499
  label: "Highlight",
34820
35500
  description: "A single, centered testimonial with no carousel",
@@ -35358,7 +36038,7 @@ function grid$2(props, children) {
35358
36038
  const cardsLayout = styledSection({
35359
36039
  children: styledContainer({
35360
36040
  rootType: "stack",
35361
- rootProps: { gap: "xl" },
36041
+ rootProps: { gap: "lg" },
35362
36042
  children: [stack({
35363
36043
  gap: "sm",
35364
36044
  className: "rb-feature-cards-heading rb-mx-auto rb-max-w-3xl rb-text-center"
@@ -37310,8 +37990,11 @@ var init_filtering = __esmMin((() => {
37310
37990
  }));
37311
37991
  //#endregion
37312
37992
  //#region ../blocks/src/system/blocks/events/shared/layout.ts
37313
- function eventSectionHeaderLayoutNodes() {
37314
- return [text({ as: "h2" }, bind("content.heading"), when("content.heading", { authoringPresence: recoverEmptyHeadingWhenActive })), richText({ className: "rb-prose rb-max-w-none" }, bind("content.description"), when("content.description", { authoringPresence: recoverEmptyDescriptionWhenActive }))];
37993
+ function eventSectionHeaderLayoutNodes(options = {}) {
37994
+ const headingNode = text({ as: "h2" }, bind("content.heading"), when("content.heading", { authoringPresence: recoverEmptyHeadingWhenActive }));
37995
+ const descriptionNode = richText({ className: "rb-prose rb-max-w-none" }, bind("content.description"), when("content.description", { authoringPresence: recoverEmptyDescriptionWhenActive }));
37996
+ if (options.splitClassName) return [el("div", { className: options.splitClassName }, [headingNode, descriptionNode])];
37997
+ return [headingNode, descriptionNode];
37315
37998
  }
37316
37999
  var recoverEmptyHeadingWhenActive, recoverEmptyDescriptionWhenActive;
37317
38000
  var init_layout = __esmMin((() => {
@@ -37403,7 +38086,8 @@ var init_events$1 = __esmMin((() => {
37403
38086
  "combined",
37404
38087
  "calendar",
37405
38088
  "list",
37406
- "timetable"
38089
+ "timetable",
38090
+ "week-board"
37407
38091
  ];
37408
38092
  eventCalendarDefaultViewValues = ["month", "week"];
37409
38093
  eventCalendarListLayoutValues = [
@@ -40017,6 +40701,40 @@ function getEventAvailability(event) {
40017
40701
  isFull: false
40018
40702
  };
40019
40703
  }
40704
+ /**
40705
+ * Derive the three-state availability status (available / filling / waitlist)
40706
+ * plus a short pill label. Builds on {@link getEventAvailability} so the
40707
+ * capacity math (availableSpots with a `capacity - registeredCount` fallback)
40708
+ * stays consistent with the binary helper used elsewhere.
40709
+ */
40710
+ function getEventAvailabilityStatus(event, options) {
40711
+ const threshold = options?.fillingThreshold ?? 2;
40712
+ const { available, isFull } = getEventAvailability(event);
40713
+ if (available == null) return {
40714
+ status: "available",
40715
+ available: null,
40716
+ isFull: false,
40717
+ label: null
40718
+ };
40719
+ if (isFull) return {
40720
+ status: "waitlist",
40721
+ available: 0,
40722
+ isFull: true,
40723
+ label: event.waitlistEnabled ? "Waitlist" : "Full"
40724
+ };
40725
+ if (available <= threshold) return {
40726
+ status: "filling",
40727
+ available,
40728
+ isFull: false,
40729
+ label: `${available} left`
40730
+ };
40731
+ return {
40732
+ status: "available",
40733
+ available,
40734
+ isFull: false,
40735
+ label: `${available} places`
40736
+ };
40737
+ }
40020
40738
  var init_eventCapacity = __esmMin((() => {}));
40021
40739
  //#endregion
40022
40740
  //#region ../blocks/src/system/runtime/nodes/events/shared/utils.ts
@@ -42662,7 +43380,7 @@ const eventCalendarLayout = [styledSection({
42662
43380
  children: styledContainer({
42663
43381
  rootType: "stack",
42664
43382
  rootProps: { gap: "lg" },
42665
- children: [...eventSectionHeaderLayoutNodes(), el("event-calendar", withApiBindings({
43383
+ children: [...eventSectionHeaderLayoutNodes({ splitClassName: "event-section-head event-section-head--split" }), el("event-calendar", withApiBindings({
42666
43384
  events: { $bind: { from: "data.events" } },
42667
43385
  stage: { $bind: {
42668
43386
  from: "$root.previewStage",
@@ -42773,6 +43491,10 @@ const eventCalendarAdditionalFields = [
42773
43491
  value: "timetable",
42774
43492
  label: "Timetable"
42775
43493
  },
43494
+ {
43495
+ value: "week-board",
43496
+ label: "Week board"
43497
+ },
42776
43498
  {
42777
43499
  value: "list",
42778
43500
  label: "List"
@@ -42955,7 +43677,8 @@ const eventCalendarAdditionalFields = [
42955
43677
  oneOf: [
42956
43678
  "combined",
42957
43679
  "calendar",
42958
- "timetable"
43680
+ "timetable",
43681
+ "week-board"
42959
43682
  ]
42960
43683
  }
42961
43684
  }
@@ -43058,7 +43781,8 @@ const eventCalendarAdditionalFields = [
43058
43781
  "combined",
43059
43782
  "calendar",
43060
43783
  "list",
43061
- "timetable"
43784
+ "timetable",
43785
+ "week-board"
43062
43786
  ]
43063
43787
  }
43064
43788
  }
@@ -43093,7 +43817,8 @@ const eventCalendarAdditionalFields = [
43093
43817
  "combined",
43094
43818
  "calendar",
43095
43819
  "list",
43096
- "timetable"
43820
+ "timetable",
43821
+ "week-board"
43097
43822
  ]
43098
43823
  }, {
43099
43824
  field: "showFilters",
@@ -43116,7 +43841,8 @@ const eventCalendarAdditionalFields = [
43116
43841
  "combined",
43117
43842
  "calendar",
43118
43843
  "list",
43119
- "timetable"
43844
+ "timetable",
43845
+ "week-board"
43120
43846
  ]
43121
43847
  }, {
43122
43848
  field: "showFilters",
@@ -43139,7 +43865,8 @@ const eventCalendarAdditionalFields = [
43139
43865
  "combined",
43140
43866
  "calendar",
43141
43867
  "list",
43142
- "timetable"
43868
+ "timetable",
43869
+ "week-board"
43143
43870
  ]
43144
43871
  }, {
43145
43872
  field: "showFilters",
@@ -43161,7 +43888,8 @@ const eventCalendarAdditionalFields = [
43161
43888
  oneOf: [
43162
43889
  "combined",
43163
43890
  "list",
43164
- "timetable"
43891
+ "timetable",
43892
+ "week-board"
43165
43893
  ]
43166
43894
  }, { allOf: [{
43167
43895
  field: "variant",
@@ -43337,6 +44065,7 @@ const eventCalendarVariants = {
43337
44065
  combined: eventCalendarLayout[0],
43338
44066
  calendar: eventCalendarLayout[0],
43339
44067
  timetable: eventCalendarLayout[0],
44068
+ "week-board": eventCalendarLayout[0],
43340
44069
  list: eventCalendarLayout[0]
43341
44070
  };
43342
44071
  const eventCalendarContentShape = {
@@ -43350,6 +44079,7 @@ const eventCalendarContentShape = {
43350
44079
  { value: "combined" },
43351
44080
  { value: "calendar" },
43352
44081
  { value: "timetable" },
44082
+ { value: "week-board" },
43353
44083
  { value: "list" }
43354
44084
  ]
43355
44085
  },
@@ -43416,6 +44146,7 @@ const eventCalendarBlockDefinition = {
43416
44146
  combined: { label: "Combined" },
43417
44147
  calendar: { label: "Calendar" },
43418
44148
  timetable: { label: "Timetable" },
44149
+ "week-board": { label: "Week board" },
43419
44150
  list: { label: "List" }
43420
44151
  }
43421
44152
  }, eventCalendarContentShape),
@@ -49265,6 +49996,12 @@ const systemBlockDefinitions = [
49265
49996
  family: "centered",
49266
49997
  weight: "featured",
49267
49998
  bias: "soft"
49999
+ }),
50000
+ layoutProfile({
50001
+ variantKey: "featured-editorial",
50002
+ family: "split",
50003
+ weight: "featured",
50004
+ bias: "soft"
49268
50005
  })
49269
50006
  ]
49270
50007
  })),
@@ -49397,6 +50134,11 @@ const systemBlockDefinitions = [
49397
50134
  variantKey: "timetable",
49398
50135
  family: "stack",
49399
50136
  weight: "standard"
50137
+ }),
50138
+ layoutProfile({
50139
+ variantKey: "week-board",
50140
+ family: "stack",
50141
+ weight: "standard"
49400
50142
  })
49401
50143
  ]
49402
50144
  })),
@@ -49761,7 +50503,15 @@ function gradientToCss(config, tokens) {
49761
50503
  const stops = config.stops.map((stop) => {
49762
50504
  return `${tokens[stop.color] ?? "#000000"} ${stop.position}%`;
49763
50505
  }).join(", ");
49764
- if (config.type === "radial") return `radial-gradient(circle at ${config.position ?? "center"}, ${stops})`;
50506
+ const type = config.type ?? "linear";
50507
+ if (type === "radial") {
50508
+ const position = config.position ?? "center";
50509
+ return `radial-gradient(${config.shape ?? "circle"} at ${position}, ${stops})`;
50510
+ }
50511
+ if (type === "conic") {
50512
+ const position = config.position ?? "center";
50513
+ return `conic-gradient(from ${config.angle ?? 0}deg at ${position}, ${stops})`;
50514
+ }
49765
50515
  return `linear-gradient(${config.angle ?? 180}deg, ${stops})`;
49766
50516
  }
49767
50517
  //#endregion
@@ -49790,7 +50540,7 @@ function backgroundVideoMobileClassNames(input) {
49790
50540
  //#region ../blocks/src/system/transforms/registry/background.ts
49791
50541
  init_background$1();
49792
50542
  init_themeColorResolution();
49793
- init_sectionForegroundStyles();
50543
+ init_surfaceForegroundStyles();
49794
50544
  init_media();
49795
50545
  const isString$2 = (value) => typeof value === "string" && value.trim().length > 0;
49796
50546
  const isNumber$2 = (value) => typeof value === "number" && !isNaN(value);
@@ -49847,8 +50597,8 @@ const backgroundTransforms = [
49847
50597
  {
49848
50598
  id: "background.resolveColorsStyle",
49849
50599
  kind: "formatter",
49850
- summary: "Resolve section foreground colors from a background object into scoped CSS vars",
49851
- run: (value, _options, context) => resolveSectionForegroundStyles(value, context)
50600
+ summary: "Resolve surface foreground colors from a background object into scoped CSS vars",
50601
+ run: (value, _options, context) => resolveSurfaceForegroundStyles(value, context)
49852
50602
  },
49853
50603
  {
49854
50604
  id: "background.resolveAllowOverflow",
@@ -50345,21 +51095,53 @@ function Inline({ as: Comp = "div", gap = "md", align = "center", justify = "sta
50345
51095
  //#endregion
50346
51096
  //#region ../blocks/src/primitives/layout/Grid.tsx
50347
51097
  init_clsx();
51098
+ /** Utility class for a numeric column COUNT at a given breakpoint. */
51099
+ const COL_COUNT_CLASS = {
51100
+ base: (n) => `rb-grid-cols-${n}`,
51101
+ sm: (n) => `rb-sm-grid-cols-${n}`,
51102
+ md: (n) => `rb-md-grid-cols-${n}`,
51103
+ lg: (n) => `rb-lg-grid-cols-${n}`,
51104
+ xl: (n) => `rb-xl-grid-cols-${n}`
51105
+ };
51106
+ /** Inline custom property read by the `.rb-grid-tracks` utility per breakpoint. */
51107
+ const TRACK_VAR = {
51108
+ base: "--rb-gtc-base",
51109
+ sm: "--rb-gtc-sm",
51110
+ md: "--rb-gtc-md",
51111
+ lg: "--rb-gtc-lg",
51112
+ xl: "--rb-gtc-xl"
51113
+ };
51114
+ const GRID_BREAKPOINTS = [
51115
+ "base",
51116
+ "sm",
51117
+ "md",
51118
+ "lg",
51119
+ "xl"
51120
+ ];
50348
51121
  function Grid({ as: Comp = "div", cols = {
50349
51122
  base: 1,
50350
51123
  md: 2
50351
- }, gap = "md", className, children, "data-slot": dataSlot, ...rest }) {
50352
- const colsObj = typeof cols === "number" ? { base: cols } : cols;
50353
- const colClasses = [
50354
- colsObj.base && `rb-grid-cols-${colsObj.base}`,
50355
- colsObj.sm && `rb-sm-grid-cols-${colsObj.sm}`,
50356
- colsObj.md && `rb-md-grid-cols-${colsObj.md}`,
50357
- colsObj.lg && `rb-lg-grid-cols-${colsObj.lg}`,
50358
- colsObj.xl && `rb-xl-grid-cols-${colsObj.xl}`
50359
- ];
51124
+ }, gap = "md", className, style, children, "data-slot": dataSlot, ...rest }) {
51125
+ const colsObj = typeof cols === "number" || typeof cols === "string" ? { base: cols } : cols;
51126
+ const colClasses = [];
51127
+ const trackVars = {};
51128
+ let hasTracks = false;
51129
+ for (const bp of GRID_BREAKPOINTS) {
51130
+ const value = colsObj[bp];
51131
+ if (value == null) continue;
51132
+ if (typeof value === "string") {
51133
+ trackVars[TRACK_VAR[bp]] = value;
51134
+ hasTracks = true;
51135
+ } else colClasses.push(COL_COUNT_CLASS[bp](value));
51136
+ }
51137
+ const mergedStyle = hasTracks ? {
51138
+ ...trackVars,
51139
+ ...style
51140
+ } : style;
50360
51141
  return /* @__PURE__ */ jsx(Comp, {
50361
51142
  ...rest,
50362
- className: clsx("rb-grid", colClasses, {
51143
+ style: mergedStyle,
51144
+ className: clsx("rb-grid", hasTracks && "rb-grid-tracks", colClasses, {
50363
51145
  "rb-gap-0": gap === "none",
50364
51146
  "rb-gap-1": gap === "xs",
50365
51147
  "rb-gap-2": gap === "sm",
@@ -50605,6 +51387,138 @@ function Text$2({ as: Comp = "span", children, className = "", path, maxLength:
50605
51387
  });
50606
51388
  }
50607
51389
  //#endregion
51390
+ //#region ../blocks/src/system/icons/cta.ts
51391
+ init_svg();
51392
+ /**
51393
+ * Curated icon set for CTA/button icons.
51394
+ *
51395
+ * Guardrail: keep this list small and action-oriented. This is intentionally not the full Lucide set.
51396
+ * Extend by adding to CTA_ICON_NAMES and the mapping below (explicit imports only).
51397
+ */
51398
+ const CTA_ICON_NAMES = [
51399
+ "ArrowRight",
51400
+ "ArrowLeft",
51401
+ "ChevronRight",
51402
+ "ChevronLeft",
51403
+ "ChevronUp",
51404
+ "ChevronDown",
51405
+ "ExternalLink",
51406
+ "Download",
51407
+ "Upload",
51408
+ "Mail",
51409
+ "Phone",
51410
+ "Play",
51411
+ "ShoppingCart",
51412
+ "Calendar",
51413
+ "MapPin",
51414
+ "Info",
51415
+ "Plus",
51416
+ "Minus",
51417
+ "Check",
51418
+ "X"
51419
+ ];
51420
+ const CTA_ICON_COMPONENTS = {
51421
+ ArrowRight: ArrowRightIcon,
51422
+ ArrowLeft: ArrowLeftIcon,
51423
+ ChevronRight: ChevronRightIcon,
51424
+ ChevronLeft: ChevronLeftIcon,
51425
+ ChevronUp: ChevronUpIcon,
51426
+ ChevronDown: ChevronDownIcon,
51427
+ ExternalLink: ExternalLinkIcon,
51428
+ Download: DownloadIcon,
51429
+ Upload: UploadIcon,
51430
+ Mail: MailIcon,
51431
+ Phone: PhoneIcon,
51432
+ Play: PlayIcon,
51433
+ ShoppingCart: ShoppingCartIcon,
51434
+ Calendar: CalendarIcon$1,
51435
+ MapPin: MapPinIcon$1,
51436
+ Info: InfoIcon,
51437
+ Plus: PlusIcon,
51438
+ Minus: MinusIcon,
51439
+ Check: CheckIcon$1,
51440
+ X: XIcon
51441
+ };
51442
+ function isCtaIconName(value) {
51443
+ return typeof value === "string" && CTA_ICON_NAMES.includes(value);
51444
+ }
51445
+ function formatLucideName(name) {
51446
+ return name.replace(/([a-z0-9])([A-Z])/g, "$1 $2");
51447
+ }
51448
+ const CTA_ICON_OPTIONS = CTA_ICON_NAMES.map((id) => ({
51449
+ id,
51450
+ label: formatLucideName(id)
51451
+ }));
51452
+ function getCtaIconComponent(name) {
51453
+ if (!isCtaIconName(name)) return null;
51454
+ return CTA_ICON_COMPONENTS[name] ?? null;
51455
+ }
51456
+ //#endregion
51457
+ //#region ../blocks/src/system/icons/registry.ts
51458
+ init_presets$1();
51459
+ function buildSearchText(parts) {
51460
+ return parts.map((part) => part.trim()).filter(Boolean).join(" ");
51461
+ }
51462
+ function semanticDefinitionToOption(definition, preset) {
51463
+ return {
51464
+ id: definition.id,
51465
+ label: definition.label,
51466
+ searchText: buildSearchText([
51467
+ definition.label,
51468
+ definition.id,
51469
+ ...definition.tags,
51470
+ ...definition.domains,
51471
+ ...definition.tone
51472
+ ]),
51473
+ preset
51474
+ };
51475
+ }
51476
+ CTA_ICON_OPTIONS.map((option) => ({
51477
+ id: option.id,
51478
+ label: option.label,
51479
+ searchText: buildSearchText([option.label, option.id]),
51480
+ preset: "cta"
51481
+ }));
51482
+ function semanticOptionsForPreset(preset) {
51483
+ return SEMANTIC_ICON_DEFINITIONS.filter((definition) => definition.presets.includes(preset)).map((definition) => semanticDefinitionToOption(definition, preset));
51484
+ }
51485
+ semanticOptionsForPreset("feature");
51486
+ function getIconComponent(name) {
51487
+ return getCtaIconComponent(name) ?? getSemanticIconComponent(name);
51488
+ }
51489
+ //#endregion
51490
+ //#region ../blocks/src/system/runtime/nodes/buttonAffordance.ts
51491
+ function normalize(value) {
51492
+ const trimmed = typeof value === "string" ? value.trim() : "";
51493
+ return trimmed.length > 0 ? trimmed : null;
51494
+ }
51495
+ /**
51496
+ * Resolve the trailing affordance a button should render. Node overrides
51497
+ * personality; returns `null` when nothing is configured.
51498
+ */
51499
+ function resolveButtonAffordance(input) {
51500
+ const nodeIcon = normalize(input.trailingIcon);
51501
+ if (nodeIcon) {
51502
+ const colorToken = normalize(input.trailingIconColorToken);
51503
+ return {
51504
+ iconId: nodeIcon,
51505
+ source: "node",
51506
+ ...colorToken ? { colorToken } : {}
51507
+ };
51508
+ }
51509
+ const personality = input.personalityAffordance;
51510
+ const personalityIcon = normalize(personality?.iconId);
51511
+ if (personality && personalityIcon) {
51512
+ const colorToken = normalize(personality.colorToken);
51513
+ return {
51514
+ iconId: personalityIcon,
51515
+ source: "personality",
51516
+ ...colorToken ? { colorToken } : {}
51517
+ };
51518
+ }
51519
+ return null;
51520
+ }
51521
+ //#endregion
50608
51522
  //#region ../blocks/src/system/runtime/nodes/richText-coerce.ts
50609
51523
  function coerceRichTextDoc(value) {
50610
51524
  const raw = unwrapRichTextRoot(value);
@@ -50669,37 +51583,57 @@ const RichTextNode = ({ value, blockId: _blockId, blockKind: _blockKind, blockCo
50669
51583
  ...rest
50670
51584
  });
50671
51585
  };
50672
- const ButtonNode = ({ value, children, href, variantId = "primary", size = "md", disabled, type = "button", target, rel, linkRequired = false, blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, pathBase: _pathBase, className, ...rest }) => {
51586
+ /**
51587
+ * Render the resolved trailing affordance icon. Colour is applied via a theme
51588
+ * CSS var so it recolours with the palette; the icon stroke uses `currentColor`.
51589
+ */
51590
+ function renderTrailingAffordanceIcon(affordance) {
51591
+ if (!affordance) return null;
51592
+ const Icon = getIconComponent(affordance.iconId);
51593
+ if (!Icon) return null;
51594
+ return /* @__PURE__ */ jsx(Icon, {
51595
+ "aria-hidden": true,
51596
+ className: "rb-ml-2 rb-h-4 rb-w-4 rb-inline-block",
51597
+ style: affordance.colorToken ? { color: `rgb(var(--tb-${affordance.colorToken}))` } : void 0
51598
+ });
51599
+ }
51600
+ const ButtonNode = ({ value, children, href, variantId = "primary", size = "md", disabled, type = "button", target, rel, linkRequired = false, trailingIcon, trailingIconColorToken, personalityAffordance, blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, pathBase: _pathBase, className, ...rest }) => {
50673
51601
  const content = value ?? children;
50674
51602
  if (!content) {
50675
51603
  console.warn("[ButtonNode] No content to render - value and children are both empty");
50676
51604
  return null;
50677
51605
  }
51606
+ const affordanceIcon = renderTrailingAffordanceIcon(resolveButtonAffordance({
51607
+ trailingIcon,
51608
+ trailingIconColorToken,
51609
+ personalityAffordance
51610
+ }));
50678
51611
  const resolvedHref = typeof href === "string" ? href.trim() : "";
50679
51612
  if (linkRequired && resolvedHref.length === 0) {
50680
51613
  if (process.env.NODE_ENV === "development") console.warn("[ButtonNode] Missing href for link-required button");
50681
51614
  return null;
50682
51615
  }
51616
+ const extraClassName = affordanceIcon ? [className, AFFORDANCE_SUPPRESS_CLASS].filter(Boolean).join(" ") : className;
50683
51617
  const resolvedVariantId = parseThemeButtonVariantId(variantId);
50684
51618
  const combinedClassName = resolvedVariantId ? themeButtonClassName({
50685
51619
  variant: resolvedVariantId,
50686
51620
  size,
50687
- extraClassName: className
50688
- }) : className;
50689
- if (resolvedHref) return /* @__PURE__ */ jsx("a", {
51621
+ extraClassName
51622
+ }) : extraClassName;
51623
+ if (resolvedHref) return /* @__PURE__ */ jsxs("a", {
50690
51624
  href: resolvedHref,
50691
51625
  target,
50692
51626
  rel,
50693
51627
  className: combinedClassName,
50694
51628
  ...rest,
50695
- children: content
51629
+ children: [content, affordanceIcon]
50696
51630
  });
50697
- return /* @__PURE__ */ jsx("button", {
51631
+ return /* @__PURE__ */ jsxs("button", {
50698
51632
  type,
50699
51633
  disabled,
50700
51634
  className: combinedClassName,
50701
51635
  ...rest,
50702
- children: content
51636
+ children: [content, affordanceIcon]
50703
51637
  });
50704
51638
  };
50705
51639
  const LinkNode = ({ href, children, className, target, rel, linkRequired = false, blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, pathBase: _pathBase, ...rest }) => {
@@ -50724,106 +51658,6 @@ const LinkNode = ({ href, children, className, target, rel, linkRequired = false
50724
51658
  });
50725
51659
  };
50726
51660
  //#endregion
50727
- //#region ../blocks/src/system/icons/cta.ts
50728
- init_svg();
50729
- /**
50730
- * Curated icon set for CTA/button icons.
50731
- *
50732
- * Guardrail: keep this list small and action-oriented. This is intentionally not the full Lucide set.
50733
- * Extend by adding to CTA_ICON_NAMES and the mapping below (explicit imports only).
50734
- */
50735
- const CTA_ICON_NAMES = [
50736
- "ArrowRight",
50737
- "ArrowLeft",
50738
- "ChevronRight",
50739
- "ChevronLeft",
50740
- "ChevronUp",
50741
- "ChevronDown",
50742
- "ExternalLink",
50743
- "Download",
50744
- "Upload",
50745
- "Mail",
50746
- "Phone",
50747
- "Play",
50748
- "ShoppingCart",
50749
- "Calendar",
50750
- "MapPin",
50751
- "Info",
50752
- "Plus",
50753
- "Minus",
50754
- "Check",
50755
- "X"
50756
- ];
50757
- const CTA_ICON_COMPONENTS = {
50758
- ArrowRight: ArrowRightIcon,
50759
- ArrowLeft: ArrowLeftIcon,
50760
- ChevronRight: ChevronRightIcon,
50761
- ChevronLeft: ChevronLeftIcon,
50762
- ChevronUp: ChevronUpIcon,
50763
- ChevronDown: ChevronDownIcon,
50764
- ExternalLink: ExternalLinkIcon,
50765
- Download: DownloadIcon,
50766
- Upload: UploadIcon,
50767
- Mail: MailIcon,
50768
- Phone: PhoneIcon,
50769
- Play: PlayIcon,
50770
- ShoppingCart: ShoppingCartIcon,
50771
- Calendar: CalendarIcon$1,
50772
- MapPin: MapPinIcon$1,
50773
- Info: InfoIcon,
50774
- Plus: PlusIcon,
50775
- Minus: MinusIcon,
50776
- Check: CheckIcon$1,
50777
- X: XIcon
50778
- };
50779
- function isCtaIconName(value) {
50780
- return typeof value === "string" && CTA_ICON_NAMES.includes(value);
50781
- }
50782
- function formatLucideName(name) {
50783
- return name.replace(/([a-z0-9])([A-Z])/g, "$1 $2");
50784
- }
50785
- const CTA_ICON_OPTIONS = CTA_ICON_NAMES.map((id) => ({
50786
- id,
50787
- label: formatLucideName(id)
50788
- }));
50789
- function getCtaIconComponent(name) {
50790
- if (!isCtaIconName(name)) return null;
50791
- return CTA_ICON_COMPONENTS[name] ?? null;
50792
- }
50793
- //#endregion
50794
- //#region ../blocks/src/system/icons/registry.ts
50795
- init_presets$1();
50796
- function buildSearchText(parts) {
50797
- return parts.map((part) => part.trim()).filter(Boolean).join(" ");
50798
- }
50799
- function semanticDefinitionToOption(definition, preset) {
50800
- return {
50801
- id: definition.id,
50802
- label: definition.label,
50803
- searchText: buildSearchText([
50804
- definition.label,
50805
- definition.id,
50806
- ...definition.tags,
50807
- ...definition.domains,
50808
- ...definition.tone
50809
- ]),
50810
- preset
50811
- };
50812
- }
50813
- CTA_ICON_OPTIONS.map((option) => ({
50814
- id: option.id,
50815
- label: option.label,
50816
- searchText: buildSearchText([option.label, option.id]),
50817
- preset: "cta"
50818
- }));
50819
- function semanticOptionsForPreset(preset) {
50820
- return SEMANTIC_ICON_DEFINITIONS.filter((definition) => definition.presets.includes(preset)).map((definition) => semanticDefinitionToOption(definition, preset));
50821
- }
50822
- semanticOptionsForPreset("feature");
50823
- function getIconComponent(name) {
50824
- return getCtaIconComponent(name) ?? getSemanticIconComponent(name);
50825
- }
50826
- //#endregion
50827
51661
  //#region ../blocks/src/system/runtime/nodes/icon.tsx
50828
51662
  const IconNode = ({ value, title, className, blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, pathBase: _pathBase, ...rest }) => {
50829
51663
  const parsedValue = parseBlockIconValue(value);
@@ -51545,6 +52379,78 @@ function SpinnerNode({ className, size = "md", color, strokeWidth = 3, srLabel,
51545
52379
  var init_spinner = __esmMin((() => {
51546
52380
  init_clsx();
51547
52381
  }));
52382
+ //#endregion
52383
+ //#region ../blocks/src/system/runtime/nodes/svg.tsx
52384
+ init_spinner();
52385
+ /**
52386
+ * Turn paint props into a CSS style object. Colour values pass through as-is so
52387
+ * they may reference theme tokens via `var()`, which only resolves in a CSS
52388
+ * property context (not in a bare presentation attribute).
52389
+ */
52390
+ function paintStyle(shape) {
52391
+ const style = {};
52392
+ if (shape.fill !== void 0) style.fill = shape.fill;
52393
+ if (shape.stroke !== void 0) style.stroke = shape.stroke;
52394
+ if (shape.strokeWidth !== void 0) style.strokeWidth = shape.strokeWidth;
52395
+ if (shape.fillOpacity !== void 0) style.fillOpacity = shape.fillOpacity;
52396
+ if (shape.strokeOpacity !== void 0) style.strokeOpacity = shape.strokeOpacity;
52397
+ if (shape.strokeLinecap !== void 0) style.strokeLinecap = shape.strokeLinecap;
52398
+ if (shape.strokeLinejoin !== void 0) style.strokeLinejoin = shape.strokeLinejoin;
52399
+ if (shape.strokeDasharray !== void 0) style.strokeDasharray = shape.strokeDasharray;
52400
+ return style;
52401
+ }
52402
+ function renderShape(shape, key) {
52403
+ const style = paintStyle(shape);
52404
+ switch (shape.kind) {
52405
+ case "path": return /* @__PURE__ */ jsx("path", {
52406
+ d: shape.d,
52407
+ style
52408
+ }, key);
52409
+ case "ellipse": return /* @__PURE__ */ jsx("ellipse", {
52410
+ cx: shape.cx,
52411
+ cy: shape.cy,
52412
+ rx: shape.rx,
52413
+ ry: shape.ry,
52414
+ style
52415
+ }, key);
52416
+ case "circle": return /* @__PURE__ */ jsx("circle", {
52417
+ cx: shape.cx,
52418
+ cy: shape.cy,
52419
+ r: shape.r,
52420
+ style
52421
+ }, key);
52422
+ case "rect": return /* @__PURE__ */ jsx("rect", {
52423
+ x: shape.x,
52424
+ y: shape.y,
52425
+ width: shape.width,
52426
+ height: shape.height,
52427
+ rx: shape.rx,
52428
+ ry: shape.ry,
52429
+ style
52430
+ }, key);
52431
+ case "line": return /* @__PURE__ */ jsx("line", {
52432
+ x1: shape.x1,
52433
+ y1: shape.y1,
52434
+ x2: shape.x2,
52435
+ y2: shape.y2,
52436
+ style
52437
+ }, key);
52438
+ default: return null;
52439
+ }
52440
+ }
52441
+ const SvgNode = ({ blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, pathBase: _pathBase, viewBox, width, height, className, style, ariaHidden = true, shapes }) => {
52442
+ return /* @__PURE__ */ jsx("svg", {
52443
+ viewBox,
52444
+ width,
52445
+ height,
52446
+ className,
52447
+ style,
52448
+ "aria-hidden": ariaHidden,
52449
+ xmlns: "http://www.w3.org/2000/svg",
52450
+ fill: "none",
52451
+ children: (Array.isArray(shapes) ? shapes : []).map((shape, index) => renderShape(shape, index))
52452
+ });
52453
+ };
51548
52454
  function clearWorkflowFeedback(state) {
51549
52455
  return {
51550
52456
  ...state,
@@ -54842,7 +55748,6 @@ var init_booking_form_interactive = __esmMin((() => {
54842
55748
  }));
54843
55749
  //#endregion
54844
55750
  //#region ../blocks/src/system/runtime/nodes/booking-form.server.tsx
54845
- init_spinner();
54846
55751
  init_booking_form_interactive();
54847
55752
  /**
54848
55753
  * Server-safe placeholder for booking form.
@@ -57332,6 +58237,153 @@ var init_WeekAgendaView = __esmMin((() => {
57332
58237
  };
57333
58238
  }));
57334
58239
  //#endregion
58240
+ //#region ../blocks/src/system/runtime/nodes/events/shared/WeekBoardView.tsx
58241
+ /**
58242
+ * Format an event's start–end as a compact range, merging the shared meridiem.
58243
+ * "6:00 PM" + "7:00 PM" -> "6:00 – 7:00 PM"; "9:30 AM" + "10:15 AM" -> "9:30 – 10:15 AM".
58244
+ */
58245
+ function formatCompactTimeRange(event) {
58246
+ const timeZone = event.timeZone ?? null;
58247
+ const start = formatTime$3(event.startsAt, { timeZone });
58248
+ const end = formatTime$3(event.endsAt, { timeZone });
58249
+ const startMeridiem = start.slice(-2);
58250
+ const endMeridiem = end.slice(-2);
58251
+ if ((startMeridiem === "AM" || startMeridiem === "PM") && startMeridiem === endMeridiem) return `${start.slice(0, -3).trim()} – ${end}`;
58252
+ return `${start} – ${end}`;
58253
+ }
58254
+ var SHORT_DAY_NAMES, LEGEND_ITEMS, WeekBoardCard, WeekBoardView;
58255
+ var init_WeekBoardView = __esmMin((() => {
58256
+ init_clsx();
58257
+ init_buttons();
58258
+ init_eventCapacity();
58259
+ init_utils$3();
58260
+ SHORT_DAY_NAMES = [
58261
+ "Sun",
58262
+ "Mon",
58263
+ "Tue",
58264
+ "Wed",
58265
+ "Thu",
58266
+ "Fri",
58267
+ "Sat"
58268
+ ];
58269
+ LEGEND_ITEMS = [
58270
+ {
58271
+ status: "available",
58272
+ label: "Places available"
58273
+ },
58274
+ {
58275
+ status: "filling",
58276
+ label: "Filling up"
58277
+ },
58278
+ {
58279
+ status: "waitlist",
58280
+ label: "Waitlist"
58281
+ }
58282
+ ];
58283
+ WeekBoardCard = ({ event, showCapacity }) => {
58284
+ const linkProps = resolveEventLinkProps(event);
58285
+ const { status, label } = getEventAvailabilityStatus(event);
58286
+ const pill = showCapacity ? label : null;
58287
+ return /* @__PURE__ */ jsxs("a", {
58288
+ ...linkProps,
58289
+ className: "event-week-board-card",
58290
+ "data-status": status,
58291
+ children: [
58292
+ /* @__PURE__ */ jsx("span", {
58293
+ className: "event-week-board-card-title",
58294
+ children: event.title
58295
+ }),
58296
+ /* @__PURE__ */ jsx("span", {
58297
+ className: "event-week-board-card-time",
58298
+ children: formatCompactTimeRange(event)
58299
+ }),
58300
+ pill ? /* @__PURE__ */ jsx("span", {
58301
+ className: "event-week-board-card-pill",
58302
+ "data-status": status,
58303
+ children: pill
58304
+ }) : null
58305
+ ]
58306
+ });
58307
+ };
58308
+ WeekBoardView = ({ days, events, showCapacity, emptyMessage = "No classes scheduled this week", title = "The week ahead", footerNote = "New to a class? We'll check it's right for you first.", ctaLabel = "Reserve a place", ctaHref = null, buttonVariant = "outline" }) => {
58309
+ const eventsByDate = groupEventsByDate(events);
58310
+ const hasAnyEvents = days.some((date) => (eventsByDate.get(formatDateKey(date)) ?? []).length > 0);
58311
+ const ctaClassName = themeButtonClassName({
58312
+ variant: buttonVariant,
58313
+ size: "sm"
58314
+ });
58315
+ return /* @__PURE__ */ jsx("div", {
58316
+ className: "event-calendar event-calendar--week-board",
58317
+ "data-block": "event-calendar",
58318
+ children: /* @__PURE__ */ jsxs("div", {
58319
+ className: "event-week-board",
58320
+ style: { "--event-week-board-cols": String(days.length) },
58321
+ children: [
58322
+ /* @__PURE__ */ jsxs("div", {
58323
+ className: "event-week-board-top",
58324
+ children: [/* @__PURE__ */ jsx("span", {
58325
+ className: "event-week-board-title",
58326
+ children: title
58327
+ }), /* @__PURE__ */ jsx("div", {
58328
+ className: "event-week-board-legend",
58329
+ "aria-hidden": "true",
58330
+ children: LEGEND_ITEMS.map((item) => /* @__PURE__ */ jsxs("span", {
58331
+ className: "event-week-board-legend-item",
58332
+ children: [/* @__PURE__ */ jsx("i", {
58333
+ className: "event-week-board-legend-dot",
58334
+ "data-status": item.status
58335
+ }), item.label]
58336
+ }, item.status))
58337
+ })]
58338
+ }),
58339
+ /* @__PURE__ */ jsx("div", {
58340
+ className: "event-week-board-grid",
58341
+ children: days.map((date) => {
58342
+ const dateKey = formatDateKey(date);
58343
+ const dayEvents = eventsByDate.get(dateKey) ?? [];
58344
+ const today = isToday(date);
58345
+ return /* @__PURE__ */ jsxs("div", {
58346
+ className: clsx("event-week-board-day", dayEvents.length === 0 && "event-week-board-day--empty", today && "event-week-board-day--today"),
58347
+ children: [/* @__PURE__ */ jsxs("div", {
58348
+ className: "event-week-board-day-head",
58349
+ children: [/* @__PURE__ */ jsx("span", {
58350
+ className: "event-week-board-day-abbr",
58351
+ children: SHORT_DAY_NAMES[date.getDay()]
58352
+ }), /* @__PURE__ */ jsx("span", {
58353
+ className: "event-week-board-day-num",
58354
+ children: date.getDate()
58355
+ })]
58356
+ }), /* @__PURE__ */ jsx("div", {
58357
+ className: "event-week-board-day-body",
58358
+ children: dayEvents.map((event) => /* @__PURE__ */ jsx(WeekBoardCard, {
58359
+ event,
58360
+ showCapacity
58361
+ }, event.occurrenceId || event.id))
58362
+ })]
58363
+ }, dateKey);
58364
+ })
58365
+ }),
58366
+ /* @__PURE__ */ jsxs("div", {
58367
+ className: "event-week-board-foot",
58368
+ children: [/* @__PURE__ */ jsx("p", {
58369
+ className: "event-week-board-foot-note",
58370
+ children: hasAnyEvents ? footerNote : emptyMessage
58371
+ }), ctaHref ? /* @__PURE__ */ jsx("a", {
58372
+ className: ctaClassName,
58373
+ href: ctaHref,
58374
+ children: ctaLabel
58375
+ }) : /* @__PURE__ */ jsx("button", {
58376
+ type: "button",
58377
+ className: ctaClassName,
58378
+ children: ctaLabel
58379
+ })]
58380
+ })
58381
+ ]
58382
+ })
58383
+ });
58384
+ };
58385
+ }));
58386
+ //#endregion
57335
58387
  //#region ../blocks/src/system/runtime/nodes/events/shared/timetableModel.ts
57336
58388
  function buildTimetableModel(input) {
57337
58389
  const generic = buildTimetableModel$1({
@@ -57426,6 +58478,7 @@ init_clsx();
57426
58478
  init_EventListing_view();
57427
58479
  init_EventCalendar_interactive();
57428
58480
  init_WeekAgendaView();
58481
+ init_WeekBoardView();
57429
58482
  init_utils$3();
57430
58483
  init_timetableModel();
57431
58484
  init_buttons();
@@ -57770,6 +58823,17 @@ function renderTimetableSsr(display) {
57770
58823
  })]
57771
58824
  });
57772
58825
  }
58826
+ function renderWeekBoardSsr(display) {
58827
+ const days = getWeekCalendarDayTuple(/* @__PURE__ */ new Date(), display.startOfWeek);
58828
+ return /* @__PURE__ */ jsx(WeekBoardView, {
58829
+ days,
58830
+ events: [...display.events],
58831
+ showCapacity: display.showCapacity,
58832
+ emptyMessage: display.emptyMessage,
58833
+ ctaLabel: display.buttonText,
58834
+ buttonVariant: display.buttonVariant
58835
+ });
58836
+ }
57773
58837
  function formatHourLabel$1(hour) {
57774
58838
  if (hour === 0) return "12 AM";
57775
58839
  if (hour === 12) return "12 PM";
@@ -57796,6 +58860,9 @@ const EventCalendarSSR = (props) => {
57796
58860
  case "timetable":
57797
58861
  content = renderTimetableSsr(display);
57798
58862
  break;
58863
+ case "week-board":
58864
+ content = renderWeekBoardSsr(display);
58865
+ break;
57799
58866
  case "calendar":
57800
58867
  content = renderCalendarSsr(display);
57801
58868
  break;
@@ -58390,6 +59457,7 @@ init_media_server();
58390
59457
  const serverComponentRegistry = {
58391
59458
  div: DivNode,
58392
59459
  figure: FigureNode,
59460
+ svg: SvgNode,
58393
59461
  section: SectionNode,
58394
59462
  headerSection: header_section_server_default,
58395
59463
  stack: StackNode,
@@ -59801,10 +60869,14 @@ init_node();
59801
60869
  init_fragments();
59802
60870
  init_defineBlock();
59803
60871
  //#endregion
60872
+ //#region ../theme-core/src/styles/shadow.ts
60873
+ init_colorStyles();
60874
+ //#endregion
59804
60875
  //#region ../theme-core/src/accordions/generateAccordionCss.ts
59805
60876
  init_types$10();
59806
60877
  init_constants$1();
59807
60878
  init_colorStyles();
60879
+ init_surfaces();
59808
60880
  //#endregion
59809
60881
  //#region ../theme-core/src/inputs/generateInputCss.ts
59810
60882
  init_types$9();
@@ -59849,10 +60921,10 @@ function svgDataUrl(svg) {
59849
60921
  }
59850
60922
  //#endregion
59851
60923
  //#region ../theme-core/src/status/generateStatusCss.ts
59852
- init_contextualColors();
60924
+ init_surfaces();
59853
60925
  //#endregion
59854
- //#region ../theme-core/src/status/index.ts
59855
- init_contextualColors();
60926
+ //#region ../theme-core/src/typography/generateTypographyCss.ts
60927
+ init_surfaces();
59856
60928
  //#endregion
59857
60929
  //#region ../theme-core/src/blocks/vars/event-registration.ts
59858
60930
  /**
@@ -60190,6 +61262,7 @@ const THEME_RADIUS_CSS_VARS = {
60190
61262
  block: "--rb-block-radius",
60191
61263
  button: "--rb-button-radius",
60192
61264
  input: "--rb-input-radius",
61265
+ panel: "--rb-panel-radius",
60193
61266
  legacyCard: "--radius-card",
60194
61267
  legacyControl: "--radius-control"
60195
61268
  };
@@ -60271,6 +61344,10 @@ ${`:where([data-theme-scope="${themeId}"]) :where([data-block="customer-portal"]
60271
61344
  /* Modal (shared rb-modal classes) */
60272
61345
  --rb-modal-overlay-bg: rgb(var(--tb-text, 0 0 0) / 0.35);
60273
61346
  --rb-modal-bg: var(--cp-card-bg);
61347
+ --rb-modal-text: var(--cp-text);
61348
+ --rb-modal-heading: var(--cp-text);
61349
+ --rb-modal-link: var(--cp-primary);
61350
+ --rb-modal-supporting: var(--cp-muted);
60274
61351
  --rb-modal-border: var(--cp-card-border);
60275
61352
  --rb-modal-shadow: var(--shadow-lg, var(--shadow-elev));
60276
61353
  --rb-modal-radius: var(--cp-card-radius);
@@ -147339,7 +148416,7 @@ function buildDisplayFilterParams(display) {
147339
148416
  filterVenueId: display.filterVenueId
147340
148417
  });
147341
148418
  }
147342
- var EventCalendarClient, EventCalendarTimetableClient, EventCalendarGridClient, EventCalendarChrome;
148419
+ var EventCalendarClient, EventCalendarWeekBoardClient, EventCalendarTimetableClient, EventCalendarGridClient, EventCalendarChrome;
147343
148420
  var init_EventCalendar_client = __esmMin((() => {
147344
148421
  init_EventCalendar_interactive();
147345
148422
  init_EventListing_client();
@@ -147352,6 +148429,7 @@ var init_EventCalendar_client = __esmMin((() => {
147352
148429
  init_EventModalContext();
147353
148430
  init_EventModals();
147354
148431
  init_WeekAgendaView();
148432
+ init_WeekBoardView();
147355
148433
  init_WeekTimetableView();
147356
148434
  init_buttons();
147357
148435
  init_listOptions();
@@ -147389,8 +148467,20 @@ var init_EventCalendar_client = __esmMin((() => {
147389
148467
  });
147390
148468
  if (display.displayMode === "list") return /* @__PURE__ */ jsx(EventListingController, { render: buildEventCalendarListingRender(render) });
147391
148469
  if (display.displayMode === "timetable") return /* @__PURE__ */ jsx(EventCalendarTimetableClient, { render });
148470
+ if (display.displayMode === "week-board") return /* @__PURE__ */ jsx(EventCalendarWeekBoardClient, { display });
147392
148471
  return /* @__PURE__ */ jsx(EventCalendarGridClient, { render });
147393
148472
  };
148473
+ EventCalendarWeekBoardClient = ({ display }) => {
148474
+ const days = useMemo(() => getWeekCalendarDayTuple(/* @__PURE__ */ new Date(), display.startOfWeek), [display.startOfWeek]);
148475
+ return /* @__PURE__ */ jsx(WeekBoardView, {
148476
+ days,
148477
+ events: [...display.events],
148478
+ showCapacity: display.showCapacity,
148479
+ emptyMessage: display.emptyMessage,
148480
+ ctaLabel: display.buttonText,
148481
+ buttonVariant: display.buttonVariant
148482
+ });
148483
+ };
147394
148484
  EventCalendarTimetableClient = ({ render }) => {
147395
148485
  const { display, hydration } = render;
147396
148486
  const { filtersNode, listFilters } = useEventCalendarFilterState(display);
@@ -151835,7 +152925,7 @@ var SimpleCache = class {
151835
152925
  * 1. This constant
151836
152926
  * 2. The "version" field in package.json
151837
152927
  */
151838
- const SDK_VERSION = "0.104.1";
152928
+ const SDK_VERSION = "0.104.3";
151839
152929
  //#endregion
151840
152930
  //#region src/client/error.ts
151841
152931
  /**