@mounaji_npm/navbar 0.1.0

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/README.md ADDED
@@ -0,0 +1,78 @@
1
+ # @mounaji_npm/navbar
2
+
3
+ Composable top navigation bar — logo, links, dropdowns, mobile drawer, auth slot.
4
+ Token-driven. Zero router dependency.
5
+
6
+ ## Install
7
+
8
+ ```bash
9
+ npm install @mounaji_npm/navbar @mounaji_npm/tokens
10
+ ```
11
+
12
+ ## Usage
13
+
14
+ ```jsx
15
+ import { Navbar } from '@mounaji_npm/navbar';
16
+
17
+ <Navbar
18
+ logo={{ text: 'My App', href: '/' }}
19
+ links={[
20
+ { label: 'Features', href: '/features' },
21
+ { label: 'Pricing', href: '/pricing' },
22
+ {
23
+ label: 'Resources',
24
+ children: [
25
+ { label: 'Docs', href: '/docs' },
26
+ { label: 'Blog', href: '/blog' },
27
+ ],
28
+ },
29
+ ]}
30
+ actions={[
31
+ { label: 'Log in', variant: 'ghost', href: '/login' },
32
+ { label: 'Get Started', variant: 'primary', href: '/signup' },
33
+ ]}
34
+ sticky
35
+ isDark
36
+ />
37
+ ```
38
+
39
+ ## With auth slot
40
+
41
+ ```jsx
42
+ import { Navbar } from '@mounaji_npm/navbar';
43
+ import { LoginButton } from '@mounaji_npm/auth';
44
+
45
+ <Navbar
46
+ logo={{ text: 'My App' }}
47
+ links={[...]}
48
+ authSlot={<LoginButton />}
49
+ />
50
+ ```
51
+
52
+ ## Props
53
+
54
+ | Prop | Type | Default | Description |
55
+ |--------------------|--------------------------|----------|--------------------------------------------------|
56
+ | `logo` | `LogoConfig` | `{}` | `{ text?, src?, alt?, href?, onClick? }` |
57
+ | `links` | `NavLink[]` | `[]` | `{ label, href?, onClick?, icon?, active?, children? }` |
58
+ | `actions` | `NavAction[]` | `[]` | `{ label, href?, onClick?, variant?, icon?, size? }` |
59
+ | `authSlot` | `ReactNode` | – | Injected right of links (e.g. `<LoginButton />`) |
60
+ | `sticky` | `boolean` | `true` | `position: sticky` |
61
+ | `transparent` | `boolean` | `false` | No background (glass effect on scroll) |
62
+ | `blurOnScroll` | `boolean` | `true` | Backdrop blur after scroll |
63
+ | `isDark` | `boolean` | `true` | Dark or light mode token set |
64
+ | `mobileBreakpoint` | `number` | `768` | px below which mobile drawer activates |
65
+ | `height` | `number` | `64` | Navbar height in px |
66
+ | `style` | `CSSProperties` | – | Container override |
67
+
68
+ ## Sub-components
69
+
70
+ ```jsx
71
+ import { NavLogo, NavLink, NavDropdown, NavActions, NavHamburger, NavMobileDrawer } from '@mounaji_npm/navbar';
72
+ ```
73
+
74
+ ## Demo data
75
+
76
+ ```jsx
77
+ import { DEMO_LOGO, DEMO_LINKS, DEMO_ACTIONS } from '@mounaji_npm/navbar';
78
+ ```
@@ -0,0 +1,435 @@
1
+ "use client";
2
+ import { jsx as n, jsxs as p, Fragment as z } from "react/jsx-runtime";
3
+ import { useState as h, useRef as L, useEffect as k } from "react";
4
+ function R({ logo: e = {}, isDark: r }) {
5
+ const { text: m, src: o, alt: t, href: i, onClick: s } = e, l = /* @__PURE__ */ p("span", { style: { display: "flex", alignItems: "center", gap: "10px", textDecoration: "none", cursor: i || s ? "pointer" : "default" }, children: [
6
+ o && /* @__PURE__ */ n(
7
+ "img",
8
+ {
9
+ src: o,
10
+ alt: t || m || "Logo",
11
+ style: { height: "32px", width: "auto", display: "block", flexShrink: 0 }
12
+ }
13
+ ),
14
+ m && /* @__PURE__ */ n("span", { style: {
15
+ fontFamily: "var(--mn-font-family, system-ui, sans-serif)",
16
+ fontSize: "var(--mn-font-size-lg, 1.125rem)",
17
+ fontWeight: "var(--mn-font-weight-bold, 700)",
18
+ color: r ? "var(--mn-text-primary-dark, #F0F4FF)" : "var(--mn-text-primary-light, #1C1915)",
19
+ letterSpacing: "-0.02em",
20
+ whiteSpace: "nowrap"
21
+ }, children: m })
22
+ ] });
23
+ return i ? /* @__PURE__ */ n("a", { href: i, style: { textDecoration: "none" }, children: l }) : s ? /* @__PURE__ */ n("button", { onClick: s, style: { background: "none", border: "none", padding: 0 }, children: l }) : l;
24
+ }
25
+ function M({ link: e, isDark: r, onMouseEnter: m, onMouseLeave: o }) {
26
+ const { label: t, href: i, onClick: s, active: a, icon: l } = e, [f, d] = h(!1), v = {
27
+ display: "inline-flex",
28
+ alignItems: "center",
29
+ gap: "6px",
30
+ padding: "6px 12px",
31
+ borderRadius: "var(--mn-radius-md, 0.5rem)",
32
+ fontFamily: "var(--mn-font-family, system-ui, sans-serif)",
33
+ fontSize: "var(--mn-font-size-sm, 0.875rem)",
34
+ fontWeight: a ? "var(--mn-font-weight-semibold, 600)" : "var(--mn-font-weight-medium, 500)",
35
+ color: a ? "var(--mn-color-primary, #3B82F6)" : f ? r ? "var(--mn-topnav-text-primary-dark, #F0F4FF)" : "var(--mn-topnav-text-primary-light, #1C1915)" : r ? "var(--mn-topnav-text-secondary-dark, #94A3B8)" : "var(--mn-topnav-text-secondary-light, #47413C)",
36
+ background: a ? r ? "rgba(59,130,246,0.1)" : "rgba(59,130,246,0.08)" : f ? r ? "rgba(255,255,255,0.05)" : "rgba(0,0,0,0.04)" : "transparent",
37
+ textDecoration: "none",
38
+ cursor: "pointer",
39
+ border: "none",
40
+ transition: "color var(--mn-duration-fast, 150ms) var(--mn-easing-default, ease), background var(--mn-duration-fast, 150ms) var(--mn-easing-default, ease)",
41
+ whiteSpace: "nowrap"
42
+ }, c = (g) => {
43
+ d(!0), m == null || m(g);
44
+ }, x = (g) => {
45
+ d(!1), o == null || o(g);
46
+ };
47
+ return i ? /* @__PURE__ */ p("a", { href: i, style: v, onMouseEnter: c, onMouseLeave: x, children: [
48
+ l && /* @__PURE__ */ n("span", { style: { fontSize: "1em" }, children: l }),
49
+ t
50
+ ] }) : /* @__PURE__ */ p("button", { onClick: s, style: v, onMouseEnter: c, onMouseLeave: x, children: [
51
+ l && /* @__PURE__ */ n("span", { style: { fontSize: "1em" }, children: l }),
52
+ t
53
+ ] });
54
+ }
55
+ function O({ link: e, isDark: r }) {
56
+ const { label: m, icon: o, children: t = [], active: i } = e, [s, a] = h(!1), l = L(null), f = r ? "var(--mn-topnav-text-primary-dark, #F0F4FF)" : "var(--mn-topnav-text-primary-light, #1C1915)", d = r ? "var(--mn-topnav-text-secondary-dark, #94A3B8)" : "var(--mn-topnav-text-secondary-light, #47413C)", u = r ? "var(--mn-color-card-dark, #0B0F23)" : "var(--mn-color-card-light, #EDE8DE)", y = r ? "var(--mn-border-dark, rgba(255,255,255,0.07))" : "var(--mn-border-light, #C9C2B6)";
57
+ k(() => {
58
+ function x(g) {
59
+ l.current && !l.current.contains(g.target) && a(!1);
60
+ }
61
+ return document.addEventListener("mousedown", x), () => document.removeEventListener("mousedown", x);
62
+ }, []);
63
+ const v = {
64
+ display: "inline-flex",
65
+ alignItems: "center",
66
+ gap: "6px",
67
+ padding: "6px 12px",
68
+ borderRadius: "var(--mn-radius-md, 0.5rem)",
69
+ fontFamily: "var(--mn-font-family, system-ui, sans-serif)",
70
+ fontSize: "var(--mn-font-size-sm, 0.875rem)",
71
+ fontWeight: i ? "var(--mn-font-weight-semibold, 600)" : "var(--mn-font-weight-medium, 500)",
72
+ color: i ? "var(--mn-color-primary, #3B82F6)" : s ? f : d,
73
+ background: s ? r ? "rgba(255,255,255,0.05)" : "rgba(0,0,0,0.04)" : "transparent",
74
+ border: "none",
75
+ cursor: "pointer",
76
+ transition: "color var(--mn-duration-fast, 150ms) ease, background var(--mn-duration-fast, 150ms) ease",
77
+ whiteSpace: "nowrap"
78
+ }, c = {
79
+ position: "absolute",
80
+ top: "calc(100% + 8px)",
81
+ left: 0,
82
+ minWidth: "200px",
83
+ background: u,
84
+ border: `1px solid ${y}`,
85
+ borderRadius: "var(--mn-radius-lg, 0.75rem)",
86
+ boxShadow: "var(--mn-shadow-md, 0 4px 16px rgba(0,0,0,0.18))",
87
+ padding: "6px",
88
+ zIndex: 1e3,
89
+ opacity: s ? 1 : 0,
90
+ transform: s ? "translateY(0)" : "translateY(-6px)",
91
+ pointerEvents: s ? "auto" : "none",
92
+ transition: "opacity var(--mn-duration-fast, 150ms) ease, transform var(--mn-duration-fast, 150ms) ease"
93
+ };
94
+ return /* @__PURE__ */ p("div", { ref: l, style: { position: "relative" }, children: [
95
+ /* @__PURE__ */ p("button", { style: v, onClick: () => a((x) => !x), children: [
96
+ o && /* @__PURE__ */ n("span", { children: o }),
97
+ m,
98
+ /* @__PURE__ */ n("span", { style: { fontSize: "10px", marginLeft: "2px", transform: s ? "rotate(180deg)" : "none", transition: "transform var(--mn-duration-fast, 150ms) ease", display: "inline-block" }, children: "▼" })
99
+ ] }),
100
+ /* @__PURE__ */ n("div", { style: c, children: t.map((x, g) => /* @__PURE__ */ n(W, { child: x, isDark: r, textColor: f, onClose: () => a(!1) }, g)) })
101
+ ] });
102
+ }
103
+ function W({ child: e, isDark: r, textColor: m, onClose: o }) {
104
+ const [t, i] = h(!1), s = {
105
+ display: "block",
106
+ width: "100%",
107
+ textAlign: "left",
108
+ padding: "8px 12px",
109
+ borderRadius: "var(--mn-radius-sm, 0.375rem)",
110
+ fontFamily: "var(--mn-font-family, system-ui, sans-serif)",
111
+ fontSize: "var(--mn-font-size-sm, 0.875rem)",
112
+ fontWeight: "var(--mn-font-weight-medium, 500)",
113
+ color: t ? "var(--mn-color-primary, #3B82F6)" : m,
114
+ background: t ? r ? "rgba(59,130,246,0.1)" : "rgba(59,130,246,0.08)" : "transparent",
115
+ border: "none",
116
+ cursor: "pointer",
117
+ textDecoration: "none",
118
+ transition: "color var(--mn-duration-fast, 150ms) ease, background var(--mn-duration-fast, 150ms) ease"
119
+ };
120
+ return e.href ? /* @__PURE__ */ p("a", { href: e.href, style: s, onMouseEnter: () => i(!0), onMouseLeave: () => i(!1), onClick: o, children: [
121
+ e.icon && /* @__PURE__ */ n("span", { style: { marginRight: "8px" }, children: e.icon }),
122
+ e.label
123
+ ] }) : /* @__PURE__ */ p("button", { style: s, onMouseEnter: () => i(!0), onMouseLeave: () => i(!1), onClick: () => {
124
+ var a;
125
+ (a = e.onClick) == null || a.call(e), o();
126
+ }, children: [
127
+ e.icon && /* @__PURE__ */ n("span", { style: { marginRight: "8px" }, children: e.icon }),
128
+ e.label
129
+ ] });
130
+ }
131
+ function N({ actions: e = [], isDark: r }) {
132
+ return /* @__PURE__ */ n("div", { style: { display: "flex", alignItems: "center", gap: "8px" }, children: e.map((m, o) => /* @__PURE__ */ n($, { action: m, isDark: r }, o)) });
133
+ }
134
+ function $({ action: e, isDark: r }) {
135
+ const { label: m, onClick: o, href: t, variant: i = "primary", icon: s, size: a = "sm" } = e, [l, f] = h(!1), d = {
136
+ display: "inline-flex",
137
+ alignItems: "center",
138
+ gap: "6px",
139
+ fontFamily: "var(--mn-font-family, system-ui, sans-serif)",
140
+ fontWeight: "var(--mn-font-weight-semibold, 600)",
141
+ borderRadius: "var(--mn-radius-md, 0.5rem)",
142
+ cursor: "pointer",
143
+ textDecoration: "none",
144
+ border: "none",
145
+ transition: "all var(--mn-duration-fast, 150ms) var(--mn-easing-default, ease)",
146
+ whiteSpace: "nowrap"
147
+ }, u = {
148
+ sm: { padding: "7px 16px", fontSize: "var(--mn-font-size-sm, 0.875rem)" },
149
+ md: { padding: "9px 20px", fontSize: "var(--mn-font-size-base, 1rem)" }
150
+ }, y = {
151
+ primary: {
152
+ background: l ? "var(--mn-color-primary-hover, #60A5FA)" : "var(--mn-color-primary, #3B82F6)",
153
+ color: "#fff"
154
+ },
155
+ outline: {
156
+ background: "transparent",
157
+ color: r ? "var(--mn-topnav-text-primary-dark, #F0F4FF)" : "var(--mn-topnav-text-primary-light, #1C1915)",
158
+ border: `1px solid ${r ? "var(--mn-border-md-dark, rgba(255,255,255,0.13))" : "var(--mn-border-light, #C9C2B6)"}`
159
+ },
160
+ ghost: {
161
+ background: l ? r ? "rgba(255,255,255,0.05)" : "rgba(0,0,0,0.04)" : "transparent",
162
+ color: r ? "var(--mn-topnav-text-secondary-dark, #94A3B8)" : "var(--mn-topnav-text-secondary-light, #47413C)",
163
+ border: "none"
164
+ },
165
+ gradient: {
166
+ background: l ? "linear-gradient(135deg, #60A5FA, #A78BFA)" : "var(--mn-gradient-primary, linear-gradient(135deg, #3B82F6, #7C3AED))",
167
+ color: "#fff"
168
+ }
169
+ }, v = { ...d, ...u[a] ?? u.sm, ...y[i] ?? y.primary };
170
+ return t ? /* @__PURE__ */ p("a", { href: t, style: v, onMouseEnter: () => f(!0), onMouseLeave: () => f(!1), children: [
171
+ s && /* @__PURE__ */ n("span", { children: s }),
172
+ m
173
+ ] }) : /* @__PURE__ */ p("button", { style: v, onClick: o, onMouseEnter: () => f(!0), onMouseLeave: () => f(!1), children: [
174
+ s && /* @__PURE__ */ n("span", { children: s }),
175
+ m
176
+ ] });
177
+ }
178
+ function H({ open: e, onClick: r, isDark: m }) {
179
+ const o = m ? "var(--mn-topnav-text-primary-dark, #F0F4FF)" : "var(--mn-topnav-text-primary-light, #1C1915)";
180
+ return /* @__PURE__ */ n(
181
+ "button",
182
+ {
183
+ onClick: r,
184
+ "aria-label": e ? "Close menu" : "Open menu",
185
+ "aria-expanded": e,
186
+ style: {
187
+ background: "none",
188
+ border: "none",
189
+ cursor: "pointer",
190
+ padding: "8px",
191
+ display: "flex",
192
+ flexDirection: "column",
193
+ gap: "5px",
194
+ borderRadius: "var(--mn-radius-sm, 0.375rem)"
195
+ },
196
+ children: [0, 1, 2].map((t) => /* @__PURE__ */ n("span", { style: {
197
+ display: "block",
198
+ width: "22px",
199
+ height: "2px",
200
+ background: o,
201
+ borderRadius: "2px",
202
+ transition: "all var(--mn-duration-normal, 200ms) ease",
203
+ transformOrigin: "center",
204
+ transform: e ? t === 0 ? "translateY(7px) rotate(45deg)" : t === 2 ? "translateY(-7px) rotate(-45deg)" : "scaleX(0) opacity(0)" : "none",
205
+ opacity: e && t === 1 ? 0 : 1
206
+ } }, t))
207
+ }
208
+ );
209
+ }
210
+ function Y({ open: e, links: r = [], actions: m = [], authSlot: o, isDark: t, onClose: i }) {
211
+ const s = t ? "var(--mn-color-nav-dark, #07091C)" : "var(--mn-color-nav-light, #E1DAD0)", a = t ? "var(--mn-border-dark, rgba(255,255,255,0.07))" : "var(--mn-border-light, #C9C2B6)", l = t ? "var(--mn-topnav-text-primary-dark, #F0F4FF)" : "var(--mn-topnav-text-primary-light, #1C1915)", f = t ? "var(--mn-topnav-text-secondary-dark, #94A3B8)" : "var(--mn-topnav-text-secondary-light, #47413C)";
212
+ return k(() => (e ? document.body.style.overflow = "hidden" : document.body.style.overflow = "", () => {
213
+ document.body.style.overflow = "";
214
+ }), [e]), /* @__PURE__ */ p(z, { children: [
215
+ /* @__PURE__ */ n(
216
+ "div",
217
+ {
218
+ onClick: i,
219
+ style: {
220
+ position: "fixed",
221
+ inset: 0,
222
+ zIndex: 998,
223
+ background: "rgba(0,0,0,0.5)",
224
+ opacity: e ? 1 : 0,
225
+ pointerEvents: e ? "auto" : "none",
226
+ transition: "opacity var(--mn-duration-normal, 200ms) ease"
227
+ }
228
+ }
229
+ ),
230
+ /* @__PURE__ */ p("div", { style: {
231
+ position: "fixed",
232
+ top: 0,
233
+ right: 0,
234
+ bottom: 0,
235
+ width: "min(320px, 85vw)",
236
+ background: s,
237
+ borderLeft: `1px solid ${a}`,
238
+ zIndex: 999,
239
+ transform: e ? "translateX(0)" : "translateX(100%)",
240
+ transition: "transform var(--mn-duration-normal, 200ms) var(--mn-easing-default, ease)",
241
+ display: "flex",
242
+ flexDirection: "column",
243
+ padding: "24px 20px",
244
+ overflowY: "auto"
245
+ }, children: [
246
+ /* @__PURE__ */ n("button", { onClick: i, style: { alignSelf: "flex-end", background: "none", border: "none", cursor: "pointer", color: f, fontSize: "20px", lineHeight: 1, padding: "4px" }, children: "✕" }),
247
+ /* @__PURE__ */ n("nav", { style: { display: "flex", flexDirection: "column", gap: "4px", marginTop: "16px" }, children: r.map((d, u) => /* @__PURE__ */ n(D, { link: d, isDark: t, textColor: l, mutedColor: f, onClose: i }, u)) }),
248
+ (m.length > 0 || o) && /* @__PURE__ */ n("div", { style: { borderTop: `1px solid ${a}`, margin: "20px 0" } }),
249
+ o && /* @__PURE__ */ n("div", { style: { marginBottom: "12px" }, children: o }),
250
+ /* @__PURE__ */ n("div", { style: { display: "flex", flexDirection: "column", gap: "8px" }, children: m.map((d, u) => /* @__PURE__ */ n(
251
+ "a",
252
+ {
253
+ href: d.href,
254
+ onClick: () => {
255
+ var y;
256
+ (y = d.onClick) == null || y.call(d), i();
257
+ },
258
+ style: {
259
+ display: "block",
260
+ padding: "10px 16px",
261
+ borderRadius: "var(--mn-radius-md, 0.5rem)",
262
+ textAlign: "center",
263
+ fontFamily: "var(--mn-font-family, system-ui, sans-serif)",
264
+ fontWeight: "var(--mn-font-weight-semibold, 600)",
265
+ fontSize: "var(--mn-font-size-sm, 0.875rem)",
266
+ cursor: "pointer",
267
+ textDecoration: "none",
268
+ background: d.variant === "primary" || !d.variant ? "var(--mn-color-primary, #3B82F6)" : "transparent",
269
+ color: d.variant === "primary" || !d.variant ? "#fff" : l,
270
+ border: d.variant === "outline" ? `1px solid ${a}` : "none"
271
+ },
272
+ children: d.label
273
+ },
274
+ u
275
+ )) })
276
+ ] })
277
+ ] });
278
+ }
279
+ function D({ link: e, isDark: r, textColor: m, mutedColor: o, onClose: t }) {
280
+ const { label: i, href: s, onClick: a, icon: l, active: f, children: d } = e, [u, y] = h(!1), v = {
281
+ display: "flex",
282
+ alignItems: "center",
283
+ justifyContent: "space-between",
284
+ padding: "10px 12px",
285
+ borderRadius: "var(--mn-radius-md, 0.5rem)",
286
+ fontFamily: "var(--mn-font-family, system-ui, sans-serif)",
287
+ fontSize: "var(--mn-font-size-base, 1rem)",
288
+ fontWeight: f ? "var(--mn-font-weight-semibold, 600)" : "var(--mn-font-weight-medium, 500)",
289
+ color: f ? "var(--mn-color-primary, #3B82F6)" : m,
290
+ background: f ? r ? "rgba(59,130,246,0.1)" : "rgba(59,130,246,0.08)" : "transparent",
291
+ textDecoration: "none",
292
+ cursor: "pointer",
293
+ border: "none",
294
+ width: "100%",
295
+ textAlign: "left"
296
+ };
297
+ return d != null && d.length ? /* @__PURE__ */ p("div", { children: [
298
+ /* @__PURE__ */ p("button", { style: v, onClick: () => y((c) => !c), children: [
299
+ /* @__PURE__ */ p("span", { style: { display: "flex", alignItems: "center", gap: "8px" }, children: [
300
+ l && /* @__PURE__ */ n("span", { children: l }),
301
+ i
302
+ ] }),
303
+ /* @__PURE__ */ n("span", { style: { fontSize: "10px", transform: u ? "rotate(180deg)" : "none", transition: "transform 150ms ease", display: "inline-block" }, children: "▼" })
304
+ ] }),
305
+ u && /* @__PURE__ */ n("div", { style: { paddingLeft: "12px", marginTop: "4px", display: "flex", flexDirection: "column", gap: "2px" }, children: d.map((c, x) => c.href ? /* @__PURE__ */ p("a", { href: c.href, style: { ...v, fontSize: "var(--mn-font-size-sm, 0.875rem)", color: o }, onClick: t, children: [
306
+ c.icon && /* @__PURE__ */ n("span", { style: { marginRight: "8px" }, children: c.icon }),
307
+ c.label
308
+ ] }, x) : /* @__PURE__ */ p("button", { style: { ...v, fontSize: "var(--mn-font-size-sm, 0.875rem)", color: o }, onClick: () => {
309
+ var g;
310
+ (g = c.onClick) == null || g.call(c), t();
311
+ }, children: [
312
+ c.icon && /* @__PURE__ */ n("span", { style: { marginRight: "8px" }, children: c.icon }),
313
+ c.label
314
+ ] }, x)) })
315
+ ] }) : s ? /* @__PURE__ */ p("a", { href: s, style: v, onClick: t, children: [
316
+ l && /* @__PURE__ */ n("span", { style: { marginRight: "8px" }, children: l }),
317
+ i
318
+ ] }) : /* @__PURE__ */ p("button", { style: v, onClick: () => {
319
+ a == null || a(), t();
320
+ }, children: [
321
+ l && /* @__PURE__ */ n("span", { style: { marginRight: "8px" }, children: l }),
322
+ i
323
+ ] });
324
+ }
325
+ function _({
326
+ logo: e = {},
327
+ links: r = [],
328
+ actions: m = [],
329
+ authSlot: o,
330
+ sticky: t = !0,
331
+ transparent: i = !1,
332
+ blurOnScroll: s = !0,
333
+ isDark: a = !0,
334
+ tokens: l,
335
+ style: f,
336
+ mobileBreakpoint: d = 768,
337
+ height: u = 64
338
+ }) {
339
+ const [y, v] = h(!1), [c, x] = h(!1), [g, B] = h(!1);
340
+ k(() => {
341
+ function b() {
342
+ B(window.innerWidth < d);
343
+ }
344
+ function w() {
345
+ x(window.scrollY > 12);
346
+ }
347
+ return b(), w(), window.addEventListener("resize", b), window.addEventListener("scroll", w, { passive: !0 }), () => {
348
+ window.removeEventListener("resize", b), window.removeEventListener("scroll", w);
349
+ };
350
+ }, [d]);
351
+ const E = a ? "var(--mn-color-nav-dark, #07091C)" : "var(--mn-color-nav-light, #E1DAD0)", A = a ? "var(--mn-border-dark, rgba(255,255,255,0.07))" : "var(--mn-border-light, #C9C2B6)", C = !i || c, F = s && c, I = {
352
+ position: t ? "sticky" : "relative",
353
+ top: 0,
354
+ zIndex: 100,
355
+ width: "100%",
356
+ height: `${u}px`,
357
+ display: "flex",
358
+ alignItems: "center",
359
+ background: C ? E : "transparent",
360
+ borderBottom: C ? `1px solid ${A}` : "none",
361
+ backdropFilter: F ? "blur(12px) saturate(1.3)" : "none",
362
+ WebkitBackdropFilter: F ? "blur(12px) saturate(1.3)" : "none",
363
+ transition: "background var(--mn-duration-normal, 200ms) ease, border-color var(--mn-duration-normal, 200ms) ease",
364
+ fontFamily: "var(--mn-font-family, system-ui, sans-serif)",
365
+ ...f
366
+ };
367
+ return /* @__PURE__ */ p(z, { children: [
368
+ /* @__PURE__ */ n("nav", { style: I, role: "navigation", "aria-label": "Main navigation", children: /* @__PURE__ */ p("div", { style: {
369
+ width: "100%",
370
+ maxWidth: "1280px",
371
+ margin: "0 auto",
372
+ padding: "0 var(--mn-spacing-lg, 24px)",
373
+ display: "flex",
374
+ alignItems: "center",
375
+ gap: "var(--mn-spacing-lg, 24px)"
376
+ }, children: [
377
+ /* @__PURE__ */ n("div", { style: { flexShrink: 0 }, children: /* @__PURE__ */ n(R, { logo: e, isDark: a }) }),
378
+ !g && /* @__PURE__ */ n("div", { style: { display: "flex", alignItems: "center", gap: "4px", flex: 1 }, children: r.map(
379
+ (b, w) => {
380
+ var S;
381
+ return (S = b.children) != null && S.length ? /* @__PURE__ */ n(O, { link: b, isDark: a }, w) : /* @__PURE__ */ n(M, { link: b, isDark: a }, w);
382
+ }
383
+ ) }),
384
+ /* @__PURE__ */ n("div", { style: { flex: g ? 1 : 0 } }),
385
+ !g && /* @__PURE__ */ p("div", { style: { display: "flex", alignItems: "center", gap: "8px", flexShrink: 0 }, children: [
386
+ o,
387
+ /* @__PURE__ */ n(N, { actions: m, isDark: a })
388
+ ] }),
389
+ g && /* @__PURE__ */ n(H, { open: y, onClick: () => v((b) => !b), isDark: a })
390
+ ] }) }),
391
+ g && /* @__PURE__ */ n(
392
+ Y,
393
+ {
394
+ open: y,
395
+ links: r,
396
+ actions: m,
397
+ authSlot: o,
398
+ isDark: a,
399
+ onClose: () => v(!1)
400
+ }
401
+ )
402
+ ] });
403
+ }
404
+ const G = {
405
+ text: "Acme SaaS",
406
+ href: "/"
407
+ }, K = [
408
+ { label: "Home", href: "/", active: !0 },
409
+ { label: "Features", href: "/features" },
410
+ { label: "Pricing", href: "/pricing" },
411
+ {
412
+ label: "Resources",
413
+ children: [
414
+ { label: "Documentation", href: "/docs", icon: "📄" },
415
+ { label: "Blog", href: "/blog", icon: "✍️" },
416
+ { label: "Changelog", href: "/changelog", icon: "🕐" }
417
+ ]
418
+ }
419
+ ], P = [
420
+ { label: "Log in", variant: "ghost", href: "/login" },
421
+ { label: "Get Started", variant: "primary", href: "/signup" }
422
+ ];
423
+ export {
424
+ P as DEMO_ACTIONS,
425
+ K as DEMO_LINKS,
426
+ G as DEMO_LOGO,
427
+ N as NavActions,
428
+ O as NavDropdown,
429
+ H as NavHamburger,
430
+ M as NavLink,
431
+ R as NavLogo,
432
+ Y as NavMobileDrawer,
433
+ _ as Navbar
434
+ };
435
+ //# sourceMappingURL=mounajinavbar.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mounajinavbar.es.js","sources":["../src/components/NavLogo.jsx","../src/components/NavLink.jsx","../src/components/NavDropdown.jsx","../src/components/NavActions.jsx","../src/components/NavMobileMenu.jsx","../src/Navbar.jsx","../src/demo.js"],"sourcesContent":["import { useState } from 'react';\n\nexport function NavLogo({ logo = {}, isDark }) {\n const { text, src, alt, href, onClick } = logo;\n const textColor = isDark ? 'var(--mn-text-primary-dark, #F0F4FF)' : 'var(--mn-text-primary-light, #1C1915)';\n\n const inner = (\n <span style={{ display: 'flex', alignItems: 'center', gap: '10px', textDecoration: 'none', cursor: href || onClick ? 'pointer' : 'default' }}>\n {src && (\n <img\n src={src}\n alt={alt || text || 'Logo'}\n style={{ height: '32px', width: 'auto', display: 'block', flexShrink: 0 }}\n />\n )}\n {text && (\n <span style={{\n fontFamily: 'var(--mn-font-family, system-ui, sans-serif)',\n fontSize: 'var(--mn-font-size-lg, 1.125rem)',\n fontWeight: 'var(--mn-font-weight-bold, 700)',\n color: textColor,\n letterSpacing: '-0.02em',\n whiteSpace: 'nowrap',\n }}>\n {text}\n </span>\n )}\n </span>\n );\n\n if (href) {\n return <a href={href} style={{ textDecoration: 'none' }}>{inner}</a>;\n }\n if (onClick) {\n return <button onClick={onClick} style={{ background: 'none', border: 'none', padding: 0 }}>{inner}</button>;\n }\n return inner;\n}\n","import { useState } from 'react';\n\nexport function NavLink({ link, isDark, onMouseEnter, onMouseLeave }) {\n const { label, href, onClick, active, icon } = link;\n const [hovered, setHovered] = useState(false);\n\n const textColor = isDark\n ? 'var(--mn-topnav-text-primary-dark, #F0F4FF)'\n : 'var(--mn-topnav-text-primary-light, #1C1915)';\n const mutedColor = isDark\n ? 'var(--mn-topnav-text-secondary-dark, #94A3B8)'\n : 'var(--mn-topnav-text-secondary-light, #47413C)';\n\n const style = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '6px',\n padding: '6px 12px',\n borderRadius: 'var(--mn-radius-md, 0.5rem)',\n fontFamily: 'var(--mn-font-family, system-ui, sans-serif)',\n fontSize: 'var(--mn-font-size-sm, 0.875rem)',\n fontWeight: active ? 'var(--mn-font-weight-semibold, 600)' : 'var(--mn-font-weight-medium, 500)',\n color: active ? 'var(--mn-color-primary, #3B82F6)' : (hovered ? textColor : mutedColor),\n background: active\n ? (isDark ? 'rgba(59,130,246,0.1)' : 'rgba(59,130,246,0.08)')\n : (hovered ? (isDark ? 'rgba(255,255,255,0.05)' : 'rgba(0,0,0,0.04)') : 'transparent'),\n textDecoration: 'none',\n cursor: 'pointer',\n border: 'none',\n transition: 'color var(--mn-duration-fast, 150ms) var(--mn-easing-default, ease), background var(--mn-duration-fast, 150ms) var(--mn-easing-default, ease)',\n whiteSpace: 'nowrap',\n };\n\n const handleMouseEnter = (e) => { setHovered(true); onMouseEnter?.(e); };\n const handleMouseLeave = (e) => { setHovered(false); onMouseLeave?.(e); };\n\n if (href) {\n return (\n <a href={href} style={style} onMouseEnter={handleMouseEnter} onMouseLeave={handleMouseLeave}>\n {icon && <span style={{ fontSize: '1em' }}>{icon}</span>}\n {label}\n </a>\n );\n }\n\n return (\n <button onClick={onClick} style={style} onMouseEnter={handleMouseEnter} onMouseLeave={handleMouseLeave}>\n {icon && <span style={{ fontSize: '1em' }}>{icon}</span>}\n {label}\n </button>\n );\n}\n","import { useState, useRef, useEffect } from 'react';\n\nexport function NavDropdown({ link, isDark }) {\n const { label, icon, children = [], active } = link;\n const [open, setOpen] = useState(false);\n const ref = useRef(null);\n\n const textColor = isDark ? 'var(--mn-topnav-text-primary-dark, #F0F4FF)' : 'var(--mn-topnav-text-primary-light, #1C1915)';\n const mutedColor = isDark ? 'var(--mn-topnav-text-secondary-dark, #94A3B8)' : 'var(--mn-topnav-text-secondary-light, #47413C)';\n const cardBg = isDark ? 'var(--mn-color-card-dark, #0B0F23)' : 'var(--mn-color-card-light, #EDE8DE)';\n const borderColor = isDark ? 'var(--mn-border-dark, rgba(255,255,255,0.07))' : 'var(--mn-border-light, #C9C2B6)';\n\n useEffect(() => {\n function handleClick(e) {\n if (ref.current && !ref.current.contains(e.target)) setOpen(false);\n }\n document.addEventListener('mousedown', handleClick);\n return () => document.removeEventListener('mousedown', handleClick);\n }, []);\n\n const triggerStyle = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '6px',\n padding: '6px 12px',\n borderRadius: 'var(--mn-radius-md, 0.5rem)',\n fontFamily: 'var(--mn-font-family, system-ui, sans-serif)',\n fontSize: 'var(--mn-font-size-sm, 0.875rem)',\n fontWeight: active ? 'var(--mn-font-weight-semibold, 600)' : 'var(--mn-font-weight-medium, 500)',\n color: active ? 'var(--mn-color-primary, #3B82F6)' : (open ? textColor : mutedColor),\n background: open ? (isDark ? 'rgba(255,255,255,0.05)' : 'rgba(0,0,0,0.04)') : 'transparent',\n border: 'none',\n cursor: 'pointer',\n transition: 'color var(--mn-duration-fast, 150ms) ease, background var(--mn-duration-fast, 150ms) ease',\n whiteSpace: 'nowrap',\n };\n\n const dropdownStyle = {\n position: 'absolute',\n top: 'calc(100% + 8px)',\n left: 0,\n minWidth: '200px',\n background: cardBg,\n border: `1px solid ${borderColor}`,\n borderRadius: 'var(--mn-radius-lg, 0.75rem)',\n boxShadow: 'var(--mn-shadow-md, 0 4px 16px rgba(0,0,0,0.18))',\n padding: '6px',\n zIndex: 1000,\n opacity: open ? 1 : 0,\n transform: open ? 'translateY(0)' : 'translateY(-6px)',\n pointerEvents: open ? 'auto' : 'none',\n transition: 'opacity var(--mn-duration-fast, 150ms) ease, transform var(--mn-duration-fast, 150ms) ease',\n };\n\n const itemStyle = (hovered) => ({\n display: 'block',\n width: '100%',\n textAlign: 'left',\n padding: '8px 12px',\n borderRadius: 'var(--mn-radius-sm, 0.375rem)',\n fontFamily: 'var(--mn-font-family, system-ui, sans-serif)',\n fontSize: 'var(--mn-font-size-sm, 0.875rem)',\n fontWeight: 'var(--mn-font-weight-medium, 500)',\n color: hovered ? 'var(--mn-color-primary, #3B82F6)' : textColor,\n background: hovered ? (isDark ? 'rgba(59,130,246,0.1)' : 'rgba(59,130,246,0.08)') : 'transparent',\n border: 'none',\n cursor: 'pointer',\n textDecoration: 'none',\n transition: 'color var(--mn-duration-fast, 150ms) ease, background var(--mn-duration-fast, 150ms) ease',\n });\n\n return (\n <div ref={ref} style={{ position: 'relative' }}>\n <button style={triggerStyle} onClick={() => setOpen(o => !o)}>\n {icon && <span>{icon}</span>}\n {label}\n <span style={{ fontSize: '10px', marginLeft: '2px', transform: open ? 'rotate(180deg)' : 'none', transition: 'transform var(--mn-duration-fast, 150ms) ease', display: 'inline-block' }}>▼</span>\n </button>\n <div style={dropdownStyle}>\n {children.map((child, i) => (\n <DropdownItem key={i} child={child} isDark={isDark} textColor={textColor} onClose={() => setOpen(false)} />\n ))}\n </div>\n </div>\n );\n}\n\nfunction DropdownItem({ child, isDark, textColor, onClose }) {\n const [hov, setHov] = useState(false);\n const cardBg = isDark ? 'var(--mn-color-card-dark, #0B0F23)' : 'var(--mn-color-card-light, #EDE8DE)';\n\n const s = {\n display: 'block',\n width: '100%',\n textAlign: 'left',\n padding: '8px 12px',\n borderRadius: 'var(--mn-radius-sm, 0.375rem)',\n fontFamily: 'var(--mn-font-family, system-ui, sans-serif)',\n fontSize: 'var(--mn-font-size-sm, 0.875rem)',\n fontWeight: 'var(--mn-font-weight-medium, 500)',\n color: hov ? 'var(--mn-color-primary, #3B82F6)' : textColor,\n background: hov ? (isDark ? 'rgba(59,130,246,0.1)' : 'rgba(59,130,246,0.08)') : 'transparent',\n border: 'none',\n cursor: 'pointer',\n textDecoration: 'none',\n transition: 'color var(--mn-duration-fast, 150ms) ease, background var(--mn-duration-fast, 150ms) ease',\n };\n\n if (child.href) {\n return (\n <a href={child.href} style={s} onMouseEnter={() => setHov(true)} onMouseLeave={() => setHov(false)} onClick={onClose}>\n {child.icon && <span style={{ marginRight: '8px' }}>{child.icon}</span>}\n {child.label}\n </a>\n );\n }\n return (\n <button style={s} onMouseEnter={() => setHov(true)} onMouseLeave={() => setHov(false)} onClick={() => { child.onClick?.(); onClose(); }}>\n {child.icon && <span style={{ marginRight: '8px' }}>{child.icon}</span>}\n {child.label}\n </button>\n );\n}\n","import { useState } from 'react';\n\nexport function NavActions({ actions = [], isDark }) {\n return (\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n {actions.map((action, i) => (\n <NavActionButton key={i} action={action} isDark={isDark} />\n ))}\n </div>\n );\n}\n\nfunction NavActionButton({ action, isDark }) {\n const { label, onClick, href, variant = 'primary', icon, size = 'sm' } = action;\n const [hovered, setHovered] = useState(false);\n\n const base = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '6px',\n fontFamily: 'var(--mn-font-family, system-ui, sans-serif)',\n fontWeight: 'var(--mn-font-weight-semibold, 600)',\n borderRadius: 'var(--mn-radius-md, 0.5rem)',\n cursor: 'pointer',\n textDecoration: 'none',\n border: 'none',\n transition: 'all var(--mn-duration-fast, 150ms) var(--mn-easing-default, ease)',\n whiteSpace: 'nowrap',\n };\n\n const sizes = {\n sm: { padding: '7px 16px', fontSize: 'var(--mn-font-size-sm, 0.875rem)' },\n md: { padding: '9px 20px', fontSize: 'var(--mn-font-size-base, 1rem)' },\n };\n\n const variants = {\n primary: {\n background: hovered ? 'var(--mn-color-primary-hover, #60A5FA)' : 'var(--mn-color-primary, #3B82F6)',\n color: '#fff',\n },\n outline: {\n background: 'transparent',\n color: isDark ? 'var(--mn-topnav-text-primary-dark, #F0F4FF)' : 'var(--mn-topnav-text-primary-light, #1C1915)',\n border: `1px solid ${isDark ? 'var(--mn-border-md-dark, rgba(255,255,255,0.13))' : 'var(--mn-border-light, #C9C2B6)'}`,\n },\n ghost: {\n background: hovered ? (isDark ? 'rgba(255,255,255,0.05)' : 'rgba(0,0,0,0.04)') : 'transparent',\n color: isDark ? 'var(--mn-topnav-text-secondary-dark, #94A3B8)' : 'var(--mn-topnav-text-secondary-light, #47413C)',\n border: 'none',\n },\n gradient: {\n background: hovered\n ? 'linear-gradient(135deg, #60A5FA, #A78BFA)'\n : 'var(--mn-gradient-primary, linear-gradient(135deg, #3B82F6, #7C3AED))',\n color: '#fff',\n },\n };\n\n const style = { ...base, ...sizes[size] ?? sizes.sm, ...variants[variant] ?? variants.primary };\n\n if (href) {\n return (\n <a href={href} style={style} onMouseEnter={() => setHovered(true)} onMouseLeave={() => setHovered(false)}>\n {icon && <span>{icon}</span>}\n {label}\n </a>\n );\n }\n\n return (\n <button style={style} onClick={onClick} onMouseEnter={() => setHovered(true)} onMouseLeave={() => setHovered(false)}>\n {icon && <span>{icon}</span>}\n {label}\n </button>\n );\n}\n","import { useState, useEffect } from 'react';\n\nexport function NavHamburger({ open, onClick, isDark }) {\n const color = isDark ? 'var(--mn-topnav-text-primary-dark, #F0F4FF)' : 'var(--mn-topnav-text-primary-light, #1C1915)';\n return (\n <button\n onClick={onClick}\n aria-label={open ? 'Close menu' : 'Open menu'}\n aria-expanded={open}\n style={{\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: '8px',\n display: 'flex',\n flexDirection: 'column',\n gap: '5px',\n borderRadius: 'var(--mn-radius-sm, 0.375rem)',\n }}\n >\n {[0, 1, 2].map(i => (\n <span key={i} style={{\n display: 'block',\n width: '22px',\n height: '2px',\n background: color,\n borderRadius: '2px',\n transition: 'all var(--mn-duration-normal, 200ms) ease',\n transformOrigin: 'center',\n transform: open\n ? (i === 0 ? 'translateY(7px) rotate(45deg)' : i === 2 ? 'translateY(-7px) rotate(-45deg)' : 'scaleX(0) opacity(0)')\n : 'none',\n opacity: open && i === 1 ? 0 : 1,\n }} />\n ))}\n </button>\n );\n}\n\nexport function NavMobileDrawer({ open, links = [], actions = [], authSlot, isDark, onClose }) {\n const bg = isDark ? 'var(--mn-color-nav-dark, #07091C)' : 'var(--mn-color-nav-light, #E1DAD0)';\n const borderColor = isDark ? 'var(--mn-border-dark, rgba(255,255,255,0.07))' : 'var(--mn-border-light, #C9C2B6)';\n const textColor = isDark ? 'var(--mn-topnav-text-primary-dark, #F0F4FF)' : 'var(--mn-topnav-text-primary-light, #1C1915)';\n const mutedColor = isDark ? 'var(--mn-topnav-text-secondary-dark, #94A3B8)' : 'var(--mn-topnav-text-secondary-light, #47413C)';\n\n useEffect(() => {\n if (open) document.body.style.overflow = 'hidden';\n else document.body.style.overflow = '';\n return () => { document.body.style.overflow = ''; };\n }, [open]);\n\n return (\n <>\n {/* Backdrop */}\n <div\n onClick={onClose}\n style={{\n position: 'fixed', inset: 0, zIndex: 998,\n background: 'rgba(0,0,0,0.5)',\n opacity: open ? 1 : 0,\n pointerEvents: open ? 'auto' : 'none',\n transition: 'opacity var(--mn-duration-normal, 200ms) ease',\n }}\n />\n\n {/* Drawer */}\n <div style={{\n position: 'fixed', top: 0, right: 0, bottom: 0,\n width: 'min(320px, 85vw)',\n background: bg,\n borderLeft: `1px solid ${borderColor}`,\n zIndex: 999,\n transform: open ? 'translateX(0)' : 'translateX(100%)',\n transition: 'transform var(--mn-duration-normal, 200ms) var(--mn-easing-default, ease)',\n display: 'flex',\n flexDirection: 'column',\n padding: '24px 20px',\n overflowY: 'auto',\n }}>\n {/* Close */}\n <button onClick={onClose} style={{ alignSelf: 'flex-end', background: 'none', border: 'none', cursor: 'pointer', color: mutedColor, fontSize: '20px', lineHeight: 1, padding: '4px' }}>✕</button>\n\n {/* Links */}\n <nav style={{ display: 'flex', flexDirection: 'column', gap: '4px', marginTop: '16px' }}>\n {links.map((link, i) => (\n <MobileLinkItem key={i} link={link} isDark={isDark} textColor={textColor} mutedColor={mutedColor} onClose={onClose} />\n ))}\n </nav>\n\n {/* Divider */}\n {(actions.length > 0 || authSlot) && (\n <div style={{ borderTop: `1px solid ${borderColor}`, margin: '20px 0' }} />\n )}\n\n {/* Auth slot */}\n {authSlot && <div style={{ marginBottom: '12px' }}>{authSlot}</div>}\n\n {/* Actions */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {actions.map((action, i) => (\n <a key={i}\n href={action.href}\n onClick={() => { action.onClick?.(); onClose(); }}\n style={{\n display: 'block',\n padding: '10px 16px',\n borderRadius: 'var(--mn-radius-md, 0.5rem)',\n textAlign: 'center',\n fontFamily: 'var(--mn-font-family, system-ui, sans-serif)',\n fontWeight: 'var(--mn-font-weight-semibold, 600)',\n fontSize: 'var(--mn-font-size-sm, 0.875rem)',\n cursor: 'pointer',\n textDecoration: 'none',\n background: action.variant === 'primary' || !action.variant\n ? 'var(--mn-color-primary, #3B82F6)' : 'transparent',\n color: action.variant === 'primary' || !action.variant\n ? '#fff' : textColor,\n border: action.variant === 'outline' ? `1px solid ${borderColor}` : 'none',\n }}\n >\n {action.label}\n </a>\n ))}\n </div>\n </div>\n </>\n );\n}\n\nfunction MobileLinkItem({ link, isDark, textColor, mutedColor, onClose }) {\n const { label, href, onClick, icon, active, children } = link;\n const [expanded, setExpanded] = useState(false);\n\n const linkStyle = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '10px 12px',\n borderRadius: 'var(--mn-radius-md, 0.5rem)',\n fontFamily: 'var(--mn-font-family, system-ui, sans-serif)',\n fontSize: 'var(--mn-font-size-base, 1rem)',\n fontWeight: active ? 'var(--mn-font-weight-semibold, 600)' : 'var(--mn-font-weight-medium, 500)',\n color: active ? 'var(--mn-color-primary, #3B82F6)' : textColor,\n background: active ? (isDark ? 'rgba(59,130,246,0.1)' : 'rgba(59,130,246,0.08)') : 'transparent',\n textDecoration: 'none',\n cursor: 'pointer',\n border: 'none',\n width: '100%',\n textAlign: 'left',\n };\n\n if (children?.length) {\n return (\n <div>\n <button style={linkStyle} onClick={() => setExpanded(e => !e)}>\n <span style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n {icon && <span>{icon}</span>}\n {label}\n </span>\n <span style={{ fontSize: '10px', transform: expanded ? 'rotate(180deg)' : 'none', transition: 'transform 150ms ease', display: 'inline-block' }}>▼</span>\n </button>\n {expanded && (\n <div style={{ paddingLeft: '12px', marginTop: '4px', display: 'flex', flexDirection: 'column', gap: '2px' }}>\n {children.map((child, i) => (\n child.href\n ? <a key={i} href={child.href} style={{ ...linkStyle, fontSize: 'var(--mn-font-size-sm, 0.875rem)', color: mutedColor }} onClick={onClose}>{child.icon && <span style={{ marginRight: '8px' }}>{child.icon}</span>}{child.label}</a>\n : <button key={i} style={{ ...linkStyle, fontSize: 'var(--mn-font-size-sm, 0.875rem)', color: mutedColor }} onClick={() => { child.onClick?.(); onClose(); }}>{child.icon && <span style={{ marginRight: '8px' }}>{child.icon}</span>}{child.label}</button>\n ))}\n </div>\n )}\n </div>\n );\n }\n\n if (href) {\n return <a href={href} style={linkStyle} onClick={onClose}>{icon && <span style={{ marginRight: '8px' }}>{icon}</span>}{label}</a>;\n }\n return <button style={linkStyle} onClick={() => { onClick?.(); onClose(); }}>{icon && <span style={{ marginRight: '8px' }}>{icon}</span>}{label}</button>;\n}\n\n","/**\n * Navbar — @mounaji_npm/navbar\n *\n * Composable top navigation bar.\n *\n * Props:\n * logo — { text?, src?, alt?, href?, onClick? }\n * links — NavLink[] { label, href?, onClick?, icon?, active?, children?: NavLink[] }\n * actions — NavAction[] { label, href?, onClick?, variant?, icon?, size? }\n * authSlot — ReactNode inject e.g. <LoginButton /> from @mounaji_npm/auth\n * sticky — boolean (default: true)\n * transparent — boolean no background (for hero overlay)\n * blurOnScroll — boolean glass blur effect after scroll (default: true)\n * isDark — boolean (default: true)\n * tokens — Partial<DEFAULT_TOKENS>\n * style — CSSProperties\n * mobileBreakpoint — number px (default: 768)\n * height — number px (default: 64)\n */\n\nimport { useState, useEffect } from 'react';\nimport { NavLogo } from './components/NavLogo.jsx';\nimport { NavLink } from './components/NavLink.jsx';\nimport { NavDropdown } from './components/NavDropdown.jsx';\nimport { NavActions } from './components/NavActions.jsx';\nimport { NavHamburger, NavMobileDrawer } from './components/NavMobileMenu.jsx';\n\nexport function Navbar({\n logo = {},\n links = [],\n actions = [],\n authSlot,\n sticky = true,\n transparent = false,\n blurOnScroll = true,\n isDark = true,\n tokens,\n style,\n mobileBreakpoint = 768,\n height = 64,\n}) {\n const [mobileOpen, setMobileOpen] = useState(false);\n const [scrolled, setScrolled] = useState(false);\n const [isMobile, setIsMobile] = useState(false);\n\n useEffect(() => {\n function checkMobile() { setIsMobile(window.innerWidth < mobileBreakpoint); }\n function checkScroll() { setScrolled(window.scrollY > 12); }\n checkMobile();\n checkScroll();\n window.addEventListener('resize', checkMobile);\n window.addEventListener('scroll', checkScroll, { passive: true });\n return () => {\n window.removeEventListener('resize', checkMobile);\n window.removeEventListener('scroll', checkScroll);\n };\n }, [mobileBreakpoint]);\n\n const navBg = isDark ? 'var(--mn-color-nav-dark, #07091C)' : 'var(--mn-color-nav-light, #E1DAD0)';\n const borderColor = isDark ? 'var(--mn-border-dark, rgba(255,255,255,0.07))' : 'var(--mn-border-light, #C9C2B6)';\n\n const showBackground = !transparent || scrolled;\n const showBlur = blurOnScroll && scrolled;\n\n const navStyle = {\n position: sticky ? 'sticky' : 'relative',\n top: 0,\n zIndex: 100,\n width: '100%',\n height: `${height}px`,\n display: 'flex',\n alignItems: 'center',\n background: showBackground ? navBg : 'transparent',\n borderBottom: showBackground ? `1px solid ${borderColor}` : 'none',\n backdropFilter: showBlur ? 'blur(12px) saturate(1.3)' : 'none',\n WebkitBackdropFilter: showBlur ? 'blur(12px) saturate(1.3)' : 'none',\n transition: 'background var(--mn-duration-normal, 200ms) ease, border-color var(--mn-duration-normal, 200ms) ease',\n fontFamily: 'var(--mn-font-family, system-ui, sans-serif)',\n ...style,\n };\n\n const innerStyle = {\n width: '100%',\n maxWidth: '1280px',\n margin: '0 auto',\n padding: '0 var(--mn-spacing-lg, 24px)',\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--mn-spacing-lg, 24px)',\n };\n\n return (\n <>\n <nav style={navStyle} role=\"navigation\" aria-label=\"Main navigation\">\n <div style={innerStyle}>\n {/* Logo */}\n <div style={{ flexShrink: 0 }}>\n <NavLogo logo={logo} isDark={isDark} />\n </div>\n\n {/* Desktop links */}\n {!isMobile && (\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px', flex: 1 }}>\n {links.map((link, i) =>\n link.children?.length\n ? <NavDropdown key={i} link={link} isDark={isDark} />\n : <NavLink key={i} link={link} isDark={isDark} />\n )}\n </div>\n )}\n\n {/* Spacer */}\n <div style={{ flex: isMobile ? 1 : 0 }} />\n\n {/* Desktop: auth slot + actions */}\n {!isMobile && (\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', flexShrink: 0 }}>\n {authSlot}\n <NavActions actions={actions} isDark={isDark} />\n </div>\n )}\n\n {/* Mobile: hamburger */}\n {isMobile && (\n <NavHamburger open={mobileOpen} onClick={() => setMobileOpen(o => !o)} isDark={isDark} />\n )}\n </div>\n </nav>\n\n {/* Mobile drawer */}\n {isMobile && (\n <NavMobileDrawer\n open={mobileOpen}\n links={links}\n actions={actions}\n authSlot={authSlot}\n isDark={isDark}\n onClose={() => setMobileOpen(false)}\n />\n )}\n </>\n );\n}\n","/**\n * Demo data for @mounaji_npm/navbar — use in prototypes and stories.\n */\n\nexport const DEMO_LOGO = {\n text: 'Acme SaaS',\n href: '/',\n};\n\nexport const DEMO_LINKS = [\n { label: 'Home', href: '/', active: true },\n { label: 'Features', href: '/features' },\n { label: 'Pricing', href: '/pricing' },\n {\n label: 'Resources',\n children: [\n { label: 'Documentation', href: '/docs', icon: '📄' },\n { label: 'Blog', href: '/blog', icon: '✍️' },\n { label: 'Changelog', href: '/changelog', icon: '🕐' },\n ],\n },\n];\n\nexport const DEMO_ACTIONS = [\n { label: 'Log in', variant: 'ghost', href: '/login' },\n { label: 'Get Started', variant: 'primary', href: '/signup' },\n];\n"],"names":["NavLogo","logo","isDark","text","src","alt","href","onClick","inner","jsxs","jsx","NavLink","link","onMouseEnter","onMouseLeave","label","active","icon","hovered","setHovered","useState","style","handleMouseEnter","e","handleMouseLeave","NavDropdown","children","open","setOpen","ref","useRef","textColor","mutedColor","cardBg","borderColor","useEffect","handleClick","triggerStyle","dropdownStyle","o","child","i","DropdownItem","onClose","hov","setHov","_a","NavActions","actions","action","NavActionButton","variant","size","base","sizes","variants","NavHamburger","color","NavMobileDrawer","links","authSlot","bg","Fragment","MobileLinkItem","expanded","setExpanded","linkStyle","Navbar","sticky","transparent","blurOnScroll","tokens","mobileBreakpoint","height","mobileOpen","setMobileOpen","scrolled","setScrolled","isMobile","setIsMobile","checkMobile","checkScroll","navBg","showBackground","showBlur","navStyle","DEMO_LOGO","DEMO_LINKS","DEMO_ACTIONS"],"mappings":"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"}