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