@salesmind-ai/design-system 0.3.4 → 0.3.6

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 (203) hide show
  1. package/dist/{StatsSection-wgd8Vge1.d.cts → StatsSection-Dihy3zml.d.cts} +2 -0
  2. package/dist/{StatsSection-B8iD9L-o.d.ts → StatsSection-MfKKyqL1.d.ts} +2 -0
  3. package/dist/admin/index.cjs +68 -2928
  4. package/dist/admin/index.cjs.map +1 -1
  5. package/dist/admin/index.js +5 -2915
  6. package/dist/admin/index.js.map +1 -1
  7. package/dist/blog/index.cjs +53 -1064
  8. package/dist/blog/index.cjs.map +1 -1
  9. package/dist/blog/index.js +8 -1054
  10. package/dist/blog/index.js.map +1 -1
  11. package/dist/charts/index.cjs +46 -2694
  12. package/dist/charts/index.cjs.map +1 -1
  13. package/dist/charts/index.js +3 -2680
  14. package/dist/charts/index.js.map +1 -1
  15. package/dist/chunk-2GARWEJK.js +17 -0
  16. package/dist/chunk-2GARWEJK.js.map +1 -0
  17. package/dist/chunk-2KQVZ5FB.js +485 -0
  18. package/dist/chunk-2KQVZ5FB.js.map +1 -0
  19. package/dist/chunk-3NKRFUAR.js +37 -0
  20. package/dist/chunk-3NKRFUAR.js.map +1 -0
  21. package/dist/chunk-3TGSIILM.cjs +201 -0
  22. package/dist/chunk-3TGSIILM.cjs.map +1 -0
  23. package/dist/chunk-4GM5BGBN.cjs +801 -0
  24. package/dist/chunk-4GM5BGBN.cjs.map +1 -0
  25. package/dist/chunk-5LGDEZWY.cjs +2434 -0
  26. package/dist/chunk-5LGDEZWY.cjs.map +1 -0
  27. package/dist/chunk-6H4DSTXR.js +786 -0
  28. package/dist/chunk-6H4DSTXR.js.map +1 -0
  29. package/dist/chunk-6HKQ5ILL.cjs +1624 -0
  30. package/dist/chunk-6HKQ5ILL.cjs.map +1 -0
  31. package/dist/chunk-6UNG76Y2.js +153 -0
  32. package/dist/chunk-6UNG76Y2.js.map +1 -0
  33. package/dist/chunk-7PX2AZ6Y.js +39 -0
  34. package/dist/chunk-7PX2AZ6Y.js.map +1 -0
  35. package/dist/chunk-ARC5KXBC.js +187 -0
  36. package/dist/chunk-ARC5KXBC.js.map +1 -0
  37. package/dist/chunk-B6AVAX4F.js +1415 -0
  38. package/dist/chunk-B6AVAX4F.js.map +1 -0
  39. package/dist/chunk-BILT5KD3.js +264 -0
  40. package/dist/chunk-BILT5KD3.js.map +1 -0
  41. package/dist/chunk-C2BCDNAV.js +24 -0
  42. package/dist/chunk-C2BCDNAV.js.map +1 -0
  43. package/dist/chunk-CH42VPWE.cjs +421 -0
  44. package/dist/chunk-CH42VPWE.cjs.map +1 -0
  45. package/dist/chunk-CJ2MKVAF.cjs +46 -0
  46. package/dist/chunk-CJ2MKVAF.cjs.map +1 -0
  47. package/dist/chunk-DP74LUXG.cjs +98 -0
  48. package/dist/chunk-DP74LUXG.cjs.map +1 -0
  49. package/dist/chunk-E7D6EKJ4.cjs +44 -0
  50. package/dist/chunk-E7D6EKJ4.cjs.map +1 -0
  51. package/dist/chunk-ECXBTUH6.cjs +584 -0
  52. package/dist/chunk-ECXBTUH6.cjs.map +1 -0
  53. package/dist/chunk-EFRAP5ES.js +157 -0
  54. package/dist/chunk-EFRAP5ES.js.map +1 -0
  55. package/dist/chunk-EM7JHRYW.cjs +69 -0
  56. package/dist/chunk-EM7JHRYW.cjs.map +1 -0
  57. package/dist/chunk-FAFAP4L5.js +183 -0
  58. package/dist/chunk-FAFAP4L5.js.map +1 -0
  59. package/dist/chunk-H2Y6BSTL.cjs +69 -0
  60. package/dist/chunk-H2Y6BSTL.cjs.map +1 -0
  61. package/dist/chunk-HN4PHABT.js +126 -0
  62. package/dist/chunk-HN4PHABT.js.map +1 -0
  63. package/dist/chunk-HRENHNDJ.js +211 -0
  64. package/dist/chunk-HRENHNDJ.js.map +1 -0
  65. package/dist/chunk-I75BFEYT.cjs +2561 -0
  66. package/dist/chunk-I75BFEYT.cjs.map +1 -0
  67. package/dist/chunk-IFRATNLU.js +562 -0
  68. package/dist/chunk-IFRATNLU.js.map +1 -0
  69. package/dist/chunk-JNASH4OQ.js +1022 -0
  70. package/dist/chunk-JNASH4OQ.js.map +1 -0
  71. package/dist/chunk-JPJN4YBC.js +409 -0
  72. package/dist/chunk-JPJN4YBC.js.map +1 -0
  73. package/dist/chunk-KCKUSU2M.cjs +166 -0
  74. package/dist/chunk-KCKUSU2M.cjs.map +1 -0
  75. package/dist/chunk-KDLH35OI.cjs +1042 -0
  76. package/dist/chunk-KDLH35OI.cjs.map +1 -0
  77. package/dist/chunk-KJ2OXQF4.js +287 -0
  78. package/dist/chunk-KJ2OXQF4.js.map +1 -0
  79. package/dist/chunk-KK5UO2P4.cjs +717 -0
  80. package/dist/chunk-KK5UO2P4.cjs.map +1 -0
  81. package/dist/chunk-KNQEIU7O.cjs +1202 -0
  82. package/dist/chunk-KNQEIU7O.cjs.map +1 -0
  83. package/dist/chunk-KVGSVGRK.cjs +569 -0
  84. package/dist/chunk-KVGSVGRK.cjs.map +1 -0
  85. package/dist/chunk-L352JRV6.cjs +105 -0
  86. package/dist/chunk-L352JRV6.cjs.map +1 -0
  87. package/dist/chunk-LGNMFBLF.cjs +502 -0
  88. package/dist/chunk-LGNMFBLF.cjs.map +1 -0
  89. package/dist/chunk-LJADZITX.cjs +298 -0
  90. package/dist/chunk-LJADZITX.cjs.map +1 -0
  91. package/dist/chunk-LSR7JYVH.cjs +196 -0
  92. package/dist/chunk-LSR7JYVH.cjs.map +1 -0
  93. package/dist/chunk-MDB2WCRQ.cjs +137 -0
  94. package/dist/chunk-MDB2WCRQ.cjs.map +1 -0
  95. package/dist/chunk-MQDEE7HC.cjs +283 -0
  96. package/dist/chunk-MQDEE7HC.cjs.map +1 -0
  97. package/dist/chunk-MQRB634A.cjs +34 -0
  98. package/dist/chunk-MQRB634A.cjs.map +1 -0
  99. package/dist/chunk-MU6GW5ZV.js +2317 -0
  100. package/dist/chunk-MU6GW5ZV.js.map +1 -0
  101. package/dist/chunk-NN3TUHIH.js +28 -0
  102. package/dist/chunk-NN3TUHIH.js.map +1 -0
  103. package/dist/chunk-NT4LBP7D.cjs +111 -0
  104. package/dist/chunk-NT4LBP7D.cjs.map +1 -0
  105. package/dist/chunk-OGKGIXFC.cjs +2162 -0
  106. package/dist/chunk-OGKGIXFC.cjs.map +1 -0
  107. package/dist/chunk-OXNXEQY7.js +2538 -0
  108. package/dist/chunk-OXNXEQY7.js.map +1 -0
  109. package/dist/chunk-P5BOFE5A.js +546 -0
  110. package/dist/chunk-P5BOFE5A.js.map +1 -0
  111. package/dist/chunk-Q2MFGYTE.cjs +1449 -0
  112. package/dist/chunk-Q2MFGYTE.cjs.map +1 -0
  113. package/dist/chunk-Q75DBVDY.cjs +68 -0
  114. package/dist/chunk-Q75DBVDY.cjs.map +1 -0
  115. package/dist/chunk-RQUFZAZ7.js +1608 -0
  116. package/dist/chunk-RQUFZAZ7.js.map +1 -0
  117. package/dist/chunk-SICKWUWB.js +62 -0
  118. package/dist/chunk-SICKWUWB.js.map +1 -0
  119. package/dist/chunk-T343CCH5.js +1190 -0
  120. package/dist/chunk-T343CCH5.js.map +1 -0
  121. package/dist/chunk-T5H5PNLN.js +701 -0
  122. package/dist/chunk-T5H5PNLN.js.map +1 -0
  123. package/dist/chunk-U3LK2GID.js +2122 -0
  124. package/dist/chunk-U3LK2GID.js.map +1 -0
  125. package/dist/chunk-UFAJY2DM.js +62 -0
  126. package/dist/chunk-UFAJY2DM.js.map +1 -0
  127. package/dist/chunk-VC5LMUVQ.cjs +20 -0
  128. package/dist/chunk-VC5LMUVQ.cjs.map +1 -0
  129. package/dist/chunk-VM7WFMKI.cjs +76 -0
  130. package/dist/chunk-VM7WFMKI.cjs.map +1 -0
  131. package/dist/chunk-W2WTP6HS.cjs +233 -0
  132. package/dist/chunk-W2WTP6HS.cjs.map +1 -0
  133. package/dist/chunk-WH7PYHZY.cjs +35 -0
  134. package/dist/chunk-WH7PYHZY.cjs.map +1 -0
  135. package/dist/chunk-XU3OMQ7V.js +98 -0
  136. package/dist/chunk-XU3OMQ7V.js.map +1 -0
  137. package/dist/chunk-XWPDRMZG.js +62 -0
  138. package/dist/chunk-XWPDRMZG.js.map +1 -0
  139. package/dist/chunk-Y3CPKNB7.js +67 -0
  140. package/dist/chunk-Y3CPKNB7.js.map +1 -0
  141. package/dist/chunk-YNVRDD2P.js +98 -0
  142. package/dist/chunk-YNVRDD2P.js.map +1 -0
  143. package/dist/chunk-YSYR54XR.js +92 -0
  144. package/dist/chunk-YSYR54XR.js.map +1 -0
  145. package/dist/chunk-YTYDQBVY.cjs +162 -0
  146. package/dist/chunk-YTYDQBVY.cjs.map +1 -0
  147. package/dist/core/index.cjs +807 -4333
  148. package/dist/core/index.cjs.map +1 -1
  149. package/dist/core/index.js +14 -4130
  150. package/dist/core/index.js.map +1 -1
  151. package/dist/i18n/index.cjs +86 -558
  152. package/dist/i18n/index.cjs.map +1 -1
  153. package/dist/i18n/index.js +1 -544
  154. package/dist/i18n/index.js.map +1 -1
  155. package/dist/index.cjs +1432 -17140
  156. package/dist/index.cjs.map +1 -1
  157. package/dist/index.d.cts +1 -1
  158. package/dist/index.d.ts +1 -1
  159. package/dist/index.js +31 -16785
  160. package/dist/index.js.map +1 -1
  161. package/dist/marketing/index.cjs +142 -3072
  162. package/dist/marketing/index.cjs.map +1 -1
  163. package/dist/marketing/index.js +11 -3042
  164. package/dist/marketing/index.js.map +1 -1
  165. package/dist/motion/index.cjs +26 -1222
  166. package/dist/motion/index.cjs.map +1 -1
  167. package/dist/motion/index.js +2 -1215
  168. package/dist/motion/index.js.map +1 -1
  169. package/dist/nav/index.cjs +101 -1518
  170. package/dist/nav/index.cjs.map +1 -1
  171. package/dist/nav/index.js +4 -1498
  172. package/dist/nav/index.js.map +1 -1
  173. package/dist/report/index.cjs +171 -2403
  174. package/dist/report/index.cjs.map +1 -1
  175. package/dist/report/index.js +3 -2363
  176. package/dist/report/index.js.map +1 -1
  177. package/dist/sections/index.cjs +22 -377
  178. package/dist/sections/index.cjs.map +1 -1
  179. package/dist/sections/index.d.cts +1 -1
  180. package/dist/sections/index.d.ts +1 -1
  181. package/dist/sections/index.js +6 -369
  182. package/dist/sections/index.js.map +1 -1
  183. package/dist/social-proof/index.cjs +53 -1250
  184. package/dist/social-proof/index.cjs.map +1 -1
  185. package/dist/social-proof/index.js +6 -1235
  186. package/dist/social-proof/index.js.map +1 -1
  187. package/dist/theme/index.cjs +38 -565
  188. package/dist/theme/index.cjs.map +1 -1
  189. package/dist/theme/index.js +2 -555
  190. package/dist/theme/index.js.map +1 -1
  191. package/dist/web/client/index.cjs +38 -491
  192. package/dist/web/client/index.cjs.map +1 -1
  193. package/dist/web/client/index.js +4 -483
  194. package/dist/web/client/index.js.map +1 -1
  195. package/dist/web/index.cjs +158 -1346
  196. package/dist/web/index.cjs.map +1 -1
  197. package/dist/web/index.js +9 -1305
  198. package/dist/web/index.js.map +1 -1
  199. package/dist/web/server/index.cjs +26 -563
  200. package/dist/web/server/index.cjs.map +1 -1
  201. package/dist/web/server/index.js +1 -560
  202. package/dist/web/server/index.js.map +1 -1
  203. package/package.json +1 -1
package/dist/nav/index.js CHANGED
@@ -1,1501 +1,7 @@
1
1
  "use client";
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 };
2
+ export { LocaleDropdown, MDXOutboundLink, NavbarMegaMenu, NavbarMegaMenuItem, NavbarMegaMenuSection, NavbarMobileActions, NavbarMobileNavItem, NavbarMobileSeparator, NavbarV2, NavbarV2Actions, NavbarV2Brand, NavbarV2Tab, NavbarV2TabMenu, NavbarV2Tabs, SiteFooter } from '../chunk-JNASH4OQ.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';
1500
6
  //# sourceMappingURL=out.js.map
1501
7
  //# sourceMappingURL=index.js.map