@otl-core/next-navigation 1.1.18 → 1.1.20
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/components/icons/chevron-icon.d.ts +10 -0
- package/dist/components/icons/chevron-icon.js +30 -0
- package/dist/components/icons/chevron-icon.js.map +1 -0
- package/dist/components/icons/grid-icon.d.ts +12 -0
- package/dist/components/icons/grid-icon.js +95 -0
- package/dist/components/icons/grid-icon.js.map +1 -0
- package/dist/components/icons/hamburger-icon.d.ts +12 -0
- package/dist/components/icons/hamburger-icon.js +78 -0
- package/dist/components/icons/hamburger-icon.js.map +1 -0
- package/dist/components/icons/kebab-icon.d.ts +12 -0
- package/dist/components/icons/kebab-icon.js +81 -0
- package/dist/components/icons/kebab-icon.js.map +1 -0
- package/dist/components/icons/meatballs-icon.d.ts +12 -0
- package/dist/components/icons/meatballs-icon.js +81 -0
- package/dist/components/icons/meatballs-icon.js.map +1 -0
- package/dist/components/icons/plus-icon.d.ts +12 -0
- package/dist/components/icons/plus-icon.js +64 -0
- package/dist/components/icons/plus-icon.js.map +1 -0
- package/dist/components/icons/toggle-icon-map.d.ts +14 -0
- package/dist/components/icons/toggle-icon-map.js +22 -0
- package/dist/components/icons/toggle-icon-map.js.map +1 -0
- package/dist/components/icons/toggle-icon.d.ts +14 -0
- package/dist/components/icons/toggle-icon.js +39 -0
- package/dist/components/icons/toggle-icon.js.map +1 -0
- package/dist/components/items/animated-toggle-icon.d.ts +15 -0
- package/dist/components/items/animated-toggle-icon.js +39 -0
- package/dist/components/items/animated-toggle-icon.js.map +1 -0
- package/dist/components/items/dropdown-content-item.d.ts +12 -0
- package/dist/components/items/dropdown-content-item.js +223 -0
- package/dist/components/items/dropdown-content-item.js.map +1 -0
- package/dist/components/items/logo.d.ts +11 -0
- package/dist/components/items/logo.js +42 -0
- package/dist/components/items/logo.js.map +1 -0
- package/dist/components/mobile/mobile-menu-toggle.d.ts +12 -0
- package/dist/components/mobile/mobile-menu-toggle.js +53 -0
- package/dist/components/mobile/mobile-menu-toggle.js.map +1 -0
- package/dist/components/mobile/navigation-header-wrapper.d.ts +11 -0
- package/dist/components/mobile/navigation-header-wrapper.js +15 -0
- package/dist/components/mobile/navigation-header-wrapper.js.map +1 -0
- package/dist/components/navigation/dropdown.d.ts +19 -0
- package/dist/components/navigation/dropdown.js +258 -0
- package/dist/components/navigation/dropdown.js.map +1 -0
- package/dist/components/navigation/header.d.ts +13 -0
- package/dist/components/navigation/header.js +305 -0
- package/dist/components/navigation/header.js.map +1 -0
- package/dist/components/navigation/navbar.d.ts +21 -0
- package/dist/components/navigation/navbar.js +66 -0
- package/dist/components/navigation/navbar.js.map +1 -0
- package/dist/components/sections/navbar-sections.d.ts +23 -0
- package/dist/components/sections/navbar-sections.js +103 -0
- package/dist/components/sections/navbar-sections.js.map +1 -0
- package/dist/components/sections/navigation-item.d.ts +13 -0
- package/dist/components/sections/navigation-item.js +171 -0
- package/dist/components/sections/navigation-item.js.map +1 -0
- package/dist/components/ui/button.d.ts +14 -0
- package/dist/components/ui/button.js +51 -0
- package/dist/components/ui/button.js.map +1 -0
- package/dist/context/navigation-context.d.ts +17 -0
- package/dist/context/navigation-context.js +93 -0
- package/dist/context/navigation-context.js.map +1 -0
- package/dist/index.d.ts +12 -86
- package/dist/index.js +19 -2077
- package/dist/index.js.map +1 -1
- package/dist/lib/footer.utils.d.ts +20 -0
- package/dist/lib/footer.utils.js +84 -0
- package/dist/lib/footer.utils.js.map +1 -0
- package/dist/lib/navigation.utils.d.ts +34 -0
- package/dist/lib/navigation.utils.js +387 -0
- package/dist/lib/navigation.utils.js.map +1 -0
- package/package.json +5 -5
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { getBreakpointValue } from "@otl-core/cms-utils";
|
|
4
|
+
import { useEffect, useMemo, useRef, useState } from "react";
|
|
5
|
+
import { CSSTransition } from "react-transition-group";
|
|
6
|
+
import { useNavigation } from "../../context/navigation-context";
|
|
7
|
+
import { resolveBorderToCSS, resolveColorsToCSS } from "@otl-core/style-utils";
|
|
8
|
+
import { DropdownContentItem } from "../items/dropdown-content-item";
|
|
9
|
+
function getDropdownTimeout(isMobileMenu) {
|
|
10
|
+
return isMobileMenu ? 300 : 200;
|
|
11
|
+
}
|
|
12
|
+
function getDropdownClassNames(isMobileMenu) {
|
|
13
|
+
return isMobileMenu ? "mobile-menu" : "desktop-dropdown";
|
|
14
|
+
}
|
|
15
|
+
function getDropdownZIndex(isSameLayer, layer) {
|
|
16
|
+
if (isSameLayer) return void 0;
|
|
17
|
+
return layer === "above" ? 9999 : void 0;
|
|
18
|
+
}
|
|
19
|
+
function NavigationDropdown({
|
|
20
|
+
itemId,
|
|
21
|
+
config,
|
|
22
|
+
navigation,
|
|
23
|
+
resolvedColors,
|
|
24
|
+
dropdownId,
|
|
25
|
+
site,
|
|
26
|
+
containerContent = false,
|
|
27
|
+
isSameLayer = false
|
|
28
|
+
}) {
|
|
29
|
+
const { activeDropdown } = useNavigation();
|
|
30
|
+
const [navigationStack, setNavigationStack] = useState([]);
|
|
31
|
+
const nodeRef = useRef(null);
|
|
32
|
+
const backButtonRef = useRef(null);
|
|
33
|
+
const isMobileMenu = useMemo(
|
|
34
|
+
() => itemId.startsWith("mobile-menu"),
|
|
35
|
+
[itemId]
|
|
36
|
+
);
|
|
37
|
+
const isOpen = useMemo(
|
|
38
|
+
() => activeDropdown === itemId,
|
|
39
|
+
[activeDropdown, itemId]
|
|
40
|
+
);
|
|
41
|
+
const content = useMemo(
|
|
42
|
+
() => config.content || [],
|
|
43
|
+
[config]
|
|
44
|
+
);
|
|
45
|
+
const prevIsOpen = useRef(isOpen);
|
|
46
|
+
if (prevIsOpen.current && !isOpen) {
|
|
47
|
+
setNavigationStack([]);
|
|
48
|
+
}
|
|
49
|
+
prevIsOpen.current = isOpen;
|
|
50
|
+
useEffect(() => {
|
|
51
|
+
if (navigationStack.length > 0 && backButtonRef.current) {
|
|
52
|
+
backButtonRef.current.focus();
|
|
53
|
+
}
|
|
54
|
+
}, [navigationStack.length]);
|
|
55
|
+
const handleNavigate = (contentId) => {
|
|
56
|
+
setNavigationStack((prev) => [...prev, contentId]);
|
|
57
|
+
};
|
|
58
|
+
const handleBack = () => {
|
|
59
|
+
setNavigationStack((prev) => prev.slice(0, -1));
|
|
60
|
+
};
|
|
61
|
+
const findDropdownById = (contentArray, id) => {
|
|
62
|
+
for (const item of contentArray) {
|
|
63
|
+
if (item.id === id && item.type === "dropdown") {
|
|
64
|
+
return item;
|
|
65
|
+
}
|
|
66
|
+
if (item.type === "section") {
|
|
67
|
+
const config2 = item.config;
|
|
68
|
+
const found = findDropdownById(config2.content, id);
|
|
69
|
+
if (found) return found;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return void 0;
|
|
73
|
+
};
|
|
74
|
+
const buildNavigationPanels = () => {
|
|
75
|
+
const panels2 = [];
|
|
76
|
+
panels2.push({ content, depth: 0 });
|
|
77
|
+
let currentContent = content;
|
|
78
|
+
for (let i = 0; i < navigationStack.length; i++) {
|
|
79
|
+
const contentId = navigationStack[i];
|
|
80
|
+
const dropdownItem = findDropdownById(currentContent, contentId);
|
|
81
|
+
if (dropdownItem && dropdownItem.config) {
|
|
82
|
+
const nestedContent = dropdownItem.config.content;
|
|
83
|
+
panels2.push({ content: nestedContent, depth: i + 1 });
|
|
84
|
+
currentContent = nestedContent;
|
|
85
|
+
} else {
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return panels2;
|
|
90
|
+
};
|
|
91
|
+
const panels = buildNavigationPanels();
|
|
92
|
+
const dropdownColors = resolveColorsToCSS({
|
|
93
|
+
dropdownMenuBackground: navigation.style?.dropdown?.background,
|
|
94
|
+
dropdownMenuLinkColor: navigation.style?.dropdown?.link?.color,
|
|
95
|
+
dropdownMenuLinkHoverColor: navigation.style?.dropdown?.link?.hoverColor,
|
|
96
|
+
dropdownMenuLinkHoverBackground: navigation.style?.dropdown?.link?.hoverBackground,
|
|
97
|
+
dropdownMenuTextColor: navigation.style?.dropdown?.textColor
|
|
98
|
+
});
|
|
99
|
+
const dropdownMenuBackground = dropdownColors.dropdownMenuBackground;
|
|
100
|
+
const dropdownMenuLinkColor = dropdownColors.dropdownMenuLinkColor;
|
|
101
|
+
const dropdownMenuLinkHoverColor = dropdownColors.dropdownMenuLinkHoverColor;
|
|
102
|
+
const dropdownMenuLinkHoverBackground = dropdownColors.dropdownMenuLinkHoverBackground || "transparent";
|
|
103
|
+
const dropdownMenuTextColor = dropdownColors.dropdownMenuTextColor;
|
|
104
|
+
const dropdownMenuBorder = useMemo(() => {
|
|
105
|
+
if (!navigation.style?.dropdown?.border) return void 0;
|
|
106
|
+
return resolveBorderToCSS(navigation.style.dropdown.border);
|
|
107
|
+
}, [navigation.style?.dropdown?.border]);
|
|
108
|
+
if (content.length === 0) return null;
|
|
109
|
+
const dropdownResolvedColors = {
|
|
110
|
+
...resolvedColors,
|
|
111
|
+
text: dropdownMenuTextColor || resolvedColors.text,
|
|
112
|
+
dropdownMenuLinkColor
|
|
113
|
+
};
|
|
114
|
+
const useSameLayerMode = isSameLayer && !isMobileMenu;
|
|
115
|
+
const dropdownStyles = {
|
|
116
|
+
backgroundColor: useSameLayerMode ? void 0 : dropdownMenuBackground,
|
|
117
|
+
color: dropdownMenuTextColor || dropdownMenuLinkColor,
|
|
118
|
+
...useSameLayerMode ? {} : dropdownMenuBorder
|
|
119
|
+
};
|
|
120
|
+
const linkHoverStyle = {
|
|
121
|
+
"--dropdown-link-hover-color": dropdownMenuLinkHoverColor,
|
|
122
|
+
"--dropdown-link-hover-background": dropdownMenuLinkHoverBackground
|
|
123
|
+
};
|
|
124
|
+
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(
|
|
125
|
+
CSSTransition,
|
|
126
|
+
{
|
|
127
|
+
in: isOpen,
|
|
128
|
+
nodeRef,
|
|
129
|
+
timeout: useSameLayerMode ? 250 : getDropdownTimeout(isMobileMenu),
|
|
130
|
+
classNames: useSameLayerMode ? "same-layer-dropdown" : getDropdownClassNames(isMobileMenu),
|
|
131
|
+
unmountOnExit: !useSameLayerMode,
|
|
132
|
+
children: /* @__PURE__ */ jsx(
|
|
133
|
+
"div",
|
|
134
|
+
{
|
|
135
|
+
ref: nodeRef,
|
|
136
|
+
className: `relative w-full navigation-dropdown-${dropdownId}`,
|
|
137
|
+
style: {
|
|
138
|
+
...dropdownStyles,
|
|
139
|
+
...useSameLayerMode ? { display: "grid", overflow: "hidden" } : { overflow: "hidden" },
|
|
140
|
+
zIndex: getDropdownZIndex(
|
|
141
|
+
useSameLayerMode,
|
|
142
|
+
navigation.style?.dropdown?.layer
|
|
143
|
+
),
|
|
144
|
+
marginTop: navigation.style?.dropdown?.offset?.y ? getBreakpointValue(navigation.style.dropdown.offset.y, "base") : "0",
|
|
145
|
+
marginLeft: navigation.style?.dropdown?.offset?.left ? getBreakpointValue(
|
|
146
|
+
navigation.style.dropdown.offset.left,
|
|
147
|
+
"base"
|
|
148
|
+
) : "0",
|
|
149
|
+
marginRight: navigation.style?.dropdown?.offset?.right ? getBreakpointValue(
|
|
150
|
+
navigation.style.dropdown.offset.right,
|
|
151
|
+
"base"
|
|
152
|
+
) : "0"
|
|
153
|
+
},
|
|
154
|
+
children: /* @__PURE__ */ jsx(
|
|
155
|
+
"div",
|
|
156
|
+
{
|
|
157
|
+
style: useSameLayerMode ? { overflow: "hidden", minHeight: 0 } : void 0,
|
|
158
|
+
children: /* @__PURE__ */ jsx(
|
|
159
|
+
"div",
|
|
160
|
+
{
|
|
161
|
+
style: {
|
|
162
|
+
display: "flex",
|
|
163
|
+
width: "100%",
|
|
164
|
+
transform: `translateX(-${navigationStack.length * 100}%)`,
|
|
165
|
+
transition: "transform 300ms ease-in-out"
|
|
166
|
+
},
|
|
167
|
+
children: panels.map((panel, panelIndex) => {
|
|
168
|
+
const isActive = panelIndex === navigationStack.length;
|
|
169
|
+
const isToRight = panelIndex > navigationStack.length;
|
|
170
|
+
const panelContent = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
171
|
+
panel.depth > 0 && /* @__PURE__ */ jsxs(
|
|
172
|
+
"button",
|
|
173
|
+
{
|
|
174
|
+
ref: panelIndex === navigationStack.length ? backButtonRef : null,
|
|
175
|
+
onClick: (e) => {
|
|
176
|
+
e.preventDefault();
|
|
177
|
+
handleBack();
|
|
178
|
+
},
|
|
179
|
+
type: "button",
|
|
180
|
+
"data-navigation-internal": "true",
|
|
181
|
+
className: "flex items-center px-3 py-2 text-sm rounded-md transition-colors mb-2",
|
|
182
|
+
style: {
|
|
183
|
+
color: resolvedColors.dropdownMenuLinkColor || resolvedColors.linkColor
|
|
184
|
+
},
|
|
185
|
+
children: [
|
|
186
|
+
/* @__PURE__ */ jsx(
|
|
187
|
+
"svg",
|
|
188
|
+
{
|
|
189
|
+
width: "16",
|
|
190
|
+
height: "16",
|
|
191
|
+
viewBox: "0 0 24 24",
|
|
192
|
+
fill: "none",
|
|
193
|
+
stroke: "currentColor",
|
|
194
|
+
strokeWidth: "2",
|
|
195
|
+
className: "mr-2",
|
|
196
|
+
children: /* @__PURE__ */ jsx("polyline", { points: "15 18 9 12 15 6" })
|
|
197
|
+
}
|
|
198
|
+
),
|
|
199
|
+
"Back"
|
|
200
|
+
]
|
|
201
|
+
}
|
|
202
|
+
),
|
|
203
|
+
/* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-4", children: panel.content?.map((item) => {
|
|
204
|
+
if (item.type === "section") {
|
|
205
|
+
return /* @__PURE__ */ jsx("div", { className: "flex-1 min-w-[200px]", children: /* @__PURE__ */ jsx(
|
|
206
|
+
DropdownContentItem,
|
|
207
|
+
{
|
|
208
|
+
content: item,
|
|
209
|
+
resolvedColors: dropdownResolvedColors,
|
|
210
|
+
onNavigate: handleNavigate,
|
|
211
|
+
navigation,
|
|
212
|
+
site
|
|
213
|
+
}
|
|
214
|
+
) }, item.id);
|
|
215
|
+
}
|
|
216
|
+
return /* @__PURE__ */ jsx("div", { className: "w-full", children: /* @__PURE__ */ jsx(
|
|
217
|
+
DropdownContentItem,
|
|
218
|
+
{
|
|
219
|
+
content: item,
|
|
220
|
+
resolvedColors: dropdownResolvedColors,
|
|
221
|
+
onNavigate: handleNavigate,
|
|
222
|
+
navigation,
|
|
223
|
+
site
|
|
224
|
+
}
|
|
225
|
+
) }, item.id);
|
|
226
|
+
}) })
|
|
227
|
+
] });
|
|
228
|
+
return /* @__PURE__ */ jsx(
|
|
229
|
+
"nav",
|
|
230
|
+
{
|
|
231
|
+
className: `flex flex-col p-2 dropdown-content-${dropdownId}`,
|
|
232
|
+
style: {
|
|
233
|
+
...linkHoverStyle,
|
|
234
|
+
width: "100%",
|
|
235
|
+
flexShrink: 0,
|
|
236
|
+
transform: isToRight ? "translateX(30px)" : "translateX(0)",
|
|
237
|
+
opacity: isActive ? 1 : 0.95,
|
|
238
|
+
transition: "transform 300ms ease-in-out, opacity 300ms ease-in-out"
|
|
239
|
+
},
|
|
240
|
+
inert: !isActive ? true : void 0,
|
|
241
|
+
children: containerContent ? /* @__PURE__ */ jsx("div", { className: "container mx-auto", children: panelContent }) : panelContent
|
|
242
|
+
},
|
|
243
|
+
panelIndex
|
|
244
|
+
);
|
|
245
|
+
})
|
|
246
|
+
}
|
|
247
|
+
)
|
|
248
|
+
}
|
|
249
|
+
)
|
|
250
|
+
}
|
|
251
|
+
)
|
|
252
|
+
}
|
|
253
|
+
) });
|
|
254
|
+
}
|
|
255
|
+
export {
|
|
256
|
+
NavigationDropdown
|
|
257
|
+
};
|
|
258
|
+
//# sourceMappingURL=dropdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/navigation/dropdown.tsx"],"sourcesContent":["\"use client\";\n\nimport type {\n Site,\n HeaderConfig,\n HeaderDropdownGroupConfig,\n HeaderNavigationItemConfig,\n HeaderNavigationItemDropdownConfig,\n} from \"@otl-core/cms-types\";\nimport { HeaderDropdownContent } from \"@otl-core/cms-types\";\nimport { getBreakpointValue } from \"@otl-core/cms-utils\";\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { CSSTransition } from \"react-transition-group\";\nimport { useNavigation } from \"../../context/navigation-context\";\nimport { resolveBorderToCSS, resolveColorsToCSS } from \"@otl-core/style-utils\";\nimport { DropdownContentItem } from \"../items/dropdown-content-item\";\n\nfunction getDropdownTimeout(isMobileMenu: boolean): number {\n return isMobileMenu ? 300 : 200;\n}\n\nfunction getDropdownClassNames(isMobileMenu: boolean): string {\n return isMobileMenu ? \"mobile-menu\" : \"desktop-dropdown\";\n}\n\nfunction getDropdownZIndex(\n isSameLayer: boolean,\n layer?: string,\n): number | undefined {\n if (isSameLayer) return undefined;\n return layer === \"above\" ? 9999 : undefined;\n}\n\ninterface NavigationDropdownProps {\n itemId: string;\n config: HeaderNavigationItemConfig;\n navigation: HeaderConfig;\n resolvedColors: Record<string, string | undefined>;\n styles: React.CSSProperties;\n linkStyle: React.CSSProperties;\n dropdownId: string;\n site: Site;\n containerContent?: boolean;\n isSameLayer?: boolean;\n}\nexport function NavigationDropdown({\n itemId,\n config,\n navigation,\n resolvedColors,\n dropdownId,\n site,\n containerContent = false,\n isSameLayer = false,\n}: NavigationDropdownProps) {\n const { activeDropdown } = useNavigation();\n const [navigationStack, setNavigationStack] = useState<string[]>([]);\n const nodeRef = useRef(null);\n const backButtonRef = useRef<HTMLButtonElement>(null);\n\n const isMobileMenu = useMemo(\n () => itemId.startsWith(\"mobile-menu\"),\n [itemId],\n );\n const isOpen = useMemo(\n () => activeDropdown === itemId,\n [activeDropdown, itemId],\n );\n const content: HeaderDropdownContent[] = useMemo(\n () => (config as HeaderNavigationItemDropdownConfig).content || [],\n [config],\n );\n\n // Reset nested content when dropdown closes (derived during render, no effect needed)\n const prevIsOpen = useRef(isOpen);\n if (prevIsOpen.current && !isOpen) {\n setNavigationStack([]);\n }\n prevIsOpen.current = isOpen;\n\n // Focus back button when navigating to nested content (DOM side effect, needs useEffect)\n useEffect(() => {\n if (navigationStack.length > 0 && backButtonRef.current) {\n backButtonRef.current.focus();\n }\n }, [navigationStack.length]);\n\n const handleNavigate = (contentId: string) => {\n setNavigationStack((prev) => [...prev, contentId]);\n };\n\n const handleBack = () => {\n setNavigationStack((prev) => prev.slice(0, -1));\n };\n\n // Helper to recursively find a dropdown by ID in content (including inside sections)\n const findDropdownById = (\n contentArray: HeaderDropdownContent[],\n id: string,\n ): HeaderDropdownContent | undefined => {\n for (const item of contentArray) {\n if (item.id === id && item.type === \"dropdown\") {\n return item;\n }\n // Search inside sections\n if (item.type === \"section\") {\n const config = item.config as HeaderDropdownGroupConfig;\n const found = findDropdownById(config.content, id);\n if (found) return found;\n }\n }\n return undefined;\n };\n\n // Build the navigation panels based on the stack\n const buildNavigationPanels = () => {\n const panels: Array<{\n content: HeaderDropdownContent[];\n depth: number;\n }> = [];\n\n // Root panel\n panels.push({ content: content, depth: 0 });\n\n // Build nested panels\n let currentContent = content;\n for (let i = 0; i < navigationStack.length; i++) {\n const contentId = navigationStack[i];\n const dropdownItem = findDropdownById(currentContent, contentId);\n\n if (dropdownItem && dropdownItem.config) {\n const nestedContent = (\n dropdownItem.config as HeaderNavigationItemDropdownConfig\n ).content;\n panels.push({ content: nestedContent, depth: i + 1 });\n currentContent = nestedContent;\n } else {\n break;\n }\n }\n\n return panels;\n };\n\n const panels = buildNavigationPanels();\n\n // Use the same color resolution as the rest of the system\n const dropdownColors = resolveColorsToCSS({\n dropdownMenuBackground: navigation.style?.dropdown?.background,\n dropdownMenuLinkColor: navigation.style?.dropdown?.link?.color,\n dropdownMenuLinkHoverColor: navigation.style?.dropdown?.link?.hoverColor,\n dropdownMenuLinkHoverBackground:\n navigation.style?.dropdown?.link?.hoverBackground,\n dropdownMenuTextColor: navigation.style?.dropdown?.textColor,\n });\n\n const dropdownMenuBackground = dropdownColors.dropdownMenuBackground;\n const dropdownMenuLinkColor = dropdownColors.dropdownMenuLinkColor;\n const dropdownMenuLinkHoverColor = dropdownColors.dropdownMenuLinkHoverColor;\n const dropdownMenuLinkHoverBackground =\n dropdownColors.dropdownMenuLinkHoverBackground || \"transparent\";\n const dropdownMenuTextColor = dropdownColors.dropdownMenuTextColor;\n\n const dropdownMenuBorder = useMemo(() => {\n if (!navigation.style?.dropdown?.border) return undefined;\n return resolveBorderToCSS(navigation.style.dropdown.border);\n }, [navigation.style?.dropdown?.border]);\n\n // Shadow is now handled via responsive CSS generation (generateResponsiveSpacingCSS)\n\n // Early return AFTER all hooks\n if (content.length === 0) return null;\n\n // Enhanced resolved colors for dropdown, using dropdown-specific text color if available\n const dropdownResolvedColors = {\n ...resolvedColors,\n text: dropdownMenuTextColor || resolvedColors.text,\n dropdownMenuLinkColor,\n };\n\n const useSameLayerMode = isSameLayer && !isMobileMenu;\n\n const dropdownStyles: React.CSSProperties = {\n backgroundColor: useSameLayerMode ? undefined : dropdownMenuBackground,\n color: dropdownMenuTextColor || dropdownMenuLinkColor,\n ...(useSameLayerMode ? {} : dropdownMenuBorder),\n };\n\n const linkHoverStyle = {\n \"--dropdown-link-hover-color\": dropdownMenuLinkHoverColor,\n \"--dropdown-link-hover-background\": dropdownMenuLinkHoverBackground,\n } as React.CSSProperties;\n\n return (\n <>\n <CSSTransition\n in={isOpen}\n nodeRef={nodeRef}\n timeout={useSameLayerMode ? 250 : getDropdownTimeout(isMobileMenu)}\n classNames={\n useSameLayerMode\n ? \"same-layer-dropdown\"\n : getDropdownClassNames(isMobileMenu)\n }\n unmountOnExit={!useSameLayerMode}\n >\n <div\n ref={nodeRef}\n className={`relative w-full navigation-dropdown-${dropdownId}`}\n style={{\n ...dropdownStyles,\n ...(useSameLayerMode\n ? { display: \"grid\", overflow: \"hidden\" }\n : { overflow: \"hidden\" }),\n zIndex: getDropdownZIndex(\n useSameLayerMode,\n navigation.style?.dropdown?.layer,\n ),\n marginTop: navigation.style?.dropdown?.offset?.y\n ? getBreakpointValue(navigation.style.dropdown.offset.y, \"base\")\n : \"0\",\n marginLeft: navigation.style?.dropdown?.offset?.left\n ? getBreakpointValue(\n navigation.style.dropdown.offset.left,\n \"base\",\n )\n : \"0\",\n marginRight: navigation.style?.dropdown?.offset?.right\n ? getBreakpointValue(\n navigation.style.dropdown.offset.right,\n \"base\",\n )\n : \"0\",\n }}\n >\n <div\n style={\n useSameLayerMode\n ? { overflow: \"hidden\", minHeight: 0 }\n : undefined\n }\n >\n <div\n style={{\n display: \"flex\",\n width: \"100%\",\n transform: `translateX(-${navigationStack.length * 100}%)`,\n transition: \"transform 300ms ease-in-out\",\n }}\n >\n {panels.map((panel, panelIndex) => {\n const isActive = panelIndex === navigationStack.length;\n const isToRight = panelIndex > navigationStack.length;\n\n const panelContent = (\n <>\n {panel.depth > 0 && (\n <button\n ref={\n panelIndex === navigationStack.length\n ? backButtonRef\n : null\n }\n onClick={(e) => {\n e.preventDefault();\n handleBack();\n }}\n type=\"button\"\n data-navigation-internal=\"true\"\n className=\"flex items-center px-3 py-2 text-sm rounded-md transition-colors mb-2\"\n style={{\n color:\n resolvedColors.dropdownMenuLinkColor ||\n resolvedColors.linkColor,\n }}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className=\"mr-2\"\n >\n <polyline points=\"15 18 9 12 15 6\" />\n </svg>\n Back\n </button>\n )}\n\n <div className=\"flex flex-wrap gap-4\">\n {panel.content?.map((item: HeaderDropdownContent) => {\n if (item.type === \"section\") {\n return (\n <div key={item.id} className=\"flex-1 min-w-[200px]\">\n <DropdownContentItem\n content={item}\n resolvedColors={dropdownResolvedColors}\n onNavigate={handleNavigate}\n navigation={navigation}\n site={site}\n />\n </div>\n );\n }\n return (\n <div key={item.id} className=\"w-full\">\n <DropdownContentItem\n content={item}\n resolvedColors={dropdownResolvedColors}\n onNavigate={handleNavigate}\n navigation={navigation}\n site={site}\n />\n </div>\n );\n })}\n </div>\n </>\n );\n\n return (\n <nav\n key={panelIndex}\n className={`flex flex-col p-2 dropdown-content-${dropdownId}`}\n style={{\n ...linkHoverStyle,\n width: \"100%\",\n flexShrink: 0,\n transform: isToRight\n ? \"translateX(30px)\"\n : \"translateX(0)\",\n opacity: isActive ? 1 : 0.95,\n transition:\n \"transform 300ms ease-in-out, opacity 300ms ease-in-out\",\n }}\n inert={!isActive ? true : undefined}\n >\n {containerContent ? (\n <div className=\"container mx-auto\">{panelContent}</div>\n ) : (\n panelContent\n )}\n </nav>\n );\n })}\n </div>\n </div>\n </div>\n </CSSTransition>\n </>\n );\n}\n"],"mappings":"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","names":["config","panels"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { HeaderConfig, Site } from '@otl-core/cms-types';
|
|
2
|
+
import React__default from 'react';
|
|
3
|
+
|
|
4
|
+
interface NavigationHeaderProps {
|
|
5
|
+
navigation: HeaderConfig;
|
|
6
|
+
site: Site;
|
|
7
|
+
className?: string;
|
|
8
|
+
siteName?: string;
|
|
9
|
+
id?: string;
|
|
10
|
+
}
|
|
11
|
+
declare const Header: React__default.FC<NavigationHeaderProps>;
|
|
12
|
+
|
|
13
|
+
export { Header };
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { NavigationProvider } from "../../context/navigation-context";
|
|
3
|
+
import {
|
|
4
|
+
cn,
|
|
5
|
+
resolveColorToCSS,
|
|
6
|
+
resolveColorsToCSS
|
|
7
|
+
} from "@otl-core/style-utils";
|
|
8
|
+
import {
|
|
9
|
+
calculateNavigationWidth,
|
|
10
|
+
generateNavigationCSS,
|
|
11
|
+
getBreakpointForWidth,
|
|
12
|
+
sectionsToDropdownContent
|
|
13
|
+
} from "../../lib/navigation.utils";
|
|
14
|
+
import { NavigationHeaderWrapper } from "../mobile/navigation-header-wrapper";
|
|
15
|
+
import { NavigationDropdown } from "./dropdown";
|
|
16
|
+
import { Navbar } from "./navbar";
|
|
17
|
+
const SHOW_CLASSES = {
|
|
18
|
+
sm: "hidden sm:flex",
|
|
19
|
+
md: "hidden md:flex",
|
|
20
|
+
lg: "hidden lg:flex",
|
|
21
|
+
xl: "hidden xl:flex",
|
|
22
|
+
"2xl": "hidden 2xl:flex"
|
|
23
|
+
};
|
|
24
|
+
const HIDE_CLASSES = {
|
|
25
|
+
sm: "sm:hidden",
|
|
26
|
+
md: "md:hidden",
|
|
27
|
+
lg: "lg:hidden",
|
|
28
|
+
xl: "xl:hidden",
|
|
29
|
+
"2xl": "2xl:hidden"
|
|
30
|
+
};
|
|
31
|
+
const Header = ({
|
|
32
|
+
navigation,
|
|
33
|
+
site = {
|
|
34
|
+
default_locale: "en",
|
|
35
|
+
supported_locales: ["en"]
|
|
36
|
+
},
|
|
37
|
+
className = "",
|
|
38
|
+
siteName: _siteName = "Logo",
|
|
39
|
+
id = "default"
|
|
40
|
+
}) => {
|
|
41
|
+
const isFixed = navigation.style?.position === "fixed";
|
|
42
|
+
const containerBehavior = navigation.style?.container || "edged";
|
|
43
|
+
const safeZone = navigation.style?.safeZone;
|
|
44
|
+
const safeZoneHeight = typeof safeZone === "object" && "base" in safeZone ? safeZone.base : safeZone || "0";
|
|
45
|
+
const estimatedWidth = calculateNavigationWidth(
|
|
46
|
+
navigation.sections || [],
|
|
47
|
+
site
|
|
48
|
+
);
|
|
49
|
+
const breakpoint = getBreakpointForWidth(estimatedWidth);
|
|
50
|
+
const styleType = navigation.style?.type || "default";
|
|
51
|
+
const showClass = breakpoint ? SHOW_CLASSES[breakpoint] : "";
|
|
52
|
+
const hideClass = breakpoint ? HIDE_CLASSES[breakpoint] : "";
|
|
53
|
+
const resolvedColors = navigation.style ? {
|
|
54
|
+
...resolveColorsToCSS(
|
|
55
|
+
Object.fromEntries(
|
|
56
|
+
Object.entries(navigation.style).filter(
|
|
57
|
+
([key]) => key !== "type" && key !== "position" && key !== "container" && key !== "safeZone" && key !== "layout" && key !== "border" && key !== "shadow" && key !== "link" && key !== "burger" && key !== "dropdown" && key !== "background" && key !== "text"
|
|
58
|
+
)
|
|
59
|
+
)
|
|
60
|
+
),
|
|
61
|
+
// Manually resolve background and text colors
|
|
62
|
+
background: resolveColorToCSS(navigation.style.background),
|
|
63
|
+
text: resolveColorToCSS(navigation.style.text),
|
|
64
|
+
// Manually resolve link colors
|
|
65
|
+
linkColor: resolveColorToCSS(navigation.style.link?.color),
|
|
66
|
+
linkHoverColor: resolveColorToCSS(navigation.style.link?.hoverColor),
|
|
67
|
+
// Manually resolve burger colors
|
|
68
|
+
burgerButtonBackground: resolveColorToCSS(
|
|
69
|
+
navigation.style.burger?.button?.background
|
|
70
|
+
),
|
|
71
|
+
burgerButtonBackgroundHover: resolveColorToCSS(
|
|
72
|
+
navigation.style.burger?.button?.backgroundHover
|
|
73
|
+
),
|
|
74
|
+
burgerIconColor: resolveColorToCSS(
|
|
75
|
+
navigation.style.burger?.icon?.color
|
|
76
|
+
),
|
|
77
|
+
burgerIconHover: resolveColorToCSS(
|
|
78
|
+
navigation.style.burger?.icon?.hoverColor
|
|
79
|
+
)
|
|
80
|
+
} : {};
|
|
81
|
+
const headerStyles = {
|
|
82
|
+
...resolvedColors.background && {
|
|
83
|
+
backgroundColor: resolvedColors.background
|
|
84
|
+
},
|
|
85
|
+
...resolvedColors.text && {
|
|
86
|
+
color: resolvedColors.text
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
const linkStyle = {
|
|
90
|
+
...resolvedColors.linkColor && { color: resolvedColors.linkColor }
|
|
91
|
+
};
|
|
92
|
+
const marginValue = typeof navigation.style?.layout?.margin === "object" && "base" in navigation.style.layout.margin ? navigation.style.layout.margin.base : navigation.style?.layout?.margin || "0";
|
|
93
|
+
const sortedSections = [...navigation.sections || []].sort(
|
|
94
|
+
(a, b) => a.order - b.order
|
|
95
|
+
);
|
|
96
|
+
let togglerSectionId = navigation.togglerSectionId;
|
|
97
|
+
if (togglerSectionId === "none") {
|
|
98
|
+
togglerSectionId = "";
|
|
99
|
+
} else if (!togglerSectionId) {
|
|
100
|
+
const hasContent = sortedSections.some(
|
|
101
|
+
(section) => section.items?.some((item) => item.type !== "logo")
|
|
102
|
+
);
|
|
103
|
+
if (hasContent) {
|
|
104
|
+
const nonLogoSections = sortedSections.filter(
|
|
105
|
+
(section) => !section.items?.some(
|
|
106
|
+
(item) => item.type === "logo"
|
|
107
|
+
)
|
|
108
|
+
);
|
|
109
|
+
if (nonLogoSections.length > 0) {
|
|
110
|
+
togglerSectionId = nonLogoSections[nonLogoSections.length - 1].id;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
const dropdownItems = [];
|
|
115
|
+
sortedSections.forEach((section) => {
|
|
116
|
+
section.items?.forEach((item) => {
|
|
117
|
+
if (item.type === "dropdown") {
|
|
118
|
+
dropdownItems.push({
|
|
119
|
+
item,
|
|
120
|
+
config: item.config || {}
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
const dropdownIds = [
|
|
126
|
+
`mobile-menu-${id}`,
|
|
127
|
+
...(dropdownItems || []).map((d) => d.item.id)
|
|
128
|
+
];
|
|
129
|
+
const styles = generateNavigationCSS(
|
|
130
|
+
id,
|
|
131
|
+
navigation,
|
|
132
|
+
resolvedColors,
|
|
133
|
+
dropdownIds
|
|
134
|
+
);
|
|
135
|
+
const isSameLayer = navigation.style?.dropdown?.layer === "same";
|
|
136
|
+
if (styleType === "minimal") {
|
|
137
|
+
const navbarAndDropdowns = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
138
|
+
/* @__PURE__ */ jsx(
|
|
139
|
+
Navbar,
|
|
140
|
+
{
|
|
141
|
+
id,
|
|
142
|
+
className,
|
|
143
|
+
headerStyles: isSameLayer ? {} : headerStyles,
|
|
144
|
+
sortedSections,
|
|
145
|
+
navigation,
|
|
146
|
+
resolvedColors,
|
|
147
|
+
togglerSectionId: togglerSectionId || "navbar",
|
|
148
|
+
itemsShowClass: "hidden",
|
|
149
|
+
togglerHideClass: "",
|
|
150
|
+
site,
|
|
151
|
+
mobileMenuId: `mobile-menu-${id}`,
|
|
152
|
+
containerContent: containerBehavior === "edged",
|
|
153
|
+
isSameLayer
|
|
154
|
+
}
|
|
155
|
+
),
|
|
156
|
+
/* @__PURE__ */ jsx(
|
|
157
|
+
NavigationDropdown,
|
|
158
|
+
{
|
|
159
|
+
itemId: `mobile-menu-${id}`,
|
|
160
|
+
config: { content: sectionsToDropdownContent(sortedSections) },
|
|
161
|
+
navigation,
|
|
162
|
+
resolvedColors,
|
|
163
|
+
styles: headerStyles,
|
|
164
|
+
linkStyle,
|
|
165
|
+
dropdownId: `mobile-menu-${id}`,
|
|
166
|
+
site,
|
|
167
|
+
containerContent: containerBehavior === "edged",
|
|
168
|
+
isSameLayer
|
|
169
|
+
}
|
|
170
|
+
),
|
|
171
|
+
dropdownItems?.map(({ item, config }) => /* @__PURE__ */ jsx(
|
|
172
|
+
NavigationDropdown,
|
|
173
|
+
{
|
|
174
|
+
itemId: item.id,
|
|
175
|
+
config,
|
|
176
|
+
navigation,
|
|
177
|
+
resolvedColors,
|
|
178
|
+
styles: headerStyles,
|
|
179
|
+
linkStyle,
|
|
180
|
+
dropdownId: item.id,
|
|
181
|
+
site,
|
|
182
|
+
containerContent: containerBehavior === "edged",
|
|
183
|
+
isSameLayer
|
|
184
|
+
},
|
|
185
|
+
item.id
|
|
186
|
+
))
|
|
187
|
+
] });
|
|
188
|
+
const navbarContent2 = isSameLayer ? /* @__PURE__ */ jsx("div", { className: `navbar-wrapper-${id}`, style: headerStyles, children: navbarAndDropdowns }) : navbarAndDropdowns;
|
|
189
|
+
const navbarWithContainer2 = containerBehavior === "boxed" ? /* @__PURE__ */ jsx("div", { className: "container mx-auto", children: navbarContent2 }) : navbarContent2;
|
|
190
|
+
const headerContent2 = /* @__PURE__ */ jsx(
|
|
191
|
+
NavigationHeaderWrapper,
|
|
192
|
+
{
|
|
193
|
+
className: cn(
|
|
194
|
+
"relative",
|
|
195
|
+
isFixed ? "fixed top-0 left-0 right-0 z-50" : "absolute top-0 left-0 right-0 z-50"
|
|
196
|
+
),
|
|
197
|
+
style: { margin: marginValue },
|
|
198
|
+
"data-container": containerBehavior,
|
|
199
|
+
children: navbarWithContainer2
|
|
200
|
+
}
|
|
201
|
+
);
|
|
202
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
203
|
+
styles && /* @__PURE__ */ jsx("style", { children: styles }),
|
|
204
|
+
/* @__PURE__ */ jsxs(NavigationProvider, { children: [
|
|
205
|
+
headerContent2,
|
|
206
|
+
safeZoneHeight && safeZoneHeight !== "0" && /* @__PURE__ */ jsx(
|
|
207
|
+
"div",
|
|
208
|
+
{
|
|
209
|
+
className: "header-safe-zone bg-surface",
|
|
210
|
+
style: { height: safeZoneHeight },
|
|
211
|
+
"aria-hidden": "true"
|
|
212
|
+
}
|
|
213
|
+
)
|
|
214
|
+
] })
|
|
215
|
+
] });
|
|
216
|
+
}
|
|
217
|
+
const defaultNavbarAndDropdowns = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
218
|
+
/* @__PURE__ */ jsx(
|
|
219
|
+
Navbar,
|
|
220
|
+
{
|
|
221
|
+
id,
|
|
222
|
+
className,
|
|
223
|
+
headerStyles: isSameLayer ? {} : headerStyles,
|
|
224
|
+
sortedSections,
|
|
225
|
+
navigation,
|
|
226
|
+
resolvedColors,
|
|
227
|
+
togglerSectionId: togglerSectionId || "navbar",
|
|
228
|
+
itemsShowClass: showClass,
|
|
229
|
+
togglerHideClass: hideClass,
|
|
230
|
+
site,
|
|
231
|
+
mobileMenuId: `mobile-menu-${id}`,
|
|
232
|
+
containerContent: containerBehavior === "edged",
|
|
233
|
+
isSameLayer
|
|
234
|
+
}
|
|
235
|
+
),
|
|
236
|
+
/* @__PURE__ */ jsx(
|
|
237
|
+
NavigationDropdown,
|
|
238
|
+
{
|
|
239
|
+
itemId: `mobile-menu-${id}`,
|
|
240
|
+
config: { content: sectionsToDropdownContent(sortedSections) },
|
|
241
|
+
navigation,
|
|
242
|
+
resolvedColors,
|
|
243
|
+
styles: headerStyles,
|
|
244
|
+
linkStyle,
|
|
245
|
+
dropdownId: `mobile-menu-${id}`,
|
|
246
|
+
site,
|
|
247
|
+
containerContent: containerBehavior === "edged",
|
|
248
|
+
isSameLayer
|
|
249
|
+
}
|
|
250
|
+
),
|
|
251
|
+
dropdownItems?.map(
|
|
252
|
+
({
|
|
253
|
+
item,
|
|
254
|
+
config
|
|
255
|
+
}) => /* @__PURE__ */ jsx(
|
|
256
|
+
NavigationDropdown,
|
|
257
|
+
{
|
|
258
|
+
config,
|
|
259
|
+
itemId: item.id,
|
|
260
|
+
navigation,
|
|
261
|
+
resolvedColors,
|
|
262
|
+
styles: headerStyles,
|
|
263
|
+
linkStyle,
|
|
264
|
+
dropdownId: item.id,
|
|
265
|
+
site,
|
|
266
|
+
containerContent: containerBehavior === "edged",
|
|
267
|
+
isSameLayer
|
|
268
|
+
},
|
|
269
|
+
item.id
|
|
270
|
+
)
|
|
271
|
+
)
|
|
272
|
+
] });
|
|
273
|
+
const navbarContent = isSameLayer ? /* @__PURE__ */ jsx("div", { className: `navbar-wrapper-${id}`, style: headerStyles, children: defaultNavbarAndDropdowns }) : defaultNavbarAndDropdowns;
|
|
274
|
+
const navbarWithContainer = containerBehavior === "boxed" ? /* @__PURE__ */ jsx("div", { className: "container mx-auto", children: navbarContent }) : navbarContent;
|
|
275
|
+
const headerContent = /* @__PURE__ */ jsx(
|
|
276
|
+
NavigationHeaderWrapper,
|
|
277
|
+
{
|
|
278
|
+
className: cn(
|
|
279
|
+
"relative",
|
|
280
|
+
isFixed ? "fixed top-0 left-0 right-0 z-50" : "absolute top-0 left-0 right-0 z-50"
|
|
281
|
+
),
|
|
282
|
+
style: { margin: marginValue },
|
|
283
|
+
"data-container": containerBehavior,
|
|
284
|
+
children: navbarWithContainer
|
|
285
|
+
}
|
|
286
|
+
);
|
|
287
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
288
|
+
styles && /* @__PURE__ */ jsx("style", { children: styles }),
|
|
289
|
+
/* @__PURE__ */ jsxs(NavigationProvider, { children: [
|
|
290
|
+
headerContent,
|
|
291
|
+
safeZoneHeight && safeZoneHeight !== "0" && /* @__PURE__ */ jsx(
|
|
292
|
+
"div",
|
|
293
|
+
{
|
|
294
|
+
className: "header-safe-zone bg-surface",
|
|
295
|
+
style: { height: safeZoneHeight },
|
|
296
|
+
"aria-hidden": "true"
|
|
297
|
+
}
|
|
298
|
+
)
|
|
299
|
+
] })
|
|
300
|
+
] });
|
|
301
|
+
};
|
|
302
|
+
export {
|
|
303
|
+
Header
|
|
304
|
+
};
|
|
305
|
+
//# sourceMappingURL=header.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/navigation/header.tsx"],"sourcesContent":["import {\n ColorReference,\n Site,\n HeaderConfig,\n HeaderNavigationItem,\n HeaderNavigationItemConfig,\n} from \"@otl-core/cms-types\";\nimport React from \"react\";\nimport { NavigationProvider } from \"../../context/navigation-context\";\nimport {\n cn,\n resolveColorToCSS,\n resolveColorsToCSS,\n} from \"@otl-core/style-utils\";\nimport {\n calculateNavigationWidth,\n generateNavigationCSS,\n getBreakpointForWidth,\n sectionsToDropdownContent,\n} from \"../../lib/navigation.utils\";\nimport { NavigationHeaderWrapper } from \"../mobile/navigation-header-wrapper\";\nimport { NavigationDropdown } from \"./dropdown\";\nimport { Navbar } from \"./navbar\";\n\nconst SHOW_CLASSES = {\n sm: \"hidden sm:flex\",\n md: \"hidden md:flex\",\n lg: \"hidden lg:flex\",\n xl: \"hidden xl:flex\",\n \"2xl\": \"hidden 2xl:flex\",\n} as const;\n\nconst HIDE_CLASSES = {\n sm: \"sm:hidden\",\n md: \"md:hidden\",\n lg: \"lg:hidden\",\n xl: \"xl:hidden\",\n \"2xl\": \"2xl:hidden\",\n} as const;\n\ninterface NavigationHeaderProps {\n navigation: HeaderConfig;\n site: Site;\n className?: string;\n siteName?: string;\n id?: string;\n}\n\nexport const Header: React.FC<NavigationHeaderProps> = ({\n navigation,\n site = {\n default_locale: \"en\",\n supported_locales: [\"en\"],\n } as Site,\n className = \"\",\n siteName: _siteName = \"Logo\",\n id = \"default\",\n}) => {\n const isFixed = navigation.style?.position === \"fixed\";\n const containerBehavior = navigation.style?.container || \"edged\";\n const safeZone = navigation.style?.safeZone;\n const safeZoneHeight =\n typeof safeZone === \"object\" && \"base\" in safeZone\n ? safeZone.base\n : safeZone || \"0\";\n\n const estimatedWidth = calculateNavigationWidth(\n navigation.sections || [],\n site,\n );\n const breakpoint = getBreakpointForWidth(estimatedWidth);\n\n const styleType = navigation.style?.type || \"default\";\n\n const showClass = breakpoint ? SHOW_CLASSES[breakpoint] : \"\";\n const hideClass = breakpoint ? HIDE_CLASSES[breakpoint] : \"\";\n\n const resolvedColors: Record<string, string | undefined> = navigation.style\n ? {\n ...resolveColorsToCSS(\n Object.fromEntries(\n Object.entries(navigation.style).filter(\n ([key]) =>\n key !== \"type\" &&\n key !== \"position\" &&\n key !== \"container\" &&\n key !== \"safeZone\" &&\n key !== \"layout\" &&\n key !== \"border\" &&\n key !== \"shadow\" &&\n key !== \"link\" &&\n key !== \"burger\" &&\n key !== \"dropdown\" &&\n key !== \"background\" &&\n key !== \"text\",\n ),\n ) as Record<string, ColorReference | undefined>,\n ),\n // Manually resolve background and text colors\n background: resolveColorToCSS(navigation.style.background),\n text: resolveColorToCSS(navigation.style.text),\n // Manually resolve link colors\n linkColor: resolveColorToCSS(navigation.style.link?.color),\n linkHoverColor: resolveColorToCSS(navigation.style.link?.hoverColor),\n // Manually resolve burger colors\n burgerButtonBackground: resolveColorToCSS(\n navigation.style.burger?.button?.background,\n ),\n burgerButtonBackgroundHover: resolveColorToCSS(\n navigation.style.burger?.button?.backgroundHover,\n ),\n burgerIconColor: resolveColorToCSS(\n navigation.style.burger?.icon?.color,\n ),\n burgerIconHover: resolveColorToCSS(\n navigation.style.burger?.icon?.hoverColor,\n ),\n }\n : {};\n\n const headerStyles: React.CSSProperties = {\n ...(resolvedColors.background && {\n backgroundColor: resolvedColors.background,\n }),\n ...(resolvedColors.text && {\n color: resolvedColors.text,\n }),\n };\n\n const linkStyle: React.CSSProperties = {\n ...(resolvedColors.linkColor && { color: resolvedColors.linkColor }),\n };\n\n // Extract margin for inline styles\n const marginValue =\n typeof navigation.style?.layout?.margin === \"object\" &&\n \"base\" in navigation.style.layout.margin\n ? navigation.style.layout.margin.base\n : navigation.style?.layout?.margin || \"0\";\n\n const sortedSections = [...(navigation.sections || [])].sort(\n (a, b) => a.order - b.order,\n );\n\n // Determine which section should have the toggler\n let togglerSectionId = navigation.togglerSectionId;\n\n // \"none\" means explicitly no mobile toggler at all\n if (togglerSectionId === \"none\") {\n togglerSectionId = \"\";\n } else if (!togglerSectionId) {\n // If no togglerSectionId specified, auto-assign to last non-logo section if there's content\n const hasContent = sortedSections.some((section) =>\n section.items?.some((item: HeaderNavigationItem) => item.type !== \"logo\"),\n );\n\n if (hasContent) {\n const nonLogoSections = sortedSections.filter(\n (section) =>\n !section.items?.some(\n (item: HeaderNavigationItem) => item.type === \"logo\",\n ),\n );\n\n if (nonLogoSections.length > 0) {\n togglerSectionId = nonLogoSections[nonLogoSections.length - 1].id;\n }\n }\n }\n\n const dropdownItems: Array<{\n item: HeaderNavigationItem;\n config: HeaderNavigationItemConfig;\n }> = [];\n sortedSections.forEach((section) => {\n section.items?.forEach((item: HeaderNavigationItem) => {\n if (item.type === \"dropdown\") {\n dropdownItems.push({\n item: item,\n config: item.config || {},\n });\n }\n });\n });\n\n // Collect all dropdown IDs for CSS generation (including mobile menu)\n const dropdownIds = [\n `mobile-menu-${id}`,\n ...(dropdownItems || []).map((d) => d.item.id),\n ];\n\n // Generate all CSS once at the header level\n const styles = generateNavigationCSS(\n id,\n navigation,\n resolvedColors,\n dropdownIds,\n );\n\n const isSameLayer = navigation.style?.dropdown?.layer === \"same\";\n\n if (styleType === \"minimal\") {\n // Minimal mode: All items render in navbar, but items without collapse:false get \"hidden\" class\n // This means only logo and collapse:false items are VISIBLE\n const navbarAndDropdowns = (\n <>\n <Navbar\n id={id}\n className={className}\n headerStyles={isSameLayer ? {} : headerStyles}\n sortedSections={sortedSections}\n navigation={navigation}\n resolvedColors={resolvedColors}\n togglerSectionId={togglerSectionId || \"navbar\"}\n itemsShowClass=\"hidden\" // All items hidden by default in minimal mode\n togglerHideClass=\"\" // Always show toggler in minimal mode\n site={site}\n mobileMenuId={`mobile-menu-${id}`}\n containerContent={containerBehavior === \"edged\"}\n isSameLayer={isSameLayer}\n />\n <NavigationDropdown\n itemId={`mobile-menu-${id}`}\n config={{ content: sectionsToDropdownContent(sortedSections) }}\n navigation={navigation}\n resolvedColors={resolvedColors}\n styles={headerStyles}\n linkStyle={linkStyle}\n dropdownId={`mobile-menu-${id}`}\n site={site}\n containerContent={containerBehavior === \"edged\"}\n isSameLayer={isSameLayer}\n />\n {dropdownItems?.map(({ item, config }) => (\n <NavigationDropdown\n key={item.id}\n itemId={item.id}\n config={config}\n navigation={navigation}\n resolvedColors={resolvedColors}\n styles={headerStyles}\n linkStyle={linkStyle}\n dropdownId={item.id}\n site={site}\n containerContent={containerBehavior === \"edged\"}\n isSameLayer={isSameLayer}\n />\n ))}\n </>\n );\n\n const navbarContent = isSameLayer ? (\n <div className={`navbar-wrapper-${id}`} style={headerStyles}>\n {navbarAndDropdowns}\n </div>\n ) : (\n navbarAndDropdowns\n );\n\n const navbarWithContainer =\n containerBehavior === \"boxed\" ? (\n <div className=\"container mx-auto\">{navbarContent}</div>\n ) : (\n navbarContent\n );\n\n const headerContent = (\n <NavigationHeaderWrapper\n className={cn(\n \"relative\",\n isFixed\n ? \"fixed top-0 left-0 right-0 z-50\"\n : \"absolute top-0 left-0 right-0 z-50\",\n )}\n style={{ margin: marginValue }}\n data-container={containerBehavior}\n >\n {navbarWithContainer}\n </NavigationHeaderWrapper>\n );\n\n return (\n <>\n {styles && <style>{styles}</style>}\n <NavigationProvider>\n {headerContent}\n {safeZoneHeight && safeZoneHeight !== \"0\" && (\n <div\n className=\"header-safe-zone bg-surface\"\n style={{ height: safeZoneHeight }}\n aria-hidden=\"true\"\n />\n )}\n </NavigationProvider>\n </>\n );\n }\n\n const defaultNavbarAndDropdowns = (\n <>\n <Navbar\n id={id}\n className={className}\n headerStyles={isSameLayer ? {} : headerStyles}\n sortedSections={sortedSections}\n navigation={navigation}\n resolvedColors={resolvedColors}\n togglerSectionId={togglerSectionId || \"navbar\"}\n itemsShowClass={showClass}\n togglerHideClass={hideClass}\n site={site}\n mobileMenuId={`mobile-menu-${id}`}\n containerContent={containerBehavior === \"edged\"}\n isSameLayer={isSameLayer}\n />\n <NavigationDropdown\n itemId={`mobile-menu-${id}`}\n config={{ content: sectionsToDropdownContent(sortedSections) }}\n navigation={navigation}\n resolvedColors={resolvedColors}\n styles={headerStyles}\n linkStyle={linkStyle}\n dropdownId={`mobile-menu-${id}`}\n site={site}\n containerContent={containerBehavior === \"edged\"}\n isSameLayer={isSameLayer}\n />\n {dropdownItems?.map(\n ({\n item,\n config,\n }: {\n item: HeaderNavigationItem;\n config: HeaderNavigationItemConfig;\n }) => (\n <NavigationDropdown\n config={config}\n key={item.id}\n itemId={item.id}\n navigation={navigation}\n resolvedColors={resolvedColors}\n styles={headerStyles}\n linkStyle={linkStyle}\n dropdownId={item.id}\n site={site}\n containerContent={containerBehavior === \"edged\"}\n isSameLayer={isSameLayer}\n />\n ),\n )}\n </>\n );\n\n const navbarContent = isSameLayer ? (\n <div className={`navbar-wrapper-${id}`} style={headerStyles}>\n {defaultNavbarAndDropdowns}\n </div>\n ) : (\n defaultNavbarAndDropdowns\n );\n\n const navbarWithContainer =\n containerBehavior === \"boxed\" ? (\n <div className=\"container mx-auto\">{navbarContent}</div>\n ) : (\n navbarContent\n );\n\n const headerContent = (\n <NavigationHeaderWrapper\n className={cn(\n \"relative\",\n isFixed\n ? \"fixed top-0 left-0 right-0 z-50\"\n : \"absolute top-0 left-0 right-0 z-50\",\n )}\n style={{ margin: marginValue }}\n data-container={containerBehavior}\n >\n {navbarWithContainer}\n </NavigationHeaderWrapper>\n );\n\n return (\n <>\n {styles && <style>{styles}</style>}\n <NavigationProvider>\n {headerContent}\n {safeZoneHeight && safeZoneHeight !== \"0\" && (\n <div\n className=\"header-safe-zone bg-surface\"\n style={{ height: safeZoneHeight }}\n aria-hidden=\"true\"\n />\n )}\n </NavigationProvider>\n </>\n );\n};\n"],"mappings":"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","names":["navbarContent","navbarWithContainer","headerContent"]}
|