@salesmind-ai/design-system 0.2.1 → 0.3.0

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