@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 +78 -0
- package/dist/mounajinavbar.es.js +435 -0
- package/dist/mounajinavbar.es.js.map +1 -0
- package/dist/mounajinavbar.umd.cjs +2 -0
- package/dist/mounajinavbar.umd.cjs.map +1 -0
- package/package.json +29 -0
- package/src/Navbar.jsx +143 -0
- package/src/components/NavActions.jsx +76 -0
- package/src/components/NavDropdown.jsx +123 -0
- package/src/components/NavLink.jsx +52 -0
- package/src/components/NavLogo.jsx +38 -0
- package/src/components/NavMobileMenu.jsx +180 -0
- package/src/demo.js +27 -0
- package/src/index.js +16 -0
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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"}
|