@flamingo-stack/openframe-frontend-core 0.0.705-snapshot.20261006160157 → 0.0.705

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 (194) hide show
  1. package/dist/{chunk-WCVZCGK5.cjs → chunk-2QEUFXNS.cjs} +71 -312
  2. package/dist/{chunk-N45D4ZXQ.js → chunk-2YXVWZVF.js} +715 -959
  3. package/dist/{chunk-7OFPU7WE.cjs → chunk-3MX5S4CF.cjs} +2547 -877
  4. package/dist/{chunk-MB4PNY7C.cjs → chunk-4I45Y3DN.cjs} +6 -6
  5. package/dist/{chunk-K6O43WDL.cjs → chunk-4KX6OED2.cjs} +46 -46
  6. package/dist/{chunk-JPG7OHEG.js → chunk-5HBHO5TB.js} +1 -1
  7. package/dist/{chunk-3PLDQDE6.cjs → chunk-6NJKKO73.cjs} +15 -15
  8. package/dist/{chunk-O2RSAA5M.js → chunk-6SEANMOU.js} +11 -11
  9. package/dist/{chunk-WMX26HB5.js → chunk-6XIF2Z7I.js} +3 -3
  10. package/dist/{chunk-TQ4LB2DS.cjs → chunk-7LS22BZU.cjs} +14 -14
  11. package/dist/{chunk-7GEBFJT2.js → chunk-7VVFKJY5.js} +3429 -1759
  12. package/dist/{chunk-DDVBX42E.cjs → chunk-A75QY6CD.cjs} +21 -21
  13. package/dist/{chunk-OF6GEI5A.cjs → chunk-ABU3TGXA.cjs} +3 -3
  14. package/dist/{chunk-4CJMQLB5.js → chunk-AQWZNP6A.js} +4 -4
  15. package/dist/{chunk-FI6GMDO7.js → chunk-CH5232HV.js} +662 -2455
  16. package/dist/{chunk-Y2GSOUCS.cjs → chunk-D7BTSVMS.cjs} +2 -2
  17. package/dist/{chunk-4ILM7W2R.js → chunk-DENB2XJC.js} +2 -2
  18. package/dist/{chunk-6232S532.js → chunk-DW7G4KG3.js} +3 -3
  19. package/dist/{chunk-3NCM4ZQB.js → chunk-F6AFPNDF.js} +15 -15
  20. package/dist/{chunk-PXOQIA5K.js → chunk-F6I6XZMN.js} +5 -5
  21. package/dist/{chunk-G6UMNAVI.js → chunk-FCGC42TS.js} +61 -57
  22. package/dist/{chunk-BHI6GVC4.js → chunk-G5A3PSPV.js} +691 -1080
  23. package/dist/{chunk-HZ7CBXPL.cjs → chunk-HPWWNJE7.cjs} +89 -89
  24. package/dist/{chunk-SW5ZV2BN.cjs → chunk-IHERL5V4.cjs} +34 -34
  25. package/dist/{chunk-UJ33ZXDT.cjs → chunk-IKTQ3ZAG.cjs} +6 -6
  26. package/dist/{chunk-SEKYEWQG.cjs → chunk-JEZKGCZI.cjs} +26 -26
  27. package/dist/{chunk-7SCNMP2B.cjs → chunk-KOWVJD4V.cjs} +56 -56
  28. package/dist/chunk-LMBC5FFP.js +43 -0
  29. package/dist/{chunk-F57ECE2I.js → chunk-MFFCUVWG.js} +1 -1
  30. package/dist/{chunk-KUC673HM.js → chunk-MKXO4Q5P.js} +142 -383
  31. package/dist/{chunk-6NTPY5QA.cjs → chunk-MMOODW57.cjs} +94 -1887
  32. package/dist/{chunk-CUME3VTQ.js → chunk-MP2C3LJ4.js} +1 -1
  33. package/dist/{chunk-VX4E6YSB.cjs → chunk-N3COXDBH.cjs} +5 -41
  34. package/dist/{chunk-FXJ3WWUB.js → chunk-NDESEPW5.js} +0 -68
  35. package/dist/chunk-O43V3EOS.js +252 -0
  36. package/dist/{chunk-PLYEKV3N.cjs → chunk-OHFS7VOU.cjs} +2 -2
  37. package/dist/{chunk-M75XEEGT.cjs → chunk-OUY3HHW6.cjs} +539 -928
  38. package/dist/{chunk-CZ7Y7UG4.js → chunk-PDWVPI3S.js} +72 -4
  39. package/dist/{chunk-TE773HEH.js → chunk-PN2RKPDF.js} +10 -10
  40. package/dist/{chunk-3EZ4HHAP.js → chunk-QFXRPRFT.js} +3 -3
  41. package/dist/chunk-QZVSJF2K.cjs +252 -0
  42. package/dist/chunk-RALRPFDW.cjs +43 -0
  43. package/dist/{chunk-YGJKKDDM.js → chunk-RBDP4WDE.js} +6 -6
  44. package/dist/{chunk-LM7TXMLU.cjs → chunk-RKV5B7EU.cjs} +4 -72
  45. package/dist/{chunk-UVTD52MD.cjs → chunk-TYWLNCNH.cjs} +82 -14
  46. package/dist/{chunk-IKJA3Y7Z.js → chunk-VA5T32XA.js} +2 -2
  47. package/dist/{chunk-GWQEYPYM.cjs → chunk-VESKITRQ.cjs} +732 -728
  48. package/dist/{chunk-RQRX4YC3.cjs → chunk-VHCACDKP.cjs} +39 -39
  49. package/dist/{chunk-4IBPRIQH.js → chunk-VR2ZLFCP.js} +1 -1
  50. package/dist/{chunk-RTIPR53L.cjs → chunk-WA6GUYQ4.cjs} +104 -104
  51. package/dist/{chunk-T5TMCHWM.js → chunk-X5MQ7JRP.js} +9 -9
  52. package/dist/{chunk-LLSUVPQC.cjs → chunk-X72J4ACL.cjs} +8 -252
  53. package/dist/{chunk-UDFRUKLC.cjs → chunk-XOYH2YQE.cjs} +2 -2
  54. package/dist/{chunk-LVSFKENJ.cjs → chunk-YFBM2K6X.cjs} +4 -4
  55. package/dist/{chunk-DWPAAWMR.js → chunk-YHM5AWTT.js} +6 -6
  56. package/dist/{chunk-NCPTID44.js → chunk-Z2VNQQ74.js} +942 -978
  57. package/dist/{chunk-STHZBOQI.cjs → chunk-ZSAGLQOD.cjs} +17 -17
  58. package/dist/{chunk-VZICIQW2.js → chunk-ZSAO2HBW.js} +15 -15
  59. package/dist/components/case-studies/index.cjs +32 -30
  60. package/dist/components/case-studies/index.js +16 -14
  61. package/dist/components/chat/entity-cards/case-study-card.d.ts +4 -11
  62. package/dist/components/chat/entity-cards/case-study-card.d.ts.map +1 -1
  63. package/dist/components/chat/index.cjs +11 -9
  64. package/dist/components/chat/index.js +16 -14
  65. package/dist/components/chat/utils/icon-library.d.ts.map +1 -1
  66. package/dist/components/contact/index.cjs +14 -12
  67. package/dist/components/contact/index.js +13 -11
  68. package/dist/components/docs/index.cjs +17 -15
  69. package/dist/components/docs/index.js +16 -14
  70. package/dist/components/embeds/index.cjs +14 -12
  71. package/dist/components/embeds/index.js +13 -11
  72. package/dist/components/faq/index.cjs +15 -13
  73. package/dist/components/faq/index.js +14 -12
  74. package/dist/components/features/index.cjs +14 -12
  75. package/dist/components/features/index.js +23 -21
  76. package/dist/components/footer-waitlist-button.d.ts +29 -0
  77. package/dist/components/footer-waitlist-button.d.ts.map +1 -0
  78. package/dist/components/footer.d.ts +47 -0
  79. package/dist/components/footer.d.ts.map +1 -0
  80. package/dist/components/help-center-pages/index.cjs +120 -118
  81. package/dist/components/help-center-pages/index.js +35 -33
  82. package/dist/components/icons/index.cjs +5 -3
  83. package/dist/components/icons/index.js +11 -9
  84. package/dist/components/icons-v2-generated/index.cjs +5 -3
  85. package/dist/components/icons-v2-generated/index.js +4 -2
  86. package/dist/components/index.cjs +159 -86
  87. package/dist/components/index.d.ts +2 -0
  88. package/dist/components/index.d.ts.map +1 -1
  89. package/dist/components/index.js +402 -329
  90. package/dist/components/loading/page-layout-skeleton.d.ts +1 -1
  91. package/dist/components/meeting-scheduler/index.cjs +64 -62
  92. package/dist/components/meeting-scheduler/index.js +14 -12
  93. package/dist/components/navigation/client-only-header.d.ts +8 -0
  94. package/dist/components/navigation/client-only-header.d.ts.map +1 -0
  95. package/dist/components/navigation/header-skeleton.d.ts +12 -0
  96. package/dist/components/navigation/header-skeleton.d.ts.map +1 -0
  97. package/dist/components/navigation/header.d.ts +9 -0
  98. package/dist/components/navigation/header.d.ts.map +1 -0
  99. package/dist/components/navigation/index.cjs +16 -28
  100. package/dist/components/navigation/index.d.ts +10 -14
  101. package/dist/components/navigation/index.d.ts.map +1 -1
  102. package/dist/components/navigation/index.js +26 -38
  103. package/dist/components/navigation/mingo-ai-button.d.ts +3 -38
  104. package/dist/components/navigation/mingo-ai-button.d.ts.map +1 -1
  105. package/dist/components/navigation/mobile-nav-panel.d.ts +10 -0
  106. package/dist/components/navigation/mobile-nav-panel.d.ts.map +1 -0
  107. package/dist/components/navigation/navigation-sidebar-item.d.ts +2 -1
  108. package/dist/components/navigation/navigation-sidebar-item.d.ts.map +1 -1
  109. package/dist/components/navigation/top-navigation.d.ts +2 -2
  110. package/dist/components/navigation/top-navigation.d.ts.map +1 -1
  111. package/dist/components/onboarding-guides/index.cjs +17 -15
  112. package/dist/components/onboarding-guides/index.js +16 -14
  113. package/dist/components/related-content/index.cjs +8 -10
  114. package/dist/components/related-content/index.js +7 -9
  115. package/dist/components/tickets/index.cjs +18 -16
  116. package/dist/components/tickets/index.js +17 -15
  117. package/dist/components/ui/index.cjs +14 -12
  118. package/dist/components/ui/index.js +19 -17
  119. package/dist/hooks/index.cjs +11 -19
  120. package/dist/hooks/index.d.ts +0 -1
  121. package/dist/hooks/index.d.ts.map +1 -1
  122. package/dist/hooks/index.js +11 -19
  123. package/dist/hooks/ui/index.d.ts +0 -3
  124. package/dist/hooks/ui/index.d.ts.map +1 -1
  125. package/dist/index.cjs +22 -55
  126. package/dist/index.js +196 -229
  127. package/dist/types/case-study.d.ts +0 -9
  128. package/dist/types/case-study.d.ts.map +1 -1
  129. package/dist/types/navigation.d.ts +65 -95
  130. package/dist/types/navigation.d.ts.map +1 -1
  131. package/dist/utils/index.cjs +0 -55
  132. package/dist/utils/index.d.ts +0 -1
  133. package/dist/utils/index.d.ts.map +1 -1
  134. package/dist/utils/index.js +1 -50
  135. package/dist/utils/source-icons.d.ts.map +1 -1
  136. package/package.json +1 -1
  137. package/src/components/chat/entity-cards/case-study-card.tsx +5 -115
  138. package/src/components/chat/utils/icon-library.tsx +1 -35
  139. package/src/components/footer-waitlist-button.tsx +53 -0
  140. package/src/components/footer.tsx +195 -0
  141. package/src/components/index.ts +2 -0
  142. package/src/components/loading/page-layout-skeleton.tsx +1 -1
  143. package/src/components/navigation/client-only-header.tsx +22 -0
  144. package/src/components/navigation/header-skeleton.tsx +74 -0
  145. package/src/components/navigation/header.tsx +429 -0
  146. package/src/components/navigation/index.ts +14 -21
  147. package/src/components/navigation/mingo-ai-button.tsx +63 -139
  148. package/src/components/navigation/mobile-nav-panel.tsx +155 -0
  149. package/src/components/navigation/navigation-sidebar-item.tsx +2 -1
  150. package/src/components/navigation/ticket-alerts-button.tsx +2 -2
  151. package/src/components/navigation/top-navigation.tsx +2 -2
  152. package/src/hooks/index.ts +0 -1
  153. package/src/hooks/ui/index.ts +0 -3
  154. package/src/styles/chat-animations.css +2 -57
  155. package/src/types/case-study.ts +0 -16
  156. package/src/types/navigation.ts +66 -80
  157. package/src/utils/index.ts +0 -1
  158. package/src/utils/source-icons.ts +0 -13
  159. package/dist/components/navigation/mobile-nav-sheet-id.d.ts +0 -3
  160. package/dist/components/navigation/mobile-nav-sheet-id.d.ts.map +0 -1
  161. package/dist/components/navigation/mobile-nav-sheet.d.ts +0 -48
  162. package/dist/components/navigation/mobile-nav-sheet.d.ts.map +0 -1
  163. package/dist/components/navigation/nav-item-row.d.ts +0 -27
  164. package/dist/components/navigation/nav-item-row.d.ts.map +0 -1
  165. package/dist/components/navigation/nav-panel.d.ts +0 -43
  166. package/dist/components/navigation/nav-panel.d.ts.map +0 -1
  167. package/dist/components/navigation/site-footer.d.ts +0 -28
  168. package/dist/components/navigation/site-footer.d.ts.map +0 -1
  169. package/dist/components/navigation/site-header.d.ts +0 -61
  170. package/dist/components/navigation/site-header.d.ts.map +0 -1
  171. package/dist/components/navigation/site-nav-link.d.ts +0 -26
  172. package/dist/components/navigation/site-nav-link.d.ts.map +0 -1
  173. package/dist/hooks/ui/use-active-section.d.ts +0 -10
  174. package/dist/hooks/ui/use-active-section.d.ts.map +0 -1
  175. package/dist/hooks/ui/use-nav-menus.d.ts +0 -48
  176. package/dist/hooks/ui/use-nav-menus.d.ts.map +0 -1
  177. package/dist/hooks/ui/use-visitor-os.d.ts +0 -15
  178. package/dist/hooks/ui/use-visitor-os.d.ts.map +0 -1
  179. package/dist/hooks/use-location-hash.d.ts +0 -9
  180. package/dist/hooks/use-location-hash.d.ts.map +0 -1
  181. package/dist/utils/visitor-os.d.ts +0 -45
  182. package/dist/utils/visitor-os.d.ts.map +0 -1
  183. package/src/components/navigation/mobile-nav-sheet-id.ts +0 -2
  184. package/src/components/navigation/mobile-nav-sheet.tsx +0 -241
  185. package/src/components/navigation/nav-item-row.tsx +0 -129
  186. package/src/components/navigation/nav-panel.tsx +0 -196
  187. package/src/components/navigation/site-footer.tsx +0 -256
  188. package/src/components/navigation/site-header.tsx +0 -339
  189. package/src/components/navigation/site-nav-link.tsx +0 -41
  190. package/src/hooks/ui/use-active-section.ts +0 -44
  191. package/src/hooks/ui/use-nav-menus.ts +0 -200
  192. package/src/hooks/ui/use-visitor-os.ts +0 -33
  193. package/src/hooks/use-location-hash.ts +0 -34
  194. package/src/utils/visitor-os.ts +0 -84
@@ -1,62 +1,38 @@
1
1
  "use client";
2
2
  import {
3
3
  useOptionalTicketLive
4
- } from "./chunk-3EZ4HHAP.js";
4
+ } from "./chunk-QFXRPRFT.js";
5
5
  import {
6
6
  AppLayoutDrawerContainerContext,
7
7
  AppLayoutDrawerCoordinationContext,
8
8
  HUBSPOT_DO_NOT_COLLECT_FORM_PROPS,
9
9
  HeaderButton,
10
10
  NotificationDrawer,
11
- SocialIconRow,
12
11
  TimeTrackerHeaderButton,
13
12
  UnreadCountBadge,
14
13
  UnreadDot,
15
14
  buildTicketOpenHref,
16
15
  useOptionalNotifications
17
- } from "./chunk-G6UMNAVI.js";
16
+ } from "./chunk-FCGC42TS.js";
18
17
  import {
19
- resolveActiveSection,
20
- shortcutLabel,
21
- useActiveSection,
22
18
  useFocusTrap,
23
- useLocalStorage,
24
- useNavMenus,
25
- useVisitorOs,
26
- usesCommandKey
27
- } from "./chunk-KUC673HM.js";
19
+ useLocalStorage
20
+ } from "./chunk-MKXO4Q5P.js";
28
21
  import {
29
22
  OVERLAY_BACKDROP_CLASS,
30
23
  useIsHydrated
31
- } from "./chunk-7GEBFJT2.js";
24
+ } from "./chunk-7VVFKJY5.js";
32
25
  import {
33
26
  useHeaderHeight
34
- } from "./chunk-CZ7Y7UG4.js";
35
- import {
36
- CaseStudyCard,
37
- EntityIcon,
38
- SquareAvatar,
39
- Tag
40
- } from "./chunk-FI6GMDO7.js";
41
- import {
42
- ContentAreaWidthContext,
43
- breakpoints,
44
- useIsomorphicLayoutEffect,
45
- useLgUp,
46
- useMdUp,
47
- useMediaQuery
48
- } from "./chunk-FXJ3WWUB.js";
27
+ } from "./chunk-PDWVPI3S.js";
49
28
  import {
50
29
  LogOutIcon,
51
30
  MingoIcon,
52
- OpenFrameLogo,
53
31
  OpenFrameText,
54
32
  UserIcon
55
- } from "./chunk-N45D4ZXQ.js";
33
+ } from "./chunk-2YXVWZVF.js";
56
34
  import {
57
35
  BellIcon,
58
- Chevron02DownIcon,
59
- Chevron02RightIcon,
60
36
  Chevrons03LeftIcon,
61
37
  Filter02Icon,
62
38
  LifeBuoyIcon,
@@ -65,7 +41,22 @@ import {
65
41
  PenEditIcon,
66
42
  UserSearchIcon,
67
43
  XmarkIcon
68
- } from "./chunk-NCPTID44.js";
44
+ } from "./chunk-Z2VNQQ74.js";
45
+ import {
46
+ SquareAvatar,
47
+ Tag
48
+ } from "./chunk-CH5232HV.js";
49
+ import {
50
+ ContentAreaWidthContext,
51
+ breakpoints,
52
+ useIsomorphicLayoutEffect,
53
+ useLgUp,
54
+ useMdUp,
55
+ useMediaQuery
56
+ } from "./chunk-NDESEPW5.js";
57
+ import {
58
+ OpenFrameLogo
59
+ } from "./chunk-O43V3EOS.js";
69
60
  import {
70
61
  DropdownMenu,
71
62
  DropdownMenuContent,
@@ -85,331 +76,207 @@ import {
85
76
  cn
86
77
  } from "./chunk-7RXWKTAP.js";
87
78
 
88
- // src/components/navigation/site-header.tsx
89
- import { useEffect as useEffect2, useRef, useState } from "react";
79
+ // src/components/navigation/header.tsx
80
+ import React, { useEffect, useRef as useRef2, useState } from "react";
90
81
 
91
82
  // src/components/navigation/mingo-ai-button.tsx
92
- import { useEffect } from "react";
93
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
83
+ import { jsx, jsxs } from "react/jsx-runtime";
94
84
  var MINGO_ACCENT = "var(--ods-flamingo-cyan-base)";
95
- var ASK_AI_OPEN_EVENT = "ask-ai:open";
96
- function openAskAi(source) {
97
- window.dispatchEvent(new CustomEvent(ASK_AI_OPEN_EVENT, { detail: { source: source ?? "" } }));
98
- }
99
- function MingoAiButton({
100
- source,
101
- icon,
102
- label = "Mingo AI",
103
- shortcutHint = false,
104
- variant = "inline",
105
- className,
106
- onClick,
107
- ...props
108
- }) {
109
- const visitor = useVisitorOs();
110
- const field = variant === "field";
111
- const commandKey = visitor.known && usesCommandKey(visitor.os);
112
- useEffect(() => {
113
- if (!shortcutHint) return void 0;
114
- const onKeyDown = (event) => {
115
- if (event.defaultPrevented || event.altKey || event.shiftKey) return;
116
- const modifier = commandKey ? event.metaKey && !event.ctrlKey : event.ctrlKey && !event.metaKey;
117
- if (event.key.toLowerCase() !== "k" || !modifier) return;
118
- event.preventDefault();
119
- openAskAi(source);
120
- };
121
- window.addEventListener("keydown", onKeyDown);
122
- return () => window.removeEventListener("keydown", onKeyDown);
123
- }, [shortcutHint, source, commandKey]);
124
- return /* @__PURE__ */ jsxs(
125
- Button,
85
+ function MingoAiButton({ source, icon, label = "Mingo AI", className, onClick, ...props }) {
86
+ return /* @__PURE__ */ jsx(
87
+ "button",
126
88
  {
127
89
  ...props,
128
90
  type: "button",
129
- variant: field ? "glyph" : "transparent",
130
- size: "wrap",
131
- font: "regular",
132
91
  "aria-label": label,
133
- "aria-keyshortcuts": shortcutHint && visitor.known ? commandKey ? "Meta+K" : "Control+K" : void 0,
134
92
  onClick: (e) => {
135
- openAskAi(source);
93
+ window.dispatchEvent(new CustomEvent("ask-ai:open", { detail: { source: source ?? "" } }));
136
94
  onClick?.(e);
137
95
  },
138
96
  className: cn(
139
- "group/mingo flex shrink-0 justify-start focus-visible:ring-ods-accent",
140
- field ? (
141
- // A row of the mobile menu like the groups under it: same height,
142
- // type and divider, no surface and no ring of its own.
143
- "min-h-14 w-full gap-[var(--spacing-system-sf)] rounded-none border-b border-ods-border text-left text-h4 [&_svg]:h-6 [&_svg]:w-6"
144
- ) : (
145
- // Transparent at rest so it inherits the bar's background; the hover
146
- // wash is the menu items' own.
147
- "h-10 gap-[var(--spacing-system-xsf)] rounded-md pl-[var(--spacing-system-xsf)] pr-2.5 text-ods-text-secondary hover:text-ods-text-primary"
148
- ),
97
+ // Unified ODS top-navigation cell (Figma 2797-6808 desktop /
98
+ // 2797-7275 mobile): full-height cell with a leading divider,
99
+ // transparent at rest so it inherits the bar's background.
100
+ // No hover background on the cell: the animated ring + shimmer are
101
+ // the ONLY hover treatment (a bg flip on top read as a double
102
+ // animation).
103
+ "group/mingo relative flex h-full shrink-0 items-center border-l border-ods-border bg-transparent px-[var(--spacing-system-m)] focus:outline-none focus-visible:ring-2 focus-visible:ring-ods-accent",
149
104
  className
150
105
  ),
151
- children: [
152
- !field && /* @__PURE__ */ jsxs(Fragment, { children: [
153
- /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "mingo-edge-frame pointer-events-none absolute inset-0 rounded-md", children: /* @__PURE__ */ jsx("span", { className: "mingo-edge" }) }),
154
- /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "pointer-events-none absolute inset-0 overflow-hidden rounded-md", children: /* @__PURE__ */ jsx(
155
- "span",
156
- {
157
- className: "mingo-shimmer absolute inset-y-0 left-0 w-1/2",
158
- style: {
159
- background: "linear-gradient(105deg, transparent, color-mix(in srgb, var(--ods-system-greys-white) 12%, transparent), transparent)"
160
- }
161
- }
162
- ) })
163
- ] }),
164
- icon ? /* @__PURE__ */ jsx(
106
+ children: /* @__PURE__ */ jsxs("span", { className: "relative flex h-11 items-center gap-[var(--spacing-system-xsf)] rounded-md px-[var(--spacing-system-m)] md:h-12", children: [
107
+ /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "mingo-edge-frame pointer-events-none absolute inset-0 rounded-md", children: /* @__PURE__ */ jsx("span", { className: "mingo-edge" }) }),
108
+ /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "pointer-events-none absolute inset-0 overflow-hidden rounded-md", children: /* @__PURE__ */ jsx(
165
109
  "span",
166
110
  {
167
- className: cn(
168
- "relative inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full",
169
- field ? "size-6" : "size-5"
170
- ),
171
- children: icon
111
+ className: "mingo-shimmer absolute inset-y-0 left-0 w-1/2",
112
+ style: {
113
+ background: "linear-gradient(105deg, transparent, color-mix(in srgb, var(--ods-system-greys-white) 12%, transparent), transparent)"
114
+ }
172
115
  }
173
- ) : /* @__PURE__ */ jsx(
116
+ ) }),
117
+ icon ? /* @__PURE__ */ jsx("span", { className: "relative inline-flex size-6 shrink-0 items-center justify-center", children: icon }) : /* @__PURE__ */ jsx(
174
118
  MingoIcon,
175
119
  {
176
120
  color: "currentColor",
177
121
  eyesColor: MINGO_ACCENT,
178
122
  cornerColor: MINGO_ACCENT,
179
- className: cn("relative shrink-0 text-ods-text-primary", field ? "size-6" : "size-5")
180
- }
181
- ),
182
- /* @__PURE__ */ jsx(
183
- "span",
184
- {
185
- className: cn("relative whitespace-nowrap", field ? "min-w-0 flex-1 truncate" : "hidden text-h6 lg:inline"),
186
- children: label
123
+ className: "relative h-6 w-6 shrink-0 text-ods-text-primary"
187
124
  }
188
125
  ),
189
- shortcutHint && !field && // A key cap in the label's own type (never smaller: a hint nobody can
190
- // read is decoration) and the label's colour, which clears 4.5:1 on
191
- // the bar. It keeps its width before the platform is known.
192
- /* @__PURE__ */ jsx("kbd", { className: "relative hidden h-6 min-w-9 items-center justify-center rounded border border-ods-border px-[var(--spacing-system-xxs)] text-h6 lg:inline-flex", children: visitor.known ? shortcutLabel(visitor.os, "K") : "" })
193
- ]
126
+ /* @__PURE__ */ jsx("span", { className: "relative hidden whitespace-nowrap text-ods-text-primary text-h3 md:inline", children: label })
127
+ ] })
194
128
  }
195
129
  );
196
130
  }
197
131
 
198
- // src/components/navigation/mobile-nav-sheet-id.ts
199
- var MOBILE_NAV_SHEET_ID = "mobile-nav-sheet";
200
-
201
- // src/components/navigation/nav-panel.tsx
202
- import { forwardRef } from "react";
203
-
204
- // src/components/navigation/site-nav-link.tsx
205
- import { jsx as jsx2 } from "react/jsx-runtime";
206
- var defaultRenderSiteNavLink = ({ link, children, ...rest }) => link.external ? /* @__PURE__ */ jsx2(next_link_default, { href: link.href, target: "_blank", rel: "noopener noreferrer", ...rest, children }) : /* @__PURE__ */ jsx2(next_link_default, { href: link.href, ...rest, children });
207
- function navLinkLabel(link) {
208
- return link.count === void 0 ? link.label : link.label.replace("{count}", String(link.count));
209
- }
210
- var NAV_FOCUS_CLASS = "outline-none focus-visible:ring-2 focus-visible:ring-ods-accent";
211
-
212
- // src/components/navigation/nav-item-row.tsx
213
- import { Fragment as Fragment2, jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
214
- var ROW_CLASSES = {
215
- panel: "flex items-start gap-[var(--spacing-system-sf)] rounded-lg p-[var(--spacing-system-sf)] text-ods-text-primary transition-colors hover:bg-ods-bg-hover",
216
- sheet: "flex min-h-[52px] items-center gap-[var(--spacing-system-sf)] py-1.5 text-ods-text-primary",
217
- side: "flex items-center gap-[var(--spacing-system-xsf)] rounded-md px-[var(--spacing-system-sf)] py-2.5 text-ods-text-secondary transition-colors text-h6 hover:bg-ods-bg-hover hover:text-ods-text-primary",
218
- label: "inline-flex items-center gap-[var(--spacing-system-xsf)] text-ods-text-secondary transition-colors text-h6 hover:text-ods-text-primary"
219
- };
220
- function RowGlyph({ link, box, glyph }) {
221
- if (link.icon) {
222
- return /* @__PURE__ */ jsx3(
223
- "span",
224
- {
225
- "aria-hidden": "true",
226
- className: cn("flex shrink-0 items-center justify-center overflow-hidden rounded-full", box),
227
- children: /* @__PURE__ */ jsx3(EntityIcon, { icon: link.icon, className: "h-full w-full" })
132
+ // src/components/navigation/mobile-nav-panel.tsx
133
+ import { usePreventScroll } from "@react-aria/overlays";
134
+ import { X } from "lucide-react";
135
+ import { useRef } from "react";
136
+ import { Fragment, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
137
+ var MOBILE_NAV_PANEL_ID = "mobile-nav-panel";
138
+ function MobileNavPanel({ isOpen, config }) {
139
+ const panelRef = useRef(null);
140
+ usePreventScroll({ isDisabled: !isOpen });
141
+ useFocusTrap(panelRef, isOpen, { onEscape: config.onClose });
142
+ const headerHeight = useHeaderHeight(64, { enabled: isOpen });
143
+ if (!isOpen) return null;
144
+ const renderNavigationItem = (item) => {
145
+ if (item.element) {
146
+ return /* @__PURE__ */ jsx2("div", { children: item.element }, item.id);
147
+ }
148
+ const handleClick = () => {
149
+ if (item.onClick) {
150
+ item.onClick();
228
151
  }
229
- );
230
- }
231
- if (!link.iconName) return null;
232
- return /* @__PURE__ */ jsx3(
233
- "span",
234
- {
235
- "aria-hidden": "true",
236
- className: cn(
237
- "flex shrink-0 items-center justify-center rounded-lg border border-ods-border bg-ods-bg text-ods-text-primary",
238
- box
239
- ),
240
- children: /* @__PURE__ */ jsx3(EntityIcon, { icon: { name: link.iconName }, size: glyph })
152
+ config.onClose?.();
153
+ };
154
+ if (item.href) {
155
+ return /* @__PURE__ */ jsx2(
156
+ Button,
157
+ {
158
+ variant: "outline",
159
+ size: "small-legacy",
160
+ href: item.href,
161
+ onClick: handleClick,
162
+ leftIcon: item.icon,
163
+ rightIcon: item.badge,
164
+ className: cn(
165
+ "h-12 justify-start gap-3 rounded-md border-none bg-transparent px-4 text-ods-text-primary transition-colors hover:bg-ods-bg-hover",
166
+ item.isActive ? "bg-ods-bg-hover" : ""
167
+ ),
168
+ children: item.label
169
+ },
170
+ item.id
171
+ );
241
172
  }
242
- );
243
- }
244
- function NavItemRow({
245
- link,
246
- variant = "panel",
247
- renderLink = defaultRenderSiteNavLink,
248
- badge,
249
- onNavigate,
250
- className
251
- }) {
252
- const label = navLinkLabel(link);
253
- const counter = badge ? /* @__PURE__ */ jsx3(UnreadCountBadge, { count: badge, className: "static shrink-0" }) : null;
254
- const singleLine = !link.description && !link.builtOn;
255
- const rowClassName = cn(
256
- ROW_CLASSES[variant],
257
- variant === "panel" && singleLine && "items-center",
258
- NAV_FOCUS_CLASS,
259
- className
260
- );
261
- const onClick = onNavigate ? () => onNavigate() : void 0;
262
- let children;
263
- if (variant === "label") {
264
- children = /* @__PURE__ */ jsxs2(Fragment2, { children: [
265
- label,
266
- counter
267
- ] });
268
- } else if (variant === "side") {
269
- children = /* @__PURE__ */ jsxs2(Fragment2, { children: [
270
- link.iconName && /* @__PURE__ */ jsx3("span", { "aria-hidden": "true", className: "flex shrink-0", children: /* @__PURE__ */ jsx3(EntityIcon, { icon: { name: link.iconName }, size: 18 }) }),
271
- /* @__PURE__ */ jsx3("span", { className: "min-w-0 flex-1", children: label }),
272
- counter
273
- ] });
274
- } else {
275
- const sheet = variant === "sheet";
276
- children = /* @__PURE__ */ jsxs2(Fragment2, { children: [
277
- /* @__PURE__ */ jsx3(RowGlyph, { link, box: sheet ? "h-8 w-8" : "h-9 w-9", glyph: sheet ? 18 : 20 }),
278
- /* @__PURE__ */ jsxs2("span", { className: "flex min-w-0 flex-1 flex-col", children: [
279
- /* @__PURE__ */ jsxs2("span", { className: "flex items-center gap-[var(--spacing-system-xsf)] text-h6", children: [
280
- /* @__PURE__ */ jsx3("span", { className: "min-w-0", children: label }),
281
- counter
282
- ] }),
283
- link.description && /* @__PURE__ */ jsx3("span", { className: "text-ods-text-muted text-h6", children: link.description }),
284
- link.builtOn && /* @__PURE__ */ jsxs2("span", { className: "text-ods-text-muted text-h6", children: [
285
- "Built on ",
286
- link.builtOn
287
- ] })
288
- ] })
289
- ] });
290
- }
291
- return /* @__PURE__ */ jsx3(Fragment2, { children: renderLink({ link, className: rowClassName, children, onClick }) });
292
- }
293
-
294
- // src/components/navigation/nav-panel.tsx
295
- import { Fragment as Fragment3, jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
296
- var TWO_COLUMN_OVER = 4;
297
- function isMegaMenu(menu) {
298
- return (menu.columns?.length ?? 0) > 1 || !!menu.features?.length || !!menu.sideLinks?.length;
299
- }
300
- var HEADING_CLASS = "mb-[var(--spacing-system-xsf)] ml-[var(--spacing-system-sf)] text-ods-text-muted text-h5";
301
- function Column({
302
- group,
303
- wide,
304
- rowProps
305
- }) {
306
- const twoColumns = wide && group.links.length > TWO_COLUMN_OVER;
307
- return /* @__PURE__ */ jsxs3("div", { className: cn("flex min-w-0 flex-col", wide && (twoColumns ? "flex-[2]" : "flex-1")), children: [
308
- group.title && /* @__PURE__ */ jsx4("div", { className: HEADING_CLASS, children: group.title }),
309
- /* @__PURE__ */ jsx4(
173
+ return /* @__PURE__ */ jsxs2(
174
+ Button,
175
+ {
176
+ variant: "outline",
177
+ size: "small-legacy",
178
+ onClick: handleClick,
179
+ leftIcon: item.icon,
180
+ className: cn(
181
+ "h-12 justify-start gap-3 rounded-md border-none bg-transparent px-4 text-ods-text-primary transition-colors hover:bg-ods-bg-hover",
182
+ item.isActive ? "bg-ods-bg-hover" : ""
183
+ ),
184
+ children: [
185
+ /* @__PURE__ */ jsx2("span", { className: "flex-1 text-left", children: item.label }),
186
+ item.badge !== void 0 && /* @__PURE__ */ jsx2("span", { className: "ml-auto", children: item.badge })
187
+ ]
188
+ },
189
+ item.id
190
+ );
191
+ };
192
+ return /* @__PURE__ */ jsxs2(Fragment, { children: [
193
+ /* @__PURE__ */ jsx2("div", { className: cn("fixed inset-0 z-[9998]", OVERLAY_BACKDROP_CLASS), onClick: config.onClose }),
194
+ /* @__PURE__ */ jsxs2(
310
195
  "div",
311
196
  {
312
- className: twoColumns ? "grid grid-cols-2 gap-x-[var(--spacing-system-mf)] gap-y-[var(--spacing-system-xxs)]" : "flex flex-col gap-[var(--spacing-system-xxs)]",
313
- children: group.links.map((link) => /* @__PURE__ */ jsx4(
314
- NavItemRow,
315
- {
316
- link,
317
- renderLink: rowProps.renderLink,
318
- onNavigate: rowProps.onNavigate,
319
- badge: link.badgeKey ? rowProps.badges?.[link.badgeKey] : void 0
320
- },
321
- link.id
322
- ))
197
+ ref: panelRef,
198
+ id: MOBILE_NAV_PANEL_ID,
199
+ role: "dialog",
200
+ "aria-modal": "true",
201
+ "aria-label": "Navigation menu",
202
+ tabIndex: -1,
203
+ style: { "--mobile-nav-top": `${headerHeight + 16}px` },
204
+ className: cn(
205
+ "fixed z-[9999] rounded-lg shadow-xl",
206
+ config.className ? "" : "border border-ods-border bg-ods-card",
207
+ // Responsive positioning and sizing — LEFT-anchored from md, flush
208
+ // under the burger cell at the left edge of the unified
209
+ // top-navigation (a larger inset read as a stray gap between the
210
+ // burger and its panel).
211
+ "left-2 right-2 md:right-auto",
212
+ "md:left-2 md:w-[400px] md:max-w-[calc(100vw-1rem)]",
213
+ // Small-viewport (svh) sizing anchored below the measured header —
214
+ // 100vh overflowed under mobile browser chrome, leaving the bottom
215
+ // entries and footer unreachable while the body was scroll-locked.
216
+ "top-[var(--mobile-nav-top)]",
217
+ "max-h-[calc(100svh-var(--mobile-nav-top)-50px)] md:max-h-[calc(100svh-var(--mobile-nav-top)-8px)]",
218
+ "flex flex-col",
219
+ config.className || ""
220
+ ),
221
+ onClick: (e) => e.stopPropagation(),
222
+ children: [
223
+ /* @__PURE__ */ jsx2("div", { className: "flex flex-shrink-0 justify-end border-b border-ods-border p-2", children: /* @__PURE__ */ jsx2(
224
+ Button,
225
+ {
226
+ "aria-label": "Close menu",
227
+ size: "icon",
228
+ variant: "transparent",
229
+ leftIcon: /* @__PURE__ */ jsx2(X, { className: "h-4 w-4 text-ods-text-primary" }),
230
+ onClick: config.onClose,
231
+ className: "hover:bg-ods-bg-hover"
232
+ }
233
+ ) }),
234
+ /* @__PURE__ */ jsx2("div", { className: "flex-1 overflow-y-auto overflow-x-hidden overscroll-contain px-2 py-2", children: /* @__PURE__ */ jsx2("div", { className: "flex flex-col space-y-1", children: config.sections.map((section, index) => /* @__PURE__ */ jsxs2("div", { children: [
235
+ section.title && /* @__PURE__ */ jsx2("div", { className: "px-4 pb-1 pt-2 font-semibold uppercase text-ods-text-secondary text-h6", children: section.title }),
236
+ /* @__PURE__ */ jsx2("div", { className: "flex flex-col gap-1", children: section.items.map(renderNavigationItem) })
237
+ ] }, index)) }) }),
238
+ config.footer && /* @__PURE__ */ jsx2("div", { className: "flex-shrink-0 border-t border-ods-border p-4 pb-[max(1rem,env(safe-area-inset-bottom))]", children: config.footer })
239
+ ]
323
240
  }
324
241
  )
325
242
  ] });
326
243
  }
327
- var NavPanel = forwardRef(function NavPanelImpl({
328
- menu,
329
- open,
330
- renderLink = defaultRenderSiteNavLink,
331
- badges,
332
- social,
333
- onNavigate,
334
- motion: motion2 = "open",
335
- handoff = false,
336
- className,
337
- ...panelProps
338
- }, ref) {
339
- const columns = menu.columns ?? [];
340
- const mega = isMegaMenu(menu);
341
- const rowProps = { renderLink, badges, onNavigate };
342
- const socialRow = menu.showSocial && social ? social : null;
343
- return /* @__PURE__ */ jsx4(
344
- "div",
244
+
245
+ // src/components/navigation/ticket-alerts-button.tsx
246
+ import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
247
+ function TicketAlertsButton({ href, onNavigate, disabled, className }) {
248
+ const live = useOptionalTicketLive();
249
+ if (!live || !live.authed || live.unreadTotal === 0) return null;
250
+ const targetId = live.nextUnreadTicketId;
251
+ const target = targetId ? buildTicketOpenHref(href, targetId) : href;
252
+ const handleClick = () => {
253
+ if (onNavigate) onNavigate(target);
254
+ else window.location.assign(target);
255
+ };
256
+ return /* @__PURE__ */ jsx3(
257
+ HeaderButton,
345
258
  {
346
- inert: !open,
347
- "data-state": open ? "open" : "closed",
348
- ...panelProps,
349
- ref,
350
- className: cn(
351
- "absolute top-full z-[60]",
352
- // Between two mega menus the surface is handed over in one frame (same
353
- // place, same size, same colour) and only the content moves; a fade
354
- // here would let the page show through both for its whole length.
355
- mega && (open ? motion2 !== "open" : handoff) ? "transition-none" : "transition-opacity duration-150",
356
- mega ? "left-0 right-0 border-b border-ods-border bg-ods-card shadow-xl" : "left-0 mt-[var(--spacing-system-xxs)] min-w-[260px] rounded-lg border border-ods-border bg-ods-card p-[var(--spacing-system-xsf)] shadow-xl",
357
- open ? "visible opacity-100" : "pointer-events-none invisible opacity-0",
358
- className
259
+ icon: (
260
+ // Glyph inherits HeaderButton's standard cell coloring (secondary at
261
+ // rest, primary on active) — SAME treatment as the notifications
262
+ // bell and time-tracker cells. The indication is carried by the
263
+ // count pill (sidebar count-pill precedent) and by the cell only
264
+ // existing while updates are unread — never by tinting the glyph.
265
+ /* @__PURE__ */ jsxs3("span", { className: "relative inline-flex", children: [
266
+ /* @__PURE__ */ jsx3(LifeBuoyIcon, { className: "h-6 w-6" }),
267
+ /* @__PURE__ */ jsx3(UnreadCountBadge, { count: live.unreadTotal })
268
+ ] })
359
269
  ),
360
- children: mega ? (
361
- // ONE height for every mega menu, so moving between menus (and a
362
- // card's cover loading) never resizes the panel under the pointer.
363
- /* @__PURE__ */ jsxs3(
364
- "div",
365
- {
366
- "data-motion": open ? motion2 : void 0,
367
- className: "nav-panel-content flex h-[400px] max-h-[calc(100svh-var(--top-nav-height,72px))] flex-col gap-[var(--spacing-system-mf)] overflow-y-auto px-[var(--spacing-system-lf)] pb-[var(--spacing-system-xlf)] pt-8",
368
- children: [
369
- /* @__PURE__ */ jsxs3("div", { className: "flex min-h-0 flex-1 gap-[var(--spacing-system-xlf)]", children: [
370
- columns.map((group) => /* @__PURE__ */ jsx4(Column, { group, wide: true, rowProps }, group.id)),
371
- !!menu.features?.length && // One row of cards, as many as the bar's width holds: a card that
372
- // would wrap lands on a zero-height row, where its cell clips it.
373
- /* @__PURE__ */ jsx4("div", { className: "grid min-w-0 flex-[3] auto-rows-[0px] grid-cols-[repeat(auto-fit,minmax(240px,1fr))] grid-rows-[minmax(0,1fr)] gap-x-[var(--spacing-system-mf)]", children: menu.features.map((feature) => /* @__PURE__ */ jsx4("div", { className: "min-h-0 min-w-0 overflow-hidden", children: /* @__PURE__ */ jsx4(
374
- CaseStudyCard,
375
- {
376
- size: "menu",
377
- study: feature.study,
378
- href: feature.href,
379
- mediaMounted: open,
380
- onNavigate,
381
- className: "h-full"
382
- }
383
- ) }, feature.id)) }),
384
- !!menu.sideLinks?.length && /* @__PURE__ */ jsxs3("div", { className: "flex w-[260px] shrink-0 flex-col gap-0.5 border-l border-ods-border pl-8 pt-5", children: [
385
- menu.sideTitle && /* @__PURE__ */ jsx4("div", { className: HEADING_CLASS, children: menu.sideTitle }),
386
- menu.sideLinks.map((link) => /* @__PURE__ */ jsx4(
387
- NavItemRow,
388
- {
389
- link,
390
- variant: "side",
391
- ...rowProps,
392
- badge: link.badgeKey ? badges?.[link.badgeKey] : void 0
393
- },
394
- link.id
395
- ))
396
- ] })
397
- ] }),
398
- socialRow && /* @__PURE__ */ jsx4("div", { className: "border-t border-ods-border px-[var(--spacing-system-sf)] pt-[var(--spacing-system-mf)]", children: socialRow })
399
- ]
400
- }
401
- )
402
- ) : /* @__PURE__ */ jsxs3(Fragment3, { children: [
403
- columns.map((group) => /* @__PURE__ */ jsx4(Column, { group, wide: false, rowProps }, group.id)),
404
- socialRow && /* @__PURE__ */ jsx4("div", { className: "mt-[var(--spacing-system-xsf)] border-t border-ods-border px-[var(--spacing-system-sf)] pt-[var(--spacing-system-sf)]", children: socialRow })
405
- ] })
270
+ "aria-label": `Support tickets \u2014 ${live.unreadTotal} unread ${live.unreadTotal === 1 ? "update" : "updates"}`,
271
+ onClick: handleClick,
272
+ disabled,
273
+ className: cn(className)
406
274
  }
407
275
  );
408
- });
409
- NavPanel.displayName = "NavPanel";
276
+ }
410
277
 
411
278
  // src/components/navigation/top-navigation.tsx
412
- import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
279
+ import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
413
280
  var SIZE_CLASSES = {
414
281
  small: "h-14 [--top-nav-cell:3.5rem]",
415
282
  big: "h-[72px] [--top-nav-cell:4.5rem]"
@@ -453,7 +320,7 @@ function TopNavigation({
453
320
  ...props,
454
321
  children: [
455
322
  leading,
456
- hasContent(logo) && /* @__PURE__ */ jsx5(
323
+ hasContent(logo) && /* @__PURE__ */ jsx4(
457
324
  "div",
458
325
  {
459
326
  className: cn(
@@ -465,7 +332,7 @@ function TopNavigation({
465
332
  children: logo
466
333
  }
467
334
  ),
468
- /* @__PURE__ */ jsx5(
335
+ /* @__PURE__ */ jsx4(
469
336
  "div",
470
337
  {
471
338
  className: cn(
@@ -476,7 +343,7 @@ function TopNavigation({
476
343
  children: center
477
344
  }
478
345
  ),
479
- hasContent(cta) && /* @__PURE__ */ jsx5("div", { className: cn("flex h-full shrink-0 items-center px-[var(--spacing-system-m)]", ctaClassName), children: cta }),
346
+ hasContent(cta) && /* @__PURE__ */ jsx4("div", { className: cn("flex h-full shrink-0 items-center px-[var(--spacing-system-m)]", ctaClassName), children: cta }),
480
347
  sideActions,
481
348
  children
482
349
  ]
@@ -484,568 +351,352 @@ function TopNavigation({
484
351
  );
485
352
  }
486
353
 
487
- // src/components/navigation/site-header.tsx
488
- import { Fragment as Fragment4, jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
489
- var TOP_ITEM_CLASS = "relative inline-flex h-10 items-center gap-1.5 whitespace-nowrap rounded-md px-3.5 text-ods-text-secondary transition-colors text-h6 hover:bg-ods-bg-hover hover:text-ods-text-primary";
490
- var TOP_ITEM_CURRENT_CLASS = "rounded-b-none bg-gradient-to-b from-transparent to-ods-accent/10 text-ods-text-primary after:absolute after:inset-x-0 after:bottom-0 after:h-0.5 after:bg-ods-accent";
491
- var menuIcon = (menu) => menu.iconName ? /* @__PURE__ */ jsx6(EntityIcon, { icon: { name: menu.iconName }, size: 20, className: "size-5 shrink-0" }) : null;
492
- function SiteHeader({
493
- nav,
494
- pathname,
495
- logo,
496
- logoHref,
497
- renderLink = defaultRenderSiteNavLink,
498
- leading,
499
- actions,
500
- cta,
501
- sideActions,
502
- mingo,
503
- mobile,
504
- badges,
505
- social,
506
- autoHide = false,
507
- backgroundClassName,
508
- className,
509
- style,
510
- skipToContentId = "main-content"
511
- }) {
354
+ // src/components/navigation/header.tsx
355
+ import { Fragment as Fragment2, jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
356
+ var NAV_ITEM_CLASSES = "text-h6 [&_svg]:h-6 [&_svg]:w-6";
357
+ function Header({ config }) {
512
358
  const [show, setShow] = useState(true);
513
- const lastScrollY = useRef(0);
514
- const activeId = useActiveSection(nav.menus, pathname);
515
- const { openId, close, getTriggerProps, getPanelProps } = useNavMenus({ pathname });
516
- const [trail, setTrail] = useState({ id: null, from: null });
517
- if (trail.id !== openId) setTrail({ id: openId, from: trail.id });
518
- const previousId = trail.id === openId ? trail.from : trail.id;
519
- const megaIds = nav.menus.filter(isMegaMenu).map((menu) => menu.id);
520
- const openMegaIndex = openId === null ? -1 : megaIds.indexOf(openId);
521
- const previousMegaIndex = previousId === null ? -1 : megaIds.indexOf(previousId);
522
- const megaMotion = openMegaIndex < 0 || previousMegaIndex < 0 ? "open" : openMegaIndex > previousMegaIndex ? "from-end" : "from-start";
523
- useEffect2(() => {
524
- if (!autoHide) return void 0;
359
+ const lastScrollY = useRef2(0);
360
+ const [openDropdowns, setOpenDropdowns] = useState({});
361
+ const dropdownRefs = useRef2({});
362
+ const triggerRefs = useRef2({});
363
+ useEffect(() => {
364
+ const handleClickOutside = (event) => {
365
+ const target = event.target;
366
+ if (!target) return;
367
+ const isOutsideAllDropdowns = Object.keys(openDropdowns).every((id) => {
368
+ const dropdown = dropdownRefs.current[id];
369
+ const trigger = triggerRefs.current[id];
370
+ if (!dropdown || !trigger) return true;
371
+ return !dropdown.contains(target) && !trigger.contains(target);
372
+ });
373
+ if (isOutsideAllDropdowns) {
374
+ setOpenDropdowns({});
375
+ }
376
+ };
377
+ const handleEscapeKey = (event) => {
378
+ if (event.key === "Escape") {
379
+ setOpenDropdowns({});
380
+ }
381
+ };
382
+ const hasOpenDropdowns = Object.values(openDropdowns).some(Boolean);
383
+ if (hasOpenDropdowns) {
384
+ document.addEventListener("mousedown", handleClickOutside);
385
+ document.addEventListener("keydown", handleEscapeKey);
386
+ }
387
+ return () => {
388
+ document.removeEventListener("mousedown", handleClickOutside);
389
+ document.removeEventListener("keydown", handleEscapeKey);
390
+ };
391
+ }, [openDropdowns]);
392
+ useEffect(() => {
393
+ return () => {
394
+ setOpenDropdowns({});
395
+ dropdownRefs.current = {};
396
+ triggerRefs.current = {};
397
+ };
398
+ }, []);
399
+ useEffect(() => {
400
+ if (!config.autoHide) return void 0;
525
401
  const handleScroll = () => {
526
402
  const currentScrollY = window.scrollY;
527
403
  const prevScrollY = lastScrollY.current;
528
404
  lastScrollY.current = currentScrollY;
529
- if (currentScrollY > prevScrollY && currentScrollY > 50) setShow(false);
530
- else if (currentScrollY < prevScrollY || currentScrollY <= 10) setShow(true);
405
+ const shouldHide = currentScrollY > prevScrollY && currentScrollY > 50;
406
+ const shouldShow = currentScrollY < prevScrollY || currentScrollY <= 10;
407
+ if (shouldHide) {
408
+ setShow(false);
409
+ } else if (shouldShow) {
410
+ setShow(true);
411
+ }
531
412
  };
532
413
  window.addEventListener("scroll", handleScroll, { passive: true });
533
- return () => window.removeEventListener("scroll", handleScroll);
534
- }, [autoHide]);
535
- const headerShown = !autoHide || show || openId !== null;
536
- const renderMenu = (menu) => {
537
- const current = menu.id === activeId;
538
- const hasPanel = !!menu.columns?.length || !!menu.features?.length || !!menu.sideLinks?.length;
539
- if (!hasPanel) {
540
- if (!menu.href) return null;
541
- return /* @__PURE__ */ jsx6("div", { className: "flex", children: /* @__PURE__ */ jsx6(
542
- Button,
543
- {
544
- asChild: true,
545
- variant: "transparent",
546
- size: "wrap",
547
- font: "regular",
548
- className: cn(TOP_ITEM_CLASS, NAV_FOCUS_CLASS, current && TOP_ITEM_CURRENT_CLASS),
549
- children: renderLink({
550
- link: { href: menu.href },
551
- "aria-current": current ? "page" : void 0,
552
- children: /* @__PURE__ */ jsxs5(Fragment4, { children: [
553
- menuIcon(menu),
554
- menu.label
555
- ] })
556
- })
557
- }
558
- ) }, menu.id);
414
+ return () => {
415
+ window.removeEventListener("scroll", handleScroll);
416
+ };
417
+ }, [config.autoHide]);
418
+ const renderNavigationItem = (item) => {
419
+ if (item.element) {
420
+ return /* @__PURE__ */ jsx5(React.Fragment, { children: item.element }, item.id);
559
421
  }
560
- const open = openId === menu.id;
561
- return (
562
- // A dropdown is anchored to its trigger (`relative`); a mega menu to the
563
- // bar itself, so its wrapper stays unpositioned.
564
- /* @__PURE__ */ jsxs5("div", { className: cn("flex", !isMegaMenu(menu) && "relative"), children: [
565
- /* @__PURE__ */ jsxs5(
422
+ if (item.children && item.children.length > 0) {
423
+ const isOpen = openDropdowns[item.id] || false;
424
+ return /* @__PURE__ */ jsxs5("div", { className: "relative", children: [
425
+ /* @__PURE__ */ jsx5(
566
426
  Button,
567
427
  {
568
- type: "button",
428
+ ref: (el) => {
429
+ triggerRefs.current[item.id] = el;
430
+ },
569
431
  variant: "transparent",
570
- size: "wrap",
432
+ leftIcon: item.icon,
433
+ rightIcon: item.badge,
434
+ onClick: () => {
435
+ setOpenDropdowns((prev) => ({
436
+ [item.id]: !prev[item.id]
437
+ }));
438
+ },
439
+ size: "default",
571
440
  font: "regular",
572
- ...getTriggerProps(menu.id),
573
- "aria-current": current ? "page" : void 0,
574
441
  className: cn(
575
- TOP_ITEM_CLASS,
576
- NAV_FOCUS_CLASS,
577
- open && "bg-ods-bg-hover text-ods-text-primary",
578
- current && TOP_ITEM_CURRENT_CLASS
442
+ // Top-level nav links (Figma 2936-6815): compact h6 label
443
+ // (DM Sans 500, 14/20) with 24px icons — overrides the
444
+ // font="regular" h4 step and the button's 20px svg cap.
445
+ NAV_ITEM_CLASSES,
446
+ item.isActive && "bg-ods-bg-hover",
447
+ // Active items get subtle gray background
448
+ isOpen && "bg-ods-bg-hover",
449
+ // Open dropdowns get gray background
450
+ item.className
579
451
  ),
580
- children: [
581
- menuIcon(menu),
582
- menu.label,
583
- /* @__PURE__ */ jsx6(
584
- Chevron02DownIcon,
585
- {
586
- "aria-hidden": "true",
587
- className: cn("!h-4 !w-4 transition-transform duration-150", open && "rotate-180")
588
- }
589
- )
590
- ]
452
+ children: item.label
591
453
  }
592
454
  ),
593
- /* @__PURE__ */ jsx6(
594
- NavPanel,
595
- {
596
- ...getPanelProps(menu.id),
597
- menu,
598
- open,
599
- motion: open ? megaMotion : void 0,
600
- handoff: openMegaIndex >= 0,
601
- renderLink,
602
- badges,
603
- social,
604
- onNavigate: close
605
- }
606
- )
607
- ] }, menu.id)
608
- );
609
- };
610
- const primaryCta = typeof nav.primaryCta === "object" ? /* @__PURE__ */ jsx6(Button, { variant: "accent", href: nav.primaryCta.href, children: nav.primaryCta.label }) : nav.primaryCta === "none" ? null : cta ?? null;
611
- const hasRight = !!mingo || !!nav.signIn || !!actions || !!primaryCta;
612
- return /* @__PURE__ */ jsxs5(
613
- "div",
614
- {
615
- "data-site-header": "",
616
- className: "sticky top-0 z-[50] w-full transition-transform duration-300 ease-in-out",
617
- style: { transform: headerShown ? "translateY(0)" : "translateY(-100%)" },
618
- children: [
619
- /* @__PURE__ */ jsx6(
620
- next_link_default,
455
+ /* @__PURE__ */ jsxs5(
456
+ "div",
621
457
  {
622
- href: `#${skipToContentId}`,
458
+ ref: (el) => {
459
+ dropdownRefs.current[item.id] = el;
460
+ },
461
+ inert: !isOpen,
623
462
  className: cn(
624
- "sr-only left-[var(--spacing-system-lf)] top-3 z-[70] rounded-md bg-ods-text-primary px-[var(--spacing-system-mf)] py-[var(--spacing-system-xsf)] text-ods-bg text-h6 focus:not-sr-only focus:absolute",
625
- NAV_FOCUS_CLASS
463
+ "absolute left-0 top-full mt-1",
464
+ item.dropdownClassName ? "" : "border border-ods-border bg-ods-card",
465
+ "z-[9999] rounded-lg shadow-xl",
466
+ item.id === "community" ? "min-w-[240px]" : "min-w-[220px]",
467
+ "transition-opacity duration-150",
468
+ isOpen ? "pointer-events-auto visible opacity-100" : "pointer-events-none invisible opacity-0",
469
+ item.dropdownClassName || ""
626
470
  ),
627
- children: "Skip to content"
628
- }
629
- ),
630
- /* @__PURE__ */ jsx6(
631
- TopNavigation,
632
- {
633
- className: cn("relative", className),
634
- style,
635
- backgroundClassName,
636
- centerBreakpoint: "lg",
637
- size: "big",
638
- leading: /* @__PURE__ */ jsxs5(Fragment4, { children: [
639
- leading,
640
- mobile && /* @__PURE__ */ jsx6(
641
- HeaderButton,
642
- {
643
- className: "border-r border-ods-border lg:hidden",
644
- onClick: mobile.onToggle,
645
- isActive: mobile.isOpen,
646
- "aria-label": mobile.isOpen ? "Close menu" : "Open menu",
647
- "aria-expanded": mobile.isOpen,
648
- "aria-controls": mobile.isOpen ? mobile.controlsId ?? MOBILE_NAV_SHEET_ID : void 0,
649
- icon: mobile.isOpen ? /* @__PURE__ */ jsx6(XmarkIcon, { className: "h-6 w-6" }) : /* @__PURE__ */ jsx6(Menu01Icon, { className: "h-6 w-6" })
650
- }
651
- )
652
- ] }),
653
- logo: logoHref ? renderLink({
654
- link: { href: logoHref },
655
- className: cn(
656
- "flex min-w-0 items-center rounded-md transition-opacity duration-200 hover:opacity-80",
657
- NAV_FOCUS_CLASS
658
- ),
659
- "aria-label": nav.brand.name,
660
- children: logo
661
- }) : logo,
662
- logoClassName: "shrink pl-[var(--spacing-system-lf)] md:pl-[var(--spacing-system-lf)] lg:pl-[var(--spacing-system-lf)]",
663
- center: nav.menus.length > 0 ? /* @__PURE__ */ jsx6("nav", { "aria-label": "Main", className: "flex items-center gap-[var(--spacing-system-xxs)]", children: nav.menus.map(renderMenu) }) : void 0,
664
- centerClassName: "justify-start pl-[var(--spacing-system-xlf)]",
665
- cta: hasRight ? /* @__PURE__ */ jsxs5(Fragment4, { children: [
666
- mingo && /* @__PURE__ */ jsx6(
667
- MingoAiButton,
668
- {
669
- source: mingo.source,
670
- icon: mingo.icon,
671
- label: mingo.label,
672
- shortcutHint: mingo.shortcutHint
673
- }
674
- ),
675
- nav.signIn && /* @__PURE__ */ jsx6("div", { className: "hidden lg:flex", children: /* @__PURE__ */ jsx6(
471
+ children: [
472
+ /* @__PURE__ */ jsx5("div", { className: "p-2", children: item.children.map((child, index) => /* @__PURE__ */ jsx5(
676
473
  Button,
677
474
  {
678
- asChild: true,
679
475
  variant: "transparent",
680
- size: "wrap",
681
- font: "regular",
682
- className: cn(TOP_ITEM_CLASS, NAV_FOCUS_CLASS),
683
- children: renderLink({ link: nav.signIn, children: nav.signIn.label })
684
- }
685
- ) }),
686
- actions,
687
- primaryCta
688
- ] }) : void 0,
689
- ctaClassName: "gap-[var(--spacing-system-xsf)]",
690
- sideActions
476
+ size: "small-legacy",
477
+ href: child.href,
478
+ leftIcon: child.icon,
479
+ rightIcon: child.badge,
480
+ onClick: () => {
481
+ setOpenDropdowns((prev) => ({ ...prev, [item.id]: false }));
482
+ if (child.onClick) {
483
+ child.onClick();
484
+ }
485
+ },
486
+ className: cn(
487
+ "flex w-full justify-start",
488
+ // Same caption step as the top-level nav links (designer:
489
+ // dropdowns follow the h6 caption size/weight too). The
490
+ // explicit font-medium beats small-legacy's font-bold via
491
+ // tailwind-merge instead of stylesheet order.
492
+ "font-medium text-h6",
493
+ index < (item.children?.length ?? 0) - 1 && "mb-1",
494
+ "text-ods-text-primary",
495
+ // All dropdown items use primary text color
496
+ child.isActive && "bg-ods-bg-hover"
497
+ // Active dropdown items get gray background
498
+ ),
499
+ ...child.isExternal && { isExternal: true },
500
+ children: child.label
501
+ },
502
+ child.id
503
+ )) }),
504
+ item.dropdownContent && /* @__PURE__ */ jsxs5(Fragment2, { children: [
505
+ item.showDropdownDivider !== false && /* @__PURE__ */ jsx5("div", { className: "mx-2 my-2 h-px bg-ods-border" }),
506
+ /* @__PURE__ */ jsx5("div", { className: "px-2 pb-2", children: item.dropdownContent })
507
+ ] })
508
+ ]
691
509
  }
692
510
  )
693
- ]
511
+ ] }, item.id);
694
512
  }
695
- );
696
- }
697
-
698
- // src/components/navigation/mobile-nav-sheet.tsx
699
- import { usePreventScroll } from "@react-aria/overlays";
700
- import { useRef as useRef2, useState as useState2 } from "react";
701
- import { Fragment as Fragment5, jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
702
- function siteNavHasMobileMenus(nav) {
703
- return (nav.mobileMenus ?? nav.menus).length > 0;
704
- }
705
- var GROUP_ROW_CLASS = "flex min-h-14 w-full items-center justify-between gap-[var(--spacing-system-sf)] text-left text-ods-text-primary text-h4";
706
- var menuLinks = (menu) => [
707
- ...(menu.columns ?? []).flatMap((group) => group.links),
708
- ...menu.sideLinks ?? []
709
- ];
710
- function MobileNavSheet(props) {
711
- if (!props.isOpen) return null;
712
- return /* @__PURE__ */ jsx7(MobileNavSheetBody, { ...props });
713
- }
714
- function MobileNavSheetBody({
715
- nav,
716
- onClose,
717
- pathname,
718
- logo,
719
- renderLink = defaultRenderSiteNavLink,
720
- cta,
721
- actions,
722
- askAI,
723
- extraMenus,
724
- badges,
725
- social,
726
- backgroundClassName
727
- }) {
728
- const sheetRef = useRef2(null);
729
- const menus = [...nav.mobileMenus ?? nav.menus, ...extraMenus ?? []];
730
- usePreventScroll();
731
- useFocusTrap(sheetRef, true, { onEscape: onClose });
732
- const [openGroups, setOpenGroups] = useState2(() => {
733
- const active = resolveActiveSection(menus, pathname);
734
- return active ? { [active]: true } : {};
735
- });
736
- const primaryCta = typeof nav.primaryCta === "object" ? /* @__PURE__ */ jsx7(Button, { variant: "accent", href: nav.primaryCta.href, onClick: onClose, className: "w-full", children: nav.primaryCta.label }) : nav.primaryCta === "none" ? null : cta ?? null;
737
- const hasFooter = !!actions || !!primaryCta || !!nav.signIn;
738
- return /* @__PURE__ */ jsxs6(
739
- "div",
740
- {
741
- ref: sheetRef,
742
- id: MOBILE_NAV_SHEET_ID,
743
- role: "dialog",
744
- "aria-modal": "true",
745
- "aria-label": "Navigation menu",
746
- tabIndex: -1,
747
- className: cn(
748
- "fixed inset-0 z-[9999] flex h-[100svh] flex-col text-ods-text-primary outline-none",
749
- backgroundClassName ?? "bg-ods-bg"
750
- ),
751
- children: [
752
- /* @__PURE__ */ jsxs6("div", { className: "flex h-14 shrink-0 items-center justify-between border-b border-ods-border pl-5 pr-[var(--spacing-system-xsf)]", children: [
753
- /* @__PURE__ */ jsx7("div", { className: "flex min-w-0 items-center", children: logo }),
754
- /* @__PURE__ */ jsx7(
755
- Button,
756
- {
757
- type: "button",
758
- variant: "transparent",
759
- size: "icon",
760
- "aria-label": "Close menu",
761
- onClick: onClose,
762
- className: cn("h-11 w-11 shrink-0 md:h-11 md:w-11", NAV_FOCUS_CLASS),
763
- children: /* @__PURE__ */ jsx7(XmarkIcon, { "aria-hidden": "true", className: "!h-6 !w-6" })
764
- }
765
- )
766
- ] }),
767
- /* @__PURE__ */ jsxs6("div", { className: "min-h-0 flex-1 overflow-y-auto overflow-x-hidden overscroll-contain px-5", children: [
768
- askAI && /* @__PURE__ */ jsx7(
769
- MingoAiButton,
770
- {
771
- variant: "field",
772
- source: askAI.source,
773
- icon: askAI.icon,
774
- label: askAI.label,
775
- onClick: onClose
776
- }
513
+ if (item.href || item.onClick) {
514
+ return /* @__PURE__ */ jsx5(
515
+ Button,
516
+ {
517
+ variant: "transparent",
518
+ href: item.href,
519
+ onClick: item.onClick,
520
+ leftIcon: item.icon,
521
+ rightIcon: item.badge,
522
+ size: "default",
523
+ font: "regular",
524
+ className: cn(
525
+ NAV_ITEM_CLASSES,
526
+ "hover:bg-ods-bg-hover focus:bg-ods-bg-hover",
527
+ "whitespace-nowrap",
528
+ "text-ods-text-primary",
529
+ // All items use primary text color
530
+ item.isActive && "bg-ods-bg-hover",
531
+ // Active items get subtle gray background
532
+ item.className
777
533
  ),
778
- /* @__PURE__ */ jsx7("nav", { "aria-label": "Main", children: menus.map((menu) => {
779
- const links = menuLinks(menu);
780
- if (links.length === 0) {
781
- if (!menu.href) return null;
782
- return /* @__PURE__ */ jsx7("div", { className: "border-b border-ods-border", children: renderLink({
783
- link: { href: menu.href },
784
- className: cn(GROUP_ROW_CLASS, NAV_FOCUS_CLASS),
785
- onClick: onClose,
786
- children: /* @__PURE__ */ jsxs6(Fragment5, { children: [
787
- menu.label,
788
- /* @__PURE__ */ jsx7(Chevron02RightIcon, { "aria-hidden": "true", className: "h-5 w-5 shrink-0 text-ods-text-muted" })
789
- ] })
790
- }) }, menu.id);
791
- }
792
- const open = !!openGroups[menu.id];
793
- const listId = `${MOBILE_NAV_SHEET_ID}-${menu.id}`;
794
- return /* @__PURE__ */ jsxs6("div", { className: "border-b border-ods-border", children: [
795
- /* @__PURE__ */ jsxs6(
796
- Button,
797
- {
798
- type: "button",
799
- variant: "glyph",
800
- size: "wrap",
801
- font: "regular",
802
- "aria-expanded": open,
803
- "aria-controls": open ? listId : void 0,
804
- onClick: () => setOpenGroups((prev) => ({ ...prev, [menu.id]: !prev[menu.id] })),
805
- className: cn(GROUP_ROW_CLASS, NAV_FOCUS_CLASS),
806
- children: [
807
- menu.label,
808
- /* @__PURE__ */ jsx7(
809
- Chevron02DownIcon,
810
- {
811
- "aria-hidden": "true",
812
- className: cn(
813
- "h-5 w-5 shrink-0 text-ods-text-muted transition-transform duration-150",
814
- open && "rotate-180"
815
- )
816
- }
817
- )
818
- ]
819
- }
820
- ),
821
- open && /* @__PURE__ */ jsxs6("div", { id: listId, className: "flex flex-col pb-[var(--spacing-system-sf)]", children: [
822
- links.map((link) => /* @__PURE__ */ jsx7(
823
- NavItemRow,
824
- {
825
- link,
826
- variant: "sheet",
827
- renderLink,
828
- badge: link.badgeKey ? badges?.[link.badgeKey] : void 0,
829
- onNavigate: onClose
830
- },
831
- link.id
832
- )),
833
- menu.showSocial && social && /* @__PURE__ */ jsx7("div", { className: "pt-[var(--spacing-system-xsf)]", children: social })
834
- ] })
835
- ] }, menu.id);
836
- }) })
837
- ] }),
838
- hasFooter && /* @__PURE__ */ jsxs6("div", { className: "flex shrink-0 flex-col gap-[var(--spacing-system-xxs)] border-t border-ods-border px-5 pb-[max(1.75rem,env(safe-area-inset-bottom))] pt-[var(--spacing-system-mf)] [&_a]:w-full [&_button]:w-full", children: [
839
- actions,
840
- primaryCta,
841
- nav.signIn && renderLink({
842
- link: nav.signIn,
843
- className: cn(
844
- "flex h-12 items-center justify-center rounded-md text-ods-text-primary text-h4",
845
- NAV_FOCUS_CLASS
846
- ),
847
- onClick: onClose,
848
- children: nav.signIn.label
849
- })
850
- ] })
851
- ]
534
+ ...item.isExternal && { isExternal: true },
535
+ children: item.label
536
+ },
537
+ item.id
538
+ );
852
539
  }
853
- );
854
- }
855
-
856
- // src/components/navigation/site-footer.tsx
857
- import { useState as useState3 } from "react";
858
- import { Fragment as Fragment6, jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
859
- var ACCORDION_OVER = 2;
860
- var DESKTOP_COLUMNS = {
861
- 1: "md:grid-cols-1",
862
- 2: "md:grid-cols-2",
863
- 3: "md:grid-cols-3",
864
- 4: "md:grid-cols-3 lg:grid-cols-4",
865
- 5: "md:grid-cols-3 lg:grid-cols-5",
866
- 6: "md:grid-cols-3 lg:grid-cols-6"
867
- };
868
- var HEADING_CLASS2 = "text-ods-text-muted text-h5";
869
- function FooterColumn({
870
- group,
871
- accordion,
872
- renderLink
873
- }) {
874
- const [open, setOpen] = useState3(false);
875
- const listId = `site-footer-${group.id}`;
876
- const links = group.links.map((link) => /* @__PURE__ */ jsx8("li", { children: /* @__PURE__ */ jsx8(NavItemRow, { link, variant: "label", renderLink }) }, link.id));
877
- return /* @__PURE__ */ jsxs7(
540
+ return /* @__PURE__ */ jsx5(
541
+ Button,
542
+ {
543
+ variant: "transparent",
544
+ onClick: item.onClick,
545
+ leftIcon: item.icon,
546
+ rightIcon: item.badge,
547
+ size: "default",
548
+ font: "regular",
549
+ className: cn(
550
+ NAV_ITEM_CLASSES,
551
+ "hover:bg-ods-bg-hover focus:bg-ods-bg-hover",
552
+ "whitespace-nowrap",
553
+ "text-ods-text-primary",
554
+ // All items use primary text color
555
+ item.isActive && "bg-ods-bg-hover",
556
+ // Active items get gray background
557
+ item.className
558
+ ),
559
+ children: item.label
560
+ },
561
+ item.id
562
+ );
563
+ };
564
+ const headerShown = !config.autoHide || show;
565
+ const hasNav = !!config.navigation && config.navigation.items.length > 0;
566
+ const hasCta = !!config.actions?.right?.length || !!(config.actions?.persistent && config.actions.persistent.length > 0);
567
+ return /* @__PURE__ */ jsx5(
878
568
  "div",
879
569
  {
880
- className: cn(
881
- "flex min-w-0 flex-col md:gap-[var(--spacing-system-mf)]",
882
- accordion ? "border-b border-ods-border md:border-b-0" : "gap-[var(--spacing-system-mf)]"
883
- ),
884
- children: [
885
- group.title && (accordion ? /* @__PURE__ */ jsxs7(Fragment6, { children: [
886
- /* @__PURE__ */ jsx8("h3", { className: "md:hidden", children: /* @__PURE__ */ jsxs7(
887
- Button,
570
+ className: cn("sticky top-0 z-[50] w-full transition-transform duration-300 ease-in-out"),
571
+ style: {
572
+ transform: !headerShown ? "translateY(-100%)" : "translateY(0)"
573
+ },
574
+ children: /* @__PURE__ */ jsx5(
575
+ TopNavigation,
576
+ {
577
+ className: cn("relative", config.className),
578
+ style: config.style,
579
+ backgroundClassName: config.backgroundColor,
580
+ centerBreakpoint: "lg",
581
+ size: "big",
582
+ leading: /* @__PURE__ */ jsxs5(Fragment2, { children: [
583
+ !!config.actions?.left?.length && /* @__PURE__ */ jsx5("div", { className: "flex h-full items-center border-r border-ods-border", children: config.actions.left }),
584
+ config.mobile?.enabled && /* @__PURE__ */ jsx5(
585
+ HeaderButton,
586
+ {
587
+ className: "border-r border-ods-border lg:hidden",
588
+ onClick: () => {
589
+ config.mobile?.onToggle?.();
590
+ },
591
+ isActive: config.mobile?.isOpen ?? false,
592
+ "aria-label": config.mobile?.isOpen ? "Close menu" : "Open menu",
593
+ "aria-expanded": config.mobile?.isOpen ?? false,
594
+ "aria-controls": config.mobile?.isOpen ? MOBILE_NAV_PANEL_ID : void 0,
595
+ icon: config.mobile?.isOpen ? config.mobile?.closeIcon || /* @__PURE__ */ jsx5(XmarkIcon, { className: "h-6 w-6" }) : config.mobile?.menuIcon || /* @__PURE__ */ jsx5(Menu01Icon, { className: "h-6 w-6" })
596
+ }
597
+ )
598
+ ] }),
599
+ logo: config.logo.href ? /* @__PURE__ */ jsx5(next_link_default, { href: config.logo.href, className: "transition-opacity duration-200 hover:opacity-80", children: config.logo.element }) : config.logo.element,
600
+ logoClassName: "pl-[var(--spacing-system-lf)] md:pl-[var(--spacing-system-lf)] lg:pl-[var(--spacing-system-lf)]",
601
+ center: hasNav ? /* @__PURE__ */ jsx5(
602
+ "nav",
888
603
  {
889
- type: "button",
890
- variant: "glyph",
891
- size: "wrap",
892
- font: "regular",
893
- "aria-expanded": open,
894
- "aria-controls": listId,
895
- onClick: () => setOpen((prev) => !prev),
896
604
  className: cn(
897
- "flex min-h-14 w-full items-center justify-between gap-[var(--spacing-system-sf)] text-left",
898
- HEADING_CLASS2,
899
- NAV_FOCUS_CLASS
605
+ "flex items-center gap-2",
606
+ // True centering relative to the bar (not the leftover flex
607
+ // space) — same treatment the pre-unification header had.
608
+ config.navigation?.position === "center" && "absolute left-1/2 -translate-x-1/2"
900
609
  ),
901
- children: [
902
- group.title,
903
- /* @__PURE__ */ jsx8(
904
- Chevron02DownIcon,
905
- {
906
- "aria-hidden": "true",
907
- className: cn("h-5 w-5 shrink-0 transition-transform duration-150", open && "rotate-180")
908
- }
909
- )
910
- ]
610
+ role: "navigation",
611
+ "aria-label": "Main navigation",
612
+ children: config.navigation?.items.map(renderNavigationItem)
911
613
  }
912
- ) }),
913
- /* @__PURE__ */ jsx8("h3", { className: cn("hidden md:block", HEADING_CLASS2), children: group.title })
914
- ] }) : /* @__PURE__ */ jsx8("h3", { className: HEADING_CLASS2, children: group.title })),
915
- /* @__PURE__ */ jsx8(
916
- "ul",
917
- {
918
- id: listId,
919
- className: cn(
920
- "flex-col md:flex md:gap-[var(--spacing-system-sf)] md:pb-0",
921
- accordion ? open ? "flex gap-[var(--spacing-system-sf)] pb-[var(--spacing-system-mf)]" : "hidden" : "flex gap-[var(--spacing-system-sf)]"
614
+ ) : void 0,
615
+ centerClassName: cn(
616
+ config.navigation?.position === "left" && "justify-start",
617
+ config.navigation?.position === "right" && "justify-end pr-[var(--spacing-system-m)]"
618
+ ),
619
+ cta: hasCta ? /* @__PURE__ */ jsxs5(Fragment2, { children: [
620
+ !!config.actions?.right?.length && /* @__PURE__ */ jsx5("div", { className: "hidden items-center gap-3 lg:flex", children: config.actions.right }),
621
+ config.actions?.persistent && config.actions.persistent.length > 0 && /* @__PURE__ */ jsx5("div", { className: "flex items-center", children: config.actions.persistent })
622
+ ] }) : void 0,
623
+ ctaClassName: "gap-3",
624
+ sideActions: config.tickets || config.mingo?.enabled ? /* @__PURE__ */ jsxs5(Fragment2, { children: [
625
+ config.tickets && /* @__PURE__ */ jsx5(
626
+ TicketAlertsButton,
627
+ {
628
+ href: config.tickets.href,
629
+ onNavigate: config.tickets.onClick,
630
+ className: "border-l border-ods-border"
631
+ }
922
632
  ),
923
- children: links
924
- }
925
- )
926
- ]
633
+ config.mingo?.enabled && /* @__PURE__ */ jsx5(
634
+ MingoAiButton,
635
+ {
636
+ source: config.mingo.source,
637
+ icon: config.mingo.icon,
638
+ label: config.mingo.label,
639
+ className: config.mingo.className
640
+ }
641
+ )
642
+ ] }) : void 0
643
+ }
644
+ )
927
645
  }
928
646
  );
929
647
  }
930
- function SiteFooter({
931
- nav,
932
- logo,
933
- name,
934
- renderLink = defaultRenderSiteNavLink,
935
- cta,
936
- social,
937
- brandExtra,
938
- backgroundClassName,
939
- year = (/* @__PURE__ */ new Date()).getFullYear()
940
- }) {
941
- const band = nav.closingBand;
942
- const bandPrimary = typeof nav.primaryCta === "object" ? /* @__PURE__ */ jsx8(Button, { variant: "accent", href: nav.primaryCta.href, children: nav.primaryCta.label }) : nav.primaryCta === "none" ? null : cta ?? null;
943
- const columns = nav.footerColumns;
944
- const accordion = columns.length > ACCORDION_OVER;
945
- const socialRow = social ?? (nav.brand.social.length > 0 ? /* @__PURE__ */ jsx8(
946
- SocialIconRow,
947
- {
948
- compact: true,
949
- links: nav.brand.social.map((link) => ({
950
- platform: link.iconName ?? link.id,
951
- href: link.href,
952
- label: link.label
953
- }))
954
- }
955
- ) : null);
956
- return /* @__PURE__ */ jsxs7(
957
- "footer",
648
+
649
+ // src/components/navigation/header-skeleton.tsx
650
+ import { Fragment as Fragment3, jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
651
+ function HeaderSkeleton({ config }) {
652
+ const showNavigation = config?.navigation && config.navigation.items.length > 0;
653
+ const showActions = config?.actions?.right && config.actions.right.length > 0;
654
+ const showMobileMenu = config?.mobile?.enabled;
655
+ const showLeftActions = !!config?.actions?.left;
656
+ return /* @__PURE__ */ jsx6("div", { className: "sticky top-0 z-[50] w-full", children: /* @__PURE__ */ jsxs6(
657
+ "header",
958
658
  {
959
659
  className: cn(
960
- "relative z-[44] w-full border-t border-ods-border px-[var(--spacing-system-lf)] text-ods-text-primary",
961
- backgroundClassName ?? "bg-ods-bg"
660
+ "flex h-[72px] w-full items-center border-b border-t border-ods-border md:border-t-0",
661
+ config?.backgroundColor || "bg-ods-card",
662
+ config?.className
962
663
  ),
963
664
  children: [
964
- band && /* @__PURE__ */ jsxs7("div", { className: "flex flex-col gap-[var(--spacing-system-lf)] border-b border-ods-border py-[var(--spacing-system-xlf)] md:flex-row md:items-center md:justify-between md:gap-[var(--spacing-system-xlf)] md:py-14", children: [
965
- /* @__PURE__ */ jsxs7("div", { className: "flex min-w-0 flex-col gap-[var(--spacing-system-xsf)]", children: [
966
- /* @__PURE__ */ jsx8("h2", { className: "text-h2", children: band.heading }),
967
- /* @__PURE__ */ jsx8("p", { className: "text-ods-text-secondary text-h4", children: band.subheading })
968
- ] }),
969
- /* @__PURE__ */ jsxs7("div", { className: "flex shrink-0 flex-col gap-[var(--spacing-system-sf)] md:flex-row", children: [
970
- bandPrimary,
971
- band.secondary && /* @__PURE__ */ jsx8(Button, { variant: "outline", href: band.secondary.href, openInNewTab: band.secondary.external, children: navLinkLabel(band.secondary) })
972
- ] })
665
+ showLeftActions && /* @__PURE__ */ jsx6("div", { className: "flex h-full w-[72px] items-center justify-center border-r border-ods-border", children: /* @__PURE__ */ jsx6("div", { className: "h-6 w-6 animate-pulse rounded bg-ods-border" }) }),
666
+ showMobileMenu && /* @__PURE__ */ jsx6("div", { className: "flex h-full w-[72px] items-center justify-center border-r border-ods-border lg:hidden", children: /* @__PURE__ */ jsx6("div", { className: "h-6 w-6 animate-pulse rounded bg-ods-border" }) }),
667
+ /* @__PURE__ */ jsxs6("div", { className: "flex h-full flex-1 items-center gap-2 p-[var(--spacing-system-m)] md:pl-[var(--spacing-system-l)] lg:flex-none lg:pl-[var(--spacing-system-xxl)]", children: [
668
+ /* @__PURE__ */ jsx6("div", { className: "h-6 w-6 animate-pulse rounded bg-ods-border" }),
669
+ /* @__PURE__ */ jsx6("div", { className: "h-5 w-24 animate-pulse rounded bg-ods-border" })
973
670
  ] }),
974
- /* @__PURE__ */ jsxs7("div", { className: "flex flex-col gap-8 py-[var(--spacing-system-xlf)] lg:flex-row lg:gap-16 lg:py-14", children: [
975
- /* @__PURE__ */ jsxs7("div", { className: "flex w-full shrink-0 flex-col items-start gap-[var(--spacing-system-mf)] lg:w-60", children: [
976
- /* @__PURE__ */ jsxs7("span", { className: "flex items-center gap-[var(--spacing-system-xsf)]", children: [
977
- logo,
978
- typeof name === "string" ? /* @__PURE__ */ jsx8("span", { className: "whitespace-nowrap text-ods-text-primary text-wordmark", children: name }) : name
979
- ] }),
980
- /* @__PURE__ */ jsx8("p", { className: "text-ods-text-secondary text-h6", children: nav.brand.tagline }),
981
- socialRow,
982
- nav.brand.statusUrl && renderLink({
983
- link: { href: nav.brand.statusUrl, external: true },
984
- className: cn(
985
- "inline-flex items-center gap-[var(--spacing-system-xsf)] text-ods-text-secondary transition-colors text-h6 hover:text-ods-text-primary",
986
- NAV_FOCUS_CLASS
987
- ),
988
- children: /* @__PURE__ */ jsxs7(Fragment6, { children: [
989
- /* @__PURE__ */ jsx8("span", { "aria-hidden": "true", className: "h-2 w-2 rounded-full bg-ods-success" }),
990
- "System status"
991
- ] })
992
- }),
993
- brandExtra
994
- ] }),
995
- columns.length > 0 && /* @__PURE__ */ jsx8(
996
- "nav",
997
- {
998
- "aria-label": "Footer",
999
- className: cn(
1000
- "grid min-w-0 flex-1 md:gap-7",
1001
- accordion ? "grid-cols-1" : "grid-cols-2 gap-7",
1002
- DESKTOP_COLUMNS[Math.min(columns.length, 6)]
1003
- ),
1004
- children: columns.map((group) => /* @__PURE__ */ jsx8(FooterColumn, { group, accordion, renderLink }, group.id))
1005
- }
1006
- )
1007
- ] }),
1008
- /* @__PURE__ */ jsxs7(
1009
- "div",
1010
- {
1011
- className: cn(
1012
- "flex flex-col gap-[var(--spacing-system-xxs)] border-t border-ods-border pb-[var(--spacing-system-xlf)] pt-[var(--spacing-system-lf)] text-ods-text-muted text-h6 md:flex-row md:items-center md:justify-between md:gap-[var(--spacing-system-lf)]"
1013
- ),
1014
- children: [
1015
- /* @__PURE__ */ jsxs7("span", { children: [
1016
- "\xA9 ",
1017
- year,
1018
- " ",
1019
- nav.legal.company
1020
- ] }),
1021
- /* @__PURE__ */ jsxs7("span", { className: "flex flex-wrap items-center gap-x-[var(--spacing-system-mf)] gap-y-[var(--spacing-system-xxs)]", children: [
1022
- nav.legal.notes.length > 0 && /* @__PURE__ */ jsx8("span", { children: nav.legal.notes.join(" \xB7 ") }),
1023
- nav.legal.links.map((link) => /* @__PURE__ */ jsx8(
1024
- NavItemRow,
1025
- {
1026
- link,
1027
- variant: "label",
1028
- renderLink,
1029
- className: "text-ods-accent hover:text-ods-accent hover:underline"
1030
- },
1031
- link.id
1032
- ))
1033
- ] })
1034
- ]
1035
- }
1036
- )
671
+ /* @__PURE__ */ jsx6("div", { className: "hidden h-full min-w-0 flex-1 items-center justify-center gap-2 lg:flex", children: showNavigation && /* @__PURE__ */ jsxs6(Fragment3, { children: [
672
+ /* @__PURE__ */ jsx6("div", { className: "h-8 w-20 animate-pulse rounded bg-ods-border" }),
673
+ /* @__PURE__ */ jsx6("div", { className: "h-8 w-28 animate-pulse rounded bg-ods-border" }),
674
+ /* @__PURE__ */ jsx6("div", { className: "h-8 w-24 animate-pulse rounded bg-ods-border" })
675
+ ] }) }),
676
+ showActions && /* @__PURE__ */ jsx6("div", { className: "hidden h-full items-center px-[var(--spacing-system-m)] lg:flex", children: /* @__PURE__ */ jsx6("div", { className: "h-8 w-24 animate-pulse rounded bg-ods-border" }) }),
677
+ config?.mingo?.enabled && /* @__PURE__ */ jsx6("div", { className: "flex h-full items-center border-l border-ods-border px-[var(--spacing-system-l)]", children: /* @__PURE__ */ jsx6("div", { className: "h-8 w-8 animate-pulse rounded bg-ods-border md:w-28" }) })
1037
678
  ]
1038
679
  }
1039
- );
680
+ ) });
681
+ }
682
+
683
+ // src/components/navigation/client-only-header.tsx
684
+ import { jsx as jsx7 } from "react/jsx-runtime";
685
+ function ClientOnlyHeader({ config, skeleton }) {
686
+ const isClient = useIsHydrated();
687
+ if (!isClient) {
688
+ return skeleton || /* @__PURE__ */ jsx7(HeaderSkeleton, { config });
689
+ }
690
+ return /* @__PURE__ */ jsx7(Header, { config });
1040
691
  }
1041
692
 
1042
693
  // src/components/navigation/sliding-sidebar.tsx
1043
694
  import { usePreventScroll as usePreventScroll2 } from "@react-aria/overlays";
1044
695
  import { motion, AnimatePresence, useReducedMotion } from "framer-motion";
1045
- import { useState as useState4, useRef as useRef3 } from "react";
1046
- import { Fragment as Fragment7, jsx as jsx9, jsxs as jsxs8 } from "react/jsx-runtime";
696
+ import { useState as useState2, useRef as useRef3 } from "react";
697
+ import { Fragment as Fragment4, jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
1047
698
  function SlidingSidebar({ config }) {
1048
- const [expandedItems, setExpandedItems] = useState4(/* @__PURE__ */ new Set());
699
+ const [expandedItems, setExpandedItems] = useState2(/* @__PURE__ */ new Set());
1049
700
  const mounted = useIsHydrated();
1050
701
  const headerHeight = useHeaderHeight();
1051
702
  const asideRef = useRef3(null);
@@ -1063,24 +714,24 @@ function SlidingSidebar({ config }) {
1063
714
  };
1064
715
  const renderMenuItem = (item, level = 0) => {
1065
716
  if (item.element) {
1066
- return /* @__PURE__ */ jsx9("div", { children: item.element }, item.id);
717
+ return /* @__PURE__ */ jsx8("div", { children: item.element }, item.id);
1067
718
  }
1068
719
  const children = item.children ?? [];
1069
720
  const hasChildren = children.length > 0;
1070
721
  const isExpanded = expandedItems.has(item.id);
1071
722
  if (hasChildren) {
1072
- const chevronIcon = /* @__PURE__ */ jsx9(
723
+ const chevronIcon = /* @__PURE__ */ jsx8(
1073
724
  "svg",
1074
725
  {
1075
726
  className: cn("h-4 w-4 transition-transform", isExpanded && "rotate-90"),
1076
727
  fill: "none",
1077
728
  stroke: "currentColor",
1078
729
  viewBox: "0 0 24 24",
1079
- children: /* @__PURE__ */ jsx9("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 5l7 7-7 7" })
730
+ children: /* @__PURE__ */ jsx8("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 5l7 7-7 7" })
1080
731
  }
1081
732
  );
1082
- return /* @__PURE__ */ jsxs8("div", { className: "space-y-1", children: [
1083
- /* @__PURE__ */ jsxs8(
733
+ return /* @__PURE__ */ jsxs7("div", { className: "space-y-1", children: [
734
+ /* @__PURE__ */ jsxs7(
1084
735
  Button,
1085
736
  {
1086
737
  variant: "transparent",
@@ -1094,12 +745,12 @@ function SlidingSidebar({ config }) {
1094
745
  item.isActive ? "bg-ods-accent text-ods-text-on-accent hover:bg-ods-accent/90" : "text-ods-text-primary hover:bg-ods-border"
1095
746
  ),
1096
747
  children: [
1097
- /* @__PURE__ */ jsx9("span", { className: "truncate", children: item.label }),
1098
- item.badge !== void 0 && /* @__PURE__ */ jsx9("span", { className: "ml-auto mr-2 flex-shrink-0", children: item.badge })
748
+ /* @__PURE__ */ jsx8("span", { className: "truncate", children: item.label }),
749
+ item.badge !== void 0 && /* @__PURE__ */ jsx8("span", { className: "ml-auto mr-2 flex-shrink-0", children: item.badge })
1099
750
  ]
1100
751
  }
1101
752
  ),
1102
- /* @__PURE__ */ jsx9(AnimatePresence, { children: isExpanded && /* @__PURE__ */ jsx9(
753
+ /* @__PURE__ */ jsx8(AnimatePresence, { children: isExpanded && /* @__PURE__ */ jsx8(
1103
754
  motion.div,
1104
755
  {
1105
756
  initial: { height: 0, opacity: 0 },
@@ -1112,13 +763,13 @@ function SlidingSidebar({ config }) {
1112
763
  opacity: { duration: 0.1 }
1113
764
  },
1114
765
  className: "overflow-hidden",
1115
- children: /* @__PURE__ */ jsx9("div", { className: "space-y-1 pl-4", children: children.map((child) => renderMenuItem(child, level + 1)) })
766
+ children: /* @__PURE__ */ jsx8("div", { className: "space-y-1 pl-4", children: children.map((child) => renderMenuItem(child, level + 1)) })
1116
767
  }
1117
768
  ) })
1118
769
  ] }, item.id);
1119
770
  }
1120
771
  if (item.href) {
1121
- return /* @__PURE__ */ jsxs8(
772
+ return /* @__PURE__ */ jsxs7(
1122
773
  Button,
1123
774
  {
1124
775
  variant: "transparent",
@@ -1134,14 +785,14 @@ function SlidingSidebar({ config }) {
1134
785
  item.isActive ? "bg-ods-accent text-ods-text-on-accent hover:bg-ods-accent/90" : "text-ods-text-primary hover:bg-ods-border"
1135
786
  ),
1136
787
  children: [
1137
- /* @__PURE__ */ jsx9("span", { className: "truncate", children: item.label }),
1138
- item.badge !== void 0 && /* @__PURE__ */ jsx9("span", { className: "ml-auto flex-shrink-0", children: item.badge })
788
+ /* @__PURE__ */ jsx8("span", { className: "truncate", children: item.label }),
789
+ item.badge !== void 0 && /* @__PURE__ */ jsx8("span", { className: "ml-auto flex-shrink-0", children: item.badge })
1139
790
  ]
1140
791
  },
1141
792
  item.id
1142
793
  );
1143
794
  }
1144
- return /* @__PURE__ */ jsxs8(
795
+ return /* @__PURE__ */ jsxs7(
1145
796
  Button,
1146
797
  {
1147
798
  variant: "transparent",
@@ -1157,8 +808,8 @@ function SlidingSidebar({ config }) {
1157
808
  item.isActive ? "bg-ods-accent text-ods-text-on-accent hover:bg-ods-accent/90" : "text-ods-text-primary hover:bg-ods-border"
1158
809
  ),
1159
810
  children: [
1160
- /* @__PURE__ */ jsx9("span", { className: "truncate", children: item.label }),
1161
- item.badge !== void 0 && /* @__PURE__ */ jsx9("span", { className: "ml-auto flex-shrink-0", children: item.badge })
811
+ /* @__PURE__ */ jsx8("span", { className: "truncate", children: item.label }),
812
+ item.badge !== void 0 && /* @__PURE__ */ jsx8("span", { className: "ml-auto flex-shrink-0", children: item.badge })
1162
813
  ]
1163
814
  },
1164
815
  item.id
@@ -1167,8 +818,8 @@ function SlidingSidebar({ config }) {
1167
818
  if (!mounted) {
1168
819
  return null;
1169
820
  }
1170
- return /* @__PURE__ */ jsxs8(Fragment7, { children: [
1171
- /* @__PURE__ */ jsx9(AnimatePresence, { children: config.isOpen && /* @__PURE__ */ jsx9(
821
+ return /* @__PURE__ */ jsxs7(Fragment4, { children: [
822
+ /* @__PURE__ */ jsx8(AnimatePresence, { children: config.isOpen && /* @__PURE__ */ jsx8(
1172
823
  motion.div,
1173
824
  {
1174
825
  initial: { opacity: 0 },
@@ -1182,7 +833,7 @@ function SlidingSidebar({ config }) {
1182
833
  onClick: () => config.onClose()
1183
834
  }
1184
835
  ) }),
1185
- /* @__PURE__ */ jsxs8(
836
+ /* @__PURE__ */ jsxs7(
1186
837
  motion.aside,
1187
838
  {
1188
839
  ref: asideRef,
@@ -1209,9 +860,9 @@ function SlidingSidebar({ config }) {
1209
860
  config.className
1210
861
  ),
1211
862
  children: [
1212
- /* @__PURE__ */ jsx9("div", { className: "flex-shrink-0", style: { height: `${headerHeight}px` } }),
1213
- /* @__PURE__ */ jsx9("nav", { className: "flex-1 space-y-2 overflow-y-auto overscroll-contain p-4", children: config.items.map((item) => renderMenuItem(item)) }),
1214
- config.footer && /* @__PURE__ */ jsx9("div", { className: "border-t border-ods-border p-4 pb-[max(1rem,env(safe-area-inset-bottom))]", children: config.footer })
863
+ /* @__PURE__ */ jsx8("div", { className: "flex-shrink-0", style: { height: `${headerHeight}px` } }),
864
+ /* @__PURE__ */ jsx8("nav", { className: "flex-1 space-y-2 overflow-y-auto overscroll-contain p-4", children: config.items.map((item) => renderMenuItem(item)) }),
865
+ config.footer && /* @__PURE__ */ jsx8("div", { className: "border-t border-ods-border p-4 pb-[max(1rem,env(safe-area-inset-bottom))]", children: config.footer })
1215
866
  ]
1216
867
  }
1217
868
  )
@@ -1219,13 +870,13 @@ function SlidingSidebar({ config }) {
1219
870
  }
1220
871
 
1221
872
  // src/components/navigation/navigation-sidebar.tsx
1222
- import { useCallback, useEffect as useEffect3, useMemo, useState as useState5 } from "react";
873
+ import { useCallback, useEffect as useEffect2, useMemo, useState as useState3 } from "react";
1223
874
 
1224
875
  // src/components/navigation/navigation-sidebar-header.tsx
1225
- import { jsx as jsx10, jsxs as jsxs9 } from "react/jsx-runtime";
876
+ import { jsx as jsx9, jsxs as jsxs8 } from "react/jsx-runtime";
1226
877
  function NavigationSidebarHeader({ minimized }) {
1227
- return /* @__PURE__ */ jsxs9("div", { className: "flex h-14 items-center justify-start border-b border-ods-border p-[var(--spacing-system-m)]", children: [
1228
- /* @__PURE__ */ jsx10("div", { className: "flex-shrink-0", children: /* @__PURE__ */ jsx10(
878
+ return /* @__PURE__ */ jsxs8("div", { className: "flex h-14 items-center justify-start border-b border-ods-border p-[var(--spacing-system-m)]", children: [
879
+ /* @__PURE__ */ jsx9("div", { className: "flex-shrink-0", children: /* @__PURE__ */ jsx9(
1229
880
  OpenFrameLogo,
1230
881
  {
1231
882
  className: "h-6 w-6",
@@ -1233,7 +884,7 @@ function NavigationSidebarHeader({ minimized }) {
1233
884
  lowerPathColor: "var(--color-accent-primary)"
1234
885
  }
1235
886
  ) }),
1236
- /* @__PURE__ */ jsx10(
887
+ /* @__PURE__ */ jsx9(
1237
888
  "div",
1238
889
  {
1239
890
  className: cn(
@@ -1241,7 +892,7 @@ function NavigationSidebarHeader({ minimized }) {
1241
892
  minimized ? "ml-0 opacity-0" : "ml-[var(--spacing-system-xs)] opacity-100"
1242
893
  ),
1243
894
  "aria-hidden": minimized,
1244
- children: /* @__PURE__ */ jsx10(OpenFrameText, { textColor: "var(--color-text-primary)" })
895
+ children: /* @__PURE__ */ jsx9(OpenFrameText, { textColor: "var(--color-text-primary)" })
1245
896
  }
1246
897
  )
1247
898
  ] });
@@ -1251,9 +902,9 @@ function NavigationSidebarHeader({ minimized }) {
1251
902
  import { cloneElement, memo } from "react";
1252
903
 
1253
904
  // src/components/navigation/navigation-item-badge.tsx
1254
- import { jsx as jsx11 } from "react/jsx-runtime";
905
+ import { jsx as jsx10 } from "react/jsx-runtime";
1255
906
  function NavigationItemBadge({ label, compact = false, className, ...rest }) {
1256
- return /* @__PURE__ */ jsx11(
907
+ return /* @__PURE__ */ jsx10(
1257
908
  Tag,
1258
909
  {
1259
910
  as: "span",
@@ -1267,7 +918,7 @@ function NavigationItemBadge({ label, compact = false, className, ...rest }) {
1267
918
  }
1268
919
 
1269
920
  // src/components/navigation/navigation-sidebar-item.tsx
1270
- import { Fragment as Fragment8, jsx as jsx12, jsxs as jsxs10 } from "react/jsx-runtime";
921
+ import { Fragment as Fragment5, jsx as jsx11, jsxs as jsxs9 } from "react/jsx-runtime";
1271
922
  var NavigationSidebarItemButton = memo(function NavigationSidebarItemButtonImpl({
1272
923
  item,
1273
924
  isActive,
@@ -1314,14 +965,14 @@ var NavigationSidebarItemButton = memo(function NavigationSidebarItemButtonImpl(
1314
965
  isActive && disabled && "text-ods-text-secondary [&_svg]:fill-ods-text-secondary",
1315
966
  disabled && "cursor-not-allowed opacity-50"
1316
967
  );
1317
- const content = /* @__PURE__ */ jsxs10(Fragment8, { children: [
1318
- /* @__PURE__ */ jsxs10("div", { className: "relative flex flex-shrink-0 items-center justify-center", children: [
968
+ const content = /* @__PURE__ */ jsxs9(Fragment5, { children: [
969
+ /* @__PURE__ */ jsxs9("div", { className: "relative flex flex-shrink-0 items-center justify-center", children: [
1319
970
  cloneElement(item.icon, {
1320
971
  color: isActive && !disabled ? "text-ods-accent" : "text-ods-text-secondary"
1321
972
  }),
1322
- hasUnread && !showLabel && /* @__PURE__ */ jsx12(UnreadDot, { size: "fixed" })
973
+ hasUnread && !showLabel && /* @__PURE__ */ jsx11(UnreadDot, { size: "fixed" })
1323
974
  ] }),
1324
- /* @__PURE__ */ jsxs10(
975
+ /* @__PURE__ */ jsxs9(
1325
976
  "span",
1326
977
  {
1327
978
  className: cn(
@@ -1330,12 +981,12 @@ var NavigationSidebarItemButton = memo(function NavigationSidebarItemButtonImpl(
1330
981
  ),
1331
982
  "aria-hidden": !showLabel,
1332
983
  children: [
1333
- /* @__PURE__ */ jsx12("span", { className: "min-w-0 truncate text-h4", children: item.label }),
1334
- item.badge && /* @__PURE__ */ jsx12(NavigationItemBadge, { label: item.badge, className: "ml-[var(--spacing-system-xs)] shrink-0" })
984
+ /* @__PURE__ */ jsx11("span", { className: "min-w-0 truncate text-h4", children: item.label }),
985
+ item.badge && /* @__PURE__ */ jsx11(NavigationItemBadge, { label: item.badge, className: "ml-[var(--spacing-system-xs)] shrink-0" })
1335
986
  ]
1336
987
  }
1337
988
  ),
1338
- hasUnread && showLabel && /* @__PURE__ */ jsx12("span", { className: "ml-[var(--spacing-system-xs)] flex size-6 flex-shrink-0 items-center justify-center rounded-md bg-ods-accent p-2", children: /* @__PURE__ */ jsx12("span", { className: "text-ods-text-on-accent text-h5", children: unreadCount > 99 ? "99+" : unreadCount }) })
989
+ hasUnread && showLabel && /* @__PURE__ */ jsx11("span", { className: "ml-[var(--spacing-system-xs)] flex size-6 flex-shrink-0 items-center justify-center rounded-md bg-ods-accent p-2", children: /* @__PURE__ */ jsx11("span", { className: "text-ods-text-on-accent text-h5", children: unreadCount > 99 ? "99+" : unreadCount }) })
1339
990
  ] });
1340
991
  const shared = {
1341
992
  className,
@@ -1344,21 +995,21 @@ var NavigationSidebarItemButton = memo(function NavigationSidebarItemButtonImpl(
1344
995
  "aria-current": isActive ? "page" : void 0
1345
996
  };
1346
997
  if (disabled || !item.path || item.onClick) {
1347
- return /* @__PURE__ */ jsx12("button", { type: "button", onClick: (event) => onClick(item, event), disabled, ...shared, children: content });
998
+ return /* @__PURE__ */ jsx11("button", { type: "button", onClick: (event) => onClick(item, event), disabled, ...shared, children: content });
1348
999
  }
1349
- return /* @__PURE__ */ jsx12(next_link_default, { href: item.path, onClick: (event) => onClick(item, event), ...shared, children: content });
1000
+ return /* @__PURE__ */ jsx11(next_link_default, { href: item.path, onClick: (event) => onClick(item, event), ...shared, children: content });
1350
1001
  });
1351
1002
  function NavigationSidebarItemSkeleton({ showLabel }) {
1352
- return /* @__PURE__ */ jsxs10("div", { className: "flex h-14 w-full items-center justify-start p-[var(--spacing-system-m)]", "aria-hidden": "true", children: [
1353
- /* @__PURE__ */ jsx12("div", { className: "relative flex flex-shrink-0 items-center justify-center", children: /* @__PURE__ */ jsx12("div", { className: "h-6 w-6 animate-pulse rounded bg-ods-border" }) }),
1354
- showLabel && /* @__PURE__ */ jsx12("div", { className: "ml-[var(--spacing-system-xs)] h-4 flex-1 animate-pulse rounded bg-ods-border" })
1003
+ return /* @__PURE__ */ jsxs9("div", { className: "flex h-14 w-full items-center justify-start p-[var(--spacing-system-m)]", "aria-hidden": "true", children: [
1004
+ /* @__PURE__ */ jsx11("div", { className: "relative flex flex-shrink-0 items-center justify-center", children: /* @__PURE__ */ jsx11("div", { className: "h-6 w-6 animate-pulse rounded bg-ods-border" }) }),
1005
+ showLabel && /* @__PURE__ */ jsx11("div", { className: "ml-[var(--spacing-system-xs)] h-4 flex-1 animate-pulse rounded bg-ods-border" })
1355
1006
  ] });
1356
1007
  }
1357
1008
 
1358
1009
  // src/components/navigation/navigation-sidebar-toggle.tsx
1359
- import { jsx as jsx13, jsxs as jsxs11 } from "react/jsx-runtime";
1010
+ import { jsx as jsx12, jsxs as jsxs10 } from "react/jsx-runtime";
1360
1011
  function NavigationSidebarToggle({ minimized, showLabel, onToggle }) {
1361
- return /* @__PURE__ */ jsx13("div", { className: "border-t border-ods-border", children: /* @__PURE__ */ jsxs11(
1012
+ return /* @__PURE__ */ jsx12("div", { className: "border-t border-ods-border", children: /* @__PURE__ */ jsxs10(
1362
1013
  "button",
1363
1014
  {
1364
1015
  onClick: onToggle,
@@ -1372,8 +1023,8 @@ function NavigationSidebarToggle({ minimized, showLabel, onToggle }) {
1372
1023
  title: minimized ? "Hide Menu" : void 0,
1373
1024
  "aria-label": "Hide Menu",
1374
1025
  children: [
1375
- /* @__PURE__ */ jsx13("div", { className: "flex flex-shrink-0 items-center justify-center", children: /* @__PURE__ */ jsx13(Chevrons03LeftIcon, { className: "h-6 w-6 rotate-180 text-ods-text-secondary transition-transform duration-300 @[140px]/of-nav-sidebar:rotate-0" }) }),
1376
- /* @__PURE__ */ jsx13(
1026
+ /* @__PURE__ */ jsx12("div", { className: "flex flex-shrink-0 items-center justify-center", children: /* @__PURE__ */ jsx12(Chevrons03LeftIcon, { className: "h-6 w-6 rotate-180 text-ods-text-secondary transition-transform duration-300 @[140px]/of-nav-sidebar:rotate-0" }) }),
1027
+ /* @__PURE__ */ jsx12(
1377
1028
  "span",
1378
1029
  {
1379
1030
  className: cn(
@@ -1390,7 +1041,7 @@ function NavigationSidebarToggle({ minimized, showLabel, onToggle }) {
1390
1041
  }
1391
1042
 
1392
1043
  // src/components/navigation/navigation-sidebar.tsx
1393
- import { Fragment as Fragment9, jsx as jsx14, jsxs as jsxs12 } from "react/jsx-runtime";
1044
+ import { Fragment as Fragment6, jsx as jsx13, jsxs as jsxs11 } from "react/jsx-runtime";
1394
1045
  var MINIMIZED_WIDTH = 56;
1395
1046
  var EXPANDED_WIDTH = 224;
1396
1047
  var STORAGE_KEY = "of.navigationSidebar.minimized";
@@ -1414,15 +1065,15 @@ function NavigationSidebar({ config, disabled = false, pushOnTablet = false }) {
1414
1065
  const isLgUp = useLgUp() ?? false;
1415
1066
  const isTablet = isMdUp && !isLgUp;
1416
1067
  const [desktopMinimized, setDesktopMinimized] = useLocalStorage(STORAGE_KEY, config.minimized ?? false);
1417
- const [tabletMinimized, setTabletMinimized] = useState5(true);
1418
- const [tabletFor, setTabletFor] = useState5(isTablet);
1068
+ const [tabletMinimized, setTabletMinimized] = useState3(true);
1069
+ const [tabletFor, setTabletFor] = useState3(isTablet);
1419
1070
  if (tabletFor !== isTablet) {
1420
1071
  setTabletFor(isTablet);
1421
1072
  if (isTablet) setTabletMinimized(true);
1422
1073
  }
1423
1074
  const hydrated = useIsHydrated();
1424
1075
  const minimized = hydrated ? isTablet ? tabletMinimized : desktopMinimized : config.minimized ?? false;
1425
- const [transitionsEnabled, setTransitionsEnabled] = useState5(false);
1076
+ const [transitionsEnabled, setTransitionsEnabled] = useState3(false);
1426
1077
  const isOverlayOpen = isTablet && !minimized;
1427
1078
  const showLabel = !minimized;
1428
1079
  const handleToggle = useCallback(() => {
@@ -1436,7 +1087,7 @@ function NavigationSidebar({ config, disabled = false, pushOnTablet = false }) {
1436
1087
  const closeOverlay = useCallback(() => {
1437
1088
  setTabletMinimized(true);
1438
1089
  }, []);
1439
- useEffect3(() => {
1090
+ useEffect2(() => {
1440
1091
  if (!isOverlayOpen) return void 0;
1441
1092
  const handleKeyDown = (e) => {
1442
1093
  if (e.key === "Escape") closeOverlay();
@@ -1444,9 +1095,9 @@ function NavigationSidebar({ config, disabled = false, pushOnTablet = false }) {
1444
1095
  document.addEventListener("keydown", handleKeyDown);
1445
1096
  return () => document.removeEventListener("keydown", handleKeyDown);
1446
1097
  }, [isOverlayOpen, closeOverlay]);
1447
- const [pendingItemId, setPendingItemId] = useState5(null);
1098
+ const [pendingItemId, setPendingItemId] = useState3(null);
1448
1099
  const committedActiveId = useMemo(() => config.items.find((item) => item.isActive)?.id ?? null, [config.items]);
1449
- const [pendingClearedFor, setPendingClearedFor] = useState5(committedActiveId);
1100
+ const [pendingClearedFor, setPendingClearedFor] = useState3(committedActiveId);
1450
1101
  if (pendingClearedFor !== committedActiveId) {
1451
1102
  setPendingClearedFor(committedActiveId);
1452
1103
  setPendingItemId(null);
@@ -1497,8 +1148,8 @@ function NavigationSidebar({ config, disabled = false, pushOnTablet = false }) {
1497
1148
  });
1498
1149
  return () => cancelAnimationFrame(id);
1499
1150
  }, [transitionsEnabled]);
1500
- return /* @__PURE__ */ jsxs12(Fragment9, { children: [
1501
- /* @__PURE__ */ jsx14(
1151
+ return /* @__PURE__ */ jsxs11(Fragment6, { children: [
1152
+ /* @__PURE__ */ jsx13(
1502
1153
  "div",
1503
1154
  {
1504
1155
  className: cn(
@@ -1511,7 +1162,7 @@ function NavigationSidebar({ config, disabled = false, pushOnTablet = false }) {
1511
1162
  "aria-hidden": "true"
1512
1163
  }
1513
1164
  ),
1514
- /* @__PURE__ */ jsx14(
1165
+ /* @__PURE__ */ jsx13(
1515
1166
  "div",
1516
1167
  {
1517
1168
  className: cn(
@@ -1522,7 +1173,7 @@ function NavigationSidebar({ config, disabled = false, pushOnTablet = false }) {
1522
1173
  "aria-hidden": "true"
1523
1174
  }
1524
1175
  ),
1525
- /* @__PURE__ */ jsxs12(
1176
+ /* @__PURE__ */ jsxs11(
1526
1177
  "aside",
1527
1178
  {
1528
1179
  className: cn(
@@ -1539,11 +1190,11 @@ function NavigationSidebar({ config, disabled = false, pushOnTablet = false }) {
1539
1190
  ),
1540
1191
  "aria-label": "Main navigation sidebar",
1541
1192
  children: [
1542
- /* @__PURE__ */ jsx14(NavigationSidebarHeader, { minimized }),
1543
- /* @__PURE__ */ jsxs12("div", { className: "flex flex-1 flex-col justify-between overflow-y-auto py-4", children: [
1544
- /* @__PURE__ */ jsxs12("div", { className: "flex flex-col", children: [
1193
+ /* @__PURE__ */ jsx13(NavigationSidebarHeader, { minimized }),
1194
+ /* @__PURE__ */ jsxs11("div", { className: "flex flex-1 flex-col justify-between overflow-y-auto py-4", children: [
1195
+ /* @__PURE__ */ jsxs11("div", { className: "flex flex-col", children: [
1545
1196
  config.topSlot?.({ minimized }),
1546
- /* @__PURE__ */ jsx14("nav", { className: "flex flex-col", "aria-label": "Primary navigation", "aria-busy": !!loadingRows, children: loadingRows ? loadingRows.primary.map((key) => /* @__PURE__ */ jsx14(NavigationSidebarItemSkeleton, { showLabel }, key)) : primaryItems.map((item) => /* @__PURE__ */ jsx14(
1197
+ /* @__PURE__ */ jsx13("nav", { className: "flex flex-col", "aria-label": "Primary navigation", "aria-busy": !!loadingRows, children: loadingRows ? loadingRows.primary.map((key) => /* @__PURE__ */ jsx13(NavigationSidebarItemSkeleton, { showLabel }, key)) : primaryItems.map((item) => /* @__PURE__ */ jsx13(
1547
1198
  NavigationSidebarItemButton,
1548
1199
  {
1549
1200
  item,
@@ -1556,7 +1207,7 @@ function NavigationSidebar({ config, disabled = false, pushOnTablet = false }) {
1556
1207
  item.id
1557
1208
  )) })
1558
1209
  ] }),
1559
- (loadingRows ? loadingRows.secondary.length > 0 : secondaryItems.length > 0) && /* @__PURE__ */ jsx14("nav", { className: "flex flex-col", "aria-label": "Secondary navigation", "aria-busy": !!loadingRows, children: loadingRows ? loadingRows.secondary.map((key) => /* @__PURE__ */ jsx14(NavigationSidebarItemSkeleton, { showLabel }, key)) : secondaryItems.map((item) => /* @__PURE__ */ jsx14(
1210
+ (loadingRows ? loadingRows.secondary.length > 0 : secondaryItems.length > 0) && /* @__PURE__ */ jsx13("nav", { className: "flex flex-col", "aria-label": "Secondary navigation", "aria-busy": !!loadingRows, children: loadingRows ? loadingRows.secondary.map((key) => /* @__PURE__ */ jsx13(NavigationSidebarItemSkeleton, { showLabel }, key)) : secondaryItems.map((item) => /* @__PURE__ */ jsx13(
1560
1211
  NavigationSidebarItemButton,
1561
1212
  {
1562
1213
  item,
@@ -1569,7 +1220,7 @@ function NavigationSidebar({ config, disabled = false, pushOnTablet = false }) {
1569
1220
  item.id
1570
1221
  )) })
1571
1222
  ] }),
1572
- /* @__PURE__ */ jsx14(NavigationSidebarToggle, { minimized, showLabel, onToggle: handleToggle })
1223
+ /* @__PURE__ */ jsx13(NavigationSidebarToggle, { minimized, showLabel, onToggle: handleToggle })
1573
1224
  ]
1574
1225
  }
1575
1226
  )
@@ -1577,11 +1228,11 @@ function NavigationSidebar({ config, disabled = false, pushOnTablet = false }) {
1577
1228
  }
1578
1229
 
1579
1230
  // src/components/navigation/app-header.tsx
1580
- import React2 from "react";
1231
+ import React3 from "react";
1581
1232
 
1582
1233
  // src/components/navigation/header-global-search.tsx
1583
- import React from "react";
1584
- import { jsx as jsx15, jsxs as jsxs13 } from "react/jsx-runtime";
1234
+ import React2 from "react";
1235
+ import { jsx as jsx14, jsxs as jsxs12 } from "react/jsx-runtime";
1585
1236
  function HeaderGlobalSearch({
1586
1237
  value = "",
1587
1238
  onChange,
@@ -1589,7 +1240,7 @@ function HeaderGlobalSearch({
1589
1240
  placeholder = "Global Search",
1590
1241
  className
1591
1242
  }) {
1592
- const [internalValue, setInternalValue] = React.useState(value);
1243
+ const [internalValue, setInternalValue] = React2.useState(value);
1593
1244
  const currentValue = onChange ? value : internalValue;
1594
1245
  const handleChange = (e) => {
1595
1246
  const newValue = e.target.value;
@@ -1608,7 +1259,7 @@ function HeaderGlobalSearch({
1608
1259
  onSubmit?.(currentValue);
1609
1260
  }
1610
1261
  };
1611
- return /* @__PURE__ */ jsxs13(
1262
+ return /* @__PURE__ */ jsxs12(
1612
1263
  "form",
1613
1264
  {
1614
1265
  onSubmit: handleSubmit,
@@ -1621,8 +1272,8 @@ function HeaderGlobalSearch({
1621
1272
  className
1622
1273
  ),
1623
1274
  children: [
1624
- /* @__PURE__ */ jsx15(SearchIcon, { className: "h-6 w-6 shrink-0 text-ods-text-secondary" }),
1625
- /* @__PURE__ */ jsx15(
1275
+ /* @__PURE__ */ jsx14(SearchIcon, { className: "h-6 w-6 shrink-0 text-ods-text-secondary" }),
1276
+ /* @__PURE__ */ jsx14(
1626
1277
  "input",
1627
1278
  {
1628
1279
  type: "text",
@@ -1644,7 +1295,7 @@ function HeaderGlobalSearch({
1644
1295
  }
1645
1296
 
1646
1297
  // src/components/navigation/header-mingo-button.tsx
1647
- import { jsx as jsx16, jsxs as jsxs14 } from "react/jsx-runtime";
1298
+ import { jsx as jsx15, jsxs as jsxs13 } from "react/jsx-runtime";
1648
1299
  function HeaderMingoButton({
1649
1300
  isActive = false,
1650
1301
  iconOnly = false,
@@ -1653,7 +1304,7 @@ function HeaderMingoButton({
1653
1304
  ...props
1654
1305
  }) {
1655
1306
  const showClose = isActive && (iconOnly || closeWhenActive);
1656
- return /* @__PURE__ */ jsxs14(
1307
+ return /* @__PURE__ */ jsxs13(
1657
1308
  "button",
1658
1309
  {
1659
1310
  type: "button",
@@ -1679,11 +1330,11 @@ function HeaderMingoButton({
1679
1330
  // Mobile, drawer open: the icon-only button doubles as the close
1680
1331
  // affordance, so swap the Mingo logo for an X. Match the other header
1681
1332
  // icons (e.g. notifications): secondary color, w-4 h-4 → md:w-6 h-6.
1682
- /* @__PURE__ */ jsx16(XmarkIcon, { className: "h-6 w-6 shrink-0 text-ods-text-secondary" })
1333
+ /* @__PURE__ */ jsx15(XmarkIcon, { className: "h-6 w-6 shrink-0 text-ods-text-secondary" })
1683
1334
  ) : (
1684
1335
  // Outer frame follows the button's text color (currentColor); the eyes
1685
1336
  // and corner block are ODS cyan.
1686
- /* @__PURE__ */ jsx16(
1337
+ /* @__PURE__ */ jsx15(
1687
1338
  MingoIcon,
1688
1339
  {
1689
1340
  color: "currentColor",
@@ -1693,14 +1344,14 @@ function HeaderMingoButton({
1693
1344
  }
1694
1345
  )
1695
1346
  ),
1696
- !iconOnly && /* @__PURE__ */ jsx16("span", { className: "whitespace-nowrap font-bold tracking-[-0.36px] text-h3", children: "Mingo AI" })
1347
+ !iconOnly && /* @__PURE__ */ jsx15("span", { className: "whitespace-nowrap font-bold tracking-[-0.36px] text-h3", children: "Mingo AI" })
1697
1348
  ]
1698
1349
  }
1699
1350
  );
1700
1351
  }
1701
1352
 
1702
1353
  // src/components/navigation/header-organization-filter.tsx
1703
- import { jsx as jsx17, jsxs as jsxs15 } from "react/jsx-runtime";
1354
+ import { jsx as jsx16, jsxs as jsxs14 } from "react/jsx-runtime";
1704
1355
  function HeaderOrganizationFilter({
1705
1356
  organizations = [],
1706
1357
  selectedOrgId,
@@ -1711,8 +1362,8 @@ function HeaderOrganizationFilter({
1711
1362
  const selectedOrg = organizations.find((o) => o.id === selectedOrgId);
1712
1363
  const displayName = selectedOrg?.name || "All Organizations";
1713
1364
  const deviceCount = selectedOrg?.deviceCount ?? totalDeviceCount;
1714
- return /* @__PURE__ */ jsxs15(DropdownMenu, { children: [
1715
- /* @__PURE__ */ jsx17(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs15(
1365
+ return /* @__PURE__ */ jsxs14(DropdownMenu, { children: [
1366
+ /* @__PURE__ */ jsx16(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs14(
1716
1367
  "button",
1717
1368
  {
1718
1369
  className: cn(
@@ -1724,10 +1375,10 @@ function HeaderOrganizationFilter({
1724
1375
  className
1725
1376
  ),
1726
1377
  children: [
1727
- /* @__PURE__ */ jsx17(Filter02Icon, { className: "h-4 w-4 shrink-0 text-ods-text-secondary" }),
1728
- /* @__PURE__ */ jsxs15("div", { className: "flex min-w-0 flex-col items-start justify-center", children: [
1729
- /* @__PURE__ */ jsx17("span", { className: "truncate text-ods-text-primary text-h5", title: displayName, children: displayName }),
1730
- deviceCount !== void 0 && /* @__PURE__ */ jsxs15("span", { className: "truncate text-ods-text-secondary text-h6", children: [
1378
+ /* @__PURE__ */ jsx16(Filter02Icon, { className: "h-4 w-4 shrink-0 text-ods-text-secondary" }),
1379
+ /* @__PURE__ */ jsxs14("div", { className: "flex min-w-0 flex-col items-start justify-center", children: [
1380
+ /* @__PURE__ */ jsx16("span", { className: "truncate text-ods-text-primary text-h5", title: displayName, children: displayName }),
1381
+ deviceCount !== void 0 && /* @__PURE__ */ jsxs14("span", { className: "truncate text-ods-text-secondary text-h6", children: [
1731
1382
  deviceCount.toLocaleString(),
1732
1383
  " Devices"
1733
1384
  ] })
@@ -1735,49 +1386,16 @@ function HeaderOrganizationFilter({
1735
1386
  ]
1736
1387
  }
1737
1388
  ) }),
1738
- /* @__PURE__ */ jsxs15(DropdownMenuContent, { align: "end", className: "min-w-[240px]", children: [
1739
- /* @__PURE__ */ jsx17(DropdownMenuItem, { onClick: () => onOrgChange?.(""), children: "All Organizations" }),
1740
- organizations.map((org) => /* @__PURE__ */ jsx17(DropdownMenuItem, { onClick: () => onOrgChange?.(org.id), children: org.name }, org.id))
1389
+ /* @__PURE__ */ jsxs14(DropdownMenuContent, { align: "end", className: "min-w-[240px]", children: [
1390
+ /* @__PURE__ */ jsx16(DropdownMenuItem, { onClick: () => onOrgChange?.(""), children: "All Organizations" }),
1391
+ organizations.map((org) => /* @__PURE__ */ jsx16(DropdownMenuItem, { onClick: () => onOrgChange?.(org.id), children: org.name }, org.id))
1741
1392
  ] })
1742
1393
  ] });
1743
1394
  }
1744
1395
 
1745
- // src/components/navigation/ticket-alerts-button.tsx
1746
- import { jsx as jsx18, jsxs as jsxs16 } from "react/jsx-runtime";
1747
- function TicketAlertsButton({ href, onNavigate, disabled, className }) {
1748
- const live = useOptionalTicketLive();
1749
- if (!live || !live.authed || live.unreadTotal === 0) return null;
1750
- const targetId = live.nextUnreadTicketId;
1751
- const target = targetId ? buildTicketOpenHref(href, targetId) : href;
1752
- const handleClick = () => {
1753
- if (onNavigate) onNavigate(target);
1754
- else window.location.assign(target);
1755
- };
1756
- return /* @__PURE__ */ jsx18(
1757
- HeaderButton,
1758
- {
1759
- icon: (
1760
- // Glyph inherits HeaderButton's standard cell coloring (secondary at
1761
- // rest, primary on active) — SAME treatment as the notifications
1762
- // bell and time-tracker cells. The indication is carried by the
1763
- // count pill (sidebar count-pill precedent) and by the cell only
1764
- // existing while updates are unread — never by tinting the glyph.
1765
- /* @__PURE__ */ jsxs16("span", { className: "relative inline-flex", children: [
1766
- /* @__PURE__ */ jsx18(LifeBuoyIcon, { className: "h-6 w-6" }),
1767
- /* @__PURE__ */ jsx18(UnreadCountBadge, { count: live.unreadTotal })
1768
- ] })
1769
- ),
1770
- "aria-label": `Support tickets \u2014 ${live.unreadTotal} unread ${live.unreadTotal === 1 ? "update" : "updates"}`,
1771
- onClick: handleClick,
1772
- disabled,
1773
- className: cn(className)
1774
- }
1775
- );
1776
- }
1777
-
1778
1396
  // src/components/navigation/app-header.tsx
1779
- import { Fragment as Fragment10, jsx as jsx19, jsxs as jsxs17 } from "react/jsx-runtime";
1780
- var AppHeader = React2.memo(function AppHeaderImpl({
1397
+ import { Fragment as Fragment7, jsx as jsx17, jsxs as jsxs15 } from "react/jsx-runtime";
1398
+ var AppHeader = React3.memo(function AppHeaderImpl({
1781
1399
  showSearch,
1782
1400
  onSearch,
1783
1401
  showOrganizations,
@@ -1809,7 +1427,7 @@ var AppHeader = React2.memo(function AppHeaderImpl({
1809
1427
  }) {
1810
1428
  const isMdUp = useMdUp() ?? false;
1811
1429
  if (loading) {
1812
- return /* @__PURE__ */ jsx19(
1430
+ return /* @__PURE__ */ jsx17(
1813
1431
  AppHeaderSkeleton,
1814
1432
  {
1815
1433
  showSearch,
@@ -1832,27 +1450,27 @@ var AppHeader = React2.memo(function AppHeaderImpl({
1832
1450
  }
1833
1451
  const dimmedClass = disabled ? "pointer-events-none opacity-50" : "";
1834
1452
  const cellDivider = "border-l border-ods-border";
1835
- return /* @__PURE__ */ jsx19(
1453
+ return /* @__PURE__ */ jsx17(
1836
1454
  TopNavigation,
1837
1455
  {
1838
1456
  className: cn("sticky top-0 z-40", className),
1839
1457
  centerBreakpoint: "md",
1840
1458
  leading: (
1841
1459
  // Mobile: Burger Menu Button
1842
- !isMdUp && /* @__PURE__ */ jsx19(
1460
+ !isMdUp && /* @__PURE__ */ jsx17(
1843
1461
  HeaderButton,
1844
1462
  {
1845
1463
  onClick: onToggleMobileMenu,
1846
1464
  isActive: isMobileMenuOpen,
1847
- icon: isMobileMenuOpen ? /* @__PURE__ */ jsx19(XmarkIcon, { className: "h-6 w-6" }) : /* @__PURE__ */ jsx19(Menu01Icon, { className: "h-6 w-6" }),
1465
+ icon: isMobileMenuOpen ? /* @__PURE__ */ jsx17(XmarkIcon, { className: "h-6 w-6" }) : /* @__PURE__ */ jsx17(Menu01Icon, { className: "h-6 w-6" }),
1848
1466
  "aria-label": isMobileMenuOpen ? "Close menu" : "Open menu",
1849
1467
  "aria-expanded": isMobileMenuOpen,
1850
1468
  className: "border-r border-ods-border"
1851
1469
  }
1852
1470
  )
1853
1471
  ),
1854
- logo: !isMdUp && /* @__PURE__ */ jsxs17(Fragment10, { children: [
1855
- /* @__PURE__ */ jsx19(
1472
+ logo: !isMdUp && /* @__PURE__ */ jsxs15(Fragment7, { children: [
1473
+ /* @__PURE__ */ jsx17(
1856
1474
  OpenFrameLogo,
1857
1475
  {
1858
1476
  className: "h-6 w-6 shrink-0",
@@ -1860,21 +1478,21 @@ var AppHeader = React2.memo(function AppHeaderImpl({
1860
1478
  lowerPathColor: "var(--color-accent-primary)"
1861
1479
  }
1862
1480
  ),
1863
- /* @__PURE__ */ jsx19(OpenFrameText, { textColor: "var(--color-text-primary)", className: "h-4" })
1481
+ /* @__PURE__ */ jsx17(OpenFrameText, { textColor: "var(--color-text-primary)", className: "h-4" })
1864
1482
  ] }),
1865
1483
  logoClassName: "gap-2",
1866
- center: showSearch ? /* @__PURE__ */ jsx19(HeaderGlobalSearch, { onSubmit: onSearch, className: cn("w-full", dimmedClass) }) : void 0,
1867
- sideActions: /* @__PURE__ */ jsxs17(Fragment10, { children: [
1868
- showSearch && /* @__PURE__ */ jsx19(
1484
+ center: showSearch ? /* @__PURE__ */ jsx17(HeaderGlobalSearch, { onSubmit: onSearch, className: cn("w-full", dimmedClass) }) : void 0,
1485
+ sideActions: /* @__PURE__ */ jsxs15(Fragment7, { children: [
1486
+ showSearch && /* @__PURE__ */ jsx17(
1869
1487
  HeaderButton,
1870
1488
  {
1871
- icon: /* @__PURE__ */ jsx19(SearchIcon, { className: "h-6 w-6" }),
1489
+ icon: /* @__PURE__ */ jsx17(SearchIcon, { className: "h-6 w-6" }),
1872
1490
  "aria-label": "Search",
1873
1491
  className: cn("md:hidden", cellDivider, dimmedClass),
1874
1492
  disabled
1875
1493
  }
1876
1494
  ),
1877
- showOrganizations && /* @__PURE__ */ jsx19(
1495
+ showOrganizations && /* @__PURE__ */ jsx17(
1878
1496
  HeaderOrganizationFilter,
1879
1497
  {
1880
1498
  organizations,
@@ -1883,8 +1501,8 @@ var AppHeader = React2.memo(function AppHeaderImpl({
1883
1501
  className: cn("hidden lg:flex", dimmedClass)
1884
1502
  }
1885
1503
  ),
1886
- showTimeTracker && /* @__PURE__ */ jsx19(TimeTrackerHeaderButton, { disabled, className: cn(cellDivider, dimmedClass) }),
1887
- showNotifications && /* @__PURE__ */ jsx19(
1504
+ showTimeTracker && /* @__PURE__ */ jsx17(TimeTrackerHeaderButton, { disabled, className: cn(cellDivider, dimmedClass) }),
1505
+ showNotifications && /* @__PURE__ */ jsx17(
1888
1506
  NotificationsHeaderButton,
1889
1507
  {
1890
1508
  fallbackUnreadCount: unreadCount,
@@ -1892,7 +1510,7 @@ var AppHeader = React2.memo(function AppHeaderImpl({
1892
1510
  dimmedClass: cn(cellDivider, dimmedClass)
1893
1511
  }
1894
1512
  ),
1895
- showTicketAlerts && /* @__PURE__ */ jsx19(
1513
+ showTicketAlerts && /* @__PURE__ */ jsx17(
1896
1514
  TicketAlertsButton,
1897
1515
  {
1898
1516
  href: ticketAlertsHref ?? "/tickets",
@@ -1901,11 +1519,11 @@ var AppHeader = React2.memo(function AppHeaderImpl({
1901
1519
  className: cn(cellDivider, dimmedClass)
1902
1520
  }
1903
1521
  ),
1904
- isMdUp && showUser && /* @__PURE__ */ jsxs17(DropdownMenu, { children: [
1905
- /* @__PURE__ */ jsx19(DropdownMenuTrigger, { asChild: true, disabled, children: /* @__PURE__ */ jsx19(
1522
+ isMdUp && showUser && /* @__PURE__ */ jsxs15(DropdownMenu, { children: [
1523
+ /* @__PURE__ */ jsx17(DropdownMenuTrigger, { asChild: true, disabled, children: /* @__PURE__ */ jsx17(
1906
1524
  HeaderButton,
1907
1525
  {
1908
- icon: /* @__PURE__ */ jsx19(
1526
+ icon: /* @__PURE__ */ jsx17(
1909
1527
  SquareAvatar,
1910
1528
  {
1911
1529
  src: userAvatarUrl || void 0,
@@ -1924,14 +1542,14 @@ var AppHeader = React2.memo(function AppHeaderImpl({
1924
1542
  )
1925
1543
  }
1926
1544
  ) }),
1927
- /* @__PURE__ */ jsxs17(
1545
+ /* @__PURE__ */ jsxs15(
1928
1546
  DropdownMenuContent,
1929
1547
  {
1930
1548
  align: "end",
1931
1549
  className: "z-[104] w-[280px] overflow-hidden rounded-[6px] border-ods-border bg-ods-bg p-0",
1932
1550
  children: [
1933
- /* @__PURE__ */ jsxs17("div", { className: "flex items-center gap-2 border-b border-ods-border bg-ods-card p-3", children: [
1934
- /* @__PURE__ */ jsx19(
1551
+ /* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-2 border-b border-ods-border bg-ods-card p-3", children: [
1552
+ /* @__PURE__ */ jsx17(
1935
1553
  SquareAvatar,
1936
1554
  {
1937
1555
  src: userAvatarUrl || void 0,
@@ -1941,30 +1559,30 @@ var AppHeader = React2.memo(function AppHeaderImpl({
1941
1559
  className: "shrink-0"
1942
1560
  }
1943
1561
  ),
1944
- /* @__PURE__ */ jsxs17("div", { className: "min-w-0 flex-1", children: [
1945
- userName && /* @__PURE__ */ jsx19("div", { className: "truncate text-ods-text-primary text-h4", children: userName }),
1946
- userEmail && /* @__PURE__ */ jsx19("div", { className: "truncate text-ods-text-secondary text-h6", children: userEmail })
1562
+ /* @__PURE__ */ jsxs15("div", { className: "min-w-0 flex-1", children: [
1563
+ userName && /* @__PURE__ */ jsx17("div", { className: "truncate text-ods-text-primary text-h4", children: userName }),
1564
+ userEmail && /* @__PURE__ */ jsx17("div", { className: "truncate text-ods-text-secondary text-h6", children: userEmail })
1947
1565
  ] })
1948
1566
  ] }),
1949
- /* @__PURE__ */ jsx19(
1567
+ /* @__PURE__ */ jsx17(
1950
1568
  DropdownMenuItem,
1951
1569
  {
1952
1570
  onClick: onProfile,
1953
1571
  className: "cursor-pointer rounded-none border-b border-ods-border bg-ods-card px-3 py-3 hover:bg-ods-card/80 focus:bg-ods-card/80",
1954
- children: /* @__PURE__ */ jsxs17("div", { className: "flex items-center gap-2", children: [
1955
- /* @__PURE__ */ jsx19(UserIcon, { className: "h-6 w-6 shrink-0 text-ods-text-primary" }),
1956
- /* @__PURE__ */ jsx19("span", { className: "text-ods-text-primary text-h4", children: "Profile Settings" })
1572
+ children: /* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-2", children: [
1573
+ /* @__PURE__ */ jsx17(UserIcon, { className: "h-6 w-6 shrink-0 text-ods-text-primary" }),
1574
+ /* @__PURE__ */ jsx17("span", { className: "text-ods-text-primary text-h4", children: "Profile Settings" })
1957
1575
  ] })
1958
1576
  }
1959
1577
  ),
1960
- /* @__PURE__ */ jsx19(
1578
+ /* @__PURE__ */ jsx17(
1961
1579
  DropdownMenuItem,
1962
1580
  {
1963
1581
  onClick: onLogout,
1964
1582
  className: "cursor-pointer rounded-none bg-ods-card px-3 py-3 hover:bg-ods-card/80 focus:bg-ods-card/80",
1965
- children: /* @__PURE__ */ jsxs17("div", { className: "flex items-center gap-2", children: [
1966
- /* @__PURE__ */ jsx19(LogOutIcon, { className: "shrink-0 text-ods-error", size: 24 }),
1967
- /* @__PURE__ */ jsx19("span", { className: "text-ods-text-primary text-h4", children: "Log Out" })
1583
+ children: /* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-2", children: [
1584
+ /* @__PURE__ */ jsx17(LogOutIcon, { className: "shrink-0 text-ods-error", size: 24 }),
1585
+ /* @__PURE__ */ jsx17("span", { className: "text-ods-text-primary text-h4", children: "Log Out" })
1968
1586
  ] })
1969
1587
  }
1970
1588
  )
@@ -1972,7 +1590,7 @@ var AppHeader = React2.memo(function AppHeaderImpl({
1972
1590
  }
1973
1591
  )
1974
1592
  ] }),
1975
- showMingoAI && /* @__PURE__ */ jsx19(
1593
+ showMingoAI && /* @__PURE__ */ jsx17(
1976
1594
  HeaderMingoButton,
1977
1595
  {
1978
1596
  onClick: onMingoAI,
@@ -1992,10 +1610,10 @@ function NotificationsHeaderButton({ fallbackUnreadCount, disabled, dimmedClass
1992
1610
  const hasUnread = (ctx?.unreadCount ?? fallbackUnreadCount) > 0;
1993
1611
  const isActive = ctx?.isOpen ?? false;
1994
1612
  const onClick = ctx?.toggle;
1995
- return /* @__PURE__ */ jsx19(
1613
+ return /* @__PURE__ */ jsx17(
1996
1614
  HeaderButton,
1997
1615
  {
1998
- icon: isActive ? /* @__PURE__ */ jsx19(XmarkIcon, { className: "h-6 w-6" }) : /* @__PURE__ */ jsx19(BellIcon, { className: "h-6 w-6" }),
1616
+ icon: isActive ? /* @__PURE__ */ jsx17(XmarkIcon, { className: "h-6 w-6" }) : /* @__PURE__ */ jsx17(BellIcon, { className: "h-6 w-6" }),
1999
1617
  showUnreadDot: !isActive && hasUnread,
2000
1618
  "aria-label": isActive ? "Close notifications" : "Notifications",
2001
1619
  onClick,
@@ -2011,12 +1629,12 @@ var CELL_VISIBILITY = {
2011
1629
  "icon-lg": "hidden lg:flex"
2012
1630
  };
2013
1631
  function HeaderCellSkeleton({ className }) {
2014
- return /* @__PURE__ */ jsx19("div", { className: cn("flex h-full w-14 shrink-0 items-center justify-center border-l border-ods-border", className), children: /* @__PURE__ */ jsx19("div", { className: "h-6 w-6 animate-pulse rounded bg-ods-border" }) });
1632
+ return /* @__PURE__ */ jsx17("div", { className: cn("flex h-full w-14 shrink-0 items-center justify-center border-l border-ods-border", className), children: /* @__PURE__ */ jsx17("div", { className: "h-6 w-6 animate-pulse rounded bg-ods-border" }) });
2015
1633
  }
2016
1634
  function HeaderWideCellSkeleton() {
2017
- return /* @__PURE__ */ jsxs17("div", { className: "flex h-full w-14 shrink-0 items-center justify-center gap-2 border-l border-ods-border md:w-[140px] md:px-4", children: [
2018
- /* @__PURE__ */ jsx19("div", { className: "h-6 w-6 shrink-0 animate-pulse rounded bg-ods-border" }),
2019
- /* @__PURE__ */ jsx19("div", { className: "hidden h-5 animate-pulse rounded bg-ods-border md:block md:w-[72px]" })
1635
+ return /* @__PURE__ */ jsxs15("div", { className: "flex h-full w-14 shrink-0 items-center justify-center gap-2 border-l border-ods-border md:w-[140px] md:px-4", children: [
1636
+ /* @__PURE__ */ jsx17("div", { className: "h-6 w-6 shrink-0 animate-pulse rounded bg-ods-border" }),
1637
+ /* @__PURE__ */ jsx17("div", { className: "hidden h-5 animate-pulse rounded bg-ods-border md:block md:w-[72px]" })
2020
1638
  ] });
2021
1639
  }
2022
1640
  function AppHeaderSkeleton({
@@ -2025,7 +1643,7 @@ function AppHeaderSkeleton({
2025
1643
  className
2026
1644
  }) {
2027
1645
  const cells = typeof actionCells === "number" ? Array.from({ length: Math.max(0, actionCells) }, () => "icon") : actionCells;
2028
- return /* @__PURE__ */ jsx19(
1646
+ return /* @__PURE__ */ jsx17(
2029
1647
  TopNavigation,
2030
1648
  {
2031
1649
  className: cn("sticky top-0 z-40", className),
@@ -2033,18 +1651,18 @@ function AppHeaderSkeleton({
2033
1651
  "aria-busy": "true",
2034
1652
  leading: (
2035
1653
  // Burger cell: mobile only, in CSS.
2036
- /* @__PURE__ */ jsx19("div", { className: "flex h-full w-14 shrink-0 items-center justify-center border-r border-ods-border md:hidden", children: /* @__PURE__ */ jsx19("div", { className: "h-6 w-6 animate-pulse rounded bg-ods-border" }) })
1654
+ /* @__PURE__ */ jsx17("div", { className: "flex h-full w-14 shrink-0 items-center justify-center border-r border-ods-border md:hidden", children: /* @__PURE__ */ jsx17("div", { className: "h-6 w-6 animate-pulse rounded bg-ods-border" }) })
2037
1655
  ),
2038
- logo: /* @__PURE__ */ jsxs17(Fragment10, { children: [
2039
- /* @__PURE__ */ jsx19("div", { className: "h-6 w-6 shrink-0 animate-pulse rounded bg-ods-border" }),
2040
- /* @__PURE__ */ jsx19("div", { className: "h-4 w-24 animate-pulse rounded bg-ods-border" })
1656
+ logo: /* @__PURE__ */ jsxs15(Fragment7, { children: [
1657
+ /* @__PURE__ */ jsx17("div", { className: "h-6 w-6 shrink-0 animate-pulse rounded bg-ods-border" }),
1658
+ /* @__PURE__ */ jsx17("div", { className: "h-4 w-24 animate-pulse rounded bg-ods-border" })
2041
1659
  ] }),
2042
1660
  logoClassName: "gap-2 md:hidden",
2043
- center: showSearch ? /* @__PURE__ */ jsx19("div", { className: "h-10 w-full animate-pulse rounded-md bg-ods-border" }) : void 0,
2044
- sideActions: /* @__PURE__ */ jsxs17(Fragment10, { children: [
2045
- showSearch && /* @__PURE__ */ jsx19(HeaderCellSkeleton, { className: "md:hidden" }),
1661
+ center: showSearch ? /* @__PURE__ */ jsx17("div", { className: "h-10 w-full animate-pulse rounded-md bg-ods-border" }) : void 0,
1662
+ sideActions: /* @__PURE__ */ jsxs15(Fragment7, { children: [
1663
+ showSearch && /* @__PURE__ */ jsx17(HeaderCellSkeleton, { className: "md:hidden" }),
2046
1664
  cells.map(
2047
- (cell, i) => cell === "wide" ? /* @__PURE__ */ jsx19(HeaderWideCellSkeleton, {}, i) : /* @__PURE__ */ jsx19(HeaderCellSkeleton, { className: CELL_VISIBILITY[cell] }, i)
1665
+ (cell, i) => cell === "wide" ? /* @__PURE__ */ jsx17(HeaderWideCellSkeleton, {}, i) : /* @__PURE__ */ jsx17(HeaderCellSkeleton, { className: CELL_VISIBILITY[cell] }, i)
2048
1666
  )
2049
1667
  ] })
2050
1668
  }
@@ -2052,17 +1670,17 @@ function AppHeaderSkeleton({
2052
1670
  }
2053
1671
 
2054
1672
  // src/components/navigation/app-layout.tsx
2055
- import { useCallback as useCallback3, useEffect as useEffect5, useMemo as useMemo2, useRef as useRef6, useState as useState7 } from "react";
1673
+ import { useCallback as useCallback3, useEffect as useEffect4, useMemo as useMemo2, useRef as useRef6, useState as useState5 } from "react";
2056
1674
 
2057
1675
  // src/components/navigation/app-layout-side-panel.tsx
2058
1676
  import {
2059
- useEffect as useEffect4,
1677
+ useEffect as useEffect3,
2060
1678
  useId,
2061
1679
  useRef as useRef4,
2062
- useState as useState6,
1680
+ useState as useState4,
2063
1681
  useSyncExternalStore
2064
1682
  } from "react";
2065
- import { jsx as jsx20, jsxs as jsxs18 } from "react/jsx-runtime";
1683
+ import { jsx as jsx18, jsxs as jsxs16 } from "react/jsx-runtime";
2066
1684
  var SIDE_PANEL_INSET = 16;
2067
1685
  var SIDE_PANEL_FRAME_WIDTH = 2;
2068
1686
  var MOBILE_QUERY = `not all and ${breakpoints.md}`;
@@ -2123,7 +1741,7 @@ function useStoredSize(storageKey, fallback) {
2123
1741
  },
2124
1742
  () => null
2125
1743
  );
2126
- const [sessionSize, setSessionSize] = useState6(null);
1744
+ const [sessionSize, setSessionSize] = useState4(null);
2127
1745
  const size = (storageKey ? parseSize(raw) : sessionSize) ?? fallback;
2128
1746
  const setSize = (next) => {
2129
1747
  if (!storageKey) {
@@ -2146,7 +1764,7 @@ function useAppLayoutSidePanel(config, row) {
2146
1764
  const collapsed = config?.collapsed ?? false;
2147
1765
  const minimum = { width: minWidth, expanded: false };
2148
1766
  const defaultWidth = Math.max(minWidth, config?.defaultWidth ?? minWidth);
2149
- const [rowWidth, setRowWidth] = useState6(0);
1767
+ const [rowWidth, setRowWidth] = useState4(0);
2150
1768
  useIsomorphicLayoutEffect(() => {
2151
1769
  if (!enabled || !row) return void 0;
2152
1770
  const update = () => setRowWidth(row.clientWidth);
@@ -2157,18 +1775,18 @@ function useAppLayoutSidePanel(config, row) {
2157
1775
  }, [enabled, row]);
2158
1776
  const isMobile = useMediaQuery(MOBILE_QUERY) === true;
2159
1777
  const reduceMotion = useMediaQuery(REDUCED_MOTION_QUERY) === true;
2160
- const [morph, setMorph] = useState6(null);
2161
- const [liveWidth, setLiveWidth] = useState6(null);
1778
+ const [morph, setMorph] = useState4(null);
1779
+ const [liveWidth, setLiveWidth] = useState4(null);
2162
1780
  const [storedSize, setStoredSize] = useStoredSize(config?.storageKey, { width: defaultWidth, expanded: false });
2163
- const [ownIsOpen, setOwnIsOpen] = useState6(false);
1781
+ const [ownIsOpen, setOwnIsOpen] = useState4(false);
2164
1782
  const isOpen = config?.open ?? ownIsOpen;
2165
1783
  const onOpenChange = config?.onOpenChange;
2166
1784
  const setIsOpen = (next) => {
2167
1785
  if (config?.open === void 0) setOwnIsOpen(next);
2168
1786
  onOpenChange?.(next);
2169
1787
  };
2170
- const [collapsedSize, setCollapsedSize] = useState6(null);
2171
- const [prevCollapsed, setPrevCollapsed] = useState6(collapsed);
1788
+ const [collapsedSize, setCollapsedSize] = useState4(null);
1789
+ const [prevCollapsed, setPrevCollapsed] = useState4(collapsed);
2172
1790
  if (collapsed !== prevCollapsed) {
2173
1791
  setPrevCollapsed(collapsed);
2174
1792
  setCollapsedSize(null);
@@ -2176,13 +1794,13 @@ function useAppLayoutSidePanel(config, row) {
2176
1794
  const size = collapsed ? collapsedSize ?? minimum : storedSize;
2177
1795
  const setSize = collapsed ? setCollapsedSize : setStoredSize;
2178
1796
  const layout = resolveSidePanelLayout({ rowWidth, isMobile, isOpen, size, minWidth, minContentWidth });
2179
- const [prevCanDock, setPrevCanDock] = useState6(layout.canDock);
1797
+ const [prevCanDock, setPrevCanDock] = useState4(layout.canDock);
2180
1798
  if (layout.canDock !== prevCanDock) {
2181
1799
  setPrevCanDock(layout.canDock);
2182
1800
  setOwnIsOpen(false);
2183
1801
  }
2184
1802
  const prevCanDockRef = useRef4(layout.canDock);
2185
- useEffect4(() => {
1803
+ useEffect3(() => {
2186
1804
  const couldDock = prevCanDockRef.current;
2187
1805
  prevCanDockRef.current = layout.canDock;
2188
1806
  if (!couldDock && layout.canDock && config?.open) onOpenChange?.(false);
@@ -2265,7 +1883,7 @@ function SidePanelResizeHandle({ state, label, controls }) {
2265
1883
  const pendingRef = useRef4(null);
2266
1884
  const measured = Number.isFinite(maxDockedWidth);
2267
1885
  const current = peekWidth ?? (mode === "full" && measured ? maxDockedWidth + 1 : width);
2268
- useEffect4(
1886
+ useEffect3(
2269
1887
  () => () => {
2270
1888
  if (frameRef.current !== null) cancelAnimationFrame(frameRef.current);
2271
1889
  },
@@ -2322,7 +1940,7 @@ function SidePanelResizeHandle({ state, label, controls }) {
2322
1940
  event.preventDefault();
2323
1941
  resize(next);
2324
1942
  };
2325
- return /* @__PURE__ */ jsx20(
1943
+ return /* @__PURE__ */ jsx18(
2326
1944
  "div",
2327
1945
  {
2328
1946
  role: "separator",
@@ -2340,12 +1958,12 @@ function SidePanelResizeHandle({ state, label, controls }) {
2340
1958
  onPointerCancel: endDrag,
2341
1959
  onKeyDown: handleKeyDown,
2342
1960
  className: "group absolute inset-y-0 left-0 z-10 flex w-4 -translate-x-1/2 cursor-col-resize touch-none select-none items-center justify-center outline-none",
2343
- children: /* @__PURE__ */ jsx20(
1961
+ children: /* @__PURE__ */ jsx18(
2344
1962
  "span",
2345
1963
  {
2346
1964
  "aria-hidden": true,
2347
1965
  className: "flex h-8 w-4 items-center justify-center rounded-sm border border-ods-border bg-ods-card text-ods-text-secondary transition-colors group-hover:border-ods-border-hover group-focus-visible:border-ods-accent group-focus-visible:text-ods-accent",
2348
- children: /* @__PURE__ */ jsx20(Menu01Icon, { size: 12 })
1966
+ children: /* @__PURE__ */ jsx18(Menu01Icon, { size: 12 })
2349
1967
  }
2350
1968
  )
2351
1969
  }
@@ -2354,7 +1972,7 @@ function SidePanelResizeHandle({ state, label, controls }) {
2354
1972
  function AppLayoutSidePanel({ config, state }) {
2355
1973
  const panelId = useId();
2356
1974
  const { mode, width, dockedWidth, canDock, isOpen, close, morph, endMorph, peekWidth } = state;
2357
- useEffect4(() => {
1975
+ useEffect3(() => {
2358
1976
  if (!morph) return void 0;
2359
1977
  const timer = window.setTimeout(endMorph, MORPH_MS * 3);
2360
1978
  return () => window.clearTimeout(timer);
@@ -2367,7 +1985,7 @@ function AppLayoutSidePanel({ config, state }) {
2367
1985
  event.preventDefault();
2368
1986
  close();
2369
1987
  };
2370
- return /* @__PURE__ */ jsx20(
1988
+ return /* @__PURE__ */ jsx18(
2371
1989
  "aside",
2372
1990
  {
2373
1991
  id: panelId,
@@ -2385,7 +2003,7 @@ function AppLayoutSidePanel({ config, state }) {
2385
2003
  mode === "overlay" && "absolute inset-0 z-[99] bg-ods-bg"
2386
2004
  ),
2387
2005
  style: mode !== "overlay" && inColumn ? { width: dockedWidth + SIDE_PANEL_INSET } : void 0,
2388
- children: /* @__PURE__ */ jsxs18(
2006
+ children: /* @__PURE__ */ jsxs16(
2389
2007
  "div",
2390
2008
  {
2391
2009
  onTransitionEnd: (event) => {
@@ -2401,8 +2019,8 @@ function AppLayoutSidePanel({ config, state }) {
2401
2019
  ),
2402
2020
  style: mode === "overlay" ? void 0 : { width: peekWidth ?? width },
2403
2021
  children: [
2404
- canDock && /* @__PURE__ */ jsx20(SidePanelResizeHandle, { state, label: `Resize ${label}`, controls: panelId }),
2405
- /* @__PURE__ */ jsx20(
2022
+ canDock && /* @__PURE__ */ jsx18(SidePanelResizeHandle, { state, label: `Resize ${label}`, controls: panelId }),
2023
+ /* @__PURE__ */ jsx18(
2406
2024
  "div",
2407
2025
  {
2408
2026
  className: cn(
@@ -2430,10 +2048,10 @@ function AppLayoutSidePanel({ config, state }) {
2430
2048
 
2431
2049
  // src/components/navigation/mobile-burger-menu.tsx
2432
2050
  import { usePreventScroll as usePreventScroll3 } from "@react-aria/overlays";
2433
- import React3, { useCallback as useCallback2, useRef as useRef5 } from "react";
2434
- import { Fragment as Fragment11, jsx as jsx21, jsxs as jsxs19 } from "react/jsx-runtime";
2051
+ import React4, { useCallback as useCallback2, useRef as useRef5 } from "react";
2052
+ import { Fragment as Fragment8, jsx as jsx19, jsxs as jsxs17 } from "react/jsx-runtime";
2435
2053
  var HEADER_HEIGHT = 56;
2436
- var MobileBurgerMenu = React3.memo(function MobileBurgerMenuImpl({
2054
+ var MobileBurgerMenu = React4.memo(function MobileBurgerMenuImpl({
2437
2055
  isOpen,
2438
2056
  onClose,
2439
2057
  config,
@@ -2461,7 +2079,7 @@ var MobileBurgerMenu = React3.memo(function MobileBurgerMenuImpl({
2461
2079
  const secondaryItems = config.items.filter((item) => item.section === "secondary");
2462
2080
  const renderNavigationItem = (item, isGridItem = false) => {
2463
2081
  const isActive = item.isActive ?? false;
2464
- return /* @__PURE__ */ jsxs19(
2082
+ return /* @__PURE__ */ jsxs17(
2465
2083
  "button",
2466
2084
  {
2467
2085
  onClick: () => handleItemClick(item),
@@ -2481,12 +2099,12 @@ var MobileBurgerMenu = React3.memo(function MobileBurgerMenuImpl({
2481
2099
  "aria-current": isActive ? "page" : void 0,
2482
2100
  "aria-label": item.badge ? `${item.label} (${item.badge})` : void 0,
2483
2101
  children: [
2484
- item.icon && /* @__PURE__ */ jsx21("div", { className: "flex size-4 flex-shrink-0 items-center justify-center", children: React3.cloneElement(item.icon, {
2102
+ item.icon && /* @__PURE__ */ jsx19("div", { className: "flex size-4 flex-shrink-0 items-center justify-center", children: React4.cloneElement(item.icon, {
2485
2103
  size: 16,
2486
2104
  color: isActive && !disabled ? "var(--color-accent-primary)" : "var(--color-text-secondary)"
2487
2105
  }) }),
2488
- /* @__PURE__ */ jsxs19("span", { className: "flex min-w-0 flex-1 items-center gap-[var(--spacing-system-xxs)]", children: [
2489
- /* @__PURE__ */ jsx21(
2106
+ /* @__PURE__ */ jsxs17("span", { className: "flex min-w-0 flex-1 items-center gap-[var(--spacing-system-xxs)]", children: [
2107
+ /* @__PURE__ */ jsx19(
2490
2108
  "span",
2491
2109
  {
2492
2110
  className: cn(
@@ -2496,16 +2114,16 @@ var MobileBurgerMenu = React3.memo(function MobileBurgerMenuImpl({
2496
2114
  children: item.label
2497
2115
  }
2498
2116
  ),
2499
- item.badge && /* @__PURE__ */ jsx21(NavigationItemBadge, { compact: true, label: item.badge })
2117
+ item.badge && /* @__PURE__ */ jsx19(NavigationItemBadge, { compact: true, label: item.badge })
2500
2118
  ] })
2501
2119
  ]
2502
2120
  },
2503
2121
  item.id
2504
2122
  );
2505
2123
  };
2506
- const renderNavigationGrid = (items) => /* @__PURE__ */ jsx21("div", { className: "grid grid-cols-2 gap-3", children: items.map((item) => /* @__PURE__ */ jsx21(React3.Fragment, { children: renderNavigationItem(item, true) }, item.id)) });
2507
- return /* @__PURE__ */ jsxs19(Fragment11, { children: [
2508
- /* @__PURE__ */ jsx21(
2124
+ const renderNavigationGrid = (items) => /* @__PURE__ */ jsx19("div", { className: "grid grid-cols-2 gap-3", children: items.map((item) => /* @__PURE__ */ jsx19(React4.Fragment, { children: renderNavigationItem(item, true) }, item.id)) });
2125
+ return /* @__PURE__ */ jsxs17(Fragment8, { children: [
2126
+ /* @__PURE__ */ jsx19(
2509
2127
  "div",
2510
2128
  {
2511
2129
  className: cn(
@@ -2519,7 +2137,7 @@ var MobileBurgerMenu = React3.memo(function MobileBurgerMenuImpl({
2519
2137
  "aria-hidden": "true"
2520
2138
  }
2521
2139
  ),
2522
- /* @__PURE__ */ jsx21(
2140
+ /* @__PURE__ */ jsx19(
2523
2141
  "div",
2524
2142
  {
2525
2143
  ref: panelRef,
@@ -2540,8 +2158,8 @@ var MobileBurgerMenu = React3.memo(function MobileBurgerMenuImpl({
2540
2158
  "aria-label": "Mobile navigation menu",
2541
2159
  tabIndex: -1,
2542
2160
  inert: !isOpen || void 0,
2543
- children: /* @__PURE__ */ jsxs19("div", { className: "flex flex-1 flex-col gap-4 overflow-y-auto overflow-x-hidden overscroll-contain p-4", children: [
2544
- user && /* @__PURE__ */ jsxs19(
2161
+ children: /* @__PURE__ */ jsxs17("div", { className: "flex flex-1 flex-col gap-4 overflow-y-auto overflow-x-hidden overscroll-contain p-4", children: [
2162
+ user && /* @__PURE__ */ jsxs17(
2545
2163
  "div",
2546
2164
  {
2547
2165
  className: cn(
@@ -2550,7 +2168,7 @@ var MobileBurgerMenu = React3.memo(function MobileBurgerMenuImpl({
2550
2168
  ),
2551
2169
  "aria-disabled": disabled || void 0,
2552
2170
  children: [
2553
- /* @__PURE__ */ jsx21(
2171
+ /* @__PURE__ */ jsx19(
2554
2172
  SquareAvatar,
2555
2173
  {
2556
2174
  src: user.userAvatarUrl || void 0,
@@ -2561,24 +2179,24 @@ var MobileBurgerMenu = React3.memo(function MobileBurgerMenuImpl({
2561
2179
  className: "h-14 w-14 shrink-0"
2562
2180
  }
2563
2181
  ),
2564
- /* @__PURE__ */ jsxs19("div", { className: "flex min-w-0 flex-1 flex-col", children: [
2565
- /* @__PURE__ */ jsxs19("div", { className: "flex items-center gap-2", children: [
2566
- /* @__PURE__ */ jsx21("span", { className: "truncate text-ods-text-primary text-h6", children: user.userName || "User" }),
2567
- user.userRole && /* @__PURE__ */ jsx21("span", { className: "shrink-0 rounded-md border border-ods-border bg-ods-card px-2 py-0.5 uppercase text-ods-text-primary text-h6", children: user.userRole })
2182
+ /* @__PURE__ */ jsxs17("div", { className: "flex min-w-0 flex-1 flex-col", children: [
2183
+ /* @__PURE__ */ jsxs17("div", { className: "flex items-center gap-2", children: [
2184
+ /* @__PURE__ */ jsx19("span", { className: "truncate text-ods-text-primary text-h6", children: user.userName || "User" }),
2185
+ user.userRole && /* @__PURE__ */ jsx19("span", { className: "shrink-0 rounded-md border border-ods-border bg-ods-card px-2 py-0.5 uppercase text-ods-text-primary text-h6", children: user.userRole })
2568
2186
  ] }),
2569
- user.userEmail && /* @__PURE__ */ jsx21("span", { className: "truncate text-ods-text-secondary text-h6", children: user.userEmail })
2187
+ user.userEmail && /* @__PURE__ */ jsx19("span", { className: "truncate text-ods-text-secondary text-h6", children: user.userEmail })
2570
2188
  ] }),
2571
- /* @__PURE__ */ jsxs19("div", { className: "flex shrink-0 items-center gap-2", children: [
2572
- onSearchUser && /* @__PURE__ */ jsx21(Button, { size: "icon", onClick: onSearchUser, variant: "outline", "aria-label": "Search users", children: /* @__PURE__ */ jsx21(UserSearchIcon, { className: "size-4 text-ods-text-primary" }) }),
2573
- onEditProfile && /* @__PURE__ */ jsx21(Button, { size: "icon", onClick: onEditProfile, variant: "outline", "aria-label": "Edit profile", children: /* @__PURE__ */ jsx21(PenEditIcon, { className: "size-4 text-ods-text-primary" }) })
2189
+ /* @__PURE__ */ jsxs17("div", { className: "flex shrink-0 items-center gap-2", children: [
2190
+ onSearchUser && /* @__PURE__ */ jsx19(Button, { size: "icon", onClick: onSearchUser, variant: "outline", "aria-label": "Search users", children: /* @__PURE__ */ jsx19(UserSearchIcon, { className: "size-4 text-ods-text-primary" }) }),
2191
+ onEditProfile && /* @__PURE__ */ jsx19(Button, { size: "icon", onClick: onEditProfile, variant: "outline", "aria-label": "Edit profile", children: /* @__PURE__ */ jsx19(PenEditIcon, { className: "size-4 text-ods-text-primary" }) })
2574
2192
  ] })
2575
2193
  ]
2576
2194
  }
2577
2195
  ),
2578
2196
  config.topSlot?.({ minimized: false }),
2579
- /* @__PURE__ */ jsx21("nav", { "aria-label": "Primary navigation", children: renderNavigationGrid(primaryItems) }),
2580
- secondaryItems.length > 0 && /* @__PURE__ */ jsx21("nav", { "aria-label": "Secondary navigation", className: "flex flex-col gap-3", children: secondaryItems.map((item) => /* @__PURE__ */ jsx21(React3.Fragment, { children: renderNavigationItem(item, false) }, item.id)) }),
2581
- onLogout && /* @__PURE__ */ jsxs19(
2197
+ /* @__PURE__ */ jsx19("nav", { "aria-label": "Primary navigation", children: renderNavigationGrid(primaryItems) }),
2198
+ secondaryItems.length > 0 && /* @__PURE__ */ jsx19("nav", { "aria-label": "Secondary navigation", className: "flex flex-col gap-3", children: secondaryItems.map((item) => /* @__PURE__ */ jsx19(React4.Fragment, { children: renderNavigationItem(item, false) }, item.id)) }),
2199
+ onLogout && /* @__PURE__ */ jsxs17(
2582
2200
  "button",
2583
2201
  {
2584
2202
  onClick: onLogout,
@@ -2589,8 +2207,8 @@ var MobileBurgerMenu = React3.memo(function MobileBurgerMenuImpl({
2589
2207
  disabled && "cursor-not-allowed opacity-50"
2590
2208
  ),
2591
2209
  children: [
2592
- /* @__PURE__ */ jsx21(Logout02Icon, { className: "size-4 text-ods-error" }),
2593
- /* @__PURE__ */ jsx21("span", { className: "flex-1 text-left text-ods-text-primary text-h6", children: "Log Out" })
2210
+ /* @__PURE__ */ jsx19(Logout02Icon, { className: "size-4 text-ods-error" }),
2211
+ /* @__PURE__ */ jsx19("span", { className: "flex-1 text-left text-ods-text-primary text-h6", children: "Log Out" })
2594
2212
  ]
2595
2213
  }
2596
2214
  )
@@ -2601,7 +2219,7 @@ var MobileBurgerMenu = React3.memo(function MobileBurgerMenuImpl({
2601
2219
  });
2602
2220
 
2603
2221
  // src/components/navigation/app-layout.tsx
2604
- import { jsx as jsx22, jsxs as jsxs20 } from "react/jsx-runtime";
2222
+ import { jsx as jsx20, jsxs as jsxs18 } from "react/jsx-runtime";
2605
2223
  function AppLayout({
2606
2224
  children,
2607
2225
  sidebarConfig,
@@ -2614,10 +2232,10 @@ function AppLayout({
2614
2232
  topBar,
2615
2233
  sidePanel
2616
2234
  }) {
2617
- const [mobileMenuOpen, setMobileMenuOpen] = useState7(false);
2618
- const [drawerContainer, setDrawerContainer] = useState7(null);
2619
- const [mainElement, setMainElement] = useState7(null);
2620
- const [contentWidth, setContentWidth] = useState7(null);
2235
+ const [mobileMenuOpen, setMobileMenuOpen] = useState5(false);
2236
+ const [drawerContainer, setDrawerContainer] = useState5(null);
2237
+ const [mainElement, setMainElement] = useState5(null);
2238
+ const [contentWidth, setContentWidth] = useState5(null);
2621
2239
  const hasSidePanel = sidePanel !== void 0;
2622
2240
  const sidePanelState = useAppLayoutSidePanel(sidePanel, drawerContainer);
2623
2241
  useIsomorphicLayoutEffect(() => {
@@ -2637,7 +2255,7 @@ function AppLayout({
2637
2255
  };
2638
2256
  const contentCovered = sidePanelState?.coversContent === true;
2639
2257
  const mobileMenuOpenRef = useRef6(mobileMenuOpen);
2640
- useEffect5(() => {
2258
+ useEffect4(() => {
2641
2259
  mobileMenuOpenRef.current = mobileMenuOpen;
2642
2260
  });
2643
2261
  const drawerHandlesRef = useRef6(/* @__PURE__ */ new Set());
@@ -2666,11 +2284,11 @@ function AppLayout({
2666
2284
  }),
2667
2285
  []
2668
2286
  );
2669
- return /* @__PURE__ */ jsx22(AppLayoutDrawerContainerContext.Provider, { value: drawerContainer, children: /* @__PURE__ */ jsx22(AppLayoutDrawerCoordinationContext.Provider, { value: drawerCoordination, children: /* @__PURE__ */ jsxs20("div", { className: cn("flex h-screen flex-col bg-ods-bg", className), children: [
2287
+ return /* @__PURE__ */ jsx20(AppLayoutDrawerContainerContext.Provider, { value: drawerContainer, children: /* @__PURE__ */ jsx20(AppLayoutDrawerCoordinationContext.Provider, { value: drawerCoordination, children: /* @__PURE__ */ jsxs18("div", { className: cn("flex h-screen flex-col bg-ods-bg", className), children: [
2670
2288
  topBar,
2671
- /* @__PURE__ */ jsxs20("div", { className: "relative flex min-h-0 flex-1", children: [
2672
- /* @__PURE__ */ jsx22(NavigationSidebar, { config: sidebarConfig, disabled, pushOnTablet: hasSidePanel }),
2673
- /* @__PURE__ */ jsx22(
2289
+ /* @__PURE__ */ jsxs18("div", { className: "relative flex min-h-0 flex-1", children: [
2290
+ /* @__PURE__ */ jsx20(NavigationSidebar, { config: sidebarConfig, disabled, pushOnTablet: hasSidePanel }),
2291
+ /* @__PURE__ */ jsx20(
2674
2292
  MobileBurgerMenu,
2675
2293
  {
2676
2294
  ...mobileBurgerMenuProps,
@@ -2680,8 +2298,8 @@ function AppLayout({
2680
2298
  disabled
2681
2299
  }
2682
2300
  ),
2683
- /* @__PURE__ */ jsxs20("div", { className: "flex flex-1 flex-col overflow-hidden", children: [
2684
- /* @__PURE__ */ jsx22(
2301
+ /* @__PURE__ */ jsxs18("div", { className: "flex flex-1 flex-col overflow-hidden", children: [
2302
+ /* @__PURE__ */ jsx20(
2685
2303
  AppHeader,
2686
2304
  {
2687
2305
  ...resolvedHeaderProps,
@@ -2690,8 +2308,8 @@ function AppLayout({
2690
2308
  disabled
2691
2309
  }
2692
2310
  ),
2693
- /* @__PURE__ */ jsx22(NotificationDrawer, {}),
2694
- /* @__PURE__ */ jsxs20(
2311
+ /* @__PURE__ */ jsx20(NotificationDrawer, {}),
2312
+ /* @__PURE__ */ jsxs18(
2695
2313
  "div",
2696
2314
  {
2697
2315
  ref: setDrawerContainer,
@@ -2700,7 +2318,7 @@ function AppLayout({
2700
2318
  sidePanel ? (
2701
2319
  // `hidden` while the panel covers the area: the page stays
2702
2320
  // mounted, it just takes no room.
2703
- /* @__PURE__ */ jsx22(
2321
+ /* @__PURE__ */ jsx20(
2704
2322
  "main",
2705
2323
  {
2706
2324
  ref: setMainElement,
@@ -2712,11 +2330,11 @@ function AppLayout({
2712
2330
  sidePanelState?.overlapsContent && "isolate",
2713
2331
  mainClassName
2714
2332
  ),
2715
- children: /* @__PURE__ */ jsx22(ContentAreaWidthContext.Provider, { value: contentWidth, children: /* @__PURE__ */ jsx22("div", { className: "ods-content-scope", children }) })
2333
+ children: /* @__PURE__ */ jsx20(ContentAreaWidthContext.Provider, { value: contentWidth, children: /* @__PURE__ */ jsx20("div", { className: "ods-content-scope", children }) })
2716
2334
  }
2717
2335
  )
2718
- ) : /* @__PURE__ */ jsx22("main", { className: cn("flex-1 overflow-y-auto", mainClassName), children }),
2719
- sidePanel && sidePanelState && /* @__PURE__ */ jsx22(AppLayoutSidePanel, { config: sidePanel, state: sidePanelState }),
2336
+ ) : /* @__PURE__ */ jsx20("main", { className: cn("flex-1 overflow-y-auto", mainClassName), children }),
2337
+ sidePanel && sidePanelState && /* @__PURE__ */ jsx20(AppLayoutSidePanel, { config: sidePanel, state: sidePanelState }),
2720
2338
  drawer
2721
2339
  ]
2722
2340
  }
@@ -2727,20 +2345,14 @@ function AppLayout({
2727
2345
  }
2728
2346
 
2729
2347
  export {
2730
- ASK_AI_OPEN_EVENT,
2731
- openAskAi,
2732
2348
  MingoAiButton,
2733
- MOBILE_NAV_SHEET_ID,
2734
- defaultRenderSiteNavLink,
2735
- navLinkLabel,
2736
- NavItemRow,
2737
- isMegaMenu,
2738
- NavPanel,
2349
+ MOBILE_NAV_PANEL_ID,
2350
+ MobileNavPanel,
2351
+ TicketAlertsButton,
2739
2352
  TopNavigation,
2740
- SiteHeader,
2741
- siteNavHasMobileMenus,
2742
- MobileNavSheet,
2743
- SiteFooter,
2353
+ Header,
2354
+ HeaderSkeleton,
2355
+ ClientOnlyHeader,
2744
2356
  SlidingSidebar,
2745
2357
  NavigationItemBadge,
2746
2358
  NAVIGATION_SIDEBAR_WIDTH_VAR,
@@ -2748,7 +2360,6 @@ export {
2748
2360
  HeaderGlobalSearch,
2749
2361
  HeaderMingoButton,
2750
2362
  HeaderOrganizationFilter,
2751
- TicketAlertsButton,
2752
2363
  AppHeader,
2753
2364
  SIDE_PANEL_FRAME_WIDTH,
2754
2365
  MobileBurgerMenu,