@salesmind-ai/design-system 0.3.2 → 0.3.4

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 (215) hide show
  1. package/dist/{SectionShell-BfBw5q0Y.d.cts → SectionShell-GlglHCzz.d.cts} +1 -0
  2. package/dist/{SectionShell-BfBw5q0Y.d.ts → SectionShell-GlglHCzz.d.ts} +1 -0
  3. package/dist/StatsSection-B8iD9L-o.d.ts +68 -0
  4. package/dist/StatsSection-wgd8Vge1.d.cts +68 -0
  5. package/dist/admin/index.cjs +2928 -68
  6. package/dist/admin/index.cjs.map +1 -1
  7. package/dist/admin/index.js +2915 -5
  8. package/dist/admin/index.js.map +1 -1
  9. package/dist/blog/index.cjs +1064 -53
  10. package/dist/blog/index.cjs.map +1 -1
  11. package/dist/blog/index.d.cts +1 -1
  12. package/dist/blog/index.d.ts +1 -1
  13. package/dist/blog/index.js +1054 -8
  14. package/dist/blog/index.js.map +1 -1
  15. package/dist/charts/index.cjs +2694 -46
  16. package/dist/charts/index.cjs.map +1 -1
  17. package/dist/charts/index.js +2680 -3
  18. package/dist/charts/index.js.map +1 -1
  19. package/dist/core/index.cjs +4333 -807
  20. package/dist/core/index.cjs.map +1 -1
  21. package/dist/core/index.js +4130 -14
  22. package/dist/core/index.js.map +1 -1
  23. package/dist/i18n/index.cjs +558 -86
  24. package/dist/i18n/index.cjs.map +1 -1
  25. package/dist/i18n/index.js +544 -1
  26. package/dist/i18n/index.js.map +1 -1
  27. package/dist/index.cjs +17140 -1432
  28. package/dist/index.cjs.map +1 -1
  29. package/dist/index.css +24 -13
  30. package/dist/index.css.map +1 -1
  31. package/dist/index.d.cts +2 -2
  32. package/dist/index.d.ts +2 -2
  33. package/dist/index.js +16785 -31
  34. package/dist/index.js.map +1 -1
  35. package/dist/marketing/index.cjs +3072 -142
  36. package/dist/marketing/index.cjs.map +1 -1
  37. package/dist/marketing/index.d.cts +1 -1
  38. package/dist/marketing/index.d.ts +1 -1
  39. package/dist/marketing/index.js +3042 -11
  40. package/dist/marketing/index.js.map +1 -1
  41. package/dist/motion/index.cjs +1222 -26
  42. package/dist/motion/index.cjs.map +1 -1
  43. package/dist/motion/index.js +1215 -2
  44. package/dist/motion/index.js.map +1 -1
  45. package/dist/nav/index.cjs +1518 -101
  46. package/dist/nav/index.cjs.map +1 -1
  47. package/dist/nav/index.css +24 -13
  48. package/dist/nav/index.css.map +1 -1
  49. package/dist/nav/index.js +1498 -4
  50. package/dist/nav/index.js.map +1 -1
  51. package/dist/report/index.cjs +2403 -171
  52. package/dist/report/index.cjs.map +1 -1
  53. package/dist/report/index.js +2363 -3
  54. package/dist/report/index.js.map +1 -1
  55. package/dist/sections/index.cjs +382 -28
  56. package/dist/sections/index.cjs.map +1 -1
  57. package/dist/sections/index.d.cts +15 -69
  58. package/dist/sections/index.d.ts +15 -69
  59. package/dist/sections/index.js +376 -4
  60. package/dist/sections/index.js.map +1 -1
  61. package/dist/social-proof/index.cjs +1250 -53
  62. package/dist/social-proof/index.cjs.map +1 -1
  63. package/dist/social-proof/index.d.cts +1 -1
  64. package/dist/social-proof/index.d.ts +1 -1
  65. package/dist/social-proof/index.js +1235 -6
  66. package/dist/social-proof/index.js.map +1 -1
  67. package/dist/theme/index.cjs +565 -38
  68. package/dist/theme/index.cjs.map +1 -1
  69. package/dist/theme/index.js +555 -2
  70. package/dist/theme/index.js.map +1 -1
  71. package/dist/web/client/index.cjs +491 -38
  72. package/dist/web/client/index.cjs.map +1 -1
  73. package/dist/web/client/index.js +483 -4
  74. package/dist/web/client/index.js.map +1 -1
  75. package/dist/web/index.cjs +1346 -158
  76. package/dist/web/index.cjs.map +1 -1
  77. package/dist/web/index.js +1305 -9
  78. package/dist/web/index.js.map +1 -1
  79. package/dist/web/server/index.cjs +563 -26
  80. package/dist/web/server/index.cjs.map +1 -1
  81. package/dist/web/server/index.js +560 -1
  82. package/dist/web/server/index.js.map +1 -1
  83. package/package.json +11 -1
  84. package/dist/chunk-2GARWEJK.js +0 -17
  85. package/dist/chunk-2GARWEJK.js.map +0 -1
  86. package/dist/chunk-3NKRFUAR.js +0 -37
  87. package/dist/chunk-3NKRFUAR.js.map +0 -1
  88. package/dist/chunk-3TGSIILM.cjs +0 -201
  89. package/dist/chunk-3TGSIILM.cjs.map +0 -1
  90. package/dist/chunk-4GM5BGBN.cjs +0 -801
  91. package/dist/chunk-4GM5BGBN.cjs.map +0 -1
  92. package/dist/chunk-5LGDEZWY.cjs +0 -2434
  93. package/dist/chunk-5LGDEZWY.cjs.map +0 -1
  94. package/dist/chunk-6H4DSTXR.js +0 -786
  95. package/dist/chunk-6H4DSTXR.js.map +0 -1
  96. package/dist/chunk-6UNG76Y2.js +0 -153
  97. package/dist/chunk-6UNG76Y2.js.map +0 -1
  98. package/dist/chunk-7PX2AZ6Y.js +0 -39
  99. package/dist/chunk-7PX2AZ6Y.js.map +0 -1
  100. package/dist/chunk-B6AVAX4F.js +0 -1415
  101. package/dist/chunk-B6AVAX4F.js.map +0 -1
  102. package/dist/chunk-BILT5KD3.js +0 -264
  103. package/dist/chunk-BILT5KD3.js.map +0 -1
  104. package/dist/chunk-C2BCDNAV.js +0 -24
  105. package/dist/chunk-C2BCDNAV.js.map +0 -1
  106. package/dist/chunk-CH42VPWE.cjs +0 -421
  107. package/dist/chunk-CH42VPWE.cjs.map +0 -1
  108. package/dist/chunk-CJ2MKVAF.cjs +0 -46
  109. package/dist/chunk-CJ2MKVAF.cjs.map +0 -1
  110. package/dist/chunk-DP74LUXG.cjs +0 -98
  111. package/dist/chunk-DP74LUXG.cjs.map +0 -1
  112. package/dist/chunk-E7D6EKJ4.cjs +0 -44
  113. package/dist/chunk-E7D6EKJ4.cjs.map +0 -1
  114. package/dist/chunk-ECXBTUH6.cjs +0 -584
  115. package/dist/chunk-ECXBTUH6.cjs.map +0 -1
  116. package/dist/chunk-EFRAP5ES.js +0 -157
  117. package/dist/chunk-EFRAP5ES.js.map +0 -1
  118. package/dist/chunk-F6YYWMME.js +0 -485
  119. package/dist/chunk-F6YYWMME.js.map +0 -1
  120. package/dist/chunk-FAFAP4L5.js +0 -183
  121. package/dist/chunk-FAFAP4L5.js.map +0 -1
  122. package/dist/chunk-GUZIMHWS.js +0 -1608
  123. package/dist/chunk-GUZIMHWS.js.map +0 -1
  124. package/dist/chunk-H2Y6BSTL.cjs +0 -69
  125. package/dist/chunk-H2Y6BSTL.cjs.map +0 -1
  126. package/dist/chunk-HN4PHABT.js +0 -126
  127. package/dist/chunk-HN4PHABT.js.map +0 -1
  128. package/dist/chunk-HRENHNDJ.js +0 -211
  129. package/dist/chunk-HRENHNDJ.js.map +0 -1
  130. package/dist/chunk-I75BFEYT.cjs +0 -2561
  131. package/dist/chunk-I75BFEYT.cjs.map +0 -1
  132. package/dist/chunk-IFRATNLU.js +0 -562
  133. package/dist/chunk-IFRATNLU.js.map +0 -1
  134. package/dist/chunk-IYPXJ6YC.cjs +0 -69
  135. package/dist/chunk-IYPXJ6YC.cjs.map +0 -1
  136. package/dist/chunk-JPJN4YBC.js +0 -409
  137. package/dist/chunk-JPJN4YBC.js.map +0 -1
  138. package/dist/chunk-KBA2LFBG.js +0 -62
  139. package/dist/chunk-KBA2LFBG.js.map +0 -1
  140. package/dist/chunk-KCKUSU2M.cjs +0 -166
  141. package/dist/chunk-KCKUSU2M.cjs.map +0 -1
  142. package/dist/chunk-KJ2OXQF4.js +0 -287
  143. package/dist/chunk-KJ2OXQF4.js.map +0 -1
  144. package/dist/chunk-KNQEIU7O.cjs +0 -1202
  145. package/dist/chunk-KNQEIU7O.cjs.map +0 -1
  146. package/dist/chunk-KVGSVGRK.cjs +0 -569
  147. package/dist/chunk-KVGSVGRK.cjs.map +0 -1
  148. package/dist/chunk-L352JRV6.cjs +0 -105
  149. package/dist/chunk-L352JRV6.cjs.map +0 -1
  150. package/dist/chunk-LJADZITX.cjs +0 -298
  151. package/dist/chunk-LJADZITX.cjs.map +0 -1
  152. package/dist/chunk-LMJPWXTZ.cjs +0 -194
  153. package/dist/chunk-LMJPWXTZ.cjs.map +0 -1
  154. package/dist/chunk-LOWEAQST.js +0 -701
  155. package/dist/chunk-LOWEAQST.js.map +0 -1
  156. package/dist/chunk-MDB2WCRQ.cjs +0 -137
  157. package/dist/chunk-MDB2WCRQ.cjs.map +0 -1
  158. package/dist/chunk-MQDEE7HC.cjs +0 -283
  159. package/dist/chunk-MQDEE7HC.cjs.map +0 -1
  160. package/dist/chunk-MQRB634A.cjs +0 -34
  161. package/dist/chunk-MQRB634A.cjs.map +0 -1
  162. package/dist/chunk-MTI27RDV.js +0 -185
  163. package/dist/chunk-MTI27RDV.js.map +0 -1
  164. package/dist/chunk-MU6GW5ZV.js +0 -2317
  165. package/dist/chunk-MU6GW5ZV.js.map +0 -1
  166. package/dist/chunk-NN3TUHIH.js +0 -28
  167. package/dist/chunk-NN3TUHIH.js.map +0 -1
  168. package/dist/chunk-NT4LBP7D.cjs +0 -111
  169. package/dist/chunk-NT4LBP7D.cjs.map +0 -1
  170. package/dist/chunk-OLV7OD3X.cjs +0 -502
  171. package/dist/chunk-OLV7OD3X.cjs.map +0 -1
  172. package/dist/chunk-OXNXEQY7.js +0 -2538
  173. package/dist/chunk-OXNXEQY7.js.map +0 -1
  174. package/dist/chunk-P5BOFE5A.js +0 -546
  175. package/dist/chunk-P5BOFE5A.js.map +0 -1
  176. package/dist/chunk-Q2MFGYTE.cjs +0 -1449
  177. package/dist/chunk-Q2MFGYTE.cjs.map +0 -1
  178. package/dist/chunk-Q75DBVDY.cjs +0 -68
  179. package/dist/chunk-Q75DBVDY.cjs.map +0 -1
  180. package/dist/chunk-REQ5Q6ZI.js +0 -1022
  181. package/dist/chunk-REQ5Q6ZI.js.map +0 -1
  182. package/dist/chunk-SICKWUWB.js +0 -62
  183. package/dist/chunk-SICKWUWB.js.map +0 -1
  184. package/dist/chunk-T343CCH5.js +0 -1190
  185. package/dist/chunk-T343CCH5.js.map +0 -1
  186. package/dist/chunk-TEC62D4A.cjs +0 -1624
  187. package/dist/chunk-TEC62D4A.cjs.map +0 -1
  188. package/dist/chunk-TW5JB35D.js +0 -2122
  189. package/dist/chunk-TW5JB35D.js.map +0 -1
  190. package/dist/chunk-VC5LMUVQ.cjs +0 -20
  191. package/dist/chunk-VC5LMUVQ.cjs.map +0 -1
  192. package/dist/chunk-VM7WFMKI.cjs +0 -76
  193. package/dist/chunk-VM7WFMKI.cjs.map +0 -1
  194. package/dist/chunk-W2WTP6HS.cjs +0 -233
  195. package/dist/chunk-W2WTP6HS.cjs.map +0 -1
  196. package/dist/chunk-WH7PYHZY.cjs +0 -35
  197. package/dist/chunk-WH7PYHZY.cjs.map +0 -1
  198. package/dist/chunk-XQZVY7JJ.cjs +0 -717
  199. package/dist/chunk-XQZVY7JJ.cjs.map +0 -1
  200. package/dist/chunk-XU3OMQ7V.js +0 -98
  201. package/dist/chunk-XU3OMQ7V.js.map +0 -1
  202. package/dist/chunk-XWPDRMZG.js +0 -62
  203. package/dist/chunk-XWPDRMZG.js.map +0 -1
  204. package/dist/chunk-Y3CPKNB7.js +0 -67
  205. package/dist/chunk-Y3CPKNB7.js.map +0 -1
  206. package/dist/chunk-YNVRDD2P.js +0 -98
  207. package/dist/chunk-YNVRDD2P.js.map +0 -1
  208. package/dist/chunk-YSYR54XR.js +0 -92
  209. package/dist/chunk-YSYR54XR.js.map +0 -1
  210. package/dist/chunk-YTYDQBVY.cjs +0 -162
  211. package/dist/chunk-YTYDQBVY.cjs.map +0 -1
  212. package/dist/chunk-ZDLOA2UT.cjs +0 -1042
  213. package/dist/chunk-ZDLOA2UT.cjs.map +0 -1
  214. package/dist/chunk-ZWUKRCOJ.cjs +0 -2162
  215. package/dist/chunk-ZWUKRCOJ.cjs.map +0 -1
@@ -1,116 +1,1533 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkZDLOA2UT_cjs = require('../chunk-ZDLOA2UT.cjs');
5
- var chunkNT4LBP7D_cjs = require('../chunk-NT4LBP7D.cjs');
6
- var chunkLJADZITX_cjs = require('../chunk-LJADZITX.cjs');
7
- require('../chunk-MDB2WCRQ.cjs');
4
+ var React4 = require('react');
5
+ var clsx = require('clsx');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+ var reactSlot = require('@radix-ui/react-slot');
8
8
 
9
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
10
 
11
+ var React4__default = /*#__PURE__*/_interopDefault(React4);
12
+ var clsx__default = /*#__PURE__*/_interopDefault(clsx);
10
13
 
11
- Object.defineProperty(exports, "LocaleDropdown", {
12
- enumerable: true,
13
- get: function () { return chunkZDLOA2UT_cjs.LocaleDropdown; }
14
+ // src/components/NavbarV2/NavbarV2.tsx
15
+ var ChevronDown = () => /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "8", height: "8", viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ jsxRuntime.jsx(
16
+ "path",
17
+ {
18
+ d: "M4 6L8 10L12 6",
19
+ stroke: "currentColor",
20
+ strokeWidth: "1.5",
21
+ strokeLinecap: "round",
22
+ strokeLinejoin: "round"
23
+ }
24
+ ) });
25
+ var ScrollContext = React4.createContext({ scrolled: false });
26
+ var TabsContext = React4.createContext({
27
+ activeMenuId: null,
28
+ openMenu: () => {
29
+ },
30
+ closeMenu: () => {
31
+ }
14
32
  });
15
- Object.defineProperty(exports, "MDXOutboundLink", {
16
- enumerable: true,
17
- get: function () { return chunkZDLOA2UT_cjs.MDXOutboundLink; }
18
- });
19
- Object.defineProperty(exports, "NavbarMegaMenu", {
20
- enumerable: true,
21
- get: function () { return chunkZDLOA2UT_cjs.NavbarMegaMenu; }
22
- });
23
- Object.defineProperty(exports, "NavbarMegaMenuItem", {
24
- enumerable: true,
25
- get: function () { return chunkZDLOA2UT_cjs.NavbarMegaMenuItem; }
26
- });
27
- Object.defineProperty(exports, "NavbarMegaMenuSection", {
28
- enumerable: true,
29
- get: function () { return chunkZDLOA2UT_cjs.NavbarMegaMenuSection; }
30
- });
31
- Object.defineProperty(exports, "NavbarMobileActions", {
32
- enumerable: true,
33
- get: function () { return chunkZDLOA2UT_cjs.NavbarMobileActions; }
34
- });
35
- Object.defineProperty(exports, "NavbarMobileNavItem", {
36
- enumerable: true,
37
- get: function () { return chunkZDLOA2UT_cjs.NavbarMobileNavItem; }
38
- });
39
- Object.defineProperty(exports, "NavbarMobileSeparator", {
40
- enumerable: true,
41
- get: function () { return chunkZDLOA2UT_cjs.NavbarMobileSeparator; }
42
- });
43
- Object.defineProperty(exports, "NavbarV2", {
44
- enumerable: true,
45
- get: function () { return chunkZDLOA2UT_cjs.NavbarV2; }
46
- });
47
- Object.defineProperty(exports, "NavbarV2Actions", {
48
- enumerable: true,
49
- get: function () { return chunkZDLOA2UT_cjs.NavbarV2Actions; }
50
- });
51
- Object.defineProperty(exports, "NavbarV2Brand", {
52
- enumerable: true,
53
- get: function () { return chunkZDLOA2UT_cjs.NavbarV2Brand; }
54
- });
55
- Object.defineProperty(exports, "NavbarV2Tab", {
56
- enumerable: true,
57
- get: function () { return chunkZDLOA2UT_cjs.NavbarV2Tab; }
58
- });
59
- Object.defineProperty(exports, "NavbarV2TabMenu", {
60
- enumerable: true,
61
- get: function () { return chunkZDLOA2UT_cjs.NavbarV2TabMenu; }
62
- });
63
- Object.defineProperty(exports, "NavbarV2Tabs", {
64
- enumerable: true,
65
- get: function () { return chunkZDLOA2UT_cjs.NavbarV2Tabs; }
66
- });
67
- Object.defineProperty(exports, "SiteFooter", {
68
- enumerable: true,
69
- get: function () { return chunkZDLOA2UT_cjs.SiteFooter; }
70
- });
71
- Object.defineProperty(exports, "Breadcrumb", {
72
- enumerable: true,
73
- get: function () { return chunkNT4LBP7D_cjs.Breadcrumb; }
74
- });
75
- Object.defineProperty(exports, "BreadcrumbEllipsis", {
76
- enumerable: true,
77
- get: function () { return chunkNT4LBP7D_cjs.BreadcrumbEllipsis; }
78
- });
79
- Object.defineProperty(exports, "BreadcrumbItem", {
80
- enumerable: true,
81
- get: function () { return chunkNT4LBP7D_cjs.BreadcrumbItem; }
82
- });
83
- Object.defineProperty(exports, "BreadcrumbLink", {
84
- enumerable: true,
85
- get: function () { return chunkNT4LBP7D_cjs.BreadcrumbLink; }
86
- });
87
- Object.defineProperty(exports, "BreadcrumbList", {
88
- enumerable: true,
89
- get: function () { return chunkNT4LBP7D_cjs.BreadcrumbList; }
90
- });
91
- Object.defineProperty(exports, "BreadcrumbPage", {
92
- enumerable: true,
93
- get: function () { return chunkNT4LBP7D_cjs.BreadcrumbPage; }
33
+ function useFocusTrap(containerRef, active) {
34
+ React4.useEffect(() => {
35
+ if (!active || !containerRef.current) return;
36
+ const container = containerRef.current;
37
+ const FOCUSABLE = 'a[href], button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])';
38
+ const handleKeyDown = (e) => {
39
+ if (e.key !== "Tab") return;
40
+ const focusable2 = Array.from(container.querySelectorAll(FOCUSABLE));
41
+ if (focusable2.length === 0) {
42
+ e.preventDefault();
43
+ return;
44
+ }
45
+ const first = focusable2[0];
46
+ const last = focusable2[focusable2.length - 1];
47
+ if (e.shiftKey) {
48
+ if (document.activeElement === first) {
49
+ e.preventDefault();
50
+ last.focus();
51
+ }
52
+ } else {
53
+ if (document.activeElement === last) {
54
+ e.preventDefault();
55
+ first.focus();
56
+ }
57
+ }
58
+ };
59
+ const focusable = container.querySelectorAll(FOCUSABLE);
60
+ if (focusable.length > 0) {
61
+ focusable[0].focus();
62
+ }
63
+ container.addEventListener("keydown", handleKeyDown);
64
+ return () => container.removeEventListener("keydown", handleKeyDown);
65
+ }, [active, containerRef]);
66
+ }
67
+ var HYSTERESIS_RATIO = 0.25;
68
+ var NavbarV2 = React4.forwardRef(
69
+ ({
70
+ className,
71
+ mobileContent,
72
+ mobileToggleLabels,
73
+ isMenuOpen,
74
+ onMenuOpenChange,
75
+ scrollBorder = true,
76
+ scrollThreshold = 32,
77
+ children,
78
+ ...props
79
+ }, ref) => {
80
+ const [internalMenuOpen, setInternalMenuOpen] = React4.useState(false);
81
+ const isMobileMenuOpen = isMenuOpen !== void 0 ? isMenuOpen : internalMenuOpen;
82
+ const navRef = React4.useRef(null);
83
+ const overlayRef = React4.useRef(null);
84
+ const [navHeight, setNavHeight] = React4.useState(64);
85
+ const openLabel = mobileToggleLabels?.open ?? "Open menu";
86
+ const closeLabel = mobileToggleLabels?.close ?? "Close menu";
87
+ const [scrolled, setScrolled] = React4.useState(() => {
88
+ if (typeof window !== "undefined") {
89
+ return window.scrollY > scrollThreshold;
90
+ }
91
+ return false;
92
+ });
93
+ React4.useEffect(() => {
94
+ if (!scrollBorder) return;
95
+ const lowerBound = scrollThreshold * HYSTERESIS_RATIO;
96
+ const handleScroll = () => {
97
+ const y = window.scrollY;
98
+ setScrolled((prev) => {
99
+ if (!prev && y > scrollThreshold) return true;
100
+ if (prev && y < lowerBound) return false;
101
+ return prev;
102
+ });
103
+ };
104
+ handleScroll();
105
+ window.addEventListener("scroll", handleScroll, { passive: true });
106
+ return () => window.removeEventListener("scroll", handleScroll);
107
+ }, [scrollBorder, scrollThreshold]);
108
+ const isScrolled = scrollBorder && scrolled;
109
+ const scrollCtx = React4.useMemo(
110
+ () => ({ scrolled: isScrolled }),
111
+ [isScrolled]
112
+ );
113
+ const handleToggle = () => {
114
+ const newState = !isMobileMenuOpen;
115
+ setInternalMenuOpen(newState);
116
+ onMenuOpenChange?.(newState);
117
+ };
118
+ React4.useEffect(() => {
119
+ const el = navRef.current;
120
+ if (!el) return;
121
+ const observer = new ResizeObserver((entries) => {
122
+ for (const entry of entries) {
123
+ const h = entry.contentRect.height;
124
+ setNavHeight(h);
125
+ el.style.setProperty("--navbar-overlap", `${h}px`);
126
+ }
127
+ });
128
+ observer.observe(el);
129
+ return () => observer.disconnect();
130
+ }, []);
131
+ React4.useEffect(() => {
132
+ if (isMobileMenuOpen) {
133
+ document.body.style.overflow = "hidden";
134
+ return () => {
135
+ document.body.style.overflow = "";
136
+ };
137
+ }
138
+ }, [isMobileMenuOpen]);
139
+ React4.useEffect(() => {
140
+ if (!isMobileMenuOpen) return;
141
+ const handleEscape = (e) => {
142
+ if (e.key === "Escape") {
143
+ setInternalMenuOpen(false);
144
+ onMenuOpenChange?.(false);
145
+ }
146
+ };
147
+ document.addEventListener("keydown", handleEscape);
148
+ return () => document.removeEventListener("keydown", handleEscape);
149
+ }, [isMobileMenuOpen, onMenuOpenChange]);
150
+ useFocusTrap(overlayRef, isMobileMenuOpen);
151
+ const mergedRef = useMergedRef(ref, navRef);
152
+ return /* @__PURE__ */ jsxRuntime.jsx(ScrollContext.Provider, { value: scrollCtx, children: /* @__PURE__ */ jsxRuntime.jsxs(
153
+ "nav",
154
+ {
155
+ ref: mergedRef,
156
+ className: clsx__default.default(
157
+ "ds-navbar-v2",
158
+ isScrolled && "ds-navbar-v2--scrolled",
159
+ className
160
+ ),
161
+ ...props,
162
+ children: [
163
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-navbar-v2__container", children: [
164
+ children,
165
+ /* @__PURE__ */ jsxRuntime.jsx(
166
+ "button",
167
+ {
168
+ className: "ds-navbar-v2__toggle",
169
+ onClick: handleToggle,
170
+ "aria-label": isMobileMenuOpen ? closeLabel : openLabel,
171
+ "aria-expanded": isMobileMenuOpen,
172
+ children: isMobileMenuOpen ? /* @__PURE__ */ jsxRuntime.jsxs(
173
+ "svg",
174
+ {
175
+ width: "24",
176
+ height: "24",
177
+ viewBox: "0 0 24 24",
178
+ fill: "none",
179
+ stroke: "currentColor",
180
+ strokeWidth: "2",
181
+ strokeLinecap: "round",
182
+ strokeLinejoin: "round",
183
+ children: [
184
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
185
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
186
+ ]
187
+ }
188
+ ) : /* @__PURE__ */ jsxRuntime.jsxs(
189
+ "svg",
190
+ {
191
+ width: "24",
192
+ height: "24",
193
+ viewBox: "0 0 24 24",
194
+ fill: "none",
195
+ stroke: "currentColor",
196
+ strokeWidth: "2",
197
+ strokeLinecap: "round",
198
+ strokeLinejoin: "round",
199
+ children: [
200
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "3", y1: "12", x2: "21", y2: "12" }),
201
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "3", y1: "6", x2: "21", y2: "6" }),
202
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "3", y1: "18", x2: "21", y2: "18" })
203
+ ]
204
+ }
205
+ )
206
+ }
207
+ )
208
+ ] }),
209
+ /* @__PURE__ */ jsxRuntime.jsx(
210
+ "div",
211
+ {
212
+ ref: overlayRef,
213
+ className: "ds-navbar-v2__mobile-overlay",
214
+ style: { top: navHeight },
215
+ "data-state": isMobileMenuOpen ? "open" : "closed",
216
+ role: "dialog",
217
+ "aria-modal": "true",
218
+ "aria-label": closeLabel,
219
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-navbar-v2__mobile-content", children: mobileContent })
220
+ }
221
+ )
222
+ ]
223
+ }
224
+ ) });
225
+ }
226
+ );
227
+ NavbarV2.displayName = "NavbarV2";
228
+ var NavbarV2Brand = React4.forwardRef(
229
+ ({ as: Component = "a", className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(Component, { ref, className: clsx__default.default("ds-navbar-v2__brand", className), ...props, children })
230
+ );
231
+ NavbarV2Brand.displayName = "NavbarV2Brand";
232
+ var NavbarV2Tabs = React4.forwardRef(
233
+ ({ className, children, ...props }, ref) => {
234
+ const [activeMenuId, setActiveMenuId] = React4.useState(null);
235
+ const { scrolled } = React4.useContext(ScrollContext);
236
+ const ctxValue = React4.useMemo(
237
+ () => ({
238
+ activeMenuId,
239
+ openMenu: (id) => setActiveMenuId(id),
240
+ closeMenu: (id) => setActiveMenuId((prev) => prev === id ? null : prev)
241
+ }),
242
+ [activeMenuId]
243
+ );
244
+ return /* @__PURE__ */ jsxRuntime.jsx(TabsContext.Provider, { value: ctxValue, children: /* @__PURE__ */ jsxRuntime.jsx(
245
+ "div",
246
+ {
247
+ ref,
248
+ className: clsx__default.default(
249
+ "ds-navbar-v2__tabs",
250
+ scrolled && "ds-navbar-v2__tabs--demoted",
251
+ className
252
+ ),
253
+ ...props,
254
+ children
255
+ }
256
+ ) });
257
+ }
258
+ );
259
+ NavbarV2Tabs.displayName = "NavbarV2Tabs";
260
+ var NavbarV2Tab = React4.forwardRef(
261
+ ({ as: Component = "button", active, icon, label, className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
262
+ Component,
263
+ {
264
+ ref,
265
+ className: clsx__default.default("ds-navbar-v2__tab", active && "ds-navbar-v2__tab--active", className),
266
+ "aria-current": active ? "page" : void 0,
267
+ ...Component === "button" ? { type: "button" } : {},
268
+ ...props,
269
+ children: [
270
+ icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-navbar-v2__tab-icon", children: icon }),
271
+ label && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-navbar-v2__tab-label", children: label }),
272
+ children
273
+ ]
274
+ }
275
+ )
276
+ );
277
+ NavbarV2Tab.displayName = "NavbarV2Tab";
278
+ var NavbarV2TabMenu = React4.forwardRef(
279
+ ({
280
+ icon,
281
+ label,
282
+ active,
283
+ children,
284
+ className,
285
+ isOpen: controlledOpen,
286
+ onOpenChange
287
+ }, ref) => {
288
+ const instanceId = React4.useId();
289
+ const panelId = `navbar-v2-panel-${instanceId}`;
290
+ const { activeMenuId, openMenu, closeMenu } = React4.useContext(TabsContext);
291
+ const isControlled = controlledOpen !== void 0;
292
+ const isOpen = isControlled ? controlledOpen : activeMenuId === instanceId;
293
+ const containerRef = React4.useRef(null);
294
+ const triggerRef = React4.useRef(null);
295
+ const panelRef = React4.useRef(null);
296
+ const timeoutRef = React4.useRef(null);
297
+ const handleOpen = React4.useCallback(() => {
298
+ if (!isOpen) {
299
+ if (!isControlled) openMenu(instanceId);
300
+ onOpenChange?.(true);
301
+ }
302
+ }, [isOpen, isControlled, openMenu, instanceId, onOpenChange]);
303
+ const handleClose = React4.useCallback(() => {
304
+ if (isOpen) {
305
+ if (!isControlled) closeMenu(instanceId);
306
+ onOpenChange?.(false);
307
+ }
308
+ }, [isOpen, isControlled, closeMenu, instanceId, onOpenChange]);
309
+ const handleToggle = React4.useCallback(() => {
310
+ if (isOpen) handleClose();
311
+ else handleOpen();
312
+ }, [isOpen, handleClose, handleOpen]);
313
+ const handleMouseEnter = React4.useCallback(() => {
314
+ if (timeoutRef.current) {
315
+ window.clearTimeout(timeoutRef.current);
316
+ timeoutRef.current = null;
317
+ }
318
+ handleOpen();
319
+ }, [handleOpen]);
320
+ const handleMouseLeave = React4.useCallback(() => {
321
+ if (timeoutRef.current) window.clearTimeout(timeoutRef.current);
322
+ timeoutRef.current = window.setTimeout(handleClose, 150);
323
+ }, [handleClose]);
324
+ React4.useEffect(() => {
325
+ return () => {
326
+ if (timeoutRef.current) window.clearTimeout(timeoutRef.current);
327
+ };
328
+ }, []);
329
+ React4.useEffect(() => {
330
+ if (!isOpen) return;
331
+ const handleClickOutside = (event) => {
332
+ if (containerRef.current && !containerRef.current.contains(event.target) && triggerRef.current && !triggerRef.current.contains(event.target)) {
333
+ handleClose();
334
+ }
335
+ };
336
+ document.addEventListener("mousedown", handleClickOutside);
337
+ return () => document.removeEventListener("mousedown", handleClickOutside);
338
+ }, [isOpen, handleClose]);
339
+ React4.useEffect(() => {
340
+ if (!isOpen) return;
341
+ const handleEscape = (e) => {
342
+ if (e.key === "Escape") {
343
+ handleClose();
344
+ triggerRef.current?.focus();
345
+ }
346
+ };
347
+ document.addEventListener("keydown", handleEscape);
348
+ return () => document.removeEventListener("keydown", handleEscape);
349
+ }, [isOpen, handleClose]);
350
+ React4.useEffect(() => {
351
+ if (!isOpen || !panelRef.current) return;
352
+ const clampToViewport = () => {
353
+ const panel = panelRef.current;
354
+ if (!panel) return;
355
+ panel.style.setProperty("--panel-nudge", "0px");
356
+ const rect = panel.getBoundingClientRect();
357
+ const viewportWidth = window.innerWidth;
358
+ const EDGE_PADDING = 16;
359
+ if (rect.right > viewportWidth - EDGE_PADDING) {
360
+ const overflow = rect.right - (viewportWidth - EDGE_PADDING);
361
+ panel.style.setProperty("--panel-nudge", `${-overflow}px`);
362
+ } else if (rect.left < EDGE_PADDING) {
363
+ const overflow = EDGE_PADDING - rect.left;
364
+ panel.style.setProperty("--panel-nudge", `${overflow}px`);
365
+ }
366
+ };
367
+ requestAnimationFrame(clampToViewport);
368
+ window.addEventListener("resize", clampToViewport);
369
+ return () => window.removeEventListener("resize", clampToViewport);
370
+ }, [isOpen]);
371
+ const panelRefCallback = React4.useCallback((node) => {
372
+ containerRef.current = node;
373
+ panelRef.current = node;
374
+ }, []);
375
+ return /* @__PURE__ */ jsxRuntime.jsxs(
376
+ "div",
377
+ {
378
+ ref,
379
+ className: clsx__default.default("ds-navbar-v2__tab-menu", className),
380
+ onMouseEnter: handleMouseEnter,
381
+ onMouseLeave: handleMouseLeave,
382
+ children: [
383
+ /* @__PURE__ */ jsxRuntime.jsxs(
384
+ "button",
385
+ {
386
+ ref: triggerRef,
387
+ className: clsx__default.default(
388
+ "ds-navbar-v2__tab",
389
+ (active || isOpen) && "ds-navbar-v2__tab--active"
390
+ ),
391
+ onClick: handleToggle,
392
+ "aria-expanded": isOpen,
393
+ "aria-haspopup": "true",
394
+ "aria-controls": isOpen ? panelId : void 0,
395
+ type: "button",
396
+ children: [
397
+ icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-navbar-v2__tab-icon", children: icon }),
398
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ds-navbar-v2__tab-label-row", children: [
399
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-navbar-v2__tab-label", children: label }),
400
+ /* @__PURE__ */ jsxRuntime.jsx(
401
+ "span",
402
+ {
403
+ className: "ds-navbar-v2__tab-chevron",
404
+ "data-state": isOpen ? "open" : "closed",
405
+ children: /* @__PURE__ */ jsxRuntime.jsx(ChevronDown, {})
406
+ }
407
+ )
408
+ ] })
409
+ ]
410
+ }
411
+ ),
412
+ isOpen ? /* @__PURE__ */ jsxRuntime.jsx(
413
+ "div",
414
+ {
415
+ ref: panelRefCallback,
416
+ id: panelId,
417
+ className: "ds-navbar-v2__mega-panel",
418
+ "data-state": "open",
419
+ role: "region",
420
+ "aria-label": `${label} menu`,
421
+ children
422
+ }
423
+ ) : null
424
+ ]
425
+ }
426
+ );
427
+ }
428
+ );
429
+ NavbarV2TabMenu.displayName = "NavbarV2TabMenu";
430
+ var NavbarV2Actions = React4.forwardRef(
431
+ ({ className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: clsx__default.default("ds-navbar-v2__actions", className), ...props, children })
432
+ );
433
+ NavbarV2Actions.displayName = "NavbarV2Actions";
434
+ function useMergedRef(...refs) {
435
+ return React4.useCallback(
436
+ (value) => {
437
+ for (const ref of refs) {
438
+ if (typeof ref === "function") {
439
+ ref(value);
440
+ } else if (ref && typeof ref === "object") {
441
+ ref.current = value;
442
+ }
443
+ }
444
+ },
445
+ // eslint-disable-next-line react-hooks/exhaustive-deps
446
+ refs
447
+ );
448
+ }
449
+ var NavbarMobileNavItem = React4.forwardRef(
450
+ ({ as: Component = "a", className, active, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
451
+ Component,
452
+ {
453
+ ref,
454
+ className: clsx__default.default(
455
+ "ds-navbar__mobile-nav-item",
456
+ active && "ds-navbar__mobile-nav-item--active",
457
+ className
458
+ ),
459
+ "aria-current": active ? "page" : void 0,
460
+ ...props,
461
+ children
462
+ }
463
+ )
464
+ );
465
+ NavbarMobileNavItem.displayName = "NavbarMobileNavItem";
466
+ function NavbarMobileSeparator({ className }) {
467
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: clsx__default.default("ds-navbar__mobile-separator", className), role: "separator" });
468
+ }
469
+ NavbarMobileSeparator.displayName = "NavbarMobileSeparator";
470
+ var NavbarMobileActions = React4.forwardRef(
471
+ ({ className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: clsx__default.default("ds-navbar__mobile-actions", className), ...props, children })
472
+ );
473
+ NavbarMobileActions.displayName = "NavbarMobileActions";
474
+
475
+ // src/tokens/spacing.ts
476
+ var SPACING = {
477
+ 1: "var(--space-1)",
478
+ 2: "var(--space-2)",
479
+ 3: "var(--space-3)",
480
+ 4: "var(--space-4)",
481
+ 5: "var(--space-5)",
482
+ 6: "var(--space-6)",
483
+ 8: "var(--space-8)",
484
+ 10: "var(--space-10)",
485
+ 12: "var(--space-12)",
486
+ 16: "var(--space-16)",
487
+ 20: "var(--space-20)"
488
+ };
489
+
490
+ // src/components/LayoutPrimitives/utils.ts
491
+ var SPACING_ALIASES = {
492
+ xs: "var(--space-2)",
493
+ sm: "var(--space-3)",
494
+ md: "var(--space-4)",
495
+ lg: "var(--space-6)",
496
+ xl: "var(--space-8)",
497
+ "2xl": "var(--space-12)"
498
+ };
499
+ function resolveSpacing(value) {
500
+ if (value === void 0) return void 0;
501
+ if (typeof value === "number" && SPACING[value]) {
502
+ return SPACING[value];
503
+ }
504
+ if (typeof value === "string" && value in SPACING_ALIASES) {
505
+ return SPACING_ALIASES[value];
506
+ }
507
+ return String(value);
508
+ }
509
+ function extractSpacingStyles(props) {
510
+ const styles = {};
511
+ if (props.m !== void 0) styles.margin = resolveSpacing(props.m);
512
+ if (props.mt !== void 0) styles.marginTop = resolveSpacing(props.mt);
513
+ if (props.mb !== void 0) styles.marginBottom = resolveSpacing(props.mb);
514
+ if (props.ml !== void 0) styles.marginLeft = resolveSpacing(props.ml);
515
+ if (props.mr !== void 0) styles.marginRight = resolveSpacing(props.mr);
516
+ if (props.mx !== void 0) {
517
+ styles.marginLeft = resolveSpacing(props.mx);
518
+ styles.marginRight = resolveSpacing(props.mx);
519
+ }
520
+ if (props.my !== void 0) {
521
+ styles.marginTop = resolveSpacing(props.my);
522
+ styles.marginBottom = resolveSpacing(props.my);
523
+ }
524
+ if (props.p !== void 0) styles.padding = resolveSpacing(props.p);
525
+ if (props.pt !== void 0) styles.paddingTop = resolveSpacing(props.pt);
526
+ if (props.pb !== void 0) styles.paddingBottom = resolveSpacing(props.pb);
527
+ if (props.pl !== void 0) styles.paddingLeft = resolveSpacing(props.pl);
528
+ if (props.pr !== void 0) styles.paddingRight = resolveSpacing(props.pr);
529
+ if (props.px !== void 0) {
530
+ styles.paddingLeft = resolveSpacing(props.px);
531
+ styles.paddingRight = resolveSpacing(props.px);
532
+ }
533
+ if (props.py !== void 0) {
534
+ styles.paddingTop = resolveSpacing(props.py);
535
+ styles.paddingBottom = resolveSpacing(props.py);
536
+ }
537
+ if (props.gap !== void 0) styles.gap = resolveSpacing(props.gap);
538
+ return styles;
539
+ }
540
+ var Box = React4.forwardRef(
541
+ ({ as: Component = "div", className, style, children, ...props }, ref) => {
542
+ const spacingStyles = extractSpacingStyles(props);
543
+ const { m, mt, mb, ml, mr, mx, my, p, pt, pb, pl, pr, px, py, gap, ...domProps } = props;
544
+ return /* @__PURE__ */ jsxRuntime.jsx(
545
+ Component,
546
+ {
547
+ ref,
548
+ className: clsx__default.default("ds-box", className),
549
+ style: { ...spacingStyles, ...style },
550
+ ...domProps,
551
+ children
552
+ }
553
+ );
554
+ }
555
+ );
556
+ Box.displayName = "Box";
557
+ var CONTAINER_SIZE_MAP = {
558
+ sm: "768px",
559
+ // 48rem — max-w-3xl
560
+ md: "1024px",
561
+ // 64rem — max-w-5xl
562
+ lg: "1152px",
563
+ // 72rem — max-w-6xl
564
+ xl: "1280px",
565
+ // 80rem — max-w-7xl
566
+ full: "100%"
567
+ };
568
+ var Container = React4.forwardRef(
569
+ ({ size, fluid, maxWidth, className, style, ...props }, ref) => {
570
+ let resolvedMaxWidth;
571
+ if (fluid) {
572
+ resolvedMaxWidth = "100%";
573
+ } else if (size) {
574
+ resolvedMaxWidth = CONTAINER_SIZE_MAP[size];
575
+ } else {
576
+ resolvedMaxWidth = maxWidth || "var(--container-default-max, 1200px)";
577
+ }
578
+ return /* @__PURE__ */ jsxRuntime.jsx(
579
+ Box,
580
+ {
581
+ ref,
582
+ className: clsx__default.default("ds-container", className),
583
+ style: {
584
+ maxWidth: resolvedMaxWidth,
585
+ ...style
586
+ },
587
+ ...props
588
+ }
589
+ );
590
+ }
591
+ );
592
+ Container.displayName = "Container";
593
+ var ChevronDown2 = () => /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ jsxRuntime.jsx(
594
+ "path",
595
+ {
596
+ d: "M4 6L8 10L12 6",
597
+ stroke: "currentColor",
598
+ strokeWidth: "1.5",
599
+ strokeLinecap: "round",
600
+ strokeLinejoin: "round"
601
+ }
602
+ ) });
603
+ var NavbarMegaMenu = React4.forwardRef(
604
+ ({ trigger, children, className, isOpen: controlledOpen, onOpenChange, variant = "fullWidth" }, ref) => {
605
+ const [internalOpen, setInternalOpen] = React4.useState(false);
606
+ const isControlled = controlledOpen !== void 0;
607
+ const isOpen = isControlled ? controlledOpen : internalOpen;
608
+ const containerRef = React4.useRef(null);
609
+ const triggerRef = React4.useRef(null);
610
+ const timeoutRef = React4.useRef(null);
611
+ const handleOpen = React4.useCallback(() => {
612
+ const newState = true;
613
+ if (isOpen !== newState) {
614
+ if (!isControlled) setInternalOpen(newState);
615
+ onOpenChange?.(newState);
616
+ }
617
+ }, [isOpen, isControlled, onOpenChange]);
618
+ const handleClose = React4.useCallback(() => {
619
+ const newState = false;
620
+ if (isOpen !== newState) {
621
+ if (!isControlled) setInternalOpen(newState);
622
+ onOpenChange?.(newState);
623
+ }
624
+ }, [isOpen, isControlled, onOpenChange]);
625
+ const handleToggle = React4.useCallback(() => {
626
+ if (isOpen) {
627
+ handleClose();
628
+ } else {
629
+ handleOpen();
630
+ }
631
+ }, [isOpen, handleClose, handleOpen]);
632
+ const handleMouseEnter = React4.useCallback(() => {
633
+ if (timeoutRef.current) {
634
+ window.clearTimeout(timeoutRef.current);
635
+ timeoutRef.current = null;
636
+ }
637
+ handleOpen();
638
+ }, [handleOpen]);
639
+ const handleMouseLeave = React4.useCallback(() => {
640
+ if (timeoutRef.current) {
641
+ window.clearTimeout(timeoutRef.current);
642
+ }
643
+ timeoutRef.current = window.setTimeout(() => {
644
+ handleClose();
645
+ }, 150);
646
+ }, [handleClose]);
647
+ React4.useEffect(() => {
648
+ return () => {
649
+ if (timeoutRef.current) window.clearTimeout(timeoutRef.current);
650
+ };
651
+ }, []);
652
+ React4.useEffect(() => {
653
+ if (!isOpen) return;
654
+ const handleClickOutside = (event) => {
655
+ if (containerRef.current && !containerRef.current.contains(event.target) && triggerRef.current && !triggerRef.current.contains(event.target)) {
656
+ handleClose();
657
+ }
658
+ };
659
+ document.addEventListener("mousedown", handleClickOutside);
660
+ return () => document.removeEventListener("mousedown", handleClickOutside);
661
+ }, [isOpen, handleClose]);
662
+ React4.useEffect(() => {
663
+ if (!isOpen) return;
664
+ const handleEscape = (e) => {
665
+ if (e.key === "Escape") handleClose();
666
+ };
667
+ document.addEventListener("keydown", handleEscape);
668
+ return () => document.removeEventListener("keydown", handleEscape);
669
+ }, [isOpen, handleClose]);
670
+ return /* @__PURE__ */ jsxRuntime.jsxs(
671
+ "div",
672
+ {
673
+ className: clsx__default.default("ds-navbar-mega-menu", `ds-navbar-mega-menu--${variant}`, className),
674
+ ref,
675
+ onMouseEnter: handleMouseEnter,
676
+ onMouseLeave: handleMouseLeave,
677
+ children: [
678
+ /* @__PURE__ */ jsxRuntime.jsxs(
679
+ "button",
680
+ {
681
+ ref: triggerRef,
682
+ className: "ds-navbar-mega-menu__trigger",
683
+ onClick: handleToggle,
684
+ "aria-expanded": isOpen,
685
+ "aria-haspopup": "true",
686
+ children: [
687
+ trigger,
688
+ /* @__PURE__ */ jsxRuntime.jsx(
689
+ "span",
690
+ {
691
+ className: "ds-navbar-mega-menu__chevron",
692
+ "data-state": isOpen ? "open" : "closed",
693
+ children: /* @__PURE__ */ jsxRuntime.jsx(ChevronDown2, {})
694
+ }
695
+ )
696
+ ]
697
+ }
698
+ ),
699
+ /* @__PURE__ */ jsxRuntime.jsx("div", { ref: containerRef, children: /* @__PURE__ */ jsxRuntime.jsx(
700
+ "div",
701
+ {
702
+ className: clsx__default.default(
703
+ "ds-navbar-mega-menu__content",
704
+ `ds-navbar-mega-menu__content--${variant}`
705
+ ),
706
+ "data-state": isOpen ? "open" : "closed",
707
+ children: variant === "fullWidth" ? /* @__PURE__ */ jsxRuntime.jsx(Container, { children }) : children
708
+ }
709
+ ) })
710
+ ]
711
+ }
712
+ );
713
+ }
714
+ );
715
+ NavbarMegaMenu.displayName = "NavbarMegaMenu";
716
+ function NavbarMegaMenuSection({ heading, children, className }) {
717
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: clsx__default.default("ds-navbar-mega-menu__section", className), children: [
718
+ heading && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "ds-navbar-mega-menu__section-heading", children: heading }),
719
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-navbar-mega-menu__section-items", children })
720
+ ] });
721
+ }
722
+ NavbarMegaMenuSection.displayName = "NavbarMegaMenuSection";
723
+ var NavbarMegaMenuItem = React4.forwardRef(
724
+ ({ icon, label, description, className, as: Comp = "a", ...rest }, ref) => {
725
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-navbar-mega-menu__item-wrapper", children: /* @__PURE__ */ jsxRuntime.jsxs(
726
+ Comp,
727
+ {
728
+ ref,
729
+ className: clsx__default.default("ds-navbar-mega-menu__item", className),
730
+ ...rest,
731
+ children: [
732
+ icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-navbar-mega-menu__item-icon", children: icon }),
733
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ds-navbar-mega-menu__item-text", children: [
734
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-navbar-mega-menu__item-label", children: label }),
735
+ description && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-navbar-mega-menu__item-description", children: description })
736
+ ] })
737
+ ]
738
+ }
739
+ ) });
740
+ }
741
+ );
742
+ NavbarMegaMenuItem.displayName = "NavbarMegaMenuItem";
743
+ var Breadcrumb = React4__default.default.forwardRef(
744
+ ({ className, "aria-label": ariaLabel = "Breadcrumb", ...props }, ref) => {
745
+ return /* @__PURE__ */ jsxRuntime.jsx(
746
+ "nav",
747
+ {
748
+ ref,
749
+ "aria-label": ariaLabel,
750
+ className: clsx__default.default("ds-breadcrumb", className),
751
+ ...props
752
+ }
753
+ );
754
+ }
755
+ );
756
+ Breadcrumb.displayName = "Breadcrumb";
757
+ var BreadcrumbList = React4__default.default.forwardRef(({ className, ...props }, ref) => {
758
+ return /* @__PURE__ */ jsxRuntime.jsx(
759
+ "ol",
760
+ {
761
+ ref,
762
+ className: clsx__default.default("ds-breadcrumb__list", className),
763
+ ...props
764
+ }
765
+ );
94
766
  });
95
- Object.defineProperty(exports, "BreadcrumbSeparator", {
96
- enumerable: true,
97
- get: function () { return chunkNT4LBP7D_cjs.BreadcrumbSeparator; }
767
+ BreadcrumbList.displayName = "BreadcrumbList";
768
+ var BreadcrumbItem = React4__default.default.forwardRef(({ className, ...props }, ref) => {
769
+ return /* @__PURE__ */ jsxRuntime.jsx(
770
+ "li",
771
+ {
772
+ ref,
773
+ className: clsx__default.default("ds-breadcrumb__item", className),
774
+ ...props
775
+ }
776
+ );
98
777
  });
99
- Object.defineProperty(exports, "OutboundLink", {
100
- enumerable: true,
101
- get: function () { return chunkLJADZITX_cjs.OutboundLink; }
778
+ BreadcrumbItem.displayName = "BreadcrumbItem";
779
+ var BreadcrumbLink = React4__default.default.forwardRef(({ className, asChild = false, ...props }, ref) => {
780
+ const Comp = asChild ? reactSlot.Slot : "a";
781
+ return /* @__PURE__ */ jsxRuntime.jsx(
782
+ Comp,
783
+ {
784
+ ref,
785
+ className: clsx__default.default("ds-breadcrumb__link", className),
786
+ ...props
787
+ }
788
+ );
102
789
  });
103
- Object.defineProperty(exports, "appendGovernedUTMs", {
104
- enumerable: true,
105
- get: function () { return chunkLJADZITX_cjs.appendGovernedUTMs; }
790
+ BreadcrumbLink.displayName = "BreadcrumbLink";
791
+ var BreadcrumbPage = React4__default.default.forwardRef(({ className, ...props }, ref) => {
792
+ return /* @__PURE__ */ jsxRuntime.jsx(
793
+ "span",
794
+ {
795
+ ref,
796
+ role: "link",
797
+ "aria-current": "page",
798
+ "aria-disabled": "true",
799
+ className: clsx__default.default("ds-breadcrumb__page", className),
800
+ ...props
801
+ }
802
+ );
106
803
  });
107
- Object.defineProperty(exports, "appendUTMs", {
108
- enumerable: true,
109
- get: function () { return chunkLJADZITX_cjs.appendUTMs; }
804
+ BreadcrumbPage.displayName = "BreadcrumbPage";
805
+ var BreadcrumbSeparator = React4__default.default.forwardRef(({ className, children, ...props }, ref) => {
806
+ return /* @__PURE__ */ jsxRuntime.jsx(
807
+ "li",
808
+ {
809
+ ref,
810
+ role: "presentation",
811
+ "aria-hidden": "true",
812
+ className: clsx__default.default("ds-breadcrumb__separator", className),
813
+ ...props,
814
+ children: children ?? "/"
815
+ }
816
+ );
110
817
  });
111
- Object.defineProperty(exports, "isExemptUrl", {
112
- enumerable: true,
113
- get: function () { return chunkLJADZITX_cjs.isExemptUrl; }
818
+ BreadcrumbSeparator.displayName = "BreadcrumbSeparator";
819
+ var BreadcrumbEllipsis = React4__default.default.forwardRef(({ className, ...props }, ref) => {
820
+ return /* @__PURE__ */ jsxRuntime.jsx(
821
+ "span",
822
+ {
823
+ ref,
824
+ className: clsx__default.default("ds-breadcrumb__ellipsis", className),
825
+ ...props,
826
+ children: "\u2026"
827
+ }
828
+ );
114
829
  });
830
+ BreadcrumbEllipsis.displayName = "BreadcrumbEllipsis";
831
+ function FooterAccordionItem({ section, LinkComponent }) {
832
+ const [isOpen, setIsOpen] = React4.useState(false);
833
+ return /* @__PURE__ */ jsxRuntime.jsxs(
834
+ "div",
835
+ {
836
+ className: clsx__default.default(
837
+ "ds-footer__accordion-item",
838
+ isOpen && "ds-footer__accordion-item--open"
839
+ ),
840
+ children: [
841
+ /* @__PURE__ */ jsxRuntime.jsxs(
842
+ "button",
843
+ {
844
+ type: "button",
845
+ className: "ds-footer__accordion-trigger",
846
+ "aria-expanded": isOpen,
847
+ onClick: () => setIsOpen((prev) => !prev),
848
+ children: [
849
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: section.title }),
850
+ /* @__PURE__ */ jsxRuntime.jsx(
851
+ "svg",
852
+ {
853
+ className: "ds-footer__accordion-chevron",
854
+ width: "16",
855
+ height: "16",
856
+ viewBox: "0 0 24 24",
857
+ fill: "none",
858
+ stroke: "currentColor",
859
+ strokeWidth: "2",
860
+ strokeLinecap: "round",
861
+ strokeLinejoin: "round",
862
+ "aria-hidden": "true",
863
+ children: /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "6 9 12 15 18 9" })
864
+ }
865
+ )
866
+ ]
867
+ }
868
+ ),
869
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-footer__accordion-panel", hidden: !isOpen, children: /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "ds-footer__links", children: section.links.map((link, idx) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsxs(LinkComponent, { href: link.href, className: "ds-footer__link", children: [
870
+ link.label,
871
+ link.isNew && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-footer__badge", children: "NEW" })
872
+ ] }) }, idx)) }) })
873
+ ]
874
+ }
875
+ );
876
+ }
877
+ var SiteFooter = React4.forwardRef(
878
+ ({
879
+ cta,
880
+ sections = [],
881
+ orientationLine,
882
+ linkAs,
883
+ brand,
884
+ tagline,
885
+ socials,
886
+ trustBadges,
887
+ controls,
888
+ legalLinks = [],
889
+ copyright,
890
+ companyInfo,
891
+ bottomExtra,
892
+ bottomActions,
893
+ className,
894
+ ...props
895
+ }, ref) => {
896
+ const currentYear = (/* @__PURE__ */ new Date()).getFullYear();
897
+ const defaultCopyright = copyright || `\xA9 ${currentYear}. All rights reserved.`;
898
+ const resolvedControls = controls || bottomActions;
899
+ const LinkComponent = linkAs || "a";
900
+ return /* @__PURE__ */ jsxRuntime.jsxs("footer", { ref, className: clsx__default.default("ds-footer", className), ...props, children: [
901
+ cta && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-footer__cta", "data-footer-zone": "cta", children: /* @__PURE__ */ jsxRuntime.jsx(Container, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-footer__cta-content", children: [
902
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "ds-footer__cta-headline", children: cta.headline }),
903
+ cta.subtext && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "ds-footer__cta-subtext", children: cta.subtext }),
904
+ (cta.primaryCta || cta.secondaryCta) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-footer__cta-actions", children: [
905
+ cta.primaryCta,
906
+ cta.secondaryCta
907
+ ] }),
908
+ cta.trustLine && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "ds-footer__cta-trust", children: cta.trustLine })
909
+ ] }) }) }),
910
+ sections.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-footer__nav", "data-footer-zone": "navigation", children: /* @__PURE__ */ jsxRuntime.jsxs(Container, { children: [
911
+ orientationLine && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-footer__orientation", children: orientationLine }),
912
+ /* @__PURE__ */ jsxRuntime.jsx(
913
+ "nav",
914
+ {
915
+ className: "ds-footer__grid",
916
+ "aria-label": "Footer navigation",
917
+ children: sections.map((section, idx) => /* @__PURE__ */ jsxRuntime.jsxs(
918
+ "div",
919
+ {
920
+ className: "ds-footer__column",
921
+ "data-footer-section": section.title.toLowerCase().replace(/\s+/g, "-"),
922
+ children: [
923
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "ds-footer__heading", children: section.title }),
924
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "ds-footer__links", children: section.links.map((link, linkIdx) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsxs(
925
+ LinkComponent,
926
+ {
927
+ href: link.href,
928
+ className: "ds-footer__link",
929
+ children: [
930
+ link.label,
931
+ link.isNew && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-footer__badge", children: "NEW" })
932
+ ]
933
+ }
934
+ ) }, linkIdx)) })
935
+ ]
936
+ },
937
+ idx
938
+ ))
939
+ }
940
+ ),
941
+ /* @__PURE__ */ jsxRuntime.jsx(
942
+ "nav",
943
+ {
944
+ className: "ds-footer__mobile-nav",
945
+ "aria-label": "Footer navigation",
946
+ children: sections.map((section, idx) => /* @__PURE__ */ jsxRuntime.jsx(
947
+ FooterAccordionItem,
948
+ {
949
+ section,
950
+ LinkComponent
951
+ },
952
+ idx
953
+ ))
954
+ }
955
+ )
956
+ ] }) }),
957
+ (brand || socials || trustBadges) && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-footer__authority", "data-footer-zone": "authority", children: /* @__PURE__ */ jsxRuntime.jsx(Container, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-footer__authority-content", children: [
958
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-footer__brand", children: [
959
+ brand && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-footer__logo", children: brand }),
960
+ tagline && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "ds-footer__tagline", children: tagline }),
961
+ socials && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-footer__socials", children: socials })
962
+ ] }),
963
+ trustBadges && trustBadges.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-footer__trust-badges", children: trustBadges.map((badge, idx) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-footer__trust-badge", children: badge.label }, idx)) })
964
+ ] }) }) }),
965
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-footer__bottom", "data-footer-zone": "legal", children: /* @__PURE__ */ jsxRuntime.jsxs(Container, { children: [
966
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-footer__bottom-content", children: [
967
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-footer__copyright", children: copyright || defaultCopyright }),
968
+ resolvedControls && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-footer__controls", children: resolvedControls }),
969
+ legalLinks.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-footer__legal", children: legalLinks.map((link, idx) => /* @__PURE__ */ jsxRuntime.jsx(
970
+ LinkComponent,
971
+ {
972
+ href: link.href,
973
+ className: "ds-footer__legal-link",
974
+ children: link.label
975
+ },
976
+ idx
977
+ )) })
978
+ ] }),
979
+ bottomExtra && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-footer__bottom-extra", children: bottomExtra }),
980
+ companyInfo && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "ds-footer__company-info", children: companyInfo })
981
+ ] }) })
982
+ ] });
983
+ }
984
+ );
985
+ SiteFooter.displayName = "SiteFooter";
986
+ var GlobeIcon = () => /* @__PURE__ */ jsxRuntime.jsxs(
987
+ "svg",
988
+ {
989
+ width: "16",
990
+ height: "16",
991
+ viewBox: "0 0 24 24",
992
+ fill: "none",
993
+ stroke: "currentColor",
994
+ strokeWidth: "2",
995
+ strokeLinecap: "round",
996
+ strokeLinejoin: "round",
997
+ "aria-hidden": "true",
998
+ children: [
999
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "10" }),
1000
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M2 12h20" }),
1001
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z" })
1002
+ ]
1003
+ }
1004
+ );
1005
+ var ChevronDownIcon = () => /* @__PURE__ */ jsxRuntime.jsx(
1006
+ "svg",
1007
+ {
1008
+ width: "12",
1009
+ height: "12",
1010
+ viewBox: "0 0 16 16",
1011
+ fill: "none",
1012
+ stroke: "currentColor",
1013
+ strokeWidth: "1.5",
1014
+ strokeLinecap: "round",
1015
+ strokeLinejoin: "round",
1016
+ "aria-hidden": "true",
1017
+ children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M4 6L8 10L12 6" })
1018
+ }
1019
+ );
1020
+ var CheckIcon = () => /* @__PURE__ */ jsxRuntime.jsx(
1021
+ "svg",
1022
+ {
1023
+ width: "14",
1024
+ height: "14",
1025
+ viewBox: "0 0 24 24",
1026
+ fill: "none",
1027
+ stroke: "currentColor",
1028
+ strokeWidth: "2.5",
1029
+ strokeLinecap: "round",
1030
+ strokeLinejoin: "round",
1031
+ "aria-hidden": "true",
1032
+ children: /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "20 6 9 17 4 12" })
1033
+ }
1034
+ );
1035
+ var LocaleDropdown = React4.forwardRef(
1036
+ ({
1037
+ locales,
1038
+ activeLocale,
1039
+ onLocaleChange,
1040
+ optionAs: OptionComponent = "button",
1041
+ getHref,
1042
+ className,
1043
+ direction = "down",
1044
+ align = "right"
1045
+ }, ref) => {
1046
+ const [isOpen, setIsOpen] = React4.useState(false);
1047
+ const [focusIndex, setFocusIndex] = React4.useState(-1);
1048
+ const containerRef = React4.useRef(null);
1049
+ const triggerRef = React4.useRef(null);
1050
+ const listRef = React4.useRef(null);
1051
+ const instanceId = React4.useId();
1052
+ const listboxId = `locale-dropdown-${instanceId}`;
1053
+ const currentLocale = locales.find((l) => l.code === activeLocale) ?? locales[0];
1054
+ const handleToggle = React4.useCallback(() => {
1055
+ setIsOpen((prev) => {
1056
+ if (!prev) setFocusIndex(-1);
1057
+ return !prev;
1058
+ });
1059
+ }, []);
1060
+ const handleClose = React4.useCallback(() => {
1061
+ setIsOpen(false);
1062
+ setFocusIndex(-1);
1063
+ triggerRef.current?.focus();
1064
+ }, []);
1065
+ const handleSelect = React4.useCallback(
1066
+ (code) => {
1067
+ onLocaleChange?.(code);
1068
+ handleClose();
1069
+ },
1070
+ [onLocaleChange, handleClose]
1071
+ );
1072
+ React4.useEffect(() => {
1073
+ if (!isOpen) return;
1074
+ const handleClickOutside = (e) => {
1075
+ if (containerRef.current && !containerRef.current.contains(e.target)) {
1076
+ handleClose();
1077
+ }
1078
+ };
1079
+ document.addEventListener("mousedown", handleClickOutside);
1080
+ return () => document.removeEventListener("mousedown", handleClickOutside);
1081
+ }, [isOpen, handleClose]);
1082
+ const handleKeyDown = React4.useCallback(
1083
+ (e) => {
1084
+ if (!isOpen) {
1085
+ if (e.key === "ArrowDown" || e.key === "Enter" || e.key === " ") {
1086
+ e.preventDefault();
1087
+ setIsOpen(true);
1088
+ setFocusIndex(0);
1089
+ }
1090
+ return;
1091
+ }
1092
+ switch (e.key) {
1093
+ case "Escape":
1094
+ e.preventDefault();
1095
+ handleClose();
1096
+ break;
1097
+ case "ArrowDown":
1098
+ e.preventDefault();
1099
+ setFocusIndex((prev) => (prev + 1) % locales.length);
1100
+ break;
1101
+ case "ArrowUp":
1102
+ e.preventDefault();
1103
+ setFocusIndex((prev) => (prev - 1 + locales.length) % locales.length);
1104
+ break;
1105
+ case "Enter":
1106
+ case " ":
1107
+ e.preventDefault();
1108
+ if (focusIndex >= 0 && focusIndex < locales.length) {
1109
+ handleSelect(locales[focusIndex].code);
1110
+ }
1111
+ break;
1112
+ case "Home":
1113
+ e.preventDefault();
1114
+ setFocusIndex(0);
1115
+ break;
1116
+ case "End":
1117
+ e.preventDefault();
1118
+ setFocusIndex(locales.length - 1);
1119
+ break;
1120
+ case "Tab":
1121
+ handleClose();
1122
+ break;
1123
+ }
1124
+ },
1125
+ [isOpen, focusIndex, locales, handleClose, handleSelect]
1126
+ );
1127
+ React4.useEffect(() => {
1128
+ if (!isOpen || focusIndex < 0 || !listRef.current) return;
1129
+ const items = listRef.current.querySelectorAll('[role="option"]');
1130
+ items[focusIndex]?.scrollIntoView({ block: "nearest" });
1131
+ }, [isOpen, focusIndex]);
1132
+ const activeDescendantId = isOpen && focusIndex >= 0 ? `${listboxId}-option-${focusIndex}` : void 0;
1133
+ return /* @__PURE__ */ jsxRuntime.jsx(
1134
+ "div",
1135
+ {
1136
+ ref,
1137
+ className: clsx__default.default(
1138
+ "ds-locale-dropdown",
1139
+ direction === "up" && "ds-locale-dropdown--up",
1140
+ align === "left" && "ds-locale-dropdown--align-left",
1141
+ align === "center" && "ds-locale-dropdown--align-center",
1142
+ className
1143
+ ),
1144
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { ref: containerRef, className: "ds-locale-dropdown__wrapper", children: [
1145
+ /* @__PURE__ */ jsxRuntime.jsxs(
1146
+ "button",
1147
+ {
1148
+ ref: triggerRef,
1149
+ type: "button",
1150
+ className: "ds-locale-dropdown__trigger",
1151
+ onClick: handleToggle,
1152
+ onKeyDown: handleKeyDown,
1153
+ "aria-haspopup": "listbox",
1154
+ "aria-expanded": isOpen,
1155
+ "aria-controls": isOpen ? listboxId : void 0,
1156
+ "aria-activedescendant": activeDescendantId,
1157
+ "aria-label": `Language: ${currentLocale.label}. Change language.`,
1158
+ children: [
1159
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-locale-dropdown__trigger-icon", children: /* @__PURE__ */ jsxRuntime.jsx(GlobeIcon, {}) }),
1160
+ currentLocale.flag && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-locale-dropdown__trigger-flag", "aria-hidden": "true", children: currentLocale.flag }),
1161
+ /* @__PURE__ */ jsxRuntime.jsx(
1162
+ "span",
1163
+ {
1164
+ className: "ds-locale-dropdown__trigger-chevron",
1165
+ "data-state": isOpen ? "open" : "closed",
1166
+ children: /* @__PURE__ */ jsxRuntime.jsx(ChevronDownIcon, {})
1167
+ }
1168
+ )
1169
+ ]
1170
+ }
1171
+ ),
1172
+ /* @__PURE__ */ jsxRuntime.jsx(
1173
+ "div",
1174
+ {
1175
+ ref: listRef,
1176
+ id: listboxId,
1177
+ className: "ds-locale-dropdown__panel",
1178
+ role: "listbox",
1179
+ "aria-label": "Select language",
1180
+ "data-state": isOpen ? "open" : "closed",
1181
+ onKeyDown: handleKeyDown,
1182
+ children: locales.map((locale, index) => {
1183
+ const isActive = locale.code === activeLocale;
1184
+ const isFocused = index === focusIndex;
1185
+ const optionId = `${listboxId}-option-${index}`;
1186
+ const optionProps = {
1187
+ id: optionId,
1188
+ role: "option",
1189
+ "aria-selected": isActive,
1190
+ className: clsx__default.default(
1191
+ "ds-locale-dropdown__option",
1192
+ isActive && "ds-locale-dropdown__option--active",
1193
+ isFocused && "ds-locale-dropdown__option--focused"
1194
+ ),
1195
+ onClick: () => handleSelect(locale.code),
1196
+ ...OptionComponent !== "button" && getHref ? { href: getHref(locale.code) } : { type: "button" }
1197
+ };
1198
+ return /* @__PURE__ */ jsxRuntime.jsxs(OptionComponent, { ...optionProps, children: [
1199
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ds-locale-dropdown__option-content", children: [
1200
+ locale.flag && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-locale-dropdown__option-flag", "aria-hidden": "true", children: locale.flag }),
1201
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-locale-dropdown__option-label", children: locale.label })
1202
+ ] }),
1203
+ isActive && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-locale-dropdown__option-check", children: /* @__PURE__ */ jsxRuntime.jsx(CheckIcon, {}) })
1204
+ ] }, locale.code);
1205
+ })
1206
+ }
1207
+ )
1208
+ ] })
1209
+ }
1210
+ );
1211
+ }
1212
+ );
1213
+ LocaleDropdown.displayName = "LocaleDropdown";
1214
+ var UtmContext = React4.createContext(null);
1215
+
1216
+ // src/web/utm/useUtmDefaults.ts
1217
+ function useUtmDefaults() {
1218
+ return React4.useContext(UtmContext);
1219
+ }
1220
+
1221
+ // src/web/utm/builders.ts
1222
+ var PLACEHOLDER_ORIGIN = "https://__placeholder__.internal";
1223
+ function buildUtmUrl(baseUrl, params) {
1224
+ const isRelative = baseUrl.startsWith("/");
1225
+ let url;
1226
+ try {
1227
+ url = isRelative ? new URL(baseUrl, PLACEHOLDER_ORIGIN) : new URL(baseUrl);
1228
+ } catch {
1229
+ return baseUrl;
1230
+ }
1231
+ const existingParams = [];
1232
+ url.searchParams.forEach((value, key) => {
1233
+ existingParams.push([key, value]);
1234
+ });
1235
+ for (const [key] of existingParams) {
1236
+ url.searchParams.delete(key);
1237
+ }
1238
+ for (const [key, value] of existingParams) {
1239
+ if (!key.startsWith("utm_")) {
1240
+ url.searchParams.set(key, value);
1241
+ }
1242
+ }
1243
+ url.searchParams.set("utm_source", params.source);
1244
+ url.searchParams.set("utm_medium", params.medium);
1245
+ url.searchParams.set("utm_campaign", params.campaign);
1246
+ if (params.term !== void 0) {
1247
+ url.searchParams.set("utm_term", params.term);
1248
+ }
1249
+ if (params.content !== void 0) {
1250
+ url.searchParams.set("utm_content", params.content);
1251
+ }
1252
+ if (isRelative) {
1253
+ return url.href.replace(PLACEHOLDER_ORIGIN, "");
1254
+ }
1255
+ return url.href;
1256
+ }
1257
+
1258
+ // src/web/utm/classifiers.ts
1259
+ var INTERNAL_PATTERNS = [
1260
+ /^\/(?!\/)/,
1261
+ // Relative paths
1262
+ /^https?:\/\/(www\.)?sales-mind\.ai/i,
1263
+ // Marketing site
1264
+ /^https?:\/\/app\.sales-mind\.ai/i,
1265
+ // Web app
1266
+ /^https?:\/\/apps\.sales-mind\.ai/i,
1267
+ // Web app (legacy)
1268
+ /^https?:\/\/meet\.sales-mind\.ai/i,
1269
+ // Booking
1270
+ /^https?:\/\/docs\.sales-mind\.ai/i
1271
+ // Docs
1272
+ ];
1273
+ var SYSTEM_PATTERNS = [
1274
+ /^https?:\/\/.*\/api\//i,
1275
+ // API endpoints
1276
+ /^https?:\/\/.*\/webhook/i,
1277
+ // Webhooks
1278
+ /^https?:\/\/.*\/oauth/i,
1279
+ // OAuth callbacks
1280
+ /^https?:\/\/.*\/callback/i,
1281
+ // Callbacks
1282
+ /^https?:\/\/.*\.supabase\.(co|com)/i,
1283
+ // Supabase
1284
+ /^https?:\/\/.*\.firebaseapp\.com/i,
1285
+ // Firebase
1286
+ /^https?:\/\/.*\.cloudfunctions\.net/i
1287
+ // Cloud Functions
1288
+ ];
1289
+ var ASSET_PATTERNS = [
1290
+ /\.(css|js|mjs|map|woff2?|ttf|eot|svg|png|jpe?g|gif|webp|avif|ico|pdf)(\?.*)?$/i
1291
+ ];
1292
+ var CONVERSION_PATTERNS = [
1293
+ /^https?:\/\/(www\.)?calendly\.com/i,
1294
+ /^https?:\/\/(checkout\.)?stripe\.com/i,
1295
+ /^https?:\/\/buy\.stripe\.com/i,
1296
+ /^https?:\/\/chromewebstore\.google\.com/i,
1297
+ /^https?:\/\/meet\.sales-mind\.ai/i
1298
+ ];
1299
+ var PROTOCOL_EXEMPT = [
1300
+ /^mailto:/i,
1301
+ /^tel:/i,
1302
+ /^#/,
1303
+ /^javascript:/i
1304
+ ];
1305
+ function classifyUrl(url) {
1306
+ if (PROTOCOL_EXEMPT.some((p) => p.test(url))) return "protocol";
1307
+ if (ASSET_PATTERNS.some((p) => p.test(url))) return "asset";
1308
+ if (SYSTEM_PATTERNS.some((p) => p.test(url))) return "system";
1309
+ if (CONVERSION_PATTERNS.some((p) => p.test(url))) return "conversion";
1310
+ if (INTERNAL_PATTERNS.some((p) => p.test(url))) return "internal";
1311
+ return "external";
1312
+ }
1313
+
1314
+ // src/components/OutboundLink/outbound-link-utils.ts
1315
+ var LEGACY_UTM_SOURCE = "salesmind";
1316
+ var EXEMPT_PATTERNS = [
1317
+ /^https?:\/\/(www\.)?(stripe\.com|checkout\.stripe\.com|paypal\.com)/i,
1318
+ /^https?:\/\/(www\.)?github\.com\/login\/oauth/i
1319
+ ];
1320
+ var isExemptUrl = (urlStr) => {
1321
+ if (urlStr.startsWith("mailto:") || urlStr.startsWith("tel:")) return true;
1322
+ const classification = classifyUrl(urlStr);
1323
+ if (classification === "system" || classification === "protocol" || classification === "asset") {
1324
+ return true;
1325
+ }
1326
+ return EXEMPT_PATTERNS.some((pattern) => pattern.test(urlStr));
1327
+ };
1328
+ var appendGovernedUTMs = (href, params, preserveExisting = true) => {
1329
+ try {
1330
+ const url = new URL(href);
1331
+ if (preserveExisting) {
1332
+ const hasAll = url.searchParams.has("utm_source") && url.searchParams.has("utm_medium") && url.searchParams.has("utm_campaign");
1333
+ if (hasAll) return href;
1334
+ }
1335
+ return buildUtmUrl(href, params);
1336
+ } catch {
1337
+ return href;
1338
+ }
1339
+ };
1340
+ var appendUTMs = (href, context, pageSlug, options) => {
1341
+ try {
1342
+ const url = new URL(href);
1343
+ const { mediumOverride = "outbound_link", campaignOverride, preserveExisting = true } = options;
1344
+ const utms = {
1345
+ utm_source: LEGACY_UTM_SOURCE,
1346
+ utm_medium: mediumOverride,
1347
+ utm_campaign: campaignOverride || pageSlug,
1348
+ utm_content: context
1349
+ };
1350
+ Object.entries(utms).forEach(([key, value]) => {
1351
+ if (value) {
1352
+ if (preserveExisting && url.searchParams.has(key)) {
1353
+ return;
1354
+ }
1355
+ url.searchParams.set(key, value);
1356
+ }
1357
+ });
1358
+ return url.toString();
1359
+ } catch {
1360
+ return href;
1361
+ }
1362
+ };
1363
+ var OutboundLink = React4.forwardRef(
1364
+ ({
1365
+ href,
1366
+ context,
1367
+ campaignOverride,
1368
+ mediumOverride = "outbound_link",
1369
+ preserveExistingUTM = true,
1370
+ openInNewTab = true,
1371
+ disableTracking = false,
1372
+ utmParams,
1373
+ onClick,
1374
+ children,
1375
+ ...props
1376
+ }, ref) => {
1377
+ const contextParams = useUtmDefaults();
1378
+ const resolvedUtmParams = utmParams ?? contextParams;
1379
+ let hostname = "";
1380
+ try {
1381
+ const url = new URL(href);
1382
+ hostname = url.hostname;
1383
+ } catch {
1384
+ }
1385
+ const [finalHref, setFinalHref] = React4.useState(href);
1386
+ React4.useEffect(() => {
1387
+ let isExternal = false;
1388
+ let currentMedium = mediumOverride;
1389
+ try {
1390
+ const url = new URL(href);
1391
+ const currentHost = window.location.hostname;
1392
+ isExternal = url.hostname !== currentHost;
1393
+ if (isExternal && currentHost.includes("sales-mind.ai") && url.hostname.includes("sales-mind.ai")) {
1394
+ if (currentMedium === "outbound_link") {
1395
+ currentMedium = "cross_subdomain";
1396
+ }
1397
+ }
1398
+ } catch {
1399
+ isExternal = false;
1400
+ }
1401
+ const isExempt = isExemptUrl(href) || disableTracking;
1402
+ if (isExternal && !isExempt) {
1403
+ if (resolvedUtmParams) {
1404
+ setFinalHref(appendGovernedUTMs(href, resolvedUtmParams, preserveExistingUTM));
1405
+ } else {
1406
+ const pageSlug = window.location.pathname.replace(/^\/|\/$/g, "") || "home";
1407
+ setFinalHref(appendUTMs(href, context, pageSlug, {
1408
+ mediumOverride: currentMedium,
1409
+ campaignOverride,
1410
+ preserveExisting: preserveExistingUTM
1411
+ }));
1412
+ }
1413
+ } else {
1414
+ setFinalHref(href);
1415
+ }
1416
+ }, [href, context, mediumOverride, campaignOverride, preserveExistingUTM, disableTracking, resolvedUtmParams]);
1417
+ const handleClick = (e) => {
1418
+ if (typeof window === "undefined" || disableTracking) {
1419
+ onClick?.(e);
1420
+ return;
1421
+ }
1422
+ let clickExternal = false;
1423
+ let clickCrossSubdomain = false;
1424
+ let clickMedium = mediumOverride;
1425
+ try {
1426
+ const url = new URL(href);
1427
+ const currentHost = window.location.hostname;
1428
+ clickExternal = url.hostname !== currentHost;
1429
+ if (clickExternal && currentHost.includes("sales-mind.ai") && url.hostname.includes("sales-mind.ai")) {
1430
+ clickCrossSubdomain = true;
1431
+ if (clickMedium === "outbound_link") {
1432
+ clickMedium = "cross_subdomain";
1433
+ }
1434
+ }
1435
+ } catch {
1436
+ }
1437
+ if (clickExternal) {
1438
+ const detail = {
1439
+ destination_domain: hostname,
1440
+ destination_url: finalHref,
1441
+ utm_medium_type: clickMedium,
1442
+ page_slug: window.location.pathname,
1443
+ component_location: context,
1444
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
1445
+ is_cross_subdomain: clickCrossSubdomain
1446
+ };
1447
+ const event = new CustomEvent("outbound_click", { detail });
1448
+ window.dispatchEvent(event);
1449
+ }
1450
+ onClick?.(e);
1451
+ };
1452
+ const relParts = [];
1453
+ let shouldOpenNewTab = openInNewTab;
1454
+ try {
1455
+ const url = new URL(href);
1456
+ if (typeof window !== "undefined") {
1457
+ const currentHost = window.location.hostname;
1458
+ if (url.hostname !== currentHost && currentHost.includes("sales-mind.ai") && url.hostname.includes("sales-mind.ai")) {
1459
+ shouldOpenNewTab = false;
1460
+ }
1461
+ }
1462
+ } catch {
1463
+ }
1464
+ if (shouldOpenNewTab) relParts.push("noopener", "noreferrer");
1465
+ if (mediumOverride === "citation") relParts.push("nofollow");
1466
+ const rel = relParts.length > 0 ? relParts.join(" ") : void 0;
1467
+ return (
1468
+ // eslint-disable-next-line no-restricted-syntax
1469
+ /* @__PURE__ */ jsxRuntime.jsx(
1470
+ "a",
1471
+ {
1472
+ ref,
1473
+ href: finalHref,
1474
+ target: shouldOpenNewTab ? "_blank" : void 0,
1475
+ rel,
1476
+ onClick: handleClick,
1477
+ ...props,
1478
+ children
1479
+ }
1480
+ )
1481
+ );
1482
+ }
1483
+ );
1484
+ OutboundLink.displayName = "OutboundLink";
1485
+ var MDXOutboundLink = ({
1486
+ href,
1487
+ children,
1488
+ ...props
1489
+ }) => {
1490
+ if (!href) {
1491
+ return /* @__PURE__ */ jsxRuntime.jsx("a", { ...props, children });
1492
+ }
1493
+ return /* @__PURE__ */ jsxRuntime.jsx(
1494
+ OutboundLink,
1495
+ {
1496
+ href,
1497
+ context: "cms_markdown",
1498
+ preserveExistingUTM: true,
1499
+ openInNewTab: true,
1500
+ ...props,
1501
+ children
1502
+ }
1503
+ );
1504
+ };
1505
+
1506
+ exports.Breadcrumb = Breadcrumb;
1507
+ exports.BreadcrumbEllipsis = BreadcrumbEllipsis;
1508
+ exports.BreadcrumbItem = BreadcrumbItem;
1509
+ exports.BreadcrumbLink = BreadcrumbLink;
1510
+ exports.BreadcrumbList = BreadcrumbList;
1511
+ exports.BreadcrumbPage = BreadcrumbPage;
1512
+ exports.BreadcrumbSeparator = BreadcrumbSeparator;
1513
+ exports.LocaleDropdown = LocaleDropdown;
1514
+ exports.MDXOutboundLink = MDXOutboundLink;
1515
+ exports.NavbarMegaMenu = NavbarMegaMenu;
1516
+ exports.NavbarMegaMenuItem = NavbarMegaMenuItem;
1517
+ exports.NavbarMegaMenuSection = NavbarMegaMenuSection;
1518
+ exports.NavbarMobileActions = NavbarMobileActions;
1519
+ exports.NavbarMobileNavItem = NavbarMobileNavItem;
1520
+ exports.NavbarMobileSeparator = NavbarMobileSeparator;
1521
+ exports.NavbarV2 = NavbarV2;
1522
+ exports.NavbarV2Actions = NavbarV2Actions;
1523
+ exports.NavbarV2Brand = NavbarV2Brand;
1524
+ exports.NavbarV2Tab = NavbarV2Tab;
1525
+ exports.NavbarV2TabMenu = NavbarV2TabMenu;
1526
+ exports.NavbarV2Tabs = NavbarV2Tabs;
1527
+ exports.OutboundLink = OutboundLink;
1528
+ exports.SiteFooter = SiteFooter;
1529
+ exports.appendGovernedUTMs = appendGovernedUTMs;
1530
+ exports.appendUTMs = appendUTMs;
1531
+ exports.isExemptUrl = isExemptUrl;
115
1532
  //# sourceMappingURL=out.js.map
116
1533
  //# sourceMappingURL=index.cjs.map