@riverbankcms/sdk 0.4.3 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/README.md +84 -0
  2. package/dist/cli/index.js +3463 -120
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/client/analytics.js +1 -1
  5. package/dist/client/analytics.js.map +1 -1
  6. package/dist/client/analytics.mjs +1 -1
  7. package/dist/client/analytics.mjs.map +1 -1
  8. package/dist/client/bookings.js +6 -6
  9. package/dist/client/bookings.js.map +1 -1
  10. package/dist/client/bookings.mjs +6 -6
  11. package/dist/client/bookings.mjs.map +1 -1
  12. package/dist/client/client.d.mts +2 -2
  13. package/dist/client/client.d.ts +2 -2
  14. package/dist/client/client.js +1379 -519
  15. package/dist/client/client.js.map +1 -1
  16. package/dist/client/client.mjs +1379 -519
  17. package/dist/client/client.mjs.map +1 -1
  18. package/dist/client/hooks.d.mts +2 -2
  19. package/dist/client/hooks.d.ts +2 -2
  20. package/dist/client/hooks.js +26 -11
  21. package/dist/client/hooks.js.map +1 -1
  22. package/dist/client/hooks.mjs +26 -11
  23. package/dist/client/hooks.mjs.map +1 -1
  24. package/dist/client/rendering/client.js +20 -14
  25. package/dist/client/rendering/client.js.map +1 -1
  26. package/dist/client/rendering/client.mjs +20 -14
  27. package/dist/client/rendering/client.mjs.map +1 -1
  28. package/dist/client/usePage-BTPnCuWC.d.mts +6511 -0
  29. package/dist/client/usePage-BXjk8BhD.d.mts +6704 -0
  30. package/dist/client/usePage-BafOS9UT.d.mts +6512 -0
  31. package/dist/client/usePage-BiOReg0_.d.ts +6704 -0
  32. package/dist/client/usePage-Bnx-kA6x.d.mts +6670 -0
  33. package/dist/client/usePage-DoPI6b8V.d.ts +6511 -0
  34. package/dist/client/usePage-QNWArrVO.d.ts +6670 -0
  35. package/dist/client/usePage-fBgPB6Oq.d.ts +6512 -0
  36. package/dist/server/{Layout-CXI_VkhN.d.ts → Layout-BClXUTsd.d.mts} +4 -4
  37. package/dist/server/{Layout-p6f3TLw9.d.mts → Layout-UXGjXv8M.d.ts} +4 -4
  38. package/dist/server/{chunk-6JBKKV3G.js → chunk-2KCF2DNK.js} +30 -10
  39. package/dist/server/chunk-2KCF2DNK.js.map +1 -0
  40. package/dist/server/chunk-5STV4MWD.js +189 -0
  41. package/dist/server/chunk-5STV4MWD.js.map +1 -0
  42. package/dist/server/{chunk-VHDDXCK6.js → chunk-7UPVCT3K.js} +1206 -496
  43. package/dist/server/chunk-7UPVCT3K.js.map +1 -0
  44. package/dist/server/{chunk-7DS4Q3GA.mjs → chunk-AEFWG657.mjs} +3 -3
  45. package/dist/server/chunk-AEFWG657.mjs.map +1 -0
  46. package/dist/server/{chunk-USQF2XTU.mjs → chunk-BYBJA6SP.mjs} +26 -11
  47. package/dist/server/chunk-BYBJA6SP.mjs.map +1 -0
  48. package/dist/server/{chunk-ES6QDZUX.mjs → chunk-C6FIJC7T.mjs} +2 -2
  49. package/dist/server/{chunk-N3PX76AP.mjs → chunk-CMABGYGI.mjs} +269 -135
  50. package/dist/server/chunk-CMABGYGI.mjs.map +1 -0
  51. package/dist/server/{chunk-TO7FD6TQ.js → chunk-I2D7KOEA.js} +4 -4
  52. package/dist/server/{chunk-TO7FD6TQ.js.map → chunk-I2D7KOEA.js.map} +1 -1
  53. package/dist/server/{chunk-R5B6IOFQ.js → chunk-KA74YRK6.js} +269 -135
  54. package/dist/server/chunk-KA74YRK6.js.map +1 -0
  55. package/dist/server/chunk-KFLZGNPO.mjs +189 -0
  56. package/dist/server/chunk-KFLZGNPO.mjs.map +1 -0
  57. package/dist/server/chunk-L5EA4FXU.mjs +134 -0
  58. package/dist/server/chunk-L5EA4FXU.mjs.map +1 -0
  59. package/dist/server/{chunk-U2NI3TS3.mjs → chunk-LNOUXALA.mjs} +1135 -425
  60. package/dist/server/chunk-LNOUXALA.mjs.map +1 -0
  61. package/dist/server/{chunk-24F6FTCI.mjs → chunk-OSF34JTQ.mjs} +4 -4
  62. package/dist/server/{chunk-G35R7N7B.js → chunk-P3NNN73G.js} +3 -3
  63. package/dist/server/{chunk-G35R7N7B.js.map → chunk-P3NNN73G.js.map} +1 -1
  64. package/dist/server/{chunk-I6K5REFT.mjs → chunk-P4K63SBZ.mjs} +24 -4
  65. package/dist/server/chunk-P4K63SBZ.mjs.map +1 -0
  66. package/dist/server/{chunk-HOY77YBF.js → chunk-RVDS7VSP.js} +5 -5
  67. package/dist/server/chunk-RVDS7VSP.js.map +1 -0
  68. package/dist/server/{chunk-2SSEBAHC.js → chunk-TT5JWA4X.js} +9 -9
  69. package/dist/server/{chunk-2SSEBAHC.js.map → chunk-TT5JWA4X.js.map} +1 -1
  70. package/dist/server/chunk-VSFQRHYZ.js +134 -0
  71. package/dist/server/chunk-VSFQRHYZ.js.map +1 -0
  72. package/dist/server/{chunk-EGTDJ4PL.js → chunk-YYO3RIFO.js} +26 -11
  73. package/dist/server/chunk-YYO3RIFO.js.map +1 -0
  74. package/dist/server/{chunk-OP2GHK27.mjs → chunk-Z5ZA6Q4D.mjs} +2 -2
  75. package/dist/server/{components-Dhiemsjd.d.ts → components-BmaJxgCV.d.mts} +20 -75
  76. package/dist/server/{components-C75e4poV.d.mts → components-DppHY5oD.d.ts} +20 -75
  77. package/dist/server/components.d.mts +11 -8
  78. package/dist/server/components.d.ts +11 -8
  79. package/dist/server/components.js +5 -4
  80. package/dist/server/components.js.map +1 -1
  81. package/dist/server/components.mjs +4 -3
  82. package/dist/server/config-validation.d.mts +3 -3
  83. package/dist/server/config-validation.d.ts +3 -3
  84. package/dist/server/config-validation.js +9 -5
  85. package/dist/server/config-validation.js.map +1 -1
  86. package/dist/server/config-validation.mjs +8 -4
  87. package/dist/server/config.d.mts +243 -5
  88. package/dist/server/config.d.ts +243 -5
  89. package/dist/server/config.js +72 -5
  90. package/dist/server/config.js.map +1 -1
  91. package/dist/server/config.mjs +72 -5
  92. package/dist/server/config.mjs.map +1 -1
  93. package/dist/server/core-DsNWrl3o.d.mts +44 -0
  94. package/dist/server/core-DsNWrl3o.d.ts +44 -0
  95. package/dist/server/data.d.mts +4 -3
  96. package/dist/server/data.d.ts +4 -3
  97. package/dist/server/data.js +3 -3
  98. package/dist/server/data.mjs +2 -2
  99. package/dist/server/{index-CAwBj3-A.d.ts → index-Bucs6UqG.d.mts} +2 -1
  100. package/dist/server/{index-C6o9LPvq.d.mts → index-Cp7tJuRt.d.ts} +2 -1
  101. package/dist/server/index.d.mts +84 -6
  102. package/dist/server/index.d.ts +84 -6
  103. package/dist/server/index.js +91 -2
  104. package/dist/server/index.js.map +1 -1
  105. package/dist/server/index.mjs +90 -1
  106. package/dist/server/index.mjs.map +1 -1
  107. package/dist/server/link-DjxLyC82.d.mts +23 -0
  108. package/dist/server/link-DjxLyC82.d.ts +23 -0
  109. package/dist/server/{loadContent-CdXfuCuE.d.mts → loadContent-BS-3wesN.d.mts} +4 -4
  110. package/dist/server/{loadContent-CsvQRoxb.d.ts → loadContent-Buvmudee.d.ts} +4 -4
  111. package/dist/server/{loadPage-p3AWwwrd.d.mts → loadPage-B8mQUUSo.d.mts} +5 -46
  112. package/dist/server/loadPage-DNQTTRHL.mjs +11 -0
  113. package/dist/server/{loadPage-BA0HiT-6.d.ts → loadPage-DP3nrHBi.d.ts} +5 -46
  114. package/dist/server/loadPage-IDGVDFBB.js +11 -0
  115. package/dist/server/{loadPage-DLC7DJZP.js.map → loadPage-IDGVDFBB.js.map} +1 -1
  116. package/dist/server/metadata.d.mts +6 -4
  117. package/dist/server/metadata.d.ts +6 -4
  118. package/dist/server/navigation.d.mts +199 -29
  119. package/dist/server/navigation.d.ts +199 -29
  120. package/dist/server/navigation.js +27 -43
  121. package/dist/server/navigation.js.map +1 -1
  122. package/dist/server/navigation.mjs +20 -36
  123. package/dist/server/navigation.mjs.map +1 -1
  124. package/dist/server/rendering/server.d.mts +8 -6
  125. package/dist/server/rendering/server.d.ts +8 -6
  126. package/dist/server/rendering/server.js +7 -6
  127. package/dist/server/rendering/server.js.map +1 -1
  128. package/dist/server/rendering/server.mjs +6 -5
  129. package/dist/server/rendering.d.mts +14 -10
  130. package/dist/server/rendering.d.ts +14 -10
  131. package/dist/server/rendering.js +9 -8
  132. package/dist/server/rendering.js.map +1 -1
  133. package/dist/server/rendering.mjs +8 -7
  134. package/dist/server/richTextSchema-DURiozvD.d.mts +62 -0
  135. package/dist/server/richTextSchema-DURiozvD.d.ts +62 -0
  136. package/dist/server/routing.d.mts +178 -11
  137. package/dist/server/routing.d.ts +178 -11
  138. package/dist/server/routing.js +95 -2
  139. package/dist/server/routing.js.map +1 -1
  140. package/dist/server/routing.mjs +94 -1
  141. package/dist/server/routing.mjs.map +1 -1
  142. package/dist/server/{schema-Bpy9N5ZI.d.mts → schema-Z6-afHJG.d.mts} +1 -1
  143. package/dist/server/{schema-Bpy9N5ZI.d.ts → schema-Z6-afHJG.d.ts} +1 -1
  144. package/dist/server/server.d.mts +9 -7
  145. package/dist/server/server.d.ts +9 -7
  146. package/dist/server/server.js +6 -6
  147. package/dist/server/server.mjs +5 -5
  148. package/dist/server/theme-bridge.js +8 -8
  149. package/dist/server/theme-bridge.mjs +2 -2
  150. package/dist/server/{types-Dj8B3QRb.d.ts → types-1cLz0vnq.d.mts} +55 -2
  151. package/dist/server/{types-txWsSxN7.d.mts → types-BjgZt8xJ.d.mts} +63 -2
  152. package/dist/server/{types-CdhKJrB0.d.mts → types-BvcJU7zk.d.ts} +55 -2
  153. package/dist/server/{types-BWQ-TohG.d.ts → types-CVykEqXN.d.ts} +289 -83
  154. package/dist/server/{types-CL916r6x.d.ts → types-DLBhEPSt.d.ts} +63 -2
  155. package/dist/server/{types-BLf-hE50.d.mts → types-Dsu9wsUh.d.mts} +289 -83
  156. package/dist/server/{validation-DzvDwwRo.d.mts → validation-BGuRo8P1.d.mts} +18 -5
  157. package/dist/server/{validation-CoU8uAiu.d.ts → validation-DU2YE7u5.d.ts} +18 -5
  158. package/package.json +5 -1
  159. package/dist/server/chunk-6JBKKV3G.js.map +0 -1
  160. package/dist/server/chunk-7DS4Q3GA.mjs.map +0 -1
  161. package/dist/server/chunk-EGTDJ4PL.js.map +0 -1
  162. package/dist/server/chunk-HOY77YBF.js.map +0 -1
  163. package/dist/server/chunk-I6K5REFT.mjs.map +0 -1
  164. package/dist/server/chunk-LCYGQDAB.mjs +0 -835
  165. package/dist/server/chunk-LCYGQDAB.mjs.map +0 -1
  166. package/dist/server/chunk-N3PX76AP.mjs.map +0 -1
  167. package/dist/server/chunk-R5B6IOFQ.js.map +0 -1
  168. package/dist/server/chunk-TNYU5EIO.js +0 -835
  169. package/dist/server/chunk-TNYU5EIO.js.map +0 -1
  170. package/dist/server/chunk-U2NI3TS3.mjs.map +0 -1
  171. package/dist/server/chunk-USQF2XTU.mjs.map +0 -1
  172. package/dist/server/chunk-VHDDXCK6.js.map +0 -1
  173. package/dist/server/loadPage-DLC7DJZP.js +0 -11
  174. package/dist/server/loadPage-GEGN4UAL.mjs +0 -11
  175. /package/dist/server/{chunk-ES6QDZUX.mjs.map → chunk-C6FIJC7T.mjs.map} +0 -0
  176. /package/dist/server/{chunk-24F6FTCI.mjs.map → chunk-OSF34JTQ.mjs.map} +0 -0
  177. /package/dist/server/{chunk-OP2GHK27.mjs.map → chunk-Z5ZA6Q4D.mjs.map} +0 -0
  178. /package/dist/server/{loadPage-GEGN4UAL.mjs.map → loadPage-DNQTTRHL.mjs.map} +0 -0
@@ -39,7 +39,7 @@
39
39
 
40
40
 
41
41
 
42
- var _chunkEGTDJ4PLjs = require('./chunk-EGTDJ4PL.js');
42
+ var _chunkYYO3RIFOjs = require('./chunk-YYO3RIFO.js');
43
43
 
44
44
  // ../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs
45
45
  function r(e) {
@@ -109,8 +109,8 @@ var MediaNode = ({ value, className, style }) => {
109
109
  "div",
110
110
  {
111
111
  className: clsx_default("flex h-48 w-full items-center justify-center", className),
112
- style: _chunkEGTDJ4PLjs.mergeStyles.call(void 0, _chunkEGTDJ4PLjs.backgroundColorStyle.call(void 0, "neutral-200"), style),
113
- children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "text-sm", style: _chunkEGTDJ4PLjs.textColorStyle.call(void 0, "neutral-600"), children: "Image unavailable" })
112
+ style: _chunkYYO3RIFOjs.mergeStyles.call(void 0, _chunkYYO3RIFOjs.backgroundColorStyle.call(void 0, "neutral-200"), style),
113
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "text-sm", style: _chunkYYO3RIFOjs.textColorStyle.call(void 0, "neutral-600"), children: "Image unavailable" })
114
114
  }
115
115
  );
116
116
  }
@@ -121,7 +121,7 @@ var MediaNode = ({ value, className, style }) => {
121
121
  src: imageUrl,
122
122
  alt: _nullishCoalesce(value.alt, () => ( "")),
123
123
  className,
124
- style: _chunkEGTDJ4PLjs.mergeStyles.call(void 0, style, hotspotStyle),
124
+ style: _chunkYYO3RIFOjs.mergeStyles.call(void 0, style, hotspotStyle),
125
125
  loading: "lazy"
126
126
  }
127
127
  );
@@ -655,8 +655,8 @@ function getLabWhitePoint() {
655
655
  var lab2rgb = (...args) => {
656
656
  args = unpack_default(args, "lab");
657
657
  const [L, a, b] = args;
658
- const [x, y, z5] = lab2xyz(L, a, b);
659
- const [r2, g, b_] = xyz2rgb(x, y, z5);
658
+ const [x, y, z7] = lab2xyz(L, a, b);
659
+ const [r2, g, b_] = xyz2rgb(x, y, z7);
660
660
  return [r2, g, b_, args.length > 3 ? args[3] : 1];
661
661
  };
662
662
  var lab2xyz = (L, a, b) => {
@@ -671,15 +671,15 @@ var lab2xyz = (L, a, b) => {
671
671
  const zr = fz3 > kE ? fz3 : (116 * fz - 16) / kK;
672
672
  const x = xr * Xn;
673
673
  const y = yr * Yn;
674
- const z5 = zr * Zn;
675
- return [x, y, z5];
674
+ const z7 = zr * Zn;
675
+ return [x, y, z7];
676
676
  };
677
677
  var compand = (linear) => {
678
678
  const sign = Math.sign(linear);
679
679
  linear = Math.abs(linear);
680
680
  return (linear <= 31308e-7 ? linear * 12.92 : 1.055 * Math.pow(linear, 1 / 2.4) - 0.055) * sign;
681
681
  };
682
- var xyz2rgb = (x, y, z5) => {
682
+ var xyz2rgb = (x, y, z7) => {
683
683
  const { MtxAdaptMa, MtxAdaptMaI, MtxXYZ2RGB, RefWhiteRGB, Xn, Yn, Zn } = lab_constants_default;
684
684
  const As = Xn * MtxAdaptMa.m00 + Yn * MtxAdaptMa.m10 + Zn * MtxAdaptMa.m20;
685
685
  const Bs = Xn * MtxAdaptMa.m01 + Yn * MtxAdaptMa.m11 + Zn * MtxAdaptMa.m21;
@@ -687,9 +687,9 @@ var xyz2rgb = (x, y, z5) => {
687
687
  const Ad = RefWhiteRGB.X * MtxAdaptMa.m00 + RefWhiteRGB.Y * MtxAdaptMa.m10 + RefWhiteRGB.Z * MtxAdaptMa.m20;
688
688
  const Bd = RefWhiteRGB.X * MtxAdaptMa.m01 + RefWhiteRGB.Y * MtxAdaptMa.m11 + RefWhiteRGB.Z * MtxAdaptMa.m21;
689
689
  const Cd = RefWhiteRGB.X * MtxAdaptMa.m02 + RefWhiteRGB.Y * MtxAdaptMa.m12 + RefWhiteRGB.Z * MtxAdaptMa.m22;
690
- const X1 = (x * MtxAdaptMa.m00 + y * MtxAdaptMa.m10 + z5 * MtxAdaptMa.m20) * (Ad / As);
691
- const Y1 = (x * MtxAdaptMa.m01 + y * MtxAdaptMa.m11 + z5 * MtxAdaptMa.m21) * (Bd / Bs);
692
- const Z1 = (x * MtxAdaptMa.m02 + y * MtxAdaptMa.m12 + z5 * MtxAdaptMa.m22) * (Cd / Cs);
690
+ const X1 = (x * MtxAdaptMa.m00 + y * MtxAdaptMa.m10 + z7 * MtxAdaptMa.m20) * (Ad / As);
691
+ const Y1 = (x * MtxAdaptMa.m01 + y * MtxAdaptMa.m11 + z7 * MtxAdaptMa.m21) * (Bd / Bs);
692
+ const Z1 = (x * MtxAdaptMa.m02 + y * MtxAdaptMa.m12 + z7 * MtxAdaptMa.m22) * (Cd / Cs);
693
693
  const X2 = X1 * MtxAdaptMaI.m00 + Y1 * MtxAdaptMaI.m10 + Z1 * MtxAdaptMaI.m20;
694
694
  const Y2 = X1 * MtxAdaptMaI.m01 + Y1 * MtxAdaptMaI.m11 + Z1 * MtxAdaptMaI.m21;
695
695
  const Z2 = X1 * MtxAdaptMaI.m02 + Y1 * MtxAdaptMaI.m12 + Z1 * MtxAdaptMaI.m22;
@@ -709,15 +709,15 @@ var lab2rgb_default = lab2rgb;
709
709
  // ../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/lab/rgb2lab.js
710
710
  var rgb2lab = (...args) => {
711
711
  const [r2, g, b, ...rest] = unpack_default(args, "rgb");
712
- const [x, y, z5] = rgb2xyz(r2, g, b);
713
- const [L, a, b_] = xyz2lab(x, y, z5);
712
+ const [x, y, z7] = rgb2xyz(r2, g, b);
713
+ const [L, a, b_] = xyz2lab(x, y, z7);
714
714
  return [L, a, b_, ...rest.length > 0 && rest[0] < 1 ? [rest[0]] : []];
715
715
  };
716
- function xyz2lab(x, y, z5) {
716
+ function xyz2lab(x, y, z7) {
717
717
  const { Xn, Yn, Zn, kE, kK } = lab_constants_default;
718
718
  const xr = x / Xn;
719
719
  const yr = y / Yn;
720
- const zr = z5 / Zn;
720
+ const zr = z7 / Zn;
721
721
  const fx = xr > kE ? Math.pow(xr, 1 / 3) : (kK * xr + 16) / 116;
722
722
  const fy = yr > kE ? Math.pow(yr, 1 / 3) : (kK * yr + 16) / 116;
723
723
  const fz = zr > kE ? Math.pow(zr, 1 / 3) : (kK * zr + 16) / 116;
@@ -736,20 +736,20 @@ var rgb2xyz = (r2, g, b) => {
736
736
  const { MtxRGB2XYZ, MtxAdaptMa, MtxAdaptMaI, Xn, Yn, Zn, As, Bs, Cs } = lab_constants_default;
737
737
  let x = r2 * MtxRGB2XYZ.m00 + g * MtxRGB2XYZ.m10 + b * MtxRGB2XYZ.m20;
738
738
  let y = r2 * MtxRGB2XYZ.m01 + g * MtxRGB2XYZ.m11 + b * MtxRGB2XYZ.m21;
739
- let z5 = r2 * MtxRGB2XYZ.m02 + g * MtxRGB2XYZ.m12 + b * MtxRGB2XYZ.m22;
739
+ let z7 = r2 * MtxRGB2XYZ.m02 + g * MtxRGB2XYZ.m12 + b * MtxRGB2XYZ.m22;
740
740
  const Ad = Xn * MtxAdaptMa.m00 + Yn * MtxAdaptMa.m10 + Zn * MtxAdaptMa.m20;
741
741
  const Bd = Xn * MtxAdaptMa.m01 + Yn * MtxAdaptMa.m11 + Zn * MtxAdaptMa.m21;
742
742
  const Cd = Xn * MtxAdaptMa.m02 + Yn * MtxAdaptMa.m12 + Zn * MtxAdaptMa.m22;
743
- let X = x * MtxAdaptMa.m00 + y * MtxAdaptMa.m10 + z5 * MtxAdaptMa.m20;
744
- let Y = x * MtxAdaptMa.m01 + y * MtxAdaptMa.m11 + z5 * MtxAdaptMa.m21;
745
- let Z = x * MtxAdaptMa.m02 + y * MtxAdaptMa.m12 + z5 * MtxAdaptMa.m22;
743
+ let X = x * MtxAdaptMa.m00 + y * MtxAdaptMa.m10 + z7 * MtxAdaptMa.m20;
744
+ let Y = x * MtxAdaptMa.m01 + y * MtxAdaptMa.m11 + z7 * MtxAdaptMa.m21;
745
+ let Z = x * MtxAdaptMa.m02 + y * MtxAdaptMa.m12 + z7 * MtxAdaptMa.m22;
746
746
  X *= Ad / As;
747
747
  Y *= Bd / Bs;
748
748
  Z *= Cd / Cs;
749
749
  x = X * MtxAdaptMaI.m00 + Y * MtxAdaptMaI.m10 + Z * MtxAdaptMaI.m20;
750
750
  y = X * MtxAdaptMaI.m01 + Y * MtxAdaptMaI.m11 + Z * MtxAdaptMaI.m21;
751
- z5 = X * MtxAdaptMaI.m02 + Y * MtxAdaptMaI.m12 + Z * MtxAdaptMaI.m22;
752
- return [x, y, z5];
751
+ z7 = X * MtxAdaptMaI.m02 + Y * MtxAdaptMaI.m12 + Z * MtxAdaptMaI.m22;
752
+ return [x, y, z7];
753
753
  };
754
754
  var rgb2lab_default = rgb2lab;
755
755
 
@@ -3078,7 +3078,7 @@ function generateShades(hexColor, name) {
3078
3078
  900: 0.1,
3079
3079
  950: 0.05
3080
3080
  };
3081
- const lightness = lightnessMap[shadeNumber];
3081
+ const lightness = _nullishCoalesce(lightnessMap[shadeNumber], () => ( 0.5));
3082
3082
  const shadeColor = base.luminance(lightness).hex();
3083
3083
  return {
3084
3084
  name: shadeName,
@@ -3105,7 +3105,7 @@ function generateNeutralScale({
3105
3105
  for (let i = 0; i < count; i++) {
3106
3106
  const t = i / (count - 1);
3107
3107
  const tone = isDark ? mix(0.06, 0.92, t) : mix(0.98, 0.1, t);
3108
- const hex2 = _chunkEGTDJ4PLjs.oklchToHexGamut.call(void 0, tone, 0.02, warm ? 85 : 250);
3108
+ const hex2 = _chunkYYO3RIFOjs.oklchToHexGamut.call(void 0, tone, 0.02, warm ? 85 : 250);
3109
3109
  const name = `neutral-${shadeNames[i]}`;
3110
3110
  scale.push({ name, hex: hex2 });
3111
3111
  }
@@ -3125,7 +3125,7 @@ function colorsToMap(palette) {
3125
3125
  }
3126
3126
  function isBackgroundDark(hex2) {
3127
3127
  try {
3128
- return _chunkEGTDJ4PLjs.featuresFromHex.call(void 0, hex2).Y < 0.5;
3128
+ return _chunkYYO3RIFOjs.featuresFromHex.call(void 0, hex2).Y < 0.5;
3129
3129
  } catch (e2) {
3130
3130
  return false;
3131
3131
  }
@@ -3149,7 +3149,7 @@ function expandPalette(palette) {
3149
3149
  if (base.text) expanded.body = base.text;
3150
3150
  const isDark = base.background ? isBackgroundDark(base.background) : false;
3151
3151
  const isDarkMode = _optionalChain([palette, 'access', _6 => _6.meta, 'optionalAccess', _7 => _7.mode]) === "dark" || isDark;
3152
- expanded.mutedText = isDarkMode ? expanded["neutral-600"] : expanded["neutral-500"];
3152
+ expanded.mutedText = isDarkMode ? _nullishCoalesce(expanded["neutral-600"], () => ( "#666")) : _nullishCoalesce(expanded["neutral-500"], () => ( "#888"));
3153
3153
  return expanded;
3154
3154
  }
3155
3155
 
@@ -3158,7 +3158,7 @@ function generateCssVars(palette) {
3158
3158
  const cssVars = {};
3159
3159
  Object.entries(palette).forEach(([key, value]) => {
3160
3160
  if (value !== null && value !== void 0) {
3161
- const { r: r2, g, b } = _chunkEGTDJ4PLjs.hexToRgb.call(void 0, value);
3161
+ const { r: r2, g, b } = _chunkYYO3RIFOjs.hexToRgb.call(void 0, value);
3162
3162
  cssVars[`--tb-${key}`] = `${r2} ${g} ${b}`;
3163
3163
  }
3164
3164
  });
@@ -3217,6 +3217,83 @@ function generateShadowCssVars(theme) {
3217
3217
  };
3218
3218
  }
3219
3219
 
3220
+ // ../blocks/src/theme/tokens/resolver.ts
3221
+ var TokenResolver = class {
3222
+ constructor(theme) {
3223
+ this.theme = theme;
3224
+ }
3225
+ /**
3226
+ * Resolve a color token to a CSS variable reference wrapped in rgb()
3227
+ *
3228
+ * @param token - Token name (e.g., 'primary-500', 'white', 'text-900')
3229
+ * @returns CSS rgb() function with var reference (e.g., 'rgb(var(--tb-primary-500))')
3230
+ *
3231
+ * Note: CSS variables are stored as RGB channels (e.g., "37 99 235") following Tailwind convention,
3232
+ * so we must wrap them with rgb() to create a valid color value.
3233
+ *
3234
+ * @example
3235
+ * resolver.getColor('primary-500') // => 'rgb(var(--tb-primary-500))'
3236
+ * resolver.getColor('white') // => 'rgb(var(--tb-white))'
3237
+ */
3238
+ getColor(token) {
3239
+ if (!this.tokenExists(token)) {
3240
+ console.warn(
3241
+ `[TokenResolver] Color token "${token}" not found in theme palette. Button may render incorrectly.`
3242
+ );
3243
+ }
3244
+ return `rgb(var(--tb-${token}))`;
3245
+ }
3246
+ /**
3247
+ * Adjust a color token's shade by a given amount
3248
+ *
3249
+ * @param token - Base token (e.g., 'primary-500')
3250
+ * @param amount - Shade adjustment (+100 = darker, -100 = lighter)
3251
+ * @returns Adjusted token name (e.g., 'primary-600')
3252
+ *
3253
+ * @example
3254
+ * resolver.adjustShade('primary-500', 100) // => 'primary-600' (darker)
3255
+ * resolver.adjustShade('primary-500', -100) // => 'primary-400' (lighter)
3256
+ */
3257
+ adjustShade(token, amount) {
3258
+ const parts = token.split("-");
3259
+ if (parts.length < 2) {
3260
+ const newShade2 = Math.max(100, Math.min(900, 500 + amount));
3261
+ return `${token}-${newShade2}`;
3262
+ }
3263
+ const base = parts.slice(0, -1).join("-");
3264
+ const shade = parseInt(_nullishCoalesce(parts[parts.length - 1], () => ( "")), 10);
3265
+ if (isNaN(shade)) {
3266
+ console.warn(
3267
+ `[TokenResolver] Cannot adjust shade for non-shade token "${token}". Returning original token.`
3268
+ );
3269
+ return token;
3270
+ }
3271
+ const newShade = Math.max(100, Math.min(900, shade + amount));
3272
+ return `${base}-${newShade}`;
3273
+ }
3274
+ /**
3275
+ * Check if a token exists in the theme palette
3276
+ *
3277
+ * @param token - Token name to check
3278
+ * @returns True if token exists in theme
3279
+ */
3280
+ tokenExists(token) {
3281
+ const commonTokens = ["white", "black", "transparent"];
3282
+ if (commonTokens.includes(token)) {
3283
+ return true;
3284
+ }
3285
+ const parts = token.split("-");
3286
+ if (parts.length >= 2) {
3287
+ const lastPart = _nullishCoalesce(parts[parts.length - 1], () => ( ""));
3288
+ const shade = parseInt(lastPart, 10);
3289
+ if (!isNaN(shade) && shade >= 100 && shade <= 900 && shade % 100 === 0) {
3290
+ return true;
3291
+ }
3292
+ }
3293
+ return true;
3294
+ }
3295
+ };
3296
+
3220
3297
  // ../blocks/src/theme/buttons/effects/presets/background.ts
3221
3298
  var darkenBackgroundEffect = {
3222
3299
  id: "darken-background",
@@ -3224,6 +3301,7 @@ var darkenBackgroundEffect = {
3224
3301
  description: "Darkens the background color on hover",
3225
3302
  category: "background",
3226
3303
  pseudoElement: "none",
3304
+ applicableTo: ["button"],
3227
3305
  customizableOption: {
3228
3306
  name: "amount",
3229
3307
  type: "number",
@@ -3255,6 +3333,7 @@ var lightenBackgroundEffect = {
3255
3333
  description: "Lightens the background color on hover",
3256
3334
  category: "background",
3257
3335
  pseudoElement: "none",
3336
+ applicableTo: ["button"],
3258
3337
  customizableOption: {
3259
3338
  name: "amount",
3260
3339
  type: "number",
@@ -3286,6 +3365,7 @@ var fadeBackgroundEffect = {
3286
3365
  description: "Reduces background opacity on hover",
3287
3366
  category: "background",
3288
3367
  pseudoElement: "none",
3368
+ applicableTo: ["button", "nav-link"],
3289
3369
  customizableOption: {
3290
3370
  name: "opacity",
3291
3371
  type: "percentage",
@@ -3308,6 +3388,7 @@ var opacityReduceEffect = {
3308
3388
  description: "Reduces button opacity on hover by a percentage",
3309
3389
  category: "background",
3310
3390
  pseudoElement: "none",
3391
+ applicableTo: ["button", "nav-link"],
3311
3392
  customizableOption: {
3312
3393
  name: "reduction",
3313
3394
  type: "percentage",
@@ -3331,6 +3412,7 @@ var animatedGradientEffect = {
3331
3412
  description: "Animates gradient position on hover",
3332
3413
  category: "background",
3333
3414
  pseudoElement: "none",
3415
+ applicableTo: ["button"],
3334
3416
  customizableOption: {
3335
3417
  name: "direction",
3336
3418
  type: "select",
@@ -3370,6 +3452,7 @@ var backgroundOnHoverEffect = {
3370
3452
  description: "Adds background color on hover",
3371
3453
  category: "background",
3372
3454
  pseudoElement: "none",
3455
+ applicableTo: ["button", "nav-link"],
3373
3456
  customizableOption: {
3374
3457
  name: "colorToken",
3375
3458
  type: "select",
@@ -3395,6 +3478,7 @@ var backgroundOnHoverAlphaEffect = {
3395
3478
  description: "Adds semi-transparent background on hover",
3396
3479
  category: "background",
3397
3480
  pseudoElement: "none",
3481
+ applicableTo: ["button", "nav-link"],
3398
3482
  customizableOption: {
3399
3483
  name: "opacity",
3400
3484
  type: "percentage",
@@ -3416,6 +3500,33 @@ var backgroundOnHoverAlphaEffect = {
3416
3500
  }
3417
3501
  };
3418
3502
 
3503
+ // ../blocks/src/theme/buttons/effects/cssUtils.ts
3504
+ var STATE_SELECTORS = {
3505
+ hover: ':hover, [data-force-hover="true"]',
3506
+ active: ":active",
3507
+ focus: ":focus-visible",
3508
+ base: ""
3509
+ };
3510
+ function getStateSelector(themeId, variantId, state) {
3511
+ const stateSelector = STATE_SELECTORS[state];
3512
+ if (state === "base") {
3513
+ return `:where([data-theme-scope="${themeId}"]) .${variantId}`;
3514
+ }
3515
+ if (state === "hover") {
3516
+ return `:where([data-theme-scope="${themeId}"]) .${variantId}:hover,
3517
+ :where([data-theme-scope="${themeId}"]) .${variantId}[data-force-hover="true"]`;
3518
+ }
3519
+ return `:where([data-theme-scope="${themeId}"]) .${variantId}${stateSelector}`;
3520
+ }
3521
+ function generateStateCSS(themeId, variantId, state, cssProperties) {
3522
+ const selector = getStateSelector(themeId, variantId, state);
3523
+ return `
3524
+ ${selector} {
3525
+ ${cssProperties}
3526
+ }
3527
+ `;
3528
+ }
3529
+
3419
3530
  // ../blocks/src/theme/buttons/effects/presets/shadow.ts
3420
3531
  var borderGlowEffect = {
3421
3532
  id: "border-glow",
@@ -3423,6 +3534,7 @@ var borderGlowEffect = {
3423
3534
  description: "Adds a glowing shadow on hover",
3424
3535
  category: "shadow",
3425
3536
  pseudoElement: "none",
3537
+ applicableTo: ["button", "nav-link"],
3426
3538
  customizableOption: {
3427
3539
  name: "glowColorToken",
3428
3540
  type: "colorToken",
@@ -3433,11 +3545,7 @@ var borderGlowEffect = {
3433
3545
  const { themeId, variantId, options, tokens } = ctx;
3434
3546
  const glowToken = options.glowColorToken || "primary-400";
3435
3547
  const glowColor = tokens.getColor(glowToken);
3436
- return `
3437
- :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
3438
- box-shadow: 0 0 15px ${glowColor};
3439
- }
3440
- `;
3548
+ return generateStateCSS(themeId, variantId, "hover", `box-shadow: 0 0 15px ${glowColor};`);
3441
3549
  }
3442
3550
  };
3443
3551
  var dropShadowEffect = {
@@ -3446,6 +3554,7 @@ var dropShadowEffect = {
3446
3554
  description: "Adds an elevated shadow on hover",
3447
3555
  category: "shadow",
3448
3556
  pseudoElement: "none",
3557
+ applicableTo: ["button"],
3449
3558
  customizableOption: {
3450
3559
  name: "intensity",
3451
3560
  type: "select",
@@ -3461,11 +3570,7 @@ var dropShadowEffect = {
3461
3570
  medium: "0 10px 15px rgba(0, 0, 0, 0.15)",
3462
3571
  strong: "0 20px 25px rgba(0, 0, 0, 0.2)"
3463
3572
  };
3464
- return `
3465
- :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
3466
- box-shadow: ${shadows[intensity]};
3467
- }
3468
- `;
3573
+ return generateStateCSS(themeId, variantId, "hover", `box-shadow: ${shadows[intensity]};`);
3469
3574
  }
3470
3575
  };
3471
3576
  var innerShadowEffect = {
@@ -3474,6 +3579,7 @@ var innerShadowEffect = {
3474
3579
  description: "Adds an inset shadow for a pressed appearance",
3475
3580
  category: "shadow",
3476
3581
  pseudoElement: "none",
3582
+ applicableTo: ["button"],
3477
3583
  generateCSS: (ctx) => {
3478
3584
  const { themeId, variantId } = ctx;
3479
3585
  return `
@@ -3489,6 +3595,7 @@ var neumorphicShadowEffect = {
3489
3595
  description: "Dual shadows for soft UI design (raised or pressed)",
3490
3596
  category: "shadow",
3491
3597
  pseudoElement: "none",
3598
+ applicableTo: ["button", "nav-link"],
3492
3599
  customizableOption: {
3493
3600
  name: "mode",
3494
3601
  type: "select",
@@ -3531,6 +3638,7 @@ var outerGlowEffect = {
3531
3638
  description: "Creates an outer glow around the button",
3532
3639
  category: "shadow",
3533
3640
  pseudoElement: "none",
3641
+ applicableTo: ["button", "nav-link"],
3534
3642
  customizableOption: {
3535
3643
  name: "spread",
3536
3644
  type: "number",
@@ -3565,6 +3673,7 @@ var retro3DShadowEffect = {
3565
3673
  description: "3D pressed shadow with vertical movement (retro style)",
3566
3674
  category: "shadow",
3567
3675
  pseudoElement: "none",
3676
+ applicableTo: ["button"],
3568
3677
  generateCSS: (ctx) => {
3569
3678
  const { themeId, variantId } = ctx;
3570
3679
  return `
@@ -3597,6 +3706,7 @@ var scaleUpEffect = {
3597
3706
  description: "Slightly enlarges the button on hover",
3598
3707
  category: "transform",
3599
3708
  pseudoElement: "none",
3709
+ applicableTo: ["button", "nav-link"],
3600
3710
  customizableOption: {
3601
3711
  name: "scale",
3602
3712
  type: "select",
@@ -3607,11 +3717,7 @@ var scaleUpEffect = {
3607
3717
  generateCSS: (ctx) => {
3608
3718
  const { themeId, variantId, options } = ctx;
3609
3719
  const scale = options.scale || "1.05";
3610
- return `
3611
- :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
3612
- transform: scale(${scale});
3613
- }
3614
- `;
3720
+ return generateStateCSS(themeId, variantId, "hover", `transform: scale(${scale});`);
3615
3721
  }
3616
3722
  };
3617
3723
  var scaleDownEffect = {
@@ -3620,6 +3726,7 @@ var scaleDownEffect = {
3620
3726
  description: "Slightly shrinks the button when clicked",
3621
3727
  category: "transform",
3622
3728
  pseudoElement: "none",
3729
+ applicableTo: ["button", "nav-link"],
3623
3730
  customizableOption: {
3624
3731
  name: "scale",
3625
3732
  type: "select",
@@ -3643,6 +3750,7 @@ var liftEffect = {
3643
3750
  description: "Lifts the button upward on hover",
3644
3751
  category: "transform",
3645
3752
  pseudoElement: "none",
3753
+ applicableTo: ["button", "nav-link"],
3646
3754
  customizableOption: {
3647
3755
  name: "amount",
3648
3756
  type: "select",
@@ -3653,11 +3761,7 @@ var liftEffect = {
3653
3761
  generateCSS: (ctx) => {
3654
3762
  const { themeId, variantId, options } = ctx;
3655
3763
  const amount = options.amount || "0.5";
3656
- return `
3657
- :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
3658
- transform: translateY(-${amount}rem);
3659
- }
3660
- `;
3764
+ return generateStateCSS(themeId, variantId, "hover", `transform: translateY(-${amount}rem);`);
3661
3765
  }
3662
3766
  };
3663
3767
  var pressDownEffect = {
@@ -3666,6 +3770,7 @@ var pressDownEffect = {
3666
3770
  description: "Translates button to shadow position and removes shadow on hover",
3667
3771
  category: "transform",
3668
3772
  pseudoElement: "none",
3773
+ applicableTo: ["button"],
3669
3774
  generateCSS: (ctx) => {
3670
3775
  const { themeId, variantId, theme } = ctx;
3671
3776
  const shadowConfig = theme.shadow;
@@ -3678,12 +3783,12 @@ var pressDownEffect = {
3678
3783
  const offset = elevationOffsets[shadowConfig.elevation];
3679
3784
  const xOffset = (shadowConfig.position || "bottom") === "bottom-right" ? offset : 0;
3680
3785
  const yOffset = offset;
3681
- return `
3682
- :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
3683
- transform: translate(${xOffset}px, ${yOffset}px);
3684
- box-shadow: none;
3685
- }
3686
- `;
3786
+ return generateStateCSS(
3787
+ themeId,
3788
+ variantId,
3789
+ "hover",
3790
+ `transform: translate(${xOffset}px, ${yOffset}px); box-shadow: none;`
3791
+ );
3687
3792
  }
3688
3793
  };
3689
3794
  var popEffect = {
@@ -3692,6 +3797,7 @@ var popEffect = {
3692
3797
  description: "Scales up and tilts the button on hover for a playful pop effect",
3693
3798
  category: "transform",
3694
3799
  pseudoElement: "none",
3800
+ applicableTo: ["button"],
3695
3801
  customizableOption: {
3696
3802
  name: "intensity",
3697
3803
  type: "select",
@@ -3708,11 +3814,12 @@ var popEffect = {
3708
3814
  dramatic: { scale: 1.08, rotate: 3 }
3709
3815
  };
3710
3816
  const config = intensityConfig[intensity] || intensityConfig.medium;
3711
- return `
3712
- :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
3713
- transform: scale(${config.scale}) rotate(${config.rotate}deg);
3714
- }
3715
- `;
3817
+ return generateStateCSS(
3818
+ themeId,
3819
+ variantId,
3820
+ "hover",
3821
+ `transform: scale(${config.scale}) rotate(${config.rotate}deg);`
3822
+ );
3716
3823
  }
3717
3824
  };
3718
3825
 
@@ -3723,6 +3830,7 @@ var auroraGlowEffect = {
3723
3830
  description: "Blurred gradient glow that appears on hover",
3724
3831
  category: "overlay",
3725
3832
  pseudoElement: "before",
3833
+ applicableTo: ["button"],
3726
3834
  customizableOption: {
3727
3835
  name: "intensity",
3728
3836
  type: "percentage",
@@ -3735,8 +3843,8 @@ var auroraGlowEffect = {
3735
3843
  let toColor;
3736
3844
  if (buttonConfig.background.type === "gradient") {
3737
3845
  const stops = buttonConfig.background.stops;
3738
- fromColor = tokens.getColor(stops[0]);
3739
- toColor = tokens.getColor(stops[stops.length - 1]);
3846
+ fromColor = tokens.getColor(_nullishCoalesce(stops[0], () => ( "primary-500")));
3847
+ toColor = tokens.getColor(_nullishCoalesce(stops[stops.length - 1], () => ( "primary-300")));
3740
3848
  } else if (buttonConfig.background.type === "solid") {
3741
3849
  fromColor = tokens.getColor(buttonConfig.background.colorToken);
3742
3850
  const lighterToken = tokens.adjustShade(buttonConfig.background.colorToken, -200);
@@ -3779,6 +3887,7 @@ var cosmicStardustEffect = {
3779
3887
  description: "Rotating rainbow gradient glow (always visible, intensifies on hover)",
3780
3888
  category: "overlay",
3781
3889
  pseudoElement: "before",
3890
+ applicableTo: ["button"],
3782
3891
  customizableOption: {
3783
3892
  name: "speed",
3784
3893
  type: "select",
@@ -3841,6 +3950,7 @@ var gradientBorderFillEffect = {
3841
3950
  description: "Gradient border that fills on hover using ::before pseudo-element",
3842
3951
  category: "overlay",
3843
3952
  pseudoElement: "before",
3953
+ applicableTo: ["button"],
3844
3954
  customizableOption: {
3845
3955
  name: "borderWidth",
3846
3956
  type: "number",
@@ -3897,6 +4007,7 @@ var animatedGradientBorderFillEffect = {
3897
4007
  description: "Rotating gradient border that fills on hover",
3898
4008
  category: "overlay",
3899
4009
  pseudoElement: "before",
4010
+ applicableTo: ["button"],
3900
4011
  customizableOption: {
3901
4012
  name: "speed",
3902
4013
  type: "select",
@@ -3972,6 +4083,7 @@ var borderBottomGrowEffect = {
3972
4083
  description: "Animated underline that grows on hover",
3973
4084
  category: "overlay",
3974
4085
  pseudoElement: "after",
4086
+ applicableTo: ["button", "nav-link"],
3975
4087
  customizableOption: {
3976
4088
  name: "height",
3977
4089
  type: "number",
@@ -4019,6 +4131,7 @@ var gradientTextEffect = {
4019
4131
  description: "Gradient text using background-clip",
4020
4132
  category: "text",
4021
4133
  pseudoElement: "none",
4134
+ applicableTo: ["button"],
4022
4135
  customizableOption: {
4023
4136
  name: "solidOnHover",
4024
4137
  type: "select",
@@ -4070,6 +4183,7 @@ var textColorChangeEffect = {
4070
4183
  description: "Changes text color on hover",
4071
4184
  category: "text",
4072
4185
  pseudoElement: "none",
4186
+ applicableTo: ["button", "nav-link"],
4073
4187
  customizableOption: {
4074
4188
  name: "hoverColorToken",
4075
4189
  type: "select",
@@ -4097,6 +4211,7 @@ var borderColorChangeEffect = {
4097
4211
  description: "Changes border color on hover",
4098
4212
  category: "border",
4099
4213
  pseudoElement: "none",
4214
+ applicableTo: ["button", "nav-link"],
4100
4215
  customizableOption: {
4101
4216
  name: "hoverColorToken",
4102
4217
  type: "select",
@@ -4122,6 +4237,7 @@ var sketchyBorderEffect = {
4122
4237
  description: "Hand-drawn style with imperfect edges",
4123
4238
  category: "border",
4124
4239
  pseudoElement: "none",
4240
+ applicableTo: ["button"],
4125
4241
  customizableOption: {
4126
4242
  name: "intensity",
4127
4243
  type: "select",
@@ -4169,6 +4285,7 @@ var pulseAnimationEffect = {
4169
4285
  description: "Continuous pulse animation (opacity fade)",
4170
4286
  category: "animation",
4171
4287
  pseudoElement: "none",
4288
+ applicableTo: ["button", "nav-link"],
4172
4289
  customizableOption: {
4173
4290
  name: "speed",
4174
4291
  type: "select",
@@ -4197,6 +4314,138 @@ var pulseAnimationEffect = {
4197
4314
  }
4198
4315
  };
4199
4316
 
4317
+ // ../blocks/src/theme/interactive/effects/nav-underline.ts
4318
+ var navUnderlineEffect = {
4319
+ id: "nav-underline",
4320
+ name: "Nav Underline",
4321
+ description: "Underline that appears or grows on hover",
4322
+ category: "overlay",
4323
+ pseudoElement: "after",
4324
+ applicableTo: ["nav-link"],
4325
+ customizableOption: {
4326
+ name: "style",
4327
+ type: "select",
4328
+ label: "Underline Style",
4329
+ default: "static",
4330
+ options: ["static", "grow"]
4331
+ },
4332
+ generateCSS: (ctx) => {
4333
+ const { themeId, variantId, options, tokens } = ctx;
4334
+ const style = options.style || "static";
4335
+ const colorToken = options.colorToken || "primary";
4336
+ const color = tokens.getColor(colorToken);
4337
+ const height = options.height || 2;
4338
+ if (style === "grow") {
4339
+ return `
4340
+ /* Setup nav link for pseudo-element */
4341
+ :where([data-theme-scope="${themeId}"]) .${variantId} {
4342
+ position: relative;
4343
+ }
4344
+
4345
+ /* Underline using ::after - starts at 0 width */
4346
+ :where([data-theme-scope="${themeId}"]) .${variantId}::after {
4347
+ content: '';
4348
+ position: absolute;
4349
+ bottom: 0;
4350
+ left: 50%;
4351
+ width: 0;
4352
+ height: ${height}px;
4353
+ background: ${color};
4354
+ transform: translateX(-50%);
4355
+ transition: width 200ms ease-in-out;
4356
+ }
4357
+
4358
+ /* Grow underline on hover */
4359
+ :where([data-theme-scope="${themeId}"]) .${variantId}:hover::after {
4360
+ width: 100%;
4361
+ }
4362
+ `;
4363
+ }
4364
+ return `
4365
+ /* Setup nav link for pseudo-element */
4366
+ :where([data-theme-scope="${themeId}"]) .${variantId} {
4367
+ position: relative;
4368
+ }
4369
+
4370
+ /* Hidden underline using ::after */
4371
+ :where([data-theme-scope="${themeId}"]) .${variantId}::after {
4372
+ content: '';
4373
+ position: absolute;
4374
+ bottom: 0;
4375
+ left: 0;
4376
+ width: 100%;
4377
+ height: ${height}px;
4378
+ background: ${color};
4379
+ opacity: 0;
4380
+ transition: opacity 150ms ease-in-out;
4381
+ }
4382
+
4383
+ /* Show underline on hover */
4384
+ :where([data-theme-scope="${themeId}"]) .${variantId}:hover::after {
4385
+ opacity: 1;
4386
+ }
4387
+ `;
4388
+ }
4389
+ };
4390
+
4391
+ // ../blocks/src/theme/interactive/effects/nav-frosted.ts
4392
+ var navFrostedBaseEffect = {
4393
+ id: "nav-frosted-base",
4394
+ name: "Nav Frosted Base",
4395
+ description: "Base frosted glass styling for nav links",
4396
+ category: "background",
4397
+ pseudoElement: "none",
4398
+ applicableTo: ["nav-link"],
4399
+ generateCSS: (ctx) => {
4400
+ const { themeId, variantId } = ctx;
4401
+ return `
4402
+ /* Frosted glass base state */
4403
+ :where([data-theme-scope="${themeId}"]) .${variantId} {
4404
+ background: rgba(255, 255, 255, 0.05);
4405
+ backdrop-filter: blur(4px);
4406
+ -webkit-backdrop-filter: blur(4px);
4407
+ transition: background 150ms ease, backdrop-filter 150ms ease;
4408
+ }
4409
+ `;
4410
+ }
4411
+ };
4412
+ var navFrostedHoverEffect = {
4413
+ id: "nav-frosted-hover",
4414
+ name: "Nav Frosted Hover",
4415
+ description: "Enhanced frosted glass on hover",
4416
+ category: "background",
4417
+ pseudoElement: "none",
4418
+ applicableTo: ["nav-link"],
4419
+ generateCSS: (ctx) => {
4420
+ const { themeId, variantId } = ctx;
4421
+ return `
4422
+ /* Frosted glass hover state */
4423
+ :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
4424
+ background: rgba(255, 255, 255, 0.1);
4425
+ backdrop-filter: blur(8px);
4426
+ -webkit-backdrop-filter: blur(8px);
4427
+ }
4428
+ `;
4429
+ }
4430
+ };
4431
+ var navFrostedActiveEffect = {
4432
+ id: "nav-frosted-active",
4433
+ name: "Nav Frosted Active",
4434
+ description: "Frosted glass active/pressed state",
4435
+ category: "background",
4436
+ pseudoElement: "none",
4437
+ applicableTo: ["nav-link"],
4438
+ generateCSS: (ctx) => {
4439
+ const { themeId, variantId } = ctx;
4440
+ return `
4441
+ /* Frosted glass active state */
4442
+ :where([data-theme-scope="${themeId}"]) .${variantId}:active {
4443
+ background: rgba(255, 255, 255, 0.15);
4444
+ }
4445
+ `;
4446
+ }
4447
+ };
4448
+
4200
4449
  // ../blocks/src/theme/buttons/effects/registry.ts
4201
4450
  var EFFECT_PRESETS = [
4202
4451
  // Background effects
@@ -4233,88 +4482,65 @@ var EFFECT_PRESETS = [
4233
4482
  borderColorChangeEffect,
4234
4483
  sketchyBorderEffect,
4235
4484
  // Animation effects
4236
- pulseAnimationEffect
4485
+ pulseAnimationEffect,
4486
+ // Nav-link specific effects
4487
+ navUnderlineEffect,
4488
+ navFrostedBaseEffect,
4489
+ navFrostedHoverEffect,
4490
+ navFrostedActiveEffect
4237
4491
  ];
4238
4492
  function getEffectPreset(id) {
4239
4493
  return EFFECT_PRESETS.find((preset) => preset.id === id);
4240
4494
  }
4241
4495
 
4242
- // ../blocks/src/theme/tokens/resolver.ts
4243
- var TokenResolver = class {
4244
- constructor(theme) {
4245
- this.theme = theme;
4246
- }
4247
- /**
4248
- * Resolve a color token to a CSS variable reference wrapped in rgb()
4249
- *
4250
- * @param token - Token name (e.g., 'primary-500', 'white', 'text-900')
4251
- * @returns CSS rgb() function with var reference (e.g., 'rgb(var(--tb-primary-500))')
4252
- *
4253
- * Note: CSS variables are stored as RGB channels (e.g., "37 99 235") following Tailwind convention,
4254
- * so we must wrap them with rgb() to create a valid color value.
4255
- *
4256
- * @example
4257
- * resolver.getColor('primary-500') // => 'rgb(var(--tb-primary-500))'
4258
- * resolver.getColor('white') // => 'rgb(var(--tb-white))'
4259
- */
4260
- getColor(token) {
4261
- if (!this.tokenExists(token)) {
4262
- console.warn(
4263
- `[TokenResolver] Color token "${token}" not found in theme palette. Button may render incorrectly.`
4264
- );
4265
- }
4266
- return `rgb(var(--tb-${token}))`;
4267
- }
4268
- /**
4269
- * Adjust a color token's shade by a given amount
4270
- *
4271
- * @param token - Base token (e.g., 'primary-500')
4272
- * @param amount - Shade adjustment (+100 = darker, -100 = lighter)
4273
- * @returns Adjusted token name (e.g., 'primary-600')
4274
- *
4275
- * @example
4276
- * resolver.adjustShade('primary-500', 100) // => 'primary-600' (darker)
4277
- * resolver.adjustShade('primary-500', -100) // => 'primary-400' (lighter)
4278
- */
4279
- adjustShade(token, amount) {
4280
- const parts = token.split("-");
4281
- if (parts.length < 2) {
4282
- const newShade2 = Math.max(100, Math.min(900, 500 + amount));
4283
- return `${token}-${newShade2}`;
4284
- }
4285
- const base = parts.slice(0, -1).join("-");
4286
- const shade = parseInt(parts[parts.length - 1], 10);
4287
- if (isNaN(shade)) {
4288
- console.warn(
4289
- `[TokenResolver] Cannot adjust shade for non-shade token "${token}". Returning original token.`
4496
+ // ../blocks/src/theme/interactive/generateEffectsCSS.ts
4497
+ function generateEffectsCSS(options) {
4498
+ const { themeId, variantId, effects, elementConfig, tokens, theme } = options;
4499
+ if (!effects) return "";
4500
+ const cssChunks = [];
4501
+ const stateGroups = [
4502
+ ["base", effects.base],
4503
+ ["hover", effects.hover],
4504
+ ["active", effects.active],
4505
+ ["focus", effects.focus]
4506
+ ];
4507
+ for (const [stateGroup, effectApps] of stateGroups) {
4508
+ if (!effectApps || effectApps.length === 0) continue;
4509
+ for (const effectApp of effectApps) {
4510
+ const css2 = generateSingleEffectCSS(
4511
+ themeId,
4512
+ variantId,
4513
+ stateGroup,
4514
+ effectApp,
4515
+ elementConfig,
4516
+ tokens,
4517
+ theme
4290
4518
  );
4291
- return token;
4292
- }
4293
- const newShade = Math.max(100, Math.min(900, shade + amount));
4294
- return `${base}-${newShade}`;
4295
- }
4296
- /**
4297
- * Check if a token exists in the theme palette
4298
- *
4299
- * @param token - Token name to check
4300
- * @returns True if token exists in theme
4301
- */
4302
- tokenExists(token) {
4303
- const commonTokens = ["white", "black", "transparent"];
4304
- if (commonTokens.includes(token)) {
4305
- return true;
4306
- }
4307
- const parts = token.split("-");
4308
- if (parts.length >= 2) {
4309
- const lastPart = parts[parts.length - 1];
4310
- const shade = parseInt(lastPart, 10);
4311
- if (!isNaN(shade) && shade >= 100 && shade <= 900 && shade % 100 === 0) {
4312
- return true;
4519
+ if (css2) {
4520
+ cssChunks.push(css2);
4313
4521
  }
4314
4522
  }
4315
- return true;
4316
4523
  }
4317
- };
4524
+ return cssChunks.join("\n\n");
4525
+ }
4526
+ function generateSingleEffectCSS(themeId, variantId, stateGroup, effectApp, elementConfig, tokens, theme) {
4527
+ const effectPreset = getEffectPreset(effectApp.effectId);
4528
+ if (!effectPreset) {
4529
+ console.warn(`[generateEffectsCSS] Unknown effect: ${effectApp.effectId}`);
4530
+ return "";
4531
+ }
4532
+ const ctx = {
4533
+ themeId,
4534
+ variantId,
4535
+ stateGroup,
4536
+ options: effectApp.options || {},
4537
+ buttonConfig: elementConfig,
4538
+ // Effects access .background, .textColorToken, .border
4539
+ tokens,
4540
+ theme
4541
+ };
4542
+ return effectPreset.generateCSS(ctx);
4543
+ }
4318
4544
 
4319
4545
  // ../blocks/src/theme/buttons/constants.ts
4320
4546
  var GRADIENT_DIRECTION_MAP = {
@@ -4373,6 +4599,11 @@ var FONT_SIZE_MAP = {
4373
4599
  "text-xl": "1.25rem",
4374
4600
  "text-2xl": "1.5rem"
4375
4601
  };
4602
+ var BUTTON_PADDING_PRESETS = {
4603
+ compact: "0.375rem 0.75rem",
4604
+ default: "0.5rem 1rem",
4605
+ spacious: "0.75rem 1.5rem"
4606
+ };
4376
4607
 
4377
4608
  // ../blocks/src/theme/buttons/utils/contrast.ts
4378
4609
  function getContrastingTextColorToken(backgroundToken, theme) {
@@ -4382,7 +4613,7 @@ function getContrastingTextColorToken(backgroundToken, theme) {
4382
4613
  }
4383
4614
  if (backgroundToken.startsWith("neutral-")) {
4384
4615
  const match = backgroundToken.match(/neutral-(\d+)/);
4385
- if (match) {
4616
+ if (_optionalChain([match, 'optionalAccess', _10 => _10[1]])) {
4386
4617
  const shade = parseInt(match[1], 10);
4387
4618
  return shade >= 500 ? "neutral-50" : "neutral-950";
4388
4619
  }
@@ -4391,16 +4622,6 @@ function getContrastingTextColorToken(backgroundToken, theme) {
4391
4622
  }
4392
4623
 
4393
4624
  // ../blocks/src/theme/buttons/generateDefaultButtonSystem.ts
4394
- var CORNERS_TO_RADIUS_MAP = {
4395
- square: "rounded-none",
4396
- // 0px - sharp corners
4397
- soft: "rounded-md",
4398
- // 6px - subtle rounding
4399
- rounded: "rounded-md",
4400
- // 6px - standard rounded (same as soft for buttons)
4401
- pill: "rounded-full"
4402
- // 9999px - full pill shape
4403
- };
4404
4625
  var BORDER_WIDTH_TO_CLASS_MAP = {
4405
4626
  none: "border-0",
4406
4627
  // 0px
@@ -4412,7 +4633,6 @@ var BORDER_WIDTH_TO_CLASS_MAP = {
4412
4633
  // 4px - clearly thick
4413
4634
  };
4414
4635
  function generateDefaultButtonSystem(theme) {
4415
- const borderRadius = CORNERS_TO_RADIUS_MAP[theme.corners] || "rounded-lg";
4416
4636
  const borderWidthClass = BORDER_WIDTH_TO_CLASS_MAP[theme.border.width] || "border-2";
4417
4637
  const variants = [];
4418
4638
  const primaryVariant = {
@@ -4422,10 +4642,11 @@ function generateDefaultButtonSystem(theme) {
4422
4642
  priority: 1,
4423
4643
  background: {
4424
4644
  type: "solid",
4425
- colorToken: "primary-500"
4645
+ colorToken: "primary"
4426
4646
  },
4427
- textColorToken: getContrastingTextColorToken("primary-500", theme),
4428
- borderRadius,
4647
+ textColorToken: getContrastingTextColorToken("primary", theme),
4648
+ borderRadius: "",
4649
+ // Empty string = inherit from global.cornerStyle
4429
4650
  // Inherits shadow from theme
4430
4651
  effects: {
4431
4652
  hover: [
@@ -4447,7 +4668,8 @@ function generateDefaultButtonSystem(theme) {
4447
4668
  colorToken: "neutral-700"
4448
4669
  },
4449
4670
  textColorToken: getContrastingTextColorToken("neutral-700", theme),
4450
- borderRadius,
4671
+ borderRadius: "",
4672
+ // Empty string = inherit from global.cornerStyle
4451
4673
  // Inherits shadow from theme
4452
4674
  effects: {
4453
4675
  hover: [
@@ -4467,12 +4689,13 @@ function generateDefaultButtonSystem(theme) {
4467
4689
  background: {
4468
4690
  type: "transparent"
4469
4691
  },
4470
- textColorToken: "primary-600",
4471
- borderRadius,
4692
+ textColorToken: "primary",
4693
+ borderRadius: "",
4694
+ // Empty string = inherit from global.cornerStyle
4472
4695
  shadow: { elevation: "none", softness: null, position: "bottom" },
4473
4696
  // Outline buttons typically don't have shadows
4474
4697
  border: {
4475
- colorToken: "primary-500",
4698
+ colorToken: "primary",
4476
4699
  widthClass: borderWidthClass
4477
4700
  },
4478
4701
  effects: {
@@ -4493,8 +4716,9 @@ function generateDefaultButtonSystem(theme) {
4493
4716
  background: {
4494
4717
  type: "transparent"
4495
4718
  },
4496
- textColorToken: "primary-600",
4497
- borderRadius,
4719
+ textColorToken: "primary",
4720
+ borderRadius: "",
4721
+ // Empty string = inherit from global.cornerStyle
4498
4722
  shadow: { elevation: "none", softness: null, position: "bottom" },
4499
4723
  // Ghost buttons have no shadow
4500
4724
  // No border for ghost buttons
@@ -4560,6 +4784,10 @@ function generateButtonCss(options) {
4560
4784
  if (!variant.enabled) continue;
4561
4785
  const baseCSS = generateVariantBaseCSS(variant, buttonSystem.global, themeId, tokens, theme);
4562
4786
  cssChunks.push(baseCSS);
4787
+ const hoverBgCSS = generateHoverBackgroundCSS(variant, buttonSystem.global, themeId, tokens);
4788
+ if (hoverBgCSS) {
4789
+ cssChunks.push(hoverBgCSS);
4790
+ }
4563
4791
  const effectCSS = generateVariantEffectCSS(variant, themeId, tokens, theme);
4564
4792
  if (effectCSS) {
4565
4793
  cssChunks.push(effectCSS);
@@ -4578,7 +4806,7 @@ function generateVariantBaseCSS(variant, global, themeId, tokens, theme) {
4578
4806
  const rules = [];
4579
4807
  const borderWidth = variant.border ? BORDER_WIDTH_MAP[variant.border.widthClass] || "1px" : "0px";
4580
4808
  const hasBorder = borderWidth !== "0px";
4581
- const padding = variant.padding || STRUCTURAL_BASE_STYLES.padding;
4809
+ const padding = variant.padding || (global.paddingPreset ? BUTTON_PADDING_PRESETS[global.paddingPreset] : null) || STRUCTURAL_BASE_STYLES.padding;
4582
4810
  const paddingParts = padding.split(" ");
4583
4811
  const verticalPadding = paddingParts[0] || "0.5rem";
4584
4812
  const horizontalPadding = paddingParts[1] || paddingParts[0] || "1rem";
@@ -4590,7 +4818,16 @@ function generateVariantBaseCSS(variant, global, themeId, tokens, theme) {
4590
4818
  } else {
4591
4819
  rules.push(`padding: ${padding};`);
4592
4820
  }
4593
- rules.push(`font-weight: ${global.fontWeight};`);
4821
+ rules.push(`font-weight: ${global.fontWeight};`);
4822
+ if (global.typography === "heading") {
4823
+ rules.push(`font-family: var(--font-heading);`);
4824
+ rules.push(`letter-spacing: var(--ls-heading);`);
4825
+ } else {
4826
+ rules.push(`font-family: var(--font-body);`);
4827
+ }
4828
+ if (global.italic) {
4829
+ rules.push(`font-style: italic;`);
4830
+ }
4594
4831
  if (variant.fontSize) {
4595
4832
  const fontSize = FONT_SIZE_MAP[variant.fontSize] || "1rem";
4596
4833
  rules.push(`font-size: ${fontSize};`);
@@ -4604,16 +4841,16 @@ function generateVariantBaseCSS(variant, global, themeId, tokens, theme) {
4604
4841
  rules.push(`align-items: ${STRUCTURAL_BASE_STYLES.alignItems};`);
4605
4842
  rules.push(`justify-content: ${STRUCTURAL_BASE_STYLES.justifyContent};`);
4606
4843
  let borderRadius;
4607
- if (variant.borderRadius) {
4608
- borderRadius = BORDER_RADIUS_MAP[variant.borderRadius] || BORDER_RADIUS_MAP["rounded"];
4844
+ if (variant.borderRadius && variant.borderRadius !== "") {
4845
+ borderRadius = _nullishCoalesce(_nullishCoalesce(BORDER_RADIUS_MAP[variant.borderRadius], () => ( BORDER_RADIUS_MAP["rounded"])), () => ( "0.375rem"));
4609
4846
  } else {
4610
4847
  const cornerStyleMap = {
4611
4848
  "square": "rounded-none",
4612
4849
  "rounded": "rounded-md",
4613
4850
  "pill": "rounded-full"
4614
4851
  };
4615
- const fallbackRadius = cornerStyleMap[global.cornerStyle] || "rounded-md";
4616
- borderRadius = BORDER_RADIUS_MAP[fallbackRadius] || BORDER_RADIUS_MAP["rounded"];
4852
+ const fallbackRadius = _nullishCoalesce(cornerStyleMap[global.cornerStyle], () => ( "rounded-md"));
4853
+ borderRadius = _nullishCoalesce(_nullishCoalesce(BORDER_RADIUS_MAP[fallbackRadius], () => ( BORDER_RADIUS_MAP["rounded"])), () => ( "0.375rem"));
4617
4854
  }
4618
4855
  rules.push(`border-radius: ${borderRadius};`);
4619
4856
  const shadowConfig = variant.shadow || shadowSizeToShadow(global.shadow, theme) || theme.shadow;
@@ -4649,31 +4886,33 @@ ${selector} {
4649
4886
  }
4650
4887
  function generateVariantEffectCSS(variant, themeId, tokens, theme) {
4651
4888
  if (!variant.effects) return "";
4652
- const cssChunks = [];
4653
- for (const [stateGroup, effectApps] of Object.entries(variant.effects)) {
4654
- if (!effectApps || effectApps.length === 0) continue;
4655
- for (const effectApp of effectApps) {
4656
- const effectPreset = getEffectPreset(effectApp.effectId);
4657
- if (!effectPreset) {
4658
- console.warn(`[generateVariantEffectCSS] Unknown effect: ${effectApp.effectId}`);
4659
- continue;
4660
- }
4661
- const ctx = {
4662
- themeId,
4663
- variantId: variant.id,
4664
- stateGroup,
4665
- options: effectApp.options || {},
4666
- buttonConfig: variant,
4667
- tokens,
4668
- theme
4669
- };
4670
- const css2 = effectPreset.generateCSS(ctx);
4671
- if (css2) {
4672
- cssChunks.push(css2);
4673
- }
4674
- }
4889
+ const elementConfig = {
4890
+ background: variant.background,
4891
+ textColorToken: variant.textColorToken,
4892
+ border: variant.border ? { colorToken: variant.border.colorToken } : void 0
4893
+ };
4894
+ return generateEffectsCSS({
4895
+ themeId,
4896
+ variantId: variant.id,
4897
+ effects: variant.effects,
4898
+ elementConfig,
4899
+ tokens,
4900
+ theme
4901
+ });
4902
+ }
4903
+ function generateHoverBackgroundCSS(variant, global, themeId, tokens) {
4904
+ let hoverToken = variant.hoverBackgroundToken;
4905
+ if (!hoverToken && global.hoverColor === "token" && global.hoverColorToken) {
4906
+ hoverToken = global.hoverColorToken;
4675
4907
  }
4676
- return cssChunks.join("\n\n");
4908
+ if (!hoverToken) return null;
4909
+ const selector = `:where([data-theme-scope="${themeId}"]) .${variant.id}:hover`;
4910
+ const hoverBgColor = tokens.getColor(hoverToken);
4911
+ return `
4912
+ ${selector} {
4913
+ background-color: ${hoverBgColor};
4914
+ }
4915
+ `.trim();
4677
4916
  }
4678
4917
  function generateDisabledCSS(variant, themeId) {
4679
4918
  const selector = `:where([data-theme-scope="${themeId}"]) .${variant.id}:disabled`;
@@ -5066,8 +5305,8 @@ function generateAccordionCss({
5066
5305
  if (accordionSystem.hover.shadowElevation) {
5067
5306
  const hoverShadowValue = generateShadowValue(
5068
5307
  accordionSystem.hover.shadowElevation,
5069
- _nullishCoalesce(_optionalChain([accordionSystem, 'access', _10 => _10.shadow, 'optionalAccess', _11 => _11.softness]), () => ( "soft")),
5070
- _nullishCoalesce(_optionalChain([accordionSystem, 'access', _12 => _12.shadow, 'optionalAccess', _13 => _13.position]), () => ( "bottom"))
5308
+ _nullishCoalesce(_optionalChain([accordionSystem, 'access', _11 => _11.shadow, 'optionalAccess', _12 => _12.softness]), () => ( "soft")),
5309
+ _nullishCoalesce(_optionalChain([accordionSystem, 'access', _13 => _13.shadow, 'optionalAccess', _14 => _14.position]), () => ( "bottom"))
5071
5310
  );
5072
5311
  triggerHoverRules.push(`box-shadow: ${hoverShadowValue}`);
5073
5312
  }
@@ -5566,6 +5805,345 @@ function generateDefaultInputSystem(theme) {
5566
5805
  };
5567
5806
  }
5568
5807
 
5808
+ // ../blocks/src/theme/navigation/types.ts
5809
+
5810
+
5811
+ // ../blocks/src/theme/interactive/baseSchema.ts
5812
+
5813
+ var interactiveTypographySchema = _zod.z.object({
5814
+ /** Font family source */
5815
+ typography: _zod.z.enum(["body", "heading"]).default("body"),
5816
+ /** Font weight */
5817
+ fontWeight: _zod.z.enum(["regular", "medium", "semibold", "bold"]).default("medium"),
5818
+ /** Text transform */
5819
+ textTransform: _zod.z.enum(["none", "uppercase", "capitalize"]).default("none"),
5820
+ /** Italic style */
5821
+ italic: _zod.z.boolean().default(false)
5822
+ });
5823
+ var effectApplicationSchema = _zod.z.object({
5824
+ /** Effect preset ID */
5825
+ effectId: _zod.z.string(),
5826
+ /** User-provided customization options */
5827
+ options: _zod.z.record(_zod.z.string(), _zod.z.any()).optional()
5828
+ });
5829
+ var effectCompositionSchema = _zod.z.object({
5830
+ /** Effects always applied */
5831
+ base: _zod.z.array(effectApplicationSchema).optional(),
5832
+ /** Effects applied on hover */
5833
+ hover: _zod.z.array(effectApplicationSchema).optional(),
5834
+ /** Effects applied on active/pressed */
5835
+ active: _zod.z.array(effectApplicationSchema).optional(),
5836
+ /** Effects applied on focus */
5837
+ focus: _zod.z.array(effectApplicationSchema).optional()
5838
+ });
5839
+
5840
+ // ../blocks/src/theme/navigation/types.ts
5841
+ var navLinkPaddingSchema = _zod.z.enum(["none", "compact", "default"]);
5842
+ var navLinkBorderRadiusSchema = _zod.z.enum(["none", "sm", "md", "full"]);
5843
+ var navLinkStyleSchema = _zod.z.object({
5844
+ /** Display name for the style */
5845
+ name: _zod.z.string().min(1).max(30).optional(),
5846
+ /** Typography settings (inherited from interactive base) */
5847
+ ...interactiveTypographySchema.shape,
5848
+ /** Text color token */
5849
+ colorToken: _zod.z.string().default("text"),
5850
+ /** Hover/active color token (for color-change effects) */
5851
+ hoverColorToken: _zod.z.string().nullable().optional(),
5852
+ /** Padding preset */
5853
+ padding: navLinkPaddingSchema.default("compact"),
5854
+ /** Border radius (for capsule/pill styles) */
5855
+ borderRadius: navLinkBorderRadiusSchema.default("none"),
5856
+ /** Composable effects */
5857
+ effects: effectCompositionSchema.optional()
5858
+ });
5859
+ var NAV_LINK_PADDING_MAP = {
5860
+ none: "0",
5861
+ compact: "0.5rem 1rem",
5862
+ default: "0.75rem 1.25rem"
5863
+ };
5864
+ var NAV_LINK_BORDER_RADIUS_MAP = {
5865
+ none: "0",
5866
+ sm: "0.25rem",
5867
+ md: "0.5rem",
5868
+ full: "9999px"
5869
+ };
5870
+
5871
+ // ../blocks/src/theme/interactive/generateBaseCSS.ts
5872
+ var FONT_WEIGHT_MAP2 = {
5873
+ regular: 400,
5874
+ medium: 500,
5875
+ semibold: 600,
5876
+ bold: 700
5877
+ };
5878
+ function generateBaseInteractiveCSS(options) {
5879
+ const {
5880
+ typography,
5881
+ padding,
5882
+ borderRadius,
5883
+ includeTransition = true,
5884
+ includeFlexCenter = false,
5885
+ borderWidth
5886
+ } = options;
5887
+ const rules = [];
5888
+ if (typography.fontWeight !== void 0) {
5889
+ const weight = typeof typography.fontWeight === "number" ? typography.fontWeight : FONT_WEIGHT_MAP2[typography.fontWeight];
5890
+ rules.push(`font-weight: ${weight};`);
5891
+ }
5892
+ if (typography.typography === "heading") {
5893
+ rules.push(`font-family: var(--font-heading);`);
5894
+ rules.push(`letter-spacing: var(--ls-heading);`);
5895
+ } else if (typography.typography === "body") {
5896
+ rules.push(`font-family: var(--font-body);`);
5897
+ }
5898
+ if (typography.italic) {
5899
+ rules.push(`font-style: italic;`);
5900
+ }
5901
+ if (typography.textTransform && typography.textTransform !== "none") {
5902
+ rules.push(`text-transform: ${typography.textTransform};`);
5903
+ }
5904
+ if (padding) {
5905
+ if (borderWidth && borderWidth !== "0px") {
5906
+ const paddingParts = padding.split(" ");
5907
+ const verticalPadding = paddingParts[0] || "0.5rem";
5908
+ const horizontalPadding = paddingParts[1] || paddingParts[0] || "1rem";
5909
+ rules.push(`padding-top: calc(${verticalPadding} - ${borderWidth} - 1px);`);
5910
+ rules.push(`padding-bottom: calc(${verticalPadding} - ${borderWidth} - 1px);`);
5911
+ rules.push(`padding-left: calc(${horizontalPadding} - ${borderWidth});`);
5912
+ rules.push(`padding-right: calc(${horizontalPadding} - ${borderWidth});`);
5913
+ } else {
5914
+ rules.push(`padding: ${padding};`);
5915
+ }
5916
+ }
5917
+ if (borderRadius) {
5918
+ rules.push(`border-radius: ${borderRadius};`);
5919
+ }
5920
+ if (includeTransition) {
5921
+ rules.push(`transition: all 200ms ease;`);
5922
+ }
5923
+ if (includeFlexCenter) {
5924
+ rules.push(`display: inline-flex;`);
5925
+ rules.push(`align-items: center;`);
5926
+ rules.push(`justify-content: center;`);
5927
+ rules.push(`cursor: pointer;`);
5928
+ }
5929
+ return rules;
5930
+ }
5931
+
5932
+ // ../blocks/src/theme/navigation/generateNavLinkCSS.ts
5933
+ function generateNavLinkCSS(options) {
5934
+ const { themeId, tokens, theme, style, className } = options;
5935
+ const selector = `:where([data-theme-scope="${themeId}"]) .${className}`;
5936
+ const hoverSelector = `${selector}:hover`;
5937
+ const activeSelector = `${selector}:active, ${selector}[data-active="true"]`;
5938
+ const cssChunks = [];
5939
+ const hoverRules = [];
5940
+ const activeRules = [];
5941
+ const baseRules = generateBaseInteractiveCSS({
5942
+ typography: {
5943
+ typography: style.typography,
5944
+ fontWeight: style.fontWeight,
5945
+ textTransform: style.textTransform,
5946
+ italic: style.italic
5947
+ },
5948
+ padding: style.padding ? NAV_LINK_PADDING_MAP[style.padding] : void 0,
5949
+ borderRadius: style.borderRadius ? NAV_LINK_BORDER_RADIUS_MAP[style.borderRadius] : void 0,
5950
+ includeTransition: true,
5951
+ includeFlexCenter: false
5952
+ });
5953
+ if (style.colorToken) {
5954
+ baseRules.push(`color: ${tokens.getColor(style.colorToken)};`);
5955
+ }
5956
+ if (style.hoverColorToken && !_optionalChain([style, 'access', _15 => _15.effects, 'optionalAccess', _16 => _16.hover, 'optionalAccess', _17 => _17.length])) {
5957
+ hoverRules.push(`color: ${tokens.getColor(style.hoverColorToken)};`);
5958
+ }
5959
+ const elementConfig = {
5960
+ background: { type: "transparent" },
5961
+ textColorToken: style.colorToken || "text"
5962
+ };
5963
+ if (style.effects) {
5964
+ const effectsCss = generateEffectsCSS({
5965
+ themeId,
5966
+ variantId: className,
5967
+ effects: style.effects,
5968
+ elementConfig,
5969
+ tokens,
5970
+ theme
5971
+ });
5972
+ if (effectsCss) {
5973
+ cssChunks.push(effectsCss);
5974
+ }
5975
+ }
5976
+ if (baseRules.length > 0) {
5977
+ cssChunks.unshift(`
5978
+ ${selector} {
5979
+ ${baseRules.join("\n ")}
5980
+ }
5981
+ `);
5982
+ }
5983
+ if (hoverRules.length > 0) {
5984
+ cssChunks.push(`
5985
+ ${hoverSelector} {
5986
+ ${hoverRules.join("\n ")}
5987
+ }
5988
+ `);
5989
+ }
5990
+ if (activeRules.length > 0) {
5991
+ cssChunks.push(`
5992
+ ${activeSelector} {
5993
+ ${activeRules.join("\n ")}
5994
+ }
5995
+ `);
5996
+ }
5997
+ return cssChunks.join("");
5998
+ }
5999
+
6000
+ // ../blocks/src/theme/navigation/presets.ts
6001
+ var NAV_LINK_PRESETS = {
6002
+ /**
6003
+ * Minimal - subtle color change on hover
6004
+ */
6005
+ minimal: {
6006
+ name: "Minimal",
6007
+ typography: "body",
6008
+ fontWeight: "medium",
6009
+ textTransform: "none",
6010
+ italic: false,
6011
+ colorToken: "text",
6012
+ hoverColorToken: "primary",
6013
+ padding: "none",
6014
+ borderRadius: "none",
6015
+ effects: {
6016
+ hover: [
6017
+ { effectId: "text-color-change", options: { colorToken: "primary" } }
6018
+ ]
6019
+ }
6020
+ },
6021
+ /**
6022
+ * Underline - static underline appears on hover
6023
+ */
6024
+ underline: {
6025
+ name: "Underline",
6026
+ typography: "body",
6027
+ fontWeight: "medium",
6028
+ textTransform: "none",
6029
+ italic: false,
6030
+ colorToken: "text",
6031
+ padding: "none",
6032
+ borderRadius: "none",
6033
+ effects: {
6034
+ hover: [
6035
+ { effectId: "nav-underline", options: { style: "static" } }
6036
+ ]
6037
+ }
6038
+ },
6039
+ /**
6040
+ * Underline Grow - animated underline grows from center on hover
6041
+ */
6042
+ "underline-grow": {
6043
+ name: "Underline Grow",
6044
+ typography: "body",
6045
+ fontWeight: "medium",
6046
+ textTransform: "none",
6047
+ italic: false,
6048
+ colorToken: "text",
6049
+ padding: "none",
6050
+ borderRadius: "none",
6051
+ effects: {
6052
+ hover: [
6053
+ { effectId: "nav-underline", options: { style: "grow" } }
6054
+ ]
6055
+ }
6056
+ },
6057
+ /**
6058
+ * Capsule - pill-shaped background on hover
6059
+ */
6060
+ capsule: {
6061
+ name: "Capsule",
6062
+ typography: "body",
6063
+ fontWeight: "medium",
6064
+ textTransform: "none",
6065
+ italic: false,
6066
+ colorToken: "text",
6067
+ padding: "compact",
6068
+ borderRadius: "full",
6069
+ effects: {
6070
+ hover: [
6071
+ { effectId: "background-on-hover-alpha", options: { colorToken: "primary", opacity: 0.1 } }
6072
+ ],
6073
+ active: [
6074
+ { effectId: "background-on-hover-alpha", options: { colorToken: "primary", opacity: 0.15 } }
6075
+ ]
6076
+ }
6077
+ },
6078
+ /**
6079
+ * Solid - solid background color on hover
6080
+ */
6081
+ solid: {
6082
+ name: "Solid",
6083
+ typography: "body",
6084
+ fontWeight: "medium",
6085
+ textTransform: "none",
6086
+ italic: false,
6087
+ colorToken: "text",
6088
+ padding: "compact",
6089
+ borderRadius: "none",
6090
+ effects: {
6091
+ hover: [
6092
+ { effectId: "background-on-hover", options: { colorToken: "primary" } }
6093
+ ],
6094
+ active: [
6095
+ { effectId: "background-on-hover", options: { colorToken: "primary" } }
6096
+ ]
6097
+ }
6098
+ },
6099
+ /**
6100
+ * Scale - gentle scale-up on hover
6101
+ */
6102
+ scale: {
6103
+ name: "Scale",
6104
+ typography: "body",
6105
+ fontWeight: "medium",
6106
+ textTransform: "none",
6107
+ italic: false,
6108
+ colorToken: "text",
6109
+ padding: "none",
6110
+ borderRadius: "none",
6111
+ effects: {
6112
+ hover: [
6113
+ { effectId: "scale-up", options: { scale: 1.05 } }
6114
+ ]
6115
+ }
6116
+ },
6117
+ /**
6118
+ * Frosted - semi-transparent glass-like background
6119
+ */
6120
+ frosted: {
6121
+ name: "Frosted",
6122
+ typography: "body",
6123
+ fontWeight: "medium",
6124
+ textTransform: "none",
6125
+ italic: false,
6126
+ colorToken: "text",
6127
+ padding: "compact",
6128
+ borderRadius: "md",
6129
+ effects: {
6130
+ base: [
6131
+ { effectId: "nav-frosted-base" }
6132
+ ],
6133
+ hover: [
6134
+ { effectId: "nav-frosted-hover" }
6135
+ ],
6136
+ active: [
6137
+ { effectId: "nav-frosted-active" }
6138
+ ]
6139
+ }
6140
+ }
6141
+ };
6142
+ function getNavLinkPreset(presetId) {
6143
+ return NAV_LINK_PRESETS[presetId];
6144
+ }
6145
+ var NAV_LINK_PRESET_IDS = Object.keys(NAV_LINK_PRESETS);
6146
+
5569
6147
  // ../blocks/src/theme/header/generateHeaderCss.ts
5570
6148
  function generateHeaderCss(options) {
5571
6149
  const { themeId, theme } = options;
@@ -5573,10 +6151,8 @@ function generateHeaderCss(options) {
5573
6151
  const header = theme.header;
5574
6152
  const cssChunks = [];
5575
6153
  cssChunks.push(generateHeaderRootStyles(header, themeId, tokens, theme));
5576
- if (header.logo) {
5577
- cssChunks.push(generateLogoStyles(header.logo, themeId, tokens));
5578
- }
5579
- cssChunks.push(generateNavLinkStyles(header, themeId, tokens));
6154
+ cssChunks.push(generateLogoStyles(header.logo, themeId, tokens, header.textColor));
6155
+ cssChunks.push(generateNavLinkStyles(header, themeId, tokens, theme));
5580
6156
  if (header.variant === "floating" && header.container) {
5581
6157
  cssChunks.push(generateFloatingContainerStyles(header.container, themeId, tokens));
5582
6158
  }
@@ -5586,7 +6162,7 @@ function generateHeaderCss(options) {
5586
6162
  function generateHeaderRootStyles(header, themeId, tokens, _theme) {
5587
6163
  const selector = `:where([data-theme-scope="${themeId}"]) .header-root`;
5588
6164
  const rules = [];
5589
- const navContainerType = _nullishCoalesce(_optionalChain([header, 'access', _14 => _14.navContainer, 'optionalAccess', _15 => _15.type]), () => ( "none"));
6165
+ const navContainerType = _nullishCoalesce(_optionalChain([header, 'access', _18 => _18.navContainer, 'optionalAccess', _19 => _19.type]), () => ( "none"));
5590
6166
  const isContainedNav = navContainerType === "pill" || navContainerType === "glass";
5591
6167
  if (isContainedNav) {
5592
6168
  } else {
@@ -5609,7 +6185,7 @@ function generateHeaderRootStyles(header, themeId, tokens, _theme) {
5609
6185
  "thick": "4px"
5610
6186
  }[header.border.width];
5611
6187
  if (borderWidth !== "0") {
5612
- const borderToken = _optionalChain([header, 'access', _16 => _16.border, 'optionalAccess', _17 => _17.color, 'optionalAccess', _18 => _18.trim, 'call', _19 => _19()]) || "border";
6188
+ const borderToken = _optionalChain([header, 'access', _20 => _20.border, 'optionalAccess', _21 => _21.color, 'optionalAccess', _22 => _22.trim, 'call', _23 => _23()]) || "border";
5613
6189
  const borderColor = tokens.getColor(borderToken);
5614
6190
  const borderStyle = header.border.style === "dashed" ? "dashed" : "solid";
5615
6191
  if (header.border.position === "bottom") {
@@ -5632,32 +6208,36 @@ ${selector} {
5632
6208
  }
5633
6209
  `;
5634
6210
  }
5635
- function generateLogoStyles(logo, themeId, tokens) {
5636
- if (!logo) return "";
6211
+ function generateLogoStyles(logo, themeId, tokens, textColor) {
5637
6212
  const selector = `:where([data-theme-scope="${themeId}"]) .header-logo-text`;
5638
6213
  const rules = [];
5639
6214
  const primaryColor = tokens.getColor("primary");
5640
6215
  const accentColor = tokens.getColor("accent");
5641
- if (logo.fontFamily === "mono") {
5642
- rules.push(`font-family: ui-monospace, monospace;`);
5643
- } else if (logo.fontFamily === "serif") {
5644
- rules.push(`font-family: ui-serif, serif;`);
5645
- }
5646
- if (logo.letterSpacing && logo.letterSpacing !== "normal") {
5647
- const spacingMap = {
5648
- "normal": "0em",
5649
- "wide": "0.05em",
5650
- "wider": "0.1em",
5651
- "widest": "0.15em"
5652
- };
5653
- rules.push(`letter-spacing: ${spacingMap[logo.letterSpacing]};`);
5654
- }
5655
- if (logo.gradient) {
5656
- rules.push(`background: linear-gradient(to right, ${primaryColor}, ${accentColor});`);
5657
- rules.push(`-webkit-background-clip: text;`);
5658
- rules.push(`-webkit-text-fill-color: transparent;`);
5659
- rules.push(`background-clip: text;`);
5660
- rules.push(`color: transparent;`);
6216
+ if (textColor && !_optionalChain([logo, 'optionalAccess', _24 => _24.gradient])) {
6217
+ rules.push(`color: ${tokens.getColor(textColor)};`);
6218
+ }
6219
+ if (logo) {
6220
+ if (logo.fontFamily === "mono") {
6221
+ rules.push(`font-family: ui-monospace, monospace;`);
6222
+ } else if (logo.fontFamily === "serif") {
6223
+ rules.push(`font-family: ui-serif, serif;`);
6224
+ }
6225
+ if (logo.letterSpacing && logo.letterSpacing !== "normal") {
6226
+ const spacingMap = {
6227
+ "normal": "0em",
6228
+ "wide": "0.05em",
6229
+ "wider": "0.1em",
6230
+ "widest": "0.15em"
6231
+ };
6232
+ rules.push(`letter-spacing: ${spacingMap[logo.letterSpacing]};`);
6233
+ }
6234
+ if (logo.gradient) {
6235
+ rules.push(`background: linear-gradient(to right, ${primaryColor}, ${accentColor});`);
6236
+ rules.push(`-webkit-background-clip: text;`);
6237
+ rules.push(`-webkit-text-fill-color: transparent;`);
6238
+ rules.push(`background-clip: text;`);
6239
+ rules.push(`color: transparent;`);
6240
+ }
5661
6241
  }
5662
6242
  if (rules.length === 0) return "";
5663
6243
  return `
@@ -5666,133 +6246,86 @@ ${selector} {
5666
6246
  }
5667
6247
  `;
5668
6248
  }
5669
- function generateNavLinkStyles(header, themeId, tokens) {
5670
- const selector = `:where([data-theme-scope="${themeId}"]) .header-nav-link`;
5671
- const hoverSelector = `${selector}:hover`;
5672
- const activeSelector = `${selector}[data-active="true"]`;
5673
- const cssChunks = [];
5674
- const baseRules = [];
5675
- const hoverRules = [];
5676
- const activeRules = [];
5677
- const navContainerType = _nullishCoalesce(_optionalChain([header, 'access', _20 => _20.navContainer, 'optionalAccess', _21 => _21.type]), () => ( "none"));
5678
- const usesGlassNavContainer = navContainerType === "glass";
5679
- const navColorToken = _optionalChain([header, 'access', _22 => _22.navColor, 'optionalAccess', _23 => _23.trim, 'call', _24 => _24()]);
5680
- const primaryColor = tokens.getColor("primary");
5681
- const navWeight = _nullishCoalesce(header.navWeight, () => ( "medium"));
5682
- const navWeightMap = {
5683
- regular: 400,
5684
- medium: 500,
5685
- semibold: 600,
5686
- bold: 700
5687
- };
5688
- if (navColorToken) {
5689
- baseRules.push(`color: ${tokens.getColor(navColorToken)};`);
5690
- }
5691
- if (navWeight) {
5692
- baseRules.push(`font-weight: ${navWeightMap[navWeight]};`);
5693
- }
5694
- if (navWeight === "bold" && header.navStyle === "solid") {
5695
- baseRules.push(`text-transform: uppercase;`);
5696
- }
5697
- switch (header.navStyle) {
5698
- case "minimal":
5699
- baseRules.push(`transition: color 200ms ease;`);
5700
- hoverRules.push(`color: ${primaryColor};`);
5701
- activeRules.push(`color: ${primaryColor};`);
5702
- break;
5703
- case "underline":
5704
- baseRules.push(`transition: all 200ms ease;`);
5705
- hoverRules.push(`text-decoration: underline;`);
5706
- hoverRules.push(`text-underline-offset: 4px;`);
5707
- activeRules.push(`text-decoration: underline;`);
5708
- activeRules.push(`text-underline-offset: 4px;`);
5709
- break;
5710
- case "underline-grow":
5711
- baseRules.push(`position: relative;`);
5712
- baseRules.push(`transition: color 200ms ease;`);
5713
- hoverRules.push(`color: ${primaryColor};`);
5714
- activeRules.push(`color: ${primaryColor};`);
5715
- cssChunks.push(generateUnderlineGrowCSS(themeId));
5716
- break;
5717
- case "capsule":
5718
- baseRules.push(`border-radius: 9999px;`);
5719
- baseRules.push(`transition: background-color 200ms ease;`);
5720
- hoverRules.push(`background-color: color-mix(in srgb, ${primaryColor} 10%, transparent);`);
5721
- activeRules.push(`background-color: color-mix(in srgb, ${primaryColor} 15%, transparent);`);
5722
- break;
5723
- case "solid":
5724
- baseRules.push(`border-radius: 0;`);
5725
- baseRules.push(`transition: background-color 200ms ease, color 200ms ease;`);
5726
- hoverRules.push(`background-color: ${primaryColor};`);
5727
- if (navColorToken) {
5728
- hoverRules.push(`color: ${tokens.getColor(navColorToken)};`);
5729
- }
5730
- activeRules.push(`background-color: ${primaryColor};`);
5731
- if (navColorToken) {
5732
- activeRules.push(`color: ${tokens.getColor(navColorToken)};`);
5733
- }
5734
- break;
5735
- case "scale":
5736
- baseRules.push(`transition: all 200ms ease;`);
5737
- hoverRules.push(`transform: scale(1.05);`);
5738
- break;
5739
- case "frosted":
5740
- baseRules.push(`border-radius: 0.5rem;`);
5741
- baseRules.push(`background-color: rgb(255 255 255 / 0.1);`);
5742
- baseRules.push(`backdrop-filter: blur(8px);`);
5743
- baseRules.push(`transition: background-color 200ms ease;`);
5744
- hoverRules.push(`background-color: rgb(255 255 255 / 0.2);`);
5745
- activeRules.push(`background-color: rgb(255 255 255 / 0.25);`);
5746
- break;
6249
+ function generateNavLinkStyles(header, themeId, tokens, theme) {
6250
+ if (header.navLinkStyle) {
6251
+ return generateNavLinkCSS({
6252
+ themeId,
6253
+ tokens,
6254
+ theme,
6255
+ style: header.navLinkStyle,
6256
+ className: "header-nav-link"
6257
+ });
5747
6258
  }
5748
- if (usesGlassNavContainer && header.navStyle === "minimal") {
5749
- baseRules.push(`border-radius: 9999px;`);
5750
- hoverRules.push(`background-color: rgba(255, 255, 255, 0.1);`);
5751
- activeRules.push(`background-color: rgba(255, 255, 255, 0.18);`);
5752
- hoverRules.push(`color: #fff;`);
5753
- activeRules.push(`color: #fff;`);
6259
+ const navStyle = _nullishCoalesce(header.navStyle, () => ( "minimal"));
6260
+ const basePreset = getNavLinkPreset(navStyle);
6261
+ if (!basePreset) {
6262
+ console.warn(`[generateHeaderCss] Nav link preset not found: ${navStyle}`);
6263
+ return "";
6264
+ }
6265
+ const mergedStyle = {
6266
+ ...basePreset,
6267
+ // Override with legacy settings
6268
+ fontWeight: _nullishCoalesce(header.navWeight, () => ( basePreset.fontWeight)),
6269
+ colorToken: _optionalChain([(_nullishCoalesce(header.navColor, () => ( header.textColor))), 'optionalAccess', _25 => _25.trim, 'call', _26 => _26()]) || basePreset.colorToken
6270
+ };
6271
+ if (header.navWeight === "bold" && navStyle === "solid") {
6272
+ mergedStyle.textTransform = "uppercase";
5754
6273
  }
5755
6274
  if (header.navEffects) {
6275
+ mergedStyle.effects = {
6276
+ ...mergedStyle.effects,
6277
+ hover: [..._optionalChain([mergedStyle, 'access', _27 => _27.effects, 'optionalAccess', _28 => _28.hover]) || []],
6278
+ active: [..._optionalChain([mergedStyle, 'access', _29 => _29.effects, 'optionalAccess', _30 => _30.active]) || []]
6279
+ };
5756
6280
  if (header.navEffects.glow) {
5757
- hoverRules.push(`filter: drop-shadow(0 0 5px currentColor);`);
6281
+ mergedStyle.effects.hover.push({
6282
+ effectId: "outer-glow",
6283
+ options: { spread: 5 }
6284
+ });
5758
6285
  }
5759
6286
  if (header.navEffects.neumorphic) {
5760
- console.log("[generateHeaderCss] Generating neumorphic styles for theme:", themeId);
5761
- baseRules.push(`transition: all 200ms ease;`);
5762
- baseRules.push(`border-radius: 0.5rem;`);
5763
- hoverRules.push(`box-shadow: inset 4px 4px 8px #c7c7c7, inset -4px -4px 8px #ffffff;`);
5764
- hoverRules.push(`color: ${primaryColor};`);
6287
+ mergedStyle.effects.hover.push({
6288
+ effectId: "neumorphic-shadow",
6289
+ options: { mode: "pressed" }
6290
+ });
6291
+ mergedStyle.effects.hover.push({
6292
+ effectId: "text-color-change",
6293
+ options: { hoverColorToken: "primary" }
6294
+ });
5765
6295
  }
5766
6296
  if (header.navEffects.underlineGradient) {
5767
- cssChunks.push(generateGradientUnderlineCSS(themeId, tokens));
6297
+ mergedStyle.effects.hover.push({
6298
+ effectId: "border-bottom-grow",
6299
+ options: { origin: "center" }
6300
+ });
5768
6301
  }
5769
6302
  }
5770
- if (baseRules.length > 0) {
5771
- cssChunks.push(`
5772
- ${selector} {
5773
- ${baseRules.join("\n ")}
5774
- }
5775
- `);
5776
- }
5777
- if (hoverRules.length > 0) {
5778
- cssChunks.push(`
5779
- ${hoverSelector} {
5780
- ${hoverRules.join("\n ")}
5781
- }
5782
- `);
5783
- }
5784
- if (activeRules.length > 0) {
5785
- cssChunks.push(`
5786
- ${activeSelector} {
5787
- ${activeRules.join("\n ")}
5788
- }
5789
- `);
6303
+ const navContainerType = _nullishCoalesce(_optionalChain([header, 'access', _31 => _31.navContainer, 'optionalAccess', _32 => _32.type]), () => ( "none"));
6304
+ if (navContainerType === "glass" && navStyle === "minimal") {
6305
+ mergedStyle.borderRadius = "full";
6306
+ mergedStyle.effects = {
6307
+ ...mergedStyle.effects,
6308
+ hover: [
6309
+ { effectId: "background-on-hover-alpha", options: { colorToken: "neutral-50", opacity: 10 } },
6310
+ { effectId: "text-color-change", options: { hoverColorToken: "neutral-50" } }
6311
+ ],
6312
+ active: [
6313
+ { effectId: "background-on-hover-alpha", options: { colorToken: "neutral-50", opacity: 18 } },
6314
+ { effectId: "text-color-change", options: { hoverColorToken: "neutral-50" } }
6315
+ ]
6316
+ };
5790
6317
  }
5791
- return cssChunks.join("");
6318
+ return generateNavLinkCSS({
6319
+ themeId,
6320
+ tokens,
6321
+ theme,
6322
+ style: mergedStyle,
6323
+ className: "header-nav-link"
6324
+ });
5792
6325
  }
5793
6326
  function generateNavContainerStyles(header, themeId, tokens) {
5794
6327
  const navContainer = header.navContainer;
5795
- const navContainerType = _nullishCoalesce(_optionalChain([navContainer, 'optionalAccess', _25 => _25.type]), () => ( "none"));
6328
+ const navContainerType = _nullishCoalesce(_optionalChain([navContainer, 'optionalAccess', _33 => _33.type]), () => ( "none"));
5796
6329
  if (!navContainer || navContainerType === "none") return "";
5797
6330
  const selector = `:where([data-theme-scope="${themeId}"]) .header-nav-row`;
5798
6331
  const rules = [];
@@ -5825,52 +6358,6 @@ function generateNavContainerStyles(header, themeId, tokens) {
5825
6358
  }
5826
6359
  return "";
5827
6360
  }
5828
- function generateGradientUnderlineCSS(themeId, tokens) {
5829
- const selector = `:where([data-theme-scope="${themeId}"]) .header-nav-link`;
5830
- const primaryColor = tokens.getColor("primary");
5831
- const accentColor = tokens.getColor("accent");
5832
- return `
5833
- ${selector}::after {
5834
- content: '';
5835
- position: absolute;
5836
- bottom: 0;
5837
- left: 0;
5838
- width: 100%;
5839
- height: 2px;
5840
- background: linear-gradient(to right, ${primaryColor}, ${accentColor});
5841
- transform: scaleX(0);
5842
- transform-origin: center;
5843
- transition: transform 0.3s ease;
5844
- }
5845
-
5846
- ${selector}:hover::after,
5847
- ${selector}[data-active="true"]::after {
5848
- transform: scaleX(1);
5849
- }
5850
- `.trim();
5851
- }
5852
- function generateUnderlineGrowCSS(themeId) {
5853
- const selector = `:where([data-theme-scope="${themeId}"]) .header-nav-link`;
5854
- return `
5855
- ${selector}::after {
5856
- content: '';
5857
- position: absolute;
5858
- bottom: 0;
5859
- left: 0;
5860
- width: 100%;
5861
- height: 2px;
5862
- background: currentColor;
5863
- transform: scaleX(0);
5864
- transform-origin: center;
5865
- transition: transform 0.3s ease;
5866
- }
5867
-
5868
- ${selector}:hover::after,
5869
- ${selector}[data-active="true"]::after {
5870
- transform: scaleX(1);
5871
- }
5872
- `.trim();
5873
- }
5874
6361
  function generateFloatingContainerStyles(container, themeId, tokens) {
5875
6362
  if (!container) return "";
5876
6363
  const selector = `:where([data-theme-scope="${themeId}"]) .header-floating-container`;
@@ -5927,12 +6414,52 @@ function applyAlpha(color, opacity) {
5927
6414
  const clamped = clampOpacity(opacity, 1);
5928
6415
  if (color.startsWith("rgb(") && color.endsWith(")")) {
5929
6416
  const inner = color.slice(4, -1).trim();
5930
- const channels = inner.includes("/") ? inner.split("/")[0].trim() : inner;
6417
+ const channels = inner.includes("/") ? (_nullishCoalesce(inner.split("/")[0], () => ( inner))).trim() : inner;
5931
6418
  return `rgb(${channels} / ${clamped})`;
5932
6419
  }
5933
6420
  return color;
5934
6421
  }
5935
6422
 
6423
+ // ../blocks/src/theme/footer/generateFooterCss.ts
6424
+ function generateFooterCss(options) {
6425
+ const { themeId, theme } = options;
6426
+ const tokens = new TokenResolver(theme);
6427
+ const footer = theme.footer;
6428
+ const cssChunks = [];
6429
+ cssChunks.push(generateFooterNavLinkStyles(footer, themeId, tokens, theme));
6430
+ return cssChunks.filter(Boolean).join("\n\n");
6431
+ }
6432
+ function generateFooterNavLinkStyles(footer, themeId, tokens, theme) {
6433
+ if (footer.navLinkStyle) {
6434
+ return generateNavLinkCSS({
6435
+ themeId,
6436
+ tokens,
6437
+ theme,
6438
+ style: footer.navLinkStyle,
6439
+ className: "footer-nav-link"
6440
+ });
6441
+ }
6442
+ const navStyle = _nullishCoalesce(footer.navStyle, () => ( "minimal"));
6443
+ const basePreset = getNavLinkPreset(navStyle);
6444
+ if (!basePreset) {
6445
+ console.warn(`[generateFooterCss] Nav link preset not found: ${navStyle}`);
6446
+ return "";
6447
+ }
6448
+ const mergedStyle = {
6449
+ ...basePreset,
6450
+ // Override with legacy settings
6451
+ fontWeight: _nullishCoalesce(footer.navWeight, () => ( basePreset.fontWeight)),
6452
+ colorToken: _optionalChain([footer, 'access', _34 => _34.navColor, 'optionalAccess', _35 => _35.trim, 'call', _36 => _36()]) || basePreset.colorToken
6453
+ };
6454
+ return generateNavLinkCSS({
6455
+ themeId,
6456
+ tokens,
6457
+ theme,
6458
+ style: mergedStyle,
6459
+ className: "footer-nav-link"
6460
+ });
6461
+ }
6462
+
5936
6463
  // ../blocks/src/theme/layout/generateLayoutCss.ts
5937
6464
  function generateLayoutCss(options) {
5938
6465
  const { themeId } = options;
@@ -6086,6 +6613,105 @@ ${root} .step-connector {
6086
6613
  return cssBlocks.join("\n\n");
6087
6614
  }
6088
6615
 
6616
+ // ../blocks/src/theme/typography/generateTypographyCss.ts
6617
+ function generateTypographyCss({ themeId }) {
6618
+ const root = `:where([data-theme-scope="${themeId}"])`;
6619
+ const cssBlocks = [];
6620
+ cssBlocks.push(`/* Base heading styles */
6621
+ ${root} :where(h1, h2, h3, h4, h5, h6) {
6622
+ font-family: var(--font-heading);
6623
+ font-style: var(--fi-heading, normal);
6624
+ text-transform: var(--tt-heading, none);
6625
+ font-variant: var(--fv-heading, normal);
6626
+ margin: 0;
6627
+ }`);
6628
+ cssBlocks.push(`/* Heading level styles with fluid typography */
6629
+ ${root} :where(h1) {
6630
+ font-size: var(--fs-h1-fluid, var(--fs-h1));
6631
+ font-weight: var(--fw-h1, var(--font-weight-heading));
6632
+ font-style: var(--fi-h1, var(--fi-heading, normal));
6633
+ letter-spacing: var(--ls-h1, var(--ls-heading));
6634
+ line-height: var(--lh-h1, var(--lh-heading));
6635
+ }
6636
+
6637
+ ${root} :where(h2) {
6638
+ font-size: var(--fs-h2-fluid, var(--fs-h2));
6639
+ font-weight: var(--fw-h2, var(--font-weight-heading));
6640
+ font-style: var(--fi-h2, var(--fi-heading, normal));
6641
+ letter-spacing: var(--ls-h2, var(--ls-heading));
6642
+ line-height: var(--lh-h2, var(--lh-heading));
6643
+ }
6644
+
6645
+ ${root} :where(h3) {
6646
+ font-size: var(--fs-h3-fluid, var(--fs-h3));
6647
+ font-weight: var(--fw-h3, var(--font-weight-heading));
6648
+ font-style: var(--fi-h3, var(--fi-heading, normal));
6649
+ letter-spacing: var(--ls-h3, var(--ls-heading));
6650
+ line-height: var(--lh-h3, var(--lh-heading));
6651
+ }
6652
+
6653
+ ${root} :where(h4) {
6654
+ font-size: var(--fs-h4-fluid, var(--fs-h4, var(--fs-h3)));
6655
+ font-weight: var(--fw-h4, var(--font-weight-heading));
6656
+ font-style: var(--fi-h4, var(--fi-heading, normal));
6657
+ letter-spacing: var(--ls-h4, var(--ls-heading));
6658
+ line-height: var(--lh-h4, var(--lh-heading));
6659
+ }
6660
+
6661
+ ${root} :where(h5) {
6662
+ font-size: var(--fs-h5-fluid, var(--fs-h5, var(--fs-body)));
6663
+ font-weight: var(--fw-h5, var(--font-weight-heading));
6664
+ font-style: var(--fi-h5, var(--fi-heading, normal));
6665
+ letter-spacing: var(--ls-h5, var(--ls-heading));
6666
+ line-height: var(--lh-h5, var(--lh-heading));
6667
+ }
6668
+
6669
+ ${root} :where(h6) {
6670
+ font-size: var(--fs-h6-fluid, var(--fs-h6, var(--fs-body)));
6671
+ font-weight: var(--fw-h6, var(--font-weight-heading));
6672
+ font-style: var(--fi-h6, var(--fi-heading, normal));
6673
+ letter-spacing: var(--ls-h6, var(--ls-heading));
6674
+ line-height: var(--lh-h6, var(--lh-heading));
6675
+ }`);
6676
+ cssBlocks.push(`/* Display variant for hero/splash headings */
6677
+ ${root} :where(.heading-display) {
6678
+ font-size: var(--fs-display-fluid, var(--fs-display));
6679
+ }
6680
+
6681
+ ${root} :where(h1.heading-display) {
6682
+ font-size: var(--fs-h1-display-fluid, var(--fs-h1-display, calc(var(--fs-h1) * 1.5)));
6683
+ }
6684
+
6685
+ ${root} :where(h2.heading-display) {
6686
+ font-size: var(--fs-h2-display-fluid, var(--fs-h2-display, calc(var(--fs-h2) * 1.35)));
6687
+ }`);
6688
+ cssBlocks.push(`/* Compact variant for cards/sidebars */
6689
+ ${root} :where(.heading-compact) {
6690
+ font-size: var(--fs-compact);
6691
+ }
6692
+
6693
+ ${root} :where(h1.heading-compact) {
6694
+ font-size: calc(var(--fs-h1) * 0.75);
6695
+ }
6696
+
6697
+ ${root} :where(h2.heading-compact) {
6698
+ font-size: calc(var(--fs-h2) * 0.8);
6699
+ }
6700
+
6701
+ ${root} :where(h3.heading-compact) {
6702
+ font-size: calc(var(--fs-h3) * 0.85);
6703
+ }`);
6704
+ cssBlocks.push(`/* Body text base styles */
6705
+ ${root} :where(p, li, td, th, label, span) {
6706
+ font-family: var(--font-body);
6707
+ font-weight: var(--font-weight-body);
6708
+ font-size: var(--fs-body);
6709
+ letter-spacing: var(--ls-body);
6710
+ line-height: var(--lh-body);
6711
+ }`);
6712
+ return cssBlocks.join("\n\n");
6713
+ }
6714
+
6089
6715
  // ../blocks/src/system/theme/tokens.ts
6090
6716
  var defaultThemeTokens = {
6091
6717
  color: {
@@ -6160,7 +6786,7 @@ var defaultThemeTokens = {
6160
6786
  function buildThemeRuntime(theme, options) {
6161
6787
  const hydrated = hydrateTheme(theme);
6162
6788
  const cssVars = buildThemeCssVars(hydrated);
6163
- const themeId = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _26 => _26.themeId]), () => ( "theme-default"));
6789
+ const themeId = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _37 => _37.themeId]), () => ( "theme-default"));
6164
6790
  const buttonCss = generateButtonCss({
6165
6791
  themeId,
6166
6792
  theme,
@@ -6170,6 +6796,10 @@ function buildThemeRuntime(theme, options) {
6170
6796
  themeId,
6171
6797
  theme
6172
6798
  });
6799
+ const footerCss = generateFooterCss({
6800
+ themeId,
6801
+ theme
6802
+ });
6173
6803
  const cardCss = generateCardCss({
6174
6804
  themeId,
6175
6805
  theme,
@@ -6199,8 +6829,12 @@ function buildThemeRuntime(theme, options) {
6199
6829
  themeId,
6200
6830
  theme
6201
6831
  });
6832
+ const typographyCss = generateTypographyCss({
6833
+ themeId,
6834
+ theme
6835
+ });
6202
6836
  const tokens = buildThemeTokens(hydrated, theme);
6203
- return { hydrated, cssVars, tokens, paletteTokens: hydrated.palette, buttonCss, headerCss, cardCss, accordionCss, inputCss, layoutCss, statusCss, progressCss };
6837
+ return { hydrated, cssVars, tokens, paletteTokens: hydrated.palette, buttonCss, headerCss, footerCss, cardCss, accordionCss, inputCss, layoutCss, statusCss, progressCss, typographyCss };
6204
6838
  }
6205
6839
  function hydrateTheme(theme) {
6206
6840
  return {
@@ -6222,25 +6856,47 @@ function buildThemeCssVars(theme) {
6222
6856
  ...typography.headings.h1.weight ? { ["--fw-h1"]: mapWeight(typography.headings.h1.weight) } : {},
6223
6857
  ...typography.headings.h2.weight ? { ["--fw-h2"]: mapWeight(typography.headings.h2.weight) } : {},
6224
6858
  ...typography.headings.h3.weight ? { ["--fw-h3"]: mapWeight(typography.headings.h3.weight) } : {},
6225
- ..._optionalChain([typography, 'access', _27 => _27.headings, 'access', _28 => _28.h4, 'optionalAccess', _29 => _29.weight]) ? { ["--fw-h4"]: mapWeight(typography.headings.h4.weight) } : {},
6226
- ..._optionalChain([typography, 'access', _30 => _30.headings, 'access', _31 => _31.h5, 'optionalAccess', _32 => _32.weight]) ? { ["--fw-h5"]: mapWeight(typography.headings.h5.weight) } : {},
6227
- ..._optionalChain([typography, 'access', _33 => _33.headings, 'access', _34 => _34.h6, 'optionalAccess', _35 => _35.weight]) ? { ["--fw-h6"]: mapWeight(typography.headings.h6.weight) } : {},
6859
+ ..._optionalChain([typography, 'access', _38 => _38.headings, 'access', _39 => _39.h4, 'optionalAccess', _40 => _40.weight]) ? { ["--fw-h4"]: mapWeight(typography.headings.h4.weight) } : {},
6860
+ ..._optionalChain([typography, 'access', _41 => _41.headings, 'access', _42 => _42.h5, 'optionalAccess', _43 => _43.weight]) ? { ["--fw-h5"]: mapWeight(typography.headings.h5.weight) } : {},
6861
+ ..._optionalChain([typography, 'access', _44 => _44.headings, 'access', _45 => _45.h6, 'optionalAccess', _46 => _46.weight]) ? { ["--fw-h6"]: mapWeight(typography.headings.h6.weight) } : {},
6228
6862
  ["--ls-heading"]: mapLetterSpacing(typography.headings.default.letterSpacing),
6229
6863
  ["--ls-body"]: mapLetterSpacing(typography.body.letterSpacing),
6230
6864
  ...typography.headings.h1.letterSpacing ? { ["--ls-h1"]: mapLetterSpacing(typography.headings.h1.letterSpacing) } : {},
6231
6865
  ...typography.headings.h2.letterSpacing ? { ["--ls-h2"]: mapLetterSpacing(typography.headings.h2.letterSpacing) } : {},
6232
6866
  ...typography.headings.h3.letterSpacing ? { ["--ls-h3"]: mapLetterSpacing(typography.headings.h3.letterSpacing) } : {},
6867
+ ..._optionalChain([typography, 'access', _47 => _47.headings, 'access', _48 => _48.h4, 'optionalAccess', _49 => _49.letterSpacing]) ? { ["--ls-h4"]: mapLetterSpacing(typography.headings.h4.letterSpacing) } : {},
6868
+ ..._optionalChain([typography, 'access', _50 => _50.headings, 'access', _51 => _51.h5, 'optionalAccess', _52 => _52.letterSpacing]) ? { ["--ls-h5"]: mapLetterSpacing(typography.headings.h5.letterSpacing) } : {},
6869
+ ..._optionalChain([typography, 'access', _53 => _53.headings, 'access', _54 => _54.h6, 'optionalAccess', _55 => _55.letterSpacing]) ? { ["--ls-h6"]: mapLetterSpacing(typography.headings.h6.letterSpacing) } : {},
6233
6870
  ["--lh-heading"]: mapLineHeight(typography.headings.default.lineHeight),
6234
6871
  ["--lh-body"]: mapLineHeight(typography.body.lineHeight),
6235
6872
  ...typography.headings.h1.lineHeight ? { ["--lh-h1"]: mapLineHeight(typography.headings.h1.lineHeight) } : {},
6236
6873
  ...typography.headings.h2.lineHeight ? { ["--lh-h2"]: mapLineHeight(typography.headings.h2.lineHeight) } : {},
6237
6874
  ...typography.headings.h3.lineHeight ? { ["--lh-h3"]: mapLineHeight(typography.headings.h3.lineHeight) } : {},
6875
+ ..._optionalChain([typography, 'access', _56 => _56.headings, 'access', _57 => _57.h4, 'optionalAccess', _58 => _58.lineHeight]) ? { ["--lh-h4"]: mapLineHeight(typography.headings.h4.lineHeight) } : {},
6876
+ ..._optionalChain([typography, 'access', _59 => _59.headings, 'access', _60 => _60.h5, 'optionalAccess', _61 => _61.lineHeight]) ? { ["--lh-h5"]: mapLineHeight(typography.headings.h5.lineHeight) } : {},
6877
+ ..._optionalChain([typography, 'access', _62 => _62.headings, 'access', _63 => _63.h6, 'optionalAccess', _64 => _64.lineHeight]) ? { ["--lh-h6"]: mapLineHeight(typography.headings.h6.lineHeight) } : {},
6238
6878
  ["--tt-heading"]: mapTextTransform(typography.headings.default.case),
6239
6879
  ["--fv-heading"]: mapFontVariant(typography.headings.default.case),
6880
+ ["--fi-heading"]: mapFontStyle(typography.headings.default.italic),
6881
+ // Per-level italic overrides
6882
+ ...typography.headings.h1.italic != null ? { ["--fi-h1"]: mapFontStyle(typography.headings.h1.italic) } : {},
6883
+ ...typography.headings.h2.italic != null ? { ["--fi-h2"]: mapFontStyle(typography.headings.h2.italic) } : {},
6884
+ ...typography.headings.h3.italic != null ? { ["--fi-h3"]: mapFontStyle(typography.headings.h3.italic) } : {},
6885
+ ..._optionalChain([typography, 'access', _65 => _65.headings, 'access', _66 => _66.h4, 'optionalAccess', _67 => _67.italic]) != null ? { ["--fi-h4"]: mapFontStyle(typography.headings.h4.italic) } : {},
6886
+ ..._optionalChain([typography, 'access', _68 => _68.headings, 'access', _69 => _69.h5, 'optionalAccess', _70 => _70.italic]) != null ? { ["--fi-h5"]: mapFontStyle(typography.headings.h5.italic) } : {},
6887
+ ..._optionalChain([typography, 'access', _71 => _71.headings, 'access', _72 => _72.h6, 'optionalAccess', _73 => _73.italic]) != null ? { ["--fi-h6"]: mapFontStyle(typography.headings.h6.italic) } : {},
6888
+ // Static font sizes (fallback)
6240
6889
  ["--fs-body"]: sized.body,
6241
6890
  ["--fs-h3"]: sized.h3,
6242
6891
  ["--fs-h2"]: sized.h2,
6243
6892
  ["--fs-h1"]: sized.h1,
6893
+ // Fluid font sizes (responsive with clamp)
6894
+ ["--fs-h1-fluid"]: sized.h1Fluid,
6895
+ ["--fs-h2-fluid"]: sized.h2Fluid,
6896
+ ["--fs-h3-fluid"]: sized.h3Fluid,
6897
+ // Display variant (for hero/splash headings)
6898
+ ["--fs-h1-display"]: sized.h1Display,
6899
+ ["--fs-h1-display-fluid"]: sized.h1DisplayFluid,
6244
6900
  ["--shadow-elev"]: mapShadow(shadow.elevation, shadow.softness, shadow.position || "bottom"),
6245
6901
  ["--space-mult"]: mapSpaceMult(space),
6246
6902
  ["--motion-duration"]: mapMotionDuration(motion.level),
@@ -6346,33 +7002,81 @@ function mapMotionEasing(e) {
6346
7002
  gentle: "cubic-bezier(.15,.85,.15,1)"
6347
7003
  }[e];
6348
7004
  }
7005
+ function normalizeScaleName(scale) {
7006
+ const aliasMap = {
7007
+ minorThird: "compact",
7008
+ majorThird: "balanced",
7009
+ perfectFourth: "spacious",
7010
+ compact: "compact",
7011
+ balanced: "balanced",
7012
+ spacious: "spacious"
7013
+ };
7014
+ return _nullishCoalesce(aliasMap[scale], () => ( "balanced"));
7015
+ }
6349
7016
  function computeTypeScale(scale, bodySize) {
6350
7017
  const base = { md: 16, lg: 17, xl: 18 }[bodySize];
6351
- const ratio = { minorThird: 1.2, majorThird: 1.25, perfectFourth: 1.333 }[scale];
7018
+ const normalizedScale = normalizeScaleName(scale);
7019
+ const ratio = { compact: 1.2, balanced: 1.25, spacious: 1.333 }[normalizedScale];
6352
7020
  const h3 = Math.round(base * ratio);
6353
7021
  const h2 = Math.round(h3 * ratio);
6354
7022
  const h1 = Math.round(h2 * ratio);
7023
+ const fluidMin = 0.7;
7024
+ const fluidMax = 1.3;
6355
7025
  return {
7026
+ // Static sizes (fallback)
6356
7027
  ["--fs-body"]: `${base}px`,
6357
7028
  ["--fs-h3"]: `${h3}px`,
6358
7029
  ["--fs-h2"]: `${h2}px`,
6359
- ["--fs-h1"]: `${h1}px`
7030
+ ["--fs-h1"]: `${h1}px`,
7031
+ // Fluid typography min/max values
7032
+ ["--fs-h1-min"]: `${Math.round(h1 * fluidMin)}px`,
7033
+ ["--fs-h1-max"]: `${Math.round(h1 * fluidMax)}px`,
7034
+ ["--fs-h2-min"]: `${Math.round(h2 * fluidMin)}px`,
7035
+ ["--fs-h2-max"]: `${Math.round(h2 * fluidMax)}px`,
7036
+ ["--fs-h3-min"]: `${Math.round(h3 * fluidMin)}px`,
7037
+ ["--fs-h3-max"]: `${Math.round(h3 * fluidMax)}px`,
7038
+ // Fluid clamp values (320px to 1200px viewport range = 880px)
7039
+ ["--fs-h1-fluid"]: `clamp(${Math.round(h1 * fluidMin)}px, calc(${Math.round(h1 * fluidMin)}px + ${Math.round(h1 * (fluidMax - fluidMin))} * ((100vw - 320px) / 880)), ${Math.round(h1 * fluidMax)}px)`,
7040
+ ["--fs-h2-fluid"]: `clamp(${Math.round(h2 * fluidMin)}px, calc(${Math.round(h2 * fluidMin)}px + ${Math.round(h2 * (fluidMax - fluidMin))} * ((100vw - 320px) / 880)), ${Math.round(h2 * fluidMax)}px)`,
7041
+ ["--fs-h3-fluid"]: `clamp(${Math.round(h3 * fluidMin)}px, calc(${Math.round(h3 * fluidMin)}px + ${Math.round(h3 * (fluidMax - fluidMin))} * ((100vw - 320px) / 880)), ${Math.round(h3 * fluidMax)}px)`,
7042
+ // Display variant sizes (1.5x for hero headings)
7043
+ ["--fs-h1-display"]: `${Math.round(h1 * 1.5)}px`,
7044
+ ["--fs-h1-display-fluid"]: `clamp(${Math.round(h1 * fluidMin * 1.5)}px, calc(${Math.round(h1 * fluidMin * 1.5)}px + ${Math.round(h1 * (fluidMax - fluidMin) * 1.5)} * ((100vw - 320px) / 880)), ${Math.round(h1 * fluidMax * 1.5)}px)`
6360
7045
  };
6361
7046
  }
7047
+ var SIZE_SCALE_MAP = {
7048
+ xs: 0.85,
7049
+ sm: 0.925,
7050
+ md: 1,
7051
+ lg: 1.1,
7052
+ xl: 1.2,
7053
+ "2xl": 1.35
7054
+ };
6362
7055
  function applyHeadingSizeOverrides(base, typography) {
6363
7056
  const body = base["--fs-body"];
6364
7057
  const h1Base = parseFloat(base["--fs-h1"].replace("px", ""));
6365
7058
  const h2Base = parseFloat(base["--fs-h2"].replace("px", ""));
6366
7059
  const h3Base = parseFloat(base["--fs-h3"].replace("px", ""));
6367
- const scaleMap = { md: 1, lg: 1.1, xl: 1.2 };
6368
- const h1Scale = typography.headings.h1.size ? scaleMap[typography.headings.h1.size] : 1;
6369
- const h2Scale = typography.headings.h2.size ? scaleMap[typography.headings.h2.size] : 1;
6370
- const h3Scale = typography.headings.h3.size ? scaleMap[typography.headings.h3.size] : 1;
7060
+ const h1Scale = typography.headings.h1.size ? SIZE_SCALE_MAP[typography.headings.h1.size] : 1;
7061
+ const h2Scale = typography.headings.h2.size ? SIZE_SCALE_MAP[typography.headings.h2.size] : 1;
7062
+ const h3Scale = typography.headings.h3.size ? SIZE_SCALE_MAP[typography.headings.h3.size] : 1;
7063
+ const h1 = Math.round(h1Base * h1Scale);
7064
+ const h2 = Math.round(h2Base * h2Scale);
7065
+ const h3 = Math.round(h3Base * h3Scale);
7066
+ const fluidMin = 0.7;
7067
+ const fluidMax = 1.3;
6371
7068
  return {
6372
7069
  body,
6373
- h1: `${Math.round(h1Base * h1Scale)}px`,
6374
- h2: `${Math.round(h2Base * h2Scale)}px`,
6375
- h3: `${Math.round(h3Base * h3Scale)}px`
7070
+ h1: `${h1}px`,
7071
+ h2: `${h2}px`,
7072
+ h3: `${h3}px`,
7073
+ // Fluid versions with size overrides applied
7074
+ h1Fluid: `clamp(${Math.round(h1 * fluidMin)}px, calc(${Math.round(h1 * fluidMin)}px + ${Math.round(h1 * (fluidMax - fluidMin))} * ((100vw - 320px) / 880)), ${Math.round(h1 * fluidMax)}px)`,
7075
+ h2Fluid: `clamp(${Math.round(h2 * fluidMin)}px, calc(${Math.round(h2 * fluidMin)}px + ${Math.round(h2 * (fluidMax - fluidMin))} * ((100vw - 320px) / 880)), ${Math.round(h2 * fluidMax)}px)`,
7076
+ h3Fluid: `clamp(${Math.round(h3 * fluidMin)}px, calc(${Math.round(h3 * fluidMin)}px + ${Math.round(h3 * (fluidMax - fluidMin))} * ((100vw - 320px) / 880)), ${Math.round(h3 * fluidMax)}px)`,
7077
+ // Display variant (1.5x scale for hero headings)
7078
+ h1Display: `${Math.round(h1 * 1.5)}px`,
7079
+ h1DisplayFluid: `clamp(${Math.round(h1 * 1.5 * fluidMin)}px, calc(${Math.round(h1 * 1.5 * fluidMin)}px + ${Math.round(h1 * 1.5 * (fluidMax - fluidMin))} * ((100vw - 320px) / 880)), ${Math.round(h1 * 1.5 * fluidMax)}px)`
6376
7080
  };
6377
7081
  }
6378
7082
  function mapLetterSpacing(s) {
@@ -6389,6 +7093,9 @@ function mapFontVariant(c) {
6389
7093
  if (c === "smallCaps") return "small-caps";
6390
7094
  return "normal";
6391
7095
  }
7096
+ function mapFontStyle(italic) {
7097
+ return italic ? "italic" : "normal";
7098
+ }
6392
7099
 
6393
7100
  // ../blocks/src/PageRenderer.tsx
6394
7101
  var _react = require('react'); var React5 = _interopRequireWildcard(_react);
@@ -6417,12 +7124,12 @@ var RichTextValueSchema = _zod.z.union([
6417
7124
  ]);
6418
7125
  function buildRichTextSchema(options) {
6419
7126
  let schema = RichTextValueSchema;
6420
- if (_optionalChain([options, 'optionalAccess', _36 => _36.required])) {
7127
+ if (_optionalChain([options, 'optionalAccess', _74 => _74.required])) {
6421
7128
  const label = _nullishCoalesce(options.label, () => ( "This field"));
6422
7129
  schema = schema.refine(
6423
7130
  (val) => {
6424
7131
  const doc = _nullishCoalesce(val.doc, () => ( val));
6425
- const content = _optionalChain([doc, 'optionalAccess', _37 => _37.content]);
7132
+ const content = _optionalChain([doc, 'optionalAccess', _75 => _75.content]);
6426
7133
  if (!content || content.length === 0) return false;
6427
7134
  if (content.length === 1 && content[0].type === "paragraph" && !content[0].content) {
6428
7135
  return false;
@@ -6495,13 +7202,13 @@ function buildFieldSchema(field, allowNull, allowIncomplete = false) {
6495
7202
  return finalizeSchema(schema, required, allowNull, allowIncomplete);
6496
7203
  }
6497
7204
  function buildTextSchema(field) {
6498
- const ui = _nullishCoalesce(_optionalChain([field, 'optionalAccess', _38 => _38.ui]), () => ( {}));
6499
- const inputType = _optionalChain([ui, 'optionalAccess', _39 => _39.inputType]);
7205
+ const ui = _nullishCoalesce(_optionalChain([field, 'optionalAccess', _76 => _76.ui]), () => ( {}));
7206
+ const inputType = _optionalChain([ui, 'optionalAccess', _77 => _77.inputType]);
6500
7207
  let schema;
6501
7208
  if (inputType === "number") {
6502
7209
  schema = _zod.z.coerce.number();
6503
- if (typeof _optionalChain([ui, 'optionalAccess', _40 => _40.min]) === "number") schema = schema.min(ui.min);
6504
- if (typeof _optionalChain([ui, 'optionalAccess', _41 => _41.max]) === "number") schema = schema.max(ui.max);
7210
+ if (typeof _optionalChain([ui, 'optionalAccess', _78 => _78.min]) === "number") schema = schema.min(ui.min);
7211
+ if (typeof _optionalChain([ui, 'optionalAccess', _79 => _79.max]) === "number") schema = schema.max(ui.max);
6505
7212
  } else {
6506
7213
  schema = _zod.z.string();
6507
7214
  if (inputType === "email") {
@@ -6511,7 +7218,7 @@ function buildTextSchema(field) {
6511
7218
  const TEL_RE = /^[+()0-9\s\-]{3,}$/;
6512
7219
  schema = schema.regex(TEL_RE, `${field.label} must be a valid phone number`);
6513
7220
  }
6514
- if (_optionalChain([ui, 'optionalAccess', _42 => _42.pattern])) {
7221
+ if (_optionalChain([ui, 'optionalAccess', _80 => _80.pattern])) {
6515
7222
  try {
6516
7223
  const re = new RegExp(ui.pattern);
6517
7224
  schema = schema.regex(re, `${field.label} is not in the correct format`);
@@ -6591,7 +7298,7 @@ function buildLinkSchema() {
6591
7298
  }
6592
7299
  function buildSelectSchema(field) {
6593
7300
  const ui = field.ui;
6594
- if (_optionalChain([ui, 'optionalAccess', _43 => _43.widget]) === "sdkSelect") {
7301
+ if (_optionalChain([ui, 'optionalAccess', _81 => _81.widget]) === "sdkSelect") {
6595
7302
  const anyStringSchema = _zod.z.string();
6596
7303
  if (field.multiple) {
6597
7304
  const arraySchema = _zod.z.array(anyStringSchema);
@@ -6615,11 +7322,11 @@ function buildReferenceSchema(field) {
6615
7322
  return schema;
6616
7323
  }
6617
7324
  function buildRepeaterSchema(field, allowNull, allowIncomplete) {
6618
- const parsed = _chunkEGTDJ4PLjs.fieldSchema.array().parse(_nullishCoalesce(_optionalChain([field, 'access', _44 => _44.schema, 'optionalAccess', _45 => _45.fields]), () => ( [])));
7325
+ const parsed = _chunkYYO3RIFOjs.fieldSchema.array().parse(_nullishCoalesce(_optionalChain([field, 'access', _82 => _82.schema, 'optionalAccess', _83 => _83.fields]), () => ( [])));
6619
7326
  const childShape = {};
6620
7327
  for (const child of parsed) {
6621
- if (child.type === "group" && _optionalChain([child, 'access', _46 => _46.ui, 'optionalAccess', _47 => _47.flattenInRepeater])) {
6622
- const groupParsed = _chunkEGTDJ4PLjs.fieldSchema.array().parse(_nullishCoalesce(_optionalChain([child, 'access', _48 => _48.schema, 'optionalAccess', _49 => _49.fields]), () => ( [])));
7328
+ if (child.type === "group" && _optionalChain([child, 'access', _84 => _84.ui, 'optionalAccess', _85 => _85.flattenInRepeater])) {
7329
+ const groupParsed = _chunkYYO3RIFOjs.fieldSchema.array().parse(_nullishCoalesce(_optionalChain([child, 'access', _86 => _86.schema, 'optionalAccess', _87 => _87.fields]), () => ( [])));
6623
7330
  for (const gc of groupParsed) {
6624
7331
  childShape[gc.id] = buildFieldSchema(gc, allowNull, allowIncomplete);
6625
7332
  }
@@ -6638,7 +7345,7 @@ function buildRepeaterSchema(field, allowNull, allowIncomplete) {
6638
7345
  return arraySchema;
6639
7346
  }
6640
7347
  function buildGroupSchema(field, allowNull, allowIncomplete) {
6641
- const parsed = _chunkEGTDJ4PLjs.fieldSchema.array().parse(_nullishCoalesce(_optionalChain([field, 'access', _50 => _50.schema, 'optionalAccess', _51 => _51.fields]), () => ( [])));
7348
+ const parsed = _chunkYYO3RIFOjs.fieldSchema.array().parse(_nullishCoalesce(_optionalChain([field, 'access', _88 => _88.schema, 'optionalAccess', _89 => _89.fields]), () => ( [])));
6642
7349
  const childShape = {};
6643
7350
  for (const child of parsed) {
6644
7351
  childShape[child.id] = buildFieldSchema(child, allowNull, allowIncomplete);
@@ -6656,7 +7363,7 @@ function finalizeSchema(schema, required, allowNull, allowIncomplete = false) {
6656
7363
  }
6657
7364
 
6658
7365
  // ../blocks/src/system/fragments/library/headerCta.ts
6659
- var headerCtaFragment = _chunkEGTDJ4PLjs.defineFragment.call(void 0, {
7366
+ var headerCtaFragment = _chunkYYO3RIFOjs.defineFragment.call(void 0, {
6660
7367
  id: "headerCta",
6661
7368
  title: "Header CTA",
6662
7369
  description: "Single call-to-action button for the site header.",
@@ -6696,7 +7403,7 @@ var headerCtaFragment = _chunkEGTDJ4PLjs.defineFragment.call(void 0, {
6696
7403
  }
6697
7404
  ],
6698
7405
  layout: [
6699
- _chunkEGTDJ4PLjs.ctaButton.call(void 0, {
7406
+ _chunkYYO3RIFOjs.ctaButton.call(void 0, {
6700
7407
  basePath: "cta",
6701
7408
  // Relative path
6702
7409
  whenPath: "cta.label"
@@ -6706,7 +7413,7 @@ var headerCtaFragment = _chunkEGTDJ4PLjs.defineFragment.call(void 0, {
6706
7413
  });
6707
7414
 
6708
7415
  // ../blocks/src/system/fragments/library/singleButton.ts
6709
- var singleButtonFragment = _chunkEGTDJ4PLjs.defineFragment.call(void 0, {
7416
+ var singleButtonFragment = _chunkYYO3RIFOjs.defineFragment.call(void 0, {
6710
7417
  id: "singleButton",
6711
7418
  title: "Single Button Content",
6712
7419
  description: "Heading and primary button for the single button block.",
@@ -6718,7 +7425,7 @@ var singleButtonFragment = _chunkEGTDJ4PLjs.defineFragment.call(void 0, {
6718
7425
  required: true,
6719
7426
  maxLength: 120
6720
7427
  },
6721
- _chunkEGTDJ4PLjs.createButtonGroup.call(void 0, {
7428
+ _chunkYYO3RIFOjs.createButtonGroup.call(void 0, {
6722
7429
  showGroupLabel: true,
6723
7430
  groupId: "button",
6724
7431
  groupLabel: "Button",
@@ -6726,9 +7433,9 @@ var singleButtonFragment = _chunkEGTDJ4PLjs.defineFragment.call(void 0, {
6726
7433
  })
6727
7434
  ],
6728
7435
  layout: [
6729
- _chunkEGTDJ4PLjs.headingGroup.call(void 0, { titlePath: "title" }),
7436
+ _chunkYYO3RIFOjs.headingGroup.call(void 0, { titlePath: "title" }),
6730
7437
  // Relative path
6731
- _chunkEGTDJ4PLjs.ctaButton.call(void 0, { basePath: "button" })
7438
+ _chunkYYO3RIFOjs.ctaButton.call(void 0, { basePath: "button" })
6732
7439
  // Relative path
6733
7440
  ]
6734
7441
  });
@@ -6736,26 +7443,26 @@ var singleButtonFragment = _chunkEGTDJ4PLjs.defineFragment.call(void 0, {
6736
7443
  // ../blocks/src/system/fragments/lazyInit.ts
6737
7444
  var initialized = false;
6738
7445
  var ALL_FRAGMENTS = [
6739
- _chunkEGTDJ4PLjs.bodyCopyFragment,
6740
- _chunkEGTDJ4PLjs.heroCopyFragment,
6741
- _chunkEGTDJ4PLjs.ctaRowFragment,
6742
- _chunkEGTDJ4PLjs.ctaCopyFragment,
6743
- _chunkEGTDJ4PLjs.testimonialsHeadingFragment,
6744
- _chunkEGTDJ4PLjs.testimonialsCarouselFragment,
6745
- _chunkEGTDJ4PLjs.formCopyFragment,
6746
- _chunkEGTDJ4PLjs.formEmbedFragment,
6747
- _chunkEGTDJ4PLjs.footerBottomTextFragment,
6748
- _chunkEGTDJ4PLjs.footerLinkGroupsFragment,
7446
+ _chunkYYO3RIFOjs.bodyCopyFragment,
7447
+ _chunkYYO3RIFOjs.heroCopyFragment,
7448
+ _chunkYYO3RIFOjs.ctaRowFragment,
7449
+ _chunkYYO3RIFOjs.ctaCopyFragment,
7450
+ _chunkYYO3RIFOjs.testimonialsHeadingFragment,
7451
+ _chunkYYO3RIFOjs.testimonialsCarouselFragment,
7452
+ _chunkYYO3RIFOjs.formCopyFragment,
7453
+ _chunkYYO3RIFOjs.formEmbedFragment,
7454
+ _chunkYYO3RIFOjs.footerBottomTextFragment,
7455
+ _chunkYYO3RIFOjs.footerLinkGroupsFragment,
6749
7456
  headerCtaFragment,
6750
7457
  singleButtonFragment,
6751
- _chunkEGTDJ4PLjs.blogFeaturedPostFragment,
6752
- _chunkEGTDJ4PLjs.blogListGridFragment,
6753
- _chunkEGTDJ4PLjs.blogListStackFragment,
6754
- _chunkEGTDJ4PLjs.faqHeadingFragment,
6755
- _chunkEGTDJ4PLjs.faqAccordionFragment,
6756
- _chunkEGTDJ4PLjs.cardFragment,
6757
- _chunkEGTDJ4PLjs.headingFragment,
6758
- _chunkEGTDJ4PLjs.richTextFragment
7458
+ _chunkYYO3RIFOjs.blogFeaturedPostFragment,
7459
+ _chunkYYO3RIFOjs.blogListGridFragment,
7460
+ _chunkYYO3RIFOjs.blogListStackFragment,
7461
+ _chunkYYO3RIFOjs.faqHeadingFragment,
7462
+ _chunkYYO3RIFOjs.faqAccordionFragment,
7463
+ _chunkYYO3RIFOjs.cardFragment,
7464
+ _chunkYYO3RIFOjs.headingFragment,
7465
+ _chunkYYO3RIFOjs.richTextFragment
6759
7466
  ];
6760
7467
  function lazyRegisterFragments(registerFn) {
6761
7468
  if (initialized) return;
@@ -6779,7 +7486,7 @@ function getFragmentRegistry() {
6779
7486
 
6780
7487
  // ../blocks/src/system/transforms/registry/core.ts
6781
7488
  function runTransforms(value, transforms, context, registry) {
6782
- if (!_optionalChain([transforms, 'optionalAccess', _52 => _52.length])) return value;
7489
+ if (!_optionalChain([transforms, 'optionalAccess', _90 => _90.length])) return value;
6783
7490
  return transforms.reduce((acc, step) => {
6784
7491
  const transform = registry.get(step.id);
6785
7492
  if (!transform) {
@@ -6851,7 +7558,7 @@ var resolveImageStyleTransform = {
6851
7558
  style.width = scaleValue;
6852
7559
  style.height = scaleValue;
6853
7560
  }
6854
- if (position && !_chunkEGTDJ4PLjs.BACKGROUND_POSITION_PRESET_VALUES.includes(position)) {
7561
+ if (position && !_chunkYYO3RIFOjs.BACKGROUND_POSITION_PRESET_VALUES.includes(position)) {
6855
7562
  style.objectPosition = position;
6856
7563
  }
6857
7564
  return style;
@@ -6862,7 +7569,7 @@ var resolveImageClassNameTransform = {
6862
7569
  kind: "string",
6863
7570
  summary: "Resolve className for background image based on objectFit, scale and position",
6864
7571
  run: (value, options, _context) => {
6865
- const baseClass = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _53 => _53.baseClass]), () => ( "absolute -z-10"));
7572
+ const baseClass = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _91 => _91.baseClass]), () => ( "absolute -z-10"));
6866
7573
  if (!value || typeof value !== "object") return `${baseClass} inset-0 h-full w-full`;
6867
7574
  const input = value;
6868
7575
  const objectFit = isString(input.objectFit) ? input.objectFit.trim() : null;
@@ -6882,12 +7589,12 @@ var resolveImageClassNameTransform = {
6882
7589
  if (!needsAnchoring) {
6883
7590
  return `${baseClass} inset-0 h-full w-full`;
6884
7591
  }
6885
- const isPreset = position && _chunkEGTDJ4PLjs.BACKGROUND_POSITION_PRESET_VALUES.includes(position);
7592
+ const isPreset = position && _chunkYYO3RIFOjs.BACKGROUND_POSITION_PRESET_VALUES.includes(position);
6886
7593
  const isCustom = position && !isPreset;
6887
7594
  if (isCustom) {
6888
7595
  return baseClass;
6889
7596
  }
6890
- const anchorClasses = _chunkEGTDJ4PLjs.getAnchorClasses.call(void 0, position);
7597
+ const anchorClasses = _chunkYYO3RIFOjs.getAnchorClasses.call(void 0, position);
6891
7598
  return `${baseClass} ${anchorClasses}`;
6892
7599
  }
6893
7600
  };
@@ -6904,7 +7611,7 @@ var backgroundTransforms = [
6904
7611
  const opacity = isNumber(input.opacity) ? input.opacity : isString(input.opacity) ? parseFloat(input.opacity) : null;
6905
7612
  const style = {};
6906
7613
  if (color) {
6907
- const isToken = Boolean(_optionalChain([context, 'optionalAccess', _54 => _54.theme, 'optionalAccess', _55 => _55.palette, 'optionalAccess', _56 => _56[color]]) || color === "transparent" || color === "surface");
7614
+ const isToken = Boolean(_optionalChain([context, 'optionalAccess', _92 => _92.theme, 'optionalAccess', _93 => _93.palette, 'optionalAccess', _94 => _94[color]]) || color === "transparent" || color === "surface");
6908
7615
  if (!isToken) {
6909
7616
  style.backgroundColor = color;
6910
7617
  }
@@ -6923,7 +7630,7 @@ var backgroundTransforms = [
6923
7630
  kind: "string",
6924
7631
  summary: "Map background color token to Tailwind class with auto-overflow for custom sizing",
6925
7632
  run: (value, options, context) => {
6926
- const baseClass = _optionalChain([options, 'optionalAccess', _57 => _57.baseClass]);
7633
+ const baseClass = _optionalChain([options, 'optionalAccess', _95 => _95.baseClass]);
6927
7634
  const base = typeof baseClass === "string" && baseClass.trim().length > 0 ? baseClass.trim() : "";
6928
7635
  if (!value || typeof value !== "object") return base;
6929
7636
  const input = value;
@@ -6932,7 +7639,7 @@ var backgroundTransforms = [
6932
7639
  const classes = [];
6933
7640
  if (base) classes.push(base);
6934
7641
  if (color) {
6935
- const isToken = Boolean(_optionalChain([context, 'optionalAccess', _58 => _58.theme, 'optionalAccess', _59 => _59.palette, 'optionalAccess', _60 => _60[color]]) || color === "transparent" || color === "surface");
7642
+ const isToken = Boolean(_optionalChain([context, 'optionalAccess', _96 => _96.theme, 'optionalAccess', _97 => _97.palette, 'optionalAccess', _98 => _98[color]]) || color === "transparent" || color === "surface");
6936
7643
  if (isToken) {
6937
7644
  classes.push(`bg-${color}`);
6938
7645
  }
@@ -6994,6 +7701,10 @@ var resolveLinkTransform = {
6994
7701
  const href = link.href.trim();
6995
7702
  return href.length > 0 ? href : null;
6996
7703
  }
7704
+ if (!kind && typeof link.href === "string") {
7705
+ const href = link.href.trim();
7706
+ return href.length > 0 ? href : null;
7707
+ }
6997
7708
  return null;
6998
7709
  }
6999
7710
  };
@@ -7005,19 +7716,19 @@ var spacingTransform = {
7005
7716
  kind: "string",
7006
7717
  summary: "Map semantic spacing value to Tailwind padding classes",
7007
7718
  run: (value, options, _context) => {
7008
- const axis = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _61 => _61.axis]), () => ( "all"));
7009
- const baseClass = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _62 => _62.baseClass]), () => ( ""));
7719
+ const axis = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _99 => _99.axis]), () => ( "all"));
7720
+ const baseClass = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _100 => _100.baseClass]), () => ( ""));
7010
7721
  if (!value || typeof value !== "string") {
7011
7722
  return baseClass.trim() || "";
7012
7723
  }
7013
7724
  const trimmed = value.trim();
7014
- if (!_chunkEGTDJ4PLjs.isSemanticSpacing.call(void 0, trimmed)) {
7725
+ if (!_chunkYYO3RIFOjs.isSemanticSpacing.call(void 0, trimmed)) {
7015
7726
  if (process.env.NODE_ENV !== "production") {
7016
7727
  console.warn(`[spacing] Invalid spacing value: "${trimmed}". Expected one of: none, compact, cozy, medium, comfortable, spacious.`);
7017
7728
  }
7018
7729
  return baseClass.trim() || "";
7019
7730
  }
7020
- const spacingClass = _chunkEGTDJ4PLjs.resolveSpacing.call(void 0, trimmed, axis);
7731
+ const spacingClass = _chunkYYO3RIFOjs.resolveSpacing.call(void 0, trimmed, axis);
7021
7732
  return baseClass ? `${baseClass.trim()} ${spacingClass}` : spacingClass;
7022
7733
  }
7023
7734
  };
@@ -7030,7 +7741,7 @@ var raisedTransform = {
7030
7741
  if (value !== true) {
7031
7742
  return baseClass.trim() || "";
7032
7743
  }
7033
- const shadowValue = _optionalChain([context, 'access', _63 => _63.theme, 'optionalAccess', _64 => _64.shadow, 'optionalAccess', _65 => _65.medium]);
7744
+ const shadowValue = _optionalChain([context, 'access', _101 => _101.theme, 'optionalAccess', _102 => _102.shadow, 'optionalAccess', _103 => _103.medium]);
7034
7745
  if (!shadowValue || shadowValue === "none") {
7035
7746
  return baseClass.trim() || "";
7036
7747
  }
@@ -7072,7 +7783,7 @@ var boxStylesCompositeTransform = {
7072
7783
  summary: "Composite transform for all box style properties",
7073
7784
  run: (value, options, context) => {
7074
7785
  if (!value || typeof value !== "object") {
7075
- return _optionalChain([options, 'access', _66 => _66.baseClass, 'optionalAccess', _67 => _67.trim, 'call', _68 => _68()]) || "";
7786
+ return _optionalChain([options, 'access', _104 => _104.baseClass, 'optionalAccess', _105 => _105.trim, 'call', _106 => _106()]) || "";
7076
7787
  }
7077
7788
  const input = value;
7078
7789
  const axis = _nullishCoalesce(options.axis, () => ( "all"));
@@ -7107,12 +7818,12 @@ var sectionClassNameTransform = {
7107
7818
  kind: "string",
7108
7819
  summary: "Resolve section className from spacing and fullWidth setting",
7109
7820
  run: (value, options, context) => {
7110
- const baseClass = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _69 => _69.baseClass]), () => ( ""));
7111
- const containerStylesPath = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _70 => _70.containerStylesPath]), () => ( "_containerStyles"));
7112
- const defaultSpacing = _optionalChain([options, 'optionalAccess', _71 => _71.defaultSpacing]);
7821
+ const baseClass = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _107 => _107.baseClass]), () => ( ""));
7822
+ const containerStylesPath = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _108 => _108.containerStylesPath]), () => ( "_containerStyles"));
7823
+ const defaultSpacing = _optionalChain([options, 'optionalAccess', _109 => _109.defaultSpacing]);
7113
7824
  const contextData = context.data;
7114
- const containerStyles = _optionalChain([contextData, 'optionalAccess', _72 => _72[containerStylesPath]]);
7115
- const fullWidth = _optionalChain([containerStyles, 'optionalAccess', _73 => _73.fullWidth]) === true;
7825
+ const containerStyles = _optionalChain([contextData, 'optionalAccess', _110 => _110[containerStylesPath]]);
7826
+ const fullWidth = _optionalChain([containerStyles, 'optionalAccess', _111 => _111.fullWidth]) === true;
7116
7827
  let adjustedBaseClass = baseClass;
7117
7828
  if (fullWidth && baseClass) {
7118
7829
  adjustedBaseClass = baseClass.split(" ").filter((cls) => !cls.startsWith("px-")).join(" ").trim();
@@ -7122,7 +7833,7 @@ var sectionClassNameTransform = {
7122
7833
  if (value && typeof value === "object") {
7123
7834
  const input = value;
7124
7835
  if (typeof input.spacing === "string") {
7125
- if (_chunkEGTDJ4PLjs.isSemanticSpacing.call(void 0, input.spacing)) {
7836
+ if (_chunkYYO3RIFOjs.isSemanticSpacing.call(void 0, input.spacing)) {
7126
7837
  spacing = input.spacing;
7127
7838
  } else if (process.env.NODE_ENV !== "production") {
7128
7839
  console.warn(`[sectionStyles] Invalid spacing value in _sectionStyles: "${input.spacing}". Expected one of: none, compact, cozy, medium, comfortable, spacious.`);
@@ -7132,7 +7843,7 @@ var sectionClassNameTransform = {
7132
7843
  if (adjustedBaseClass) classes.push(adjustedBaseClass);
7133
7844
  const effectiveSpacing = _nullishCoalesce(spacing, () => ( defaultSpacing));
7134
7845
  if (effectiveSpacing) {
7135
- const spacingClass = _chunkEGTDJ4PLjs.resolveSpacing.call(void 0, effectiveSpacing, "y");
7846
+ const spacingClass = _chunkYYO3RIFOjs.resolveSpacing.call(void 0, effectiveSpacing, "y");
7136
7847
  classes.push(spacingClass);
7137
7848
  }
7138
7849
  return classes.join(" ").trim();
@@ -7143,7 +7854,7 @@ var containerStylesResolveClassName = {
7143
7854
  kind: "string",
7144
7855
  summary: "Resolve container className based on fullWidth setting",
7145
7856
  run: (value, options, _context) => {
7146
- const baseClass = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _74 => _74.baseClass]), () => ( ""));
7857
+ const baseClass = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _112 => _112.baseClass]), () => ( ""));
7147
7858
  if (!value || typeof value !== "object") {
7148
7859
  const defaultClass = "container mx-auto";
7149
7860
  return baseClass ? `${baseClass} ${defaultClass}`.trim() : defaultClass;
@@ -7171,10 +7882,10 @@ var boxStylesTransforms = [
7171
7882
 
7172
7883
  // ../blocks/src/system/transforms/registry/index.ts
7173
7884
  var builtinTransformDefinitions = [
7174
- ..._chunkEGTDJ4PLjs.formattingTransforms,
7175
- ..._chunkEGTDJ4PLjs.layoutTransforms,
7176
- ..._chunkEGTDJ4PLjs.uiTransforms,
7177
- ..._chunkEGTDJ4PLjs.mediaTransforms,
7885
+ ..._chunkYYO3RIFOjs.formattingTransforms,
7886
+ ..._chunkYYO3RIFOjs.layoutTransforms,
7887
+ ..._chunkYYO3RIFOjs.uiTransforms,
7888
+ ..._chunkYYO3RIFOjs.mediaTransforms,
7178
7889
  ...backgroundTransforms,
7179
7890
  ...linksTransforms,
7180
7891
  ...boxStylesTransforms
@@ -7197,8 +7908,8 @@ function Section({
7197
7908
  }) {
7198
7909
  const overflowClass = allowOverflow ? "overflow-visible" : "overflow-hidden";
7199
7910
  const alwaysClass = clsx_default("relative isolate", overflowClass, className);
7200
- const backgroundStyle = background ? _chunkEGTDJ4PLjs.backgroundColorStyle.call(void 0, background) : void 0;
7201
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Comp, { className: alwaysClass, style: _chunkEGTDJ4PLjs.mergeStyles.call(void 0, backgroundStyle, style), "data-slot": _nullishCoalesce(dataSlot, () => ( "section")), children });
7911
+ const backgroundStyle = background ? _chunkYYO3RIFOjs.backgroundColorStyle.call(void 0, background) : void 0;
7912
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Comp, { className: alwaysClass, style: _chunkYYO3RIFOjs.mergeStyles.call(void 0, backgroundStyle, style), "data-slot": _nullishCoalesce(dataSlot, () => ( "section")), children });
7202
7913
  }
7203
7914
 
7204
7915
  // ../blocks/src/primitives/layout/Stack.tsx
@@ -7349,7 +8060,7 @@ function renderMarks(text, marks, key) {
7349
8060
  }
7350
8061
  function renderDoc(node, key) {
7351
8062
  if (!node || !node.type) return null;
7352
- const children = _optionalChain([node, 'access', _75 => _75.content, 'optionalAccess', _76 => _76.map, 'call', _77 => _77((child, index) => renderDoc(child, `${key}-${index}`))]);
8063
+ const children = _optionalChain([node, 'access', _113 => _113.content, 'optionalAccess', _114 => _114.map, 'call', _115 => _115((child, index) => renderDoc(child, `${key}-${index}`))]);
7353
8064
  switch (node.type) {
7354
8065
  case "doc":
7355
8066
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment, { children });
@@ -7357,7 +8068,7 @@ function renderDoc(node, key) {
7357
8068
  if (!children && !node.text) return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", {}, key);
7358
8069
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { children: _nullishCoalesce(children, () => ( renderMarks(_nullishCoalesce(node.text, () => ( "")), node.marks, key))) }, key);
7359
8070
  case "heading": {
7360
- const level = Math.min(Math.max(_nullishCoalesce(_optionalChain([node, 'access', _78 => _78.attrs, 'optionalAccess', _79 => _79.level]), () => ( 2)), 1), 6);
8071
+ const level = Math.min(Math.max(_nullishCoalesce(_optionalChain([node, 'access', _116 => _116.attrs, 'optionalAccess', _117 => _117.level]), () => ( 2)), 1), 6);
7361
8072
  const headingTag = `h${level}`;
7362
8073
  return React5.default.createElement(headingTag, { key }, children);
7363
8074
  }
@@ -7396,7 +8107,7 @@ var TextNode = ({ value, children, blockId: _blockId, blockKind: _blockKind, blo
7396
8107
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Text, { ...rest, children: _nullishCoalesce(value, () => ( children)) });
7397
8108
  };
7398
8109
  var RichTextNode = ({ value, blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, pathBase: _pathBase, ...rest }) => {
7399
- const doc = _nullishCoalesce(_optionalChain([value, 'optionalAccess', _80 => _80.doc]), () => ( value));
8110
+ const doc = _nullishCoalesce(_optionalChain([value, 'optionalAccess', _118 => _118.doc]), () => ( value));
7400
8111
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, RichText, { doc, ...rest });
7401
8112
  };
7402
8113
  var ButtonNode = ({
@@ -7465,16 +8176,16 @@ var FormNodeSSR = ({ value, submitLabel, successMessage: _successMessage, classN
7465
8176
  "div",
7466
8177
  {
7467
8178
  className: clsx_default("rounded-md border border-dashed p-6 text-sm", className),
7468
- style: _chunkEGTDJ4PLjs.mergeStyles.call(void 0,
7469
- _chunkEGTDJ4PLjs.backgroundColorStyle.call(void 0, "surface"),
7470
- _chunkEGTDJ4PLjs.borderColorStyle.call(void 0, "border"),
7471
- _chunkEGTDJ4PLjs.textColorStyle.call(void 0, "mutedText")
8179
+ style: _chunkYYO3RIFOjs.mergeStyles.call(void 0,
8180
+ _chunkYYO3RIFOjs.backgroundColorStyle.call(void 0, "surface"),
8181
+ _chunkYYO3RIFOjs.borderColorStyle.call(void 0, "border"),
8182
+ _chunkYYO3RIFOjs.textColorStyle.call(void 0, "mutedText")
7472
8183
  ),
7473
8184
  children: "Missing or unknown form."
7474
8185
  }
7475
8186
  );
7476
8187
  }
7477
- const fields = _optionalChain([form, 'optionalAccess', _81 => _81.schemaJson, 'optionalAccess', _82 => _82.fields]);
8188
+ const fields = _optionalChain([form, 'optionalAccess', _119 => _119.schemaJson, 'optionalAccess', _120 => _120.fields]);
7478
8189
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "form", { method: "POST", action: "/api/forms/submit", className: clsx_default("space-y-4", className), children: [
7479
8190
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "input", { type: "hidden", name: "form_id", value: form.id }),
7480
8191
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "input", { type: "text", name: "company", className: "hidden", tabIndex: -1, autoComplete: "off" }),
@@ -7705,7 +8416,7 @@ var COLUMN_CLASSES = {
7705
8416
  "4": "sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4"
7706
8417
  };
7707
8418
  function formatDateForUrl(isoTimestamp) {
7708
- return isoTimestamp.split("T")[0];
8419
+ return _nullishCoalesce(isoTimestamp.split("T")[0], () => ( ""));
7709
8420
  }
7710
8421
  function buildEventUrl(basePath, slug, startsAt) {
7711
8422
  const date = formatDateForUrl(startsAt);
@@ -7890,7 +8601,7 @@ function getContainerClass(layout, columns) {
7890
8601
  return `grid gap-6 ${COLUMN_CLASSES2[columns] || COLUMN_CLASSES2["3"]}`;
7891
8602
  }
7892
8603
  function formatDateForUrl2(isoTimestamp) {
7893
- return isoTimestamp.split("T")[0];
8604
+ return _nullishCoalesce(isoTimestamp.split("T")[0], () => ( ""));
7894
8605
  }
7895
8606
  function buildEventUrl2(basePath, slug, startsAt) {
7896
8607
  const date = formatDateForUrl2(startsAt);
@@ -8109,11 +8820,11 @@ function extractSegmentsFromPart(part) {
8109
8820
  if (!part) return [];
8110
8821
  const segments = [];
8111
8822
  const baseMatch = part.match(/^([^\[]+)/);
8112
- if (baseMatch) {
8823
+ if (baseMatch && baseMatch[1]) {
8113
8824
  segments.push(baseMatch[1]);
8114
8825
  }
8115
8826
  const bracketMatches = Array.from(part.matchAll(BRACKET_ACCESS_REGEX));
8116
- const bracketSegments = bracketMatches.map((match) => _nullishCoalesce(_optionalChain([match, 'access', _83 => _83.groups, 'optionalAccess', _84 => _84.token]), () => ( ""))).filter((token) => token.length > 0).map(parseBracketToken);
8827
+ const bracketSegments = bracketMatches.map((match) => _nullishCoalesce(_optionalChain([match, 'access', _121 => _121.groups, 'optionalAccess', _122 => _122.token]), () => ( ""))).filter((token) => token.length > 0).map(parseBracketToken);
8117
8828
  segments.push(...bracketSegments);
8118
8829
  if (!baseMatch && !part.includes("[")) {
8119
8830
  return [part];
@@ -8136,7 +8847,7 @@ function getAbsoluteSegments(fromPath, context) {
8136
8847
  return [first === "$root" ? "$root" : "content", ...rest];
8137
8848
  }
8138
8849
  const scoped = context.scopes.find((entry) => entry.name === first);
8139
- if (_optionalChain([scoped, 'optionalAccess', _85 => _85.basePathSegments]) && scoped.basePathSegments.length > 0) {
8850
+ if (_optionalChain([scoped, 'optionalAccess', _123 => _123.basePathSegments]) && scoped.basePathSegments.length > 0) {
8140
8851
  return [...scoped.basePathSegments, ...rest];
8141
8852
  }
8142
8853
  return void 0;
@@ -8180,7 +8891,7 @@ function extractRouteMapFromViewModel(viewModel) {
8180
8891
  }
8181
8892
  function parseBinding(raw, origin) {
8182
8893
  try {
8183
- return _chunkEGTDJ4PLjs.bindingSchema.parse(raw);
8894
+ return _chunkYYO3RIFOjs.bindingSchema.parse(raw);
8184
8895
  } catch (error) {
8185
8896
  const message = error instanceof Error ? error.message : String(error);
8186
8897
  throw new Error(`Failed to parse binding (${origin}): ${message}`);
@@ -8191,7 +8902,7 @@ function applyTransformsAndFallback(value, binding, context) {
8191
8902
  const routeMap = _nullishCoalesce(context.routes, () => ( extractRouteMapFromViewModel(context.viewModel)));
8192
8903
  const transformed = runTransforms(
8193
8904
  value,
8194
- _nullishCoalesce(_optionalChain([binding, 'access', _86 => _86.transforms, 'optionalAccess', _87 => _87.map, 'call', _88 => _88((step) => ({ id: step.id, options: step.options }))]), () => ( [])),
8905
+ _nullishCoalesce(_optionalChain([binding, 'access', _124 => _124.transforms, 'optionalAccess', _125 => _125.map, 'call', _126 => _126((step) => ({ id: step.id, options: step.options }))]), () => ( [])),
8195
8906
  { theme: _nullishCoalesce(context.theme, () => ( defaultThemeTokens)), routes: routeMap },
8196
8907
  transforms
8197
8908
  );
@@ -8269,7 +8980,7 @@ function applyScopes(node, context) {
8269
8980
  if (!node.$scopes) return context;
8270
8981
  const scopeContext = { ...context, scopes: [...context.scopes] };
8271
8982
  for (const scope of node.$scopes) {
8272
- const binding = _chunkEGTDJ4PLjs.bindingSchema.parse(scope.from);
8983
+ const binding = _chunkYYO3RIFOjs.bindingSchema.parse(scope.from);
8273
8984
  const value = resolveBindingValue(binding, scopeContext);
8274
8985
  scopeContext.scopes.push({ name: scope.name, value });
8275
8986
  }
@@ -8375,7 +9086,7 @@ function injectEditorPath(props, node, parsedBinding, context) {
8375
9086
  };
8376
9087
  }
8377
9088
  function resolveChildren(nodes, context) {
8378
- if (!_optionalChain([nodes, 'optionalAccess', _89 => _89.length])) return [];
9089
+ if (!_optionalChain([nodes, 'optionalAccess', _127 => _127.length])) return [];
8379
9090
  return nodes.flatMap((child, index) => {
8380
9091
  const childContext = { ...context, scopes: [...context.scopes] };
8381
9092
  const resolved = resolveNode2(child, childContext, index);
@@ -8397,7 +9108,7 @@ function resolveNode2(node, context, indexFallback) {
8397
9108
  const normalizedType = node.type.toLowerCase();
8398
9109
  const component = _nullishCoalesce(_nullishCoalesce(registry[node.type], () => ( registry[normalizedType])), () => ( (normalizedType === "section" ? SectionNode : void 0)));
8399
9110
  if (!component) {
8400
- if (_optionalChain([globalThis, 'optionalAccess', _90 => _90.process, 'optionalAccess', _91 => _91.env, 'optionalAccess', _92 => _92.NODE_ENV]) !== "production") {
9111
+ if (_optionalChain([globalThis, 'optionalAccess', _128 => _128.process, 'optionalAccess', _129 => _129.env, 'optionalAccess', _130 => _130.NODE_ENV]) !== "production") {
8401
9112
  console.warn(`[block-system] Missing renderer for node type: ${node.type}`);
8402
9113
  }
8403
9114
  return null;
@@ -8496,11 +9207,11 @@ function resolveBlockLayout(manifest, content) {
8496
9207
  if (!manifest.variants) {
8497
9208
  return _nullishCoalesce(manifest.layout, () => ( null));
8498
9209
  }
8499
- const contentVariant = _optionalChain([content, 'optionalAccess', _93 => _93.variant]);
9210
+ const contentVariant = _optionalChain([content, 'optionalAccess', _131 => _131.variant]);
8500
9211
  if (typeof contentVariant === "string" && manifest.variants[contentVariant]) {
8501
9212
  return manifest.variants[contentVariant];
8502
9213
  }
8503
- const contentLayout = _optionalChain([content, 'optionalAccess', _94 => _94.layout]);
9214
+ const contentLayout = _optionalChain([content, 'optionalAccess', _132 => _132.layout]);
8504
9215
  if (typeof contentLayout === "string" && manifest.variants[contentLayout]) {
8505
9216
  return manifest.variants[contentLayout];
8506
9217
  }
@@ -8557,7 +9268,7 @@ function makeDefaultBlockComponent(args) {
8557
9268
  ...typeof themeConfig !== "undefined" ? { theme: themeConfig } : {}
8558
9269
  }
8559
9270
  };
8560
- const themeForTransforms = _optionalChain([themeConfig, 'optionalAccess', _95 => _95.buttons]) ? { ...theme, buttons: themeConfig.buttons } : theme;
9271
+ const themeForTransforms = _optionalChain([themeConfig, 'optionalAccess', _133 => _133.buttons]) ? { ...theme, buttons: themeConfig.buttons } : theme;
8561
9272
  return resolveTree(layout, {
8562
9273
  registry,
8563
9274
  viewModel,
@@ -8596,7 +9307,7 @@ function renderBlock(manifest, content, options = {}) {
8596
9307
 
8597
9308
  // ../blocks/src/system/manifest/hydrateLinks.ts
8598
9309
  function hydrateManifestLinks(manifest, content, routes) {
8599
- if (!routes || !_optionalChain([manifest, 'optionalAccess', _96 => _96.fields, 'optionalAccess', _97 => _97.length])) {
9310
+ if (!routes || !_optionalChain([manifest, 'optionalAccess', _134 => _134.fields, 'optionalAccess', _135 => _135.length])) {
8600
9311
  return content;
8601
9312
  }
8602
9313
  const hydrated = hydrateValue(content, routes);
@@ -8739,9 +9450,9 @@ function PageRenderer({
8739
9450
  blockOverrides,
8740
9451
  sdkConfig
8741
9452
  }) {
8742
- setContextSupabaseUrl(_optionalChain([dataContext, 'optionalAccess', _98 => _98.supabaseUrl]));
9453
+ setContextSupabaseUrl(_optionalChain([dataContext, 'optionalAccess', _136 => _136.supabaseUrl]));
8743
9454
  if (!page || page.blocks.length === 0) {
8744
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "p-6 text-sm", style: _chunkEGTDJ4PLjs.textColorStyle.call(void 0, "mutedText"), children: "No blocks found." });
9455
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "p-6 text-sm", style: _chunkYYO3RIFOjs.textColorStyle.call(void 0, "mutedText"), children: "No blocks found." });
8745
9456
  }
8746
9457
  const themeTokens = _nullishCoalesce(providedThemeTokens, () => ( buildThemeRuntime(theme).tokens));
8747
9458
  const resolvedRegistry = _nullishCoalesce(registry, () => ( getDefaultComponentRegistry()));
@@ -8809,8 +9520,8 @@ var MemoBlockSection = React5.memo(function MemoBlockSection2({
8809
9520
  sdkConfig
8810
9521
  }) {
8811
9522
  const OverrideComponent = getBlockOverride(block.kind, blockOverrides);
8812
- let definition = _chunkEGTDJ4PLjs.getBlockDefinition.call(void 0, block.kind);
8813
- if (!definition && block.kind.startsWith("custom.") && _optionalChain([sdkConfig, 'optionalAccess', _99 => _99.customBlocks])) {
9523
+ let definition = _chunkYYO3RIFOjs.getBlockDefinition.call(void 0, block.kind);
9524
+ if (!definition && block.kind.startsWith("custom.") && _optionalChain([sdkConfig, 'optionalAccess', _137 => _137.customBlocks])) {
8814
9525
  const sdkBlock = sdkConfig.customBlocks.find((b) => b.id === block.kind);
8815
9526
  if (sdkBlock) {
8816
9527
  definition = transformSdkBlockToDefinition(sdkBlock);
@@ -8824,14 +9535,14 @@ var MemoBlockSection = React5.memo(function MemoBlockSection2({
8824
9535
  const validator = createManifestValidator(definition.manifest, { allowNull: false });
8825
9536
  const parsed = validator.safeParse(content);
8826
9537
  try {
8827
- const env = _optionalChain([globalThis, 'access', _100 => _100.process, 'optionalAccess', _101 => _101.env, 'optionalAccess', _102 => _102.NODE_ENV]);
9538
+ const env = _optionalChain([globalThis, 'access', _138 => _138.process, 'optionalAccess', _139 => _139.env, 'optionalAccess', _140 => _140.NODE_ENV]);
8828
9539
  if (env !== "production" && !parsed.success && !usePlaceholders) {
8829
9540
  console.warn("[blocks:PageRenderer] manifest validation failed", {
8830
9541
  blockId: _nullishCoalesce(block.id, () => ( null)),
8831
9542
  blockKind: block.kind,
8832
9543
  content: summarizeValue(content),
8833
9544
  expectedFields: (_nullishCoalesce(definition.manifest.fields, () => ( []))).map((f) => ({ id: f.id, type: f.type, required: !!f.required })),
8834
- issues: _nullishCoalesce(_optionalChain([parsed, 'optionalAccess', _103 => _103.error, 'optionalAccess', _104 => _104.issues]), () => ( null))
9545
+ issues: _nullishCoalesce(_optionalChain([parsed, 'optionalAccess', _141 => _141.error, 'optionalAccess', _142 => _142.issues]), () => ( null))
8835
9546
  });
8836
9547
  }
8837
9548
  } catch (e6) {
@@ -8852,7 +9563,7 @@ var MemoBlockSection = React5.memo(function MemoBlockSection2({
8852
9563
  return wrapBlock && block.id ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment, { children: wrapBlock(block.id, rendered) }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment, { children: rendered });
8853
9564
  }
8854
9565
  try {
8855
- const routes = _nullishCoalesce(routeMap, () => ( _optionalChain([dataContext, 'optionalAccess', _105 => _105.routes])));
9566
+ const routes = _nullishCoalesce(routeMap, () => ( _optionalChain([dataContext, 'optionalAccess', _143 => _143.routes])));
8856
9567
  const hydratedContent = routes ? hydrateManifestLinks(definition.manifest, data, routes) : data;
8857
9568
  const resolved = resolveBlockData({
8858
9569
  block,
@@ -8875,13 +9586,13 @@ var MemoBlockSection = React5.memo(function MemoBlockSection2({
8875
9586
  const pathBase = typeof block.id === "string" && block.id.length > 0 ? `blocks.${block.id}.` : void 0;
8876
9587
  const rootContext = {
8877
9588
  $root: {
8878
- siteId: _nullishCoalesce(_optionalChain([dataContext, 'optionalAccess', _106 => _106.siteId]), () => ( null)),
8879
- pageId: _nullishCoalesce(_optionalChain([dataContext, 'optionalAccess', _107 => _107.pageId]), () => ( null)),
8880
- previewStage: _nullishCoalesce(_optionalChain([dataContext, 'optionalAccess', _108 => _108.previewStage]), () => ( "published")),
9589
+ siteId: _nullishCoalesce(_optionalChain([dataContext, 'optionalAccess', _144 => _144.siteId]), () => ( null)),
9590
+ pageId: _nullishCoalesce(_optionalChain([dataContext, 'optionalAccess', _145 => _145.pageId]), () => ( null)),
9591
+ previewStage: _nullishCoalesce(_optionalChain([dataContext, 'optionalAccess', _146 => _146.previewStage]), () => ( "published")),
8881
9592
  ...routes ? { routes } : {},
8882
9593
  // Occurrence and content entry context for template pages
8883
- occurrenceContext: _nullishCoalesce(_optionalChain([dataContext, 'optionalAccess', _109 => _109.occurrenceContext]), () => ( null)),
8884
- contentEntry: _nullishCoalesce(_optionalChain([dataContext, 'optionalAccess', _110 => _110.contentEntry]), () => ( null))
9594
+ occurrenceContext: _nullishCoalesce(_optionalChain([dataContext, 'optionalAccess', _147 => _147.occurrenceContext]), () => ( null)),
9595
+ contentEntry: _nullishCoalesce(_optionalChain([dataContext, 'optionalAccess', _148 => _148.contentEntry]), () => ( null))
8885
9596
  }
8886
9597
  };
8887
9598
  const blockBindings = _nullishCoalesce(block.bindings, () => ( void 0));
@@ -8910,7 +9621,7 @@ var MemoBlockSection = React5.memo(function MemoBlockSection2({
8910
9621
  return prev.block === next.block && prev.registry === next.registry && prev.dataContext === next.dataContext && prev.themeTokens === next.themeTokens && prev.themeConfig === next.themeConfig && prev.routeMap === next.routeMap && prev.usePlaceholders === next.usePlaceholders && prev.wrapBlock === next.wrapBlock && prev.blockOverrides === next.blockOverrides && prev.sdkConfig === next.sdkConfig;
8911
9622
  });
8912
9623
  function fallback(message) {
8913
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "p-6 text-sm", style: _chunkEGTDJ4PLjs.textColorStyle.call(void 0, "mutedText"), children: message });
9624
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "p-6 text-sm", style: _chunkYYO3RIFOjs.textColorStyle.call(void 0, "mutedText"), children: message });
8914
9625
  }
8915
9626
  function resolveBlockData({ block, definition, dataContext }) {
8916
9627
  if (!definition.dataLoaders || Object.keys(definition.dataLoaders).length === 0) {
@@ -8918,7 +9629,7 @@ function resolveBlockData({ block, definition, dataContext }) {
8918
9629
  }
8919
9630
  const blockId = _nullishCoalesce(block.id, () => ( null));
8920
9631
  if (!blockId) return void 0;
8921
- const raw = _optionalChain([dataContext, 'optionalAccess', _111 => _111.resolvedData, 'optionalAccess', _112 => _112[blockId]]);
9632
+ const raw = _optionalChain([dataContext, 'optionalAccess', _149 => _149.resolvedData, 'optionalAccess', _150 => _150[blockId]]);
8922
9633
  if (!raw || typeof raw !== "object") {
8923
9634
  return {};
8924
9635
  }
@@ -8972,11 +9683,11 @@ var isNumber2 = (value) => typeof value === "number" && !isNaN(value);
8972
9683
  function resolveColor(color, theme) {
8973
9684
  if (!color || !isString2(color)) return null;
8974
9685
  const trimmed = color.trim();
8975
- if (_optionalChain([theme, 'optionalAccess', _113 => _113.palette, 'optionalAccess', _114 => _114[trimmed]])) {
9686
+ if (_optionalChain([theme, 'optionalAccess', _151 => _151.palette, 'optionalAccess', _152 => _152[trimmed]])) {
8976
9687
  return theme.palette[trimmed];
8977
9688
  }
8978
9689
  if (trimmed === "transparent") return "transparent";
8979
- if (trimmed === "surface" && _optionalChain([theme, 'optionalAccess', _115 => _115.palette, 'optionalAccess', _116 => _116.surface])) {
9690
+ if (trimmed === "surface" && _optionalChain([theme, 'optionalAccess', _153 => _153.palette, 'optionalAccess', _154 => _154.surface])) {
8980
9691
  return theme.palette.surface;
8981
9692
  }
8982
9693
  return trimmed;
@@ -9050,7 +9761,7 @@ function resolveBackground(background, theme) {
9050
9761
  imageStyle.width = scaleValue;
9051
9762
  imageStyle.height = scaleValue;
9052
9763
  }
9053
- const isPresetPosition = position && _chunkEGTDJ4PLjs.BACKGROUND_POSITION_PRESET_VALUES.includes(position);
9764
+ const isPresetPosition = position && _chunkYYO3RIFOjs.BACKGROUND_POSITION_PRESET_VALUES.includes(position);
9054
9765
  if (position && !isPresetPosition) {
9055
9766
  imageStyle.objectPosition = position;
9056
9767
  }
@@ -9074,11 +9785,11 @@ function buildImageClassName(objectFit, position, scaleValue) {
9074
9785
  return `${baseClass} inset-0 h-full w-full ${fitClass}`;
9075
9786
  }
9076
9787
  if ((objectFit === "custom" || objectFit === "original") && scaleValue) {
9077
- const isPresetPosition = position && _chunkEGTDJ4PLjs.BACKGROUND_POSITION_PRESET_VALUES.includes(position);
9788
+ const isPresetPosition = position && _chunkYYO3RIFOjs.BACKGROUND_POSITION_PRESET_VALUES.includes(position);
9078
9789
  if (position && !isPresetPosition) {
9079
9790
  return baseClass;
9080
9791
  }
9081
- const anchorClasses = _chunkEGTDJ4PLjs.getAnchorClasses.call(void 0, position);
9792
+ const anchorClasses = _chunkYYO3RIFOjs.getAnchorClasses.call(void 0, position);
9082
9793
  return `${baseClass} ${anchorClasses}`;
9083
9794
  }
9084
9795
  return `${baseClass} inset-0 h-full w-full`;
@@ -9522,8 +10233,7 @@ function getDefaultInputSettings() {
9522
10233
 
9523
10234
 
9524
10235
 
9525
-
9526
- exports.buildRichTextSchema = buildRichTextSchema; exports.resolveImageUrl = resolveImageUrl; exports.getDefaultComponentRegistry = getDefaultComponentRegistry; exports.makeDefaultBlockComponent = makeDefaultBlockComponent; exports.renderBlock = renderBlock; exports.buildThemeRuntime = buildThemeRuntime; exports.PageRenderer = PageRenderer; exports.generateButtonCoreCss = generateButtonCoreCss; exports.getDefaultButtonVariants = getDefaultButtonVariants; exports.generateCardCoreCss = generateCardCoreCss; exports.getDefaultCardVariants = getDefaultCardVariants; exports.generateInputCoreCss = generateInputCoreCss; exports.getDefaultInputSettings = getDefaultInputSettings; exports.RichText = RichText2; exports.resolveBackground = resolveBackground; exports.SectionBackground = SectionBackground;
10236
+ exports.resolveImageUrl = resolveImageUrl; exports.getDefaultComponentRegistry = getDefaultComponentRegistry; exports.makeDefaultBlockComponent = makeDefaultBlockComponent; exports.renderBlock = renderBlock; exports.buildThemeRuntime = buildThemeRuntime; exports.PageRenderer = PageRenderer; exports.generateButtonCoreCss = generateButtonCoreCss; exports.getDefaultButtonVariants = getDefaultButtonVariants; exports.generateCardCoreCss = generateCardCoreCss; exports.getDefaultCardVariants = getDefaultCardVariants; exports.generateInputCoreCss = generateInputCoreCss; exports.getDefaultInputSettings = getDefaultInputSettings; exports.RichText = RichText2; exports.resolveBackground = resolveBackground; exports.SectionBackground = SectionBackground;
9527
10237
  /*! Bundled license information:
9528
10238
 
9529
10239
  chroma-js/src/utils/contrastAPCA.js:
@@ -9541,4 +10251,4 @@ chroma-js/src/utils/contrastAPCA.js:
9541
10251
  * https://readtech.org/ARC/
9542
10252
  *)
9543
10253
  */
9544
- //# sourceMappingURL=chunk-VHDDXCK6.js.map
10254
+ //# sourceMappingURL=chunk-7UPVCT3K.js.map