@otl-core/next-navigation 1.1.19 → 1.1.21
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,387 @@
|
|
|
1
|
+
import { marked } from "marked";
|
|
2
|
+
import {
|
|
3
|
+
generateDesktopDropdownAnimations,
|
|
4
|
+
generateMobileMenuAnimations,
|
|
5
|
+
generateResponsiveSpacingCSS,
|
|
6
|
+
generateSameLayerDropdownAnimations,
|
|
7
|
+
generateScrollbarStyles,
|
|
8
|
+
generateToggleIconAnimations,
|
|
9
|
+
minifyCSS
|
|
10
|
+
} from "@otl-core/style-utils";
|
|
11
|
+
function shadowConfigToCSS(shadow) {
|
|
12
|
+
const { offsetX, offsetY, blurRadius, spreadRadius, color, inset } = shadow;
|
|
13
|
+
const parts = [offsetX, offsetY, blurRadius, spreadRadius, color];
|
|
14
|
+
if (inset) {
|
|
15
|
+
return `inset ${parts.join(" ")}`;
|
|
16
|
+
}
|
|
17
|
+
return parts.join(" ");
|
|
18
|
+
}
|
|
19
|
+
function calculateNavigationWidth(sections, site) {
|
|
20
|
+
let totalWidth = 150;
|
|
21
|
+
for (const section of sections) {
|
|
22
|
+
for (const item of section?.items || []) {
|
|
23
|
+
if (item.type === "logo") continue;
|
|
24
|
+
const label = typeof item.label === "string" ? item.label : getLocalizedString(item.label, site) || "";
|
|
25
|
+
const labelLength = label.length;
|
|
26
|
+
if (item.type === "button") {
|
|
27
|
+
totalWidth += labelLength * 8 + 48;
|
|
28
|
+
} else if (item.type === "link" || item.type === "dropdown" || item.type === "markdown") {
|
|
29
|
+
totalWidth += labelLength * 8 + 24;
|
|
30
|
+
} else if (item.type === "image") {
|
|
31
|
+
const imgConfig = item.config;
|
|
32
|
+
const imgWidth = imgConfig?.width ? parseInt(imgConfig.width, 10) || 100 : 100;
|
|
33
|
+
totalWidth += imgWidth + 16;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return totalWidth;
|
|
38
|
+
}
|
|
39
|
+
function getBreakpointForWidth(estimatedWidth) {
|
|
40
|
+
const MAX_USABLE_WIDTH = 1400;
|
|
41
|
+
if (estimatedWidth > MAX_USABLE_WIDTH) return null;
|
|
42
|
+
if (estimatedWidth <= 640) return "sm";
|
|
43
|
+
if (estimatedWidth <= 768) return "md";
|
|
44
|
+
if (estimatedWidth <= 1024) return "lg";
|
|
45
|
+
if (estimatedWidth <= 1280) return "xl";
|
|
46
|
+
return "2xl";
|
|
47
|
+
}
|
|
48
|
+
const RESPONSIVE_BREAKPOINTS = [
|
|
49
|
+
{ key: "sm", minWidth: "640px" },
|
|
50
|
+
{ key: "md", minWidth: "768px" },
|
|
51
|
+
{ key: "lg", minWidth: "1024px" },
|
|
52
|
+
{ key: "xl", minWidth: "1280px" }
|
|
53
|
+
];
|
|
54
|
+
function generateResponsiveCustomProps(className, props) {
|
|
55
|
+
const css = [];
|
|
56
|
+
const baseVars = [];
|
|
57
|
+
const bpVars = {};
|
|
58
|
+
for (const [prop, value] of Object.entries(props)) {
|
|
59
|
+
if (!value) continue;
|
|
60
|
+
if (typeof value === "string") {
|
|
61
|
+
baseVars.push(`${prop}:${value}`);
|
|
62
|
+
} else {
|
|
63
|
+
if (value.base) baseVars.push(`${prop}:${value.base}`);
|
|
64
|
+
for (const { key } of RESPONSIVE_BREAKPOINTS) {
|
|
65
|
+
const bpVal = value[key];
|
|
66
|
+
if (bpVal && typeof bpVal === "string") {
|
|
67
|
+
if (!bpVars[key]) bpVars[key] = [];
|
|
68
|
+
bpVars[key].push(`${prop}:${bpVal}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const target = `.${className}`;
|
|
74
|
+
if (baseVars.length > 0) {
|
|
75
|
+
css.push(`${target}{${baseVars.join(";")}}`);
|
|
76
|
+
}
|
|
77
|
+
for (const { key, minWidth } of RESPONSIVE_BREAKPOINTS) {
|
|
78
|
+
if (bpVars[key]?.length) {
|
|
79
|
+
css.push(
|
|
80
|
+
`@media(min-width:${minWidth}){${target}{${bpVars[key].join(";")}}}`
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return css;
|
|
85
|
+
}
|
|
86
|
+
function generateNavigationCSS(id, navigation, resolvedColors, dropdownIds = []) {
|
|
87
|
+
const cssBlocks = [];
|
|
88
|
+
const isSameLayer = navigation.style?.dropdown?.layer === "same";
|
|
89
|
+
if (navigation.style) {
|
|
90
|
+
if (isSameLayer) {
|
|
91
|
+
const wrapperCSS = generateResponsiveSpacingCSS(`navbar-wrapper-${id}`, {
|
|
92
|
+
border: navigation.style.border,
|
|
93
|
+
padding: navigation.style.layout?.padding,
|
|
94
|
+
shadow: navigation.style.shadow
|
|
95
|
+
});
|
|
96
|
+
if (wrapperCSS) cssBlocks.push(wrapperCSS);
|
|
97
|
+
} else {
|
|
98
|
+
const navbarCSS = generateResponsiveSpacingCSS(`navbar-${id}`, {
|
|
99
|
+
border: navigation.style.border,
|
|
100
|
+
padding: navigation.style.layout?.padding,
|
|
101
|
+
shadow: navigation.style.shadow
|
|
102
|
+
});
|
|
103
|
+
if (navbarCSS) cssBlocks.push(navbarCSS);
|
|
104
|
+
}
|
|
105
|
+
const navbarInnerCSS = generateResponsiveSpacingCSS(`navbar-inner-${id}`, {
|
|
106
|
+
gap: navigation.style.layout?.sectionGap,
|
|
107
|
+
fontSize: navigation.style.fontSize?.navbar
|
|
108
|
+
});
|
|
109
|
+
if (navbarInnerCSS) cssBlocks.push(navbarInnerCSS);
|
|
110
|
+
const btnFontSize = navigation.style.fontSize?.buttonFontSize;
|
|
111
|
+
if (btnFontSize) {
|
|
112
|
+
cssBlocks.push(
|
|
113
|
+
...generateResponsiveCustomProps(`navbar-inner-${id}`, {
|
|
114
|
+
"--btn-font-sm": btnFontSize.sm,
|
|
115
|
+
"--btn-font-md": btnFontSize.md,
|
|
116
|
+
"--btn-font-lg": btnFontSize.lg
|
|
117
|
+
})
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (navigation.style && dropdownIds.length > 0) {
|
|
122
|
+
dropdownIds.forEach((dropdownId) => {
|
|
123
|
+
if (isSameLayer) {
|
|
124
|
+
const dropdownContentCSS = generateResponsiveSpacingCSS(
|
|
125
|
+
`dropdown-content-${dropdownId}`,
|
|
126
|
+
{
|
|
127
|
+
gap: navigation.style?.dropdown?.sectionGap,
|
|
128
|
+
fontSize: navigation.style?.fontSize?.dropdown
|
|
129
|
+
}
|
|
130
|
+
);
|
|
131
|
+
if (dropdownContentCSS) cssBlocks.push(dropdownContentCSS);
|
|
132
|
+
} else {
|
|
133
|
+
const dropdownCSS = generateResponsiveSpacingCSS(
|
|
134
|
+
`navigation-dropdown-${dropdownId}`,
|
|
135
|
+
{
|
|
136
|
+
padding: navigation.style?.dropdown?.padding,
|
|
137
|
+
border: navigation.style?.dropdown?.border,
|
|
138
|
+
shadow: navigation.style?.dropdown?.shadow
|
|
139
|
+
}
|
|
140
|
+
);
|
|
141
|
+
if (dropdownCSS) cssBlocks.push(dropdownCSS);
|
|
142
|
+
const dropdownContentCSS = generateResponsiveSpacingCSS(
|
|
143
|
+
`dropdown-content-${dropdownId}`,
|
|
144
|
+
{
|
|
145
|
+
gap: navigation.style?.dropdown?.sectionGap,
|
|
146
|
+
fontSize: navigation.style?.fontSize?.dropdown
|
|
147
|
+
}
|
|
148
|
+
);
|
|
149
|
+
if (dropdownContentCSS) cssBlocks.push(dropdownContentCSS);
|
|
150
|
+
}
|
|
151
|
+
const btnFontSize = navigation.style?.fontSize?.buttonFontSize;
|
|
152
|
+
if (btnFontSize) {
|
|
153
|
+
cssBlocks.push(
|
|
154
|
+
...generateResponsiveCustomProps(`dropdown-content-${dropdownId}`, {
|
|
155
|
+
"--btn-font-sm": btnFontSize.sm,
|
|
156
|
+
"--btn-font-md": btnFontSize.md,
|
|
157
|
+
"--btn-font-lg": btnFontSize.lg
|
|
158
|
+
})
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
if (resolvedColors.burgerButtonBackgroundHover) {
|
|
164
|
+
cssBlocks.push(
|
|
165
|
+
`.mobile-menu-toggle-${id}:hover{background-color:${resolvedColors.burgerButtonBackgroundHover}!important}`
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
if (resolvedColors.dropdownMenuLinkHoverColor || resolvedColors.dropdownMenuLinkHoverBackground) {
|
|
169
|
+
const hoverStyles = [];
|
|
170
|
+
if (resolvedColors.dropdownMenuLinkHoverBackground) {
|
|
171
|
+
hoverStyles.push(
|
|
172
|
+
`background-color:${resolvedColors.dropdownMenuLinkHoverBackground}!important`
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
if (resolvedColors.dropdownMenuLinkHoverColor) {
|
|
176
|
+
hoverStyles.push(
|
|
177
|
+
`color:${resolvedColors.dropdownMenuLinkHoverColor}!important`
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
cssBlocks.push(
|
|
181
|
+
`#mobile-menu-dropdown-${id} a:hover{${hoverStyles.join(";")}}`
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
cssBlocks.push(...generateToggleIconAnimations());
|
|
185
|
+
cssBlocks.push(...generateMobileMenuAnimations());
|
|
186
|
+
cssBlocks.push(...generateScrollbarStyles());
|
|
187
|
+
cssBlocks.push(...generateDesktopDropdownAnimations());
|
|
188
|
+
if (isSameLayer) {
|
|
189
|
+
cssBlocks.push(...generateSameLayerDropdownAnimations());
|
|
190
|
+
}
|
|
191
|
+
return minifyCSS(cssBlocks.filter(Boolean).join(""));
|
|
192
|
+
}
|
|
193
|
+
function sectionsToDropdownContent(sections) {
|
|
194
|
+
const result = [];
|
|
195
|
+
let lastSectionHadContent = false;
|
|
196
|
+
sections.forEach((section, index) => {
|
|
197
|
+
const items = section?.items?.filter((item) => {
|
|
198
|
+
if (item.type === "logo") return false;
|
|
199
|
+
if (resolveItemVisibility(item) === "navbar-only") return false;
|
|
200
|
+
return true;
|
|
201
|
+
});
|
|
202
|
+
if (items?.length === 0) {
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
if (lastSectionHadContent && result.length > 0) {
|
|
206
|
+
result.push({
|
|
207
|
+
id: `divider-${sections[index - 1].id}`,
|
|
208
|
+
type: "divider",
|
|
209
|
+
config: {}
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
items?.forEach((item) => {
|
|
213
|
+
if (item.type === "link") {
|
|
214
|
+
const config = item.config;
|
|
215
|
+
const navConfig = {
|
|
216
|
+
label: item.label || "",
|
|
217
|
+
href: config.href,
|
|
218
|
+
icon: config.icon,
|
|
219
|
+
external: config.external
|
|
220
|
+
};
|
|
221
|
+
result.push({
|
|
222
|
+
id: item.id,
|
|
223
|
+
type: "navigation-item",
|
|
224
|
+
config: navConfig
|
|
225
|
+
});
|
|
226
|
+
} else if (item.type === "button") {
|
|
227
|
+
const config = item.config;
|
|
228
|
+
const btnConfig = {
|
|
229
|
+
label: item.label || "",
|
|
230
|
+
href: config.href,
|
|
231
|
+
icon: config.icon,
|
|
232
|
+
external: config.external,
|
|
233
|
+
variant: config.variant,
|
|
234
|
+
size: config.size
|
|
235
|
+
};
|
|
236
|
+
result.push({
|
|
237
|
+
id: item.id,
|
|
238
|
+
type: "button",
|
|
239
|
+
config: btnConfig
|
|
240
|
+
});
|
|
241
|
+
} else if (item.type === "dropdown") {
|
|
242
|
+
const config = item.config;
|
|
243
|
+
result.push({
|
|
244
|
+
id: item.id,
|
|
245
|
+
type: "dropdown",
|
|
246
|
+
label: item.label || "",
|
|
247
|
+
config
|
|
248
|
+
});
|
|
249
|
+
} else if (item.type === "markdown") {
|
|
250
|
+
const config = item.config;
|
|
251
|
+
result.push({
|
|
252
|
+
id: item.id,
|
|
253
|
+
type: "markdown",
|
|
254
|
+
config: { content: config.content || item.label || "" }
|
|
255
|
+
});
|
|
256
|
+
} else if (item.type === "image") {
|
|
257
|
+
const config = item.config;
|
|
258
|
+
result.push({
|
|
259
|
+
id: item.id,
|
|
260
|
+
type: "image",
|
|
261
|
+
config: {
|
|
262
|
+
src: config.src,
|
|
263
|
+
alt: config.alt,
|
|
264
|
+
width: config.width ? { base: config.width } : { base: "100%" },
|
|
265
|
+
height: config.height ? { base: config.height } : { base: "auto" },
|
|
266
|
+
objectFit: config.objectFit,
|
|
267
|
+
href: config.href
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
lastSectionHadContent = true;
|
|
273
|
+
});
|
|
274
|
+
return result;
|
|
275
|
+
}
|
|
276
|
+
function resolveDropdownColor(colorRef, resolvedColors, fallback) {
|
|
277
|
+
if (!colorRef) return fallback;
|
|
278
|
+
if (colorRef.type === "custom") {
|
|
279
|
+
return colorRef.value;
|
|
280
|
+
}
|
|
281
|
+
if (colorRef.type === "theme") {
|
|
282
|
+
return resolvedColors[colorRef.value] || fallback;
|
|
283
|
+
}
|
|
284
|
+
if (colorRef.type === "variable") {
|
|
285
|
+
return `var(--color-${colorRef.value})`;
|
|
286
|
+
}
|
|
287
|
+
return fallback;
|
|
288
|
+
}
|
|
289
|
+
function getBrowserPreferredLocales(options = {}) {
|
|
290
|
+
const defaultOptions = {
|
|
291
|
+
languageCodeOnly: false
|
|
292
|
+
};
|
|
293
|
+
const opt = {
|
|
294
|
+
...defaultOptions,
|
|
295
|
+
...options
|
|
296
|
+
};
|
|
297
|
+
const browserLocales = navigator.languages === void 0 ? [navigator.language] : navigator.languages;
|
|
298
|
+
if (!browserLocales) {
|
|
299
|
+
return void 0;
|
|
300
|
+
}
|
|
301
|
+
return browserLocales.map((locale) => {
|
|
302
|
+
const trimmedLocale = locale.trim();
|
|
303
|
+
return opt.languageCodeOnly ? trimmedLocale.split(/-|_/)[0] : trimmedLocale;
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
function getLocalizedString(value, options) {
|
|
307
|
+
if (value === null || value === void 0) return "";
|
|
308
|
+
if (typeof value === "string") return value;
|
|
309
|
+
const preferredLocale = options && "preferredLocale" in options ? options.preferredLocale : void 0;
|
|
310
|
+
function getDefaultLocale() {
|
|
311
|
+
if (options && "defaultLocale" in options) return options.defaultLocale;
|
|
312
|
+
if (options && "default_locale" in options) return options.default_locale;
|
|
313
|
+
return void 0;
|
|
314
|
+
}
|
|
315
|
+
function getSupportedLocales() {
|
|
316
|
+
if (options && "supportedLocales" in options)
|
|
317
|
+
return options.supportedLocales;
|
|
318
|
+
if (options && "supported_locales" in options)
|
|
319
|
+
return options.supported_locales;
|
|
320
|
+
return void 0;
|
|
321
|
+
}
|
|
322
|
+
const defaultLocale = getDefaultLocale();
|
|
323
|
+
const supportedLocales = getSupportedLocales();
|
|
324
|
+
if (preferredLocale && preferredLocale in value && value[preferredLocale]) {
|
|
325
|
+
return value[preferredLocale];
|
|
326
|
+
}
|
|
327
|
+
if (!preferredLocale) {
|
|
328
|
+
const browserLocales = getBrowserPreferredLocales();
|
|
329
|
+
if (browserLocales) {
|
|
330
|
+
for (const locale of browserLocales) {
|
|
331
|
+
if (locale in value && value[locale]) {
|
|
332
|
+
return value[locale];
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
if (defaultLocale && defaultLocale in value && value[defaultLocale]) {
|
|
338
|
+
return value[defaultLocale];
|
|
339
|
+
}
|
|
340
|
+
if ("en" in value && value.en) {
|
|
341
|
+
return value.en;
|
|
342
|
+
}
|
|
343
|
+
if (supportedLocales) {
|
|
344
|
+
for (const locale of supportedLocales) {
|
|
345
|
+
if (locale in value && value[locale]) {
|
|
346
|
+
return value[locale];
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
const keys = Object.keys(value);
|
|
351
|
+
if (keys.length > 0 && value[keys[0]]) {
|
|
352
|
+
return value[keys[0]];
|
|
353
|
+
}
|
|
354
|
+
return "";
|
|
355
|
+
}
|
|
356
|
+
function resolveItemVisibility(item) {
|
|
357
|
+
if (item.visibility) return item.visibility;
|
|
358
|
+
const legacy = item.collapse;
|
|
359
|
+
if (legacy === false) return "navbar-only";
|
|
360
|
+
return void 0;
|
|
361
|
+
}
|
|
362
|
+
const VISIBILITY_CLASSES = {
|
|
363
|
+
"navbar-only": "flex",
|
|
364
|
+
"mobile-only": "hidden",
|
|
365
|
+
both: "flex"
|
|
366
|
+
};
|
|
367
|
+
function getVisibilityClass(item, fallback) {
|
|
368
|
+
const vis = resolveItemVisibility(item);
|
|
369
|
+
return vis && VISIBILITY_CLASSES[vis] || fallback || "";
|
|
370
|
+
}
|
|
371
|
+
function parseMarkdownToHTML(markdown) {
|
|
372
|
+
const html = marked.parse(markdown, { async: false });
|
|
373
|
+
return html.replace(/<h1>/g, '<div class="h1">').replace(/<\/h1>/g, "</div>").replace(/<h2>/g, '<div class="h2">').replace(/<\/h2>/g, "</div>").replace(/<h3>/g, '<div class="h3">').replace(/<\/h3>/g, "</div>").replace(/<h4>/g, '<div class="h4">').replace(/<\/h4>/g, "</div>").replace(/<h5>/g, '<div class="h5">').replace(/<\/h5>/g, "</div>").replace(/<h6>/g, '<div class="h6">').replace(/<\/h6>/g, "</div>");
|
|
374
|
+
}
|
|
375
|
+
export {
|
|
376
|
+
calculateNavigationWidth,
|
|
377
|
+
generateNavigationCSS,
|
|
378
|
+
getBreakpointForWidth,
|
|
379
|
+
getLocalizedString,
|
|
380
|
+
getVisibilityClass,
|
|
381
|
+
parseMarkdownToHTML,
|
|
382
|
+
resolveDropdownColor,
|
|
383
|
+
resolveItemVisibility,
|
|
384
|
+
sectionsToDropdownContent,
|
|
385
|
+
shadowConfigToCSS
|
|
386
|
+
};
|
|
387
|
+
//# sourceMappingURL=navigation.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/navigation.utils.ts"],"sourcesContent":["import {\n Site,\n HeaderConfig,\n HeaderDropdownButtonConfig,\n HeaderDropdownContent,\n HeaderDropdownNavigationItemConfig,\n HeaderNavigationItem,\n HeaderNavigationItemButtonConfig,\n HeaderNavigationItemDropdownConfig,\n HeaderNavigationItemImageConfig,\n HeaderNavigationItemLinkConfig,\n HeaderNavigationItemMarkdownConfig,\n HeaderSection,\n LocalizedString,\n ResponsiveValue,\n ShadowConfig,\n} from \"@otl-core/cms-types\";\nimport { marked } from \"marked\";\nimport {\n generateDesktopDropdownAnimations,\n generateMobileMenuAnimations,\n generateResponsiveSpacingCSS,\n generateSameLayerDropdownAnimations,\n generateScrollbarStyles,\n generateToggleIconAnimations,\n minifyCSS,\n} from \"@otl-core/style-utils\";\n\n/**\n * Convert ShadowConfig to CSS box-shadow string\n */\nexport function shadowConfigToCSS(shadow: ShadowConfig): string {\n const { offsetX, offsetY, blurRadius, spreadRadius, color, inset } = shadow;\n const parts = [offsetX, offsetY, blurRadius, spreadRadius, color];\n if (inset) {\n return `inset ${parts.join(\" \")}`;\n }\n return parts.join(\" \");\n}\n\nexport function calculateNavigationWidth(\n sections: HeaderSection[],\n site?: Site,\n): number {\n let totalWidth = 150;\n\n for (const section of sections) {\n for (const item of section?.items || []) {\n if (item.type === \"logo\") continue;\n\n const label =\n typeof item.label === \"string\"\n ? item.label\n : getLocalizedString(item.label, site) || \"\";\n const labelLength = label.length;\n\n if (item.type === \"button\") {\n totalWidth += labelLength * 8 + 48;\n } else if (\n item.type === \"link\" ||\n item.type === \"dropdown\" ||\n item.type === \"markdown\"\n ) {\n totalWidth += labelLength * 8 + 24;\n } else if (item.type === \"image\") {\n const imgConfig = item.config as { width?: string };\n const imgWidth = imgConfig?.width\n ? parseInt(imgConfig.width, 10) || 100\n : 100;\n totalWidth += imgWidth + 16;\n }\n }\n }\n\n return totalWidth;\n}\n\nexport type Breakpoint = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | null;\n\nexport function getBreakpointForWidth(estimatedWidth: number): Breakpoint {\n const MAX_USABLE_WIDTH = 1400;\n\n if (estimatedWidth > MAX_USABLE_WIDTH) return null;\n\n if (estimatedWidth <= 640) return \"sm\";\n if (estimatedWidth <= 768) return \"md\";\n if (estimatedWidth <= 1024) return \"lg\";\n if (estimatedWidth <= 1280) return \"xl\";\n return \"2xl\";\n}\n\nconst RESPONSIVE_BREAKPOINTS = [\n { key: \"sm\", minWidth: \"640px\" },\n { key: \"md\", minWidth: \"768px\" },\n { key: \"lg\", minWidth: \"1024px\" },\n { key: \"xl\", minWidth: \"1280px\" },\n] as const;\n\nfunction generateResponsiveCustomProps(\n className: string,\n props: Record<string, ResponsiveValue<string> | undefined>,\n): string[] {\n const css: string[] = [];\n const baseVars: string[] = [];\n const bpVars: Record<string, string[]> = {};\n\n for (const [prop, value] of Object.entries(props)) {\n if (!value) continue;\n if (typeof value === \"string\") {\n baseVars.push(`${prop}:${value}`);\n } else {\n if (value.base) baseVars.push(`${prop}:${value.base}`);\n for (const { key } of RESPONSIVE_BREAKPOINTS) {\n const bpVal = value[key as keyof typeof value];\n if (bpVal && typeof bpVal === \"string\") {\n if (!bpVars[key]) bpVars[key] = [];\n bpVars[key].push(`${prop}:${bpVal}`);\n }\n }\n }\n }\n\n const target = `.${className}`;\n if (baseVars.length > 0) {\n css.push(`${target}{${baseVars.join(\";\")}}`);\n }\n for (const { key, minWidth } of RESPONSIVE_BREAKPOINTS) {\n if (bpVars[key]?.length) {\n css.push(\n `@media(min-width:${minWidth}){${target}{${bpVars[key].join(\";\")}}}`,\n );\n }\n }\n return css;\n}\n\nexport function generateNavigationCSS(\n id: string,\n navigation: HeaderConfig,\n resolvedColors: Record<string, string | undefined>,\n dropdownIds: string[] = [],\n): string {\n const cssBlocks: (string | null)[] = [];\n const isSameLayer = navigation.style?.dropdown?.layer === \"same\";\n\n // Margins are now applied inline, no CSS generation needed\n\n if (navigation.style) {\n if (isSameLayer) {\n // Same layer: navbar wrapper gets border/padding/shadow, navbar itself only gets inner styles\n const wrapperCSS = generateResponsiveSpacingCSS(`navbar-wrapper-${id}`, {\n border: navigation.style.border,\n padding: navigation.style.layout?.padding,\n shadow: navigation.style.shadow,\n });\n if (wrapperCSS) cssBlocks.push(wrapperCSS);\n } else {\n const navbarCSS = generateResponsiveSpacingCSS(`navbar-${id}`, {\n border: navigation.style.border,\n padding: navigation.style.layout?.padding,\n shadow: navigation.style.shadow,\n });\n if (navbarCSS) cssBlocks.push(navbarCSS);\n }\n\n const navbarInnerCSS = generateResponsiveSpacingCSS(`navbar-inner-${id}`, {\n gap: navigation.style.layout?.sectionGap,\n fontSize: navigation.style.fontSize?.navbar,\n });\n if (navbarInnerCSS) cssBlocks.push(navbarInnerCSS);\n\n const btnFontSize = navigation.style.fontSize?.buttonFontSize;\n if (btnFontSize) {\n cssBlocks.push(\n ...generateResponsiveCustomProps(`navbar-inner-${id}`, {\n \"--btn-font-sm\": btnFontSize.sm,\n \"--btn-font-md\": btnFontSize.md,\n \"--btn-font-lg\": btnFontSize.lg,\n }),\n );\n }\n }\n\n if (navigation.style && dropdownIds.length > 0) {\n dropdownIds.forEach((dropdownId) => {\n if (isSameLayer) {\n // Same layer: dropdown only gets gap/fontSize, no border/padding/shadow (inherited from wrapper)\n const dropdownContentCSS = generateResponsiveSpacingCSS(\n `dropdown-content-${dropdownId}`,\n {\n gap: navigation.style?.dropdown?.sectionGap,\n fontSize: navigation.style?.fontSize?.dropdown,\n },\n );\n if (dropdownContentCSS) cssBlocks.push(dropdownContentCSS);\n } else {\n const dropdownCSS = generateResponsiveSpacingCSS(\n `navigation-dropdown-${dropdownId}`,\n {\n padding: navigation.style?.dropdown?.padding,\n border: navigation.style?.dropdown?.border,\n shadow: navigation.style?.dropdown?.shadow,\n },\n );\n if (dropdownCSS) cssBlocks.push(dropdownCSS);\n\n const dropdownContentCSS = generateResponsiveSpacingCSS(\n `dropdown-content-${dropdownId}`,\n {\n gap: navigation.style?.dropdown?.sectionGap,\n fontSize: navigation.style?.fontSize?.dropdown,\n },\n );\n if (dropdownContentCSS) cssBlocks.push(dropdownContentCSS);\n }\n\n const btnFontSize = navigation.style?.fontSize?.buttonFontSize;\n if (btnFontSize) {\n cssBlocks.push(\n ...generateResponsiveCustomProps(`dropdown-content-${dropdownId}`, {\n \"--btn-font-sm\": btnFontSize.sm,\n \"--btn-font-md\": btnFontSize.md,\n \"--btn-font-lg\": btnFontSize.lg,\n }),\n );\n }\n });\n }\n\n if (resolvedColors.burgerButtonBackgroundHover) {\n cssBlocks.push(\n `.mobile-menu-toggle-${id}:hover{background-color:${resolvedColors.burgerButtonBackgroundHover}!important}`,\n );\n }\n\n if (\n resolvedColors.dropdownMenuLinkHoverColor ||\n resolvedColors.dropdownMenuLinkHoverBackground\n ) {\n const hoverStyles: string[] = [];\n if (resolvedColors.dropdownMenuLinkHoverBackground) {\n hoverStyles.push(\n `background-color:${resolvedColors.dropdownMenuLinkHoverBackground}!important`,\n );\n }\n if (resolvedColors.dropdownMenuLinkHoverColor) {\n hoverStyles.push(\n `color:${resolvedColors.dropdownMenuLinkHoverColor}!important`,\n );\n }\n cssBlocks.push(\n `#mobile-menu-dropdown-${id} a:hover{${hoverStyles.join(\";\")}}`,\n );\n }\n\n cssBlocks.push(...generateToggleIconAnimations());\n cssBlocks.push(...generateMobileMenuAnimations());\n cssBlocks.push(...generateScrollbarStyles());\n cssBlocks.push(...generateDesktopDropdownAnimations());\n if (isSameLayer) {\n cssBlocks.push(...generateSameLayerDropdownAnimations());\n }\n\n return minifyCSS(cssBlocks.filter(Boolean).join(\"\"));\n}\n\nexport function sectionsToDropdownContent(\n sections: HeaderSection[],\n): HeaderDropdownContent[] {\n const result: HeaderDropdownContent[] = [];\n let lastSectionHadContent = false;\n\n sections.forEach((section: HeaderSection, index: number) => {\n const items = section?.items?.filter((item: HeaderNavigationItem) => {\n if (item.type === \"logo\") return false;\n if (resolveItemVisibility(item) === \"navbar-only\") return false;\n return true;\n });\n\n if (items?.length === 0) {\n return; // Skip this section, don't update lastSectionHadContent\n }\n\n // Add divider if the previous section had content and this isn't the first section with content\n if (lastSectionHadContent && result.length > 0) {\n result.push({\n id: `divider-${sections[index - 1].id}`,\n type: \"divider\",\n config: {},\n });\n }\n\n items?.forEach((item: HeaderNavigationItem) => {\n if (item.type === \"link\") {\n const config = item.config as HeaderNavigationItemLinkConfig;\n const navConfig: HeaderDropdownNavigationItemConfig = {\n label: item.label || \"\",\n href: config.href,\n icon: config.icon,\n external: config.external,\n };\n result.push({\n id: item.id,\n type: \"navigation-item\",\n config: navConfig,\n });\n } else if (item.type === \"button\") {\n const config = item.config as HeaderNavigationItemButtonConfig;\n const btnConfig: HeaderDropdownButtonConfig = {\n label: item.label || \"\",\n href: config.href,\n icon: config.icon,\n external: config.external,\n variant: config.variant,\n size: config.size,\n };\n result.push({\n id: item.id,\n type: \"button\",\n config: btnConfig,\n });\n } else if (item.type === \"dropdown\") {\n const config = item.config as HeaderNavigationItemDropdownConfig;\n result.push({\n id: item.id,\n type: \"dropdown\",\n label: item.label || \"\",\n config,\n });\n } else if (item.type === \"markdown\") {\n const config = item.config as HeaderNavigationItemMarkdownConfig;\n result.push({\n id: item.id,\n type: \"markdown\",\n config: { content: config.content || item.label || \"\" },\n });\n } else if (item.type === \"image\") {\n const config = item.config as HeaderNavigationItemImageConfig;\n result.push({\n id: item.id,\n type: \"image\",\n config: {\n src: config.src,\n alt: config.alt,\n width: config.width ? { base: config.width } : { base: \"100%\" },\n height: config.height ? { base: config.height } : { base: \"auto\" },\n objectFit: config.objectFit,\n href: config.href,\n },\n });\n }\n });\n\n lastSectionHadContent = true;\n });\n\n return result;\n}\n\nexport function resolveDropdownColor(\n colorRef: { type: string; value: string } | undefined,\n resolvedColors: Record<string, string | undefined>,\n fallback?: string,\n): string | undefined {\n if (!colorRef) return fallback;\n\n if (colorRef.type === \"custom\") {\n return colorRef.value;\n }\n\n if (colorRef.type === \"theme\") {\n return resolvedColors[colorRef.value] || fallback;\n }\n\n if (colorRef.type === \"variable\") {\n // For variables, construct the CSS variable reference\n return `var(--color-${colorRef.value})`;\n }\n\n return fallback;\n}\n\nfunction getBrowserPreferredLocales(options = {}) {\n const defaultOptions = {\n languageCodeOnly: false,\n };\n const opt = {\n ...defaultOptions,\n ...options,\n };\n const browserLocales =\n navigator.languages === undefined\n ? [navigator.language]\n : navigator.languages;\n if (!browserLocales) {\n return undefined;\n }\n return browserLocales.map((locale) => {\n const trimmedLocale = locale.trim();\n return opt.languageCodeOnly ? trimmedLocale.split(/-|_/)[0] : trimmedLocale;\n });\n}\n\nexport function getLocalizedString(\n value: string | LocalizedString | null | undefined,\n options?:\n | Site\n | {\n preferredLocale?: string;\n defaultLocale?: string;\n supportedLocales?: string[];\n },\n): string {\n // Handle null/undefined\n if (value === null || value === undefined) return \"\";\n\n // If it's already a string, return it\n if (typeof value === \"string\") return value;\n\n // Normalize options to handle both Site and simple options object\n const preferredLocale =\n options && \"preferredLocale\" in options\n ? options.preferredLocale\n : undefined;\n function getDefaultLocale(): string | undefined {\n if (options && \"defaultLocale\" in options) return options.defaultLocale;\n if (options && \"default_locale\" in options) return options.default_locale;\n return undefined;\n }\n function getSupportedLocales(): string[] | undefined {\n if (options && \"supportedLocales\" in options)\n return options.supportedLocales;\n if (options && \"supported_locales\" in options)\n return options.supported_locales;\n return undefined;\n }\n const defaultLocale = getDefaultLocale();\n const supportedLocales = getSupportedLocales();\n\n // Try preferred locale first (if explicitly provided)\n if (preferredLocale && preferredLocale in value && value[preferredLocale]) {\n return value[preferredLocale];\n }\n\n // Try browser locales if no explicit preferred locale\n if (!preferredLocale) {\n const browserLocales = getBrowserPreferredLocales();\n if (browserLocales) {\n for (const locale of browserLocales) {\n if (locale in value && value[locale]) {\n return value[locale];\n }\n }\n }\n }\n\n // Try default locale\n if (defaultLocale && defaultLocale in value && value[defaultLocale]) {\n return value[defaultLocale];\n }\n\n // Try 'en' as fallback\n if (\"en\" in value && value.en) {\n return value.en;\n }\n\n // Try any supported locale\n if (supportedLocales) {\n for (const locale of supportedLocales) {\n if (locale in value && value[locale]) {\n return value[locale];\n }\n }\n }\n\n // Return first available value as last resort\n const keys = Object.keys(value);\n if (keys.length > 0 && value[keys[0]]) {\n return value[keys[0]];\n }\n\n return \"\";\n}\n\n/**\n * Resolve the effective visibility for a navigation item.\n * Supports the new `visibility` field and the legacy `collapse` field.\n * collapse: false → \"navbar-only\", collapse: true/undefined → \"responsive\"\n */\nexport function resolveItemVisibility(\n item: HeaderNavigationItem,\n): HeaderNavigationItem[\"visibility\"] {\n if (item.visibility) return item.visibility;\n const legacy = (item as unknown as Record<string, unknown>).collapse;\n if (legacy === false) return \"navbar-only\";\n return undefined;\n}\n\nconst VISIBILITY_CLASSES: Record<string, string> = {\n \"navbar-only\": \"flex\",\n \"mobile-only\": \"hidden\",\n both: \"flex\",\n};\n\n/**\n * Get the CSS class for an item's visibility, falling back to the\n * responsive breakpoint class when no explicit visibility is set.\n */\nexport function getVisibilityClass(\n item: HeaderNavigationItem,\n fallback?: string,\n): string {\n const vis = resolveItemVisibility(item);\n return (vis && VISIBILITY_CLASSES[vis]) || fallback || \"\";\n}\n\nexport function parseMarkdownToHTML(markdown: string): string {\n // Parse markdown to HTML\n const html = marked.parse(markdown, { async: false }) as string;\n\n // Transform h1-h6 elements to divs with corresponding classes\n return html\n .replace(/<h1>/g, '<div class=\"h1\">')\n .replace(/<\\/h1>/g, \"</div>\")\n .replace(/<h2>/g, '<div class=\"h2\">')\n .replace(/<\\/h2>/g, \"</div>\")\n .replace(/<h3>/g, '<div class=\"h3\">')\n .replace(/<\\/h3>/g, \"</div>\")\n .replace(/<h4>/g, '<div class=\"h4\">')\n .replace(/<\\/h4>/g, \"</div>\")\n .replace(/<h5>/g, '<div class=\"h5\">')\n .replace(/<\\/h5>/g, \"</div>\")\n .replace(/<h6>/g, '<div class=\"h6\">')\n .replace(/<\\/h6>/g, \"</div>\");\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@otl-core/next-navigation",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.21",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Reusable navigation components for OTL CMS",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -48,13 +48,13 @@
|
|
|
48
48
|
"tailwind-merge": "^3.3.1"
|
|
49
49
|
},
|
|
50
50
|
"dependencies": {
|
|
51
|
-
"@otl-core/cms-utils": "^1.1.
|
|
52
|
-
"@otl-core/style-utils": "^1.1.
|
|
51
|
+
"@otl-core/cms-utils": "^1.1.21",
|
|
52
|
+
"@otl-core/style-utils": "^1.1.21"
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
55
|
"@eslint/eslintrc": "^3.3.1",
|
|
56
|
-
"@otl-core/cms-types": "^1.1.
|
|
57
|
-
"@otl-core/cms-utils": "^1.1.
|
|
56
|
+
"@otl-core/cms-types": "^1.1.21",
|
|
57
|
+
"@otl-core/cms-utils": "^1.1.21",
|
|
58
58
|
"@radix-ui/react-focus-scope": "^1.1.7",
|
|
59
59
|
"@radix-ui/react-slot": "^1.2.3",
|
|
60
60
|
"@testing-library/jest-dom": "^6.9.1",
|