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

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 (206) hide show
  1. package/dist/{chunk-4KX6OED2.cjs → chunk-2G7UYK35.cjs} +46 -46
  2. package/dist/{chunk-KOWVJD4V.cjs → chunk-2KXTOP6G.cjs} +70 -57
  3. package/dist/{chunk-A75QY6CD.cjs → chunk-2RNB5DTN.cjs} +21 -21
  4. package/dist/{chunk-PN2RKPDF.js → chunk-36BCTE7D.js} +10 -10
  5. package/dist/{chunk-ZSAGLQOD.cjs → chunk-3AHTOSXJ.cjs} +17 -17
  6. package/dist/{chunk-VR2ZLFCP.js → chunk-4IBPRIQH.js} +1 -1
  7. package/dist/{chunk-FCGC42TS.js → chunk-4L6XCMOU.js} +66 -62
  8. package/dist/{chunk-X5MQ7JRP.js → chunk-4UM2ETLM.js} +9 -9
  9. package/dist/{chunk-6NJKKO73.cjs → chunk-6I4ZAFO2.cjs} +15 -15
  10. package/dist/{chunk-RBDP4WDE.js → chunk-6IW7TWPV.js} +6 -6
  11. package/dist/{chunk-MMOODW57.cjs → chunk-6NTPY5QA.cjs} +1887 -94
  12. package/dist/{chunk-QFXRPRFT.js → chunk-6YKAT7NV.js} +3 -3
  13. package/dist/{chunk-HPWWNJE7.cjs → chunk-AOWDNSTM.cjs} +89 -89
  14. package/dist/{chunk-IHERL5V4.cjs → chunk-B73373AG.cjs} +34 -34
  15. package/dist/{chunk-DENB2XJC.js → chunk-CNWOMQQJ.js} +2 -2
  16. package/dist/{chunk-MP2C3LJ4.js → chunk-CUME3VTQ.js} +1 -1
  17. package/dist/{chunk-PDWVPI3S.js → chunk-CZ7Y7UG4.js} +4 -72
  18. package/dist/{chunk-YHM5AWTT.js → chunk-CZSZSDD4.js} +6 -6
  19. package/dist/{chunk-F6I6XZMN.js → chunk-DA5UDTLG.js} +5 -5
  20. package/dist/{chunk-MFFCUVWG.js → chunk-F57ECE2I.js} +1 -1
  21. package/dist/{chunk-CH5232HV.js → chunk-FI6GMDO7.js} +2455 -662
  22. package/dist/{chunk-NDESEPW5.js → chunk-FXJ3WWUB.js} +68 -0
  23. package/dist/{chunk-G5A3PSPV.js → chunk-HDOYSEOJ.js} +1080 -691
  24. package/dist/{chunk-VA5T32XA.js → chunk-I3ST4PLM.js} +2 -2
  25. package/dist/{chunk-5HBHO5TB.js → chunk-JPG7OHEG.js} +1 -1
  26. package/dist/{chunk-YFBM2K6X.cjs → chunk-JRU2CXLB.cjs} +4 -4
  27. package/dist/{chunk-MKXO4Q5P.js → chunk-KUC673HM.js} +383 -142
  28. package/dist/{chunk-JEZKGCZI.cjs → chunk-L6Y6OOKG.cjs} +26 -26
  29. package/dist/{chunk-F6AFPNDF.js → chunk-LFFB6EMB.js} +29 -16
  30. package/dist/{chunk-X72J4ACL.cjs → chunk-LLSUVPQC.cjs} +252 -8
  31. package/dist/{chunk-RKV5B7EU.cjs → chunk-LM7TXMLU.cjs} +72 -4
  32. package/dist/{chunk-6SEANMOU.js → chunk-LNW45N2C.js} +11 -11
  33. package/dist/{chunk-OUY3HHW6.cjs → chunk-LRQTJOF2.cjs} +928 -539
  34. package/dist/{chunk-DW7G4KG3.js → chunk-MR3A4MZV.js} +3 -3
  35. package/dist/{chunk-2YXVWZVF.js → chunk-N45D4ZXQ.js} +959 -715
  36. package/dist/{chunk-Z2VNQQ74.js → chunk-NCPTID44.js} +978 -942
  37. package/dist/{chunk-WA6GUYQ4.cjs → chunk-NSGXARGJ.cjs} +104 -104
  38. package/dist/{chunk-ABU3TGXA.cjs → chunk-OF6GEI5A.cjs} +3 -3
  39. package/dist/{chunk-IKTQ3ZAG.cjs → chunk-OJLR5MEO.cjs} +6 -6
  40. package/dist/{chunk-VESKITRQ.cjs → chunk-P42V6N34.cjs} +736 -732
  41. package/dist/{chunk-OHFS7VOU.cjs → chunk-PLYEKV3N.cjs} +2 -2
  42. package/dist/{chunk-7VVFKJY5.js → chunk-PO33GZVY.js} +1799 -3449
  43. package/dist/{chunk-7LS22BZU.cjs → chunk-QAOFMK2A.cjs} +14 -14
  44. package/dist/{chunk-VHCACDKP.cjs → chunk-RQRX4YC3.cjs} +39 -39
  45. package/dist/{chunk-3MX5S4CF.cjs → chunk-SEXWHIMS.cjs} +899 -2549
  46. package/dist/{chunk-AQWZNP6A.js → chunk-SS5MBHDP.js} +4 -4
  47. package/dist/{chunk-ZSAO2HBW.js → chunk-TDYIREDJ.js} +15 -15
  48. package/dist/{chunk-XOYH2YQE.cjs → chunk-UDFRUKLC.cjs} +2 -2
  49. package/dist/{chunk-TYWLNCNH.cjs → chunk-UVTD52MD.cjs} +14 -82
  50. package/dist/{chunk-N3COXDBH.cjs → chunk-VX4E6YSB.cjs} +41 -5
  51. package/dist/{chunk-2QEUFXNS.cjs → chunk-WCVZCGK5.cjs} +312 -71
  52. package/dist/{chunk-6XIF2Z7I.js → chunk-WMX26HB5.js} +3 -3
  53. package/dist/{chunk-D7BTSVMS.cjs → chunk-Y2GSOUCS.cjs} +2 -2
  54. package/dist/{chunk-4I45Y3DN.cjs → chunk-YBUT4AMG.cjs} +6 -6
  55. package/dist/components/case-studies/index.cjs +30 -32
  56. package/dist/components/case-studies/index.js +14 -16
  57. package/dist/components/chat/entity-cards/case-study-card.d.ts +11 -4
  58. package/dist/components/chat/entity-cards/case-study-card.d.ts.map +1 -1
  59. package/dist/components/chat/index.cjs +11 -11
  60. package/dist/components/chat/index.d.ts +1 -1
  61. package/dist/components/chat/index.d.ts.map +1 -1
  62. package/dist/components/chat/index.js +16 -16
  63. package/dist/components/chat/nav-link-anchor-via-runtime.d.ts +34 -5
  64. package/dist/components/chat/nav-link-anchor-via-runtime.d.ts.map +1 -1
  65. package/dist/components/chat/utils/icon-library.d.ts.map +1 -1
  66. package/dist/components/contact/index.cjs +12 -14
  67. package/dist/components/contact/index.js +11 -13
  68. package/dist/components/docs/index.cjs +15 -17
  69. package/dist/components/docs/index.js +14 -16
  70. package/dist/components/embeds/index.cjs +12 -14
  71. package/dist/components/embeds/index.js +11 -13
  72. package/dist/components/faq/index.cjs +13 -15
  73. package/dist/components/faq/index.js +12 -14
  74. package/dist/components/features/index.cjs +12 -14
  75. package/dist/components/features/index.js +21 -23
  76. package/dist/components/help-center-pages/index.cjs +118 -120
  77. package/dist/components/help-center-pages/index.js +33 -35
  78. package/dist/components/icons/index.cjs +3 -5
  79. package/dist/components/icons/index.js +9 -11
  80. package/dist/components/icons-v2-generated/index.cjs +3 -5
  81. package/dist/components/icons-v2-generated/index.js +2 -4
  82. package/dist/components/index.cjs +87 -158
  83. package/dist/components/index.d.ts +0 -2
  84. package/dist/components/index.d.ts.map +1 -1
  85. package/dist/components/index.js +331 -402
  86. package/dist/components/loading/page-layout-skeleton.d.ts +1 -1
  87. package/dist/components/meeting-scheduler/index.cjs +62 -64
  88. package/dist/components/meeting-scheduler/index.js +12 -14
  89. package/dist/components/navigation/index.cjs +28 -16
  90. package/dist/components/navigation/index.d.ts +14 -10
  91. package/dist/components/navigation/index.d.ts.map +1 -1
  92. package/dist/components/navigation/index.js +38 -26
  93. package/dist/components/navigation/mingo-ai-button.d.ts +38 -3
  94. package/dist/components/navigation/mingo-ai-button.d.ts.map +1 -1
  95. package/dist/components/navigation/mobile-nav-sheet-id.d.ts +3 -0
  96. package/dist/components/navigation/mobile-nav-sheet-id.d.ts.map +1 -0
  97. package/dist/components/navigation/mobile-nav-sheet.d.ts +48 -0
  98. package/dist/components/navigation/mobile-nav-sheet.d.ts.map +1 -0
  99. package/dist/components/navigation/nav-item-row.d.ts +27 -0
  100. package/dist/components/navigation/nav-item-row.d.ts.map +1 -0
  101. package/dist/components/navigation/nav-panel.d.ts +43 -0
  102. package/dist/components/navigation/nav-panel.d.ts.map +1 -0
  103. package/dist/components/navigation/navigation-sidebar-item.d.ts +1 -2
  104. package/dist/components/navigation/navigation-sidebar-item.d.ts.map +1 -1
  105. package/dist/components/navigation/site-footer.d.ts +28 -0
  106. package/dist/components/navigation/site-footer.d.ts.map +1 -0
  107. package/dist/components/navigation/site-header.d.ts +61 -0
  108. package/dist/components/navigation/site-header.d.ts.map +1 -0
  109. package/dist/components/navigation/site-nav-link.d.ts +26 -0
  110. package/dist/components/navigation/site-nav-link.d.ts.map +1 -0
  111. package/dist/components/navigation/top-navigation.d.ts +2 -2
  112. package/dist/components/navigation/top-navigation.d.ts.map +1 -1
  113. package/dist/components/onboarding-guides/index.cjs +15 -17
  114. package/dist/components/onboarding-guides/index.js +14 -16
  115. package/dist/components/platform/ToolBadge.d.ts +6 -0
  116. package/dist/components/platform/ToolBadge.d.ts.map +1 -1
  117. package/dist/components/related-content/index.cjs +10 -8
  118. package/dist/components/related-content/index.js +9 -7
  119. package/dist/components/tickets/index.cjs +16 -18
  120. package/dist/components/tickets/index.js +15 -17
  121. package/dist/components/ui/brand-association-card.d.ts +7 -0
  122. package/dist/components/ui/brand-association-card.d.ts.map +1 -1
  123. package/dist/components/ui/index.cjs +14 -14
  124. package/dist/components/ui/index.js +19 -19
  125. package/dist/hooks/index.cjs +19 -11
  126. package/dist/hooks/index.d.ts +1 -0
  127. package/dist/hooks/index.d.ts.map +1 -1
  128. package/dist/hooks/index.js +19 -11
  129. package/dist/hooks/ui/index.d.ts +3 -0
  130. package/dist/hooks/ui/index.d.ts.map +1 -1
  131. package/dist/hooks/ui/use-active-section.d.ts +10 -0
  132. package/dist/hooks/ui/use-active-section.d.ts.map +1 -0
  133. package/dist/hooks/ui/use-nav-menus.d.ts +48 -0
  134. package/dist/hooks/ui/use-nav-menus.d.ts.map +1 -0
  135. package/dist/hooks/ui/use-visitor-os.d.ts +15 -0
  136. package/dist/hooks/ui/use-visitor-os.d.ts.map +1 -0
  137. package/dist/hooks/use-location-hash.d.ts +9 -0
  138. package/dist/hooks/use-location-hash.d.ts.map +1 -0
  139. package/dist/index.cjs +56 -21
  140. package/dist/index.js +231 -196
  141. package/dist/types/case-study.d.ts +9 -0
  142. package/dist/types/case-study.d.ts.map +1 -1
  143. package/dist/types/navigation.d.ts +95 -65
  144. package/dist/types/navigation.d.ts.map +1 -1
  145. package/dist/utils/index.cjs +55 -0
  146. package/dist/utils/index.d.ts +1 -0
  147. package/dist/utils/index.d.ts.map +1 -1
  148. package/dist/utils/index.js +50 -1
  149. package/dist/utils/source-icons.d.ts.map +1 -1
  150. package/dist/utils/visitor-os.d.ts +45 -0
  151. package/dist/utils/visitor-os.d.ts.map +1 -0
  152. package/package.json +1 -1
  153. package/src/components/chat/entity-cards/case-study-card.tsx +115 -5
  154. package/src/components/chat/index.ts +7 -1
  155. package/src/components/chat/nav-link-anchor-via-runtime.tsx +62 -9
  156. package/src/components/chat/utils/icon-library.tsx +35 -1
  157. package/src/components/index.ts +0 -2
  158. package/src/components/loading/page-layout-skeleton.tsx +1 -1
  159. package/src/components/navigation/index.ts +21 -14
  160. package/src/components/navigation/mingo-ai-button.tsx +139 -63
  161. package/src/components/navigation/mobile-nav-sheet-id.ts +2 -0
  162. package/src/components/navigation/mobile-nav-sheet.tsx +241 -0
  163. package/src/components/navigation/nav-item-row.tsx +129 -0
  164. package/src/components/navigation/nav-panel.tsx +196 -0
  165. package/src/components/navigation/navigation-sidebar-item.tsx +1 -2
  166. package/src/components/navigation/site-footer.tsx +256 -0
  167. package/src/components/navigation/site-header.tsx +339 -0
  168. package/src/components/navigation/site-nav-link.tsx +41 -0
  169. package/src/components/navigation/ticket-alerts-button.tsx +2 -2
  170. package/src/components/navigation/top-navigation.tsx +2 -2
  171. package/src/components/platform/ToolBadge.tsx +18 -1
  172. package/src/components/ui/brand-association-card.tsx +25 -3
  173. package/src/hooks/index.ts +1 -0
  174. package/src/hooks/ui/index.ts +3 -0
  175. package/src/hooks/ui/use-active-section.ts +44 -0
  176. package/src/hooks/ui/use-nav-menus.ts +200 -0
  177. package/src/hooks/ui/use-visitor-os.ts +33 -0
  178. package/src/hooks/use-location-hash.ts +34 -0
  179. package/src/styles/chat-animations.css +57 -2
  180. package/src/types/case-study.ts +16 -0
  181. package/src/types/navigation.ts +80 -66
  182. package/src/utils/index.ts +1 -0
  183. package/src/utils/source-icons.ts +13 -0
  184. package/src/utils/visitor-os.ts +84 -0
  185. package/dist/chunk-LMBC5FFP.js +0 -43
  186. package/dist/chunk-O43V3EOS.js +0 -252
  187. package/dist/chunk-QZVSJF2K.cjs +0 -252
  188. package/dist/chunk-RALRPFDW.cjs +0 -43
  189. package/dist/components/footer-waitlist-button.d.ts +0 -29
  190. package/dist/components/footer-waitlist-button.d.ts.map +0 -1
  191. package/dist/components/footer.d.ts +0 -47
  192. package/dist/components/footer.d.ts.map +0 -1
  193. package/dist/components/navigation/client-only-header.d.ts +0 -8
  194. package/dist/components/navigation/client-only-header.d.ts.map +0 -1
  195. package/dist/components/navigation/header-skeleton.d.ts +0 -12
  196. package/dist/components/navigation/header-skeleton.d.ts.map +0 -1
  197. package/dist/components/navigation/header.d.ts +0 -9
  198. package/dist/components/navigation/header.d.ts.map +0 -1
  199. package/dist/components/navigation/mobile-nav-panel.d.ts +0 -10
  200. package/dist/components/navigation/mobile-nav-panel.d.ts.map +0 -1
  201. package/src/components/footer-waitlist-button.tsx +0 -53
  202. package/src/components/footer.tsx +0 -195
  203. package/src/components/navigation/client-only-header.tsx +0 -22
  204. package/src/components/navigation/header-skeleton.tsx +0 -74
  205. package/src/components/navigation/header.tsx +0 -429
  206. package/src/components/navigation/mobile-nav-panel.tsx +0 -155
@@ -1,7 +1,7 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }"use client";
2
2
 
3
3
 
4
- var _chunkIKTQ3ZAGcjs = require('./chunk-IKTQ3ZAG.cjs');
4
+ var _chunkOJLR5MEOcjs = require('./chunk-OJLR5MEO.cjs');
5
5
 
6
6
 
7
7
 
@@ -13,50 +13,59 @@ var _chunkIKTQ3ZAGcjs = require('./chunk-IKTQ3ZAG.cjs');
13
13
 
14
14
 
15
15
 
16
- var _chunkVESKITRQcjs = require('./chunk-VESKITRQ.cjs');
17
16
 
17
+ var _chunkP42V6N34cjs = require('./chunk-P42V6N34.cjs');
18
18
 
19
19
 
20
- var _chunk2QEUFXNScjs = require('./chunk-2QEUFXNS.cjs');
21
20
 
22
21
 
23
22
 
24
- var _chunk3MX5S4CFcjs = require('./chunk-3MX5S4CF.cjs');
25
23
 
26
24
 
27
- var _chunkTYWLNCNHcjs = require('./chunk-TYWLNCNH.cjs');
28
25
 
29
26
 
27
+ var _chunkWCVZCGK5cjs = require('./chunk-WCVZCGK5.cjs');
30
28
 
31
29
 
32
30
 
33
- var _chunkX72J4ACLcjs = require('./chunk-X72J4ACL.cjs');
31
+ var _chunkSEXWHIMScjs = require('./chunk-SEXWHIMS.cjs');
34
32
 
35
33
 
34
+ var _chunkUVTD52MDcjs = require('./chunk-UVTD52MD.cjs');
36
35
 
37
36
 
38
37
 
39
38
 
40
39
 
40
+ var _chunk6NTPY5QAcjs = require('./chunk-6NTPY5QA.cjs');
41
41
 
42
42
 
43
43
 
44
- var _chunkN3COXDBHcjs = require('./chunk-N3COXDBH.cjs');
45
44
 
46
45
 
47
46
 
48
- var _chunkMMOODW57cjs = require('./chunk-MMOODW57.cjs');
49
47
 
48
+ var _chunkLM7TXMLUcjs = require('./chunk-LM7TXMLU.cjs');
50
49
 
51
50
 
52
51
 
53
52
 
54
53
 
55
54
 
56
- var _chunkRKV5B7EUcjs = require('./chunk-RKV5B7EU.cjs');
55
+ var _chunkLLSUVPQCcjs = require('./chunk-LLSUVPQC.cjs');
57
56
 
58
57
 
59
- var _chunkQZVSJF2Kcjs = require('./chunk-QZVSJF2K.cjs');
58
+
59
+
60
+
61
+
62
+
63
+
64
+
65
+
66
+
67
+
68
+ var _chunkVX4E6YSBcjs = require('./chunk-VX4E6YSB.cjs');
60
69
 
61
70
 
62
71
 
@@ -76,204 +85,328 @@ var _chunkLLRGR4I5cjs = require('./chunk-LLRGR4I5.cjs');
76
85
 
77
86
  var _chunk3ATAYP36cjs = require('./chunk-3ATAYP36.cjs');
78
87
 
79
- // src/components/navigation/header.tsx
88
+ // src/components/navigation/site-header.tsx
80
89
  var _react = require('react'); var _react2 = _interopRequireDefault(_react);
81
90
 
82
91
  // src/components/navigation/mingo-ai-button.tsx
92
+
83
93
  var _jsxruntime = require('react/jsx-runtime');
84
94
  var MINGO_ACCENT = "var(--ods-flamingo-cyan-base)";
85
- function MingoAiButton({ source, icon, label = "Mingo AI", className, onClick, ...props }) {
86
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
87
- "button",
95
+ var ASK_AI_OPEN_EVENT = "ask-ai:open";
96
+ function openAskAi(source) {
97
+ window.dispatchEvent(new CustomEvent(ASK_AI_OPEN_EVENT, { detail: { source: _nullishCoalesce(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 = _chunkWCVZCGK5cjs.useVisitorOs.call(void 0, );
110
+ const field = variant === "field";
111
+ const commandKey = visitor.known && _chunkWCVZCGK5cjs.usesCommandKey.call(void 0, visitor.os);
112
+ _react.useEffect.call(void 0, () => {
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__ */ _jsxruntime.jsxs.call(void 0,
125
+ _chunkDFQYAYBHcjs.Button,
88
126
  {
89
127
  ...props,
90
128
  type: "button",
129
+ variant: field ? "glyph" : "transparent",
130
+ size: "wrap",
131
+ font: "regular",
91
132
  "aria-label": label,
133
+ "aria-keyshortcuts": shortcutHint && visitor.known ? commandKey ? "Meta+K" : "Control+K" : void 0,
92
134
  onClick: (e) => {
93
- window.dispatchEvent(new CustomEvent("ask-ai:open", { detail: { source: _nullishCoalesce(source, () => ( "")) } }));
135
+ openAskAi(source);
94
136
  _optionalChain([onClick, 'optionalCall', _2 => _2(e)]);
95
137
  },
96
138
  className: _chunk3ATAYP36cjs.cn.call(void 0,
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",
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
+ ),
104
149
  className
105
150
  ),
106
- children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "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__ */ _jsxruntime.jsx.call(void 0, "span", { "aria-hidden": "true", className: "mingo-edge-frame pointer-events-none absolute inset-0 rounded-md", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "mingo-edge" }) }),
108
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { "aria-hidden": "true", className: "pointer-events-none absolute inset-0 overflow-hidden rounded-md", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
151
+ children: [
152
+ !field && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
153
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { "aria-hidden": "true", className: "mingo-edge-frame pointer-events-none absolute inset-0 rounded-md", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "mingo-edge" }) }),
154
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { "aria-hidden": "true", className: "pointer-events-none absolute inset-0 overflow-hidden rounded-md", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
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__ */ _jsxruntime.jsx.call(void 0,
109
165
  "span",
110
166
  {
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
- }
167
+ className: _chunk3ATAYP36cjs.cn.call(void 0,
168
+ "relative inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full",
169
+ field ? "size-6" : "size-5"
170
+ ),
171
+ children: icon
115
172
  }
116
- ) }),
117
- icon ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "relative inline-flex size-6 shrink-0 items-center justify-center", children: icon }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
118
- _chunkX72J4ACLcjs.MingoIcon,
173
+ ) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
174
+ _chunkLLSUVPQCcjs.MingoIcon,
119
175
  {
120
176
  color: "currentColor",
121
177
  eyesColor: MINGO_ACCENT,
122
178
  cornerColor: MINGO_ACCENT,
123
- className: "relative h-6 w-6 shrink-0 text-ods-text-primary"
179
+ className: _chunk3ATAYP36cjs.cn.call(void 0, "relative shrink-0 text-ods-text-primary", field ? "size-6" : "size-5")
124
180
  }
125
181
  ),
126
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "relative hidden whitespace-nowrap text-ods-text-primary text-h3 md:inline", children: label })
127
- ] })
182
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
183
+ "span",
184
+ {
185
+ className: _chunk3ATAYP36cjs.cn.call(void 0, "relative whitespace-nowrap", field ? "min-w-0 flex-1 truncate" : "hidden text-h6 lg:inline"),
186
+ children: label
187
+ }
188
+ ),
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__ */ _jsxruntime.jsx.call(void 0, "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 ? _chunkWCVZCGK5cjs.shortcutLabel.call(void 0, visitor.os, "K") : "" })
193
+ ]
128
194
  }
129
195
  );
130
196
  }
131
197
 
132
- // src/components/navigation/mobile-nav-panel.tsx
133
- var _overlays = require('@react-aria/overlays');
134
- var _lucidereact = require('lucide-react');
198
+ // src/components/navigation/mobile-nav-sheet-id.ts
199
+ var MOBILE_NAV_SHEET_ID = "mobile-nav-sheet";
135
200
 
201
+ // src/components/navigation/nav-panel.tsx
136
202
 
137
- var MOBILE_NAV_PANEL_ID = "mobile-nav-panel";
138
- function MobileNavPanel({ isOpen, config }) {
139
- const panelRef = _react.useRef.call(void 0, null);
140
- _overlays.usePreventScroll.call(void 0, { isDisabled: !isOpen });
141
- _chunk2QEUFXNScjs.useFocusTrap.call(void 0, panelRef, isOpen, { onEscape: config.onClose });
142
- const headerHeight = _chunkTYWLNCNHcjs.useHeaderHeight.call(void 0, 64, { enabled: isOpen });
143
- if (!isOpen) return null;
144
- const renderNavigationItem = (item) => {
145
- if (item.element) {
146
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { children: item.element }, item.id);
147
- }
148
- const handleClick = () => {
149
- if (item.onClick) {
150
- item.onClick();
151
- }
152
- _optionalChain([config, 'access', _3 => _3.onClose, 'optionalCall', _4 => _4()]);
153
- };
154
- if (item.href) {
155
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
156
- _chunkDFQYAYBHcjs.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: _chunk3ATAYP36cjs.cn.call(void 0,
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
- );
172
- }
173
- return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
174
- _chunkDFQYAYBHcjs.Button,
203
+
204
+ // src/components/navigation/site-nav-link.tsx
205
+
206
+ var defaultRenderSiteNavLink = ({ link, children, ...rest }) => link.external ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLLRGR4I5cjs.next_link_default, { href: link.href, target: "_blank", rel: "noopener noreferrer", ...rest, children }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLLRGR4I5cjs.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
+
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__ */ _jsxruntime.jsx.call(void 0,
223
+ "span",
175
224
  {
176
- variant: "outline",
177
- size: "small-legacy",
178
- onClick: handleClick,
179
- leftIcon: item.icon,
180
- className: _chunk3ATAYP36cjs.cn.call(void 0,
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__ */ _jsxruntime.jsx.call(void 0, "span", { className: "flex-1 text-left", children: item.label }),
186
- item.badge !== void 0 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "ml-auto", children: item.badge })
187
- ]
188
- },
189
- item.id
225
+ "aria-hidden": "true",
226
+ className: _chunk3ATAYP36cjs.cn.call(void 0, "flex shrink-0 items-center justify-center overflow-hidden rounded-full", box),
227
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk6NTPY5QAcjs.EntityIcon, { icon: link.icon, className: "h-full w-full" })
228
+ }
190
229
  );
191
- };
192
- return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
193
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: _chunk3ATAYP36cjs.cn.call(void 0, "fixed inset-0 z-[9998]", _chunk3MX5S4CFcjs.OVERLAY_BACKDROP_CLASS), onClick: config.onClose }),
194
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
230
+ }
231
+ if (!link.iconName) return null;
232
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
233
+ "span",
234
+ {
235
+ "aria-hidden": "true",
236
+ className: _chunk3ATAYP36cjs.cn.call(void 0,
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__ */ _jsxruntime.jsx.call(void 0, _chunk6NTPY5QAcjs.EntityIcon, { icon: { name: link.iconName }, size: glyph })
241
+ }
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__ */ _jsxruntime.jsx.call(void 0, _chunkP42V6N34cjs.UnreadCountBadge, { count: badge, className: "static shrink-0" }) : null;
254
+ const singleLine = !link.description && !link.builtOn;
255
+ const rowClassName = _chunk3ATAYP36cjs.cn.call(void 0,
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__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
265
+ label,
266
+ counter
267
+ ] });
268
+ } else if (variant === "side") {
269
+ children = /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
270
+ link.iconName && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { "aria-hidden": "true", className: "flex shrink-0", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk6NTPY5QAcjs.EntityIcon, { icon: { name: link.iconName }, size: 18 }) }),
271
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "min-w-0 flex-1", children: label }),
272
+ counter
273
+ ] });
274
+ } else {
275
+ const sheet = variant === "sheet";
276
+ children = /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
277
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, RowGlyph, { link, box: sheet ? "h-8 w-8" : "h-9 w-9", glyph: sheet ? 18 : 20 }),
278
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "flex min-w-0 flex-1 flex-col", children: [
279
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "flex items-center gap-[var(--spacing-system-xsf)] text-h6", children: [
280
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "min-w-0", children: label }),
281
+ counter
282
+ ] }),
283
+ link.description && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "text-ods-text-muted text-h6", children: link.description }),
284
+ link.builtOn && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "text-ods-text-muted text-h6", children: [
285
+ "Built on ",
286
+ link.builtOn
287
+ ] })
288
+ ] })
289
+ ] });
290
+ }
291
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment, { children: renderLink({ link, className: rowClassName, children, onClick }) });
292
+ }
293
+
294
+ // src/components/navigation/nav-panel.tsx
295
+
296
+ var TWO_COLUMN_OVER = 4;
297
+ function isMegaMenu(menu) {
298
+ return (_nullishCoalesce(_optionalChain([menu, 'access', _3 => _3.columns, 'optionalAccess', _4 => _4.length]), () => ( 0))) > 1 || !!_optionalChain([menu, 'access', _5 => _5.features, 'optionalAccess', _6 => _6.length]) || !!_optionalChain([menu, 'access', _7 => _7.sideLinks, 'optionalAccess', _8 => _8.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__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunk3ATAYP36cjs.cn.call(void 0, "flex min-w-0 flex-col", wide && (twoColumns ? "flex-[2]" : "flex-1")), children: [
308
+ group.title && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: HEADING_CLASS, children: group.title }),
309
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
195
310
  "div",
196
311
  {
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: _chunk3ATAYP36cjs.cn.call(void 0,
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__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex flex-shrink-0 justify-end border-b border-ods-border p-2", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
224
- _chunkDFQYAYBHcjs.Button,
225
- {
226
- "aria-label": "Close menu",
227
- size: "icon",
228
- variant: "transparent",
229
- leftIcon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.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__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex-1 overflow-y-auto overflow-x-hidden overscroll-contain px-2 py-2", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex flex-col space-y-1", children: config.sections.map((section, index) => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { children: [
235
- section.title && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "px-4 pb-1 pt-2 font-semibold uppercase text-ods-text-secondary text-h6", children: section.title }),
236
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex flex-col gap-1", children: section.items.map(renderNavigationItem) })
237
- ] }, index)) }) }),
238
- config.footer && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex-shrink-0 border-t border-ods-border p-4 pb-[max(1rem,env(safe-area-inset-bottom))]", children: config.footer })
239
- ]
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__ */ _jsxruntime.jsx.call(void 0,
314
+ NavItemRow,
315
+ {
316
+ link,
317
+ renderLink: rowProps.renderLink,
318
+ onNavigate: rowProps.onNavigate,
319
+ badge: link.badgeKey ? _optionalChain([rowProps, 'access', _9 => _9.badges, 'optionalAccess', _10 => _10[link.badgeKey]]) : void 0
320
+ },
321
+ link.id
322
+ ))
240
323
  }
241
324
  )
242
325
  ] });
243
326
  }
244
-
245
- // src/components/navigation/ticket-alerts-button.tsx
246
-
247
- function TicketAlertsButton({ href, onNavigate, disabled, className }) {
248
- const live = _chunkIKTQ3ZAGcjs.useOptionalTicketLive.call(void 0, );
249
- if (!live || !live.authed || live.unreadTotal === 0) return null;
250
- const targetId = live.nextUnreadTicketId;
251
- const target = targetId ? _chunkVESKITRQcjs.buildTicketOpenHref.call(void 0, href, targetId) : href;
252
- const handleClick = () => {
253
- if (onNavigate) onNavigate(target);
254
- else window.location.assign(target);
255
- };
327
+ var NavPanel = _react.forwardRef.call(void 0, 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 = _nullishCoalesce(menu.columns, () => ( []));
340
+ const mega = isMegaMenu(menu);
341
+ const rowProps = { renderLink, badges, onNavigate };
342
+ const socialRow = menu.showSocial && social ? social : null;
256
343
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
257
- _chunkVESKITRQcjs.HeaderButton,
344
+ "div",
258
345
  {
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__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "relative inline-flex", children: [
266
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkN3COXDBHcjs.LifeBuoyIcon, { className: "h-6 w-6" }),
267
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVESKITRQcjs.UnreadCountBadge, { count: live.unreadTotal })
268
- ] })
346
+ inert: !open,
347
+ "data-state": open ? "open" : "closed",
348
+ ...panelProps,
349
+ ref,
350
+ className: _chunk3ATAYP36cjs.cn.call(void 0,
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
269
359
  ),
270
- "aria-label": `Support tickets \u2014 ${live.unreadTotal} unread ${live.unreadTotal === 1 ? "update" : "updates"}`,
271
- onClick: handleClick,
272
- disabled,
273
- className: _chunk3ATAYP36cjs.cn.call(void 0, className)
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__ */ _jsxruntime.jsxs.call(void 0,
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__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex min-h-0 flex-1 gap-[var(--spacing-system-xlf)]", children: [
370
+ columns.map((group) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Column, { group, wide: true, rowProps }, group.id)),
371
+ !!_optionalChain([menu, 'access', _11 => _11.features, 'optionalAccess', _12 => _12.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__ */ _jsxruntime.jsx.call(void 0, "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__ */ _jsxruntime.jsx.call(void 0, "div", { className: "min-h-0 min-w-0 overflow-hidden", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
374
+ _chunk6NTPY5QAcjs.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
+ !!_optionalChain([menu, 'access', _13 => _13.sideLinks, 'optionalAccess', _14 => _14.length]) && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "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__ */ _jsxruntime.jsx.call(void 0, "div", { className: HEADING_CLASS, children: menu.sideTitle }),
386
+ menu.sideLinks.map((link) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
387
+ NavItemRow,
388
+ {
389
+ link,
390
+ variant: "side",
391
+ ...rowProps,
392
+ badge: link.badgeKey ? _optionalChain([badges, 'optionalAccess', _15 => _15[link.badgeKey]]) : void 0
393
+ },
394
+ link.id
395
+ ))
396
+ ] })
397
+ ] }),
398
+ socialRow && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "border-t border-ods-border px-[var(--spacing-system-sf)] pt-[var(--spacing-system-mf)]", children: socialRow })
399
+ ]
400
+ }
401
+ )
402
+ ) : /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
403
+ columns.map((group) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Column, { group, wide: false, rowProps }, group.id)),
404
+ socialRow && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "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
+ ] })
274
406
  }
275
407
  );
276
- }
408
+ });
409
+ NavPanel.displayName = "NavPanel";
277
410
 
278
411
  // src/components/navigation/top-navigation.tsx
279
412
 
@@ -351,343 +484,559 @@ function TopNavigation({
351
484
  );
352
485
  }
353
486
 
354
- // src/components/navigation/header.tsx
487
+ // src/components/navigation/site-header.tsx
355
488
 
356
- var NAV_ITEM_CLASSES = "text-h6 [&_svg]:h-6 [&_svg]:w-6";
357
- function Header({ config }) {
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__ */ _jsxruntime.jsx.call(void 0, _chunk6NTPY5QAcjs.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
+ }) {
358
512
  const [show, setShow] = _react.useState.call(void 0, true);
359
513
  const lastScrollY = _react.useRef.call(void 0, 0);
360
- const [openDropdowns, setOpenDropdowns] = _react.useState.call(void 0, {});
361
- const dropdownRefs = _react.useRef.call(void 0, {});
362
- const triggerRefs = _react.useRef.call(void 0, {});
363
- _react.useEffect.call(void 0, () => {
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]);
514
+ const activeId = _chunkWCVZCGK5cjs.useActiveSection.call(void 0, nav.menus, pathname);
515
+ const { openId, close, getTriggerProps, getPanelProps } = _chunkWCVZCGK5cjs.useNavMenus.call(void 0, { pathname });
516
+ const [trail, setTrail] = _react.useState.call(void 0, { 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";
392
523
  _react.useEffect.call(void 0, () => {
393
- return () => {
394
- setOpenDropdowns({});
395
- dropdownRefs.current = {};
396
- triggerRefs.current = {};
397
- };
398
- }, []);
399
- _react.useEffect.call(void 0, () => {
400
- if (!config.autoHide) return void 0;
524
+ if (!autoHide) return void 0;
401
525
  const handleScroll = () => {
402
526
  const currentScrollY = window.scrollY;
403
527
  const prevScrollY = lastScrollY.current;
404
528
  lastScrollY.current = currentScrollY;
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
- }
529
+ if (currentScrollY > prevScrollY && currentScrollY > 50) setShow(false);
530
+ else if (currentScrollY < prevScrollY || currentScrollY <= 10) setShow(true);
412
531
  };
413
532
  window.addEventListener("scroll", handleScroll, { passive: true });
414
- return () => {
415
- window.removeEventListener("scroll", handleScroll);
416
- };
417
- }, [config.autoHide]);
418
- const renderNavigationItem = (item) => {
419
- if (item.element) {
420
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _react2.default.Fragment, { children: item.element }, item.id);
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 = !!_optionalChain([menu, 'access', _16 => _16.columns, 'optionalAccess', _17 => _17.length]) || !!_optionalChain([menu, 'access', _18 => _18.features, 'optionalAccess', _19 => _19.length]) || !!_optionalChain([menu, 'access', _20 => _20.sideLinks, 'optionalAccess', _21 => _21.length]);
539
+ if (!hasPanel) {
540
+ if (!menu.href) return null;
541
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
542
+ _chunkDFQYAYBHcjs.Button,
543
+ {
544
+ asChild: true,
545
+ variant: "transparent",
546
+ size: "wrap",
547
+ font: "regular",
548
+ className: _chunk3ATAYP36cjs.cn.call(void 0, 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__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
553
+ menuIcon(menu),
554
+ menu.label
555
+ ] })
556
+ })
557
+ }
558
+ ) }, menu.id);
421
559
  }
422
- if (item.children && item.children.length > 0) {
423
- const isOpen = openDropdowns[item.id] || false;
424
- return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "relative", children: [
425
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
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__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunk3ATAYP36cjs.cn.call(void 0, "flex", !isMegaMenu(menu) && "relative"), children: [
565
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
426
566
  _chunkDFQYAYBHcjs.Button,
427
567
  {
428
- ref: (el) => {
429
- triggerRefs.current[item.id] = el;
430
- },
568
+ type: "button",
431
569
  variant: "transparent",
432
- leftIcon: item.icon,
433
- rightIcon: item.badge,
434
- onClick: () => {
435
- setOpenDropdowns((prev) => ({
436
- [item.id]: !prev[item.id]
437
- }));
438
- },
439
- size: "default",
570
+ size: "wrap",
440
571
  font: "regular",
572
+ ...getTriggerProps(menu.id),
573
+ "aria-current": current ? "page" : void 0,
441
574
  className: _chunk3ATAYP36cjs.cn.call(void 0,
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
575
+ TOP_ITEM_CLASS,
576
+ NAV_FOCUS_CLASS,
577
+ open && "bg-ods-bg-hover text-ods-text-primary",
578
+ current && TOP_ITEM_CURRENT_CLASS
451
579
  ),
452
- children: item.label
580
+ children: [
581
+ menuIcon(menu),
582
+ menu.label,
583
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
584
+ _chunkVX4E6YSBcjs.Chevron02DownIcon,
585
+ {
586
+ "aria-hidden": "true",
587
+ className: _chunk3ATAYP36cjs.cn.call(void 0, "!h-4 !w-4 transition-transform duration-150", open && "rotate-180")
588
+ }
589
+ )
590
+ ]
453
591
  }
454
592
  ),
455
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
456
- "div",
593
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
594
+ NavPanel,
457
595
  {
458
- ref: (el) => {
459
- dropdownRefs.current[item.id] = el;
460
- },
461
- inert: !isOpen,
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__ */ _jsxruntime.jsx.call(void 0, _chunkDFQYAYBHcjs.Button, { variant: "accent", href: nav.primaryCta.href, children: nav.primaryCta.label }) : nav.primaryCta === "none" ? null : _nullishCoalesce(cta, () => ( null));
611
+ const hasRight = !!mingo || !!nav.signIn || !!actions || !!primaryCta;
612
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
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__ */ _jsxruntime.jsx.call(void 0,
620
+ _chunkLLRGR4I5cjs.next_link_default,
621
+ {
622
+ href: `#${skipToContentId}`,
462
623
  className: _chunk3ATAYP36cjs.cn.call(void 0,
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 || ""
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
470
626
  ),
471
- children: [
472
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "p-2", children: item.children.map((child, index) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
627
+ children: "Skip to content"
628
+ }
629
+ ),
630
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
631
+ TopNavigation,
632
+ {
633
+ className: _chunk3ATAYP36cjs.cn.call(void 0, "relative", className),
634
+ style,
635
+ backgroundClassName,
636
+ centerBreakpoint: "lg",
637
+ size: "big",
638
+ leading: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
639
+ leading,
640
+ mobile && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
641
+ _chunkP42V6N34cjs.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 ? _nullishCoalesce(mobile.controlsId, () => ( MOBILE_NAV_SHEET_ID)) : void 0,
649
+ icon: mobile.isOpen ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVX4E6YSBcjs.XmarkIcon, { className: "h-6 w-6" }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVX4E6YSBcjs.Menu01Icon, { className: "h-6 w-6" })
650
+ }
651
+ )
652
+ ] }),
653
+ logo: logoHref ? renderLink({
654
+ link: { href: logoHref },
655
+ className: _chunk3ATAYP36cjs.cn.call(void 0,
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__ */ _jsxruntime.jsx.call(void 0, "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__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
666
+ mingo && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
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__ */ _jsxruntime.jsx.call(void 0, "div", { className: "hidden lg:flex", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
473
676
  _chunkDFQYAYBHcjs.Button,
474
677
  {
678
+ asChild: true,
475
679
  variant: "transparent",
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: _chunk3ATAYP36cjs.cn.call(void 0,
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 < (_nullishCoalesce(_optionalChain([item, 'access', _5 => _5.children, 'optionalAccess', _6 => _6.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__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
505
- item.showDropdownDivider !== false && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "mx-2 my-2 h-px bg-ods-border" }),
506
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "px-2 pb-2", children: item.dropdownContent })
507
- ] })
508
- ]
680
+ size: "wrap",
681
+ font: "regular",
682
+ className: _chunk3ATAYP36cjs.cn.call(void 0, 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
509
691
  }
510
692
  )
511
- ] }, item.id);
693
+ ]
512
694
  }
513
- if (item.href || item.onClick) {
514
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
515
- _chunkDFQYAYBHcjs.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: _chunk3ATAYP36cjs.cn.call(void 0,
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
695
+ );
696
+ }
697
+
698
+ // src/components/navigation/mobile-nav-sheet.tsx
699
+ var _overlays = require('@react-aria/overlays');
700
+
701
+
702
+ function siteNavHasMobileMenus(nav) {
703
+ return (_nullishCoalesce(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
+ ...(_nullishCoalesce(menu.columns, () => ( []))).flatMap((group) => group.links),
708
+ ..._nullishCoalesce(menu.sideLinks, () => ( []))
709
+ ];
710
+ function MobileNavSheet(props) {
711
+ if (!props.isOpen) return null;
712
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, 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 = _react.useRef.call(void 0, null);
729
+ const menus = [..._nullishCoalesce(nav.mobileMenus, () => ( nav.menus)), ..._nullishCoalesce(extraMenus, () => ( []))];
730
+ _overlays.usePreventScroll.call(void 0, );
731
+ _chunkWCVZCGK5cjs.useFocusTrap.call(void 0, sheetRef, true, { onEscape: onClose });
732
+ const [openGroups, setOpenGroups] = _react.useState.call(void 0, () => {
733
+ const active = _chunkWCVZCGK5cjs.resolveActiveSection.call(void 0, menus, pathname);
734
+ return active ? { [active]: true } : {};
735
+ });
736
+ const primaryCta = typeof nav.primaryCta === "object" ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkDFQYAYBHcjs.Button, { variant: "accent", href: nav.primaryCta.href, onClick: onClose, className: "w-full", children: nav.primaryCta.label }) : nav.primaryCta === "none" ? null : _nullishCoalesce(cta, () => ( null));
737
+ const hasFooter = !!actions || !!primaryCta || !!nav.signIn;
738
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
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: _chunk3ATAYP36cjs.cn.call(void 0,
748
+ "fixed inset-0 z-[9999] flex h-[100svh] flex-col text-ods-text-primary outline-none",
749
+ _nullishCoalesce(backgroundClassName, () => ( "bg-ods-bg"))
750
+ ),
751
+ children: [
752
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "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__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex min-w-0 items-center", children: logo }),
754
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
755
+ _chunkDFQYAYBHcjs.Button,
756
+ {
757
+ type: "button",
758
+ variant: "transparent",
759
+ size: "icon",
760
+ "aria-label": "Close menu",
761
+ onClick: onClose,
762
+ className: _chunk3ATAYP36cjs.cn.call(void 0, "h-11 w-11 shrink-0 md:h-11 md:w-11", NAV_FOCUS_CLASS),
763
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVX4E6YSBcjs.XmarkIcon, { "aria-hidden": "true", className: "!h-6 !w-6" })
764
+ }
765
+ )
766
+ ] }),
767
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "min-h-0 flex-1 overflow-y-auto overflow-x-hidden overscroll-contain px-5", children: [
768
+ askAI && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
769
+ MingoAiButton,
770
+ {
771
+ variant: "field",
772
+ source: askAI.source,
773
+ icon: askAI.icon,
774
+ label: askAI.label,
775
+ onClick: onClose
776
+ }
533
777
  ),
534
- ...item.isExternal && { isExternal: true },
535
- children: item.label
536
- },
537
- item.id
538
- );
778
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "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__ */ _jsxruntime.jsx.call(void 0, "div", { className: "border-b border-ods-border", children: renderLink({
783
+ link: { href: menu.href },
784
+ className: _chunk3ATAYP36cjs.cn.call(void 0, GROUP_ROW_CLASS, NAV_FOCUS_CLASS),
785
+ onClick: onClose,
786
+ children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
787
+ menu.label,
788
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVX4E6YSBcjs.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__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "border-b border-ods-border", children: [
795
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
796
+ _chunkDFQYAYBHcjs.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: _chunk3ATAYP36cjs.cn.call(void 0, GROUP_ROW_CLASS, NAV_FOCUS_CLASS),
806
+ children: [
807
+ menu.label,
808
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
809
+ _chunkVX4E6YSBcjs.Chevron02DownIcon,
810
+ {
811
+ "aria-hidden": "true",
812
+ className: _chunk3ATAYP36cjs.cn.call(void 0,
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__ */ _jsxruntime.jsxs.call(void 0, "div", { id: listId, className: "flex flex-col pb-[var(--spacing-system-sf)]", children: [
822
+ links.map((link) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
823
+ NavItemRow,
824
+ {
825
+ link,
826
+ variant: "sheet",
827
+ renderLink,
828
+ badge: link.badgeKey ? _optionalChain([badges, 'optionalAccess', _22 => _22[link.badgeKey]]) : void 0,
829
+ onNavigate: onClose
830
+ },
831
+ link.id
832
+ )),
833
+ menu.showSocial && social && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "pt-[var(--spacing-system-xsf)]", children: social })
834
+ ] })
835
+ ] }, menu.id);
836
+ }) })
837
+ ] }),
838
+ hasFooter && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "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: _chunk3ATAYP36cjs.cn.call(void 0,
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
+ ]
539
852
  }
540
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
541
- _chunkDFQYAYBHcjs.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: _chunk3ATAYP36cjs.cn.call(void 0,
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 = !!_optionalChain([config, 'access', _7 => _7.actions, 'optionalAccess', _8 => _8.right, 'optionalAccess', _9 => _9.length]) || !!(_optionalChain([config, 'access', _10 => _10.actions, 'optionalAccess', _11 => _11.persistent]) && config.actions.persistent.length > 0);
567
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
853
+ );
854
+ }
855
+
856
+ // src/components/navigation/site-footer.tsx
857
+
858
+
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] = _react.useState.call(void 0, false);
875
+ const listId = `site-footer-${group.id}`;
876
+ const links = group.links.map((link) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "li", { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, NavItemRow, { link, variant: "label", renderLink }) }, link.id));
877
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
568
878
  "div",
569
879
  {
570
- className: _chunk3ATAYP36cjs.cn.call(void 0, "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__ */ _jsxruntime.jsx.call(void 0,
575
- TopNavigation,
576
- {
577
- className: _chunk3ATAYP36cjs.cn.call(void 0, "relative", config.className),
578
- style: config.style,
579
- backgroundClassName: config.backgroundColor,
580
- centerBreakpoint: "lg",
581
- size: "big",
582
- leading: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
583
- !!_optionalChain([config, 'access', _12 => _12.actions, 'optionalAccess', _13 => _13.left, 'optionalAccess', _14 => _14.length]) && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex h-full items-center border-r border-ods-border", children: config.actions.left }),
584
- _optionalChain([config, 'access', _15 => _15.mobile, 'optionalAccess', _16 => _16.enabled]) && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
585
- _chunkVESKITRQcjs.HeaderButton,
586
- {
587
- className: "border-r border-ods-border lg:hidden",
588
- onClick: () => {
589
- _optionalChain([config, 'access', _17 => _17.mobile, 'optionalAccess', _18 => _18.onToggle, 'optionalCall', _19 => _19()]);
590
- },
591
- isActive: _nullishCoalesce(_optionalChain([config, 'access', _20 => _20.mobile, 'optionalAccess', _21 => _21.isOpen]), () => ( false)),
592
- "aria-label": _optionalChain([config, 'access', _22 => _22.mobile, 'optionalAccess', _23 => _23.isOpen]) ? "Close menu" : "Open menu",
593
- "aria-expanded": _nullishCoalesce(_optionalChain([config, 'access', _24 => _24.mobile, 'optionalAccess', _25 => _25.isOpen]), () => ( false)),
594
- "aria-controls": _optionalChain([config, 'access', _26 => _26.mobile, 'optionalAccess', _27 => _27.isOpen]) ? MOBILE_NAV_PANEL_ID : void 0,
595
- icon: _optionalChain([config, 'access', _28 => _28.mobile, 'optionalAccess', _29 => _29.isOpen]) ? _optionalChain([config, 'access', _30 => _30.mobile, 'optionalAccess', _31 => _31.closeIcon]) || /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkN3COXDBHcjs.XmarkIcon, { className: "h-6 w-6" }) : _optionalChain([config, 'access', _32 => _32.mobile, 'optionalAccess', _33 => _33.menuIcon]) || /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkN3COXDBHcjs.Menu01Icon, { className: "h-6 w-6" })
596
- }
597
- )
598
- ] }),
599
- logo: config.logo.href ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLLRGR4I5cjs.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__ */ _jsxruntime.jsx.call(void 0,
602
- "nav",
880
+ className: _chunk3ATAYP36cjs.cn.call(void 0,
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__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
886
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "h3", { className: "md:hidden", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
887
+ _chunkDFQYAYBHcjs.Button,
603
888
  {
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),
604
896
  className: _chunk3ATAYP36cjs.cn.call(void 0,
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
- _optionalChain([config, 'access', _34 => _34.navigation, 'optionalAccess', _35 => _35.position]) === "center" && "absolute left-1/2 -translate-x-1/2"
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
609
900
  ),
610
- role: "navigation",
611
- "aria-label": "Main navigation",
612
- children: _optionalChain([config, 'access', _36 => _36.navigation, 'optionalAccess', _37 => _37.items, 'access', _38 => _38.map, 'call', _39 => _39(renderNavigationItem)])
901
+ children: [
902
+ group.title,
903
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
904
+ _chunkVX4E6YSBcjs.Chevron02DownIcon,
905
+ {
906
+ "aria-hidden": "true",
907
+ className: _chunk3ATAYP36cjs.cn.call(void 0, "h-5 w-5 shrink-0 transition-transform duration-150", open && "rotate-180")
908
+ }
909
+ )
910
+ ]
613
911
  }
614
- ) : void 0,
615
- centerClassName: _chunk3ATAYP36cjs.cn.call(void 0,
616
- _optionalChain([config, 'access', _40 => _40.navigation, 'optionalAccess', _41 => _41.position]) === "left" && "justify-start",
617
- _optionalChain([config, 'access', _42 => _42.navigation, 'optionalAccess', _43 => _43.position]) === "right" && "justify-end pr-[var(--spacing-system-m)]"
618
- ),
619
- cta: hasCta ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
620
- !!_optionalChain([config, 'access', _44 => _44.actions, 'optionalAccess', _45 => _45.right, 'optionalAccess', _46 => _46.length]) && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "hidden items-center gap-3 lg:flex", children: config.actions.right }),
621
- _optionalChain([config, 'access', _47 => _47.actions, 'optionalAccess', _48 => _48.persistent]) && config.actions.persistent.length > 0 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex items-center", children: config.actions.persistent })
622
- ] }) : void 0,
623
- ctaClassName: "gap-3",
624
- sideActions: config.tickets || _optionalChain([config, 'access', _49 => _49.mingo, 'optionalAccess', _50 => _50.enabled]) ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
625
- config.tickets && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
626
- TicketAlertsButton,
627
- {
628
- href: config.tickets.href,
629
- onNavigate: config.tickets.onClick,
630
- className: "border-l border-ods-border"
631
- }
912
+ ) }),
913
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "h3", { className: _chunk3ATAYP36cjs.cn.call(void 0, "hidden md:block", HEADING_CLASS2), children: group.title })
914
+ ] }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "h3", { className: HEADING_CLASS2, children: group.title })),
915
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
916
+ "ul",
917
+ {
918
+ id: listId,
919
+ className: _chunk3ATAYP36cjs.cn.call(void 0,
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)]"
632
922
  ),
633
- _optionalChain([config, 'access', _51 => _51.mingo, 'optionalAccess', _52 => _52.enabled]) && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
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
- )
923
+ children: links
924
+ }
925
+ )
926
+ ]
645
927
  }
646
928
  );
647
929
  }
648
-
649
- // src/components/navigation/header-skeleton.tsx
650
-
651
- function HeaderSkeleton({ config }) {
652
- const showNavigation = _optionalChain([config, 'optionalAccess', _53 => _53.navigation]) && config.navigation.items.length > 0;
653
- const showActions = _optionalChain([config, 'optionalAccess', _54 => _54.actions, 'optionalAccess', _55 => _55.right]) && config.actions.right.length > 0;
654
- const showMobileMenu = _optionalChain([config, 'optionalAccess', _56 => _56.mobile, 'optionalAccess', _57 => _57.enabled]);
655
- const showLeftActions = !!_optionalChain([config, 'optionalAccess', _58 => _58.actions, 'optionalAccess', _59 => _59.left]);
656
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "sticky top-0 z-[50] w-full", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
657
- "header",
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__ */ _jsxruntime.jsx.call(void 0, _chunkDFQYAYBHcjs.Button, { variant: "accent", href: nav.primaryCta.href, children: nav.primaryCta.label }) : nav.primaryCta === "none" ? null : _nullishCoalesce(cta, () => ( null));
943
+ const columns = nav.footerColumns;
944
+ const accordion = columns.length > ACCORDION_OVER;
945
+ const socialRow = _nullishCoalesce(social, () => ( (nav.brand.social.length > 0 ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
946
+ _chunkP42V6N34cjs.SocialIconRow,
947
+ {
948
+ compact: true,
949
+ links: nav.brand.social.map((link) => ({
950
+ platform: _nullishCoalesce(link.iconName, () => ( link.id)),
951
+ href: link.href,
952
+ label: link.label
953
+ }))
954
+ }
955
+ ) : null)));
956
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
957
+ "footer",
658
958
  {
659
959
  className: _chunk3ATAYP36cjs.cn.call(void 0,
660
- "flex h-[72px] w-full items-center border-b border-t border-ods-border md:border-t-0",
661
- _optionalChain([config, 'optionalAccess', _60 => _60.backgroundColor]) || "bg-ods-card",
662
- _optionalChain([config, 'optionalAccess', _61 => _61.className])
960
+ "relative z-[44] w-full border-t border-ods-border px-[var(--spacing-system-lf)] text-ods-text-primary",
961
+ _nullishCoalesce(backgroundClassName, () => ( "bg-ods-bg"))
663
962
  ),
664
963
  children: [
665
- showLeftActions && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex h-full w-[72px] items-center justify-center border-r border-ods-border", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "h-6 w-6 animate-pulse rounded bg-ods-border" }) }),
666
- showMobileMenu && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex h-full w-[72px] items-center justify-center border-r border-ods-border lg:hidden", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "h-6 w-6 animate-pulse rounded bg-ods-border" }) }),
667
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "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__ */ _jsxruntime.jsx.call(void 0, "div", { className: "h-6 w-6 animate-pulse rounded bg-ods-border" }),
669
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "h-5 w-24 animate-pulse rounded bg-ods-border" })
964
+ band && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "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__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex min-w-0 flex-col gap-[var(--spacing-system-xsf)]", children: [
966
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "h2", { className: "text-h2", children: band.heading }),
967
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-ods-text-secondary text-h4", children: band.subheading })
968
+ ] }),
969
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex shrink-0 flex-col gap-[var(--spacing-system-sf)] md:flex-row", children: [
970
+ bandPrimary,
971
+ band.secondary && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkDFQYAYBHcjs.Button, { variant: "outline", href: band.secondary.href, openInNewTab: band.secondary.external, children: navLinkLabel(band.secondary) })
972
+ ] })
670
973
  ] }),
671
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "hidden h-full min-w-0 flex-1 items-center justify-center gap-2 lg:flex", children: showNavigation && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
672
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "h-8 w-20 animate-pulse rounded bg-ods-border" }),
673
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "h-8 w-28 animate-pulse rounded bg-ods-border" }),
674
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "h-8 w-24 animate-pulse rounded bg-ods-border" })
675
- ] }) }),
676
- showActions && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "hidden h-full items-center px-[var(--spacing-system-m)] lg:flex", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "h-8 w-24 animate-pulse rounded bg-ods-border" }) }),
677
- _optionalChain([config, 'optionalAccess', _62 => _62.mingo, 'optionalAccess', _63 => _63.enabled]) && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex h-full items-center border-l border-ods-border px-[var(--spacing-system-l)]", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "h-8 w-8 animate-pulse rounded bg-ods-border md:w-28" }) })
974
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col gap-8 py-[var(--spacing-system-xlf)] lg:flex-row lg:gap-16 lg:py-14", children: [
975
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex w-full shrink-0 flex-col items-start gap-[var(--spacing-system-mf)] lg:w-60", children: [
976
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "flex items-center gap-[var(--spacing-system-xsf)]", children: [
977
+ logo,
978
+ typeof name === "string" ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "whitespace-nowrap text-ods-text-primary text-wordmark", children: name }) : name
979
+ ] }),
980
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "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: _chunk3ATAYP36cjs.cn.call(void 0,
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__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
989
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "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__ */ _jsxruntime.jsx.call(void 0,
996
+ "nav",
997
+ {
998
+ "aria-label": "Footer",
999
+ className: _chunk3ATAYP36cjs.cn.call(void 0,
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__ */ _jsxruntime.jsx.call(void 0, FooterColumn, { group, accordion, renderLink }, group.id))
1005
+ }
1006
+ )
1007
+ ] }),
1008
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
1009
+ "div",
1010
+ {
1011
+ className: _chunk3ATAYP36cjs.cn.call(void 0,
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__ */ _jsxruntime.jsxs.call(void 0, "span", { children: [
1016
+ "\xA9 ",
1017
+ year,
1018
+ " ",
1019
+ nav.legal.company
1020
+ ] }),
1021
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "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__ */ _jsxruntime.jsx.call(void 0, "span", { children: nav.legal.notes.join(" \xB7 ") }),
1023
+ nav.legal.links.map((link) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
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
+ )
678
1037
  ]
679
1038
  }
680
- ) });
681
- }
682
-
683
- // src/components/navigation/client-only-header.tsx
684
-
685
- function ClientOnlyHeader({ config, skeleton }) {
686
- const isClient = _chunk3MX5S4CFcjs.useIsHydrated.call(void 0, );
687
- if (!isClient) {
688
- return skeleton || /* @__PURE__ */ _jsxruntime.jsx.call(void 0, HeaderSkeleton, { config });
689
- }
690
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Header, { config });
1039
+ );
691
1040
  }
692
1041
 
693
1042
  // src/components/navigation/sliding-sidebar.tsx
@@ -697,12 +1046,12 @@ var _framermotion = require('framer-motion');
697
1046
 
698
1047
  function SlidingSidebar({ config }) {
699
1048
  const [expandedItems, setExpandedItems] = _react.useState.call(void 0, /* @__PURE__ */ new Set());
700
- const mounted = _chunk3MX5S4CFcjs.useIsHydrated.call(void 0, );
701
- const headerHeight = _chunkTYWLNCNHcjs.useHeaderHeight.call(void 0, );
1049
+ const mounted = _chunkSEXWHIMScjs.useIsHydrated.call(void 0, );
1050
+ const headerHeight = _chunkUVTD52MDcjs.useHeaderHeight.call(void 0, );
702
1051
  const asideRef = _react.useRef.call(void 0, null);
703
1052
  const prefersReducedMotion = _framermotion.useReducedMotion.call(void 0, );
704
1053
  _overlays.usePreventScroll.call(void 0, { isDisabled: !config.isOpen });
705
- _chunk2QEUFXNScjs.useFocusTrap.call(void 0, asideRef, config.isOpen, { onEscape: config.onClose, contain: false });
1054
+ _chunkWCVZCGK5cjs.useFocusTrap.call(void 0, asideRef, config.isOpen, { onEscape: config.onClose, contain: false });
706
1055
  const toggleExpanded = (itemId) => {
707
1056
  const newExpanded = new Set(expandedItems);
708
1057
  if (newExpanded.has(itemId)) {
@@ -775,7 +1124,7 @@ function SlidingSidebar({ config }) {
775
1124
  variant: "transparent",
776
1125
  size: "default",
777
1126
  onClick: () => {
778
- _optionalChain([item, 'access', _64 => _64.onClick, 'optionalCall', _65 => _65()]);
1127
+ _optionalChain([item, 'access', _23 => _23.onClick, 'optionalCall', _24 => _24()]);
779
1128
  config.onClose();
780
1129
  },
781
1130
  leftIcon: item.icon,
@@ -798,7 +1147,7 @@ function SlidingSidebar({ config }) {
798
1147
  variant: "transparent",
799
1148
  size: "default",
800
1149
  onClick: () => {
801
- _optionalChain([item, 'access', _66 => _66.onClick, 'optionalCall', _67 => _67()]);
1150
+ _optionalChain([item, 'access', _25 => _25.onClick, 'optionalCall', _26 => _26()]);
802
1151
  config.onClose();
803
1152
  },
804
1153
  leftIcon: item.icon,
@@ -829,7 +1178,7 @@ function SlidingSidebar({ config }) {
829
1178
  duration: 0.3,
830
1179
  ease: [0.4, 0, 0.2, 1]
831
1180
  },
832
- className: _chunk3ATAYP36cjs.cn.call(void 0, "fixed inset-0 z-[45]", _chunk3MX5S4CFcjs.OVERLAY_BACKDROP_CLASS),
1181
+ className: _chunk3ATAYP36cjs.cn.call(void 0, "fixed inset-0 z-[45]", _chunkSEXWHIMScjs.OVERLAY_BACKDROP_CLASS),
833
1182
  onClick: () => config.onClose()
834
1183
  }
835
1184
  ) }),
@@ -877,7 +1226,7 @@ function SlidingSidebar({ config }) {
877
1226
  function NavigationSidebarHeader({ minimized }) {
878
1227
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex h-14 items-center justify-start border-b border-ods-border p-[var(--spacing-system-m)]", children: [
879
1228
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex-shrink-0", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
880
- _chunkQZVSJF2Kcjs.OpenFrameLogo,
1229
+ _chunkLLSUVPQCcjs.OpenFrameLogo,
881
1230
  {
882
1231
  className: "h-6 w-6",
883
1232
  upperPathColor: "var(--color-text-primary)",
@@ -892,7 +1241,7 @@ function NavigationSidebarHeader({ minimized }) {
892
1241
  minimized ? "ml-0 opacity-0" : "ml-[var(--spacing-system-xs)] opacity-100"
893
1242
  ),
894
1243
  "aria-hidden": minimized,
895
- children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkX72J4ACLcjs.OpenFrameText, { textColor: "var(--color-text-primary)" })
1244
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLLSUVPQCcjs.OpenFrameText, { textColor: "var(--color-text-primary)" })
896
1245
  }
897
1246
  )
898
1247
  ] });
@@ -905,7 +1254,7 @@ function NavigationSidebarHeader({ minimized }) {
905
1254
 
906
1255
  function NavigationItemBadge({ label, compact = false, className, ...rest }) {
907
1256
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
908
- _chunkMMOODW57cjs.Tag,
1257
+ _chunk6NTPY5QAcjs.Tag,
909
1258
  {
910
1259
  as: "span",
911
1260
  label,
@@ -970,7 +1319,7 @@ var NavigationSidebarItemButton = _react.memo.call(void 0, function NavigationSi
970
1319
  _react.cloneElement.call(void 0, item.icon, {
971
1320
  color: isActive && !disabled ? "text-ods-accent" : "text-ods-text-secondary"
972
1321
  }),
973
- hasUnread && !showLabel && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVESKITRQcjs.UnreadDot, { size: "fixed" })
1322
+ hasUnread && !showLabel && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkP42V6N34cjs.UnreadDot, { size: "fixed" })
974
1323
  ] }),
975
1324
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
976
1325
  "span",
@@ -1023,7 +1372,7 @@ function NavigationSidebarToggle({ minimized, showLabel, onToggle }) {
1023
1372
  title: minimized ? "Hide Menu" : void 0,
1024
1373
  "aria-label": "Hide Menu",
1025
1374
  children: [
1026
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex flex-shrink-0 items-center justify-center", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkN3COXDBHcjs.Chevrons03LeftIcon, { className: "h-6 w-6 rotate-180 text-ods-text-secondary transition-transform duration-300 @[140px]/of-nav-sidebar:rotate-0" }) }),
1375
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex flex-shrink-0 items-center justify-center", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVX4E6YSBcjs.Chevrons03LeftIcon, { className: "h-6 w-6 rotate-180 text-ods-text-secondary transition-transform duration-300 @[140px]/of-nav-sidebar:rotate-0" }) }),
1027
1376
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1028
1377
  "span",
1029
1378
  {
@@ -1061,17 +1410,17 @@ var SIDEBAR_GEOMETRY_CLASSES = [
1061
1410
  var SIDEBAR_TABLET_WIDTH = { rail: "md:w-14", overlay: "md:w-56" };
1062
1411
  var isModifiedClick = (event) => !!event && (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || event.button !== 0);
1063
1412
  function NavigationSidebar({ config, disabled = false, pushOnTablet = false }) {
1064
- const isMdUp = _nullishCoalesce(_chunkRKV5B7EUcjs.useMdUp.call(void 0, ), () => ( false));
1065
- const isLgUp = _nullishCoalesce(_chunkRKV5B7EUcjs.useLgUp.call(void 0, ), () => ( false));
1413
+ const isMdUp = _nullishCoalesce(_chunkLM7TXMLUcjs.useMdUp.call(void 0, ), () => ( false));
1414
+ const isLgUp = _nullishCoalesce(_chunkLM7TXMLUcjs.useLgUp.call(void 0, ), () => ( false));
1066
1415
  const isTablet = isMdUp && !isLgUp;
1067
- const [desktopMinimized, setDesktopMinimized] = _chunk2QEUFXNScjs.useLocalStorage.call(void 0, STORAGE_KEY, _nullishCoalesce(config.minimized, () => ( false)));
1416
+ const [desktopMinimized, setDesktopMinimized] = _chunkWCVZCGK5cjs.useLocalStorage.call(void 0, STORAGE_KEY, _nullishCoalesce(config.minimized, () => ( false)));
1068
1417
  const [tabletMinimized, setTabletMinimized] = _react.useState.call(void 0, true);
1069
1418
  const [tabletFor, setTabletFor] = _react.useState.call(void 0, isTablet);
1070
1419
  if (tabletFor !== isTablet) {
1071
1420
  setTabletFor(isTablet);
1072
1421
  if (isTablet) setTabletMinimized(true);
1073
1422
  }
1074
- const hydrated = _chunk3MX5S4CFcjs.useIsHydrated.call(void 0, );
1423
+ const hydrated = _chunkSEXWHIMScjs.useIsHydrated.call(void 0, );
1075
1424
  const minimized = hydrated ? isTablet ? tabletMinimized : desktopMinimized : _nullishCoalesce(config.minimized, () => ( false));
1076
1425
  const [transitionsEnabled, setTransitionsEnabled] = _react.useState.call(void 0, false);
1077
1426
  const isOverlayOpen = isTablet && !minimized;
@@ -1082,7 +1431,7 @@ function NavigationSidebar({ config, disabled = false, pushOnTablet = false }) {
1082
1431
  } else {
1083
1432
  setDesktopMinimized((prev) => !prev);
1084
1433
  }
1085
- _optionalChain([config, 'access', _68 => _68.onToggleMinimized, 'optionalCall', _69 => _69()]);
1434
+ _optionalChain([config, 'access', _27 => _27.onToggleMinimized, 'optionalCall', _28 => _28()]);
1086
1435
  }, [isTablet, setDesktopMinimized, config]);
1087
1436
  const closeOverlay = _react.useCallback.call(void 0, () => {
1088
1437
  setTabletMinimized(true);
@@ -1096,7 +1445,7 @@ function NavigationSidebar({ config, disabled = false, pushOnTablet = false }) {
1096
1445
  return () => document.removeEventListener("keydown", handleKeyDown);
1097
1446
  }, [isOverlayOpen, closeOverlay]);
1098
1447
  const [pendingItemId, setPendingItemId] = _react.useState.call(void 0, null);
1099
- const committedActiveId = _react.useMemo.call(void 0, () => _nullishCoalesce(_optionalChain([config, 'access', _70 => _70.items, 'access', _71 => _71.find, 'call', _72 => _72((item) => item.isActive), 'optionalAccess', _73 => _73.id]), () => ( null)), [config.items]);
1448
+ const committedActiveId = _react.useMemo.call(void 0, () => _nullishCoalesce(_optionalChain([config, 'access', _29 => _29.items, 'access', _30 => _30.find, 'call', _31 => _31((item) => item.isActive), 'optionalAccess', _32 => _32.id]), () => ( null)), [config.items]);
1100
1449
  const [pendingClearedFor, setPendingClearedFor] = _react.useState.call(void 0, committedActiveId);
1101
1450
  if (pendingClearedFor !== committedActiveId) {
1102
1451
  setPendingClearedFor(committedActiveId);
@@ -1104,7 +1453,7 @@ function NavigationSidebar({ config, disabled = false, pushOnTablet = false }) {
1104
1453
  }
1105
1454
  const handleItemClick = _react.useCallback.call(void 0,
1106
1455
  (item, event) => {
1107
- _optionalChain([event, 'optionalAccess', _74 => _74.stopPropagation, 'call', _75 => _75()]);
1456
+ _optionalChain([event, 'optionalAccess', _33 => _33.stopPropagation, 'call', _34 => _34()]);
1108
1457
  if (item.onClick) {
1109
1458
  item.onClick();
1110
1459
  if (isTablet) setTabletMinimized(true);
@@ -1113,7 +1462,7 @@ function NavigationSidebar({ config, disabled = false, pushOnTablet = false }) {
1113
1462
  if (!item.path) return;
1114
1463
  if (isModifiedClick(event)) return;
1115
1464
  if (config.onNavigate) {
1116
- _optionalChain([event, 'optionalAccess', _76 => _76.preventDefault, 'call', _77 => _77()]);
1465
+ _optionalChain([event, 'optionalAccess', _35 => _35.preventDefault, 'call', _36 => _36()]);
1117
1466
  if (item.id !== committedActiveId) setPendingItemId(item.id);
1118
1467
  config.onNavigate(item.path);
1119
1468
  }
@@ -1130,18 +1479,18 @@ function NavigationSidebar({ config, disabled = false, pushOnTablet = false }) {
1130
1479
  );
1131
1480
  const loadingRows = _react.useMemo.call(void 0, () => {
1132
1481
  if (!config.loading) return null;
1133
- const primary = _nullishCoalesce(_optionalChain([config, 'access', _78 => _78.loadingRows, 'optionalAccess', _79 => _79.primary]), () => ( 7));
1134
- const secondary = _nullishCoalesce(_optionalChain([config, 'access', _80 => _80.loadingRows, 'optionalAccess', _81 => _81.secondary]), () => ( 2));
1482
+ const primary = _nullishCoalesce(_optionalChain([config, 'access', _37 => _37.loadingRows, 'optionalAccess', _38 => _38.primary]), () => ( 7));
1483
+ const secondary = _nullishCoalesce(_optionalChain([config, 'access', _39 => _39.loadingRows, 'optionalAccess', _40 => _40.secondary]), () => ( 2));
1135
1484
  return {
1136
1485
  primary: Array.from({ length: Math.max(0, primary) }, (_, i) => `primary-${i}`),
1137
1486
  secondary: Array.from({ length: Math.max(0, secondary) }, (_, i) => `secondary-${i}`)
1138
1487
  };
1139
- }, [config.loading, _optionalChain([config, 'access', _82 => _82.loadingRows, 'optionalAccess', _83 => _83.primary]), _optionalChain([config, 'access', _84 => _84.loadingRows, 'optionalAccess', _85 => _85.secondary])]);
1488
+ }, [config.loading, _optionalChain([config, 'access', _41 => _41.loadingRows, 'optionalAccess', _42 => _42.primary]), _optionalChain([config, 'access', _43 => _43.loadingRows, 'optionalAccess', _44 => _44.secondary])]);
1140
1489
  const sidebarWidth = _react.useMemo.call(void 0, () => minimized ? `${MINIMIZED_WIDTH}px` : `${EXPANDED_WIDTH}px`, [minimized]);
1141
- _chunkRKV5B7EUcjs.useIsomorphicLayoutEffect.call(void 0, () => {
1490
+ _chunkLM7TXMLUcjs.useIsomorphicLayoutEffect.call(void 0, () => {
1142
1491
  document.documentElement.style.setProperty(NAVIGATION_SIDEBAR_WIDTH_VAR, sidebarWidth);
1143
1492
  }, [sidebarWidth]);
1144
- _chunkRKV5B7EUcjs.useIsomorphicLayoutEffect.call(void 0, () => {
1493
+ _chunkLM7TXMLUcjs.useIsomorphicLayoutEffect.call(void 0, () => {
1145
1494
  if (transitionsEnabled) return void 0;
1146
1495
  const id = requestAnimationFrame(() => {
1147
1496
  setTransitionsEnabled(true);
@@ -1193,7 +1542,7 @@ function NavigationSidebar({ config, disabled = false, pushOnTablet = false }) {
1193
1542
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, NavigationSidebarHeader, { minimized }),
1194
1543
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-1 flex-col justify-between overflow-y-auto py-4", children: [
1195
1544
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col", children: [
1196
- _optionalChain([config, 'access', _86 => _86.topSlot, 'optionalCall', _87 => _87({ minimized })]),
1545
+ _optionalChain([config, 'access', _45 => _45.topSlot, 'optionalCall', _46 => _46({ minimized })]),
1197
1546
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "nav", { className: "flex flex-col", "aria-label": "Primary navigation", "aria-busy": !!loadingRows, children: loadingRows ? loadingRows.primary.map((key) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, NavigationSidebarItemSkeleton, { showLabel }, key)) : primaryItems.map((item) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1198
1547
  NavigationSidebarItemButton,
1199
1548
  {
@@ -1252,18 +1601,18 @@ function HeaderGlobalSearch({
1252
1601
  };
1253
1602
  const handleSubmit = (e) => {
1254
1603
  e.preventDefault();
1255
- _optionalChain([onSubmit, 'optionalCall', _88 => _88(currentValue)]);
1604
+ _optionalChain([onSubmit, 'optionalCall', _47 => _47(currentValue)]);
1256
1605
  };
1257
1606
  const handleKeyDown = (e) => {
1258
1607
  if (e.key === "Enter") {
1259
- _optionalChain([onSubmit, 'optionalCall', _89 => _89(currentValue)]);
1608
+ _optionalChain([onSubmit, 'optionalCall', _48 => _48(currentValue)]);
1260
1609
  }
1261
1610
  };
1262
1611
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
1263
1612
  "form",
1264
1613
  {
1265
1614
  onSubmit: handleSubmit,
1266
- ..._chunkVESKITRQcjs.HUBSPOT_DO_NOT_COLLECT_FORM_PROPS,
1615
+ ..._chunkP42V6N34cjs.HUBSPOT_DO_NOT_COLLECT_FORM_PROPS,
1267
1616
  className: _chunk3ATAYP36cjs.cn.call(void 0,
1268
1617
  "flex h-full flex-1 items-center gap-2 px-3",
1269
1618
  // Transparent so the cell inherits the bar's background
@@ -1330,12 +1679,12 @@ function HeaderMingoButton({
1330
1679
  // Mobile, drawer open: the icon-only button doubles as the close
1331
1680
  // affordance, so swap the Mingo logo for an X. Match the other header
1332
1681
  // icons (e.g. notifications): secondary color, w-4 h-4 → md:w-6 h-6.
1333
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkN3COXDBHcjs.XmarkIcon, { className: "h-6 w-6 shrink-0 text-ods-text-secondary" })
1682
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVX4E6YSBcjs.XmarkIcon, { className: "h-6 w-6 shrink-0 text-ods-text-secondary" })
1334
1683
  ) : (
1335
1684
  // Outer frame follows the button's text color (currentColor); the eyes
1336
1685
  // and corner block are ODS cyan.
1337
1686
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1338
- _chunkX72J4ACLcjs.MingoIcon,
1687
+ _chunkLLSUVPQCcjs.MingoIcon,
1339
1688
  {
1340
1689
  color: "currentColor",
1341
1690
  eyesColor: "var(--ods-flamingo-cyan-base)",
@@ -1360,8 +1709,8 @@ function HeaderOrganizationFilter({
1360
1709
  className
1361
1710
  }) {
1362
1711
  const selectedOrg = organizations.find((o) => o.id === selectedOrgId);
1363
- const displayName = _optionalChain([selectedOrg, 'optionalAccess', _90 => _90.name]) || "All Organizations";
1364
- const deviceCount = _nullishCoalesce(_optionalChain([selectedOrg, 'optionalAccess', _91 => _91.deviceCount]), () => ( totalDeviceCount));
1712
+ const displayName = _optionalChain([selectedOrg, 'optionalAccess', _49 => _49.name]) || "All Organizations";
1713
+ const deviceCount = _nullishCoalesce(_optionalChain([selectedOrg, 'optionalAccess', _50 => _50.deviceCount]), () => ( totalDeviceCount));
1365
1714
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkBM5MVGH3cjs.DropdownMenu, { children: [
1366
1715
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBM5MVGH3cjs.DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
1367
1716
  "button",
@@ -1375,7 +1724,7 @@ function HeaderOrganizationFilter({
1375
1724
  className
1376
1725
  ),
1377
1726
  children: [
1378
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkN3COXDBHcjs.Filter02Icon, { className: "h-4 w-4 shrink-0 text-ods-text-secondary" }),
1727
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVX4E6YSBcjs.Filter02Icon, { className: "h-4 w-4 shrink-0 text-ods-text-secondary" }),
1379
1728
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex min-w-0 flex-col items-start justify-center", children: [
1380
1729
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "truncate text-ods-text-primary text-h5", title: displayName, children: displayName }),
1381
1730
  deviceCount !== void 0 && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "truncate text-ods-text-secondary text-h6", children: [
@@ -1387,12 +1736,45 @@ function HeaderOrganizationFilter({
1387
1736
  }
1388
1737
  ) }),
1389
1738
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkBM5MVGH3cjs.DropdownMenuContent, { align: "end", className: "min-w-[240px]", children: [
1390
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBM5MVGH3cjs.DropdownMenuItem, { onClick: () => _optionalChain([onOrgChange, 'optionalCall', _92 => _92("")]), children: "All Organizations" }),
1391
- organizations.map((org) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBM5MVGH3cjs.DropdownMenuItem, { onClick: () => _optionalChain([onOrgChange, 'optionalCall', _93 => _93(org.id)]), children: org.name }, org.id))
1739
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBM5MVGH3cjs.DropdownMenuItem, { onClick: () => _optionalChain([onOrgChange, 'optionalCall', _51 => _51("")]), children: "All Organizations" }),
1740
+ organizations.map((org) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBM5MVGH3cjs.DropdownMenuItem, { onClick: () => _optionalChain([onOrgChange, 'optionalCall', _52 => _52(org.id)]), children: org.name }, org.id))
1392
1741
  ] })
1393
1742
  ] });
1394
1743
  }
1395
1744
 
1745
+ // src/components/navigation/ticket-alerts-button.tsx
1746
+
1747
+ function TicketAlertsButton({ href, onNavigate, disabled, className }) {
1748
+ const live = _chunkOJLR5MEOcjs.useOptionalTicketLive.call(void 0, );
1749
+ if (!live || !live.authed || live.unreadTotal === 0) return null;
1750
+ const targetId = live.nextUnreadTicketId;
1751
+ const target = targetId ? _chunkP42V6N34cjs.buildTicketOpenHref.call(void 0, href, targetId) : href;
1752
+ const handleClick = () => {
1753
+ if (onNavigate) onNavigate(target);
1754
+ else window.location.assign(target);
1755
+ };
1756
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1757
+ _chunkP42V6N34cjs.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__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "relative inline-flex", children: [
1766
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVX4E6YSBcjs.LifeBuoyIcon, { className: "h-6 w-6" }),
1767
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkP42V6N34cjs.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: _chunk3ATAYP36cjs.cn.call(void 0, className)
1774
+ }
1775
+ );
1776
+ }
1777
+
1396
1778
  // src/components/navigation/app-header.tsx
1397
1779
 
1398
1780
  var AppHeader = _react2.default.memo(function AppHeaderImpl({
@@ -1425,7 +1807,7 @@ var AppHeader = _react2.default.memo(function AppHeaderImpl({
1425
1807
  loading = false,
1426
1808
  loadingActionCells
1427
1809
  }) {
1428
- const isMdUp = _nullishCoalesce(_chunkRKV5B7EUcjs.useMdUp.call(void 0, ), () => ( false));
1810
+ const isMdUp = _nullishCoalesce(_chunkLM7TXMLUcjs.useMdUp.call(void 0, ), () => ( false));
1429
1811
  if (loading) {
1430
1812
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1431
1813
  AppHeaderSkeleton,
@@ -1458,11 +1840,11 @@ var AppHeader = _react2.default.memo(function AppHeaderImpl({
1458
1840
  leading: (
1459
1841
  // Mobile: Burger Menu Button
1460
1842
  !isMdUp && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1461
- _chunkVESKITRQcjs.HeaderButton,
1843
+ _chunkP42V6N34cjs.HeaderButton,
1462
1844
  {
1463
1845
  onClick: onToggleMobileMenu,
1464
1846
  isActive: isMobileMenuOpen,
1465
- icon: isMobileMenuOpen ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkN3COXDBHcjs.XmarkIcon, { className: "h-6 w-6" }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkN3COXDBHcjs.Menu01Icon, { className: "h-6 w-6" }),
1847
+ icon: isMobileMenuOpen ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVX4E6YSBcjs.XmarkIcon, { className: "h-6 w-6" }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVX4E6YSBcjs.Menu01Icon, { className: "h-6 w-6" }),
1466
1848
  "aria-label": isMobileMenuOpen ? "Close menu" : "Open menu",
1467
1849
  "aria-expanded": isMobileMenuOpen,
1468
1850
  className: "border-r border-ods-border"
@@ -1471,20 +1853,20 @@ var AppHeader = _react2.default.memo(function AppHeaderImpl({
1471
1853
  ),
1472
1854
  logo: !isMdUp && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
1473
1855
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1474
- _chunkQZVSJF2Kcjs.OpenFrameLogo,
1856
+ _chunkLLSUVPQCcjs.OpenFrameLogo,
1475
1857
  {
1476
1858
  className: "h-6 w-6 shrink-0",
1477
1859
  upperPathColor: "var(--color-text-primary)",
1478
1860
  lowerPathColor: "var(--color-accent-primary)"
1479
1861
  }
1480
1862
  ),
1481
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkX72J4ACLcjs.OpenFrameText, { textColor: "var(--color-text-primary)", className: "h-4" })
1863
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLLSUVPQCcjs.OpenFrameText, { textColor: "var(--color-text-primary)", className: "h-4" })
1482
1864
  ] }),
1483
1865
  logoClassName: "gap-2",
1484
1866
  center: showSearch ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, HeaderGlobalSearch, { onSubmit: onSearch, className: _chunk3ATAYP36cjs.cn.call(void 0, "w-full", dimmedClass) }) : void 0,
1485
1867
  sideActions: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
1486
1868
  showSearch && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1487
- _chunkVESKITRQcjs.HeaderButton,
1869
+ _chunkP42V6N34cjs.HeaderButton,
1488
1870
  {
1489
1871
  icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk4GFNWALLcjs.SearchIcon, { className: "h-6 w-6" }),
1490
1872
  "aria-label": "Search",
@@ -1501,7 +1883,7 @@ var AppHeader = _react2.default.memo(function AppHeaderImpl({
1501
1883
  className: _chunk3ATAYP36cjs.cn.call(void 0, "hidden lg:flex", dimmedClass)
1502
1884
  }
1503
1885
  ),
1504
- showTimeTracker && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVESKITRQcjs.TimeTrackerHeaderButton, { disabled, className: _chunk3ATAYP36cjs.cn.call(void 0, cellDivider, dimmedClass) }),
1886
+ showTimeTracker && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkP42V6N34cjs.TimeTrackerHeaderButton, { disabled, className: _chunk3ATAYP36cjs.cn.call(void 0, cellDivider, dimmedClass) }),
1505
1887
  showNotifications && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1506
1888
  NotificationsHeaderButton,
1507
1889
  {
@@ -1521,10 +1903,10 @@ var AppHeader = _react2.default.memo(function AppHeaderImpl({
1521
1903
  ),
1522
1904
  isMdUp && showUser && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkBM5MVGH3cjs.DropdownMenu, { children: [
1523
1905
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBM5MVGH3cjs.DropdownMenuTrigger, { asChild: true, disabled, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1524
- _chunkVESKITRQcjs.HeaderButton,
1906
+ _chunkP42V6N34cjs.HeaderButton,
1525
1907
  {
1526
1908
  icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1527
- _chunkMMOODW57cjs.SquareAvatar,
1909
+ _chunk6NTPY5QAcjs.SquareAvatar,
1528
1910
  {
1529
1911
  src: userAvatarUrl || void 0,
1530
1912
  alt: userName || "User",
@@ -1550,7 +1932,7 @@ var AppHeader = _react2.default.memo(function AppHeaderImpl({
1550
1932
  children: [
1551
1933
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center gap-2 border-b border-ods-border bg-ods-card p-3", children: [
1552
1934
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1553
- _chunkMMOODW57cjs.SquareAvatar,
1935
+ _chunk6NTPY5QAcjs.SquareAvatar,
1554
1936
  {
1555
1937
  src: userAvatarUrl || void 0,
1556
1938
  alt: userName || "User",
@@ -1570,7 +1952,7 @@ var AppHeader = _react2.default.memo(function AppHeaderImpl({
1570
1952
  onClick: onProfile,
1571
1953
  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",
1572
1954
  children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center gap-2", children: [
1573
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkX72J4ACLcjs.UserIcon, { className: "h-6 w-6 shrink-0 text-ods-text-primary" }),
1955
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLLSUVPQCcjs.UserIcon, { className: "h-6 w-6 shrink-0 text-ods-text-primary" }),
1574
1956
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "text-ods-text-primary text-h4", children: "Profile Settings" })
1575
1957
  ] })
1576
1958
  }
@@ -1581,7 +1963,7 @@ var AppHeader = _react2.default.memo(function AppHeaderImpl({
1581
1963
  onClick: onLogout,
1582
1964
  className: "cursor-pointer rounded-none bg-ods-card px-3 py-3 hover:bg-ods-card/80 focus:bg-ods-card/80",
1583
1965
  children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center gap-2", children: [
1584
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkX72J4ACLcjs.LogOutIcon, { className: "shrink-0 text-ods-error", size: 24 }),
1966
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLLSUVPQCcjs.LogOutIcon, { className: "shrink-0 text-ods-error", size: 24 }),
1585
1967
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "text-ods-text-primary text-h4", children: "Log Out" })
1586
1968
  ] })
1587
1969
  }
@@ -1606,14 +1988,14 @@ var AppHeader = _react2.default.memo(function AppHeaderImpl({
1606
1988
  );
1607
1989
  });
1608
1990
  function NotificationsHeaderButton({ fallbackUnreadCount, disabled, dimmedClass }) {
1609
- const ctx = _chunkVESKITRQcjs.useOptionalNotifications.call(void 0, );
1610
- const hasUnread = (_nullishCoalesce(_optionalChain([ctx, 'optionalAccess', _94 => _94.unreadCount]), () => ( fallbackUnreadCount))) > 0;
1611
- const isActive = _nullishCoalesce(_optionalChain([ctx, 'optionalAccess', _95 => _95.isOpen]), () => ( false));
1612
- const onClick = _optionalChain([ctx, 'optionalAccess', _96 => _96.toggle]);
1991
+ const ctx = _chunkP42V6N34cjs.useOptionalNotifications.call(void 0, );
1992
+ const hasUnread = (_nullishCoalesce(_optionalChain([ctx, 'optionalAccess', _53 => _53.unreadCount]), () => ( fallbackUnreadCount))) > 0;
1993
+ const isActive = _nullishCoalesce(_optionalChain([ctx, 'optionalAccess', _54 => _54.isOpen]), () => ( false));
1994
+ const onClick = _optionalChain([ctx, 'optionalAccess', _55 => _55.toggle]);
1613
1995
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1614
- _chunkVESKITRQcjs.HeaderButton,
1996
+ _chunkP42V6N34cjs.HeaderButton,
1615
1997
  {
1616
- icon: isActive ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkN3COXDBHcjs.XmarkIcon, { className: "h-6 w-6" }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkN3COXDBHcjs.BellIcon, { className: "h-6 w-6" }),
1998
+ icon: isActive ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVX4E6YSBcjs.XmarkIcon, { className: "h-6 w-6" }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVX4E6YSBcjs.BellIcon, { className: "h-6 w-6" }),
1617
1999
  showUnreadDot: !isActive && hasUnread,
1618
2000
  "aria-label": isActive ? "Close notifications" : "Notifications",
1619
2001
  onClick,
@@ -1683,7 +2065,7 @@ function AppHeaderSkeleton({
1683
2065
 
1684
2066
  var SIDE_PANEL_INSET = 16;
1685
2067
  var SIDE_PANEL_FRAME_WIDTH = 2;
1686
- var MOBILE_QUERY = `not all and ${_chunkRKV5B7EUcjs.breakpoints.md}`;
2068
+ var MOBILE_QUERY = `not all and ${_chunkLM7TXMLUcjs.breakpoints.md}`;
1687
2069
  var REDUCED_MOTION_QUERY = "(prefers-reduced-motion: reduce)";
1688
2070
  var MORPH_MS = 300;
1689
2071
  var STORAGE_EVENT = "of:side-panel-size";
@@ -1759,13 +2141,13 @@ function useStoredSize(storageKey, fallback) {
1759
2141
  }
1760
2142
  function useAppLayoutSidePanel(config, row) {
1761
2143
  const enabled = config !== void 0;
1762
- const minWidth = _nullishCoalesce(_optionalChain([config, 'optionalAccess', _97 => _97.minWidth]), () => ( 0));
1763
- const minContentWidth = _nullishCoalesce(_optionalChain([config, 'optionalAccess', _98 => _98.minContentWidth]), () => ( 400));
1764
- const collapsed = _nullishCoalesce(_optionalChain([config, 'optionalAccess', _99 => _99.collapsed]), () => ( false));
2144
+ const minWidth = _nullishCoalesce(_optionalChain([config, 'optionalAccess', _56 => _56.minWidth]), () => ( 0));
2145
+ const minContentWidth = _nullishCoalesce(_optionalChain([config, 'optionalAccess', _57 => _57.minContentWidth]), () => ( 400));
2146
+ const collapsed = _nullishCoalesce(_optionalChain([config, 'optionalAccess', _58 => _58.collapsed]), () => ( false));
1765
2147
  const minimum = { width: minWidth, expanded: false };
1766
- const defaultWidth = Math.max(minWidth, _nullishCoalesce(_optionalChain([config, 'optionalAccess', _100 => _100.defaultWidth]), () => ( minWidth)));
2148
+ const defaultWidth = Math.max(minWidth, _nullishCoalesce(_optionalChain([config, 'optionalAccess', _59 => _59.defaultWidth]), () => ( minWidth)));
1767
2149
  const [rowWidth, setRowWidth] = _react.useState.call(void 0, 0);
1768
- _chunkRKV5B7EUcjs.useIsomorphicLayoutEffect.call(void 0, () => {
2150
+ _chunkLM7TXMLUcjs.useIsomorphicLayoutEffect.call(void 0, () => {
1769
2151
  if (!enabled || !row) return void 0;
1770
2152
  const update = () => setRowWidth(row.clientWidth);
1771
2153
  update();
@@ -1773,17 +2155,17 @@ function useAppLayoutSidePanel(config, row) {
1773
2155
  observer.observe(row);
1774
2156
  return () => observer.disconnect();
1775
2157
  }, [enabled, row]);
1776
- const isMobile = _chunkRKV5B7EUcjs.useMediaQuery.call(void 0, MOBILE_QUERY) === true;
1777
- const reduceMotion = _chunkRKV5B7EUcjs.useMediaQuery.call(void 0, REDUCED_MOTION_QUERY) === true;
2158
+ const isMobile = _chunkLM7TXMLUcjs.useMediaQuery.call(void 0, MOBILE_QUERY) === true;
2159
+ const reduceMotion = _chunkLM7TXMLUcjs.useMediaQuery.call(void 0, REDUCED_MOTION_QUERY) === true;
1778
2160
  const [morph, setMorph] = _react.useState.call(void 0, null);
1779
2161
  const [liveWidth, setLiveWidth] = _react.useState.call(void 0, null);
1780
- const [storedSize, setStoredSize] = useStoredSize(_optionalChain([config, 'optionalAccess', _101 => _101.storageKey]), { width: defaultWidth, expanded: false });
2162
+ const [storedSize, setStoredSize] = useStoredSize(_optionalChain([config, 'optionalAccess', _60 => _60.storageKey]), { width: defaultWidth, expanded: false });
1781
2163
  const [ownIsOpen, setOwnIsOpen] = _react.useState.call(void 0, false);
1782
- const isOpen = _nullishCoalesce(_optionalChain([config, 'optionalAccess', _102 => _102.open]), () => ( ownIsOpen));
1783
- const onOpenChange = _optionalChain([config, 'optionalAccess', _103 => _103.onOpenChange]);
2164
+ const isOpen = _nullishCoalesce(_optionalChain([config, 'optionalAccess', _61 => _61.open]), () => ( ownIsOpen));
2165
+ const onOpenChange = _optionalChain([config, 'optionalAccess', _62 => _62.onOpenChange]);
1784
2166
  const setIsOpen = (next) => {
1785
- if (_optionalChain([config, 'optionalAccess', _104 => _104.open]) === void 0) setOwnIsOpen(next);
1786
- _optionalChain([onOpenChange, 'optionalCall', _105 => _105(next)]);
2167
+ if (_optionalChain([config, 'optionalAccess', _63 => _63.open]) === void 0) setOwnIsOpen(next);
2168
+ _optionalChain([onOpenChange, 'optionalCall', _64 => _64(next)]);
1787
2169
  };
1788
2170
  const [collapsedSize, setCollapsedSize] = _react.useState.call(void 0, null);
1789
2171
  const [prevCollapsed, setPrevCollapsed] = _react.useState.call(void 0, collapsed);
@@ -1803,8 +2185,8 @@ function useAppLayoutSidePanel(config, row) {
1803
2185
  _react.useEffect.call(void 0, () => {
1804
2186
  const couldDock = prevCanDockRef.current;
1805
2187
  prevCanDockRef.current = layout.canDock;
1806
- if (!couldDock && layout.canDock && _optionalChain([config, 'optionalAccess', _106 => _106.open])) _optionalChain([onOpenChange, 'optionalCall', _107 => _107(false)]);
1807
- }, [layout.canDock, _optionalChain([config, 'optionalAccess', _108 => _108.open]), onOpenChange]);
2188
+ if (!couldDock && layout.canDock && _optionalChain([config, 'optionalAccess', _65 => _65.open])) _optionalChain([onOpenChange, 'optionalCall', _66 => _66(false)]);
2189
+ }, [layout.canDock, _optionalChain([config, 'optionalAccess', _67 => _67.open]), onOpenChange]);
1808
2190
  if (!enabled) return null;
1809
2191
  const animate = (next) => {
1810
2192
  if (!reduceMotion) setMorph(next);
@@ -1963,7 +2345,7 @@ function SidePanelResizeHandle({ state, label, controls }) {
1963
2345
  {
1964
2346
  "aria-hidden": true,
1965
2347
  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",
1966
- children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkN3COXDBHcjs.Menu01Icon, { size: 12 })
2348
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVX4E6YSBcjs.Menu01Icon, { size: 12 })
1967
2349
  }
1968
2350
  )
1969
2351
  }
@@ -2063,13 +2445,13 @@ var MobileBurgerMenu = _react2.default.memo(function MobileBurgerMenuImpl({
2063
2445
  }) {
2064
2446
  const panelRef = _react.useRef.call(void 0, null);
2065
2447
  _overlays.usePreventScroll.call(void 0, { isDisabled: !isOpen });
2066
- _chunk2QEUFXNScjs.useFocusTrap.call(void 0, panelRef, isOpen, { onEscape: onClose });
2448
+ _chunkWCVZCGK5cjs.useFocusTrap.call(void 0, panelRef, isOpen, { onEscape: onClose });
2067
2449
  const handleItemClick = _react.useCallback.call(void 0,
2068
2450
  (item) => {
2069
2451
  if (item.onClick) {
2070
2452
  item.onClick();
2071
2453
  } else if (item.path) {
2072
- _optionalChain([config, 'access', _109 => _109.onNavigate, 'optionalCall', _110 => _110(item.path)]);
2454
+ _optionalChain([config, 'access', _68 => _68.onNavigate, 'optionalCall', _69 => _69(item.path)]);
2073
2455
  }
2074
2456
  onClose();
2075
2457
  },
@@ -2128,7 +2510,7 @@ var MobileBurgerMenu = _react2.default.memo(function MobileBurgerMenuImpl({
2128
2510
  {
2129
2511
  className: _chunk3ATAYP36cjs.cn.call(void 0,
2130
2512
  "absolute inset-0 z-[100] md:hidden",
2131
- _chunk3MX5S4CFcjs.OVERLAY_BACKDROP_CLASS,
2513
+ _chunkSEXWHIMScjs.OVERLAY_BACKDROP_CLASS,
2132
2514
  "transition-all duration-300 motion-reduce:transition-none",
2133
2515
  isOpen ? "opacity-100" : "pointer-events-none opacity-0"
2134
2516
  ),
@@ -2169,7 +2551,7 @@ var MobileBurgerMenu = _react2.default.memo(function MobileBurgerMenuImpl({
2169
2551
  "aria-disabled": disabled || void 0,
2170
2552
  children: [
2171
2553
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
2172
- _chunkMMOODW57cjs.SquareAvatar,
2554
+ _chunk6NTPY5QAcjs.SquareAvatar,
2173
2555
  {
2174
2556
  src: user.userAvatarUrl || void 0,
2175
2557
  alt: user.userName || "User",
@@ -2187,13 +2569,13 @@ var MobileBurgerMenu = _react2.default.memo(function MobileBurgerMenuImpl({
2187
2569
  user.userEmail && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "truncate text-ods-text-secondary text-h6", children: user.userEmail })
2188
2570
  ] }),
2189
2571
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex shrink-0 items-center gap-2", children: [
2190
- onSearchUser && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkDFQYAYBHcjs.Button, { size: "icon", onClick: onSearchUser, variant: "outline", "aria-label": "Search users", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkN3COXDBHcjs.UserSearchIcon, { className: "size-4 text-ods-text-primary" }) }),
2191
- onEditProfile && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkDFQYAYBHcjs.Button, { size: "icon", onClick: onEditProfile, variant: "outline", "aria-label": "Edit profile", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkN3COXDBHcjs.PenEditIcon, { className: "size-4 text-ods-text-primary" }) })
2572
+ onSearchUser && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkDFQYAYBHcjs.Button, { size: "icon", onClick: onSearchUser, variant: "outline", "aria-label": "Search users", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVX4E6YSBcjs.UserSearchIcon, { className: "size-4 text-ods-text-primary" }) }),
2573
+ onEditProfile && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkDFQYAYBHcjs.Button, { size: "icon", onClick: onEditProfile, variant: "outline", "aria-label": "Edit profile", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVX4E6YSBcjs.PenEditIcon, { className: "size-4 text-ods-text-primary" }) })
2192
2574
  ] })
2193
2575
  ]
2194
2576
  }
2195
2577
  ),
2196
- _optionalChain([config, 'access', _111 => _111.topSlot, 'optionalCall', _112 => _112({ minimized: false })]),
2578
+ _optionalChain([config, 'access', _70 => _70.topSlot, 'optionalCall', _71 => _71({ minimized: false })]),
2197
2579
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "nav", { "aria-label": "Primary navigation", children: renderNavigationGrid(primaryItems) }),
2198
2580
  secondaryItems.length > 0 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "nav", { "aria-label": "Secondary navigation", className: "flex flex-col gap-3", children: secondaryItems.map((item) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _react2.default.Fragment, { children: renderNavigationItem(item, false) }, item.id)) }),
2199
2581
  onLogout && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
@@ -2207,7 +2589,7 @@ var MobileBurgerMenu = _react2.default.memo(function MobileBurgerMenuImpl({
2207
2589
  disabled && "cursor-not-allowed opacity-50"
2208
2590
  ),
2209
2591
  children: [
2210
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkN3COXDBHcjs.Logout02Icon, { className: "size-4 text-ods-error" }),
2592
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVX4E6YSBcjs.Logout02Icon, { className: "size-4 text-ods-error" }),
2211
2593
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "flex-1 text-left text-ods-text-primary text-h6", children: "Log Out" })
2212
2594
  ]
2213
2595
  }
@@ -2238,7 +2620,7 @@ function AppLayout({
2238
2620
  const [contentWidth, setContentWidth] = _react.useState.call(void 0, null);
2239
2621
  const hasSidePanel = sidePanel !== void 0;
2240
2622
  const sidePanelState = useAppLayoutSidePanel(sidePanel, drawerContainer);
2241
- _chunkRKV5B7EUcjs.useIsomorphicLayoutEffect.call(void 0, () => {
2623
+ _chunkLM7TXMLUcjs.useIsomorphicLayoutEffect.call(void 0, () => {
2242
2624
  if (!hasSidePanel || !mainElement) return void 0;
2243
2625
  const update = () => setContentWidth(mainElement.clientWidth);
2244
2626
  update();
@@ -2253,7 +2635,7 @@ function AppLayout({
2253
2635
  isMingoAIActive: sidePanelState.isOpen,
2254
2636
  mingoAICloseWhenActive: true
2255
2637
  };
2256
- const contentCovered = _optionalChain([sidePanelState, 'optionalAccess', _113 => _113.coversContent]) === true;
2638
+ const contentCovered = _optionalChain([sidePanelState, 'optionalAccess', _72 => _72.coversContent]) === true;
2257
2639
  const mobileMenuOpenRef = _react.useRef.call(void 0, mobileMenuOpen);
2258
2640
  _react.useEffect.call(void 0, () => {
2259
2641
  mobileMenuOpenRef.current = mobileMenuOpen;
@@ -2284,7 +2666,7 @@ function AppLayout({
2284
2666
  }),
2285
2667
  []
2286
2668
  );
2287
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVESKITRQcjs.AppLayoutDrawerContainerContext.Provider, { value: drawerContainer, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVESKITRQcjs.AppLayoutDrawerCoordinationContext.Provider, { value: drawerCoordination, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunk3ATAYP36cjs.cn.call(void 0, "flex h-screen flex-col bg-ods-bg", className), children: [
2669
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkP42V6N34cjs.AppLayoutDrawerContainerContext.Provider, { value: drawerContainer, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkP42V6N34cjs.AppLayoutDrawerCoordinationContext.Provider, { value: drawerCoordination, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunk3ATAYP36cjs.cn.call(void 0, "flex h-screen flex-col bg-ods-bg", className), children: [
2288
2670
  topBar,
2289
2671
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "relative flex min-h-0 flex-1", children: [
2290
2672
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, NavigationSidebar, { config: sidebarConfig, disabled, pushOnTablet: hasSidePanel }),
@@ -2308,7 +2690,7 @@ function AppLayout({
2308
2690
  disabled
2309
2691
  }
2310
2692
  ),
2311
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVESKITRQcjs.NotificationDrawer, {}),
2693
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkP42V6N34cjs.NotificationDrawer, {}),
2312
2694
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
2313
2695
  "div",
2314
2696
  {
@@ -2327,10 +2709,10 @@ function AppLayout({
2327
2709
  contentCovered && "hidden",
2328
2710
  // While the panel is drawn over the page, keep the page's own
2329
2711
  // z-indexed layers (sticky headers, fixed bars) under it.
2330
- _optionalChain([sidePanelState, 'optionalAccess', _114 => _114.overlapsContent]) && "isolate",
2712
+ _optionalChain([sidePanelState, 'optionalAccess', _73 => _73.overlapsContent]) && "isolate",
2331
2713
  mainClassName
2332
2714
  ),
2333
- children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkRKV5B7EUcjs.ContentAreaWidthContext.Provider, { value: contentWidth, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "ods-content-scope", children }) })
2715
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLM7TXMLUcjs.ContentAreaWidthContext.Provider, { value: contentWidth, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "ods-content-scope", children }) })
2334
2716
  }
2335
2717
  )
2336
2718
  ) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "main", { className: _chunk3ATAYP36cjs.cn.call(void 0, "flex-1 overflow-y-auto", mainClassName), children }),
@@ -2364,4 +2746,11 @@ function AppLayout({
2364
2746
 
2365
2747
 
2366
2748
 
2367
- exports.MingoAiButton = MingoAiButton; exports.MOBILE_NAV_PANEL_ID = MOBILE_NAV_PANEL_ID; exports.MobileNavPanel = MobileNavPanel; exports.TicketAlertsButton = TicketAlertsButton; exports.TopNavigation = TopNavigation; exports.Header = Header; exports.HeaderSkeleton = HeaderSkeleton; exports.ClientOnlyHeader = ClientOnlyHeader; exports.SlidingSidebar = SlidingSidebar; exports.NavigationItemBadge = NavigationItemBadge; exports.NAVIGATION_SIDEBAR_WIDTH_VAR = NAVIGATION_SIDEBAR_WIDTH_VAR; exports.NavigationSidebar = NavigationSidebar; exports.HeaderGlobalSearch = HeaderGlobalSearch; exports.HeaderMingoButton = HeaderMingoButton; exports.HeaderOrganizationFilter = HeaderOrganizationFilter; exports.AppHeader = AppHeader; exports.SIDE_PANEL_FRAME_WIDTH = SIDE_PANEL_FRAME_WIDTH; exports.MobileBurgerMenu = MobileBurgerMenu; exports.AppLayout = AppLayout;
2749
+
2750
+
2751
+
2752
+
2753
+
2754
+
2755
+
2756
+ exports.ASK_AI_OPEN_EVENT = ASK_AI_OPEN_EVENT; exports.openAskAi = openAskAi; exports.MingoAiButton = MingoAiButton; exports.MOBILE_NAV_SHEET_ID = MOBILE_NAV_SHEET_ID; exports.defaultRenderSiteNavLink = defaultRenderSiteNavLink; exports.navLinkLabel = navLinkLabel; exports.NavItemRow = NavItemRow; exports.isMegaMenu = isMegaMenu; exports.NavPanel = NavPanel; exports.TopNavigation = TopNavigation; exports.SiteHeader = SiteHeader; exports.siteNavHasMobileMenus = siteNavHasMobileMenus; exports.MobileNavSheet = MobileNavSheet; exports.SiteFooter = SiteFooter; exports.SlidingSidebar = SlidingSidebar; exports.NavigationItemBadge = NavigationItemBadge; exports.NAVIGATION_SIDEBAR_WIDTH_VAR = NAVIGATION_SIDEBAR_WIDTH_VAR; exports.NavigationSidebar = NavigationSidebar; exports.HeaderGlobalSearch = HeaderGlobalSearch; exports.HeaderMingoButton = HeaderMingoButton; exports.HeaderOrganizationFilter = HeaderOrganizationFilter; exports.TicketAlertsButton = TicketAlertsButton; exports.AppHeader = AppHeader; exports.SIDE_PANEL_FRAME_WIDTH = SIDE_PANEL_FRAME_WIDTH; exports.MobileBurgerMenu = MobileBurgerMenu; exports.AppLayout = AppLayout;