@salesmind-ai/design-system 0.3.0 → 0.3.2

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 (212) hide show
  1. package/README.md +32 -2
  2. package/dist/admin/index.cjs +68 -2928
  3. package/dist/admin/index.cjs.map +1 -1
  4. package/dist/admin/index.js +5 -2915
  5. package/dist/admin/index.js.map +1 -1
  6. package/dist/blog/index.cjs +53 -1064
  7. package/dist/blog/index.cjs.map +1 -1
  8. package/dist/blog/index.js +8 -1054
  9. package/dist/blog/index.js.map +1 -1
  10. package/dist/charts/index.cjs +46 -2694
  11. package/dist/charts/index.cjs.map +1 -1
  12. package/dist/charts/index.js +3 -2680
  13. package/dist/charts/index.js.map +1 -1
  14. package/dist/chunk-2GARWEJK.js +17 -0
  15. package/dist/chunk-2GARWEJK.js.map +1 -0
  16. package/dist/chunk-3NKRFUAR.js +37 -0
  17. package/dist/chunk-3NKRFUAR.js.map +1 -0
  18. package/dist/chunk-3TGSIILM.cjs +201 -0
  19. package/dist/chunk-3TGSIILM.cjs.map +1 -0
  20. package/dist/chunk-4GM5BGBN.cjs +801 -0
  21. package/dist/chunk-4GM5BGBN.cjs.map +1 -0
  22. package/dist/chunk-5LGDEZWY.cjs +2434 -0
  23. package/dist/chunk-5LGDEZWY.cjs.map +1 -0
  24. package/dist/chunk-6H4DSTXR.js +786 -0
  25. package/dist/chunk-6H4DSTXR.js.map +1 -0
  26. package/dist/chunk-6UNG76Y2.js +153 -0
  27. package/dist/chunk-6UNG76Y2.js.map +1 -0
  28. package/dist/chunk-7PX2AZ6Y.js +39 -0
  29. package/dist/chunk-7PX2AZ6Y.js.map +1 -0
  30. package/dist/chunk-B6AVAX4F.js +1415 -0
  31. package/dist/chunk-B6AVAX4F.js.map +1 -0
  32. package/dist/chunk-BILT5KD3.js +264 -0
  33. package/dist/chunk-BILT5KD3.js.map +1 -0
  34. package/dist/chunk-C2BCDNAV.js +24 -0
  35. package/dist/chunk-C2BCDNAV.js.map +1 -0
  36. package/dist/chunk-CH42VPWE.cjs +421 -0
  37. package/dist/chunk-CH42VPWE.cjs.map +1 -0
  38. package/dist/chunk-CJ2MKVAF.cjs +46 -0
  39. package/dist/chunk-CJ2MKVAF.cjs.map +1 -0
  40. package/dist/chunk-DP74LUXG.cjs +98 -0
  41. package/dist/chunk-DP74LUXG.cjs.map +1 -0
  42. package/dist/chunk-E7D6EKJ4.cjs +44 -0
  43. package/dist/chunk-E7D6EKJ4.cjs.map +1 -0
  44. package/dist/chunk-ECXBTUH6.cjs +584 -0
  45. package/dist/chunk-ECXBTUH6.cjs.map +1 -0
  46. package/dist/chunk-EFRAP5ES.js +157 -0
  47. package/dist/chunk-EFRAP5ES.js.map +1 -0
  48. package/dist/chunk-F6YYWMME.js +485 -0
  49. package/dist/chunk-F6YYWMME.js.map +1 -0
  50. package/dist/chunk-FAFAP4L5.js +183 -0
  51. package/dist/chunk-FAFAP4L5.js.map +1 -0
  52. package/dist/chunk-GUZIMHWS.js +1608 -0
  53. package/dist/chunk-GUZIMHWS.js.map +1 -0
  54. package/dist/chunk-H2Y6BSTL.cjs +69 -0
  55. package/dist/chunk-H2Y6BSTL.cjs.map +1 -0
  56. package/dist/chunk-HN4PHABT.js +126 -0
  57. package/dist/chunk-HN4PHABT.js.map +1 -0
  58. package/dist/chunk-HRENHNDJ.js +211 -0
  59. package/dist/chunk-HRENHNDJ.js.map +1 -0
  60. package/dist/chunk-I75BFEYT.cjs +2561 -0
  61. package/dist/chunk-I75BFEYT.cjs.map +1 -0
  62. package/dist/chunk-IFRATNLU.js +562 -0
  63. package/dist/chunk-IFRATNLU.js.map +1 -0
  64. package/dist/chunk-IYPXJ6YC.cjs +69 -0
  65. package/dist/chunk-IYPXJ6YC.cjs.map +1 -0
  66. package/dist/chunk-JPJN4YBC.js +409 -0
  67. package/dist/chunk-JPJN4YBC.js.map +1 -0
  68. package/dist/chunk-KBA2LFBG.js +62 -0
  69. package/dist/chunk-KBA2LFBG.js.map +1 -0
  70. package/dist/chunk-KCKUSU2M.cjs +166 -0
  71. package/dist/chunk-KCKUSU2M.cjs.map +1 -0
  72. package/dist/chunk-KJ2OXQF4.js +287 -0
  73. package/dist/chunk-KJ2OXQF4.js.map +1 -0
  74. package/dist/chunk-KNQEIU7O.cjs +1202 -0
  75. package/dist/chunk-KNQEIU7O.cjs.map +1 -0
  76. package/dist/chunk-KVGSVGRK.cjs +569 -0
  77. package/dist/chunk-KVGSVGRK.cjs.map +1 -0
  78. package/dist/chunk-L352JRV6.cjs +105 -0
  79. package/dist/chunk-L352JRV6.cjs.map +1 -0
  80. package/dist/chunk-LJADZITX.cjs +298 -0
  81. package/dist/chunk-LJADZITX.cjs.map +1 -0
  82. package/dist/chunk-LMJPWXTZ.cjs +194 -0
  83. package/dist/chunk-LMJPWXTZ.cjs.map +1 -0
  84. package/dist/chunk-LOWEAQST.js +701 -0
  85. package/dist/chunk-LOWEAQST.js.map +1 -0
  86. package/dist/chunk-MDB2WCRQ.cjs +137 -0
  87. package/dist/chunk-MDB2WCRQ.cjs.map +1 -0
  88. package/dist/chunk-MQDEE7HC.cjs +283 -0
  89. package/dist/chunk-MQDEE7HC.cjs.map +1 -0
  90. package/dist/chunk-MQRB634A.cjs +34 -0
  91. package/dist/chunk-MQRB634A.cjs.map +1 -0
  92. package/dist/chunk-MTI27RDV.js +185 -0
  93. package/dist/chunk-MTI27RDV.js.map +1 -0
  94. package/dist/chunk-MU6GW5ZV.js +2317 -0
  95. package/dist/chunk-MU6GW5ZV.js.map +1 -0
  96. package/dist/chunk-NN3TUHIH.js +28 -0
  97. package/dist/chunk-NN3TUHIH.js.map +1 -0
  98. package/dist/chunk-NT4LBP7D.cjs +111 -0
  99. package/dist/chunk-NT4LBP7D.cjs.map +1 -0
  100. package/dist/chunk-OLV7OD3X.cjs +502 -0
  101. package/dist/chunk-OLV7OD3X.cjs.map +1 -0
  102. package/dist/chunk-OXNXEQY7.js +2538 -0
  103. package/dist/chunk-OXNXEQY7.js.map +1 -0
  104. package/dist/chunk-P5BOFE5A.js +546 -0
  105. package/dist/chunk-P5BOFE5A.js.map +1 -0
  106. package/dist/chunk-Q2MFGYTE.cjs +1449 -0
  107. package/dist/chunk-Q2MFGYTE.cjs.map +1 -0
  108. package/dist/chunk-Q75DBVDY.cjs +68 -0
  109. package/dist/chunk-Q75DBVDY.cjs.map +1 -0
  110. package/dist/chunk-REQ5Q6ZI.js +1022 -0
  111. package/dist/chunk-REQ5Q6ZI.js.map +1 -0
  112. package/dist/chunk-SICKWUWB.js +62 -0
  113. package/dist/chunk-SICKWUWB.js.map +1 -0
  114. package/dist/chunk-T343CCH5.js +1190 -0
  115. package/dist/chunk-T343CCH5.js.map +1 -0
  116. package/dist/chunk-TEC62D4A.cjs +1624 -0
  117. package/dist/chunk-TEC62D4A.cjs.map +1 -0
  118. package/dist/chunk-TW5JB35D.js +2122 -0
  119. package/dist/chunk-TW5JB35D.js.map +1 -0
  120. package/dist/chunk-VC5LMUVQ.cjs +20 -0
  121. package/dist/chunk-VC5LMUVQ.cjs.map +1 -0
  122. package/dist/chunk-VM7WFMKI.cjs +76 -0
  123. package/dist/chunk-VM7WFMKI.cjs.map +1 -0
  124. package/dist/chunk-W2WTP6HS.cjs +233 -0
  125. package/dist/chunk-W2WTP6HS.cjs.map +1 -0
  126. package/dist/chunk-WH7PYHZY.cjs +35 -0
  127. package/dist/chunk-WH7PYHZY.cjs.map +1 -0
  128. package/dist/chunk-XQZVY7JJ.cjs +717 -0
  129. package/dist/chunk-XQZVY7JJ.cjs.map +1 -0
  130. package/dist/chunk-XU3OMQ7V.js +98 -0
  131. package/dist/chunk-XU3OMQ7V.js.map +1 -0
  132. package/dist/chunk-XWPDRMZG.js +62 -0
  133. package/dist/chunk-XWPDRMZG.js.map +1 -0
  134. package/dist/chunk-Y3CPKNB7.js +67 -0
  135. package/dist/chunk-Y3CPKNB7.js.map +1 -0
  136. package/dist/chunk-YNVRDD2P.js +98 -0
  137. package/dist/chunk-YNVRDD2P.js.map +1 -0
  138. package/dist/chunk-YSYR54XR.js +92 -0
  139. package/dist/chunk-YSYR54XR.js.map +1 -0
  140. package/dist/chunk-YTYDQBVY.cjs +162 -0
  141. package/dist/chunk-YTYDQBVY.cjs.map +1 -0
  142. package/dist/chunk-ZDLOA2UT.cjs +1042 -0
  143. package/dist/chunk-ZDLOA2UT.cjs.map +1 -0
  144. package/dist/chunk-ZWUKRCOJ.cjs +2162 -0
  145. package/dist/chunk-ZWUKRCOJ.cjs.map +1 -0
  146. package/dist/core/index.cjs +807 -4333
  147. package/dist/core/index.cjs.map +1 -1
  148. package/dist/core/index.js +14 -4130
  149. package/dist/core/index.js.map +1 -1
  150. package/dist/i18n/index.cjs +86 -558
  151. package/dist/i18n/index.cjs.map +1 -1
  152. package/dist/i18n/index.js +1 -544
  153. package/dist/i18n/index.js.map +1 -1
  154. package/dist/index.cjs +1432 -17139
  155. package/dist/index.cjs.map +1 -1
  156. package/dist/index.css +11 -7
  157. package/dist/index.css.map +1 -1
  158. package/dist/index.js +31 -16784
  159. package/dist/index.js.map +1 -1
  160. package/dist/marketing/index.cjs +142 -3072
  161. package/dist/marketing/index.cjs.map +1 -1
  162. package/dist/marketing/index.js +11 -3042
  163. package/dist/marketing/index.js.map +1 -1
  164. package/dist/motion/index.cjs +26 -1222
  165. package/dist/motion/index.cjs.map +1 -1
  166. package/dist/motion/index.js +2 -1215
  167. package/dist/motion/index.js.map +1 -1
  168. package/dist/nav/index.cjs +101 -1518
  169. package/dist/nav/index.cjs.map +1 -1
  170. package/dist/nav/index.js +4 -1498
  171. package/dist/nav/index.js.map +1 -1
  172. package/dist/report/index.cjs +171 -2403
  173. package/dist/report/index.cjs.map +1 -1
  174. package/dist/report/index.js +3 -2363
  175. package/dist/report/index.js.map +1 -1
  176. package/dist/sections/index.cjs +28 -378
  177. package/dist/sections/index.cjs.map +1 -1
  178. package/dist/sections/index.css +1 -4
  179. package/dist/sections/index.css.map +1 -1
  180. package/dist/sections/index.js +4 -372
  181. package/dist/sections/index.js.map +1 -1
  182. package/dist/social-proof/index.cjs +53 -1249
  183. package/dist/social-proof/index.cjs.map +1 -1
  184. package/dist/social-proof/index.css +10 -3
  185. package/dist/social-proof/index.css.map +1 -1
  186. package/dist/social-proof/index.js +6 -1234
  187. package/dist/social-proof/index.js.map +1 -1
  188. package/dist/theme/index.cjs +38 -565
  189. package/dist/theme/index.cjs.map +1 -1
  190. package/dist/theme/index.js +2 -555
  191. package/dist/theme/index.js.map +1 -1
  192. package/dist/web/client/index.cjs +48 -0
  193. package/dist/web/client/index.cjs.map +1 -0
  194. package/dist/web/client/index.css +456 -0
  195. package/dist/web/client/index.css.map +1 -0
  196. package/dist/web/client/index.d.cts +172 -0
  197. package/dist/web/client/index.d.ts +172 -0
  198. package/dist/web/client/index.js +7 -0
  199. package/dist/web/client/index.js.map +1 -0
  200. package/dist/web/index.cjs +158 -1346
  201. package/dist/web/index.cjs.map +1 -1
  202. package/dist/web/index.d.cts +5 -893
  203. package/dist/web/index.d.ts +5 -893
  204. package/dist/web/index.js +9 -1305
  205. package/dist/web/index.js.map +1 -1
  206. package/dist/web/server/index.cjs +32 -0
  207. package/dist/web/server/index.cjs.map +1 -0
  208. package/dist/web/server/index.d.cts +725 -0
  209. package/dist/web/server/index.d.ts +725 -0
  210. package/dist/web/server/index.js +3 -0
  211. package/dist/web/server/index.js.map +1 -0
  212. package/package.json +14 -1
@@ -1,1254 +1,58 @@
1
1
  "use client";
2
2
  'use strict';
3
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;
4
+ var chunkXQZVY7JJ_cjs = require('../chunk-XQZVY7JJ.cjs');
5
+ require('../chunk-L352JRV6.cjs');
6
+ var chunkDP74LUXG_cjs = require('../chunk-DP74LUXG.cjs');
7
+ require('../chunk-IYPXJ6YC.cjs');
8
+ require('../chunk-LJADZITX.cjs');
9
+ require('../chunk-MDB2WCRQ.cjs');
10
+
11
+
12
+
13
+ Object.defineProperty(exports, "PlatformBadge", {
14
+ enumerable: true,
15
+ get: function () { return chunkXQZVY7JJ_cjs.PlatformBadge; }
16
+ });
17
+ Object.defineProperty(exports, "SocialProof", {
18
+ enumerable: true,
19
+ get: function () { return chunkXQZVY7JJ_cjs.SocialProof; }
20
+ });
21
+ Object.defineProperty(exports, "SocialProofCard", {
22
+ enumerable: true,
23
+ get: function () { return chunkXQZVY7JJ_cjs.SocialProofCard; }
24
+ });
25
+ Object.defineProperty(exports, "SocialProofCarousel", {
26
+ enumerable: true,
27
+ get: function () { return chunkXQZVY7JJ_cjs.SocialProofCarousel; }
28
+ });
29
+ Object.defineProperty(exports, "SocialProofFeatured", {
30
+ enumerable: true,
31
+ get: function () { return chunkXQZVY7JJ_cjs.SocialProofFeatured; }
32
+ });
33
+ Object.defineProperty(exports, "SocialProofGrid", {
34
+ enumerable: true,
35
+ get: function () { return chunkXQZVY7JJ_cjs.SocialProofGrid; }
36
+ });
37
+ Object.defineProperty(exports, "SocialProofLogos", {
38
+ enumerable: true,
39
+ get: function () { return chunkXQZVY7JJ_cjs.SocialProofLogos; }
40
+ });
41
+ Object.defineProperty(exports, "StarRating", {
42
+ enumerable: true,
43
+ get: function () { return chunkXQZVY7JJ_cjs.StarRating; }
44
+ });
45
+ Object.defineProperty(exports, "VerticalVideoGrid", {
46
+ enumerable: true,
47
+ get: function () { return chunkXQZVY7JJ_cjs.VerticalVideoGrid; }
48
+ });
49
+ Object.defineProperty(exports, "VideoLightbox", {
50
+ enumerable: true,
51
+ get: function () { return chunkXQZVY7JJ_cjs.VideoLightbox; }
52
+ });
53
+ Object.defineProperty(exports, "MetricCounter", {
54
+ enumerable: true,
55
+ get: function () { return chunkDP74LUXG_cjs.MetricCounter; }
56
+ });
1253
57
  //# sourceMappingURL=out.js.map
1254
58
  //# sourceMappingURL=index.cjs.map