@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
@@ -0,0 +1,1042 @@
1
+ 'use strict';
2
+
3
+ var chunkLJADZITX_cjs = require('./chunk-LJADZITX.cjs');
4
+ var chunkMDB2WCRQ_cjs = require('./chunk-MDB2WCRQ.cjs');
5
+ var react = require('react');
6
+ var clsx3 = require('clsx');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+
9
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
10
+
11
+ var clsx3__default = /*#__PURE__*/_interopDefault(clsx3);
12
+
13
+ var NavbarMobileNavItem = react.forwardRef(
14
+ ({ as: Component = "a", className, active, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
15
+ Component,
16
+ {
17
+ ref,
18
+ className: clsx3__default.default(
19
+ "ds-navbar__mobile-nav-item",
20
+ active && "ds-navbar__mobile-nav-item--active",
21
+ className
22
+ ),
23
+ "aria-current": active ? "page" : void 0,
24
+ ...props,
25
+ children
26
+ }
27
+ )
28
+ );
29
+ NavbarMobileNavItem.displayName = "NavbarMobileNavItem";
30
+ function NavbarMobileSeparator({ className }) {
31
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: clsx3__default.default("ds-navbar__mobile-separator", className), role: "separator" });
32
+ }
33
+ NavbarMobileSeparator.displayName = "NavbarMobileSeparator";
34
+ var NavbarMobileActions = react.forwardRef(
35
+ ({ className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: clsx3__default.default("ds-navbar__mobile-actions", className), ...props, children })
36
+ );
37
+ NavbarMobileActions.displayName = "NavbarMobileActions";
38
+ var ChevronDown = () => /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ jsxRuntime.jsx(
39
+ "path",
40
+ {
41
+ d: "M4 6L8 10L12 6",
42
+ stroke: "currentColor",
43
+ strokeWidth: "1.5",
44
+ strokeLinecap: "round",
45
+ strokeLinejoin: "round"
46
+ }
47
+ ) });
48
+ var NavbarMegaMenu = react.forwardRef(
49
+ ({ trigger, children, className, isOpen: controlledOpen, onOpenChange, variant = "fullWidth" }, ref) => {
50
+ const [internalOpen, setInternalOpen] = react.useState(false);
51
+ const isControlled = controlledOpen !== void 0;
52
+ const isOpen = isControlled ? controlledOpen : internalOpen;
53
+ const containerRef = react.useRef(null);
54
+ const triggerRef = react.useRef(null);
55
+ const timeoutRef = react.useRef(null);
56
+ const handleOpen = react.useCallback(() => {
57
+ const newState = true;
58
+ if (isOpen !== newState) {
59
+ if (!isControlled) setInternalOpen(newState);
60
+ onOpenChange?.(newState);
61
+ }
62
+ }, [isOpen, isControlled, onOpenChange]);
63
+ const handleClose = react.useCallback(() => {
64
+ const newState = false;
65
+ if (isOpen !== newState) {
66
+ if (!isControlled) setInternalOpen(newState);
67
+ onOpenChange?.(newState);
68
+ }
69
+ }, [isOpen, isControlled, onOpenChange]);
70
+ const handleToggle = react.useCallback(() => {
71
+ if (isOpen) {
72
+ handleClose();
73
+ } else {
74
+ handleOpen();
75
+ }
76
+ }, [isOpen, handleClose, handleOpen]);
77
+ const handleMouseEnter = react.useCallback(() => {
78
+ if (timeoutRef.current) {
79
+ window.clearTimeout(timeoutRef.current);
80
+ timeoutRef.current = null;
81
+ }
82
+ handleOpen();
83
+ }, [handleOpen]);
84
+ const handleMouseLeave = react.useCallback(() => {
85
+ if (timeoutRef.current) {
86
+ window.clearTimeout(timeoutRef.current);
87
+ }
88
+ timeoutRef.current = window.setTimeout(() => {
89
+ handleClose();
90
+ }, 150);
91
+ }, [handleClose]);
92
+ react.useEffect(() => {
93
+ return () => {
94
+ if (timeoutRef.current) window.clearTimeout(timeoutRef.current);
95
+ };
96
+ }, []);
97
+ react.useEffect(() => {
98
+ if (!isOpen) return;
99
+ const handleClickOutside = (event) => {
100
+ if (containerRef.current && !containerRef.current.contains(event.target) && triggerRef.current && !triggerRef.current.contains(event.target)) {
101
+ handleClose();
102
+ }
103
+ };
104
+ document.addEventListener("mousedown", handleClickOutside);
105
+ return () => document.removeEventListener("mousedown", handleClickOutside);
106
+ }, [isOpen, handleClose]);
107
+ react.useEffect(() => {
108
+ if (!isOpen) return;
109
+ const handleEscape = (e) => {
110
+ if (e.key === "Escape") handleClose();
111
+ };
112
+ document.addEventListener("keydown", handleEscape);
113
+ return () => document.removeEventListener("keydown", handleEscape);
114
+ }, [isOpen, handleClose]);
115
+ return /* @__PURE__ */ jsxRuntime.jsxs(
116
+ "div",
117
+ {
118
+ className: clsx3__default.default("ds-navbar-mega-menu", `ds-navbar-mega-menu--${variant}`, className),
119
+ ref,
120
+ onMouseEnter: handleMouseEnter,
121
+ onMouseLeave: handleMouseLeave,
122
+ children: [
123
+ /* @__PURE__ */ jsxRuntime.jsxs(
124
+ "button",
125
+ {
126
+ ref: triggerRef,
127
+ className: "ds-navbar-mega-menu__trigger",
128
+ onClick: handleToggle,
129
+ "aria-expanded": isOpen,
130
+ "aria-haspopup": "true",
131
+ children: [
132
+ trigger,
133
+ /* @__PURE__ */ jsxRuntime.jsx(
134
+ "span",
135
+ {
136
+ className: "ds-navbar-mega-menu__chevron",
137
+ "data-state": isOpen ? "open" : "closed",
138
+ children: /* @__PURE__ */ jsxRuntime.jsx(ChevronDown, {})
139
+ }
140
+ )
141
+ ]
142
+ }
143
+ ),
144
+ /* @__PURE__ */ jsxRuntime.jsx("div", { ref: containerRef, children: /* @__PURE__ */ jsxRuntime.jsx(
145
+ "div",
146
+ {
147
+ className: clsx3__default.default(
148
+ "ds-navbar-mega-menu__content",
149
+ `ds-navbar-mega-menu__content--${variant}`
150
+ ),
151
+ "data-state": isOpen ? "open" : "closed",
152
+ children: variant === "fullWidth" ? /* @__PURE__ */ jsxRuntime.jsx(chunkMDB2WCRQ_cjs.Container, { children }) : children
153
+ }
154
+ ) })
155
+ ]
156
+ }
157
+ );
158
+ }
159
+ );
160
+ NavbarMegaMenu.displayName = "NavbarMegaMenu";
161
+ function NavbarMegaMenuSection({ heading, children, className }) {
162
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: clsx3__default.default("ds-navbar-mega-menu__section", className), children: [
163
+ heading && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "ds-navbar-mega-menu__section-heading", children: heading }),
164
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-navbar-mega-menu__section-items", children })
165
+ ] });
166
+ }
167
+ NavbarMegaMenuSection.displayName = "NavbarMegaMenuSection";
168
+ var NavbarMegaMenuItem = react.forwardRef(
169
+ ({ icon, label, description, className, as: Comp = "a", ...rest }, ref) => {
170
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-navbar-mega-menu__item-wrapper", children: /* @__PURE__ */ jsxRuntime.jsxs(
171
+ Comp,
172
+ {
173
+ ref,
174
+ className: clsx3__default.default("ds-navbar-mega-menu__item", className),
175
+ ...rest,
176
+ children: [
177
+ icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-navbar-mega-menu__item-icon", children: icon }),
178
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ds-navbar-mega-menu__item-text", children: [
179
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-navbar-mega-menu__item-label", children: label }),
180
+ description && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-navbar-mega-menu__item-description", children: description })
181
+ ] })
182
+ ]
183
+ }
184
+ ) });
185
+ }
186
+ );
187
+ NavbarMegaMenuItem.displayName = "NavbarMegaMenuItem";
188
+ var ChevronDown2 = () => /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "8", height: "8", viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ jsxRuntime.jsx(
189
+ "path",
190
+ {
191
+ d: "M4 6L8 10L12 6",
192
+ stroke: "currentColor",
193
+ strokeWidth: "1.5",
194
+ strokeLinecap: "round",
195
+ strokeLinejoin: "round"
196
+ }
197
+ ) });
198
+ var ScrollContext = react.createContext({ scrolled: false });
199
+ var TabsContext = react.createContext({
200
+ activeMenuId: null,
201
+ openMenu: () => {
202
+ },
203
+ closeMenu: () => {
204
+ }
205
+ });
206
+ function useFocusTrap(containerRef, active) {
207
+ react.useEffect(() => {
208
+ if (!active || !containerRef.current) return;
209
+ const container = containerRef.current;
210
+ const FOCUSABLE = 'a[href], button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])';
211
+ const handleKeyDown = (e) => {
212
+ if (e.key !== "Tab") return;
213
+ const focusable2 = Array.from(container.querySelectorAll(FOCUSABLE));
214
+ if (focusable2.length === 0) {
215
+ e.preventDefault();
216
+ return;
217
+ }
218
+ const first = focusable2[0];
219
+ const last = focusable2[focusable2.length - 1];
220
+ if (e.shiftKey) {
221
+ if (document.activeElement === first) {
222
+ e.preventDefault();
223
+ last.focus();
224
+ }
225
+ } else {
226
+ if (document.activeElement === last) {
227
+ e.preventDefault();
228
+ first.focus();
229
+ }
230
+ }
231
+ };
232
+ const focusable = container.querySelectorAll(FOCUSABLE);
233
+ if (focusable.length > 0) {
234
+ focusable[0].focus();
235
+ }
236
+ container.addEventListener("keydown", handleKeyDown);
237
+ return () => container.removeEventListener("keydown", handleKeyDown);
238
+ }, [active, containerRef]);
239
+ }
240
+ var HYSTERESIS_RATIO = 0.25;
241
+ var NavbarV2 = react.forwardRef(
242
+ ({
243
+ className,
244
+ mobileContent,
245
+ mobileToggleLabels,
246
+ isMenuOpen,
247
+ onMenuOpenChange,
248
+ scrollBorder = true,
249
+ scrollThreshold = 32,
250
+ children,
251
+ ...props
252
+ }, ref) => {
253
+ const [internalMenuOpen, setInternalMenuOpen] = react.useState(false);
254
+ const isMobileMenuOpen = isMenuOpen !== void 0 ? isMenuOpen : internalMenuOpen;
255
+ const navRef = react.useRef(null);
256
+ const overlayRef = react.useRef(null);
257
+ const [navHeight, setNavHeight] = react.useState(64);
258
+ const openLabel = mobileToggleLabels?.open ?? "Open menu";
259
+ const closeLabel = mobileToggleLabels?.close ?? "Close menu";
260
+ const [scrolled, setScrolled] = react.useState(() => {
261
+ if (typeof window !== "undefined") {
262
+ return window.scrollY > scrollThreshold;
263
+ }
264
+ return false;
265
+ });
266
+ react.useEffect(() => {
267
+ if (!scrollBorder) return;
268
+ const lowerBound = scrollThreshold * HYSTERESIS_RATIO;
269
+ const handleScroll = () => {
270
+ const y = window.scrollY;
271
+ setScrolled((prev) => {
272
+ if (!prev && y > scrollThreshold) return true;
273
+ if (prev && y < lowerBound) return false;
274
+ return prev;
275
+ });
276
+ };
277
+ handleScroll();
278
+ window.addEventListener("scroll", handleScroll, { passive: true });
279
+ return () => window.removeEventListener("scroll", handleScroll);
280
+ }, [scrollBorder, scrollThreshold]);
281
+ const isScrolled = scrollBorder && scrolled;
282
+ const scrollCtx = react.useMemo(
283
+ () => ({ scrolled: isScrolled }),
284
+ [isScrolled]
285
+ );
286
+ const handleToggle = () => {
287
+ const newState = !isMobileMenuOpen;
288
+ setInternalMenuOpen(newState);
289
+ onMenuOpenChange?.(newState);
290
+ };
291
+ react.useEffect(() => {
292
+ const el = navRef.current;
293
+ if (!el) return;
294
+ const observer = new ResizeObserver((entries) => {
295
+ for (const entry of entries) {
296
+ const h = entry.contentRect.height;
297
+ setNavHeight(h);
298
+ el.style.setProperty("--navbar-overlap", `${h}px`);
299
+ }
300
+ });
301
+ observer.observe(el);
302
+ return () => observer.disconnect();
303
+ }, []);
304
+ react.useEffect(() => {
305
+ if (isMobileMenuOpen) {
306
+ document.body.style.overflow = "hidden";
307
+ return () => {
308
+ document.body.style.overflow = "";
309
+ };
310
+ }
311
+ }, [isMobileMenuOpen]);
312
+ react.useEffect(() => {
313
+ if (!isMobileMenuOpen) return;
314
+ const handleEscape = (e) => {
315
+ if (e.key === "Escape") {
316
+ setInternalMenuOpen(false);
317
+ onMenuOpenChange?.(false);
318
+ }
319
+ };
320
+ document.addEventListener("keydown", handleEscape);
321
+ return () => document.removeEventListener("keydown", handleEscape);
322
+ }, [isMobileMenuOpen, onMenuOpenChange]);
323
+ useFocusTrap(overlayRef, isMobileMenuOpen);
324
+ const mergedRef = useMergedRef(ref, navRef);
325
+ return /* @__PURE__ */ jsxRuntime.jsx(ScrollContext.Provider, { value: scrollCtx, children: /* @__PURE__ */ jsxRuntime.jsxs(
326
+ "nav",
327
+ {
328
+ ref: mergedRef,
329
+ className: clsx3__default.default(
330
+ "ds-navbar-v2",
331
+ isScrolled && "ds-navbar-v2--scrolled",
332
+ className
333
+ ),
334
+ ...props,
335
+ children: [
336
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-navbar-v2__container", children: [
337
+ children,
338
+ /* @__PURE__ */ jsxRuntime.jsx(
339
+ "button",
340
+ {
341
+ className: "ds-navbar-v2__toggle",
342
+ onClick: handleToggle,
343
+ "aria-label": isMobileMenuOpen ? closeLabel : openLabel,
344
+ "aria-expanded": isMobileMenuOpen,
345
+ children: isMobileMenuOpen ? /* @__PURE__ */ jsxRuntime.jsxs(
346
+ "svg",
347
+ {
348
+ width: "24",
349
+ height: "24",
350
+ viewBox: "0 0 24 24",
351
+ fill: "none",
352
+ stroke: "currentColor",
353
+ strokeWidth: "2",
354
+ strokeLinecap: "round",
355
+ strokeLinejoin: "round",
356
+ children: [
357
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
358
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
359
+ ]
360
+ }
361
+ ) : /* @__PURE__ */ jsxRuntime.jsxs(
362
+ "svg",
363
+ {
364
+ width: "24",
365
+ height: "24",
366
+ viewBox: "0 0 24 24",
367
+ fill: "none",
368
+ stroke: "currentColor",
369
+ strokeWidth: "2",
370
+ strokeLinecap: "round",
371
+ strokeLinejoin: "round",
372
+ children: [
373
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "3", y1: "12", x2: "21", y2: "12" }),
374
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "3", y1: "6", x2: "21", y2: "6" }),
375
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "3", y1: "18", x2: "21", y2: "18" })
376
+ ]
377
+ }
378
+ )
379
+ }
380
+ )
381
+ ] }),
382
+ /* @__PURE__ */ jsxRuntime.jsx(
383
+ "div",
384
+ {
385
+ ref: overlayRef,
386
+ className: "ds-navbar-v2__mobile-overlay",
387
+ style: { top: navHeight },
388
+ "data-state": isMobileMenuOpen ? "open" : "closed",
389
+ role: "dialog",
390
+ "aria-modal": "true",
391
+ "aria-label": closeLabel,
392
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-navbar-v2__mobile-content", children: mobileContent })
393
+ }
394
+ )
395
+ ]
396
+ }
397
+ ) });
398
+ }
399
+ );
400
+ NavbarV2.displayName = "NavbarV2";
401
+ var NavbarV2Brand = react.forwardRef(
402
+ ({ as: Component = "a", className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(Component, { ref, className: clsx3__default.default("ds-navbar-v2__brand", className), ...props, children })
403
+ );
404
+ NavbarV2Brand.displayName = "NavbarV2Brand";
405
+ var NavbarV2Tabs = react.forwardRef(
406
+ ({ className, children, ...props }, ref) => {
407
+ const [activeMenuId, setActiveMenuId] = react.useState(null);
408
+ const { scrolled } = react.useContext(ScrollContext);
409
+ const ctxValue = react.useMemo(
410
+ () => ({
411
+ activeMenuId,
412
+ openMenu: (id) => setActiveMenuId(id),
413
+ closeMenu: (id) => setActiveMenuId((prev) => prev === id ? null : prev)
414
+ }),
415
+ [activeMenuId]
416
+ );
417
+ return /* @__PURE__ */ jsxRuntime.jsx(TabsContext.Provider, { value: ctxValue, children: /* @__PURE__ */ jsxRuntime.jsx(
418
+ "div",
419
+ {
420
+ ref,
421
+ className: clsx3__default.default(
422
+ "ds-navbar-v2__tabs",
423
+ scrolled && "ds-navbar-v2__tabs--demoted",
424
+ className
425
+ ),
426
+ ...props,
427
+ children
428
+ }
429
+ ) });
430
+ }
431
+ );
432
+ NavbarV2Tabs.displayName = "NavbarV2Tabs";
433
+ var NavbarV2Tab = react.forwardRef(
434
+ ({ as: Component = "button", active, icon, label, className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
435
+ Component,
436
+ {
437
+ ref,
438
+ className: clsx3__default.default("ds-navbar-v2__tab", active && "ds-navbar-v2__tab--active", className),
439
+ "aria-current": active ? "page" : void 0,
440
+ ...Component === "button" ? { type: "button" } : {},
441
+ ...props,
442
+ children: [
443
+ icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-navbar-v2__tab-icon", children: icon }),
444
+ label && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-navbar-v2__tab-label", children: label }),
445
+ children
446
+ ]
447
+ }
448
+ )
449
+ );
450
+ NavbarV2Tab.displayName = "NavbarV2Tab";
451
+ var NavbarV2TabMenu = react.forwardRef(
452
+ ({
453
+ icon,
454
+ label,
455
+ active,
456
+ children,
457
+ className,
458
+ isOpen: controlledOpen,
459
+ onOpenChange
460
+ }, ref) => {
461
+ const instanceId = react.useId();
462
+ const panelId = `navbar-v2-panel-${instanceId}`;
463
+ const { activeMenuId, openMenu, closeMenu } = react.useContext(TabsContext);
464
+ const isControlled = controlledOpen !== void 0;
465
+ const isOpen = isControlled ? controlledOpen : activeMenuId === instanceId;
466
+ const containerRef = react.useRef(null);
467
+ const triggerRef = react.useRef(null);
468
+ const panelRef = react.useRef(null);
469
+ const timeoutRef = react.useRef(null);
470
+ const handleOpen = react.useCallback(() => {
471
+ if (!isOpen) {
472
+ if (!isControlled) openMenu(instanceId);
473
+ onOpenChange?.(true);
474
+ }
475
+ }, [isOpen, isControlled, openMenu, instanceId, onOpenChange]);
476
+ const handleClose = react.useCallback(() => {
477
+ if (isOpen) {
478
+ if (!isControlled) closeMenu(instanceId);
479
+ onOpenChange?.(false);
480
+ }
481
+ }, [isOpen, isControlled, closeMenu, instanceId, onOpenChange]);
482
+ const handleToggle = react.useCallback(() => {
483
+ if (isOpen) handleClose();
484
+ else handleOpen();
485
+ }, [isOpen, handleClose, handleOpen]);
486
+ const handleMouseEnter = react.useCallback(() => {
487
+ if (timeoutRef.current) {
488
+ window.clearTimeout(timeoutRef.current);
489
+ timeoutRef.current = null;
490
+ }
491
+ handleOpen();
492
+ }, [handleOpen]);
493
+ const handleMouseLeave = react.useCallback(() => {
494
+ if (timeoutRef.current) window.clearTimeout(timeoutRef.current);
495
+ timeoutRef.current = window.setTimeout(handleClose, 150);
496
+ }, [handleClose]);
497
+ react.useEffect(() => {
498
+ return () => {
499
+ if (timeoutRef.current) window.clearTimeout(timeoutRef.current);
500
+ };
501
+ }, []);
502
+ react.useEffect(() => {
503
+ if (!isOpen) return;
504
+ const handleClickOutside = (event) => {
505
+ if (containerRef.current && !containerRef.current.contains(event.target) && triggerRef.current && !triggerRef.current.contains(event.target)) {
506
+ handleClose();
507
+ }
508
+ };
509
+ document.addEventListener("mousedown", handleClickOutside);
510
+ return () => document.removeEventListener("mousedown", handleClickOutside);
511
+ }, [isOpen, handleClose]);
512
+ react.useEffect(() => {
513
+ if (!isOpen) return;
514
+ const handleEscape = (e) => {
515
+ if (e.key === "Escape") {
516
+ handleClose();
517
+ triggerRef.current?.focus();
518
+ }
519
+ };
520
+ document.addEventListener("keydown", handleEscape);
521
+ return () => document.removeEventListener("keydown", handleEscape);
522
+ }, [isOpen, handleClose]);
523
+ react.useEffect(() => {
524
+ if (!isOpen || !panelRef.current) return;
525
+ const clampToViewport = () => {
526
+ const panel = panelRef.current;
527
+ if (!panel) return;
528
+ panel.style.setProperty("--panel-nudge", "0px");
529
+ const rect = panel.getBoundingClientRect();
530
+ const viewportWidth = window.innerWidth;
531
+ const EDGE_PADDING = 16;
532
+ if (rect.right > viewportWidth - EDGE_PADDING) {
533
+ const overflow = rect.right - (viewportWidth - EDGE_PADDING);
534
+ panel.style.setProperty("--panel-nudge", `${-overflow}px`);
535
+ } else if (rect.left < EDGE_PADDING) {
536
+ const overflow = EDGE_PADDING - rect.left;
537
+ panel.style.setProperty("--panel-nudge", `${overflow}px`);
538
+ }
539
+ };
540
+ requestAnimationFrame(clampToViewport);
541
+ window.addEventListener("resize", clampToViewport);
542
+ return () => window.removeEventListener("resize", clampToViewport);
543
+ }, [isOpen]);
544
+ const panelRefCallback = react.useCallback((node) => {
545
+ containerRef.current = node;
546
+ panelRef.current = node;
547
+ }, []);
548
+ return /* @__PURE__ */ jsxRuntime.jsxs(
549
+ "div",
550
+ {
551
+ ref,
552
+ className: clsx3__default.default("ds-navbar-v2__tab-menu", className),
553
+ onMouseEnter: handleMouseEnter,
554
+ onMouseLeave: handleMouseLeave,
555
+ children: [
556
+ /* @__PURE__ */ jsxRuntime.jsxs(
557
+ "button",
558
+ {
559
+ ref: triggerRef,
560
+ className: clsx3__default.default(
561
+ "ds-navbar-v2__tab",
562
+ (active || isOpen) && "ds-navbar-v2__tab--active"
563
+ ),
564
+ onClick: handleToggle,
565
+ "aria-expanded": isOpen,
566
+ "aria-haspopup": "true",
567
+ "aria-controls": isOpen ? panelId : void 0,
568
+ type: "button",
569
+ children: [
570
+ icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-navbar-v2__tab-icon", children: icon }),
571
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ds-navbar-v2__tab-label-row", children: [
572
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-navbar-v2__tab-label", children: label }),
573
+ /* @__PURE__ */ jsxRuntime.jsx(
574
+ "span",
575
+ {
576
+ className: "ds-navbar-v2__tab-chevron",
577
+ "data-state": isOpen ? "open" : "closed",
578
+ children: /* @__PURE__ */ jsxRuntime.jsx(ChevronDown2, {})
579
+ }
580
+ )
581
+ ] })
582
+ ]
583
+ }
584
+ ),
585
+ isOpen ? /* @__PURE__ */ jsxRuntime.jsx(
586
+ "div",
587
+ {
588
+ ref: panelRefCallback,
589
+ id: panelId,
590
+ className: "ds-navbar-v2__mega-panel",
591
+ "data-state": "open",
592
+ role: "region",
593
+ "aria-label": `${label} menu`,
594
+ children
595
+ }
596
+ ) : null
597
+ ]
598
+ }
599
+ );
600
+ }
601
+ );
602
+ NavbarV2TabMenu.displayName = "NavbarV2TabMenu";
603
+ var NavbarV2Actions = react.forwardRef(
604
+ ({ className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: clsx3__default.default("ds-navbar-v2__actions", className), ...props, children })
605
+ );
606
+ NavbarV2Actions.displayName = "NavbarV2Actions";
607
+ function useMergedRef(...refs) {
608
+ return react.useCallback(
609
+ (value) => {
610
+ for (const ref of refs) {
611
+ if (typeof ref === "function") {
612
+ ref(value);
613
+ } else if (ref && typeof ref === "object") {
614
+ ref.current = value;
615
+ }
616
+ }
617
+ },
618
+ // eslint-disable-next-line react-hooks/exhaustive-deps
619
+ refs
620
+ );
621
+ }
622
+ function FooterAccordionItem({ section, LinkComponent }) {
623
+ const [isOpen, setIsOpen] = react.useState(false);
624
+ return /* @__PURE__ */ jsxRuntime.jsxs(
625
+ "div",
626
+ {
627
+ className: clsx3__default.default(
628
+ "ds-footer__accordion-item",
629
+ isOpen && "ds-footer__accordion-item--open"
630
+ ),
631
+ children: [
632
+ /* @__PURE__ */ jsxRuntime.jsxs(
633
+ "button",
634
+ {
635
+ type: "button",
636
+ className: "ds-footer__accordion-trigger",
637
+ "aria-expanded": isOpen,
638
+ onClick: () => setIsOpen((prev) => !prev),
639
+ children: [
640
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: section.title }),
641
+ /* @__PURE__ */ jsxRuntime.jsx(
642
+ "svg",
643
+ {
644
+ className: "ds-footer__accordion-chevron",
645
+ width: "16",
646
+ height: "16",
647
+ viewBox: "0 0 24 24",
648
+ fill: "none",
649
+ stroke: "currentColor",
650
+ strokeWidth: "2",
651
+ strokeLinecap: "round",
652
+ strokeLinejoin: "round",
653
+ "aria-hidden": "true",
654
+ children: /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "6 9 12 15 18 9" })
655
+ }
656
+ )
657
+ ]
658
+ }
659
+ ),
660
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-footer__accordion-panel", hidden: !isOpen, children: /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "ds-footer__links", children: section.links.map((link, idx) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsxs(LinkComponent, { href: link.href, className: "ds-footer__link", children: [
661
+ link.label,
662
+ link.isNew && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-footer__badge", children: "NEW" })
663
+ ] }) }, idx)) }) })
664
+ ]
665
+ }
666
+ );
667
+ }
668
+ var SiteFooter = react.forwardRef(
669
+ ({
670
+ cta,
671
+ sections = [],
672
+ orientationLine,
673
+ linkAs,
674
+ brand,
675
+ tagline,
676
+ socials,
677
+ trustBadges,
678
+ controls,
679
+ legalLinks = [],
680
+ copyright,
681
+ companyInfo,
682
+ bottomExtra,
683
+ bottomActions,
684
+ className,
685
+ ...props
686
+ }, ref) => {
687
+ const currentYear = (/* @__PURE__ */ new Date()).getFullYear();
688
+ const defaultCopyright = copyright || `\xA9 ${currentYear}. All rights reserved.`;
689
+ const resolvedControls = controls || bottomActions;
690
+ const LinkComponent = linkAs || "a";
691
+ return /* @__PURE__ */ jsxRuntime.jsxs("footer", { ref, className: clsx3__default.default("ds-footer", className), ...props, children: [
692
+ cta && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-footer__cta", "data-footer-zone": "cta", children: /* @__PURE__ */ jsxRuntime.jsx(chunkMDB2WCRQ_cjs.Container, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-footer__cta-content", children: [
693
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "ds-footer__cta-headline", children: cta.headline }),
694
+ cta.subtext && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "ds-footer__cta-subtext", children: cta.subtext }),
695
+ (cta.primaryCta || cta.secondaryCta) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-footer__cta-actions", children: [
696
+ cta.primaryCta,
697
+ cta.secondaryCta
698
+ ] }),
699
+ cta.trustLine && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "ds-footer__cta-trust", children: cta.trustLine })
700
+ ] }) }) }),
701
+ sections.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-footer__nav", "data-footer-zone": "navigation", children: /* @__PURE__ */ jsxRuntime.jsxs(chunkMDB2WCRQ_cjs.Container, { children: [
702
+ orientationLine && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-footer__orientation", children: orientationLine }),
703
+ /* @__PURE__ */ jsxRuntime.jsx(
704
+ "nav",
705
+ {
706
+ className: "ds-footer__grid",
707
+ "aria-label": "Footer navigation",
708
+ children: sections.map((section, idx) => /* @__PURE__ */ jsxRuntime.jsxs(
709
+ "div",
710
+ {
711
+ className: "ds-footer__column",
712
+ "data-footer-section": section.title.toLowerCase().replace(/\s+/g, "-"),
713
+ children: [
714
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "ds-footer__heading", children: section.title }),
715
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "ds-footer__links", children: section.links.map((link, linkIdx) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsxs(
716
+ LinkComponent,
717
+ {
718
+ href: link.href,
719
+ className: "ds-footer__link",
720
+ children: [
721
+ link.label,
722
+ link.isNew && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-footer__badge", children: "NEW" })
723
+ ]
724
+ }
725
+ ) }, linkIdx)) })
726
+ ]
727
+ },
728
+ idx
729
+ ))
730
+ }
731
+ ),
732
+ /* @__PURE__ */ jsxRuntime.jsx(
733
+ "nav",
734
+ {
735
+ className: "ds-footer__mobile-nav",
736
+ "aria-label": "Footer navigation",
737
+ children: sections.map((section, idx) => /* @__PURE__ */ jsxRuntime.jsx(
738
+ FooterAccordionItem,
739
+ {
740
+ section,
741
+ LinkComponent
742
+ },
743
+ idx
744
+ ))
745
+ }
746
+ )
747
+ ] }) }),
748
+ (brand || socials || trustBadges) && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-footer__authority", "data-footer-zone": "authority", children: /* @__PURE__ */ jsxRuntime.jsx(chunkMDB2WCRQ_cjs.Container, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-footer__authority-content", children: [
749
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-footer__brand", children: [
750
+ brand && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-footer__logo", children: brand }),
751
+ tagline && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "ds-footer__tagline", children: tagline }),
752
+ socials && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-footer__socials", children: socials })
753
+ ] }),
754
+ trustBadges && trustBadges.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-footer__trust-badges", children: trustBadges.map((badge, idx) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-footer__trust-badge", children: badge.label }, idx)) })
755
+ ] }) }) }),
756
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-footer__bottom", "data-footer-zone": "legal", children: /* @__PURE__ */ jsxRuntime.jsxs(chunkMDB2WCRQ_cjs.Container, { children: [
757
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-footer__bottom-content", children: [
758
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-footer__copyright", children: copyright || defaultCopyright }),
759
+ resolvedControls && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-footer__controls", children: resolvedControls }),
760
+ legalLinks.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-footer__legal", children: legalLinks.map((link, idx) => /* @__PURE__ */ jsxRuntime.jsx(
761
+ LinkComponent,
762
+ {
763
+ href: link.href,
764
+ className: "ds-footer__legal-link",
765
+ children: link.label
766
+ },
767
+ idx
768
+ )) })
769
+ ] }),
770
+ bottomExtra && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-footer__bottom-extra", children: bottomExtra }),
771
+ companyInfo && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "ds-footer__company-info", children: companyInfo })
772
+ ] }) })
773
+ ] });
774
+ }
775
+ );
776
+ SiteFooter.displayName = "SiteFooter";
777
+ var GlobeIcon = () => /* @__PURE__ */ jsxRuntime.jsxs(
778
+ "svg",
779
+ {
780
+ width: "16",
781
+ height: "16",
782
+ viewBox: "0 0 24 24",
783
+ fill: "none",
784
+ stroke: "currentColor",
785
+ strokeWidth: "2",
786
+ strokeLinecap: "round",
787
+ strokeLinejoin: "round",
788
+ "aria-hidden": "true",
789
+ children: [
790
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "10" }),
791
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M2 12h20" }),
792
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z" })
793
+ ]
794
+ }
795
+ );
796
+ var ChevronDownIcon = () => /* @__PURE__ */ jsxRuntime.jsx(
797
+ "svg",
798
+ {
799
+ width: "12",
800
+ height: "12",
801
+ viewBox: "0 0 16 16",
802
+ fill: "none",
803
+ stroke: "currentColor",
804
+ strokeWidth: "1.5",
805
+ strokeLinecap: "round",
806
+ strokeLinejoin: "round",
807
+ "aria-hidden": "true",
808
+ children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M4 6L8 10L12 6" })
809
+ }
810
+ );
811
+ var CheckIcon = () => /* @__PURE__ */ jsxRuntime.jsx(
812
+ "svg",
813
+ {
814
+ width: "14",
815
+ height: "14",
816
+ viewBox: "0 0 24 24",
817
+ fill: "none",
818
+ stroke: "currentColor",
819
+ strokeWidth: "2.5",
820
+ strokeLinecap: "round",
821
+ strokeLinejoin: "round",
822
+ "aria-hidden": "true",
823
+ children: /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "20 6 9 17 4 12" })
824
+ }
825
+ );
826
+ var LocaleDropdown = react.forwardRef(
827
+ ({
828
+ locales,
829
+ activeLocale,
830
+ onLocaleChange,
831
+ optionAs: OptionComponent = "button",
832
+ getHref,
833
+ className,
834
+ direction = "down",
835
+ align = "right"
836
+ }, ref) => {
837
+ const [isOpen, setIsOpen] = react.useState(false);
838
+ const [focusIndex, setFocusIndex] = react.useState(-1);
839
+ const containerRef = react.useRef(null);
840
+ const triggerRef = react.useRef(null);
841
+ const listRef = react.useRef(null);
842
+ const instanceId = react.useId();
843
+ const listboxId = `locale-dropdown-${instanceId}`;
844
+ const currentLocale = locales.find((l) => l.code === activeLocale) ?? locales[0];
845
+ const handleToggle = react.useCallback(() => {
846
+ setIsOpen((prev) => {
847
+ if (!prev) setFocusIndex(-1);
848
+ return !prev;
849
+ });
850
+ }, []);
851
+ const handleClose = react.useCallback(() => {
852
+ setIsOpen(false);
853
+ setFocusIndex(-1);
854
+ triggerRef.current?.focus();
855
+ }, []);
856
+ const handleSelect = react.useCallback(
857
+ (code) => {
858
+ onLocaleChange?.(code);
859
+ handleClose();
860
+ },
861
+ [onLocaleChange, handleClose]
862
+ );
863
+ react.useEffect(() => {
864
+ if (!isOpen) return;
865
+ const handleClickOutside = (e) => {
866
+ if (containerRef.current && !containerRef.current.contains(e.target)) {
867
+ handleClose();
868
+ }
869
+ };
870
+ document.addEventListener("mousedown", handleClickOutside);
871
+ return () => document.removeEventListener("mousedown", handleClickOutside);
872
+ }, [isOpen, handleClose]);
873
+ const handleKeyDown = react.useCallback(
874
+ (e) => {
875
+ if (!isOpen) {
876
+ if (e.key === "ArrowDown" || e.key === "Enter" || e.key === " ") {
877
+ e.preventDefault();
878
+ setIsOpen(true);
879
+ setFocusIndex(0);
880
+ }
881
+ return;
882
+ }
883
+ switch (e.key) {
884
+ case "Escape":
885
+ e.preventDefault();
886
+ handleClose();
887
+ break;
888
+ case "ArrowDown":
889
+ e.preventDefault();
890
+ setFocusIndex((prev) => (prev + 1) % locales.length);
891
+ break;
892
+ case "ArrowUp":
893
+ e.preventDefault();
894
+ setFocusIndex((prev) => (prev - 1 + locales.length) % locales.length);
895
+ break;
896
+ case "Enter":
897
+ case " ":
898
+ e.preventDefault();
899
+ if (focusIndex >= 0 && focusIndex < locales.length) {
900
+ handleSelect(locales[focusIndex].code);
901
+ }
902
+ break;
903
+ case "Home":
904
+ e.preventDefault();
905
+ setFocusIndex(0);
906
+ break;
907
+ case "End":
908
+ e.preventDefault();
909
+ setFocusIndex(locales.length - 1);
910
+ break;
911
+ case "Tab":
912
+ handleClose();
913
+ break;
914
+ }
915
+ },
916
+ [isOpen, focusIndex, locales, handleClose, handleSelect]
917
+ );
918
+ react.useEffect(() => {
919
+ if (!isOpen || focusIndex < 0 || !listRef.current) return;
920
+ const items = listRef.current.querySelectorAll('[role="option"]');
921
+ items[focusIndex]?.scrollIntoView({ block: "nearest" });
922
+ }, [isOpen, focusIndex]);
923
+ const activeDescendantId = isOpen && focusIndex >= 0 ? `${listboxId}-option-${focusIndex}` : void 0;
924
+ return /* @__PURE__ */ jsxRuntime.jsx(
925
+ "div",
926
+ {
927
+ ref,
928
+ className: clsx3__default.default(
929
+ "ds-locale-dropdown",
930
+ direction === "up" && "ds-locale-dropdown--up",
931
+ align === "left" && "ds-locale-dropdown--align-left",
932
+ align === "center" && "ds-locale-dropdown--align-center",
933
+ className
934
+ ),
935
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { ref: containerRef, className: "ds-locale-dropdown__wrapper", children: [
936
+ /* @__PURE__ */ jsxRuntime.jsxs(
937
+ "button",
938
+ {
939
+ ref: triggerRef,
940
+ type: "button",
941
+ className: "ds-locale-dropdown__trigger",
942
+ onClick: handleToggle,
943
+ onKeyDown: handleKeyDown,
944
+ "aria-haspopup": "listbox",
945
+ "aria-expanded": isOpen,
946
+ "aria-controls": isOpen ? listboxId : void 0,
947
+ "aria-activedescendant": activeDescendantId,
948
+ "aria-label": `Language: ${currentLocale.label}. Change language.`,
949
+ children: [
950
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-locale-dropdown__trigger-icon", children: /* @__PURE__ */ jsxRuntime.jsx(GlobeIcon, {}) }),
951
+ currentLocale.flag && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-locale-dropdown__trigger-flag", "aria-hidden": "true", children: currentLocale.flag }),
952
+ /* @__PURE__ */ jsxRuntime.jsx(
953
+ "span",
954
+ {
955
+ className: "ds-locale-dropdown__trigger-chevron",
956
+ "data-state": isOpen ? "open" : "closed",
957
+ children: /* @__PURE__ */ jsxRuntime.jsx(ChevronDownIcon, {})
958
+ }
959
+ )
960
+ ]
961
+ }
962
+ ),
963
+ /* @__PURE__ */ jsxRuntime.jsx(
964
+ "div",
965
+ {
966
+ ref: listRef,
967
+ id: listboxId,
968
+ className: "ds-locale-dropdown__panel",
969
+ role: "listbox",
970
+ "aria-label": "Select language",
971
+ "data-state": isOpen ? "open" : "closed",
972
+ onKeyDown: handleKeyDown,
973
+ children: locales.map((locale, index) => {
974
+ const isActive = locale.code === activeLocale;
975
+ const isFocused = index === focusIndex;
976
+ const optionId = `${listboxId}-option-${index}`;
977
+ const optionProps = {
978
+ id: optionId,
979
+ role: "option",
980
+ "aria-selected": isActive,
981
+ className: clsx3__default.default(
982
+ "ds-locale-dropdown__option",
983
+ isActive && "ds-locale-dropdown__option--active",
984
+ isFocused && "ds-locale-dropdown__option--focused"
985
+ ),
986
+ onClick: () => handleSelect(locale.code),
987
+ ...OptionComponent !== "button" && getHref ? { href: getHref(locale.code) } : { type: "button" }
988
+ };
989
+ return /* @__PURE__ */ jsxRuntime.jsxs(OptionComponent, { ...optionProps, children: [
990
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ds-locale-dropdown__option-content", children: [
991
+ locale.flag && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-locale-dropdown__option-flag", "aria-hidden": "true", children: locale.flag }),
992
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-locale-dropdown__option-label", children: locale.label })
993
+ ] }),
994
+ isActive && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-locale-dropdown__option-check", children: /* @__PURE__ */ jsxRuntime.jsx(CheckIcon, {}) })
995
+ ] }, locale.code);
996
+ })
997
+ }
998
+ )
999
+ ] })
1000
+ }
1001
+ );
1002
+ }
1003
+ );
1004
+ LocaleDropdown.displayName = "LocaleDropdown";
1005
+ var MDXOutboundLink = ({
1006
+ href,
1007
+ children,
1008
+ ...props
1009
+ }) => {
1010
+ if (!href) {
1011
+ return /* @__PURE__ */ jsxRuntime.jsx("a", { ...props, children });
1012
+ }
1013
+ return /* @__PURE__ */ jsxRuntime.jsx(
1014
+ chunkLJADZITX_cjs.OutboundLink,
1015
+ {
1016
+ href,
1017
+ context: "cms_markdown",
1018
+ preserveExistingUTM: true,
1019
+ openInNewTab: true,
1020
+ ...props,
1021
+ children
1022
+ }
1023
+ );
1024
+ };
1025
+
1026
+ exports.LocaleDropdown = LocaleDropdown;
1027
+ exports.MDXOutboundLink = MDXOutboundLink;
1028
+ exports.NavbarMegaMenu = NavbarMegaMenu;
1029
+ exports.NavbarMegaMenuItem = NavbarMegaMenuItem;
1030
+ exports.NavbarMegaMenuSection = NavbarMegaMenuSection;
1031
+ exports.NavbarMobileActions = NavbarMobileActions;
1032
+ exports.NavbarMobileNavItem = NavbarMobileNavItem;
1033
+ exports.NavbarMobileSeparator = NavbarMobileSeparator;
1034
+ exports.NavbarV2 = NavbarV2;
1035
+ exports.NavbarV2Actions = NavbarV2Actions;
1036
+ exports.NavbarV2Brand = NavbarV2Brand;
1037
+ exports.NavbarV2Tab = NavbarV2Tab;
1038
+ exports.NavbarV2TabMenu = NavbarV2TabMenu;
1039
+ exports.NavbarV2Tabs = NavbarV2Tabs;
1040
+ exports.SiteFooter = SiteFooter;
1041
+ //# sourceMappingURL=out.js.map
1042
+ //# sourceMappingURL=chunk-KDLH35OI.cjs.map