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