@salesmind-ai/design-system 0.2.1 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/README.md +32 -2
  2. package/dist/AppearancePanel-UT57J69V.d.cts +51 -0
  3. package/dist/AppearancePanel-UT57J69V.d.ts +51 -0
  4. package/dist/AppearanceProvider-C36a8-eb.d.cts +45 -0
  5. package/dist/AppearanceProvider-C36a8-eb.d.ts +45 -0
  6. package/dist/Breadcrumb-RX-B_gDV.d.cts +44 -0
  7. package/dist/Breadcrumb-RX-B_gDV.d.ts +44 -0
  8. package/dist/ExportMenu-A2TLFiVv.d.cts +311 -0
  9. package/dist/ExportMenu-C8qck5AT.d.ts +311 -0
  10. package/dist/SectionShell-BfBw5q0Y.d.cts +18 -0
  11. package/dist/SectionShell-BfBw5q0Y.d.ts +18 -0
  12. package/dist/Select-BdZmK0Lt.d.cts +66 -0
  13. package/dist/Select-BdZmK0Lt.d.ts +66 -0
  14. package/dist/admin/index.cjs +2941 -0
  15. package/dist/admin/index.cjs.map +1 -0
  16. package/dist/admin/index.css +4145 -0
  17. package/dist/admin/index.css.map +1 -0
  18. package/dist/admin/index.d.cts +491 -0
  19. package/dist/admin/index.d.ts +491 -0
  20. package/dist/admin/index.js +2918 -0
  21. package/dist/admin/index.js.map +1 -0
  22. package/dist/{audit-CiyPkxk1.d.cts → audit-BS2fn7M4.d.ts} +2 -51
  23. package/dist/{audit-CiyPkxk1.d.ts → audit-DwCmg32J.d.cts} +2 -51
  24. package/dist/blog/index.cjs +1074 -0
  25. package/dist/blog/index.cjs.map +1 -0
  26. package/dist/blog/index.css +1422 -0
  27. package/dist/blog/index.css.map +1 -0
  28. package/dist/blog/index.d.cts +233 -0
  29. package/dist/blog/index.d.ts +233 -0
  30. package/dist/blog/index.js +1056 -0
  31. package/dist/blog/index.js.map +1 -0
  32. package/dist/chart-types-BGVVO-zl.d.cts +208 -0
  33. package/dist/chart-types-BGVVO-zl.d.ts +208 -0
  34. package/dist/charts/index.cjs +2698 -0
  35. package/dist/charts/index.cjs.map +1 -0
  36. package/dist/charts/index.css +1167 -0
  37. package/dist/charts/index.css.map +1 -0
  38. package/dist/charts/index.d.cts +453 -0
  39. package/dist/charts/index.d.ts +453 -0
  40. package/dist/charts/index.js +2682 -0
  41. package/dist/charts/index.js.map +1 -0
  42. package/dist/core/index.cjs +526 -395
  43. package/dist/core/index.cjs.map +1 -1
  44. package/dist/core/index.css +294 -0
  45. package/dist/core/index.css.map +1 -1
  46. package/dist/core/index.d.cts +7 -982
  47. package/dist/core/index.d.ts +7 -982
  48. package/dist/core/index.js +476 -351
  49. package/dist/core/index.js.map +1 -1
  50. package/dist/i18n/index.cjs +585 -0
  51. package/dist/i18n/index.cjs.map +1 -0
  52. package/dist/i18n/index.d.cts +855 -0
  53. package/dist/i18n/index.d.ts +855 -0
  54. package/dist/i18n/index.js +547 -0
  55. package/dist/i18n/index.js.map +1 -0
  56. package/dist/index.cjs +3 -2
  57. package/dist/index.cjs.map +1 -1
  58. package/dist/index.css +11 -7
  59. package/dist/index.css.map +1 -1
  60. package/dist/index.d.cts +22 -1290
  61. package/dist/index.d.ts +22 -1290
  62. package/dist/index.js +3 -2
  63. package/dist/index.js.map +1 -1
  64. package/dist/marketing/index.cjs +2144 -3023
  65. package/dist/marketing/index.cjs.map +1 -1
  66. package/dist/marketing/index.css +3729 -4824
  67. package/dist/marketing/index.css.map +1 -1
  68. package/dist/marketing/index.d.cts +1351 -4
  69. package/dist/marketing/index.d.ts +1351 -4
  70. package/dist/marketing/index.js +2190 -3054
  71. package/dist/marketing/index.js.map +1 -1
  72. package/dist/motion/index.cjs +1230 -0
  73. package/dist/motion/index.cjs.map +1 -0
  74. package/dist/motion/index.css +699 -0
  75. package/dist/motion/index.css.map +1 -0
  76. package/dist/motion/index.d.cts +68 -0
  77. package/dist/motion/index.d.ts +68 -0
  78. package/dist/motion/index.js +1218 -0
  79. package/dist/motion/index.js.map +1 -0
  80. package/dist/nav/index.cjs +1533 -0
  81. package/dist/nav/index.cjs.map +1 -0
  82. package/dist/nav/index.css +1984 -0
  83. package/dist/nav/index.css.map +1 -0
  84. package/dist/nav/index.d.cts +279 -0
  85. package/dist/nav/index.d.ts +279 -0
  86. package/dist/nav/index.js +1501 -0
  87. package/dist/nav/index.js.map +1 -0
  88. package/dist/report/index.cjs +26 -1649
  89. package/dist/report/index.cjs.map +1 -1
  90. package/dist/report/index.css +0 -963
  91. package/dist/report/index.css.map +1 -1
  92. package/dist/report/index.d.cts +4 -2
  93. package/dist/report/index.d.ts +4 -2
  94. package/dist/report/index.js +27 -1640
  95. package/dist/report/index.js.map +1 -1
  96. package/dist/sections/index.cjs +385 -0
  97. package/dist/sections/index.cjs.map +1 -0
  98. package/dist/sections/index.css +815 -0
  99. package/dist/sections/index.css.map +1 -0
  100. package/dist/sections/index.d.cts +69 -0
  101. package/dist/sections/index.d.ts +69 -0
  102. package/dist/sections/index.js +374 -0
  103. package/dist/sections/index.js.map +1 -0
  104. package/dist/social-proof/index.cjs +1255 -0
  105. package/dist/social-proof/index.cjs.map +1 -0
  106. package/dist/social-proof/index.css +1423 -0
  107. package/dist/social-proof/index.css.map +1 -0
  108. package/dist/social-proof/index.d.cts +258 -0
  109. package/dist/social-proof/index.d.ts +258 -0
  110. package/dist/social-proof/index.js +1238 -0
  111. package/dist/social-proof/index.js.map +1 -0
  112. package/dist/theme/index.cjs +573 -0
  113. package/dist/theme/index.cjs.map +1 -0
  114. package/dist/theme/index.css +464 -0
  115. package/dist/theme/index.css.map +1 -0
  116. package/dist/theme/index.d.cts +48 -0
  117. package/dist/theme/index.d.ts +48 -0
  118. package/dist/theme/index.js +558 -0
  119. package/dist/theme/index.js.map +1 -0
  120. package/dist/types-DAlgDGzw.d.cts +52 -0
  121. package/dist/types-DAlgDGzw.d.ts +52 -0
  122. package/dist/web/client/index.cjs +501 -0
  123. package/dist/web/client/index.cjs.map +1 -0
  124. package/dist/web/client/index.css +456 -0
  125. package/dist/web/client/index.css.map +1 -0
  126. package/dist/web/client/index.d.cts +172 -0
  127. package/dist/web/client/index.d.ts +172 -0
  128. package/dist/web/client/index.js +486 -0
  129. package/dist/web/client/index.js.map +1 -0
  130. package/dist/web/index.d.cts +6 -893
  131. package/dist/web/index.d.ts +6 -893
  132. package/dist/web/server/index.cjs +569 -0
  133. package/dist/web/server/index.cjs.map +1 -0
  134. package/dist/web/server/index.d.cts +725 -0
  135. package/dist/web/server/index.d.ts +725 -0
  136. package/dist/web/server/index.js +562 -0
  137. package/dist/web/server/index.js.map +1 -0
  138. package/package.json +81 -9
  139. package/dist/ExportMenu-hEe5MhLq.d.cts +0 -1027
  140. package/dist/ExportMenu-hEe5MhLq.d.ts +0 -1027
  141. package/dist/index-B64suAAc.d.cts +0 -1498
  142. package/dist/index-B64suAAc.d.ts +0 -1498
@@ -0,0 +1,1255 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var React5 = require('react');
5
+ var clsx7 = require('clsx');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+ var framerMotion = require('framer-motion');
8
+ var dialog = require('@base-ui/react/dialog');
9
+
10
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
11
+
12
+ var React5__default = /*#__PURE__*/_interopDefault(React5);
13
+ var clsx7__default = /*#__PURE__*/_interopDefault(clsx7);
14
+
15
+ // src/components/SocialProof/Card.tsx
16
+ var StarRating = React5.forwardRef(
17
+ ({
18
+ value,
19
+ max = 5,
20
+ size = "md",
21
+ animate = false,
22
+ showValue = false,
23
+ valueLabel,
24
+ className,
25
+ ...props
26
+ }, ref) => {
27
+ const [visible, setVisible] = React5.useState(!animate);
28
+ const containerRef = React5.useRef(null);
29
+ React5.useEffect(() => {
30
+ if (!animate) return;
31
+ if (typeof window !== "undefined") {
32
+ const mq = window.matchMedia("(prefers-reduced-motion: reduce)");
33
+ if (mq.matches) {
34
+ setVisible(true);
35
+ return;
36
+ }
37
+ }
38
+ const target = containerRef.current;
39
+ if (!target) return;
40
+ const observer = new IntersectionObserver(
41
+ ([entry]) => {
42
+ if (entry.isIntersecting) {
43
+ setVisible(true);
44
+ observer.disconnect();
45
+ }
46
+ },
47
+ { threshold: 0.5 }
48
+ );
49
+ observer.observe(target);
50
+ return () => observer.disconnect();
51
+ }, [animate]);
52
+ const clampedValue = Math.min(Math.max(value, 0), max);
53
+ const stars = Array.from({ length: max }, (_, i) => {
54
+ const starIndex = i + 1;
55
+ const fillPercent = clampedValue >= starIndex ? 100 : clampedValue > starIndex - 1 ? (clampedValue - (starIndex - 1)) * 100 : 0;
56
+ return /* @__PURE__ */ jsxRuntime.jsxs(
57
+ "span",
58
+ {
59
+ className: clsx7__default.default(
60
+ "ds-star-rating__star",
61
+ visible && "ds-star-rating__star--visible"
62
+ ),
63
+ style: {
64
+ "--star-fill": `${fillPercent}%`,
65
+ "--star-delay": animate ? `${i * 100}ms` : "0ms"
66
+ },
67
+ children: [
68
+ /* @__PURE__ */ jsxRuntime.jsx(
69
+ "svg",
70
+ {
71
+ viewBox: "0 0 24 24",
72
+ fill: "none",
73
+ xmlns: "http://www.w3.org/2000/svg",
74
+ className: "ds-star-rating__svg",
75
+ "aria-hidden": "true",
76
+ children: /* @__PURE__ */ jsxRuntime.jsx(
77
+ "path",
78
+ {
79
+ d: "M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z",
80
+ className: "ds-star-rating__empty"
81
+ }
82
+ )
83
+ }
84
+ ),
85
+ /* @__PURE__ */ jsxRuntime.jsx(
86
+ "svg",
87
+ {
88
+ viewBox: "0 0 24 24",
89
+ fill: "none",
90
+ xmlns: "http://www.w3.org/2000/svg",
91
+ className: "ds-star-rating__svg ds-star-rating__svg--filled",
92
+ "aria-hidden": "true",
93
+ style: {
94
+ clipPath: `inset(0 ${100 - fillPercent}% 0 0)`
95
+ },
96
+ children: /* @__PURE__ */ jsxRuntime.jsx(
97
+ "path",
98
+ {
99
+ d: "M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z",
100
+ className: "ds-star-rating__filled"
101
+ }
102
+ )
103
+ }
104
+ )
105
+ ]
106
+ },
107
+ i
108
+ );
109
+ });
110
+ return /* @__PURE__ */ jsxRuntime.jsxs(
111
+ "div",
112
+ {
113
+ ref: (node) => {
114
+ containerRef.current = node;
115
+ if (typeof ref === "function") ref(node);
116
+ else if (ref) ref.current = node;
117
+ },
118
+ className: clsx7__default.default("ds-star-rating", `ds-star-rating--${size}`, className),
119
+ role: "img",
120
+ "aria-label": `${clampedValue} out of ${max} stars`,
121
+ ...props,
122
+ children: [
123
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-star-rating__stars", children: stars }),
124
+ showValue && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ds-star-rating__value", children: [
125
+ clampedValue.toLocaleString(void 0, {
126
+ minimumFractionDigits: clampedValue % 1 !== 0 ? 1 : 0,
127
+ maximumFractionDigits: 1
128
+ }),
129
+ valueLabel && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-star-rating__value-label", children: valueLabel })
130
+ ] })
131
+ ]
132
+ }
133
+ );
134
+ }
135
+ );
136
+ StarRating.displayName = "StarRating";
137
+ var TrustpilotIcon = ({ size }) => /* @__PURE__ */ jsxRuntime.jsx("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 2l2.9 8.9H24l-7.35 5.34 2.81 8.64L12 19.56l-7.46 5.32 2.81-8.64L0 10.9h9.1L12 2z", fill: "#00B67A" }) });
138
+ var G2Icon = ({ size }) => /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", children: [
139
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2z", fill: "#FF492C" }),
140
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: "50%", y: "54%", dominantBaseline: "middle", textAnchor: "middle", fill: "white", fontWeight: "bold", fontSize: "11", fontFamily: "Arial, sans-serif", children: "G2" })
141
+ ] });
142
+ var GoogleIcon = ({ size }) => /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", children: [
143
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 01-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z", fill: "#4285F4" }),
144
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z", fill: "#34A853" }),
145
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18A10.96 10.96 0 001 12c0 1.77.42 3.45 1.18 4.93l3.66-2.84z", fill: "#FBBC05" }),
146
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z", fill: "#EA4335" })
147
+ ] });
148
+ var ChromeWebStoreIcon = ({ size }) => /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", children: [
149
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "10", fill: "#4285F4", opacity: "0.1", stroke: "#4285F4", strokeWidth: "1.5" }),
150
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 7c-2.76 0-5 2.24-5 5s2.24 5 5 5 5-2.24 5-5-2.24-5-5-5zm0 8.5c-1.93 0-3.5-1.57-3.5-3.5S10.07 8.5 12 8.5s3.5 1.57 3.5 3.5-1.57 3.5-3.5 3.5z", fill: "#4285F4" }),
151
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M7.5 10.5L4 5.5", stroke: "#EA4335", strokeWidth: "1.5", strokeLinecap: "round" }),
152
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M16.5 10.5L20 5.5", stroke: "#FBBC05", strokeWidth: "1.5", strokeLinecap: "round" }),
153
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 17l-3.5 5", stroke: "#34A853", strokeWidth: "1.5", strokeLinecap: "round" })
154
+ ] });
155
+ var PLATFORM_ICONS = {
156
+ trustpilot: TrustpilotIcon,
157
+ g2: G2Icon,
158
+ google: GoogleIcon,
159
+ "chrome-web-store": ChromeWebStoreIcon
160
+ };
161
+ var PLATFORM_LABELS = {
162
+ trustpilot: "Trustpilot",
163
+ g2: "G2",
164
+ google: "Google",
165
+ "chrome-web-store": "Chrome Web Store"
166
+ };
167
+ var PLATFORM_COLORS = {
168
+ trustpilot: "#00B67A",
169
+ g2: "#FF492C",
170
+ google: "#4285F4",
171
+ "chrome-web-store": "#4285F4"
172
+ };
173
+ var PlatformBadge = React5.forwardRef(
174
+ ({
175
+ platform,
176
+ variant = "icon-label",
177
+ rating,
178
+ count,
179
+ size = "sm",
180
+ className,
181
+ ...props
182
+ }, ref) => {
183
+ const Icon = PLATFORM_ICONS[platform];
184
+ const label = PLATFORM_LABELS[platform];
185
+ const accentColor = PLATFORM_COLORS[platform];
186
+ const iconSize = size === "sm" ? 18 : 22;
187
+ return /* @__PURE__ */ jsxRuntime.jsxs(
188
+ "div",
189
+ {
190
+ ref,
191
+ role: "img",
192
+ className: clsx7__default.default(
193
+ "ds-platform-badge",
194
+ `ds-platform-badge--${variant}`,
195
+ `ds-platform-badge--${size}`,
196
+ className
197
+ ),
198
+ style: { "--platform-accent": accentColor },
199
+ "aria-label": variant === "full" && rating ? `${label}: ${rating} stars${count ? ` from ${count} reviews` : ""}` : label,
200
+ ...props,
201
+ children: [
202
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-platform-badge__icon", children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { size: iconSize }) }),
203
+ variant !== "icon-only" && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-platform-badge__label", children: label }),
204
+ variant === "full" && rating != null && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ds-platform-badge__rating", children: [
205
+ /* @__PURE__ */ jsxRuntime.jsx(StarRating, { value: rating, size: "sm" }),
206
+ count != null && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ds-platform-badge__count", children: [
207
+ "(",
208
+ count,
209
+ ")"
210
+ ] })
211
+ ] })
212
+ ]
213
+ }
214
+ );
215
+ }
216
+ );
217
+ PlatformBadge.displayName = "PlatformBadge";
218
+ var UtmContext = React5.createContext(null);
219
+
220
+ // src/web/utm/useUtmDefaults.ts
221
+ function useUtmDefaults() {
222
+ return React5.useContext(UtmContext);
223
+ }
224
+
225
+ // src/web/utm/builders.ts
226
+ var PLACEHOLDER_ORIGIN = "https://__placeholder__.internal";
227
+ function buildUtmUrl(baseUrl, params) {
228
+ const isRelative = baseUrl.startsWith("/");
229
+ let url;
230
+ try {
231
+ url = isRelative ? new URL(baseUrl, PLACEHOLDER_ORIGIN) : new URL(baseUrl);
232
+ } catch {
233
+ return baseUrl;
234
+ }
235
+ const existingParams = [];
236
+ url.searchParams.forEach((value, key) => {
237
+ existingParams.push([key, value]);
238
+ });
239
+ for (const [key] of existingParams) {
240
+ url.searchParams.delete(key);
241
+ }
242
+ for (const [key, value] of existingParams) {
243
+ if (!key.startsWith("utm_")) {
244
+ url.searchParams.set(key, value);
245
+ }
246
+ }
247
+ url.searchParams.set("utm_source", params.source);
248
+ url.searchParams.set("utm_medium", params.medium);
249
+ url.searchParams.set("utm_campaign", params.campaign);
250
+ if (params.term !== void 0) {
251
+ url.searchParams.set("utm_term", params.term);
252
+ }
253
+ if (params.content !== void 0) {
254
+ url.searchParams.set("utm_content", params.content);
255
+ }
256
+ if (isRelative) {
257
+ return url.href.replace(PLACEHOLDER_ORIGIN, "");
258
+ }
259
+ return url.href;
260
+ }
261
+
262
+ // src/web/utm/classifiers.ts
263
+ var INTERNAL_PATTERNS = [
264
+ /^\/(?!\/)/,
265
+ // Relative paths
266
+ /^https?:\/\/(www\.)?sales-mind\.ai/i,
267
+ // Marketing site
268
+ /^https?:\/\/app\.sales-mind\.ai/i,
269
+ // Web app
270
+ /^https?:\/\/apps\.sales-mind\.ai/i,
271
+ // Web app (legacy)
272
+ /^https?:\/\/meet\.sales-mind\.ai/i,
273
+ // Booking
274
+ /^https?:\/\/docs\.sales-mind\.ai/i
275
+ // Docs
276
+ ];
277
+ var SYSTEM_PATTERNS = [
278
+ /^https?:\/\/.*\/api\//i,
279
+ // API endpoints
280
+ /^https?:\/\/.*\/webhook/i,
281
+ // Webhooks
282
+ /^https?:\/\/.*\/oauth/i,
283
+ // OAuth callbacks
284
+ /^https?:\/\/.*\/callback/i,
285
+ // Callbacks
286
+ /^https?:\/\/.*\.supabase\.(co|com)/i,
287
+ // Supabase
288
+ /^https?:\/\/.*\.firebaseapp\.com/i,
289
+ // Firebase
290
+ /^https?:\/\/.*\.cloudfunctions\.net/i
291
+ // Cloud Functions
292
+ ];
293
+ var ASSET_PATTERNS = [
294
+ /\.(css|js|mjs|map|woff2?|ttf|eot|svg|png|jpe?g|gif|webp|avif|ico|pdf)(\?.*)?$/i
295
+ ];
296
+ var CONVERSION_PATTERNS = [
297
+ /^https?:\/\/(www\.)?calendly\.com/i,
298
+ /^https?:\/\/(checkout\.)?stripe\.com/i,
299
+ /^https?:\/\/buy\.stripe\.com/i,
300
+ /^https?:\/\/chromewebstore\.google\.com/i,
301
+ /^https?:\/\/meet\.sales-mind\.ai/i
302
+ ];
303
+ var PROTOCOL_EXEMPT = [
304
+ /^mailto:/i,
305
+ /^tel:/i,
306
+ /^#/,
307
+ /^javascript:/i
308
+ ];
309
+ function classifyUrl(url) {
310
+ if (PROTOCOL_EXEMPT.some((p) => p.test(url))) return "protocol";
311
+ if (ASSET_PATTERNS.some((p) => p.test(url))) return "asset";
312
+ if (SYSTEM_PATTERNS.some((p) => p.test(url))) return "system";
313
+ if (CONVERSION_PATTERNS.some((p) => p.test(url))) return "conversion";
314
+ if (INTERNAL_PATTERNS.some((p) => p.test(url))) return "internal";
315
+ return "external";
316
+ }
317
+
318
+ // src/components/OutboundLink/outbound-link-utils.ts
319
+ var LEGACY_UTM_SOURCE = "salesmind";
320
+ var EXEMPT_PATTERNS = [
321
+ /^https?:\/\/(www\.)?(stripe\.com|checkout\.stripe\.com|paypal\.com)/i,
322
+ /^https?:\/\/(www\.)?github\.com\/login\/oauth/i
323
+ ];
324
+ var isExemptUrl = (urlStr) => {
325
+ if (urlStr.startsWith("mailto:") || urlStr.startsWith("tel:")) return true;
326
+ const classification = classifyUrl(urlStr);
327
+ if (classification === "system" || classification === "protocol" || classification === "asset") {
328
+ return true;
329
+ }
330
+ return EXEMPT_PATTERNS.some((pattern) => pattern.test(urlStr));
331
+ };
332
+ var appendGovernedUTMs = (href, params, preserveExisting = true) => {
333
+ try {
334
+ const url = new URL(href);
335
+ if (preserveExisting) {
336
+ const hasAll = url.searchParams.has("utm_source") && url.searchParams.has("utm_medium") && url.searchParams.has("utm_campaign");
337
+ if (hasAll) return href;
338
+ }
339
+ return buildUtmUrl(href, params);
340
+ } catch {
341
+ return href;
342
+ }
343
+ };
344
+ var appendUTMs = (href, context, pageSlug, options) => {
345
+ try {
346
+ const url = new URL(href);
347
+ const { mediumOverride = "outbound_link", campaignOverride, preserveExisting = true } = options;
348
+ const utms = {
349
+ utm_source: LEGACY_UTM_SOURCE,
350
+ utm_medium: mediumOverride,
351
+ utm_campaign: campaignOverride || pageSlug,
352
+ utm_content: context
353
+ };
354
+ Object.entries(utms).forEach(([key, value]) => {
355
+ if (value) {
356
+ if (preserveExisting && url.searchParams.has(key)) {
357
+ return;
358
+ }
359
+ url.searchParams.set(key, value);
360
+ }
361
+ });
362
+ return url.toString();
363
+ } catch {
364
+ return href;
365
+ }
366
+ };
367
+ var OutboundLink = React5.forwardRef(
368
+ ({
369
+ href,
370
+ context,
371
+ campaignOverride,
372
+ mediumOverride = "outbound_link",
373
+ preserveExistingUTM = true,
374
+ openInNewTab = true,
375
+ disableTracking = false,
376
+ utmParams,
377
+ onClick,
378
+ children,
379
+ ...props
380
+ }, ref) => {
381
+ const contextParams = useUtmDefaults();
382
+ const resolvedUtmParams = utmParams ?? contextParams;
383
+ let hostname = "";
384
+ try {
385
+ const url = new URL(href);
386
+ hostname = url.hostname;
387
+ } catch {
388
+ }
389
+ const [finalHref, setFinalHref] = React5.useState(href);
390
+ React5.useEffect(() => {
391
+ let isExternal = false;
392
+ let currentMedium = mediumOverride;
393
+ try {
394
+ const url = new URL(href);
395
+ const currentHost = window.location.hostname;
396
+ isExternal = url.hostname !== currentHost;
397
+ if (isExternal && currentHost.includes("sales-mind.ai") && url.hostname.includes("sales-mind.ai")) {
398
+ if (currentMedium === "outbound_link") {
399
+ currentMedium = "cross_subdomain";
400
+ }
401
+ }
402
+ } catch {
403
+ isExternal = false;
404
+ }
405
+ const isExempt = isExemptUrl(href) || disableTracking;
406
+ if (isExternal && !isExempt) {
407
+ if (resolvedUtmParams) {
408
+ setFinalHref(appendGovernedUTMs(href, resolvedUtmParams, preserveExistingUTM));
409
+ } else {
410
+ const pageSlug = window.location.pathname.replace(/^\/|\/$/g, "") || "home";
411
+ setFinalHref(appendUTMs(href, context, pageSlug, {
412
+ mediumOverride: currentMedium,
413
+ campaignOverride,
414
+ preserveExisting: preserveExistingUTM
415
+ }));
416
+ }
417
+ } else {
418
+ setFinalHref(href);
419
+ }
420
+ }, [href, context, mediumOverride, campaignOverride, preserveExistingUTM, disableTracking, resolvedUtmParams]);
421
+ const handleClick = (e) => {
422
+ if (typeof window === "undefined" || disableTracking) {
423
+ onClick?.(e);
424
+ return;
425
+ }
426
+ let clickExternal = false;
427
+ let clickCrossSubdomain = false;
428
+ let clickMedium = mediumOverride;
429
+ try {
430
+ const url = new URL(href);
431
+ const currentHost = window.location.hostname;
432
+ clickExternal = url.hostname !== currentHost;
433
+ if (clickExternal && currentHost.includes("sales-mind.ai") && url.hostname.includes("sales-mind.ai")) {
434
+ clickCrossSubdomain = true;
435
+ if (clickMedium === "outbound_link") {
436
+ clickMedium = "cross_subdomain";
437
+ }
438
+ }
439
+ } catch {
440
+ }
441
+ if (clickExternal) {
442
+ const detail = {
443
+ destination_domain: hostname,
444
+ destination_url: finalHref,
445
+ utm_medium_type: clickMedium,
446
+ page_slug: window.location.pathname,
447
+ component_location: context,
448
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
449
+ is_cross_subdomain: clickCrossSubdomain
450
+ };
451
+ const event = new CustomEvent("outbound_click", { detail });
452
+ window.dispatchEvent(event);
453
+ }
454
+ onClick?.(e);
455
+ };
456
+ const relParts = [];
457
+ let shouldOpenNewTab = openInNewTab;
458
+ try {
459
+ const url = new URL(href);
460
+ if (typeof window !== "undefined") {
461
+ const currentHost = window.location.hostname;
462
+ if (url.hostname !== currentHost && currentHost.includes("sales-mind.ai") && url.hostname.includes("sales-mind.ai")) {
463
+ shouldOpenNewTab = false;
464
+ }
465
+ }
466
+ } catch {
467
+ }
468
+ if (shouldOpenNewTab) relParts.push("noopener", "noreferrer");
469
+ if (mediumOverride === "citation") relParts.push("nofollow");
470
+ const rel = relParts.length > 0 ? relParts.join(" ") : void 0;
471
+ return (
472
+ // eslint-disable-next-line no-restricted-syntax
473
+ /* @__PURE__ */ jsxRuntime.jsx(
474
+ "a",
475
+ {
476
+ ref,
477
+ href: finalHref,
478
+ target: shouldOpenNewTab ? "_blank" : void 0,
479
+ rel,
480
+ onClick: handleClick,
481
+ ...props,
482
+ children
483
+ }
484
+ )
485
+ );
486
+ }
487
+ );
488
+ OutboundLink.displayName = "OutboundLink";
489
+ var PlayIcon = () => /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M8 5v14l11-7z" }) });
490
+ var SocialProofCard = React5.forwardRef(
491
+ ({
492
+ variant = "simple",
493
+ content,
494
+ author,
495
+ media,
496
+ sourceIcon,
497
+ platform,
498
+ starRating,
499
+ date,
500
+ badges,
501
+ ctaText,
502
+ href,
503
+ className,
504
+ children,
505
+ animationDelay,
506
+ headline,
507
+ logo,
508
+ industry,
509
+ metrics,
510
+ ...props
511
+ }, ref) => {
512
+ const cardClass = clsx7__default.default(
513
+ "ds-social-card",
514
+ `ds-social-card--${variant}`,
515
+ animationDelay != null && "ds-social-card--animated",
516
+ className
517
+ );
518
+ const cardStyle = animationDelay != null ? { "--card-delay": `${animationDelay}ms` } : void 0;
519
+ if (variant === "rating-only") {
520
+ const inner = /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-social-card__rating-row", children: [
521
+ starRating != null && /* @__PURE__ */ jsxRuntime.jsx(StarRating, { value: starRating, size: "lg" }),
522
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-social-card__meta", children: [
523
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-social-card__name", children: author.name }),
524
+ (author.role || author.company) && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ds-social-card__role", children: [
525
+ author.role,
526
+ author.role && author.company && " \xB7 ",
527
+ author.company
528
+ ] })
529
+ ] }),
530
+ platform && /* @__PURE__ */ jsxRuntime.jsx(PlatformBadge, { platform, variant: "icon-label", size: "sm" })
531
+ ] }) });
532
+ if (href) {
533
+ return /* @__PURE__ */ jsxRuntime.jsx(OutboundLink, { ref, href, context: "social-proof-card", className: cardClass, style: cardStyle, openInNewTab: false, ...props, children: inner });
534
+ }
535
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: cardClass, style: cardStyle, ...props, children: inner });
536
+ }
537
+ if (variant === "case-study") {
538
+ const defaultCta2 = ctaText || "Read Case Study \u2192";
539
+ const inner = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
540
+ media && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-social-card__media", children: /* @__PURE__ */ jsxRuntime.jsx("img", { src: media.src, alt: media.alt || `${author.company} case study` }) }),
541
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-social-card__content", children: [
542
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-social-card__cs-header", children: [
543
+ logo && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-social-card__cs-logo", children: logo }),
544
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-social-card__cs-company", children: [
545
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-social-card__name", children: author.company || author.name }),
546
+ industry && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-social-card__cs-industry", children: industry })
547
+ ] })
548
+ ] }),
549
+ headline && /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "ds-social-card__cs-headline", children: headline }),
550
+ metrics && metrics.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-social-card__cs-metrics", children: metrics.map((m, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-social-card__cs-metric", children: [
551
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ds-social-card__cs-metric-value", children: [
552
+ m.prefix,
553
+ m.value,
554
+ m.suffix
555
+ ] }),
556
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-social-card__cs-metric-label", children: m.label })
557
+ ] }, i)) }),
558
+ content && /* @__PURE__ */ jsxRuntime.jsxs("blockquote", { className: "ds-social-card__quote ds-social-card__quote--excerpt", children: [
559
+ "\u201C",
560
+ content,
561
+ "\u201D"
562
+ ] }),
563
+ href && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-social-card__cta", children: defaultCta2 })
564
+ ] })
565
+ ] });
566
+ if (href) {
567
+ return /* @__PURE__ */ jsxRuntime.jsx(OutboundLink, { ref, href, context: "social-proof-card", className: cardClass, style: cardStyle, openInNewTab: false, ...props, children: inner });
568
+ }
569
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: cardClass, style: cardStyle, ...props, children: inner });
570
+ }
571
+ if (variant === "video") {
572
+ const defaultCta2 = ctaText || "Watch Video \u2192";
573
+ const inner = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
574
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-social-card__media", children: [
575
+ media ? /* @__PURE__ */ jsxRuntime.jsx("img", { src: media.src, alt: media.alt || `${author.name} video` }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-social-card__media-placeholder" }),
576
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-social-card__play", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-social-card__play-icon", children: /* @__PURE__ */ jsxRuntime.jsx(PlayIcon, {}) }) }),
577
+ badges && badges.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-social-card__badges", children: badges.map((badge, idx) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-social-card__badge", children: badge }, idx)) })
578
+ ] }),
579
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-social-card__content", children: [
580
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-social-card__author", children: [
581
+ author.avatar && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-social-card__avatar", children: /* @__PURE__ */ jsxRuntime.jsx("img", { src: author.avatar, alt: author.name }) }),
582
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-social-card__meta", children: [
583
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-social-card__name", children: author.name }),
584
+ (author.role || author.company) && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ds-social-card__role", children: [
585
+ author.role,
586
+ author.role && author.company && " \xB7 ",
587
+ author.company
588
+ ] })
589
+ ] }),
590
+ platform && /* @__PURE__ */ jsxRuntime.jsx(PlatformBadge, { platform, variant: "icon-only", size: "sm" })
591
+ ] }),
592
+ content && /* @__PURE__ */ jsxRuntime.jsx("blockquote", { className: "ds-social-card__quote", children: content }),
593
+ href && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-social-card__cta", children: defaultCta2 })
594
+ ] })
595
+ ] });
596
+ if (href) {
597
+ return /* @__PURE__ */ jsxRuntime.jsx(OutboundLink, { ref, href, context: "social-proof-card", className: cardClass, style: cardStyle, openInNewTab: false, ...props, children: inner });
598
+ }
599
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: cardClass, style: cardStyle, ...props, children: inner });
600
+ }
601
+ if (variant === "social") {
602
+ const inner = /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-social-card__content", children: [
603
+ (platform || sourceIcon) && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-social-card__source", children: platform ? /* @__PURE__ */ jsxRuntime.jsx(PlatformBadge, { platform, variant: "icon-only", size: "sm" }) : sourceIcon }),
604
+ content && /* @__PURE__ */ jsxRuntime.jsx("blockquote", { className: "ds-social-card__quote ds-social-card__quote--clamp", children: content }),
605
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-social-card__author", children: [
606
+ author.avatar && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-social-card__avatar", children: /* @__PURE__ */ jsxRuntime.jsx("img", { src: author.avatar, alt: author.name }) }),
607
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-social-card__meta", children: [
608
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-social-card__name", children: author.name }),
609
+ (author.role || author.company) && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ds-social-card__role", children: [
610
+ author.role,
611
+ author.role && author.company && " \xB7 ",
612
+ author.company
613
+ ] }),
614
+ date && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-social-card__role", children: date })
615
+ ] })
616
+ ] }),
617
+ starRating != null && /* @__PURE__ */ jsxRuntime.jsx(StarRating, { value: starRating, size: "sm" }),
618
+ children
619
+ ] }) });
620
+ if (href) {
621
+ return /* @__PURE__ */ jsxRuntime.jsx(OutboundLink, { ref, href, context: "social-proof-card", className: cardClass, style: cardStyle, openInNewTab: false, ...props, children: inner });
622
+ }
623
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: cardClass, style: cardStyle, ...props, children: inner });
624
+ }
625
+ const BadgeList = badges && badges.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-social-card__badges", children: badges.map((badge, idx) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-social-card__badge", children: badge }, idx)) });
626
+ const defaultCta = ctaText || "Read Story \u2192";
627
+ const simpleInner = /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-social-card__content", children: [
628
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-social-card__deco-quote", "aria-hidden": "true", children: "\u201C" }),
629
+ (platform || sourceIcon) && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-social-card__source", children: platform ? /* @__PURE__ */ jsxRuntime.jsx(PlatformBadge, { platform, variant: "icon-only", size: "sm" }) : sourceIcon }),
630
+ BadgeList,
631
+ content && /* @__PURE__ */ jsxRuntime.jsx("blockquote", { className: "ds-social-card__quote", children: content }),
632
+ starRating != null && /* @__PURE__ */ jsxRuntime.jsx(StarRating, { value: starRating, size: "sm" }),
633
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-social-card__author", children: [
634
+ author.avatar && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-social-card__avatar", children: /* @__PURE__ */ jsxRuntime.jsx("img", { src: author.avatar, alt: author.name }) }),
635
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-social-card__meta", children: [
636
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ds-social-card__name", children: [
637
+ author.name,
638
+ author.handle && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ds-social-card__handle", children: [
639
+ "@",
640
+ author.handle
641
+ ] })
642
+ ] }),
643
+ (author.role || author.company) && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ds-social-card__role", children: [
644
+ author.role,
645
+ author.role && author.company && " \xB7 ",
646
+ author.company
647
+ ] }),
648
+ date && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-social-card__role", children: date })
649
+ ] })
650
+ ] }),
651
+ children,
652
+ href && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-social-card__cta", children: defaultCta })
653
+ ] });
654
+ if (href) {
655
+ return /* @__PURE__ */ jsxRuntime.jsx(OutboundLink, { ref, href, context: "social-proof-card", className: cardClass, style: cardStyle, openInNewTab: false, ...props, children: simpleInner });
656
+ }
657
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: cardClass, style: cardStyle, ...props, children: simpleInner });
658
+ }
659
+ );
660
+ SocialProofCard.displayName = "SocialProofCard";
661
+
662
+ // src/tokens/spacing.ts
663
+ var SPACING = {
664
+ 1: "var(--space-1)",
665
+ 2: "var(--space-2)",
666
+ 3: "var(--space-3)",
667
+ 4: "var(--space-4)",
668
+ 5: "var(--space-5)",
669
+ 6: "var(--space-6)",
670
+ 8: "var(--space-8)",
671
+ 10: "var(--space-10)",
672
+ 12: "var(--space-12)",
673
+ 16: "var(--space-16)",
674
+ 20: "var(--space-20)"
675
+ };
676
+
677
+ // src/components/LayoutPrimitives/utils.ts
678
+ var SPACING_ALIASES = {
679
+ xs: "var(--space-2)",
680
+ sm: "var(--space-3)",
681
+ md: "var(--space-4)",
682
+ lg: "var(--space-6)",
683
+ xl: "var(--space-8)",
684
+ "2xl": "var(--space-12)"
685
+ };
686
+ function resolveSpacing(value) {
687
+ if (value === void 0) return void 0;
688
+ if (typeof value === "number" && SPACING[value]) {
689
+ return SPACING[value];
690
+ }
691
+ if (typeof value === "string" && value in SPACING_ALIASES) {
692
+ return SPACING_ALIASES[value];
693
+ }
694
+ return String(value);
695
+ }
696
+ function extractSpacingStyles(props) {
697
+ const styles = {};
698
+ if (props.m !== void 0) styles.margin = resolveSpacing(props.m);
699
+ if (props.mt !== void 0) styles.marginTop = resolveSpacing(props.mt);
700
+ if (props.mb !== void 0) styles.marginBottom = resolveSpacing(props.mb);
701
+ if (props.ml !== void 0) styles.marginLeft = resolveSpacing(props.ml);
702
+ if (props.mr !== void 0) styles.marginRight = resolveSpacing(props.mr);
703
+ if (props.mx !== void 0) {
704
+ styles.marginLeft = resolveSpacing(props.mx);
705
+ styles.marginRight = resolveSpacing(props.mx);
706
+ }
707
+ if (props.my !== void 0) {
708
+ styles.marginTop = resolveSpacing(props.my);
709
+ styles.marginBottom = resolveSpacing(props.my);
710
+ }
711
+ if (props.p !== void 0) styles.padding = resolveSpacing(props.p);
712
+ if (props.pt !== void 0) styles.paddingTop = resolveSpacing(props.pt);
713
+ if (props.pb !== void 0) styles.paddingBottom = resolveSpacing(props.pb);
714
+ if (props.pl !== void 0) styles.paddingLeft = resolveSpacing(props.pl);
715
+ if (props.pr !== void 0) styles.paddingRight = resolveSpacing(props.pr);
716
+ if (props.px !== void 0) {
717
+ styles.paddingLeft = resolveSpacing(props.px);
718
+ styles.paddingRight = resolveSpacing(props.px);
719
+ }
720
+ if (props.py !== void 0) {
721
+ styles.paddingTop = resolveSpacing(props.py);
722
+ styles.paddingBottom = resolveSpacing(props.py);
723
+ }
724
+ if (props.gap !== void 0) styles.gap = resolveSpacing(props.gap);
725
+ return styles;
726
+ }
727
+ var Box = React5.forwardRef(
728
+ ({ as: Component = "div", className, style, children, ...props }, ref) => {
729
+ const spacingStyles = extractSpacingStyles(props);
730
+ const { m, mt, mb, ml, mr, mx, my, p, pt, pb, pl, pr, px, py, gap, ...domProps } = props;
731
+ return /* @__PURE__ */ jsxRuntime.jsx(
732
+ Component,
733
+ {
734
+ ref,
735
+ className: clsx7__default.default("ds-box", className),
736
+ style: { ...spacingStyles, ...style },
737
+ ...domProps,
738
+ children
739
+ }
740
+ );
741
+ }
742
+ );
743
+ Box.displayName = "Box";
744
+ var CONTAINER_SIZE_MAP = {
745
+ sm: "768px",
746
+ // 48rem — max-w-3xl
747
+ md: "1024px",
748
+ // 64rem — max-w-5xl
749
+ lg: "1152px",
750
+ // 72rem — max-w-6xl
751
+ xl: "1280px",
752
+ // 80rem — max-w-7xl
753
+ full: "100%"
754
+ };
755
+ var Container = React5.forwardRef(
756
+ ({ size, fluid, maxWidth, className, style, ...props }, ref) => {
757
+ let resolvedMaxWidth;
758
+ if (fluid) {
759
+ resolvedMaxWidth = "100%";
760
+ } else if (size) {
761
+ resolvedMaxWidth = CONTAINER_SIZE_MAP[size];
762
+ } else {
763
+ resolvedMaxWidth = maxWidth || "var(--container-default-max, 1200px)";
764
+ }
765
+ return /* @__PURE__ */ jsxRuntime.jsx(
766
+ Box,
767
+ {
768
+ ref,
769
+ className: clsx7__default.default("ds-container", className),
770
+ style: {
771
+ maxWidth: resolvedMaxWidth,
772
+ ...style
773
+ },
774
+ ...props
775
+ }
776
+ );
777
+ }
778
+ );
779
+ Container.displayName = "Container";
780
+ var SectionHeader = React5.forwardRef(
781
+ ({ title, subtitle, eyebrow, align = "center", className, ...props }, ref) => {
782
+ if (!title && !subtitle && !eyebrow) return null;
783
+ return /* @__PURE__ */ jsxRuntime.jsxs(
784
+ "header",
785
+ {
786
+ ref,
787
+ className: clsx7__default.default("ds-section-header", `ds-section-header--${align}`, className),
788
+ ...props,
789
+ children: [
790
+ eyebrow && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-section-header__eyebrow", children: eyebrow }),
791
+ title && /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "ds-section-header__title", children: title }),
792
+ subtitle && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "ds-section-header__subtitle", children: subtitle })
793
+ ]
794
+ }
795
+ );
796
+ }
797
+ );
798
+ SectionHeader.displayName = "SectionHeader";
799
+ var SectionShell = React5.forwardRef(
800
+ ({
801
+ className,
802
+ children,
803
+ background = "default",
804
+ padding = "md",
805
+ containerSize,
806
+ containerFluid = false,
807
+ ...props
808
+ }, ref) => {
809
+ return /* @__PURE__ */ jsxRuntime.jsx(
810
+ "section",
811
+ {
812
+ ref,
813
+ className: clsx7__default.default(
814
+ "ds-section",
815
+ `ds-section--bg-${background}`,
816
+ `ds-section--padding-${padding}`,
817
+ className
818
+ ),
819
+ ...props,
820
+ children: /* @__PURE__ */ jsxRuntime.jsx(
821
+ Container,
822
+ {
823
+ size: containerSize === "fluid" ? "full" : containerSize,
824
+ fluid: containerFluid || containerSize === "fluid",
825
+ children
826
+ }
827
+ )
828
+ }
829
+ );
830
+ }
831
+ );
832
+ SectionShell.displayName = "SectionShell";
833
+ var SocialProofGrid = React5.forwardRef(
834
+ ({ columns = 3, masonry = false, staggered = false, className, children, ...props }, ref) => {
835
+ const enhancedChildren = staggered ? React5__default.default.Children.map(children, (child, index) => {
836
+ if (!React5__default.default.isValidElement(child)) return child;
837
+ const delay = Math.min(index * 50, 600);
838
+ const childProps = child.props;
839
+ return React5__default.default.cloneElement(child, {
840
+ style: { ...childProps.style, "--card-delay": `${delay}ms` },
841
+ className: clsx7__default.default(childProps.className, "ds-social-card--animated")
842
+ });
843
+ }) : children;
844
+ return /* @__PURE__ */ jsxRuntime.jsx(
845
+ SectionShell,
846
+ {
847
+ ref,
848
+ padding: "md",
849
+ className: clsx7__default.default("ds-social-proof", className),
850
+ ...props,
851
+ children: masonry ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-social-masonry", children: enhancedChildren }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: clsx7__default.default("ds-social-grid", `ds-social-grid--${columns}-col`), children: enhancedChildren })
852
+ }
853
+ );
854
+ }
855
+ );
856
+ SocialProofGrid.displayName = "SocialProofGrid";
857
+ var LogoItemRender = ({ item, className }) => {
858
+ const content = item.logo ? item.logo : /* @__PURE__ */ jsxRuntime.jsx(
859
+ "img",
860
+ {
861
+ src: item.src,
862
+ alt: item.alt,
863
+ width: 120,
864
+ height: 48,
865
+ loading: "lazy",
866
+ decoding: "async",
867
+ style: { objectFit: "contain", width: "auto", height: "100%" }
868
+ }
869
+ );
870
+ const innerContent = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
871
+ content,
872
+ item.badge && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-social-logos__badge", children: item.badge })
873
+ ] });
874
+ if (item.href) {
875
+ const isInternal = item.href.startsWith("/");
876
+ return /* @__PURE__ */ jsxRuntime.jsx(
877
+ OutboundLink,
878
+ {
879
+ href: item.href,
880
+ context: "social-proof-logo",
881
+ className: clsx7__default.default("ds-social-logos__item", className),
882
+ title: item.alt,
883
+ openInNewTab: !isInternal,
884
+ children: innerContent
885
+ }
886
+ );
887
+ }
888
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: clsx7__default.default("ds-social-logos__item", className), title: item.alt, children: innerContent });
889
+ };
890
+ var SocialProofLogos = React5.forwardRef(
891
+ ({ title, logos, variant = "grid", speed = 40, className, ...props }, ref) => {
892
+ return /* @__PURE__ */ jsxRuntime.jsxs(
893
+ SectionShell,
894
+ {
895
+ ref,
896
+ padding: "sm",
897
+ className: clsx7__default.default("ds-social-logos", className),
898
+ ...props,
899
+ children: [
900
+ title && /* @__PURE__ */ jsxRuntime.jsx(
901
+ "p",
902
+ {
903
+ className: "ds-section-header__eyebrow",
904
+ style: { textAlign: "center", marginBottom: "var(--space-8)" },
905
+ children: title
906
+ }
907
+ ),
908
+ variant === "marquee" ? /* @__PURE__ */ jsxRuntime.jsxs(
909
+ "div",
910
+ {
911
+ className: "ds-social-logos__marquee",
912
+ style: { "--marquee-duration": `${speed}s` },
913
+ children: [
914
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-social-logos__track", children: logos.map((item) => /* @__PURE__ */ jsxRuntime.jsx(LogoItemRender, { item }, `set1-${item.id}`)) }),
915
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-social-logos__track", "aria-hidden": "true", children: logos.map((item) => /* @__PURE__ */ jsxRuntime.jsx(LogoItemRender, { item }, `set2-${item.id}`)) })
916
+ ]
917
+ }
918
+ ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-social-grid ds-social-grid--4-col", style: { alignItems: "center" }, children: logos.map((item) => /* @__PURE__ */ jsxRuntime.jsx(LogoItemRender, { item }, item.id)) })
919
+ ]
920
+ }
921
+ );
922
+ }
923
+ );
924
+ SocialProofLogos.displayName = "SocialProofLogos";
925
+ var PlayIconLarge = () => /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "64", height: "64", viewBox: "0 0 64 64", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", children: [
926
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "32", cy: "32", r: "32", fill: "white", fillOpacity: "0.9" }),
927
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M42 32L26 41.2376L26 22.7624L42 32Z", fill: "black" })
928
+ ] });
929
+ var SocialProofFeatured = React5.forwardRef(
930
+ ({
931
+ quote,
932
+ author,
933
+ media,
934
+ mediaSrc,
935
+ orientation = "horizontal",
936
+ featuredVariant = "standard",
937
+ starRating,
938
+ platform,
939
+ logo,
940
+ className,
941
+ ...props
942
+ }, ref) => {
943
+ const showMedia = media || mediaSrc;
944
+ const effectiveOrientation = featuredVariant === "spotlight" ? "vertical" : orientation;
945
+ return /* @__PURE__ */ jsxRuntime.jsx(
946
+ SectionShell,
947
+ {
948
+ ref,
949
+ padding: "md",
950
+ className: clsx7__default.default("ds-social-featured-section", className),
951
+ ...props,
952
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
953
+ "div",
954
+ {
955
+ className: clsx7__default.default(
956
+ "ds-social-featured",
957
+ `ds-social-featured--${effectiveOrientation}`,
958
+ `ds-social-featured--${featuredVariant}`
959
+ ),
960
+ children: [
961
+ showMedia && featuredVariant !== "spotlight" && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-social-featured__media", children: media ? media : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
962
+ /* @__PURE__ */ jsxRuntime.jsx(
963
+ "img",
964
+ {
965
+ src: mediaSrc || "https://placehold.co/1920x1080/111/FFF?text=Video+Case+Study",
966
+ alt: `Case study by ${author.name}`,
967
+ style: { width: "100%", height: "100%", objectFit: "cover" }
968
+ }
969
+ ),
970
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-social-card__play", children: /* @__PURE__ */ jsxRuntime.jsx(PlayIconLarge, {}) })
971
+ ] }) }),
972
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-social-featured__content", children: [
973
+ logo && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-social-featured__logo", children: logo }),
974
+ /* @__PURE__ */ jsxRuntime.jsxs("blockquote", { className: "ds-social-featured__quote", children: [
975
+ "\u201C",
976
+ quote,
977
+ "\u201D"
978
+ ] }),
979
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-social-featured__author-large", children: [
980
+ author.avatar && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-social-card__avatar", children: /* @__PURE__ */ jsxRuntime.jsx("img", { src: author.avatar, alt: author.name }) }),
981
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-social-card__meta", children: [
982
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-social-card__name", children: author.name }),
983
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ds-social-card__role", children: [
984
+ author.role,
985
+ author.role && author.company && ", ",
986
+ author.company
987
+ ] })
988
+ ] })
989
+ ] }),
990
+ (starRating != null || platform) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-social-featured__trust", children: [
991
+ starRating != null && /* @__PURE__ */ jsxRuntime.jsx(StarRating, { value: starRating, size: "md", showValue: true }),
992
+ platform && /* @__PURE__ */ jsxRuntime.jsx(PlatformBadge, { platform, variant: "icon-label", size: "md" })
993
+ ] })
994
+ ] })
995
+ ]
996
+ }
997
+ )
998
+ }
999
+ );
1000
+ }
1001
+ );
1002
+ SocialProofFeatured.displayName = "SocialProofFeatured";
1003
+
1004
+ // src/tokens/motion.ts
1005
+ var DURATION = {
1006
+ // 250ms
1007
+ medium: 0.5};
1008
+ var EASING = {
1009
+ standard: [0.16, 1, 0.3, 1]};
1010
+ var VARIANTS = {
1011
+ fadeIn: {
1012
+ hidden: { opacity: 0 },
1013
+ visible: { opacity: 1, transition: { duration: DURATION.medium, ease: EASING.standard } }
1014
+ }};
1015
+ var SocialProofCarousel = React5.forwardRef(
1016
+ ({ children, className, ...props }, ref) => {
1017
+ return /* @__PURE__ */ jsxRuntime.jsx(
1018
+ SectionShell,
1019
+ {
1020
+ ref,
1021
+ padding: "none",
1022
+ containerFluid: true,
1023
+ className: clsx7__default.default("ds-social-carousel", className),
1024
+ ...props,
1025
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
1026
+ framerMotion.motion.div,
1027
+ {
1028
+ className: "ds-social-carousel__track",
1029
+ variants: VARIANTS.fadeIn,
1030
+ initial: "hidden",
1031
+ whileInView: "visible",
1032
+ viewport: { once: true, margin: "-10%" },
1033
+ children: [
1034
+ children,
1035
+ children
1036
+ ]
1037
+ }
1038
+ )
1039
+ }
1040
+ );
1041
+ }
1042
+ );
1043
+ SocialProofCarousel.displayName = "SocialProofCarousel";
1044
+ function getShortsEmbedUrl(url) {
1045
+ const match = url.match(/(?:youtube\.com\/shorts\/|youtu\.be\/|youtube\.com\/embed\/)([a-zA-Z0-9_-]+)/);
1046
+ if (match) {
1047
+ return `https://www.youtube-nocookie.com/embed/${match[1]}?rel=0&modestbranding=1&playsinline=1&controls=1`;
1048
+ }
1049
+ return url.replace("youtube.com", "youtube-nocookie.com") + (url.includes("?") ? "&" : "?") + "rel=0&modestbranding=1&playsinline=1";
1050
+ }
1051
+ function VerticalVideoGrid({ urls, className }) {
1052
+ if (!urls || urls.length === 0) return null;
1053
+ return /* @__PURE__ */ jsxRuntime.jsx(SectionShell, { className: clsx7__default.default("ds-vertical-video-grid my-16", className), children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-2 md:grid-cols-4 gap-4 md:gap-6 max-w-6xl mx-auto", children: urls.map((url, i) => /* @__PURE__ */ jsxRuntime.jsx(
1054
+ "div",
1055
+ {
1056
+ className: "relative w-full overflow-hidden rounded-[20px] shadow-lg border border-white/10 bg-black",
1057
+ style: { aspectRatio: "9/16" },
1058
+ children: /* @__PURE__ */ jsxRuntime.jsx(
1059
+ "iframe",
1060
+ {
1061
+ src: getShortsEmbedUrl(url),
1062
+ title: `Short testimonial ${i + 1}`,
1063
+ className: "absolute inset-0 w-full h-full",
1064
+ allow: "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",
1065
+ allowFullScreen: true,
1066
+ loading: "lazy"
1067
+ }
1068
+ )
1069
+ },
1070
+ i
1071
+ )) }) });
1072
+ }
1073
+
1074
+ // src/components/SocialProof/index.ts
1075
+ var SocialProof = {
1076
+ Card: SocialProofCard,
1077
+ Grid: SocialProofGrid,
1078
+ Logos: SocialProofLogos,
1079
+ Featured: SocialProofFeatured,
1080
+ Carousel: SocialProofCarousel,
1081
+ VerticalGrid: VerticalVideoGrid
1082
+ };
1083
+ function getEmbedUrl(src) {
1084
+ const ytMatch = src.match(
1085
+ /(?:youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/embed\/)([a-zA-Z0-9_-]+)/
1086
+ );
1087
+ if (ytMatch) return `https://www.youtube-nocookie.com/embed/${ytMatch[1]}?autoplay=1&rel=0`;
1088
+ const vimeoMatch = src.match(/(?:vimeo\.com\/)(\d+)/);
1089
+ if (vimeoMatch) return `https://player.vimeo.com/video/${vimeoMatch[1]}?autoplay=1`;
1090
+ const loomMatch = src.match(/(?:loom\.com\/share\/)([a-zA-Z0-9]+)/);
1091
+ if (loomMatch) return `https://www.loom.com/embed/${loomMatch[1]}?autoplay=1`;
1092
+ return src;
1093
+ }
1094
+ var PlayIcon2 = () => /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "64", height: "64", viewBox: "0 0 64 64", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", children: [
1095
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "32", cy: "32", r: "32", className: "ds-video-lightbox__play-bg" }),
1096
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M26 20v24l20-12L26 20z", fill: "white" })
1097
+ ] });
1098
+ var CloseIcon = () => /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [
1099
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
1100
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
1101
+ ] });
1102
+ var VideoLightbox = React5.forwardRef(
1103
+ ({
1104
+ videoUrl,
1105
+ thumbnailSrc,
1106
+ thumbnailAlt,
1107
+ title = "Video",
1108
+ trigger,
1109
+ className,
1110
+ onPlay
1111
+ }, ref) => {
1112
+ const [open, setOpen] = React5.useState(false);
1113
+ const handleOpen = React5.useCallback(() => {
1114
+ setOpen(true);
1115
+ onPlay?.();
1116
+ }, [onPlay]);
1117
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: clsx7__default.default("ds-video-lightbox", className), children: /* @__PURE__ */ jsxRuntime.jsxs(dialog.Dialog.Root, { open, onOpenChange: setOpen, children: [
1118
+ /* @__PURE__ */ jsxRuntime.jsx(
1119
+ dialog.Dialog.Trigger,
1120
+ {
1121
+ className: "ds-video-lightbox__trigger",
1122
+ onClick: handleOpen,
1123
+ children: trigger || /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-video-lightbox__thumbnail-wrap", children: [
1124
+ thumbnailSrc ? /* @__PURE__ */ jsxRuntime.jsx(
1125
+ "img",
1126
+ {
1127
+ src: thumbnailSrc,
1128
+ alt: thumbnailAlt || `Play: ${title}`,
1129
+ className: "ds-video-lightbox__thumbnail",
1130
+ loading: "lazy",
1131
+ decoding: "async"
1132
+ }
1133
+ ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-video-lightbox__placeholder" }),
1134
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-video-lightbox__overlay", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-video-lightbox__play-btn", children: /* @__PURE__ */ jsxRuntime.jsx(PlayIcon2, {}) }) })
1135
+ ] })
1136
+ }
1137
+ ),
1138
+ /* @__PURE__ */ jsxRuntime.jsxs(dialog.Dialog.Portal, { children: [
1139
+ /* @__PURE__ */ jsxRuntime.jsx(dialog.Dialog.Backdrop, { className: "ds-video-lightbox__backdrop" }),
1140
+ /* @__PURE__ */ jsxRuntime.jsxs(dialog.Dialog.Popup, { className: "ds-video-lightbox__popup", children: [
1141
+ /* @__PURE__ */ jsxRuntime.jsx(dialog.Dialog.Close, { className: "ds-video-lightbox__close", "aria-label": "Close video", children: /* @__PURE__ */ jsxRuntime.jsx(CloseIcon, {}) }),
1142
+ /* @__PURE__ */ jsxRuntime.jsx(dialog.Dialog.Title, { className: "ds-sr-only", children: title }),
1143
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-video-lightbox__iframe-wrap", children: open && /* @__PURE__ */ jsxRuntime.jsx(
1144
+ "iframe",
1145
+ {
1146
+ src: getEmbedUrl(videoUrl),
1147
+ title,
1148
+ className: "ds-video-lightbox__iframe",
1149
+ allow: "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",
1150
+ allowFullScreen: true
1151
+ }
1152
+ ) })
1153
+ ] })
1154
+ ] })
1155
+ ] }) });
1156
+ }
1157
+ );
1158
+ VideoLightbox.displayName = "VideoLightbox";
1159
+ var MetricCounter = React5.forwardRef(
1160
+ ({
1161
+ value,
1162
+ prefix = "",
1163
+ suffix = "",
1164
+ duration = 1500,
1165
+ decimals = 0,
1166
+ label,
1167
+ className,
1168
+ ...props
1169
+ }, ref) => {
1170
+ const [displayValue, setDisplayValue] = React5.useState(0);
1171
+ const [hasAnimated, setHasAnimated] = React5.useState(false);
1172
+ const containerRef = React5.useRef(null);
1173
+ const prefersReducedMotion = React5.useRef(false);
1174
+ React5.useEffect(() => {
1175
+ prefersReducedMotion.current = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
1176
+ if (prefersReducedMotion.current) {
1177
+ setDisplayValue(value);
1178
+ setHasAnimated(true);
1179
+ return;
1180
+ }
1181
+ const observer = new IntersectionObserver(
1182
+ (entries) => {
1183
+ if (entries[0].isIntersecting && !hasAnimated) {
1184
+ startAnimation();
1185
+ observer.disconnect();
1186
+ }
1187
+ },
1188
+ { threshold: 0.5 }
1189
+ );
1190
+ if (containerRef.current) {
1191
+ observer.observe(containerRef.current);
1192
+ }
1193
+ return () => observer.disconnect();
1194
+ }, [value, hasAnimated]);
1195
+ const startAnimation = () => {
1196
+ let startTime;
1197
+ setHasAnimated(true);
1198
+ const easeOutExpo = (t) => {
1199
+ return t === 1 ? 1 : 1 - Math.pow(2, -10 * t);
1200
+ };
1201
+ const animate = (currentTime) => {
1202
+ if (!startTime) startTime = currentTime;
1203
+ const progress = Math.min((currentTime - startTime) / duration, 1);
1204
+ const currentMultiplier = easeOutExpo(progress);
1205
+ const nextValue = value * currentMultiplier;
1206
+ setDisplayValue(nextValue);
1207
+ if (progress < 1) {
1208
+ requestAnimationFrame(animate);
1209
+ } else {
1210
+ setDisplayValue(value);
1211
+ }
1212
+ };
1213
+ requestAnimationFrame(animate);
1214
+ };
1215
+ const formattedValue = displayValue.toLocaleString(void 0, {
1216
+ minimumFractionDigits: decimals,
1217
+ maximumFractionDigits: decimals
1218
+ });
1219
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1220
+ "div",
1221
+ {
1222
+ ref: (node) => {
1223
+ containerRef.current = node;
1224
+ if (typeof ref === "function") ref(node);
1225
+ else if (ref) ref.current = node;
1226
+ },
1227
+ className: clsx7__default.default("ds-metric-counter", className),
1228
+ ...props,
1229
+ children: [
1230
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-metric-counter__value-wrapper", children: [
1231
+ prefix && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-metric-counter__prefix", children: prefix }),
1232
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-metric-counter__value", children: formattedValue }),
1233
+ suffix && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-metric-counter__suffix", children: suffix })
1234
+ ] }),
1235
+ label && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-metric-counter__label", children: label })
1236
+ ]
1237
+ }
1238
+ );
1239
+ }
1240
+ );
1241
+ MetricCounter.displayName = "MetricCounter";
1242
+
1243
+ exports.MetricCounter = MetricCounter;
1244
+ exports.PlatformBadge = PlatformBadge;
1245
+ exports.SocialProof = SocialProof;
1246
+ exports.SocialProofCard = SocialProofCard;
1247
+ exports.SocialProofCarousel = SocialProofCarousel;
1248
+ exports.SocialProofFeatured = SocialProofFeatured;
1249
+ exports.SocialProofGrid = SocialProofGrid;
1250
+ exports.SocialProofLogos = SocialProofLogos;
1251
+ exports.StarRating = StarRating;
1252
+ exports.VerticalVideoGrid = VerticalVideoGrid;
1253
+ exports.VideoLightbox = VideoLightbox;
1254
+ //# sourceMappingURL=out.js.map
1255
+ //# sourceMappingURL=index.cjs.map