@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
@@ -894,6 +894,247 @@ var init_all = __esmMin((() => {
894
894
  init_PaletteCard();
895
895
  }));
896
896
  //#endregion
897
+ //#region ../theme-core/src/tokens/colorTokenParts.ts
898
+ function parseOpacityPercent(source) {
899
+ const trimmed = source.trim();
900
+ if (!trimmed) return null;
901
+ if (!/^\d{1,3}(?:\.\d+)?$/.test(trimmed)) return null;
902
+ const value = Number(trimmed);
903
+ if (!Number.isFinite(value)) return null;
904
+ if (value < 0 || value > 100) return null;
905
+ return value;
906
+ }
907
+ function parseColorTokenParts(source) {
908
+ const trimmed = source.trim();
909
+ if (trimmed.startsWith("raw:")) return {
910
+ kind: "raw",
911
+ value: trimmed.slice(4)
912
+ };
913
+ const [token, opacityRaw, extra] = trimmed.split("/");
914
+ if (!token || extra !== void 0) return {
915
+ kind: "invalid",
916
+ token: trimmed
917
+ };
918
+ if (opacityRaw === void 0) return {
919
+ kind: "token",
920
+ token,
921
+ opacityPercent: null
922
+ };
923
+ const opacityPercent = parseOpacityPercent(opacityRaw);
924
+ if (opacityPercent === null) return {
925
+ kind: "invalid",
926
+ token: trimmed
927
+ };
928
+ return {
929
+ kind: "token",
930
+ token,
931
+ opacityPercent
932
+ };
933
+ }
934
+ var init_colorTokenParts = __esmMin((() => {}));
935
+ //#endregion
936
+ //#region ../theme-core/src/tokens/blockColorTokens.ts
937
+ function isBlockColorToken(value) {
938
+ if (typeof value !== "string") return false;
939
+ const parts = parseColorTokenParts(value);
940
+ return parts.kind === "token" && blockColorTokenNameSet.has(parts.token);
941
+ }
942
+ function parseBlockColorToken(value) {
943
+ if (!isBlockColorToken(value)) return null;
944
+ return value.trim();
945
+ }
946
+ var blockColorTokenNames, blockColorTokenNameSet;
947
+ var init_blockColorTokens = __esmMin((() => {
948
+ init_colorTokenParts();
949
+ blockColorTokenNames = [
950
+ "text",
951
+ "heading",
952
+ "mutedText",
953
+ "surface",
954
+ "background",
955
+ "foreground",
956
+ "border",
957
+ "primary",
958
+ "secondary",
959
+ "accent",
960
+ "success",
961
+ "warning",
962
+ "info",
963
+ "error",
964
+ "destructive",
965
+ "scrim",
966
+ "shadow",
967
+ "onPrimary",
968
+ "onSecondary",
969
+ "onAccent",
970
+ "onSuccess",
971
+ "onWarning",
972
+ "onInfo",
973
+ "onError",
974
+ "onDestructive",
975
+ "onSurface"
976
+ ];
977
+ blockColorTokenNameSet = new Set(blockColorTokenNames);
978
+ }));
979
+ //#endregion
980
+ //#region ../theme-core/src/tokens/themeColorTokens.ts
981
+ function isKnownBaseToken(value) {
982
+ return themeColorBaseTokenSet.has(value);
983
+ }
984
+ function isKnownShadeToken(value) {
985
+ const match = value.match(/^([a-zA-Z][a-zA-Z0-9]*)(?:-([0-9]{2,3}))$/);
986
+ if (!match) return false;
987
+ const [, base, shade] = match;
988
+ return Boolean(base && shade && isKnownBaseToken(base) && shadeStepSet.has(shade));
989
+ }
990
+ function isThemeColorTokenBase(value) {
991
+ return isKnownBaseToken(value) || isKnownShadeToken(value);
992
+ }
993
+ function isThemeColorToken(value) {
994
+ if (typeof value !== "string") return false;
995
+ const parts = parseColorTokenParts(value);
996
+ return parts.kind === "token" && isThemeColorTokenBase(parts.token);
997
+ }
998
+ function parseThemeColorToken(value) {
999
+ if (!isThemeColorToken(value)) return null;
1000
+ return value.trim();
1001
+ }
1002
+ var PALETTE_TOKEN_NAMES, paletteTokenNameSchema, themeColorBaseTokenNames, themeColorBaseTokenSet, themeColorShadeSteps, shadeStepSet, themeColorTokenSchema;
1003
+ var init_themeColorTokens = __esmMin((() => {
1004
+ init_blockColorTokens();
1005
+ init_colorTokenParts();
1006
+ PALETTE_TOKEN_NAMES = [
1007
+ "primary",
1008
+ "primaryForeground",
1009
+ "secondary",
1010
+ "accent",
1011
+ "success",
1012
+ "warning",
1013
+ "destructive",
1014
+ "background",
1015
+ "surface",
1016
+ "surfaceAlt",
1017
+ "muted",
1018
+ "text",
1019
+ "border"
1020
+ ];
1021
+ paletteTokenNameSchema = z$1.enum(PALETTE_TOKEN_NAMES);
1022
+ themeColorBaseTokenNames = [
1023
+ ...PALETTE_TOKEN_NAMES,
1024
+ ...blockColorTokenNames,
1025
+ "white",
1026
+ "neutral",
1027
+ "primaryText",
1028
+ "secondaryForeground",
1029
+ "accentForeground"
1030
+ ];
1031
+ themeColorBaseTokenSet = new Set(themeColorBaseTokenNames);
1032
+ themeColorShadeSteps = [
1033
+ "50",
1034
+ "100",
1035
+ "200",
1036
+ "300",
1037
+ "400",
1038
+ "500",
1039
+ "600",
1040
+ "700",
1041
+ "800",
1042
+ "900",
1043
+ "950"
1044
+ ];
1045
+ shadeStepSet = new Set(themeColorShadeSteps);
1046
+ themeColorTokenSchema = z$1.string().min(1).refine((value) => Boolean(isThemeColorToken(value)), "Expected a known Theme V2 color token");
1047
+ }));
1048
+ //#endregion
1049
+ //#region ../theme-core/src/palette/colors.ts
1050
+ function normalizePaletteHex(value) {
1051
+ if (!NORMALIZABLE_HEX_REGEX.test(value)) return null;
1052
+ const normalized = value.toLowerCase();
1053
+ if (normalized.length === 7) return normalized;
1054
+ const triplet = normalized.slice(1);
1055
+ const red = triplet.charAt(0);
1056
+ const green = triplet.charAt(1);
1057
+ const blue = triplet.charAt(2);
1058
+ return `#${red}${red}${green}${green}${blue}${blue}`;
1059
+ }
1060
+ function paletteColorsFromEntries(entries) {
1061
+ const values = {};
1062
+ for (const entry of entries) {
1063
+ const parsedRole = paletteTokenNameSchema.safeParse(entry.name);
1064
+ if (!parsedRole.success) return {
1065
+ ok: false,
1066
+ error: {
1067
+ kind: "unknown-role",
1068
+ role: entry.name
1069
+ }
1070
+ };
1071
+ const role = parsedRole.data;
1072
+ if (values[role] !== void 0) return {
1073
+ ok: false,
1074
+ error: {
1075
+ kind: "duplicate-role",
1076
+ role
1077
+ }
1078
+ };
1079
+ const hex = normalizePaletteHex(entry.hex);
1080
+ if (!hex) return {
1081
+ ok: false,
1082
+ error: {
1083
+ kind: "invalid-color",
1084
+ role,
1085
+ value: entry.hex
1086
+ }
1087
+ };
1088
+ values[role] = hex;
1089
+ }
1090
+ const missing = PALETTE_TOKEN_NAMES.filter((role) => values[role] === void 0);
1091
+ if (missing.length > 0) return {
1092
+ ok: false,
1093
+ error: {
1094
+ kind: "missing-roles",
1095
+ roles: missing
1096
+ }
1097
+ };
1098
+ return {
1099
+ ok: true,
1100
+ colors: paletteColorsSchema.parse(values)
1101
+ };
1102
+ }
1103
+ function requirePaletteColorsFromEntries(entries) {
1104
+ const result = paletteColorsFromEntries(entries);
1105
+ if (result.ok) return result.colors;
1106
+ throw new Error(`Invalid complete palette: ${result.error.kind}`);
1107
+ }
1108
+ var HEX_COLOR_REGEX, NORMALIZABLE_HEX_REGEX, hexColorSchema, paletteModeSchema, paletteColorsSchema;
1109
+ var init_colors = __esmMin((() => {
1110
+ init_themeColorTokens();
1111
+ HEX_COLOR_REGEX = /^#[0-9a-f]{6}$/;
1112
+ NORMALIZABLE_HEX_REGEX = /^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i;
1113
+ hexColorSchema = z$1.string().regex(HEX_COLOR_REGEX, "Hex must be #RRGGBB (lowercase)").transform((value) => value);
1114
+ paletteModeSchema = z$1.enum(["light", "dark"]);
1115
+ z$1.string().regex(/^[0-9a-f]{64}$/, "Palette hash must be a lowercase SHA-256 value").transform((value) => value);
1116
+ paletteColorsSchema = z$1.object({
1117
+ primary: hexColorSchema,
1118
+ primaryForeground: hexColorSchema,
1119
+ secondary: hexColorSchema,
1120
+ accent: hexColorSchema,
1121
+ success: hexColorSchema,
1122
+ warning: hexColorSchema,
1123
+ destructive: hexColorSchema,
1124
+ background: hexColorSchema,
1125
+ surface: hexColorSchema,
1126
+ surfaceAlt: hexColorSchema,
1127
+ muted: hexColorSchema,
1128
+ text: hexColorSchema,
1129
+ border: hexColorSchema
1130
+ }).strict().transform((value) => value);
1131
+ }));
1132
+ var init_historicalThemePalette = __esmMin((() => {
1133
+ init_themeColorTokens();
1134
+ init_colors();
1135
+ new Set(PALETTE_TOKEN_NAMES);
1136
+ }));
1137
+ //#endregion
897
1138
  //#region ../theme-core/src/palette/types.ts
898
1139
  var init_types$17 = __esmMin((() => {}));
899
1140
  //#endregion
@@ -2009,242 +2250,6 @@ var init_extractPalette = __esmMin((() => {
2009
2250
  init_browser();
2010
2251
  }));
2011
2252
  //#endregion
2012
- //#region ../theme-core/src/tokens/colorTokenParts.ts
2013
- function parseOpacityPercent(source) {
2014
- const trimmed = source.trim();
2015
- if (!trimmed) return null;
2016
- if (!/^\d{1,3}(?:\.\d+)?$/.test(trimmed)) return null;
2017
- const value = Number(trimmed);
2018
- if (!Number.isFinite(value)) return null;
2019
- if (value < 0 || value > 100) return null;
2020
- return value;
2021
- }
2022
- function parseColorTokenParts(source) {
2023
- const trimmed = source.trim();
2024
- if (trimmed.startsWith("raw:")) return {
2025
- kind: "raw",
2026
- value: trimmed.slice(4)
2027
- };
2028
- const [token, opacityRaw, extra] = trimmed.split("/");
2029
- if (!token || extra !== void 0) return {
2030
- kind: "invalid",
2031
- token: trimmed
2032
- };
2033
- if (opacityRaw === void 0) return {
2034
- kind: "token",
2035
- token,
2036
- opacityPercent: null
2037
- };
2038
- const opacityPercent = parseOpacityPercent(opacityRaw);
2039
- if (opacityPercent === null) return {
2040
- kind: "invalid",
2041
- token: trimmed
2042
- };
2043
- return {
2044
- kind: "token",
2045
- token,
2046
- opacityPercent
2047
- };
2048
- }
2049
- var init_colorTokenParts = __esmMin((() => {}));
2050
- //#endregion
2051
- //#region ../theme-core/src/tokens/blockColorTokens.ts
2052
- function isBlockColorToken(value) {
2053
- if (typeof value !== "string") return false;
2054
- const parts = parseColorTokenParts(value);
2055
- return parts.kind === "token" && blockColorTokenNameSet.has(parts.token);
2056
- }
2057
- function parseBlockColorToken(value) {
2058
- if (!isBlockColorToken(value)) return null;
2059
- return value.trim();
2060
- }
2061
- var blockColorTokenNames, blockColorTokenNameSet;
2062
- var init_blockColorTokens = __esmMin((() => {
2063
- init_colorTokenParts();
2064
- blockColorTokenNames = [
2065
- "text",
2066
- "heading",
2067
- "mutedText",
2068
- "surface",
2069
- "background",
2070
- "foreground",
2071
- "border",
2072
- "primary",
2073
- "secondary",
2074
- "accent",
2075
- "success",
2076
- "warning",
2077
- "info",
2078
- "error",
2079
- "destructive",
2080
- "scrim",
2081
- "shadow",
2082
- "onPrimary",
2083
- "onSecondary",
2084
- "onAccent",
2085
- "onSuccess",
2086
- "onWarning",
2087
- "onInfo",
2088
- "onError",
2089
- "onDestructive",
2090
- "onSurface"
2091
- ];
2092
- blockColorTokenNameSet = new Set(blockColorTokenNames);
2093
- }));
2094
- //#endregion
2095
- //#region ../theme-core/src/tokens/themeColorTokens.ts
2096
- function isKnownBaseToken(value) {
2097
- return themeColorBaseTokenSet.has(value);
2098
- }
2099
- function isKnownShadeToken(value) {
2100
- const match = value.match(/^([a-zA-Z][a-zA-Z0-9]*)(?:-([0-9]{2,3}))$/);
2101
- if (!match) return false;
2102
- const [, base, shade] = match;
2103
- return Boolean(base && shade && isKnownBaseToken(base) && shadeStepSet.has(shade));
2104
- }
2105
- function isThemeColorTokenBase(value) {
2106
- return isKnownBaseToken(value) || isKnownShadeToken(value);
2107
- }
2108
- function isThemeColorToken(value) {
2109
- if (typeof value !== "string") return false;
2110
- const parts = parseColorTokenParts(value);
2111
- return parts.kind === "token" && isThemeColorTokenBase(parts.token);
2112
- }
2113
- function parseThemeColorToken(value) {
2114
- if (!isThemeColorToken(value)) return null;
2115
- return value.trim();
2116
- }
2117
- var PALETTE_TOKEN_NAMES, paletteTokenNameSchema, themeColorBaseTokenNames, themeColorBaseTokenSet, themeColorShadeSteps, shadeStepSet, themeColorTokenSchema;
2118
- var init_themeColorTokens = __esmMin((() => {
2119
- init_blockColorTokens();
2120
- init_colorTokenParts();
2121
- PALETTE_TOKEN_NAMES = [
2122
- "primary",
2123
- "primaryForeground",
2124
- "secondary",
2125
- "accent",
2126
- "success",
2127
- "warning",
2128
- "destructive",
2129
- "background",
2130
- "surface",
2131
- "surfaceAlt",
2132
- "muted",
2133
- "text",
2134
- "border"
2135
- ];
2136
- paletteTokenNameSchema = z$1.enum(PALETTE_TOKEN_NAMES);
2137
- themeColorBaseTokenNames = [
2138
- ...PALETTE_TOKEN_NAMES,
2139
- ...blockColorTokenNames,
2140
- "white",
2141
- "neutral",
2142
- "primaryText",
2143
- "secondaryForeground",
2144
- "accentForeground"
2145
- ];
2146
- themeColorBaseTokenSet = new Set(themeColorBaseTokenNames);
2147
- themeColorShadeSteps = [
2148
- "50",
2149
- "100",
2150
- "200",
2151
- "300",
2152
- "400",
2153
- "500",
2154
- "600",
2155
- "700",
2156
- "800",
2157
- "900",
2158
- "950"
2159
- ];
2160
- shadeStepSet = new Set(themeColorShadeSteps);
2161
- themeColorTokenSchema = z$1.string().min(1).refine((value) => Boolean(isThemeColorToken(value)), "Expected a known Theme V2 color token");
2162
- }));
2163
- //#endregion
2164
- //#region ../theme-core/src/palette/colors.ts
2165
- function normalizePaletteHex(value) {
2166
- if (!NORMALIZABLE_HEX_REGEX.test(value)) return null;
2167
- const normalized = value.toLowerCase();
2168
- if (normalized.length === 7) return normalized;
2169
- const triplet = normalized.slice(1);
2170
- const red = triplet.charAt(0);
2171
- const green = triplet.charAt(1);
2172
- const blue = triplet.charAt(2);
2173
- return `#${red}${red}${green}${green}${blue}${blue}`;
2174
- }
2175
- function paletteColorsFromEntries(entries) {
2176
- const values = {};
2177
- for (const entry of entries) {
2178
- const parsedRole = paletteTokenNameSchema.safeParse(entry.name);
2179
- if (!parsedRole.success) return {
2180
- ok: false,
2181
- error: {
2182
- kind: "unknown-role",
2183
- role: entry.name
2184
- }
2185
- };
2186
- const role = parsedRole.data;
2187
- if (values[role] !== void 0) return {
2188
- ok: false,
2189
- error: {
2190
- kind: "duplicate-role",
2191
- role
2192
- }
2193
- };
2194
- const hex = normalizePaletteHex(entry.hex);
2195
- if (!hex) return {
2196
- ok: false,
2197
- error: {
2198
- kind: "invalid-color",
2199
- role,
2200
- value: entry.hex
2201
- }
2202
- };
2203
- values[role] = hex;
2204
- }
2205
- const missing = PALETTE_TOKEN_NAMES.filter((role) => values[role] === void 0);
2206
- if (missing.length > 0) return {
2207
- ok: false,
2208
- error: {
2209
- kind: "missing-roles",
2210
- roles: missing
2211
- }
2212
- };
2213
- return {
2214
- ok: true,
2215
- colors: paletteColorsSchema.parse(values)
2216
- };
2217
- }
2218
- function requirePaletteColorsFromEntries(entries) {
2219
- const result = paletteColorsFromEntries(entries);
2220
- if (result.ok) return result.colors;
2221
- throw new Error(`Invalid complete palette: ${result.error.kind}`);
2222
- }
2223
- var HEX_COLOR_REGEX, NORMALIZABLE_HEX_REGEX, hexColorSchema, paletteModeSchema, paletteColorsSchema;
2224
- var init_colors = __esmMin((() => {
2225
- init_themeColorTokens();
2226
- HEX_COLOR_REGEX = /^#[0-9a-f]{6}$/;
2227
- NORMALIZABLE_HEX_REGEX = /^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i;
2228
- hexColorSchema = z$1.string().regex(HEX_COLOR_REGEX, "Hex must be #RRGGBB (lowercase)").transform((value) => value);
2229
- paletteModeSchema = z$1.enum(["light", "dark"]);
2230
- z$1.string().regex(/^[0-9a-f]{64}$/, "Palette hash must be a lowercase SHA-256 value").transform((value) => value);
2231
- paletteColorsSchema = z$1.object({
2232
- primary: hexColorSchema,
2233
- primaryForeground: hexColorSchema,
2234
- secondary: hexColorSchema,
2235
- accent: hexColorSchema,
2236
- success: hexColorSchema,
2237
- warning: hexColorSchema,
2238
- destructive: hexColorSchema,
2239
- background: hexColorSchema,
2240
- surface: hexColorSchema,
2241
- surfaceAlt: hexColorSchema,
2242
- muted: hexColorSchema,
2243
- text: hexColorSchema,
2244
- border: hexColorSchema
2245
- }).strict().transform((value) => value);
2246
- }));
2247
- //#endregion
2248
2253
  //#region ../theme-core/src/palette/editorState.ts
2249
2254
  var init_editorState = __esmMin((() => {}));
2250
2255
  //#endregion
@@ -2262,6 +2267,7 @@ var init_legacySelection = __esmMin((() => {
2262
2267
  init_themeColorTokens();
2263
2268
  init_colors();
2264
2269
  init_themePaletteCompatibility();
2270
+ init_historicalThemePalette();
2265
2271
  }));
2266
2272
  //#endregion
2267
2273
  //#region ../theme-core/src/site-styles/styleTags.ts
@@ -2342,7 +2348,7 @@ var init_types$16 = __esmMin((() => {
2342
2348
  }));
2343
2349
  //#endregion
2344
2350
  //#region ../theme-core/src/palette/curated/brand-led.ts
2345
- var brandLedCool, brandLedWarm, brandLedJewel, brandLedBurgundyGold;
2351
+ var brandLedCool, brandLedWarm, brandLedJewel, brandLedSpruce, brandLedBurgundyGold;
2346
2352
  var init_brand_led = __esmMin((() => {
2347
2353
  init_types$16();
2348
2354
  brandLedCool = defineCuratedPalette({
@@ -2540,6 +2546,71 @@ var init_brand_led = __esmMin((() => {
2540
2546
  }
2541
2547
  ]
2542
2548
  });
2549
+ brandLedSpruce = defineCuratedPalette({
2550
+ id: "brand-led-spruce",
2551
+ name: "Brand-led — Spruce",
2552
+ description: "Spruce-ink primary and moss secondary with an amber accent over a green-mist ground and hairline sage borders.",
2553
+ tags: {
2554
+ tone: "classic",
2555
+ energy: "calm",
2556
+ era: "editorial"
2557
+ },
2558
+ mode: "light",
2559
+ colors: [
2560
+ {
2561
+ name: "primary",
2562
+ hex: "#14312b"
2563
+ },
2564
+ {
2565
+ name: "secondary",
2566
+ hex: "#356a59"
2567
+ },
2568
+ {
2569
+ name: "accent",
2570
+ hex: "#f08a4b"
2571
+ },
2572
+ {
2573
+ name: "success",
2574
+ hex: "#356a59"
2575
+ },
2576
+ {
2577
+ name: "warning",
2578
+ hex: "#f08a4b"
2579
+ },
2580
+ {
2581
+ name: "destructive",
2582
+ hex: "#b5561f"
2583
+ },
2584
+ {
2585
+ name: "background",
2586
+ hex: "#ecefe9"
2587
+ },
2588
+ {
2589
+ name: "surface",
2590
+ hex: "#ffffff"
2591
+ },
2592
+ {
2593
+ name: "surfaceAlt",
2594
+ hex: "#f4f6f1"
2595
+ },
2596
+ {
2597
+ name: "muted",
2598
+ hex: "#5c6a64"
2599
+ },
2600
+ {
2601
+ name: "text",
2602
+ hex: "#1c2a26"
2603
+ },
2604
+ {
2605
+ name: "primaryForeground",
2606
+ hex: "#f4f7f1"
2607
+ },
2608
+ {
2609
+ name: "border",
2610
+ hex: "#d7ddd2"
2611
+ }
2612
+ ]
2613
+ });
2543
2614
  brandLedBurgundyGold = defineCuratedPalette({
2544
2615
  id: "brand-led-burgundy-gold",
2545
2616
  name: "Brand-led — Burgundy Gold",
@@ -3493,6 +3564,7 @@ var init_curated = __esmMin((() => {
3493
3564
  brandLedWarm,
3494
3565
  brandLedJewel,
3495
3566
  brandLedBurgundyGold,
3567
+ brandLedSpruce,
3496
3568
  warmNeutralClay,
3497
3569
  warmNeutralCream,
3498
3570
  warmNeutralSoftEarth,
@@ -3621,6 +3693,7 @@ var init_palette = __esmMin((() => {
3621
3693
  init_expandPalette();
3622
3694
  init_generateCssVars();
3623
3695
  init_generateShades();
3696
+ init_historicalThemePalette();
3624
3697
  init_neutralScale();
3625
3698
  init_types$17();
3626
3699
  init_utils$4();
@@ -3654,6 +3727,69 @@ var init_glow = __esmMin((() => {
3654
3727
  init_palette();
3655
3728
  }));
3656
3729
  //#endregion
3730
+ //#region ../theme-core/src/surfaces/foregroundRoles.ts
3731
+ var init_foregroundRoles = __esmMin((() => {}));
3732
+ //#endregion
3733
+ //#region ../theme-core/src/surfaces/foregroundContract.ts
3734
+ function requireSurfaceColorValue(role, value) {
3735
+ const normalized = value.trim();
3736
+ if (normalized.length === 0) throw new RangeError(`Surface foreground ${role} must be a non-empty CSS color.`);
3737
+ return normalized;
3738
+ }
3739
+ function completeSurfaceForegrounds(input) {
3740
+ const text = requireSurfaceColorValue("text", input.text);
3741
+ return {
3742
+ text,
3743
+ heading: input.heading === void 0 ? text : requireSurfaceColorValue("heading", input.heading),
3744
+ link: input.link === void 0 ? text : requireSurfaceColorValue("link", input.link),
3745
+ supporting: input.supporting === void 0 ? text : requireSurfaceColorValue("supporting", input.supporting)
3746
+ };
3747
+ }
3748
+ function surfaceForegroundValue(role, outsideProviderFallback = DEFAULT_ROLE_FALLBACKS[role]) {
3749
+ const roleVariable = SURFACE_FOREGROUND_CSS_VARS[role];
3750
+ const fallback = requireSurfaceColorValue("fallback", outsideProviderFallback);
3751
+ if (role === "text") return `var(${roleVariable}, ${fallback})`;
3752
+ return `var(${roleVariable}, var(${SURFACE_FOREGROUND_CSS_VARS.text}, ${fallback}))`;
3753
+ }
3754
+ function surfaceForegroundValueWithOpacity(role, opacityPercent) {
3755
+ if (!Number.isFinite(opacityPercent) || opacityPercent < 0 || opacityPercent > 100) throw new RangeError("Surface foreground opacity must be between 0 and 100.");
3756
+ return `color-mix(in srgb, ${surfaceForegroundValue(role)} ${opacityPercent}%, transparent)`;
3757
+ }
3758
+ function surfaceForegroundStyle(input) {
3759
+ const foregrounds = completeSurfaceForegrounds(input);
3760
+ return {
3761
+ color: foregrounds.text,
3762
+ [SURFACE_FOREGROUND_CSS_VARS.text]: foregrounds.text,
3763
+ [SURFACE_FOREGROUND_CSS_VARS.heading]: foregrounds.heading,
3764
+ [SURFACE_FOREGROUND_CSS_VARS.link]: foregrounds.link,
3765
+ [SURFACE_FOREGROUND_CSS_VARS.supporting]: foregrounds.supporting
3766
+ };
3767
+ }
3768
+ var SURFACE_FOREGROUND_CSS_VARS, DEFAULT_SURFACE_TEXT_COLOR, DEFAULT_SURFACE_LINK_COLOR, DEFAULT_SURFACE_SUPPORTING_COLOR, DEFAULT_ROLE_FALLBACKS;
3769
+ var init_foregroundContract = __esmMin((() => {
3770
+ SURFACE_FOREGROUND_CSS_VARS = {
3771
+ text: "--rb-surface-text-color",
3772
+ heading: "--rb-surface-heading-color",
3773
+ link: "--rb-surface-link-color",
3774
+ supporting: "--rb-surface-supporting-color"
3775
+ };
3776
+ DEFAULT_SURFACE_TEXT_COLOR = "rgb(var(--tb-text, 17 24 39))";
3777
+ DEFAULT_SURFACE_LINK_COLOR = "rgb(var(--tb-primary, var(--tb-text, 17 24 39)))";
3778
+ DEFAULT_SURFACE_SUPPORTING_COLOR = "rgb(var(--tb-mutedText, 100 116 139))";
3779
+ DEFAULT_ROLE_FALLBACKS = {
3780
+ text: DEFAULT_SURFACE_TEXT_COLOR,
3781
+ heading: DEFAULT_SURFACE_TEXT_COLOR,
3782
+ link: DEFAULT_SURFACE_LINK_COLOR,
3783
+ supporting: DEFAULT_SURFACE_SUPPORTING_COLOR
3784
+ };
3785
+ }));
3786
+ //#endregion
3787
+ //#region ../theme-core/src/surfaces/index.ts
3788
+ var init_surfaces = __esmMin((() => {
3789
+ init_foregroundContract();
3790
+ init_foregroundRoles();
3791
+ }));
3792
+ //#endregion
3657
3793
  //#region ../theme-core/src/utils/colorStyles.ts
3658
3794
  function parseToken(source) {
3659
3795
  const parts = parseColorTokenParts(source);
@@ -3664,9 +3800,12 @@ function parseToken(source) {
3664
3800
  if (parts.kind === "invalid") return { token: source };
3665
3801
  return {
3666
3802
  token: parts.token,
3667
- alpha: parts.opacityPercent === null ? void 0 : parts.opacityPercent / 100
3803
+ opacityPercent: parts.opacityPercent === null ? void 0 : parts.opacityPercent
3668
3804
  };
3669
3805
  }
3806
+ function surfaceRoleForTextToken(token) {
3807
+ return Object.prototype.hasOwnProperty.call(SURFACE_TEXT_ROLE_BY_TOKEN, token) ? SURFACE_TEXT_ROLE_BY_TOKEN[token] : null;
3808
+ }
3670
3809
  /**
3671
3810
  * Converts a theme color token to a CSS rgb value.
3672
3811
  * This is the primary function for applying theme colors to CSS properties.
@@ -3680,11 +3819,11 @@ function parseToken(source) {
3680
3819
  * rgbColorValue('raw:transparent') // => 'transparent'
3681
3820
  */
3682
3821
  function rgbColorValue(token) {
3683
- const { token: baseToken, alpha, raw } = parseToken(token);
3822
+ const { token: baseToken, opacityPercent, raw } = parseToken(token);
3684
3823
  if (raw) return raw;
3685
3824
  const cssVar = `${COLOR_VAR_PREFIX}${baseToken}`;
3686
- if (alpha === void 0) return `rgb(var(${cssVar}))`;
3687
- return `rgb(var(${cssVar}) / ${alpha})`;
3825
+ if (opacityPercent === void 0) return `rgb(var(${cssVar}))`;
3826
+ return `rgb(var(${cssVar}) / ${opacityPercent / 100})`;
3688
3827
  }
3689
3828
  /**
3690
3829
  * Creates a backgroundColor style object from a theme token.
@@ -3702,6 +3841,9 @@ function backgroundColorStyle(token) {
3702
3841
  * @returns CSSProperties with color
3703
3842
  */
3704
3843
  function textColorStyle(token) {
3844
+ const parsed = parseToken(token);
3845
+ const surfaceRole = parsed.raw ? null : surfaceRoleForTextToken(parsed.token);
3846
+ if (surfaceRole) return { color: parsed.opacityPercent === void 0 ? surfaceForegroundValue(surfaceRole) : surfaceForegroundValueWithOpacity(surfaceRole, parsed.opacityPercent) };
3705
3847
  return { color: rgbColorValue(token) };
3706
3848
  }
3707
3849
  /**
@@ -3737,15 +3879,28 @@ function mergeStyles(...styles) {
3737
3879
  }
3738
3880
  return Object.keys(merged).length ? merged : void 0;
3739
3881
  }
3740
- var COLOR_VAR_PREFIX;
3882
+ var COLOR_VAR_PREFIX, SURFACE_TEXT_ROLE_BY_TOKEN;
3741
3883
  var init_colorStyles = __esmMin((() => {
3884
+ init_surfaces();
3742
3885
  init_colorTokenParts();
3743
3886
  COLOR_VAR_PREFIX = "--tb-";
3887
+ SURFACE_TEXT_ROLE_BY_TOKEN = {
3888
+ text: "text",
3889
+ heading: "heading",
3890
+ mutedText: "supporting"
3891
+ };
3892
+ }));
3893
+ //#endregion
3894
+ //#region ../theme-core/src/styles/shadow.ts
3895
+ var init_shadow = __esmMin((() => {
3896
+ init_colorStyles();
3744
3897
  }));
3745
3898
  //#endregion
3746
3899
  //#region ../theme-core/src/styles/buttons.ts
3747
3900
  var init_buttons$1 = __esmMin((() => {
3748
3901
  init_glow();
3902
+ init_shadow();
3903
+ init_colorStyles();
3749
3904
  }));
3750
3905
  //#endregion
3751
3906
  //#region ../theme-core/src/styles/buttonsLibrary.ts
@@ -3814,7 +3969,7 @@ var init_media$3 = __esmMin((() => {
3814
3969
  storagePath: z.string().optional(),
3815
3970
  transform: transformSchema$1.optional()
3816
3971
  });
3817
- })), VARIANT_ROLES, 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;
3972
+ })), VARIANT_ROLES, 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;
3818
3973
  var init_types$15 = __esmMin((() => {
3819
3974
  init_themeColorTokens();
3820
3975
  VARIANT_ROLES = [
@@ -3973,6 +4128,10 @@ var init_types$15 = __esmMin((() => {
3973
4128
  widthClass: z$1.string(),
3974
4129
  colorToken: themeColorTokenSchema
3975
4130
  });
4131
+ buttonVariantAffordanceSchema = z$1.object({
4132
+ iconId: z$1.string().min(1),
4133
+ colorToken: themeColorTokenSchema.optional()
4134
+ });
3976
4135
  variantShadowSchema = z$1.object({
3977
4136
  elevation: z$1.enum([
3978
4137
  "none",
@@ -4013,7 +4172,8 @@ var init_types$15 = __esmMin((() => {
4013
4172
  border: buttonBorderSchema.optional(),
4014
4173
  hoverBackgroundToken: z$1.string().optional(),
4015
4174
  effects: variantEffectsSchema.optional(),
4016
- sizes: variantSizeOverridesSchema.optional()
4175
+ sizes: variantSizeOverridesSchema.optional(),
4176
+ affordance: buttonVariantAffordanceSchema.optional()
4017
4177
  });
4018
4178
  buttonSystemSchema = z$1.object({
4019
4179
  global: buttonGlobalSettingsSchema,
@@ -4038,6 +4198,9 @@ var init_registry$7 = __esmMin((() => {}));
4038
4198
  //#endregion
4039
4199
  //#region ../theme-core/src/buttons/generateDefaultButtonSystem.ts
4040
4200
  var init_generateDefaultButtonSystem = __esmMin((() => {}));
4201
+ //#endregion
4202
+ //#region ../theme-core/src/buttons/affordanceIcons.ts
4203
+ var init_affordanceIcons = __esmMin((() => {}));
4041
4204
  var init_generateButtonCss = __esmMin((() => {
4042
4205
  init_types$15();
4043
4206
  init_classNames();
@@ -4588,6 +4751,132 @@ var init_editorial_link = __esmMin((() => {
4588
4751
  });
4589
4752
  }));
4590
4753
  //#endregion
4754
+ //#region ../theme-core/src/buttons/personalities/flat-ink.ts
4755
+ var flatInk;
4756
+ var init_flat_ink = __esmMin((() => {
4757
+ init_types$14();
4758
+ flatInk = defineButtonPersonality({
4759
+ id: "flat-ink",
4760
+ name: "Flat Ink",
4761
+ description: "Flat solid-ink primary, hairline ghost secondary, and a single amber accent climax — modest radius, no shadow.",
4762
+ tags: {
4763
+ tone: "classic",
4764
+ energy: "calm",
4765
+ motion: "subtle",
4766
+ era: "editorial"
4767
+ },
4768
+ buttonSystem: {
4769
+ global: {
4770
+ cornerStyle: "rounded",
4771
+ shadow: "low",
4772
+ textTransform: "none",
4773
+ fontWeight: 600,
4774
+ borderWidth: 1,
4775
+ typography: "body",
4776
+ letterSpacing: "tight",
4777
+ paddingPreset: "default",
4778
+ hoverTransform: "lift",
4779
+ hoverColor: "none"
4780
+ },
4781
+ sizes: {
4782
+ sm: {
4783
+ padding: "0.625rem 1.125rem",
4784
+ fontSize: "text-sm"
4785
+ },
4786
+ md: { padding: "0.8125rem 1.375rem" },
4787
+ lg: {
4788
+ padding: "0.9375rem 1.625rem",
4789
+ fontSize: "text-lg"
4790
+ },
4791
+ xl: {
4792
+ padding: "1.0625rem 2rem",
4793
+ fontSize: "text-xl"
4794
+ }
4795
+ },
4796
+ variants: [
4797
+ {
4798
+ id: "primary",
4799
+ name: "Primary",
4800
+ enabled: true,
4801
+ priority: 1,
4802
+ background: {
4803
+ type: "solid",
4804
+ colorToken: "primary"
4805
+ },
4806
+ textColorToken: "primaryForeground",
4807
+ borderRadius: "rounded-lg",
4808
+ affordance: {
4809
+ iconId: "ArrowRight",
4810
+ colorToken: "accent"
4811
+ },
4812
+ shadow: {
4813
+ elevation: "none",
4814
+ softness: null,
4815
+ position: "bottom"
4816
+ },
4817
+ effects: { hover: [{
4818
+ effectId: "lift",
4819
+ options: { translateY: "-2px" }
4820
+ }, {
4821
+ effectId: "background-on-hover",
4822
+ options: { colorToken: "secondary" }
4823
+ }] }
4824
+ },
4825
+ {
4826
+ id: "secondary",
4827
+ name: "Secondary",
4828
+ enabled: true,
4829
+ priority: 2,
4830
+ background: { type: "transparent" },
4831
+ textColorToken: "primary",
4832
+ borderRadius: "rounded-lg",
4833
+ border: {
4834
+ widthClass: "border",
4835
+ colorToken: "border"
4836
+ },
4837
+ shadow: {
4838
+ elevation: "none",
4839
+ softness: null,
4840
+ position: "bottom"
4841
+ },
4842
+ effects: { hover: [{
4843
+ effectId: "lift",
4844
+ options: { translateY: "-2px" }
4845
+ }, {
4846
+ effectId: "background-on-hover",
4847
+ options: { colorToken: "surfaceAlt" }
4848
+ }] }
4849
+ },
4850
+ {
4851
+ id: "accent",
4852
+ name: "Accent",
4853
+ enabled: true,
4854
+ priority: 3,
4855
+ background: {
4856
+ type: "solid",
4857
+ colorToken: "accent"
4858
+ },
4859
+ textColorToken: "accentForeground",
4860
+ borderRadius: "rounded-lg",
4861
+ shadow: {
4862
+ elevation: "none",
4863
+ softness: null,
4864
+ position: "bottom"
4865
+ },
4866
+ affordance: {
4867
+ iconId: "ArrowRight",
4868
+ colorToken: "accentForeground"
4869
+ },
4870
+ effects: { hover: [{
4871
+ effectId: "lift",
4872
+ options: { translateY: "-2px" }
4873
+ }] }
4874
+ }
4875
+ ]
4876
+ }
4877
+ });
4878
+ }));
4879
+ //#endregion
4591
4880
  //#region ../theme-core/src/buttons/personalities/ink-stamp.ts
4592
4881
  var inkStamp;
4593
4882
  var init_ink_stamp = __esmMin((() => {
@@ -5354,6 +5643,7 @@ var init_personalities = __esmMin((() => {
5354
5643
  init_confident_chip();
5355
5644
  init_earth_pill();
5356
5645
  init_editorial_link();
5646
+ init_flat_ink();
5357
5647
  init_ink_stamp();
5358
5648
  init_joy_stamp();
5359
5649
  init_ornate_ritual();
@@ -5368,6 +5658,7 @@ var init_personalities = __esmMin((() => {
5368
5658
  editorialLink,
5369
5659
  pebble,
5370
5660
  inkStamp,
5661
+ flatInk,
5371
5662
  brushedWash,
5372
5663
  showtimePill,
5373
5664
  joyStamp,
@@ -5387,6 +5678,7 @@ var init_buttons = __esmMin((() => {
5387
5678
  init_types$15();
5388
5679
  init_classNames();
5389
5680
  init_generateButtonCss();
5681
+ init_affordanceIcons();
5390
5682
  init_generateDefaultButtonSystem();
5391
5683
  init_constants$1();
5392
5684
  init_presets$3();
@@ -5530,10 +5822,14 @@ var init_constants = __esmMin((() => {}));
5530
5822
  var init_generateDefaultCardSystem = __esmMin((() => {}));
5531
5823
  //#endregion
5532
5824
  //#region ../theme-core/src/cards/generateCardCss.ts
5533
- var init_generateCardCss = __esmMin((() => {}));
5825
+ var init_generateCardCss = __esmMin((() => {
5826
+ init_surfaces();
5827
+ }));
5534
5828
  //#endregion
5535
5829
  //#region ../theme-core/src/cards/core.ts
5536
- var init_core$1 = __esmMin((() => {}));
5830
+ var init_core$1 = __esmMin((() => {
5831
+ init_surfaces();
5832
+ }));
5537
5833
  //#endregion
5538
5834
  //#region ../theme-core/src/cards/index.ts
5539
5835
  var init_cards = __esmMin((() => {
@@ -5750,16 +6046,22 @@ var init_types$10 = __esmMin((() => {
5750
6046
  /**
5751
6047
  * Gradient configuration types and schemas
5752
6048
  */
5753
- var gradientStopSchema, gradientConfigSchema;
6049
+ var gradientStopSchema, radialGradientShapeSchema, gradientConfigSchema;
5754
6050
  var init_types$9 = __esmMin((() => {
5755
6051
  init_themeColorTokens();
5756
6052
  gradientStopSchema = z$1.object({
5757
6053
  color: themeColorTokenSchema,
5758
6054
  position: z$1.number().min(0).max(100)
5759
6055
  });
6056
+ radialGradientShapeSchema = z$1.enum(["circle", "ellipse"]);
5760
6057
  gradientConfigSchema = z$1.object({
5761
- type: z$1.enum(["linear", "radial"]),
6058
+ type: z$1.enum([
6059
+ "linear",
6060
+ "radial",
6061
+ "conic"
6062
+ ]).default("linear"),
5762
6063
  angle: z$1.number().min(0).max(360).optional(),
6064
+ shape: radialGradientShapeSchema.optional(),
5763
6065
  position: z$1.string().optional(),
5764
6066
  stops: z$1.array(gradientStopSchema).min(2)
5765
6067
  });
@@ -6401,7 +6703,7 @@ var init_tokenOrColor = __esmMin((() => {
6401
6703
  "white",
6402
6704
  "yellow"
6403
6705
  ]);
6404
- })), 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;
6706
+ })), 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;
6405
6707
  var init_schema$2 = __esmMin((() => {
6406
6708
  init_media$3();
6407
6709
  init_buttons();
@@ -6681,6 +6983,7 @@ var init_schema$2 = __esmMin((() => {
6681
6983
  "majorThird",
6682
6984
  "perfectFourth"
6683
6985
  ]);
6986
+ eyebrowTypographyStyleSchema = z$1.object({ family: z$1.string().min(1) });
6684
6987
  typographySchema = z$1.object({
6685
6988
  body: bodyTypographyStyleSchema,
6686
6989
  headings: z$1.object({
@@ -6693,7 +6996,8 @@ var init_schema$2 = __esmMin((() => {
6693
6996
  h6: headingTypographyOverridesSchema.optional()
6694
6997
  }),
6695
6998
  scale: typographyScaleSchema,
6696
- proseLinkStyle: proseLinkStyleSchema.optional()
6999
+ proseLinkStyle: proseLinkStyleSchema.optional(),
7000
+ eyebrow: eyebrowTypographyStyleSchema.optional()
6697
7001
  });
6698
7002
  spaceSchema = z$1.enum([
6699
7003
  "comfortable",
@@ -6718,7 +7022,8 @@ var init_schema$2 = __esmMin((() => {
6718
7022
  "soft",
6719
7023
  "hard"
6720
7024
  ]).nullable(),
6721
- position: z$1.enum(["bottom", "bottom-right"]).default("bottom")
7025
+ position: z$1.enum(["bottom", "bottom-right"]).default("bottom"),
7026
+ colorToken: themeColorTokenSchema.optional()
6722
7027
  });
6723
7028
  border = z$1.object({
6724
7029
  width: z$1.enum([
@@ -6959,6 +7264,7 @@ var init_schema$2 = __esmMin((() => {
6959
7264
  navWeight: navFontWeight.default("medium"),
6960
7265
  navTypography: z$1.enum(["body", "heading"]).optional(),
6961
7266
  navTextSize: navLinkStyleSchema.shape.textSize,
7267
+ navPlacement: z$1.enum(["end", "center"]).optional(),
6962
7268
  container: headerContainerSchema,
6963
7269
  border: headerBorderSchema,
6964
7270
  shadow: componentShadowSchema.optional(),
@@ -8761,6 +9067,50 @@ function getCompatibleHeaderStyleIds(layoutId) {
8761
9067
  return isHeaderStyleCompatibleWithLayout(getHeaderStyleOrThrow(styleId), layoutId);
8762
9068
  });
8763
9069
  }
9070
+ function applyNavTypography(style, typography) {
9071
+ switch (typography) {
9072
+ case "plain": return style;
9073
+ case "heading": return {
9074
+ ...style,
9075
+ typography: "heading",
9076
+ fontWeight: "medium",
9077
+ letterSpacing: "wide"
9078
+ };
9079
+ case "quiet-caps": return {
9080
+ ...style,
9081
+ textTransform: "uppercase",
9082
+ textSize: "sm",
9083
+ letterSpacing: "wide"
9084
+ };
9085
+ case "brand-caps": return {
9086
+ ...style,
9087
+ textTransform: "uppercase",
9088
+ textSize: "sm",
9089
+ letterSpacing: "wider"
9090
+ };
9091
+ default: return assertNever$1(typography, "Unhandled header nav typography");
9092
+ }
9093
+ }
9094
+ function underlineNavLinkStyle(colorToken, underlineColorToken, typography = "plain") {
9095
+ return applyNavTypography({
9096
+ name: "Underline grow",
9097
+ typography: "body",
9098
+ fontWeight: "medium",
9099
+ textTransform: "none",
9100
+ italic: false,
9101
+ colorToken,
9102
+ padding: "compact",
9103
+ paddingX: "compact",
9104
+ borderRadius: "none",
9105
+ effects: { hover: [{
9106
+ effectId: "nav-underline",
9107
+ options: {
9108
+ style: "grow",
9109
+ ...underlineColorToken ? { colorToken: underlineColorToken } : {}
9110
+ }
9111
+ }] }
9112
+ }, typography);
9113
+ }
8764
9114
  function themedHeaderShadow(theme) {
8765
9115
  switch (theme.shadow.elevation) {
8766
9116
  case "none": return;
@@ -8860,6 +9210,38 @@ function cleanBaseHeader(theme) {
8860
9210
  ctaGap: "default"
8861
9211
  };
8862
9212
  }
9213
+ function classicCenteredNavHeader(theme) {
9214
+ return {
9215
+ ...baseHeader(theme),
9216
+ variant: "classic",
9217
+ navPlacement: "center",
9218
+ positioning: "sticky",
9219
+ shrinkOnScroll: false,
9220
+ background: {
9221
+ type: "color",
9222
+ color: "surface"
9223
+ },
9224
+ textColor: "text",
9225
+ navColor: "text",
9226
+ navStyle: "underline-grow",
9227
+ navWeight: "medium",
9228
+ navLinkStyle: underlineNavLinkStyle("text", "accent"),
9229
+ border: {
9230
+ style: "solid",
9231
+ width: "thin",
9232
+ position: "bottom",
9233
+ colorToken: "border"
9234
+ },
9235
+ ctaTreatment: "primary",
9236
+ ctaVariant: resolveHeaderCtaVariant(theme, "primary"),
9237
+ ctaGap: "default",
9238
+ logoText: {
9239
+ mobileMaxWidth: "sm",
9240
+ mobileWrapLines: 1,
9241
+ hideOnShrink: false
9242
+ }
9243
+ };
9244
+ }
8863
9245
  function serifLineHeader(theme) {
8864
9246
  return {
8865
9247
  ...baseHeader(theme),
@@ -9437,6 +9819,13 @@ var init_headerLooks = __esmMin((() => {
9437
9819
  styleId: asHeaderStyleId("minimal")
9438
9820
  }
9439
9821
  },
9822
+ {
9823
+ lookId: asHeaderLookId("classic-centered-nav"),
9824
+ selection: {
9825
+ layoutId: asHeaderLayoutId("classic"),
9826
+ styleId: asHeaderStyleId("fine-line")
9827
+ }
9828
+ },
9440
9829
  {
9441
9830
  lookId: asHeaderLookId("brand-solid"),
9442
9831
  selection: {
@@ -9503,6 +9892,21 @@ var init_headerLooks = __esmMin((() => {
9503
9892
  logoAccommodations: inlineClassicLogoAccommodations,
9504
9893
  compile: cleanBaseHeader
9505
9894
  },
9895
+ {
9896
+ id: asHeaderLookId("classic-centered-nav"),
9897
+ label: "Centered nav",
9898
+ visualTreatment: "solid-neutral",
9899
+ layoutBehavior: "sticky",
9900
+ configuration: {
9901
+ structure: "inline-classic",
9902
+ treatment: "solid-neutral",
9903
+ behavior: "sticky"
9904
+ },
9905
+ openingRequirement: "none",
9906
+ maxRecommendedNavItems: 6,
9907
+ logoAccommodations: inlineClassicLogoAccommodations,
9908
+ compile: classicCenteredNavHeader
9909
+ },
9506
9910
  {
9507
9911
  id: asHeaderLookId("brand-solid"),
9508
9912
  label: "Brand solid",
@@ -10064,7 +10468,7 @@ function defineTypographyPreset(preset) {
10064
10468
  id: asTypographyPresetId(preset.id)
10065
10469
  };
10066
10470
  }
10067
- var bodyReadablePolicy, headingFlexiblePolicy, displayHeadingPolicy, modernSansTypography, warmRoundedTypography, editorialSerifTypography, classicSerifTypography, luxeContrastTypography, kirtanOrnateTypography, boldDisplayTypography, originalJoyTypography, typographyPresets;
10471
+ var bodyReadablePolicy, headingFlexiblePolicy, displayHeadingPolicy, modernSansTypography, warmRoundedTypography, editorialSerifTypography, classicSerifTypography, luxeContrastTypography, kirtanOrnateTypography, boldDisplayTypography, originalJoyTypography, fulcrumTypography, typographyPresets;
10068
10472
  var init_typographyPresets = __esmMin((() => {
10069
10473
  bodyReadablePolicy = {
10070
10474
  recommendedCategories: ["sans-serif", "serif"],
@@ -10426,6 +10830,49 @@ var init_typographyPresets = __esmMin((() => {
10426
10830
  },
10427
10831
  scale: "balanced"
10428
10832
  };
10833
+ fulcrumTypography = {
10834
+ body: {
10835
+ family: "IBM Plex Sans, system-ui, -apple-system, sans-serif",
10836
+ size: "lg",
10837
+ weight: "regular",
10838
+ lineHeight: "relaxed",
10839
+ letterSpacing: "normal"
10840
+ },
10841
+ headings: {
10842
+ default: {
10843
+ family: "Newsreader, Georgia, \"Times New Roman\", serif",
10844
+ weight: "medium",
10845
+ lineHeight: "normal",
10846
+ letterSpacing: "tight",
10847
+ colorToken: "primary",
10848
+ italic: null,
10849
+ case: null
10850
+ },
10851
+ h1: {
10852
+ size: "2xl",
10853
+ weight: "medium",
10854
+ lineHeight: "normal",
10855
+ letterSpacing: "tight",
10856
+ italic: null
10857
+ },
10858
+ h2: {
10859
+ size: "xl",
10860
+ weight: "medium",
10861
+ lineHeight: "normal",
10862
+ letterSpacing: "tight",
10863
+ italic: null
10864
+ },
10865
+ h3: {
10866
+ size: "md",
10867
+ weight: "semibold",
10868
+ lineHeight: "normal",
10869
+ letterSpacing: "normal",
10870
+ italic: null
10871
+ }
10872
+ },
10873
+ scale: "spacious",
10874
+ eyebrow: { family: "IBM Plex Mono, ui-monospace, \"SF Mono\", monospace" }
10875
+ };
10429
10876
  typographyPresets = [
10430
10877
  defineTypographyPreset({
10431
10878
  id: "typography-preset:modern-sans",
@@ -10685,6 +11132,32 @@ var init_typographyPresets = __esmMin((() => {
10685
11132
  }
10686
11133
  }
10687
11134
  }
11135
+ }),
11136
+ defineTypographyPreset({
11137
+ id: "typography-preset:fulcrum",
11138
+ name: "Fulcrum",
11139
+ description: "Newsreader serif headings over an IBM Plex Sans body, with an IBM Plex Mono eyebrow role for uppercase kickers and mono captions.",
11140
+ defaultFonts: {
11141
+ body: "IBM Plex Sans, system-ui, -apple-system, sans-serif",
11142
+ heading: "Newsreader, Georgia, \"Times New Roman\", serif"
11143
+ },
11144
+ recommendedFonts: {
11145
+ body: [
11146
+ "IBM Plex Sans",
11147
+ "Source Sans 3",
11148
+ "Inter"
11149
+ ],
11150
+ heading: [
11151
+ "Newsreader",
11152
+ "Source Serif 4",
11153
+ "Lora"
11154
+ ]
11155
+ },
11156
+ slotPolicies: {
11157
+ body: bodyReadablePolicy,
11158
+ heading: displayHeadingPolicy
11159
+ },
11160
+ typography: fulcrumTypography
10688
11161
  })
10689
11162
  ];
10690
11163
  new Map(typographyPresets.map((preset) => [preset.id, preset]));
@@ -11169,7 +11642,8 @@ var init_curatedSiteStyles = __esmMin((() => {
11169
11642
  "site-style:bold-launch",
11170
11643
  "site-style:south-west-twerk-school",
11171
11644
  "site-style:kirtan-ornate",
11172
- "site-style:original-joy"
11645
+ "site-style:original-joy",
11646
+ "site-style:fulcrum"
11173
11647
  ];
11174
11648
  quietBudget = {
11175
11649
  accentDensity: "low",
@@ -12381,6 +12855,104 @@ var init_curatedSiteStyles = __esmMin((() => {
12381
12855
  buttonChoice("showtime-pill")
12382
12856
  ],
12383
12857
  paletteRecommendations: [paletteRecommendation("warm-dark-ember")]
12858
+ }),
12859
+ defineCuratedSiteStyle({
12860
+ id: "site-style:fulcrum",
12861
+ name: "Fulcrum",
12862
+ headingDecoration: {
12863
+ family: "short-center-rule",
12864
+ colorToken: "accent"
12865
+ },
12866
+ 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.",
12867
+ 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.",
12868
+ siteCreatorSelection: {
12869
+ kind: "site_creator_keyword_heuristic",
12870
+ priority: 28
12871
+ },
12872
+ selectionKeywordRules: [
12873
+ {
12874
+ kind: "substring",
12875
+ value: "physiotherap"
12876
+ },
12877
+ {
12878
+ kind: "word",
12879
+ value: "physio"
12880
+ },
12881
+ {
12882
+ kind: "phrase",
12883
+ value: "sports injury"
12884
+ },
12885
+ {
12886
+ kind: "phrase",
12887
+ value: "rehab clinic"
12888
+ },
12889
+ {
12890
+ kind: "substring",
12891
+ value: "musculoskeletal"
12892
+ },
12893
+ {
12894
+ kind: "phrase",
12895
+ value: "sports therapy"
12896
+ }
12897
+ ],
12898
+ tokenRecipes: {
12899
+ palette: "brand-led",
12900
+ contrast: "standard",
12901
+ radius: "rounded",
12902
+ shadow: "subtle",
12903
+ typography: "serif-editorial",
12904
+ spacing: "airy",
12905
+ motion: "subtle"
12906
+ },
12907
+ compositionBudget: quietBudget,
12908
+ typographyPresetChoices: [
12909
+ typographyChoice("typography-preset:fulcrum"),
12910
+ typographyChoice("typography-preset:editorial-serif"),
12911
+ typographyChoice("typography-preset:modern-sans")
12912
+ ],
12913
+ defaultTypographyPresetId: "typography-preset:fulcrum",
12914
+ themeOverrides: {
12915
+ shadow: { colorToken: "primary" },
12916
+ accordions: {
12917
+ background: null,
12918
+ spacing: "comfortable",
12919
+ corners: "square",
12920
+ border: null,
12921
+ shadow: null,
12922
+ icon: {
12923
+ style: "plus-minus",
12924
+ position: "right",
12925
+ size: "md",
12926
+ colorToken: "accent"
12927
+ },
12928
+ trigger: {
12929
+ textColorToken: "primary",
12930
+ fontWeight: "medium",
12931
+ fontFamily: "heading",
12932
+ fontScale: "md"
12933
+ },
12934
+ hover: { textColorToken: "secondary" },
12935
+ content: { textColorToken: "muted" }
12936
+ },
12937
+ testimonialQuote: serifDisplayQuote
12938
+ },
12939
+ recommendedHeaderLookIds: [
12940
+ "classic-centered-nav",
12941
+ "serif-line",
12942
+ "centered-calm",
12943
+ "clean-base"
12944
+ ],
12945
+ recommendedFooterLookIds: ["footer-editorial-columns", "footer-muted-grounding"],
12946
+ buttonPersonalityChoices: [
12947
+ buttonChoice("flat-ink"),
12948
+ buttonChoice("confident-chip"),
12949
+ buttonChoice("editorial-link")
12950
+ ],
12951
+ paletteRecommendations: [
12952
+ paletteRecommendation("brand-led-spruce"),
12953
+ paletteRecommendation("warm-neutral-forest"),
12954
+ paletteRecommendation("soft-natural-sage")
12955
+ ]
12384
12956
  })
12385
12957
  ];
12386
12958
  new Map(curatedSiteStyles.map((style) => [style.id, style]));
@@ -12973,7 +13545,15 @@ function gradientToCss(config, tokens) {
12973
13545
  const stops = config.stops.map((stop) => {
12974
13546
  return `${tokens[stop.color] ?? "#000000"} ${stop.position}%`;
12975
13547
  }).join(", ");
12976
- if (config.type === "radial") return `radial-gradient(circle at ${config.position ?? "center"}, ${stops})`;
13548
+ const type = config.type ?? "linear";
13549
+ if (type === "radial") {
13550
+ const position = config.position ?? "center";
13551
+ return `radial-gradient(${config.shape ?? "circle"} at ${position}, ${stops})`;
13552
+ }
13553
+ if (type === "conic") {
13554
+ const position = config.position ?? "center";
13555
+ return `conic-gradient(from ${config.angle ?? 0}deg at ${position}, ${stops})`;
13556
+ }
12977
13557
  return `linear-gradient(${config.angle ?? 180}deg, ${stops})`;
12978
13558
  }
12979
13559
  var init_utils$2 = __esmMin((() => {}));
@@ -12991,6 +13571,8 @@ var init_mode = __esmMin((() => {}));
12991
13571
  //#region ../theme-core/src/accordions/generateAccordionCss.ts
12992
13572
  var init_generateAccordionCss = __esmMin((() => {
12993
13573
  init_types$11();
13574
+ init_colorStyles();
13575
+ init_surfaces();
12994
13576
  }));
12995
13577
  //#endregion
12996
13578
  //#region ../theme-core/src/accordions/defaults.ts
@@ -13001,6 +13583,7 @@ var init_defaults = __esmMin((() => {
13001
13583
  //#region ../theme-core/src/inputs/generateInputCss.ts
13002
13584
  var init_generateInputCss = __esmMin((() => {
13003
13585
  init_types$10();
13586
+ init_colorStyles();
13004
13587
  }));
13005
13588
  //#endregion
13006
13589
  //#region ../theme-core/src/navigation/generateNavLinkCSS.ts
@@ -13234,6 +13817,26 @@ var init_layout$3 = __esmMin((() => {
13234
13817
  init_generateLayoutCss();
13235
13818
  }));
13236
13819
  //#endregion
13820
+ //#region ../theme-core/src/status/generateStatusCss.ts
13821
+ var init_generateStatusCss = __esmMin((() => {
13822
+ init_surfaces();
13823
+ }));
13824
+ //#endregion
13825
+ //#region ../theme-core/src/status/index.ts
13826
+ var init_status = __esmMin((() => {
13827
+ init_generateStatusCss();
13828
+ }));
13829
+ //#endregion
13830
+ //#region ../theme-core/src/typography/generateTypographyCss.ts
13831
+ var init_generateTypographyCss = __esmMin((() => {
13832
+ init_surfaces();
13833
+ }));
13834
+ //#endregion
13835
+ //#region ../theme-core/src/typography/index.ts
13836
+ var init_typography$1 = __esmMin((() => {
13837
+ init_generateTypographyCss();
13838
+ }));
13839
+ //#endregion
13237
13840
  //#region ../theme-core/src/blocks/vars/event-registration.ts
13238
13841
  /**
13239
13842
  * Generate CSS variables for the event-registration block.
@@ -13582,6 +14185,7 @@ var init_themeCssVarNames = __esmMin((() => {
13582
14185
  block: "--rb-block-radius",
13583
14186
  button: "--rb-button-radius",
13584
14187
  input: "--rb-input-radius",
14188
+ panel: "--rb-panel-radius",
13585
14189
  legacyCard: "--radius-card",
13586
14190
  legacyControl: "--radius-control"
13587
14191
  };
@@ -13664,6 +14268,10 @@ ${`:where([data-theme-scope="${themeId}"]) :where([data-block="customer-portal"]
13664
14268
  /* Modal (shared rb-modal classes) */
13665
14269
  --rb-modal-overlay-bg: rgb(var(--tb-text, 0 0 0) / 0.35);
13666
14270
  --rb-modal-bg: var(--cp-card-bg);
14271
+ --rb-modal-text: var(--cp-text);
14272
+ --rb-modal-heading: var(--cp-text);
14273
+ --rb-modal-link: var(--cp-primary);
14274
+ --rb-modal-supporting: var(--cp-muted);
13667
14275
  --rb-modal-border: var(--cp-card-border);
13668
14276
  --rb-modal-shadow: var(--shadow-lg, var(--shadow-elev));
13669
14277
  --rb-modal-radius: var(--cp-card-radius);
@@ -13977,15 +14585,20 @@ var init_customCss = __esmMin((() => {
13977
14585
  //#endregion
13978
14586
  //#region ../theme-core/src/runtime/buildThemeRuntime.ts
13979
14587
  var init_buildThemeRuntime = __esmMin((() => {
14588
+ init_shadow();
13980
14589
  init_generateButtonCss();
14590
+ init_generateCardCss();
13981
14591
  init_generateAccordionCss();
13982
14592
  init_defaults();
13983
14593
  init_generateInputCss();
13984
14594
  init_header();
13985
14595
  init_footer();
13986
14596
  init_layout$3();
14597
+ init_status();
14598
+ init_typography$1();
13987
14599
  init_tokens();
13988
14600
  init_blocks$2();
14601
+ init_colorStyles();
13989
14602
  init_customCss();
13990
14603
  init_responsiveMode();
13991
14604
  }));
@@ -14016,7 +14629,10 @@ var init_ResponsiveScope = __esmMin((() => {
14016
14629
  //#region ../theme-core/src/fonts/index.ts
14017
14630
  var init_fonts = __esmMin((() => {}));
14018
14631
  var init_buildThemeRuntimeFromBridge = __esmMin((() => {
14632
+ init_shadow();
14019
14633
  init_customCss();
14634
+ init_core$1();
14635
+ init_status();
14020
14636
  init_blocks$2();
14021
14637
  z$1.object({
14022
14638
  tokens: z$1.record(z$1.string(), z$1.string()),
@@ -14622,6 +15238,9 @@ var init_validation_constants = __esmMin((() => {
14622
15238
  "richText",
14623
15239
  "media",
14624
15240
  "videoEmbed",
15241
+ "icon",
15242
+ "feature-card-icon",
15243
+ "svg",
14625
15244
  "button",
14626
15245
  "link",
14627
15246
  "carousel",
@@ -14651,11 +15270,13 @@ var init_validation_constants = __esmMin((() => {
14651
15270
  "value.jsonArray",
14652
15271
  "value.csv",
14653
15272
  "array.marqueeLoop",
15273
+ "value.mapToken",
14654
15274
  "layout.maxWidthClass",
14655
15275
  "layout.headerRootClass",
14656
15276
  "layout.footerRootClass",
14657
15277
  "layout.headerRootStyle",
14658
15278
  "layout.headerSectionBackground",
15279
+ "layout.classicNavMode",
14659
15280
  "layout.footerRootStyle",
14660
15281
  "ui.headerNavLinkClass",
14661
15282
  "ui.headingClassFromAlignment",
@@ -17195,7 +17816,7 @@ var init_themeColorResolution = __esmMin((() => {
17195
17816
  init_tokenOrColor();
17196
17817
  }));
17197
17818
  //#endregion
17198
- //#region ../blocks/src/system/transforms/registry/_utils/sectionForegroundStyles.ts
17819
+ //#region ../blocks/src/system/transforms/registry/_utils/surfaceForegroundStyles.ts
17199
17820
  function readColorToken(input, key) {
17200
17821
  const value = input[key];
17201
17822
  return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
@@ -17204,20 +17825,20 @@ function resolveOptionalForegroundColor(value, context) {
17204
17825
  if (!value) return null;
17205
17826
  return resolveBackgroundColorValue(value, context);
17206
17827
  }
17207
- function resolveSectionForegroundStyles(value, context) {
17828
+ function resolveSurfaceForegroundStyles(value, context) {
17208
17829
  if (!value || typeof value !== "object") return {};
17209
17830
  const input = value;
17210
17831
  const resolvedText = resolveOptionalForegroundColor(readColorToken(input, "textColor"), context);
17211
17832
  if (!resolvedText) return {};
17212
- return {
17213
- color: resolvedText,
17214
- "--section-text-color": resolvedText,
17215
- "--section-heading-color": resolveOptionalForegroundColor(readColorToken(input, "headingColor"), context) ?? resolvedText,
17216
- "--section-link-color": resolveOptionalForegroundColor(readColorToken(input, "linkColor"), context) ?? resolvedText,
17217
- "--section-supporting-color": resolveOptionalForegroundColor(readColorToken(input, "supportingColor"), context) ?? resolvedText
17218
- };
17833
+ return { ...surfaceForegroundStyle({
17834
+ text: resolvedText,
17835
+ heading: resolveOptionalForegroundColor(readColorToken(input, "headingColor"), context) ?? void 0,
17836
+ link: resolveOptionalForegroundColor(readColorToken(input, "linkColor"), context) ?? void 0,
17837
+ supporting: resolveOptionalForegroundColor(readColorToken(input, "supportingColor"), context) ?? void 0
17838
+ }) };
17219
17839
  }
17220
- var init_sectionForegroundStyles = __esmMin((() => {
17840
+ var init_surfaceForegroundStyles = __esmMin((() => {
17841
+ init_surfaces();
17221
17842
  init_themeColorResolution();
17222
17843
  }));
17223
17844
  //#endregion
@@ -17249,7 +17870,7 @@ function isTileTreatment(value) {
17249
17870
  function isEventListTreatment(value) {
17250
17871
  return typeof value === "string" && eventListTreatmentSet.has(value);
17251
17872
  }
17252
- 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;
17873
+ 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;
17253
17874
  var init_boxStyles = __esmMin((() => {
17254
17875
  init_core();
17255
17876
  init_spacing();
@@ -17257,8 +17878,7 @@ var init_boxStyles = __esmMin((() => {
17257
17878
  init_colorStyles();
17258
17879
  init_cards();
17259
17880
  init_blockColorTokens();
17260
- init_themeColorResolution();
17261
- init_sectionForegroundStyles();
17881
+ init_surfaceForegroundStyles();
17262
17882
  spacingTransform = {
17263
17883
  id: "boxStyles.spacing",
17264
17884
  kind: "string",
@@ -17488,45 +18108,11 @@ var init_boxStyles = __esmMin((() => {
17488
18108
  }, context);
17489
18109
  }
17490
18110
  };
17491
- sectionTextColorStyleTransform = {
17492
- id: "sectionStyles.resolveTextColorStyle",
17493
- kind: "formatter",
17494
- summary: "Resolve section text color token into a style object",
17495
- run: (value, options, context) => {
17496
- const fallbackToken = options?.fallbackToken;
17497
- if (typeof value === "string" && value.trim()) {
17498
- const colorValue = resolveBackgroundColorValue(value.trim(), context);
17499
- return {
17500
- color: colorValue,
17501
- "--section-text-color": colorValue
17502
- };
17503
- }
17504
- if (typeof fallbackToken === "string" && fallbackToken.trim()) {
17505
- const colorValue = resolveBackgroundColorValue(fallbackToken.trim(), context);
17506
- return {
17507
- color: colorValue,
17508
- "--section-text-color": colorValue
17509
- };
17510
- }
17511
- return {};
17512
- }
17513
- };
17514
- sectionHeadingColorStyleTransform = {
17515
- id: "sectionStyles.resolveHeadingColorStyle",
17516
- kind: "formatter",
17517
- summary: "Resolve section heading color token into a style object",
17518
- run: (value, options, context) => {
17519
- const fallbackToken = options?.fallbackToken;
17520
- if (typeof value === "string" && value.trim()) return { "--section-heading-color": resolveBackgroundColorValue(value.trim(), context) };
17521
- if (typeof fallbackToken === "string" && fallbackToken.trim()) return { "--section-heading-color": resolveBackgroundColorValue(fallbackToken.trim(), context) };
17522
- return {};
17523
- }
17524
- };
17525
18111
  sectionColorsStyleTransform = {
17526
18112
  id: "sectionStyles.resolveColorsStyle",
17527
18113
  kind: "formatter",
17528
- summary: "Resolve section foreground colors into a style object",
17529
- run: (value, _options, context) => resolveSectionForegroundStyles(value, context)
18114
+ summary: "Resolve surface foreground colors into a style object",
18115
+ run: (value, _options, context) => resolveSurfaceForegroundStyles(value, context)
17530
18116
  };
17531
18117
  GAP_CLASS_MAP = {
17532
18118
  none: "rb-gap-semantic-none",
@@ -17572,8 +18158,6 @@ var init_boxStyles = __esmMin((() => {
17572
18158
  sectionClassNameTransform,
17573
18159
  containerStylesResolveClassName,
17574
18160
  containerStylesResolveBoxClassName,
17575
- sectionTextColorStyleTransform,
17576
- sectionHeadingColorStyleTransform,
17577
18161
  sectionColorsStyleTransform,
17578
18162
  semanticGapTransform,
17579
18163
  semanticGapValueTransform
@@ -18551,7 +19135,29 @@ var init_ctaRow = __esmMin((() => {
18551
19135
  fields: [createCtasRepeater({
18552
19136
  label: "Calls to action",
18553
19137
  itemLabel: "CTA",
18554
- maxItems: 3
19138
+ maxItems: 3,
19139
+ button: { variants: [
19140
+ {
19141
+ value: "primary",
19142
+ label: "Primary"
19143
+ },
19144
+ {
19145
+ value: "secondary",
19146
+ label: "Secondary"
19147
+ },
19148
+ {
19149
+ value: "outline",
19150
+ label: "Outline"
19151
+ },
19152
+ {
19153
+ value: "link",
19154
+ label: "Link"
19155
+ },
19156
+ {
19157
+ value: "accent",
19158
+ label: "Accent"
19159
+ }
19160
+ ] }
18555
19161
  })],
18556
19162
  layout: [ctaRow({
18557
19163
  collectionPath: "content.ctas",
@@ -18852,6 +19458,55 @@ function buildHighlightLayout() {
18852
19458
  function buildGridCardsLayout(className) {
18853
19459
  return el$1("div", { className }, buildResponsiveGridCards());
18854
19460
  }
19461
+ /**
19462
+ * Build a single "featured editorial" testimonial card.
19463
+ *
19464
+ * This card type deliberately renders NO avatar/headshot: an amber quote mark,
19465
+ * the quote body, then the author name and a context line. Colour + surface
19466
+ * treatment is driven entirely by `variantClass` (see testimonials.css):
19467
+ * - `rb-testimonials-fe-card--feature` → spruce-ink card (dark primary bg)
19468
+ * - `rb-testimonials-fe-card--plain` → white surface card
19469
+ *
19470
+ * Extra modifiers (`repeat`, `when`) are forwarded to the card node so the
19471
+ * caller can drive first-vs-rest branching.
19472
+ */
19473
+ function buildFeaturedEditorialCard(variantClass, ...mods) {
19474
+ const quoteMark = text({
19475
+ as: "span",
19476
+ className: "rb-testimonials-fe-qmark",
19477
+ "aria-hidden": "true"
19478
+ }, props({ value: "“" }));
19479
+ const quote = richText({ className: "rb-testimonials-fe-quote rb-max-w-none" }, bind$1("testimonial.content.body"), when("testimonial.content.body"));
19480
+ const meta = el$1("div", { className: "rb-testimonials-fe-meta" }, [text({
19481
+ as: "strong",
19482
+ className: "rb-testimonials-fe-name"
19483
+ }, bind$1("testimonial.content.name", { fallback: "Anonymous" })), text({
19484
+ as: "span",
19485
+ className: "rb-testimonials-fe-context"
19486
+ }, when("testimonial.content.jobTitle"), bind$1("testimonial.content.jobTitle"))]);
19487
+ return el$1("div", { className: `rb-testimonials-fe-card ${variantClass}` }, [
19488
+ quoteMark,
19489
+ quote,
19490
+ meta
19491
+ ], ...mods);
19492
+ }
19493
+ /**
19494
+ * Build the "featured editorial" layout: an asymmetric two-column arrangement
19495
+ * where the FIRST testimonial is a large featured (spruce-ink) card and the
19496
+ * remaining testimonials stack as white cards beside it.
19497
+ *
19498
+ * First-vs-rest branching is done without an offset primitive: the featured
19499
+ * card uses `repeat(..., { limit: 1 })` (entry 0 only), and the rest column
19500
+ * repeats over every entry but skips index 0 via `when("tIndex", { equals: 0,
19501
+ * not: true })`. The `$when` guard is re-evaluated per repeated item with the
19502
+ * index scope in context, so entry 0 produces no node in the rest column.
19503
+ */
19504
+ function buildFeaturedEditorialLayout() {
19505
+ return el$1("div", { className: "rb-testimonials-fe-grid" }, [buildFeaturedEditorialCard("rb-testimonials-fe-card--feature", repeat("data.entries", "testimonial", { limit: 1 })), el$1("div", { className: "rb-testimonials-fe-col" }, [buildFeaturedEditorialCard("rb-testimonials-fe-card--plain", repeat("data.entries", "testimonial", { indexName: "tIndex" }), when("tIndex", {
19506
+ equals: 0,
19507
+ not: true
19508
+ }))])]);
19509
+ }
18855
19510
  var grid$4, testimonialsCarouselFragment;
18856
19511
  var init_testimonialsCarousel = __esmMin((() => {
18857
19512
  init_types$4();
@@ -22199,7 +22854,7 @@ var init_faq = __esmMin((() => {
22199
22854
  children: styledContainer({
22200
22855
  baseClassName: "rb-relative rb-isolate",
22201
22856
  children: stack({
22202
- gap: "xl",
22857
+ gap: "lg",
22203
22858
  className: "rb-w-full rb-max-w-4xl rb-mx-auto"
22204
22859
  }, [headingLayout, accordionLayout])
22205
22860
  }),
@@ -22216,7 +22871,7 @@ var init_faq = __esmMin((() => {
22216
22871
  children: styledContainer({
22217
22872
  baseClassName: "rb-relative rb-isolate",
22218
22873
  children: stack({
22219
- gap: "xl",
22874
+ gap: "lg",
22220
22875
  className: "rb-w-full"
22221
22876
  }, [headingLayout, questionColumnsAccordionLayout])
22222
22877
  }),
@@ -22291,7 +22946,7 @@ var init_faq = __esmMin((() => {
22291
22946
  function toUnknownArray(value) {
22292
22947
  return Array.isArray(value) ? value : [];
22293
22948
  }
22294
- var uppercaseTransform, fallbackTransform, dateFormatShort, arrayLengthTransform, jsonArrayTransform, csvTransform, marqueeLoopOptionsSchema, marqueeLoopTransform, formattingTransforms;
22949
+ var uppercaseTransform, fallbackTransform, dateFormatShort, arrayLengthTransform, jsonArrayTransform, csvTransform, marqueeLoopOptionsSchema, marqueeLoopTransform, mapTokenOptionsSchema, mapTokenTransform, formattingTransforms;
22295
22950
  var init_formatting = __esmMin((() => {
22296
22951
  uppercaseTransform = {
22297
22952
  id: "string.uppercase",
@@ -22379,6 +23034,26 @@ var init_formatting = __esmMin((() => {
22379
23034
  return [...base, ...base];
22380
23035
  }
22381
23036
  };
23037
+ mapTokenOptionsSchema = z$1.object({
23038
+ /**
23039
+ * Maps an input state/enum value (stringified) to a theme token ROLE name
23040
+ * (e.g. `secondary`, `accent`, `muted`, `border`). The role is wrapped to
23041
+ * `rgb(var(--tb-<role>))` so the result drops straight into a `style` binding.
23042
+ */
23043
+ cases: z$1.record(z$1.string(), z$1.string()),
23044
+ /** Role used when the value matches no case. Omit to yield `undefined`. */
23045
+ fallback: z$1.string().optional()
23046
+ });
23047
+ mapTokenTransform = {
23048
+ id: "value.mapToken",
23049
+ kind: "formatter",
23050
+ summary: "Map a state/enum value to a theme token colour (rgb(var(--tb-<role>)))",
23051
+ schema: mapTokenOptionsSchema,
23052
+ run: (value, options) => {
23053
+ const role = options.cases[String(value)] ?? options.fallback;
23054
+ return role ? `rgb(var(--tb-${role}))` : void 0;
23055
+ }
23056
+ };
22382
23057
  formattingTransforms = [
22383
23058
  uppercaseTransform,
22384
23059
  fallbackTransform,
@@ -22386,7 +23061,8 @@ var init_formatting = __esmMin((() => {
22386
23061
  arrayLengthTransform,
22387
23062
  jsonArrayTransform,
22388
23063
  csvTransform,
22389
- marqueeLoopTransform
23064
+ marqueeLoopTransform,
23065
+ mapTokenTransform
22390
23066
  ];
22391
23067
  }));
22392
23068
  //#endregion
@@ -23025,11 +23701,12 @@ function extractBackgroundColorToken(background, fallback) {
23025
23701
  if (background.type === "image") return "neutral-900";
23026
23702
  return fallback;
23027
23703
  }
23028
- var joinClasses, headerLogoClassSchema, headerLogoClassTransform, headerLogoMediaClassTransform, headerLogoTextVisibleTransform, maxWidthClassSchema, maxWidthClassTransform, headerRootClassSchema, headerRootClassTransform, footerRootClassSchema, footerRootClassTransform, headerRootStyleTransform, headerSectionBackgroundTransform, footerRootStyleTransform, footerSpacingClassXMap, footerSpacingClassYMap, footerGapXClassMap, footerGapYClassMap, footerAlignClassMap, footerBottomBarClassSchema, footerBottomBarClassTransform, footerBottomBarContainerClassSchema, footerBottomBarContainerClassTransform, footerBottomBarStyleTransform, footerSplitNavSingleClassTransform, footerSimpleRootClassTransform, footerSimpleNavClassTransform, footerSplitMainClassSchema, footerSplitMainClassTransform, footerLogoClassSchema, footerLogoClassTransform, footerLogoMediaClassSchema, footerLogoMediaClassTransform, footerLogoTextVisibleTransform, layoutTransforms;
23704
+ var joinClasses, headerLogoClassSchema, headerLogoClassTransform, headerLogoMediaClassTransform, headerLogoTextVisibleTransform, classicNavModeTransform, maxWidthClassSchema, maxWidthClassTransform, headerRootClassSchema, headerRootClassTransform, footerRootClassSchema, footerRootClassTransform, headerRootStyleTransform, headerSectionBackgroundTransform, footerRootStyleTransform, footerSpacingClassXMap, footerSpacingClassYMap, footerGapXClassMap, footerGapYClassMap, footerAlignClassMap, footerBottomBarClassSchema, footerBottomBarClassTransform, footerBottomBarContainerClassSchema, footerBottomBarContainerClassTransform, footerBottomBarStyleTransform, footerSplitNavSingleClassTransform, footerSimpleRootClassTransform, footerSimpleNavClassTransform, footerSplitMainClassSchema, footerSplitMainClassTransform, footerLogoClassSchema, footerLogoClassTransform, footerLogoMediaClassSchema, footerLogoMediaClassTransform, footerLogoTextVisibleTransform, layoutTransforms;
23029
23705
  var init_layout$2 = __esmMin((() => {
23030
23706
  init_colorConversion();
23031
23707
  init_core();
23032
23708
  init_colorStyles();
23709
+ init_surfaces();
23033
23710
  init_siteChromePlacement();
23034
23711
  joinClasses = (parts) => parts.filter((part) => typeof part === "string" && part.trim().length > 0).join(" ").replace(/\s+/g, " ").trim();
23035
23712
  headerLogoClassSchema = z$1.object({ base: z$1.string().optional() });
@@ -23071,6 +23748,16 @@ var init_layout$2 = __esmMin((() => {
23071
23748
  return resolveHeaderBrandDisplay(asPartialObject(value)) !== "logo-only";
23072
23749
  }
23073
23750
  };
23751
+ classicNavModeTransform = {
23752
+ id: "layout.classicNavMode",
23753
+ kind: "formatter",
23754
+ summary: "Resolve which classic-layout nav row to render",
23755
+ run: (value) => {
23756
+ const header = asPartialObject(value);
23757
+ if (header?.variant !== "classic") return "other";
23758
+ return header?.navPlacement === "center" ? "centered" : "inline";
23759
+ }
23760
+ };
23074
23761
  maxWidthClassSchema = z$1.object({
23075
23762
  base: z$1.string().optional(),
23076
23763
  container: z$1.string().optional(),
@@ -23200,8 +23887,9 @@ var init_layout$2 = __esmMin((() => {
23200
23887
  styleParts.push(backgroundColorStyle(token));
23201
23888
  }
23202
23889
  }
23203
- if (visuals.textColorOverride) styleParts.push({ color: visuals.textColorOverride });
23204
- else if (visuals.textColorToken) styleParts.push(textColorStyle(visuals.textColorToken));
23890
+ const foreground = visuals.textColorOverride ?? (visuals.textColorToken ? rgbColorValue(visuals.textColorToken) : null);
23891
+ if (!visuals.isTransparent && foreground) styleParts.push(surfaceForegroundStyle({ text: foreground }));
23892
+ else if (foreground) styleParts.push({ color: foreground });
23205
23893
  styleParts.push(borderColorStyle("border"));
23206
23894
  return mergeStyles(...styleParts);
23207
23895
  }
@@ -23289,18 +23977,16 @@ var init_layout$2 = __esmMin((() => {
23289
23977
  const styleParts = [];
23290
23978
  const background = bottomBar?.background;
23291
23979
  if (background?.type === "color") styleParts.push(backgroundColorStyle(background.color ?? "surface"));
23292
- if (bottomBar?.textColor) styleParts.push(textColorStyle(bottomBar.textColor));
23293
23980
  const borderColorToken = bottomBar?.borderTop?.colorToken;
23294
23981
  if (borderColorToken) styleParts.push(borderColorStyle(borderColorToken));
23295
23982
  else styleParts.push(borderColorStyle("border"));
23296
23983
  const borderWidth = bottomBar?.borderTop?.width;
23297
23984
  if (borderWidth && borderWidth !== "none") styleParts.push({ borderTopWidth: borderWidth === "thin" ? "1px" : borderWidth === "medium" ? "2px" : "3px" });
23298
23985
  else if (borderWidth === "none") styleParts.push({ borderTopWidth: "0px" });
23299
- if (!bottomBar?.textColor) {
23300
- const visuals = resolveBackgroundVisualStyles(extractBackgroundColorToken(background, "surface"), context.theme);
23301
- if (visuals.textColorOverride) styleParts.push({ color: visuals.textColorOverride });
23302
- else if (visuals.textColorToken) styleParts.push(textColorStyle(visuals.textColorToken));
23303
- }
23986
+ const visuals = resolveBackgroundVisualStyles(extractBackgroundColorToken(background, "surface"), context.theme);
23987
+ const foreground = bottomBar?.textColor ? rgbColorValue(bottomBar.textColor) : visuals.textColorOverride ?? (visuals.textColorToken ? rgbColorValue(visuals.textColorToken) : null);
23988
+ if (background?.type === "color" && foreground) styleParts.push(surfaceForegroundStyle({ text: foreground }));
23989
+ else if (foreground && bottomBar?.textColor) styleParts.push({ color: foreground });
23304
23990
  return mergeStyles(...styleParts);
23305
23991
  }
23306
23992
  };
@@ -23419,6 +24105,7 @@ var init_layout$2 = __esmMin((() => {
23419
24105
  headerLogoClassTransform,
23420
24106
  headerLogoMediaClassTransform,
23421
24107
  headerLogoTextVisibleTransform,
24108
+ classicNavModeTransform,
23422
24109
  footerRootClassTransform,
23423
24110
  headerRootStyleTransform,
23424
24111
  headerSectionBackgroundTransform,
@@ -23665,7 +24352,7 @@ var init_shared$4 = __esmMin((() => {
23665
24352
  }));
23666
24353
  //#endregion
23667
24354
  //#region ../blocks/src/system/blocks/site-header.ts
23668
- var whenTransformed$1, logoRow, centeredLogoRow, createNavRow, headerCta, mobileCta, mobileToggleIcon, mobileToggleButton, mobileOverlayToggleButton, mobileNavList, mobileOverlayHeader, mobileOverlayBody, mobileOverlay, mobileHeaderBar, classicLayout, centeredLayout, transparentLayout, floatingLayout, headerLayout, siteHeaderManifest, siteHeaderBlockDefinition;
24355
+ var whenTransformed$1, logoRow, centeredLogoRow, createNavRow, headerCta, mobileCta, mobileToggleIcon, mobileToggleButton, mobileOverlayToggleButton, mobileNavList, mobileOverlayHeader, mobileOverlayBody, mobileOverlay, mobileHeaderBar, classicLayout, classicCenteredNavLayout, centeredLayout, transparentLayout, floatingLayout, headerLayout, siteHeaderManifest, siteHeaderBlockDefinition;
23669
24356
  var init_site_header = __esmMin((() => {
23670
24357
  init_builder$1();
23671
24358
  init_fragments$1();
@@ -23854,7 +24541,18 @@ var init_site_header = __esmMin((() => {
23854
24541
  logoRow,
23855
24542
  createNavRow(`rb-ml-auto ${desktopOnlyDisplay("flex")} rb-gap-6`),
23856
24543
  headerCta
23857
- ], when("$root.theme.header.variant", { equals: "classic" }));
24544
+ ], whenTransformed$1("$root.theme.header", "layout.classicNavMode", "inline"));
24545
+ classicCenteredNavLayout = inline({
24546
+ className: bindProp("$root.theme.header.maxWidth", {
24547
+ transforms: pipe(tx("layout.maxWidthClass", { base: `rb-header-layout ${desktopOnlyDisplay("flex")} rb-w-full rb-items-center rb-gap-6` })),
24548
+ fallback: `rb-container rb-header-layout ${desktopOnlyDisplay("flex")} rb-w-full rb-items-center rb-gap-6`
24549
+ }),
24550
+ align: "center"
24551
+ }, [
24552
+ logoRow,
24553
+ createNavRow(`rb-flex-1 rb-justify-center ${desktopOnlyDisplay("flex")} rb-gap-6`, "center"),
24554
+ headerCta
24555
+ ], whenTransformed$1("$root.theme.header", "layout.classicNavMode", "centered"));
23858
24556
  centeredLayout = stack({
23859
24557
  gap: "md",
23860
24558
  align: "center",
@@ -23907,6 +24605,7 @@ var init_site_header = __esmMin((() => {
23907
24605
  }, [
23908
24606
  mobileHeaderBar,
23909
24607
  classicLayout,
24608
+ classicCenteredNavLayout,
23910
24609
  centeredLayout,
23911
24610
  transparentLayout,
23912
24611
  floatingLayout,
@@ -23985,6 +24684,7 @@ var init_site_footer = __esmMin((() => {
23985
24684
  init_defineBlock();
23986
24685
  init_site_footer_nav_groups_layout();
23987
24686
  init_colorStyles();
24687
+ init_surfaces();
23988
24688
  footerTextLayout = () => materializeFragment({ fragment: footerBottomTextFragment }).layout;
23989
24689
  whenTransformed = (from, transformId, equals = true) => (node) => ({
23990
24690
  ...node,
@@ -24153,7 +24853,7 @@ var init_site_footer = __esmMin((() => {
24153
24853
  style: { $bind: {
24154
24854
  from: "$root.theme.footer",
24155
24855
  transforms: [{ id: "layout.footerRootStyle" }],
24156
- fallback: mergeStyles(backgroundColorStyle("surface"), textColorStyle("text"), borderColorStyle("border"))
24856
+ fallback: mergeStyles(backgroundColorStyle("surface"), surfaceForegroundStyle({ text: "rgb(var(--tb-text))" }), borderColorStyle("border"))
24157
24857
  } }
24158
24858
  }, [
24159
24859
  simpleFooterLayout,
@@ -24201,7 +24901,7 @@ var init_site_footer = __esmMin((() => {
24201
24901
  }));
24202
24902
  //#endregion
24203
24903
  //#region ../blocks/src/system/blocks/testimonials.tsx
24204
- var backgroundImageClassName, wrapVariant$2, carouselLayout$1, gridLayout$1, highlightLayout, splitGridLayout, additionalFields, entriesLoader, dataLoaders, testimonialsManifest, testimonialsBlockDefinition;
24904
+ var backgroundImageClassName, wrapVariant$2, carouselLayout$1, gridLayout$1, highlightLayout, splitGridLayout, featuredEditorialLayout, additionalFields, entriesLoader, dataLoaders, testimonialsManifest, testimonialsBlockDefinition;
24205
24905
  var init_testimonials = __esmMin((() => {
24206
24906
  init_schema();
24207
24907
  init_fragments$1();
@@ -24214,7 +24914,7 @@ var init_testimonials = __esmMin((() => {
24214
24914
  backgroundImageClassName = "rb-absolute rb-inset-0 rb-z-neg-10 rb-h-full rb-w-full rb-object-cover rb-opacity-50";
24215
24915
  wrapVariant$2 = (variantLayout) => styledSection({
24216
24916
  children: styledContainer({ children: stack({
24217
- gap: "xl",
24917
+ gap: "lg",
24218
24918
  className: "rb-relative"
24219
24919
  }, [...testimonialsHeadingFragment.layout, variantLayout]) }),
24220
24920
  baseClass: "",
@@ -24240,6 +24940,26 @@ var init_testimonials = __esmMin((() => {
24240
24940
  spacing: "comfortable",
24241
24941
  imageClassName: backgroundImageClassName
24242
24942
  });
24943
+ featuredEditorialLayout = styledSection({
24944
+ children: styledContainer({
24945
+ baseClassName: "rb-relative rb-isolate",
24946
+ children: stack({
24947
+ gap: "lg",
24948
+ className: "rb-relative"
24949
+ }, [el$1("div", { className: "rb-testimonials-fe-head" }, [text({
24950
+ as: "h2",
24951
+ className: "rb-text-left",
24952
+ headingDecoration: "off"
24953
+ }, when("content.heading"), bind$1("content.heading")), el$1("div", { className: "rb-testimonials-fe-leadin" }, [text({
24954
+ as: "p",
24955
+ className: "rb-prose",
24956
+ style: textColorStyle("mutedText")
24957
+ }, when("content.subheading"), bind$1("content.subheading"))])]), buildFeaturedEditorialLayout()])
24958
+ }),
24959
+ baseClass: "",
24960
+ spacing: "comfortable",
24961
+ imageClassName: backgroundImageClassName
24962
+ });
24243
24963
  additionalFields = parseFieldDefinitions([
24244
24964
  ...testimonialsHeadingFragment.fields,
24245
24965
  {
@@ -24326,6 +25046,7 @@ var init_testimonials = __esmMin((() => {
24326
25046
  carousel: carouselLayout$1,
24327
25047
  grid: gridLayout$1,
24328
25048
  "split-grid": splitGridLayout,
25049
+ "featured-editorial": featuredEditorialLayout,
24329
25050
  highlight: highlightLayout
24330
25051
  },
24331
25052
  defaultVariant: "carousel",
@@ -24345,6 +25066,11 @@ var init_testimonials = __esmMin((() => {
24345
25066
  description: "Heading on the left with testimonial cards on the right",
24346
25067
  icon: "PanelLeft"
24347
25068
  },
25069
+ "featured-editorial": {
25070
+ label: "Featured editorial",
25071
+ description: "A large featured ink quote beside a column of stacked cards (no avatars)",
25072
+ icon: "Quote"
25073
+ },
24348
25074
  highlight: {
24349
25075
  label: "Highlight",
24350
25076
  description: "A single, centered testimonial with no carousel",
@@ -25745,7 +26471,7 @@ var init_feature_cards = __esmMin((() => {
25745
26471
  cardsLayout = styledSection({
25746
26472
  children: styledContainer({
25747
26473
  rootType: "stack",
25748
- rootProps: { gap: "xl" },
26474
+ rootProps: { gap: "lg" },
25749
26475
  children: [stack({
25750
26476
  gap: "sm",
25751
26477
  className: "rb-feature-cards-heading rb-mx-auto rb-max-w-3xl rb-text-center"
@@ -27622,8 +28348,11 @@ var init_filtering = __esmMin((() => {
27622
28348
  }));
27623
28349
  //#endregion
27624
28350
  //#region ../blocks/src/system/blocks/events/shared/layout.ts
27625
- function eventSectionHeaderLayoutNodes() {
27626
- return [text({ as: "h2" }, bind$1("content.heading"), when("content.heading", { authoringPresence: recoverEmptyHeadingWhenActive })), richText({ className: "rb-prose rb-max-w-none" }, bind$1("content.description"), when("content.description", { authoringPresence: recoverEmptyDescriptionWhenActive }))];
28351
+ function eventSectionHeaderLayoutNodes(options = {}) {
28352
+ const headingNode = text({ as: "h2" }, bind$1("content.heading"), when("content.heading", { authoringPresence: recoverEmptyHeadingWhenActive }));
28353
+ const descriptionNode = richText({ className: "rb-prose rb-max-w-none" }, bind$1("content.description"), when("content.description", { authoringPresence: recoverEmptyDescriptionWhenActive }));
28354
+ if (options.splitClassName) return [el$1("div", { className: options.splitClassName }, [headingNode, descriptionNode])];
28355
+ return [headingNode, descriptionNode];
27627
28356
  }
27628
28357
  var recoverEmptyHeadingWhenActive, recoverEmptyDescriptionWhenActive;
27629
28358
  var init_layout$1 = __esmMin((() => {
@@ -27715,7 +28444,8 @@ var init_events$1 = __esmMin((() => {
27715
28444
  "combined",
27716
28445
  "calendar",
27717
28446
  "list",
27718
- "timetable"
28447
+ "timetable",
28448
+ "week-board"
27719
28449
  ];
27720
28450
  eventCalendarDefaultViewValues = ["month", "week"];
27721
28451
  eventCalendarListLayoutValues = [
@@ -30292,7 +31022,7 @@ var init_event_calendar = __esmMin((() => {
30292
31022
  children: styledContainer({
30293
31023
  rootType: "stack",
30294
31024
  rootProps: { gap: "lg" },
30295
- children: [...eventSectionHeaderLayoutNodes(), el$1("event-calendar", withApiBindings$1({
31025
+ children: [...eventSectionHeaderLayoutNodes({ splitClassName: "event-section-head event-section-head--split" }), el$1("event-calendar", withApiBindings$1({
30296
31026
  events: { $bind: { from: "data.events" } },
30297
31027
  stage: { $bind: {
30298
31028
  from: "$root.previewStage",
@@ -30403,6 +31133,10 @@ var init_event_calendar = __esmMin((() => {
30403
31133
  value: "timetable",
30404
31134
  label: "Timetable"
30405
31135
  },
31136
+ {
31137
+ value: "week-board",
31138
+ label: "Week board"
31139
+ },
30406
31140
  {
30407
31141
  value: "list",
30408
31142
  label: "List"
@@ -30585,7 +31319,8 @@ var init_event_calendar = __esmMin((() => {
30585
31319
  oneOf: [
30586
31320
  "combined",
30587
31321
  "calendar",
30588
- "timetable"
31322
+ "timetable",
31323
+ "week-board"
30589
31324
  ]
30590
31325
  }
30591
31326
  }
@@ -30688,7 +31423,8 @@ var init_event_calendar = __esmMin((() => {
30688
31423
  "combined",
30689
31424
  "calendar",
30690
31425
  "list",
30691
- "timetable"
31426
+ "timetable",
31427
+ "week-board"
30692
31428
  ]
30693
31429
  }
30694
31430
  }
@@ -30723,7 +31459,8 @@ var init_event_calendar = __esmMin((() => {
30723
31459
  "combined",
30724
31460
  "calendar",
30725
31461
  "list",
30726
- "timetable"
31462
+ "timetable",
31463
+ "week-board"
30727
31464
  ]
30728
31465
  }, {
30729
31466
  field: "showFilters",
@@ -30746,7 +31483,8 @@ var init_event_calendar = __esmMin((() => {
30746
31483
  "combined",
30747
31484
  "calendar",
30748
31485
  "list",
30749
- "timetable"
31486
+ "timetable",
31487
+ "week-board"
30750
31488
  ]
30751
31489
  }, {
30752
31490
  field: "showFilters",
@@ -30769,7 +31507,8 @@ var init_event_calendar = __esmMin((() => {
30769
31507
  "combined",
30770
31508
  "calendar",
30771
31509
  "list",
30772
- "timetable"
31510
+ "timetable",
31511
+ "week-board"
30773
31512
  ]
30774
31513
  }, {
30775
31514
  field: "showFilters",
@@ -30791,7 +31530,8 @@ var init_event_calendar = __esmMin((() => {
30791
31530
  oneOf: [
30792
31531
  "combined",
30793
31532
  "list",
30794
- "timetable"
31533
+ "timetable",
31534
+ "week-board"
30795
31535
  ]
30796
31536
  }, { allOf: [{
30797
31537
  field: "variant",
@@ -30967,6 +31707,7 @@ var init_event_calendar = __esmMin((() => {
30967
31707
  combined: eventCalendarLayout[0],
30968
31708
  calendar: eventCalendarLayout[0],
30969
31709
  timetable: eventCalendarLayout[0],
31710
+ "week-board": eventCalendarLayout[0],
30970
31711
  list: eventCalendarLayout[0]
30971
31712
  };
30972
31713
  eventCalendarContentShape = {
@@ -30980,6 +31721,7 @@ var init_event_calendar = __esmMin((() => {
30980
31721
  { value: "combined" },
30981
31722
  { value: "calendar" },
30982
31723
  { value: "timetable" },
31724
+ { value: "week-board" },
30983
31725
  { value: "list" }
30984
31726
  ]
30985
31727
  },
@@ -31045,6 +31787,7 @@ var init_event_calendar = __esmMin((() => {
31045
31787
  combined: { label: "Combined" },
31046
31788
  calendar: { label: "Calendar" },
31047
31789
  timetable: { label: "Timetable" },
31790
+ "week-board": { label: "Week board" },
31048
31791
  list: { label: "List" }
31049
31792
  }
31050
31793
  };
@@ -36562,6 +37305,12 @@ var init_blocks$1 = __esmMin((() => {
36562
37305
  family: "centered",
36563
37306
  weight: "featured",
36564
37307
  bias: "soft"
37308
+ }),
37309
+ layoutProfile({
37310
+ variantKey: "featured-editorial",
37311
+ family: "split",
37312
+ weight: "featured",
37313
+ bias: "soft"
36565
37314
  })
36566
37315
  ]
36567
37316
  })),
@@ -36694,6 +37443,11 @@ var init_blocks$1 = __esmMin((() => {
36694
37443
  variantKey: "timetable",
36695
37444
  family: "stack",
36696
37445
  weight: "standard"
37446
+ }),
37447
+ layoutProfile({
37448
+ variantKey: "week-board",
37449
+ family: "stack",
37450
+ weight: "standard"
36697
37451
  })
36698
37452
  ]
36699
37453
  })),
@@ -36987,7 +37741,7 @@ var init_background = __esmMin((() => {
36987
37741
  init_background$2();
36988
37742
  init_gradients();
36989
37743
  init_themeColorResolution();
36990
- init_sectionForegroundStyles();
37744
+ init_surfaceForegroundStyles();
36991
37745
  init_backgroundMedia();
36992
37746
  init_media();
36993
37747
  isString = (value) => typeof value === "string" && value.trim().length > 0;
@@ -37116,8 +37870,8 @@ var init_background = __esmMin((() => {
37116
37870
  {
37117
37871
  id: "background.resolveColorsStyle",
37118
37872
  kind: "formatter",
37119
- summary: "Resolve section foreground colors from a background object into scoped CSS vars",
37120
- run: (value, _options, context) => resolveSectionForegroundStyles(value, context)
37873
+ summary: "Resolve surface foreground colors from a background object into scoped CSS vars",
37874
+ run: (value, _options, context) => resolveSurfaceForegroundStyles(value, context)
37121
37875
  },
37122
37876
  {
37123
37877
  id: "background.resolveAllowOverflow",