@augmenting-integrations/ui 0.2.2 → 2.0.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/dist/components/chrome/Logo.cjs +52 -0
- package/dist/components/chrome/Logo.cjs.map +1 -0
- package/dist/components/chrome/Logo.js +28 -0
- package/dist/components/chrome/Logo.js.map +1 -0
- package/dist/components/chrome/RoleSwitcher.cjs +98 -0
- package/dist/components/chrome/RoleSwitcher.cjs.map +1 -0
- package/dist/components/chrome/RoleSwitcher.js +64 -0
- package/dist/components/chrome/RoleSwitcher.js.map +1 -0
- package/dist/components/chrome/ThemeSwitcher.cjs +129 -0
- package/dist/components/chrome/ThemeSwitcher.cjs.map +1 -0
- package/dist/components/chrome/ThemeSwitcher.js +100 -0
- package/dist/components/chrome/ThemeSwitcher.js.map +1 -0
- package/dist/components/shells/AppShell.cjs +128 -0
- package/dist/components/shells/AppShell.cjs.map +1 -0
- package/dist/components/shells/AppShell.d.ts +1 -7
- package/dist/components/shells/AppShell.d.ts.map +1 -1
- package/dist/components/shells/AppShell.js +94 -0
- package/dist/components/shells/AppShell.js.map +1 -0
- package/dist/components/shells/PublicShell.cjs +87 -0
- package/dist/components/shells/PublicShell.cjs.map +1 -0
- package/dist/components/shells/PublicShell.d.ts +1 -11
- package/dist/components/shells/PublicShell.d.ts.map +1 -1
- package/dist/components/shells/PublicShell.js +53 -0
- package/dist/components/shells/PublicShell.js.map +1 -0
- package/dist/components/shells/StudioShell.cjs +49 -0
- package/dist/components/shells/StudioShell.cjs.map +1 -0
- package/dist/components/shells/StudioShell.js +25 -0
- package/dist/components/shells/StudioShell.js.map +1 -0
- package/dist/components/ui/avatar.cjs +131 -0
- package/dist/components/ui/avatar.cjs.map +1 -0
- package/dist/components/ui/avatar.js +102 -0
- package/dist/components/ui/avatar.js.map +1 -0
- package/dist/components/ui/badge.cjs +69 -0
- package/dist/components/ui/badge.cjs.map +1 -0
- package/dist/components/ui/badge.js +44 -0
- package/dist/components/ui/badge.js.map +1 -0
- package/dist/components/ui/button.cjs +82 -0
- package/dist/components/ui/button.cjs.map +1 -0
- package/dist/components/ui/button.js +57 -0
- package/dist/components/ui/button.js.map +1 -0
- package/dist/components/ui/card.cjs +114 -0
- package/dist/components/ui/card.cjs.map +1 -0
- package/dist/components/ui/card.js +84 -0
- package/dist/components/ui/card.js.map +1 -0
- package/dist/components/ui/checkbox.cjs +57 -0
- package/dist/components/ui/checkbox.cjs.map +1 -0
- package/dist/components/ui/checkbox.js +33 -0
- package/dist/components/ui/checkbox.js.map +1 -0
- package/dist/components/ui/dialog.cjs +172 -0
- package/dist/components/ui/dialog.cjs.map +1 -0
- package/dist/components/ui/dialog.js +139 -0
- package/dist/components/ui/dialog.js.map +1 -0
- package/dist/components/ui/dropdown-menu.cjs +250 -0
- package/dist/components/ui/dropdown-menu.cjs.map +1 -0
- package/dist/components/ui/dropdown-menu.js +212 -0
- package/dist/components/ui/dropdown-menu.js.map +1 -0
- package/dist/components/ui/input.cjs +46 -0
- package/dist/components/ui/input.cjs.map +1 -0
- package/dist/components/ui/input.js +22 -0
- package/dist/components/ui/input.js.map +1 -0
- package/dist/components/ui/label.cjs +48 -0
- package/dist/components/ui/label.cjs.map +1 -0
- package/dist/components/ui/label.js +24 -0
- package/dist/components/ui/label.js.map +1 -0
- package/dist/components/ui/select.cjs +201 -0
- package/dist/components/ui/select.cjs.map +1 -0
- package/dist/components/ui/select.js +168 -0
- package/dist/components/ui/select.js.map +1 -0
- package/dist/components/ui/separator.cjs +52 -0
- package/dist/components/ui/separator.cjs.map +1 -0
- package/dist/components/ui/separator.js +28 -0
- package/dist/components/ui/separator.js.map +1 -0
- package/dist/components/ui/sheet.cjs +154 -0
- package/dist/components/ui/sheet.cjs.map +1 -0
- package/dist/components/ui/sheet.js +123 -0
- package/dist/components/ui/sheet.js.map +1 -0
- package/dist/components/ui/table.cjs +134 -0
- package/dist/components/ui/table.cjs.map +1 -0
- package/dist/components/ui/table.js +103 -0
- package/dist/components/ui/table.js.map +1 -0
- package/dist/components/ui/tabs.cjs +121 -0
- package/dist/components/ui/tabs.cjs.map +1 -0
- package/dist/components/ui/tabs.js +93 -0
- package/dist/components/ui/tabs.js.map +1 -0
- package/dist/components/ui/textarea.cjs +43 -0
- package/dist/components/ui/textarea.cjs.map +1 -0
- package/dist/components/ui/textarea.js +19 -0
- package/dist/components/ui/textarea.js.map +1 -0
- package/dist/index.cjs +55 -1651
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +26 -1547
- package/dist/index.js.map +1 -1
- package/dist/lib/utils.cjs +33 -0
- package/dist/lib/utils.cjs.map +1 -0
- package/dist/lib/utils.js +9 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/providers/MockProvider.cjs +83 -0
- package/dist/providers/MockProvider.cjs.map +1 -0
- package/dist/providers/MockProvider.js +49 -0
- package/dist/providers/MockProvider.js.map +1 -0
- package/dist/providers/QueryProvider.cjs +52 -0
- package/dist/providers/QueryProvider.cjs.map +1 -0
- package/dist/providers/QueryProvider.js +18 -0
- package/dist/providers/QueryProvider.js.map +1 -0
- package/dist/providers/SessionProvider.cjs +37 -0
- package/dist/providers/SessionProvider.cjs.map +1 -0
- package/dist/providers/SessionProvider.js +13 -0
- package/dist/providers/SessionProvider.js.map +1 -0
- package/dist/providers/ThemeProvider.cjs +92 -0
- package/dist/providers/ThemeProvider.cjs.map +1 -0
- package/dist/providers/ThemeProvider.js +57 -0
- package/dist/providers/ThemeProvider.js.map +1 -0
- package/package.json +7 -5
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
var __create = Object.create;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
8
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
+
var __export = (target, all) => {
|
|
10
|
+
for (var name in all)
|
|
11
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
12
|
+
};
|
|
13
|
+
var __copyProps = (to, from, except, desc) => {
|
|
14
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
15
|
+
for (let key of __getOwnPropNames(from))
|
|
16
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
17
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
18
|
+
}
|
|
19
|
+
return to;
|
|
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
|
+
));
|
|
29
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
30
|
+
var AppShell_exports = {};
|
|
31
|
+
__export(AppShell_exports, {
|
|
32
|
+
AppShell: () => AppShell
|
|
33
|
+
});
|
|
34
|
+
module.exports = __toCommonJS(AppShell_exports);
|
|
35
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
36
|
+
var React = __toESM(require("react"));
|
|
37
|
+
var import_link = __toESM(require("next/link"));
|
|
38
|
+
var import_lucide_react = require("lucide-react");
|
|
39
|
+
var import_Logo = require("../chrome/Logo.js");
|
|
40
|
+
var import_ThemeSwitcher = require("../chrome/ThemeSwitcher.js");
|
|
41
|
+
var import_RoleSwitcher = require("../chrome/RoleSwitcher.js");
|
|
42
|
+
var import_utils = require("../../lib/utils.js");
|
|
43
|
+
function NavGroup({ group, pathname }) {
|
|
44
|
+
if (group.items.length === 0) return null;
|
|
45
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-1", children: [
|
|
46
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "px-3 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: group.label }),
|
|
47
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("ul", { className: "space-y-0.5", children: group.items.map((item) => {
|
|
48
|
+
const active = pathname === item.href || pathname.startsWith(`${item.href}/`);
|
|
49
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
50
|
+
import_link.default,
|
|
51
|
+
{
|
|
52
|
+
href: item.href,
|
|
53
|
+
className: (0, import_utils.cn)(
|
|
54
|
+
"flex items-center gap-3 rounded-md px-3 py-2 text-sm transition",
|
|
55
|
+
active ? "bg-sidebar-accent text-sidebar-accent-foreground" : "text-sidebar-foreground hover:bg-sidebar-accent/60"
|
|
56
|
+
),
|
|
57
|
+
children: [
|
|
58
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(item.icon, { className: "h-4 w-4 shrink-0" }),
|
|
59
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: item.label })
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
) }, item.href);
|
|
63
|
+
}) })
|
|
64
|
+
] });
|
|
65
|
+
}
|
|
66
|
+
function AppShell({
|
|
67
|
+
children,
|
|
68
|
+
pathname,
|
|
69
|
+
navGroups,
|
|
70
|
+
homeHref = "/",
|
|
71
|
+
showRoleSwitcher = true
|
|
72
|
+
}) {
|
|
73
|
+
const [mobileOpen, setMobileOpen] = React.useState(false);
|
|
74
|
+
const sidebarContent = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex h-full flex-col gap-6 px-3 py-4", children: [
|
|
75
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: homeHref, className: "px-2", "aria-label": "Home", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_Logo.Logo, {}) }),
|
|
76
|
+
navGroups.map((g) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(NavGroup, { group: g, pathname }, g.label))
|
|
77
|
+
] });
|
|
78
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex min-h-svh bg-background text-foreground", children: [
|
|
79
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("aside", { className: "hidden w-64 shrink-0 border-r border-sidebar-border bg-sidebar text-sidebar-foreground md:block", children: sidebarContent }),
|
|
80
|
+
mobileOpen ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "fixed inset-0 z-50 flex md:hidden", children: [
|
|
81
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
82
|
+
"div",
|
|
83
|
+
{
|
|
84
|
+
className: "flex-1 bg-foreground/40 backdrop-blur-sm",
|
|
85
|
+
onClick: () => setMobileOpen(false),
|
|
86
|
+
"aria-hidden": true
|
|
87
|
+
}
|
|
88
|
+
),
|
|
89
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("aside", { className: "relative w-72 border-l border-sidebar-border bg-sidebar text-sidebar-foreground", children: [
|
|
90
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
91
|
+
"button",
|
|
92
|
+
{
|
|
93
|
+
type: "button",
|
|
94
|
+
onClick: () => setMobileOpen(false),
|
|
95
|
+
"aria-label": "Close menu",
|
|
96
|
+
className: "absolute right-2 top-2 inline-flex h-9 w-9 items-center justify-center rounded-md hover:bg-sidebar-accent",
|
|
97
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.X, { className: "h-4 w-4" })
|
|
98
|
+
}
|
|
99
|
+
),
|
|
100
|
+
sidebarContent
|
|
101
|
+
] })
|
|
102
|
+
] }) : null,
|
|
103
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex min-w-0 flex-1 flex-col", children: [
|
|
104
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("header", { className: "flex h-14 items-center justify-between gap-3 border-b border-border bg-background/80 px-4 backdrop-blur md:px-6", children: [
|
|
105
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
106
|
+
"button",
|
|
107
|
+
{
|
|
108
|
+
type: "button",
|
|
109
|
+
onClick: () => setMobileOpen(true),
|
|
110
|
+
"aria-label": "Open menu",
|
|
111
|
+
className: "inline-flex h-9 w-9 items-center justify-center rounded-md border border-border md:hidden",
|
|
112
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Menu, { className: "h-4 w-4" })
|
|
113
|
+
}
|
|
114
|
+
),
|
|
115
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-3 md:ml-auto", children: [
|
|
116
|
+
showRoleSwitcher ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_RoleSwitcher.RoleSwitcher, {}) : null,
|
|
117
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ThemeSwitcher.ThemeSwitcher, {})
|
|
118
|
+
] })
|
|
119
|
+
] }),
|
|
120
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("main", { className: "min-w-0 flex-1 px-4 py-6 md:px-8 md:py-8", children })
|
|
121
|
+
] })
|
|
122
|
+
] });
|
|
123
|
+
}
|
|
124
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
125
|
+
0 && (module.exports = {
|
|
126
|
+
AppShell
|
|
127
|
+
});
|
|
128
|
+
//# sourceMappingURL=AppShell.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/shells/AppShell.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport Link from \"next/link\";\nimport { Menu, X } from \"lucide-react\";\nimport { Logo } from \"../chrome/Logo.js\";\nimport { ThemeSwitcher } from \"../chrome/ThemeSwitcher.js\";\nimport { RoleSwitcher } from \"../chrome/RoleSwitcher.js\";\nimport { cn } from \"../../lib/utils.js\";\n\nexport type AppNavItem = {\n href: string;\n label: string;\n icon: React.ComponentType<{ className?: string }>;\n /** When provided, item only renders if the consumer's `getFlag(flag)` returns true. */\n flag?: string;\n};\n\nexport type AppNavGroup = { label: string; items: AppNavItem[] };\n\nfunction NavGroup({ group, pathname }: { group: AppNavGroup; pathname: string }) {\n if (group.items.length === 0) return null;\n return (\n <div className=\"space-y-1\">\n <p className=\"px-3 text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {group.label}\n </p>\n <ul className=\"space-y-0.5\">\n {group.items.map((item) => {\n const active = pathname === item.href || pathname.startsWith(`${item.href}/`);\n return (\n <li key={item.href}>\n <Link\n href={item.href}\n className={cn(\n \"flex items-center gap-3 rounded-md px-3 py-2 text-sm transition\",\n active\n ? \"bg-sidebar-accent text-sidebar-accent-foreground\"\n : \"text-sidebar-foreground hover:bg-sidebar-accent/60\",\n )}\n >\n <item.icon className=\"h-4 w-4 shrink-0\" />\n <span>{item.label}</span>\n </Link>\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n\nexport function AppShell({\n children,\n pathname,\n navGroups,\n homeHref = \"/\",\n showRoleSwitcher = true,\n}: {\n children: React.ReactNode;\n pathname: string;\n navGroups: AppNavGroup[];\n homeHref?: string;\n showRoleSwitcher?: boolean;\n}) {\n const [mobileOpen, setMobileOpen] = React.useState(false);\n\n const sidebarContent = (\n <div className=\"flex h-full flex-col gap-6 px-3 py-4\">\n <Link href={homeHref} className=\"px-2\" aria-label=\"Home\">\n <Logo />\n </Link>\n {navGroups.map((g) => (\n <NavGroup key={g.label} group={g} pathname={pathname} />\n ))}\n </div>\n );\n\n return (\n <div className=\"flex min-h-svh bg-background text-foreground\">\n <aside className=\"hidden w-64 shrink-0 border-r border-sidebar-border bg-sidebar text-sidebar-foreground md:block\">\n {sidebarContent}\n </aside>\n\n {mobileOpen ? (\n <div className=\"fixed inset-0 z-50 flex md:hidden\">\n <div\n className=\"flex-1 bg-foreground/40 backdrop-blur-sm\"\n onClick={() => setMobileOpen(false)}\n aria-hidden\n />\n <aside className=\"relative w-72 border-l border-sidebar-border bg-sidebar text-sidebar-foreground\">\n <button\n type=\"button\"\n onClick={() => setMobileOpen(false)}\n aria-label=\"Close menu\"\n className=\"absolute right-2 top-2 inline-flex h-9 w-9 items-center justify-center rounded-md hover:bg-sidebar-accent\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n {sidebarContent}\n </aside>\n </div>\n ) : null}\n\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <header className=\"flex h-14 items-center justify-between gap-3 border-b border-border bg-background/80 px-4 backdrop-blur md:px-6\">\n <button\n type=\"button\"\n onClick={() => setMobileOpen(true)}\n aria-label=\"Open menu\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded-md border border-border md:hidden\"\n >\n <Menu className=\"h-4 w-4\" />\n </button>\n <div className=\"flex items-center gap-3 md:ml-auto\">\n {showRoleSwitcher ? <RoleSwitcher /> : null}\n <ThemeSwitcher />\n </div>\n </header>\n <main className=\"min-w-0 flex-1 px-4 py-6 md:px-8 md:py-8\">{children}</main>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBM;AAtBN,YAAuB;AACvB,kBAAiB;AACjB,0BAAwB;AACxB,kBAAqB;AACrB,2BAA8B;AAC9B,0BAA6B;AAC7B,mBAAmB;AAYnB,SAAS,SAAS,EAAE,OAAO,SAAS,GAA6C;AAC/E,MAAI,MAAM,MAAM,WAAW,EAAG,QAAO;AACrC,SACE,6CAAC,SAAI,WAAU,aACb;AAAA,gDAAC,OAAE,WAAU,4EACV,gBAAM,OACT;AAAA,IACA,4CAAC,QAAG,WAAU,eACX,gBAAM,MAAM,IAAI,CAAC,SAAS;AACzB,YAAM,SAAS,aAAa,KAAK,QAAQ,SAAS,WAAW,GAAG,KAAK,IAAI,GAAG;AAC5E,aACE,4CAAC,QACC;AAAA,QAAC,YAAAA;AAAA,QAAA;AAAA,UACC,MAAM,KAAK;AAAA,UACX,eAAW;AAAA,YACT;AAAA,YACA,SACI,qDACA;AAAA,UACN;AAAA,UAEA;AAAA,wDAAC,KAAK,MAAL,EAAU,WAAU,oBAAmB;AAAA,YACxC,4CAAC,UAAM,eAAK,OAAM;AAAA;AAAA;AAAA,MACpB,KAZO,KAAK,IAad;AAAA,IAEJ,CAAC,GACH;AAAA,KACF;AAEJ;AAEO,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,mBAAmB;AACrB,GAMG;AACD,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,SAAS,KAAK;AAExD,QAAM,iBACJ,6CAAC,SAAI,WAAU,wCACb;AAAA,gDAAC,YAAAA,SAAA,EAAK,MAAM,UAAU,WAAU,QAAO,cAAW,QAChD,sDAAC,oBAAK,GACR;AAAA,IACC,UAAU,IAAI,CAAC,MACd,4CAAC,YAAuB,OAAO,GAAG,YAAnB,EAAE,KAAqC,CACvD;AAAA,KACH;AAGF,SACE,6CAAC,SAAI,WAAU,gDACb;AAAA,gDAAC,WAAM,WAAU,mGACd,0BACH;AAAA,IAEC,aACC,6CAAC,SAAI,WAAU,qCACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,SAAS,MAAM,cAAc,KAAK;AAAA,UAClC,eAAW;AAAA;AAAA,MACb;AAAA,MACA,6CAAC,WAAM,WAAU,mFACf;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAM,cAAc,KAAK;AAAA,YAClC,cAAW;AAAA,YACX,WAAU;AAAA,YAEV,sDAAC,yBAAE,WAAU,WAAU;AAAA;AAAA,QACzB;AAAA,QACC;AAAA,SACH;AAAA,OACF,IACE;AAAA,IAEJ,6CAAC,SAAI,WAAU,gCACb;AAAA,mDAAC,YAAO,WAAU,mHAChB;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAM,cAAc,IAAI;AAAA,YACjC,cAAW;AAAA,YACX,WAAU;AAAA,YAEV,sDAAC,4BAAK,WAAU,WAAU;AAAA;AAAA,QAC5B;AAAA,QACA,6CAAC,SAAI,WAAU,sCACZ;AAAA,6BAAmB,4CAAC,oCAAa,IAAK;AAAA,UACvC,4CAAC,sCAAc;AAAA,WACjB;AAAA,SACF;AAAA,MACA,4CAAC,UAAK,WAAU,4CAA4C,UAAS;AAAA,OACvE;AAAA,KACF;AAEJ;","names":["Link"]}
|
|
@@ -12,16 +12,10 @@ export type AppNavGroup = {
|
|
|
12
12
|
label: string;
|
|
13
13
|
items: AppNavItem[];
|
|
14
14
|
};
|
|
15
|
-
export declare function AppShell({ children, pathname, navGroups,
|
|
15
|
+
export declare function AppShell({ children, pathname, navGroups, homeHref, showRoleSwitcher, }: {
|
|
16
16
|
children: React.ReactNode;
|
|
17
17
|
pathname: string;
|
|
18
18
|
navGroups: AppNavGroup[];
|
|
19
|
-
Link: React.ComponentType<{
|
|
20
|
-
href: string;
|
|
21
|
-
children?: React.ReactNode;
|
|
22
|
-
className?: string;
|
|
23
|
-
"aria-label"?: string;
|
|
24
|
-
}>;
|
|
25
19
|
homeHref?: string;
|
|
26
20
|
showRoleSwitcher?: boolean;
|
|
27
21
|
}): React.JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppShell.d.ts","sourceRoot":"","sources":["../../../src/components/shells/AppShell.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"AppShell.d.ts","sourceRoot":"","sources":["../../../src/components/shells/AppShell.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAQ/B,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,uFAAuF;IACvF,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,CAAA;CAAE,CAAC;AAkCjE,wBAAgB,QAAQ,CAAC,EACvB,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,QAAc,EACd,gBAAuB,GACxB,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,qBA4DA"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import Link from "next/link";
|
|
5
|
+
import { Menu, X } from "lucide-react";
|
|
6
|
+
import { Logo } from "../chrome/Logo.js";
|
|
7
|
+
import { ThemeSwitcher } from "../chrome/ThemeSwitcher.js";
|
|
8
|
+
import { RoleSwitcher } from "../chrome/RoleSwitcher.js";
|
|
9
|
+
import { cn } from "../../lib/utils.js";
|
|
10
|
+
function NavGroup({ group, pathname }) {
|
|
11
|
+
if (group.items.length === 0) return null;
|
|
12
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
|
|
13
|
+
/* @__PURE__ */ jsx("p", { className: "px-3 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: group.label }),
|
|
14
|
+
/* @__PURE__ */ jsx("ul", { className: "space-y-0.5", children: group.items.map((item) => {
|
|
15
|
+
const active = pathname === item.href || pathname.startsWith(`${item.href}/`);
|
|
16
|
+
return /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs(
|
|
17
|
+
Link,
|
|
18
|
+
{
|
|
19
|
+
href: item.href,
|
|
20
|
+
className: cn(
|
|
21
|
+
"flex items-center gap-3 rounded-md px-3 py-2 text-sm transition",
|
|
22
|
+
active ? "bg-sidebar-accent text-sidebar-accent-foreground" : "text-sidebar-foreground hover:bg-sidebar-accent/60"
|
|
23
|
+
),
|
|
24
|
+
children: [
|
|
25
|
+
/* @__PURE__ */ jsx(item.icon, { className: "h-4 w-4 shrink-0" }),
|
|
26
|
+
/* @__PURE__ */ jsx("span", { children: item.label })
|
|
27
|
+
]
|
|
28
|
+
}
|
|
29
|
+
) }, item.href);
|
|
30
|
+
}) })
|
|
31
|
+
] });
|
|
32
|
+
}
|
|
33
|
+
function AppShell({
|
|
34
|
+
children,
|
|
35
|
+
pathname,
|
|
36
|
+
navGroups,
|
|
37
|
+
homeHref = "/",
|
|
38
|
+
showRoleSwitcher = true
|
|
39
|
+
}) {
|
|
40
|
+
const [mobileOpen, setMobileOpen] = React.useState(false);
|
|
41
|
+
const sidebarContent = /* @__PURE__ */ jsxs("div", { className: "flex h-full flex-col gap-6 px-3 py-4", children: [
|
|
42
|
+
/* @__PURE__ */ jsx(Link, { href: homeHref, className: "px-2", "aria-label": "Home", children: /* @__PURE__ */ jsx(Logo, {}) }),
|
|
43
|
+
navGroups.map((g) => /* @__PURE__ */ jsx(NavGroup, { group: g, pathname }, g.label))
|
|
44
|
+
] });
|
|
45
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex min-h-svh bg-background text-foreground", children: [
|
|
46
|
+
/* @__PURE__ */ jsx("aside", { className: "hidden w-64 shrink-0 border-r border-sidebar-border bg-sidebar text-sidebar-foreground md:block", children: sidebarContent }),
|
|
47
|
+
mobileOpen ? /* @__PURE__ */ jsxs("div", { className: "fixed inset-0 z-50 flex md:hidden", children: [
|
|
48
|
+
/* @__PURE__ */ jsx(
|
|
49
|
+
"div",
|
|
50
|
+
{
|
|
51
|
+
className: "flex-1 bg-foreground/40 backdrop-blur-sm",
|
|
52
|
+
onClick: () => setMobileOpen(false),
|
|
53
|
+
"aria-hidden": true
|
|
54
|
+
}
|
|
55
|
+
),
|
|
56
|
+
/* @__PURE__ */ jsxs("aside", { className: "relative w-72 border-l border-sidebar-border bg-sidebar text-sidebar-foreground", children: [
|
|
57
|
+
/* @__PURE__ */ jsx(
|
|
58
|
+
"button",
|
|
59
|
+
{
|
|
60
|
+
type: "button",
|
|
61
|
+
onClick: () => setMobileOpen(false),
|
|
62
|
+
"aria-label": "Close menu",
|
|
63
|
+
className: "absolute right-2 top-2 inline-flex h-9 w-9 items-center justify-center rounded-md hover:bg-sidebar-accent",
|
|
64
|
+
children: /* @__PURE__ */ jsx(X, { className: "h-4 w-4" })
|
|
65
|
+
}
|
|
66
|
+
),
|
|
67
|
+
sidebarContent
|
|
68
|
+
] })
|
|
69
|
+
] }) : null,
|
|
70
|
+
/* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 flex-col", children: [
|
|
71
|
+
/* @__PURE__ */ jsxs("header", { className: "flex h-14 items-center justify-between gap-3 border-b border-border bg-background/80 px-4 backdrop-blur md:px-6", children: [
|
|
72
|
+
/* @__PURE__ */ jsx(
|
|
73
|
+
"button",
|
|
74
|
+
{
|
|
75
|
+
type: "button",
|
|
76
|
+
onClick: () => setMobileOpen(true),
|
|
77
|
+
"aria-label": "Open menu",
|
|
78
|
+
className: "inline-flex h-9 w-9 items-center justify-center rounded-md border border-border md:hidden",
|
|
79
|
+
children: /* @__PURE__ */ jsx(Menu, { className: "h-4 w-4" })
|
|
80
|
+
}
|
|
81
|
+
),
|
|
82
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 md:ml-auto", children: [
|
|
83
|
+
showRoleSwitcher ? /* @__PURE__ */ jsx(RoleSwitcher, {}) : null,
|
|
84
|
+
/* @__PURE__ */ jsx(ThemeSwitcher, {})
|
|
85
|
+
] })
|
|
86
|
+
] }),
|
|
87
|
+
/* @__PURE__ */ jsx("main", { className: "min-w-0 flex-1 px-4 py-6 md:px-8 md:py-8", children })
|
|
88
|
+
] })
|
|
89
|
+
] });
|
|
90
|
+
}
|
|
91
|
+
export {
|
|
92
|
+
AppShell
|
|
93
|
+
};
|
|
94
|
+
//# sourceMappingURL=AppShell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/shells/AppShell.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport Link from \"next/link\";\nimport { Menu, X } from \"lucide-react\";\nimport { Logo } from \"../chrome/Logo.js\";\nimport { ThemeSwitcher } from \"../chrome/ThemeSwitcher.js\";\nimport { RoleSwitcher } from \"../chrome/RoleSwitcher.js\";\nimport { cn } from \"../../lib/utils.js\";\n\nexport type AppNavItem = {\n href: string;\n label: string;\n icon: React.ComponentType<{ className?: string }>;\n /** When provided, item only renders if the consumer's `getFlag(flag)` returns true. */\n flag?: string;\n};\n\nexport type AppNavGroup = { label: string; items: AppNavItem[] };\n\nfunction NavGroup({ group, pathname }: { group: AppNavGroup; pathname: string }) {\n if (group.items.length === 0) return null;\n return (\n <div className=\"space-y-1\">\n <p className=\"px-3 text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {group.label}\n </p>\n <ul className=\"space-y-0.5\">\n {group.items.map((item) => {\n const active = pathname === item.href || pathname.startsWith(`${item.href}/`);\n return (\n <li key={item.href}>\n <Link\n href={item.href}\n className={cn(\n \"flex items-center gap-3 rounded-md px-3 py-2 text-sm transition\",\n active\n ? \"bg-sidebar-accent text-sidebar-accent-foreground\"\n : \"text-sidebar-foreground hover:bg-sidebar-accent/60\",\n )}\n >\n <item.icon className=\"h-4 w-4 shrink-0\" />\n <span>{item.label}</span>\n </Link>\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n\nexport function AppShell({\n children,\n pathname,\n navGroups,\n homeHref = \"/\",\n showRoleSwitcher = true,\n}: {\n children: React.ReactNode;\n pathname: string;\n navGroups: AppNavGroup[];\n homeHref?: string;\n showRoleSwitcher?: boolean;\n}) {\n const [mobileOpen, setMobileOpen] = React.useState(false);\n\n const sidebarContent = (\n <div className=\"flex h-full flex-col gap-6 px-3 py-4\">\n <Link href={homeHref} className=\"px-2\" aria-label=\"Home\">\n <Logo />\n </Link>\n {navGroups.map((g) => (\n <NavGroup key={g.label} group={g} pathname={pathname} />\n ))}\n </div>\n );\n\n return (\n <div className=\"flex min-h-svh bg-background text-foreground\">\n <aside className=\"hidden w-64 shrink-0 border-r border-sidebar-border bg-sidebar text-sidebar-foreground md:block\">\n {sidebarContent}\n </aside>\n\n {mobileOpen ? (\n <div className=\"fixed inset-0 z-50 flex md:hidden\">\n <div\n className=\"flex-1 bg-foreground/40 backdrop-blur-sm\"\n onClick={() => setMobileOpen(false)}\n aria-hidden\n />\n <aside className=\"relative w-72 border-l border-sidebar-border bg-sidebar text-sidebar-foreground\">\n <button\n type=\"button\"\n onClick={() => setMobileOpen(false)}\n aria-label=\"Close menu\"\n className=\"absolute right-2 top-2 inline-flex h-9 w-9 items-center justify-center rounded-md hover:bg-sidebar-accent\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n {sidebarContent}\n </aside>\n </div>\n ) : null}\n\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <header className=\"flex h-14 items-center justify-between gap-3 border-b border-border bg-background/80 px-4 backdrop-blur md:px-6\">\n <button\n type=\"button\"\n onClick={() => setMobileOpen(true)}\n aria-label=\"Open menu\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded-md border border-border md:hidden\"\n >\n <Menu className=\"h-4 w-4\" />\n </button>\n <div className=\"flex items-center gap-3 md:ml-auto\">\n {showRoleSwitcher ? <RoleSwitcher /> : null}\n <ThemeSwitcher />\n </div>\n </header>\n <main className=\"min-w-0 flex-1 px-4 py-6 md:px-8 md:py-8\">{children}</main>\n </div>\n </div>\n );\n}\n"],"mappings":";AAwBM,cAQQ,YARR;AAtBN,YAAY,WAAW;AACvB,OAAO,UAAU;AACjB,SAAS,MAAM,SAAS;AACxB,SAAS,YAAY;AACrB,SAAS,qBAAqB;AAC9B,SAAS,oBAAoB;AAC7B,SAAS,UAAU;AAYnB,SAAS,SAAS,EAAE,OAAO,SAAS,GAA6C;AAC/E,MAAI,MAAM,MAAM,WAAW,EAAG,QAAO;AACrC,SACE,qBAAC,SAAI,WAAU,aACb;AAAA,wBAAC,OAAE,WAAU,4EACV,gBAAM,OACT;AAAA,IACA,oBAAC,QAAG,WAAU,eACX,gBAAM,MAAM,IAAI,CAAC,SAAS;AACzB,YAAM,SAAS,aAAa,KAAK,QAAQ,SAAS,WAAW,GAAG,KAAK,IAAI,GAAG;AAC5E,aACE,oBAAC,QACC;AAAA,QAAC;AAAA;AAAA,UACC,MAAM,KAAK;AAAA,UACX,WAAW;AAAA,YACT;AAAA,YACA,SACI,qDACA;AAAA,UACN;AAAA,UAEA;AAAA,gCAAC,KAAK,MAAL,EAAU,WAAU,oBAAmB;AAAA,YACxC,oBAAC,UAAM,eAAK,OAAM;AAAA;AAAA;AAAA,MACpB,KAZO,KAAK,IAad;AAAA,IAEJ,CAAC,GACH;AAAA,KACF;AAEJ;AAEO,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,mBAAmB;AACrB,GAMG;AACD,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,SAAS,KAAK;AAExD,QAAM,iBACJ,qBAAC,SAAI,WAAU,wCACb;AAAA,wBAAC,QAAK,MAAM,UAAU,WAAU,QAAO,cAAW,QAChD,8BAAC,QAAK,GACR;AAAA,IACC,UAAU,IAAI,CAAC,MACd,oBAAC,YAAuB,OAAO,GAAG,YAAnB,EAAE,KAAqC,CACvD;AAAA,KACH;AAGF,SACE,qBAAC,SAAI,WAAU,gDACb;AAAA,wBAAC,WAAM,WAAU,mGACd,0BACH;AAAA,IAEC,aACC,qBAAC,SAAI,WAAU,qCACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,SAAS,MAAM,cAAc,KAAK;AAAA,UAClC,eAAW;AAAA;AAAA,MACb;AAAA,MACA,qBAAC,WAAM,WAAU,mFACf;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAM,cAAc,KAAK;AAAA,YAClC,cAAW;AAAA,YACX,WAAU;AAAA,YAEV,8BAAC,KAAE,WAAU,WAAU;AAAA;AAAA,QACzB;AAAA,QACC;AAAA,SACH;AAAA,OACF,IACE;AAAA,IAEJ,qBAAC,SAAI,WAAU,gCACb;AAAA,2BAAC,YAAO,WAAU,mHAChB;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAM,cAAc,IAAI;AAAA,YACjC,cAAW;AAAA,YACX,WAAU;AAAA,YAEV,8BAAC,QAAK,WAAU,WAAU;AAAA;AAAA,QAC5B;AAAA,QACA,qBAAC,SAAI,WAAU,sCACZ;AAAA,6BAAmB,oBAAC,gBAAa,IAAK;AAAA,UACvC,oBAAC,iBAAc;AAAA,WACjB;AAAA,SACF;AAAA,MACA,oBAAC,UAAK,WAAU,4CAA4C,UAAS;AAAA,OACvE;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
var __create = Object.create;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
8
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
+
var __export = (target, all) => {
|
|
10
|
+
for (var name in all)
|
|
11
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
12
|
+
};
|
|
13
|
+
var __copyProps = (to, from, except, desc) => {
|
|
14
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
15
|
+
for (let key of __getOwnPropNames(from))
|
|
16
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
17
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
18
|
+
}
|
|
19
|
+
return to;
|
|
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
|
+
));
|
|
29
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
30
|
+
var PublicShell_exports = {};
|
|
31
|
+
__export(PublicShell_exports, {
|
|
32
|
+
PublicShell: () => PublicShell
|
|
33
|
+
});
|
|
34
|
+
module.exports = __toCommonJS(PublicShell_exports);
|
|
35
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
36
|
+
var import_link = __toESM(require("next/link"));
|
|
37
|
+
var import_brand = require("@augmenting-integrations/brand");
|
|
38
|
+
var import_Logo = require("../chrome/Logo.js");
|
|
39
|
+
var import_ThemeSwitcher = require("../chrome/ThemeSwitcher.js");
|
|
40
|
+
function PublicShell({
|
|
41
|
+
children,
|
|
42
|
+
navLinks,
|
|
43
|
+
loginHref = "/login",
|
|
44
|
+
footerLinks
|
|
45
|
+
}) {
|
|
46
|
+
const brand = (0, import_brand.useBrand)();
|
|
47
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex min-h-svh flex-col bg-background text-foreground", children: [
|
|
48
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("header", { className: "border-b border-border bg-background/80 backdrop-blur", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "mx-auto flex max-w-6xl items-center justify-between px-6 py-4", children: [
|
|
49
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: "/", "aria-label": "Home", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_Logo.Logo, {}) }),
|
|
50
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("nav", { className: "flex items-center gap-6 text-sm", children: [
|
|
51
|
+
navLinks.map((link) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
52
|
+
import_link.default,
|
|
53
|
+
{
|
|
54
|
+
href: link.href,
|
|
55
|
+
className: "text-muted-foreground transition hover:text-foreground",
|
|
56
|
+
children: link.label
|
|
57
|
+
},
|
|
58
|
+
link.href
|
|
59
|
+
)),
|
|
60
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
61
|
+
import_link.default,
|
|
62
|
+
{
|
|
63
|
+
href: loginHref,
|
|
64
|
+
className: "text-muted-foreground transition hover:text-foreground",
|
|
65
|
+
children: "Log in"
|
|
66
|
+
}
|
|
67
|
+
),
|
|
68
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ThemeSwitcher.ThemeSwitcher, {})
|
|
69
|
+
] })
|
|
70
|
+
] }) }),
|
|
71
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("main", { className: "flex-1", children }),
|
|
72
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("footer", { className: "border-t border-border", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "mx-auto flex max-w-6xl flex-wrap items-center justify-between gap-3 px-6 py-6 text-sm text-muted-foreground", children: [
|
|
73
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
|
|
74
|
+
"\xA9 ",
|
|
75
|
+
(/* @__PURE__ */ new Date()).getFullYear(),
|
|
76
|
+
" ",
|
|
77
|
+
brand.name
|
|
78
|
+
] }),
|
|
79
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex gap-4", children: (footerLinks ?? []).map((link) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: link.href, className: "hover:text-foreground", children: link.label }, link.href)) })
|
|
80
|
+
] }) })
|
|
81
|
+
] });
|
|
82
|
+
}
|
|
83
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
84
|
+
0 && (module.exports = {
|
|
85
|
+
PublicShell
|
|
86
|
+
});
|
|
87
|
+
//# sourceMappingURL=PublicShell.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/shells/PublicShell.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport Link from \"next/link\";\nimport { useBrand } from \"@augmenting-integrations/brand\";\nimport { Logo } from \"../chrome/Logo.js\";\nimport { ThemeSwitcher } from \"../chrome/ThemeSwitcher.js\";\n\nexport type NavLink = { href: string; label: string };\n\nexport function PublicShell({\n children,\n navLinks,\n loginHref = \"/login\",\n footerLinks,\n}: {\n children: React.ReactNode;\n navLinks: NavLink[];\n loginHref?: string;\n footerLinks?: NavLink[];\n}) {\n const brand = useBrand();\n return (\n <div className=\"flex min-h-svh flex-col bg-background text-foreground\">\n <header className=\"border-b border-border bg-background/80 backdrop-blur\">\n <div className=\"mx-auto flex max-w-6xl items-center justify-between px-6 py-4\">\n <Link href=\"/\" aria-label=\"Home\">\n <Logo />\n </Link>\n <nav className=\"flex items-center gap-6 text-sm\">\n {navLinks.map((link) => (\n <Link\n key={link.href}\n href={link.href}\n className=\"text-muted-foreground transition hover:text-foreground\"\n >\n {link.label}\n </Link>\n ))}\n <Link\n href={loginHref}\n className=\"text-muted-foreground transition hover:text-foreground\"\n >\n Log in\n </Link>\n <ThemeSwitcher />\n </nav>\n </div>\n </header>\n\n <main className=\"flex-1\">{children}</main>\n\n <footer className=\"border-t border-border\">\n <div className=\"mx-auto flex max-w-6xl flex-wrap items-center justify-between gap-3 px-6 py-6 text-sm text-muted-foreground\">\n <span>\n © {new Date().getFullYear()} {brand.name}\n </span>\n <div className=\"flex gap-4\">\n {(footerLinks ?? []).map((link) => (\n <Link key={link.href} href={link.href} className=\"hover:text-foreground\">\n {link.label}\n </Link>\n ))}\n </div>\n </div>\n </footer>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BY;AAxBZ,kBAAiB;AACjB,mBAAyB;AACzB,kBAAqB;AACrB,2BAA8B;AAIvB,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AACF,GAKG;AACD,QAAM,YAAQ,uBAAS;AACvB,SACE,6CAAC,SAAI,WAAU,yDACb;AAAA,gDAAC,YAAO,WAAU,yDAChB,uDAAC,SAAI,WAAU,iEACb;AAAA,kDAAC,YAAAA,SAAA,EAAK,MAAK,KAAI,cAAW,QACxB,sDAAC,oBAAK,GACR;AAAA,MACA,6CAAC,SAAI,WAAU,mCACZ;AAAA,iBAAS,IAAI,CAAC,SACb;AAAA,UAAC,YAAAA;AAAA,UAAA;AAAA,YAEC,MAAM,KAAK;AAAA,YACX,WAAU;AAAA,YAET,eAAK;AAAA;AAAA,UAJD,KAAK;AAAA,QAKZ,CACD;AAAA,QACD;AAAA,UAAC,YAAAA;AAAA,UAAA;AAAA,YACC,MAAM;AAAA,YACN,WAAU;AAAA,YACX;AAAA;AAAA,QAED;AAAA,QACA,4CAAC,sCAAc;AAAA,SACjB;AAAA,OACF,GACF;AAAA,IAEA,4CAAC,UAAK,WAAU,UAAU,UAAS;AAAA,IAEnC,4CAAC,YAAO,WAAU,0BAChB,uDAAC,SAAI,WAAU,+GACb;AAAA,mDAAC,UAAK;AAAA;AAAA,SACD,oBAAI,KAAK,GAAE,YAAY;AAAA,QAAE;AAAA,QAAE,MAAM;AAAA,SACtC;AAAA,MACA,4CAAC,SAAI,WAAU,cACX,0BAAe,CAAC,GAAG,IAAI,CAAC,SACxB,4CAAC,YAAAA,SAAA,EAAqB,MAAM,KAAK,MAAM,WAAU,yBAC9C,eAAK,SADG,KAAK,IAEhB,CACD,GACH;AAAA,OACF,GACF;AAAA,KACF;AAEJ;","names":["Link"]}
|
|
@@ -3,20 +3,10 @@ export type NavLink = {
|
|
|
3
3
|
href: string;
|
|
4
4
|
label: string;
|
|
5
5
|
};
|
|
6
|
-
export declare function PublicShell({ children, navLinks, loginHref, footerLinks,
|
|
6
|
+
export declare function PublicShell({ children, navLinks, loginHref, footerLinks, }: {
|
|
7
7
|
children: React.ReactNode;
|
|
8
8
|
navLinks: NavLink[];
|
|
9
9
|
loginHref?: string;
|
|
10
10
|
footerLinks?: NavLink[];
|
|
11
|
-
/**
|
|
12
|
-
* The consuming app passes its router's Link component (e.g. next/link).
|
|
13
|
-
* Decoupling the package from next/link keeps it framework-agnostic.
|
|
14
|
-
*/
|
|
15
|
-
Link: React.ComponentType<{
|
|
16
|
-
href: string;
|
|
17
|
-
children?: React.ReactNode;
|
|
18
|
-
className?: string;
|
|
19
|
-
"aria-label"?: string;
|
|
20
|
-
}>;
|
|
21
11
|
}): React.JSX.Element;
|
|
22
12
|
//# sourceMappingURL=PublicShell.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PublicShell.d.ts","sourceRoot":"","sources":["../../../src/components/shells/PublicShell.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"PublicShell.d.ts","sourceRoot":"","sources":["../../../src/components/shells/PublicShell.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,MAAM,MAAM,OAAO,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtD,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,QAAQ,EACR,SAAoB,EACpB,WAAW,GACZ,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC;CACzB,qBAgDA"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import Link from "next/link";
|
|
4
|
+
import { useBrand } from "@augmenting-integrations/brand";
|
|
5
|
+
import { Logo } from "../chrome/Logo.js";
|
|
6
|
+
import { ThemeSwitcher } from "../chrome/ThemeSwitcher.js";
|
|
7
|
+
function PublicShell({
|
|
8
|
+
children,
|
|
9
|
+
navLinks,
|
|
10
|
+
loginHref = "/login",
|
|
11
|
+
footerLinks
|
|
12
|
+
}) {
|
|
13
|
+
const brand = useBrand();
|
|
14
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex min-h-svh flex-col bg-background text-foreground", children: [
|
|
15
|
+
/* @__PURE__ */ jsx("header", { className: "border-b border-border bg-background/80 backdrop-blur", children: /* @__PURE__ */ jsxs("div", { className: "mx-auto flex max-w-6xl items-center justify-between px-6 py-4", children: [
|
|
16
|
+
/* @__PURE__ */ jsx(Link, { href: "/", "aria-label": "Home", children: /* @__PURE__ */ jsx(Logo, {}) }),
|
|
17
|
+
/* @__PURE__ */ jsxs("nav", { className: "flex items-center gap-6 text-sm", children: [
|
|
18
|
+
navLinks.map((link) => /* @__PURE__ */ jsx(
|
|
19
|
+
Link,
|
|
20
|
+
{
|
|
21
|
+
href: link.href,
|
|
22
|
+
className: "text-muted-foreground transition hover:text-foreground",
|
|
23
|
+
children: link.label
|
|
24
|
+
},
|
|
25
|
+
link.href
|
|
26
|
+
)),
|
|
27
|
+
/* @__PURE__ */ jsx(
|
|
28
|
+
Link,
|
|
29
|
+
{
|
|
30
|
+
href: loginHref,
|
|
31
|
+
className: "text-muted-foreground transition hover:text-foreground",
|
|
32
|
+
children: "Log in"
|
|
33
|
+
}
|
|
34
|
+
),
|
|
35
|
+
/* @__PURE__ */ jsx(ThemeSwitcher, {})
|
|
36
|
+
] })
|
|
37
|
+
] }) }),
|
|
38
|
+
/* @__PURE__ */ jsx("main", { className: "flex-1", children }),
|
|
39
|
+
/* @__PURE__ */ jsx("footer", { className: "border-t border-border", children: /* @__PURE__ */ jsxs("div", { className: "mx-auto flex max-w-6xl flex-wrap items-center justify-between gap-3 px-6 py-6 text-sm text-muted-foreground", children: [
|
|
40
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
41
|
+
"\xA9 ",
|
|
42
|
+
(/* @__PURE__ */ new Date()).getFullYear(),
|
|
43
|
+
" ",
|
|
44
|
+
brand.name
|
|
45
|
+
] }),
|
|
46
|
+
/* @__PURE__ */ jsx("div", { className: "flex gap-4", children: (footerLinks ?? []).map((link) => /* @__PURE__ */ jsx(Link, { href: link.href, className: "hover:text-foreground", children: link.label }, link.href)) })
|
|
47
|
+
] }) })
|
|
48
|
+
] });
|
|
49
|
+
}
|
|
50
|
+
export {
|
|
51
|
+
PublicShell
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=PublicShell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/shells/PublicShell.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport Link from \"next/link\";\nimport { useBrand } from \"@augmenting-integrations/brand\";\nimport { Logo } from \"../chrome/Logo.js\";\nimport { ThemeSwitcher } from \"../chrome/ThemeSwitcher.js\";\n\nexport type NavLink = { href: string; label: string };\n\nexport function PublicShell({\n children,\n navLinks,\n loginHref = \"/login\",\n footerLinks,\n}: {\n children: React.ReactNode;\n navLinks: NavLink[];\n loginHref?: string;\n footerLinks?: NavLink[];\n}) {\n const brand = useBrand();\n return (\n <div className=\"flex min-h-svh flex-col bg-background text-foreground\">\n <header className=\"border-b border-border bg-background/80 backdrop-blur\">\n <div className=\"mx-auto flex max-w-6xl items-center justify-between px-6 py-4\">\n <Link href=\"/\" aria-label=\"Home\">\n <Logo />\n </Link>\n <nav className=\"flex items-center gap-6 text-sm\">\n {navLinks.map((link) => (\n <Link\n key={link.href}\n href={link.href}\n className=\"text-muted-foreground transition hover:text-foreground\"\n >\n {link.label}\n </Link>\n ))}\n <Link\n href={loginHref}\n className=\"text-muted-foreground transition hover:text-foreground\"\n >\n Log in\n </Link>\n <ThemeSwitcher />\n </nav>\n </div>\n </header>\n\n <main className=\"flex-1\">{children}</main>\n\n <footer className=\"border-t border-border\">\n <div className=\"mx-auto flex max-w-6xl flex-wrap items-center justify-between gap-3 px-6 py-6 text-sm text-muted-foreground\">\n <span>\n © {new Date().getFullYear()} {brand.name}\n </span>\n <div className=\"flex gap-4\">\n {(footerLinks ?? []).map((link) => (\n <Link key={link.href} href={link.href} className=\"hover:text-foreground\">\n {link.label}\n </Link>\n ))}\n </div>\n </div>\n </footer>\n </div>\n );\n}\n"],"mappings":";AA2BY,cAEF,YAFE;AAxBZ,OAAO,UAAU;AACjB,SAAS,gBAAgB;AACzB,SAAS,YAAY;AACrB,SAAS,qBAAqB;AAIvB,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AACF,GAKG;AACD,QAAM,QAAQ,SAAS;AACvB,SACE,qBAAC,SAAI,WAAU,yDACb;AAAA,wBAAC,YAAO,WAAU,yDAChB,+BAAC,SAAI,WAAU,iEACb;AAAA,0BAAC,QAAK,MAAK,KAAI,cAAW,QACxB,8BAAC,QAAK,GACR;AAAA,MACA,qBAAC,SAAI,WAAU,mCACZ;AAAA,iBAAS,IAAI,CAAC,SACb;AAAA,UAAC;AAAA;AAAA,YAEC,MAAM,KAAK;AAAA,YACX,WAAU;AAAA,YAET,eAAK;AAAA;AAAA,UAJD,KAAK;AAAA,QAKZ,CACD;AAAA,QACD;AAAA,UAAC;AAAA;AAAA,YACC,MAAM;AAAA,YACN,WAAU;AAAA,YACX;AAAA;AAAA,QAED;AAAA,QACA,oBAAC,iBAAc;AAAA,SACjB;AAAA,OACF,GACF;AAAA,IAEA,oBAAC,UAAK,WAAU,UAAU,UAAS;AAAA,IAEnC,oBAAC,YAAO,WAAU,0BAChB,+BAAC,SAAI,WAAU,+GACb;AAAA,2BAAC,UAAK;AAAA;AAAA,SACD,oBAAI,KAAK,GAAE,YAAY;AAAA,QAAE;AAAA,QAAE,MAAM;AAAA,SACtC;AAAA,MACA,oBAAC,SAAI,WAAU,cACX,0BAAe,CAAC,GAAG,IAAI,CAAC,SACxB,oBAAC,QAAqB,MAAM,KAAK,MAAM,WAAU,yBAC9C,eAAK,SADG,KAAK,IAEhB,CACD,GACH;AAAA,OACF,GACF;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
var StudioShell_exports = {};
|
|
21
|
+
__export(StudioShell_exports, {
|
|
22
|
+
StudioShell: () => StudioShell
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(StudioShell_exports);
|
|
25
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
26
|
+
var import_utils = require("../../lib/utils.js");
|
|
27
|
+
function StudioShell({
|
|
28
|
+
title,
|
|
29
|
+
description,
|
|
30
|
+
actions,
|
|
31
|
+
children,
|
|
32
|
+
className
|
|
33
|
+
}) {
|
|
34
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: (0, import_utils.cn)("space-y-6", className), children: [
|
|
35
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("header", { className: "flex flex-wrap items-start justify-between gap-3", children: [
|
|
36
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
|
|
37
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h1", { className: "text-2xl font-semibold tracking-tight", children: title }),
|
|
38
|
+
description ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "mt-1 max-w-2xl text-sm text-muted-foreground", children: description }) : null
|
|
39
|
+
] }),
|
|
40
|
+
actions ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex items-center gap-2", children: actions }) : null
|
|
41
|
+
] }),
|
|
42
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "rounded-lg border border-border bg-card p-4 md:p-6", children })
|
|
43
|
+
] });
|
|
44
|
+
}
|
|
45
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
46
|
+
0 && (module.exports = {
|
|
47
|
+
StudioShell
|
|
48
|
+
});
|
|
49
|
+
//# sourceMappingURL=StudioShell.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/shells/StudioShell.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils.js\";\n\n/**\n * Common chrome for studio panels (theme, brand, flags, content). Each app's\n * studio routes wrap their page in <StudioShell title=\"Feature flags\">.\n */\nexport function StudioShell({\n title,\n description,\n actions,\n children,\n className,\n}: {\n title: string;\n description?: string;\n actions?: React.ReactNode;\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <section className={cn(\"space-y-6\", className)}>\n <header className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <h1 className=\"text-2xl font-semibold tracking-tight\">{title}</h1>\n {description ? (\n <p className=\"mt-1 max-w-2xl text-sm text-muted-foreground\">{description}</p>\n ) : null}\n </div>\n {actions ? <div className=\"flex items-center gap-2\">{actions}</div> : null}\n </header>\n <div className=\"rounded-lg border border-border bg-card p-4 md:p-6\">{children}</div>\n </section>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBQ;AAtBR,mBAAmB;AAMZ,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,SACE,6CAAC,aAAQ,eAAW,iBAAG,aAAa,SAAS,GAC3C;AAAA,iDAAC,YAAO,WAAU,oDAChB;AAAA,mDAAC,SACC;AAAA,oDAAC,QAAG,WAAU,yCAAyC,iBAAM;AAAA,QAC5D,cACC,4CAAC,OAAE,WAAU,gDAAgD,uBAAY,IACvE;AAAA,SACN;AAAA,MACC,UAAU,4CAAC,SAAI,WAAU,2BAA2B,mBAAQ,IAAS;AAAA,OACxE;AAAA,IACA,4CAAC,SAAI,WAAU,sDAAsD,UAAS;AAAA,KAChF;AAEJ;","names":[]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { cn } from "../../lib/utils.js";
|
|
4
|
+
function StudioShell({
|
|
5
|
+
title,
|
|
6
|
+
description,
|
|
7
|
+
actions,
|
|
8
|
+
children,
|
|
9
|
+
className
|
|
10
|
+
}) {
|
|
11
|
+
return /* @__PURE__ */ jsxs("section", { className: cn("space-y-6", className), children: [
|
|
12
|
+
/* @__PURE__ */ jsxs("header", { className: "flex flex-wrap items-start justify-between gap-3", children: [
|
|
13
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
14
|
+
/* @__PURE__ */ jsx("h1", { className: "text-2xl font-semibold tracking-tight", children: title }),
|
|
15
|
+
description ? /* @__PURE__ */ jsx("p", { className: "mt-1 max-w-2xl text-sm text-muted-foreground", children: description }) : null
|
|
16
|
+
] }),
|
|
17
|
+
actions ? /* @__PURE__ */ jsx("div", { className: "flex items-center gap-2", children: actions }) : null
|
|
18
|
+
] }),
|
|
19
|
+
/* @__PURE__ */ jsx("div", { className: "rounded-lg border border-border bg-card p-4 md:p-6", children })
|
|
20
|
+
] });
|
|
21
|
+
}
|
|
22
|
+
export {
|
|
23
|
+
StudioShell
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=StudioShell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/shells/StudioShell.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils.js\";\n\n/**\n * Common chrome for studio panels (theme, brand, flags, content). Each app's\n * studio routes wrap their page in <StudioShell title=\"Feature flags\">.\n */\nexport function StudioShell({\n title,\n description,\n actions,\n children,\n className,\n}: {\n title: string;\n description?: string;\n actions?: React.ReactNode;\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <section className={cn(\"space-y-6\", className)}>\n <header className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <h1 className=\"text-2xl font-semibold tracking-tight\">{title}</h1>\n {description ? (\n <p className=\"mt-1 max-w-2xl text-sm text-muted-foreground\">{description}</p>\n ) : null}\n </div>\n {actions ? <div className=\"flex items-center gap-2\">{actions}</div> : null}\n </header>\n <div className=\"rounded-lg border border-border bg-card p-4 md:p-6\">{children}</div>\n </section>\n );\n}\n"],"mappings":";AAyBQ,SACE,KADF;AAtBR,SAAS,UAAU;AAMZ,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,SACE,qBAAC,aAAQ,WAAW,GAAG,aAAa,SAAS,GAC3C;AAAA,yBAAC,YAAO,WAAU,oDAChB;AAAA,2BAAC,SACC;AAAA,4BAAC,QAAG,WAAU,yCAAyC,iBAAM;AAAA,QAC5D,cACC,oBAAC,OAAE,WAAU,gDAAgD,uBAAY,IACvE;AAAA,SACN;AAAA,MACC,UAAU,oBAAC,SAAI,WAAU,2BAA2B,mBAAQ,IAAS;AAAA,OACxE;AAAA,IACA,oBAAC,SAAI,WAAU,sDAAsD,UAAS;AAAA,KAChF;AAEJ;","names":[]}
|