@jameskabz/nextcraft-ui 0.7.1 → 0.7.3
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/components/craft-create-edit-drawer.cjs +5 -2
- package/dist/components/craft-create-edit-drawer.cjs.map +1 -1
- package/dist/components/craft-create-edit-drawer.d.cts +2 -1
- package/dist/components/craft-create-edit-drawer.d.ts +2 -1
- package/dist/components/craft-create-edit-drawer.js +5 -2
- package/dist/components/craft-create-edit-drawer.js.map +1 -1
- package/dist/components/craft-icon.cjs +27 -25
- package/dist/components/craft-icon.cjs.map +1 -1
- package/dist/components/craft-icon.d.cts +6 -2
- package/dist/components/craft-icon.d.ts +6 -2
- package/dist/components/craft-icon.js +27 -35
- package/dist/components/craft-icon.js.map +1 -1
- package/dist/components/layout/app-shell.cjs +5 -5
- package/dist/components/layout/app-shell.cjs.map +1 -1
- package/dist/components/layout/app-shell.js +5 -5
- package/dist/components/layout/app-shell.js.map +1 -1
- package/dist/components/layout/app-template.cjs +22 -2
- package/dist/components/layout/app-template.cjs.map +1 -1
- package/dist/components/layout/app-template.d.cts +7 -1
- package/dist/components/layout/app-template.d.ts +7 -1
- package/dist/components/layout/app-template.js +22 -2
- package/dist/components/layout/app-template.js.map +1 -1
- package/dist/components/layout/breadcrumbs.cjs +17 -7
- package/dist/components/layout/breadcrumbs.cjs.map +1 -1
- package/dist/components/layout/breadcrumbs.js +17 -7
- package/dist/components/layout/breadcrumbs.js.map +1 -1
- package/dist/components/layout/sidebar.cjs +107 -10
- package/dist/components/layout/sidebar.cjs.map +1 -1
- package/dist/components/layout/sidebar.d.cts +7 -1
- package/dist/components/layout/sidebar.d.ts +7 -1
- package/dist/components/layout/sidebar.js +97 -10
- package/dist/components/layout/sidebar.js.map +1 -1
- package/dist/components/layout/top-nav.cjs +18 -6
- package/dist/components/layout/top-nav.cjs.map +1 -1
- package/dist/components/layout/top-nav.d.cts +3 -1
- package/dist/components/layout/top-nav.d.ts +3 -1
- package/dist/components/layout/top-nav.js +18 -6
- package/dist/components/layout/top-nav.js.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/styles.css +155 -8
- package/package.json +5 -1
|
@@ -15,17 +15,29 @@ function AppTemplate({
|
|
|
15
15
|
icons,
|
|
16
16
|
activePath,
|
|
17
17
|
getActivePath,
|
|
18
|
+
sidebarDefaultExpanded = false,
|
|
19
|
+
sidebarExpanded,
|
|
20
|
+
onSidebarExpandedChange,
|
|
21
|
+
sidebarCollapsedWidth = "72px",
|
|
22
|
+
sidebarExpandedWidth = "224px",
|
|
23
|
+
sidebarHoverExpand = true,
|
|
18
24
|
children
|
|
19
25
|
}) {
|
|
20
26
|
const sidebarConfig = config.sidebar;
|
|
21
27
|
const headerConfig = config.header;
|
|
28
|
+
const [internalExpanded, setInternalExpanded] = React.useState(sidebarDefaultExpanded);
|
|
29
|
+
const resolvedExpanded = sidebarExpanded != null ? sidebarExpanded : internalExpanded;
|
|
30
|
+
const setExpanded = (next) => {
|
|
31
|
+
if (sidebarExpanded === void 0) setInternalExpanded(next);
|
|
32
|
+
onSidebarExpandedChange == null ? void 0 : onSidebarExpandedChange(next);
|
|
33
|
+
};
|
|
22
34
|
const resolvedActivePath = activePath != null ? activePath : getActivePath == null ? void 0 : getActivePath();
|
|
23
35
|
const buildIcon = React.useCallback(
|
|
24
36
|
(name) => {
|
|
25
37
|
if (!name) return void 0;
|
|
26
38
|
if (resolveIcon) return resolveIcon(name);
|
|
27
39
|
if (icons == null ? void 0 : icons[name]) return icons[name];
|
|
28
|
-
return /* @__PURE__ */ jsx(CraftIcon, { name });
|
|
40
|
+
return /* @__PURE__ */ jsx(CraftIcon, { name, size: "lg" });
|
|
29
41
|
},
|
|
30
42
|
[icons, resolveIcon]
|
|
31
43
|
);
|
|
@@ -43,12 +55,20 @@ function AppTemplate({
|
|
|
43
55
|
return /* @__PURE__ */ jsx(
|
|
44
56
|
AppShell,
|
|
45
57
|
{
|
|
58
|
+
style: {
|
|
59
|
+
"--nc-sidebar-width": resolvedExpanded ? sidebarExpandedWidth : sidebarCollapsedWidth
|
|
60
|
+
},
|
|
46
61
|
sidebar: sidebarConfig && sidebarItems ? /* @__PURE__ */ jsx(
|
|
47
62
|
Sidebar,
|
|
48
63
|
{
|
|
49
64
|
title: sidebarConfig.title,
|
|
50
65
|
items: sidebarItems,
|
|
51
|
-
footer: sidebarFooterNode
|
|
66
|
+
footer: sidebarFooterNode,
|
|
67
|
+
hoverExpand: sidebarHoverExpand,
|
|
68
|
+
expanded: resolvedExpanded,
|
|
69
|
+
onExpandedChange: setExpanded,
|
|
70
|
+
collapsedWidth: sidebarCollapsedWidth,
|
|
71
|
+
expandedWidth: sidebarExpandedWidth
|
|
52
72
|
}
|
|
53
73
|
) : void 0,
|
|
54
74
|
topNav: headerConfig ? /* @__PURE__ */ jsx(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/layout/app-template.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nimport { AppShell } from \"./app-shell\";\nimport { CraftIcon } from \"@/components/craft-icon\";\nimport { Breadcrumbs } from \"./breadcrumbs\";\nimport { Sidebar, type SidebarItem } from \"./sidebar\";\nimport { TopNav } from \"./top-nav\";\nimport type { LayoutConfig, LayoutSidebarItem } from \"./layout-config\";\n\nexport type AppTemplateProps = {\n config: LayoutConfig;\n headerActions?: React.ReactNode;\n headerBreadcrumb?: React.ReactNode;\n sidebarFooter?: React.ReactNode;\n resolveIcon?: (name: string) => React.ReactNode;\n icons?: Record<string, React.ReactNode>;\n activePath?: string;\n getActivePath?: () => string | undefined;\n children: React.ReactNode;\n};\n\nexport function AppTemplate({\n config,\n headerActions,\n headerBreadcrumb,\n sidebarFooter,\n resolveIcon,\n icons,\n activePath,\n getActivePath,\n children,\n}: AppTemplateProps) {\n const sidebarConfig = config.sidebar;\n const headerConfig = config.header;\n\n const resolvedActivePath = activePath ?? getActivePath?.();\n\n const buildIcon = React.useCallback(\n (name?: string) => {\n if (!name) return undefined;\n if (resolveIcon) return resolveIcon(name);\n if (icons?.[name]) return icons[name];\n return <CraftIcon name={name} />;\n },\n [icons, resolveIcon]\n );\n\n const sidebarItems: SidebarItem[] | null = sidebarConfig\n ? sidebarConfig.items.map((item: LayoutSidebarItem) => ({\n label: item.label,\n href: item.href,\n active:\n item.active ??\n (resolvedActivePath && item.href\n ? item.href === resolvedActivePath\n : false),\n icon: buildIcon(item.icon),\n }))\n : null;\n\n const breadcrumbNode =\n headerBreadcrumb ??\n (headerConfig?.breadcrumb ? (\n <Breadcrumbs items={headerConfig.breadcrumb} />\n ) : null);\n\n const sidebarFooterNode =\n sidebarFooter ??\n (sidebarConfig?.footerText ? (\n <div className=\"text-xs text-[rgb(var(--nc-fg-muted))]\">\n {sidebarConfig.footerText}\n </div>\n ) : null);\n\n return (\n <AppShell\n sidebar={\n sidebarConfig && sidebarItems ? (\n <Sidebar\n title={sidebarConfig.title}\n items={sidebarItems}\n footer={sidebarFooterNode}\n />\n ) : undefined\n }\n topNav={\n headerConfig ? (\n <TopNav\n title={headerConfig.title}\n breadcrumb={breadcrumbNode}\n actions={headerActions}\n />\n ) : undefined\n }\n >\n {children}\n </AppShell>\n );\n}\n"],"mappings":";
|
|
1
|
+
{"version":3,"sources":["../../../src/components/layout/app-template.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nimport { AppShell } from \"./app-shell\";\nimport { CraftIcon } from \"@/components/craft-icon\";\nimport { Breadcrumbs } from \"./breadcrumbs\";\nimport { Sidebar, type SidebarItem } from \"./sidebar\";\nimport { TopNav } from \"./top-nav\";\nimport type { LayoutConfig, LayoutSidebarItem } from \"./layout-config\";\n\nexport type AppTemplateProps = {\n config: LayoutConfig;\n headerActions?: React.ReactNode;\n headerBreadcrumb?: React.ReactNode;\n sidebarFooter?: React.ReactNode;\n resolveIcon?: (name: string) => React.ReactNode;\n icons?: Record<string, React.ReactNode>;\n activePath?: string;\n getActivePath?: () => string | undefined;\n sidebarDefaultExpanded?: boolean;\n sidebarExpanded?: boolean;\n onSidebarExpandedChange?: (expanded: boolean) => void;\n sidebarCollapsedWidth?: string;\n sidebarExpandedWidth?: string;\n sidebarHoverExpand?: boolean;\n children: React.ReactNode;\n};\n\nexport function AppTemplate({\n config,\n headerActions,\n headerBreadcrumb,\n sidebarFooter,\n resolveIcon,\n icons,\n activePath,\n getActivePath,\n sidebarDefaultExpanded = false,\n sidebarExpanded,\n onSidebarExpandedChange,\n sidebarCollapsedWidth = \"72px\",\n sidebarExpandedWidth = \"224px\",\n sidebarHoverExpand = true,\n children,\n}: AppTemplateProps) {\n const sidebarConfig = config.sidebar;\n const headerConfig = config.header;\n\n const [internalExpanded, setInternalExpanded] =\n React.useState(sidebarDefaultExpanded);\n const resolvedExpanded = sidebarExpanded ?? internalExpanded;\n const setExpanded = (next: boolean) => {\n if (sidebarExpanded === undefined) setInternalExpanded(next);\n onSidebarExpandedChange?.(next);\n };\n\n const resolvedActivePath = activePath ?? getActivePath?.();\n\n const buildIcon = React.useCallback(\n (name?: string) => {\n if (!name) return undefined;\n if (resolveIcon) return resolveIcon(name);\n if (icons?.[name]) return icons[name];\n return <CraftIcon name={name} size=\"lg\"/>;\n },\n [icons, resolveIcon]\n );\n\n const sidebarItems: SidebarItem[] | null = sidebarConfig\n ? sidebarConfig.items.map((item: LayoutSidebarItem) => ({\n label: item.label,\n href: item.href,\n active:\n item.active ??\n (resolvedActivePath && item.href\n ? item.href === resolvedActivePath\n : false),\n icon: buildIcon(item.icon),\n }))\n : null;\n\n const breadcrumbNode =\n headerBreadcrumb ??\n (headerConfig?.breadcrumb ? (\n <Breadcrumbs items={headerConfig.breadcrumb} />\n ) : null);\n\n const sidebarFooterNode =\n sidebarFooter ??\n (sidebarConfig?.footerText ? (\n <div className=\"text-xs text-[rgb(var(--nc-fg-muted))]\">\n {sidebarConfig.footerText}\n </div>\n ) : null);\n\n return (\n <AppShell\n style={\n {\n \"--nc-sidebar-width\": resolvedExpanded\n ? sidebarExpandedWidth\n : sidebarCollapsedWidth,\n } as React.CSSProperties\n }\n sidebar={\n sidebarConfig && sidebarItems ? (\n <Sidebar\n title={sidebarConfig.title}\n items={sidebarItems}\n footer={sidebarFooterNode}\n hoverExpand={sidebarHoverExpand}\n expanded={resolvedExpanded}\n onExpandedChange={setExpanded}\n collapsedWidth={sidebarCollapsedWidth}\n expandedWidth={sidebarExpandedWidth}\n />\n ) : undefined\n }\n topNav={\n headerConfig ? (\n <TopNav\n title={headerConfig.title}\n breadcrumb={breadcrumbNode}\n actions={headerActions}\n />\n ) : undefined\n }\n >\n {children}\n </AppShell>\n );\n}\n"],"mappings":";AAgEa;AA9Db,YAAY,WAAW;AAEvB,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAC1B,SAAS,mBAAmB;AAC5B,SAAS,eAAiC;AAC1C,SAAS,cAAc;AAqBhB,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,yBAAyB;AAAA,EACzB;AAAA,EACA;AAAA,EACA,wBAAwB;AAAA,EACxB,uBAAuB;AAAA,EACvB,qBAAqB;AAAA,EACrB;AACF,GAAqB;AACnB,QAAM,gBAAgB,OAAO;AAC7B,QAAM,eAAe,OAAO;AAE5B,QAAM,CAAC,kBAAkB,mBAAmB,IAC1C,MAAM,SAAS,sBAAsB;AACvC,QAAM,mBAAmB,4CAAmB;AAC5C,QAAM,cAAc,CAAC,SAAkB;AACrC,QAAI,oBAAoB,OAAW,qBAAoB,IAAI;AAC3D,uEAA0B;AAAA,EAC5B;AAEA,QAAM,qBAAqB,kCAAc;AAEzC,QAAM,YAAY,MAAM;AAAA,IACtB,CAAC,SAAkB;AACjB,UAAI,CAAC,KAAM,QAAO;AAClB,UAAI,YAAa,QAAO,YAAY,IAAI;AACxC,UAAI,+BAAQ,MAAO,QAAO,MAAM,IAAI;AACpC,aAAO,oBAAC,aAAU,MAAY,MAAK,MAAI;AAAA,IACzC;AAAA,IACA,CAAC,OAAO,WAAW;AAAA,EACrB;AAEA,QAAM,eAAqC,gBACvC,cAAc,MAAM,IAAI,CAAC,SAAyB;AAtExD;AAsE4D;AAAA,MACpD,OAAO,KAAK;AAAA,MACZ,MAAM,KAAK;AAAA,MACX,SACE,UAAK,WAAL,YACC,sBAAsB,KAAK,OACxB,KAAK,SAAS,qBACd;AAAA,MACN,MAAM,UAAU,KAAK,IAAI;AAAA,IAC3B;AAAA,GAAE,IACF;AAEJ,QAAM,iBACJ,+CACC,6CAAc,cACb,oBAAC,eAAY,OAAO,aAAa,YAAY,IAC3C;AAEN,QAAM,oBACJ,yCACC,+CAAe,cACd,oBAAC,SAAI,WAAU,0CACZ,wBAAc,YACjB,IACE;AAEN,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OACE;AAAA,QACE,sBAAsB,mBAClB,uBACA;AAAA,MACN;AAAA,MAEF,SACE,iBAAiB,eACf;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,cAAc;AAAA,UACrB,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,aAAa;AAAA,UACb,UAAU;AAAA,UACV,kBAAkB;AAAA,UAClB,gBAAgB;AAAA,UAChB,eAAe;AAAA;AAAA,MACjB,IACE;AAAA,MAEN,QACE,eACE;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,aAAa;AAAA,UACpB,YAAY;AAAA,UACZ,SAAS;AAAA;AAAA,MACX,IACE;AAAA,MAGL;AAAA;AAAA,EACH;AAEJ;","names":[]}
|
|
@@ -24,13 +24,23 @@ module.exports = __toCommonJS(breadcrumbs_exports);
|
|
|
24
24
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
25
25
|
var import_cn = require("../../utils/cn");
|
|
26
26
|
function Breadcrumbs({ className, items, ...props }) {
|
|
27
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
27
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
28
|
+
"nav",
|
|
29
|
+
{
|
|
30
|
+
className: (0, import_cn.cn)(
|
|
31
|
+
"flex items-center text-xs text-[rgb(var(--nc-fg-muted))]",
|
|
32
|
+
className
|
|
33
|
+
),
|
|
34
|
+
...props,
|
|
35
|
+
children: items.map((item, index) => {
|
|
36
|
+
const content = item.href ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("a", { href: item.href, className: "transition hover:text-[rgb(var(--nc-fg))]", children: item.label }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-[rgb(var(--nc-fg))]", children: item.label });
|
|
37
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "flex items-center", children: [
|
|
38
|
+
content,
|
|
39
|
+
index < items.length - 1 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "mx-2 text-[rgb(var(--nc-fg-soft))]", children: "/" })
|
|
40
|
+
] }, `${item.label}-${index}`);
|
|
41
|
+
})
|
|
42
|
+
}
|
|
43
|
+
);
|
|
34
44
|
}
|
|
35
45
|
// Annotate the CommonJS export names for ESM import in node:
|
|
36
46
|
0 && (module.exports = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/layout/breadcrumbs.tsx"],"sourcesContent":["import * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\n\nexport type BreadcrumbItem = {\n label: React.ReactNode;\n href?: string;\n};\n\nexport type BreadcrumbsProps = React.HTMLAttributes<HTMLElement> & {\n items: BreadcrumbItem[];\n};\n\nexport function Breadcrumbs({ className, items, ...props }: BreadcrumbsProps) {\n return (\n <nav
|
|
1
|
+
{"version":3,"sources":["../../../src/components/layout/breadcrumbs.tsx"],"sourcesContent":["import * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\n\nexport type BreadcrumbItem = {\n label: React.ReactNode;\n href?: string;\n};\n\nexport type BreadcrumbsProps = React.HTMLAttributes<HTMLElement> & {\n items: BreadcrumbItem[];\n};\n\nexport function Breadcrumbs({ className, items, ...props }: BreadcrumbsProps) {\n return (\n <nav\n className={cn(\n \"flex items-center text-xs text-[rgb(var(--nc-fg-muted))]\",\n className\n )}\n {...props}\n >\n {items.map((item, index) => {\n const content = item.href ? (\n <a href={item.href} className=\"transition hover:text-[rgb(var(--nc-fg))]\">\n {item.label}\n </a>\n ) : (\n <span className=\"text-[rgb(var(--nc-fg))]\">{item.label}</span>\n );\n\n return (\n <span key={`${item.label}-${index}`} className=\"flex items-center\">\n {content}\n {index < items.length - 1 && (\n <span className=\"mx-2 text-[rgb(var(--nc-fg-soft))]\">/</span>\n )}\n </span>\n );\n })}\n </nav>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBU;AAtBV,gBAAmB;AAWZ,SAAS,YAAY,EAAE,WAAW,OAAO,GAAG,MAAM,GAAqB;AAC5E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH,gBAAM,IAAI,CAAC,MAAM,UAAU;AAC1B,cAAM,UAAU,KAAK,OACnB,4CAAC,OAAE,MAAM,KAAK,MAAM,WAAU,6CAC3B,eAAK,OACR,IAEA,4CAAC,UAAK,WAAU,4BAA4B,eAAK,OAAM;AAGzD,eACE,6CAAC,UAAoC,WAAU,qBAC5C;AAAA;AAAA,UACA,QAAQ,MAAM,SAAS,KACtB,4CAAC,UAAK,WAAU,sCAAqC,eAAC;AAAA,aAH/C,GAAG,KAAK,KAAK,IAAI,KAAK,EAKjC;AAAA,MAEJ,CAAC;AAAA;AAAA,EACH;AAEJ;","names":[]}
|
|
@@ -1,13 +1,23 @@
|
|
|
1
1
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { cn } from "../../utils/cn";
|
|
3
3
|
function Breadcrumbs({ className, items, ...props }) {
|
|
4
|
-
return /* @__PURE__ */ jsx(
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
4
|
+
return /* @__PURE__ */ jsx(
|
|
5
|
+
"nav",
|
|
6
|
+
{
|
|
7
|
+
className: cn(
|
|
8
|
+
"flex items-center text-xs text-[rgb(var(--nc-fg-muted))]",
|
|
9
|
+
className
|
|
10
|
+
),
|
|
11
|
+
...props,
|
|
12
|
+
children: items.map((item, index) => {
|
|
13
|
+
const content = item.href ? /* @__PURE__ */ jsx("a", { href: item.href, className: "transition hover:text-[rgb(var(--nc-fg))]", children: item.label }) : /* @__PURE__ */ jsx("span", { className: "text-[rgb(var(--nc-fg))]", children: item.label });
|
|
14
|
+
return /* @__PURE__ */ jsxs("span", { className: "flex items-center", children: [
|
|
15
|
+
content,
|
|
16
|
+
index < items.length - 1 && /* @__PURE__ */ jsx("span", { className: "mx-2 text-[rgb(var(--nc-fg-soft))]", children: "/" })
|
|
17
|
+
] }, `${item.label}-${index}`);
|
|
18
|
+
})
|
|
19
|
+
}
|
|
20
|
+
);
|
|
11
21
|
}
|
|
12
22
|
export {
|
|
13
23
|
Breadcrumbs
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/layout/breadcrumbs.tsx"],"sourcesContent":["import * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\n\nexport type BreadcrumbItem = {\n label: React.ReactNode;\n href?: string;\n};\n\nexport type BreadcrumbsProps = React.HTMLAttributes<HTMLElement> & {\n items: BreadcrumbItem[];\n};\n\nexport function Breadcrumbs({ className, items, ...props }: BreadcrumbsProps) {\n return (\n <nav
|
|
1
|
+
{"version":3,"sources":["../../../src/components/layout/breadcrumbs.tsx"],"sourcesContent":["import * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\n\nexport type BreadcrumbItem = {\n label: React.ReactNode;\n href?: string;\n};\n\nexport type BreadcrumbsProps = React.HTMLAttributes<HTMLElement> & {\n items: BreadcrumbItem[];\n};\n\nexport function Breadcrumbs({ className, items, ...props }: BreadcrumbsProps) {\n return (\n <nav\n className={cn(\n \"flex items-center text-xs text-[rgb(var(--nc-fg-muted))]\",\n className\n )}\n {...props}\n >\n {items.map((item, index) => {\n const content = item.href ? (\n <a href={item.href} className=\"transition hover:text-[rgb(var(--nc-fg))]\">\n {item.label}\n </a>\n ) : (\n <span className=\"text-[rgb(var(--nc-fg))]\">{item.label}</span>\n );\n\n return (\n <span key={`${item.label}-${index}`} className=\"flex items-center\">\n {content}\n {index < items.length - 1 && (\n <span className=\"mx-2 text-[rgb(var(--nc-fg-soft))]\">/</span>\n )}\n </span>\n );\n })}\n </nav>\n );\n}\n"],"mappings":"AAwBU,cAQA,YARA;AAtBV,SAAS,UAAU;AAWZ,SAAS,YAAY,EAAE,WAAW,OAAO,GAAG,MAAM,GAAqB;AAC5E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH,gBAAM,IAAI,CAAC,MAAM,UAAU;AAC1B,cAAM,UAAU,KAAK,OACnB,oBAAC,OAAE,MAAM,KAAK,MAAM,WAAU,6CAC3B,eAAK,OACR,IAEA,oBAAC,UAAK,WAAU,4BAA4B,eAAK,OAAM;AAGzD,eACE,qBAAC,UAAoC,WAAU,qBAC5C;AAAA;AAAA,UACA,QAAQ,MAAM,SAAS,KACtB,oBAAC,UAAK,WAAU,sCAAqC,eAAC;AAAA,aAH/C,GAAG,KAAK,KAAK,IAAI,KAAK,EAKjC;AAAA,MAEJ,CAAC;AAAA;AAAA,EACH;AAEJ;","names":[]}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
var __create = Object.create;
|
|
2
4
|
var __defProp = Object.defineProperty;
|
|
3
5
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
6
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
5
8
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
9
|
var __export = (target, all) => {
|
|
7
10
|
for (var name in all)
|
|
@@ -15,6 +18,14 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
15
18
|
}
|
|
16
19
|
return to;
|
|
17
20
|
};
|
|
21
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
22
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
23
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
24
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
25
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
26
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
27
|
+
mod
|
|
28
|
+
));
|
|
18
29
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
30
|
var sidebar_exports = {};
|
|
20
31
|
__export(sidebar_exports, {
|
|
@@ -22,38 +33,124 @@ __export(sidebar_exports, {
|
|
|
22
33
|
});
|
|
23
34
|
module.exports = __toCommonJS(sidebar_exports);
|
|
24
35
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
36
|
+
var React = __toESM(require("react"), 1);
|
|
37
|
+
var import_link = __toESM(require("next/link"), 1);
|
|
25
38
|
var import_craft_icon = require("../../components/craft-icon");
|
|
26
39
|
var import_cn = require("../../utils/cn");
|
|
27
|
-
function Sidebar({
|
|
40
|
+
function Sidebar({
|
|
41
|
+
className,
|
|
42
|
+
title,
|
|
43
|
+
items,
|
|
44
|
+
footer,
|
|
45
|
+
hoverExpand = true,
|
|
46
|
+
expanded,
|
|
47
|
+
onExpandedChange,
|
|
48
|
+
defaultExpanded = false,
|
|
49
|
+
collapsedWidth = "72px",
|
|
50
|
+
expandedWidth = "224px",
|
|
51
|
+
...props
|
|
52
|
+
}) {
|
|
53
|
+
const [internalExpanded, setInternalExpanded] = React.useState(defaultExpanded);
|
|
54
|
+
const isExpanded = expanded != null ? expanded : internalExpanded;
|
|
55
|
+
const toggleSidebar = () => {
|
|
56
|
+
const next = !isExpanded;
|
|
57
|
+
if (expanded === void 0) setInternalExpanded(next);
|
|
58
|
+
onExpandedChange == null ? void 0 : onExpandedChange(next);
|
|
59
|
+
};
|
|
28
60
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
29
61
|
"aside",
|
|
30
62
|
{
|
|
31
63
|
className: (0, import_cn.cn)(
|
|
32
|
-
"flex h-full
|
|
64
|
+
"group flex h-full flex-col gap-4 rounded-2xl border border-[rgb(var(--nc-border)/0.2)] bg-[rgb(var(--nc-surface)/0.04)] p-3 text-[rgb(var(--nc-fg))] backdrop-blur-xl transition-all duration-300 ease-in-out",
|
|
65
|
+
"w-(--nc-sidebar-width)",
|
|
66
|
+
hoverExpand && !isExpanded ? "hover:w-(--nc-sidebar-expanded)" : "",
|
|
67
|
+
hoverExpand ? "fixed left-0 top-0 z-50 shadow-[0_16px_40px_rgba(0,0,0,0.18)]" : "relative",
|
|
33
68
|
className
|
|
34
69
|
),
|
|
70
|
+
style: {
|
|
71
|
+
"--nc-sidebar-width": isExpanded ? expandedWidth : collapsedWidth,
|
|
72
|
+
"--nc-sidebar-expanded": expandedWidth
|
|
73
|
+
},
|
|
35
74
|
...props,
|
|
36
75
|
children: [
|
|
37
|
-
title && /* @__PURE__ */ (0, import_jsx_runtime.
|
|
38
|
-
|
|
76
|
+
title && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-3 px-1", children: [
|
|
77
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-xl bg-[rgb(var(--nc-accent-1)/0.18)] text-2xl font-semibold", children: typeof title === "string" ? title.slice(0, 1) : title }),
|
|
78
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
79
|
+
"span",
|
|
80
|
+
{
|
|
81
|
+
className: (0, import_cn.cn)(
|
|
82
|
+
"truncate text-sm font-semibold transition-all duration-300 ease-in-out",
|
|
83
|
+
hoverExpand && !isExpanded ? "max-w-0 opacity-0 group-hover:max-w-40 group-hover:opacity-100" : "max-w-40 opacity-100"
|
|
84
|
+
),
|
|
85
|
+
children: title
|
|
86
|
+
}
|
|
87
|
+
)
|
|
88
|
+
] }),
|
|
89
|
+
hoverExpand && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
90
|
+
"button",
|
|
91
|
+
{
|
|
92
|
+
onClick: toggleSidebar,
|
|
93
|
+
className: (0, import_cn.cn)(
|
|
94
|
+
"flex items-center rounded-xl text-sm transition-all duration-300 ease-in-out",
|
|
95
|
+
!isExpanded ? "justify-center px-0.5 py-2 group-hover:justify-start group-hover:gap-3 group-hover:px-0.5" : "justify-start gap-3 px-0.5 py-2",
|
|
96
|
+
"hover:bg-[rgb(var(--nc-surface)/0.1)]",
|
|
97
|
+
isExpanded ? "text-[rgb(var(--nc-fg))] bg-[rgb(var(--nc-surface)/0.08)]" : "text-[rgb(var(--nc-fg-muted))]"
|
|
98
|
+
),
|
|
99
|
+
"aria-label": isExpanded ? "Collapse sidebar" : "Expand sidebar",
|
|
100
|
+
"aria-expanded": isExpanded,
|
|
101
|
+
children: [
|
|
102
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex shrink-0 items-center justify-center transition-all duration-300 ease-in-out", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_craft_icon.CraftIcon, { name: "bars", size: "4xl" }) }),
|
|
103
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
104
|
+
"span",
|
|
105
|
+
{
|
|
106
|
+
className: (0, import_cn.cn)(
|
|
107
|
+
"truncate whitespace-nowrap transition-all duration-300 ease-in-out",
|
|
108
|
+
!isExpanded ? "max-w-0 opacity-0 group-hover:max-w-40 group-hover:opacity-100" : "max-w-40 opacity-100"
|
|
109
|
+
),
|
|
110
|
+
children: isExpanded ? "Collapse" : "Expand"
|
|
111
|
+
}
|
|
112
|
+
)
|
|
113
|
+
]
|
|
114
|
+
}
|
|
115
|
+
),
|
|
116
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("nav", { className: "flex flex-col gap-2.5", children: items.map((item, index) => {
|
|
39
117
|
var _a;
|
|
40
118
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
41
|
-
|
|
119
|
+
import_link.default,
|
|
42
120
|
{
|
|
43
121
|
href: (_a = item.href) != null ? _a : "#",
|
|
44
122
|
className: (0, import_cn.cn)(
|
|
45
|
-
"flex items-center
|
|
46
|
-
|
|
123
|
+
"flex items-center rounded-xl text-sm transition-all duration-300 ease-in-out",
|
|
124
|
+
!isExpanded ? "justify-center px-2 py-2 group-hover:justify-start group-hover:gap-3 group-hover:px-3" : "justify-start gap-3 px-3 py-2",
|
|
125
|
+
item.active ? "bg-[rgb(var(--nc-accent-1)/0.18)] text-[rgb(var(--nc-fg))] shadow-[inset_0_0_0_1px_rgb(var(--nc-accent-1)/0.25)]" : "text-[rgb(var(--nc-fg-muted))] hover:bg-[rgb(var(--nc-surface)/0.1)] hover:text-[rgb(var(--nc-fg))]"
|
|
47
126
|
),
|
|
48
127
|
children: [
|
|
49
|
-
typeof item.icon === "string" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_craft_icon.CraftIcon, { name: item.icon,
|
|
50
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
128
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex shrink-0 items-center justify-center transition-all duration-300 ease-in-out", children: typeof item.icon === "string" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_craft_icon.CraftIcon, { name: item.icon, size: "3xl" }) : item.icon }),
|
|
129
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
130
|
+
"span",
|
|
131
|
+
{
|
|
132
|
+
className: (0, import_cn.cn)(
|
|
133
|
+
"truncate whitespace-nowrap transition-all duration-300 ease-in-out",
|
|
134
|
+
!isExpanded ? "max-w-0 opacity-0 group-hover:max-w-40 group-hover:opacity-100" : "max-w-40 opacity-100"
|
|
135
|
+
),
|
|
136
|
+
children: item.label
|
|
137
|
+
}
|
|
138
|
+
)
|
|
51
139
|
]
|
|
52
140
|
},
|
|
53
141
|
`${item.label}-${index}`
|
|
54
142
|
);
|
|
55
143
|
}) }),
|
|
56
|
-
footer && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
144
|
+
footer && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
145
|
+
"div",
|
|
146
|
+
{
|
|
147
|
+
className: (0, import_cn.cn)(
|
|
148
|
+
"mt-auto px-2 pt-3 text-xs text-[rgb(var(--nc-fg-muted))] transition-all duration-300 ease-in-out",
|
|
149
|
+
!isExpanded ? "max-w-0 opacity-0 group-hover:max-w-40 group-hover:opacity-100" : "max-w-40 opacity-100"
|
|
150
|
+
),
|
|
151
|
+
children: footer
|
|
152
|
+
}
|
|
153
|
+
)
|
|
57
154
|
]
|
|
58
155
|
}
|
|
59
156
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/layout/sidebar.tsx"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../../src/components/layout/sidebar.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport Link from \"next/link\";\n\nimport { CraftIcon } from \"@/components/craft-icon\";\nimport { cn } from \"@/utils/cn\";\n\nexport type SidebarItem = {\n label: React.ReactNode;\n href?: string;\n icon?: React.ReactNode | string;\n active?: boolean;\n};\n\nexport type SidebarProps = React.HTMLAttributes<HTMLElement> & {\n title?: React.ReactNode;\n items: SidebarItem[];\n footer?: React.ReactNode;\n hoverExpand?: boolean;\n expanded?: boolean;\n onExpandedChange?: (expanded: boolean) => void;\n defaultExpanded?: boolean;\n collapsedWidth?: string;\n expandedWidth?: string;\n};\n\nexport function Sidebar({\n className,\n title,\n items,\n footer,\n hoverExpand = true,\n expanded,\n onExpandedChange,\n defaultExpanded = false,\n collapsedWidth = \"72px\",\n expandedWidth = \"224px\",\n ...props\n}: SidebarProps) {\n const [internalExpanded, setInternalExpanded] = React.useState(defaultExpanded);\n const isExpanded = expanded ?? internalExpanded;\n\n const toggleSidebar = () => {\n const next = !isExpanded;\n if (expanded === undefined) setInternalExpanded(next);\n onExpandedChange?.(next);\n };\n\n return (\n <aside\n className={cn(\n \"group flex h-full flex-col gap-4 rounded-2xl border border-[rgb(var(--nc-border)/0.2)] bg-[rgb(var(--nc-surface)/0.04)] p-3 text-[rgb(var(--nc-fg))] backdrop-blur-xl transition-all duration-300 ease-in-out\",\n \"w-(--nc-sidebar-width)\",\n hoverExpand && !isExpanded ? \"hover:w-(--nc-sidebar-expanded)\" : \"\",\n hoverExpand\n ? \"fixed left-0 top-0 z-50 shadow-[0_16px_40px_rgba(0,0,0,0.18)]\"\n : \"relative\",\n className\n )}\n style={\n {\n \"--nc-sidebar-width\": isExpanded ? expandedWidth : collapsedWidth,\n \"--nc-sidebar-expanded\": expandedWidth,\n } as React.CSSProperties\n }\n {...props}\n >\n {title && (\n <div className=\"flex items-center gap-3 px-1\">\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-xl bg-[rgb(var(--nc-accent-1)/0.18)] text-2xl font-semibold\">\n {typeof title === \"string\" ? title.slice(0, 1) : title}\n </div>\n <span\n className={cn(\n \"truncate text-sm font-semibold transition-all duration-300 ease-in-out\",\n hoverExpand && !isExpanded\n ? \"max-w-0 opacity-0 group-hover:max-w-40 group-hover:opacity-100\"\n : \"max-w-40 opacity-100\"\n )}\n >\n {title}\n </span>\n </div>\n )}\n\n {hoverExpand && (\n <button\n onClick={toggleSidebar}\n className={cn(\n \"flex items-center rounded-xl text-sm transition-all duration-300 ease-in-out\",\n !isExpanded\n ? \"justify-center px-0.5 py-2 group-hover:justify-start group-hover:gap-3 group-hover:px-0.5\"\n : \"justify-start gap-3 px-0.5 py-2\",\n \"hover:bg-[rgb(var(--nc-surface)/0.1)]\",\n isExpanded\n ? \"text-[rgb(var(--nc-fg))] bg-[rgb(var(--nc-surface)/0.08)]\"\n : \"text-[rgb(var(--nc-fg-muted))]\"\n )}\n aria-label={isExpanded ? \"Collapse sidebar\" : \"Expand sidebar\"}\n aria-expanded={isExpanded}\n >\n <div className=\"flex shrink-0 items-center justify-center transition-all duration-300 ease-in-out\">\n <CraftIcon name=\"bars\" size=\"4xl\" />\n </div>\n <span\n className={cn(\n \"truncate whitespace-nowrap transition-all duration-300 ease-in-out\",\n !isExpanded\n ? \"max-w-0 opacity-0 group-hover:max-w-40 group-hover:opacity-100\"\n : \"max-w-40 opacity-100\"\n )}\n >\n {isExpanded ? \"Collapse\" : \"Expand\"}\n </span>\n </button>\n )}\n\n <nav className=\"flex flex-col gap-2.5\">\n {items.map((item, index) => (\n <Link\n key={`${item.label}-${index}`}\n href={item.href ?? \"#\"}\n className={cn(\n \"flex items-center rounded-xl text-sm transition-all duration-300 ease-in-out\",\n !isExpanded\n ? \"justify-center px-2 py-2 group-hover:justify-start group-hover:gap-3 group-hover:px-3\"\n : \"justify-start gap-3 px-3 py-2\",\n item.active\n ? \"bg-[rgb(var(--nc-accent-1)/0.18)] text-[rgb(var(--nc-fg))] shadow-[inset_0_0_0_1px_rgb(var(--nc-accent-1)/0.25)]\"\n : \"text-[rgb(var(--nc-fg-muted))] hover:bg-[rgb(var(--nc-surface)/0.1)] hover:text-[rgb(var(--nc-fg))]\"\n )}\n >\n <div className=\"flex shrink-0 items-center justify-center transition-all duration-300 ease-in-out\">\n {typeof item.icon === \"string\" ? (\n <CraftIcon name={item.icon} size=\"3xl\" />\n ) : (\n item.icon\n )}\n </div>\n <span\n className={cn(\n \"truncate whitespace-nowrap transition-all duration-300 ease-in-out\",\n !isExpanded\n ? \"max-w-0 opacity-0 group-hover:max-w-40 group-hover:opacity-100\"\n : \"max-w-40 opacity-100\"\n )}\n >\n {item.label}\n </span>\n </Link>\n ))}\n </nav>\n\n {footer && (\n <div\n className={cn(\n \"mt-auto px-2 pt-3 text-xs text-[rgb(var(--nc-fg-muted))] transition-all duration-300 ease-in-out\",\n !isExpanded\n ? \"max-w-0 opacity-0 group-hover:max-w-40 group-hover:opacity-100\"\n : \"max-w-40 opacity-100\"\n )}\n >\n {footer}\n </div>\n )}\n </aside>\n );\n}"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAqEQ;AAnER,YAAuB;AACvB,kBAAiB;AAEjB,wBAA0B;AAC1B,gBAAmB;AAqBZ,SAAS,QAAQ;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,GAAG;AACL,GAAiB;AACf,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,MAAM,SAAS,eAAe;AAC9E,QAAM,aAAa,8BAAY;AAE/B,QAAM,gBAAgB,MAAM;AAC1B,UAAM,OAAO,CAAC;AACd,QAAI,aAAa,OAAW,qBAAoB,IAAI;AACpD,yDAAmB;AAAA,EACrB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA,eAAe,CAAC,aAAa,oCAAoC;AAAA,QACjE,cACI,kEACA;AAAA,QACJ;AAAA,MACF;AAAA,MACA,OACE;AAAA,QACE,sBAAsB,aAAa,gBAAgB;AAAA,QACnD,yBAAyB;AAAA,MAC3B;AAAA,MAED,GAAG;AAAA,MAEH;AAAA,iBACC,6CAAC,SAAI,WAAU,gCACb;AAAA,sDAAC,SAAI,WAAU,yHACZ,iBAAO,UAAU,WAAW,MAAM,MAAM,GAAG,CAAC,IAAI,OACnD;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,eAAW;AAAA,gBACT;AAAA,gBACA,eAAe,CAAC,aACZ,mEACA;AAAA,cACN;AAAA,cAEC;AAAA;AAAA,UACH;AAAA,WACF;AAAA,QAGD,eACC;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,eAAW;AAAA,cACT;AAAA,cACA,CAAC,aACG,8FACA;AAAA,cACJ;AAAA,cACA,aACI,8DACA;AAAA,YACN;AAAA,YACA,cAAY,aAAa,qBAAqB;AAAA,YAC9C,iBAAe;AAAA,YAEf;AAAA,0DAAC,SAAI,WAAU,qFACb,sDAAC,+BAAU,MAAK,QAAO,MAAK,OAAM,GACpC;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,eAAW;AAAA,oBACT;AAAA,oBACA,CAAC,aACG,mEACA;AAAA,kBACN;AAAA,kBAEC,uBAAa,aAAa;AAAA;AAAA,cAC7B;AAAA;AAAA;AAAA,QACF;AAAA,QAGF,4CAAC,SAAI,WAAU,yBACZ,gBAAM,IAAI,CAAC,MAAM,UAAO;AAvHjC;AAwHU;AAAA,YAAC,YAAAA;AAAA,YAAA;AAAA,cAEC,OAAM,UAAK,SAAL,YAAa;AAAA,cACnB,eAAW;AAAA,gBACT;AAAA,gBACA,CAAC,aACG,0FACA;AAAA,gBACJ,KAAK,SACD,qHACA;AAAA,cACN;AAAA,cAEA;AAAA,4DAAC,SAAI,WAAU,qFACZ,iBAAO,KAAK,SAAS,WACpB,4CAAC,+BAAU,MAAM,KAAK,MAAM,MAAK,OAAM,IAEvC,KAAK,MAET;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,eAAW;AAAA,sBACT;AAAA,sBACA,CAAC,aACG,mEACA;AAAA,oBACN;AAAA,oBAEC,eAAK;AAAA;AAAA,gBACR;AAAA;AAAA;AAAA,YA5BK,GAAG,KAAK,KAAK,IAAI,KAAK;AAAA,UA6B7B;AAAA,SACD,GACH;AAAA,QAEC,UACC;AAAA,UAAC;AAAA;AAAA,YACC,eAAW;AAAA,cACT;AAAA,cACA,CAAC,aACG,mEACA;AAAA,YACN;AAAA,YAEC;AAAA;AAAA,QACH;AAAA;AAAA;AAAA,EAEJ;AAEJ;","names":["Link"]}
|
|
@@ -11,7 +11,13 @@ type SidebarProps = React.HTMLAttributes<HTMLElement> & {
|
|
|
11
11
|
title?: React.ReactNode;
|
|
12
12
|
items: SidebarItem[];
|
|
13
13
|
footer?: React.ReactNode;
|
|
14
|
+
hoverExpand?: boolean;
|
|
15
|
+
expanded?: boolean;
|
|
16
|
+
onExpandedChange?: (expanded: boolean) => void;
|
|
17
|
+
defaultExpanded?: boolean;
|
|
18
|
+
collapsedWidth?: string;
|
|
19
|
+
expandedWidth?: string;
|
|
14
20
|
};
|
|
15
|
-
declare function Sidebar({ className, title, items, footer, ...props }: SidebarProps): react_jsx_runtime.JSX.Element;
|
|
21
|
+
declare function Sidebar({ className, title, items, footer, hoverExpand, expanded, onExpandedChange, defaultExpanded, collapsedWidth, expandedWidth, ...props }: SidebarProps): react_jsx_runtime.JSX.Element;
|
|
16
22
|
|
|
17
23
|
export { Sidebar, type SidebarItem, type SidebarProps };
|
|
@@ -11,7 +11,13 @@ type SidebarProps = React.HTMLAttributes<HTMLElement> & {
|
|
|
11
11
|
title?: React.ReactNode;
|
|
12
12
|
items: SidebarItem[];
|
|
13
13
|
footer?: React.ReactNode;
|
|
14
|
+
hoverExpand?: boolean;
|
|
15
|
+
expanded?: boolean;
|
|
16
|
+
onExpandedChange?: (expanded: boolean) => void;
|
|
17
|
+
defaultExpanded?: boolean;
|
|
18
|
+
collapsedWidth?: string;
|
|
19
|
+
expandedWidth?: string;
|
|
14
20
|
};
|
|
15
|
-
declare function Sidebar({ className, title, items, footer, ...props }: SidebarProps): react_jsx_runtime.JSX.Element;
|
|
21
|
+
declare function Sidebar({ className, title, items, footer, hoverExpand, expanded, onExpandedChange, defaultExpanded, collapsedWidth, expandedWidth, ...props }: SidebarProps): react_jsx_runtime.JSX.Element;
|
|
16
22
|
|
|
17
23
|
export { Sidebar, type SidebarItem, type SidebarProps };
|
|
@@ -1,36 +1,123 @@
|
|
|
1
|
+
"use client";
|
|
1
2
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import Link from "next/link";
|
|
2
5
|
import { CraftIcon } from "../../components/craft-icon";
|
|
3
6
|
import { cn } from "../../utils/cn";
|
|
4
|
-
function Sidebar({
|
|
7
|
+
function Sidebar({
|
|
8
|
+
className,
|
|
9
|
+
title,
|
|
10
|
+
items,
|
|
11
|
+
footer,
|
|
12
|
+
hoverExpand = true,
|
|
13
|
+
expanded,
|
|
14
|
+
onExpandedChange,
|
|
15
|
+
defaultExpanded = false,
|
|
16
|
+
collapsedWidth = "72px",
|
|
17
|
+
expandedWidth = "224px",
|
|
18
|
+
...props
|
|
19
|
+
}) {
|
|
20
|
+
const [internalExpanded, setInternalExpanded] = React.useState(defaultExpanded);
|
|
21
|
+
const isExpanded = expanded != null ? expanded : internalExpanded;
|
|
22
|
+
const toggleSidebar = () => {
|
|
23
|
+
const next = !isExpanded;
|
|
24
|
+
if (expanded === void 0) setInternalExpanded(next);
|
|
25
|
+
onExpandedChange == null ? void 0 : onExpandedChange(next);
|
|
26
|
+
};
|
|
5
27
|
return /* @__PURE__ */ jsxs(
|
|
6
28
|
"aside",
|
|
7
29
|
{
|
|
8
30
|
className: cn(
|
|
9
|
-
"flex h-full
|
|
31
|
+
"group flex h-full flex-col gap-4 rounded-2xl border border-[rgb(var(--nc-border)/0.2)] bg-[rgb(var(--nc-surface)/0.04)] p-3 text-[rgb(var(--nc-fg))] backdrop-blur-xl transition-all duration-300 ease-in-out",
|
|
32
|
+
"w-(--nc-sidebar-width)",
|
|
33
|
+
hoverExpand && !isExpanded ? "hover:w-(--nc-sidebar-expanded)" : "",
|
|
34
|
+
hoverExpand ? "fixed left-0 top-0 z-50 shadow-[0_16px_40px_rgba(0,0,0,0.18)]" : "relative",
|
|
10
35
|
className
|
|
11
36
|
),
|
|
37
|
+
style: {
|
|
38
|
+
"--nc-sidebar-width": isExpanded ? expandedWidth : collapsedWidth,
|
|
39
|
+
"--nc-sidebar-expanded": expandedWidth
|
|
40
|
+
},
|
|
12
41
|
...props,
|
|
13
42
|
children: [
|
|
14
|
-
title && /* @__PURE__ */
|
|
15
|
-
|
|
43
|
+
title && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 px-1", children: [
|
|
44
|
+
/* @__PURE__ */ jsx("div", { className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-xl bg-[rgb(var(--nc-accent-1)/0.18)] text-2xl font-semibold", children: typeof title === "string" ? title.slice(0, 1) : title }),
|
|
45
|
+
/* @__PURE__ */ jsx(
|
|
46
|
+
"span",
|
|
47
|
+
{
|
|
48
|
+
className: cn(
|
|
49
|
+
"truncate text-sm font-semibold transition-all duration-300 ease-in-out",
|
|
50
|
+
hoverExpand && !isExpanded ? "max-w-0 opacity-0 group-hover:max-w-40 group-hover:opacity-100" : "max-w-40 opacity-100"
|
|
51
|
+
),
|
|
52
|
+
children: title
|
|
53
|
+
}
|
|
54
|
+
)
|
|
55
|
+
] }),
|
|
56
|
+
hoverExpand && /* @__PURE__ */ jsxs(
|
|
57
|
+
"button",
|
|
58
|
+
{
|
|
59
|
+
onClick: toggleSidebar,
|
|
60
|
+
className: cn(
|
|
61
|
+
"flex items-center rounded-xl text-sm transition-all duration-300 ease-in-out",
|
|
62
|
+
!isExpanded ? "justify-center px-0.5 py-2 group-hover:justify-start group-hover:gap-3 group-hover:px-0.5" : "justify-start gap-3 px-0.5 py-2",
|
|
63
|
+
"hover:bg-[rgb(var(--nc-surface)/0.1)]",
|
|
64
|
+
isExpanded ? "text-[rgb(var(--nc-fg))] bg-[rgb(var(--nc-surface)/0.08)]" : "text-[rgb(var(--nc-fg-muted))]"
|
|
65
|
+
),
|
|
66
|
+
"aria-label": isExpanded ? "Collapse sidebar" : "Expand sidebar",
|
|
67
|
+
"aria-expanded": isExpanded,
|
|
68
|
+
children: [
|
|
69
|
+
/* @__PURE__ */ jsx("div", { className: "flex shrink-0 items-center justify-center transition-all duration-300 ease-in-out", children: /* @__PURE__ */ jsx(CraftIcon, { name: "bars", size: "4xl" }) }),
|
|
70
|
+
/* @__PURE__ */ jsx(
|
|
71
|
+
"span",
|
|
72
|
+
{
|
|
73
|
+
className: cn(
|
|
74
|
+
"truncate whitespace-nowrap transition-all duration-300 ease-in-out",
|
|
75
|
+
!isExpanded ? "max-w-0 opacity-0 group-hover:max-w-40 group-hover:opacity-100" : "max-w-40 opacity-100"
|
|
76
|
+
),
|
|
77
|
+
children: isExpanded ? "Collapse" : "Expand"
|
|
78
|
+
}
|
|
79
|
+
)
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
),
|
|
83
|
+
/* @__PURE__ */ jsx("nav", { className: "flex flex-col gap-2.5", children: items.map((item, index) => {
|
|
16
84
|
var _a;
|
|
17
85
|
return /* @__PURE__ */ jsxs(
|
|
18
|
-
|
|
86
|
+
Link,
|
|
19
87
|
{
|
|
20
88
|
href: (_a = item.href) != null ? _a : "#",
|
|
21
89
|
className: cn(
|
|
22
|
-
"flex items-center
|
|
23
|
-
|
|
90
|
+
"flex items-center rounded-xl text-sm transition-all duration-300 ease-in-out",
|
|
91
|
+
!isExpanded ? "justify-center px-2 py-2 group-hover:justify-start group-hover:gap-3 group-hover:px-3" : "justify-start gap-3 px-3 py-2",
|
|
92
|
+
item.active ? "bg-[rgb(var(--nc-accent-1)/0.18)] text-[rgb(var(--nc-fg))] shadow-[inset_0_0_0_1px_rgb(var(--nc-accent-1)/0.25)]" : "text-[rgb(var(--nc-fg-muted))] hover:bg-[rgb(var(--nc-surface)/0.1)] hover:text-[rgb(var(--nc-fg))]"
|
|
24
93
|
),
|
|
25
94
|
children: [
|
|
26
|
-
typeof item.icon === "string" ? /* @__PURE__ */ jsx(CraftIcon, { name: item.icon,
|
|
27
|
-
/* @__PURE__ */ jsx(
|
|
95
|
+
/* @__PURE__ */ jsx("div", { className: "flex shrink-0 items-center justify-center transition-all duration-300 ease-in-out", children: typeof item.icon === "string" ? /* @__PURE__ */ jsx(CraftIcon, { name: item.icon, size: "3xl" }) : item.icon }),
|
|
96
|
+
/* @__PURE__ */ jsx(
|
|
97
|
+
"span",
|
|
98
|
+
{
|
|
99
|
+
className: cn(
|
|
100
|
+
"truncate whitespace-nowrap transition-all duration-300 ease-in-out",
|
|
101
|
+
!isExpanded ? "max-w-0 opacity-0 group-hover:max-w-40 group-hover:opacity-100" : "max-w-40 opacity-100"
|
|
102
|
+
),
|
|
103
|
+
children: item.label
|
|
104
|
+
}
|
|
105
|
+
)
|
|
28
106
|
]
|
|
29
107
|
},
|
|
30
108
|
`${item.label}-${index}`
|
|
31
109
|
);
|
|
32
110
|
}) }),
|
|
33
|
-
footer && /* @__PURE__ */ jsx(
|
|
111
|
+
footer && /* @__PURE__ */ jsx(
|
|
112
|
+
"div",
|
|
113
|
+
{
|
|
114
|
+
className: cn(
|
|
115
|
+
"mt-auto px-2 pt-3 text-xs text-[rgb(var(--nc-fg-muted))] transition-all duration-300 ease-in-out",
|
|
116
|
+
!isExpanded ? "max-w-0 opacity-0 group-hover:max-w-40 group-hover:opacity-100" : "max-w-40 opacity-100"
|
|
117
|
+
),
|
|
118
|
+
children: footer
|
|
119
|
+
}
|
|
120
|
+
)
|
|
34
121
|
]
|
|
35
122
|
}
|
|
36
123
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/layout/sidebar.tsx"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../../src/components/layout/sidebar.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport Link from \"next/link\";\n\nimport { CraftIcon } from \"@/components/craft-icon\";\nimport { cn } from \"@/utils/cn\";\n\nexport type SidebarItem = {\n label: React.ReactNode;\n href?: string;\n icon?: React.ReactNode | string;\n active?: boolean;\n};\n\nexport type SidebarProps = React.HTMLAttributes<HTMLElement> & {\n title?: React.ReactNode;\n items: SidebarItem[];\n footer?: React.ReactNode;\n hoverExpand?: boolean;\n expanded?: boolean;\n onExpandedChange?: (expanded: boolean) => void;\n defaultExpanded?: boolean;\n collapsedWidth?: string;\n expandedWidth?: string;\n};\n\nexport function Sidebar({\n className,\n title,\n items,\n footer,\n hoverExpand = true,\n expanded,\n onExpandedChange,\n defaultExpanded = false,\n collapsedWidth = \"72px\",\n expandedWidth = \"224px\",\n ...props\n}: SidebarProps) {\n const [internalExpanded, setInternalExpanded] = React.useState(defaultExpanded);\n const isExpanded = expanded ?? internalExpanded;\n\n const toggleSidebar = () => {\n const next = !isExpanded;\n if (expanded === undefined) setInternalExpanded(next);\n onExpandedChange?.(next);\n };\n\n return (\n <aside\n className={cn(\n \"group flex h-full flex-col gap-4 rounded-2xl border border-[rgb(var(--nc-border)/0.2)] bg-[rgb(var(--nc-surface)/0.04)] p-3 text-[rgb(var(--nc-fg))] backdrop-blur-xl transition-all duration-300 ease-in-out\",\n \"w-(--nc-sidebar-width)\",\n hoverExpand && !isExpanded ? \"hover:w-(--nc-sidebar-expanded)\" : \"\",\n hoverExpand\n ? \"fixed left-0 top-0 z-50 shadow-[0_16px_40px_rgba(0,0,0,0.18)]\"\n : \"relative\",\n className\n )}\n style={\n {\n \"--nc-sidebar-width\": isExpanded ? expandedWidth : collapsedWidth,\n \"--nc-sidebar-expanded\": expandedWidth,\n } as React.CSSProperties\n }\n {...props}\n >\n {title && (\n <div className=\"flex items-center gap-3 px-1\">\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-xl bg-[rgb(var(--nc-accent-1)/0.18)] text-2xl font-semibold\">\n {typeof title === \"string\" ? title.slice(0, 1) : title}\n </div>\n <span\n className={cn(\n \"truncate text-sm font-semibold transition-all duration-300 ease-in-out\",\n hoverExpand && !isExpanded\n ? \"max-w-0 opacity-0 group-hover:max-w-40 group-hover:opacity-100\"\n : \"max-w-40 opacity-100\"\n )}\n >\n {title}\n </span>\n </div>\n )}\n\n {hoverExpand && (\n <button\n onClick={toggleSidebar}\n className={cn(\n \"flex items-center rounded-xl text-sm transition-all duration-300 ease-in-out\",\n !isExpanded\n ? \"justify-center px-0.5 py-2 group-hover:justify-start group-hover:gap-3 group-hover:px-0.5\"\n : \"justify-start gap-3 px-0.5 py-2\",\n \"hover:bg-[rgb(var(--nc-surface)/0.1)]\",\n isExpanded\n ? \"text-[rgb(var(--nc-fg))] bg-[rgb(var(--nc-surface)/0.08)]\"\n : \"text-[rgb(var(--nc-fg-muted))]\"\n )}\n aria-label={isExpanded ? \"Collapse sidebar\" : \"Expand sidebar\"}\n aria-expanded={isExpanded}\n >\n <div className=\"flex shrink-0 items-center justify-center transition-all duration-300 ease-in-out\">\n <CraftIcon name=\"bars\" size=\"4xl\" />\n </div>\n <span\n className={cn(\n \"truncate whitespace-nowrap transition-all duration-300 ease-in-out\",\n !isExpanded\n ? \"max-w-0 opacity-0 group-hover:max-w-40 group-hover:opacity-100\"\n : \"max-w-40 opacity-100\"\n )}\n >\n {isExpanded ? \"Collapse\" : \"Expand\"}\n </span>\n </button>\n )}\n\n <nav className=\"flex flex-col gap-2.5\">\n {items.map((item, index) => (\n <Link\n key={`${item.label}-${index}`}\n href={item.href ?? \"#\"}\n className={cn(\n \"flex items-center rounded-xl text-sm transition-all duration-300 ease-in-out\",\n !isExpanded\n ? \"justify-center px-2 py-2 group-hover:justify-start group-hover:gap-3 group-hover:px-3\"\n : \"justify-start gap-3 px-3 py-2\",\n item.active\n ? \"bg-[rgb(var(--nc-accent-1)/0.18)] text-[rgb(var(--nc-fg))] shadow-[inset_0_0_0_1px_rgb(var(--nc-accent-1)/0.25)]\"\n : \"text-[rgb(var(--nc-fg-muted))] hover:bg-[rgb(var(--nc-surface)/0.1)] hover:text-[rgb(var(--nc-fg))]\"\n )}\n >\n <div className=\"flex shrink-0 items-center justify-center transition-all duration-300 ease-in-out\">\n {typeof item.icon === \"string\" ? (\n <CraftIcon name={item.icon} size=\"3xl\" />\n ) : (\n item.icon\n )}\n </div>\n <span\n className={cn(\n \"truncate whitespace-nowrap transition-all duration-300 ease-in-out\",\n !isExpanded\n ? \"max-w-0 opacity-0 group-hover:max-w-40 group-hover:opacity-100\"\n : \"max-w-40 opacity-100\"\n )}\n >\n {item.label}\n </span>\n </Link>\n ))}\n </nav>\n\n {footer && (\n <div\n className={cn(\n \"mt-auto px-2 pt-3 text-xs text-[rgb(var(--nc-fg-muted))] transition-all duration-300 ease-in-out\",\n !isExpanded\n ? \"max-w-0 opacity-0 group-hover:max-w-40 group-hover:opacity-100\"\n : \"max-w-40 opacity-100\"\n )}\n >\n {footer}\n </div>\n )}\n </aside>\n );\n}"],"mappings":";AAqEQ,SACE,KADF;AAnER,YAAY,WAAW;AACvB,OAAO,UAAU;AAEjB,SAAS,iBAAiB;AAC1B,SAAS,UAAU;AAqBZ,SAAS,QAAQ;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,GAAG;AACL,GAAiB;AACf,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,MAAM,SAAS,eAAe;AAC9E,QAAM,aAAa,8BAAY;AAE/B,QAAM,gBAAgB,MAAM;AAC1B,UAAM,OAAO,CAAC;AACd,QAAI,aAAa,OAAW,qBAAoB,IAAI;AACpD,yDAAmB;AAAA,EACrB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA,eAAe,CAAC,aAAa,oCAAoC;AAAA,QACjE,cACI,kEACA;AAAA,QACJ;AAAA,MACF;AAAA,MACA,OACE;AAAA,QACE,sBAAsB,aAAa,gBAAgB;AAAA,QACnD,yBAAyB;AAAA,MAC3B;AAAA,MAED,GAAG;AAAA,MAEH;AAAA,iBACC,qBAAC,SAAI,WAAU,gCACb;AAAA,8BAAC,SAAI,WAAU,yHACZ,iBAAO,UAAU,WAAW,MAAM,MAAM,GAAG,CAAC,IAAI,OACnD;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA,eAAe,CAAC,aACZ,mEACA;AAAA,cACN;AAAA,cAEC;AAAA;AAAA,UACH;AAAA,WACF;AAAA,QAGD,eACC;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,WAAW;AAAA,cACT;AAAA,cACA,CAAC,aACG,8FACA;AAAA,cACJ;AAAA,cACA,aACI,8DACA;AAAA,YACN;AAAA,YACA,cAAY,aAAa,qBAAqB;AAAA,YAC9C,iBAAe;AAAA,YAEf;AAAA,kCAAC,SAAI,WAAU,qFACb,8BAAC,aAAU,MAAK,QAAO,MAAK,OAAM,GACpC;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW;AAAA,oBACT;AAAA,oBACA,CAAC,aACG,mEACA;AAAA,kBACN;AAAA,kBAEC,uBAAa,aAAa;AAAA;AAAA,cAC7B;AAAA;AAAA;AAAA,QACF;AAAA,QAGF,oBAAC,SAAI,WAAU,yBACZ,gBAAM,IAAI,CAAC,MAAM,UAAO;AAvHjC;AAwHU;AAAA,YAAC;AAAA;AAAA,cAEC,OAAM,UAAK,SAAL,YAAa;AAAA,cACnB,WAAW;AAAA,gBACT;AAAA,gBACA,CAAC,aACG,0FACA;AAAA,gBACJ,KAAK,SACD,qHACA;AAAA,cACN;AAAA,cAEA;AAAA,oCAAC,SAAI,WAAU,qFACZ,iBAAO,KAAK,SAAS,WACpB,oBAAC,aAAU,MAAM,KAAK,MAAM,MAAK,OAAM,IAEvC,KAAK,MAET;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAW;AAAA,sBACT;AAAA,sBACA,CAAC,aACG,mEACA;AAAA,oBACN;AAAA,oBAEC,eAAK;AAAA;AAAA,gBACR;AAAA;AAAA;AAAA,YA5BK,GAAG,KAAK,KAAK,IAAI,KAAK;AAAA,UA6B7B;AAAA,SACD,GACH;AAAA,QAEC,UACC;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,CAAC,aACG,mEACA;AAAA,YACN;AAAA,YAEC;AAAA;AAAA,QACH;AAAA;AAAA;AAAA,EAEJ;AAEJ;","names":[]}
|
|
@@ -23,21 +23,33 @@ __export(top_nav_exports, {
|
|
|
23
23
|
module.exports = __toCommonJS(top_nav_exports);
|
|
24
24
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
25
25
|
var import_cn = require("../../utils/cn");
|
|
26
|
-
function TopNav({
|
|
26
|
+
function TopNav({
|
|
27
|
+
className,
|
|
28
|
+
title,
|
|
29
|
+
actions,
|
|
30
|
+
breadcrumb,
|
|
31
|
+
leading,
|
|
32
|
+
search,
|
|
33
|
+
...props
|
|
34
|
+
}) {
|
|
27
35
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
28
36
|
"header",
|
|
29
37
|
{
|
|
30
38
|
className: (0, import_cn.cn)(
|
|
31
|
-
"flex flex-wrap items-center
|
|
39
|
+
"flex flex-wrap items-center gap-3 rounded-2xl border border-[rgb(var(--nc-border)/0.2)] bg-[rgb(var(--nc-surface)/0.04)] px-4 py-3 text-[rgb(var(--nc-fg))] backdrop-blur-xl",
|
|
32
40
|
className
|
|
33
41
|
),
|
|
34
42
|
...props,
|
|
35
43
|
children: [
|
|
36
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "
|
|
37
|
-
|
|
38
|
-
|
|
44
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex min-w-0 flex-1 items-center gap-3", children: [
|
|
45
|
+
leading && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex items-center gap-2", children: leading }),
|
|
46
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "min-w-0 space-y-1", children: [
|
|
47
|
+
breadcrumb,
|
|
48
|
+
title && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "truncate text-lg font-semibold", children: title })
|
|
49
|
+
] })
|
|
39
50
|
] }),
|
|
40
|
-
|
|
51
|
+
search && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "order-last w-full min-w-[220px] flex-1 sm:order-none sm:w-auto sm:max-w-[480px]", children: search }),
|
|
52
|
+
actions && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex flex-wrap items-center gap-2", children: actions })
|
|
41
53
|
]
|
|
42
54
|
}
|
|
43
55
|
);
|