react-shadcn-kit 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/global.css +1 -1
- package/dist/default-layout.js +108 -75
- package/dist/default-layout.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/molecules/user-menu.js +13 -14
- package/dist/molecules/user-menu.js.map +1 -1
- package/dist/organisms/app-navbar.d.ts +64 -28
- package/dist/organisms/app-navbar.js +133 -102
- package/dist/organisms/app-navbar.js.map +1 -1
- package/dist/organisms/app-sidebar.d.ts +56 -26
- package/dist/organisms/app-sidebar.js +148 -146
- package/dist/organisms/app-sidebar.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,111 +1,142 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import { Search as
|
|
3
|
-
import { Input as
|
|
4
|
-
import { Button as
|
|
5
|
-
import { SidebarTrigger as
|
|
1
|
+
import { jsxs as o, jsx as e, Fragment as v } from "react/jsx-runtime";
|
|
2
|
+
import { Search as w, Bell as b } from "lucide-react";
|
|
3
|
+
import { Input as C } from "../atoms/input.js";
|
|
4
|
+
import { Button as m } from "../atoms/button.js";
|
|
5
|
+
import { SidebarTrigger as k } from "../atoms/sidebar.js";
|
|
6
6
|
import { Separator as S } from "../atoms/separator.js";
|
|
7
|
-
import { ThemeToggle as
|
|
8
|
-
import { UserMenu as
|
|
9
|
-
import { DropdownMenu as
|
|
7
|
+
import { ThemeToggle as M } from "../molecules/theme-toggle.js";
|
|
8
|
+
import { UserMenu as D } from "../molecules/user-menu.js";
|
|
9
|
+
import { DropdownMenu as y, DropdownMenuTrigger as U, DropdownMenuContent as I, DropdownMenuLabel as L, DropdownMenuSeparator as T, DropdownMenuItem as $ } from "../atoms/dropdown-menu.js";
|
|
10
|
+
function j({ branding: r }) {
|
|
11
|
+
const t = r.href ? "a" : "div", a = r.href ? { href: r.href } : {};
|
|
12
|
+
return /* @__PURE__ */ o(t, { ...a, className: "flex items-center gap-2 mr-4", children: [
|
|
13
|
+
r.logoUrl && /* @__PURE__ */ e("img", { src: r.logoUrl, alt: r.logoAlt || "Logo", className: "h-6 w-6" }),
|
|
14
|
+
r.title && /* @__PURE__ */ e("span", { className: "font-semibold", children: r.title })
|
|
15
|
+
] });
|
|
16
|
+
}
|
|
17
|
+
function z({ items: r }) {
|
|
18
|
+
return /* @__PURE__ */ e("nav", { className: "flex items-center gap-6 text-sm font-medium overflow-x-auto scrollbar-hide max-w-full", children: r.map((t, a) => {
|
|
19
|
+
const l = t.icon;
|
|
20
|
+
return /* @__PURE__ */ o(
|
|
21
|
+
"a",
|
|
22
|
+
{
|
|
23
|
+
href: t.href,
|
|
24
|
+
className: `transition-colors hover:text-foreground/80 ${t.disabled ? "pointer-events-none opacity-50" : "text-foreground/60"}`,
|
|
25
|
+
children: [
|
|
26
|
+
l && /* @__PURE__ */ e(l, { className: "inline-block mr-1 h-4 w-4" }),
|
|
27
|
+
t.label
|
|
28
|
+
]
|
|
29
|
+
},
|
|
30
|
+
a
|
|
31
|
+
);
|
|
32
|
+
}) });
|
|
33
|
+
}
|
|
34
|
+
function A({ config: r }) {
|
|
35
|
+
return /* @__PURE__ */ o("div", { className: "relative", children: [
|
|
36
|
+
/* @__PURE__ */ e(w, { className: "absolute left-2 top-2.5 h-4 w-4 text-muted-foreground" }),
|
|
37
|
+
/* @__PURE__ */ e(
|
|
38
|
+
C,
|
|
39
|
+
{
|
|
40
|
+
placeholder: r.placeholder || "Search...",
|
|
41
|
+
className: "pl-8 w-[200px] lg:w-[300px]",
|
|
42
|
+
onChange: (t) => r.onSearch?.(t.target.value)
|
|
43
|
+
}
|
|
44
|
+
)
|
|
45
|
+
] });
|
|
46
|
+
}
|
|
47
|
+
function F({ config: r, labels: t }) {
|
|
48
|
+
const a = r.items || [], l = a.some((s) => !s.read);
|
|
49
|
+
return /* @__PURE__ */ o(y, { children: [
|
|
50
|
+
/* @__PURE__ */ e(U, { asChild: !0, children: /* @__PURE__ */ o(m, { variant: "ghost", size: "icon", className: "relative", children: [
|
|
51
|
+
/* @__PURE__ */ e(b, { className: "h-5 w-5" }),
|
|
52
|
+
l && /* @__PURE__ */ e("span", { className: "absolute right-2 top-2 h-2 w-2 rounded-full bg-red-600" }),
|
|
53
|
+
/* @__PURE__ */ e("span", { className: "sr-only", children: t?.notifications || "Notifications" })
|
|
54
|
+
] }) }),
|
|
55
|
+
/* @__PURE__ */ o(I, { align: "end", className: "w-80", children: [
|
|
56
|
+
/* @__PURE__ */ e(L, { children: t?.notifications || "Notifications" }),
|
|
57
|
+
/* @__PURE__ */ e(T, {}),
|
|
58
|
+
a.length > 0 ? a.map((s, n) => /* @__PURE__ */ o(
|
|
59
|
+
$,
|
|
60
|
+
{
|
|
61
|
+
className: "flex flex-col items-start gap-1 p-3 cursor-pointer",
|
|
62
|
+
onClick: () => r.onNotificationClick?.(s, n),
|
|
63
|
+
children: [
|
|
64
|
+
/* @__PURE__ */ o("div", { className: "flex w-full items-center justify-between", children: [
|
|
65
|
+
/* @__PURE__ */ e("span", { className: "font-medium", children: s.title }),
|
|
66
|
+
/* @__PURE__ */ e("span", { className: "text-xs text-muted-foreground", children: s.date })
|
|
67
|
+
] }),
|
|
68
|
+
/* @__PURE__ */ e("p", { className: "text-sm text-muted-foreground line-clamp-2", children: s.description })
|
|
69
|
+
]
|
|
70
|
+
},
|
|
71
|
+
n
|
|
72
|
+
)) : /* @__PURE__ */ e("div", { className: "p-4 text-center text-sm text-muted-foreground", children: t?.noNotifications || "No new notifications" })
|
|
73
|
+
] })
|
|
74
|
+
] });
|
|
75
|
+
}
|
|
10
76
|
function P({
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
notifications: s = [],
|
|
16
|
-
branding: o,
|
|
17
|
-
labels: m,
|
|
18
|
-
showSearch: u = !0,
|
|
19
|
-
showSidebarTrigger: N = !0,
|
|
20
|
-
showUserMenu: x = !0,
|
|
21
|
-
showThemeToggle: g = !0,
|
|
22
|
-
showNotifications: w = !0,
|
|
23
|
-
className: i,
|
|
24
|
-
style: v,
|
|
25
|
-
loginButton: l
|
|
77
|
+
user: r,
|
|
78
|
+
userMenuItems: t,
|
|
79
|
+
loginButton: a,
|
|
80
|
+
showUserMenu: l
|
|
26
81
|
}) {
|
|
27
|
-
return /* @__PURE__ */
|
|
28
|
-
|
|
82
|
+
return l ? r?.name && r?.email ? /* @__PURE__ */ e(
|
|
83
|
+
D,
|
|
29
84
|
{
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
children: [
|
|
33
|
-
N && /* @__PURE__ */ r(b, { children: [
|
|
34
|
-
/* @__PURE__ */ e(C, { className: "-ml-1" }),
|
|
35
|
-
/* @__PURE__ */ e(S, { orientation: "vertical", className: "mr-2 h-4" })
|
|
36
|
-
] }),
|
|
37
|
-
o && /* @__PURE__ */ r("a", { href: "#", className: "flex items-center gap-2 mr-4", children: [
|
|
38
|
-
o.logoUrl && /* @__PURE__ */ e("img", { src: o.logoUrl, alt: o.logoAlt || "Logo", className: "h-6 w-6" }),
|
|
39
|
-
o.title && /* @__PURE__ */ e("span", { className: "font-semibold", children: o.title })
|
|
40
|
-
] }),
|
|
41
|
-
/* @__PURE__ */ e("nav", { className: "flex items-center gap-6 text-sm font-medium", children: h?.map((a, n) => {
|
|
42
|
-
const c = a.icon;
|
|
43
|
-
return /* @__PURE__ */ r(
|
|
44
|
-
"a",
|
|
45
|
-
{
|
|
46
|
-
href: a.href,
|
|
47
|
-
className: `transition-colors hover:text-foreground/80 ${a.disabled ? "pointer-events-none opacity-50" : "text-foreground/60"}`,
|
|
48
|
-
children: [
|
|
49
|
-
c && /* @__PURE__ */ e(c, { className: "inline-block mr-1 h-4 w-4" }),
|
|
50
|
-
a.label
|
|
51
|
-
]
|
|
52
|
-
},
|
|
53
|
-
n
|
|
54
|
-
);
|
|
55
|
-
}) }),
|
|
56
|
-
/* @__PURE__ */ r("div", { className: "ml-auto flex items-center gap-2", children: [
|
|
57
|
-
u && /* @__PURE__ */ r("div", { className: "relative", children: [
|
|
58
|
-
/* @__PURE__ */ e(M, { className: "absolute left-2 top-2.5 h-4 w-4 text-muted-foreground" }),
|
|
59
|
-
/* @__PURE__ */ e(D, { placeholder: p, className: "pl-8 w-[200px] lg:w-[300px]" })
|
|
60
|
-
] }),
|
|
61
|
-
g && /* @__PURE__ */ e(y, {}),
|
|
62
|
-
x && (t && t.name && t.email ? /* @__PURE__ */ e(
|
|
63
|
-
L,
|
|
64
|
-
{
|
|
65
|
-
user: { name: t.name, email: t.email, avatar: t.image },
|
|
66
|
-
items: f
|
|
67
|
-
}
|
|
68
|
-
) : l && /* @__PURE__ */ e(
|
|
69
|
-
d,
|
|
70
|
-
{
|
|
71
|
-
variant: l.variant || "default",
|
|
72
|
-
onClick: l.onClick,
|
|
73
|
-
asChild: !!l.href,
|
|
74
|
-
children: l.href ? /* @__PURE__ */ e("a", { href: l.href, children: l.label || "Login" }) : l.label || "Login"
|
|
75
|
-
}
|
|
76
|
-
)),
|
|
77
|
-
w && s && s.length > 0 && /* @__PURE__ */ r(T, { children: [
|
|
78
|
-
/* @__PURE__ */ e(j, { asChild: !0, children: /* @__PURE__ */ r(d, { variant: "ghost", size: "icon", className: "relative", children: [
|
|
79
|
-
/* @__PURE__ */ e(k, { className: "h-5 w-5" }),
|
|
80
|
-
s.some((a) => !a.read) && /* @__PURE__ */ e("span", { className: "absolute right-2 top-2 h-2 w-2 rounded-full bg-red-600" }),
|
|
81
|
-
/* @__PURE__ */ e("span", { className: "sr-only", children: m?.notifications || "Notifications" })
|
|
82
|
-
] }) }),
|
|
83
|
-
/* @__PURE__ */ r(I, { align: "end", className: "w-80", children: [
|
|
84
|
-
/* @__PURE__ */ e(U, { children: m?.notifications || "Notifications" }),
|
|
85
|
-
/* @__PURE__ */ e(z, {}),
|
|
86
|
-
s.map((a, n) => /* @__PURE__ */ r(
|
|
87
|
-
A,
|
|
88
|
-
{
|
|
89
|
-
className: "flex flex-col items-start gap-1 p-3 cursor-pointer",
|
|
90
|
-
children: [
|
|
91
|
-
/* @__PURE__ */ r("div", { className: "flex w-full items-center justify-between", children: [
|
|
92
|
-
/* @__PURE__ */ e("span", { className: "font-medium", children: a.title }),
|
|
93
|
-
/* @__PURE__ */ e("span", { className: "text-xs text-muted-foreground", children: a.date })
|
|
94
|
-
] }),
|
|
95
|
-
/* @__PURE__ */ e("p", { className: "text-sm text-muted-foreground line-clamp-2", children: a.description })
|
|
96
|
-
]
|
|
97
|
-
},
|
|
98
|
-
n
|
|
99
|
-
)),
|
|
100
|
-
s.length === 0 && /* @__PURE__ */ e("div", { className: "p-4 text-center text-sm text-muted-foreground", children: m?.noNotifications || "No new notifications" })
|
|
101
|
-
] })
|
|
102
|
-
] })
|
|
103
|
-
] })
|
|
104
|
-
]
|
|
85
|
+
user: { name: r.name, email: r.email, avatar: r.image },
|
|
86
|
+
items: t
|
|
105
87
|
}
|
|
106
|
-
)
|
|
88
|
+
) : a ? /* @__PURE__ */ e(
|
|
89
|
+
m,
|
|
90
|
+
{
|
|
91
|
+
variant: a.variant || "default",
|
|
92
|
+
onClick: a.onClick,
|
|
93
|
+
asChild: !!a.href,
|
|
94
|
+
children: a.href ? /* @__PURE__ */ e("a", { href: a.href, children: a.label || "Login" }) : a.label || "Login"
|
|
95
|
+
}
|
|
96
|
+
) : null : null;
|
|
97
|
+
}
|
|
98
|
+
function X({
|
|
99
|
+
placement: r = "top",
|
|
100
|
+
sticky: t = !0,
|
|
101
|
+
className: a,
|
|
102
|
+
style: l,
|
|
103
|
+
branding: s,
|
|
104
|
+
items: n,
|
|
105
|
+
search: i,
|
|
106
|
+
notifications: c,
|
|
107
|
+
showThemeToggle: d = !1,
|
|
108
|
+
showSidebarTrigger: f = !1,
|
|
109
|
+
user: p,
|
|
110
|
+
userMenuItems: h,
|
|
111
|
+
loginButton: u,
|
|
112
|
+
labels: N,
|
|
113
|
+
showUserMenu: x = !1
|
|
114
|
+
}) {
|
|
115
|
+
const g = `flex h-16 shrink-0 items-center gap-2 border-b px-4 bg-background ${t ? r === "top" ? "sticky top-0 z-50" : "sticky bottom-0 z-50" : ""} ${a || ""}`.trim();
|
|
116
|
+
return /* @__PURE__ */ o("header", { className: g, style: l, children: [
|
|
117
|
+
f && /* @__PURE__ */ o(v, { children: [
|
|
118
|
+
/* @__PURE__ */ e(k, { className: "-ml-1" }),
|
|
119
|
+
/* @__PURE__ */ e(S, { orientation: "vertical", className: "mr-2 h-4" })
|
|
120
|
+
] }),
|
|
121
|
+
s && /* @__PURE__ */ e(j, { branding: s }),
|
|
122
|
+
n && n.length > 0 && /* @__PURE__ */ e(z, { items: n }),
|
|
123
|
+
/* @__PURE__ */ o("div", { className: "ml-auto flex items-center gap-2", children: [
|
|
124
|
+
i?.enabled && /* @__PURE__ */ e(A, { config: i }),
|
|
125
|
+
d && /* @__PURE__ */ e(M, {}),
|
|
126
|
+
c?.enabled && /* @__PURE__ */ e(F, { config: c, labels: N }),
|
|
127
|
+
/* @__PURE__ */ e(
|
|
128
|
+
P,
|
|
129
|
+
{
|
|
130
|
+
user: p,
|
|
131
|
+
userMenuItems: h,
|
|
132
|
+
loginButton: u,
|
|
133
|
+
showUserMenu: x
|
|
134
|
+
}
|
|
135
|
+
)
|
|
136
|
+
] })
|
|
137
|
+
] });
|
|
107
138
|
}
|
|
108
139
|
export {
|
|
109
|
-
|
|
140
|
+
X as AppNavbar
|
|
110
141
|
};
|
|
111
142
|
//# sourceMappingURL=app-navbar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-navbar.js","sources":["../../src/organisms/app-navbar.tsx"],"sourcesContent":["\"use client\";\n\nimport { Search, Bell } from \"lucide-react\";\nimport { Input } from \"@/atoms/input\";\nimport { Button } from \"@/atoms/button\";\nimport { SidebarTrigger } from \"@/atoms/sidebar\";\nimport { Separator } from \"@/atoms/separator\";\nimport { ThemeToggle } from \"@/molecules/theme-toggle\";\nimport { UserMenu } from \"@/molecules/user-menu\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/atoms/dropdown-menu\";\nimport type {\n UserConfig,\n BrandingConfig,\n MenuItem,\n NotificationsList,\n LoginButtonConfig,\n} from \"@/default-layout\";\n\ninterface NavbarLabels {\n profile?: string;\n notifications?: string;\n noNotifications?: string;\n}\n\ninterface UserMenuItem {\n label: string;\n href?: string;\n icon?: React.ComponentType<{ className?: string }>;\n onClick?: () => void;\n}\n\ninterface AppNavbarProps {\n items?: (MenuItem & { icon?: React.ComponentType<{ className?: string }> })[];\n searchPlaceholder?: string;\n user?: UserConfig;\n userMenuItems?: UserMenuItem[];\n notifications?: NotificationsList[];\n branding?: BrandingConfig;\n labels?: NavbarLabels;\n showSearch?: boolean;\n showSidebarTrigger?: boolean;\n showUserMenu?: boolean;\n showThemeToggle?: boolean;\n showNotifications?: boolean;\n className?: string;\n style?: React.CSSProperties;\n loginButton?: LoginButtonConfig;\n}\n\nexport function AppNavbar({\n items = [],\n searchPlaceholder = \"Search...\",\n user,\n userMenuItems,\n notifications = [],\n branding,\n labels,\n showSearch = true,\n showSidebarTrigger = true,\n showUserMenu = true,\n showThemeToggle = true,\n showNotifications = true,\n className,\n style,\n loginButton,\n}: AppNavbarProps) {\n return (\n <header\n className={\n \"flex h-16 shrink-0 items-center gap-2 border-b px-4 bg-background sticky top-0 z-50\" +\n (className ? ` ${className}` : \"\")\n }\n style={style}\n >\n {showSidebarTrigger && (\n <>\n <SidebarTrigger className=\"-ml-1\" />\n <Separator orientation=\"vertical\" className=\"mr-2 h-4\" />\n </>\n )}\n\n {branding && (\n <a href=\"#\" className=\"flex items-center gap-2 mr-4\">\n {branding.logoUrl && (\n <img src={branding.logoUrl} alt={branding.logoAlt || \"Logo\"} className=\"h-6 w-6\" />\n )}\n {branding.title && <span className=\"font-semibold\">{branding.title}</span>}\n </a>\n )}\n\n <nav className=\"flex items-center gap-6 text-sm font-medium\">\n {items?.map((item, index) => {\n const Icon = item.icon;\n return (\n <a\n key={index}\n href={item.href}\n className={`transition-colors hover:text-foreground/80 ${\n item.disabled ? \"pointer-events-none opacity-50\" : \"text-foreground/60\"\n }`}\n >\n {Icon && <Icon className=\"inline-block mr-1 h-4 w-4\" />}\n {item.label}\n </a>\n );\n })}\n </nav>\n\n <div className=\"ml-auto flex items-center gap-2\">\n {showSearch && (\n <div className=\"relative\">\n <Search className=\"absolute left-2 top-2.5 h-4 w-4 text-muted-foreground\" />\n <Input placeholder={searchPlaceholder} className=\"pl-8 w-[200px] lg:w-[300px]\" />\n </div>\n )}\n\n {showThemeToggle && <ThemeToggle />}\n {showUserMenu &&\n (user && user.name && user.email ? (\n <UserMenu\n user={{ name: user.name, email: user.email, avatar: user.image }}\n items={userMenuItems}\n />\n ) : (\n loginButton && (\n <Button\n variant={loginButton.variant || \"default\"}\n onClick={loginButton.onClick}\n asChild={!!loginButton.href}\n >\n {loginButton.href ? (\n <a href={loginButton.href}>{loginButton.label || \"Login\"}</a>\n ) : (\n loginButton.label || \"Login\"\n )}\n </Button>\n )\n ))}\n\n {showNotifications && notifications && notifications.length > 0 && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"relative\">\n <Bell className=\"h-5 w-5\" />\n {notifications.some((n) => !n.read) && (\n <span className=\"absolute right-2 top-2 h-2 w-2 rounded-full bg-red-600\" />\n )}\n <span className=\"sr-only\">{labels?.notifications || \"Notifications\"}</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-80\">\n <DropdownMenuLabel>{labels?.notifications || \"Notifications\"}</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {notifications.map((notification, index) => (\n <DropdownMenuItem\n key={index}\n className=\"flex flex-col items-start gap-1 p-3 cursor-pointer\"\n >\n <div className=\"flex w-full items-center justify-between\">\n <span className=\"font-medium\">{notification.title}</span>\n <span className=\"text-xs text-muted-foreground\">{notification.date}</span>\n </div>\n <p className=\"text-sm text-muted-foreground line-clamp-2\">\n {notification.description}\n </p>\n </DropdownMenuItem>\n ))}\n {notifications.length === 0 && (\n <div className=\"p-4 text-center text-sm text-muted-foreground\">\n {labels?.noNotifications || \"No new notifications\"}\n </div>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n </header>\n );\n}\n"],"names":["jsxs","jsx","Fragment","Search","Bell","Input","Button","SidebarTrigger","Separator","ThemeToggle","UserMenu","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuItem","AppNavbar","items","searchPlaceholder","user","userMenuItems","notifications","branding","labels","showSearch","showSidebarTrigger","showUserMenu","showThemeToggle","showNotifications","className","style","loginButton","item","index","Icon","n","notification"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"app-navbar.js","sources":["../../src/organisms/app-navbar.tsx"],"sourcesContent":["\"use client\";\n\nimport { Search, Bell } from \"lucide-react\";\nimport { Input } from \"@/atoms/input\";\nimport { Button } from \"@/atoms/button\";\nimport { SidebarTrigger } from \"@/atoms/sidebar\";\nimport { Separator } from \"@/atoms/separator\";\nimport { ThemeToggle } from \"@/molecules/theme-toggle\";\nimport { UserMenu } from \"@/molecules/user-menu\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/atoms/dropdown-menu\";\n\ntype Placement = \"top\" | \"bottom\";\n\ntype NavItem = {\n label: string;\n href: string;\n icon?: React.ComponentType<{ className?: string }>;\n disabled?: boolean;\n};\n\ntype User = {\n name: string;\n email: string;\n image?: string;\n};\n\ntype UserMenuItem = {\n label: string;\n href?: string;\n icon?: React.ComponentType<{ className?: string }>;\n onClick?: () => void;\n};\n\ntype Notification = {\n title: string;\n description: string;\n date: string;\n read: boolean;\n};\n\ntype Branding = {\n logoUrl?: string;\n logoAlt?: string;\n title?: string;\n href?: string;\n};\n\ntype LoginButton = {\n label?: string;\n href?: string;\n variant?: \"default\" | \"destructive\" | \"outline\" | \"secondary\" | \"ghost\" | \"link\";\n onClick?: () => void;\n};\n\ntype SearchConfig = {\n enabled?: boolean;\n placeholder?: string;\n onSearch?: (value: string) => void;\n};\n\ntype NotificationsConfig = {\n enabled?: boolean;\n items?: Notification[];\n onNotificationClick?: (notification: Notification, index: number) => void;\n};\n\ntype Labels = {\n notifications?: string;\n noNotifications?: string;\n};\n\nexport type AppNavbarProps = {\n // Layout\n placement?: Placement;\n sticky?: boolean;\n className?: string;\n style?: React.CSSProperties;\n\n // Branding\n branding?: Branding;\n\n // Navigation\n items?: NavItem[];\n\n // Features\n search?: SearchConfig;\n notifications?: NotificationsConfig;\n showThemeToggle?: boolean;\n showSidebarTrigger?: boolean;\n\n // User\n user?: User;\n userMenuItems?: UserMenuItem[];\n loginButton?: LoginButton;\n showUserMenu?: boolean;\n\n // Customization\n labels?: Labels;\n};\n\nfunction NavbarBranding({ branding }: { branding: Branding }) {\n const Wrapper = branding.href ? \"a\" : \"div\";\n const wrapperProps = branding.href ? { href: branding.href } : {};\n\n return (\n <Wrapper {...wrapperProps} className=\"flex items-center gap-2 mr-4\">\n {branding.logoUrl && (\n <img src={branding.logoUrl} alt={branding.logoAlt || \"Logo\"} className=\"h-6 w-6\" />\n )}\n {branding.title && <span className=\"font-semibold\">{branding.title}</span>}\n </Wrapper>\n );\n}\n\nfunction NavbarItems({ items }: { items: NavItem[] }) {\n return (\n <nav className=\"flex items-center gap-6 text-sm font-medium overflow-x-auto scrollbar-hide max-w-full\">\n {items.map((item, index) => {\n const Icon = item.icon;\n return (\n <a\n key={index}\n href={item.href}\n className={`transition-colors hover:text-foreground/80 ${\n item.disabled ? \"pointer-events-none opacity-50\" : \"text-foreground/60\"\n }`}\n >\n {Icon && <Icon className=\"inline-block mr-1 h-4 w-4\" />}\n {item.label}\n </a>\n );\n })}\n </nav>\n );\n}\n\nfunction NavbarSearch({ config }: { config: SearchConfig }) {\n return (\n <div className=\"relative\">\n <Search className=\"absolute left-2 top-2.5 h-4 w-4 text-muted-foreground\" />\n <Input\n placeholder={config.placeholder || \"Search...\"}\n className=\"pl-8 w-[200px] lg:w-[300px]\"\n onChange={(e) => config.onSearch?.(e.target.value)}\n />\n </div>\n );\n}\n\nfunction NavbarNotifications({ config, labels }: { config: NotificationsConfig; labels?: Labels }) {\n const notifications = config.items || [];\n const hasUnread = notifications.some((n) => !n.read);\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"relative\">\n <Bell className=\"h-5 w-5\" />\n {hasUnread && <span className=\"absolute right-2 top-2 h-2 w-2 rounded-full bg-red-600\" />}\n <span className=\"sr-only\">{labels?.notifications || \"Notifications\"}</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-80\">\n <DropdownMenuLabel>{labels?.notifications || \"Notifications\"}</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {notifications.length > 0 ? (\n notifications.map((notification, index) => (\n <DropdownMenuItem\n key={index}\n className=\"flex flex-col items-start gap-1 p-3 cursor-pointer\"\n onClick={() => config.onNotificationClick?.(notification, index)}\n >\n <div className=\"flex w-full items-center justify-between\">\n <span className=\"font-medium\">{notification.title}</span>\n <span className=\"text-xs text-muted-foreground\">{notification.date}</span>\n </div>\n <p className=\"text-sm text-muted-foreground line-clamp-2\">\n {notification.description}\n </p>\n </DropdownMenuItem>\n ))\n ) : (\n <div className=\"p-4 text-center text-sm text-muted-foreground\">\n {labels?.noNotifications || \"No new notifications\"}\n </div>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\nfunction NavbarUserSection({\n user,\n userMenuItems,\n loginButton,\n showUserMenu,\n}: {\n user?: User;\n userMenuItems?: UserMenuItem[];\n loginButton?: LoginButton;\n showUserMenu?: boolean;\n}) {\n if (!showUserMenu) return null;\n\n if (user?.name && user?.email) {\n return (\n <UserMenu\n user={{ name: user.name, email: user.email, avatar: user.image }}\n items={userMenuItems}\n />\n );\n }\n\n if (loginButton) {\n return (\n <Button\n variant={loginButton.variant || \"default\"}\n onClick={loginButton.onClick}\n asChild={!!loginButton.href}\n >\n {loginButton.href ? (\n <a href={loginButton.href}>{loginButton.label || \"Login\"}</a>\n ) : (\n loginButton.label || \"Login\"\n )}\n </Button>\n );\n }\n\n return null;\n}\n\nexport function AppNavbar({\n placement = \"top\",\n sticky = true,\n className,\n style,\n branding,\n items,\n search,\n notifications,\n showThemeToggle = false,\n showSidebarTrigger = false,\n user,\n userMenuItems,\n loginButton,\n labels,\n showUserMenu = false,\n}: AppNavbarProps) {\n const baseClasses = \"flex h-16 shrink-0 items-center gap-2 border-b px-4 bg-background\";\n const positionClasses = sticky\n ? placement === \"top\"\n ? \"sticky top-0 z-50\"\n : \"sticky bottom-0 z-50\"\n : \"\";\n const combinedClasses = `${baseClasses} ${positionClasses} ${className || \"\"}`.trim();\n\n return (\n <header className={combinedClasses} style={style}>\n {/* Left Section */}\n {showSidebarTrigger && (\n <>\n <SidebarTrigger className=\"-ml-1\" />\n <Separator orientation=\"vertical\" className=\"mr-2 h-4\" />\n </>\n )}\n\n {branding && <NavbarBranding branding={branding} />}\n\n {items && items.length > 0 && <NavbarItems items={items} />}\n\n {/* Right Section */}\n <div className=\"ml-auto flex items-center gap-2\">\n {search?.enabled && <NavbarSearch config={search} />}\n\n {showThemeToggle && <ThemeToggle />}\n\n {notifications?.enabled && <NavbarNotifications config={notifications} labels={labels} />}\n\n <NavbarUserSection\n user={user}\n userMenuItems={userMenuItems}\n loginButton={loginButton}\n showUserMenu={showUserMenu}\n />\n </div>\n </header>\n );\n}\n"],"names":["jsxs","jsx","Fragment","Search","Bell","Input","Button","SidebarTrigger","Separator","ThemeToggle","UserMenu","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuItem","NavbarBranding","branding","Wrapper","wrapperProps","NavbarItems","items","item","index","Icon","NavbarSearch","config","e","NavbarNotifications","labels","notifications","hasUnread","n","notification","NavbarUserSection","user","userMenuItems","loginButton","showUserMenu","AppNavbar","placement","sticky","className","style","search","showThemeToggle","showSidebarTrigger","combinedClasses"],"mappings":"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"}
|
|
@@ -1,37 +1,67 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
type SidebarPlacement = "left" | "right";
|
|
2
|
+
type MenuItem = {
|
|
3
|
+
label: string;
|
|
4
|
+
href: string;
|
|
5
|
+
icon?: React.ComponentType<{
|
|
6
|
+
className?: string;
|
|
7
|
+
}>;
|
|
8
|
+
disabled?: boolean;
|
|
9
|
+
items?: MenuItem[];
|
|
10
|
+
};
|
|
11
|
+
type MenuGroup = {
|
|
12
|
+
label?: string;
|
|
13
|
+
items: MenuItem[];
|
|
14
|
+
collapsible?: boolean;
|
|
15
|
+
};
|
|
16
|
+
type User = {
|
|
17
|
+
name?: string;
|
|
18
|
+
email?: string;
|
|
19
|
+
image?: string;
|
|
20
|
+
username?: string;
|
|
21
|
+
roles?: string[];
|
|
22
|
+
};
|
|
23
|
+
type UserMenuItem = {
|
|
7
24
|
label: string;
|
|
8
25
|
href?: string;
|
|
9
26
|
icon?: React.ComponentType<{
|
|
10
27
|
className?: string;
|
|
11
28
|
}>;
|
|
12
29
|
onClick?: () => void;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
30
|
+
};
|
|
31
|
+
type Branding = {
|
|
32
|
+
logoUrl?: string;
|
|
33
|
+
logoAlt?: string;
|
|
34
|
+
title?: string;
|
|
35
|
+
subtitle?: string;
|
|
36
|
+
};
|
|
37
|
+
type LoginButton = {
|
|
38
|
+
label?: string;
|
|
39
|
+
href?: string;
|
|
40
|
+
variant?: "default" | "destructive" | "outline" | "secondary" | "ghost" | "link";
|
|
41
|
+
onClick?: () => void;
|
|
42
|
+
};
|
|
43
|
+
type Labels = {
|
|
44
|
+
logout?: string;
|
|
45
|
+
};
|
|
46
|
+
export type AppSidebarProps = {
|
|
47
|
+
side?: SidebarPlacement;
|
|
48
|
+
variant?: "sidebar" | "floating" | "inset";
|
|
49
|
+
collapsible?: "offcanvas" | "icon" | "none";
|
|
29
50
|
fixed?: boolean;
|
|
51
|
+
className?: string;
|
|
52
|
+
style?: React.CSSProperties;
|
|
53
|
+
branding?: Branding;
|
|
30
54
|
hideBranding?: boolean;
|
|
55
|
+
groups?: MenuGroup[];
|
|
56
|
+
user?: User;
|
|
57
|
+
userMenuItems?: UserMenuItem[];
|
|
58
|
+
showUserMenu?: boolean;
|
|
59
|
+
loginButton?: LoginButton;
|
|
31
60
|
showThemeToggle?: boolean;
|
|
32
61
|
scrollable?: boolean;
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
62
|
+
header?: React.ReactNode;
|
|
63
|
+
footer?: React.ReactNode;
|
|
64
|
+
labels?: Labels;
|
|
65
|
+
};
|
|
66
|
+
export declare function AppSidebar({ side, variant, collapsible, fixed, className, style, branding, hideBranding, groups, user, userMenuItems, showUserMenu, loginButton, showThemeToggle, scrollable, header, footer, labels, ...props }: AppSidebarProps): import("react/jsx-runtime").JSX.Element;
|
|
37
67
|
export {};
|