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