@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.
Files changed (70) hide show
  1. package/dist/components/icons/chevron-icon.d.ts +10 -0
  2. package/dist/components/icons/chevron-icon.js +30 -0
  3. package/dist/components/icons/chevron-icon.js.map +1 -0
  4. package/dist/components/icons/grid-icon.d.ts +12 -0
  5. package/dist/components/icons/grid-icon.js +95 -0
  6. package/dist/components/icons/grid-icon.js.map +1 -0
  7. package/dist/components/icons/hamburger-icon.d.ts +12 -0
  8. package/dist/components/icons/hamburger-icon.js +78 -0
  9. package/dist/components/icons/hamburger-icon.js.map +1 -0
  10. package/dist/components/icons/kebab-icon.d.ts +12 -0
  11. package/dist/components/icons/kebab-icon.js +81 -0
  12. package/dist/components/icons/kebab-icon.js.map +1 -0
  13. package/dist/components/icons/meatballs-icon.d.ts +12 -0
  14. package/dist/components/icons/meatballs-icon.js +81 -0
  15. package/dist/components/icons/meatballs-icon.js.map +1 -0
  16. package/dist/components/icons/plus-icon.d.ts +12 -0
  17. package/dist/components/icons/plus-icon.js +64 -0
  18. package/dist/components/icons/plus-icon.js.map +1 -0
  19. package/dist/components/icons/toggle-icon-map.d.ts +14 -0
  20. package/dist/components/icons/toggle-icon-map.js +22 -0
  21. package/dist/components/icons/toggle-icon-map.js.map +1 -0
  22. package/dist/components/icons/toggle-icon.d.ts +14 -0
  23. package/dist/components/icons/toggle-icon.js +39 -0
  24. package/dist/components/icons/toggle-icon.js.map +1 -0
  25. package/dist/components/items/animated-toggle-icon.d.ts +15 -0
  26. package/dist/components/items/animated-toggle-icon.js +39 -0
  27. package/dist/components/items/animated-toggle-icon.js.map +1 -0
  28. package/dist/components/items/dropdown-content-item.d.ts +12 -0
  29. package/dist/components/items/dropdown-content-item.js +223 -0
  30. package/dist/components/items/dropdown-content-item.js.map +1 -0
  31. package/dist/components/items/logo.d.ts +11 -0
  32. package/dist/components/items/logo.js +42 -0
  33. package/dist/components/items/logo.js.map +1 -0
  34. package/dist/components/mobile/mobile-menu-toggle.d.ts +12 -0
  35. package/dist/components/mobile/mobile-menu-toggle.js +53 -0
  36. package/dist/components/mobile/mobile-menu-toggle.js.map +1 -0
  37. package/dist/components/mobile/navigation-header-wrapper.d.ts +11 -0
  38. package/dist/components/mobile/navigation-header-wrapper.js +15 -0
  39. package/dist/components/mobile/navigation-header-wrapper.js.map +1 -0
  40. package/dist/components/navigation/dropdown.d.ts +19 -0
  41. package/dist/components/navigation/dropdown.js +258 -0
  42. package/dist/components/navigation/dropdown.js.map +1 -0
  43. package/dist/components/navigation/header.d.ts +13 -0
  44. package/dist/components/navigation/header.js +305 -0
  45. package/dist/components/navigation/header.js.map +1 -0
  46. package/dist/components/navigation/navbar.d.ts +21 -0
  47. package/dist/components/navigation/navbar.js +66 -0
  48. package/dist/components/navigation/navbar.js.map +1 -0
  49. package/dist/components/sections/navbar-sections.d.ts +23 -0
  50. package/dist/components/sections/navbar-sections.js +103 -0
  51. package/dist/components/sections/navbar-sections.js.map +1 -0
  52. package/dist/components/sections/navigation-item.d.ts +13 -0
  53. package/dist/components/sections/navigation-item.js +171 -0
  54. package/dist/components/sections/navigation-item.js.map +1 -0
  55. package/dist/components/ui/button.d.ts +14 -0
  56. package/dist/components/ui/button.js +51 -0
  57. package/dist/components/ui/button.js.map +1 -0
  58. package/dist/context/navigation-context.d.ts +17 -0
  59. package/dist/context/navigation-context.js +93 -0
  60. package/dist/context/navigation-context.js.map +1 -0
  61. package/dist/index.d.ts +12 -86
  62. package/dist/index.js +19 -2077
  63. package/dist/index.js.map +1 -1
  64. package/dist/lib/footer.utils.d.ts +20 -0
  65. package/dist/lib/footer.utils.js +84 -0
  66. package/dist/lib/footer.utils.js.map +1 -0
  67. package/dist/lib/navigation.utils.d.ts +34 -0
  68. package/dist/lib/navigation.utils.js +387 -0
  69. package/dist/lib/navigation.utils.js.map +1 -0
  70. 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.18",
3
+ "version": "1.1.20",
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.18",
52
- "@otl-core/style-utils": "^1.1.18"
51
+ "@otl-core/cms-utils": "^1.1.20",
52
+ "@otl-core/style-utils": "^1.1.20"
53
53
  },
54
54
  "devDependencies": {
55
55
  "@eslint/eslintrc": "^3.3.1",
56
- "@otl-core/cms-types": "^1.1.18",
57
- "@otl-core/cms-utils": "^1.1.18",
56
+ "@otl-core/cms-types": "^1.1.20",
57
+ "@otl-core/cms-utils": "^1.1.20",
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",