@salesmind-ai/design-system 0.7.0 → 1.2.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 (74) hide show
  1. package/dist/chunk-6WQKRQEE.cjs +33 -0
  2. package/dist/chunk-6WQKRQEE.cjs.map +1 -0
  3. package/dist/{chunk-R3ZECV5P.cjs → chunk-FVSL5YMB.cjs} +13 -34
  4. package/dist/chunk-FVSL5YMB.cjs.map +1 -0
  5. package/dist/{chunk-D2RHF2OE.cjs → chunk-H5BOCR5Z.cjs} +10 -6
  6. package/dist/chunk-H5BOCR5Z.cjs.map +1 -0
  7. package/dist/chunk-HTLWFOLC.js +26 -0
  8. package/dist/chunk-HTLWFOLC.js.map +1 -0
  9. package/dist/{chunk-KXVFFEGD.js → chunk-MLINFRC3.js} +2 -19
  10. package/dist/chunk-MLINFRC3.js.map +1 -0
  11. package/dist/{chunk-DMRQPGQA.js → chunk-NB3BDIQO.js} +10 -6
  12. package/dist/chunk-NB3BDIQO.js.map +1 -0
  13. package/dist/{chunk-JPUJWI7F.cjs → chunk-QXUA5PQ3.cjs} +1 -19
  14. package/dist/chunk-QXUA5PQ3.cjs.map +1 -0
  15. package/dist/{chunk-HHQ6J7B6.js → chunk-REEHJV7M.js} +145 -14
  16. package/dist/chunk-REEHJV7M.js.map +1 -0
  17. package/dist/{chunk-LQB7QLD3.js → chunk-RY257SWH.js} +207 -3
  18. package/dist/chunk-RY257SWH.js.map +1 -0
  19. package/dist/{chunk-WE4QIIVN.cjs → chunk-UCWMJD4Y.cjs} +151 -18
  20. package/dist/chunk-UCWMJD4Y.cjs.map +1 -0
  21. package/dist/{chunk-27Y5ESMM.js → chunk-VFO2MUPI.js} +13 -33
  22. package/dist/chunk-VFO2MUPI.js.map +1 -0
  23. package/dist/{chunk-UGKYP6F3.cjs → chunk-YL4FGGHF.cjs} +211 -2
  24. package/dist/chunk-YL4FGGHF.cjs.map +1 -0
  25. package/dist/core/index.cjs +13 -12
  26. package/dist/core/index.js +2 -1
  27. package/dist/{index-BJ8rBqrO.d.cts → index-I4Xi04oE.d.cts} +47 -3
  28. package/dist/{index-BxMqCbqE.d.ts → index-r__EEywy.d.ts} +47 -3
  29. package/dist/index.cjs +81 -56
  30. package/dist/index.cjs.map +1 -1
  31. package/dist/index.css +658 -109
  32. package/dist/index.css.map +1 -1
  33. package/dist/index.d.cts +3 -3
  34. package/dist/index.d.ts +3 -3
  35. package/dist/index.js +6 -5
  36. package/dist/index.js.map +1 -1
  37. package/dist/marketing/index.cjs +35 -26
  38. package/dist/marketing/index.css +242 -0
  39. package/dist/marketing/index.css.map +1 -1
  40. package/dist/marketing/index.d.cts +1 -1
  41. package/dist/marketing/index.d.ts +1 -1
  42. package/dist/marketing/index.js +3 -2
  43. package/dist/sections/index.css +1 -1
  44. package/dist/sections/index.css.map +1 -1
  45. package/dist/social-proof/index.cjs +26 -4
  46. package/dist/social-proof/index.css +521 -0
  47. package/dist/social-proof/index.css.map +1 -1
  48. package/dist/social-proof/index.d.cts +99 -27
  49. package/dist/social-proof/index.d.ts +99 -27
  50. package/dist/social-proof/index.js +3 -1
  51. package/dist/styles/styles.css +0 -109
  52. package/dist/theme/index.cjs +3 -7
  53. package/dist/theme/index.css +0 -108
  54. package/dist/theme/index.css.map +1 -1
  55. package/dist/theme/index.d.cts +1 -28
  56. package/dist/theme/index.d.ts +1 -28
  57. package/dist/theme/index.js +1 -1
  58. package/dist/web/index.cjs +7 -7
  59. package/dist/web/index.js +1 -1
  60. package/dist/web/server/index.cjs +7 -7
  61. package/dist/web/server/index.d.cts +0 -5
  62. package/dist/web/server/index.d.ts +0 -5
  63. package/dist/web/server/index.js +1 -1
  64. package/package.json +1 -1
  65. package/dist/chunk-27Y5ESMM.js.map +0 -1
  66. package/dist/chunk-D2RHF2OE.cjs.map +0 -1
  67. package/dist/chunk-DMRQPGQA.js.map +0 -1
  68. package/dist/chunk-HHQ6J7B6.js.map +0 -1
  69. package/dist/chunk-JPUJWI7F.cjs.map +0 -1
  70. package/dist/chunk-KXVFFEGD.js.map +0 -1
  71. package/dist/chunk-LQB7QLD3.js.map +0 -1
  72. package/dist/chunk-R3ZECV5P.cjs.map +0 -1
  73. package/dist/chunk-UGKYP6F3.cjs.map +0 -1
  74. package/dist/chunk-WE4QIIVN.cjs.map +0 -1
@@ -1,9 +1,10 @@
1
+ import { Card } from './chunk-MLINFRC3.js';
2
+ import { OutboundLink } from './chunk-KJ2OXQF4.js';
1
3
  import { forwardRef, useState, useRef, useEffect, useCallback } from 'react';
2
4
  import clsx from 'clsx';
3
5
  import { jsxs, jsx } from 'react/jsx-runtime';
4
6
  import { Dialog } from '@base-ui/react/dialog';
5
7
 
6
- // src/components/StarRating/StarRating.tsx
7
8
  var StarRating = forwardRef(
8
9
  ({
9
10
  value,
@@ -206,6 +207,209 @@ var PlatformBadge = forwardRef(
206
207
  }
207
208
  );
208
209
  PlatformBadge.displayName = "PlatformBadge";
210
+ var SocialProofCard = forwardRef(
211
+ ({
212
+ variant = "standard",
213
+ content,
214
+ author,
215
+ starRating,
216
+ platform,
217
+ badges,
218
+ href,
219
+ media,
220
+ metrics,
221
+ headline,
222
+ industry,
223
+ ctaText,
224
+ className,
225
+ ...props
226
+ }, ref) => {
227
+ return /* @__PURE__ */ jsxs(
228
+ "article",
229
+ {
230
+ ref,
231
+ className: clsx(
232
+ "ds-card",
233
+ variant === "compact" ? "ds-card--tier-1" : "ds-card--tier-2",
234
+ variant === "compact" ? "glass--tier-1" : "glass--tier-2",
235
+ "ds-social-proof-card",
236
+ `ds-social-proof-card--${variant}`,
237
+ href && "ds-social-proof-card--linked",
238
+ className
239
+ ),
240
+ ...props,
241
+ children: [
242
+ media?.src && /* @__PURE__ */ jsx("div", { className: "ds-social-proof-card__media", children: /* @__PURE__ */ jsx(
243
+ "img",
244
+ {
245
+ src: media.src,
246
+ alt: media.alt ?? "",
247
+ className: "ds-social-proof-card__image",
248
+ loading: "lazy",
249
+ decoding: "async"
250
+ }
251
+ ) }),
252
+ /* @__PURE__ */ jsxs("div", { className: "ds-social-proof-card__body", children: [
253
+ /* @__PURE__ */ jsxs("div", { className: "ds-social-proof-card__meta", children: [
254
+ starRating !== void 0 && /* @__PURE__ */ jsx(StarRating, { value: starRating, size: "sm" }),
255
+ platform && /* @__PURE__ */ jsx(PlatformBadge, { platform }),
256
+ industry && /* @__PURE__ */ jsx("span", { className: "ds-social-proof-card__industry", children: industry })
257
+ ] }),
258
+ headline && /* @__PURE__ */ jsx("h3", { className: "ds-social-proof-card__headline", children: headline }),
259
+ /* @__PURE__ */ jsx("blockquote", { className: "ds-social-proof-card__quote", children: /* @__PURE__ */ jsx("p", { children: content }) }),
260
+ metrics && metrics.length > 0 && /* @__PURE__ */ jsx("div", { className: "ds-social-proof-card__metrics", children: metrics.map((metric, index) => /* @__PURE__ */ jsxs("div", { className: "ds-social-proof-card__metric", children: [
261
+ /* @__PURE__ */ jsx("span", { className: "ds-social-proof-card__metric-value", children: metric.value }),
262
+ /* @__PURE__ */ jsx("span", { className: "ds-social-proof-card__metric-label", children: metric.label })
263
+ ] }, index)) }),
264
+ badges && badges.length > 0 && /* @__PURE__ */ jsx("div", { className: "ds-social-proof-card__badges", children: badges.map((badge, index) => /* @__PURE__ */ jsx("span", { className: "ds-social-proof-card__badge", children: badge }, index)) }),
265
+ /* @__PURE__ */ jsxs("footer", { className: "ds-social-proof-card__author", children: [
266
+ author.avatar && /* @__PURE__ */ jsx(
267
+ "img",
268
+ {
269
+ src: author.avatar,
270
+ alt: "",
271
+ className: "ds-social-proof-card__avatar",
272
+ loading: "lazy",
273
+ decoding: "async"
274
+ }
275
+ ),
276
+ /* @__PURE__ */ jsxs("div", { className: "ds-social-proof-card__author-copy", children: [
277
+ /* @__PURE__ */ jsx("cite", { className: "ds-social-proof-card__name", children: author.name }),
278
+ (author.title || author.company) && /* @__PURE__ */ jsx("span", { className: "ds-social-proof-card__role", children: [author.title, author.company].filter(Boolean).join(" \xB7 ") })
279
+ ] })
280
+ ] }),
281
+ href && ctaText && /* @__PURE__ */ jsx("span", { className: "ds-social-proof-card__cta", children: ctaText })
282
+ ] })
283
+ ]
284
+ }
285
+ );
286
+ }
287
+ );
288
+ SocialProofCard.displayName = "SocialProofCard";
289
+ var SocialProofCarousel = forwardRef(
290
+ ({ background = "transparent", className, children, ...props }, ref) => /* @__PURE__ */ jsx(
291
+ "div",
292
+ {
293
+ ref,
294
+ className: clsx(
295
+ "ds-social-proof-carousel",
296
+ `ds-social-proof-carousel--background-${background}`,
297
+ className
298
+ ),
299
+ ...props,
300
+ children: /* @__PURE__ */ jsx("div", { className: "ds-social-proof-carousel__track", children })
301
+ }
302
+ )
303
+ );
304
+ SocialProofCarousel.displayName = "SocialProofCarousel";
305
+ var SocialProofFeatured = forwardRef(
306
+ ({
307
+ quote,
308
+ author,
309
+ featuredVariant = "standard",
310
+ starRating,
311
+ platform,
312
+ mediaSrc,
313
+ background = "transparent",
314
+ padding = "md",
315
+ className,
316
+ ...props
317
+ }, ref) => /* @__PURE__ */ jsxs(
318
+ Card,
319
+ {
320
+ ref,
321
+ tier: featuredVariant === "spotlight" ? 3 : 2,
322
+ radius: "panel",
323
+ aurora: featuredVariant === "spotlight",
324
+ className: clsx(
325
+ "ds-social-proof-featured",
326
+ `ds-social-proof-featured--${featuredVariant}`,
327
+ `ds-social-proof-featured--background-${background}`,
328
+ `ds-social-proof-featured--padding-${padding}`,
329
+ className
330
+ ),
331
+ ...props,
332
+ children: [
333
+ mediaSrc && /* @__PURE__ */ jsx("div", { className: "ds-social-proof-featured__media", children: /* @__PURE__ */ jsx("img", { src: mediaSrc, alt: "", className: "ds-social-proof-featured__image", loading: "lazy", decoding: "async" }) }),
334
+ /* @__PURE__ */ jsxs("div", { className: "ds-social-proof-featured__content", children: [
335
+ /* @__PURE__ */ jsxs("div", { className: "ds-social-proof-featured__meta", children: [
336
+ starRating !== void 0 && /* @__PURE__ */ jsx(StarRating, { value: starRating, size: "md" }),
337
+ platform && /* @__PURE__ */ jsx(PlatformBadge, { platform })
338
+ ] }),
339
+ /* @__PURE__ */ jsx("blockquote", { className: "ds-social-proof-featured__quote", children: /* @__PURE__ */ jsx("p", { children: quote }) }),
340
+ /* @__PURE__ */ jsxs("footer", { className: "ds-social-proof-featured__author", children: [
341
+ author.avatar && /* @__PURE__ */ jsx(
342
+ "img",
343
+ {
344
+ src: author.avatar,
345
+ alt: "",
346
+ className: "ds-social-proof-featured__avatar",
347
+ loading: "lazy",
348
+ decoding: "async"
349
+ }
350
+ ),
351
+ /* @__PURE__ */ jsxs("div", { className: "ds-social-proof-featured__author-copy", children: [
352
+ /* @__PURE__ */ jsx("cite", { className: "ds-social-proof-featured__name", children: author.name }),
353
+ (author.title || author.company) && /* @__PURE__ */ jsx("span", { className: "ds-social-proof-featured__role", children: [author.title, author.company].filter(Boolean).join(" \xB7 ") })
354
+ ] })
355
+ ] })
356
+ ] })
357
+ ]
358
+ }
359
+ )
360
+ );
361
+ SocialProofFeatured.displayName = "SocialProofFeatured";
362
+ var SocialProofGrid = forwardRef(
363
+ ({ columns = 3, staggered = false, background = "transparent", className, children, ...props }, ref) => /* @__PURE__ */ jsx(
364
+ "div",
365
+ {
366
+ ref,
367
+ className: clsx(
368
+ "ds-social-proof-grid",
369
+ `ds-social-proof-grid--columns-${columns}`,
370
+ `ds-social-proof-grid--background-${background}`,
371
+ staggered && "ds-social-proof-grid--staggered",
372
+ className
373
+ ),
374
+ ...props,
375
+ children
376
+ }
377
+ )
378
+ );
379
+ SocialProofGrid.displayName = "SocialProofGrid";
380
+ var SocialProofLogos = forwardRef(
381
+ ({ logos, title, variant = "grid", speed = "normal", background = "transparent", className, ...props }, ref) => {
382
+ const renderedLogos = logos.map((item) => {
383
+ const content = /* @__PURE__ */ jsxs("span", { className: "ds-social-proof-logos__item-content", children: [
384
+ item.src ? /* @__PURE__ */ jsx("img", { src: item.src, alt: item.alt, className: "ds-social-proof-logos__image", loading: "lazy", decoding: "async" }) : item.logo,
385
+ item.badge && /* @__PURE__ */ jsx("span", { className: "ds-social-proof-logos__badge", children: item.badge })
386
+ ] });
387
+ return item.href ? /* @__PURE__ */ jsx(OutboundLink, { href: item.href, context: "social-proof-logo", className: "ds-social-proof-logos__item", children: content }, item.id) : /* @__PURE__ */ jsx("span", { className: "ds-social-proof-logos__item", children: content }, item.id);
388
+ });
389
+ return /* @__PURE__ */ jsxs(
390
+ "div",
391
+ {
392
+ ref,
393
+ className: clsx(
394
+ "ds-social-proof-logos",
395
+ `ds-social-proof-logos--${variant}`,
396
+ `ds-social-proof-logos--speed-${speed}`,
397
+ `ds-social-proof-logos--background-${background}`,
398
+ className
399
+ ),
400
+ ...props,
401
+ children: [
402
+ title && /* @__PURE__ */ jsx("p", { className: "ds-social-proof-logos__title", children: title }),
403
+ /* @__PURE__ */ jsx("div", { className: "ds-social-proof-logos__viewport", children: /* @__PURE__ */ jsxs("div", { className: "ds-social-proof-logos__track", children: [
404
+ renderedLogos,
405
+ variant === "marquee" && renderedLogos
406
+ ] }) })
407
+ ]
408
+ }
409
+ );
410
+ }
411
+ );
412
+ SocialProofLogos.displayName = "SocialProofLogos";
209
413
  function getEmbedUrl(src) {
210
414
  const ytMatch = src.match(
211
415
  /(?:youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/embed\/)([a-zA-Z0-9_-]+)/
@@ -283,6 +487,6 @@ var VideoLightbox = forwardRef(
283
487
  );
284
488
  VideoLightbox.displayName = "VideoLightbox";
285
489
 
286
- export { PlatformBadge, StarRating, VideoLightbox };
490
+ export { PlatformBadge, SocialProofCard, SocialProofCarousel, SocialProofFeatured, SocialProofGrid, SocialProofLogos, StarRating, VideoLightbox };
287
491
  //# sourceMappingURL=out.js.map
288
- //# sourceMappingURL=chunk-LQB7QLD3.js.map
492
+ //# sourceMappingURL=chunk-RY257SWH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/StarRating/StarRating.tsx","../src/components/PlatformBadge/PlatformBadge.tsx","../src/components/SocialProofCard/SocialProofCard.tsx","../src/components/SocialProofCarousel/SocialProofCarousel.tsx","../src/components/SocialProofFeatured/SocialProofFeatured.tsx","../src/components/SocialProofGrid/SocialProofGrid.tsx","../src/components/SocialProofLogos/SocialProofLogos.tsx","../src/components/VideoLightbox/VideoLightbox.tsx"],"names":["forwardRef","clsx","jsx","jsxs","useState"],"mappings":";;;;;;;;AAAA,SAAgB,YAAY,WAAW,QAAQ,gBAAgB;AAC/D,OAAO,UAAU;AAiGT,SAmBI,KAnBJ;AA1DD,IAAM,aAAa;AAAA,EACxB,CACE;AAAA,IACE;AAAA,IACA,MAAM;AAAA,IACN,OAAO;AAAA,IACP,UAAU;AAAA,IACV,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,CAAC,SAAS,UAAU,IAAI,SAAS,CAAC,OAAO;AAC/C,UAAM,eAAe,OAAuB,IAAI;AAEhD,cAAU,MAAM;AACd,UAAI,CAAC,QAAS;AAGd,UAAI,OAAO,WAAW,aAAa;AACjC,cAAM,KAAK,OAAO,WAAW,kCAAkC;AAC/D,YAAI,GAAG,SAAS;AACd,qBAAW,IAAI;AACf;AAAA,QACF;AAAA,MACF;AAEA,YAAM,SAAS,aAAa;AAC5B,UAAI,CAAC,OAAQ;AAEb,YAAM,WAAW,IAAI;AAAA,QACnB,CAAC,CAAC,KAAK,MAAM;AACX,cAAI,MAAM,gBAAgB;AACxB,uBAAW,IAAI;AACf,qBAAS,WAAW;AAAA,UACtB;AAAA,QACF;AAAA,QACA,EAAE,WAAW,IAAI;AAAA,MACnB;AAEA,eAAS,QAAQ,MAAM;AACvB,aAAO,MAAM,SAAS,WAAW;AAAA,IACnC,GAAG,CAAC,OAAO,CAAC;AAEZ,UAAM,eAAe,KAAK,IAAI,KAAK,IAAI,OAAO,CAAC,GAAG,GAAG;AAErD,UAAM,QAAQ,MAAM,KAAK,EAAE,QAAQ,IAAI,GAAG,CAAC,GAAG,MAAM;AAClD,YAAM,YAAY,IAAI;AACtB,YAAM,cACJ,gBAAgB,YACZ,MACA,eAAe,YAAY,KACxB,gBAAgB,YAAY,MAAM,MACnC;AAER,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,WAAW;AAAA,YACT;AAAA,YACA,WAAW;AAAA,UACb;AAAA,UACA,OAAO;AAAA,YACL,eAAe,GAAG,WAAW;AAAA,YAC7B,gBAAgB,UAAU,GAAG,IAAI,GAAG,OAAO;AAAA,UAC7C;AAAA,UAGA;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,OAAM;AAAA,gBACN,WAAU;AAAA,gBACV,eAAY;AAAA,gBAEZ;AAAA,kBAAC;AAAA;AAAA,oBACC,GAAE;AAAA,oBACF,WAAU;AAAA;AAAA,gBACZ;AAAA;AAAA,YACF;AAAA,YAEA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,OAAM;AAAA,gBACN,WAAU;AAAA,gBACV,eAAY;AAAA,gBACZ,OAAO;AAAA,kBACL,UAAU,WAAW,MAAM,WAAW;AAAA,gBACxC;AAAA,gBAEA;AAAA,kBAAC;AAAA;AAAA,oBACC,GAAE;AAAA,oBACF,WAAU;AAAA;AAAA,gBACZ;AAAA;AAAA,YACF;AAAA;AAAA;AAAA,QAtCK;AAAA,MAuCP;AAAA,IAEJ,CAAC;AAED,WACE;AAAA,MAAC;AAAA;AAAA,QACC,KAAK,CAAC,SAAS;AACb,UAAC,aAA+D,UAAU;AAC1E,cAAI,OAAO,QAAQ,WAAY,KAAI,IAAI;AAAA,mBAC9B,IAAK,CAAC,IAAsD,UAAU;AAAA,QACjF;AAAA,QACA,WAAW,KAAK,kBAAkB,mBAAmB,IAAI,IAAI,SAAS;AAAA,QACtE,MAAK;AAAA,QACL,cAAY,GAAG,YAAY,WAAW,GAAG;AAAA,QACxC,GAAG;AAAA,QAEJ;AAAA,8BAAC,UAAK,WAAU,yBAAyB,iBAAM;AAAA,UAC9C,aACC,qBAAC,UAAK,WAAU,yBACb;AAAA,yBAAa,eAAe,QAAW;AAAA,cACtC,uBAAuB,eAAe,MAAM,IAAI,IAAI;AAAA,cACpD,uBAAuB;AAAA,YACzB,CAAC;AAAA,YACA,cACC,oBAAC,UAAK,WAAU,+BAA+B,sBAAW;AAAA,aAE9D;AAAA;AAAA;AAAA,IAEJ;AAAA,EAEJ;AACF;AAEA,WAAW,cAAc;;;AC3KzB,SAAgB,cAAAA,mBAAkB;AAClC,OAAOC,WAAU;AAmCb,gBAAAC,MAKF,QAAAC,aALE;AAFJ,IAAM,iBAAiB,CAAC,EAAE,KAAK,MAC7B,gBAAAD,KAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QAAO,OAAM,8BAA6B,eAAY,QAC7G,0BAAAA,KAAC,UAAK,GAAE,wFAAuF,MAAK,WAAU,GAChH;AAGF,IAAM,SAAS,CAAC,EAAE,KAAK,MACrB,gBAAAC,MAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QAAO,OAAM,8BAA6B,eAAY,QAC7G;AAAA,kBAAAD,KAAC,UAAK,GAAE,sEAAqE,MAAK,WAAU;AAAA,EAC5F,gBAAAA,KAAC,UAAK,GAAE,OAAM,GAAE,OAAM,kBAAiB,UAAS,YAAW,UAAS,MAAK,SAAQ,YAAW,QAAO,UAAS,MAAK,YAAW,qBAAoB,gBAAE;AAAA,GACpJ;AAGF,IAAM,aAAa,CAAC,EAAE,KAAK,MACzB,gBAAAC,MAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QAAO,OAAM,8BAA6B,eAAY,QAC7G;AAAA,kBAAAD,KAAC,UAAK,GAAE,oHAAmH,MAAK,WAAS;AAAA,EACzI,gBAAAA,KAAC,UAAK,GAAE,yIAAwI,MAAK,WAAS;AAAA,EAC9J,gBAAAA,KAAC,UAAK,GAAE,8HAA6H,MAAK,WAAS;AAAA,EACnJ,gBAAAA,KAAC,UAAK,GAAE,uIAAsI,MAAK,WAAS;AAAA,GAC9J;AAGF,IAAM,qBAAqB,CAAC,EAAE,KAAK,MACjC,gBAAAC,MAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QAAO,OAAM,8BAA6B,eAAY,QAC7G;AAAA,kBAAAD,KAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,MAAK,WAAU,SAAQ,OAAM,QAAO,WAAU,aAAY,OAAK;AAAA,EAC9F,gBAAAA,KAAC,UAAK,GAAE,iJAAgJ,MAAK,WAAS;AAAA,EACtK,gBAAAA,KAAC,UAAK,GAAE,mBAAkB,QAAO,WAAU,aAAY,OAAM,eAAc,SAAO;AAAA,EAClF,gBAAAA,KAAC,UAAK,GAAE,qBAAoB,QAAO,WAAU,aAAY,OAAM,eAAc,SAAO;AAAA,EACpF,gBAAAA,KAAC,UAAK,GAAE,iBAAgB,QAAO,WAAU,aAAY,OAAM,eAAc,SAAO;AAAA,GAClF;AAGF,IAAM,iBAA+D;AAAA,EACnE,YAAY;AAAA,EACZ,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,oBAAoB;AACtB;AAEA,IAAM,kBAA4C;AAAA,EAChD,YAAY;AAAA,EACZ,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,oBAAoB;AACtB;AAEA,IAAM,kBAA4C;AAAA,EAChD,YAAY;AAAA,EACZ,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,oBAAoB;AACtB;AAaO,IAAM,gBAAgBF;AAAA,EAC3B,CACE;AAAA,IACE;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,OAAO,eAAe,QAAQ;AACpC,UAAM,QAAQ,gBAAgB,QAAQ;AACtC,UAAM,cAAc,gBAAgB,QAAQ;AAC5C,UAAM,WAAW,SAAS,OAAO,KAAK;AAEtC,WACE,gBAAAG;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,WAAWF;AAAA,UACT;AAAA,UACA,sBAAsB,OAAO;AAAA,UAC7B,sBAAsB,IAAI;AAAA,UAC1B;AAAA,QACF;AAAA,QACA,OAAO,EAAE,qBAAqB,YAAY;AAAA,QAC1C,cACE,YAAY,UAAU,SAClB,GAAG,KAAK,KAAK,MAAM,SAAS,QAAQ,SAAS,KAAK,aAAa,EAAE,KACjE;AAAA,QAEL,GAAG;AAAA,QAEJ;AAAA,0BAAAC,KAAC,UAAK,WAAU,2BACd,0BAAAA,KAAC,QAAK,MAAM,UAAU,GACxB;AAAA,UAEC,YAAY,eACX,gBAAAA,KAAC,UAAK,WAAU,4BAA4B,iBAAM;AAAA,UAGnD,YAAY,UAAU,UAAU,QAC/B,gBAAAC,MAAC,UAAK,WAAU,6BACd;AAAA,4BAAAD,KAAC,cAAW,OAAO,QAAQ,MAAK,MAAK;AAAA,YACpC,SAAS,QACR,gBAAAC,MAAC,UAAK,WAAU,4BAA2B;AAAA;AAAA,cAAE;AAAA,cAAM;AAAA,eAAC;AAAA,aAExD;AAAA;AAAA;AAAA,IAEJ;AAAA,EAEJ;AACF;AAEA,cAAc,cAAc;;;AC3J5B,SAAgB,cAAAH,mBAAkB;AAClC,OAAOC,WAAU;AA0EL,gBAAAC,MAWF,QAAAC,aAXE;AApCL,IAAM,kBAAkBH;AAAA,EAC7B,CACE;AAAA,IACE,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,WACE,gBAAAG;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAWF;AAAA,UACT;AAAA,UACA,YAAY,YAAY,oBAAoB;AAAA,UAC5C,YAAY,YAAY,kBAAkB;AAAA,UAC1C;AAAA,UACA,yBAAyB,OAAO;AAAA,UAChC,QAAQ;AAAA,UACR;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEH;AAAA,iBAAO,OACN,gBAAAC,KAAC,SAAI,WAAU,+BACb,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,KAAK,MAAM;AAAA,cACX,KAAK,MAAM,OAAO;AAAA,cAClB,WAAU;AAAA,cACV,SAAQ;AAAA,cACR,UAAS;AAAA;AAAA,UACX,GACF;AAAA,UAGF,gBAAAC,MAAC,SAAI,WAAU,8BACb;AAAA,4BAAAA,MAAC,SAAI,WAAU,8BACZ;AAAA,6BAAe,UAAa,gBAAAD,KAAC,cAAW,OAAO,YAAY,MAAK,MAAK;AAAA,cACrE,YAAY,gBAAAA,KAAC,iBAAc,UAAoB;AAAA,cAC/C,YAAY,gBAAAA,KAAC,UAAK,WAAU,kCAAkC,oBAAS;AAAA,eAC1E;AAAA,YAEC,YAAY,gBAAAA,KAAC,QAAG,WAAU,kCAAkC,oBAAS;AAAA,YAEtE,gBAAAA,KAAC,gBAAW,WAAU,+BACpB,0BAAAA,KAAC,OAAG,mBAAQ,GACd;AAAA,YAEC,WAAW,QAAQ,SAAS,KAC3B,gBAAAA,KAAC,SAAI,WAAU,iCACZ,kBAAQ,IAAI,CAAC,QAAQ,UACpB,gBAAAC,MAAC,SAAI,WAAU,gCACb;AAAA,8BAAAD,KAAC,UAAK,WAAU,sCAAsC,iBAAO,OAAM;AAAA,cACnE,gBAAAA,KAAC,UAAK,WAAU,sCAAsC,iBAAO,OAAM;AAAA,iBAFlB,KAGnD,CACD,GACH;AAAA,YAGD,UAAU,OAAO,SAAS,KACzB,gBAAAA,KAAC,SAAI,WAAU,gCACZ,iBAAO,IAAI,CAAC,OAAO,UAClB,gBAAAA,KAAC,UAAK,WAAU,+BAA2C,mBAAR,KAAc,CAClE,GACH;AAAA,YAGF,gBAAAC,MAAC,YAAO,WAAU,gCACf;AAAA,qBAAO,UACN,gBAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,KAAK,OAAO;AAAA,kBACZ,KAAI;AAAA,kBACJ,WAAU;AAAA,kBACV,SAAQ;AAAA,kBACR,UAAS;AAAA;AAAA,cACX;AAAA,cAEF,gBAAAC,MAAC,SAAI,WAAU,qCACb;AAAA,gCAAAD,KAAC,UAAK,WAAU,8BAA8B,iBAAO,MAAK;AAAA,iBACxD,OAAO,SAAS,OAAO,YACvB,gBAAAA,KAAC,UAAK,WAAU,8BACb,WAAC,OAAO,OAAO,OAAO,OAAO,EAAE,OAAO,OAAO,EAAE,KAAK,QAAK,GAC5D;AAAA,iBAEJ;AAAA,eACF;AAAA,YAEC,QAAQ,WAAW,gBAAAA,KAAC,UAAK,WAAU,6BAA6B,mBAAQ;AAAA,aAC3E;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAEA,gBAAgB,cAAc;;;AChJ9B,SAAgB,cAAAF,mBAAkB;AAClC,OAAOC,WAAU;AAkBX,gBAAAC,YAAA;AAXC,IAAM,sBAAsBF;AAAA,EACjC,CAAC,EAAE,aAAa,eAAe,WAAW,UAAU,GAAG,MAAM,GAAG,QAC9D,gBAAAE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAWD;AAAA,QACT;AAAA,QACA,wCAAwC,UAAU;AAAA,QAClD;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEJ,0BAAAC,KAAC,SAAI,WAAU,mCAAmC,UAAS;AAAA;AAAA,EAC7D;AAEJ;AAEA,oBAAoB,cAAc;;;ACxBlC,SAAgB,cAAAF,mBAAkB;AAClC,OAAOC,WAAU;AAkDP,gBAAAC,MAKF,QAAAC,aALE;AAhCH,IAAM,sBAAsBH;AAAA,EACjC,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA,kBAAkB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb,UAAU;AAAA,IACV;AAAA,IACA,GAAG;AAAA,EACL,GACA,QAEA,gBAAAG;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,MAAM,oBAAoB,cAAc,IAAI;AAAA,MAC5C,QAAO;AAAA,MACP,QAAQ,oBAAoB;AAAA,MAC5B,WAAWF;AAAA,QACT;AAAA,QACA,6BAA6B,eAAe;AAAA,QAC5C,wCAAwC,UAAU;AAAA,QAClD,qCAAqC,OAAO;AAAA,QAC5C;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA,oBACC,gBAAAC,KAAC,SAAI,WAAU,mCACb,0BAAAA,KAAC,SAAI,KAAK,UAAU,KAAI,IAAG,WAAU,mCAAkC,SAAQ,QAAO,UAAS,SAAQ,GACzG;AAAA,QAGF,gBAAAC,MAAC,SAAI,WAAU,qCACb;AAAA,0BAAAA,MAAC,SAAI,WAAU,kCACZ;AAAA,2BAAe,UAAa,gBAAAD,KAAC,cAAW,OAAO,YAAY,MAAK,MAAK;AAAA,YACrE,YAAY,gBAAAA,KAAC,iBAAc,UAAoB;AAAA,aAClD;AAAA,UAEA,gBAAAA,KAAC,gBAAW,WAAU,mCACpB,0BAAAA,KAAC,OAAG,iBAAM,GACZ;AAAA,UAEA,gBAAAC,MAAC,YAAO,WAAU,oCACf;AAAA,mBAAO,UACN,gBAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK,OAAO;AAAA,gBACZ,KAAI;AAAA,gBACJ,WAAU;AAAA,gBACV,SAAQ;AAAA,gBACR,UAAS;AAAA;AAAA,YACX;AAAA,YAEF,gBAAAC,MAAC,SAAI,WAAU,yCACb;AAAA,8BAAAD,KAAC,UAAK,WAAU,kCAAkC,iBAAO,MAAK;AAAA,eAC5D,OAAO,SAAS,OAAO,YACvB,gBAAAA,KAAC,UAAK,WAAU,kCACb,WAAC,OAAO,OAAO,OAAO,OAAO,EAAE,OAAO,OAAO,EAAE,KAAK,QAAK,GAC5D;AAAA,eAEJ;AAAA,aACF;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,oBAAoB,cAAc;;;ACzFlC,SAAgB,cAAAF,mBAAkB;AAClC,OAAOC,WAAU;AAWb,gBAAAC,YAAA;AAFG,IAAM,kBAAkBF;AAAA,EAC7B,CAAC,EAAE,UAAU,GAAG,YAAY,OAAO,aAAa,eAAe,WAAW,UAAU,GAAG,MAAM,GAAG,QAC9F,gBAAAE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAWD;AAAA,QACT;AAAA,QACA,iCAAiC,OAAO;AAAA,QACxC,oCAAoC,UAAU;AAAA,QAC9C,aAAa;AAAA,QACb;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;AAEA,gBAAgB,cAAc;;;AC5B9B,SAAgB,cAAAD,mBAAkB;AAClC,OAAOC,WAAU;AAyBT,SACc,OAAAC,MADd,QAAAC,aAAA;AAJD,IAAM,mBAAmBH;AAAA,EAC9B,CAAC,EAAE,OAAO,OAAO,UAAU,QAAQ,QAAQ,UAAU,aAAa,eAAe,WAAW,GAAG,MAAM,GAAG,QAAQ;AAC9G,UAAM,gBAAgB,MAAM,IAAI,CAAC,SAAS;AACxC,YAAM,UACJ,gBAAAG,MAAC,UAAK,WAAU,uCACb;AAAA,aAAK,MAAM,gBAAAD,KAAC,SAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,WAAU,gCAA+B,SAAQ,QAAO,UAAS,SAAQ,IAAK,KAAK;AAAA,QACjI,KAAK,SAAS,gBAAAA,KAAC,UAAK,WAAU,gCAAgC,eAAK,OAAM;AAAA,SAC5E;AAGF,aAAO,KAAK,OACV,gBAAAA,KAAC,gBAA2B,MAAM,KAAK,MAAM,SAAQ,qBAAoB,WAAU,+BAChF,qBADgB,KAAK,EAExB,IAEA,gBAAAA,KAAC,UAAmB,WAAU,+BAC3B,qBADQ,KAAK,EAEhB;AAAA,IAEJ,CAAC;AAED,WACE,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAWF;AAAA,UACT;AAAA,UACA,0BAA0B,OAAO;AAAA,UACjC,gCAAgC,KAAK;AAAA,UACrC,qCAAqC,UAAU;AAAA,UAC/C;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEH;AAAA,mBAAS,gBAAAC,KAAC,OAAE,WAAU,gCAAgC,iBAAM;AAAA,UAC7D,gBAAAA,KAAC,SAAI,WAAU,mCACb,0BAAAC,MAAC,SAAI,WAAU,gCACZ;AAAA;AAAA,YACA,YAAY,aAAa;AAAA,aAC5B,GACF;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAEA,iBAAiB,cAAc;;;ACnE/B,SAAgB,cAAAH,aAAY,YAAAI,WAAU,mBAAmB;AACzD,SAAS,UAAU,kBAAkB;AACrC,OAAOH,WAAU;AAsDf,SACE,OAAAC,MADF,QAAAC,aAAA;AAnBF,SAAS,YAAY,KAAqB;AAExC,QAAM,UAAU,IAAI;AAAA,IAClB;AAAA,EACF;AACA,MAAI,QAAS,QAAO,0CAA0C,QAAQ,CAAC,CAAC;AAGxE,QAAM,aAAa,IAAI,MAAM,uBAAuB;AACpD,MAAI,WAAY,QAAO,kCAAkC,WAAW,CAAC,CAAC;AAGtE,QAAM,YAAY,IAAI,MAAM,sCAAsC;AAClE,MAAI,UAAW,QAAO,8BAA8B,UAAU,CAAC,CAAC;AAEhE,SAAO;AACT;AAEA,IAAM,WAAW,MACf,gBAAAA,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,OAAM,8BAA6B,eAAY,QACzG;AAAA,kBAAAD,KAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,WAAU,8BAA6B;AAAA,EACtE,gBAAAA,KAAC,UAAK,GAAE,0BAAyB,MAAK,SAAQ;AAAA,GAChD;AAGF,IAAM,YAAY,MAChB,gBAAAC,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAQ,eAAY,QACzJ;AAAA,kBAAAD,KAAC,UAAK,IAAG,MAAK,IAAG,KAAI,IAAG,KAAI,IAAG,MAAK;AAAA,EACpC,gBAAAA,KAAC,UAAK,IAAG,KAAI,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK;AAAA,GACtC;AAqBK,IAAM,gBAAgBF;AAAA,EAC3B,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF,GACA,QACG;AACH,UAAM,CAAC,MAAM,OAAO,IAAII,UAAS,KAAK;AAEtC,UAAM,aAAa,YAAY,MAAM;AACnC,cAAQ,IAAI;AACZ,eAAS;AAAA,IACX,GAAG,CAAC,MAAM,CAAC;AAEX,WACE,gBAAAF,KAAC,SAAI,KAAU,WAAWD,MAAK,qBAAqB,SAAS,GAC3D,0BAAAE,MAAC,WAAW,MAAX,EAAgB,MAAY,cAAc,SACzC;AAAA,sBAAAD;AAAA,QAAC,WAAW;AAAA,QAAX;AAAA,UACC,WAAU;AAAA,UACV,SAAS;AAAA,UAER,qBACC,gBAAAC,MAAC,SAAI,WAAU,qCACZ;AAAA,2BACC,gBAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK;AAAA,gBACL,KAAK,gBAAgB,SAAS,KAAK;AAAA,gBACnC,WAAU;AAAA,gBACV,SAAQ;AAAA,gBACR,UAAS;AAAA;AAAA,YACX,IAEA,gBAAAA,KAAC,SAAI,WAAU,kCAAiC;AAAA,YAElD,gBAAAA,KAAC,SAAI,WAAU,8BACb,0BAAAA,KAAC,SAAI,WAAU,+BACb,0BAAAA,KAAC,YAAS,GACZ,GACF;AAAA,aACF;AAAA;AAAA,MAEJ;AAAA,MAEA,gBAAAC,MAAC,WAAW,QAAX,EACC;AAAA,wBAAAD,KAAC,WAAW,UAAX,EAAoB,WAAU,+BAA8B;AAAA,QAC7D,gBAAAC,MAAC,WAAW,OAAX,EAAiB,WAAU,4BAC1B;AAAA,0BAAAD,KAAC,WAAW,OAAX,EAAiB,WAAU,4BAA2B,cAAW,eAChE,0BAAAA,KAAC,aAAU,GACb;AAAA,UACA,gBAAAA,KAAC,WAAW,OAAX,EAAiB,WAAU,cAAc,iBAAM;AAAA,UAChD,gBAAAA,KAAC,SAAI,WAAU,kCACZ,kBACC,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,KAAK,YAAY,QAAQ;AAAA,cACzB;AAAA,cACA,WAAU;AAAA,cACV,OAAM;AAAA,cACN,iBAAe;AAAA;AAAA,UACjB,GAEJ;AAAA,WACF;AAAA,SACF;AAAA,OACF,GACF;AAAA,EAEJ;AACF;AAEA,cAAc,cAAc","sourcesContent":["import React, { forwardRef, useEffect, useRef, useState } from 'react';\nimport clsx from 'clsx';\nimport './StarRating.css';\n\n/* ============================================================================\n STAR RATING\n ============================================================================\n Animated star display with half-star support, configurable sizes, and\n optional viewport-triggered fill animation. Replaces text-character\n star displays across all social proof surfaces.\n\n Strategic objective: Instant visual trust signal\n ============================================================================ */\n\nexport interface StarRatingProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Rating value (0-5, supports decimals for half-stars) */\n value: number;\n /** Maximum number of stars */\n max?: number;\n /** Star size variant */\n size?: 'sm' | 'md' | 'lg';\n /** Animate stars filling on viewport entry */\n animate?: boolean;\n /** Show numeric value next to stars */\n showValue?: boolean;\n /** Label shown after value (e.g., \"/ 5\") */\n valueLabel?: string;\n}\n\n/**\n * Star rating display with gold-fill, half-star support, and optional\n * entrance animation. Uses inline SVGs with clip-path for precise\n * partial fills.\n *\n * @example\n * ```tsx\n * <StarRating value={4.5} size=\"lg\" animate />\n * <StarRating value={5} size=\"sm\" showValue />\n * ```\n */\nexport const StarRating = forwardRef<HTMLDivElement, StarRatingProps>(\n (\n {\n value,\n max = 5,\n size = 'md',\n animate = false,\n showValue = false,\n valueLabel,\n className,\n ...props\n },\n ref,\n ) => {\n const [visible, setVisible] = useState(!animate);\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!animate) return;\n\n // Respect reduced motion\n if (typeof window !== 'undefined') {\n const mq = window.matchMedia('(prefers-reduced-motion: reduce)');\n if (mq.matches) {\n setVisible(true);\n return;\n }\n }\n\n const target = containerRef.current;\n if (!target) return;\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n setVisible(true);\n observer.disconnect();\n }\n },\n { threshold: 0.5 },\n );\n\n observer.observe(target);\n return () => observer.disconnect();\n }, [animate]);\n\n const clampedValue = Math.min(Math.max(value, 0), max);\n\n const stars = Array.from({ length: max }, (_, i) => {\n const starIndex = i + 1;\n const fillPercent =\n clampedValue >= starIndex\n ? 100\n : clampedValue > starIndex - 1\n ? (clampedValue - (starIndex - 1)) * 100\n : 0;\n\n return (\n <span\n key={i}\n className={clsx(\n 'ds-star-rating__star',\n visible && 'ds-star-rating__star--visible',\n )}\n style={{\n '--star-fill': `${fillPercent}%`,\n '--star-delay': animate ? `${i * 100}ms` : '0ms',\n } as React.CSSProperties}\n >\n {/* Background (empty) star */}\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"ds-star-rating__svg\"\n aria-hidden=\"true\"\n >\n <path\n 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\"\n className=\"ds-star-rating__empty\"\n />\n </svg>\n {/* Foreground (filled) star with clip */}\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"ds-star-rating__svg ds-star-rating__svg--filled\"\n aria-hidden=\"true\"\n style={{\n clipPath: `inset(0 ${100 - fillPercent}% 0 0)`,\n }}\n >\n <path\n 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\"\n className=\"ds-star-rating__filled\"\n />\n </svg>\n </span>\n );\n });\n\n return (\n <div\n ref={(node) => {\n (containerRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n }}\n className={clsx('ds-star-rating', `ds-star-rating--${size}`, className)}\n role=\"img\"\n aria-label={`${clampedValue} out of ${max} stars`}\n {...props}\n >\n <span className=\"ds-star-rating__stars\">{stars}</span>\n {showValue && (\n <span className=\"ds-star-rating__value\">\n {clampedValue.toLocaleString(undefined, {\n minimumFractionDigits: clampedValue % 1 !== 0 ? 1 : 0,\n maximumFractionDigits: 1,\n })}\n {valueLabel && (\n <span className=\"ds-star-rating__value-label\">{valueLabel}</span>\n )}\n </span>\n )}\n </div>\n );\n },\n);\n\nStarRating.displayName = 'StarRating';\n","import React, { forwardRef } from 'react';\nimport clsx from 'clsx';\nimport { StarRating } from '../StarRating/StarRating';\nimport './PlatformBadge.css';\n\n/* ============================================================================\n PLATFORM BADGE\n ============================================================================\n Recognizable review platform icons (Trustpilot, G2, Google, Chrome Web\n Store) with optional rating display. Builds instant trust through visual\n brand recognition.\n\n Strategic objective: Third-party authority signal\n ============================================================================ */\n\nexport type Platform = 'trustpilot' | 'g2' | 'google' | 'chrome-web-store';\n\nexport interface PlatformBadgeProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Review platform */\n platform: Platform;\n /** Display mode */\n variant?: 'icon-only' | 'icon-label' | 'full';\n /** Platform rating (used in 'full' variant) */\n rating?: number;\n /** Number of reviews (used in 'full' variant) */\n count?: number;\n /** Size variant */\n size?: 'sm' | 'md';\n}\n\n/* --------------------------------------------------------------------------\n Platform SVG Icons — inline for zero-latency rendering\n -------------------------------------------------------------------------- */\n\nconst TrustpilotIcon = ({ size }: { size: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <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\" />\n </svg>\n);\n\nconst G2Icon = ({ size }: { size: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <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\" />\n <text x=\"50%\" y=\"54%\" dominantBaseline=\"middle\" textAnchor=\"middle\" fill=\"white\" fontWeight=\"bold\" fontSize=\"11\" fontFamily=\"Arial, sans-serif\">G2</text>\n </svg>\n);\n\nconst GoogleIcon = ({ size }: { size: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <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\"/>\n <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\"/>\n <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\"/>\n <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\"/>\n </svg>\n);\n\nconst ChromeWebStoreIcon = ({ size }: { size: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"#4285F4\" opacity=\"0.1\" stroke=\"#4285F4\" strokeWidth=\"1.5\"/>\n <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\"/>\n <path d=\"M7.5 10.5L4 5.5\" stroke=\"#EA4335\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n <path d=\"M16.5 10.5L20 5.5\" stroke=\"#FBBC05\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n <path d=\"M12 17l-3.5 5\" stroke=\"#34A853\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n </svg>\n);\n\nconst PLATFORM_ICONS: Record<Platform, React.FC<{ size: number }>> = {\n trustpilot: TrustpilotIcon,\n g2: G2Icon,\n google: GoogleIcon,\n 'chrome-web-store': ChromeWebStoreIcon,\n};\n\nconst PLATFORM_LABELS: Record<Platform, string> = {\n trustpilot: 'Trustpilot',\n g2: 'G2',\n google: 'Google',\n 'chrome-web-store': 'Chrome Web Store',\n};\n\nconst PLATFORM_COLORS: Record<Platform, string> = {\n trustpilot: '#00B67A',\n g2: '#FF492C',\n google: '#4285F4',\n 'chrome-web-store': '#4285F4',\n};\n\n/**\n * Review platform badge with recognizable brand icon, optional label,\n * and optional rating display.\n *\n * @example\n * ```tsx\n * <PlatformBadge platform=\"trustpilot\" variant=\"icon-only\" />\n * <PlatformBadge platform=\"g2\" variant=\"icon-label\" />\n * <PlatformBadge platform=\"google\" variant=\"full\" rating={4.9} count={42} />\n * ```\n */\nexport const PlatformBadge = forwardRef<HTMLDivElement, PlatformBadgeProps>(\n (\n {\n platform,\n variant = 'icon-label',\n rating,\n count,\n size = 'sm',\n className,\n ...props\n },\n ref,\n ) => {\n const Icon = PLATFORM_ICONS[platform];\n const label = PLATFORM_LABELS[platform];\n const accentColor = PLATFORM_COLORS[platform];\n const iconSize = size === 'sm' ? 18 : 22;\n\n return (\n <div\n ref={ref}\n role=\"img\"\n className={clsx(\n 'ds-platform-badge',\n `ds-platform-badge--${variant}`,\n `ds-platform-badge--${size}`,\n className,\n )}\n style={{ '--platform-accent': accentColor } as React.CSSProperties}\n aria-label={\n variant === 'full' && rating\n ? `${label}: ${rating} stars${count ? ` from ${count} reviews` : ''}`\n : label\n }\n {...props}\n >\n <span className=\"ds-platform-badge__icon\">\n <Icon size={iconSize} />\n </span>\n\n {variant !== 'icon-only' && (\n <span className=\"ds-platform-badge__label\">{label}</span>\n )}\n\n {variant === 'full' && rating != null && (\n <span className=\"ds-platform-badge__rating\">\n <StarRating value={rating} size=\"sm\" />\n {count != null && (\n <span className=\"ds-platform-badge__count\">({count})</span>\n )}\n </span>\n )}\n </div>\n );\n },\n);\n\nPlatformBadge.displayName = 'PlatformBadge';\n","import React, { forwardRef } from 'react';\nimport clsx from 'clsx';\nimport { PlatformBadge, type Platform } from '../PlatformBadge/PlatformBadge';\nimport { StarRating } from '../StarRating/StarRating';\nimport './SocialProofCard.css';\n\nexport interface SocialProofAuthor {\n name: string;\n title?: string;\n company?: string;\n avatar?: string;\n}\n\nexport interface SocialProofMetric {\n value: React.ReactNode;\n label: React.ReactNode;\n}\n\nexport interface SocialProofMedia {\n src: string;\n type: 'image';\n alt?: string;\n}\n\nexport interface SocialProofCardProps extends Omit<React.HTMLAttributes<HTMLElement>, 'content'> {\n variant?: 'social' | 'compact' | 'standard' | 'detailed' | 'narrative';\n content: React.ReactNode;\n author: SocialProofAuthor;\n starRating?: number;\n platform?: Platform;\n badges?: React.ReactNode[];\n href?: string;\n media?: SocialProofMedia;\n metrics?: SocialProofMetric[];\n headline?: React.ReactNode;\n industry?: React.ReactNode;\n ctaText?: React.ReactNode;\n}\n\nexport const SocialProofCard = forwardRef<HTMLElement, SocialProofCardProps>(\n (\n {\n variant = 'standard',\n content,\n author,\n starRating,\n platform,\n badges,\n href,\n media,\n metrics,\n headline,\n industry,\n ctaText,\n className,\n ...props\n },\n ref,\n ) => {\n return (\n <article\n ref={ref}\n className={clsx(\n 'ds-card',\n variant === 'compact' ? 'ds-card--tier-1' : 'ds-card--tier-2',\n variant === 'compact' ? 'glass--tier-1' : 'glass--tier-2',\n 'ds-social-proof-card',\n `ds-social-proof-card--${variant}`,\n href && 'ds-social-proof-card--linked',\n className,\n )}\n {...props}\n >\n {media?.src && (\n <div className=\"ds-social-proof-card__media\">\n <img\n src={media.src}\n alt={media.alt ?? ''}\n className=\"ds-social-proof-card__image\"\n loading=\"lazy\"\n decoding=\"async\"\n />\n </div>\n )}\n\n <div className=\"ds-social-proof-card__body\">\n <div className=\"ds-social-proof-card__meta\">\n {starRating !== undefined && <StarRating value={starRating} size=\"sm\" />}\n {platform && <PlatformBadge platform={platform} />}\n {industry && <span className=\"ds-social-proof-card__industry\">{industry}</span>}\n </div>\n\n {headline && <h3 className=\"ds-social-proof-card__headline\">{headline}</h3>}\n\n <blockquote className=\"ds-social-proof-card__quote\">\n <p>{content}</p>\n </blockquote>\n\n {metrics && metrics.length > 0 && (\n <div className=\"ds-social-proof-card__metrics\">\n {metrics.map((metric, index) => (\n <div className=\"ds-social-proof-card__metric\" key={index}>\n <span className=\"ds-social-proof-card__metric-value\">{metric.value}</span>\n <span className=\"ds-social-proof-card__metric-label\">{metric.label}</span>\n </div>\n ))}\n </div>\n )}\n\n {badges && badges.length > 0 && (\n <div className=\"ds-social-proof-card__badges\">\n {badges.map((badge, index) => (\n <span className=\"ds-social-proof-card__badge\" key={index}>{badge}</span>\n ))}\n </div>\n )}\n\n <footer className=\"ds-social-proof-card__author\">\n {author.avatar && (\n <img\n src={author.avatar}\n alt=\"\"\n className=\"ds-social-proof-card__avatar\"\n loading=\"lazy\"\n decoding=\"async\"\n />\n )}\n <div className=\"ds-social-proof-card__author-copy\">\n <cite className=\"ds-social-proof-card__name\">{author.name}</cite>\n {(author.title || author.company) && (\n <span className=\"ds-social-proof-card__role\">\n {[author.title, author.company].filter(Boolean).join(' · ')}\n </span>\n )}\n </div>\n </footer>\n\n {href && ctaText && <span className=\"ds-social-proof-card__cta\">{ctaText}</span>}\n </div>\n </article>\n );\n },\n);\n\nSocialProofCard.displayName = 'SocialProofCard';\n","import React, { forwardRef } from 'react';\nimport clsx from 'clsx';\nimport './SocialProofCarousel.css';\n\nexport interface SocialProofCarouselProps extends React.HTMLAttributes<HTMLDivElement> {\n background?: 'default' | 'muted' | 'dark' | 'brand' | 'transparent';\n}\n\nexport const SocialProofCarousel = forwardRef<HTMLDivElement, SocialProofCarouselProps>(\n ({ background = 'transparent', className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={clsx(\n 'ds-social-proof-carousel',\n `ds-social-proof-carousel--background-${background}`,\n className,\n )}\n {...props}\n >\n <div className=\"ds-social-proof-carousel__track\">{children}</div>\n </div>\n ),\n);\n\nSocialProofCarousel.displayName = 'SocialProofCarousel';\n","import React, { forwardRef } from 'react';\nimport clsx from 'clsx';\nimport { Card } from '../Card/Card';\nimport { PlatformBadge, type Platform } from '../PlatformBadge/PlatformBadge';\nimport { StarRating } from '../StarRating/StarRating';\nimport type { SocialProofAuthor } from '../SocialProofCard/SocialProofCard';\nimport './SocialProofFeatured.css';\n\nexport interface SocialProofFeaturedProps extends React.HTMLAttributes<HTMLDivElement> {\n quote: React.ReactNode;\n author: SocialProofAuthor;\n featuredVariant?: 'standard' | 'cinematic' | 'spotlight';\n starRating?: number;\n platform?: Platform;\n mediaSrc?: string;\n background?: 'default' | 'muted' | 'brand' | 'transparent';\n padding?: 'sm' | 'md' | 'lg';\n}\n\nexport const SocialProofFeatured = forwardRef<HTMLDivElement, SocialProofFeaturedProps>(\n (\n {\n quote,\n author,\n featuredVariant = 'standard',\n starRating,\n platform,\n mediaSrc,\n background = 'transparent',\n padding = 'md',\n className,\n ...props\n },\n ref,\n ) => (\n <Card\n ref={ref}\n tier={featuredVariant === 'spotlight' ? 3 : 2}\n radius=\"panel\"\n aurora={featuredVariant === 'spotlight'}\n className={clsx(\n 'ds-social-proof-featured',\n `ds-social-proof-featured--${featuredVariant}`,\n `ds-social-proof-featured--background-${background}`,\n `ds-social-proof-featured--padding-${padding}`,\n className,\n )}\n {...props}\n >\n {mediaSrc && (\n <div className=\"ds-social-proof-featured__media\">\n <img src={mediaSrc} alt=\"\" className=\"ds-social-proof-featured__image\" loading=\"lazy\" decoding=\"async\" />\n </div>\n )}\n\n <div className=\"ds-social-proof-featured__content\">\n <div className=\"ds-social-proof-featured__meta\">\n {starRating !== undefined && <StarRating value={starRating} size=\"md\" />}\n {platform && <PlatformBadge platform={platform} />}\n </div>\n\n <blockquote className=\"ds-social-proof-featured__quote\">\n <p>{quote}</p>\n </blockquote>\n\n <footer className=\"ds-social-proof-featured__author\">\n {author.avatar && (\n <img\n src={author.avatar}\n alt=\"\"\n className=\"ds-social-proof-featured__avatar\"\n loading=\"lazy\"\n decoding=\"async\"\n />\n )}\n <div className=\"ds-social-proof-featured__author-copy\">\n <cite className=\"ds-social-proof-featured__name\">{author.name}</cite>\n {(author.title || author.company) && (\n <span className=\"ds-social-proof-featured__role\">\n {[author.title, author.company].filter(Boolean).join(' · ')}\n </span>\n )}\n </div>\n </footer>\n </div>\n </Card>\n ),\n);\n\nSocialProofFeatured.displayName = 'SocialProofFeatured';\n","import React, { forwardRef } from 'react';\nimport clsx from 'clsx';\nimport './SocialProofGrid.css';\n\nexport interface SocialProofGridProps extends React.HTMLAttributes<HTMLDivElement> {\n columns?: 1 | 2 | 3 | 4;\n staggered?: boolean;\n background?: 'default' | 'muted' | 'dark' | 'brand' | 'transparent';\n}\n\nexport const SocialProofGrid = forwardRef<HTMLDivElement, SocialProofGridProps>(\n ({ columns = 3, staggered = false, background = 'transparent', className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={clsx(\n 'ds-social-proof-grid',\n `ds-social-proof-grid--columns-${columns}`,\n `ds-social-proof-grid--background-${background}`,\n staggered && 'ds-social-proof-grid--staggered',\n className,\n )}\n {...props}\n >\n {children}\n </div>\n ),\n);\n\nSocialProofGrid.displayName = 'SocialProofGrid';\n","import React, { forwardRef } from 'react';\nimport clsx from 'clsx';\nimport { OutboundLink } from '../OutboundLink/OutboundLink';\nimport './SocialProofLogos.css';\n\nexport interface SocialProofLogoItem {\n id: string;\n alt: string;\n src?: string;\n logo?: React.ReactNode;\n href?: string;\n badge?: React.ReactNode;\n}\n\nexport interface SocialProofLogosProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n logos: SocialProofLogoItem[];\n title?: React.ReactNode;\n variant?: 'grid' | 'marquee';\n speed?: 'slow' | 'normal' | 'fast';\n background?: 'default' | 'muted' | 'dark' | 'brand' | 'transparent';\n}\n\nexport const SocialProofLogos = forwardRef<HTMLDivElement, SocialProofLogosProps>(\n ({ logos, title, variant = 'grid', speed = 'normal', background = 'transparent', className, ...props }, ref) => {\n const renderedLogos = logos.map((item) => {\n const content = (\n <span className=\"ds-social-proof-logos__item-content\">\n {item.src ? <img src={item.src} alt={item.alt} className=\"ds-social-proof-logos__image\" loading=\"lazy\" decoding=\"async\" /> : item.logo}\n {item.badge && <span className=\"ds-social-proof-logos__badge\">{item.badge}</span>}\n </span>\n );\n\n return item.href ? (\n <OutboundLink key={item.id} href={item.href} context=\"social-proof-logo\" className=\"ds-social-proof-logos__item\">\n {content}\n </OutboundLink>\n ) : (\n <span key={item.id} className=\"ds-social-proof-logos__item\">\n {content}\n </span>\n );\n });\n\n return (\n <div\n ref={ref}\n className={clsx(\n 'ds-social-proof-logos',\n `ds-social-proof-logos--${variant}`,\n `ds-social-proof-logos--speed-${speed}`,\n `ds-social-proof-logos--background-${background}`,\n className,\n )}\n {...props}\n >\n {title && <p className=\"ds-social-proof-logos__title\">{title}</p>}\n <div className=\"ds-social-proof-logos__viewport\">\n <div className=\"ds-social-proof-logos__track\">\n {renderedLogos}\n {variant === 'marquee' && renderedLogos}\n </div>\n </div>\n </div>\n );\n },\n);\n\nSocialProofLogos.displayName = 'SocialProofLogos';\n","import React, { forwardRef, useState, useCallback } from 'react';\nimport { Dialog as BaseDialog } from '@base-ui/react/dialog';\nimport clsx from 'clsx';\nimport './VideoLightbox.css';\n\n/* ============================================================================\n VIDEO LIGHTBOX\n ============================================================================\n Modal overlay video player built on @base-ui/react Dialog. Opens a lazy\n iframe embed (YouTube/Vimeo/Loom) with backdrop blur, keyboard navigation,\n and focus trap. Designed for inline playback from thumbnail cards without\n navigating away from the current page.\n\n Strategic objective: Engagement — keep users on the Wall of Love\n ============================================================================ */\n\nexport interface VideoLightboxProps {\n /** Video embed URL (YouTube, Vimeo, Loom) */\n videoUrl: string;\n /** Poster image shown as thumbnail trigger */\n thumbnailSrc?: string;\n /** Alt text for thumbnail */\n thumbnailAlt?: string;\n /** Video title for accessibility */\n title?: string;\n /** Custom trigger element (overrides default thumbnail + play button) */\n trigger?: React.ReactNode;\n /** Additional class name for the trigger wrapper */\n className?: string;\n /** Callback when video starts playing */\n onPlay?: () => void;\n}\n\n/* --------------------------------------------------------------------------\n Helpers\n -------------------------------------------------------------------------- */\n\nfunction getEmbedUrl(src: string): string {\n // YouTube\n const ytMatch = src.match(\n /(?:youtube\\.com\\/watch\\?v=|youtu\\.be\\/|youtube\\.com\\/embed\\/)([a-zA-Z0-9_-]+)/,\n );\n if (ytMatch) return `https://www.youtube-nocookie.com/embed/${ytMatch[1]}?autoplay=1&rel=0`;\n\n // Vimeo\n const vimeoMatch = src.match(/(?:vimeo\\.com\\/)(\\d+)/);\n if (vimeoMatch) return `https://player.vimeo.com/video/${vimeoMatch[1]}?autoplay=1`;\n\n // Loom\n const loomMatch = src.match(/(?:loom\\.com\\/share\\/)([a-zA-Z0-9]+)/);\n if (loomMatch) return `https://www.loom.com/embed/${loomMatch[1]}?autoplay=1`;\n\n return src;\n}\n\nconst PlayIcon = () => (\n <svg width=\"64\" height=\"64\" viewBox=\"0 0 64 64\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <circle cx=\"32\" cy=\"32\" r=\"32\" className=\"ds-video-lightbox__play-bg\" />\n <path d=\"M26 20v24l20-12L26 20z\" fill=\"white\" />\n </svg>\n);\n\nconst CloseIcon = () => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n);\n\n/**\n * Modal video player triggered by a thumbnail or custom element.\n * Opens a full-screen overlay with lazy iframe injection.\n *\n * @example\n * ```tsx\n * <VideoLightbox\n * videoUrl=\"https://www.youtube.com/watch?v=dQw4w9WgXcQ\"\n * thumbnailSrc=\"/thumbnails/demo.jpg\"\n * title=\"Customer testimonial\"\n * />\n *\n * <VideoLightbox\n * videoUrl=\"https://vimeo.com/123456789\"\n * trigger={<Button>Watch Video</Button>}\n * />\n * ```\n */\nexport const VideoLightbox = forwardRef<HTMLDivElement, VideoLightboxProps>(\n (\n {\n videoUrl,\n thumbnailSrc,\n thumbnailAlt,\n title = 'Video',\n trigger,\n className,\n onPlay,\n },\n ref,\n ) => {\n const [open, setOpen] = useState(false);\n\n const handleOpen = useCallback(() => {\n setOpen(true);\n onPlay?.();\n }, [onPlay]);\n\n return (\n <div ref={ref} className={clsx('ds-video-lightbox', className)}>\n <BaseDialog.Root open={open} onOpenChange={setOpen}>\n <BaseDialog.Trigger\n className=\"ds-video-lightbox__trigger\"\n onClick={handleOpen}\n >\n {trigger || (\n <div className=\"ds-video-lightbox__thumbnail-wrap\">\n {thumbnailSrc ? (\n <img\n src={thumbnailSrc}\n alt={thumbnailAlt || `Play: ${title}`}\n className=\"ds-video-lightbox__thumbnail\"\n loading=\"lazy\"\n decoding=\"async\"\n />\n ) : (\n <div className=\"ds-video-lightbox__placeholder\" />\n )}\n <div className=\"ds-video-lightbox__overlay\">\n <div className=\"ds-video-lightbox__play-btn\">\n <PlayIcon />\n </div>\n </div>\n </div>\n )}\n </BaseDialog.Trigger>\n\n <BaseDialog.Portal>\n <BaseDialog.Backdrop className=\"ds-video-lightbox__backdrop\" />\n <BaseDialog.Popup className=\"ds-video-lightbox__popup\">\n <BaseDialog.Close className=\"ds-video-lightbox__close\" aria-label=\"Close video\">\n <CloseIcon />\n </BaseDialog.Close>\n <BaseDialog.Title className=\"ds-sr-only\">{title}</BaseDialog.Title>\n <div className=\"ds-video-lightbox__iframe-wrap\">\n {open && (\n <iframe\n src={getEmbedUrl(videoUrl)}\n title={title}\n className=\"ds-video-lightbox__iframe\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n />\n )}\n </div>\n </BaseDialog.Popup>\n </BaseDialog.Portal>\n </BaseDialog.Root>\n </div>\n );\n },\n);\n\nVideoLightbox.displayName = 'VideoLightbox';\n"]}
@@ -1,8 +1,9 @@
1
1
  'use strict';
2
2
 
3
- var chunkJPUJWI7F_cjs = require('./chunk-JPUJWI7F.cjs');
3
+ var chunk6WQKRQEE_cjs = require('./chunk-6WQKRQEE.cjs');
4
4
  var chunk7EUR3AKV_cjs = require('./chunk-7EUR3AKV.cjs');
5
5
  var chunkDP74LUXG_cjs = require('./chunk-DP74LUXG.cjs');
6
+ var chunkQXUA5PQ3_cjs = require('./chunk-QXUA5PQ3.cjs');
6
7
  var chunkVC5LMUVQ_cjs = require('./chunk-VC5LMUVQ.cjs');
7
8
  var chunkGPHQGLR5_cjs = require('./chunk-GPHQGLR5.cjs');
8
9
  var chunk6QIQCUYC_cjs = require('./chunk-6QIQCUYC.cjs');
@@ -38,18 +39,10 @@ var AuroraVoid = React24.forwardRef(
38
39
  isStatic && "ds-aurora-void--static",
39
40
  className
40
41
  ),
41
- "aria-hidden": "true",
42
42
  children: [
43
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-aurora-void__aurora" }),
44
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-aurora-void__vignette" }),
45
- children && /* @__PURE__ */ jsxRuntime.jsx(
46
- "div",
47
- {
48
- style: { position: "relative", zIndex: 1 },
49
- "aria-hidden": void 0,
50
- children
51
- }
52
- )
43
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-aurora-void__aurora", "aria-hidden": "true" }),
44
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-aurora-void__vignette", "aria-hidden": "true" }),
45
+ children && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { position: "relative", zIndex: 1 }, children })
53
46
  ]
54
47
  }
55
48
  );
@@ -452,7 +445,7 @@ var CaseStudyCard = React24.forwardRef(
452
445
  logo && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-case-study-card__logo", children: logo }),
453
446
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-case-study-card__company-info", children: [
454
447
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-case-study-card__company", children: company }),
455
- industry && /* @__PURE__ */ jsxRuntime.jsx(chunkJPUJWI7F_cjs.Badge, { variant: "secondary", className: "ds-case-study-card__industry", children: industry })
448
+ industry && /* @__PURE__ */ jsxRuntime.jsx(chunk6WQKRQEE_cjs.Badge, { variant: "secondary", className: "ds-case-study-card__industry", children: industry })
456
449
  ] })
457
450
  ] }),
458
451
  /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "ds-case-study-card__headline", children: headline }),
@@ -644,7 +637,7 @@ var ComplianceGrid = React24.forwardRef(
644
637
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-compliance-grid__info", children: [
645
638
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-compliance-grid__name", children: item.name }),
646
639
  /* @__PURE__ */ jsxRuntime.jsx(
647
- chunkJPUJWI7F_cjs.Badge,
640
+ chunk6WQKRQEE_cjs.Badge,
648
641
  {
649
642
  className: clsx17__default.default(
650
643
  "ds-compliance-grid__status",
@@ -872,7 +865,7 @@ var EvolutionTimeline = React24.forwardRef(
872
865
  ),
873
866
  children: [
874
867
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-evolution-timeline__marker", "aria-hidden": "true" }),
875
- youAreHere === i && /* @__PURE__ */ jsxRuntime.jsx(chunkJPUJWI7F_cjs.Badge, { className: "ds-evolution-timeline__you-are-here", children: "Most tools are here" }),
868
+ youAreHere === i && /* @__PURE__ */ jsxRuntime.jsx(chunk6WQKRQEE_cjs.Badge, { className: "ds-evolution-timeline__you-are-here", children: "Most tools are here" }),
876
869
  era.icon && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-evolution-timeline__icon", "aria-hidden": "true", children: era.icon }),
877
870
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-evolution-timeline__content", children: [
878
871
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-evolution-timeline__period", children: era.period }),
@@ -1080,7 +1073,7 @@ var EnterpriseSignaling = React24.forwardRef(
1080
1073
  children: [
1081
1074
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-enterprise-signaling__item-name", children: item.name }),
1082
1075
  /* @__PURE__ */ jsxRuntime.jsx(
1083
- chunkJPUJWI7F_cjs.Badge,
1076
+ chunk6WQKRQEE_cjs.Badge,
1084
1077
  {
1085
1078
  className: clsx17__default.default("ds-enterprise-signaling__item-status", `ds-enterprise-signaling__item-status--${item.status}`),
1086
1079
  variant: "outline",
@@ -1656,7 +1649,7 @@ var KPIPanel = React24.forwardRef(
1656
1649
  return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: clsx17__default.default("ds-kpi-panel", className), children: cells.map((cell, i) => {
1657
1650
  const valence = cell.trend?.valence ?? (cell.trend?.direction === "up" ? "positive" : "negative");
1658
1651
  return /* @__PURE__ */ jsxRuntime.jsxs(
1659
- chunkJPUJWI7F_cjs.Card,
1652
+ chunkQXUA5PQ3_cjs.Card,
1660
1653
  {
1661
1654
  tier: 1,
1662
1655
  className: "ds-kpi-panel__cell",
@@ -1750,6 +1743,144 @@ var HeroComposition = React24.forwardRef(
1750
1743
  }
1751
1744
  );
1752
1745
  HeroComposition.displayName = "HeroComposition";
1746
+ var MarketingHero = React24.forwardRef(
1747
+ ({
1748
+ eyebrow,
1749
+ title,
1750
+ subtitle,
1751
+ primaryCta,
1752
+ secondaryCta,
1753
+ media,
1754
+ children,
1755
+ variant = "center",
1756
+ withGrid = false,
1757
+ withGlow = true,
1758
+ abVariant,
1759
+ analyticsContext,
1760
+ className,
1761
+ ...rest
1762
+ }, ref) => {
1763
+ const hasActions = Boolean(primaryCta || secondaryCta);
1764
+ const hasAside = Boolean(media);
1765
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1766
+ "section",
1767
+ {
1768
+ ref,
1769
+ className: clsx17__default.default(
1770
+ "ds-marketing-hero",
1771
+ `ds-marketing-hero--${variant}`,
1772
+ withGlow && "ds-marketing-hero--with-glow",
1773
+ withGrid && "ds-marketing-hero--with-grid",
1774
+ hasAside && "ds-marketing-hero--with-media",
1775
+ className
1776
+ ),
1777
+ "data-ab-variant": abVariant,
1778
+ "data-analytics-context": analyticsContext,
1779
+ ...rest,
1780
+ children: [
1781
+ withGlow && /* @__PURE__ */ jsxRuntime.jsx(
1782
+ AuroraVoid,
1783
+ {
1784
+ intensity: variant === "premium-split" ? "heavy" : "base",
1785
+ animated: true,
1786
+ className: "ds-marketing-hero__aurora"
1787
+ }
1788
+ ),
1789
+ /* @__PURE__ */ jsxRuntime.jsx(Vignette, { intensity: "base", className: "ds-marketing-hero__vignette" }),
1790
+ withGrid && /* @__PURE__ */ jsxRuntime.jsx(
1791
+ GridOverlay,
1792
+ {
1793
+ cell: "64",
1794
+ mask: true,
1795
+ className: "ds-marketing-hero__grid"
1796
+ }
1797
+ ),
1798
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-marketing-hero__inner", children: [
1799
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-marketing-hero__content", children: [
1800
+ /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "ds-marketing-hero__eyebrow", children: eyebrow }),
1801
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "ds-marketing-hero__title", children: title }),
1802
+ subtitle && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "ds-marketing-hero__subtitle", children: subtitle }),
1803
+ hasActions && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-marketing-hero__actions", children: [
1804
+ primaryCta,
1805
+ secondaryCta
1806
+ ] }),
1807
+ children && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-marketing-hero__body", children })
1808
+ ] }),
1809
+ media && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-marketing-hero__media", children: media })
1810
+ ] })
1811
+ ]
1812
+ }
1813
+ );
1814
+ }
1815
+ );
1816
+ MarketingHero.displayName = "MarketingHero";
1817
+ var MarketingSection = React24.forwardRef(
1818
+ ({
1819
+ eyebrow,
1820
+ title,
1821
+ titleHighlight,
1822
+ subtitle,
1823
+ children,
1824
+ background = "whisper",
1825
+ align = "center",
1826
+ withGlow = true,
1827
+ withGrid = false,
1828
+ analyticsContext,
1829
+ className,
1830
+ ...props
1831
+ }, ref) => {
1832
+ const hasHeader = Boolean(eyebrow || title || titleHighlight || subtitle);
1833
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1834
+ "section",
1835
+ {
1836
+ ref,
1837
+ className: clsx17__default.default(
1838
+ "ds-marketing-section",
1839
+ `ds-marketing-section--background-${background}`,
1840
+ `ds-marketing-section--align-${align}`,
1841
+ withGlow && "ds-marketing-section--with-glow",
1842
+ withGrid && "ds-marketing-section--with-grid",
1843
+ className
1844
+ ),
1845
+ "data-analytics-context": analyticsContext,
1846
+ ...props,
1847
+ children: [
1848
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-marketing-section__background", "aria-hidden": "true", children: [
1849
+ withGlow && /* @__PURE__ */ jsxRuntime.jsx(
1850
+ AuroraVoid,
1851
+ {
1852
+ className: "ds-marketing-section__aurora",
1853
+ intensity: "light",
1854
+ static: true
1855
+ }
1856
+ ),
1857
+ withGrid && /* @__PURE__ */ jsxRuntime.jsx(
1858
+ GridOverlay,
1859
+ {
1860
+ className: "ds-marketing-section__grid",
1861
+ cell: "64",
1862
+ mask: true
1863
+ }
1864
+ ),
1865
+ /* @__PURE__ */ jsxRuntime.jsx(Vignette, { className: "ds-marketing-section__vignette", intensity: "light" })
1866
+ ] }),
1867
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-marketing-section__inner", children: [
1868
+ hasHeader && /* @__PURE__ */ jsxRuntime.jsxs("header", { className: "ds-marketing-section__header", children: [
1869
+ eyebrow && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "ds-marketing-section__eyebrow", children: eyebrow }),
1870
+ (title || titleHighlight) && /* @__PURE__ */ jsxRuntime.jsxs("h2", { className: "ds-marketing-section__title", children: [
1871
+ title && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-marketing-section__title-line", children: title }),
1872
+ titleHighlight && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-marketing-section__title-line ds-marketing-section__title-line--highlight", children: titleHighlight })
1873
+ ] }),
1874
+ subtitle && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "ds-marketing-section__subtitle", children: subtitle })
1875
+ ] }),
1876
+ children && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-marketing-section__content", children })
1877
+ ] })
1878
+ ]
1879
+ }
1880
+ );
1881
+ }
1882
+ );
1883
+ MarketingSection.displayName = "MarketingSection";
1753
1884
 
1754
1885
  exports.ArchitectureDiagram = ArchitectureDiagram;
1755
1886
  exports.AuroraVoid = AuroraVoid;
@@ -1769,6 +1900,8 @@ exports.ICPFilter = ICPFilter;
1769
1900
  exports.IntelligenceBlock = IntelligenceBlock;
1770
1901
  exports.IntentCTA = IntentCTA;
1771
1902
  exports.KPIPanel = KPIPanel;
1903
+ exports.MarketingHero = MarketingHero;
1904
+ exports.MarketingSection = MarketingSection;
1772
1905
  exports.ObjectionFAQ = ObjectionFAQ;
1773
1906
  exports.PartnerValueProp = PartnerValueProp;
1774
1907
  exports.PricingCard = PricingCard;
@@ -1779,4 +1912,4 @@ exports.StickyActionBar = StickyActionBar;
1779
1912
  exports.ValueAnchor = ValueAnchor;
1780
1913
  exports.Vignette = Vignette;
1781
1914
  //# sourceMappingURL=out.js.map
1782
- //# sourceMappingURL=chunk-WE4QIIVN.cjs.map
1915
+ //# sourceMappingURL=chunk-UCWMJD4Y.cjs.map