@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,39 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { HamburgerIcon } from "./hamburger-icon";
3
+ import { toggleIconMap } from "./toggle-icon-map";
4
+ function ToggleIcon({
5
+ type,
6
+ isOpen,
7
+ className = "",
8
+ size = 24,
9
+ animationDuration,
10
+ animationTiming
11
+ }) {
12
+ const IconComponent = toggleIconMap.get(type);
13
+ if (!IconComponent) {
14
+ return /* @__PURE__ */ jsx(
15
+ HamburgerIcon,
16
+ {
17
+ isOpen,
18
+ className,
19
+ size,
20
+ animationDuration,
21
+ animationTiming
22
+ }
23
+ );
24
+ }
25
+ return /* @__PURE__ */ jsx(
26
+ IconComponent,
27
+ {
28
+ isOpen,
29
+ className,
30
+ size,
31
+ animationDuration,
32
+ animationTiming
33
+ }
34
+ );
35
+ }
36
+ export {
37
+ ToggleIcon
38
+ };
39
+ //# sourceMappingURL=toggle-icon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/icons/toggle-icon.tsx"],"sourcesContent":["import type { ToggleIconType } from \"@otl-core/cms-types\";\nimport { HamburgerIcon } from \"./hamburger-icon\";\nimport { toggleIconMap } from \"./toggle-icon-map\";\n\ninterface ToggleIconProps {\n type: ToggleIconType;\n isOpen: boolean;\n className?: string;\n size?: number;\n animationDuration?: number;\n animationTiming?: string;\n}\n\nexport function ToggleIcon({\n type,\n isOpen,\n className = \"\",\n size = 24,\n animationDuration,\n animationTiming,\n}: ToggleIconProps) {\n const IconComponent = toggleIconMap.get(type);\n if (!IconComponent) {\n return (\n <HamburgerIcon\n isOpen={isOpen}\n className={className}\n size={size}\n animationDuration={animationDuration}\n animationTiming={animationTiming}\n />\n );\n }\n return (\n <IconComponent\n isOpen={isOpen}\n className={className}\n size={size}\n animationDuration={animationDuration}\n animationTiming={animationTiming}\n />\n );\n}\n"],"mappings":"AAwBM;AAvBN,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;AAWvB,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,OAAO;AAAA,EACP;AAAA,EACA;AACF,GAAoB;AAClB,QAAM,gBAAgB,cAAc,IAAI,IAAI;AAC5C,MAAI,CAAC,eAAe;AAClB,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF;AAAA,EAEJ;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -0,0 +1,15 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ToggleIconType } from '@otl-core/cms-types';
3
+
4
+ interface AnimatedToggleIconProps {
5
+ type: ToggleIconType;
6
+ isOpen: boolean;
7
+ className?: string;
8
+ size?: number;
9
+ iconId?: string;
10
+ animationDuration?: number;
11
+ animationTiming?: string;
12
+ }
13
+ declare function AnimatedToggleIcon({ type, isOpen, className, size, iconId, animationDuration, animationTiming, }: AnimatedToggleIconProps): react_jsx_runtime.JSX.Element;
14
+
15
+ export { AnimatedToggleIcon };
@@ -0,0 +1,39 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { ToggleIcon } from "../icons/toggle-icon";
4
+ function AnimatedToggleIcon({
5
+ type,
6
+ isOpen,
7
+ className = "",
8
+ size = 24,
9
+ iconId = "default",
10
+ animationDuration,
11
+ animationTiming
12
+ }) {
13
+ const containerStyle = {
14
+ display: "flex",
15
+ alignItems: "center",
16
+ justifyContent: "center"
17
+ };
18
+ return /* @__PURE__ */ jsx(
19
+ "div",
20
+ {
21
+ style: containerStyle,
22
+ className: `animated-toggle-icon-${iconId} ${className}`,
23
+ children: /* @__PURE__ */ jsx(
24
+ ToggleIcon,
25
+ {
26
+ type,
27
+ isOpen,
28
+ size,
29
+ animationDuration,
30
+ animationTiming
31
+ }
32
+ )
33
+ }
34
+ );
35
+ }
36
+ export {
37
+ AnimatedToggleIcon
38
+ };
39
+ //# sourceMappingURL=animated-toggle-icon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/items/animated-toggle-icon.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ToggleIconType } from \"@otl-core/cms-types\";\nimport React from \"react\";\nimport { ToggleIcon } from \"../icons/toggle-icon\";\n\ninterface AnimatedToggleIconProps {\n type: ToggleIconType;\n isOpen: boolean;\n className?: string;\n size?: number;\n iconId?: string;\n animationDuration?: number;\n animationTiming?: string;\n}\n\nexport function AnimatedToggleIcon({\n type,\n isOpen,\n className = \"\",\n size = 24,\n iconId = \"default\",\n animationDuration,\n animationTiming,\n}: AnimatedToggleIconProps) {\n const containerStyle: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n };\n\n return (\n <div\n style={containerStyle}\n className={`animated-toggle-icon-${iconId} ${className}`}\n >\n <ToggleIcon\n type={type}\n isOpen={isOpen}\n size={size}\n animationDuration={animationDuration}\n animationTiming={animationTiming}\n />\n </div>\n );\n}\n"],"mappings":";AAoCM;AAhCN,SAAS,kBAAkB;AAYpB,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,SAAS;AAAA,EACT;AAAA,EACA;AACF,GAA4B;AAC1B,QAAM,iBAAsC;AAAA,IAC1C,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,gBAAgB;AAAA,EAClB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP,WAAW,wBAAwB,MAAM,IAAI,SAAS;AAAA,MAEtD;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -0,0 +1,12 @@
1
+ import { HeaderDropdownContent, HeaderConfig, Site } from '@otl-core/cms-types';
2
+
3
+ interface DropdownContentItemProps {
4
+ content: HeaderDropdownContent;
5
+ resolvedColors: Record<string, string | undefined>;
6
+ onNavigate?: (contentId: string) => void;
7
+ navigation: HeaderConfig;
8
+ site: Site;
9
+ }
10
+ declare const DropdownContentItem: React.FC<DropdownContentItemProps>;
11
+
12
+ export { DropdownContentItem };
@@ -0,0 +1,223 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { resolveColorToCSS } from "@otl-core/style-utils";
3
+ import Link from "next/link";
4
+ import {
5
+ getLocalizedString,
6
+ parseMarkdownToHTML
7
+ } from "../../lib/navigation.utils";
8
+ import { Button } from "../ui/button";
9
+ const DropdownContentItem = ({
10
+ content,
11
+ resolvedColors,
12
+ onNavigate,
13
+ navigation,
14
+ site
15
+ }) => {
16
+ if (content.type === "markdown") {
17
+ const config = content.config;
18
+ const markdownContent = getLocalizedString(config.content, site);
19
+ const parsedHTML = parseMarkdownToHTML(markdownContent);
20
+ return /* @__PURE__ */ jsx(
21
+ "div",
22
+ {
23
+ dangerouslySetInnerHTML: { __html: parsedHTML },
24
+ style: {
25
+ color: resolvedColors.text
26
+ },
27
+ className: "[&_*]:text-inherit"
28
+ }
29
+ );
30
+ }
31
+ if (content.type === "image") {
32
+ const config = content.config;
33
+ const getBaseValue = (val, fallback) => {
34
+ if (val === void 0 || val === null) return fallback;
35
+ if (typeof val === "number") return `${val}px`;
36
+ if (typeof val === "string") return val;
37
+ if (typeof val === "object" && "base" in val) return val.base;
38
+ return fallback;
39
+ };
40
+ const width = getBaseValue(config.width, "300px");
41
+ const height = getBaseValue(config.height, "auto");
42
+ const objectFit = config.objectFit || "cover";
43
+ if (!config.src) {
44
+ return null;
45
+ }
46
+ const imgElement = /* @__PURE__ */ jsx(
47
+ "img",
48
+ {
49
+ src: config.src,
50
+ alt: config.alt || "",
51
+ style: {
52
+ display: "block",
53
+ width,
54
+ height,
55
+ objectFit
56
+ }
57
+ }
58
+ );
59
+ if (config.href) {
60
+ return /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(Link, { href: config.href, children: imgElement }) });
61
+ }
62
+ return /* @__PURE__ */ jsx("div", { children: imgElement });
63
+ }
64
+ if (content.type === "navigation-item") {
65
+ const config = content.config;
66
+ const label = getLocalizedString(config.label, site);
67
+ return /* @__PURE__ */ jsxs(
68
+ Link,
69
+ {
70
+ href: config.href,
71
+ className: "block px-3 py-2 rounded-md text-sm transition-colors whitespace-nowrap",
72
+ style: {
73
+ color: resolvedColors.dropdownMenuLinkColor || resolvedColors.linkColor,
74
+ backgroundColor: "transparent"
75
+ },
76
+ target: config.external ? "_blank" : void 0,
77
+ rel: config.external ? "noopener noreferrer" : void 0,
78
+ children: [
79
+ config.icon && /* @__PURE__ */ jsx("span", { className: "mr-2", children: config.icon }),
80
+ label
81
+ ]
82
+ }
83
+ );
84
+ }
85
+ if (content.type === "button") {
86
+ const config = content.config;
87
+ const label = getLocalizedString(config.label, site);
88
+ const variantMap = {
89
+ primary: "default",
90
+ secondary: "secondary",
91
+ outline: "outline",
92
+ ghost: "ghost"
93
+ };
94
+ const sizeMap = {
95
+ sm: "sm",
96
+ md: "default",
97
+ lg: "lg"
98
+ };
99
+ return /* @__PURE__ */ jsx(
100
+ Button,
101
+ {
102
+ asChild: true,
103
+ variant: config.variant ? variantMap[config.variant] : "default",
104
+ size: config.size ? sizeMap[config.size] : "default",
105
+ className: "w-full whitespace-nowrap",
106
+ style: {
107
+ fontSize: `var(--btn-font-${config.size || "md"})`
108
+ },
109
+ children: /* @__PURE__ */ jsxs(
110
+ Link,
111
+ {
112
+ href: config.href,
113
+ target: config.external ? "_blank" : void 0,
114
+ rel: config.external ? "noopener noreferrer" : void 0,
115
+ children: [
116
+ config.icon && /* @__PURE__ */ jsx("span", { className: "mr-2", children: config.icon }),
117
+ label
118
+ ]
119
+ }
120
+ )
121
+ }
122
+ );
123
+ }
124
+ if (content.type === "dropdown") {
125
+ const label = content.label ? getLocalizedString(content.label, site) : "Submenu";
126
+ return /* @__PURE__ */ jsx(
127
+ "button",
128
+ {
129
+ onClick: (e) => {
130
+ e.preventDefault();
131
+ onNavigate?.(content.id);
132
+ },
133
+ type: "button",
134
+ "data-navigation-internal": "true",
135
+ className: "block w-full text-left px-3 py-2 rounded-md text-sm transition-colors whitespace-nowrap",
136
+ style: {
137
+ color: resolvedColors.dropdownMenuLinkColor || resolvedColors.linkColor,
138
+ backgroundColor: "transparent"
139
+ },
140
+ children: /* @__PURE__ */ jsxs("span", { className: "flex items-center justify-between", children: [
141
+ /* @__PURE__ */ jsx("span", { children: label }),
142
+ /* @__PURE__ */ jsx(
143
+ "svg",
144
+ {
145
+ width: "16",
146
+ height: "16",
147
+ viewBox: "0 0 24 24",
148
+ fill: "none",
149
+ stroke: "currentColor",
150
+ strokeWidth: "2",
151
+ children: /* @__PURE__ */ jsx("polyline", { points: "9 18 15 12 9 6" })
152
+ }
153
+ )
154
+ ] })
155
+ }
156
+ );
157
+ }
158
+ if (content.type === "section") {
159
+ const config = content.config;
160
+ const getLabel = (value) => {
161
+ if (!value) return "";
162
+ if (typeof value === "string") return value;
163
+ return value.en || "";
164
+ };
165
+ const title = config.title ? getLabel(config.title) : void 0;
166
+ return /* @__PURE__ */ jsxs(
167
+ "div",
168
+ {
169
+ className: "flex flex-col",
170
+ style: {
171
+ gap: config.gap || "0.25rem",
172
+ justifyContent: config.justify || "flex-start",
173
+ alignItems: config.align || "flex-start"
174
+ },
175
+ children: [
176
+ title && /* @__PURE__ */ jsx(
177
+ "div",
178
+ {
179
+ className: "text-sm font-semibold mb-1",
180
+ style: { color: resolvedColors.text },
181
+ children: title
182
+ }
183
+ ),
184
+ config.content?.map((item) => /* @__PURE__ */ jsx(
185
+ DropdownContentItem,
186
+ {
187
+ content: item,
188
+ resolvedColors,
189
+ onNavigate,
190
+ navigation,
191
+ site
192
+ },
193
+ item.id
194
+ ))
195
+ ]
196
+ }
197
+ );
198
+ }
199
+ if (content.type === "divider") {
200
+ const dividerConfig = content.config;
201
+ const dividerColor = dividerConfig?.color ? resolveColorToCSS(dividerConfig.color) : resolvedColors.border;
202
+ const thickness = dividerConfig?.thickness || "1px";
203
+ const margin = dividerConfig?.margin || "0.5rem";
204
+ const borderStyle = dividerConfig?.style || "solid";
205
+ return /* @__PURE__ */ jsx(
206
+ "div",
207
+ {
208
+ style: {
209
+ borderTopWidth: thickness,
210
+ borderTopStyle: borderStyle,
211
+ borderTopColor: dividerColor,
212
+ marginTop: margin,
213
+ marginBottom: margin
214
+ }
215
+ }
216
+ );
217
+ }
218
+ return null;
219
+ };
220
+ export {
221
+ DropdownContentItem
222
+ };
223
+ //# sourceMappingURL=dropdown-content-item.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/items/dropdown-content-item.tsx"],"sourcesContent":["import {\n Site,\n HeaderConfig,\n HeaderDropdownButtonConfig,\n HeaderDropdownContent,\n HeaderDropdownDividerConfig,\n HeaderDropdownImageConfig,\n HeaderDropdownMarkdownConfig,\n HeaderDropdownNavigationItemConfig,\n HeaderDropdownGroupConfig,\n LocalizedString,\n} from \"@otl-core/cms-types\";\nimport { resolveColorToCSS } from \"@otl-core/style-utils\";\nimport Link from \"next/link\";\nimport {\n getLocalizedString,\n parseMarkdownToHTML,\n} from \"../../lib/navigation.utils\";\nimport { Button } from \"../ui/button\";\n\ninterface DropdownContentItemProps {\n content: HeaderDropdownContent;\n resolvedColors: Record<string, string | undefined>;\n onNavigate?: (contentId: string) => void;\n navigation: HeaderConfig;\n site: Site;\n}\n\nexport const DropdownContentItem: React.FC<DropdownContentItemProps> = ({\n content,\n resolvedColors,\n onNavigate,\n navigation,\n site,\n}) => {\n if (content.type === \"markdown\") {\n const config = content.config as HeaderDropdownMarkdownConfig;\n const markdownContent = getLocalizedString(config.content, site);\n const parsedHTML = parseMarkdownToHTML(markdownContent);\n\n return (\n <div\n dangerouslySetInnerHTML={{ __html: parsedHTML }}\n style={{\n color: resolvedColors.text,\n }}\n className=\"[&_*]:text-inherit\"\n />\n );\n }\n\n // Image content\n if (content.type === \"image\") {\n const config = content.config as HeaderDropdownImageConfig;\n\n const getBaseValue = (\n val: string | { base: string } | number | undefined,\n fallback: string,\n ): string => {\n if (val === undefined || val === null) return fallback;\n if (typeof val === \"number\") return `${val}px`;\n if (typeof val === \"string\") return val;\n if (typeof val === \"object\" && \"base\" in val) return val.base;\n return fallback;\n };\n\n const width = getBaseValue(config.width, \"300px\");\n const height = getBaseValue(config.height, \"auto\");\n const objectFit = config.objectFit || \"cover\";\n\n if (!config.src) {\n return null;\n }\n\n const imgElement = (\n <img\n src={config.src}\n alt={config.alt || \"\"}\n style={{\n display: \"block\",\n width,\n height,\n objectFit,\n }}\n />\n );\n\n if (config.href) {\n return (\n <div>\n <Link href={config.href}>{imgElement}</Link>\n </div>\n );\n }\n\n return <div>{imgElement}</div>;\n }\n\n // Navigation item (link)\n if (content.type === \"navigation-item\") {\n const config = content.config as HeaderDropdownNavigationItemConfig;\n const label = getLocalizedString(config.label, site);\n\n return (\n <Link\n href={config.href}\n className=\"block px-3 py-2 rounded-md text-sm transition-colors whitespace-nowrap\"\n style={{\n color:\n resolvedColors.dropdownMenuLinkColor || resolvedColors.linkColor,\n backgroundColor: \"transparent\",\n }}\n target={config.external ? \"_blank\" : undefined}\n rel={config.external ? \"noopener noreferrer\" : undefined}\n >\n {config.icon && <span className=\"mr-2\">{config.icon}</span>}\n {label}\n </Link>\n );\n }\n\n // Button\n if (content.type === \"button\") {\n const config = content.config as HeaderDropdownButtonConfig;\n const label = getLocalizedString(config.label, site);\n\n const variantMap: Record<\n string,\n \"default\" | \"secondary\" | \"outline\" | \"ghost\"\n > = {\n primary: \"default\",\n secondary: \"secondary\",\n outline: \"outline\",\n ghost: \"ghost\",\n };\n\n const sizeMap: Record<string, \"sm\" | \"default\" | \"lg\"> = {\n sm: \"sm\",\n md: \"default\",\n lg: \"lg\",\n };\n\n return (\n <Button\n asChild\n variant={config.variant ? variantMap[config.variant] : \"default\"}\n size={config.size ? sizeMap[config.size] : \"default\"}\n className=\"w-full whitespace-nowrap\"\n style={{\n fontSize: `var(--btn-font-${config.size || \"md\"})`,\n }}\n >\n <Link\n href={config.href}\n target={config.external ? \"_blank\" : undefined}\n rel={config.external ? \"noopener noreferrer\" : undefined}\n >\n {config.icon && <span className=\"mr-2\">{config.icon}</span>}\n {label}\n </Link>\n </Button>\n );\n }\n\n // Nested dropdown - switch content\n if (content.type === \"dropdown\") {\n const label = content.label\n ? getLocalizedString(content.label, site)\n : \"Submenu\";\n\n return (\n <button\n onClick={(e) => {\n e.preventDefault();\n onNavigate?.(content.id);\n }}\n type=\"button\"\n data-navigation-internal=\"true\"\n className=\"block w-full text-left px-3 py-2 rounded-md text-sm transition-colors whitespace-nowrap\"\n style={{\n color:\n resolvedColors.dropdownMenuLinkColor || resolvedColors.linkColor,\n backgroundColor: \"transparent\",\n }}\n >\n <span className=\"flex items-center justify-between\">\n <span>{label}</span>\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n </span>\n </button>\n );\n }\n\n // Section with content\n if (content.type === \"section\") {\n const config = content.config as HeaderDropdownGroupConfig;\n\n // Get label as string\n const getLabel = (value: string | LocalizedString | undefined): string => {\n if (!value) return \"\";\n if (typeof value === \"string\") return value;\n return (value as LocalizedString).en || \"\";\n };\n\n const title = config.title ? getLabel(config.title) : undefined;\n\n return (\n <div\n className=\"flex flex-col\"\n style={{\n gap: config.gap || \"0.25rem\",\n justifyContent: config.justify || \"flex-start\",\n alignItems: config.align || \"flex-start\",\n }}\n >\n {title && (\n <div\n className=\"text-sm font-semibold mb-1\"\n style={{ color: resolvedColors.text }}\n >\n {title}\n </div>\n )}\n {config.content?.map((item: HeaderDropdownContent) => (\n <DropdownContentItem\n key={item.id}\n content={item}\n resolvedColors={resolvedColors}\n onNavigate={onNavigate}\n navigation={navigation}\n site={site}\n />\n ))}\n </div>\n );\n }\n\n // Divider\n if (content.type === \"divider\") {\n const dividerConfig = content.config as HeaderDropdownDividerConfig;\n const dividerColor = dividerConfig?.color\n ? resolveColorToCSS(dividerConfig.color)\n : resolvedColors.border;\n const thickness = dividerConfig?.thickness || \"1px\";\n const margin = dividerConfig?.margin || \"0.5rem\";\n const borderStyle = dividerConfig?.style || \"solid\";\n\n return (\n <div\n style={{\n borderTopWidth: thickness,\n borderTopStyle: borderStyle,\n borderTopColor: dividerColor,\n marginTop: margin,\n marginBottom: margin,\n }}\n />\n );\n }\n\n return null;\n};\n"],"mappings":"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","names":[]}
@@ -0,0 +1,11 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { HeaderConfig } from '@otl-core/cms-types';
3
+
4
+ interface LogoProps {
5
+ navigation: HeaderConfig;
6
+ siteName: string;
7
+ logoTextColor?: string;
8
+ }
9
+ declare function Logo({ navigation, siteName, logoTextColor }: LogoProps): react_jsx_runtime.JSX.Element;
10
+
11
+ export { Logo };
@@ -0,0 +1,42 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import Link from "next/link";
3
+ function LogoContent({ navigation, siteName, logoTextColor }) {
4
+ if (navigation.logo?.url) {
5
+ return /* @__PURE__ */ jsx(
6
+ "img",
7
+ {
8
+ src: navigation.logo.url,
9
+ alt: navigation.logo.alt || siteName,
10
+ width: navigation.logo.width,
11
+ height: navigation.logo.height,
12
+ className: "h-auto w-auto",
13
+ style: {
14
+ height: navigation.logo.height ? `${navigation.logo.height}px` : "40px"
15
+ }
16
+ }
17
+ );
18
+ }
19
+ const text = navigation.logo?.alt || siteName;
20
+ return /* @__PURE__ */ jsx(
21
+ "span",
22
+ {
23
+ className: "text-xl font-bold",
24
+ style: logoTextColor ? { color: logoTextColor } : void 0,
25
+ children: text
26
+ }
27
+ );
28
+ }
29
+ function Logo({ navigation, siteName, logoTextColor }) {
30
+ return /* @__PURE__ */ jsx(Link, { href: "/", className: "flex-shrink-0", children: /* @__PURE__ */ jsx(
31
+ LogoContent,
32
+ {
33
+ navigation,
34
+ siteName,
35
+ logoTextColor
36
+ }
37
+ ) });
38
+ }
39
+ export {
40
+ Logo
41
+ };
42
+ //# sourceMappingURL=logo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/items/logo.tsx"],"sourcesContent":["import { HeaderConfig } from \"@otl-core/cms-types\";\nimport Link from \"next/link\";\n\ninterface LogoProps {\n navigation: HeaderConfig;\n siteName: string;\n logoTextColor?: string;\n}\n\nfunction LogoContent({ navigation, siteName, logoTextColor }: LogoProps) {\n if (navigation.logo?.url) {\n return (\n <img\n src={navigation.logo.url}\n alt={navigation.logo.alt || siteName}\n width={navigation.logo.width}\n height={navigation.logo.height}\n className=\"h-auto w-auto\"\n style={{\n height: navigation.logo.height\n ? `${navigation.logo.height}px`\n : \"40px\",\n }}\n />\n );\n }\n\n const text = navigation.logo?.alt || siteName;\n return (\n <span\n className=\"text-xl font-bold\"\n style={logoTextColor ? { color: logoTextColor } : undefined}\n >\n {text}\n </span>\n );\n}\n\nexport function Logo({ navigation, siteName, logoTextColor }: LogoProps) {\n return (\n <Link href=\"/\" className=\"flex-shrink-0\">\n <LogoContent\n navigation={navigation}\n siteName={siteName}\n logoTextColor={logoTextColor}\n />\n </Link>\n );\n}\n"],"mappings":"AAYM;AAXN,OAAO,UAAU;AAQjB,SAAS,YAAY,EAAE,YAAY,UAAU,cAAc,GAAc;AACvE,MAAI,WAAW,MAAM,KAAK;AACxB,WACE;AAAA,MAAC;AAAA;AAAA,QACC,KAAK,WAAW,KAAK;AAAA,QACrB,KAAK,WAAW,KAAK,OAAO;AAAA,QAC5B,OAAO,WAAW,KAAK;AAAA,QACvB,QAAQ,WAAW,KAAK;AAAA,QACxB,WAAU;AAAA,QACV,OAAO;AAAA,UACL,QAAQ,WAAW,KAAK,SACpB,GAAG,WAAW,KAAK,MAAM,OACzB;AAAA,QACN;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,QAAM,OAAO,WAAW,MAAM,OAAO;AACrC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO,gBAAgB,EAAE,OAAO,cAAc,IAAI;AAAA,MAEjD;AAAA;AAAA,EACH;AAEJ;AAEO,SAAS,KAAK,EAAE,YAAY,UAAU,cAAc,GAAc;AACvE,SACE,oBAAC,QAAK,MAAK,KAAI,WAAU,iBACvB;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF,GACF;AAEJ;","names":[]}
@@ -0,0 +1,12 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { HeaderConfig } from '@otl-core/cms-types';
3
+
4
+ interface MobileMenuToggleProps {
5
+ navigation: HeaderConfig;
6
+ resolvedColors: Record<string, string | undefined>;
7
+ toggleId: string;
8
+ mobileMenuId: string;
9
+ }
10
+ declare function MobileMenuToggle({ navigation, resolvedColors, toggleId, mobileMenuId, }: MobileMenuToggleProps): react_jsx_runtime.JSX.Element;
11
+
12
+ export { MobileMenuToggle };
@@ -0,0 +1,53 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { useRef } from "react";
4
+ import { useNavigation } from "../../context/navigation-context";
5
+ import { AnimatedToggleIcon } from "../items/animated-toggle-icon";
6
+ function MobileMenuToggle({
7
+ navigation,
8
+ resolvedColors,
9
+ toggleId,
10
+ mobileMenuId
11
+ }) {
12
+ const { activeDropdown, toggleDropdown } = useNavigation();
13
+ const buttonRef = useRef(null);
14
+ const isMobileMenuOpen = activeDropdown === mobileMenuId;
15
+ return /* @__PURE__ */ jsx(
16
+ "button",
17
+ {
18
+ ref: buttonRef,
19
+ onClick: () => toggleDropdown(mobileMenuId),
20
+ className: `mobile-menu-toggle-${toggleId} transition-colors group flex items-center justify-center`,
21
+ style: {
22
+ backgroundColor: resolvedColors.burgerButtonBackground,
23
+ color: resolvedColors.burgerIconColor,
24
+ padding: navigation.style?.burger?.toggleButton?.padding || "0.5rem",
25
+ borderRadius: navigation.style?.burger?.toggleButton?.borderRadius || "0.375rem",
26
+ fontSize: 0,
27
+ lineHeight: 0,
28
+ font: "0/0 a",
29
+ // @ts-expect-error - CSS custom properties
30
+ "--icon-hover": resolvedColors.burgerIconHover
31
+ },
32
+ "aria-label": "Toggle navigation menu",
33
+ "aria-expanded": isMobileMenuOpen,
34
+ "aria-controls": "mobile-menu-dropdown",
35
+ children: /* @__PURE__ */ jsx(
36
+ AnimatedToggleIcon,
37
+ {
38
+ type: navigation.style?.burger?.toggleIcon?.type || "hamburger",
39
+ isOpen: isMobileMenuOpen,
40
+ size: navigation.style?.burger?.toggleIcon?.size || 24,
41
+ iconId: toggleId,
42
+ animationDuration: navigation.style?.burger?.toggleIcon?.animationDuration,
43
+ animationTiming: navigation.style?.burger?.toggleIcon?.animationTiming,
44
+ className: "group-hover:text-[var(--icon-hover)]"
45
+ }
46
+ )
47
+ }
48
+ );
49
+ }
50
+ export {
51
+ MobileMenuToggle
52
+ };
53
+ //# sourceMappingURL=mobile-menu-toggle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/mobile/mobile-menu-toggle.tsx"],"sourcesContent":["\"use client\";\n\nimport type { HeaderConfig } from \"@otl-core/cms-types\";\nimport { useRef } from \"react\";\nimport { useNavigation } from \"../../context/navigation-context\";\nimport { AnimatedToggleIcon } from \"../items/animated-toggle-icon\";\n\ninterface MobileMenuToggleProps {\n navigation: HeaderConfig;\n resolvedColors: Record<string, string | undefined>;\n toggleId: string;\n mobileMenuId: string;\n}\n\nexport function MobileMenuToggle({\n navigation,\n resolvedColors,\n toggleId,\n mobileMenuId,\n}: MobileMenuToggleProps) {\n const { activeDropdown, toggleDropdown } = useNavigation();\n const buttonRef = useRef<HTMLButtonElement>(null);\n const isMobileMenuOpen = activeDropdown === mobileMenuId;\n\n return (\n <button\n ref={buttonRef}\n onClick={() => toggleDropdown(mobileMenuId)}\n className={`mobile-menu-toggle-${toggleId} transition-colors group flex items-center justify-center`}\n style={{\n backgroundColor: resolvedColors.burgerButtonBackground,\n color: resolvedColors.burgerIconColor,\n padding: navigation.style?.burger?.toggleButton?.padding || \"0.5rem\",\n borderRadius:\n navigation.style?.burger?.toggleButton?.borderRadius || \"0.375rem\",\n fontSize: 0,\n lineHeight: 0,\n font: \"0/0 a\",\n // @ts-expect-error - CSS custom properties\n \"--icon-hover\": resolvedColors.burgerIconHover,\n }}\n aria-label=\"Toggle navigation menu\"\n aria-expanded={isMobileMenuOpen}\n aria-controls=\"mobile-menu-dropdown\"\n >\n <AnimatedToggleIcon\n type={navigation.style?.burger?.toggleIcon?.type || \"hamburger\"}\n isOpen={isMobileMenuOpen}\n size={navigation.style?.burger?.toggleIcon?.size || 24}\n iconId={toggleId}\n animationDuration={\n navigation.style?.burger?.toggleIcon?.animationDuration\n }\n animationTiming={navigation.style?.burger?.toggleIcon?.animationTiming}\n className=\"group-hover:text-[var(--icon-hover)]\"\n />\n </button>\n );\n}\n"],"mappings":";AA6CM;AA1CN,SAAS,cAAc;AACvB,SAAS,qBAAqB;AAC9B,SAAS,0BAA0B;AAS5B,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA0B;AACxB,QAAM,EAAE,gBAAgB,eAAe,IAAI,cAAc;AACzD,QAAM,YAAY,OAA0B,IAAI;AAChD,QAAM,mBAAmB,mBAAmB;AAE5C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,SAAS,MAAM,eAAe,YAAY;AAAA,MAC1C,WAAW,sBAAsB,QAAQ;AAAA,MACzC,OAAO;AAAA,QACL,iBAAiB,eAAe;AAAA,QAChC,OAAO,eAAe;AAAA,QACtB,SAAS,WAAW,OAAO,QAAQ,cAAc,WAAW;AAAA,QAC5D,cACE,WAAW,OAAO,QAAQ,cAAc,gBAAgB;AAAA,QAC1D,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,MAAM;AAAA;AAAA,QAEN,gBAAgB,eAAe;AAAA,MACjC;AAAA,MACA,cAAW;AAAA,MACX,iBAAe;AAAA,MACf,iBAAc;AAAA,MAEd;AAAA,QAAC;AAAA;AAAA,UACC,MAAM,WAAW,OAAO,QAAQ,YAAY,QAAQ;AAAA,UACpD,QAAQ;AAAA,UACR,MAAM,WAAW,OAAO,QAAQ,YAAY,QAAQ;AAAA,UACpD,QAAQ;AAAA,UACR,mBACE,WAAW,OAAO,QAAQ,YAAY;AAAA,UAExC,iBAAiB,WAAW,OAAO,QAAQ,YAAY;AAAA,UACvD,WAAU;AAAA;AAAA,MACZ;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -0,0 +1,11 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import React__default from 'react';
3
+
4
+ interface NavigationHeaderWrapperProps {
5
+ children: React__default.ReactNode;
6
+ className?: string;
7
+ style?: React__default.CSSProperties;
8
+ }
9
+ declare function NavigationHeaderWrapper({ children, className, style, }: NavigationHeaderWrapperProps): react_jsx_runtime.JSX.Element;
10
+
11
+ export { NavigationHeaderWrapper };
@@ -0,0 +1,15 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { useNavigation } from "../../context/navigation-context";
4
+ function NavigationHeaderWrapper({
5
+ children,
6
+ className,
7
+ style
8
+ }) {
9
+ const { headerRef } = useNavigation();
10
+ return /* @__PURE__ */ jsx("header", { ref: headerRef, className, style, children });
11
+ }
12
+ export {
13
+ NavigationHeaderWrapper
14
+ };
15
+ //# sourceMappingURL=navigation-header-wrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/mobile/navigation-header-wrapper.tsx"],"sourcesContent":["\"use client\";\n\nimport React from \"react\";\nimport { useNavigation } from \"../../context/navigation-context\";\n\ninterface NavigationHeaderWrapperProps {\n children: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function NavigationHeaderWrapper({\n children,\n className,\n style,\n}: NavigationHeaderWrapperProps) {\n const { headerRef } = useNavigation();\n\n return (\n <header ref={headerRef} className={className} style={style}>\n {children}\n </header>\n );\n}\n"],"mappings":";AAmBI;AAhBJ,SAAS,qBAAqB;AAQvB,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AACF,GAAiC;AAC/B,QAAM,EAAE,UAAU,IAAI,cAAc;AAEpC,SACE,oBAAC,YAAO,KAAK,WAAW,WAAsB,OAC3C,UACH;AAEJ;","names":[]}
@@ -0,0 +1,19 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { HeaderNavigationItemConfig, HeaderConfig, Site } from '@otl-core/cms-types';
3
+ import React__default from 'react';
4
+
5
+ interface NavigationDropdownProps {
6
+ itemId: string;
7
+ config: HeaderNavigationItemConfig;
8
+ navigation: HeaderConfig;
9
+ resolvedColors: Record<string, string | undefined>;
10
+ styles: React__default.CSSProperties;
11
+ linkStyle: React__default.CSSProperties;
12
+ dropdownId: string;
13
+ site: Site;
14
+ containerContent?: boolean;
15
+ isSameLayer?: boolean;
16
+ }
17
+ declare function NavigationDropdown({ itemId, config, navigation, resolvedColors, dropdownId, site, containerContent, isSameLayer, }: NavigationDropdownProps): react_jsx_runtime.JSX.Element | null;
18
+
19
+ export { NavigationDropdown };