@mieweb/ui 0.10.0-dev.15 → 0.10.0-dev.17

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 (191) hide show
  1. package/dist/CsvBlock-FX5YNGNE.cjs +17 -0
  2. package/dist/{CsvBlock-ROJCKJDP.cjs.map → CsvBlock-FX5YNGNE.cjs.map} +1 -1
  3. package/dist/CsvBlock-VLMG7GUO.js +8 -0
  4. package/dist/{CsvBlock-UWPMTLE2.js.map → CsvBlock-VLMG7GUO.js.map} +1 -1
  5. package/dist/HtmlPreviewBlock-5JE7L3GR.js +8 -0
  6. package/dist/{HtmlPreviewBlock-ME5U3XNS.js.map → HtmlPreviewBlock-5JE7L3GR.js.map} +1 -1
  7. package/dist/HtmlPreviewBlock-UO37JQ3K.cjs +17 -0
  8. package/dist/{HtmlPreviewBlock-DWFN6EUB.cjs.map → HtmlPreviewBlock-UO37JQ3K.cjs.map} +1 -1
  9. package/dist/MermaidBlock-3XHFBAMV.js +8 -0
  10. package/dist/{MermaidBlock-2B6CPD6Y.js.map → MermaidBlock-3XHFBAMV.js.map} +1 -1
  11. package/dist/MermaidBlock-RZ75RPZA.cjs +17 -0
  12. package/dist/{MermaidBlock-D2UC5M55.cjs.map → MermaidBlock-RZ75RPZA.cjs.map} +1 -1
  13. package/dist/SurveyBlock-MUVJ3JUI.js +8 -0
  14. package/dist/{SurveyBlock-4DO62RBT.js.map → SurveyBlock-MUVJ3JUI.js.map} +1 -1
  15. package/dist/SurveyBlock-VH47YXZC.cjs +17 -0
  16. package/dist/{SurveyBlock-4CD4AYMJ.cjs.map → SurveyBlock-VH47YXZC.cjs.map} +1 -1
  17. package/dist/brands/index.cjs +13 -13
  18. package/dist/brands/index.js +1 -1
  19. package/dist/{chunk-Y5HFM7LO.js → chunk-2BARVD4C.js} +3 -3
  20. package/dist/{chunk-Y5HFM7LO.js.map → chunk-2BARVD4C.js.map} +1 -1
  21. package/dist/{chunk-G3JX3UAU.cjs → chunk-3KPDQG5O.cjs} +5 -5
  22. package/dist/{chunk-G3JX3UAU.cjs.map → chunk-3KPDQG5O.cjs.map} +1 -1
  23. package/dist/{chunk-DZ5HFLRC.js → chunk-4HC2IBOX.js} +3 -3
  24. package/dist/{chunk-DZ5HFLRC.js.map → chunk-4HC2IBOX.js.map} +1 -1
  25. package/dist/{chunk-OE5CKRUC.js → chunk-673GMFA6.js} +3 -3
  26. package/dist/{chunk-OE5CKRUC.js.map → chunk-673GMFA6.js.map} +1 -1
  27. package/dist/{chunk-GOALNQZ2.js → chunk-7YO7DNUV.js} +4 -83
  28. package/dist/chunk-7YO7DNUV.js.map +1 -0
  29. package/dist/{chunk-MNILXWVY.js → chunk-DSB4DKWG.js} +7 -7
  30. package/dist/{chunk-MNILXWVY.js.map → chunk-DSB4DKWG.js.map} +1 -1
  31. package/dist/chunk-DXEPYK3I.cjs +92 -0
  32. package/dist/chunk-DXEPYK3I.cjs.map +1 -0
  33. package/dist/{chunk-DLRCAV4Z.js → chunk-EK3BCET6.js} +29 -3
  34. package/dist/chunk-EK3BCET6.js.map +1 -0
  35. package/dist/{chunk-VKELAMAZ.js → chunk-FBLVPM2K.js} +3 -3
  36. package/dist/{chunk-VKELAMAZ.js.map → chunk-FBLVPM2K.js.map} +1 -1
  37. package/dist/{chunk-VU6UTJRM.js → chunk-FIKO4WR6.js} +3 -3
  38. package/dist/{chunk-VU6UTJRM.js.map → chunk-FIKO4WR6.js.map} +1 -1
  39. package/dist/{chunk-DEDN5HAG.js → chunk-FZURBQJ2.js} +3 -3
  40. package/dist/{chunk-DEDN5HAG.js.map → chunk-FZURBQJ2.js.map} +1 -1
  41. package/dist/{chunk-XZNN3S3S.cjs → chunk-GU5OS7JJ.cjs} +4 -4
  42. package/dist/{chunk-XZNN3S3S.cjs.map → chunk-GU5OS7JJ.cjs.map} +1 -1
  43. package/dist/{chunk-E4IBHYJ7.cjs → chunk-GVBHDRC7.cjs} +5 -5
  44. package/dist/{chunk-E4IBHYJ7.cjs.map → chunk-GVBHDRC7.cjs.map} +1 -1
  45. package/dist/{chunk-V7D3YGUV.js → chunk-GVLNXPJX.js} +4 -4
  46. package/dist/{chunk-V7D3YGUV.js.map → chunk-GVLNXPJX.js.map} +1 -1
  47. package/dist/chunk-GVM6DTR5.js +90 -0
  48. package/dist/chunk-GVM6DTR5.js.map +1 -0
  49. package/dist/{chunk-3QEVGSFG.cjs → chunk-GYXUS65N.cjs} +5 -5
  50. package/dist/{chunk-3QEVGSFG.cjs.map → chunk-GYXUS65N.cjs.map} +1 -1
  51. package/dist/{chunk-WGPLUCBD.js → chunk-H2IAMSHK.js} +3 -3
  52. package/dist/{chunk-WGPLUCBD.js.map → chunk-H2IAMSHK.js.map} +1 -1
  53. package/dist/{chunk-7ZXAQTV4.cjs → chunk-HIZWOAWY.cjs} +8 -8
  54. package/dist/{chunk-7ZXAQTV4.cjs.map → chunk-HIZWOAWY.cjs.map} +1 -1
  55. package/dist/{chunk-6EN3IQQI.cjs → chunk-I4LXSHKO.cjs} +4 -4
  56. package/dist/{chunk-6EN3IQQI.cjs.map → chunk-I4LXSHKO.cjs.map} +1 -1
  57. package/dist/{chunk-76TBQDED.js → chunk-IYWG72DM.js} +4 -4
  58. package/dist/{chunk-76TBQDED.js.map → chunk-IYWG72DM.js.map} +1 -1
  59. package/dist/{chunk-IX6KFB3K.cjs → chunk-JELTRRR5.cjs} +9 -9
  60. package/dist/{chunk-IX6KFB3K.cjs.map → chunk-JELTRRR5.cjs.map} +1 -1
  61. package/dist/{chunk-TVTIGV7Q.js → chunk-K2K2HP35.js} +4 -4
  62. package/dist/{chunk-TVTIGV7Q.js.map → chunk-K2K2HP35.js.map} +1 -1
  63. package/dist/{chunk-FXO5ARBB.cjs → chunk-KDW6BD4O.cjs} +4 -4
  64. package/dist/{chunk-FXO5ARBB.cjs.map → chunk-KDW6BD4O.cjs.map} +1 -1
  65. package/dist/chunk-KHSFJTEX.js +1924 -0
  66. package/dist/chunk-KHSFJTEX.js.map +1 -0
  67. package/dist/{chunk-UV2FVNWT.cjs → chunk-LFPJ3OUM.cjs} +5 -5
  68. package/dist/{chunk-UV2FVNWT.cjs.map → chunk-LFPJ3OUM.cjs.map} +1 -1
  69. package/dist/{chunk-ZPSJ2UV6.cjs → chunk-MQPG3KVK.cjs} +8 -8
  70. package/dist/{chunk-ZPSJ2UV6.cjs.map → chunk-MQPG3KVK.cjs.map} +1 -1
  71. package/dist/{chunk-XEAT7XJG.cjs → chunk-N2CJJHHB.cjs} +4 -4
  72. package/dist/{chunk-XEAT7XJG.cjs.map → chunk-N2CJJHHB.cjs.map} +1 -1
  73. package/dist/{chunk-URAQIF67.cjs → chunk-N7C4OEP7.cjs} +6 -6
  74. package/dist/{chunk-URAQIF67.cjs.map → chunk-N7C4OEP7.cjs.map} +1 -1
  75. package/dist/{chunk-KQUI4BGS.cjs → chunk-NUQSQRG3.cjs} +17 -17
  76. package/dist/{chunk-KQUI4BGS.cjs.map → chunk-NUQSQRG3.cjs.map} +1 -1
  77. package/dist/{chunk-ENKFJJZX.js → chunk-OYBJQBLO.js} +4 -4
  78. package/dist/{chunk-ENKFJJZX.js.map → chunk-OYBJQBLO.js.map} +1 -1
  79. package/dist/{chunk-5GUOOLPR.cjs → chunk-P5CMZZRZ.cjs} +5 -5
  80. package/dist/{chunk-5GUOOLPR.cjs.map → chunk-P5CMZZRZ.cjs.map} +1 -1
  81. package/dist/{chunk-PSXTXFLM.cjs → chunk-QNDP6PE5.cjs} +29 -3
  82. package/dist/chunk-QNDP6PE5.cjs.map +1 -0
  83. package/dist/{chunk-H4ZXMQQW.js → chunk-QOVJ6Z6R.js} +3 -3
  84. package/dist/{chunk-H4ZXMQQW.js.map → chunk-QOVJ6Z6R.js.map} +1 -1
  85. package/dist/{chunk-TMMVIUUN.js → chunk-R6KPWIGO.js} +4 -4
  86. package/dist/{chunk-TMMVIUUN.js.map → chunk-R6KPWIGO.js.map} +1 -1
  87. package/dist/{chunk-WNZAYBVB.cjs → chunk-SVXWO37F.cjs} +26 -26
  88. package/dist/{chunk-WNZAYBVB.cjs.map → chunk-SVXWO37F.cjs.map} +1 -1
  89. package/dist/{chunk-2IZLKPUW.js → chunk-THLIL6PY.js} +3 -3
  90. package/dist/{chunk-2IZLKPUW.js.map → chunk-THLIL6PY.js.map} +1 -1
  91. package/dist/{chunk-N6IY47YA.cjs → chunk-TTSSUOEV.cjs} +8 -8
  92. package/dist/{chunk-N6IY47YA.cjs.map → chunk-TTSSUOEV.cjs.map} +1 -1
  93. package/dist/{chunk-5MCBWTIF.cjs → chunk-TYE5K5WV.cjs} +4 -4
  94. package/dist/{chunk-5MCBWTIF.cjs.map → chunk-TYE5K5WV.cjs.map} +1 -1
  95. package/dist/chunk-WCDJFMZO.cjs +1967 -0
  96. package/dist/chunk-WCDJFMZO.cjs.map +1 -0
  97. package/dist/{chunk-GD7EBGC4.cjs → chunk-X5KAO35W.cjs} +14 -14
  98. package/dist/{chunk-GD7EBGC4.cjs.map → chunk-X5KAO35W.cjs.map} +1 -1
  99. package/dist/{chunk-VNYW4C4J.cjs → chunk-X6A27RGO.cjs} +4 -84
  100. package/dist/chunk-X6A27RGO.cjs.map +1 -0
  101. package/dist/{chunk-G4D6CLBT.js → chunk-XBTKZCZF.js} +3 -3
  102. package/dist/{chunk-G4D6CLBT.js.map → chunk-XBTKZCZF.js.map} +1 -1
  103. package/dist/{chunk-OCSCBB52.cjs → chunk-Y4E2WRUR.cjs} +6 -6
  104. package/dist/{chunk-OCSCBB52.cjs.map → chunk-Y4E2WRUR.cjs.map} +1 -1
  105. package/dist/{chunk-VOKVG3ER.js → chunk-YIV4Y4SK.js} +3 -3
  106. package/dist/{chunk-VOKVG3ER.js.map → chunk-YIV4Y4SK.js.map} +1 -1
  107. package/dist/{chunk-KZFBQ7GY.js → chunk-YU55JD35.js} +3 -3
  108. package/dist/{chunk-KZFBQ7GY.js.map → chunk-YU55JD35.js.map} +1 -1
  109. package/dist/{chunk-3QGS6CXD.js → chunk-ZYL4SNOR.js} +3 -3
  110. package/dist/{chunk-3QGS6CXD.js.map → chunk-ZYL4SNOR.js.map} +1 -1
  111. package/dist/components/AlertDialog/index.cjs +4 -3
  112. package/dist/components/AlertDialog/index.js +3 -2
  113. package/dist/components/Button/index.cjs +4 -3
  114. package/dist/components/Button/index.d.cts +3 -2
  115. package/dist/components/Button/index.d.ts +3 -2
  116. package/dist/components/Button/index.js +2 -1
  117. package/dist/components/CalendarView/index.cjs +5 -4
  118. package/dist/components/CalendarView/index.d.cts +1 -1
  119. package/dist/components/CalendarView/index.d.ts +1 -1
  120. package/dist/components/CalendarView/index.js +3 -2
  121. package/dist/components/CustomizableDashboard/index.cjs +10 -9
  122. package/dist/components/CustomizableDashboard/index.js +3 -2
  123. package/dist/components/FloatingWindow/index.cjs +5 -4
  124. package/dist/components/FloatingWindow/index.js +3 -2
  125. package/dist/components/GanttView/index.d.cts +1 -1
  126. package/dist/components/GanttView/index.d.ts +1 -1
  127. package/dist/components/ListView/index.cjs +5 -4
  128. package/dist/components/ListView/index.d.cts +90 -2
  129. package/dist/components/ListView/index.d.ts +90 -2
  130. package/dist/components/ListView/index.js +3 -2
  131. package/dist/components/Markdown/index.cjs +20 -19
  132. package/dist/components/Markdown/index.js +8 -7
  133. package/dist/components/MediaEditor/index.cjs +9 -8
  134. package/dist/components/MediaEditor/index.js +4 -3
  135. package/dist/components/MediaPlayer/index.cjs +6 -5
  136. package/dist/components/MediaPlayer/index.js +3 -2
  137. package/dist/components/MegaMenu/index.cjs +6 -5
  138. package/dist/components/MegaMenu/index.js +3 -2
  139. package/dist/components/RadialExplorer/index.cjs +4 -3
  140. package/dist/components/RadialExplorer/index.js +3 -2
  141. package/dist/components/RichTextEditor/index.cjs +6 -5
  142. package/dist/components/RichTextEditor/index.js +3 -2
  143. package/dist/components/SectionSpyNav/index.cjs +4 -3
  144. package/dist/components/SectionSpyNav/index.js +3 -2
  145. package/dist/components/ViewSet/index.cjs +6 -5
  146. package/dist/components/ViewSet/index.d.cts +101 -1
  147. package/dist/components/ViewSet/index.d.ts +101 -1
  148. package/dist/components/ViewSet/index.js +5 -4
  149. package/dist/components/ViewSwitcher/index.d.cts +57 -4
  150. package/dist/components/ViewSwitcher/index.d.ts +57 -4
  151. package/dist/datavis.cjs +3 -2
  152. package/dist/datavis.cjs.map +1 -1
  153. package/dist/datavis.js +2 -1
  154. package/dist/datavis.js.map +1 -1
  155. package/dist/esheet.cjs +7 -6
  156. package/dist/esheet.cjs.map +1 -1
  157. package/dist/esheet.js +4 -3
  158. package/dist/esheet.js.map +1 -1
  159. package/dist/index.cjs +613 -523
  160. package/dist/index.cjs.map +1 -1
  161. package/dist/index.d.cts +558 -1
  162. package/dist/index.d.ts +558 -1
  163. package/dist/index.js +41 -38
  164. package/dist/index.js.map +1 -1
  165. package/dist/styles/effects.css +33 -0
  166. package/dist/styles.css +1 -1
  167. package/dist/tailwind-preset.cjs +4 -4
  168. package/dist/tailwind-preset.js +1 -1
  169. package/dist/templates.cjs +103 -0
  170. package/dist/templates.cjs.map +1 -0
  171. package/dist/templates.d.cts +560 -0
  172. package/dist/templates.d.ts +560 -0
  173. package/dist/templates.js +10 -0
  174. package/dist/templates.js.map +1 -0
  175. package/dist/{types-DsdZvEI1.d.cts → types-C3HQe74F.d.cts} +1 -7
  176. package/dist/{types-DsdZvEI1.d.ts → types-C3HQe74F.d.ts} +1 -7
  177. package/package.json +12 -1
  178. package/dist/CsvBlock-ROJCKJDP.cjs +0 -16
  179. package/dist/CsvBlock-UWPMTLE2.js +0 -7
  180. package/dist/HtmlPreviewBlock-DWFN6EUB.cjs +0 -16
  181. package/dist/HtmlPreviewBlock-ME5U3XNS.js +0 -7
  182. package/dist/MermaidBlock-2B6CPD6Y.js +0 -7
  183. package/dist/MermaidBlock-D2UC5M55.cjs +0 -16
  184. package/dist/SurveyBlock-4CD4AYMJ.cjs +0 -16
  185. package/dist/SurveyBlock-4DO62RBT.js +0 -7
  186. package/dist/chunk-DLRCAV4Z.js.map +0 -1
  187. package/dist/chunk-GOALNQZ2.js.map +0 -1
  188. package/dist/chunk-PSXTXFLM.cjs.map +0 -1
  189. package/dist/chunk-VNYW4C4J.cjs.map +0 -1
  190. package/dist/index-DoYYWsNc.d.cts +0 -127
  191. package/dist/index-DoYYWsNc.d.ts +0 -127
@@ -0,0 +1,1967 @@
1
+ 'use strict';
2
+
3
+ var chunkZ5S5JEJD_cjs = require('./chunk-Z5S5JEJD.cjs');
4
+ var chunkYVL3XATO_cjs = require('./chunk-YVL3XATO.cjs');
5
+ var chunkDXEPYK3I_cjs = require('./chunk-DXEPYK3I.cjs');
6
+ var chunkS5RVSXDV_cjs = require('./chunk-S5RVSXDV.cjs');
7
+ var React = require('react');
8
+ var lucideReact = require('lucide-react');
9
+ var jsxRuntime = require('react/jsx-runtime');
10
+
11
+ function _interopNamespace(e) {
12
+ if (e && e.__esModule) return e;
13
+ var n = Object.create(null);
14
+ if (e) {
15
+ Object.keys(e).forEach(function (k) {
16
+ if (k !== 'default') {
17
+ var d = Object.getOwnPropertyDescriptor(e, k);
18
+ Object.defineProperty(n, k, d.get ? d : {
19
+ enumerable: true,
20
+ get: function () { return e[k]; }
21
+ });
22
+ }
23
+ });
24
+ }
25
+ n.default = e;
26
+ return Object.freeze(n);
27
+ }
28
+
29
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
30
+
31
+ // src/utils/own.ts
32
+ function ownProperty(map, key) {
33
+ return map != null && Object.hasOwn(map, key) ? map[key] : void 0;
34
+ }
35
+ var templateIcons = {
36
+ activity: lucideReact.Activity,
37
+ award: lucideReact.Award,
38
+ "badge-check": lucideReact.BadgeCheck,
39
+ bell: lucideReact.Bell,
40
+ briefcase: lucideReact.Briefcase,
41
+ building: lucideReact.Building2,
42
+ calendar: lucideReact.Calendar,
43
+ "calendar-check": lucideReact.CalendarCheck,
44
+ "chart-column": lucideReact.ChartColumn,
45
+ "chart-line": lucideReact.ChartLine,
46
+ "circle-check": lucideReact.CircleCheck,
47
+ "clipboard-check": lucideReact.ClipboardCheck,
48
+ clock: lucideReact.Clock,
49
+ cloud: lucideReact.Cloud,
50
+ database: lucideReact.Database,
51
+ "dollar-sign": lucideReact.DollarSign,
52
+ factory: lucideReact.Factory,
53
+ "file-text": lucideReact.FileText,
54
+ flask: lucideReact.FlaskConical,
55
+ globe: lucideReact.Globe,
56
+ "graduation-cap": lucideReact.GraduationCap,
57
+ handshake: lucideReact.Handshake,
58
+ "hard-hat": lucideReact.HardHat,
59
+ headset: lucideReact.Headset,
60
+ "heart-pulse": lucideReact.HeartPulse,
61
+ hospital: lucideReact.Hospital,
62
+ layers: lucideReact.Layers,
63
+ leaf: lucideReact.Leaf,
64
+ lightbulb: lucideReact.Lightbulb,
65
+ lock: lucideReact.Lock,
66
+ mail: lucideReact.Mail,
67
+ "map-pin": lucideReact.MapPin,
68
+ "message-square": lucideReact.MessageSquare,
69
+ microscope: lucideReact.Microscope,
70
+ phone: lucideReact.Phone,
71
+ plane: lucideReact.Plane,
72
+ plug: lucideReact.Plug,
73
+ rocket: lucideReact.Rocket,
74
+ scale: lucideReact.Scale,
75
+ search: lucideReact.Search,
76
+ settings: lucideReact.Settings,
77
+ shield: lucideReact.Shield,
78
+ "shield-check": lucideReact.ShieldCheck,
79
+ smartphone: lucideReact.Smartphone,
80
+ sparkles: lucideReact.Sparkles,
81
+ stethoscope: lucideReact.Stethoscope,
82
+ syringe: lucideReact.Syringe,
83
+ target: lucideReact.Target,
84
+ timer: lucideReact.Timer,
85
+ "trending-up": lucideReact.TrendingUp,
86
+ truck: lucideReact.Truck,
87
+ "user-check": lucideReact.UserCheck,
88
+ users: lucideReact.Users,
89
+ workflow: lucideReact.Workflow,
90
+ wrench: lucideReact.Wrench,
91
+ zap: lucideReact.Zap
92
+ };
93
+ function TemplateIcon({ name, icons, className }) {
94
+ const Icon = ownProperty(icons, name) ?? ownProperty(templateIcons, name);
95
+ if (Icon)
96
+ return /* @__PURE__ */ jsxRuntime.jsx(
97
+ Icon,
98
+ {
99
+ "aria-hidden": "true",
100
+ strokeWidth: 1.75,
101
+ className: chunkS5RVSXDV_cjs.cn("size-5", className)
102
+ }
103
+ );
104
+ if (name.length <= 4)
105
+ return /* @__PURE__ */ jsxRuntime.jsx(
106
+ "span",
107
+ {
108
+ "aria-hidden": "true",
109
+ className: chunkS5RVSXDV_cjs.cn("text-xs font-bold tracking-wide", className),
110
+ children: name
111
+ }
112
+ );
113
+ return null;
114
+ }
115
+ var toneSurface = {
116
+ default: "bg-background text-foreground",
117
+ muted: "bg-muted text-foreground",
118
+ brand: "bg-primary-900 text-white"
119
+ };
120
+ var toneClass = (tone) => toneSurface[tone];
121
+ var cardClass = (tone) => tone === "brand" ? "border border-white/15 bg-white/5 text-white" : "border border-border bg-card text-card-foreground";
122
+ var mutedTextClass = (tone) => tone === "brand" ? "text-white/80" : tone === "muted" ? "text-foreground/80" : "text-muted-foreground";
123
+ var headingTextClass = (tone) => tone === "brand" ? "text-white" : "text-foreground";
124
+ var accentTextClass = (tone) => tone === "brand" ? "text-white" : "text-primary-800 dark:text-primary-300";
125
+ var containerClass = (width = "wide") => chunkS5RVSXDV_cjs.cn(
126
+ "mx-auto w-full px-4 sm:px-6 lg:px-8",
127
+ width === "narrow" ? "max-w-3xl" : "max-w-7xl"
128
+ );
129
+ var SAFE_HREF_SCHEME = /^(?:https?|mailto|tel):/i;
130
+ function safeHref(href) {
131
+ if (href == null) return void 0;
132
+ const stripped = href.replace(/[\u0000-\u0020]/g, "");
133
+ if (!stripped) return void 0;
134
+ if (!/^[a-z][a-z0-9+.-]*:/i.test(stripped)) return href;
135
+ return SAFE_HREF_SCHEME.test(stripped) ? href : void 0;
136
+ }
137
+ function TemplateAnchor({
138
+ components,
139
+ trackingId,
140
+ children,
141
+ ...props
142
+ }) {
143
+ const Link = components?.Link;
144
+ const href = safeHref(props.href);
145
+ const all = { ...props, href, "data-track": trackingId };
146
+ return Link && href != null ? /* @__PURE__ */ jsxRuntime.jsx(Link, { ...all, href, children }) : /* @__PURE__ */ jsxRuntime.jsx("a", { ...all, children });
147
+ }
148
+ var fetchPriorityHigh = React__namespace.version.startsWith("18.") ? { fetchpriority: "high" } : { fetchPriority: "high" };
149
+ function TemplateImg({
150
+ components,
151
+ priority,
152
+ ...image
153
+ }) {
154
+ const Image = components?.Image;
155
+ if (Image) return /* @__PURE__ */ jsxRuntime.jsx(Image, { ...image, priority });
156
+ return /* @__PURE__ */ jsxRuntime.jsx(
157
+ "img",
158
+ {
159
+ ...image,
160
+ alt: image.alt,
161
+ loading: priority ? void 0 : "lazy",
162
+ ...priority ? fetchPriorityHigh : {},
163
+ decoding: "async"
164
+ }
165
+ );
166
+ }
167
+ function SectionHeading({
168
+ eyebrow,
169
+ title,
170
+ description,
171
+ as: Heading = "h2",
172
+ size = "section",
173
+ align = "start",
174
+ tone = "default",
175
+ titleId,
176
+ className
177
+ }) {
178
+ if (!eyebrow && !title && !description) return null;
179
+ return /* @__PURE__ */ jsxRuntime.jsxs(
180
+ "div",
181
+ {
182
+ "data-slot": "section-heading",
183
+ className: chunkS5RVSXDV_cjs.cn(
184
+ "max-w-3xl",
185
+ align === "center" && "mx-auto text-center",
186
+ className
187
+ ),
188
+ children: [
189
+ eyebrow && /* @__PURE__ */ jsxRuntime.jsx(
190
+ "p",
191
+ {
192
+ className: chunkS5RVSXDV_cjs.cn(
193
+ "mb-3 text-sm font-semibold tracking-wider uppercase",
194
+ accentTextClass(tone)
195
+ ),
196
+ children: eyebrow
197
+ }
198
+ ),
199
+ title && /* @__PURE__ */ jsxRuntime.jsx(
200
+ Heading,
201
+ {
202
+ id: titleId,
203
+ className: chunkS5RVSXDV_cjs.cn(
204
+ "font-bold tracking-tight text-balance",
205
+ headingTextClass(tone),
206
+ size === "hero" ? "text-4xl sm:text-5xl lg:text-6xl" : "text-3xl sm:text-4xl"
207
+ ),
208
+ children: title
209
+ }
210
+ ),
211
+ description && /* @__PURE__ */ jsxRuntime.jsx(
212
+ "p",
213
+ {
214
+ className: chunkS5RVSXDV_cjs.cn(
215
+ "mt-4 text-pretty",
216
+ size === "hero" ? "text-lg sm:text-xl" : "text-lg",
217
+ mutedTextClass(tone)
218
+ ),
219
+ children: description
220
+ }
221
+ )
222
+ ]
223
+ }
224
+ );
225
+ }
226
+ var SectionShell = React__namespace.forwardRef(
227
+ ({
228
+ eyebrow,
229
+ title,
230
+ description,
231
+ tone = "default",
232
+ align = "start",
233
+ width = "wide",
234
+ spacing = "default",
235
+ className,
236
+ children,
237
+ components,
238
+ ...rest
239
+ }, ref) => {
240
+ const titleId = React__namespace.useId();
241
+ return /* @__PURE__ */ jsxRuntime.jsx(
242
+ "section",
243
+ {
244
+ ref,
245
+ "data-slot": "landing-section",
246
+ "data-tone": tone,
247
+ "aria-labelledby": title ? titleId : void 0,
248
+ className: chunkS5RVSXDV_cjs.cn(
249
+ spacing === "compact" ? "py-10 sm:py-14" : "py-16 sm:py-24",
250
+ toneClass(tone),
251
+ className
252
+ ),
253
+ ...rest,
254
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: containerClass(width), children: [
255
+ /* @__PURE__ */ jsxRuntime.jsx(
256
+ SectionHeading,
257
+ {
258
+ eyebrow,
259
+ title,
260
+ description,
261
+ align,
262
+ tone,
263
+ titleId,
264
+ className: chunkS5RVSXDV_cjs.cn(width === "narrow" && "max-w-none")
265
+ }
266
+ ),
267
+ children
268
+ ] })
269
+ }
270
+ );
271
+ }
272
+ );
273
+ SectionShell.displayName = "SectionShell";
274
+ function CtaLinks({
275
+ primary,
276
+ secondary,
277
+ tone = "default",
278
+ align = "start",
279
+ className,
280
+ components
281
+ }) {
282
+ if (!primary && !secondary) return null;
283
+ const onBrand = tone === "brand";
284
+ const wrap = "h-auto min-h-12 py-3 whitespace-normal text-center";
285
+ return /* @__PURE__ */ jsxRuntime.jsxs(
286
+ "div",
287
+ {
288
+ "data-slot": "cta-links",
289
+ className: chunkS5RVSXDV_cjs.cn(
290
+ "flex flex-col gap-3 sm:flex-row sm:flex-wrap",
291
+ align === "center" && "sm:justify-center",
292
+ className
293
+ ),
294
+ children: [
295
+ primary && /* @__PURE__ */ jsxRuntime.jsxs(
296
+ TemplateAnchor,
297
+ {
298
+ href: primary.href,
299
+ trackingId: primary.trackingId,
300
+ components,
301
+ "data-slot": "cta-primary",
302
+ className: chunkS5RVSXDV_cjs.cn(
303
+ chunkDXEPYK3I_cjs.buttonVariants({ variant: "primary", size: "lg" }),
304
+ wrap,
305
+ onBrand && "text-primary-900 hover:bg-primary-50 active:bg-primary-100 bg-white"
306
+ ),
307
+ children: [
308
+ primary.label,
309
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowRight, { "aria-hidden": "true", className: "size-5 rtl:-scale-x-100" })
310
+ ]
311
+ }
312
+ ),
313
+ secondary && /* @__PURE__ */ jsxRuntime.jsx(
314
+ TemplateAnchor,
315
+ {
316
+ href: secondary.href,
317
+ trackingId: secondary.trackingId,
318
+ components,
319
+ "data-slot": "cta-secondary",
320
+ className: chunkS5RVSXDV_cjs.cn(
321
+ chunkDXEPYK3I_cjs.buttonVariants({ variant: "outline", size: "lg" }),
322
+ wrap,
323
+ onBrand && "border-white/70 text-white hover:bg-white/10 hover:text-white dark:border-white/70 dark:text-white dark:hover:bg-white/10"
324
+ ),
325
+ children: secondary.label
326
+ }
327
+ )
328
+ ]
329
+ }
330
+ );
331
+ }
332
+ function IconTile({
333
+ name,
334
+ icons,
335
+ tone = "default",
336
+ className
337
+ }) {
338
+ return /* @__PURE__ */ jsxRuntime.jsx(
339
+ "span",
340
+ {
341
+ "data-slot": "icon-tile",
342
+ className: chunkS5RVSXDV_cjs.cn(
343
+ "inline-flex size-11 shrink-0 items-center justify-center rounded-xl",
344
+ tone === "brand" ? "bg-white/10 text-white" : "bg-primary-100 text-primary-900 dark:bg-primary-900/60 dark:text-primary-200",
345
+ className
346
+ ),
347
+ children: /* @__PURE__ */ jsxRuntime.jsx(TemplateIcon, { name, icons })
348
+ }
349
+ );
350
+ }
351
+ var cellClass = "px-3 py-3 sm:px-5 sm:py-4";
352
+ var ComparisonSection = React__namespace.forwardRef(
353
+ ({
354
+ columns,
355
+ rows,
356
+ highlightColumn,
357
+ labels,
358
+ title,
359
+ tone = "default",
360
+ align = "center",
361
+ ...rest
362
+ }, ref) => {
363
+ const renderValue = (value) => typeof value === "string" ? value : value ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
364
+ /* @__PURE__ */ jsxRuntime.jsx(
365
+ lucideReact.Check,
366
+ {
367
+ "aria-hidden": "true",
368
+ className: "text-success mx-auto size-5",
369
+ strokeWidth: 2.5
370
+ }
371
+ ),
372
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: labels?.included ?? "Included" })
373
+ ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
374
+ /* @__PURE__ */ jsxRuntime.jsx(
375
+ lucideReact.X,
376
+ {
377
+ "aria-hidden": "true",
378
+ className: chunkS5RVSXDV_cjs.cn("mx-auto size-5", mutedTextClass(tone))
379
+ }
380
+ ),
381
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: labels?.notIncluded ?? "Not included" })
382
+ ] });
383
+ return /* @__PURE__ */ jsxRuntime.jsx(
384
+ SectionShell,
385
+ {
386
+ ref,
387
+ "data-slot": "comparison-section",
388
+ title,
389
+ tone,
390
+ align,
391
+ ...rest,
392
+ children: /* @__PURE__ */ jsxRuntime.jsx(
393
+ "div",
394
+ {
395
+ className: chunkS5RVSXDV_cjs.cn("mt-12 overflow-x-auto rounded-2xl", cardClass(tone)),
396
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
397
+ "table",
398
+ {
399
+ className: chunkS5RVSXDV_cjs.cn(
400
+ "w-full border-collapse text-start",
401
+ // Two value columns fit a phone; more scroll sideways.
402
+ columns.length > 2 && "min-w-[36rem]"
403
+ ),
404
+ children: [
405
+ title && /* @__PURE__ */ jsxRuntime.jsx("caption", { className: "sr-only", children: title }),
406
+ /* @__PURE__ */ jsxRuntime.jsx("thead", { children: /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
407
+ /* @__PURE__ */ jsxRuntime.jsx(
408
+ "th",
409
+ {
410
+ scope: "col",
411
+ className: chunkS5RVSXDV_cjs.cn(cellClass, "text-start text-sm font-semibold"),
412
+ children: labels?.feature ?? "Feature"
413
+ }
414
+ ),
415
+ columns.map((column, i) => /* @__PURE__ */ jsxRuntime.jsx(
416
+ "th",
417
+ {
418
+ scope: "col",
419
+ className: chunkS5RVSXDV_cjs.cn(
420
+ cellClass,
421
+ "text-center text-sm font-semibold",
422
+ i === highlightColumn && "bg-primary-800 text-white"
423
+ ),
424
+ children: column
425
+ },
426
+ column
427
+ ))
428
+ ] }) }),
429
+ /* @__PURE__ */ jsxRuntime.jsx("tbody", { children: rows.map((row) => /* @__PURE__ */ jsxRuntime.jsxs(
430
+ "tr",
431
+ {
432
+ className: chunkS5RVSXDV_cjs.cn(
433
+ "border-t",
434
+ tone === "brand" ? "border-white/15" : "border-border"
435
+ ),
436
+ children: [
437
+ /* @__PURE__ */ jsxRuntime.jsx(
438
+ "th",
439
+ {
440
+ scope: "row",
441
+ className: chunkS5RVSXDV_cjs.cn(cellClass, "text-start font-medium"),
442
+ children: row.feature
443
+ }
444
+ ),
445
+ columns.map((column, i) => /* @__PURE__ */ jsxRuntime.jsx(
446
+ "td",
447
+ {
448
+ className: chunkS5RVSXDV_cjs.cn(
449
+ cellClass,
450
+ "text-center text-sm",
451
+ i === highlightColumn && "bg-primary-500/10 font-semibold"
452
+ ),
453
+ children: renderValue(row.values[i] ?? "")
454
+ },
455
+ column
456
+ ))
457
+ ]
458
+ },
459
+ row.feature
460
+ )) })
461
+ ]
462
+ }
463
+ )
464
+ }
465
+ )
466
+ }
467
+ );
468
+ }
469
+ );
470
+ ComparisonSection.displayName = "ComparisonSection";
471
+ var CtaSection = React__namespace.forwardRef(
472
+ ({
473
+ eyebrow,
474
+ title,
475
+ description,
476
+ primaryCta,
477
+ secondaryCta,
478
+ note,
479
+ tone = "brand",
480
+ align = "center",
481
+ layout = "band",
482
+ components,
483
+ className,
484
+ ...rest
485
+ }, ref) => {
486
+ const titleId = React__namespace.useId();
487
+ const body = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
488
+ /* @__PURE__ */ jsxRuntime.jsx(
489
+ SectionHeading,
490
+ {
491
+ eyebrow,
492
+ title,
493
+ description,
494
+ align,
495
+ tone,
496
+ titleId
497
+ }
498
+ ),
499
+ /* @__PURE__ */ jsxRuntime.jsx(
500
+ CtaLinks,
501
+ {
502
+ primary: primaryCta,
503
+ secondary: secondaryCta,
504
+ tone,
505
+ align,
506
+ components,
507
+ className: "mt-8"
508
+ }
509
+ ),
510
+ note && /* @__PURE__ */ jsxRuntime.jsx(
511
+ "p",
512
+ {
513
+ className: chunkS5RVSXDV_cjs.cn(
514
+ "mt-4 text-sm",
515
+ mutedTextClass(tone),
516
+ align === "center" && "text-center"
517
+ ),
518
+ children: note
519
+ }
520
+ )
521
+ ] });
522
+ return /* @__PURE__ */ jsxRuntime.jsx(
523
+ "section",
524
+ {
525
+ ref,
526
+ "data-slot": "cta-section",
527
+ "data-tone": tone,
528
+ "aria-labelledby": titleId,
529
+ className: chunkS5RVSXDV_cjs.cn(
530
+ "py-16 sm:py-24",
531
+ layout === "band" ? toneClass(tone) : "bg-background",
532
+ className
533
+ ),
534
+ ...rest,
535
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: containerClass(), children: layout === "panel" ? /* @__PURE__ */ jsxRuntime.jsx(
536
+ "div",
537
+ {
538
+ className: chunkS5RVSXDV_cjs.cn(
539
+ "rounded-3xl px-6 py-12 sm:px-12 sm:py-16",
540
+ toneClass(tone),
541
+ tone !== "brand" && "border-border border"
542
+ ),
543
+ children: body
544
+ }
545
+ ) : body })
546
+ }
547
+ );
548
+ }
549
+ );
550
+ CtaSection.displayName = "CtaSection";
551
+ var FaqSection = React__namespace.forwardRef(
552
+ ({ items, tone = "default", align = "center", ...rest }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
553
+ SectionShell,
554
+ {
555
+ ref,
556
+ "data-slot": "faq-section",
557
+ tone,
558
+ align,
559
+ width: "narrow",
560
+ ...rest,
561
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-10 space-y-3", children: items.map((item) => /* @__PURE__ */ jsxRuntime.jsxs(
562
+ "details",
563
+ {
564
+ id: item.id,
565
+ className: chunkS5RVSXDV_cjs.cn("group rounded-xl", cardClass(tone)),
566
+ children: [
567
+ /* @__PURE__ */ jsxRuntime.jsxs(
568
+ "summary",
569
+ {
570
+ className: chunkS5RVSXDV_cjs.cn(
571
+ "flex cursor-pointer list-none items-center justify-between gap-4 rounded-xl px-5 py-4 text-start font-semibold",
572
+ "focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none",
573
+ "[&::-webkit-details-marker]:hidden"
574
+ ),
575
+ children: [
576
+ item.question,
577
+ /* @__PURE__ */ jsxRuntime.jsx(
578
+ lucideReact.ChevronDown,
579
+ {
580
+ "aria-hidden": "true",
581
+ className: "size-5 shrink-0 transition-transform group-open:rotate-180 motion-reduce:transition-none"
582
+ }
583
+ )
584
+ ]
585
+ }
586
+ ),
587
+ /* @__PURE__ */ jsxRuntime.jsx(
588
+ "div",
589
+ {
590
+ className: chunkS5RVSXDV_cjs.cn(
591
+ "px-5 pb-5 whitespace-pre-line",
592
+ mutedTextClass(tone)
593
+ ),
594
+ children: item.answer
595
+ }
596
+ )
597
+ ]
598
+ },
599
+ item.id ?? item.question
600
+ )) })
601
+ }
602
+ )
603
+ );
604
+ FaqSection.displayName = "FaqSection";
605
+ var columnClass = {
606
+ 2: "lg:grid-cols-2",
607
+ 3: "lg:grid-cols-3",
608
+ 4: "lg:grid-cols-4"
609
+ };
610
+ var FeatureGridSection = React__namespace.forwardRef(
611
+ ({
612
+ features,
613
+ columns = 3,
614
+ variant = "cards",
615
+ icons,
616
+ tone = "default",
617
+ align = "start",
618
+ components,
619
+ ...rest
620
+ }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
621
+ SectionShell,
622
+ {
623
+ ref,
624
+ "data-slot": "feature-grid-section",
625
+ tone,
626
+ align,
627
+ ...rest,
628
+ children: /* @__PURE__ */ jsxRuntime.jsx(
629
+ "ul",
630
+ {
631
+ className: chunkS5RVSXDV_cjs.cn("mt-12 grid gap-6 sm:grid-cols-2", columnClass[columns]),
632
+ children: features.map((feature) => /* @__PURE__ */ jsxRuntime.jsxs(
633
+ "li",
634
+ {
635
+ className: chunkS5RVSXDV_cjs.cn(
636
+ "flex flex-col gap-3",
637
+ variant === "cards" && chunkS5RVSXDV_cjs.cn("rounded-2xl p-6", cardClass(tone))
638
+ ),
639
+ children: [
640
+ feature.icon && /* @__PURE__ */ jsxRuntime.jsx(IconTile, { name: feature.icon, icons, tone }),
641
+ feature.tag && /* @__PURE__ */ jsxRuntime.jsx(
642
+ "p",
643
+ {
644
+ className: chunkS5RVSXDV_cjs.cn(
645
+ "text-xs font-semibold tracking-wider uppercase",
646
+ accentTextClass(tone)
647
+ ),
648
+ children: feature.tag
649
+ }
650
+ ),
651
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: chunkS5RVSXDV_cjs.cn("text-lg font-semibold", headingTextClass(tone)), children: feature.title }),
652
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: mutedTextClass(tone), children: feature.description }),
653
+ feature.link && /* @__PURE__ */ jsxRuntime.jsxs(
654
+ TemplateAnchor,
655
+ {
656
+ href: feature.link.href,
657
+ trackingId: feature.link.trackingId,
658
+ components,
659
+ className: chunkS5RVSXDV_cjs.cn(
660
+ "mt-auto inline-flex items-center gap-1 font-semibold hover:underline",
661
+ accentTextClass(tone)
662
+ ),
663
+ children: [
664
+ feature.link.label,
665
+ /* @__PURE__ */ jsxRuntime.jsx(
666
+ lucideReact.ArrowRight,
667
+ {
668
+ "aria-hidden": "true",
669
+ className: "size-4 rtl:-scale-x-100"
670
+ }
671
+ )
672
+ ]
673
+ }
674
+ )
675
+ ]
676
+ },
677
+ feature.title
678
+ ))
679
+ }
680
+ )
681
+ }
682
+ )
683
+ );
684
+ FeatureGridSection.displayName = "FeatureGridSection";
685
+ var HeroSection = React__namespace.forwardRef(
686
+ ({
687
+ eyebrow,
688
+ title,
689
+ description,
690
+ variant = "centered",
691
+ tone = "default",
692
+ primaryCta,
693
+ secondaryCta,
694
+ ctaNote,
695
+ highlights,
696
+ image,
697
+ breadcrumbs,
698
+ headingLevel = "h1",
699
+ labels,
700
+ components,
701
+ className,
702
+ ...rest
703
+ }, ref) => {
704
+ const titleId = React__namespace.useId();
705
+ const split = variant === "split" && !!image;
706
+ const align = split ? "start" : "center";
707
+ return /* @__PURE__ */ jsxRuntime.jsx(
708
+ "section",
709
+ {
710
+ ref,
711
+ "data-slot": "hero-section",
712
+ "data-tone": tone,
713
+ "aria-labelledby": titleId,
714
+ className: chunkS5RVSXDV_cjs.cn("py-16 sm:py-24 lg:py-28", toneClass(tone), className),
715
+ ...rest,
716
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
717
+ "div",
718
+ {
719
+ className: chunkS5RVSXDV_cjs.cn(
720
+ containerClass(),
721
+ split && "grid items-center gap-12 lg:grid-cols-2"
722
+ ),
723
+ children: [
724
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunkS5RVSXDV_cjs.cn(!split && "flex flex-col items-center"), children: [
725
+ breadcrumbs && breadcrumbs.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
726
+ "nav",
727
+ {
728
+ "aria-label": labels?.breadcrumb ?? "Breadcrumb",
729
+ className: "mb-6",
730
+ children: /* @__PURE__ */ jsxRuntime.jsx(
731
+ "ol",
732
+ {
733
+ className: chunkS5RVSXDV_cjs.cn(
734
+ "flex flex-wrap items-center gap-1 text-sm",
735
+ mutedTextClass(tone),
736
+ !split && "justify-center"
737
+ ),
738
+ children: breadcrumbs.map((crumb, i) => {
739
+ const last = i === breadcrumbs.length - 1;
740
+ return /* @__PURE__ */ jsxRuntime.jsx("li", { className: "flex items-center gap-1", children: last ? /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-current": "page", children: crumb.label }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
741
+ /* @__PURE__ */ jsxRuntime.jsx(
742
+ TemplateAnchor,
743
+ {
744
+ href: crumb.href,
745
+ trackingId: crumb.trackingId,
746
+ components,
747
+ className: "hover:underline focus-visible:underline",
748
+ children: crumb.label
749
+ }
750
+ ),
751
+ /* @__PURE__ */ jsxRuntime.jsx(
752
+ lucideReact.ChevronRight,
753
+ {
754
+ "aria-hidden": "true",
755
+ className: "size-4 rtl:-scale-x-100"
756
+ }
757
+ )
758
+ ] }) }, crumb.href);
759
+ })
760
+ }
761
+ )
762
+ }
763
+ ),
764
+ /* @__PURE__ */ jsxRuntime.jsx(
765
+ SectionHeading,
766
+ {
767
+ as: headingLevel,
768
+ size: "hero",
769
+ eyebrow,
770
+ title,
771
+ description,
772
+ align,
773
+ tone,
774
+ titleId
775
+ }
776
+ ),
777
+ /* @__PURE__ */ jsxRuntime.jsx(
778
+ CtaLinks,
779
+ {
780
+ primary: primaryCta,
781
+ secondary: secondaryCta,
782
+ tone,
783
+ align,
784
+ components,
785
+ className: "mt-8"
786
+ }
787
+ ),
788
+ ctaNote && /* @__PURE__ */ jsxRuntime.jsx("p", { className: chunkS5RVSXDV_cjs.cn("mt-4 text-sm", mutedTextClass(tone)), children: ctaNote }),
789
+ highlights && highlights.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
790
+ "ul",
791
+ {
792
+ className: chunkS5RVSXDV_cjs.cn(
793
+ "mt-8 flex flex-wrap gap-x-6 gap-y-2 text-sm font-medium",
794
+ !split && "justify-center"
795
+ ),
796
+ children: highlights.map((item) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-center gap-2", children: [
797
+ /* @__PURE__ */ jsxRuntime.jsx(
798
+ lucideReact.CircleCheck,
799
+ {
800
+ "aria-hidden": "true",
801
+ className: chunkS5RVSXDV_cjs.cn("size-4 shrink-0", accentTextClass(tone))
802
+ }
803
+ ),
804
+ item
805
+ ] }, item))
806
+ }
807
+ )
808
+ ] }),
809
+ image && /* @__PURE__ */ jsxRuntime.jsx(
810
+ TemplateImg,
811
+ {
812
+ ...image,
813
+ priority: true,
814
+ components,
815
+ className: chunkS5RVSXDV_cjs.cn(
816
+ "h-auto w-full rounded-2xl object-cover shadow-xl",
817
+ !split && "mx-auto mt-12 max-w-5xl"
818
+ )
819
+ }
820
+ )
821
+ ]
822
+ }
823
+ )
824
+ }
825
+ );
826
+ }
827
+ );
828
+ HeroSection.displayName = "HeroSection";
829
+ var defaultLeadFormFields = [
830
+ {
831
+ name: "firstName",
832
+ label: "First name",
833
+ required: true,
834
+ autoComplete: "given-name",
835
+ width: "half"
836
+ },
837
+ {
838
+ name: "lastName",
839
+ label: "Last name",
840
+ required: true,
841
+ autoComplete: "family-name",
842
+ width: "half"
843
+ },
844
+ {
845
+ name: "email",
846
+ label: "Work email",
847
+ type: "email",
848
+ required: true,
849
+ autoComplete: "email"
850
+ },
851
+ {
852
+ name: "company",
853
+ label: "Company",
854
+ required: true,
855
+ autoComplete: "organization"
856
+ }
857
+ ];
858
+ var controlClass = chunkS5RVSXDV_cjs.cn(
859
+ // Input's field styling (single source of truth for form controls); h-auto
860
+ // and py-2.5 because this one class also sizes <textarea> and <select>.
861
+ chunkZ5S5JEJD_cjs.inputVariants({ size: "md" }),
862
+ "block h-auto py-2.5"
863
+ );
864
+ var LeadFormSection = React__namespace.forwardRef(
865
+ ({
866
+ eyebrow,
867
+ title,
868
+ description,
869
+ action,
870
+ method = "post",
871
+ fields = defaultLeadFormFields,
872
+ hiddenFields,
873
+ submitLabel = "Submit",
874
+ note,
875
+ layout = "split",
876
+ tone = "muted",
877
+ submitTrackingId,
878
+ components,
879
+ className,
880
+ ...rest
881
+ }, ref) => {
882
+ const baseId = React__namespace.useId();
883
+ const titleId = `${baseId}-title`;
884
+ const split = layout === "split";
885
+ const resolvedAction = typeof action === "string" ? safeHref(action) : action;
886
+ if (resolvedAction == null) return null;
887
+ return /* @__PURE__ */ jsxRuntime.jsx(
888
+ "section",
889
+ {
890
+ ref,
891
+ "data-slot": "lead-form-section",
892
+ "data-tone": tone,
893
+ "aria-labelledby": titleId,
894
+ className: chunkS5RVSXDV_cjs.cn("py-16 sm:py-24", toneClass(tone), className),
895
+ ...rest,
896
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
897
+ "div",
898
+ {
899
+ className: chunkS5RVSXDV_cjs.cn(
900
+ containerClass(split ? "wide" : "narrow"),
901
+ split && "grid items-start gap-12 lg:grid-cols-2"
902
+ ),
903
+ children: [
904
+ /* @__PURE__ */ jsxRuntime.jsx(
905
+ SectionHeading,
906
+ {
907
+ eyebrow,
908
+ title,
909
+ description,
910
+ align: split ? "start" : "center",
911
+ tone,
912
+ titleId
913
+ }
914
+ ),
915
+ /* @__PURE__ */ jsxRuntime.jsxs(
916
+ "form",
917
+ {
918
+ action: resolvedAction,
919
+ method: typeof resolvedAction === "string" ? method : void 0,
920
+ "aria-labelledby": titleId,
921
+ className: chunkS5RVSXDV_cjs.cn(
922
+ "grid gap-5 rounded-2xl p-6 sm:grid-cols-2 sm:p-8",
923
+ // The form card always uses the theme surface so inputs stay legible on a brand band.
924
+ cardClass("default"),
925
+ !split && "mt-10"
926
+ ),
927
+ children: [
928
+ hiddenFields && Object.entries(hiddenFields).map(([name, value]) => /* @__PURE__ */ jsxRuntime.jsx("input", { type: "hidden", name, value }, name)),
929
+ fields.map((field) => {
930
+ const id = `${baseId}-${field.name}`;
931
+ const common = {
932
+ id,
933
+ name: field.name,
934
+ required: field.required,
935
+ autoComplete: field.autoComplete,
936
+ className: controlClass
937
+ };
938
+ return /* @__PURE__ */ jsxRuntime.jsxs(
939
+ "div",
940
+ {
941
+ className: chunkS5RVSXDV_cjs.cn(field.width !== "half" && "sm:col-span-2"),
942
+ children: [
943
+ /* @__PURE__ */ jsxRuntime.jsxs(
944
+ "label",
945
+ {
946
+ htmlFor: id,
947
+ className: "mb-1.5 block text-sm font-medium",
948
+ children: [
949
+ field.label,
950
+ field.required && /* @__PURE__ */ jsxRuntime.jsx(chunkZ5S5JEJD_cjs.RequiredMark, {})
951
+ ]
952
+ }
953
+ ),
954
+ field.type === "textarea" ? /* @__PURE__ */ jsxRuntime.jsx(
955
+ "textarea",
956
+ {
957
+ ...common,
958
+ rows: 4,
959
+ placeholder: field.placeholder
960
+ }
961
+ ) : field.type === "select" ? /* @__PURE__ */ jsxRuntime.jsxs("select", { ...common, defaultValue: "", children: [
962
+ /* @__PURE__ */ jsxRuntime.jsx("option", { value: "", disabled: true, children: field.placeholder ?? "" }),
963
+ field.options?.map((option) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: option, children: option }, option))
964
+ ] }) : /* @__PURE__ */ jsxRuntime.jsx(
965
+ "input",
966
+ {
967
+ ...common,
968
+ type: field.type ?? "text",
969
+ placeholder: field.placeholder
970
+ }
971
+ )
972
+ ]
973
+ },
974
+ field.name
975
+ );
976
+ }),
977
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "sm:col-span-2", children: [
978
+ /* @__PURE__ */ jsxRuntime.jsx(
979
+ "button",
980
+ {
981
+ type: "submit",
982
+ "data-track": submitTrackingId,
983
+ className: chunkS5RVSXDV_cjs.cn(
984
+ chunkDXEPYK3I_cjs.buttonVariants({
985
+ variant: "primary",
986
+ size: "lg",
987
+ fullWidth: true
988
+ }),
989
+ "h-auto min-h-12 py-3 whitespace-normal"
990
+ ),
991
+ children: submitLabel
992
+ }
993
+ ),
994
+ note && /* @__PURE__ */ jsxRuntime.jsx("p", { className: chunkS5RVSXDV_cjs.cn("mt-3 text-xs", mutedTextClass("default")), children: note })
995
+ ] })
996
+ ]
997
+ }
998
+ )
999
+ ]
1000
+ }
1001
+ )
1002
+ }
1003
+ );
1004
+ }
1005
+ );
1006
+ LeadFormSection.displayName = "LeadFormSection";
1007
+ var duration = { slow: "60s", normal: "40s", fast: "25s" };
1008
+ function Logo({
1009
+ logo,
1010
+ tone,
1011
+ hidden,
1012
+ components
1013
+ }) {
1014
+ const mark = logo.src ? /* @__PURE__ */ jsxRuntime.jsx(
1015
+ "img",
1016
+ {
1017
+ src: logo.src,
1018
+ alt: hidden ? "" : logo.name,
1019
+ loading: "lazy",
1020
+ decoding: "async",
1021
+ className: chunkS5RVSXDV_cjs.cn(
1022
+ "h-8 w-auto max-w-[9rem] object-contain opacity-70 grayscale transition hover:opacity-100 hover:grayscale-0",
1023
+ // Logos are drawn white on dark surfaces so dark wordmarks stay visible.
1024
+ tone === "brand" ? "brightness-0 invert" : "dark:brightness-0 dark:invert"
1025
+ )
1026
+ }
1027
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
1028
+ "span",
1029
+ {
1030
+ className: chunkS5RVSXDV_cjs.cn(
1031
+ "text-lg font-semibold whitespace-nowrap",
1032
+ mutedTextClass(tone ?? "default")
1033
+ ),
1034
+ children: logo.name
1035
+ }
1036
+ );
1037
+ return logo.href ? /* @__PURE__ */ jsxRuntime.jsx(
1038
+ TemplateAnchor,
1039
+ {
1040
+ href: logo.href,
1041
+ trackingId: logo.trackingId,
1042
+ components,
1043
+ tabIndex: hidden ? -1 : void 0,
1044
+ className: "focus-visible:ring-ring inline-flex rounded focus-visible:ring-2 focus-visible:outline-none",
1045
+ children: mark
1046
+ }
1047
+ ) : mark;
1048
+ }
1049
+ var LogoCloudSection = React__namespace.forwardRef(
1050
+ ({
1051
+ logos,
1052
+ variant = "grid",
1053
+ speed = "normal",
1054
+ tone = "default",
1055
+ align = "center",
1056
+ components,
1057
+ ...rest
1058
+ }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1059
+ SectionShell,
1060
+ {
1061
+ ref,
1062
+ "data-slot": "logo-cloud-section",
1063
+ tone,
1064
+ align,
1065
+ spacing: "compact",
1066
+ ...rest,
1067
+ children: variant === "marquee" ? /* @__PURE__ */ jsxRuntime.jsx(
1068
+ "div",
1069
+ {
1070
+ className: "mie-marquee-host mt-8 overflow-hidden [mask-image:linear-gradient(90deg,transparent,black_10%,black_90%,transparent)]",
1071
+ style: { "--mie-marquee-duration": duration[speed] },
1072
+ children: /* @__PURE__ */ jsxRuntime.jsxs("ul", { className: "mie-marquee flex w-max items-center", children: [
1073
+ logos.map((logo) => /* @__PURE__ */ jsxRuntime.jsx("li", { className: "shrink-0 pe-12", children: /* @__PURE__ */ jsxRuntime.jsx(Logo, { logo, tone, components }) }, logo.name)),
1074
+ logos.map((logo) => /* @__PURE__ */ jsxRuntime.jsx(
1075
+ "li",
1076
+ {
1077
+ "data-duplicate": "",
1078
+ "aria-hidden": "true",
1079
+ className: "shrink-0 pe-12",
1080
+ children: /* @__PURE__ */ jsxRuntime.jsx(Logo, { logo, tone, components, hidden: true })
1081
+ },
1082
+ `${logo.name}-copy`
1083
+ ))
1084
+ ] })
1085
+ }
1086
+ ) : /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "mt-8 flex flex-wrap items-center justify-center gap-x-12 gap-y-8", children: logos.map((logo) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(Logo, { logo, tone, components }) }, logo.name)) })
1087
+ }
1088
+ )
1089
+ );
1090
+ LogoCloudSection.displayName = "LogoCloudSection";
1091
+ var columnClass2 = [
1092
+ "",
1093
+ "lg:grid-cols-1",
1094
+ "lg:grid-cols-2",
1095
+ "lg:grid-cols-3",
1096
+ "lg:grid-cols-4"
1097
+ ];
1098
+ var PricingSection = React__namespace.forwardRef(
1099
+ ({ plans, note, tone = "default", align = "center", components, ...rest }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
1100
+ SectionShell,
1101
+ {
1102
+ ref,
1103
+ "data-slot": "pricing-section",
1104
+ tone,
1105
+ align,
1106
+ ...rest,
1107
+ children: [
1108
+ /* @__PURE__ */ jsxRuntime.jsx(
1109
+ "ul",
1110
+ {
1111
+ className: chunkS5RVSXDV_cjs.cn(
1112
+ "mt-12 grid items-stretch gap-6 md:grid-cols-2",
1113
+ columnClass2[Math.min(plans.length, 4)],
1114
+ plans.length === 1 && "mx-auto max-w-md"
1115
+ ),
1116
+ children: plans.map((plan) => /* @__PURE__ */ jsxRuntime.jsxs(
1117
+ "li",
1118
+ {
1119
+ className: chunkS5RVSXDV_cjs.cn(
1120
+ "relative flex flex-col rounded-2xl p-6 sm:p-8",
1121
+ cardClass(tone),
1122
+ plan.highlighted && "ring-primary-600 dark:ring-primary-400 ring-2"
1123
+ ),
1124
+ children: [
1125
+ plan.highlighted && plan.badge && /* @__PURE__ */ jsxRuntime.jsx(chunkYVL3XATO_cjs.Badge, { className: "bg-primary-800 dark:bg-primary-800 absolute start-6 -top-3 px-3 py-1 text-xs font-semibold text-white dark:text-white", children: plan.badge }),
1126
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: chunkS5RVSXDV_cjs.cn("text-lg font-semibold", headingTextClass(tone)), children: plan.name }),
1127
+ plan.description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: chunkS5RVSXDV_cjs.cn("mt-2 text-sm", mutedTextClass(tone)), children: plan.description }),
1128
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "mt-6 flex flex-wrap items-baseline gap-x-2", children: [
1129
+ /* @__PURE__ */ jsxRuntime.jsx(
1130
+ "span",
1131
+ {
1132
+ className: chunkS5RVSXDV_cjs.cn(
1133
+ "text-4xl font-bold tracking-tight",
1134
+ headingTextClass(tone)
1135
+ ),
1136
+ children: plan.price
1137
+ }
1138
+ ),
1139
+ plan.period && /* @__PURE__ */ jsxRuntime.jsx("span", { className: chunkS5RVSXDV_cjs.cn("text-sm", mutedTextClass(tone)), children: plan.period })
1140
+ ] }),
1141
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "mt-6 flex-1 space-y-3 text-sm", children: plan.features.map((feature) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex gap-3", children: [
1142
+ /* @__PURE__ */ jsxRuntime.jsx(
1143
+ lucideReact.Check,
1144
+ {
1145
+ "aria-hidden": "true",
1146
+ className: chunkS5RVSXDV_cjs.cn(
1147
+ "mt-0.5 size-4 shrink-0",
1148
+ accentTextClass(tone)
1149
+ )
1150
+ }
1151
+ ),
1152
+ feature
1153
+ ] }, feature)) }),
1154
+ plan.cta && /* @__PURE__ */ jsxRuntime.jsx(
1155
+ TemplateAnchor,
1156
+ {
1157
+ href: plan.cta.href,
1158
+ trackingId: plan.cta.trackingId,
1159
+ components,
1160
+ className: chunkS5RVSXDV_cjs.cn(
1161
+ chunkDXEPYK3I_cjs.buttonVariants({
1162
+ variant: plan.highlighted ? "primary" : "outline",
1163
+ size: "lg",
1164
+ fullWidth: true
1165
+ }),
1166
+ "mt-8 h-auto min-h-12 py-3 whitespace-normal",
1167
+ tone === "brand" && (plan.highlighted ? "text-primary-900 hover:bg-primary-50 bg-white" : "border-white/70 text-white hover:bg-white/10 hover:text-white dark:border-white/70 dark:text-white")
1168
+ ),
1169
+ children: plan.cta.label
1170
+ }
1171
+ )
1172
+ ]
1173
+ },
1174
+ plan.name
1175
+ ))
1176
+ }
1177
+ ),
1178
+ note && /* @__PURE__ */ jsxRuntime.jsx(
1179
+ "p",
1180
+ {
1181
+ className: chunkS5RVSXDV_cjs.cn(
1182
+ "mt-8 text-sm",
1183
+ mutedTextClass(tone),
1184
+ align === "center" && "text-center"
1185
+ ),
1186
+ children: note
1187
+ }
1188
+ )
1189
+ ]
1190
+ }
1191
+ )
1192
+ );
1193
+ PricingSection.displayName = "PricingSection";
1194
+ var columnClass3 = [
1195
+ "",
1196
+ "",
1197
+ "lg:grid-cols-2",
1198
+ "lg:grid-cols-3",
1199
+ "lg:grid-cols-4"
1200
+ ];
1201
+ var connectorInset = [
1202
+ "",
1203
+ "",
1204
+ "inset-x-[25%]",
1205
+ "inset-x-[16.667%]",
1206
+ "inset-x-[12.5%]"
1207
+ ];
1208
+ var ProcessStepsSection = React__namespace.forwardRef(({ steps, icons, tone = "default", align = "center", ...rest }, ref) => {
1209
+ const columns = Math.min(steps.length, 4);
1210
+ return /* @__PURE__ */ jsxRuntime.jsx(
1211
+ SectionShell,
1212
+ {
1213
+ ref,
1214
+ "data-slot": "process-steps-section",
1215
+ tone,
1216
+ align,
1217
+ ...rest,
1218
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative mt-12", children: [
1219
+ steps.length > 1 && steps.length <= 4 && /* @__PURE__ */ jsxRuntime.jsx(
1220
+ "div",
1221
+ {
1222
+ "aria-hidden": "true",
1223
+ className: chunkS5RVSXDV_cjs.cn(
1224
+ "absolute top-6 hidden h-px lg:block",
1225
+ connectorInset[columns],
1226
+ tone === "brand" ? "bg-white/25" : "bg-border"
1227
+ )
1228
+ }
1229
+ ),
1230
+ /* @__PURE__ */ jsxRuntime.jsx("ol", { className: chunkS5RVSXDV_cjs.cn("relative grid gap-10", columnClass3[columns]), children: steps.map((step, i) => /* @__PURE__ */ jsxRuntime.jsxs(
1231
+ "li",
1232
+ {
1233
+ className: "flex flex-col items-center text-center",
1234
+ children: [
1235
+ /* @__PURE__ */ jsxRuntime.jsx(
1236
+ "span",
1237
+ {
1238
+ "aria-hidden": "true",
1239
+ className: chunkS5RVSXDV_cjs.cn(
1240
+ "flex size-12 items-center justify-center rounded-full text-lg font-bold",
1241
+ tone === "brand" ? "text-primary-900 bg-white" : "bg-primary-800 text-white"
1242
+ ),
1243
+ children: step.icon ? /* @__PURE__ */ jsxRuntime.jsx(TemplateIcon, { name: step.icon, icons }) : i + 1
1244
+ }
1245
+ ),
1246
+ /* @__PURE__ */ jsxRuntime.jsx(
1247
+ "h3",
1248
+ {
1249
+ className: chunkS5RVSXDV_cjs.cn(
1250
+ "mt-5 text-lg font-semibold",
1251
+ headingTextClass(tone)
1252
+ ),
1253
+ children: step.title
1254
+ }
1255
+ ),
1256
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: chunkS5RVSXDV_cjs.cn("mt-2 max-w-xs", mutedTextClass(tone)), children: step.description })
1257
+ ]
1258
+ },
1259
+ step.title
1260
+ )) })
1261
+ ] })
1262
+ }
1263
+ );
1264
+ });
1265
+ ProcessStepsSection.displayName = "ProcessStepsSection";
1266
+ var columnClass4 = {
1267
+ 2: "lg:grid-cols-2",
1268
+ 3: "lg:grid-cols-3",
1269
+ 4: "lg:grid-cols-4"
1270
+ };
1271
+ var ResourceCardsSection = React__namespace.forwardRef(
1272
+ ({
1273
+ items,
1274
+ columns = 3,
1275
+ viewAll,
1276
+ tone = "default",
1277
+ align = "start",
1278
+ components,
1279
+ ...rest
1280
+ }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
1281
+ SectionShell,
1282
+ {
1283
+ ref,
1284
+ "data-slot": "resource-cards-section",
1285
+ tone,
1286
+ align,
1287
+ ...rest,
1288
+ children: [
1289
+ /* @__PURE__ */ jsxRuntime.jsx(
1290
+ "ul",
1291
+ {
1292
+ className: chunkS5RVSXDV_cjs.cn("mt-12 grid gap-6 sm:grid-cols-2", columnClass4[columns]),
1293
+ children: items.map((item) => /* @__PURE__ */ jsxRuntime.jsxs(
1294
+ "li",
1295
+ {
1296
+ className: chunkS5RVSXDV_cjs.cn(
1297
+ "group relative flex flex-col overflow-hidden rounded-2xl",
1298
+ "focus-within:ring-ring focus-within:ring-2",
1299
+ cardClass(tone)
1300
+ ),
1301
+ children: [
1302
+ item.image && /* @__PURE__ */ jsxRuntime.jsx(
1303
+ TemplateImg,
1304
+ {
1305
+ ...item.image,
1306
+ components,
1307
+ className: "aspect-video w-full object-cover"
1308
+ }
1309
+ ),
1310
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-1 flex-col gap-2 p-6", children: [
1311
+ item.kind && /* @__PURE__ */ jsxRuntime.jsx(
1312
+ "p",
1313
+ {
1314
+ className: chunkS5RVSXDV_cjs.cn(
1315
+ "text-xs font-semibold tracking-wider uppercase",
1316
+ accentTextClass(tone)
1317
+ ),
1318
+ children: item.kind
1319
+ }
1320
+ ),
1321
+ /* @__PURE__ */ jsxRuntime.jsx(
1322
+ "h3",
1323
+ {
1324
+ className: chunkS5RVSXDV_cjs.cn("text-lg font-semibold", headingTextClass(tone)),
1325
+ children: /* @__PURE__ */ jsxRuntime.jsx(
1326
+ TemplateAnchor,
1327
+ {
1328
+ href: item.href,
1329
+ trackingId: item.trackingId,
1330
+ components,
1331
+ className: "group-hover:underline after:absolute after:inset-0 focus-visible:outline-none",
1332
+ children: item.title
1333
+ }
1334
+ )
1335
+ }
1336
+ ),
1337
+ item.excerpt && /* @__PURE__ */ jsxRuntime.jsx("p", { className: chunkS5RVSXDV_cjs.cn("line-clamp-3", mutedTextClass(tone)), children: item.excerpt }),
1338
+ item.meta && /* @__PURE__ */ jsxRuntime.jsx("p", { className: chunkS5RVSXDV_cjs.cn("mt-auto pt-2 text-sm", mutedTextClass(tone)), children: item.meta })
1339
+ ] })
1340
+ ]
1341
+ },
1342
+ item.href
1343
+ ))
1344
+ }
1345
+ ),
1346
+ viewAll && /* @__PURE__ */ jsxRuntime.jsx("p", { className: chunkS5RVSXDV_cjs.cn("mt-10", align === "center" && "text-center"), children: /* @__PURE__ */ jsxRuntime.jsxs(
1347
+ TemplateAnchor,
1348
+ {
1349
+ href: viewAll.href,
1350
+ trackingId: viewAll.trackingId,
1351
+ components,
1352
+ className: chunkS5RVSXDV_cjs.cn(
1353
+ "inline-flex items-center gap-1 font-semibold hover:underline",
1354
+ accentTextClass(tone)
1355
+ ),
1356
+ children: [
1357
+ viewAll.label,
1358
+ /* @__PURE__ */ jsxRuntime.jsx(
1359
+ lucideReact.ArrowRight,
1360
+ {
1361
+ "aria-hidden": "true",
1362
+ className: "size-4 rtl:-scale-x-100"
1363
+ }
1364
+ )
1365
+ ]
1366
+ }
1367
+ ) })
1368
+ ]
1369
+ }
1370
+ )
1371
+ );
1372
+ ResourceCardsSection.displayName = "ResourceCardsSection";
1373
+ var SplitContentSection = React__namespace.forwardRef(
1374
+ ({
1375
+ eyebrow,
1376
+ title,
1377
+ description,
1378
+ image,
1379
+ caption,
1380
+ bullets,
1381
+ primaryCta,
1382
+ secondaryCta,
1383
+ mediaPosition = "end",
1384
+ tone = "default",
1385
+ components,
1386
+ className,
1387
+ ...rest
1388
+ }, ref) => {
1389
+ const titleId = React__namespace.useId();
1390
+ return /* @__PURE__ */ jsxRuntime.jsx(
1391
+ "section",
1392
+ {
1393
+ ref,
1394
+ "data-slot": "split-content-section",
1395
+ "data-tone": tone,
1396
+ "aria-labelledby": titleId,
1397
+ className: chunkS5RVSXDV_cjs.cn("py-16 sm:py-24", toneClass(tone), className),
1398
+ ...rest,
1399
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
1400
+ "div",
1401
+ {
1402
+ className: chunkS5RVSXDV_cjs.cn(
1403
+ containerClass(),
1404
+ "grid items-center gap-12 lg:grid-cols-2"
1405
+ ),
1406
+ children: [
1407
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
1408
+ /* @__PURE__ */ jsxRuntime.jsx(
1409
+ SectionHeading,
1410
+ {
1411
+ eyebrow,
1412
+ title,
1413
+ description,
1414
+ tone,
1415
+ titleId
1416
+ }
1417
+ ),
1418
+ bullets && bullets.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "mt-6 space-y-3", children: bullets.map((item) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex gap-3", children: [
1419
+ /* @__PURE__ */ jsxRuntime.jsx(
1420
+ lucideReact.CircleCheck,
1421
+ {
1422
+ "aria-hidden": "true",
1423
+ className: chunkS5RVSXDV_cjs.cn(
1424
+ "mt-0.5 size-5 shrink-0",
1425
+ accentTextClass(tone)
1426
+ )
1427
+ }
1428
+ ),
1429
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: mutedTextClass(tone), children: item })
1430
+ ] }, item)) }),
1431
+ /* @__PURE__ */ jsxRuntime.jsx(
1432
+ CtaLinks,
1433
+ {
1434
+ primary: primaryCta,
1435
+ secondary: secondaryCta,
1436
+ tone,
1437
+ components,
1438
+ className: "mt-8"
1439
+ }
1440
+ )
1441
+ ] }),
1442
+ /* @__PURE__ */ jsxRuntime.jsxs("figure", { className: chunkS5RVSXDV_cjs.cn(mediaPosition === "start" && "lg:order-first"), children: [
1443
+ /* @__PURE__ */ jsxRuntime.jsx(
1444
+ TemplateImg,
1445
+ {
1446
+ ...image,
1447
+ components,
1448
+ className: "h-auto w-full rounded-2xl object-cover shadow-lg"
1449
+ }
1450
+ ),
1451
+ caption && /* @__PURE__ */ jsxRuntime.jsx("figcaption", { className: chunkS5RVSXDV_cjs.cn("mt-3 text-sm", mutedTextClass(tone)), children: caption })
1452
+ ] })
1453
+ ]
1454
+ }
1455
+ )
1456
+ }
1457
+ );
1458
+ }
1459
+ );
1460
+ SplitContentSection.displayName = "SplitContentSection";
1461
+ var columnClass5 = [
1462
+ "",
1463
+ "",
1464
+ "lg:grid-cols-2",
1465
+ "lg:grid-cols-3",
1466
+ "lg:grid-cols-4"
1467
+ ];
1468
+ var StatsSection = React__namespace.forwardRef(
1469
+ ({
1470
+ stats,
1471
+ variant = "plain",
1472
+ locale,
1473
+ tone = "default",
1474
+ align = "center",
1475
+ ...rest
1476
+ }, ref) => {
1477
+ const format = new Intl.NumberFormat(locale);
1478
+ return /* @__PURE__ */ jsxRuntime.jsx(
1479
+ SectionShell,
1480
+ {
1481
+ ref,
1482
+ "data-slot": "stats-section",
1483
+ tone,
1484
+ align,
1485
+ ...rest,
1486
+ children: /* @__PURE__ */ jsxRuntime.jsx(
1487
+ "dl",
1488
+ {
1489
+ className: chunkS5RVSXDV_cjs.cn(
1490
+ "mt-12 grid gap-6 sm:grid-cols-2",
1491
+ columnClass5[Math.min(stats.length, 4)]
1492
+ ),
1493
+ children: stats.map((stat) => {
1494
+ const Trend = stat.trend === "down" ? lucideReact.TrendingDown : lucideReact.TrendingUp;
1495
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1496
+ "div",
1497
+ {
1498
+ className: chunkS5RVSXDV_cjs.cn(
1499
+ "flex flex-col-reverse gap-2",
1500
+ align === "center" && "items-center text-center",
1501
+ variant === "cards" && chunkS5RVSXDV_cjs.cn("rounded-2xl p-6", cardClass(tone))
1502
+ ),
1503
+ children: [
1504
+ /* @__PURE__ */ jsxRuntime.jsxs("dt", { children: [
1505
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-semibold", children: stat.label }),
1506
+ stat.description && /* @__PURE__ */ jsxRuntime.jsx(
1507
+ "span",
1508
+ {
1509
+ className: chunkS5RVSXDV_cjs.cn("mt-1 block text-sm", mutedTextClass(tone)),
1510
+ children: stat.description
1511
+ }
1512
+ )
1513
+ ] }),
1514
+ /* @__PURE__ */ jsxRuntime.jsxs(
1515
+ "dd",
1516
+ {
1517
+ className: chunkS5RVSXDV_cjs.cn(
1518
+ "flex items-center gap-2 text-4xl font-bold tracking-tight tabular-nums sm:text-5xl",
1519
+ tone === "brand" ? "text-white" : "text-primary-800 dark:text-primary-300"
1520
+ ),
1521
+ children: [
1522
+ stat.trend && /* @__PURE__ */ jsxRuntime.jsx(Trend, { "aria-hidden": "true", className: "size-7 shrink-0" }),
1523
+ stat.prefix,
1524
+ typeof stat.value === "number" ? format.format(stat.value) : stat.value,
1525
+ stat.suffix
1526
+ ]
1527
+ }
1528
+ )
1529
+ ]
1530
+ },
1531
+ stat.label
1532
+ );
1533
+ })
1534
+ }
1535
+ )
1536
+ }
1537
+ );
1538
+ }
1539
+ );
1540
+ StatsSection.displayName = "StatsSection";
1541
+ var TestimonialSection = React__namespace.forwardRef(
1542
+ ({
1543
+ testimonials,
1544
+ variant = "cards",
1545
+ labels,
1546
+ tone = "default",
1547
+ align = "center",
1548
+ components,
1549
+ ...rest
1550
+ }, ref) => {
1551
+ const featured = variant === "featured";
1552
+ const items = featured ? testimonials.slice(0, 1) : testimonials;
1553
+ return /* @__PURE__ */ jsxRuntime.jsx(
1554
+ SectionShell,
1555
+ {
1556
+ ref,
1557
+ "data-slot": "testimonial-section",
1558
+ tone,
1559
+ align,
1560
+ width: featured ? "narrow" : "wide",
1561
+ ...rest,
1562
+ children: /* @__PURE__ */ jsxRuntime.jsx(
1563
+ "ul",
1564
+ {
1565
+ className: chunkS5RVSXDV_cjs.cn(
1566
+ "mt-12 grid gap-6",
1567
+ !featured && "md:grid-cols-2 lg:grid-cols-3"
1568
+ ),
1569
+ children: items.map(({ rating, ...t }) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsxs(
1570
+ "figure",
1571
+ {
1572
+ className: chunkS5RVSXDV_cjs.cn(
1573
+ "flex h-full flex-col gap-6",
1574
+ featured ? "items-center text-center" : chunkS5RVSXDV_cjs.cn("rounded-2xl p-6", cardClass(tone))
1575
+ ),
1576
+ children: [
1577
+ rating && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-warning flex gap-0.5", children: [
1578
+ Array.from({ length: 5 }, (_, i) => /* @__PURE__ */ jsxRuntime.jsx(
1579
+ lucideReact.Star,
1580
+ {
1581
+ "aria-hidden": "true",
1582
+ className: chunkS5RVSXDV_cjs.cn(
1583
+ "size-4",
1584
+ i < rating ? "fill-current" : "opacity-30"
1585
+ )
1586
+ },
1587
+ i
1588
+ )),
1589
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: (labels?.rating ?? "Rated {rating} out of 5").replace(
1590
+ "{rating}",
1591
+ String(rating)
1592
+ ) })
1593
+ ] }),
1594
+ /* @__PURE__ */ jsxRuntime.jsx(
1595
+ "blockquote",
1596
+ {
1597
+ className: chunkS5RVSXDV_cjs.cn(
1598
+ "text-pretty",
1599
+ featured ? chunkS5RVSXDV_cjs.cn(
1600
+ "text-2xl font-medium sm:text-3xl",
1601
+ headingTextClass(tone)
1602
+ ) : "text-base"
1603
+ ),
1604
+ children: /* @__PURE__ */ jsxRuntime.jsx("p", { children: t.quote })
1605
+ }
1606
+ ),
1607
+ /* @__PURE__ */ jsxRuntime.jsxs("figcaption", { className: "mt-auto flex items-center gap-3", children: [
1608
+ t.avatar && /* @__PURE__ */ jsxRuntime.jsx(
1609
+ TemplateImg,
1610
+ {
1611
+ src: t.avatar,
1612
+ alt: "",
1613
+ width: 44,
1614
+ height: 44,
1615
+ components,
1616
+ className: "size-11 rounded-full object-cover"
1617
+ }
1618
+ ),
1619
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: chunkS5RVSXDV_cjs.cn(!featured && "text-start"), children: [
1620
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block font-semibold", children: t.author }),
1621
+ (t.role || t.company) && /* @__PURE__ */ jsxRuntime.jsx(
1622
+ "span",
1623
+ {
1624
+ className: chunkS5RVSXDV_cjs.cn("block text-sm", mutedTextClass(tone)),
1625
+ children: [t.role, t.company].filter(Boolean).join(", ")
1626
+ }
1627
+ )
1628
+ ] })
1629
+ ] })
1630
+ ]
1631
+ }
1632
+ ) }, `${t.author}-${t.quote.slice(0, 24)}`))
1633
+ }
1634
+ )
1635
+ }
1636
+ );
1637
+ }
1638
+ );
1639
+ TestimonialSection.displayName = "TestimonialSection";
1640
+ var VideoSection = React__namespace.forwardRef(
1641
+ ({ video, caption, tone = "default", align = "center", ...rest }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1642
+ SectionShell,
1643
+ {
1644
+ ref,
1645
+ "data-slot": "video-section",
1646
+ tone,
1647
+ align,
1648
+ ...rest,
1649
+ children: /* @__PURE__ */ jsxRuntime.jsxs("figure", { className: "mx-auto mt-12 max-w-5xl", children: [
1650
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "aspect-video overflow-hidden rounded-2xl bg-neutral-900 shadow-xl", children: "youtubeId" in video ? /* @__PURE__ */ jsxRuntime.jsx(
1651
+ "iframe",
1652
+ {
1653
+ src: `https://www.youtube-nocookie.com/embed/${encodeURIComponent(video.youtubeId)}`,
1654
+ title: video.title,
1655
+ loading: "lazy",
1656
+ allow: "accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",
1657
+ allowFullScreen: true,
1658
+ referrerPolicy: "strict-origin-when-cross-origin",
1659
+ className: "size-full border-0"
1660
+ }
1661
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
1662
+ "video",
1663
+ {
1664
+ src: video.src,
1665
+ poster: video.poster,
1666
+ title: video.title,
1667
+ "aria-label": video.title,
1668
+ controls: true,
1669
+ preload: "none",
1670
+ className: "size-full object-cover",
1671
+ children: /* @__PURE__ */ jsxRuntime.jsx(
1672
+ "track",
1673
+ {
1674
+ kind: "captions",
1675
+ src: video.captions.src,
1676
+ srcLang: video.captions.srcLang,
1677
+ label: video.captions.label,
1678
+ default: true
1679
+ }
1680
+ )
1681
+ }
1682
+ ) }),
1683
+ caption && /* @__PURE__ */ jsxRuntime.jsx(
1684
+ "figcaption",
1685
+ {
1686
+ className: chunkS5RVSXDV_cjs.cn(
1687
+ "mt-3 text-sm",
1688
+ mutedTextClass(tone),
1689
+ align === "center" && "text-center"
1690
+ ),
1691
+ children: caption
1692
+ }
1693
+ )
1694
+ ] })
1695
+ }
1696
+ )
1697
+ );
1698
+ VideoSection.displayName = "VideoSection";
1699
+ var sections = {
1700
+ hero: HeroSection,
1701
+ logos: LogoCloudSection,
1702
+ features: FeatureGridSection,
1703
+ split: SplitContentSection,
1704
+ process: ProcessStepsSection,
1705
+ stats: StatsSection,
1706
+ comparison: ComparisonSection,
1707
+ pricing: PricingSection,
1708
+ video: VideoSection,
1709
+ testimonials: TestimonialSection,
1710
+ resources: ResourceCardsSection,
1711
+ faq: FaqSection,
1712
+ "lead-form": LeadFormSection,
1713
+ cta: CtaSection
1714
+ };
1715
+ var landingBlockTypes = [
1716
+ ...Object.keys(sections),
1717
+ "custom"
1718
+ ];
1719
+ var takesIcons = /* @__PURE__ */ new Set(["features", "process"]);
1720
+ var LandingPage = React__namespace.forwardRef(
1721
+ ({ blocks, icons, components, custom, actions, ...rest }, ref) => /* @__PURE__ */ jsxRuntime.jsx("div", { ref, "data-slot": "landing-page", ...rest, children: blocks.map((block, i) => {
1722
+ const key = block.id ?? `${block.type}-${i}`;
1723
+ if (block.type === "custom") {
1724
+ const Custom = ownProperty(custom, block.component);
1725
+ return Custom ? /* @__PURE__ */ jsxRuntime.jsx(Custom, { id: block.id, ...block.props }, key) : null;
1726
+ }
1727
+ const { type, ...props } = block;
1728
+ const Section = ownProperty(
1729
+ sections,
1730
+ type
1731
+ );
1732
+ if (!Section) return null;
1733
+ const action = block.type === "lead-form" ? ownProperty(actions, block.action) ?? safeHref(block.action) : void 0;
1734
+ if (block.type === "lead-form" && action == null) return null;
1735
+ const data = { ...props };
1736
+ delete data.children;
1737
+ delete data.dangerouslySetInnerHTML;
1738
+ return /* @__PURE__ */ jsxRuntime.jsx(
1739
+ Section,
1740
+ {
1741
+ ...data,
1742
+ components,
1743
+ ...takesIcons.has(type) ? { icons } : {},
1744
+ ...block.type === "lead-form" ? { action } : {}
1745
+ },
1746
+ key
1747
+ );
1748
+ }) })
1749
+ );
1750
+ LandingPage.displayName = "LandingPage";
1751
+
1752
+ // src/components/LandingPage/presets.ts
1753
+ var landingPresets = {
1754
+ "vertical-hub": {
1755
+ label: "Industry / vertical hub",
1756
+ description: "One page per industry served: the sector problem, what the product does for it, proof, and a way in.",
1757
+ sequence: [
1758
+ "hero",
1759
+ "logos",
1760
+ "features",
1761
+ "split",
1762
+ "stats",
1763
+ "process",
1764
+ "testimonials",
1765
+ "resources",
1766
+ "faq",
1767
+ "cta"
1768
+ ],
1769
+ required: ["hero", "features", "faq", "cta"]
1770
+ },
1771
+ "service-detail": {
1772
+ label: "Service / product detail",
1773
+ description: "One offering explained: what it is, how it works, how it compares, and how to start.",
1774
+ sequence: [
1775
+ "hero",
1776
+ "features",
1777
+ "video",
1778
+ "process",
1779
+ "comparison",
1780
+ "pricing",
1781
+ "stats",
1782
+ "testimonials",
1783
+ "faq",
1784
+ "cta"
1785
+ ],
1786
+ required: ["hero", "features", "cta"]
1787
+ },
1788
+ campaign: {
1789
+ label: "Campaign / ABM landing",
1790
+ description: "A focused page for a campaign or named account that converts on the page itself.",
1791
+ sequence: [
1792
+ "hero",
1793
+ "logos",
1794
+ "features",
1795
+ "stats",
1796
+ "testimonials",
1797
+ "lead-form",
1798
+ "faq"
1799
+ ],
1800
+ required: ["hero", "lead-form"]
1801
+ },
1802
+ comparison: {
1803
+ label: "Comparison",
1804
+ description: "Your product against an alternative or the status quo, row by row.",
1805
+ sequence: ["hero", "comparison", "features", "testimonials", "faq", "cta"],
1806
+ required: ["hero", "comparison", "cta"]
1807
+ },
1808
+ resource: {
1809
+ label: "Resource / lead magnet",
1810
+ description: "A guide, report or tool offered in exchange for contact details.",
1811
+ sequence: ["hero", "split", "lead-form", "resources", "faq"],
1812
+ required: ["hero", "lead-form"]
1813
+ },
1814
+ pricing: {
1815
+ label: "Pricing",
1816
+ description: "Plans and what each includes, the proof that they are worth it, and the questions buyers ask before they pay.",
1817
+ sequence: [
1818
+ "hero",
1819
+ "pricing",
1820
+ "comparison",
1821
+ "stats",
1822
+ "testimonials",
1823
+ "faq",
1824
+ "cta"
1825
+ ],
1826
+ required: ["hero", "pricing", "faq"]
1827
+ }
1828
+ };
1829
+ var headedItems = /* @__PURE__ */ new Set([
1830
+ "features",
1831
+ "process",
1832
+ "pricing",
1833
+ "resources"
1834
+ ]);
1835
+ function validateLandingPage(blocks, preset) {
1836
+ const issues = [];
1837
+ const types = blocks.map((b) => b.type);
1838
+ const knownTypes = new Set(landingBlockTypes);
1839
+ blocks.forEach((b, index) => {
1840
+ if (!knownTypes.has(b.type))
1841
+ issues.push({
1842
+ severity: "error",
1843
+ index,
1844
+ message: `Unknown block type "${b.type}": the renderer skips this block.`
1845
+ });
1846
+ if (b.type === "lead-form" && safeHref(b.action) == null)
1847
+ issues.push({
1848
+ severity: "error",
1849
+ index,
1850
+ message: `Unsafe lead-form action "${b.action}": the renderer skips this block.`
1851
+ });
1852
+ });
1853
+ const h1Heroes = blocks.flatMap(
1854
+ (b, i) => b.type === "hero" && (b.headingLevel ?? "h1") === "h1" ? [i] : []
1855
+ );
1856
+ if (h1Heroes.length > 1)
1857
+ h1Heroes.slice(1).forEach(
1858
+ (index) => issues.push({
1859
+ severity: "error",
1860
+ index,
1861
+ message: 'A second h1 hero: a page has one h1. Set headingLevel: "h2" or remove it.'
1862
+ })
1863
+ );
1864
+ if (h1Heroes.length === 0)
1865
+ issues.push({
1866
+ severity: "warning",
1867
+ message: "No h1 hero. The page must render its own h1 outside the blocks."
1868
+ });
1869
+ const firstHero = types.indexOf("hero");
1870
+ if (firstHero > 0)
1871
+ issues.push({
1872
+ severity: "warning",
1873
+ index: firstHero,
1874
+ message: "The hero is not the first block."
1875
+ });
1876
+ if (h1Heroes.length > 0 && h1Heroes[0] !== firstHero)
1877
+ issues.push({
1878
+ severity: "warning",
1879
+ index: h1Heroes[0],
1880
+ message: "The h1 hero is not the first hero: an h2 hero precedes the page h1."
1881
+ });
1882
+ const seen = /* @__PURE__ */ new Map();
1883
+ blocks.forEach((b, index) => {
1884
+ const ids = [
1885
+ ...b.id ? [b.id] : [],
1886
+ ...b.type === "faq" ? b.items.flatMap((item) => item.id ? [item.id] : []) : []
1887
+ ];
1888
+ ids.forEach((id) => {
1889
+ if (seen.has(id))
1890
+ issues.push({
1891
+ severity: "error",
1892
+ index,
1893
+ message: `Duplicate id "${id}" (also block ${seen.get(id)}).`
1894
+ });
1895
+ else seen.set(id, index);
1896
+ });
1897
+ });
1898
+ blocks.forEach((b, index) => {
1899
+ if (headedItems.has(b.type) && !("title" in b && b.title))
1900
+ issues.push({
1901
+ severity: "warning",
1902
+ index,
1903
+ message: `"${b.type}" has no title, so its h3 item titles skip the h2 level.`
1904
+ });
1905
+ if (b.type !== "comparison") return;
1906
+ b.rows.forEach((row, r) => {
1907
+ if (row.values.length !== b.columns.length)
1908
+ issues.push({
1909
+ severity: "error",
1910
+ index,
1911
+ message: `Comparison row ${r} ("${row.feature}") has ${row.values.length} values for ${b.columns.length} columns.`
1912
+ });
1913
+ });
1914
+ if (b.highlightColumn !== void 0 && (b.highlightColumn < 0 || b.highlightColumn >= b.columns.length))
1915
+ issues.push({
1916
+ severity: "warning",
1917
+ index,
1918
+ message: `highlightColumn ${b.highlightColumn} is outside the ${b.columns.length} comparison columns.`
1919
+ });
1920
+ });
1921
+ if (!preset) return issues;
1922
+ const spec = typeof preset === "string" ? landingPresets[preset] : preset;
1923
+ for (const type of spec.required)
1924
+ if (!types.includes(type))
1925
+ issues.push({
1926
+ severity: "error",
1927
+ message: `Missing required "${type}" block for the ${spec.label} preset.`
1928
+ });
1929
+ let last = -1;
1930
+ blocks.forEach((b, index) => {
1931
+ const rank = spec.sequence.indexOf(b.type);
1932
+ if (rank === -1) return;
1933
+ if (rank < last)
1934
+ issues.push({
1935
+ severity: "warning",
1936
+ index,
1937
+ message: `"${b.type}" is out of the ${spec.label} preset's recommended order.`
1938
+ });
1939
+ else last = rank;
1940
+ });
1941
+ return issues;
1942
+ }
1943
+
1944
+ exports.ComparisonSection = ComparisonSection;
1945
+ exports.CtaSection = CtaSection;
1946
+ exports.FaqSection = FaqSection;
1947
+ exports.FeatureGridSection = FeatureGridSection;
1948
+ exports.HeroSection = HeroSection;
1949
+ exports.LandingPage = LandingPage;
1950
+ exports.LeadFormSection = LeadFormSection;
1951
+ exports.LogoCloudSection = LogoCloudSection;
1952
+ exports.PricingSection = PricingSection;
1953
+ exports.ProcessStepsSection = ProcessStepsSection;
1954
+ exports.ResourceCardsSection = ResourceCardsSection;
1955
+ exports.SectionHeading = SectionHeading;
1956
+ exports.SectionShell = SectionShell;
1957
+ exports.SplitContentSection = SplitContentSection;
1958
+ exports.StatsSection = StatsSection;
1959
+ exports.TemplateIcon = TemplateIcon;
1960
+ exports.TestimonialSection = TestimonialSection;
1961
+ exports.VideoSection = VideoSection;
1962
+ exports.defaultLeadFormFields = defaultLeadFormFields;
1963
+ exports.landingPresets = landingPresets;
1964
+ exports.templateIcons = templateIcons;
1965
+ exports.validateLandingPage = validateLandingPage;
1966
+ //# sourceMappingURL=chunk-WCDJFMZO.cjs.map
1967
+ //# sourceMappingURL=chunk-WCDJFMZO.cjs.map