@salesmind-ai/design-system 0.3.1 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. package/dist/admin/index.cjs +68 -2928
  2. package/dist/admin/index.cjs.map +1 -1
  3. package/dist/admin/index.js +5 -2915
  4. package/dist/admin/index.js.map +1 -1
  5. package/dist/blog/index.cjs +53 -1064
  6. package/dist/blog/index.cjs.map +1 -1
  7. package/dist/blog/index.js +8 -1054
  8. package/dist/blog/index.js.map +1 -1
  9. package/dist/charts/index.cjs +46 -2694
  10. package/dist/charts/index.cjs.map +1 -1
  11. package/dist/charts/index.js +3 -2680
  12. package/dist/charts/index.js.map +1 -1
  13. package/dist/chunk-2GARWEJK.js +17 -0
  14. package/dist/chunk-2GARWEJK.js.map +1 -0
  15. package/dist/chunk-3NKRFUAR.js +37 -0
  16. package/dist/chunk-3NKRFUAR.js.map +1 -0
  17. package/dist/chunk-3TGSIILM.cjs +201 -0
  18. package/dist/chunk-3TGSIILM.cjs.map +1 -0
  19. package/dist/chunk-4GM5BGBN.cjs +801 -0
  20. package/dist/chunk-4GM5BGBN.cjs.map +1 -0
  21. package/dist/chunk-5LGDEZWY.cjs +2434 -0
  22. package/dist/chunk-5LGDEZWY.cjs.map +1 -0
  23. package/dist/chunk-6H4DSTXR.js +786 -0
  24. package/dist/chunk-6H4DSTXR.js.map +1 -0
  25. package/dist/chunk-6UNG76Y2.js +153 -0
  26. package/dist/chunk-6UNG76Y2.js.map +1 -0
  27. package/dist/chunk-7PX2AZ6Y.js +39 -0
  28. package/dist/chunk-7PX2AZ6Y.js.map +1 -0
  29. package/dist/chunk-B6AVAX4F.js +1415 -0
  30. package/dist/chunk-B6AVAX4F.js.map +1 -0
  31. package/dist/chunk-BILT5KD3.js +264 -0
  32. package/dist/chunk-BILT5KD3.js.map +1 -0
  33. package/dist/chunk-C2BCDNAV.js +24 -0
  34. package/dist/chunk-C2BCDNAV.js.map +1 -0
  35. package/dist/chunk-CH42VPWE.cjs +421 -0
  36. package/dist/chunk-CH42VPWE.cjs.map +1 -0
  37. package/dist/chunk-CJ2MKVAF.cjs +46 -0
  38. package/dist/chunk-CJ2MKVAF.cjs.map +1 -0
  39. package/dist/chunk-DP74LUXG.cjs +98 -0
  40. package/dist/chunk-DP74LUXG.cjs.map +1 -0
  41. package/dist/chunk-E7D6EKJ4.cjs +44 -0
  42. package/dist/chunk-E7D6EKJ4.cjs.map +1 -0
  43. package/dist/chunk-ECXBTUH6.cjs +584 -0
  44. package/dist/chunk-ECXBTUH6.cjs.map +1 -0
  45. package/dist/chunk-EFRAP5ES.js +157 -0
  46. package/dist/chunk-EFRAP5ES.js.map +1 -0
  47. package/dist/chunk-F6YYWMME.js +485 -0
  48. package/dist/chunk-F6YYWMME.js.map +1 -0
  49. package/dist/chunk-FAFAP4L5.js +183 -0
  50. package/dist/chunk-FAFAP4L5.js.map +1 -0
  51. package/dist/chunk-GUZIMHWS.js +1608 -0
  52. package/dist/chunk-GUZIMHWS.js.map +1 -0
  53. package/dist/chunk-H2Y6BSTL.cjs +69 -0
  54. package/dist/chunk-H2Y6BSTL.cjs.map +1 -0
  55. package/dist/chunk-HN4PHABT.js +126 -0
  56. package/dist/chunk-HN4PHABT.js.map +1 -0
  57. package/dist/chunk-HRENHNDJ.js +211 -0
  58. package/dist/chunk-HRENHNDJ.js.map +1 -0
  59. package/dist/chunk-I75BFEYT.cjs +2561 -0
  60. package/dist/chunk-I75BFEYT.cjs.map +1 -0
  61. package/dist/chunk-IFRATNLU.js +562 -0
  62. package/dist/chunk-IFRATNLU.js.map +1 -0
  63. package/dist/chunk-IYPXJ6YC.cjs +69 -0
  64. package/dist/chunk-IYPXJ6YC.cjs.map +1 -0
  65. package/dist/chunk-JPJN4YBC.js +409 -0
  66. package/dist/chunk-JPJN4YBC.js.map +1 -0
  67. package/dist/chunk-KBA2LFBG.js +62 -0
  68. package/dist/chunk-KBA2LFBG.js.map +1 -0
  69. package/dist/chunk-KCKUSU2M.cjs +166 -0
  70. package/dist/chunk-KCKUSU2M.cjs.map +1 -0
  71. package/dist/chunk-KJ2OXQF4.js +287 -0
  72. package/dist/chunk-KJ2OXQF4.js.map +1 -0
  73. package/dist/chunk-KNQEIU7O.cjs +1202 -0
  74. package/dist/chunk-KNQEIU7O.cjs.map +1 -0
  75. package/dist/chunk-KVGSVGRK.cjs +569 -0
  76. package/dist/chunk-KVGSVGRK.cjs.map +1 -0
  77. package/dist/chunk-L352JRV6.cjs +105 -0
  78. package/dist/chunk-L352JRV6.cjs.map +1 -0
  79. package/dist/chunk-LJADZITX.cjs +298 -0
  80. package/dist/chunk-LJADZITX.cjs.map +1 -0
  81. package/dist/chunk-LMJPWXTZ.cjs +194 -0
  82. package/dist/chunk-LMJPWXTZ.cjs.map +1 -0
  83. package/dist/chunk-LOWEAQST.js +701 -0
  84. package/dist/chunk-LOWEAQST.js.map +1 -0
  85. package/dist/chunk-MDB2WCRQ.cjs +137 -0
  86. package/dist/chunk-MDB2WCRQ.cjs.map +1 -0
  87. package/dist/chunk-MQDEE7HC.cjs +283 -0
  88. package/dist/chunk-MQDEE7HC.cjs.map +1 -0
  89. package/dist/chunk-MQRB634A.cjs +34 -0
  90. package/dist/chunk-MQRB634A.cjs.map +1 -0
  91. package/dist/chunk-MTI27RDV.js +185 -0
  92. package/dist/chunk-MTI27RDV.js.map +1 -0
  93. package/dist/chunk-MU6GW5ZV.js +2317 -0
  94. package/dist/chunk-MU6GW5ZV.js.map +1 -0
  95. package/dist/chunk-NN3TUHIH.js +28 -0
  96. package/dist/chunk-NN3TUHIH.js.map +1 -0
  97. package/dist/chunk-NT4LBP7D.cjs +111 -0
  98. package/dist/chunk-NT4LBP7D.cjs.map +1 -0
  99. package/dist/chunk-OLV7OD3X.cjs +502 -0
  100. package/dist/chunk-OLV7OD3X.cjs.map +1 -0
  101. package/dist/chunk-OXNXEQY7.js +2538 -0
  102. package/dist/chunk-OXNXEQY7.js.map +1 -0
  103. package/dist/chunk-P5BOFE5A.js +546 -0
  104. package/dist/chunk-P5BOFE5A.js.map +1 -0
  105. package/dist/chunk-Q2MFGYTE.cjs +1449 -0
  106. package/dist/chunk-Q2MFGYTE.cjs.map +1 -0
  107. package/dist/chunk-Q75DBVDY.cjs +68 -0
  108. package/dist/chunk-Q75DBVDY.cjs.map +1 -0
  109. package/dist/chunk-REQ5Q6ZI.js +1022 -0
  110. package/dist/chunk-REQ5Q6ZI.js.map +1 -0
  111. package/dist/chunk-SICKWUWB.js +62 -0
  112. package/dist/chunk-SICKWUWB.js.map +1 -0
  113. package/dist/chunk-T343CCH5.js +1190 -0
  114. package/dist/chunk-T343CCH5.js.map +1 -0
  115. package/dist/chunk-TEC62D4A.cjs +1624 -0
  116. package/dist/chunk-TEC62D4A.cjs.map +1 -0
  117. package/dist/chunk-TW5JB35D.js +2122 -0
  118. package/dist/chunk-TW5JB35D.js.map +1 -0
  119. package/dist/chunk-VC5LMUVQ.cjs +20 -0
  120. package/dist/chunk-VC5LMUVQ.cjs.map +1 -0
  121. package/dist/chunk-VM7WFMKI.cjs +76 -0
  122. package/dist/chunk-VM7WFMKI.cjs.map +1 -0
  123. package/dist/chunk-W2WTP6HS.cjs +233 -0
  124. package/dist/chunk-W2WTP6HS.cjs.map +1 -0
  125. package/dist/chunk-WH7PYHZY.cjs +35 -0
  126. package/dist/chunk-WH7PYHZY.cjs.map +1 -0
  127. package/dist/chunk-XQZVY7JJ.cjs +717 -0
  128. package/dist/chunk-XQZVY7JJ.cjs.map +1 -0
  129. package/dist/chunk-XU3OMQ7V.js +98 -0
  130. package/dist/chunk-XU3OMQ7V.js.map +1 -0
  131. package/dist/chunk-XWPDRMZG.js +62 -0
  132. package/dist/chunk-XWPDRMZG.js.map +1 -0
  133. package/dist/chunk-Y3CPKNB7.js +67 -0
  134. package/dist/chunk-Y3CPKNB7.js.map +1 -0
  135. package/dist/chunk-YNVRDD2P.js +98 -0
  136. package/dist/chunk-YNVRDD2P.js.map +1 -0
  137. package/dist/chunk-YSYR54XR.js +92 -0
  138. package/dist/chunk-YSYR54XR.js.map +1 -0
  139. package/dist/chunk-YTYDQBVY.cjs +162 -0
  140. package/dist/chunk-YTYDQBVY.cjs.map +1 -0
  141. package/dist/chunk-ZDLOA2UT.cjs +1042 -0
  142. package/dist/chunk-ZDLOA2UT.cjs.map +1 -0
  143. package/dist/chunk-ZWUKRCOJ.cjs +2162 -0
  144. package/dist/chunk-ZWUKRCOJ.cjs.map +1 -0
  145. package/dist/core/index.cjs +807 -4333
  146. package/dist/core/index.cjs.map +1 -1
  147. package/dist/core/index.js +14 -4130
  148. package/dist/core/index.js.map +1 -1
  149. package/dist/i18n/index.cjs +86 -558
  150. package/dist/i18n/index.cjs.map +1 -1
  151. package/dist/i18n/index.js +1 -544
  152. package/dist/i18n/index.js.map +1 -1
  153. package/dist/index.cjs +1432 -17140
  154. package/dist/index.cjs.map +1 -1
  155. package/dist/index.js +31 -16785
  156. package/dist/index.js.map +1 -1
  157. package/dist/marketing/index.cjs +142 -3072
  158. package/dist/marketing/index.cjs.map +1 -1
  159. package/dist/marketing/index.js +11 -3042
  160. package/dist/marketing/index.js.map +1 -1
  161. package/dist/motion/index.cjs +26 -1222
  162. package/dist/motion/index.cjs.map +1 -1
  163. package/dist/motion/index.js +2 -1215
  164. package/dist/motion/index.js.map +1 -1
  165. package/dist/nav/index.cjs +101 -1518
  166. package/dist/nav/index.cjs.map +1 -1
  167. package/dist/nav/index.js +4 -1498
  168. package/dist/nav/index.js.map +1 -1
  169. package/dist/report/index.cjs +171 -2403
  170. package/dist/report/index.cjs.map +1 -1
  171. package/dist/report/index.js +3 -2363
  172. package/dist/report/index.js.map +1 -1
  173. package/dist/sections/index.cjs +28 -378
  174. package/dist/sections/index.cjs.map +1 -1
  175. package/dist/sections/index.js +4 -372
  176. package/dist/sections/index.js.map +1 -1
  177. package/dist/social-proof/index.cjs +53 -1250
  178. package/dist/social-proof/index.cjs.map +1 -1
  179. package/dist/social-proof/index.js +6 -1235
  180. package/dist/social-proof/index.js.map +1 -1
  181. package/dist/theme/index.cjs +38 -565
  182. package/dist/theme/index.cjs.map +1 -1
  183. package/dist/theme/index.js +2 -555
  184. package/dist/theme/index.js.map +1 -1
  185. package/dist/web/client/index.cjs +38 -491
  186. package/dist/web/client/index.cjs.map +1 -1
  187. package/dist/web/client/index.js +4 -483
  188. package/dist/web/client/index.js.map +1 -1
  189. package/dist/web/index.cjs +158 -1346
  190. package/dist/web/index.cjs.map +1 -1
  191. package/dist/web/index.js +9 -1305
  192. package/dist/web/index.js.map +1 -1
  193. package/dist/web/server/index.cjs +26 -563
  194. package/dist/web/server/index.cjs.map +1 -1
  195. package/dist/web/server/index.js +1 -560
  196. package/dist/web/server/index.js.map +1 -1
  197. package/package.json +11 -1
@@ -1,3044 +1,13 @@
1
- import React31, { forwardRef, createContext, useState, useEffect, useRef, useCallback, useMemo, useContext } from 'react';
2
- import clsx14 from 'clsx';
3
- import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
4
- import { Slot } from '@radix-ui/react-slot';
5
- import { Dialog as Dialog$1 } from '@base-ui/react/dialog';
6
- import { Input } from '@base-ui/react/input';
7
- import { ArrowRight, X, Check } from 'lucide-react';
8
- import { Tabs as Tabs$1 } from '@base-ui/react/tabs';
9
-
10
- // src/components/PricingCard/PricingCard.tsx
11
- var PricingCard = React31.forwardRef(
12
- ({
13
- tier,
14
- tagline,
15
- price,
16
- priceSuffix,
17
- anchorPrice,
18
- badge,
19
- highlighted = false,
20
- features = [],
21
- cta,
22
- secondaryCta,
23
- footerNote,
24
- className,
25
- children,
26
- ...props
27
- }, ref) => {
28
- return /* @__PURE__ */ jsxs(
29
- "div",
30
- {
31
- ref,
32
- className: clsx14(
33
- "ds-pricing-card",
34
- highlighted && "ds-pricing-card--highlighted",
35
- className
36
- ),
37
- ...props,
38
- children: [
39
- badge && /* @__PURE__ */ jsx("div", { className: "ds-pricing-card__badge", children: badge }),
40
- /* @__PURE__ */ jsxs("div", { className: "ds-pricing-card__header", children: [
41
- /* @__PURE__ */ jsx("h3", { className: "ds-pricing-card__tier", children: tier }),
42
- tagline && /* @__PURE__ */ jsx("p", { className: "ds-pricing-card__tagline", children: tagline })
43
- ] }),
44
- /* @__PURE__ */ jsxs("div", { className: "ds-pricing-card__price-block", children: [
45
- anchorPrice && /* @__PURE__ */ jsx("span", { className: "ds-pricing-card__anchor-price", children: anchorPrice }),
46
- /* @__PURE__ */ jsxs("div", { className: "ds-pricing-card__price-row", children: [
47
- /* @__PURE__ */ jsx("span", { className: "ds-pricing-card__price", children: price }),
48
- priceSuffix && /* @__PURE__ */ jsx("span", { className: "ds-pricing-card__price-suffix", children: priceSuffix })
49
- ] })
50
- ] }),
51
- features.length > 0 && /* @__PURE__ */ jsx("ul", { className: "ds-pricing-card__features", children: features.map((feature, idx) => /* @__PURE__ */ jsxs(
52
- "li",
53
- {
54
- className: clsx14(
55
- "ds-pricing-card__feature",
56
- feature.included === false && "ds-pricing-card__feature--excluded"
57
- ),
58
- children: [
59
- /* @__PURE__ */ jsx("span", { className: "ds-pricing-card__feature-icon", "aria-hidden": "true", children: feature.included === false ? /* @__PURE__ */ jsxs("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
60
- /* @__PURE__ */ jsx("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
61
- /* @__PURE__ */ jsx("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
62
- ] }) : /* @__PURE__ */ jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("polyline", { points: "20 6 9 17 4 12" }) }) }),
63
- /* @__PURE__ */ jsxs("span", { className: "ds-pricing-card__feature-text", children: [
64
- feature.text,
65
- feature.detail && /* @__PURE__ */ jsx("span", { className: "ds-pricing-card__feature-detail", children: feature.detail })
66
- ] })
67
- ]
68
- },
69
- idx
70
- )) }),
71
- (cta || secondaryCta) && /* @__PURE__ */ jsxs("div", { className: "ds-pricing-card__cta-area", children: [
72
- cta,
73
- secondaryCta && /* @__PURE__ */ jsx("div", { className: "ds-pricing-card__secondary-cta", children: secondaryCta })
74
- ] }),
75
- footerNote && /* @__PURE__ */ jsx("p", { className: "ds-pricing-card__footer-note", children: footerNote }),
76
- children
77
- ]
78
- }
79
- );
80
- }
81
- );
82
- PricingCard.displayName = "PricingCard";
83
- var PricingSection = forwardRef(
84
- ({
85
- title,
86
- description,
87
- plans,
88
- toggle,
89
- className,
90
- ...props
91
- }, ref) => {
92
- return /* @__PURE__ */ jsxs(
93
- "section",
94
- {
95
- ref,
96
- className: clsx14("ds-pricing-section", className),
97
- ...props,
98
- children: [
99
- /* @__PURE__ */ jsxs("div", { className: "ds-pricing-section__header", children: [
100
- /* @__PURE__ */ jsx("h2", { className: "ds-pricing-section__title", children: title }),
101
- description && /* @__PURE__ */ jsx("p", { className: "ds-pricing-section__description", children: description }),
102
- toggle && /* @__PURE__ */ jsx("div", { className: "ds-pricing-section__toggle", children: toggle })
103
- ] }),
104
- /* @__PURE__ */ jsx("div", { className: "ds-pricing-section__grid", children: plans.map((plan, index) => /* @__PURE__ */ jsx(
105
- PricingCard,
106
- {
107
- ...plan,
108
- className: clsx14(
109
- "ds-pricing-section__card",
110
- plan.highlighted && "ds-pricing-section__card--popular"
111
- )
112
- },
113
- index
114
- )) })
115
- ]
116
- }
117
- );
118
- }
119
- );
120
- PricingSection.displayName = "PricingSection";
121
- var ToggleGroupContext = React31.createContext({
122
- type: "single",
123
- value: [],
124
- onItemToggle: () => {
125
- }
126
- });
127
- var ToggleGroup = React31.forwardRef(
128
- ({ className, type, value, onValueChange, children, ...props }, ref) => {
129
- const normalizedValue = React31.useMemo(() => {
130
- if (value === void 0) return [];
131
- return Array.isArray(value) ? value : [value];
132
- }, [value]);
133
- const onItemToggle = React31.useCallback(
134
- (itemValue) => {
135
- if (type === "single") {
136
- const next = normalizedValue.includes(itemValue) ? "" : itemValue;
137
- onValueChange?.(next);
138
- } else {
139
- const next = normalizedValue.includes(itemValue) ? normalizedValue.filter((v) => v !== itemValue) : [...normalizedValue, itemValue];
140
- onValueChange?.(next);
141
- }
142
- },
143
- [type, normalizedValue, onValueChange]
144
- );
145
- const ctx = React31.useMemo(
146
- () => ({ type, value: normalizedValue, onItemToggle }),
147
- [type, normalizedValue, onItemToggle]
148
- );
149
- return /* @__PURE__ */ jsx(ToggleGroupContext.Provider, { value: ctx, children: /* @__PURE__ */ jsx(
150
- "div",
151
- {
152
- ref,
153
- role: "group",
154
- className: clsx14("ds-toggle-group", className),
155
- ...props,
156
- children
157
- }
158
- ) });
159
- }
160
- );
161
- ToggleGroup.displayName = "ToggleGroup";
162
- var ToggleGroupItem = React31.forwardRef(({ className, value, children, onClick, ...props }, ref) => {
163
- const ctx = React31.useContext(ToggleGroupContext);
164
- const pressed = ctx.value.includes(value);
165
- const handleClick = (e) => {
166
- ctx.onItemToggle(value);
167
- onClick?.(e);
168
- };
169
- return /* @__PURE__ */ jsx(
170
- "button",
171
- {
172
- ref,
173
- type: "button",
174
- "aria-pressed": pressed,
175
- className: clsx14(
176
- "ds-toggle-group__item",
177
- pressed && "ds-toggle-group__item--pressed",
178
- className
179
- ),
180
- onClick: handleClick,
181
- ...props,
182
- children
183
- }
184
- );
185
- });
186
- ToggleGroupItem.displayName = "ToggleGroupItem";
187
- var Badge = React31.forwardRef(
188
- ({ className, variant = "default", ...props }, ref) => {
189
- return /* @__PURE__ */ jsx(
190
- "span",
191
- {
192
- ref,
193
- className: clsx14("ds-badge", `ds-badge--${variant}`, className),
194
- ...props
195
- }
196
- );
197
- }
198
- );
199
- Badge.displayName = "Badge";
200
- var PricingToggle = forwardRef(
201
- ({
202
- value,
203
- onChange,
204
- monthlyLabel = "Monthly",
205
- annualLabel = "Annual",
206
- savingsBadge,
207
- className,
208
- ...props
209
- }, ref) => {
210
- return /* @__PURE__ */ jsxs(
211
- "div",
212
- {
213
- ref,
214
- className: clsx14("ds-pricing-toggle", className),
215
- ...props,
216
- children: [
217
- /* @__PURE__ */ jsxs(
218
- ToggleGroup,
219
- {
220
- type: "single",
221
- value,
222
- onValueChange: (v) => {
223
- if (v && typeof v === "string") {
224
- onChange(v);
225
- }
226
- },
227
- children: [
228
- /* @__PURE__ */ jsx(ToggleGroupItem, { value: "monthly", children: monthlyLabel }),
229
- /* @__PURE__ */ jsx(ToggleGroupItem, { value: "annual", children: annualLabel })
230
- ]
231
- }
232
- ),
233
- savingsBadge && /* @__PURE__ */ jsx(Badge, { className: "ds-pricing-toggle__badge", children: savingsBadge })
234
- ]
235
- }
236
- );
237
- }
238
- );
239
- PricingToggle.displayName = "PricingToggle";
240
- var ComparisonTable = React31.forwardRef(
241
- ({ columns, rows, caption, className, ...props }, ref) => {
242
- return /* @__PURE__ */ jsx("div", { ref, className: clsx14("ds-comparison-table", className), ...props, children: /* @__PURE__ */ jsx("div", { className: "ds-comparison-table__scroll", children: /* @__PURE__ */ jsxs("table", { className: "ds-comparison-table__table", role: "table", children: [
243
- caption && /* @__PURE__ */ jsx("caption", { className: "ds-comparison-table__caption", children: caption }),
244
- /* @__PURE__ */ jsx("thead", { className: "ds-comparison-table__head", children: /* @__PURE__ */ jsxs("tr", { children: [
245
- /* @__PURE__ */ jsx("th", { className: "ds-comparison-table__corner", scope: "col", children: /* @__PURE__ */ jsx("span", { className: "ds-visually-hidden", children: "Feature" }) }),
246
- columns.map((col, idx) => /* @__PURE__ */ jsxs(
247
- "th",
248
- {
249
- scope: "col",
250
- className: clsx14(
251
- "ds-comparison-table__col-header",
252
- col.highlighted && "ds-comparison-table__col-header--highlighted"
253
- ),
254
- children: [
255
- col.badge && /* @__PURE__ */ jsx("span", { className: "ds-comparison-table__col-badge", children: col.badge }),
256
- /* @__PURE__ */ jsx("span", { className: "ds-comparison-table__col-label", children: col.label })
257
- ]
258
- },
259
- idx
260
- ))
261
- ] }) }),
262
- /* @__PURE__ */ jsx("tbody", { className: "ds-comparison-table__body", children: rows.map(
263
- (row, rowIdx) => row.isCategory ? /* @__PURE__ */ jsx("tr", { className: "ds-comparison-table__category-row", children: /* @__PURE__ */ jsx(
264
- "td",
265
- {
266
- colSpan: columns.length + 1,
267
- className: "ds-comparison-table__category",
268
- children: row.label
269
- }
270
- ) }, rowIdx) : /* @__PURE__ */ jsxs("tr", { className: "ds-comparison-table__row", children: [
271
- /* @__PURE__ */ jsx("td", { className: "ds-comparison-table__row-label", children: row.label }),
272
- row.values.map((val, colIdx) => /* @__PURE__ */ jsx(
273
- "td",
274
- {
275
- className: clsx14(
276
- "ds-comparison-table__cell",
277
- columns[colIdx]?.highlighted && "ds-comparison-table__cell--highlighted"
278
- ),
279
- children: val
280
- },
281
- colIdx
282
- ))
283
- ] }, rowIdx)
284
- ) })
285
- ] }) }) });
286
- }
287
- );
288
- ComparisonTable.displayName = "ComparisonTable";
289
- var ROICalculator = React31.forwardRef(
290
- ({
291
- eyebrow,
292
- title,
293
- items,
294
- summary,
295
- savingsCallout,
296
- className,
297
- ...props
298
- }, ref) => {
299
- return /* @__PURE__ */ jsxs("div", { ref, className: clsx14("ds-roi-calculator", className), ...props, children: [
300
- (eyebrow || title) && /* @__PURE__ */ jsxs("div", { className: "ds-roi-calculator__header", children: [
301
- eyebrow && /* @__PURE__ */ jsx("span", { className: "ds-roi-calculator__eyebrow", children: eyebrow }),
302
- title && /* @__PURE__ */ jsx("h3", { className: "ds-roi-calculator__title", children: title })
303
- ] }),
304
- /* @__PURE__ */ jsx("div", { className: "ds-roi-calculator__grid", children: items.map((item, idx) => /* @__PURE__ */ jsxs(
305
- "div",
306
- {
307
- className: clsx14(
308
- "ds-roi-calculator__item",
309
- item.isRecommended && "ds-roi-calculator__item--recommended"
310
- ),
311
- children: [
312
- item.isRecommended && /* @__PURE__ */ jsx("span", { className: "ds-roi-calculator__item-badge", children: "Your Cost" }),
313
- /* @__PURE__ */ jsx("span", { className: "ds-roi-calculator__item-label", children: item.label }),
314
- /* @__PURE__ */ jsx("span", { className: "ds-roi-calculator__item-cost", children: item.monthlyCost }),
315
- /* @__PURE__ */ jsx("span", { className: "ds-roi-calculator__item-annual", children: item.annualCost }),
316
- item.context && /* @__PURE__ */ jsx("span", { className: "ds-roi-calculator__item-context", children: item.context })
317
- ]
318
- },
319
- idx
320
- )) }),
321
- savingsCallout && /* @__PURE__ */ jsx("div", { className: "ds-roi-calculator__savings", children: savingsCallout }),
322
- summary && /* @__PURE__ */ jsx("div", { className: "ds-roi-calculator__summary", children: summary })
323
- ] });
324
- }
325
- );
326
- ROICalculator.displayName = "ROICalculator";
327
- var GuaranteeHighlight = React31.forwardRef(
328
- ({
329
- guarantee,
330
- detail,
331
- finePrint,
332
- variant = "default",
333
- icon,
334
- className,
335
- ...props
336
- }, ref) => {
337
- return /* @__PURE__ */ jsxs(
338
- "div",
339
- {
340
- ref,
341
- className: clsx14(
342
- "ds-guarantee",
343
- `ds-guarantee--${variant}`,
344
- className
345
- ),
346
- ...props,
347
- children: [
348
- icon && /* @__PURE__ */ jsx("div", { className: "ds-guarantee__icon", children: icon }),
349
- /* @__PURE__ */ jsxs("div", { className: "ds-guarantee__content", children: [
350
- /* @__PURE__ */ jsx("p", { className: "ds-guarantee__statement", children: guarantee }),
351
- detail && /* @__PURE__ */ jsx("p", { className: "ds-guarantee__detail", children: detail }),
352
- finePrint && /* @__PURE__ */ jsx("p", { className: "ds-guarantee__fine-print", children: finePrint })
353
- ] })
354
- ]
355
- }
356
- );
357
- }
358
- );
359
- GuaranteeHighlight.displayName = "GuaranteeHighlight";
360
- var ICPFilter = React31.forwardRef(
361
- ({
362
- qualifiedItems,
363
- disqualifiedItems,
364
- qualifiedHeading = "This Is For You If",
365
- disqualifiedHeading = "This Is Not For You If",
366
- variant = "columns",
367
- className,
368
- ...props
369
- }, ref) => {
370
- return /* @__PURE__ */ jsxs(
371
- "div",
372
- {
373
- ref,
374
- className: clsx14(
375
- "ds-icp-filter",
376
- `ds-icp-filter--${variant}`,
377
- className
378
- ),
379
- ...props,
380
- children: [
381
- /* @__PURE__ */ jsxs("div", { className: "ds-icp-filter__column ds-icp-filter__column--qualified", children: [
382
- /* @__PURE__ */ jsx("h4", { className: "ds-icp-filter__heading ds-icp-filter__heading--qualified", children: qualifiedHeading }),
383
- /* @__PURE__ */ jsx("ul", { className: "ds-icp-filter__list", children: qualifiedItems.map((item, idx) => /* @__PURE__ */ jsxs("li", { className: "ds-icp-filter__item ds-icp-filter__item--qualified", children: [
384
- /* @__PURE__ */ jsx("span", { className: "ds-icp-filter__icon", "aria-hidden": "true", children: /* @__PURE__ */ jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("polyline", { points: "20 6 9 17 4 12" }) }) }),
385
- /* @__PURE__ */ jsx("span", { className: "ds-icp-filter__text", children: item.text })
386
- ] }, idx)) })
387
- ] }),
388
- /* @__PURE__ */ jsxs("div", { className: "ds-icp-filter__column ds-icp-filter__column--disqualified", children: [
389
- /* @__PURE__ */ jsx("h4", { className: "ds-icp-filter__heading ds-icp-filter__heading--disqualified", children: disqualifiedHeading }),
390
- /* @__PURE__ */ jsx("ul", { className: "ds-icp-filter__list", children: disqualifiedItems.map((item, idx) => /* @__PURE__ */ jsxs("li", { className: "ds-icp-filter__item ds-icp-filter__item--disqualified", children: [
391
- /* @__PURE__ */ jsx("span", { className: "ds-icp-filter__icon", "aria-hidden": "true", children: /* @__PURE__ */ jsxs("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: [
392
- /* @__PURE__ */ jsx("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
393
- /* @__PURE__ */ jsx("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
394
- ] }) }),
395
- /* @__PURE__ */ jsx("span", { className: "ds-icp-filter__text", children: item.text })
396
- ] }, idx)) })
397
- ] })
398
- ]
399
- }
400
- );
401
- }
402
- );
403
- ICPFilter.displayName = "ICPFilter";
404
- var ObjectionFAQ = React31.forwardRef(
405
- ({
406
- items,
407
- title,
408
- subtitle,
409
- allowMultiple = false,
410
- defaultOpenIndex,
411
- className,
412
- ...props
413
- }, ref) => {
414
- const [openItems, setOpenItems] = React31.useState(() => {
415
- const initial = /* @__PURE__ */ new Set();
416
- if (defaultOpenIndex !== void 0) initial.add(defaultOpenIndex);
417
- return initial;
418
- });
419
- const toggle = React31.useCallback(
420
- (index) => {
421
- setOpenItems((prev) => {
422
- const next = new Set(prev);
423
- if (next.has(index)) {
424
- next.delete(index);
425
- } else {
426
- if (!allowMultiple) next.clear();
427
- next.add(index);
428
- }
429
- return next;
430
- });
431
- },
432
- [allowMultiple]
433
- );
434
- return /* @__PURE__ */ jsxs("div", { ref, className: clsx14("ds-objection-faq", className), ...props, children: [
435
- (title || subtitle) && /* @__PURE__ */ jsxs("div", { className: "ds-objection-faq__header", children: [
436
- title && /* @__PURE__ */ jsx("h3", { className: "ds-objection-faq__title", children: title }),
437
- subtitle && /* @__PURE__ */ jsx("p", { className: "ds-objection-faq__subtitle", children: subtitle })
438
- ] }),
439
- /* @__PURE__ */ jsx("div", { className: "ds-objection-faq__list", role: "list", children: items.map((item, idx) => {
440
- const isOpen = openItems.has(idx);
441
- return /* @__PURE__ */ jsxs(
442
- "div",
443
- {
444
- className: clsx14(
445
- "ds-objection-faq__item",
446
- isOpen && "ds-objection-faq__item--open"
447
- ),
448
- "data-state": isOpen ? "open" : "closed",
449
- role: "listitem",
450
- children: [
451
- /* @__PURE__ */ jsxs(
452
- "button",
453
- {
454
- type: "button",
455
- className: "ds-objection-faq__trigger",
456
- onClick: () => toggle(idx),
457
- "aria-expanded": isOpen,
458
- children: [
459
- /* @__PURE__ */ jsxs("div", { className: "ds-objection-faq__trigger-content", children: [
460
- item.tag && /* @__PURE__ */ jsx("span", { className: "ds-objection-faq__tag", children: item.tag }),
461
- /* @__PURE__ */ jsx("span", { className: "ds-objection-faq__question", children: item.question })
462
- ] }),
463
- /* @__PURE__ */ jsx(
464
- "svg",
465
- {
466
- className: "ds-objection-faq__chevron",
467
- width: "16",
468
- height: "16",
469
- viewBox: "0 0 24 24",
470
- fill: "none",
471
- stroke: "currentColor",
472
- strokeWidth: "2",
473
- strokeLinecap: "round",
474
- strokeLinejoin: "round",
475
- "aria-hidden": "true",
476
- children: /* @__PURE__ */ jsx("polyline", { points: "6 9 12 15 18 9" })
477
- }
478
- )
479
- ]
480
- }
481
- ),
482
- /* @__PURE__ */ jsx(
483
- "div",
484
- {
485
- className: "ds-objection-faq__answer-wrapper",
486
- hidden: !isOpen,
487
- children: /* @__PURE__ */ jsx("p", { className: "ds-objection-faq__answer", children: item.answer })
488
- }
489
- )
490
- ]
491
- },
492
- idx
493
- );
494
- }) })
495
- ] });
496
- }
497
- );
498
- ObjectionFAQ.displayName = "ObjectionFAQ";
499
- var Button = React31.forwardRef(
500
- ({ className, variant = "primary", size = "md", asChild = false, isLoading = false, children, disabled, ...props }, ref) => {
501
- const buttonClass = clsx14(
502
- "ds-button",
503
- `ds-button--${variant}`,
504
- size === "icon" ? "ds-button--icon ds-button--md" : `ds-button--${size}`,
505
- isLoading && "ds-button--loading",
506
- className
507
- );
508
- if (asChild) {
509
- return /* @__PURE__ */ jsx(
510
- Slot,
511
- {
512
- ref,
513
- "aria-disabled": isLoading || disabled || void 0,
514
- className: buttonClass,
515
- ...props,
516
- children
517
- }
518
- );
519
- }
520
- return /* @__PURE__ */ jsxs(
521
- "button",
522
- {
523
- ref,
524
- disabled: isLoading || disabled,
525
- className: buttonClass,
526
- ...props,
527
- children: [
528
- isLoading && /* @__PURE__ */ jsx(
529
- "svg",
530
- {
531
- className: "ds-button__spinner",
532
- xmlns: "http://www.w3.org/2000/svg",
533
- width: "1em",
534
- height: "1em",
535
- viewBox: "0 0 24 24",
536
- fill: "none",
537
- stroke: "currentColor",
538
- strokeWidth: "2",
539
- strokeLinecap: "round",
540
- strokeLinejoin: "round",
541
- children: /* @__PURE__ */ jsx("path", { d: "M21 12a9 9 0 1 1-6.219-8.56" })
542
- }
543
- ),
544
- /* @__PURE__ */ jsx("span", { className: clsx14("ds-button__content", isLoading && "ds-button__content--hidden"), children })
545
- ]
546
- }
547
- );
548
- }
549
- );
550
- Button.displayName = "Button";
551
- var UtmContext = createContext(null);
552
-
553
- // src/web/utm/useUtmDefaults.ts
554
- function useUtmDefaults() {
555
- return useContext(UtmContext);
556
- }
557
-
558
- // src/web/utm/builders.ts
559
- var PLACEHOLDER_ORIGIN = "https://__placeholder__.internal";
560
- function buildUtmUrl(baseUrl, params) {
561
- const isRelative = baseUrl.startsWith("/");
562
- let url;
563
- try {
564
- url = isRelative ? new URL(baseUrl, PLACEHOLDER_ORIGIN) : new URL(baseUrl);
565
- } catch {
566
- return baseUrl;
567
- }
568
- const existingParams = [];
569
- url.searchParams.forEach((value, key) => {
570
- existingParams.push([key, value]);
571
- });
572
- for (const [key] of existingParams) {
573
- url.searchParams.delete(key);
574
- }
575
- for (const [key, value] of existingParams) {
576
- if (!key.startsWith("utm_")) {
577
- url.searchParams.set(key, value);
578
- }
579
- }
580
- url.searchParams.set("utm_source", params.source);
581
- url.searchParams.set("utm_medium", params.medium);
582
- url.searchParams.set("utm_campaign", params.campaign);
583
- if (params.term !== void 0) {
584
- url.searchParams.set("utm_term", params.term);
585
- }
586
- if (params.content !== void 0) {
587
- url.searchParams.set("utm_content", params.content);
588
- }
589
- if (isRelative) {
590
- return url.href.replace(PLACEHOLDER_ORIGIN, "");
591
- }
592
- return url.href;
593
- }
594
-
595
- // src/web/utm/classifiers.ts
596
- var INTERNAL_PATTERNS = [
597
- /^\/(?!\/)/,
598
- // Relative paths
599
- /^https?:\/\/(www\.)?sales-mind\.ai/i,
600
- // Marketing site
601
- /^https?:\/\/app\.sales-mind\.ai/i,
602
- // Web app
603
- /^https?:\/\/apps\.sales-mind\.ai/i,
604
- // Web app (legacy)
605
- /^https?:\/\/meet\.sales-mind\.ai/i,
606
- // Booking
607
- /^https?:\/\/docs\.sales-mind\.ai/i
608
- // Docs
609
- ];
610
- var SYSTEM_PATTERNS = [
611
- /^https?:\/\/.*\/api\//i,
612
- // API endpoints
613
- /^https?:\/\/.*\/webhook/i,
614
- // Webhooks
615
- /^https?:\/\/.*\/oauth/i,
616
- // OAuth callbacks
617
- /^https?:\/\/.*\/callback/i,
618
- // Callbacks
619
- /^https?:\/\/.*\.supabase\.(co|com)/i,
620
- // Supabase
621
- /^https?:\/\/.*\.firebaseapp\.com/i,
622
- // Firebase
623
- /^https?:\/\/.*\.cloudfunctions\.net/i
624
- // Cloud Functions
625
- ];
626
- var ASSET_PATTERNS = [
627
- /\.(css|js|mjs|map|woff2?|ttf|eot|svg|png|jpe?g|gif|webp|avif|ico|pdf)(\?.*)?$/i
628
- ];
629
- var CONVERSION_PATTERNS = [
630
- /^https?:\/\/(www\.)?calendly\.com/i,
631
- /^https?:\/\/(checkout\.)?stripe\.com/i,
632
- /^https?:\/\/buy\.stripe\.com/i,
633
- /^https?:\/\/chromewebstore\.google\.com/i,
634
- /^https?:\/\/meet\.sales-mind\.ai/i
635
- ];
636
- var PROTOCOL_EXEMPT = [
637
- /^mailto:/i,
638
- /^tel:/i,
639
- /^#/,
640
- /^javascript:/i
641
- ];
642
- function classifyUrl(url) {
643
- if (PROTOCOL_EXEMPT.some((p) => p.test(url))) return "protocol";
644
- if (ASSET_PATTERNS.some((p) => p.test(url))) return "asset";
645
- if (SYSTEM_PATTERNS.some((p) => p.test(url))) return "system";
646
- if (CONVERSION_PATTERNS.some((p) => p.test(url))) return "conversion";
647
- if (INTERNAL_PATTERNS.some((p) => p.test(url))) return "internal";
648
- return "external";
649
- }
650
-
651
- // src/components/OutboundLink/outbound-link-utils.ts
652
- var LEGACY_UTM_SOURCE = "salesmind";
653
- var EXEMPT_PATTERNS = [
654
- /^https?:\/\/(www\.)?(stripe\.com|checkout\.stripe\.com|paypal\.com)/i,
655
- /^https?:\/\/(www\.)?github\.com\/login\/oauth/i
656
- ];
657
- var isExemptUrl = (urlStr) => {
658
- if (urlStr.startsWith("mailto:") || urlStr.startsWith("tel:")) return true;
659
- const classification = classifyUrl(urlStr);
660
- if (classification === "system" || classification === "protocol" || classification === "asset") {
661
- return true;
662
- }
663
- return EXEMPT_PATTERNS.some((pattern) => pattern.test(urlStr));
664
- };
665
- var appendGovernedUTMs = (href, params, preserveExisting = true) => {
666
- try {
667
- const url = new URL(href);
668
- if (preserveExisting) {
669
- const hasAll = url.searchParams.has("utm_source") && url.searchParams.has("utm_medium") && url.searchParams.has("utm_campaign");
670
- if (hasAll) return href;
671
- }
672
- return buildUtmUrl(href, params);
673
- } catch {
674
- return href;
675
- }
676
- };
677
- var appendUTMs = (href, context, pageSlug, options) => {
678
- try {
679
- const url = new URL(href);
680
- const { mediumOverride = "outbound_link", campaignOverride, preserveExisting = true } = options;
681
- const utms = {
682
- utm_source: LEGACY_UTM_SOURCE,
683
- utm_medium: mediumOverride,
684
- utm_campaign: campaignOverride || pageSlug,
685
- utm_content: context
686
- };
687
- Object.entries(utms).forEach(([key, value]) => {
688
- if (value) {
689
- if (preserveExisting && url.searchParams.has(key)) {
690
- return;
691
- }
692
- url.searchParams.set(key, value);
693
- }
694
- });
695
- return url.toString();
696
- } catch {
697
- return href;
698
- }
699
- };
700
- var OutboundLink = forwardRef(
701
- ({
702
- href,
703
- context,
704
- campaignOverride,
705
- mediumOverride = "outbound_link",
706
- preserveExistingUTM = true,
707
- openInNewTab = true,
708
- disableTracking = false,
709
- utmParams,
710
- onClick,
711
- children,
712
- ...props
713
- }, ref) => {
714
- const contextParams = useUtmDefaults();
715
- const resolvedUtmParams = utmParams ?? contextParams;
716
- let hostname = "";
717
- try {
718
- const url = new URL(href);
719
- hostname = url.hostname;
720
- } catch {
721
- }
722
- const [finalHref, setFinalHref] = useState(href);
723
- useEffect(() => {
724
- let isExternal = false;
725
- let currentMedium = mediumOverride;
726
- try {
727
- const url = new URL(href);
728
- const currentHost = window.location.hostname;
729
- isExternal = url.hostname !== currentHost;
730
- if (isExternal && currentHost.includes("sales-mind.ai") && url.hostname.includes("sales-mind.ai")) {
731
- if (currentMedium === "outbound_link") {
732
- currentMedium = "cross_subdomain";
733
- }
734
- }
735
- } catch {
736
- isExternal = false;
737
- }
738
- const isExempt = isExemptUrl(href) || disableTracking;
739
- if (isExternal && !isExempt) {
740
- if (resolvedUtmParams) {
741
- setFinalHref(appendGovernedUTMs(href, resolvedUtmParams, preserveExistingUTM));
742
- } else {
743
- const pageSlug = window.location.pathname.replace(/^\/|\/$/g, "") || "home";
744
- setFinalHref(appendUTMs(href, context, pageSlug, {
745
- mediumOverride: currentMedium,
746
- campaignOverride,
747
- preserveExisting: preserveExistingUTM
748
- }));
749
- }
750
- } else {
751
- setFinalHref(href);
752
- }
753
- }, [href, context, mediumOverride, campaignOverride, preserveExistingUTM, disableTracking, resolvedUtmParams]);
754
- const handleClick = (e) => {
755
- if (typeof window === "undefined" || disableTracking) {
756
- onClick?.(e);
757
- return;
758
- }
759
- let clickExternal = false;
760
- let clickCrossSubdomain = false;
761
- let clickMedium = mediumOverride;
762
- try {
763
- const url = new URL(href);
764
- const currentHost = window.location.hostname;
765
- clickExternal = url.hostname !== currentHost;
766
- if (clickExternal && currentHost.includes("sales-mind.ai") && url.hostname.includes("sales-mind.ai")) {
767
- clickCrossSubdomain = true;
768
- if (clickMedium === "outbound_link") {
769
- clickMedium = "cross_subdomain";
770
- }
771
- }
772
- } catch {
773
- }
774
- if (clickExternal) {
775
- const detail = {
776
- destination_domain: hostname,
777
- destination_url: finalHref,
778
- utm_medium_type: clickMedium,
779
- page_slug: window.location.pathname,
780
- component_location: context,
781
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
782
- is_cross_subdomain: clickCrossSubdomain
783
- };
784
- const event = new CustomEvent("outbound_click", { detail });
785
- window.dispatchEvent(event);
786
- }
787
- onClick?.(e);
788
- };
789
- const relParts = [];
790
- let shouldOpenNewTab = openInNewTab;
791
- try {
792
- const url = new URL(href);
793
- if (typeof window !== "undefined") {
794
- const currentHost = window.location.hostname;
795
- if (url.hostname !== currentHost && currentHost.includes("sales-mind.ai") && url.hostname.includes("sales-mind.ai")) {
796
- shouldOpenNewTab = false;
797
- }
798
- }
799
- } catch {
800
- }
801
- if (shouldOpenNewTab) relParts.push("noopener", "noreferrer");
802
- if (mediumOverride === "citation") relParts.push("nofollow");
803
- const rel = relParts.length > 0 ? relParts.join(" ") : void 0;
804
- return (
805
- // eslint-disable-next-line no-restricted-syntax
806
- /* @__PURE__ */ jsx(
807
- "a",
808
- {
809
- ref,
810
- href: finalHref,
811
- target: shouldOpenNewTab ? "_blank" : void 0,
812
- rel,
813
- onClick: handleClick,
814
- ...props,
815
- children
816
- }
817
- )
818
- );
819
- }
820
- );
821
- OutboundLink.displayName = "OutboundLink";
822
- var IntentCTA = forwardRef(
823
- ({
824
- stages,
825
- defaultCta,
826
- pageCount = 0,
827
- className,
828
- ...props
829
- }, ref) => {
830
- const [activeStageIndex, setActiveStageIndex] = useState(-1);
831
- const timeRef = useRef(0);
832
- const timerRef = useRef(null);
833
- const pageCountRef = useRef(pageCount);
834
- useEffect(() => {
835
- pageCountRef.current = pageCount;
836
- }, [pageCount]);
837
- useEffect(() => {
838
- if (typeof window === "undefined") return;
839
- timerRef.current = setInterval(() => {
840
- timeRef.current += 1;
841
- checkStages();
842
- }, 1e3);
843
- const handleScroll = () => {
844
- checkStages();
845
- };
846
- window.addEventListener("scroll", handleScroll, { passive: true });
847
- function checkStages() {
848
- const scrollPercent = typeof document !== "undefined" ? Math.round(
849
- window.scrollY / (document.documentElement.scrollHeight - window.innerHeight) * 100
850
- ) : 0;
851
- let highestTriggered = -1;
852
- for (let i = 0; i < stages.length; i++) {
853
- const stage = stages[i];
854
- let triggered = false;
855
- switch (stage.trigger.type) {
856
- case "scroll":
857
- triggered = scrollPercent >= stage.trigger.threshold;
858
- break;
859
- case "time":
860
- triggered = timeRef.current >= stage.trigger.threshold;
861
- break;
862
- case "pages":
863
- triggered = pageCountRef.current >= stage.trigger.threshold;
864
- break;
865
- }
866
- if (triggered) highestTriggered = i;
867
- }
868
- setActiveStageIndex((prev) => Math.max(prev, highestTriggered));
869
- }
870
- checkStages();
871
- return () => {
872
- window.removeEventListener("scroll", handleScroll);
873
- if (timerRef.current) clearInterval(timerRef.current);
874
- };
875
- }, [stages]);
876
- const activeCta = activeStageIndex >= 0 ? stages[activeStageIndex] : defaultCta;
877
- return /* @__PURE__ */ jsx(
878
- "div",
879
- {
880
- ref,
881
- className: clsx14("ds-intent-cta", className),
882
- ...props,
883
- children: /* @__PURE__ */ jsx(
884
- Button,
885
- {
886
- variant: activeCta.variant ?? "primary",
887
- asChild: true,
888
- children: /* @__PURE__ */ jsx(OutboundLink, { href: activeCta.href, context: "intent-cta", openInNewTab: false, children: activeCta.label })
889
- }
890
- )
891
- }
892
- );
893
- }
894
- );
895
- IntentCTA.displayName = "IntentCTA";
896
- var AnalyticsContext = createContext(null);
897
-
898
- // src/web/analytics/use-analytics.tsx
899
- var NOOP_VALUE = {
900
- track: () => {
901
- }
902
- };
903
- function useAnalytics() {
904
- return useContext(AnalyticsContext) ?? NOOP_VALUE;
905
- }
906
- var StickyActionBar = forwardRef(
907
- ({
908
- message,
909
- primaryAction,
910
- secondaryAction,
911
- showThreshold = 300,
912
- position = "bottom",
913
- variant = "glass",
914
- className,
915
- ...props
916
- }, ref) => {
917
- const [isVisible, setIsVisible] = useState(false);
918
- const { track } = useAnalytics();
919
- useEffect(() => {
920
- const handleScroll = () => {
921
- const shouldShow = window.scrollY > showThreshold;
922
- if (shouldShow && !isVisible) {
923
- setIsVisible(true);
924
- track("sticky_bar_show");
925
- } else if (!shouldShow && isVisible) {
926
- setIsVisible(false);
927
- }
928
- };
929
- window.addEventListener("scroll", handleScroll, { passive: true });
930
- handleScroll();
931
- return () => window.removeEventListener("scroll", handleScroll);
932
- }, [showThreshold, isVisible, track]);
933
- if (!isVisible) return null;
934
- return /* @__PURE__ */ jsx(
935
- "div",
936
- {
937
- ref,
938
- className: clsx14(
939
- "ds-sticky-action-bar",
940
- `ds-sticky-action-bar--${position}`,
941
- `ds-sticky-action-bar--${variant}`,
942
- className
943
- ),
944
- ...props,
945
- children: /* @__PURE__ */ jsxs("div", { className: "ds-sticky-action-bar__container", children: [
946
- /* @__PURE__ */ jsx("div", { className: "ds-sticky-action-bar__content", children: message }),
947
- /* @__PURE__ */ jsxs("div", { className: "ds-sticky-action-bar__actions", children: [
948
- secondaryAction,
949
- primaryAction
950
- ] })
951
- ] })
952
- }
953
- );
954
- }
955
- );
956
- StickyActionBar.displayName = "StickyActionBar";
957
- var Dialog = Dialog$1.Root;
958
- Dialog$1.Trigger;
959
- Dialog$1.Close;
960
- var DialogTitle = React31.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(Dialog$1.Title, { ref, className: clsx14("ds-dialog__title", className), ...props }));
961
- DialogTitle.displayName = "DialogTitle";
962
- var DialogDescription = React31.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
963
- Dialog$1.Description,
964
- {
965
- ref,
966
- className: clsx14("ds-dialog__description", className),
967
- ...props
968
- }
969
- ));
970
- DialogDescription.displayName = "DialogDescription";
971
- var DialogContent = React31.forwardRef(
972
- ({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(Dialog$1.Portal, { children: [
973
- /* @__PURE__ */ jsx(Dialog$1.Backdrop, { className: "ds-dialog__backdrop" }),
974
- /* @__PURE__ */ jsx(Dialog$1.Popup, { ref, className: clsx14("ds-dialog__content", className), ...props, children })
975
- ] })
976
- );
977
- DialogContent.displayName = "DialogContent";
978
- var DialogHeader = React31.forwardRef(
979
- ({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: clsx14("ds-dialog__header", className), ...props })
980
- );
981
- DialogHeader.displayName = "DialogHeader";
982
- var DialogFooter = React31.forwardRef(
983
- ({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: clsx14("ds-dialog__footer", className), ...props })
984
- );
985
- DialogFooter.displayName = "DialogFooter";
986
- var DEFAULT_SUPPRESSION = 7 * 24 * 60 * 60 * 1e3;
987
- var DEFAULT_ACTIVATION_DELAY = 5e3;
988
- var MOBILE_INACTIVITY_TIMEOUT = 45e3;
989
- function isSuppressed(key, duration) {
990
- if (typeof window === "undefined") return true;
991
- try {
992
- const ts = localStorage.getItem(key);
993
- if (!ts) return false;
994
- return Date.now() - Number(ts) < duration;
995
- } catch {
996
- return false;
997
- }
998
- }
999
- function suppress(key) {
1000
- try {
1001
- localStorage.setItem(key, String(Date.now()));
1002
- } catch {
1003
- }
1004
- }
1005
- function isMobile() {
1006
- if (typeof window === "undefined") return false;
1007
- return window.matchMedia("(max-width: 768px)").matches || "ontouchstart" in window;
1008
- }
1009
- var ExitIntentOverlay = forwardRef(
1010
- ({
1011
- children,
1012
- enabled = true,
1013
- activationDelay = DEFAULT_ACTIVATION_DELAY,
1014
- excludePaths,
1015
- storageKey = "ds-exit-intent",
1016
- suppressionDuration = DEFAULT_SUPPRESSION,
1017
- onShow,
1018
- onDismiss,
1019
- className,
1020
- ...props
1021
- }, ref) => {
1022
- const [open, setOpen] = useState(false);
1023
- const activatedRef = useRef(false);
1024
- const shownRef = useRef(false);
1025
- const show = useCallback(() => {
1026
- if (shownRef.current) return;
1027
- shownRef.current = true;
1028
- setOpen(true);
1029
- onShow?.();
1030
- }, [onShow]);
1031
- const handleDismiss = useCallback(() => {
1032
- setOpen(false);
1033
- suppress(storageKey);
1034
- onDismiss?.();
1035
- }, [storageKey, onDismiss]);
1036
- useEffect(() => {
1037
- if (!enabled) return;
1038
- if (typeof window === "undefined") return;
1039
- if (excludePaths?.some((p) => window.location.pathname.startsWith(p))) return;
1040
- if (isSuppressed(storageKey, suppressionDuration)) return;
1041
- const activationTimer = setTimeout(() => {
1042
- activatedRef.current = true;
1043
- }, activationDelay);
1044
- const handleMouseOut = (e) => {
1045
- if (!activatedRef.current) return;
1046
- if (e.clientY < 10 && e.relatedTarget === null) {
1047
- show();
1048
- }
1049
- };
1050
- let mobileTimer = null;
1051
- const resetMobileTimer = () => {
1052
- if (mobileTimer) clearTimeout(mobileTimer);
1053
- if (!activatedRef.current) return;
1054
- mobileTimer = setTimeout(show, MOBILE_INACTIVITY_TIMEOUT);
1055
- };
1056
- if (isMobile()) {
1057
- const mobileStart = setTimeout(() => {
1058
- resetMobileTimer();
1059
- document.addEventListener("touchstart", resetMobileTimer, { passive: true });
1060
- document.addEventListener("scroll", resetMobileTimer, { passive: true });
1061
- }, activationDelay);
1062
- return () => {
1063
- clearTimeout(activationTimer);
1064
- clearTimeout(mobileStart);
1065
- if (mobileTimer) clearTimeout(mobileTimer);
1066
- document.removeEventListener("touchstart", resetMobileTimer);
1067
- document.removeEventListener("scroll", resetMobileTimer);
1068
- };
1069
- }
1070
- document.addEventListener("mouseout", handleMouseOut);
1071
- return () => {
1072
- clearTimeout(activationTimer);
1073
- document.removeEventListener("mouseout", handleMouseOut);
1074
- };
1075
- }, [enabled, activationDelay, excludePaths, storageKey, suppressionDuration, show]);
1076
- return /* @__PURE__ */ jsx("div", { ref, className: clsx14("ds-exit-intent-overlay", className), ...props, children: /* @__PURE__ */ jsx(Dialog, { open, onOpenChange: (isOpen) => {
1077
- if (!isOpen) handleDismiss();
1078
- }, children: /* @__PURE__ */ jsx(DialogContent, { className: "ds-exit-intent-overlay__dialog", children }) }) });
1079
- }
1080
- );
1081
- ExitIntentOverlay.displayName = "ExitIntentOverlay";
1082
- var TextField = React31.forwardRef(
1083
- ({ className, label, error, helperText, endAdornment, id, ...props }, ref) => {
1084
- const generatedId = React31.useId();
1085
- const inputId = id || generatedId;
1086
- return /* @__PURE__ */ jsxs("div", { className: clsx14("ds-textfield", className), children: [
1087
- label && /* @__PURE__ */ jsx("label", { htmlFor: inputId, className: "ds-textfield__label", children: label }),
1088
- /* @__PURE__ */ jsxs("div", { className: "ds-textfield__input-wrapper", children: [
1089
- /* @__PURE__ */ jsx(
1090
- Input,
1091
- {
1092
- id: inputId,
1093
- ref,
1094
- className: clsx14(
1095
- "ds-textfield__input",
1096
- error && "ds-textfield__input--error",
1097
- endAdornment && "ds-textfield__input--adorned"
1098
- ),
1099
- ...props
1100
- }
1101
- ),
1102
- endAdornment && /* @__PURE__ */ jsx("div", { className: "ds-textfield__adornment", children: endAdornment })
1103
- ] }),
1104
- helperText && /* @__PURE__ */ jsx("span", { className: clsx14("ds-textfield__helper", error && "ds-textfield__helper--error"), children: helperText })
1105
- ] });
1106
- }
1107
- );
1108
- TextField.displayName = "TextField";
1109
- var LeadCaptureForm = forwardRef(
1110
- ({
1111
- buttonText = "Subscribe",
1112
- emailLabel = "Work Email",
1113
- emailPlaceholder = "you@company.com",
1114
- disclaimer,
1115
- onSubmitSuccess,
1116
- layout = "horizontal",
1117
- isLoading = false,
1118
- className,
1119
- onSubmit,
1120
- ...props
1121
- }, ref) => {
1122
- const [email, setEmail] = useState("");
1123
- const [error, setError] = useState();
1124
- const [internalLoading, setInternalLoading] = useState(false);
1125
- const { track } = useAnalytics();
1126
- const isCurrentlyLoading = isLoading || internalLoading;
1127
- const handleSubmit = async (e) => {
1128
- e.preventDefault();
1129
- if (!email) {
1130
- setError("Email is required");
1131
- return;
1132
- }
1133
- if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
1134
- setError("Please enter a valid email address");
1135
- return;
1136
- }
1137
- setError(void 0);
1138
- setInternalLoading(true);
1139
- track("lead_capture_submit", { email_domain: email.split("@")[1] });
1140
- try {
1141
- if (onSubmitSuccess) {
1142
- await onSubmitSuccess(email);
1143
- }
1144
- track("lead_capture_success");
1145
- } catch (err) {
1146
- setError("Something went wrong. Please try again.");
1147
- track("lead_capture_error", { error: String(err) });
1148
- } finally {
1149
- setInternalLoading(false);
1150
- }
1151
- if (onSubmit) {
1152
- onSubmit(e);
1153
- }
1154
- };
1155
- return /* @__PURE__ */ jsxs(
1156
- "form",
1157
- {
1158
- ref,
1159
- className: clsx14(
1160
- "ds-lead-capture",
1161
- `ds-lead-capture--${layout}`,
1162
- className
1163
- ),
1164
- onSubmit: handleSubmit,
1165
- noValidate: true,
1166
- ...props,
1167
- children: [
1168
- /* @__PURE__ */ jsxs("div", { className: "ds-lead-capture__inputs", children: [
1169
- /* @__PURE__ */ jsxs("div", { className: "ds-lead-capture__input-wrapper", children: [
1170
- layout === "vertical" && /* @__PURE__ */ jsx("label", { htmlFor: "lead-email", className: "ds-lead-capture__label", children: emailLabel }),
1171
- /* @__PURE__ */ jsx(
1172
- TextField,
1173
- {
1174
- id: "lead-email",
1175
- type: "email",
1176
- value: email,
1177
- onChange: (e) => setEmail(e.target.value),
1178
- placeholder: emailPlaceholder,
1179
- disabled: isCurrentlyLoading,
1180
- "aria-label": layout === "horizontal" ? emailLabel : void 0,
1181
- className: clsx14("ds-lead-capture__input", error && "ds-lead-capture__input--error")
1182
- }
1183
- ),
1184
- error && /* @__PURE__ */ jsx("div", { className: "ds-lead-capture__error", children: error })
1185
- ] }),
1186
- /* @__PURE__ */ jsx(
1187
- Button,
1188
- {
1189
- type: "submit",
1190
- isLoading: isCurrentlyLoading,
1191
- className: "ds-lead-capture__submit",
1192
- children: buttonText
1193
- }
1194
- )
1195
- ] }),
1196
- disclaimer && /* @__PURE__ */ jsx("div", { className: "ds-lead-capture__disclaimer", children: disclaimer })
1197
- ]
1198
- }
1199
- );
1200
- }
1201
- );
1202
- LeadCaptureForm.displayName = "LeadCaptureForm";
1203
- var BookingEmbed = forwardRef(
1204
- ({
1205
- url,
1206
- aspectRatio = "16/9",
1207
- title = "Book a call",
1208
- lazyLoad = true,
1209
- className,
1210
- style,
1211
- ...props
1212
- }, ref) => {
1213
- const [isLoaded, setIsLoaded] = useState(!lazyLoad);
1214
- const [isIframeLoaded, setIsIframeLoaded] = useState(false);
1215
- const containerRef = useRef(null);
1216
- const { track } = useAnalytics();
1217
- useEffect(() => {
1218
- if (!lazyLoad) return;
1219
- const observer = new IntersectionObserver(
1220
- (entries) => {
1221
- if (entries[0].isIntersecting) {
1222
- setIsLoaded(true);
1223
- track("booking_embed_visible", { url });
1224
- observer.disconnect();
1225
- }
1226
- },
1227
- { rootMargin: "200px" }
1228
- );
1229
- if (containerRef.current) {
1230
- observer.observe(containerRef.current);
1231
- }
1232
- return () => observer.disconnect();
1233
- }, [lazyLoad, url, track]);
1234
- const handleIframeLoad = () => {
1235
- setIsIframeLoaded(true);
1236
- track("booking_embed_loaded", { url });
1237
- };
1238
- return /* @__PURE__ */ jsxs(
1239
- "div",
1240
- {
1241
- ref: (node) => {
1242
- containerRef.current = node;
1243
- if (typeof ref === "function") ref(node);
1244
- else if (ref) ref.current = node;
1245
- },
1246
- className: clsx14("ds-booking-embed", className),
1247
- style: { "--embed-aspect-ratio": aspectRatio, ...style },
1248
- ...props,
1249
- children: [
1250
- !isIframeLoaded && /* @__PURE__ */ jsxs("div", { className: "ds-booking-embed__skeleton", children: [
1251
- /* @__PURE__ */ jsx("div", { className: "ds-booking-embed__spinner" }),
1252
- /* @__PURE__ */ jsx("p", { children: "Loading calendar..." })
1253
- ] }),
1254
- isLoaded && /* @__PURE__ */ jsx(
1255
- "iframe",
1256
- {
1257
- src: url,
1258
- title,
1259
- className: clsx14("ds-booking-embed__iframe", isIframeLoaded && "ds-booking-embed__iframe--loaded"),
1260
- onLoad: handleIframeLoad,
1261
- frameBorder: "0",
1262
- scrolling: "no"
1263
- }
1264
- )
1265
- ]
1266
- }
1267
- );
1268
- }
1269
- );
1270
- BookingEmbed.displayName = "BookingEmbed";
1271
-
1272
- // src/tokens/spacing.ts
1273
- var SPACING = {
1274
- 1: "var(--space-1)",
1275
- 2: "var(--space-2)",
1276
- 3: "var(--space-3)",
1277
- 4: "var(--space-4)",
1278
- 5: "var(--space-5)",
1279
- 6: "var(--space-6)",
1280
- 8: "var(--space-8)",
1281
- 10: "var(--space-10)",
1282
- 12: "var(--space-12)",
1283
- 16: "var(--space-16)",
1284
- 20: "var(--space-20)"
1285
- };
1286
-
1287
- // src/components/LayoutPrimitives/utils.ts
1288
- var SPACING_ALIASES = {
1289
- xs: "var(--space-2)",
1290
- sm: "var(--space-3)",
1291
- md: "var(--space-4)",
1292
- lg: "var(--space-6)",
1293
- xl: "var(--space-8)",
1294
- "2xl": "var(--space-12)"
1295
- };
1296
- function resolveSpacing(value) {
1297
- if (value === void 0) return void 0;
1298
- if (typeof value === "number" && SPACING[value]) {
1299
- return SPACING[value];
1300
- }
1301
- if (typeof value === "string" && value in SPACING_ALIASES) {
1302
- return SPACING_ALIASES[value];
1303
- }
1304
- return String(value);
1305
- }
1306
- function extractSpacingStyles(props) {
1307
- const styles = {};
1308
- if (props.m !== void 0) styles.margin = resolveSpacing(props.m);
1309
- if (props.mt !== void 0) styles.marginTop = resolveSpacing(props.mt);
1310
- if (props.mb !== void 0) styles.marginBottom = resolveSpacing(props.mb);
1311
- if (props.ml !== void 0) styles.marginLeft = resolveSpacing(props.ml);
1312
- if (props.mr !== void 0) styles.marginRight = resolveSpacing(props.mr);
1313
- if (props.mx !== void 0) {
1314
- styles.marginLeft = resolveSpacing(props.mx);
1315
- styles.marginRight = resolveSpacing(props.mx);
1316
- }
1317
- if (props.my !== void 0) {
1318
- styles.marginTop = resolveSpacing(props.my);
1319
- styles.marginBottom = resolveSpacing(props.my);
1320
- }
1321
- if (props.p !== void 0) styles.padding = resolveSpacing(props.p);
1322
- if (props.pt !== void 0) styles.paddingTop = resolveSpacing(props.pt);
1323
- if (props.pb !== void 0) styles.paddingBottom = resolveSpacing(props.pb);
1324
- if (props.pl !== void 0) styles.paddingLeft = resolveSpacing(props.pl);
1325
- if (props.pr !== void 0) styles.paddingRight = resolveSpacing(props.pr);
1326
- if (props.px !== void 0) {
1327
- styles.paddingLeft = resolveSpacing(props.px);
1328
- styles.paddingRight = resolveSpacing(props.px);
1329
- }
1330
- if (props.py !== void 0) {
1331
- styles.paddingTop = resolveSpacing(props.py);
1332
- styles.paddingBottom = resolveSpacing(props.py);
1333
- }
1334
- if (props.gap !== void 0) styles.gap = resolveSpacing(props.gap);
1335
- return styles;
1336
- }
1337
- var Box = forwardRef(
1338
- ({ as: Component = "div", className, style, children, ...props }, ref) => {
1339
- const spacingStyles = extractSpacingStyles(props);
1340
- const { m, mt, mb, ml, mr, mx, my, p, pt, pb, pl, pr, px, py, gap, ...domProps } = props;
1341
- return /* @__PURE__ */ jsx(
1342
- Component,
1343
- {
1344
- ref,
1345
- className: clsx14("ds-box", className),
1346
- style: { ...spacingStyles, ...style },
1347
- ...domProps,
1348
- children
1349
- }
1350
- );
1351
- }
1352
- );
1353
- Box.displayName = "Box";
1354
- var CONTAINER_SIZE_MAP = {
1355
- sm: "768px",
1356
- // 48rem — max-w-3xl
1357
- md: "1024px",
1358
- // 64rem — max-w-5xl
1359
- lg: "1152px",
1360
- // 72rem — max-w-6xl
1361
- xl: "1280px",
1362
- // 80rem — max-w-7xl
1363
- full: "100%"
1364
- };
1365
- var Container = forwardRef(
1366
- ({ size, fluid, maxWidth, className, style, ...props }, ref) => {
1367
- let resolvedMaxWidth;
1368
- if (fluid) {
1369
- resolvedMaxWidth = "100%";
1370
- } else if (size) {
1371
- resolvedMaxWidth = CONTAINER_SIZE_MAP[size];
1372
- } else {
1373
- resolvedMaxWidth = maxWidth || "var(--container-default-max, 1200px)";
1374
- }
1375
- return /* @__PURE__ */ jsx(
1376
- Box,
1377
- {
1378
- ref,
1379
- className: clsx14("ds-container", className),
1380
- style: {
1381
- maxWidth: resolvedMaxWidth,
1382
- ...style
1383
- },
1384
- ...props
1385
- }
1386
- );
1387
- }
1388
- );
1389
- Container.displayName = "Container";
1390
- var SectionHeader = forwardRef(
1391
- ({ title, subtitle, eyebrow, align = "center", className, ...props }, ref) => {
1392
- if (!title && !subtitle && !eyebrow) return null;
1393
- return /* @__PURE__ */ jsxs(
1394
- "header",
1395
- {
1396
- ref,
1397
- className: clsx14("ds-section-header", `ds-section-header--${align}`, className),
1398
- ...props,
1399
- children: [
1400
- eyebrow && /* @__PURE__ */ jsx("span", { className: "ds-section-header__eyebrow", children: eyebrow }),
1401
- title && /* @__PURE__ */ jsx("h2", { className: "ds-section-header__title", children: title }),
1402
- subtitle && /* @__PURE__ */ jsx("p", { className: "ds-section-header__subtitle", children: subtitle })
1403
- ]
1404
- }
1405
- );
1406
- }
1407
- );
1408
- SectionHeader.displayName = "SectionHeader";
1409
- var SectionShell = forwardRef(
1410
- ({
1411
- className,
1412
- children,
1413
- background = "default",
1414
- padding = "md",
1415
- containerSize,
1416
- containerFluid = false,
1417
- ...props
1418
- }, ref) => {
1419
- return /* @__PURE__ */ jsx(
1420
- "section",
1421
- {
1422
- ref,
1423
- className: clsx14(
1424
- "ds-section",
1425
- `ds-section--bg-${background}`,
1426
- `ds-section--padding-${padding}`,
1427
- className
1428
- ),
1429
- ...props,
1430
- children: /* @__PURE__ */ jsx(
1431
- Container,
1432
- {
1433
- size: containerSize === "fluid" ? "full" : containerSize,
1434
- fluid: containerFluid || containerSize === "fluid",
1435
- children
1436
- }
1437
- )
1438
- }
1439
- );
1440
- }
1441
- );
1442
- SectionShell.displayName = "SectionShell";
1443
- var CompetitorDiff = forwardRef(
1444
- ({
1445
- eyebrow,
1446
- title,
1447
- subtitle,
1448
- items,
1449
- competitorLabel = "Others",
1450
- ourLabel = "SalesMind AI",
1451
- variant = "table",
1452
- cta,
1453
- className,
1454
- ...props
1455
- }, ref) => {
1456
- return /* @__PURE__ */ jsxs(
1457
- SectionShell,
1458
- {
1459
- ref,
1460
- className: clsx14("ds-competitor-diff", className),
1461
- ...props,
1462
- children: [
1463
- /* @__PURE__ */ jsx(SectionHeader, { eyebrow, title, subtitle }),
1464
- variant === "table" && /* @__PURE__ */ jsxs("div", { className: "ds-competitor-diff__table", role: "table", "aria-label": "Feature comparison", children: [
1465
- /* @__PURE__ */ jsxs("div", { className: "ds-competitor-diff__thead", role: "row", children: [
1466
- /* @__PURE__ */ jsx("div", { className: "ds-competitor-diff__th", role: "columnheader" }),
1467
- /* @__PURE__ */ jsx("div", { className: "ds-competitor-diff__th ds-competitor-diff__th--them", role: "columnheader", children: competitorLabel }),
1468
- /* @__PURE__ */ jsx("div", { className: "ds-competitor-diff__th ds-competitor-diff__th--us", role: "columnheader", children: ourLabel })
1469
- ] }),
1470
- items.map((item, i) => /* @__PURE__ */ jsxs("div", { className: "ds-competitor-diff__row", role: "row", children: [
1471
- /* @__PURE__ */ jsx("div", { className: "ds-competitor-diff__dimension", role: "rowheader", children: item.dimension }),
1472
- /* @__PURE__ */ jsxs("div", { className: "ds-competitor-diff__cell ds-competitor-diff__cell--them", role: "cell", children: [
1473
- /* @__PURE__ */ jsx("span", { className: "ds-competitor-diff__icon", "aria-hidden": "true", children: "\u2717" }),
1474
- item.them
1475
- ] }),
1476
- /* @__PURE__ */ jsxs("div", { className: "ds-competitor-diff__cell ds-competitor-diff__cell--us", role: "cell", children: [
1477
- /* @__PURE__ */ jsx("span", { className: "ds-competitor-diff__icon", "aria-hidden": "true", children: "\u2713" }),
1478
- item.us
1479
- ] })
1480
- ] }, i))
1481
- ] }),
1482
- variant === "cards" && /* @__PURE__ */ jsxs("div", { className: "ds-competitor-diff__cards", children: [
1483
- /* @__PURE__ */ jsxs("div", { className: "ds-competitor-diff__card ds-competitor-diff__card--them", children: [
1484
- /* @__PURE__ */ jsx("h3", { className: "ds-competitor-diff__card-label", children: competitorLabel }),
1485
- /* @__PURE__ */ jsx("ul", { className: "ds-competitor-diff__card-list", children: items.map((item, i) => /* @__PURE__ */ jsxs("li", { children: [
1486
- /* @__PURE__ */ jsxs("strong", { children: [
1487
- item.dimension,
1488
- ":"
1489
- ] }),
1490
- " ",
1491
- item.them
1492
- ] }, i)) })
1493
- ] }),
1494
- /* @__PURE__ */ jsxs("div", { className: "ds-competitor-diff__card ds-competitor-diff__card--us", children: [
1495
- /* @__PURE__ */ jsx("h3", { className: "ds-competitor-diff__card-label", children: ourLabel }),
1496
- /* @__PURE__ */ jsx("ul", { className: "ds-competitor-diff__card-list", children: items.map((item, i) => /* @__PURE__ */ jsxs("li", { children: [
1497
- /* @__PURE__ */ jsxs("strong", { children: [
1498
- item.dimension,
1499
- ":"
1500
- ] }),
1501
- " ",
1502
- item.us
1503
- ] }, i)) })
1504
- ] })
1505
- ] }),
1506
- variant === "narrative" && /* @__PURE__ */ jsx("div", { className: "ds-competitor-diff__narrative", children: items.map((item, i) => /* @__PURE__ */ jsxs("div", { className: "ds-competitor-diff__narrative-item", children: [
1507
- /* @__PURE__ */ jsxs("p", { className: "ds-competitor-diff__narrative-them", children: [
1508
- /* @__PURE__ */ jsx("span", { className: "ds-competitor-diff__narrative-label", children: "Instead of" }),
1509
- " ",
1510
- item.them
1511
- ] }),
1512
- /* @__PURE__ */ jsxs("p", { className: "ds-competitor-diff__narrative-us", children: [
1513
- /* @__PURE__ */ jsx("span", { className: "ds-competitor-diff__narrative-label", children: ourLabel }),
1514
- " ",
1515
- item.us
1516
- ] })
1517
- ] }, i)) }),
1518
- cta && /* @__PURE__ */ jsx("div", { className: "ds-competitor-diff__cta", children: /* @__PURE__ */ jsx(Button, { variant: "primary", asChild: true, children: /* @__PURE__ */ jsx(OutboundLink, { href: cta.href, context: "competitor-diff-cta", openInNewTab: false, children: cta.label }) }) })
1519
- ]
1520
- }
1521
- );
1522
- }
1523
- );
1524
- CompetitorDiff.displayName = "CompetitorDiff";
1525
- var BeforeAfterBlock = forwardRef(
1526
- ({
1527
- eyebrow,
1528
- title,
1529
- before,
1530
- after,
1531
- variant = "split",
1532
- className,
1533
- ...props
1534
- }, ref) => {
1535
- const renderItems = (items, side) => items.map((item, i) => /* @__PURE__ */ jsxs(
1536
- "li",
1537
- {
1538
- className: clsx14(
1539
- "ds-before-after__item",
1540
- item.sentiment && `ds-before-after__item--${item.sentiment}`
1541
- ),
1542
- children: [
1543
- /* @__PURE__ */ jsx("span", { className: "ds-before-after__item-icon", "aria-hidden": "true", children: side === "before" ? "\u2717" : "\u2713" }),
1544
- /* @__PURE__ */ jsx("span", { children: item.text })
1545
- ]
1546
- },
1547
- i
1548
- ));
1549
- return /* @__PURE__ */ jsxs(
1550
- SectionShell,
1551
- {
1552
- ref,
1553
- className: clsx14("ds-before-after", className),
1554
- ...props,
1555
- children: [
1556
- /* @__PURE__ */ jsx(SectionHeader, { eyebrow, title }),
1557
- /* @__PURE__ */ jsxs("div", { className: clsx14("ds-before-after__layout", `ds-before-after__layout--${variant}`), children: [
1558
- /* @__PURE__ */ jsxs("div", { className: "ds-before-after__column ds-before-after__column--before", children: [
1559
- /* @__PURE__ */ jsx("h3", { className: "ds-before-after__label", children: before.label }),
1560
- /* @__PURE__ */ jsx("ul", { className: "ds-before-after__list", children: renderItems(before.items, "before") }),
1561
- before.media && /* @__PURE__ */ jsx("div", { className: "ds-before-after__media", children: before.media })
1562
- ] }),
1563
- variant === "split" && /* @__PURE__ */ jsx("div", { className: "ds-before-after__divider", "aria-hidden": "true", children: /* @__PURE__ */ jsx("span", { className: "ds-before-after__arrow", children: "\u2192" }) }),
1564
- /* @__PURE__ */ jsxs("div", { className: "ds-before-after__column ds-before-after__column--after", children: [
1565
- /* @__PURE__ */ jsx("h3", { className: "ds-before-after__label", children: after.label }),
1566
- /* @__PURE__ */ jsx("ul", { className: "ds-before-after__list", children: renderItems(after.items, "after") }),
1567
- after.media && /* @__PURE__ */ jsx("div", { className: "ds-before-after__media", children: after.media })
1568
- ] })
1569
- ] })
1570
- ]
1571
- }
1572
- );
1573
- }
1574
- );
1575
- BeforeAfterBlock.displayName = "BeforeAfterBlock";
1576
- var Slider = React31.forwardRef(
1577
- ({
1578
- className,
1579
- value: controlledValue,
1580
- defaultValue = 50,
1581
- min = 0,
1582
- max = 100,
1583
- step = 1,
1584
- onValueChange,
1585
- disabled = false,
1586
- ...props
1587
- }, ref) => {
1588
- const [uncontrolledValue, setUncontrolledValue] = React31.useState(defaultValue);
1589
- const isControlled = controlledValue !== void 0;
1590
- const value = isControlled ? controlledValue : uncontrolledValue;
1591
- const handleChange = (e) => {
1592
- const next = Number(e.target.value);
1593
- if (!isControlled) {
1594
- setUncontrolledValue(next);
1595
- }
1596
- onValueChange?.(next);
1597
- };
1598
- const percentage = (value - min) / (max - min) * 100;
1599
- return /* @__PURE__ */ jsxs(
1600
- "div",
1601
- {
1602
- ref,
1603
- className: clsx14("ds-slider", disabled && "ds-slider--disabled", className),
1604
- ...props,
1605
- children: [
1606
- /* @__PURE__ */ jsx("div", { className: "ds-slider__track", children: /* @__PURE__ */ jsx(
1607
- "div",
1608
- {
1609
- className: "ds-slider__range",
1610
- style: { width: `${percentage}%` }
1611
- }
1612
- ) }),
1613
- /* @__PURE__ */ jsx(
1614
- "input",
1615
- {
1616
- type: "range",
1617
- className: "ds-slider__thumb",
1618
- role: "slider",
1619
- min,
1620
- max,
1621
- step,
1622
- value,
1623
- disabled,
1624
- onChange: handleChange,
1625
- "aria-valuemin": min,
1626
- "aria-valuemax": max,
1627
- "aria-valuenow": value
1628
- }
1629
- )
1630
- ]
1631
- }
1632
- );
1633
- }
1634
- );
1635
- Slider.displayName = "Slider";
1636
- function formatNumber(n, prefix, suffix) {
1637
- const formatted = n >= 1e3 ? n.toLocaleString("en-US", { maximumFractionDigits: 0 }) : String(Math.round(n * 10) / 10);
1638
- return `${prefix ?? ""}${formatted}${suffix ?? ""}`;
1639
- }
1640
- var ValueAnchor = forwardRef(
1641
- ({
1642
- eyebrow,
1643
- title,
1644
- subtitle,
1645
- inputs,
1646
- calculate,
1647
- cta,
1648
- className,
1649
- ...props
1650
- }, ref) => {
1651
- const initialValues = useMemo(() => {
1652
- const vals = {};
1653
- inputs.forEach((inp) => {
1654
- vals[inp.name] = inp.defaultValue;
1655
- });
1656
- return vals;
1657
- }, [inputs]);
1658
- const [values, setValues] = useState(initialValues);
1659
- const handleChange = useCallback((name, value) => {
1660
- setValues((prev) => ({ ...prev, [name]: value }));
1661
- }, []);
1662
- const output = useMemo(() => calculate(values), [values, calculate]);
1663
- return /* @__PURE__ */ jsxs(
1664
- SectionShell,
1665
- {
1666
- ref,
1667
- className: clsx14("ds-value-anchor", className),
1668
- ...props,
1669
- children: [
1670
- /* @__PURE__ */ jsx(SectionHeader, { eyebrow, title, subtitle }),
1671
- /* @__PURE__ */ jsxs("div", { className: "ds-value-anchor__layout", children: [
1672
- /* @__PURE__ */ jsx("div", { className: "ds-value-anchor__inputs", children: inputs.map((input) => /* @__PURE__ */ jsxs("div", { className: "ds-value-anchor__input-group", children: [
1673
- /* @__PURE__ */ jsxs("label", { className: "ds-value-anchor__input-label", children: [
1674
- input.label,
1675
- /* @__PURE__ */ jsx("span", { className: "ds-value-anchor__input-value", children: formatNumber(values[input.name], input.prefix, input.suffix) })
1676
- ] }),
1677
- input.type === "slider" ? /* @__PURE__ */ jsx(
1678
- Slider,
1679
- {
1680
- value: values[input.name],
1681
- min: input.min ?? 0,
1682
- max: input.max ?? 100,
1683
- step: input.step ?? 1,
1684
- onValueChange: (v) => handleChange(input.name, v)
1685
- }
1686
- ) : /* @__PURE__ */ jsx(
1687
- TextField,
1688
- {
1689
- type: "number",
1690
- value: String(values[input.name]),
1691
- onChange: (e) => handleChange(input.name, Number(e.target.value) || 0)
1692
- }
1693
- )
1694
- ] }, input.name)) }),
1695
- /* @__PURE__ */ jsxs("div", { className: "ds-value-anchor__output", children: [
1696
- /* @__PURE__ */ jsxs("div", { className: "ds-value-anchor__primary", children: [
1697
- /* @__PURE__ */ jsx("span", { className: "ds-value-anchor__primary-value", children: formatNumber(output.primaryMetric.value, output.primaryMetric.prefix, output.primaryMetric.suffix) }),
1698
- /* @__PURE__ */ jsx("span", { className: "ds-value-anchor__primary-label", children: output.primaryMetric.label })
1699
- ] }),
1700
- output.secondaryMetrics.length > 0 && /* @__PURE__ */ jsx("div", { className: "ds-value-anchor__secondary", children: output.secondaryMetrics.map((m, i) => /* @__PURE__ */ jsxs("div", { className: "ds-value-anchor__secondary-metric", children: [
1701
- /* @__PURE__ */ jsx("span", { className: "ds-value-anchor__secondary-value", children: formatNumber(m.value, m.prefix, m.suffix) }),
1702
- /* @__PURE__ */ jsx("span", { className: "ds-value-anchor__secondary-label", children: m.label })
1703
- ] }, i)) }),
1704
- output.costComparison && /* @__PURE__ */ jsxs("div", { className: "ds-value-anchor__comparison", children: [
1705
- /* @__PURE__ */ jsxs("div", { className: "ds-value-anchor__comparison-col ds-value-anchor__comparison-col--without", children: [
1706
- /* @__PURE__ */ jsx("span", { className: "ds-value-anchor__comparison-value", children: formatNumber(output.costComparison.without.value, "$") }),
1707
- /* @__PURE__ */ jsx("span", { className: "ds-value-anchor__comparison-label", children: output.costComparison.without.label })
1708
- ] }),
1709
- /* @__PURE__ */ jsxs("div", { className: "ds-value-anchor__comparison-col ds-value-anchor__comparison-col--with", children: [
1710
- /* @__PURE__ */ jsx("span", { className: "ds-value-anchor__comparison-value", children: formatNumber(output.costComparison.with.value, "$") }),
1711
- /* @__PURE__ */ jsx("span", { className: "ds-value-anchor__comparison-label", children: output.costComparison.with.label })
1712
- ] }),
1713
- /* @__PURE__ */ jsxs("div", { className: "ds-value-anchor__savings", children: [
1714
- /* @__PURE__ */ jsx("span", { className: "ds-value-anchor__savings-value", children: formatNumber(output.costComparison.savings.value, "$") }),
1715
- /* @__PURE__ */ jsx("span", { className: "ds-value-anchor__savings-label", children: output.costComparison.savings.label })
1716
- ] })
1717
- ] })
1718
- ] })
1719
- ] }),
1720
- cta && /* @__PURE__ */ jsx("div", { className: "ds-value-anchor__cta", children: /* @__PURE__ */ jsx(Button, { variant: "primary", size: "lg", asChild: true, children: /* @__PURE__ */ jsx(OutboundLink, { href: cta.href, context: "value-anchor-cta", openInNewTab: false, children: cta.label }) }) })
1721
- ]
1722
- }
1723
- );
1724
- }
1725
- );
1726
- ValueAnchor.displayName = "ValueAnchor";
1727
- var STATUS_LABELS = {
1728
- active: "Active",
1729
- "in-progress": "In Progress",
1730
- planned: "Planned"
1731
- };
1732
- var EnterpriseSignaling = forwardRef(
1733
- ({
1734
- eyebrow,
1735
- title,
1736
- subtitle,
1737
- categories,
1738
- sla,
1739
- variant = "full",
1740
- className,
1741
- ...props
1742
- }, ref) => {
1743
- if (variant === "strip") {
1744
- return /* @__PURE__ */ jsx(
1745
- "div",
1746
- {
1747
- ref,
1748
- className: clsx14("ds-enterprise-signaling", "ds-enterprise-signaling--strip", className),
1749
- ...props,
1750
- children: /* @__PURE__ */ jsx("div", { className: "ds-enterprise-signaling__strip-inner", children: categories.flatMap((cat) => cat.items.filter((i) => i.status === "active")).map((item, i) => /* @__PURE__ */ jsx("span", { className: "ds-enterprise-signaling__strip-item", children: item.name }, i)) })
1751
- }
1752
- );
1753
- }
1754
- return /* @__PURE__ */ jsxs(
1755
- SectionShell,
1756
- {
1757
- ref,
1758
- className: clsx14("ds-enterprise-signaling", `ds-enterprise-signaling--${variant}`, className),
1759
- ...props,
1760
- children: [
1761
- /* @__PURE__ */ jsx(SectionHeader, { eyebrow, title, subtitle }),
1762
- /* @__PURE__ */ jsx("div", { className: "ds-enterprise-signaling__categories", children: categories.map((cat, ci) => /* @__PURE__ */ jsxs("div", { className: "ds-enterprise-signaling__category", children: [
1763
- /* @__PURE__ */ jsxs("div", { className: "ds-enterprise-signaling__category-header", children: [
1764
- cat.icon && /* @__PURE__ */ jsx("span", { className: "ds-enterprise-signaling__category-icon", children: cat.icon }),
1765
- /* @__PURE__ */ jsx("h3", { className: "ds-enterprise-signaling__category-name", children: cat.name })
1766
- ] }),
1767
- /* @__PURE__ */ jsx("div", { className: "ds-enterprise-signaling__items", children: cat.items.map((item, ii) => {
1768
- const inner = /* @__PURE__ */ jsxs(
1769
- "div",
1770
- {
1771
- className: clsx14(
1772
- "ds-enterprise-signaling__item",
1773
- `ds-enterprise-signaling__item--${item.status}`
1774
- ),
1775
- children: [
1776
- /* @__PURE__ */ jsx("span", { className: "ds-enterprise-signaling__item-name", children: item.name }),
1777
- /* @__PURE__ */ jsx(
1778
- Badge,
1779
- {
1780
- className: clsx14("ds-enterprise-signaling__item-status", `ds-enterprise-signaling__item-status--${item.status}`),
1781
- variant: "outline",
1782
- children: STATUS_LABELS[item.status]
1783
- }
1784
- ),
1785
- variant === "full" && item.detail && /* @__PURE__ */ jsx("span", { className: "ds-enterprise-signaling__item-detail", children: item.detail })
1786
- ]
1787
- },
1788
- ii
1789
- );
1790
- return item.href ? /* @__PURE__ */ jsx(OutboundLink, { href: item.href, context: "enterprise-signaling-item", className: "ds-enterprise-signaling__item-link", children: inner }, ii) : /* @__PURE__ */ jsx(React31.Fragment, { children: inner }, ii);
1791
- }) })
1792
- ] }, ci)) }),
1793
- sla && sla.length > 0 && /* @__PURE__ */ jsxs("div", { className: "ds-enterprise-signaling__sla", children: [
1794
- /* @__PURE__ */ jsx("h3", { className: "ds-enterprise-signaling__sla-title", children: "Service Level Agreements" }),
1795
- /* @__PURE__ */ jsxs("table", { className: "ds-enterprise-signaling__sla-table", children: [
1796
- /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
1797
- /* @__PURE__ */ jsx("th", { children: "Metric" }),
1798
- /* @__PURE__ */ jsx("th", { children: "SLA" }),
1799
- sla.some((s) => s.current) && /* @__PURE__ */ jsx("th", { children: "Current" })
1800
- ] }) }),
1801
- /* @__PURE__ */ jsx("tbody", { children: sla.map((s, i) => /* @__PURE__ */ jsxs("tr", { children: [
1802
- /* @__PURE__ */ jsx("td", { children: s.metric }),
1803
- /* @__PURE__ */ jsx("td", { children: s.commitment }),
1804
- sla.some((sl) => sl.current) && /* @__PURE__ */ jsx("td", { className: "ds-enterprise-signaling__sla-current", children: s.current ?? "\u2014" })
1805
- ] }, i)) })
1806
- ] })
1807
- ] })
1808
- ]
1809
- }
1810
- );
1811
- }
1812
- );
1813
- EnterpriseSignaling.displayName = "EnterpriseSignaling";
1814
- var MetricCounter = forwardRef(
1815
- ({
1816
- value,
1817
- prefix = "",
1818
- suffix = "",
1819
- duration = 1500,
1820
- decimals = 0,
1821
- label,
1822
- className,
1823
- ...props
1824
- }, ref) => {
1825
- const [displayValue, setDisplayValue] = useState(0);
1826
- const [hasAnimated, setHasAnimated] = useState(false);
1827
- const containerRef = useRef(null);
1828
- const prefersReducedMotion = useRef(false);
1829
- useEffect(() => {
1830
- prefersReducedMotion.current = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
1831
- if (prefersReducedMotion.current) {
1832
- setDisplayValue(value);
1833
- setHasAnimated(true);
1834
- return;
1835
- }
1836
- const observer = new IntersectionObserver(
1837
- (entries) => {
1838
- if (entries[0].isIntersecting && !hasAnimated) {
1839
- startAnimation();
1840
- observer.disconnect();
1841
- }
1842
- },
1843
- { threshold: 0.5 }
1844
- );
1845
- if (containerRef.current) {
1846
- observer.observe(containerRef.current);
1847
- }
1848
- return () => observer.disconnect();
1849
- }, [value, hasAnimated]);
1850
- const startAnimation = () => {
1851
- let startTime;
1852
- setHasAnimated(true);
1853
- const easeOutExpo = (t) => {
1854
- return t === 1 ? 1 : 1 - Math.pow(2, -10 * t);
1855
- };
1856
- const animate = (currentTime) => {
1857
- if (!startTime) startTime = currentTime;
1858
- const progress = Math.min((currentTime - startTime) / duration, 1);
1859
- const currentMultiplier = easeOutExpo(progress);
1860
- const nextValue = value * currentMultiplier;
1861
- setDisplayValue(nextValue);
1862
- if (progress < 1) {
1863
- requestAnimationFrame(animate);
1864
- } else {
1865
- setDisplayValue(value);
1866
- }
1867
- };
1868
- requestAnimationFrame(animate);
1869
- };
1870
- const formattedValue = displayValue.toLocaleString(void 0, {
1871
- minimumFractionDigits: decimals,
1872
- maximumFractionDigits: decimals
1873
- });
1874
- return /* @__PURE__ */ jsxs(
1875
- "div",
1876
- {
1877
- ref: (node) => {
1878
- containerRef.current = node;
1879
- if (typeof ref === "function") ref(node);
1880
- else if (ref) ref.current = node;
1881
- },
1882
- className: clsx14("ds-metric-counter", className),
1883
- ...props,
1884
- children: [
1885
- /* @__PURE__ */ jsxs("div", { className: "ds-metric-counter__value-wrapper", children: [
1886
- prefix && /* @__PURE__ */ jsx("span", { className: "ds-metric-counter__prefix", children: prefix }),
1887
- /* @__PURE__ */ jsx("span", { className: "ds-metric-counter__value", children: formattedValue }),
1888
- suffix && /* @__PURE__ */ jsx("span", { className: "ds-metric-counter__suffix", children: suffix })
1889
- ] }),
1890
- label && /* @__PURE__ */ jsx("div", { className: "ds-metric-counter__label", children: label })
1891
- ]
1892
- }
1893
- );
1894
- }
1895
- );
1896
- MetricCounter.displayName = "MetricCounter";
1897
- var IntelligenceBlock = forwardRef(
1898
- ({
1899
- eyebrow,
1900
- title,
1901
- subtitle,
1902
- metrics,
1903
- capabilities,
1904
- variant = "metrics-first",
1905
- className,
1906
- ...props
1907
- }, ref) => {
1908
- const metricsBlock = /* @__PURE__ */ jsx("div", { className: "ds-intelligence__metrics", children: metrics.map((m, i) => /* @__PURE__ */ jsxs("div", { className: "ds-intelligence__metric", children: [
1909
- /* @__PURE__ */ jsx(
1910
- MetricCounter,
1911
- {
1912
- value: m.value,
1913
- prefix: m.prefix,
1914
- suffix: m.suffix,
1915
- label: m.label
1916
- }
1917
- ),
1918
- m.growth && /* @__PURE__ */ jsx("span", { className: "ds-intelligence__growth", children: m.growth })
1919
- ] }, i)) });
1920
- const capabilitiesBlock = /* @__PURE__ */ jsx("div", { className: "ds-intelligence__capabilities", children: capabilities.map((cap, i) => /* @__PURE__ */ jsxs("div", { className: "ds-intelligence__capability", children: [
1921
- cap.icon && /* @__PURE__ */ jsx("div", { className: "ds-intelligence__capability-icon", "aria-hidden": "true", children: cap.icon }),
1922
- /* @__PURE__ */ jsxs("div", { className: "ds-intelligence__capability-content", children: [
1923
- /* @__PURE__ */ jsx("h3", { className: "ds-intelligence__capability-title", children: cap.title }),
1924
- /* @__PURE__ */ jsx("p", { className: "ds-intelligence__capability-desc", children: cap.description }),
1925
- cap.compoundingExample && /* @__PURE__ */ jsxs("div", { className: "ds-intelligence__compound", children: [
1926
- /* @__PURE__ */ jsxs("div", { className: "ds-intelligence__compound-before", children: [
1927
- /* @__PURE__ */ jsx("span", { className: "ds-intelligence__compound-label", children: "Before" }),
1928
- /* @__PURE__ */ jsx("span", { className: "ds-intelligence__compound-text", children: cap.compoundingExample.before })
1929
- ] }),
1930
- /* @__PURE__ */ jsx("span", { className: "ds-intelligence__compound-arrow", "aria-hidden": "true", children: "\\u2192" }),
1931
- /* @__PURE__ */ jsxs("div", { className: "ds-intelligence__compound-after", children: [
1932
- /* @__PURE__ */ jsx("span", { className: "ds-intelligence__compound-label", children: cap.compoundingExample.timeframe }),
1933
- /* @__PURE__ */ jsx("span", { className: "ds-intelligence__compound-text", children: cap.compoundingExample.after })
1934
- ] })
1935
- ] })
1936
- ] })
1937
- ] }, i)) });
1938
- return /* @__PURE__ */ jsxs(
1939
- SectionShell,
1940
- {
1941
- ref,
1942
- className: clsx14("ds-intelligence", `ds-intelligence--${variant}`, className),
1943
- ...props,
1944
- children: [
1945
- /* @__PURE__ */ jsx(SectionHeader, { eyebrow, title, subtitle }),
1946
- variant === "capabilities-first" ? /* @__PURE__ */ jsxs(Fragment, { children: [
1947
- capabilitiesBlock,
1948
- metricsBlock
1949
- ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
1950
- metricsBlock,
1951
- capabilitiesBlock
1952
- ] })
1953
- ]
1954
- }
1955
- );
1956
- }
1957
- );
1958
- IntelligenceBlock.displayName = "IntelligenceBlock";
1959
- function fmtNum(n, prefix, suffix) {
1960
- return `${prefix ?? ""}${n.toLocaleString("en-US", { maximumFractionDigits: 0 })}${suffix ?? ""}`;
1961
- }
1962
- var PartnerValueProp = forwardRef(
1963
- ({
1964
- eyebrow,
1965
- title,
1966
- subtitle,
1967
- calculator,
1968
- benefits,
1969
- differentiators,
1970
- differentiatorTitle = "Build In-House vs. White-Label",
1971
- differentiatorBuildLabel = "Build In-House",
1972
- differentiatorPartnerLabel = "White-Label",
1973
- cta,
1974
- className,
1975
- ...props
1976
- }, ref) => {
1977
- const initialValues = useMemo(() => {
1978
- if (!calculator) return {};
1979
- const vals = {};
1980
- calculator.inputs.forEach((inp) => {
1981
- vals[inp.name] = inp.defaultValue;
1982
- });
1983
- return vals;
1984
- }, [calculator]);
1985
- const [values, setValues] = useState(initialValues);
1986
- const handleChange = useCallback((name, value) => {
1987
- setValues((prev) => ({ ...prev, [name]: value }));
1988
- }, []);
1989
- const calcOutput = useMemo(() => {
1990
- if (!calculator) return null;
1991
- return calculator.calculate(values);
1992
- }, [values, calculator]);
1993
- return /* @__PURE__ */ jsxs(
1994
- SectionShell,
1995
- {
1996
- ref,
1997
- className: clsx14("ds-partner-vp", className),
1998
- ...props,
1999
- children: [
2000
- /* @__PURE__ */ jsx(SectionHeader, { eyebrow, title, subtitle }),
2001
- /* @__PURE__ */ jsxs("div", { className: "ds-partner-vp__layout", children: [
2002
- /* @__PURE__ */ jsx("div", { className: "ds-partner-vp__benefits", children: benefits.map((b, i) => /* @__PURE__ */ jsxs("div", { className: "ds-partner-vp__benefit", children: [
2003
- b.icon && /* @__PURE__ */ jsx("div", { className: "ds-partner-vp__benefit-icon", "aria-hidden": "true", children: b.icon }),
2004
- /* @__PURE__ */ jsxs("div", { children: [
2005
- /* @__PURE__ */ jsx("h3", { className: "ds-partner-vp__benefit-title", children: b.title }),
2006
- /* @__PURE__ */ jsx("p", { className: "ds-partner-vp__benefit-desc", children: b.description })
2007
- ] })
2008
- ] }, i)) }),
2009
- calculator && calcOutput && /* @__PURE__ */ jsxs("div", { className: "ds-partner-vp__calculator", children: [
2010
- /* @__PURE__ */ jsx("h3", { className: "ds-partner-vp__calc-title", children: "Partner Economics" }),
2011
- calculator.inputs.map((input) => /* @__PURE__ */ jsxs("div", { className: "ds-partner-vp__calc-input", children: [
2012
- /* @__PURE__ */ jsxs("label", { className: "ds-partner-vp__calc-label", children: [
2013
- input.label,
2014
- /* @__PURE__ */ jsx("span", { className: "ds-partner-vp__calc-value", children: fmtNum(values[input.name], input.prefix, input.suffix) })
2015
- ] }),
2016
- /* @__PURE__ */ jsx(
2017
- Slider,
2018
- {
2019
- value: values[input.name],
2020
- min: input.min ?? 0,
2021
- max: input.max ?? 100,
2022
- onValueChange: (v) => handleChange(input.name, v)
2023
- }
2024
- )
2025
- ] }, input.name)),
2026
- /* @__PURE__ */ jsxs("div", { className: "ds-partner-vp__calc-results", children: [
2027
- /* @__PURE__ */ jsxs("div", { className: "ds-partner-vp__calc-margin", children: [
2028
- /* @__PURE__ */ jsxs("span", { className: "ds-partner-vp__calc-margin-value", children: [
2029
- Math.round(calcOutput.marginPercentage),
2030
- "%"
2031
- ] }),
2032
- /* @__PURE__ */ jsx("span", { className: "ds-partner-vp__calc-margin-label", children: "Margin" })
2033
- ] }),
2034
- /* @__PURE__ */ jsxs("div", { className: "ds-partner-vp__calc-metrics", children: [
2035
- /* @__PURE__ */ jsxs("div", { className: "ds-partner-vp__calc-metric", children: [
2036
- /* @__PURE__ */ jsx("span", { className: "ds-partner-vp__calc-metric-value", children: fmtNum(calcOutput.monthlyRevenue, "$") }),
2037
- /* @__PURE__ */ jsx("span", { className: "ds-partner-vp__calc-metric-label", children: "Monthly Revenue" })
2038
- ] }),
2039
- /* @__PURE__ */ jsxs("div", { className: "ds-partner-vp__calc-metric", children: [
2040
- /* @__PURE__ */ jsx("span", { className: "ds-partner-vp__calc-metric-value", children: fmtNum(calcOutput.monthlyCost, "$") }),
2041
- /* @__PURE__ */ jsx("span", { className: "ds-partner-vp__calc-metric-label", children: "Monthly Cost" })
2042
- ] }),
2043
- /* @__PURE__ */ jsxs("div", { className: "ds-partner-vp__calc-metric", children: [
2044
- /* @__PURE__ */ jsx("span", { className: "ds-partner-vp__calc-metric-value ds-partner-vp__calc-metric-value--positive", children: fmtNum(calcOutput.monthlyMargin, "$") }),
2045
- /* @__PURE__ */ jsx("span", { className: "ds-partner-vp__calc-metric-label", children: "Monthly Profit" })
2046
- ] }),
2047
- /* @__PURE__ */ jsxs("div", { className: "ds-partner-vp__calc-metric", children: [
2048
- /* @__PURE__ */ jsx("span", { className: "ds-partner-vp__calc-metric-value", children: fmtNum(calcOutput.annualRevenue, "$") }),
2049
- /* @__PURE__ */ jsx("span", { className: "ds-partner-vp__calc-metric-label", children: "Annual Revenue" })
2050
- ] })
2051
- ] })
2052
- ] })
2053
- ] })
2054
- ] }),
2055
- differentiators && differentiators.length > 0 && /* @__PURE__ */ jsxs("div", { className: "ds-partner-vp__diff", children: [
2056
- /* @__PURE__ */ jsx("h3", { className: "ds-partner-vp__diff-title", children: differentiatorTitle }),
2057
- /* @__PURE__ */ jsxs("table", { className: "ds-partner-vp__diff-table", children: [
2058
- /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
2059
- /* @__PURE__ */ jsx("th", { children: "Dimension" }),
2060
- /* @__PURE__ */ jsx("th", { children: differentiatorBuildLabel }),
2061
- /* @__PURE__ */ jsx("th", { children: differentiatorPartnerLabel })
2062
- ] }) }),
2063
- /* @__PURE__ */ jsx("tbody", { children: differentiators.map((d, i) => /* @__PURE__ */ jsxs("tr", { children: [
2064
- /* @__PURE__ */ jsx("td", { className: "ds-partner-vp__diff-dimension", children: d.dimension }),
2065
- /* @__PURE__ */ jsx("td", { className: "ds-partner-vp__diff-build", children: d.buildInHouse }),
2066
- /* @__PURE__ */ jsx("td", { className: "ds-partner-vp__diff-sm", children: d.withPartner })
2067
- ] }, i)) })
2068
- ] })
2069
- ] }),
2070
- /* @__PURE__ */ jsx("div", { className: "ds-partner-vp__cta", children: /* @__PURE__ */ jsx(Button, { variant: "primary", size: "lg", asChild: true, children: /* @__PURE__ */ jsx(OutboundLink, { href: cta.href, context: "partner-value-prop-cta", openInNewTab: false, children: cta.label }) }) })
2071
- ]
2072
- }
2073
- );
2074
- }
2075
- );
2076
- PartnerValueProp.displayName = "PartnerValueProp";
2077
- var EvolutionTimeline = forwardRef(
2078
- ({
2079
- eyebrow,
2080
- title,
2081
- subtitle,
2082
- eras,
2083
- youAreHere,
2084
- cta,
2085
- className,
2086
- ...props
2087
- }, ref) => {
2088
- return /* @__PURE__ */ jsxs(
2089
- SectionShell,
2090
- {
2091
- ref,
2092
- className: clsx14("ds-evolution-timeline", className),
2093
- ...props,
2094
- children: [
2095
- /* @__PURE__ */ jsx(SectionHeader, { eyebrow, title, subtitle }),
2096
- /* @__PURE__ */ jsxs("div", { className: "ds-evolution-timeline__track", children: [
2097
- /* @__PURE__ */ jsx("div", { className: "ds-evolution-timeline__line", "aria-hidden": "true" }),
2098
- eras.map((era, i) => /* @__PURE__ */ jsxs(
2099
- "div",
2100
- {
2101
- className: clsx14(
2102
- "ds-evolution-timeline__era",
2103
- `ds-evolution-timeline__era--${era.sentiment}`,
2104
- era.current && "ds-evolution-timeline__era--current"
2105
- ),
2106
- children: [
2107
- /* @__PURE__ */ jsx("div", { className: "ds-evolution-timeline__marker", "aria-hidden": "true" }),
2108
- youAreHere === i && /* @__PURE__ */ jsx(Badge, { className: "ds-evolution-timeline__you-are-here", children: "Most tools are here" }),
2109
- era.icon && /* @__PURE__ */ jsx("div", { className: "ds-evolution-timeline__icon", "aria-hidden": "true", children: era.icon }),
2110
- /* @__PURE__ */ jsxs("div", { className: "ds-evolution-timeline__content", children: [
2111
- /* @__PURE__ */ jsx("span", { className: "ds-evolution-timeline__period", children: era.period }),
2112
- /* @__PURE__ */ jsx("h3", { className: "ds-evolution-timeline__label", children: era.label }),
2113
- /* @__PURE__ */ jsx("p", { className: "ds-evolution-timeline__desc", children: era.description }),
2114
- /* @__PURE__ */ jsx("ul", { className: "ds-evolution-timeline__traits", children: era.traits.map((trait, j) => /* @__PURE__ */ jsxs("li", { className: "ds-evolution-timeline__trait", children: [
2115
- /* @__PURE__ */ jsx("span", { className: "ds-evolution-timeline__trait-icon", "aria-hidden": "true", children: era.sentiment === "future" ? "\u2713" : era.sentiment === "past" ? "\u2717" : "\u2022" }),
2116
- trait
2117
- ] }, j)) })
2118
- ] })
2119
- ]
2120
- },
2121
- i
2122
- ))
2123
- ] }),
2124
- cta && /* @__PURE__ */ jsx("div", { className: "ds-evolution-timeline__cta", children: /* @__PURE__ */ jsx(Button, { variant: "primary", asChild: true, children: /* @__PURE__ */ jsx(OutboundLink, { href: cta.href, context: "evolution-timeline-cta", openInNewTab: false, children: cta.label }) }) })
2125
- ]
2126
- }
2127
- );
2128
- }
2129
- );
2130
- EvolutionTimeline.displayName = "EvolutionTimeline";
2131
- var EcosystemDiagram = forwardRef(
2132
- ({
2133
- eyebrow,
2134
- title,
2135
- subtitle,
2136
- layers,
2137
- connections,
2138
- variant = "flywheel",
2139
- centerLabel,
2140
- className,
2141
- ...props
2142
- }, ref) => {
2143
- return /* @__PURE__ */ jsxs(
2144
- SectionShell,
2145
- {
2146
- ref,
2147
- className: clsx14("ds-ecosystem", `ds-ecosystem--${variant}`, className),
2148
- ...props,
2149
- children: [
2150
- /* @__PURE__ */ jsx(SectionHeader, { eyebrow, title, subtitle }),
2151
- /* @__PURE__ */ jsxs("div", { className: "ds-ecosystem__diagram", role: "img", "aria-label": "Ecosystem diagram", children: [
2152
- centerLabel && /* @__PURE__ */ jsx("div", { className: "ds-ecosystem__center", children: /* @__PURE__ */ jsx("span", { className: "ds-ecosystem__center-label", children: centerLabel }) }),
2153
- /* @__PURE__ */ jsx("div", { className: "ds-ecosystem__layers", children: layers.map((layer, i) => /* @__PURE__ */ jsxs("div", { className: "ds-ecosystem__layer", children: [
2154
- layer.icon && /* @__PURE__ */ jsx("div", { className: "ds-ecosystem__layer-icon", "aria-hidden": "true", children: layer.icon }),
2155
- /* @__PURE__ */ jsx("h3", { className: "ds-ecosystem__layer-name", children: layer.name }),
2156
- /* @__PURE__ */ jsx("p", { className: "ds-ecosystem__layer-desc", children: layer.description }),
2157
- /* @__PURE__ */ jsx("ul", { className: "ds-ecosystem__capabilities", children: layer.capabilities.map((cap, j) => /* @__PURE__ */ jsx("li", { className: "ds-ecosystem__capability", children: cap }, j)) })
2158
- ] }, i)) }),
2159
- /* @__PURE__ */ jsx("div", { className: "ds-ecosystem__connections", "aria-hidden": "true", children: connections.map((conn, i) => /* @__PURE__ */ jsxs("div", { className: "ds-ecosystem__connection", children: [
2160
- /* @__PURE__ */ jsx("span", { className: "ds-ecosystem__connection-arrow", children: "\\u2192" }),
2161
- /* @__PURE__ */ jsx("span", { className: "ds-ecosystem__connection-label", children: conn.label })
2162
- ] }, i)) })
2163
- ] })
2164
- ]
2165
- }
2166
- );
2167
- }
2168
- );
2169
- EcosystemDiagram.displayName = "EcosystemDiagram";
2170
- var AvatarContext = React31.createContext({
2171
- hasImage: false,
2172
- imageError: false,
2173
- onImageError: () => {
2174
- }
2175
- });
2176
- var Avatar = React31.forwardRef(
2177
- ({ size = "md", className, children, ...props }, ref) => {
2178
- const [imageError, setImageError] = React31.useState(false);
2179
- const [hasImage, setHasImage] = React31.useState(false);
2180
- React31.useEffect(() => {
2181
- let found = false;
2182
- React31.Children.forEach(children, (child) => {
2183
- if (React31.isValidElement(child) && child.type === AvatarImage) {
2184
- found = true;
2185
- }
2186
- });
2187
- setHasImage(found);
2188
- }, [children]);
2189
- const onImageError = React31.useCallback(() => {
2190
- setImageError(true);
2191
- }, []);
2192
- return /* @__PURE__ */ jsx(AvatarContext.Provider, { value: { hasImage, imageError, onImageError }, children: /* @__PURE__ */ jsx(
2193
- "span",
2194
- {
2195
- ref,
2196
- className: clsx14("ds-avatar", `ds-avatar--${size}`, className),
2197
- ...props,
2198
- children
2199
- }
2200
- ) });
2201
- }
2202
- );
2203
- Avatar.displayName = "Avatar";
2204
- var AvatarImage = React31.forwardRef(({ className, onError, ...props }, ref) => {
2205
- const { imageError, onImageError } = React31.useContext(AvatarContext);
2206
- const handleError = (e) => {
2207
- onImageError();
2208
- onError?.(e);
2209
- };
2210
- if (imageError) return null;
2211
- return /* @__PURE__ */ jsx(
2212
- "img",
2213
- {
2214
- ref,
2215
- className: clsx14("ds-avatar__image", className),
2216
- onError: handleError,
2217
- ...props
2218
- }
2219
- );
2220
- });
2221
- AvatarImage.displayName = "AvatarImage";
2222
- var AvatarFallback = React31.forwardRef(({ className, ...props }, ref) => {
2223
- const { hasImage, imageError } = React31.useContext(AvatarContext);
2224
- if (hasImage && !imageError) return null;
2225
- return /* @__PURE__ */ jsx("span", { ref, className: clsx14("ds-avatar__fallback", className), ...props });
2226
- });
2227
- AvatarFallback.displayName = "AvatarFallback";
2228
- var ManifestoBlock = forwardRef(
2229
- ({
2230
- statement,
2231
- attribution,
2232
- variant = "centered",
2233
- className,
2234
- ...props
2235
- }, ref) => {
2236
- const initials = attribution ? attribution.name.split(" ").map((n) => n[0]).join("").slice(0, 2) : "";
2237
- return /* @__PURE__ */ jsx(
2238
- SectionShell,
2239
- {
2240
- ref,
2241
- className: clsx14("ds-manifesto", `ds-manifesto--${variant}`, className),
2242
- ...props,
2243
- children: /* @__PURE__ */ jsxs("div", { className: "ds-manifesto__inner", children: [
2244
- variant === "quote" && /* @__PURE__ */ jsx("span", { className: "ds-manifesto__quote-mark", "aria-hidden": "true", children: "\u201C" }),
2245
- /* @__PURE__ */ jsx("blockquote", { className: "ds-manifesto__statement", children: statement }),
2246
- attribution && /* @__PURE__ */ jsxs("div", { className: "ds-manifesto__attribution", children: [
2247
- /* @__PURE__ */ jsxs(Avatar, { size: "sm", children: [
2248
- attribution.avatar && /* @__PURE__ */ jsx(AvatarImage, { src: attribution.avatar, alt: attribution.name }),
2249
- /* @__PURE__ */ jsx(AvatarFallback, { children: initials })
2250
- ] }),
2251
- /* @__PURE__ */ jsxs("div", { className: "ds-manifesto__attribution-text", children: [
2252
- /* @__PURE__ */ jsx("span", { className: "ds-manifesto__attribution-name", children: attribution.name }),
2253
- /* @__PURE__ */ jsx("span", { className: "ds-manifesto__attribution-role", children: attribution.role })
2254
- ] })
2255
- ] })
2256
- ] })
2257
- }
2258
- );
2259
- }
2260
- );
2261
- ManifestoBlock.displayName = "ManifestoBlock";
2262
- var AnnouncementBar = forwardRef(
2263
- ({
2264
- badge,
2265
- message,
2266
- href,
2267
- variant = "brand",
2268
- dismissible = false,
2269
- onDismiss,
2270
- showArrow = true,
2271
- className,
2272
- ...props
2273
- }, ref) => {
2274
- const { track } = useAnalytics();
2275
- const handleClick = () => {
2276
- if (href) {
2277
- track("announcement_click", { href, variant });
2278
- }
2279
- };
2280
- const handleDismiss = (e) => {
2281
- e.preventDefault();
2282
- e.stopPropagation();
2283
- track("announcement_dismiss", { variant });
2284
- onDismiss?.();
2285
- };
2286
- const Component = href ? "a" : "div";
2287
- const componentProps = href ? { href, onClick: handleClick } : {};
2288
- return /* @__PURE__ */ jsxs(
2289
- "div",
2290
- {
2291
- ref,
2292
- className: clsx14(
2293
- "ds-announcement-bar",
2294
- `ds-announcement-bar--${variant}`,
2295
- href && "ds-announcement-bar--clickable",
2296
- className
2297
- ),
2298
- ...props,
2299
- children: [
2300
- /* @__PURE__ */ jsxs(Component, { className: "ds-announcement-bar__inner", ...componentProps, children: [
2301
- /* @__PURE__ */ jsxs("div", { className: "ds-announcement-bar__content", children: [
2302
- badge && /* @__PURE__ */ jsx("span", { className: "ds-announcement-bar__badge", children: badge }),
2303
- /* @__PURE__ */ jsx("span", { className: "ds-announcement-bar__message", children: message })
2304
- ] }),
2305
- href && showArrow && /* @__PURE__ */ jsx(ArrowRight, { className: "ds-announcement-bar__arrow", size: 16 })
2306
- ] }),
2307
- dismissible && /* @__PURE__ */ jsx(
2308
- "button",
2309
- {
2310
- type: "button",
2311
- className: "ds-announcement-bar__close",
2312
- onClick: handleDismiss,
2313
- "aria-label": "Dismiss announcement",
2314
- children: /* @__PURE__ */ jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: /* @__PURE__ */ jsx("path", { d: "M18 6L6 18M6 6l12 12" }) })
2315
- }
2316
- )
2317
- ]
2318
- }
2319
- );
2320
- }
2321
- );
2322
- AnnouncementBar.displayName = "AnnouncementBar";
2323
- var ProcessTimeline = forwardRef(
2324
- ({
2325
- steps,
2326
- animated = true,
2327
- className,
2328
- ...props
2329
- }, ref) => {
2330
- const [progress, setProgress] = useState(0);
2331
- const containerRef = useRef(null);
2332
- const { track } = useAnalytics();
2333
- const hasTrackedRef = useRef(false);
2334
- useEffect(() => {
2335
- if (!animated) return;
2336
- const handleScroll = () => {
2337
- if (!containerRef.current) return;
2338
- const rect = containerRef.current.getBoundingClientRect();
2339
- const windowHeight = window.innerHeight;
2340
- const startDraw = windowHeight * 0.5;
2341
- const travelDistance = rect.height;
2342
- const currentPos = startDraw - rect.top;
2343
- if (currentPos < 0) {
2344
- setProgress(0);
2345
- } else if (currentPos > travelDistance) {
2346
- setProgress(100);
2347
- if (!hasTrackedRef.current) {
2348
- hasTrackedRef.current = true;
2349
- track("timeline_complete");
2350
- }
2351
- } else {
2352
- setProgress(currentPos / travelDistance * 100);
2353
- }
2354
- };
2355
- window.addEventListener("scroll", handleScroll, { passive: true });
2356
- handleScroll();
2357
- return () => window.removeEventListener("scroll", handleScroll);
2358
- }, [animated, track]);
2359
- return /* @__PURE__ */ jsxs(
2360
- "div",
2361
- {
2362
- ref: (node) => {
2363
- containerRef.current = node;
2364
- if (typeof ref === "function") ref(node);
2365
- else if (ref) ref.current = node;
2366
- },
2367
- className: clsx14(
2368
- "ds-process-timeline",
2369
- animated && "ds-process-timeline--animated",
2370
- className
2371
- ),
2372
- ...props,
2373
- children: [
2374
- /* @__PURE__ */ jsx("div", { className: "ds-process-timeline__track", children: /* @__PURE__ */ jsx(
2375
- "div",
2376
- {
2377
- className: "ds-process-timeline__progress",
2378
- style: { height: animated ? `${progress}%` : "100%" }
2379
- }
2380
- ) }),
2381
- /* @__PURE__ */ jsx("div", { className: "ds-process-timeline__steps", children: steps.map((step, index) => {
2382
- const stepProgress = index / (steps.length - 1) * 100;
2383
- const isActive = !animated || progress >= stepProgress;
2384
- return /* @__PURE__ */ jsxs(
2385
- "div",
2386
- {
2387
- className: clsx14(
2388
- "ds-process-timeline__step",
2389
- isActive && "ds-process-timeline__step--active"
2390
- ),
2391
- children: [
2392
- /* @__PURE__ */ jsx("div", { className: "ds-process-timeline__indicator", children: step.indicator }),
2393
- /* @__PURE__ */ jsxs("div", { className: "ds-process-timeline__content", children: [
2394
- /* @__PURE__ */ jsx("h3", { className: "ds-process-timeline__title", children: step.title }),
2395
- /* @__PURE__ */ jsx("p", { className: "ds-process-timeline__description", children: step.description })
2396
- ] })
2397
- ]
2398
- },
2399
- index
2400
- );
2401
- }) })
2402
- ]
2403
- }
2404
- );
2405
- }
2406
- );
2407
- ProcessTimeline.displayName = "ProcessTimeline";
2408
- var ProblemAgitation = forwardRef(
2409
- ({
2410
- title,
2411
- description,
2412
- points,
2413
- oldWayLabel = "The Old Way",
2414
- newWayLabel = "The New Way",
2415
- className,
2416
- ...props
2417
- }, ref) => {
2418
- return /* @__PURE__ */ jsxs(
2419
- "section",
2420
- {
2421
- ref,
2422
- className: clsx14("ds-problem-agitation", className),
2423
- ...props,
2424
- children: [
2425
- /* @__PURE__ */ jsxs("div", { className: "ds-problem-agitation__header", children: [
2426
- /* @__PURE__ */ jsx("h2", { className: "ds-problem-agitation__title", children: title }),
2427
- description && /* @__PURE__ */ jsx("p", { className: "ds-problem-agitation__description", children: description })
2428
- ] }),
2429
- /* @__PURE__ */ jsxs("div", { className: "ds-problem-agitation__grid", children: [
2430
- /* @__PURE__ */ jsx("div", { className: "ds-problem-agitation__mobile-label ds-problem-agitation__mobile-label--old", children: oldWayLabel }),
2431
- /* @__PURE__ */ jsx("div", { className: "ds-problem-agitation__mobile-label ds-problem-agitation__mobile-label--new", children: newWayLabel }),
2432
- /* @__PURE__ */ jsx("div", { className: "ds-problem-agitation__column-header ds-problem-agitation__column-header--old", children: oldWayLabel }),
2433
- /* @__PURE__ */ jsx("div", { className: "ds-problem-agitation__column-header ds-problem-agitation__column-header--new", children: newWayLabel }),
2434
- points.map((point, index) => /* @__PURE__ */ jsxs(React31.Fragment, { children: [
2435
- /* @__PURE__ */ jsxs("div", { className: "ds-problem-agitation__cell ds-problem-agitation__cell--old", children: [
2436
- /* @__PURE__ */ jsx("div", { className: "ds-problem-agitation__icon-wrapper ds-problem-agitation__icon-wrapper--old", children: /* @__PURE__ */ jsx(X, { size: 20, "aria-hidden": "true" }) }),
2437
- /* @__PURE__ */ jsx("div", { className: "ds-problem-agitation__content", children: point.problem })
2438
- ] }),
2439
- /* @__PURE__ */ jsxs("div", { className: "ds-problem-agitation__cell ds-problem-agitation__cell--new", children: [
2440
- /* @__PURE__ */ jsx("div", { className: "ds-problem-agitation__icon-wrapper ds-problem-agitation__icon-wrapper--new", children: /* @__PURE__ */ jsx(Check, { size: 20, "aria-hidden": "true" }) }),
2441
- /* @__PURE__ */ jsx("div", { className: "ds-problem-agitation__content", children: point.solution })
2442
- ] })
2443
- ] }, index))
2444
- ] })
2445
- ]
2446
- }
2447
- );
2448
- }
2449
- );
2450
- ProblemAgitation.displayName = "ProblemAgitation";
2451
- var Tabs = React31.forwardRef(
2452
- ({ className, orientation = "horizontal", ...props }, ref) => {
2453
- return /* @__PURE__ */ jsx(
2454
- Tabs$1.Root,
2455
- {
2456
- ref,
2457
- className: clsx14("ds-tabs", `ds-tabs--${orientation}`, className),
2458
- orientation,
2459
- ...props
2460
- }
2461
- );
2462
- }
2463
- );
2464
- Tabs.displayName = "Tabs";
2465
- var TabsList = React31.forwardRef(
2466
- ({ className, ...props }, ref) => {
2467
- return /* @__PURE__ */ jsx(Tabs$1.List, { ref, className: clsx14("ds-tabs__list", className), ...props });
2468
- }
2469
- );
2470
- TabsList.displayName = "TabsList";
2471
- var TabsTrigger = React31.forwardRef(
2472
- ({ className, children, ...props }, ref) => {
2473
- return /* @__PURE__ */ jsx(Tabs$1.Tab, { ref, className: clsx14("ds-tabs__trigger", className), ...props, children });
2474
- }
2475
- );
2476
- TabsTrigger.displayName = "TabsTrigger";
2477
- var TabsContent = React31.forwardRef(
2478
- ({ className, ...props }, ref) => {
2479
- return /* @__PURE__ */ jsx(Tabs$1.Panel, { ref, className: clsx14("ds-tabs__content", className), ...props });
2480
- }
2481
- );
2482
- TabsContent.displayName = "TabsContent";
2483
- var StakeholderTabs = forwardRef(
2484
- ({
2485
- eyebrow,
2486
- title,
2487
- stakeholders,
2488
- defaultIndex = 0,
2489
- className,
2490
- ...props
2491
- }, ref) => {
2492
- return /* @__PURE__ */ jsxs(
2493
- SectionShell,
2494
- {
2495
- ref,
2496
- className: clsx14("ds-stakeholder-tabs", className),
2497
- ...props,
2498
- children: [
2499
- /* @__PURE__ */ jsx(SectionHeader, { eyebrow, title }),
2500
- /* @__PURE__ */ jsxs(Tabs, { defaultValue: defaultIndex, children: [
2501
- /* @__PURE__ */ jsx(TabsList, { className: "ds-stakeholder-tabs__list", children: stakeholders.map((s, i) => /* @__PURE__ */ jsxs(TabsTrigger, { value: i, className: "ds-stakeholder-tabs__trigger", children: [
2502
- s.icon && /* @__PURE__ */ jsx("span", { className: "ds-stakeholder-tabs__icon", "aria-hidden": "true", children: s.icon }),
2503
- s.label
2504
- ] }, i)) }),
2505
- stakeholders.map((s, i) => /* @__PURE__ */ jsx(TabsContent, { value: i, className: "ds-stakeholder-tabs__content", children: /* @__PURE__ */ jsxs("div", { className: "ds-stakeholder-tabs__panel", children: [
2506
- /* @__PURE__ */ jsxs("div", { className: "ds-stakeholder-tabs__text", children: [
2507
- /* @__PURE__ */ jsx("h3", { className: "ds-stakeholder-tabs__headline", children: s.content.headline }),
2508
- /* @__PURE__ */ jsx("p", { className: "ds-stakeholder-tabs__desc", children: s.content.description }),
2509
- s.content.features && s.content.features.length > 0 && /* @__PURE__ */ jsx("ul", { className: "ds-stakeholder-tabs__features", children: s.content.features.map((f, j) => /* @__PURE__ */ jsxs("li", { className: "ds-stakeholder-tabs__feature", children: [
2510
- f.icon && /* @__PURE__ */ jsx("span", { className: "ds-stakeholder-tabs__feature-icon", "aria-hidden": "true", children: f.icon }),
2511
- /* @__PURE__ */ jsxs("div", { children: [
2512
- /* @__PURE__ */ jsx("strong", { children: f.title }),
2513
- /* @__PURE__ */ jsx("span", { children: f.description })
2514
- ] })
2515
- ] }, j)) }),
2516
- /* @__PURE__ */ jsx("div", { className: "ds-stakeholder-tabs__cta-wrap", children: /* @__PURE__ */ jsx(Button, { variant: "primary", asChild: true, children: /* @__PURE__ */ jsx(OutboundLink, { href: s.content.cta.href, context: "stakeholder-tabs-cta", openInNewTab: false, children: s.content.cta.label }) }) })
2517
- ] }),
2518
- s.content.testimonial && /* @__PURE__ */ jsx("div", { className: "ds-stakeholder-tabs__testimonial", children: s.content.testimonial })
2519
- ] }) }, i))
2520
- ] })
2521
- ]
2522
- }
2523
- );
2524
- }
2525
- );
2526
- StakeholderTabs.displayName = "StakeholderTabs";
2527
- var IntegrationShowcase = forwardRef(
2528
- ({
2529
- eyebrow,
2530
- title,
2531
- subtitle,
2532
- integrations,
2533
- categories,
2534
- variant = "grid",
2535
- filterable = !!categories,
2536
- className,
2537
- ...props
2538
- }, ref) => {
2539
- const [activeCategory, setActiveCategory] = useState("All");
2540
- const allCategories = categories ?? ["All", ...new Set(integrations.map((i) => i.category))];
2541
- const filtered = activeCategory === "All" ? integrations : integrations.filter((i) => i.category === activeCategory);
2542
- return /* @__PURE__ */ jsxs(
2543
- SectionShell,
2544
- {
2545
- ref,
2546
- className: clsx14("ds-integration-showcase", className),
2547
- ...props,
2548
- children: [
2549
- /* @__PURE__ */ jsx(SectionHeader, { eyebrow, title, subtitle }),
2550
- filterable && allCategories.length > 1 && /* @__PURE__ */ jsxs(
2551
- Tabs,
2552
- {
2553
- value: allCategories.indexOf(activeCategory),
2554
- onValueChange: (v) => setActiveCategory(allCategories[v] ?? "All"),
2555
- children: [
2556
- /* @__PURE__ */ jsx(TabsList, { className: "ds-integration-showcase__filters", children: allCategories.map((cat, i) => /* @__PURE__ */ jsx(TabsTrigger, { value: i, className: "ds-integration-showcase__filter", children: cat }, cat)) }),
2557
- allCategories.map((_, i) => /* @__PURE__ */ jsx(TabsContent, { value: i, className: "ds-integration-showcase__tab-content" }, i))
2558
- ]
2559
- }
2560
- ),
2561
- /* @__PURE__ */ jsx("div", { className: clsx14("ds-integration-showcase__grid", `ds-integration-showcase__grid--${variant}`), children: filtered.map((integration, i) => {
2562
- const Card = /* @__PURE__ */ jsxs("div", { className: "ds-integration-showcase__card", children: [
2563
- /* @__PURE__ */ jsx("div", { className: "ds-integration-showcase__logo", children: integration.logo }),
2564
- /* @__PURE__ */ jsxs("div", { className: "ds-integration-showcase__info", children: [
2565
- /* @__PURE__ */ jsxs("span", { className: "ds-integration-showcase__name", children: [
2566
- integration.name,
2567
- integration.badge && /* @__PURE__ */ jsx(Badge, { variant: "secondary", className: "ds-integration-showcase__badge", children: integration.badge })
2568
- ] }),
2569
- integration.description && variant !== "compact" && /* @__PURE__ */ jsx("span", { className: "ds-integration-showcase__desc", children: integration.description })
2570
- ] })
2571
- ] }, i);
2572
- return integration.href ? /* @__PURE__ */ jsx(OutboundLink, { href: integration.href, context: "integration-showcase-card", className: "ds-integration-showcase__card-link", children: Card }, i) : Card;
2573
- }) })
2574
- ]
2575
- }
2576
- );
2577
- }
2578
- );
2579
- IntegrationShowcase.displayName = "IntegrationShowcase";
2580
- var SecurityBlock = forwardRef(
2581
- ({
2582
- eyebrow,
2583
- title,
2584
- subtitle,
2585
- certifications,
2586
- features,
2587
- variant = "badges",
2588
- className,
2589
- ...props
2590
- }, ref) => {
2591
- return /* @__PURE__ */ jsxs(
2592
- SectionShell,
2593
- {
2594
- ref,
2595
- className: clsx14("ds-security-block", className),
2596
- ...props,
2597
- children: [
2598
- /* @__PURE__ */ jsx(SectionHeader, { eyebrow, title, subtitle }),
2599
- certifications && certifications.length > 0 && /* @__PURE__ */ jsx("div", { className: clsx14("ds-security-block__certs", `ds-security-block__certs--${variant}`), children: certifications.map((cert, i) => {
2600
- const inner = /* @__PURE__ */ jsxs("div", { className: "ds-security-block__cert", children: [
2601
- /* @__PURE__ */ jsx("div", { className: "ds-security-block__cert-icon", children: cert.icon }),
2602
- /* @__PURE__ */ jsxs("div", { className: "ds-security-block__cert-info", children: [
2603
- /* @__PURE__ */ jsx("span", { className: "ds-security-block__cert-name", children: cert.name }),
2604
- variant === "detailed" && cert.description && /* @__PURE__ */ jsx("span", { className: "ds-security-block__cert-desc", children: cert.description })
2605
- ] })
2606
- ] }, i);
2607
- return cert.href ? /* @__PURE__ */ jsx(OutboundLink, { href: cert.href, context: "security-block-cert", className: "ds-security-block__cert-link", children: inner }, i) : /* @__PURE__ */ jsx(React31.Fragment, { children: inner }, i);
2608
- }) }),
2609
- features && features.length > 0 && /* @__PURE__ */ jsx("div", { className: "ds-security-block__features", children: features.map((feature, i) => /* @__PURE__ */ jsxs("div", { className: "ds-security-block__feature", children: [
2610
- feature.icon && /* @__PURE__ */ jsx("span", { className: "ds-security-block__feature-icon", "aria-hidden": "true", children: feature.icon }),
2611
- /* @__PURE__ */ jsxs("div", { children: [
2612
- /* @__PURE__ */ jsx("h4", { className: "ds-security-block__feature-title", children: feature.title }),
2613
- /* @__PURE__ */ jsx("p", { className: "ds-security-block__feature-desc", children: feature.description })
2614
- ] })
2615
- ] }, i)) })
2616
- ]
2617
- }
2618
- );
2619
- }
2620
- );
2621
- SecurityBlock.displayName = "SecurityBlock";
2622
- var CaseStudyCard = forwardRef(
2623
- ({
2624
- company,
2625
- logo,
2626
- industry,
2627
- headline,
2628
- metrics,
2629
- href,
2630
- coverImage,
2631
- quote,
2632
- className,
2633
- ...props
2634
- }, ref) => {
2635
- return /* @__PURE__ */ jsx(
2636
- "article",
2637
- {
2638
- ref,
2639
- className: clsx14("ds-case-study-card", className),
2640
- ...props,
2641
- children: /* @__PURE__ */ jsxs(OutboundLink, { href, context: "case-study-card", className: "ds-case-study-card__link", openInNewTab: false, children: [
2642
- coverImage && /* @__PURE__ */ jsx("div", { className: "ds-case-study-card__image-wrap", children: /* @__PURE__ */ jsx(
2643
- "img",
2644
- {
2645
- src: coverImage,
2646
- alt: "",
2647
- className: "ds-case-study-card__image",
2648
- loading: "lazy",
2649
- decoding: "async"
2650
- }
2651
- ) }),
2652
- /* @__PURE__ */ jsxs("div", { className: "ds-case-study-card__body", children: [
2653
- /* @__PURE__ */ jsxs("div", { className: "ds-case-study-card__header", children: [
2654
- logo && /* @__PURE__ */ jsx("div", { className: "ds-case-study-card__logo", children: logo }),
2655
- /* @__PURE__ */ jsxs("div", { className: "ds-case-study-card__company-info", children: [
2656
- /* @__PURE__ */ jsx("span", { className: "ds-case-study-card__company", children: company }),
2657
- industry && /* @__PURE__ */ jsx(Badge, { variant: "secondary", className: "ds-case-study-card__industry", children: industry })
2658
- ] })
2659
- ] }),
2660
- /* @__PURE__ */ jsx("h3", { className: "ds-case-study-card__headline", children: headline }),
2661
- metrics && metrics.length > 0 && /* @__PURE__ */ jsx("div", { className: "ds-case-study-card__metrics", children: metrics.map((metric, i) => /* @__PURE__ */ jsxs("div", { className: "ds-case-study-card__metric", children: [
2662
- /* @__PURE__ */ jsxs("span", { className: "ds-case-study-card__metric-value", children: [
2663
- metric.prefix,
2664
- metric.value,
2665
- metric.suffix
2666
- ] }),
2667
- /* @__PURE__ */ jsx("span", { className: "ds-case-study-card__metric-label", children: metric.label })
2668
- ] }, i)) }),
2669
- quote && /* @__PURE__ */ jsx("blockquote", { className: "ds-case-study-card__quote", children: /* @__PURE__ */ jsxs("p", { children: [
2670
- "\u201C",
2671
- quote,
2672
- "\u201D"
2673
- ] }) })
2674
- ] })
2675
- ] })
2676
- }
2677
- );
2678
- }
2679
- );
2680
- CaseStudyCard.displayName = "CaseStudyCard";
2681
- var CaseStudySection = forwardRef(
2682
- ({
2683
- eyebrow,
2684
- title,
2685
- subtitle,
2686
- caseStudies,
2687
- filterable = false,
2688
- filters,
2689
- maxVisible,
2690
- seeAllHref,
2691
- className,
2692
- ...props
2693
- }, ref) => {
2694
- const allFilters = filters ?? [
2695
- "All",
2696
- ...new Set(caseStudies.map((cs) => cs.industry).filter(Boolean))
2697
- ];
2698
- const [activeFilter, setActiveFilter] = useState("All");
2699
- const filtered = activeFilter === "All" ? caseStudies : caseStudies.filter((cs) => cs.industry === activeFilter);
2700
- const visible = maxVisible ? filtered.slice(0, maxVisible) : filtered;
2701
- return /* @__PURE__ */ jsxs(
2702
- SectionShell,
2703
- {
2704
- ref,
2705
- className: clsx14("ds-case-study-section", className),
2706
- ...props,
2707
- children: [
2708
- /* @__PURE__ */ jsx(SectionHeader, { eyebrow, title, subtitle }),
2709
- filterable && allFilters.length > 1 && /* @__PURE__ */ jsxs(
2710
- Tabs,
2711
- {
2712
- value: allFilters.indexOf(activeFilter),
2713
- onValueChange: (v) => setActiveFilter(allFilters[v] ?? "All"),
2714
- children: [
2715
- /* @__PURE__ */ jsx(TabsList, { className: "ds-case-study-section__filters", children: allFilters.map((filter, i) => /* @__PURE__ */ jsx(TabsTrigger, { value: i, className: "ds-case-study-section__filter", children: filter }, filter)) }),
2716
- allFilters.map((_, i) => /* @__PURE__ */ jsx(TabsContent, { value: i, className: "ds-case-study-section__tab-content" }, i))
2717
- ]
2718
- }
2719
- ),
2720
- /* @__PURE__ */ jsx("div", { className: "ds-case-study-section__grid", children: visible.map((cs, i) => /* @__PURE__ */ jsx(CaseStudyCard, { ...cs }, i)) }),
2721
- seeAllHref && /* @__PURE__ */ jsx("div", { className: "ds-case-study-section__see-all", children: /* @__PURE__ */ jsx(Button, { variant: "outline", asChild: true, children: /* @__PURE__ */ jsx(OutboundLink, { href: seeAllHref, context: "case-study-section-see-all", openInNewTab: false, children: "See all case studies" }) }) })
2722
- ]
2723
- }
2724
- );
2725
- }
2726
- );
2727
- CaseStudySection.displayName = "CaseStudySection";
2728
- var STATUS_LABELS2 = {
2729
- certified: "Certified",
2730
- "in-progress": "In Progress",
2731
- planned: "Planned"
2732
- };
2733
- var ComplianceGrid = forwardRef(
2734
- ({
2735
- eyebrow,
2736
- title,
2737
- subtitle,
2738
- items,
2739
- className,
2740
- ...props
2741
- }, ref) => {
2742
- return /* @__PURE__ */ jsxs(
2743
- SectionShell,
2744
- {
2745
- ref,
2746
- className: clsx14("ds-compliance-grid", className),
2747
- ...props,
2748
- children: [
2749
- /* @__PURE__ */ jsx(SectionHeader, { eyebrow, title, subtitle }),
2750
- /* @__PURE__ */ jsx("div", { className: "ds-compliance-grid__items", children: items.map((item, i) => {
2751
- const inner = /* @__PURE__ */ jsxs(
2752
- "div",
2753
- {
2754
- className: clsx14(
2755
- "ds-compliance-grid__item",
2756
- `ds-compliance-grid__item--${item.status}`
2757
- ),
2758
- children: [
2759
- item.icon && /* @__PURE__ */ jsx("div", { className: "ds-compliance-grid__icon", children: item.icon }),
2760
- /* @__PURE__ */ jsxs("div", { className: "ds-compliance-grid__info", children: [
2761
- /* @__PURE__ */ jsx("span", { className: "ds-compliance-grid__name", children: item.name }),
2762
- /* @__PURE__ */ jsx(
2763
- Badge,
2764
- {
2765
- className: clsx14(
2766
- "ds-compliance-grid__status",
2767
- `ds-compliance-grid__status--${item.status}`
2768
- ),
2769
- variant: "outline",
2770
- children: STATUS_LABELS2[item.status]
2771
- }
2772
- ),
2773
- item.description && /* @__PURE__ */ jsx("span", { className: "ds-compliance-grid__desc", children: item.description })
2774
- ] })
2775
- ]
2776
- },
2777
- i
2778
- );
2779
- return item.documentHref ? /* @__PURE__ */ jsx(OutboundLink, { href: item.documentHref, context: "compliance-grid-doc", className: "ds-compliance-grid__link", children: inner }, i) : /* @__PURE__ */ jsx(React31.Fragment, { children: inner }, i);
2780
- }) })
2781
- ]
2782
- }
2783
- );
2784
- }
2785
- );
2786
- ComplianceGrid.displayName = "ComplianceGrid";
2787
- var ArchitectureDiagram = forwardRef(
2788
- ({
2789
- nodes,
2790
- connections,
2791
- direction = "horizontal",
2792
- className,
2793
- ...props
2794
- }, ref) => {
2795
- const isHorizontal = direction === "horizontal";
2796
- return /* @__PURE__ */ jsx(
2797
- "div",
2798
- {
2799
- ref,
2800
- className: clsx14(
2801
- "ds-architecture",
2802
- `ds-architecture--${direction}`,
2803
- className
2804
- ),
2805
- role: "img",
2806
- "aria-label": "Architecture diagram",
2807
- ...props,
2808
- children: /* @__PURE__ */ jsx("div", { className: "ds-architecture__nodes", children: nodes.map((node, i) => /* @__PURE__ */ jsxs(React31.Fragment, { children: [
2809
- i > 0 && /* @__PURE__ */ jsxs("div", { className: "ds-architecture__connection", "aria-hidden": "true", children: [
2810
- /* @__PURE__ */ jsx(
2811
- "div",
2812
- {
2813
- className: clsx14(
2814
- "ds-architecture__line",
2815
- connections.find(
2816
- (c) => c.from === nodes[i - 1]?.id && c.to === node.id
2817
- )?.animated && "ds-architecture__line--animated"
2818
- )
2819
- }
2820
- ),
2821
- /* @__PURE__ */ jsx("span", { className: "ds-architecture__arrow", children: isHorizontal ? "\u2192" : "\u2193" }),
2822
- connections.find(
2823
- (c) => c.from === nodes[i - 1]?.id && c.to === node.id
2824
- )?.label && /* @__PURE__ */ jsx("span", { className: "ds-architecture__connection-label", children: connections.find(
2825
- (c) => c.from === nodes[i - 1]?.id && c.to === node.id
2826
- )?.label })
2827
- ] }),
2828
- /* @__PURE__ */ jsxs(
2829
- "div",
2830
- {
2831
- className: clsx14(
2832
- "ds-architecture__node",
2833
- `ds-architecture__node--${node.type}`
2834
- ),
2835
- title: node.description,
2836
- children: [
2837
- node.icon && /* @__PURE__ */ jsx("span", { className: "ds-architecture__node-icon", "aria-hidden": "true", children: node.icon }),
2838
- /* @__PURE__ */ jsx("span", { className: "ds-architecture__node-label", children: node.label })
2839
- ]
2840
- }
2841
- )
2842
- ] }, node.id)) })
2843
- }
2844
- );
2845
- }
2846
- );
2847
- ArchitectureDiagram.displayName = "ArchitectureDiagram";
2848
- function getUtmSegment(param) {
2849
- if (typeof window === "undefined") return null;
2850
- const url = new URL(window.location.href);
2851
- return url.searchParams.get(param);
2852
- }
2853
- function getCookieSegment(name) {
2854
- if (typeof document === "undefined") return null;
2855
- const match = document.cookie.match(new RegExp(`(?:^|;\\s*)${name}=([^;]*)`));
2856
- return match ? decodeURIComponent(match[1]) : null;
2857
- }
2858
- var SegmentSwitch = forwardRef(
2859
- ({
2860
- segment: controlledSegment,
2861
- segments,
2862
- fallback = null,
2863
- source = "manual",
2864
- utmParam = "utm_segment",
2865
- cookieName = "ds_segment",
2866
- className,
2867
- ...props
2868
- }, ref) => {
2869
- const resolvedSegment = useMemo(() => {
2870
- if (controlledSegment) return controlledSegment;
2871
- switch (source) {
2872
- case "utm":
2873
- return getUtmSegment(utmParam) ?? void 0;
2874
- case "cookie":
2875
- return getCookieSegment(cookieName) ?? void 0;
2876
- default:
2877
- return void 0;
2878
- }
2879
- }, [controlledSegment, source, utmParam, cookieName]);
2880
- const content = resolvedSegment && segments[resolvedSegment] ? segments[resolvedSegment] : fallback;
2881
- if (!content) return null;
2882
- return /* @__PURE__ */ jsx("div", { ref, className: clsx14(className), ...props, children: content });
2883
- }
2884
- );
2885
- SegmentSwitch.displayName = "SegmentSwitch";
2886
- var BrowserFrame = forwardRef(
2887
- ({
2888
- variant = "browser",
2889
- children,
2890
- url,
2891
- showControls,
2892
- withGlow = false,
2893
- aspectRatio = "16/9",
2894
- className,
2895
- ...props
2896
- }, ref) => {
2897
- const hasControls = showControls ?? (variant === "browser" || variant === "app");
2898
- return /* @__PURE__ */ jsxs(
2899
- "div",
2900
- {
2901
- ref,
2902
- className: clsx14(
2903
- "ds-browser-frame",
2904
- `ds-browser-frame--${variant}`,
2905
- withGlow && "ds-browser-frame--glow",
2906
- className
2907
- ),
2908
- ...props,
2909
- children: [
2910
- variant !== "minimal" && /* @__PURE__ */ jsxs("div", { className: "ds-browser-frame__chrome", children: [
2911
- hasControls && /* @__PURE__ */ jsxs("div", { className: "ds-browser-frame__controls", "aria-hidden": "true", children: [
2912
- /* @__PURE__ */ jsx("span", { className: "ds-browser-frame__dot ds-browser-frame__dot--red" }),
2913
- /* @__PURE__ */ jsx("span", { className: "ds-browser-frame__dot ds-browser-frame__dot--yellow" }),
2914
- /* @__PURE__ */ jsx("span", { className: "ds-browser-frame__dot ds-browser-frame__dot--green" })
2915
- ] }),
2916
- variant === "browser" && url && /* @__PURE__ */ jsxs("div", { className: "ds-browser-frame__url-bar", children: [
2917
- /* @__PURE__ */ jsxs("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none", "aria-hidden": "true", className: "ds-browser-frame__lock", children: [
2918
- /* @__PURE__ */ jsx("path", { d: "M3 5V4a3 3 0 116 0v1", stroke: "currentColor", strokeWidth: "1.2", strokeLinecap: "round" }),
2919
- /* @__PURE__ */ jsx("rect", { x: "2", y: "5", width: "8", height: "6", rx: "1.5", stroke: "currentColor", strokeWidth: "1.2" })
2920
- ] }),
2921
- /* @__PURE__ */ jsx("span", { className: "ds-browser-frame__url-text", children: url })
2922
- ] })
2923
- ] }),
2924
- /* @__PURE__ */ jsx(
2925
- "div",
2926
- {
2927
- className: "ds-browser-frame__content",
2928
- style: aspectRatio !== "auto" ? { aspectRatio } : void 0,
2929
- children
2930
- }
2931
- ),
2932
- variant === "mobile" && /* @__PURE__ */ jsx("div", { className: "ds-browser-frame__notch", "aria-hidden": "true" })
2933
- ]
2934
- }
2935
- );
2936
- }
2937
- );
2938
- BrowserFrame.displayName = "BrowserFrame";
2939
- function getEmbedUrl(src, muted = false) {
2940
- const ytMatch = src.match(/(?:youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/embed\/)([a-zA-Z0-9_-]+)/);
2941
- if (ytMatch) {
2942
- const params = muted ? "autoplay=1&mute=1&rel=0" : "autoplay=1&rel=0";
2943
- return `https://www.youtube.com/embed/${ytMatch[1]}?${params}`;
2944
- }
2945
- const vimeoMatch = src.match(/(?:vimeo\.com\/)(\d+)/);
2946
- if (vimeoMatch) {
2947
- const params = muted ? "autoplay=1&muted=1" : "autoplay=1";
2948
- return `https://player.vimeo.com/video/${vimeoMatch[1]}?${params}`;
2949
- }
2950
- const loomMatch = src.match(/(?:loom\.com\/share\/)([a-zA-Z0-9]+)/);
2951
- if (loomMatch) return `https://www.loom.com/embed/${loomMatch[1]}?autoplay=1`;
2952
- return src;
2953
- }
2954
- var VideoEmbed = forwardRef(
2955
- ({
2956
- src,
2957
- poster,
2958
- title,
2959
- aspectRatio = "16/9",
2960
- autoPlay = false,
2961
- withFrame = false,
2962
- onPlay,
2963
- className,
2964
- ...props
2965
- }, ref) => {
2966
- const [playing, setPlaying] = useState(false);
2967
- const containerRef = useRef(null);
2968
- const handlePlay = useCallback(() => {
2969
- setPlaying(true);
2970
- onPlay?.();
2971
- }, [onPlay]);
2972
- useEffect(() => {
2973
- if (!autoPlay || playing) return;
2974
- if (typeof window === "undefined") return;
2975
- const motionQuery = window.matchMedia("(prefers-reduced-motion: reduce)");
2976
- if (motionQuery.matches) return;
2977
- const target = containerRef.current;
2978
- if (!target) return;
2979
- const observer = new IntersectionObserver(
2980
- ([entry]) => {
2981
- if (entry.isIntersecting) {
2982
- handlePlay();
2983
- observer.disconnect();
2984
- }
2985
- },
2986
- { threshold: 0.5 }
2987
- );
2988
- observer.observe(target);
2989
- return () => observer.disconnect();
2990
- }, [autoPlay, playing, handlePlay]);
2991
- const embedContent = /* @__PURE__ */ jsx(
2992
- "div",
2993
- {
2994
- ref: containerRef,
2995
- className: clsx14("ds-video-embed", withFrame && "ds-video-embed--framed", className),
2996
- style: { aspectRatio },
2997
- children: !playing ? /* @__PURE__ */ jsxs(
2998
- "button",
2999
- {
3000
- type: "button",
3001
- className: "ds-video-embed__poster-btn",
3002
- onClick: handlePlay,
3003
- "aria-label": `Play video: ${title}`,
3004
- children: [
3005
- poster && /* @__PURE__ */ jsx(
3006
- "img",
3007
- {
3008
- src: poster,
3009
- alt: "",
3010
- className: "ds-video-embed__poster",
3011
- loading: "lazy",
3012
- decoding: "async"
3013
- }
3014
- ),
3015
- /* @__PURE__ */ jsx("div", { className: "ds-video-embed__overlay" }),
3016
- /* @__PURE__ */ jsx("div", { className: "ds-video-embed__play", "aria-hidden": "true", children: /* @__PURE__ */ jsxs("svg", { width: "48", height: "48", viewBox: "0 0 48 48", fill: "none", children: [
3017
- /* @__PURE__ */ jsx("circle", { cx: "24", cy: "24", r: "24", fill: "rgba(0,0,0,0.5)" }),
3018
- /* @__PURE__ */ jsx("path", { d: "M19 15l14 9-14 9V15z", fill: "white" })
3019
- ] }) })
3020
- ]
3021
- }
3022
- ) : /* @__PURE__ */ jsx(
3023
- "iframe",
3024
- {
3025
- src: getEmbedUrl(src, autoPlay),
3026
- title,
3027
- className: "ds-video-embed__iframe",
3028
- allow: "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",
3029
- allowFullScreen: true
3030
- }
3031
- )
3032
- }
3033
- );
3034
- if (withFrame) {
3035
- return /* @__PURE__ */ jsx(BrowserFrame, { ref, variant: "browser", url: src, ...props, children: embedContent });
3036
- }
3037
- return React31.cloneElement(embedContent, { ref, ...props });
3038
- }
3039
- );
3040
- VideoEmbed.displayName = "VideoEmbed";
3041
-
3042
- export { AnnouncementBar, ArchitectureDiagram, BeforeAfterBlock, BookingEmbed, CaseStudyCard, CaseStudySection, ComparisonTable, CompetitorDiff, ComplianceGrid, EcosystemDiagram, EnterpriseSignaling, EvolutionTimeline, ExitIntentOverlay, GuaranteeHighlight, ICPFilter, IntegrationShowcase, IntelligenceBlock, IntentCTA, LeadCaptureForm, ManifestoBlock, ObjectionFAQ, PartnerValueProp, PricingCard, PricingSection, PricingToggle, ProblemAgitation, ProcessTimeline, ROICalculator, SecurityBlock, SegmentSwitch, StakeholderTabs, StickyActionBar, ValueAnchor, VideoEmbed };
1
+ export { AnnouncementBar, ArchitectureDiagram, BeforeAfterBlock, BookingEmbed, CaseStudyCard, CaseStudySection, ComparisonTable, CompetitorDiff, ComplianceGrid, EcosystemDiagram, EnterpriseSignaling, EvolutionTimeline, ExitIntentOverlay, GuaranteeHighlight, ICPFilter, IntegrationShowcase, IntelligenceBlock, IntentCTA, LeadCaptureForm, ManifestoBlock, ObjectionFAQ, PartnerValueProp, PricingCard, PricingSection, PricingToggle, ProblemAgitation, ProcessTimeline, ROICalculator, SecurityBlock, SegmentSwitch, StakeholderTabs, StickyActionBar, ValueAnchor, VideoEmbed } from '../chunk-TW5JB35D.js';
2
+ import '../chunk-HRENHNDJ.js';
3
+ import '../chunk-3NKRFUAR.js';
4
+ import '../chunk-SICKWUWB.js';
5
+ import '../chunk-YSYR54XR.js';
6
+ import '../chunk-XWPDRMZG.js';
7
+ import '../chunk-2GARWEJK.js';
8
+ import '../chunk-Y3CPKNB7.js';
9
+ import '../chunk-KBA2LFBG.js';
10
+ import '../chunk-KJ2OXQF4.js';
11
+ import '../chunk-HN4PHABT.js';
3043
12
  //# sourceMappingURL=out.js.map
3044
13
  //# sourceMappingURL=index.js.map