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