@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 +1 @@
1
- {"version":3,"sources":["../../src/components/SocialProof/Card.tsx","../../src/components/StarRating/StarRating.tsx","../../src/components/PlatformBadge/PlatformBadge.tsx","../../src/components/OutboundLink/OutboundLink.tsx","../../src/web/utm/useUtmDefaults.ts","../../src/web/utm/utm-context.ts","../../src/web/utm/builders.ts","../../src/web/utm/classifiers.ts","../../src/components/OutboundLink/outbound-link-utils.ts","../../src/components/SocialProof/Grid.tsx","../../src/components/SectionShell/SectionShell.tsx","../../src/components/LayoutPrimitives/Box.tsx","../../src/tokens/spacing.ts","../../src/components/LayoutPrimitives/utils.ts","../../src/components/LayoutPrimitives/Container.tsx","../../src/components/SocialProof/Logos.tsx","../../src/components/SocialProof/Featured.tsx","../../src/components/SocialProof/Carousel.tsx","../../src/tokens/motion.ts","../../src/components/SocialProof/VerticalVideoGrid.tsx","../../src/components/SocialProof/index.ts","../../src/components/VideoLightbox/VideoLightbox.tsx","../../src/components/MetricCounter/MetricCounter.tsx"],"names":["forwardRef","clsx","jsx","jsxs","useState","useEffect","defaultCta","React","Fragment","PlayIcon","useRef"],"mappings":";AAAA,SAAS,cAAAA,mBAAkB;AAC3B,OAAOC,WAAU;;;ACDjB,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,cAAAD,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,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;;;AC1J5B,SAAsC,cAAAH,aAAwB,YAAAI,WAAU,aAAAC,kBAAiB;;;ACAzF,SAAS,kBAAkB;;;ACA3B,SAAS,qBAAqB;AAIvB,IAAM,aAAa,cAAgC,IAAI;;;ADIvD,SAAS,iBAAmC;AACjD,SAAO,WAAW,UAAU;AAC9B;;;AEHA,IAAM,qBAAqB;AAiBpB,SAAS,YAAY,SAAiB,QAA2B;AACtE,QAAM,aAAa,QAAQ,WAAW,GAAG;AAEzC,MAAI;AACJ,MAAI;AACF,UAAM,aAAa,IAAI,IAAI,SAAS,kBAAkB,IAAI,IAAI,IAAI,OAAO;AAAA,EAC3E,QAAQ;AAEN,WAAO;AAAA,EACT;AAGA,QAAM,iBAAqC,CAAC;AAC5C,MAAI,aAAa,QAAQ,CAAC,OAAO,QAAQ;AACvC,mBAAe,KAAK,CAAC,KAAK,KAAK,CAAC;AAAA,EAClC,CAAC;AAGD,aAAW,CAAC,GAAG,KAAK,gBAAgB;AAClC,QAAI,aAAa,OAAO,GAAG;AAAA,EAC7B;AAGA,aAAW,CAAC,KAAK,KAAK,KAAK,gBAAgB;AACzC,QAAI,CAAC,IAAI,WAAW,MAAM,GAAG;AAC3B,UAAI,aAAa,IAAI,KAAK,KAAK;AAAA,IACjC;AAAA,EACF;AAGA,MAAI,aAAa,IAAI,cAAc,OAAO,MAAM;AAChD,MAAI,aAAa,IAAI,cAAc,OAAO,MAAM;AAChD,MAAI,aAAa,IAAI,gBAAgB,OAAO,QAAQ;AACpD,MAAI,OAAO,SAAS,QAAW;AAC7B,QAAI,aAAa,IAAI,YAAY,OAAO,IAAI;AAAA,EAC9C;AACA,MAAI,OAAO,YAAY,QAAW;AAChC,QAAI,aAAa,IAAI,eAAe,OAAO,OAAO;AAAA,EACpD;AAEA,MAAI,YAAY;AAEd,WAAO,IAAI,KAAK,QAAQ,oBAAoB,EAAE;AAAA,EAChD;AAEA,SAAO,IAAI;AACb;;;AC1DA,IAAM,oBAAoB;AAAA,EACxB;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF;AAGA,IAAM,kBAAkB;AAAA,EACtB;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF;AAGA,IAAM,iBAAiB;AAAA,EACrB;AACF;AAGA,IAAM,sBAAsB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,IAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAeO,SAAS,YAAY,KAAgC;AAE1D,MAAI,gBAAgB,KAAK,OAAK,EAAE,KAAK,GAAG,CAAC,EAAG,QAAO;AAGnD,MAAI,eAAe,KAAK,OAAK,EAAE,KAAK,GAAG,CAAC,EAAG,QAAO;AAGlD,MAAI,gBAAgB,KAAK,OAAK,EAAE,KAAK,GAAG,CAAC,EAAG,QAAO;AAGnD,MAAI,oBAAoB,KAAK,OAAK,EAAE,KAAK,GAAG,CAAC,EAAG,QAAO;AAGvD,MAAI,kBAAkB,KAAK,OAAK,EAAE,KAAK,GAAG,CAAC,EAAG,QAAO;AAGrD,SAAO;AACT;;;AC7EA,IAAM,oBAAoB;AAE1B,IAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AACF;AAMO,IAAM,cAAc,CAAC,WAA4B;AACtD,MAAI,OAAO,WAAW,SAAS,KAAK,OAAO,WAAW,MAAM,EAAG,QAAO;AAGtE,QAAM,iBAAiB,YAAY,MAAM;AACzC,MAAI,mBAAmB,YAAY,mBAAmB,cAAc,mBAAmB,SAAS;AAC9F,WAAO;AAAA,EACT;AAEA,SAAO,gBAAgB,KAAK,aAAW,QAAQ,KAAK,MAAM,CAAC;AAC7D;AAMO,IAAM,qBAAqB,CAChC,MACA,QACA,mBAAmB,SACR;AACX,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,IAAI;AAGxB,QAAI,kBAAkB;AACpB,YAAM,SAAS,IAAI,aAAa,IAAI,YAAY,KAC3C,IAAI,aAAa,IAAI,YAAY,KACjC,IAAI,aAAa,IAAI,cAAc;AACxC,UAAI,OAAQ,QAAO;AAAA,IACrB;AAEA,WAAO,YAAY,MAAM,MAAM;AAAA,EACjC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAYO,IAAM,aAAa,CACxB,MACA,SACA,UACA,YAKW;AACX,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,IAAI;AACxB,UAAM,EAAE,iBAAiB,iBAAiB,kBAAkB,mBAAmB,KAAK,IAAI;AAExF,UAAM,OAAO;AAAA,MACX,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,cAAc,oBAAoB;AAAA,MAClC,aAAa;AAAA,IACf;AAEA,WAAO,QAAQ,IAAI,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAC7C,UAAI,OAAO;AACT,YAAI,oBAAoB,IAAI,aAAa,IAAI,GAAG,GAAG;AAEjD;AAAA,QACF;AACA,YAAI,aAAa,IAAI,KAAK,KAAK;AAAA,MACjC;AAAA,IACF,CAAC;AAED,WAAO,IAAI,SAAS;AAAA,EACtB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ALkEM,gBAAAH,YAAA;AAtIC,IAAM,eAAeF;AAAA,EAC1B,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB,sBAAsB;AAAA,IACtB,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AAEH,UAAM,gBAAgB,eAAe;AACrC,UAAM,oBAAoB,aAAa;AAGvC,QAAI,WAAW;AACf,QAAI;AACF,YAAM,MAAM,IAAI,IAAI,IAAI;AACxB,iBAAW,IAAI;AAAA,IACjB,QAAQ;AAAA,IAER;AAIA,UAAM,CAAC,WAAW,YAAY,IAAII,UAAS,IAAI;AAE/C,IAAAC,WAAU,MAAM;AACd,UAAI,aAAa;AACjB,UAAI,gBAAgB;AAEpB,UAAI;AACF,cAAM,MAAM,IAAI,IAAI,IAAI;AACxB,cAAM,cAAc,OAAO,SAAS;AACpC,qBAAa,IAAI,aAAa;AAE9B,YAAI,cAAc,YAAY,SAAS,eAAe,KAAK,IAAI,SAAS,SAAS,eAAe,GAAG;AACjG,cAAI,kBAAkB,iBAAiB;AACrC,4BAAgB;AAAA,UAClB;AAAA,QACF;AAAA,MACF,QAAQ;AACN,qBAAa;AAAA,MACf;AAEA,YAAM,WAAW,YAAY,IAAI,KAAK;AAEtC,UAAI,cAAc,CAAC,UAAU;AAC3B,YAAI,mBAAmB;AAErB,uBAAa,mBAAmB,MAAM,mBAAmB,mBAAmB,CAAC;AAAA,QAC/E,OAAO;AAEL,gBAAM,WAAW,OAAO,SAAS,SAAS,QAAQ,YAAY,EAAE,KAAK;AACrE,uBAAa,WAAW,MAAM,SAAS,UAAU;AAAA,YAC/C,gBAAgB;AAAA,YAChB;AAAA,YACA,kBAAkB;AAAA,UACpB,CAAC,CAAC;AAAA,QACJ;AAAA,MACF,OAAO;AACL,qBAAa,IAAI;AAAA,MACnB;AAAA,IACF,GAAG,CAAC,MAAM,SAAS,gBAAgB,kBAAkB,qBAAqB,iBAAiB,iBAAiB,CAAC;AAE7G,UAAM,cAAc,CAAC,MAAqC;AACxD,UAAI,OAAO,WAAW,eAAe,iBAAiB;AACpD,kBAAU,CAAC;AACX;AAAA,MACF;AAEA,UAAI,gBAAgB;AACpB,UAAI,sBAAsB;AAC1B,UAAI,cAAc;AAElB,UAAI;AACF,cAAM,MAAM,IAAI,IAAI,IAAI;AACxB,cAAM,cAAc,OAAO,SAAS;AACpC,wBAAgB,IAAI,aAAa;AAEjC,YAAI,iBAAiB,YAAY,SAAS,eAAe,KAAK,IAAI,SAAS,SAAS,eAAe,GAAG;AACpG,gCAAsB;AACtB,cAAI,gBAAgB,iBAAiB;AACnC,0BAAc;AAAA,UAChB;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAAqB;AAE7B,UAAI,eAAe;AACjB,cAAM,SAAmC;AAAA,UACvC,oBAAoB;AAAA,UACpB,iBAAiB;AAAA,UACjB,iBAAiB;AAAA,UACjB,WAAW,OAAO,SAAS;AAAA,UAC3B,oBAAoB;AAAA,UACpB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,UAClC,oBAAoB;AAAA,QACtB;AAEA,cAAM,QAAQ,IAAI,YAAY,kBAAkB,EAAE,OAAO,CAAC;AAC1D,eAAO,cAAc,KAAK;AAAA,MAC5B;AAEA,gBAAU,CAAC;AAAA,IACb;AAGA,UAAM,WAAW,CAAC;AAGlB,QAAI,mBAAmB;AACvB,QAAI;AACF,YAAM,MAAM,IAAI,IAAI,IAAI;AACxB,UAAI,OAAO,WAAW,aAAa;AACjC,cAAM,cAAc,OAAO,SAAS;AACpC,YAAI,IAAI,aAAa,eAAe,YAAY,SAAS,eAAe,KAAK,IAAI,SAAS,SAAS,eAAe,GAAG;AACnH,6BAAmB;AAAA,QACrB;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAAc;AAEtB,QAAI,iBAAkB,UAAS,KAAK,YAAY,YAAY;AAC5D,QAAI,mBAAmB,WAAY,UAAS,KAAK,UAAU;AAC3D,UAAM,MAAM,SAAS,SAAS,IAAI,SAAS,KAAK,GAAG,IAAI;AAEvD;AAAA;AAAA,MAEE,gBAAAH;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,MAAM;AAAA,UACN,QAAQ,mBAAmB,WAAW;AAAA,UACtC;AAAA,UACA,SAAS;AAAA,UACR,GAAG;AAAA,UAEH;AAAA;AAAA,MACH;AAAA;AAAA,EAEJ;AACF;AAEA,aAAa,cAAc;;;AHlKvB,SA4GI,UA5GJ,OAAAA,MAoHY,QAAAC,aApHZ;AAFJ,IAAM,WAAW,MACf,gBAAAD,KAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,gBAAe,OAAM,8BAA6B,eAAY,QACjH,0BAAAA,KAAC,UAAK,GAAE,iBAAgB,GAC1B;AAoEK,IAAM,kBAAkBF;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;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,YAAYC;AAAA,MAChB;AAAA,MACA,mBAAmB,OAAO;AAAA,MAC1B,kBAAkB,QAAQ;AAAA,MAC1B;AAAA,IACF;AAEA,UAAM,YAAY,kBAAkB,OAChC,EAAE,gBAAgB,GAAG,cAAc,KAAK,IACxC;AAGJ,QAAI,YAAY,eAAe;AAC7B,YAAM,QACJ,gBAAAC,KAAA,YACE,0BAAAC,MAAC,SAAI,WAAU,8BACZ;AAAA,sBAAc,QACb,gBAAAD,KAAC,cAAW,OAAO,YAAY,MAAK,MAAK;AAAA,QAE3C,gBAAAC,MAAC,SAAI,WAAU,wBACb;AAAA,0BAAAD,KAAC,UAAK,WAAU,wBAAwB,iBAAO,MAAK;AAAA,WAClD,OAAO,QAAQ,OAAO,YACtB,gBAAAC,MAAC,UAAK,WAAU,wBACb;AAAA,mBAAO;AAAA,YAAM,OAAO,QAAQ,OAAO,WAAW;AAAA,YAAO,OAAO;AAAA,aAC/D;AAAA,WAEJ;AAAA,QACC,YACC,gBAAAD,KAAC,iBAAc,UAAoB,SAAQ,cAAa,MAAK,MAAK;AAAA,SAEtE,GACF;AAGF,UAAI,MAAM;AACR,eACE,gBAAAA,KAAC,gBAAa,KAA0C,MAAY,SAAQ,qBAAoB,WAAW,WAAW,OAAO,WAAW,cAAc,OAAQ,GAAI,OAC/J,iBACH;AAAA,MAEJ;AACA,aACE,gBAAAA,KAAC,SAAI,KAAuC,WAAW,WAAW,OAAO,WAAY,GAAG,OACrF,iBACH;AAAA,IAEJ;AAGA,QAAI,YAAY,cAAc;AAC5B,YAAMI,cAAa,WAAW;AAC9B,YAAM,QACJ,gBAAAH,MAAA,YACG;AAAA,iBACC,gBAAAD,KAAC,SAAI,WAAU,yBACb,0BAAAA,KAAC,SAAI,KAAK,MAAM,KAAK,KAAK,MAAM,OAAO,GAAG,OAAO,OAAO,eAAe,GACzE;AAAA,QAEF,gBAAAC,MAAC,SAAI,WAAU,2BAEb;AAAA,0BAAAA,MAAC,SAAI,WAAU,6BACZ;AAAA,oBAAQ,gBAAAD,KAAC,SAAI,WAAU,2BAA2B,gBAAK;AAAA,YACxD,gBAAAC,MAAC,SAAI,WAAU,8BACb;AAAA,8BAAAD,KAAC,UAAK,WAAU,wBAAwB,iBAAO,WAAW,OAAO,MAAK;AAAA,cACrE,YACC,gBAAAA,KAAC,UAAK,WAAU,+BAA+B,oBAAS;AAAA,eAE5D;AAAA,aACF;AAAA,UAGC,YACC,gBAAAA,KAAC,QAAG,WAAU,+BAA+B,oBAAS;AAAA,UAIvD,WAAW,QAAQ,SAAS,KAC3B,gBAAAA,KAAC,SAAI,WAAU,8BACZ,kBAAQ,IAAI,CAAC,GAAG,MACf,gBAAAC,MAAC,SAAY,WAAU,6BACrB;AAAA,4BAAAA,MAAC,UAAK,WAAU,mCACb;AAAA,gBAAE;AAAA,cAAQ,EAAE;AAAA,cAAO,EAAE;AAAA,eACxB;AAAA,YACA,gBAAAD,KAAC,UAAK,WAAU,mCAAmC,YAAE,OAAM;AAAA,eAJnD,CAKV,CACD,GACH;AAAA,UAID,WACC,gBAAAC,MAAC,gBAAW,WAAU,wDAAuD;AAAA;AAAA,YACnE;AAAA,YAAQ;AAAA,aAClB;AAAA,UAID,QAAQ,gBAAAD,KAAC,SAAI,WAAU,uBAAuB,UAAAI,aAAW;AAAA,WAC5D;AAAA,SACF;AAGF,UAAI,MAAM;AACR,eACE,gBAAAJ,KAAC,gBAAa,KAA0C,MAAY,SAAQ,qBAAoB,WAAW,WAAW,OAAO,WAAW,cAAc,OAAQ,GAAI,OAC/J,iBACH;AAAA,MAEJ;AACA,aACE,gBAAAA,KAAC,SAAI,KAAuC,WAAW,WAAW,OAAO,WAAY,GAAG,OACrF,iBACH;AAAA,IAEJ;AAGA,QAAI,YAAY,SAAS;AACvB,YAAMI,cAAa,WAAW;AAC9B,YAAM,QACJ,gBAAAH,MAAA,YACE;AAAA,wBAAAA,MAAC,SAAI,WAAU,yBACZ;AAAA,kBACC,gBAAAD,KAAC,SAAI,KAAK,MAAM,KAAK,KAAK,MAAM,OAAO,GAAG,OAAO,IAAI,UAAU,IAE/D,gBAAAA,KAAC,SAAI,WAAU,qCAAoC;AAAA,UAErD,gBAAAA,KAAC,SAAI,WAAU,wBACb,0BAAAA,KAAC,SAAI,WAAU,6BACb,0BAAAA,KAAC,YAAS,GACZ,GACF;AAAA,UACC,UAAU,OAAO,SAAS,KACzB,gBAAAA,KAAC,SAAI,WAAU,0BACZ,iBAAO,IAAI,CAAC,OAAO,QAClB,gBAAAA,KAAC,UAAe,WAAU,yBAAyB,mBAAxC,GAA8C,CAC1D,GACH;AAAA,WAEJ;AAAA,QACA,gBAAAC,MAAC,SAAI,WAAU,2BACb;AAAA,0BAAAA,MAAC,SAAI,WAAU,0BACZ;AAAA,mBAAO,UACN,gBAAAD,KAAC,SAAI,WAAU,0BACb,0BAAAA,KAAC,SAAI,KAAK,OAAO,QAAQ,KAAK,OAAO,MAAM,GAC7C;AAAA,YAEF,gBAAAC,MAAC,SAAI,WAAU,wBACb;AAAA,8BAAAD,KAAC,UAAK,WAAU,wBAAwB,iBAAO,MAAK;AAAA,eAClD,OAAO,QAAQ,OAAO,YACtB,gBAAAC,MAAC,UAAK,WAAU,wBACb;AAAA,uBAAO;AAAA,gBAAM,OAAO,QAAQ,OAAO,WAAW;AAAA,gBAAO,OAAO;AAAA,iBAC/D;AAAA,eAEJ;AAAA,YACC,YACC,gBAAAD,KAAC,iBAAc,UAAoB,SAAQ,aAAY,MAAK,MAAK;AAAA,aAErE;AAAA,UACC,WACC,gBAAAA,KAAC,gBAAW,WAAU,yBAAyB,mBAAQ;AAAA,UAExD,QAAQ,gBAAAA,KAAC,SAAI,WAAU,uBAAuB,UAAAI,aAAW;AAAA,WAC5D;AAAA,SACF;AAGF,UAAI,MAAM;AACR,eACE,gBAAAJ,KAAC,gBAAa,KAA0C,MAAY,SAAQ,qBAAoB,WAAW,WAAW,OAAO,WAAW,cAAc,OAAQ,GAAI,OAC/J,iBACH;AAAA,MAEJ;AACA,aACE,gBAAAA,KAAC,SAAI,KAAuC,WAAW,WAAW,OAAO,WAAY,GAAG,OACrF,iBACH;AAAA,IAEJ;AAGA,QAAI,YAAY,UAAU;AACxB,YAAM,QACJ,gBAAAA,KAAA,YACE,0BAAAC,MAAC,SAAI,WAAU,2BACX;AAAA,qBAAY,eACZ,gBAAAD,KAAC,SAAI,WAAU,0BACZ,qBAAW,gBAAAA,KAAC,iBAAc,UAAoB,SAAQ,aAAY,MAAK,MAAK,IAAK,YACpF;AAAA,QAED,WACC,gBAAAA,KAAC,gBAAW,WAAU,sDACnB,mBACH;AAAA,QAEF,gBAAAC,MAAC,SAAI,WAAU,0BACZ;AAAA,iBAAO,UACN,gBAAAD,KAAC,SAAI,WAAU,0BACb,0BAAAA,KAAC,SAAI,KAAK,OAAO,QAAQ,KAAK,OAAO,MAAM,GAC7C;AAAA,UAEF,gBAAAC,MAAC,SAAI,WAAU,wBACb;AAAA,4BAAAD,KAAC,UAAK,WAAU,wBAAwB,iBAAO,MAAK;AAAA,aAClD,OAAO,QAAQ,OAAO,YACtB,gBAAAC,MAAC,UAAK,WAAU,wBACb;AAAA,qBAAO;AAAA,cAAM,OAAO,QAAQ,OAAO,WAAW;AAAA,cAAO,OAAO;AAAA,eAC/D;AAAA,YAED,QAAQ,gBAAAD,KAAC,UAAK,WAAU,wBAAwB,gBAAK;AAAA,aACxD;AAAA,WACF;AAAA,QACC,cAAc,QACb,gBAAAA,KAAC,cAAW,OAAO,YAAY,MAAK,MAAK;AAAA,QAE1C;AAAA,SACH,GACF;AAGF,UAAI,MAAM;AACR,eACE,gBAAAA,KAAC,gBAAa,KAA0C,MAAY,SAAQ,qBAAoB,WAAW,WAAW,OAAO,WAAW,cAAc,OAAQ,GAAI,OAC/J,iBACH;AAAA,MAEJ;AACA,aACE,gBAAAA,KAAC,SAAI,KAAuC,WAAW,WAAW,OAAO,WAAY,GAAG,OACrF,iBACH;AAAA,IAEJ;AAGA,UAAM,YAAY,UAAU,OAAO,SAAS,KAC1C,gBAAAA,KAAC,SAAI,WAAU,0BACZ,iBAAO,IAAI,CAAC,OAAO,QAClB,gBAAAA,KAAC,UAAe,WAAU,yBAAyB,mBAAxC,GAA8C,CAC1D,GACH;AAGF,UAAM,aAAa,WAAW;AAE9B,UAAM,cACJ,gBAAAC,MAAC,SAAI,WAAU,2BAEb;AAAA,sBAAAD,KAAC,SAAI,WAAU,8BAA6B,eAAY,QAAO,oBAAO;AAAA,OAEpE,YAAY,eACZ,gBAAAA,KAAC,SAAI,WAAU,0BACZ,qBAAW,gBAAAA,KAAC,iBAAc,UAAoB,SAAQ,aAAY,MAAK,MAAK,IAAK,YACpF;AAAA,MAGD;AAAA,MAEA,WACC,gBAAAA,KAAC,gBAAW,WAAU,yBACnB,mBACH;AAAA,MAGD,cAAc,QACb,gBAAAA,KAAC,cAAW,OAAO,YAAY,MAAK,MAAK;AAAA,MAG3C,gBAAAC,MAAC,SAAI,WAAU,0BACZ;AAAA,eAAO,UACN,gBAAAD,KAAC,SAAI,WAAU,0BACb,0BAAAA,KAAC,SAAI,KAAK,OAAO,QAAQ,KAAK,OAAO,MAAM,GAC7C;AAAA,QAEF,gBAAAC,MAAC,SAAI,WAAU,wBACb;AAAA,0BAAAA,MAAC,UAAK,WAAU,wBACb;AAAA,mBAAO;AAAA,YACP,OAAO,UACN,gBAAAA,MAAC,UAAK,WAAU,0BAAyB;AAAA;AAAA,cAAE,OAAO;AAAA,eAAO;AAAA,aAE7D;AAAA,WACE,OAAO,QAAQ,OAAO,YACtB,gBAAAA,MAAC,UAAK,WAAU,wBACb;AAAA,mBAAO;AAAA,YAAM,OAAO,QAAQ,OAAO,WAAW;AAAA,YAAO,OAAO;AAAA,aAC/D;AAAA,UAED,QAAQ,gBAAAD,KAAC,UAAK,WAAU,wBAAwB,gBAAK;AAAA,WACxD;AAAA,SACF;AAAA,MAEC;AAAA,MAEA,QAAQ,gBAAAA,KAAC,SAAI,WAAU,uBAAuB,sBAAW;AAAA,OAC5D;AAGF,QAAI,MAAM;AACR,aACE,gBAAAA,KAAC,gBAAa,KAA0C,MAAY,SAAQ,qBAAoB,WAAW,WAAW,OAAO,WAAW,cAAc,OAAQ,GAAI,OAC/J,uBACH;AAAA,IAEJ;AAEA,WACE,gBAAAA,KAAC,SAAI,KAAuC,WAAW,WAAW,OAAO,WAAY,GAAG,OACrF,uBACH;AAAA,EAEJ;AACF;AAEA,gBAAgB,cAAc;;;AS1a9B,OAAOK,UAAS,cAAAP,mBAAkB;AAClC,OAAOC,WAAU;;;ACDjB,SAAgB,cAAAD,mBAAkC;AAClD,OAAOC,WAAU;;;ACDjB,SAAsC,cAAAD,mBAAkB;AACxD,OAAOC,WAAU;;;ACDV,IAAM,UAAU;AAAA,EACrB,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;;;ACHA,IAAM,kBAA0C;AAAA,EAC9C,IAAK;AAAA,EACL,IAAK;AAAA,EACL,IAAK;AAAA,EACL,IAAK;AAAA,EACL,IAAK;AAAA,EACL,OAAO;AACT;AAEO,SAAS,eAAe,OAAqD;AAClF,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,OAAO,UAAU,YAAY,QAAQ,KAA6B,GAAG;AACvE,WAAO,QAAQ,KAA6B;AAAA,EAC9C;AACA,MAAI,OAAO,UAAU,YAAY,SAAS,iBAAiB;AACzD,WAAO,gBAAgB,KAAK;AAAA,EAC9B;AACA,SAAO,OAAO,KAAK;AACrB;AAoBO,SAAS,qBAAqB,OAAoC;AACvE,QAAM,SAAwB,CAAC;AAE/B,MAAI,MAAM,MAAM,OAAW,QAAO,SAAS,eAAe,MAAM,CAAC;AACjE,MAAI,MAAM,OAAO,OAAW,QAAO,YAAY,eAAe,MAAM,EAAE;AACtE,MAAI,MAAM,OAAO,OAAW,QAAO,eAAe,eAAe,MAAM,EAAE;AACzE,MAAI,MAAM,OAAO,OAAW,QAAO,aAAa,eAAe,MAAM,EAAE;AACvE,MAAI,MAAM,OAAO,OAAW,QAAO,cAAc,eAAe,MAAM,EAAE;AACxE,MAAI,MAAM,OAAO,QAAW;AAC1B,WAAO,aAAa,eAAe,MAAM,EAAE;AAC3C,WAAO,cAAc,eAAe,MAAM,EAAE;AAAA,EAC9C;AACA,MAAI,MAAM,OAAO,QAAW;AAC1B,WAAO,YAAY,eAAe,MAAM,EAAE;AAC1C,WAAO,eAAe,eAAe,MAAM,EAAE;AAAA,EAC/C;AAEA,MAAI,MAAM,MAAM,OAAW,QAAO,UAAU,eAAe,MAAM,CAAC;AAClE,MAAI,MAAM,OAAO,OAAW,QAAO,aAAa,eAAe,MAAM,EAAE;AACvE,MAAI,MAAM,OAAO,OAAW,QAAO,gBAAgB,eAAe,MAAM,EAAE;AAC1E,MAAI,MAAM,OAAO,OAAW,QAAO,cAAc,eAAe,MAAM,EAAE;AACxE,MAAI,MAAM,OAAO,OAAW,QAAO,eAAe,eAAe,MAAM,EAAE;AACzE,MAAI,MAAM,OAAO,QAAW;AAC1B,WAAO,cAAc,eAAe,MAAM,EAAE;AAC5C,WAAO,eAAe,eAAe,MAAM,EAAE;AAAA,EAC/C;AACA,MAAI,MAAM,OAAO,QAAW;AAC1B,WAAO,aAAa,eAAe,MAAM,EAAE;AAC3C,WAAO,gBAAgB,eAAe,MAAM,EAAE;AAAA,EAChD;AAEA,MAAI,MAAM,QAAQ,OAAW,QAAO,MAAM,eAAe,MAAM,GAAG;AAElE,SAAO;AACT;;;AF/DM,gBAAAC,YAAA;AATC,IAAM,MAAMF;AAAA,EACjB,CAAC,EAAE,IAAI,YAAY,OAAO,WAAW,OAAO,UAAU,GAAG,MAAM,GAAG,QAAQ;AACxE,UAAM,gBAAgB,qBAAqB,KAAK;AAIhD,UAAM,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,GAAG,SAAS,IAAI;AAEnF,WACE,gBAAAE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAWD,MAAK,UAAU,SAAS;AAAA,QACnC,OAAO,EAAE,GAAG,eAAe,GAAG,MAAM;AAAA,QACnC,GAAG;AAAA,QAEH;AAAA;AAAA,IACH;AAAA,EAEJ;AACF;AAEA,IAAI,cAAc;;;AG9BlB,SAAS,cAAAD,mBAAkB;AAC3B,OAAOC,WAAU;AA0CX,gBAAAC,YAAA;AAhCC,IAAM,qBAAoD;AAAA,EAC/D,IAAI;AAAA;AAAA,EACJ,IAAI;AAAA;AAAA,EACJ,IAAI;AAAA;AAAA,EACJ,IAAI;AAAA;AAAA,EACJ,MAAM;AACR;AAcO,IAAM,YAAYF;AAAA,EACvB,CAAC,EAAE,MAAM,OAAO,UAAU,WAAW,OAAO,GAAG,MAAM,GAAG,QAAQ;AAC9D,QAAI;AACJ,QAAI,OAAO;AACT,yBAAmB;AAAA,IACrB,WAAW,MAAM;AACf,yBAAmB,mBAAmB,IAAI;AAAA,IAC5C,OAAO;AACL,yBAAmB,YAAY;AAAA,IACjC;AAEA,WACE,gBAAAE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAWD,MAAK,gBAAgB,SAAS;AAAA,QACzC,OAAO;AAAA,UACL,UAAU;AAAA,UACV,GAAG;AAAA,QACL;AAAA,QACC,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AAEA,UAAU,cAAc;;;AJnClB,SAKc,OAAAC,MALd,QAAAC,aAAA;AALC,IAAM,gBAAgBH;AAAA,EAC3B,CAAC,EAAE,OAAO,UAAU,SAAS,QAAQ,UAAU,WAAW,GAAG,MAAM,GAAG,QAAQ;AAC5E,QAAI,CAAC,SAAS,CAAC,YAAY,CAAC,QAAS,QAAO;AAE5C,WACE,gBAAAG;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAWF,MAAK,qBAAqB,sBAAsB,KAAK,IAAI,SAAS;AAAA,QAC5E,GAAG;AAAA,QAEH;AAAA,qBAAW,gBAAAC,KAAC,UAAK,WAAU,8BAA8B,mBAAQ;AAAA,UACjE,SAAS,gBAAAA,KAAC,QAAG,WAAU,4BAA4B,iBAAM;AAAA,UACzD,YAAY,gBAAAA,KAAC,OAAE,WAAU,+BAA+B,oBAAS;AAAA;AAAA;AAAA,IACpE;AAAA,EAEJ;AACF;AACA,cAAc,cAAc;AAarB,IAAM,eAAeF;AAAA,EAC1B,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb,UAAU;AAAA,IACV;AAAA,IACA,iBAAiB;AAAA,IACjB,GAAG;AAAA,EACL,GACA,QACG;AACH,WACE,gBAAAE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAWD;AAAA,UACT;AAAA,UACA,kBAAkB,UAAU;AAAA,UAC5B,uBAAuB,OAAO;AAAA,UAC9B;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEJ,0BAAAC;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,kBAAkB,UAAU,SAAU;AAAA,YAC5C,OAAO,kBAAkB,kBAAkB;AAAA,YAE1C;AAAA;AAAA,QACH;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AACA,aAAa,cAAc;;;ADrBjB,gBAAAA,YAAA;AAxBH,IAAM,kBAAkBF;AAAA,EAC7B,CAAC,EAAE,UAAU,GAAG,UAAU,OAAO,YAAY,OAAO,WAAW,UAAU,GAAG,MAAM,GAAG,QAAQ;AAG3F,UAAM,mBAAmB,YACrBO,OAAM,SAAS,IAAI,UAAU,CAAC,OAAO,UAAU;AAC7C,UAAI,CAACA,OAAM,eAAe,KAAK,EAAG,QAAO;AACzC,YAAM,QAAQ,KAAK,IAAI,QAAQ,IAAI,GAAG;AACtC,YAAM,aAAa,MAAM;AACzB,aAAOA,OAAM,aAAa,OAAkF;AAAA,QAC1G,OAAO,EAAE,GAAG,WAAW,OAAO,gBAAgB,GAAG,KAAK,KAAK;AAAA,QAC3D,WAAWN,MAAK,WAAW,WAAW,0BAA0B;AAAA,MAClE,CAAC;AAAA,IACH,CAAC,IACD;AAEJ,WACE,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,SAAQ;AAAA,QACR,WAAWD,MAAK,mBAAmB,SAAS;AAAA,QAC3C,GAAG;AAAA,QAEH,oBACC,gBAAAC,KAAC,SAAI,WAAU,qBAAqB,4BAAiB,IAErD,gBAAAA,KAAC,SAAI,WAAWD,MAAK,kBAAkB,mBAAmB,OAAO,MAAM,GACpE,4BACH;AAAA;AAAA,IAEJ;AAAA,EAEJ;AACF;AAEA,gBAAgB,cAAc;;;AMtE9B,SAAS,cAAAD,mBAAiC;AAC1C,OAAOC,WAAU;AAyBb,SAYA,YAAAO,WAZA,OAAAN,MAYA,QAAAC,aAZA;AAJJ,IAAM,iBAAiB,CAAC,EAAE,MAAM,UAAU,MAA8C;AACtF,QAAM,UAAU,KAAK,OACnB,KAAK,OAEL,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,KAAK,KAAK;AAAA,MACV,KAAK,KAAK;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAQ;AAAA,MACR,UAAS;AAAA,MACT,OAAO,EAAE,WAAW,WAAW,OAAO,QAAQ,QAAQ,OAAO;AAAA;AAAA,EAC/D;AAGF,QAAM,eACJ,gBAAAC,MAAAK,WAAA,EACG;AAAA;AAAA,IACA,KAAK,SAAS,gBAAAN,KAAC,UAAK,WAAU,0BAA0B,eAAK,OAAM;AAAA,KACtE;AAGF,MAAI,KAAK,MAAM;AACb,UAAM,aAAa,KAAK,KAAK,WAAW,GAAG;AAE3C,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,KAAK;AAAA,QACX,SAAQ;AAAA,QACR,WAAWD,MAAK,yBAAyB,SAAS;AAAA,QAClD,OAAO,KAAK;AAAA,QACZ,cAAc,CAAC;AAAA,QAEd;AAAA;AAAA,IACH;AAAA,EAEJ;AAEA,SACE,gBAAAC,KAAC,SAAI,WAAWD,MAAK,yBAAyB,SAAS,GAAG,OAAO,KAAK,KACnE,wBACH;AAEJ;AAEO,IAAM,mBAAmBD;AAAA,EAC9B,CAAC,EAAE,OAAO,OAAO,UAAU,QAAQ,QAAQ,IAAI,WAAW,GAAG,MAAM,GAAG,QAAQ;AAC5E,WACE,gBAAAG;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,SAAQ;AAAA,QACR,WAAWF,MAAK,mBAAmB,SAAS;AAAA,QAC3C,GAAG;AAAA,QAEH;AAAA,mBACC,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO,EAAE,WAAW,UAAU,cAAc,iBAAiB;AAAA,cAE5D;AAAA;AAAA,UACH;AAAA,UAGD,YAAY,YACX,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO,EAAE,sBAAsB,GAAG,KAAK,IAAI;AAAA,cAE3C;AAAA,gCAAAD,KAAC,SAAI,WAAU,0BACZ,gBAAM,IAAI,CAAC,SACV,gBAAAA,KAAC,kBAAuC,QAAnB,QAAQ,KAAK,EAAE,EAAgB,CACrD,GACH;AAAA,gBACA,gBAAAA,KAAC,SAAI,WAAU,0BAAyB,eAAY,QACjD,gBAAM,IAAI,CAAC,SACV,gBAAAA,KAAC,kBAAuC,QAAnB,QAAQ,KAAK,EAAE,EAAgB,CACrD,GACH;AAAA;AAAA;AAAA,UACF,IAEA,gBAAAA,KAAC,SAAI,WAAU,wCAAuC,OAAO,EAAE,YAAY,SAAS,GACjF,gBAAM,IAAI,CAAC,SACV,gBAAAA,KAAC,kBAA6B,QAAT,KAAK,EAAgB,CAC3C,GACH;AAAA;AAAA;AAAA,IAEJ;AAAA,EAEJ;AACF;AAEA,iBAAiB,cAAc;;;ACjH/B,SAAS,cAAAF,oBAAkB;AAC3B,OAAOC,WAAU;AAiBf,SAmEc,YAAAO,WAlEZ,OAAAN,OADF,QAAAC,aAAA;AADF,IAAM,gBAAgB,MACpB,gBAAAA,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,OAAM,8BAA6B,eAAY,QACzG;AAAA,kBAAAD,MAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,MAAK,SAAQ,aAAY,OAAM;AAAA,EAC9D,gBAAAA,MAAC,UAAK,GAAE,uCAAsC,MAAK,SAAQ;AAAA,GAC7D;AAwBK,IAAM,sBAAsBF;AAAA,EACjC,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,YAAY,SAAS;AAC3B,UAAM,uBAAuB,oBAAoB,cAAc,aAAa;AAE5E,WACE,gBAAAE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,SAAQ;AAAA,QACR,WAAWD,MAAK,8BAA8B,SAAS;AAAA,QACtD,GAAG;AAAA,QAEJ,0BAAAE;AAAA,UAAC;AAAA;AAAA,YACC,WAAWF;AAAA,cACT;AAAA,cACA,uBAAuB,oBAAoB;AAAA,cAC3C,uBAAuB,eAAe;AAAA,YACxC;AAAA,YAGC;AAAA,2BAAa,oBAAoB,eAChC,gBAAAC,MAAC,SAAI,WAAU,6BACZ,kBACC,QAEA,gBAAAC,MAAAK,WAAA,EACE;AAAA,gCAAAN;AAAA,kBAAC;AAAA;AAAA,oBACC,KAAK,YAAY;AAAA,oBACjB,KAAK,iBAAiB,OAAO,IAAI;AAAA,oBACjC,OAAO,EAAE,OAAO,QAAQ,QAAQ,QAAQ,WAAW,QAAQ;AAAA;AAAA,gBAC7D;AAAA,gBACA,gBAAAA,MAAC,SAAI,WAAU,wBACb,0BAAAA,MAAC,iBAAc,GACjB;AAAA,iBACF,GAEJ;AAAA,cAIF,gBAAAC,MAAC,SAAI,WAAU,+BACZ;AAAA,wBACC,gBAAAD,MAAC,SAAI,WAAU,4BAA4B,gBAAK;AAAA,gBAGlD,gBAAAC,MAAC,gBAAW,WAAU,6BAA4B;AAAA;AAAA,kBAAQ;AAAA,kBAAM;AAAA,mBAAO;AAAA,gBAEvE,gBAAAA,MAAC,SAAI,WAAU,oCACZ;AAAA,yBAAO,UACN,gBAAAD,MAAC,SAAI,WAAU,0BACb,0BAAAA,MAAC,SAAI,KAAK,OAAO,QAAQ,KAAK,OAAO,MAAM,GAC7C;AAAA,kBAEF,gBAAAC,MAAC,SAAI,WAAU,wBACb;AAAA,oCAAAD,MAAC,UAAK,WAAU,wBAAwB,iBAAO,MAAK;AAAA,oBACpD,gBAAAC,MAAC,UAAK,WAAU,wBACb;AAAA,6BAAO;AAAA,sBAAM,OAAO,QAAQ,OAAO,WAAW;AAAA,sBAAM,OAAO;AAAA,uBAC9D;AAAA,qBACF;AAAA,mBACF;AAAA,iBAGE,cAAc,QAAQ,aACtB,gBAAAA,MAAC,SAAI,WAAU,6BACZ;AAAA,gCAAc,QAAQ,gBAAAD,MAAC,cAAW,OAAO,YAAY,MAAK,MAAK,WAAS,MAAC;AAAA,kBACzE,YAAY,gBAAAA,MAAC,iBAAc,UAAoB,SAAQ,cAAa,MAAK,MAAK;AAAA,mBACjF;AAAA,iBAEJ;AAAA;AAAA;AAAA,QACF;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAEA,oBAAoB,cAAc;;;ACvIlC,SAAS,cAAAF,oBAAkB;AAC3B,OAAOC,YAAU;AACjB,SAAS,cAAc;;;ACKhB,IAAM,WAAW;AAAA,EACtB,OAAO;AAAA;AAAA,EACP,OAAO;AAAA;AAAA,EACP,QAAQ;AAAA;AAAA,EACR,MAAM;AAAA;AACR;AAKO,IAAM,SAAS;AAAA,EACpB,UAAU,CAAC,MAAM,GAAG,KAAK,CAAC;AAAA;AAAA,EAC1B,UAAU,CAAC,MAAM,MAAM,MAAM,CAAC;AAAA;AAAA,EAC9B,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;AAAA;AAAA,EACrB,QAAQ,CAAC,GAAG,GAAG,GAAG,CAAC;AACrB;AAKO,IAAM,aAAa;AAAA,EACxB,UAAU;AAAA,IACR,UAAU,SAAS;AAAA,IACnB,MAAM,OAAO;AAAA,EACf;AAAA,EACA,UAAU;AAAA,IACR,UAAU,SAAS;AAAA,IACnB,MAAM,OAAO;AAAA,EACf;AAAA,EACA,OAAO;AAAA,IACL,UAAU,SAAS;AAAA,IACnB,MAAM,OAAO;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AACF;AAKO,IAAM,WAAW;AAAA,EACtB,QAAQ;AAAA,IACN,QAAQ,EAAE,SAAS,EAAE;AAAA,IACrB,SAAS,EAAE,SAAS,GAAG,YAAY,EAAE,UAAU,SAAS,QAAQ,MAAM,OAAO,SAAS,EAAE;AAAA,EAC1F;AAAA,EACA,QAAQ;AAAA,IACN,QAAQ,EAAE,SAAS,GAAG,GAAG,GAAG;AAAA,IAC5B,SAAS,EAAE,SAAS,GAAG,GAAG,GAAG,YAAY,EAAE,UAAU,SAAS,QAAQ,MAAM,OAAO,SAAS,EAAE;AAAA,EAChG;AAAA,EACA,SAAS;AAAA,IACP,QAAQ,EAAE,SAAS,GAAG,OAAO,KAAK;AAAA,IAClC,SAAS;AAAA,MACP,SAAS;AAAA,MACT,OAAO;AAAA,MACP,YAAY,EAAE,UAAU,SAAS,OAAO,MAAM,OAAO,SAAS;AAAA,IAChE;AAAA,EACF;AAAA,EACA,kBAAkB;AAAA,IAChB,QAAQ,EAAE,SAAS,EAAE;AAAA,IACrB,SAAS;AAAA,MACP,SAAS;AAAA,MACT,YAAY;AAAA,QACV,iBAAiB;AAAA,QACjB,eAAe;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,QAAQ,EAAE,OAAO,EAAE;AAAA,IACnB,SAAS;AAAA,MACP,OAAO,CAAC,GAAG,MAAM,CAAC;AAAA,MAClB,YAAY,EAAE,UAAU,KAAK,QAAQ,UAAU,MAAM,YAAY;AAAA,IACnE;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,QAAQ,EAAE,OAAO,EAAE;AAAA,IACnB,SAAS;AAAA,MACP,OAAO,CAAC,GAAG,MAAM,MAAM,CAAC;AAAA,MACxB,YAAY,EAAE,UAAU,KAAK,MAAM,UAAU;AAAA,IAC/C;AAAA,EACF;AACF;;;AD7EM,gBAAAC,OAOE,QAAAC,aAPF;AAHC,IAAM,sBAAsBH;AAAA,EACjC,CAAC,EAAE,UAAU,WAAW,GAAG,MAAM,GAAG,QAAQ;AAC1C,WACE,gBAAAE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,SAAQ;AAAA,QACR,gBAAc;AAAA,QACd,WAAWD,OAAK,sBAAsB,SAAS;AAAA,QAC9C,GAAG;AAAA,QAEJ,0BAAAE;AAAA,UAAC,OAAO;AAAA,UAAP;AAAA,YACC,WAAU;AAAA,YACV,UAAU,SAAS;AAAA,YACnB,SAAQ;AAAA,YACR,aAAY;AAAA,YACZ,UAAU,EAAE,MAAM,MAAM,QAAQ,OAAO;AAAA,YAEtC;AAAA;AAAA,cAEA;AAAA;AAAA;AAAA,QACH;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAEA,oBAAoB,cAAc;;;AErClC,OAAOF,YAAU;AAoCL,gBAAAC,aAAA;AA1BZ,SAAS,kBAAkB,KAAqB;AAE9C,QAAM,QAAQ,IAAI,MAAM,8EAA8E;AACtG,MAAI,OAAO;AAET,WAAO,0CAA0C,MAAM,CAAC,CAAC;AAAA,EAC3D;AAEA,SAAO,IAAI,QAAQ,eAAe,sBAAsB,KAAK,IAAI,SAAS,GAAG,IAAI,MAAM,OAAO;AAChG;AAKO,SAAS,kBAAkB,EAAE,MAAM,UAAU,GAA2B;AAC7E,MAAI,CAAC,QAAQ,KAAK,WAAW,EAAG,QAAO;AAEvC,SACE,gBAAAA,MAAC,gBAAa,WAAWD,OAAK,gCAAgC,SAAS,GACrE,0BAAAC,MAAC,SAAI,WAAU,oEACZ,eAAK,IAAI,CAAC,KAAK,MACd,gBAAAA;AAAA,IAAC;AAAA;AAAA,MAEC,WAAU;AAAA,MACV,OAAO,EAAE,aAAa,OAAO;AAAA,MAE7B,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC,KAAK,kBAAkB,GAAG;AAAA,UAC1B,OAAO,qBAAqB,IAAI,CAAC;AAAA,UACjC,WAAU;AAAA,UACV,OAAM;AAAA,UACN,iBAAe;AAAA,UACf,SAAQ;AAAA;AAAA,MACV;AAAA;AAAA,IAXK;AAAA,EAYP,CACD,GACH,GACF;AAEJ;;;AC1CO,IAAM,cAAc;AAAA,EACzB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,UAAU;AAAA,EACV,UAAU;AAAA,EACV,cAAc;AAChB;;;ACdA,SAAgB,cAAAF,cAAY,YAAAI,WAAU,mBAAmB;AACzD,SAAS,UAAU,kBAAkB;AACrC,OAAOH,YAAU;AAsDf,SACE,OAAAC,OADF,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,IAAMM,YAAW,MACf,gBAAAN,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,OAAM,8BAA6B,eAAY,QACzG;AAAA,kBAAAD,MAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,WAAU,8BAA6B;AAAA,EACtE,gBAAAA,MAAC,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,MAAC,UAAK,IAAG,MAAK,IAAG,KAAI,IAAG,KAAI,IAAG,MAAK;AAAA,EACpC,gBAAAA,MAAC,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,MAAC,SAAI,KAAU,WAAWD,OAAK,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,MAAC,SAAI,WAAU,kCAAiC;AAAA,YAElD,gBAAAA,MAAC,SAAI,WAAU,8BACb,0BAAAA,MAAC,SAAI,WAAU,+BACb,0BAAAA,MAACO,WAAA,EAAS,GACZ,GACF;AAAA,aACF;AAAA;AAAA,MAEJ;AAAA,MAEA,gBAAAN,MAAC,WAAW,QAAX,EACC;AAAA,wBAAAD,MAAC,WAAW,UAAX,EAAoB,WAAU,+BAA8B;AAAA,QAC7D,gBAAAC,MAAC,WAAW,OAAX,EAAiB,WAAU,4BAC1B;AAAA,0BAAAD,MAAC,WAAW,OAAX,EAAiB,WAAU,4BAA2B,cAAW,eAChE,0BAAAA,MAAC,aAAU,GACb;AAAA,UACA,gBAAAA,MAAC,WAAW,OAAX,EAAiB,WAAU,cAAc,iBAAM;AAAA,UAChD,gBAAAA,MAAC,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;;;AClK5B,SAAgB,cAAAF,cAAY,aAAAK,YAAW,UAAAK,SAAQ,YAAAN,iBAAgB;AAC/D,OAAOH,YAAU;AA+GT,SACa,OAAAC,OADb,QAAAC,aAAA;AAxFD,IAAM,gBAAgBH;AAAA,EAC3B,CACE;AAAA,IACE;AAAA,IACA,SAAS;AAAA,IACT,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,CAAC,cAAc,eAAe,IAAII,UAAS,CAAC;AAClD,UAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,KAAK;AACpD,UAAM,eAAeM,QAAuB,IAAI;AAChD,UAAM,uBAAuBA,QAAO,KAAK;AAEzC,IAAAL,WAAU,MAAM;AACd,2BAAqB,UAAU,OAAO,WAAW,kCAAkC,EAAE;AAErF,UAAI,qBAAqB,SAAS;AAChC,wBAAgB,KAAK;AACrB,uBAAe,IAAI;AACnB;AAAA,MACF;AAEA,YAAM,WAAW,IAAI;AAAA,QACnB,CAAC,YAAY;AACX,cAAI,QAAQ,CAAC,EAAE,kBAAkB,CAAC,aAAa;AAC7C,2BAAe;AACf,qBAAS,WAAW;AAAA,UACtB;AAAA,QACF;AAAA,QACA,EAAE,WAAW,IAAI;AAAA,MACnB;AAEA,UAAI,aAAa,SAAS;AACxB,iBAAS,QAAQ,aAAa,OAAO;AAAA,MACvC;AAEA,aAAO,MAAM,SAAS,WAAW;AAAA,IAEnC,GAAG,CAAC,OAAO,WAAW,CAAC;AAEvB,UAAM,iBAAiB,MAAM;AAC3B,UAAI;AACJ,qBAAe,IAAI;AAEnB,YAAM,cAAc,CAAC,MAAsB;AACzC,eAAO,MAAM,IAAI,IAAI,IAAI,KAAK,IAAI,GAAG,MAAM,CAAC;AAAA,MAC9C;AAEA,YAAM,UAAU,CAAC,gBAAwB;AACvC,YAAI,CAAC,UAAW,aAAY;AAC5B,cAAM,WAAW,KAAK,KAAK,cAAc,aAAa,UAAU,CAAC;AAEjE,cAAM,oBAAoB,YAAY,QAAQ;AAC9C,cAAM,YAAY,QAAQ;AAE1B,wBAAgB,SAAS;AAEzB,YAAI,WAAW,GAAG;AAChB,gCAAsB,OAAO;AAAA,QAC/B,OAAO;AACL,0BAAgB,KAAK;AAAA,QACvB;AAAA,MACF;AAEA,4BAAsB,OAAO;AAAA,IAC/B;AAEA,UAAM,iBAAiB,aAAa,eAAe,QAAW;AAAA,MAC5D,uBAAuB;AAAA,MACvB,uBAAuB;AAAA,IACzB,CAAC;AAED,WACE,gBAAAF;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,WAAWF,OAAK,qBAAqB,SAAS;AAAA,QAC7C,GAAG;AAAA,QAEJ;AAAA,0BAAAE,MAAC,SAAI,WAAU,oCACZ;AAAA,sBAAU,gBAAAD,MAAC,UAAK,WAAU,6BAA6B,kBAAO;AAAA,YAC/D,gBAAAA,MAAC,UAAK,WAAU,4BAA4B,0BAAe;AAAA,YAC1D,UAAU,gBAAAA,MAAC,UAAK,WAAU,6BAA6B,kBAAO;AAAA,aACjE;AAAA,UACC,SAAS,gBAAAA,MAAC,SAAI,WAAU,4BAA4B,iBAAM;AAAA;AAAA;AAAA,IAC7D;AAAA,EAEJ;AACF;AAEA,cAAc,cAAc","sourcesContent":["import { forwardRef } from 'react';\nimport clsx from 'clsx';\nimport { StarRating } from '../StarRating/StarRating';\nimport { PlatformBadge, type Platform } from '../PlatformBadge/PlatformBadge';\nimport { OutboundLink } from '../OutboundLink/OutboundLink';\nimport './SocialProof.css';\n\n/* ============================================================================\n SOCIAL PROOF CARD — ELITE VARIANT SYSTEM\n ============================================================================\n Six visually distinct card variants, each optimized for its content type.\n Used in Wall of Love grids, carousels, and contextual social proof sections.\n ============================================================================ */\n\n/* --------------------------------------------------------------------------\n Icons\n -------------------------------------------------------------------------- */\n\nconst PlayIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n);\n\n/* --------------------------------------------------------------------------\n Types\n -------------------------------------------------------------------------- */\n\nexport interface Author {\n name: string;\n role?: string;\n company?: string;\n avatar?: string;\n handle?: string;\n}\n\nexport interface Media {\n src: string;\n type: 'image' | 'video';\n alt?: string;\n}\n\nexport interface CardMetric {\n value: string;\n label: string;\n prefix?: string;\n suffix?: string;\n}\n\nexport interface SocialProofCardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'content'> {\n /** Card visual variant — determines layout and visual identity */\n variant?: 'simple' | 'social' | 'video' | 'case-study' | 'rating-only';\n /** Quote or text content */\n content?: React.ReactNode;\n /** Author info */\n author: Author;\n /** Media (thumbnail image for video/case-study variants) */\n media?: Media;\n /** Source icon (e.g., Twitter logo) — legacy, prefer `platform` */\n sourceIcon?: React.ReactNode;\n /** Review platform for automatic badge display */\n platform?: Platform;\n /** Star rating value (0-5) */\n starRating?: number;\n /** Date string */\n date?: string;\n /** Text badges */\n badges?: string[];\n /** CTA text override */\n ctaText?: string;\n /** If set, renders as a clickable card */\n href?: string;\n onClick?: () => void;\n /** Staggered entrance animation delay (ms) */\n animationDelay?: number;\n /** Case study: headline */\n headline?: string;\n /** Case study: company logo node */\n logo?: React.ReactNode;\n /** Case study: industry label */\n industry?: string;\n /** Case study: key metrics */\n metrics?: CardMetric[];\n}\n\n/* --------------------------------------------------------------------------\n Component\n -------------------------------------------------------------------------- */\n\nexport const SocialProofCard = forwardRef<HTMLAnchorElement | HTMLDivElement, SocialProofCardProps>(\n (\n {\n variant = 'simple',\n content,\n author,\n media,\n sourceIcon,\n platform,\n starRating,\n date,\n badges,\n ctaText,\n href,\n className,\n children,\n animationDelay,\n headline,\n logo,\n industry,\n metrics,\n ...props\n },\n ref,\n ) => {\n const cardClass = clsx(\n 'ds-social-card',\n `ds-social-card--${variant}`,\n animationDelay != null && 'ds-social-card--animated',\n className,\n );\n\n const cardStyle = animationDelay != null\n ? { '--card-delay': `${animationDelay}ms` } as React.CSSProperties\n : undefined;\n\n /* --- Rating-Only Variant (compact horizontal) --- */\n if (variant === 'rating-only') {\n const inner = (\n <>\n <div className=\"ds-social-card__rating-row\">\n {starRating != null && (\n <StarRating value={starRating} size=\"lg\" />\n )}\n <div className=\"ds-social-card__meta\">\n <span className=\"ds-social-card__name\">{author.name}</span>\n {(author.role || author.company) && (\n <span className=\"ds-social-card__role\">\n {author.role}{author.role && author.company && ' · '}{author.company}\n </span>\n )}\n </div>\n {platform && (\n <PlatformBadge platform={platform} variant=\"icon-label\" size=\"sm\" />\n )}\n </div>\n </>\n );\n\n if (href) {\n return (\n <OutboundLink ref={ref as React.Ref<HTMLAnchorElement>} href={href} context=\"social-proof-card\" className={cardClass} style={cardStyle} openInNewTab={false} {...(props as React.AnchorHTMLAttributes<HTMLAnchorElement>)}>\n {inner}\n </OutboundLink>\n );\n }\n return (\n <div ref={ref as React.Ref<HTMLDivElement>} className={cardClass} style={cardStyle} {...props}>\n {inner}\n </div>\n );\n }\n\n /* --- Case-Study Variant (wide, structured) --- */\n if (variant === 'case-study') {\n const defaultCta = ctaText || 'Read Case Study \\u2192';\n const inner = (\n <>\n {media && (\n <div className=\"ds-social-card__media\">\n <img src={media.src} alt={media.alt || `${author.company} case study`} />\n </div>\n )}\n <div className=\"ds-social-card__content\">\n {/* Company header */}\n <div className=\"ds-social-card__cs-header\">\n {logo && <div className=\"ds-social-card__cs-logo\">{logo}</div>}\n <div className=\"ds-social-card__cs-company\">\n <span className=\"ds-social-card__name\">{author.company || author.name}</span>\n {industry && (\n <span className=\"ds-social-card__cs-industry\">{industry}</span>\n )}\n </div>\n </div>\n\n {/* Headline */}\n {headline && (\n <h3 className=\"ds-social-card__cs-headline\">{headline}</h3>\n )}\n\n {/* Metrics strip */}\n {metrics && metrics.length > 0 && (\n <div className=\"ds-social-card__cs-metrics\">\n {metrics.map((m, i) => (\n <div key={i} className=\"ds-social-card__cs-metric\">\n <span className=\"ds-social-card__cs-metric-value\">\n {m.prefix}{m.value}{m.suffix}\n </span>\n <span className=\"ds-social-card__cs-metric-label\">{m.label}</span>\n </div>\n ))}\n </div>\n )}\n\n {/* Quote excerpt */}\n {content && (\n <blockquote className=\"ds-social-card__quote ds-social-card__quote--excerpt\">\n &ldquo;{content}&rdquo;\n </blockquote>\n )}\n\n {/* CTA */}\n {href && <div className=\"ds-social-card__cta\">{defaultCta}</div>}\n </div>\n </>\n );\n\n if (href) {\n return (\n <OutboundLink ref={ref as React.Ref<HTMLAnchorElement>} href={href} context=\"social-proof-card\" className={cardClass} style={cardStyle} openInNewTab={false} {...(props as React.AnchorHTMLAttributes<HTMLAnchorElement>)}>\n {inner}\n </OutboundLink>\n );\n }\n return (\n <div ref={ref as React.Ref<HTMLDivElement>} className={cardClass} style={cardStyle} {...props}>\n {inner}\n </div>\n );\n }\n\n /* --- Video Variant (cinematic thumbnail) --- */\n if (variant === 'video') {\n const defaultCta = ctaText || 'Watch Video \\u2192';\n const inner = (\n <>\n <div className=\"ds-social-card__media\">\n {media ? (\n <img src={media.src} alt={media.alt || `${author.name} video`} />\n ) : (\n <div className=\"ds-social-card__media-placeholder\" />\n )}\n <div className=\"ds-social-card__play\">\n <div className=\"ds-social-card__play-icon\">\n <PlayIcon />\n </div>\n </div>\n {badges && badges.length > 0 && (\n <div className=\"ds-social-card__badges\">\n {badges.map((badge, idx) => (\n <span key={idx} className=\"ds-social-card__badge\">{badge}</span>\n ))}\n </div>\n )}\n </div>\n <div className=\"ds-social-card__content\">\n <div className=\"ds-social-card__author\">\n {author.avatar && (\n <div className=\"ds-social-card__avatar\">\n <img src={author.avatar} alt={author.name} />\n </div>\n )}\n <div className=\"ds-social-card__meta\">\n <span className=\"ds-social-card__name\">{author.name}</span>\n {(author.role || author.company) && (\n <span className=\"ds-social-card__role\">\n {author.role}{author.role && author.company && ' · '}{author.company}\n </span>\n )}\n </div>\n {platform && (\n <PlatformBadge platform={platform} variant=\"icon-only\" size=\"sm\" />\n )}\n </div>\n {content && (\n <blockquote className=\"ds-social-card__quote\">{content}</blockquote>\n )}\n {href && <div className=\"ds-social-card__cta\">{defaultCta}</div>}\n </div>\n </>\n );\n\n if (href) {\n return (\n <OutboundLink ref={ref as React.Ref<HTMLAnchorElement>} href={href} context=\"social-proof-card\" className={cardClass} style={cardStyle} openInNewTab={false} {...(props as React.AnchorHTMLAttributes<HTMLAnchorElement>)}>\n {inner}\n </OutboundLink>\n );\n }\n return (\n <div ref={ref as React.Ref<HTMLDivElement>} className={cardClass} style={cardStyle} {...props}>\n {inner}\n </div>\n );\n }\n\n /* --- Social Variant (rich, accent border) --- */\n if (variant === 'social') {\n const inner = (\n <>\n <div className=\"ds-social-card__content\">\n {(platform || sourceIcon) && (\n <div className=\"ds-social-card__source\">\n {platform ? <PlatformBadge platform={platform} variant=\"icon-only\" size=\"sm\" /> : sourceIcon}\n </div>\n )}\n {content && (\n <blockquote className=\"ds-social-card__quote ds-social-card__quote--clamp\">\n {content}\n </blockquote>\n )}\n <div className=\"ds-social-card__author\">\n {author.avatar && (\n <div className=\"ds-social-card__avatar\">\n <img src={author.avatar} alt={author.name} />\n </div>\n )}\n <div className=\"ds-social-card__meta\">\n <span className=\"ds-social-card__name\">{author.name}</span>\n {(author.role || author.company) && (\n <span className=\"ds-social-card__role\">\n {author.role}{author.role && author.company && ' · '}{author.company}\n </span>\n )}\n {date && <span className=\"ds-social-card__role\">{date}</span>}\n </div>\n </div>\n {starRating != null && (\n <StarRating value={starRating} size=\"sm\" />\n )}\n {children}\n </div>\n </>\n );\n\n if (href) {\n return (\n <OutboundLink ref={ref as React.Ref<HTMLAnchorElement>} href={href} context=\"social-proof-card\" className={cardClass} style={cardStyle} openInNewTab={false} {...(props as React.AnchorHTMLAttributes<HTMLAnchorElement>)}>\n {inner}\n </OutboundLink>\n );\n }\n return (\n <div ref={ref as React.Ref<HTMLDivElement>} className={cardClass} style={cardStyle} {...props}>\n {inner}\n </div>\n );\n }\n\n /* --- Simple Variant (default quote card with decorative marks) --- */\n const BadgeList = badges && badges.length > 0 && (\n <div className=\"ds-social-card__badges\">\n {badges.map((badge, idx) => (\n <span key={idx} className=\"ds-social-card__badge\">{badge}</span>\n ))}\n </div>\n );\n\n const defaultCta = ctaText || 'Read Story \\u2192';\n\n const simpleInner = (\n <div className=\"ds-social-card__content\">\n {/* Decorative quotation mark */}\n <div className=\"ds-social-card__deco-quote\" aria-hidden=\"true\">&ldquo;</div>\n\n {(platform || sourceIcon) && (\n <div className=\"ds-social-card__source\">\n {platform ? <PlatformBadge platform={platform} variant=\"icon-only\" size=\"sm\" /> : sourceIcon}\n </div>\n )}\n\n {BadgeList}\n\n {content && (\n <blockquote className=\"ds-social-card__quote\">\n {content}\n </blockquote>\n )}\n\n {starRating != null && (\n <StarRating value={starRating} size=\"sm\" />\n )}\n\n <div className=\"ds-social-card__author\">\n {author.avatar && (\n <div className=\"ds-social-card__avatar\">\n <img src={author.avatar} alt={author.name} />\n </div>\n )}\n <div className=\"ds-social-card__meta\">\n <span className=\"ds-social-card__name\">\n {author.name}\n {author.handle && (\n <span className=\"ds-social-card__handle\">@{author.handle}</span>\n )}\n </span>\n {(author.role || author.company) && (\n <span className=\"ds-social-card__role\">\n {author.role}{author.role && author.company && ' · '}{author.company}\n </span>\n )}\n {date && <span className=\"ds-social-card__role\">{date}</span>}\n </div>\n </div>\n\n {children}\n\n {href && <div className=\"ds-social-card__cta\">{defaultCta}</div>}\n </div>\n );\n\n if (href) {\n return (\n <OutboundLink ref={ref as React.Ref<HTMLAnchorElement>} href={href} context=\"social-proof-card\" className={cardClass} style={cardStyle} openInNewTab={false} {...(props as React.AnchorHTMLAttributes<HTMLAnchorElement>)}>\n {simpleInner}\n </OutboundLink>\n );\n }\n\n return (\n <div ref={ref as React.Ref<HTMLDivElement>} className={cardClass} style={cardStyle} {...props}>\n {simpleInner}\n </div>\n );\n },\n);\n\nSocialProofCard.displayName = 'SocialProofCard';\n","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 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, { AnchorHTMLAttributes, forwardRef, MouseEvent, useState, useEffect } from 'react';\nimport type { UtmParams } from '../../web/utm/types';\nimport { useUtmDefaults } from '../../web/utm/useUtmDefaults';\nimport { isExemptUrl, appendUTMs, appendGovernedUTMs } from './outbound-link-utils';\n\nexport interface OutboundLinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n href: string;\n context: string;\n campaignOverride?: string;\n mediumOverride?: string;\n preserveExistingUTM?: boolean;\n openInNewTab?: boolean;\n disableTracking?: boolean;\n /**\n * Governed UTM parameters. When provided, the link uses the UTM governance\n * system (buildUtmUrl) instead of the legacy appendUTMs approach.\n *\n * Preferred for all new code. Existing usages without utmParams continue\n * to work via the legacy path.\n */\n utmParams?: UtmParams;\n children: React.ReactNode;\n}\n\nexport interface OutboundClickEventDetail {\n destination_domain: string;\n destination_url: string;\n utm_medium_type: string;\n page_slug: string;\n component_location: string;\n timestamp: string;\n is_cross_subdomain: boolean;\n}\n\nexport const OutboundLink = forwardRef<HTMLAnchorElement, OutboundLinkProps>(\n (\n {\n href,\n context,\n campaignOverride,\n mediumOverride = 'outbound_link',\n preserveExistingUTM = true,\n openInNewTab = true,\n disableTracking = false,\n utmParams,\n onClick,\n children,\n ...props\n },\n ref\n ) => {\n // ── Resolve UTM params: explicit prop > context > legacy fallback ──\n const contextParams = useUtmDefaults();\n const resolvedUtmParams = utmParams ?? contextParams;\n\n // Parse hostname for analytics events (safe on both server/client)\n let hostname = '';\n try {\n const url = new URL(href);\n hostname = url.hostname;\n } catch {\n // Relative URL or invalid — hostname stays empty\n }\n\n // SSR and initial client render use the plain href to avoid hydration\n // mismatches. UTM params are decorated after hydration via useEffect.\n const [finalHref, setFinalHref] = useState(href);\n\n useEffect(() => {\n let isExternal = false;\n let currentMedium = mediumOverride;\n\n try {\n const url = new URL(href);\n const currentHost = window.location.hostname;\n isExternal = url.hostname !== currentHost;\n\n if (isExternal && currentHost.includes('sales-mind.ai') && url.hostname.includes('sales-mind.ai')) {\n if (currentMedium === 'outbound_link') {\n currentMedium = 'cross_subdomain';\n }\n }\n } catch {\n isExternal = false;\n }\n\n const isExempt = isExemptUrl(href) || disableTracking;\n\n if (isExternal && !isExempt) {\n if (resolvedUtmParams) {\n // Governed path: use buildUtmUrl via appendGovernedUTMs\n setFinalHref(appendGovernedUTMs(href, resolvedUtmParams, preserveExistingUTM));\n } else {\n // Legacy path: use appendUTMs with non-governed defaults\n const pageSlug = window.location.pathname.replace(/^\\/|\\/$/g, '') || 'home';\n setFinalHref(appendUTMs(href, context, pageSlug, {\n mediumOverride: currentMedium,\n campaignOverride,\n preserveExisting: preserveExistingUTM,\n }));\n }\n } else {\n setFinalHref(href);\n }\n }, [href, context, mediumOverride, campaignOverride, preserveExistingUTM, disableTracking, resolvedUtmParams]);\n\n const handleClick = (e: MouseEvent<HTMLAnchorElement>) => {\n if (typeof window === 'undefined' || disableTracking) {\n onClick?.(e);\n return;\n }\n\n let clickExternal = false;\n let clickCrossSubdomain = false;\n let clickMedium = mediumOverride;\n\n try {\n const url = new URL(href);\n const currentHost = window.location.hostname;\n clickExternal = url.hostname !== currentHost;\n\n if (clickExternal && currentHost.includes('sales-mind.ai') && url.hostname.includes('sales-mind.ai')) {\n clickCrossSubdomain = true;\n if (clickMedium === 'outbound_link') {\n clickMedium = 'cross_subdomain';\n }\n }\n } catch { /* relative URL */ }\n\n if (clickExternal) {\n const detail: OutboundClickEventDetail = {\n destination_domain: hostname,\n destination_url: finalHref,\n utm_medium_type: clickMedium,\n page_slug: window.location.pathname,\n component_location: context,\n timestamp: new Date().toISOString(),\n is_cross_subdomain: clickCrossSubdomain,\n };\n\n const event = new CustomEvent('outbound_click', { detail });\n window.dispatchEvent(event);\n }\n\n onClick?.(e);\n };\n\n // Determine SEO attributes\n const relParts = [];\n \n // Check if it's cross-subdomain for target logic (usually open internal links in same tab, external in new)\n let shouldOpenNewTab = openInNewTab;\n try {\n const url = new URL(href);\n if (typeof window !== 'undefined') {\n const currentHost = window.location.hostname;\n if (url.hostname !== currentHost && currentHost.includes('sales-mind.ai') && url.hostname.includes('sales-mind.ai')) {\n shouldOpenNewTab = false; // By default, prefer same tab for cross-subdomain ecosystem links\n }\n }\n } catch { /* empty */ }\n\n if (shouldOpenNewTab) relParts.push('noopener', 'noreferrer');\n if (mediumOverride === 'citation') relParts.push('nofollow');\n const rel = relParts.length > 0 ? relParts.join(' ') : undefined;\n\n return (\n // eslint-disable-next-line no-restricted-syntax\n <a\n ref={ref}\n href={finalHref}\n target={shouldOpenNewTab ? '_blank' : undefined}\n rel={rel}\n onClick={handleClick}\n {...props}\n >\n {children}\n </a>\n );\n }\n);\n\nOutboundLink.displayName = 'OutboundLink';\n","import { useContext } from 'react';\nimport { UtmContext } from './utm-context';\nimport type { UtmParams } from './types';\n\n/**\n * Read the nearest UtmProvider's default params.\n * Returns `null` when no provider is present (callers should fall back gracefully).\n */\nexport function useUtmDefaults(): UtmParams | null {\n return useContext(UtmContext);\n}\n","import { createContext } from 'react';\nimport type { UtmParams } from './types';\n\n/** Internal React context instance. Import via UtmProvider / useUtmDefaults — do not use directly. */\nexport const UtmContext = createContext<UtmParams | null>(null);\n","/* ============================================================================\n UTM URL Builders\n ============================================================================ */\n\nimport type { UtmParams } from './types';\n\n/** Placeholder origin used internally to parse relative URLs. Never appears in output. */\nconst PLACEHOLDER_ORIGIN = 'https://__placeholder__.internal';\n\n/**\n * Build a URL with UTM parameters appended.\n *\n * - Supports both absolute and relative URLs.\n * - Preserves existing query parameters and hash fragments.\n * - Always emits params in canonical order: source → medium → campaign → term → content.\n * - Omits optional params (term, content) when undefined.\n *\n * @example\n * buildUtmUrl('https://app.sales-mind.ai/register', { source: 'linkedin', medium: 'dm', campaign: 'discoveryCall' })\n * // → 'https://app.sales-mind.ai/register?utm_source=linkedin&utm_medium=dm&utm_campaign=discoveryCall'\n *\n * buildUtmUrl('/pricing', { source: 'website', medium: 'webHome', campaign: 'trial' })\n * // → '/pricing?utm_source=website&utm_medium=webHome&utm_campaign=trial'\n */\nexport function buildUtmUrl(baseUrl: string, params: UtmParams): string {\n const isRelative = baseUrl.startsWith('/');\n\n let url: URL;\n try {\n url = isRelative ? new URL(baseUrl, PLACEHOLDER_ORIGIN) : new URL(baseUrl);\n } catch {\n // If URL parsing fails entirely, return the base URL unchanged.\n return baseUrl;\n }\n\n // Preserve existing params by collecting them first, then clearing and re-adding in order.\n const existingParams: [string, string][] = [];\n url.searchParams.forEach((value, key) => {\n existingParams.push([key, value]);\n });\n\n // Clear all params to rebuild in canonical order.\n for (const [key] of existingParams) {\n url.searchParams.delete(key);\n }\n\n // Re-add existing non-UTM params first.\n for (const [key, value] of existingParams) {\n if (!key.startsWith('utm_')) {\n url.searchParams.set(key, value);\n }\n }\n\n // Append UTM params in canonical order.\n url.searchParams.set('utm_source', params.source);\n url.searchParams.set('utm_medium', params.medium);\n url.searchParams.set('utm_campaign', params.campaign);\n if (params.term !== undefined) {\n url.searchParams.set('utm_term', params.term);\n }\n if (params.content !== undefined) {\n url.searchParams.set('utm_content', params.content);\n }\n\n if (isRelative) {\n // Strip placeholder origin to return a relative path.\n return url.href.replace(PLACEHOLDER_ORIGIN, '');\n }\n\n return url.href;\n}\n","/* ============================================================================\n URL Classification & UTM Enforcement Logic\n ============================================================================\n Determines whether a URL requires UTM parameters based on its type.\n No imports from validators — avoids circular dependency.\n ============================================================================ */\n\nimport type { UrlClassification } from './types';\n\n// ── Patterns ─────────────────────────────────────────────────────────────────\n\n/** Internal domains — UTMs not required for same-origin navigation. */\nconst INTERNAL_PATTERNS = [\n /^\\/(?!\\/)/, // Relative paths\n /^https?:\\/\\/(www\\.)?sales-mind\\.ai/i, // Marketing site\n /^https?:\\/\\/app\\.sales-mind\\.ai/i, // Web app\n /^https?:\\/\\/apps\\.sales-mind\\.ai/i, // Web app (legacy)\n /^https?:\\/\\/meet\\.sales-mind\\.ai/i, // Booking\n /^https?:\\/\\/docs\\.sales-mind\\.ai/i, // Docs\n];\n\n/** System endpoints — never receive UTMs. */\nconst SYSTEM_PATTERNS = [\n /^https?:\\/\\/.*\\/api\\//i, // API endpoints\n /^https?:\\/\\/.*\\/webhook/i, // Webhooks\n /^https?:\\/\\/.*\\/oauth/i, // OAuth callbacks\n /^https?:\\/\\/.*\\/callback/i, // Callbacks\n /^https?:\\/\\/.*\\.supabase\\.(co|com)/i, // Supabase\n /^https?:\\/\\/.*\\.firebaseapp\\.com/i, // Firebase\n /^https?:\\/\\/.*\\.cloudfunctions\\.net/i, // Cloud Functions\n];\n\n/** Static assets — never receive UTMs. */\nconst ASSET_PATTERNS = [\n /\\.(css|js|mjs|map|woff2?|ttf|eot|svg|png|jpe?g|gif|webp|avif|ico|pdf)(\\?.*)?$/i,\n];\n\n/** Conversion destinations — always require UTMs. */\nconst CONVERSION_PATTERNS = [\n /^https?:\\/\\/(www\\.)?calendly\\.com/i,\n /^https?:\\/\\/(checkout\\.)?stripe\\.com/i,\n /^https?:\\/\\/buy\\.stripe\\.com/i,\n /^https?:\\/\\/chromewebstore\\.google\\.com/i,\n /^https?:\\/\\/meet\\.sales-mind\\.ai/i,\n];\n\n/** Protocol-level links — never receive UTMs. */\nconst PROTOCOL_EXEMPT = [\n /^mailto:/i,\n /^tel:/i,\n /^#/,\n /^javascript:/i,\n];\n\n// ── Classification ───────────────────────────────────────────────────────────\n\n/**\n * Classify a URL to determine its type.\n *\n * Classification order (first match wins):\n * 1. Protocol links (mailto, tel, anchor)\n * 2. Static assets\n * 3. System endpoints (API, webhooks, OAuth)\n * 4. Conversion destinations (Calendly, Stripe, Chrome Store)\n * 5. Internal (*.sales-mind.ai)\n * 6. External (everything else)\n */\nexport function classifyUrl(url: string): UrlClassification {\n // Protocol links\n if (PROTOCOL_EXEMPT.some(p => p.test(url))) return 'protocol';\n\n // Static assets\n if (ASSET_PATTERNS.some(p => p.test(url))) return 'asset';\n\n // System endpoints\n if (SYSTEM_PATTERNS.some(p => p.test(url))) return 'system';\n\n // Conversion destinations\n if (CONVERSION_PATTERNS.some(p => p.test(url))) return 'conversion';\n\n // Internal\n if (INTERNAL_PATTERNS.some(p => p.test(url))) return 'internal';\n\n // Everything else is external\n return 'external';\n}\n\n/**\n * Determine whether a URL requires UTM parameters.\n *\n * UTMs are mandatory for:\n * - External third-party destinations\n * - Conversion destinations (Calendly, Stripe, Chrome Web Store)\n *\n * UTMs are NOT required for:\n * - Internal navigation\n * - System endpoints\n * - Static assets\n * - Protocol links\n */\nexport function requiresUtm(url: string): boolean {\n const classification = classifyUrl(url);\n return classification === 'external' || classification === 'conversion';\n}\n\n/**\n * Check if a URL is explicitly exempt from UTM requirements.\n */\nexport function isUtmExempt(url: string): boolean {\n const classification = classifyUrl(url);\n return classification === 'protocol'\n || classification === 'asset'\n || classification === 'system'\n || classification === 'internal';\n}\n","import type { UtmParams } from '../../web/utm/types';\nimport { buildUtmUrl } from '../../web/utm/builders';\nimport { classifyUrl } from '../../web/utm/classifiers';\n\n/**\n * @deprecated Use governed `utmParams` prop on OutboundLink instead.\n * Legacy default source — superseded by governed UTM_SOURCES enum.\n */\nconst LEGACY_UTM_SOURCE = 'salesmind';\n\nconst EXEMPT_PATTERNS = [\n /^https?:\\/\\/(www\\.)?(stripe\\.com|checkout\\.stripe\\.com|paypal\\.com)/i,\n /^https?:\\/\\/(www\\.)?github\\.com\\/login\\/oauth/i,\n];\n\n/**\n * Check if a URL is exempt from UTM tagging.\n * Uses both legacy patterns and governed URL classification.\n */\nexport const isExemptUrl = (urlStr: string): boolean => {\n if (urlStr.startsWith('mailto:') || urlStr.startsWith('tel:')) return true;\n\n // Governed classification: system/protocol/asset URLs are exempt\n const classification = classifyUrl(urlStr);\n if (classification === 'system' || classification === 'protocol' || classification === 'asset') {\n return true;\n }\n\n return EXEMPT_PATTERNS.some(pattern => pattern.test(urlStr));\n};\n\n/**\n * Append governed UTM parameters to a URL using `buildUtmUrl`.\n * Preferred over the legacy `appendUTMs` function.\n */\nexport const appendGovernedUTMs = (\n href: string,\n params: UtmParams,\n preserveExisting = true,\n): string => {\n try {\n const url = new URL(href);\n\n // If preserveExisting and all UTM params are already set, return unchanged\n if (preserveExisting) {\n const hasAll = url.searchParams.has('utm_source')\n && url.searchParams.has('utm_medium')\n && url.searchParams.has('utm_campaign');\n if (hasAll) return href;\n }\n\n return buildUtmUrl(href, params);\n } catch {\n return href;\n }\n};\n\n/**\n * @deprecated Prefer `appendGovernedUTMs` with governed `UtmParams`.\n *\n * Legacy UTM append function. Uses non-governed defaults:\n * - utm_source = 'salesmind' (not in governed enum)\n * - utm_medium = 'outbound_link' (snake_case, not in governed enum)\n *\n * Retained for backward compatibility. Consumers should migrate to\n * the `utmParams` prop on OutboundLink.\n */\nexport const appendUTMs = (\n href: string,\n context: string,\n pageSlug: string,\n options: {\n mediumOverride?: string;\n campaignOverride?: string;\n preserveExisting?: boolean;\n }\n): string => {\n try {\n const url = new URL(href);\n const { mediumOverride = 'outbound_link', campaignOverride, preserveExisting = true } = options;\n\n const utms = {\n utm_source: LEGACY_UTM_SOURCE,\n utm_medium: mediumOverride,\n utm_campaign: campaignOverride || pageSlug,\n utm_content: context,\n };\n\n Object.entries(utms).forEach(([key, value]) => {\n if (value) {\n if (preserveExisting && url.searchParams.has(key)) {\n // Do not override if preserve is true\n return;\n }\n url.searchParams.set(key, value);\n }\n });\n\n return url.toString();\n } catch {\n return href; // Return original if not valid URL (e.g. relative)\n }\n};\n","import React, { forwardRef } from 'react';\nimport clsx from 'clsx';\nimport { SectionShell, SectionShellProps } from '../SectionShell/SectionShell';\nimport './SocialProof.css';\n\n/* ============================================================================\n SOCIAL PROOF GRID — VARIABLE-SIZE MASONRY\n ============================================================================\n Responsive grid supporting variable-size cards (span-2 for case studies),\n staggered entrance animations, and CSS Grid dense auto-placement.\n ============================================================================ */\n\nexport interface SocialProofGridProps extends Omit<SectionShellProps, 'title'> {\n /** Number of columns at desktop breakpoint */\n columns?: 2 | 3 | 4;\n /** Use CSS column-based masonry instead of CSS Grid */\n masonry?: boolean;\n /** Enable staggered entrance animation on children */\n staggered?: boolean;\n}\n\n/**\n * Wrap each child in a grid item. Use `span={2}` data attribute or\n * the `ds-social-grid__item--span-2` class on children to span 2 columns.\n *\n * @example\n * ```tsx\n * <SocialProofGrid columns={3} staggered>\n * <SocialProofCard variant=\"simple\" ... />\n * <div className=\"ds-social-grid__item--span-2\">\n * <SocialProofCard variant=\"case-study\" ... />\n * </div>\n * </SocialProofGrid>\n * ```\n */\nexport const SocialProofGrid = forwardRef<HTMLDivElement, SocialProofGridProps>(\n ({ columns = 3, masonry = false, staggered = false, className, children, ...props }, ref) => {\n // Add staggered animation delay to each child via CSS class + custom property\n // (avoids leaking a custom `animationDelay` React prop to the DOM)\n const enhancedChildren = staggered\n ? React.Children.map(children, (child, index) => {\n if (!React.isValidElement(child)) return child;\n const delay = Math.min(index * 50, 600); // Cap at 600ms\n const childProps = child.props as { style?: React.CSSProperties; className?: string };\n return React.cloneElement(child as React.ReactElement<{ style?: React.CSSProperties; className?: string }>, {\n style: { ...childProps.style, '--card-delay': `${delay}ms` } as React.CSSProperties,\n className: clsx(childProps.className, 'ds-social-card--animated'),\n });\n })\n : children;\n\n return (\n <SectionShell\n ref={ref}\n padding=\"md\"\n className={clsx('ds-social-proof', className)}\n {...props}\n >\n {masonry ? (\n <div className=\"ds-social-masonry\">{enhancedChildren}</div>\n ) : (\n <div className={clsx('ds-social-grid', `ds-social-grid--${columns}-col`)}>\n {enhancedChildren}\n </div>\n )}\n </SectionShell>\n );\n },\n);\n\nSocialProofGrid.displayName = 'SocialProofGrid';\n","import React, { forwardRef, HTMLAttributes } from 'react';\nimport clsx from 'clsx';\nimport { Container } from '../LayoutPrimitives';\nimport './SectionShell.css';\n\n/* ============================================================================\n Section Header Component\n ============================================================================ */\n\nexport interface SectionHeaderProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n title?: React.ReactNode;\n subtitle?: React.ReactNode;\n eyebrow?: React.ReactNode;\n align?: 'left' | 'center' | 'right';\n}\n\nexport const SectionHeader = forwardRef<HTMLDivElement, SectionHeaderProps>(\n ({ title, subtitle, eyebrow, align = 'center', className, ...props }, ref) => {\n if (!title && !subtitle && !eyebrow) return null;\n\n return (\n <header\n ref={ref}\n className={clsx('ds-section-header', `ds-section-header--${align}`, className)}\n {...props}\n >\n {eyebrow && <span className=\"ds-section-header__eyebrow\">{eyebrow}</span>}\n {title && <h2 className=\"ds-section-header__title\">{title}</h2>}\n {subtitle && <p className=\"ds-section-header__subtitle\">{subtitle}</p>}\n </header>\n );\n },\n);\nSectionHeader.displayName = 'SectionHeader';\n\n/* ============================================================================\n Section Shell Component\n ============================================================================ */\n\nexport interface SectionShellProps extends HTMLAttributes<HTMLDivElement> {\n background?: 'default' | 'muted' | 'brand' | 'transparent';\n padding?: 'none' | 'sm' | 'md' | 'lg';\n containerSize?: 'sm' | 'md' | 'lg' | 'xl' | 'fluid'; // Maps to Container max-width\n containerFluid?: boolean;\n}\n\nexport const SectionShell = forwardRef<HTMLDivElement, SectionShellProps>(\n (\n {\n className,\n children,\n background = 'default',\n padding = 'md',\n containerSize,\n containerFluid = false,\n ...props\n },\n ref,\n ) => {\n return (\n <section\n ref={ref}\n className={clsx(\n 'ds-section',\n `ds-section--bg-${background}`,\n `ds-section--padding-${padding}`,\n className,\n )}\n {...props}\n >\n <Container\n size={containerSize === 'fluid' ? 'full' : (containerSize as 'sm' | 'md' | 'lg' | 'xl' | undefined)}\n fluid={containerFluid || containerSize === 'fluid'}\n >\n {children}\n </Container>\n </section>\n );\n },\n);\nSectionShell.displayName = 'SectionShell';\n","import { ElementType, HTMLAttributes, forwardRef } from 'react';\nimport clsx from 'clsx';\nimport { SpacingProps, extractSpacingStyles } from './utils';\nimport './LayoutPrimitives.css';\n\nexport interface BoxProps extends HTMLAttributes<HTMLElement>, SpacingProps {\n as?: ElementType;\n}\n\nexport const Box = forwardRef<HTMLElement, BoxProps>(\n ({ as: Component = 'div', className, style, children, ...props }, ref) => {\n const spacingStyles = extractSpacingStyles(props);\n\n // Filter out spacing props from passing to DOM\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { m, mt, mb, ml, mr, mx, my, p, pt, pb, pl, pr, px, py, gap, ...domProps } = props;\n\n return (\n <Component\n ref={ref}\n className={clsx('ds-box', className)}\n style={{ ...spacingStyles, ...style }}\n {...domProps}\n >\n {children}\n </Component>\n );\n },\n);\n\nBox.displayName = 'Box';\n","export const SPACING = {\n 1: 'var(--space-1)',\n 2: 'var(--space-2)',\n 3: 'var(--space-3)',\n 4: 'var(--space-4)',\n 5: 'var(--space-5)',\n 6: 'var(--space-6)',\n 8: 'var(--space-8)',\n 10: 'var(--space-10)',\n 12: 'var(--space-12)',\n 16: 'var(--space-16)',\n 20: 'var(--space-20)',\n} as const;\n\nexport type SpacingToken = keyof typeof SPACING;\n","import { CSSProperties } from 'react';\nimport { SPACING } from '../../tokens/spacing';\n\ntype SpacingValue = keyof typeof SPACING | number | string;\n\n/**\n * Named spacing aliases that map semantic sizes to DS space tokens.\n * Allows consumers to pass gap=\"lg\" instead of gap={6}.\n */\nconst SPACING_ALIASES: Record<string, string> = {\n xs: 'var(--space-2)',\n sm: 'var(--space-3)',\n md: 'var(--space-4)',\n lg: 'var(--space-6)',\n xl: 'var(--space-8)',\n '2xl': 'var(--space-12)',\n};\n\nexport function resolveSpacing(value: SpacingValue | undefined): string | undefined {\n if (value === undefined) return undefined;\n if (typeof value === 'number' && SPACING[value as keyof typeof SPACING]) {\n return SPACING[value as keyof typeof SPACING];\n }\n if (typeof value === 'string' && value in SPACING_ALIASES) {\n return SPACING_ALIASES[value];\n }\n return String(value);\n}\n\nexport interface SpacingProps {\n m?: SpacingValue;\n mt?: SpacingValue;\n mb?: SpacingValue;\n ml?: SpacingValue;\n mr?: SpacingValue;\n mx?: SpacingValue;\n my?: SpacingValue;\n p?: SpacingValue;\n pt?: SpacingValue;\n pb?: SpacingValue;\n pl?: SpacingValue;\n pr?: SpacingValue;\n px?: SpacingValue;\n py?: SpacingValue;\n gap?: SpacingValue;\n}\n\nexport function extractSpacingStyles(props: SpacingProps): CSSProperties {\n const styles: CSSProperties = {};\n\n if (props.m !== undefined) styles.margin = resolveSpacing(props.m);\n if (props.mt !== undefined) styles.marginTop = resolveSpacing(props.mt);\n if (props.mb !== undefined) styles.marginBottom = resolveSpacing(props.mb);\n if (props.ml !== undefined) styles.marginLeft = resolveSpacing(props.ml);\n if (props.mr !== undefined) styles.marginRight = resolveSpacing(props.mr);\n if (props.mx !== undefined) {\n styles.marginLeft = resolveSpacing(props.mx);\n styles.marginRight = resolveSpacing(props.mx);\n }\n if (props.my !== undefined) {\n styles.marginTop = resolveSpacing(props.my);\n styles.marginBottom = resolveSpacing(props.my);\n }\n\n if (props.p !== undefined) styles.padding = resolveSpacing(props.p);\n if (props.pt !== undefined) styles.paddingTop = resolveSpacing(props.pt);\n if (props.pb !== undefined) styles.paddingBottom = resolveSpacing(props.pb);\n if (props.pl !== undefined) styles.paddingLeft = resolveSpacing(props.pl);\n if (props.pr !== undefined) styles.paddingRight = resolveSpacing(props.pr);\n if (props.px !== undefined) {\n styles.paddingLeft = resolveSpacing(props.px);\n styles.paddingRight = resolveSpacing(props.px);\n }\n if (props.py !== undefined) {\n styles.paddingTop = resolveSpacing(props.py);\n styles.paddingBottom = resolveSpacing(props.py);\n }\n\n if (props.gap !== undefined) styles.gap = resolveSpacing(props.gap);\n\n return styles;\n}\n","import { forwardRef } from 'react';\nimport clsx from 'clsx';\nimport { Box, BoxProps } from './Box';\n\nexport type ContainerSize = 'sm' | 'md' | 'lg' | 'xl' | 'full';\n\n/**\n * Maps named sizes to max-width values.\n * Aligns with common web breakpoints (Tailwind `max-w-*` scale).\n */\n// eslint-disable-next-line react-refresh/only-export-components\nexport const CONTAINER_SIZE_MAP: Record<ContainerSize, string> = {\n sm: '768px', // 48rem — max-w-3xl\n md: '1024px', // 64rem — max-w-5xl\n lg: '1152px', // 72rem — max-w-6xl\n xl: '1280px', // 80rem — max-w-7xl\n full: '100%',\n};\n\nexport interface ContainerProps extends BoxProps {\n /**\n * Named size preset. Overrides `maxWidth` when set.\n * @example <Container size=\"lg\">…</Container>\n */\n size?: ContainerSize;\n /** Pass `true` to stretch to 100% width (same as `size=\"full\"`). */\n fluid?: boolean;\n /** Custom max-width value. Ignored when `size` or `fluid` is set. */\n maxWidth?: number | string;\n}\n\nexport const Container = forwardRef<HTMLElement, ContainerProps>(\n ({ size, fluid, maxWidth, className, style, ...props }, ref) => {\n let resolvedMaxWidth: string | number;\n if (fluid) {\n resolvedMaxWidth = '100%';\n } else if (size) {\n resolvedMaxWidth = CONTAINER_SIZE_MAP[size];\n } else {\n resolvedMaxWidth = maxWidth || 'var(--container-default-max, 1200px)';\n }\n\n return (\n <Box\n ref={ref}\n className={clsx('ds-container', className)}\n style={{\n maxWidth: resolvedMaxWidth,\n ...style,\n }}\n {...props}\n />\n );\n },\n);\n\nContainer.displayName = 'Container';\n","import { forwardRef, CSSProperties } from 'react';\nimport clsx from 'clsx';\nimport { SectionShell, SectionShellProps } from '../SectionShell/SectionShell';\nimport { OutboundLink } from '../OutboundLink/OutboundLink';\nimport './SocialProof.css';\n\nexport interface LogoItem {\n id: string | number;\n alt: string;\n src?: string;\n logo?: React.ReactNode; // SVG component\n href?: string;\n badge?: string; // Optional badge text (e.g. \"Testimonial\")\n}\n\nexport interface SocialProofLogosProps extends Omit<SectionShellProps, 'title'> {\n title?: React.ReactNode;\n logos: LogoItem[];\n variant?: 'grid' | 'marquee';\n speed?: number; // Seconds\n}\n\nconst LogoItemRender = ({ item, className }: { item: LogoItem; className?: string }) => {\n const content = item.logo ? (\n item.logo\n ) : (\n <img\n src={item.src}\n alt={item.alt}\n width={120}\n height={48}\n loading=\"lazy\"\n decoding=\"async\"\n style={{ objectFit: 'contain', width: 'auto', height: '100%' }}\n />\n );\n\n const innerContent = (\n <>\n {content}\n {item.badge && <span className=\"ds-social-logos__badge\">{item.badge}</span>}\n </>\n );\n\n if (item.href) {\n const isInternal = item.href.startsWith('/');\n\n return (\n <OutboundLink\n href={item.href}\n context=\"social-proof-logo\"\n className={clsx('ds-social-logos__item', className)}\n title={item.alt}\n openInNewTab={!isInternal}\n >\n {innerContent}\n </OutboundLink>\n );\n }\n\n return (\n <div className={clsx('ds-social-logos__item', className)} title={item.alt}>\n {innerContent}\n </div>\n );\n};\n\nexport const SocialProofLogos = forwardRef<HTMLDivElement, SocialProofLogosProps>(\n ({ title, logos, variant = 'grid', speed = 40, className, ...props }, ref) => {\n return (\n <SectionShell\n ref={ref}\n padding=\"sm\"\n className={clsx('ds-social-logos', className)}\n {...props}\n >\n {title && (\n <h3\n className=\"ds-section-header__eyebrow\"\n style={{ textAlign: 'center', marginBottom: 'var(--space-8)' }}\n >\n {title}\n </h3>\n )}\n\n {variant === 'marquee' ? (\n <div\n className=\"ds-social-logos__marquee\"\n style={{ '--marquee-duration': `${speed}s` } as CSSProperties}\n >\n <div className=\"ds-social-logos__track\">\n {logos.map((item) => (\n <LogoItemRender key={`set1-${item.id}`} item={item} />\n ))}\n </div>\n <div className=\"ds-social-logos__track\" aria-hidden=\"true\">\n {logos.map((item) => (\n <LogoItemRender key={`set2-${item.id}`} item={item} />\n ))}\n </div>\n </div>\n ) : (\n <div className=\"ds-social-grid ds-social-grid--4-col\" style={{ alignItems: 'center' }}>\n {logos.map((item) => (\n <LogoItemRender key={item.id} item={item} />\n ))}\n </div>\n )}\n </SectionShell>\n );\n },\n);\n\nSocialProofLogos.displayName = 'SocialProofLogos';\n","import { forwardRef } from 'react';\nimport clsx from 'clsx';\nimport { SectionShell, SectionShellProps } from '../SectionShell/SectionShell';\nimport { StarRating } from '../StarRating/StarRating';\nimport { PlatformBadge, type Platform } from '../PlatformBadge/PlatformBadge';\nimport { Author } from './Card';\nimport './SocialProof.css';\n\n/* ============================================================================\n SOCIAL PROOF FEATURED — IMMERSIVE HERO TESTIMONIAL\n ============================================================================\n Three layout variants for hero-level social proof display:\n - standard: Side-by-side media + quote (existing)\n - cinematic: Dark bg, dramatic sizing, for video testimonials\n - spotlight: Centered layout with radial gradient, for text quotes\n ============================================================================ */\n\nconst PlayIconLarge = () => (\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\" fill=\"white\" fillOpacity=\"0.9\" />\n <path d=\"M42 32L26 41.2376L26 22.7624L42 32Z\" fill=\"black\" />\n </svg>\n);\n\nexport interface SocialProofFeaturedProps extends Omit<SectionShellProps, 'title'> {\n /** Quote text */\n quote: string;\n /** Author info */\n author: Author;\n /** Media element (video component, image, or VideoLightbox) */\n media?: React.ReactNode;\n /** Quick image src for media slot */\n mediaSrc?: string;\n /** Layout orientation */\n orientation?: 'horizontal' | 'vertical';\n /** Visual variant */\n featuredVariant?: 'standard' | 'cinematic' | 'spotlight';\n /** Star rating */\n starRating?: number;\n /** Review platform */\n platform?: Platform;\n /** Company logo node */\n logo?: React.ReactNode;\n}\n\nexport const SocialProofFeatured = forwardRef<HTMLDivElement, SocialProofFeaturedProps>(\n (\n {\n quote,\n author,\n media,\n mediaSrc,\n orientation = 'horizontal',\n featuredVariant = 'standard',\n starRating,\n platform,\n logo,\n className,\n ...props\n },\n ref,\n ) => {\n const showMedia = media || mediaSrc;\n const effectiveOrientation = featuredVariant === 'spotlight' ? 'vertical' : orientation;\n\n return (\n <SectionShell\n ref={ref}\n padding=\"md\"\n className={clsx('ds-social-featured-section', className)}\n {...props}\n >\n <div\n className={clsx(\n 'ds-social-featured',\n `ds-social-featured--${effectiveOrientation}`,\n `ds-social-featured--${featuredVariant}`,\n )}\n >\n {/* Media Side */}\n {showMedia && featuredVariant !== 'spotlight' && (\n <div className=\"ds-social-featured__media\">\n {media ? (\n media\n ) : (\n <>\n <img\n src={mediaSrc || 'https://placehold.co/1920x1080/111/FFF?text=Video+Case+Study'}\n alt={`Case study by ${author.name}`}\n style={{ width: '100%', height: '100%', objectFit: 'cover' }}\n />\n <div className=\"ds-social-card__play\">\n <PlayIconLarge />\n </div>\n </>\n )}\n </div>\n )}\n\n {/* Content Side */}\n <div className=\"ds-social-featured__content\">\n {logo && (\n <div className=\"ds-social-featured__logo\">{logo}</div>\n )}\n\n <blockquote className=\"ds-social-featured__quote\">&ldquo;{quote}&rdquo;</blockquote>\n\n <div className=\"ds-social-featured__author-large\">\n {author.avatar && (\n <div className=\"ds-social-card__avatar\">\n <img src={author.avatar} alt={author.name} />\n </div>\n )}\n <div className=\"ds-social-card__meta\">\n <span className=\"ds-social-card__name\">{author.name}</span>\n <span className=\"ds-social-card__role\">\n {author.role}{author.role && author.company && ', '}{author.company}\n </span>\n </div>\n </div>\n\n {/* Rating & Platform */}\n {(starRating != null || platform) && (\n <div className=\"ds-social-featured__trust\">\n {starRating != null && <StarRating value={starRating} size=\"md\" showValue />}\n {platform && <PlatformBadge platform={platform} variant=\"icon-label\" size=\"md\" />}\n </div>\n )}\n </div>\n </div>\n </SectionShell>\n );\n },\n);\n\nSocialProofFeatured.displayName = 'SocialProofFeatured';\n","import { forwardRef } from 'react';\nimport clsx from 'clsx';\nimport { motion } from 'framer-motion';\nimport { SectionShell, SectionShellProps } from '../SectionShell/SectionShell';\nimport { VARIANTS } from '../../tokens/motion';\nimport './SocialProof.css';\n\nexport interface SocialProofCarouselProps extends SectionShellProps {\n children: React.ReactNode;\n}\n\nexport const SocialProofCarousel = forwardRef<HTMLDivElement, SocialProofCarouselProps>(\n ({ children, className, ...props }, ref) => {\n return (\n <SectionShell\n ref={ref}\n padding=\"none\"\n containerFluid\n className={clsx('ds-social-carousel', className)}\n {...props}\n >\n <motion.div\n className=\"ds-social-carousel__track\"\n variants={VARIANTS.fadeIn}\n initial=\"hidden\"\n whileInView=\"visible\"\n viewport={{ once: true, margin: '-10%' }}\n >\n {children}\n {/* Duplicate children for infinite scroll illusion */}\n {children}\n </motion.div>\n </SectionShell>\n );\n },\n);\n\nSocialProofCarousel.displayName = 'SocialProofCarousel';\n","/* ============================================================================\n MOTION TOKENS & FRAMER CONFIG\n ============================================================================ */\n\n/**\n * Duration tokens (seconds) for Framer Motion\n */\nexport const DURATION = {\n micro: 0.15, // 150ms\n short: 0.25, // 250ms\n medium: 0.5, // 500ms\n long: 1.0, // 1000ms\n} as const;\n\n/**\n * Easing definitions (cubic-bezier arrays) for Framer Motion\n */\nexport const EASING = {\n standard: [0.16, 1, 0.3, 1], // Smooth, premium feel\n emphasis: [0.34, 1.56, 0.64, 1], // Slight spring/overshoot\n exit: [0.4, 0, 0.2, 1], // Quick, decisive exit\n linear: [0, 0, 1, 1],\n} as const;\n\n/**\n * Standard transitions for Framer Motion\n */\nexport const TRANSITION = {\n standard: {\n duration: DURATION.medium,\n ease: EASING.standard,\n },\n emphasis: {\n duration: DURATION.medium,\n ease: EASING.emphasis,\n },\n quick: {\n duration: DURATION.short,\n ease: EASING.standard,\n },\n spring: {\n type: 'spring',\n stiffness: 200,\n damping: 20,\n },\n} as const;\n\n/**\n * Reusable Variants for Framer Motion\n */\nexport const VARIANTS = {\n fadeIn: {\n hidden: { opacity: 0 },\n visible: { opacity: 1, transition: { duration: DURATION.medium, ease: EASING.standard } },\n },\n fadeUp: {\n hidden: { opacity: 0, y: 12 },\n visible: { opacity: 1, y: 0, transition: { duration: DURATION.medium, ease: EASING.standard } },\n },\n scaleIn: {\n hidden: { opacity: 0, scale: 0.95 },\n visible: {\n opacity: 1,\n scale: 1,\n transition: { duration: DURATION.short, ease: EASING.emphasis },\n },\n },\n staggerContainer: {\n hidden: { opacity: 0 },\n visible: {\n opacity: 1,\n transition: {\n staggerChildren: 0.08,\n delayChildren: 0.1,\n },\n },\n },\n pulse: {\n hidden: { scale: 1 },\n visible: {\n scale: [1, 1.05, 1],\n transition: { duration: 1.5, repeat: Infinity, ease: 'easeInOut' },\n },\n },\n impact: {\n hidden: { scale: 1 },\n trigger: {\n scale: [1, 0.95, 1.05, 1],\n transition: { duration: 0.4, ease: 'backOut' },\n },\n },\n} as const;\n\n/**\n * Layout Tokens\n */\nexport const DISTANCE = {\n sm: 4,\n md: 12,\n lg: 24,\n xl: 48,\n} as const;\n\nexport const MOTION = {\n DURATION,\n EASING,\n TRANSITION,\n VARIANTS,\n DISTANCE,\n} as const;\n","import clsx from 'clsx';\nimport { SectionShell } from '../SectionShell';\n\nexport interface VerticalVideoGridProps {\n /** Array of YouTube Shorts URLs (e.g. https://www.youtube.com/shorts/xxxxx) */\n urls: string[];\n /** Optional class name */\n className?: string;\n}\n\nfunction getShortsEmbedUrl(url: string): string {\n // Extract ID from shorts url like https://www.youtube.com/shorts/_Ot6bpzzovU\n const match = url.match(/(?:youtube\\.com\\/shorts\\/|youtu\\.be\\/|youtube\\.com\\/embed\\/)([a-zA-Z0-9_-]+)/);\n if (match) {\n // Add rel=0 and loop/playlist to ensure it stays focused on the content\n return `https://www.youtube-nocookie.com/embed/${match[1]}?rel=0&modestbranding=1&playsinline=1&controls=1`;\n }\n // Try to use youtube-nocookie for all iframes to prevent block issues\n return url.replace('youtube.com', 'youtube-nocookie.com') + (url.includes('?') ? '&' : '?') + 'rel=0&modestbranding=1&playsinline=1';\n}\n\n/**\n * Grid component optimized for displaying vertical 9:16 videos (YouTube Shorts, TikToks, Reels)\n */\nexport function VerticalVideoGrid({ urls, className }: VerticalVideoGridProps) {\n if (!urls || urls.length === 0) return null;\n\n return (\n <SectionShell className={clsx('ds-vertical-video-grid my-16', className)}>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4 md:gap-6 max-w-6xl mx-auto\">\n {urls.map((url, i) => (\n <div \n key={i} \n className=\"relative w-full overflow-hidden rounded-[20px] shadow-lg border border-white/10 bg-black\"\n style={{ aspectRatio: '9/16' }}\n >\n <iframe\n src={getShortsEmbedUrl(url)}\n title={`Short testimonial ${i + 1}`}\n className=\"absolute inset-0 w-full h-full\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n allowFullScreen\n loading=\"lazy\"\n />\n </div>\n ))}\n </div>\n </SectionShell>\n );\n}\n","import { SocialProofCard } from './Card';\nimport { SocialProofGrid } from './Grid';\nimport { SocialProofLogos } from './Logos';\nimport { SocialProofFeatured } from './Featured';\nimport { SocialProofCarousel } from './Carousel';\nimport { VerticalVideoGrid } from './VerticalVideoGrid';\n\nexport const SocialProof = {\n Card: SocialProofCard,\n Grid: SocialProofGrid,\n Logos: SocialProofLogos,\n Featured: SocialProofFeatured,\n Carousel: SocialProofCarousel,\n VerticalGrid: VerticalVideoGrid,\n};\n\nexport * from './Card';\nexport * from './Grid';\nexport * from './Logos';\nexport * from './Featured';\nexport * from './Carousel';\nexport * from './VerticalVideoGrid';\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","import React, { forwardRef, useEffect, useRef, useState } from 'react';\nimport clsx from 'clsx';\nimport './MetricCounter.css';\n\nexport interface MetricCounterProps extends React.HTMLAttributes<HTMLDivElement> {\n /** The target number to count up to */\n value: number;\n /** Optional prefix (e.g. \"$\", \"+\") */\n prefix?: string;\n /** Optional suffix (e.g. \"%\", \"M\") */\n suffix?: string;\n /** Duration of the animation in milliseconds (default: 1500) */\n duration?: number;\n /** Number of decimal places to show (default: 0) */\n decimals?: number;\n /** A label to display below the number */\n label?: React.ReactNode;\n}\n\n/**\n * An animated counter for displaying key metrics and social proof.\n * Uses requestAnimationFrame for smooth counting and IntersectionObserver\n * to trigger only when visible. Respects prefers-reduced-motion.\n */\nexport const MetricCounter = forwardRef<HTMLDivElement, MetricCounterProps>(\n (\n {\n value,\n prefix = '',\n suffix = '',\n duration = 1500,\n decimals = 0,\n label,\n className,\n ...props\n },\n ref\n ) => {\n const [displayValue, setDisplayValue] = useState(0);\n const [hasAnimated, setHasAnimated] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const prefersReducedMotion = useRef(false);\n\n useEffect(() => {\n prefersReducedMotion.current = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n \n if (prefersReducedMotion.current) {\n setDisplayValue(value);\n setHasAnimated(true);\n return;\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries[0].isIntersecting && !hasAnimated) {\n startAnimation();\n observer.disconnect();\n }\n },\n { threshold: 0.5 }\n );\n\n if (containerRef.current) {\n observer.observe(containerRef.current);\n }\n\n return () => observer.disconnect();\n // eslint-disable-next-line react-hooks/exhaustive-deps -- startAnimation is stable and intentionally omitted to avoid re-triggering\n }, [value, hasAnimated]);\n\n const startAnimation = () => {\n let startTime: number;\n setHasAnimated(true);\n\n const easeOutExpo = (t: number): number => {\n return t === 1 ? 1 : 1 - Math.pow(2, -10 * t);\n };\n\n const animate = (currentTime: number) => {\n if (!startTime) startTime = currentTime;\n const progress = Math.min((currentTime - startTime) / duration, 1);\n \n const currentMultiplier = easeOutExpo(progress);\n const nextValue = value * currentMultiplier;\n \n setDisplayValue(nextValue);\n\n if (progress < 1) {\n requestAnimationFrame(animate);\n } else {\n setDisplayValue(value);\n }\n };\n\n requestAnimationFrame(animate);\n };\n\n const formattedValue = displayValue.toLocaleString(undefined, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\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-metric-counter', className)}\n {...props}\n >\n <div className=\"ds-metric-counter__value-wrapper\">\n {prefix && <span className=\"ds-metric-counter__prefix\">{prefix}</span>}\n <span className=\"ds-metric-counter__value\">{formattedValue}</span>\n {suffix && <span className=\"ds-metric-counter__suffix\">{suffix}</span>}\n </div>\n {label && <div className=\"ds-metric-counter__label\">{label}</div>}\n </div>\n );\n }\n);\n\nMetricCounter.displayName = 'MetricCounter';\n"]}
1
+ {"version":3,"sources":[],"names":[],"mappings":""}
@@ -521,7 +521,7 @@
521
521
  font-size: var(--font-size-sm);
522
522
  color: var(--brand-pink);
523
523
  font-weight: var(--font-weight-medium);
524
- transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1);
524
+ transition: color 0.3s cubic-bezier(0.16, 1, 0.3, 1), transform 0.3s cubic-bezier(0.16, 1, 0.3, 1);
525
525
  display: inline-flex;
526
526
  align-items: center;
527
527
  gap: var(--space-1);
@@ -765,7 +765,10 @@
765
765
  .ds-social-logos__item {
766
766
  opacity: 0.5;
767
767
  filter: grayscale(100%);
768
- transition: all var(--transition-base);
768
+ transition:
769
+ opacity var(--transition-base),
770
+ filter var(--transition-base),
771
+ transform var(--transition-base);
769
772
  max-width: 160px;
770
773
  display: flex;
771
774
  align-items: center;
@@ -801,7 +804,11 @@
801
804
  backdrop-filter: blur(8px);
802
805
  white-space: nowrap;
803
806
  pointer-events: none;
804
- transition: all var(--transition-base);
807
+ transition:
808
+ opacity var(--transition-base),
809
+ background var(--transition-base),
810
+ color var(--transition-base),
811
+ border-color var(--transition-base);
805
812
  opacity: 0.8;
806
813
  }
807
814
  .ds-social-logos__item:hover .ds-social-logos__badge {