@tetrascience-npm/tetrascience-react-ui 1.0.0-beta.160.1 → 1.0.0-beta.161.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/composed/AppShellSimple/AppShellSimple.cjs +1 -1
- package/dist/components/composed/AppShellSimple/AppShellSimple.cjs.map +1 -1
- package/dist/components/composed/AppShellSimple/AppShellSimple.d.ts +5 -1
- package/dist/components/composed/AppShellSimple/AppShellSimple.js +58 -55
- package/dist/components/composed/AppShellSimple/AppShellSimple.js.map +1 -1
- package/dist/components/composed/BuildInfoFooter/BuildInfoFooter.cjs +2 -0
- package/dist/components/composed/BuildInfoFooter/BuildInfoFooter.cjs.map +1 -0
- package/dist/components/composed/BuildInfoFooter/BuildInfoFooter.d.ts +24 -0
- package/dist/components/composed/BuildInfoFooter/BuildInfoFooter.js +34 -0
- package/dist/components/composed/BuildInfoFooter/BuildInfoFooter.js.map +1 -0
- package/dist/components/composed/DataAppShell/DataAppShell.cjs +1 -1
- package/dist/components/composed/DataAppShell/DataAppShell.cjs.map +1 -1
- package/dist/components/composed/DataAppShell/DataAppShell.d.ts +3 -1
- package/dist/components/composed/DataAppShell/DataAppShell.js +111 -109
- package/dist/components/composed/DataAppShell/DataAppShell.js.map +1 -1
- package/dist/components/ui/badge.d.ts +1 -1
- package/dist/components/ui/button.d.ts +1 -1
- package/dist/index.css +1 -1
- package/dist/index.scoped.css +1 -1
- package/dist/index.tailwind.css +1 -1
- package/package.json +1 -1
|
@@ -1,16 +1,17 @@
|
|
|
1
|
-
import { jsx as e, jsxs as i, Fragment as
|
|
2
|
-
import { ChevronRight as
|
|
3
|
-
import * as
|
|
1
|
+
import { jsx as e, jsxs as i, Fragment as ae } from "react/jsx-runtime";
|
|
2
|
+
import { ChevronRight as re, Menu as ne, ArrowLeft as j } from "lucide-react";
|
|
3
|
+
import * as m from "react";
|
|
4
4
|
import { ShellCollapseButton as E } from "./CollapseButton.js";
|
|
5
5
|
import { DataAppShellPrimaryNav as N } from "./PrimaryNav.js";
|
|
6
|
-
import { DataAppShellProvider as
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
6
|
+
import { DataAppShellProvider as te } from "./ShellContext.js";
|
|
7
|
+
import { WithBuildInfoFooter as le } from "../BuildInfoFooter/BuildInfoFooter.js";
|
|
8
|
+
import { TDPLink as ie } from "../../../composed/tdp-link.js";
|
|
9
|
+
import { TopBar as se } from "../TopBar/TopBar.js";
|
|
10
|
+
import { Breadcrumb as oe, BreadcrumbList as de, BreadcrumbSeparator as ce, BreadcrumbItem as me, BreadcrumbPage as ue, BreadcrumbLink as pe } from "../../../ui/breadcrumb.js";
|
|
10
11
|
import { Button as I } from "../../../ui/button.js";
|
|
11
|
-
import { DropdownMenu as
|
|
12
|
-
import { Sheet as
|
|
13
|
-
import { cn as
|
|
12
|
+
import { DropdownMenu as fe, DropdownMenuTrigger as he, DropdownMenuContent as be, DropdownMenuItem as F, DropdownMenuSeparator as ge } from "../../../ui/dropdown-menu.js";
|
|
13
|
+
import { Sheet as ve, SheetContent as xe, SheetTitle as we, SheetDescription as Ne, SheetTrigger as ke } from "../../../ui/sheet.js";
|
|
14
|
+
import { cn as G } from "../../../lib/utils.js";
|
|
14
15
|
function k({
|
|
15
16
|
appName: n,
|
|
16
17
|
appFullName: a,
|
|
@@ -18,29 +19,29 @@ function k({
|
|
|
18
19
|
version: t,
|
|
19
20
|
onAppNameClick: l,
|
|
20
21
|
backToPlatformPath: s,
|
|
21
|
-
onBackToPlatform:
|
|
22
|
-
compact:
|
|
23
|
-
menuSide:
|
|
22
|
+
onBackToPlatform: u,
|
|
23
|
+
compact: c,
|
|
24
|
+
menuSide: p = "right"
|
|
24
25
|
}) {
|
|
25
|
-
const
|
|
26
|
-
return /* @__PURE__ */ i(
|
|
27
|
-
/* @__PURE__ */ e(
|
|
26
|
+
const o = /* @__PURE__ */ e("span", { className: "flex items-center justify-center rounded-lg bg-sidebar-accent border border-sidebar-border font-bold text-foreground shrink-0 size-8 text-[10px]", children: r ?? n });
|
|
27
|
+
return /* @__PURE__ */ i(fe, { modal: !1, children: [
|
|
28
|
+
/* @__PURE__ */ e(he, { asChild: !0, children: /* @__PURE__ */ i(
|
|
28
29
|
"button",
|
|
29
30
|
{
|
|
30
31
|
type: "button",
|
|
31
|
-
className:
|
|
32
|
+
className: G(
|
|
32
33
|
"cursor-pointer bg-transparent border-none p-0",
|
|
33
|
-
!
|
|
34
|
+
!c && "flex items-center w-full text-left"
|
|
34
35
|
),
|
|
35
36
|
children: [
|
|
36
|
-
|
|
37
|
-
!
|
|
37
|
+
c ? o : /* @__PURE__ */ e("span", { className: "flex w-12 shrink-0 justify-center", children: o }),
|
|
38
|
+
!c && /* @__PURE__ */ e("span", { className: "text-sm font-semibold text-foreground truncate leading-snug", children: a ?? n })
|
|
38
39
|
]
|
|
39
40
|
}
|
|
40
41
|
) }),
|
|
41
|
-
/* @__PURE__ */ i(
|
|
42
|
+
/* @__PURE__ */ i(be, { side: p, align: "start", className: "min-w-[220px]", children: [
|
|
42
43
|
/* @__PURE__ */ i(
|
|
43
|
-
|
|
44
|
+
F,
|
|
44
45
|
{
|
|
45
46
|
className: "gap-3 px-3 py-2.5",
|
|
46
47
|
onSelect: () => l?.(),
|
|
@@ -53,9 +54,9 @@ function k({
|
|
|
53
54
|
]
|
|
54
55
|
}
|
|
55
56
|
),
|
|
56
|
-
/* @__PURE__ */ e(
|
|
57
|
-
/* @__PURE__ */ e(
|
|
58
|
-
|
|
57
|
+
/* @__PURE__ */ e(ge, {}),
|
|
58
|
+
/* @__PURE__ */ e(F, { className: "gap-2.5 p-0", asChild: !0, children: s ? /* @__PURE__ */ i(
|
|
59
|
+
ie,
|
|
59
60
|
{
|
|
60
61
|
path: s,
|
|
61
62
|
navigationOptions: { newTab: !1 },
|
|
@@ -70,7 +71,7 @@ function k({
|
|
|
70
71
|
{
|
|
71
72
|
type: "button",
|
|
72
73
|
className: "flex items-center gap-2.5 w-full px-2 py-1.5 bg-transparent border-none cursor-pointer",
|
|
73
|
-
onClick:
|
|
74
|
+
onClick: u,
|
|
74
75
|
children: [
|
|
75
76
|
/* @__PURE__ */ e(j, { className: "w-4 h-4 text-muted-foreground" }),
|
|
76
77
|
"Back to TDP Platform"
|
|
@@ -80,23 +81,23 @@ function k({
|
|
|
80
81
|
] })
|
|
81
82
|
] });
|
|
82
83
|
}
|
|
83
|
-
function
|
|
84
|
+
function O({
|
|
84
85
|
appName: n,
|
|
85
86
|
appFullName: a,
|
|
86
87
|
appIcon: r,
|
|
87
88
|
version: t,
|
|
88
89
|
navGroups: l,
|
|
89
90
|
onAppNameClick: s,
|
|
90
|
-
backToPlatformPath:
|
|
91
|
-
onBackToPlatform:
|
|
92
|
-
userMenu:
|
|
93
|
-
compact:
|
|
91
|
+
backToPlatformPath: u,
|
|
92
|
+
onBackToPlatform: c,
|
|
93
|
+
userMenu: p,
|
|
94
|
+
compact: o,
|
|
94
95
|
onAfterNavClick: h
|
|
95
96
|
}) {
|
|
96
97
|
return /* @__PURE__ */ e(
|
|
97
98
|
N,
|
|
98
99
|
{
|
|
99
|
-
variant:
|
|
100
|
+
variant: o ? "rail" : "sidebar",
|
|
100
101
|
"aria-label": "Application navigation",
|
|
101
102
|
navGroups: l,
|
|
102
103
|
onSelect: () => h?.(),
|
|
@@ -108,35 +109,35 @@ function F({
|
|
|
108
109
|
appIcon: r,
|
|
109
110
|
version: t,
|
|
110
111
|
onAppNameClick: s,
|
|
111
|
-
backToPlatformPath:
|
|
112
|
-
onBackToPlatform:
|
|
113
|
-
compact:
|
|
112
|
+
backToPlatformPath: u,
|
|
113
|
+
onBackToPlatform: c,
|
|
114
|
+
compact: o
|
|
114
115
|
}
|
|
115
116
|
),
|
|
116
|
-
user:
|
|
117
|
+
user: p,
|
|
117
118
|
className: "h-full w-full"
|
|
118
119
|
}
|
|
119
120
|
);
|
|
120
121
|
}
|
|
121
|
-
function
|
|
122
|
+
function _e(n) {
|
|
122
123
|
return /* @__PURE__ */ e(
|
|
123
124
|
"div",
|
|
124
125
|
{
|
|
125
126
|
"data-slot": "data-app-sidebar-rail",
|
|
126
127
|
className: "hidden md:flex w-12 flex-col shrink-0 bg-sidebar border-r border-sidebar-border h-full z-50",
|
|
127
|
-
children: /* @__PURE__ */ e(
|
|
128
|
+
children: /* @__PURE__ */ e(O, { compact: !0, ...n })
|
|
128
129
|
}
|
|
129
130
|
);
|
|
130
131
|
}
|
|
131
|
-
function
|
|
132
|
-
const { appName: t, appFullName: l, appIcon: s, version:
|
|
132
|
+
function Ce({ collapsed: n, onCollapsedChange: a, ...r }) {
|
|
133
|
+
const { appName: t, appFullName: l, appIcon: s, version: u, onAppNameClick: c, backToPlatformPath: p, onBackToPlatform: o } = r, h = {
|
|
133
134
|
appName: t,
|
|
134
135
|
appFullName: l,
|
|
135
136
|
appIcon: s,
|
|
136
|
-
version:
|
|
137
|
-
onAppNameClick:
|
|
138
|
-
backToPlatformPath:
|
|
139
|
-
onBackToPlatform:
|
|
137
|
+
version: u,
|
|
138
|
+
onAppNameClick: c,
|
|
139
|
+
backToPlatformPath: p,
|
|
140
|
+
onBackToPlatform: o
|
|
140
141
|
};
|
|
141
142
|
return n ? /* @__PURE__ */ e(
|
|
142
143
|
"div",
|
|
@@ -196,17 +197,17 @@ function ke({ collapsed: n, onCollapsedChange: a, ...r }) {
|
|
|
196
197
|
}
|
|
197
198
|
);
|
|
198
199
|
}
|
|
199
|
-
function
|
|
200
|
+
function ye({ items: n }) {
|
|
200
201
|
return (
|
|
201
202
|
// min-w-0 lets the trail shrink inside the top bar's flex-1 left group;
|
|
202
203
|
// flex-nowrap keeps it one line instead of Breadcrumb's default wrap
|
|
203
204
|
// (which, combined with a squeezed left group, wrapped mid-trail and
|
|
204
205
|
// pushed the rest of the top bar around — SW-2118).
|
|
205
|
-
/* @__PURE__ */ e(
|
|
206
|
+
/* @__PURE__ */ e(oe, { className: "min-w-0", children: /* @__PURE__ */ e(de, { className: "flex-nowrap min-w-0", children: n.map((a, r) => {
|
|
206
207
|
const t = r === n.length - 1, l = !t && (!!a.href || !!a.onClick), s = t ? "min-w-0" : "shrink-0";
|
|
207
|
-
return /* @__PURE__ */ i(
|
|
208
|
-
r > 0 && /* @__PURE__ */ e(
|
|
209
|
-
/* @__PURE__ */ e(
|
|
208
|
+
return /* @__PURE__ */ i(m.Fragment, { children: [
|
|
209
|
+
r > 0 && /* @__PURE__ */ e(ce, { className: "shrink-0", children: "/" }),
|
|
210
|
+
/* @__PURE__ */ e(me, { className: s, children: t ? /* @__PURE__ */ e(ue, { className: "truncate", children: a.label }) : l && a.href ? /* @__PURE__ */ e(pe, { href: a.href, className: "whitespace-nowrap", children: a.label }) : l && a.onClick ? /* @__PURE__ */ e(
|
|
210
211
|
"button",
|
|
211
212
|
{
|
|
212
213
|
type: "button",
|
|
@@ -219,7 +220,7 @@ function _e({ items: n }) {
|
|
|
219
220
|
}) }) })
|
|
220
221
|
);
|
|
221
222
|
}
|
|
222
|
-
function
|
|
223
|
+
function Se({
|
|
223
224
|
breadcrumbs: n = [],
|
|
224
225
|
headerLeft: a,
|
|
225
226
|
headerCenter: r,
|
|
@@ -227,12 +228,12 @@ function Ce({
|
|
|
227
228
|
mobileTrigger: l
|
|
228
229
|
}) {
|
|
229
230
|
return /* @__PURE__ */ e(
|
|
230
|
-
|
|
231
|
+
se,
|
|
231
232
|
{
|
|
232
233
|
"data-slot": "data-app-top-nav",
|
|
233
|
-
left: /* @__PURE__ */ i(
|
|
234
|
+
left: /* @__PURE__ */ i(ae, { children: [
|
|
234
235
|
l && /* @__PURE__ */ e("div", { className: "shrink-0", children: l }),
|
|
235
|
-
/* @__PURE__ */ e(
|
|
236
|
+
/* @__PURE__ */ e(ye, { items: n }),
|
|
236
237
|
a != null && /* @__PURE__ */ e("div", { className: "shrink-0", children: a })
|
|
237
238
|
] }),
|
|
238
239
|
center: r,
|
|
@@ -240,87 +241,88 @@ function Ce({
|
|
|
240
241
|
}
|
|
241
242
|
);
|
|
242
243
|
}
|
|
243
|
-
function
|
|
244
|
+
function He({
|
|
244
245
|
appName: n,
|
|
245
246
|
appFullName: a,
|
|
246
247
|
appIcon: r,
|
|
247
248
|
version: t,
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
249
|
+
commitSha: l,
|
|
250
|
+
navGroups: s,
|
|
251
|
+
onAppNameClick: u,
|
|
252
|
+
backToPlatformPath: c,
|
|
253
|
+
onBackToPlatform: p,
|
|
254
|
+
userMenu: o,
|
|
255
|
+
breadcrumbs: h = [],
|
|
256
|
+
headerLeft: H,
|
|
257
|
+
headerCenter: P,
|
|
258
|
+
headerActions: $,
|
|
257
259
|
navVariant: b = "vertical",
|
|
258
|
-
primaryNav:
|
|
260
|
+
primaryNav: q = "rail",
|
|
259
261
|
sidebarPanel: _,
|
|
260
262
|
secondaryBar: M,
|
|
261
|
-
rightPanel:
|
|
263
|
+
rightPanel: W,
|
|
262
264
|
showNavRail: J = !0,
|
|
263
265
|
showTopBar: K = !0,
|
|
264
266
|
collapsed: g,
|
|
265
267
|
defaultCollapsed: Q = !1,
|
|
266
268
|
onCollapsedChange: v,
|
|
267
269
|
hideNavOnCollapse: C = !1,
|
|
268
|
-
autoCollapse:
|
|
270
|
+
autoCollapse: y = "(max-width: 1023px)",
|
|
269
271
|
children: U,
|
|
270
|
-
className:
|
|
272
|
+
className: X
|
|
271
273
|
}) {
|
|
272
|
-
const [
|
|
274
|
+
const [Y, T] = m.useState(!1), [Z, S] = m.useState(Q), f = g ?? Z, R = m.useRef(f);
|
|
273
275
|
R.current = f;
|
|
274
|
-
const x =
|
|
275
|
-
(
|
|
276
|
-
x.current = !1, g === void 0 &&
|
|
276
|
+
const x = m.useRef(!1), B = m.useCallback(
|
|
277
|
+
(d) => {
|
|
278
|
+
x.current = !1, g === void 0 && S(d), v?.(d);
|
|
277
279
|
},
|
|
278
280
|
[g, v]
|
|
279
|
-
), A =
|
|
281
|
+
), A = m.useRef((d) => {
|
|
280
282
|
});
|
|
281
|
-
A.current = (
|
|
282
|
-
|
|
283
|
-
},
|
|
284
|
-
if (
|
|
285
|
-
const
|
|
286
|
-
A.current(
|
|
287
|
-
const L = (
|
|
288
|
-
return
|
|
289
|
-
}, [
|
|
283
|
+
A.current = (d) => {
|
|
284
|
+
d && !R.current ? (g === void 0 && S(!0), v?.(!0), x.current = !0) : !d && x.current && (x.current = !1, g === void 0 && S(!1), v?.(!1));
|
|
285
|
+
}, m.useEffect(() => {
|
|
286
|
+
if (y === !1 || b !== "vertical") return;
|
|
287
|
+
const d = window.matchMedia(y);
|
|
288
|
+
A.current(d.matches);
|
|
289
|
+
const L = (ee) => A.current(ee.matches);
|
|
290
|
+
return d.addEventListener("change", L), () => d.removeEventListener("change", L);
|
|
291
|
+
}, [y, b]);
|
|
290
292
|
const w = {
|
|
291
293
|
appName: n,
|
|
292
294
|
appFullName: a,
|
|
293
295
|
appIcon: r,
|
|
294
296
|
version: t,
|
|
295
|
-
navGroups:
|
|
296
|
-
onAppNameClick:
|
|
297
|
-
backToPlatformPath:
|
|
298
|
-
onBackToPlatform:
|
|
299
|
-
userMenu:
|
|
300
|
-
}, D = b === "vertical", z = D &&
|
|
301
|
-
return /* @__PURE__ */ e(
|
|
297
|
+
navGroups: s,
|
|
298
|
+
onAppNameClick: u,
|
|
299
|
+
backToPlatformPath: c,
|
|
300
|
+
onBackToPlatform: p,
|
|
301
|
+
userMenu: o
|
|
302
|
+
}, D = b === "vertical", z = D && q === "sidebar", V = !J || C && f && !z;
|
|
303
|
+
return /* @__PURE__ */ e(te, { value: { navVariant: b, collapsed: f, setCollapsed: B, hideNavOnCollapse: C }, children: /* @__PURE__ */ e(ve, { open: Y, onOpenChange: T, children: /* @__PURE__ */ i(
|
|
302
304
|
"div",
|
|
303
305
|
{
|
|
304
306
|
"data-slot": "data-app-shell",
|
|
305
307
|
"data-nav-variant": b,
|
|
306
308
|
"data-collapsed": f || void 0,
|
|
307
|
-
className:
|
|
309
|
+
className: G(D ? "grid h-screen w-full overflow-hidden [grid-template-columns:auto_auto_minmax(0,1fr)] [grid-template-rows:auto_auto_minmax(0,1fr)] [grid-template-areas:'nav_top_top'_'nav_sub_sub'_'nav_side_body']" : "grid h-screen w-full overflow-hidden [grid-template-columns:auto_minmax(0,1fr)] [grid-template-rows:auto_auto_auto_minmax(0,1fr)] [grid-template-areas:'pnav_pnav'_'top_top'_'sub_sub'_'side_body']", X),
|
|
308
310
|
children: [
|
|
309
|
-
!
|
|
310
|
-
|
|
311
|
+
!V && (D ? /* @__PURE__ */ e("div", { className: "[grid-area:nav] min-h-0", children: z ? /* @__PURE__ */ e(
|
|
312
|
+
Ce,
|
|
311
313
|
{
|
|
312
314
|
collapsed: f,
|
|
313
315
|
onCollapsedChange: B,
|
|
314
316
|
...w
|
|
315
317
|
}
|
|
316
|
-
) : /* @__PURE__ */ e(
|
|
318
|
+
) : /* @__PURE__ */ e(_e, { ...w }) }) : /* @__PURE__ */ e("div", { className: "[grid-area:pnav] hidden md:block border-b border-sidebar-border bg-sidebar px-3 py-1.5", children: /* @__PURE__ */ e(
|
|
317
319
|
N,
|
|
318
320
|
{
|
|
319
321
|
variant: "top",
|
|
320
322
|
"aria-label": "Application navigation",
|
|
321
|
-
navGroups:
|
|
323
|
+
navGroups: s,
|
|
322
324
|
header: /* @__PURE__ */ e(k, { ...w, compact: !0, menuSide: "bottom" }),
|
|
323
|
-
user:
|
|
325
|
+
user: o
|
|
324
326
|
}
|
|
325
327
|
) })),
|
|
326
328
|
C && f && !_ && /* @__PURE__ */ e(
|
|
@@ -332,20 +334,20 @@ function Ge({
|
|
|
332
334
|
"aria-label": "Expand navigation",
|
|
333
335
|
className: "absolute left-2 top-2 z-50 shadow-elevation-2",
|
|
334
336
|
onClick: () => B(!1),
|
|
335
|
-
children: /* @__PURE__ */ e(
|
|
337
|
+
children: /* @__PURE__ */ e(re, { className: "w-4 h-4" })
|
|
336
338
|
}
|
|
337
339
|
),
|
|
338
340
|
/* @__PURE__ */ i(
|
|
339
|
-
|
|
341
|
+
xe,
|
|
340
342
|
{
|
|
341
343
|
side: "left",
|
|
342
344
|
showCloseButton: !1,
|
|
343
345
|
className: "p-0 bg-sidebar border-r border-sidebar-border data-[side=left]:w-[220px] data-[side=left]:sm:w-[220px] data-[side=left]:sm:max-w-[220px] flex flex-col",
|
|
344
346
|
children: [
|
|
345
|
-
/* @__PURE__ */ e(
|
|
346
|
-
/* @__PURE__ */ e(
|
|
347
|
+
/* @__PURE__ */ e(we, { className: "sr-only", children: "Navigation" }),
|
|
348
|
+
/* @__PURE__ */ e(Ne, { className: "sr-only", children: "Application navigation menu" }),
|
|
347
349
|
/* @__PURE__ */ e(
|
|
348
|
-
|
|
350
|
+
O,
|
|
349
351
|
{
|
|
350
352
|
compact: !1,
|
|
351
353
|
onAfterNavClick: () => T(!1),
|
|
@@ -357,20 +359,20 @@ function Ge({
|
|
|
357
359
|
),
|
|
358
360
|
_ && /* @__PURE__ */ e("div", { className: "[grid-area:side] min-h-0 flex", children: _ }),
|
|
359
361
|
K && /* @__PURE__ */ e("div", { className: "[grid-area:top] min-w-0", children: /* @__PURE__ */ e(
|
|
360
|
-
|
|
362
|
+
Se,
|
|
361
363
|
{
|
|
362
|
-
breadcrumbs:
|
|
363
|
-
headerLeft:
|
|
364
|
-
headerCenter:
|
|
365
|
-
headerActions:
|
|
366
|
-
mobileTrigger: /* @__PURE__ */ e(
|
|
364
|
+
breadcrumbs: h,
|
|
365
|
+
headerLeft: H,
|
|
366
|
+
headerCenter: P,
|
|
367
|
+
headerActions: $,
|
|
368
|
+
mobileTrigger: /* @__PURE__ */ e(ke, { asChild: !0, children: /* @__PURE__ */ e(
|
|
367
369
|
I,
|
|
368
370
|
{
|
|
369
371
|
variant: "ghost",
|
|
370
372
|
size: "icon",
|
|
371
373
|
"aria-label": "Open navigation menu",
|
|
372
374
|
className: "md:hidden w-7 h-7 shrink-0 text-muted-foreground",
|
|
373
|
-
children: /* @__PURE__ */ e(
|
|
375
|
+
children: /* @__PURE__ */ e(ne, { className: "w-4 h-4" })
|
|
374
376
|
}
|
|
375
377
|
) })
|
|
376
378
|
}
|
|
@@ -382,10 +384,10 @@ function Ge({
|
|
|
382
384
|
{
|
|
383
385
|
"data-slot": "data-app-shell-content",
|
|
384
386
|
className: "flex-1 min-w-0 overflow-auto bg-background",
|
|
385
|
-
children: U
|
|
387
|
+
children: /* @__PURE__ */ e(le, { show: !!l, version: t, commitSha: l, children: U })
|
|
386
388
|
}
|
|
387
389
|
),
|
|
388
|
-
|
|
390
|
+
W
|
|
389
391
|
] })
|
|
390
392
|
]
|
|
391
393
|
}
|
|
@@ -393,6 +395,6 @@ function Ge({
|
|
|
393
395
|
}
|
|
394
396
|
export {
|
|
395
397
|
k as AppHeaderMenu,
|
|
396
|
-
|
|
398
|
+
He as DataAppShell
|
|
397
399
|
};
|
|
398
400
|
//# sourceMappingURL=DataAppShell.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataAppShell.js","sources":["../../../../src/components/composed/DataAppShell/DataAppShell.tsx"],"sourcesContent":["import { ArrowLeft, ChevronRight, Menu } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { ShellCollapseButton } from \"./CollapseButton\";\nimport { DataAppShellPrimaryNav } from \"./PrimaryNav\";\nimport { DataAppShellProvider, type DataAppShellNavVariant } from \"./ShellContext\";\n\nimport type { NavGroup } from \"./PrimaryNav\";\n\nimport { TDPLink } from \"@/components/composed/tdp-link\";\nimport { TopBar } from \"@/components/composed/TopBar\";\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from \"@/components/ui/breadcrumb\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetTitle,\n SheetTrigger,\n} from \"@/components/ui/sheet\";\nimport { cn } from \"@/lib/utils\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n// Nav item types live with the nav engine — re-exported here for back-compat.\nexport type { NavPage, NavGroup } from \"./PrimaryNav\";\n\nexport interface BreadcrumbItemConfig {\n /** Display label */\n label: string;\n /** If provided, renders as a link */\n href?: string;\n /** Click handler (used when no href is provided) */\n onClick?: () => void;\n}\n\nexport interface DataAppShellProps {\n // -- Sidebar --\n /** Application name/abbreviation shown in the logo button */\n appName: string;\n /** Full application name shown in the app dropdown and mobile nav header */\n appFullName?: string;\n /** Custom icon element shown in the logo area */\n appIcon?: React.ReactNode;\n /** Optional version string shown below the app name/icon in the sidebar header */\n version?: string;\n /** Navigation groups; each group contains one or more pages */\n navGroups: NavGroup[];\n /** Callback when the app name / icon is clicked in the dropdown */\n onAppNameClick?: () => void;\n /** TDP path to navigate to when \"Back to TDP Platform\" is clicked (uses TDPLink — requires TdpNavigationProvider) */\n backToPlatformPath?: string;\n /** Fallback callback when \"Back to TDP Platform\" is clicked and no backToPlatformPath is set */\n onBackToPlatform?: () => void;\n /** Slot rendered at the bottom of the sidebar (e.g. user avatar + menu) */\n userMenu?: React.ReactNode;\n\n // -- Top nav --\n /** Breadcrumb items from root to current page */\n breadcrumbs?: BreadcrumbItemConfig[];\n /** Slot rendered after the breadcrumbs in the top bar's left group\n * (e.g. a collapsed horizontal workflow's step dropdown) */\n headerLeft?: React.ReactNode;\n /** Center \"context\" slot in the top bar (e.g. a version / status selector) */\n headerCenter?: React.ReactNode;\n /** Slot for right-side actions in the top nav (e.g. data count pills, next button) */\n headerActions?: React.ReactNode;\n\n // -- Shell zones --\n /** Primary nav axis — `vertical` (sidebar/rail, default) or `horizontal` (top nav row) */\n navVariant?: DataAppShellNavVariant;\n /**\n * Vertical primary nav presentation:\n * - `rail` (default) — permanent 48px icon-only rail.\n * - `sidebar` — collapsible 220px sidebar with labels; its brand-row chevron\n * collapses it to an icon rail (with an expand chevron under the logo),\n * driven by the shell's `collapsed` state.\n */\n primaryNav?: \"rail\" | \"sidebar\";\n /** Slot rendered between the primary nav and the content (e.g. a vertical `DataAppShellSecondaryNav`) */\n sidebarPanel?: React.ReactNode;\n /** Full-width zone between the top bar and the content row (e.g. a horizontal `DataAppShellSecondaryNav`) */\n secondaryBar?: React.ReactNode;\n /** Slot rendered after the content (e.g. a DataAppShellRightPanel) — its FAB anchors to the content row */\n rightPanel?: React.ReactNode;\n /** Show the primary nav zone. Set false to hide it entirely. */\n showNavRail?: boolean; // default true\n /** Show the top bar zone. Set false to hide it entirely. */\n showTopBar?: boolean; // default true\n\n // -- Collapse (vertical nav only) --\n /** Controlled collapse state — drives the secondary zone (via ShellContext)\n * and, with `hideNavOnCollapse`, the primary rail */\n collapsed?: boolean;\n /** Uncontrolled initial collapse state */\n defaultCollapsed?: boolean;\n /** Called whenever the shell collapse state flips */\n onCollapsedChange?: (collapsed: boolean) => void;\n /** Collapsing also hides the primary rail, leaving one icon rail (the secondary\n * nav) with an expand affordance — or a floating expand button if there is none. */\n hideNavOnCollapse?: boolean;\n /** Media query that auto-collapses the shell while it matches.\n * Pass `false` to disable. Defaults to `\"(max-width: 1023px)\"`. */\n autoCollapse?: string | false;\n\n /** Main content area */\n children: React.ReactNode;\n /** Additional className for the root container */\n className?: string;\n}\n\n// =============================================================================\n// Sidebar shared body (used by desktop rail + mobile Sheet)\n// =============================================================================\n\ninterface SidebarBodyProps\n extends Pick<\n DataAppShellProps,\n | \"appName\"\n | \"appFullName\"\n | \"appIcon\"\n | \"version\"\n | \"navGroups\"\n | \"onAppNameClick\"\n | \"backToPlatformPath\"\n | \"onBackToPlatform\"\n | \"userMenu\"\n > {\n /**\n * compact=true → narrow icon rail (48px): icon-only nav buttons, tooltips on hover\n * compact=false → expanded mobile sheet (220px): icon + label side-by-side rows\n */\n compact: boolean;\n /** Called after a nav page item is clicked — used by mobile sheet to close itself */\n onAfterNavClick?: () => void;\n}\n\n// =============================================================================\n// App header menu — logo/name button opening the app dropdown\n// =============================================================================\n\ninterface AppHeaderMenuProps\n extends Pick<\n DataAppShellProps,\n | \"appName\"\n | \"appFullName\"\n | \"appIcon\"\n | \"version\"\n | \"onAppNameClick\"\n | \"backToPlatformPath\"\n | \"onBackToPlatform\"\n > {\n /** compact=true → icon-only trigger (rail); compact=false → icon + name row */\n compact: boolean;\n /** Which side of the trigger the dropdown opens on — `right` beside a rail, `bottom` under a top bar */\n menuSide?: \"right\" | \"bottom\";\n}\n\nfunction AppHeaderMenu({\n appName,\n appFullName,\n appIcon,\n version,\n onAppNameClick,\n backToPlatformPath,\n onBackToPlatform,\n compact,\n menuSide = \"right\",\n}: AppHeaderMenuProps) {\n const logo = (\n <span className=\"flex items-center justify-center rounded-lg bg-sidebar-accent border border-sidebar-border font-bold text-foreground shrink-0 size-8 text-[10px]\">\n {appIcon ?? appName}\n </span>\n );\n\n return (\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n className={cn(\n \"cursor-pointer bg-transparent border-none p-0\",\n !compact && \"flex items-center w-full text-left\"\n )}\n >\n {/* Icon — expanded: centered in the 48px gutter so it lines up with\n the nav icons below; compact: bare, centered by the rail header */}\n {compact ? logo : <span className=\"flex w-12 shrink-0 justify-center\">{logo}</span>}\n\n {/* Name (expanded only — no version here) */}\n {!compact && (\n <span className=\"text-sm font-semibold text-foreground truncate leading-snug\">\n {appFullName ?? appName}\n </span>\n )}\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent side={menuSide} align=\"start\" className=\"min-w-[220px]\">\n <DropdownMenuItem\n className=\"gap-3 px-3 py-2.5\"\n onSelect={() => onAppNameClick?.()}\n >\n <div className=\"w-8 h-8 rounded-lg bg-sidebar-accent border border-sidebar-border flex items-center justify-center shrink-0\">\n <span className=\"text-[10px] font-bold text-foreground\">\n {appIcon ?? appName}\n </span>\n </div>\n <div className=\"flex flex-col min-w-0\">\n <span className=\"text-sm font-semibold text-foreground truncate\">\n {appFullName ?? appName}\n </span>\n {version && (\n <span className=\"text-[10px] text-muted-foreground/70 font-mono leading-none mt-0.5\">\n {version}\n </span>\n )}\n </div>\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem className=\"gap-2.5 p-0\" asChild>\n {backToPlatformPath ? (\n <TDPLink\n path={backToPlatformPath}\n navigationOptions={{ newTab: false }}\n className=\"flex items-center gap-2.5 w-full px-2 py-1.5 !no-underline hover:!no-underline\"\n >\n <ArrowLeft className=\"w-4 h-4 text-muted-foreground\" />\n Back to TDP Platform\n </TDPLink>\n ) : (\n <button\n type=\"button\"\n className=\"flex items-center gap-2.5 w-full px-2 py-1.5 bg-transparent border-none cursor-pointer\"\n onClick={onBackToPlatform}\n >\n <ArrowLeft className=\"w-4 h-4 text-muted-foreground\" />\n Back to TDP Platform\n </button>\n )}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\n// =============================================================================\n// Sidebar shared body — the PrimaryNav engine with the app header + user slots\n// =============================================================================\n\nfunction SidebarBody({\n appName,\n appFullName,\n appIcon,\n version,\n navGroups,\n onAppNameClick,\n backToPlatformPath,\n onBackToPlatform,\n userMenu,\n compact,\n onAfterNavClick,\n}: SidebarBodyProps) {\n return (\n <DataAppShellPrimaryNav\n variant={compact ? \"rail\" : \"sidebar\"}\n aria-label=\"Application navigation\"\n navGroups={navGroups}\n onSelect={() => onAfterNavClick?.()}\n header={\n <AppHeaderMenu\n appName={appName}\n appFullName={appFullName}\n appIcon={appIcon}\n version={version}\n onAppNameClick={onAppNameClick}\n backToPlatformPath={backToPlatformPath}\n onBackToPlatform={onBackToPlatform}\n compact={compact}\n />\n }\n user={userMenu}\n className=\"h-full w-full\"\n />\n );\n}\n\n// =============================================================================\n// Icon rail sidebar (desktop only — hidden on mobile)\n// =============================================================================\n\nfunction IconRailSidebar(props: Omit<SidebarBodyProps, \"compact\" | \"onAfterNavClick\">) {\n return (\n <div\n data-slot=\"data-app-sidebar-rail\"\n className=\"hidden md:flex w-12 flex-col shrink-0 bg-sidebar border-r border-sidebar-border h-full z-50\"\n >\n <SidebarBody compact {...props} />\n </div>\n );\n}\n\n// =============================================================================\n// Collapsible primary sidebar (desktop only — hidden on mobile). Expanded, it\n// shows the app name, labelled nav, and a collapse chevron in the brand row;\n// collapsed, it becomes an icon rail with the expand chevron directly under\n// the logo (mirrors the SW-2118 playground).\n// =============================================================================\n\ninterface PrimarySidebarProps extends Omit<SidebarBodyProps, \"compact\" | \"onAfterNavClick\"> {\n collapsed: boolean;\n onCollapsedChange: (collapsed: boolean) => void;\n}\n\nfunction PrimarySidebar({ collapsed, onCollapsedChange, ...sidebarProps }: PrimarySidebarProps) {\n const { appName, appFullName, appIcon, version, onAppNameClick, backToPlatformPath, onBackToPlatform } =\n sidebarProps;\n const headerMenuProps = {\n appName,\n appFullName,\n appIcon,\n version,\n onAppNameClick,\n backToPlatformPath,\n onBackToPlatform,\n };\n\n if (collapsed) {\n return (\n <div\n data-slot=\"data-app-sidebar-rail\"\n data-collapsed=\"true\"\n className=\"hidden md:flex w-12 flex-col shrink-0 bg-sidebar border-r border-sidebar-border h-full z-50\"\n >\n <DataAppShellPrimaryNav\n variant=\"rail\"\n aria-label=\"Application navigation\"\n navGroups={sidebarProps.navGroups}\n header={\n <div className=\"flex flex-col items-center gap-2\">\n <AppHeaderMenu {...headerMenuProps} compact />\n <ShellCollapseButton\n direction=\"right\"\n label=\"Expand navigation\"\n onClick={() => onCollapsedChange(false)}\n />\n </div>\n }\n user={sidebarProps.userMenu}\n className=\"h-full w-full\"\n />\n </div>\n );\n }\n\n return (\n <div\n data-slot=\"data-app-sidebar\"\n data-collapsed=\"false\"\n className=\"hidden md:flex w-[220px] flex-col shrink-0 bg-sidebar border-r border-sidebar-border h-full z-50\"\n >\n <DataAppShellPrimaryNav\n variant=\"sidebar\"\n aria-label=\"Application navigation\"\n navGroups={sidebarProps.navGroups}\n header={\n <div className=\"flex items-center gap-2 w-full min-w-0\">\n <div className=\"flex-1 min-w-0\">\n <AppHeaderMenu {...headerMenuProps} compact={false} />\n </div>\n <ShellCollapseButton\n direction=\"left\"\n label=\"Collapse navigation\"\n onClick={() => onCollapsedChange(true)}\n />\n </div>\n }\n user={sidebarProps.userMenu}\n className=\"h-full w-full\"\n />\n </div>\n );\n}\n\n// =============================================================================\n// Breadcrumb trail — rendered from the shell's breadcrumb config\n// =============================================================================\n\nfunction TopNavBreadcrumb({ items }: { items: BreadcrumbItemConfig[] }) {\n return (\n // min-w-0 lets the trail shrink inside the top bar's flex-1 left group;\n // flex-nowrap keeps it one line instead of Breadcrumb's default wrap\n // (which, combined with a squeezed left group, wrapped mid-trail and\n // pushed the rest of the top bar around — SW-2118).\n <Breadcrumb className=\"min-w-0\">\n <BreadcrumbList className=\"flex-nowrap min-w-0\">\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n const isClickable = !isLast && (!!item.href || !!item.onClick);\n // Only the current (last) crumb truncates — earlier crumbs keep\n // their natural width so the trail reads left-to-right.\n const itemClassName = isLast ? \"min-w-0\" : \"shrink-0\";\n return (\n <React.Fragment key={`${item.label}-${index}`}>\n {index > 0 && <BreadcrumbSeparator className=\"shrink-0\">/</BreadcrumbSeparator>}\n <BreadcrumbItem className={itemClassName}>\n {isLast ? (\n <BreadcrumbPage className=\"truncate\">{item.label}</BreadcrumbPage>\n ) : isClickable && item.href ? (\n <BreadcrumbLink href={item.href} className=\"whitespace-nowrap\">\n {item.label}\n </BreadcrumbLink>\n ) : isClickable && item.onClick ? (\n <button\n type=\"button\"\n className=\"text-sm text-primary hover:underline cursor-pointer bg-transparent border-none p-0 font-normal whitespace-nowrap\"\n onClick={item.onClick}\n >\n {item.label}\n </button>\n ) : (\n <span className=\"text-sm text-muted-foreground whitespace-nowrap\">\n {item.label}\n </span>\n )}\n </BreadcrumbItem>\n </React.Fragment>\n );\n })}\n </BreadcrumbList>\n </Breadcrumb>\n );\n}\n\n// =============================================================================\n// Top nav — maps shell props onto the reusable TopBar (left/center/right)\n// =============================================================================\n\nfunction TopNav({\n breadcrumbs = [],\n headerLeft,\n headerCenter,\n headerActions,\n mobileTrigger,\n}: {\n breadcrumbs?: BreadcrumbItemConfig[];\n headerLeft?: React.ReactNode;\n headerCenter?: React.ReactNode;\n headerActions?: React.ReactNode;\n mobileTrigger?: React.ReactNode;\n}) {\n return (\n <TopBar\n data-slot=\"data-app-top-nav\"\n left={\n <>\n {/* Mobile hamburger (hidden on md+). shrink-0 — only the\n breadcrumb trail gives up width when the left group is tight. */}\n {mobileTrigger && <div className=\"shrink-0\">{mobileTrigger}</div>}\n <TopNavBreadcrumb items={breadcrumbs} />\n {headerLeft != null && <div className=\"shrink-0\">{headerLeft}</div>}\n </>\n }\n center={headerCenter}\n right={headerActions}\n />\n );\n}\n\n// =============================================================================\n// DataAppShell\n// =============================================================================\n\nfunction DataAppShell({\n appName,\n appFullName,\n appIcon,\n version,\n navGroups,\n onAppNameClick,\n backToPlatformPath,\n onBackToPlatform,\n userMenu,\n breadcrumbs = [],\n headerLeft,\n headerCenter,\n headerActions,\n navVariant = \"vertical\",\n primaryNav = \"rail\",\n sidebarPanel,\n secondaryBar,\n rightPanel,\n showNavRail = true,\n showTopBar = true,\n collapsed: collapsedProp,\n defaultCollapsed = false,\n onCollapsedChange,\n hideNavOnCollapse = false,\n autoCollapse = \"(max-width: 1023px)\",\n children,\n className,\n}: DataAppShellProps) {\n const [mobileNavOpen, setMobileNavOpen] = React.useState(false);\n\n // ── Single collapse toggle (controlled/uncontrolled) ───────────────────────\n const [internalCollapsed, setInternalCollapsed] = React.useState(defaultCollapsed);\n const collapsed = collapsedProp ?? internalCollapsed;\n const collapsedRef = React.useRef(collapsed);\n collapsedRef.current = collapsed;\n // Set when the media query (not the user) collapsed the shell, so leaving\n // the breakpoint restores the expanded state without fighting manual toggles.\n const autoCollapsedRef = React.useRef(false);\n\n const setCollapsed = React.useCallback(\n (next: boolean) => {\n autoCollapsedRef.current = false;\n if (collapsedProp === undefined) setInternalCollapsed(next);\n onCollapsedChange?.(next);\n },\n [collapsedProp, onCollapsedChange],\n );\n\n // ── Responsive auto-collapse below the breakpoint ───────────────────────────\n // The media-query handler lives in a ref so the subscription survives\n // re-renders without re-running for every collapse/callback change.\n const applyAutoCollapseRef = React.useRef((matches: boolean) => void matches);\n applyAutoCollapseRef.current = (matches: boolean) => {\n if (matches && !collapsedRef.current) {\n if (collapsedProp === undefined) setInternalCollapsed(true);\n onCollapsedChange?.(true);\n autoCollapsedRef.current = true;\n } else if (!matches && autoCollapsedRef.current) {\n autoCollapsedRef.current = false;\n if (collapsedProp === undefined) setInternalCollapsed(false);\n onCollapsedChange?.(false);\n }\n };\n\n React.useEffect(() => {\n if (autoCollapse === false || navVariant !== \"vertical\") return;\n const mql = window.matchMedia(autoCollapse);\n applyAutoCollapseRef.current(mql.matches);\n const onChange = (e: MediaQueryListEvent) => applyAutoCollapseRef.current(e.matches);\n mql.addEventListener(\"change\", onChange);\n return () => mql.removeEventListener(\"change\", onChange);\n }, [autoCollapse, navVariant]);\n\n const sidebarProps = {\n appName,\n appFullName,\n appIcon,\n version,\n navGroups,\n onAppNameClick,\n backToPlatformPath,\n onBackToPlatform,\n userMenu,\n };\n\n const isVertical = navVariant === \"vertical\";\n // A collapsible sidebar renders its own collapsed rail, so it is never\n // hidden by collapse. hideNavOnCollapse only removes the permanent icon rail.\n const isCollapsibleSidebar = isVertical && primaryNav === \"sidebar\";\n const navHidden =\n !showNavRail || (hideNavOnCollapse && collapsed && !isCollapsibleSidebar);\n\n // CSS-grid template areas per navVariant — the shell knows zones, never\n // domain concepts. Zones absent from the tree simply collapse their track.\n // The secondary (side) zone starts below the top bar / secondary bar, so\n // breadcrumbs span the full width beside the primary nav.\n const gridClass = isVertical\n ? \"grid h-screen w-full overflow-hidden [grid-template-columns:auto_auto_minmax(0,1fr)] [grid-template-rows:auto_auto_minmax(0,1fr)] [grid-template-areas:'nav_top_top'_'nav_sub_sub'_'nav_side_body']\"\n : \"grid h-screen w-full overflow-hidden [grid-template-columns:auto_minmax(0,1fr)] [grid-template-rows:auto_auto_auto_minmax(0,1fr)] [grid-template-areas:'pnav_pnav'_'top_top'_'sub_sub'_'side_body']\";\n\n return (\n <DataAppShellProvider value={{ navVariant, collapsed, setCollapsed, hideNavOnCollapse }}>\n <Sheet open={mobileNavOpen} onOpenChange={setMobileNavOpen}>\n <div\n data-slot=\"data-app-shell\"\n data-nav-variant={navVariant}\n data-collapsed={collapsed || undefined}\n className={cn(gridClass, className)}\n >\n {/* Primary nav zone */}\n {!navHidden &&\n (isVertical ? (\n <div className=\"[grid-area:nav] min-h-0\">\n {isCollapsibleSidebar ? (\n <PrimarySidebar\n collapsed={collapsed}\n onCollapsedChange={setCollapsed}\n {...sidebarProps}\n />\n ) : (\n <IconRailSidebar {...sidebarProps} />\n )}\n </div>\n ) : (\n <div className=\"[grid-area:pnav] hidden md:block border-b border-sidebar-border bg-sidebar px-3 py-1.5\">\n <DataAppShellPrimaryNav\n variant=\"top\"\n aria-label=\"Application navigation\"\n navGroups={navGroups}\n header={<AppHeaderMenu {...sidebarProps} compact menuSide=\"bottom\" />}\n user={userMenu}\n />\n </div>\n ))}\n\n {/* Floating expand affordance — hideNavOnCollapse with no secondary rail */}\n {hideNavOnCollapse && collapsed && !sidebarPanel && (\n <Button\n data-slot=\"data-app-shell-expand-fab\"\n variant=\"outline\"\n size=\"icon-sm\"\n aria-label=\"Expand navigation\"\n className=\"absolute left-2 top-2 z-50 shadow-elevation-2\"\n onClick={() => setCollapsed(false)}\n >\n <ChevronRight className=\"w-4 h-4\" />\n </Button>\n )}\n\n {/* Mobile sidebar Sheet */}\n <SheetContent\n side=\"left\"\n showCloseButton={false}\n className=\"p-0 bg-sidebar border-r border-sidebar-border data-[side=left]:w-[220px] data-[side=left]:sm:w-[220px] data-[side=left]:sm:max-w-[220px] flex flex-col\"\n >\n <SheetTitle className=\"sr-only\">Navigation</SheetTitle>\n <SheetDescription className=\"sr-only\">\n Application navigation menu\n </SheetDescription>\n <SidebarBody\n compact={false}\n onAfterNavClick={() => setMobileNavOpen(false)}\n {...sidebarProps}\n />\n </SheetContent>\n\n {/* Secondary (side) zone — e.g. a vertical DataAppShellSecondaryNav */}\n {sidebarPanel && <div className=\"[grid-area:side] min-h-0 flex\">{sidebarPanel}</div>}\n\n {/* Top bar zone */}\n {showTopBar && (\n <div className=\"[grid-area:top] min-w-0\">\n <TopNav\n breadcrumbs={breadcrumbs}\n headerLeft={headerLeft}\n headerCenter={headerCenter}\n headerActions={headerActions}\n mobileTrigger={\n <SheetTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Open navigation menu\"\n className=\"md:hidden w-7 h-7 shrink-0 text-muted-foreground\"\n >\n <Menu className=\"w-4 h-4\" />\n </Button>\n </SheetTrigger>\n }\n />\n </div>\n )}\n\n {/* Secondary bar zone — e.g. a horizontal DataAppShellSecondaryNav */}\n {secondaryBar && <div className=\"[grid-area:sub] min-w-0\">{secondaryBar}</div>}\n\n {/* Body zone: content + right panel. relative — anchors the right\n panel's floating FAB trigger */}\n <div className=\"[grid-area:body] relative flex min-h-0 min-w-0 overflow-hidden\">\n <main\n data-slot=\"data-app-shell-content\"\n className=\"flex-1 min-w-0 overflow-auto bg-background\"\n >\n {children}\n </main>\n\n {/* Right panel slot (e.g. DataAppShellRightPanel) */}\n {rightPanel}\n </div>\n </div>\n </Sheet>\n </DataAppShellProvider>\n );\n}\n\nexport default DataAppShell;\nexport { AppHeaderMenu, DataAppShell };\n"],"names":["AppHeaderMenu","appName","appFullName","appIcon","version","onAppNameClick","backToPlatformPath","onBackToPlatform","compact","menuSide","logo","jsx","jsxs","DropdownMenu","DropdownMenuTrigger","cn","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","TDPLink","ArrowLeft","SidebarBody","navGroups","userMenu","onAfterNavClick","DataAppShellPrimaryNav","IconRailSidebar","props","PrimarySidebar","collapsed","onCollapsedChange","sidebarProps","headerMenuProps","ShellCollapseButton","TopNavBreadcrumb","items","Breadcrumb","BreadcrumbList","item","index","isLast","isClickable","itemClassName","React","BreadcrumbSeparator","BreadcrumbItem","BreadcrumbPage","BreadcrumbLink","TopNav","breadcrumbs","headerLeft","headerCenter","headerActions","mobileTrigger","TopBar","Fragment","DataAppShell","navVariant","primaryNav","sidebarPanel","secondaryBar","rightPanel","showNavRail","showTopBar","collapsedProp","defaultCollapsed","hideNavOnCollapse","autoCollapse","children","className","mobileNavOpen","setMobileNavOpen","internalCollapsed","setInternalCollapsed","collapsedRef","autoCollapsedRef","setCollapsed","next","applyAutoCollapseRef","matches","mql","onChange","e","isVertical","isCollapsibleSidebar","navHidden","DataAppShellProvider","Sheet","Button","ChevronRight","SheetContent","SheetTitle","SheetDescription","SheetTrigger","Menu"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DataAppShell.js","sources":["../../../../src/components/composed/DataAppShell/DataAppShell.tsx"],"sourcesContent":["import { ArrowLeft, ChevronRight, Menu } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { ShellCollapseButton } from \"./CollapseButton\";\nimport { DataAppShellPrimaryNav } from \"./PrimaryNav\";\nimport { DataAppShellProvider, type DataAppShellNavVariant } from \"./ShellContext\";\n\nimport type { NavGroup } from \"./PrimaryNav\";\n\nimport { WithBuildInfoFooter } from \"@/components/composed/BuildInfoFooter/BuildInfoFooter\";\nimport { TDPLink } from \"@/components/composed/tdp-link\";\nimport { TopBar } from \"@/components/composed/TopBar\";\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from \"@/components/ui/breadcrumb\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetTitle,\n SheetTrigger,\n} from \"@/components/ui/sheet\";\nimport { cn } from \"@/lib/utils\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n// Nav item types live with the nav engine — re-exported here for back-compat.\nexport type { NavPage, NavGroup } from \"./PrimaryNav\";\n\nexport interface BreadcrumbItemConfig {\n /** Display label */\n label: string;\n /** If provided, renders as a link */\n href?: string;\n /** Click handler (used when no href is provided) */\n onClick?: () => void;\n}\n\nexport interface DataAppShellProps {\n // -- Sidebar --\n /** Application name/abbreviation shown in the logo button */\n appName: string;\n /** Full application name shown in the app dropdown and mobile nav header */\n appFullName?: string;\n /** Custom icon element shown in the logo area */\n appIcon?: React.ReactNode;\n /** Optional version string shown below the app name/icon in the sidebar header */\n version?: string;\n /** Short commit SHA. When set, a build-info footer (version + SHA) renders below the content */\n commitSha?: string;\n /** Navigation groups; each group contains one or more pages */\n navGroups: NavGroup[];\n /** Callback when the app name / icon is clicked in the dropdown */\n onAppNameClick?: () => void;\n /** TDP path to navigate to when \"Back to TDP Platform\" is clicked (uses TDPLink — requires TdpNavigationProvider) */\n backToPlatformPath?: string;\n /** Fallback callback when \"Back to TDP Platform\" is clicked and no backToPlatformPath is set */\n onBackToPlatform?: () => void;\n /** Slot rendered at the bottom of the sidebar (e.g. user avatar + menu) */\n userMenu?: React.ReactNode;\n\n // -- Top nav --\n /** Breadcrumb items from root to current page */\n breadcrumbs?: BreadcrumbItemConfig[];\n /** Slot rendered after the breadcrumbs in the top bar's left group\n * (e.g. a collapsed horizontal workflow's step dropdown) */\n headerLeft?: React.ReactNode;\n /** Center \"context\" slot in the top bar (e.g. a version / status selector) */\n headerCenter?: React.ReactNode;\n /** Slot for right-side actions in the top nav (e.g. data count pills, next button) */\n headerActions?: React.ReactNode;\n\n // -- Shell zones --\n /** Primary nav axis — `vertical` (sidebar/rail, default) or `horizontal` (top nav row) */\n navVariant?: DataAppShellNavVariant;\n /**\n * Vertical primary nav presentation:\n * - `rail` (default) — permanent 48px icon-only rail.\n * - `sidebar` — collapsible 220px sidebar with labels; its brand-row chevron\n * collapses it to an icon rail (with an expand chevron under the logo),\n * driven by the shell's `collapsed` state.\n */\n primaryNav?: \"rail\" | \"sidebar\";\n /** Slot rendered between the primary nav and the content (e.g. a vertical `DataAppShellSecondaryNav`) */\n sidebarPanel?: React.ReactNode;\n /** Full-width zone between the top bar and the content row (e.g. a horizontal `DataAppShellSecondaryNav`) */\n secondaryBar?: React.ReactNode;\n /** Slot rendered after the content (e.g. a DataAppShellRightPanel) — its FAB anchors to the content row */\n rightPanel?: React.ReactNode;\n /** Show the primary nav zone. Set false to hide it entirely. */\n showNavRail?: boolean; // default true\n /** Show the top bar zone. Set false to hide it entirely. */\n showTopBar?: boolean; // default true\n\n // -- Collapse (vertical nav only) --\n /** Controlled collapse state — drives the secondary zone (via ShellContext)\n * and, with `hideNavOnCollapse`, the primary rail */\n collapsed?: boolean;\n /** Uncontrolled initial collapse state */\n defaultCollapsed?: boolean;\n /** Called whenever the shell collapse state flips */\n onCollapsedChange?: (collapsed: boolean) => void;\n /** Collapsing also hides the primary rail, leaving one icon rail (the secondary\n * nav) with an expand affordance — or a floating expand button if there is none. */\n hideNavOnCollapse?: boolean;\n /** Media query that auto-collapses the shell while it matches.\n * Pass `false` to disable. Defaults to `\"(max-width: 1023px)\"`. */\n autoCollapse?: string | false;\n\n /** Main content area */\n children: React.ReactNode;\n /** Additional className for the root container */\n className?: string;\n}\n\n// =============================================================================\n// Sidebar shared body (used by desktop rail + mobile Sheet)\n// =============================================================================\n\ninterface SidebarBodyProps\n extends Pick<\n DataAppShellProps,\n | \"appName\"\n | \"appFullName\"\n | \"appIcon\"\n | \"version\"\n | \"navGroups\"\n | \"onAppNameClick\"\n | \"backToPlatformPath\"\n | \"onBackToPlatform\"\n | \"userMenu\"\n > {\n /**\n * compact=true → narrow icon rail (48px): icon-only nav buttons, tooltips on hover\n * compact=false → expanded mobile sheet (220px): icon + label side-by-side rows\n */\n compact: boolean;\n /** Called after a nav page item is clicked — used by mobile sheet to close itself */\n onAfterNavClick?: () => void;\n}\n\n// =============================================================================\n// App header menu — logo/name button opening the app dropdown\n// =============================================================================\n\ninterface AppHeaderMenuProps\n extends Pick<\n DataAppShellProps,\n | \"appName\"\n | \"appFullName\"\n | \"appIcon\"\n | \"version\"\n | \"onAppNameClick\"\n | \"backToPlatformPath\"\n | \"onBackToPlatform\"\n > {\n /** compact=true → icon-only trigger (rail); compact=false → icon + name row */\n compact: boolean;\n /** Which side of the trigger the dropdown opens on — `right` beside a rail, `bottom` under a top bar */\n menuSide?: \"right\" | \"bottom\";\n}\n\nfunction AppHeaderMenu({\n appName,\n appFullName,\n appIcon,\n version,\n onAppNameClick,\n backToPlatformPath,\n onBackToPlatform,\n compact,\n menuSide = \"right\",\n}: AppHeaderMenuProps) {\n const logo = (\n <span className=\"flex items-center justify-center rounded-lg bg-sidebar-accent border border-sidebar-border font-bold text-foreground shrink-0 size-8 text-[10px]\">\n {appIcon ?? appName}\n </span>\n );\n\n return (\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n className={cn(\n \"cursor-pointer bg-transparent border-none p-0\",\n !compact && \"flex items-center w-full text-left\"\n )}\n >\n {/* Icon — expanded: centered in the 48px gutter so it lines up with\n the nav icons below; compact: bare, centered by the rail header */}\n {compact ? logo : <span className=\"flex w-12 shrink-0 justify-center\">{logo}</span>}\n\n {/* Name (expanded only — no version here) */}\n {!compact && (\n <span className=\"text-sm font-semibold text-foreground truncate leading-snug\">\n {appFullName ?? appName}\n </span>\n )}\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent side={menuSide} align=\"start\" className=\"min-w-[220px]\">\n <DropdownMenuItem\n className=\"gap-3 px-3 py-2.5\"\n onSelect={() => onAppNameClick?.()}\n >\n <div className=\"w-8 h-8 rounded-lg bg-sidebar-accent border border-sidebar-border flex items-center justify-center shrink-0\">\n <span className=\"text-[10px] font-bold text-foreground\">\n {appIcon ?? appName}\n </span>\n </div>\n <div className=\"flex flex-col min-w-0\">\n <span className=\"text-sm font-semibold text-foreground truncate\">\n {appFullName ?? appName}\n </span>\n {version && (\n <span className=\"text-[10px] text-muted-foreground/70 font-mono leading-none mt-0.5\">\n {version}\n </span>\n )}\n </div>\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem className=\"gap-2.5 p-0\" asChild>\n {backToPlatformPath ? (\n <TDPLink\n path={backToPlatformPath}\n navigationOptions={{ newTab: false }}\n className=\"flex items-center gap-2.5 w-full px-2 py-1.5 !no-underline hover:!no-underline\"\n >\n <ArrowLeft className=\"w-4 h-4 text-muted-foreground\" />\n Back to TDP Platform\n </TDPLink>\n ) : (\n <button\n type=\"button\"\n className=\"flex items-center gap-2.5 w-full px-2 py-1.5 bg-transparent border-none cursor-pointer\"\n onClick={onBackToPlatform}\n >\n <ArrowLeft className=\"w-4 h-4 text-muted-foreground\" />\n Back to TDP Platform\n </button>\n )}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\n// =============================================================================\n// Sidebar shared body — the PrimaryNav engine with the app header + user slots\n// =============================================================================\n\nfunction SidebarBody({\n appName,\n appFullName,\n appIcon,\n version,\n navGroups,\n onAppNameClick,\n backToPlatformPath,\n onBackToPlatform,\n userMenu,\n compact,\n onAfterNavClick,\n}: SidebarBodyProps) {\n return (\n <DataAppShellPrimaryNav\n variant={compact ? \"rail\" : \"sidebar\"}\n aria-label=\"Application navigation\"\n navGroups={navGroups}\n onSelect={() => onAfterNavClick?.()}\n header={\n <AppHeaderMenu\n appName={appName}\n appFullName={appFullName}\n appIcon={appIcon}\n version={version}\n onAppNameClick={onAppNameClick}\n backToPlatformPath={backToPlatformPath}\n onBackToPlatform={onBackToPlatform}\n compact={compact}\n />\n }\n user={userMenu}\n className=\"h-full w-full\"\n />\n );\n}\n\n// =============================================================================\n// Icon rail sidebar (desktop only — hidden on mobile)\n// =============================================================================\n\nfunction IconRailSidebar(props: Omit<SidebarBodyProps, \"compact\" | \"onAfterNavClick\">) {\n return (\n <div\n data-slot=\"data-app-sidebar-rail\"\n className=\"hidden md:flex w-12 flex-col shrink-0 bg-sidebar border-r border-sidebar-border h-full z-50\"\n >\n <SidebarBody compact {...props} />\n </div>\n );\n}\n\n// =============================================================================\n// Collapsible primary sidebar (desktop only — hidden on mobile). Expanded, it\n// shows the app name, labelled nav, and a collapse chevron in the brand row;\n// collapsed, it becomes an icon rail with the expand chevron directly under\n// the logo (mirrors the SW-2118 playground).\n// =============================================================================\n\ninterface PrimarySidebarProps extends Omit<SidebarBodyProps, \"compact\" | \"onAfterNavClick\"> {\n collapsed: boolean;\n onCollapsedChange: (collapsed: boolean) => void;\n}\n\nfunction PrimarySidebar({ collapsed, onCollapsedChange, ...sidebarProps }: PrimarySidebarProps) {\n const { appName, appFullName, appIcon, version, onAppNameClick, backToPlatformPath, onBackToPlatform } =\n sidebarProps;\n const headerMenuProps = {\n appName,\n appFullName,\n appIcon,\n version,\n onAppNameClick,\n backToPlatformPath,\n onBackToPlatform,\n };\n\n if (collapsed) {\n return (\n <div\n data-slot=\"data-app-sidebar-rail\"\n data-collapsed=\"true\"\n className=\"hidden md:flex w-12 flex-col shrink-0 bg-sidebar border-r border-sidebar-border h-full z-50\"\n >\n <DataAppShellPrimaryNav\n variant=\"rail\"\n aria-label=\"Application navigation\"\n navGroups={sidebarProps.navGroups}\n header={\n <div className=\"flex flex-col items-center gap-2\">\n <AppHeaderMenu {...headerMenuProps} compact />\n <ShellCollapseButton\n direction=\"right\"\n label=\"Expand navigation\"\n onClick={() => onCollapsedChange(false)}\n />\n </div>\n }\n user={sidebarProps.userMenu}\n className=\"h-full w-full\"\n />\n </div>\n );\n }\n\n return (\n <div\n data-slot=\"data-app-sidebar\"\n data-collapsed=\"false\"\n className=\"hidden md:flex w-[220px] flex-col shrink-0 bg-sidebar border-r border-sidebar-border h-full z-50\"\n >\n <DataAppShellPrimaryNav\n variant=\"sidebar\"\n aria-label=\"Application navigation\"\n navGroups={sidebarProps.navGroups}\n header={\n <div className=\"flex items-center gap-2 w-full min-w-0\">\n <div className=\"flex-1 min-w-0\">\n <AppHeaderMenu {...headerMenuProps} compact={false} />\n </div>\n <ShellCollapseButton\n direction=\"left\"\n label=\"Collapse navigation\"\n onClick={() => onCollapsedChange(true)}\n />\n </div>\n }\n user={sidebarProps.userMenu}\n className=\"h-full w-full\"\n />\n </div>\n );\n}\n\n// =============================================================================\n// Breadcrumb trail — rendered from the shell's breadcrumb config\n// =============================================================================\n\nfunction TopNavBreadcrumb({ items }: { items: BreadcrumbItemConfig[] }) {\n return (\n // min-w-0 lets the trail shrink inside the top bar's flex-1 left group;\n // flex-nowrap keeps it one line instead of Breadcrumb's default wrap\n // (which, combined with a squeezed left group, wrapped mid-trail and\n // pushed the rest of the top bar around — SW-2118).\n <Breadcrumb className=\"min-w-0\">\n <BreadcrumbList className=\"flex-nowrap min-w-0\">\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n const isClickable = !isLast && (!!item.href || !!item.onClick);\n // Only the current (last) crumb truncates — earlier crumbs keep\n // their natural width so the trail reads left-to-right.\n const itemClassName = isLast ? \"min-w-0\" : \"shrink-0\";\n return (\n <React.Fragment key={`${item.label}-${index}`}>\n {index > 0 && <BreadcrumbSeparator className=\"shrink-0\">/</BreadcrumbSeparator>}\n <BreadcrumbItem className={itemClassName}>\n {isLast ? (\n <BreadcrumbPage className=\"truncate\">{item.label}</BreadcrumbPage>\n ) : isClickable && item.href ? (\n <BreadcrumbLink href={item.href} className=\"whitespace-nowrap\">\n {item.label}\n </BreadcrumbLink>\n ) : isClickable && item.onClick ? (\n <button\n type=\"button\"\n className=\"text-sm text-primary hover:underline cursor-pointer bg-transparent border-none p-0 font-normal whitespace-nowrap\"\n onClick={item.onClick}\n >\n {item.label}\n </button>\n ) : (\n <span className=\"text-sm text-muted-foreground whitespace-nowrap\">\n {item.label}\n </span>\n )}\n </BreadcrumbItem>\n </React.Fragment>\n );\n })}\n </BreadcrumbList>\n </Breadcrumb>\n );\n}\n\n// =============================================================================\n// Top nav — maps shell props onto the reusable TopBar (left/center/right)\n// =============================================================================\n\nfunction TopNav({\n breadcrumbs = [],\n headerLeft,\n headerCenter,\n headerActions,\n mobileTrigger,\n}: {\n breadcrumbs?: BreadcrumbItemConfig[];\n headerLeft?: React.ReactNode;\n headerCenter?: React.ReactNode;\n headerActions?: React.ReactNode;\n mobileTrigger?: React.ReactNode;\n}) {\n return (\n <TopBar\n data-slot=\"data-app-top-nav\"\n left={\n <>\n {/* Mobile hamburger (hidden on md+). shrink-0 — only the\n breadcrumb trail gives up width when the left group is tight. */}\n {mobileTrigger && <div className=\"shrink-0\">{mobileTrigger}</div>}\n <TopNavBreadcrumb items={breadcrumbs} />\n {headerLeft != null && <div className=\"shrink-0\">{headerLeft}</div>}\n </>\n }\n center={headerCenter}\n right={headerActions}\n />\n );\n}\n\n// =============================================================================\n// DataAppShell\n// =============================================================================\n\nfunction DataAppShell({\n appName,\n appFullName,\n appIcon,\n version,\n commitSha,\n navGroups,\n onAppNameClick,\n backToPlatformPath,\n onBackToPlatform,\n userMenu,\n breadcrumbs = [],\n headerLeft,\n headerCenter,\n headerActions,\n navVariant = \"vertical\",\n primaryNav = \"rail\",\n sidebarPanel,\n secondaryBar,\n rightPanel,\n showNavRail = true,\n showTopBar = true,\n collapsed: collapsedProp,\n defaultCollapsed = false,\n onCollapsedChange,\n hideNavOnCollapse = false,\n autoCollapse = \"(max-width: 1023px)\",\n children,\n className,\n}: DataAppShellProps) {\n const [mobileNavOpen, setMobileNavOpen] = React.useState(false);\n\n // ── Single collapse toggle (controlled/uncontrolled) ───────────────────────\n const [internalCollapsed, setInternalCollapsed] = React.useState(defaultCollapsed);\n const collapsed = collapsedProp ?? internalCollapsed;\n const collapsedRef = React.useRef(collapsed);\n collapsedRef.current = collapsed;\n // Set when the media query (not the user) collapsed the shell, so leaving\n // the breakpoint restores the expanded state without fighting manual toggles.\n const autoCollapsedRef = React.useRef(false);\n\n const setCollapsed = React.useCallback(\n (next: boolean) => {\n autoCollapsedRef.current = false;\n if (collapsedProp === undefined) setInternalCollapsed(next);\n onCollapsedChange?.(next);\n },\n [collapsedProp, onCollapsedChange],\n );\n\n // ── Responsive auto-collapse below the breakpoint ───────────────────────────\n // The media-query handler lives in a ref so the subscription survives\n // re-renders without re-running for every collapse/callback change.\n const applyAutoCollapseRef = React.useRef((matches: boolean) => void matches);\n applyAutoCollapseRef.current = (matches: boolean) => {\n if (matches && !collapsedRef.current) {\n if (collapsedProp === undefined) setInternalCollapsed(true);\n onCollapsedChange?.(true);\n autoCollapsedRef.current = true;\n } else if (!matches && autoCollapsedRef.current) {\n autoCollapsedRef.current = false;\n if (collapsedProp === undefined) setInternalCollapsed(false);\n onCollapsedChange?.(false);\n }\n };\n\n React.useEffect(() => {\n if (autoCollapse === false || navVariant !== \"vertical\") return;\n const mql = window.matchMedia(autoCollapse);\n applyAutoCollapseRef.current(mql.matches);\n const onChange = (e: MediaQueryListEvent) => applyAutoCollapseRef.current(e.matches);\n mql.addEventListener(\"change\", onChange);\n return () => mql.removeEventListener(\"change\", onChange);\n }, [autoCollapse, navVariant]);\n\n const sidebarProps = {\n appName,\n appFullName,\n appIcon,\n version,\n navGroups,\n onAppNameClick,\n backToPlatformPath,\n onBackToPlatform,\n userMenu,\n };\n\n const isVertical = navVariant === \"vertical\";\n // A collapsible sidebar renders its own collapsed rail, so it is never\n // hidden by collapse. hideNavOnCollapse only removes the permanent icon rail.\n const isCollapsibleSidebar = isVertical && primaryNav === \"sidebar\";\n const navHidden =\n !showNavRail || (hideNavOnCollapse && collapsed && !isCollapsibleSidebar);\n\n // CSS-grid template areas per navVariant — the shell knows zones, never\n // domain concepts. Zones absent from the tree simply collapse their track.\n // The secondary (side) zone starts below the top bar / secondary bar, so\n // breadcrumbs span the full width beside the primary nav.\n const gridClass = isVertical\n ? \"grid h-screen w-full overflow-hidden [grid-template-columns:auto_auto_minmax(0,1fr)] [grid-template-rows:auto_auto_minmax(0,1fr)] [grid-template-areas:'nav_top_top'_'nav_sub_sub'_'nav_side_body']\"\n : \"grid h-screen w-full overflow-hidden [grid-template-columns:auto_minmax(0,1fr)] [grid-template-rows:auto_auto_auto_minmax(0,1fr)] [grid-template-areas:'pnav_pnav'_'top_top'_'sub_sub'_'side_body']\";\n\n return (\n <DataAppShellProvider value={{ navVariant, collapsed, setCollapsed, hideNavOnCollapse }}>\n <Sheet open={mobileNavOpen} onOpenChange={setMobileNavOpen}>\n <div\n data-slot=\"data-app-shell\"\n data-nav-variant={navVariant}\n data-collapsed={collapsed || undefined}\n className={cn(gridClass, className)}\n >\n {/* Primary nav zone */}\n {!navHidden &&\n (isVertical ? (\n <div className=\"[grid-area:nav] min-h-0\">\n {isCollapsibleSidebar ? (\n <PrimarySidebar\n collapsed={collapsed}\n onCollapsedChange={setCollapsed}\n {...sidebarProps}\n />\n ) : (\n <IconRailSidebar {...sidebarProps} />\n )}\n </div>\n ) : (\n <div className=\"[grid-area:pnav] hidden md:block border-b border-sidebar-border bg-sidebar px-3 py-1.5\">\n <DataAppShellPrimaryNav\n variant=\"top\"\n aria-label=\"Application navigation\"\n navGroups={navGroups}\n header={<AppHeaderMenu {...sidebarProps} compact menuSide=\"bottom\" />}\n user={userMenu}\n />\n </div>\n ))}\n\n {/* Floating expand affordance — hideNavOnCollapse with no secondary rail */}\n {hideNavOnCollapse && collapsed && !sidebarPanel && (\n <Button\n data-slot=\"data-app-shell-expand-fab\"\n variant=\"outline\"\n size=\"icon-sm\"\n aria-label=\"Expand navigation\"\n className=\"absolute left-2 top-2 z-50 shadow-elevation-2\"\n onClick={() => setCollapsed(false)}\n >\n <ChevronRight className=\"w-4 h-4\" />\n </Button>\n )}\n\n {/* Mobile sidebar Sheet */}\n <SheetContent\n side=\"left\"\n showCloseButton={false}\n className=\"p-0 bg-sidebar border-r border-sidebar-border data-[side=left]:w-[220px] data-[side=left]:sm:w-[220px] data-[side=left]:sm:max-w-[220px] flex flex-col\"\n >\n <SheetTitle className=\"sr-only\">Navigation</SheetTitle>\n <SheetDescription className=\"sr-only\">\n Application navigation menu\n </SheetDescription>\n <SidebarBody\n compact={false}\n onAfterNavClick={() => setMobileNavOpen(false)}\n {...sidebarProps}\n />\n </SheetContent>\n\n {/* Secondary (side) zone — e.g. a vertical DataAppShellSecondaryNav */}\n {sidebarPanel && <div className=\"[grid-area:side] min-h-0 flex\">{sidebarPanel}</div>}\n\n {/* Top bar zone */}\n {showTopBar && (\n <div className=\"[grid-area:top] min-w-0\">\n <TopNav\n breadcrumbs={breadcrumbs}\n headerLeft={headerLeft}\n headerCenter={headerCenter}\n headerActions={headerActions}\n mobileTrigger={\n <SheetTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Open navigation menu\"\n className=\"md:hidden w-7 h-7 shrink-0 text-muted-foreground\"\n >\n <Menu className=\"w-4 h-4\" />\n </Button>\n </SheetTrigger>\n }\n />\n </div>\n )}\n\n {/* Secondary bar zone — e.g. a horizontal DataAppShellSecondaryNav */}\n {secondaryBar && <div className=\"[grid-area:sub] min-w-0\">{secondaryBar}</div>}\n\n {/* Body zone: content + right panel. relative — anchors the right\n panel's floating FAB trigger */}\n <div className=\"[grid-area:body] relative flex min-h-0 min-w-0 overflow-hidden\">\n <main\n data-slot=\"data-app-shell-content\"\n className=\"flex-1 min-w-0 overflow-auto bg-background\"\n >\n <WithBuildInfoFooter show={Boolean(commitSha)} version={version} commitSha={commitSha}>\n {children}\n </WithBuildInfoFooter>\n </main>\n\n {/* Right panel slot (e.g. DataAppShellRightPanel) */}\n {rightPanel}\n </div>\n </div>\n </Sheet>\n </DataAppShellProvider>\n );\n}\n\nexport default DataAppShell;\nexport { AppHeaderMenu, DataAppShell };\n"],"names":["AppHeaderMenu","appName","appFullName","appIcon","version","onAppNameClick","backToPlatformPath","onBackToPlatform","compact","menuSide","logo","jsx","jsxs","DropdownMenu","DropdownMenuTrigger","cn","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","TDPLink","ArrowLeft","SidebarBody","navGroups","userMenu","onAfterNavClick","DataAppShellPrimaryNav","IconRailSidebar","props","PrimarySidebar","collapsed","onCollapsedChange","sidebarProps","headerMenuProps","ShellCollapseButton","TopNavBreadcrumb","items","Breadcrumb","BreadcrumbList","item","index","isLast","isClickable","itemClassName","React","BreadcrumbSeparator","BreadcrumbItem","BreadcrumbPage","BreadcrumbLink","TopNav","breadcrumbs","headerLeft","headerCenter","headerActions","mobileTrigger","TopBar","Fragment","DataAppShell","commitSha","navVariant","primaryNav","sidebarPanel","secondaryBar","rightPanel","showNavRail","showTopBar","collapsedProp","defaultCollapsed","hideNavOnCollapse","autoCollapse","children","className","mobileNavOpen","setMobileNavOpen","internalCollapsed","setInternalCollapsed","collapsedRef","autoCollapsedRef","setCollapsed","next","applyAutoCollapseRef","matches","mql","onChange","e","isVertical","isCollapsibleSidebar","navHidden","DataAppShellProvider","Sheet","Button","ChevronRight","SheetContent","SheetTitle","SheetDescription","SheetTrigger","Menu","WithBuildInfoFooter"],"mappings":";;;;;;;;;;;;;;AAiLA,SAASA,EAAc;AAAA,EACrB,SAAAC;AAAA,EACA,aAAAC;AAAA,EACA,SAAAC;AAAA,EACA,SAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC,IAAW;AACb,GAAuB;AACrB,QAAMC,IACJ,gBAAAC,EAAC,QAAA,EAAK,WAAU,oJACb,eAAWV,GACd;AAGF,SACE,gBAAAW,EAACC,IAAA,EAAa,OAAO,IACf,UAAA;AAAA,IAAA,gBAAAF,EAACG,IAAA,EAAoB,SAAO,IAC1B,UAAA,gBAAAF;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAWG;AAAA,UACT;AAAA,UACA,CAACP,KAAW;AAAA,QAAA;AAAA,QAKb,UAAA;AAAA,UAAAA,IAAUE,IAAO,gBAAAC,EAAC,QAAA,EAAK,WAAU,qCAAqC,UAAAD,GAAK;AAAA,UAG3E,CAACF,KACA,gBAAAG,EAAC,UAAK,WAAU,+DACb,eAAeV,EAAA,CAClB;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,GAGN;AAAA,sBACCe,IAAA,EAAoB,MAAMP,GAAU,OAAM,SAAQ,WAAU,iBAC3D,UAAA;AAAA,MAAA,gBAAAG;AAAA,QAACK;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,UAAU,MAAMZ,IAAA;AAAA,UAEhB,UAAA;AAAA,YAAA,gBAAAM,EAAC,OAAA,EAAI,WAAU,+GACb,UAAA,gBAAAA,EAAC,UAAK,WAAU,yCACb,UAAAR,KAAWF,EAAA,CACd,EAAA,CACF;AAAA,YACA,gBAAAW,EAAC,OAAA,EAAI,WAAU,yBACb,UAAA;AAAA,cAAA,gBAAAD,EAAC,QAAA,EAAK,WAAU,kDACb,UAAAT,KAAeD,GAClB;AAAA,cACCG,KACC,gBAAAO,EAAC,QAAA,EAAK,WAAU,sEACb,UAAAP,EAAA,CACH;AAAA,YAAA,EAAA,CAEJ;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,wBAEDc,IAAA,EAAsB;AAAA,wBACtBD,GAAA,EAAiB,WAAU,eAAc,SAAO,IAC9C,UAAAX,IACC,gBAAAM;AAAA,QAACO;AAAA,QAAA;AAAA,UACC,MAAMb;AAAA,UACN,mBAAmB,EAAE,QAAQ,GAAA;AAAA,UAC7B,WAAU;AAAA,UAEV,UAAA;AAAA,YAAA,gBAAAK,EAACS,GAAA,EAAU,WAAU,gCAAA,CAAgC;AAAA,YAAE;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA,IAIzD,gBAAAR;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAASL;AAAA,UAET,UAAA;AAAA,YAAA,gBAAAI,EAACS,GAAA,EAAU,WAAU,gCAAA,CAAgC;AAAA,YAAE;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA,EAEzD,CAEJ;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GACN;AAEJ;AAMA,SAASC,EAAY;AAAA,EACnB,SAAApB;AAAA,EACA,aAAAC;AAAA,EACA,SAAAC;AAAA,EACA,SAAAC;AAAA,EACA,WAAAkB;AAAA,EACA,gBAAAjB;AAAA,EACA,oBAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,UAAAgB;AAAA,EACA,SAAAf;AAAA,EACA,iBAAAgB;AACF,GAAqB;AACnB,SACE,gBAAAb;AAAA,IAACc;AAAA,IAAA;AAAA,MACC,SAASjB,IAAU,SAAS;AAAA,MAC5B,cAAW;AAAA,MACX,WAAAc;AAAA,MACA,UAAU,MAAME,IAAA;AAAA,MAChB,QACE,gBAAAb;AAAA,QAACX;AAAA,QAAA;AAAA,UACC,SAAAC;AAAA,UACA,aAAAC;AAAA,UACA,SAAAC;AAAA,UACA,SAAAC;AAAA,UACA,gBAAAC;AAAA,UACA,oBAAAC;AAAA,UACA,kBAAAC;AAAA,UACA,SAAAC;AAAA,QAAA;AAAA,MAAA;AAAA,MAGJ,MAAMe;AAAA,MACN,WAAU;AAAA,IAAA;AAAA,EAAA;AAGhB;AAMA,SAASG,GAAgBC,GAA8D;AACrF,SACE,gBAAAhB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAU;AAAA,MAEV,UAAA,gBAAAA,EAACU,GAAA,EAAY,SAAO,IAAE,GAAGM,EAAA,CAAO;AAAA,IAAA;AAAA,EAAA;AAGtC;AAcA,SAASC,GAAe,EAAE,WAAAC,GAAW,mBAAAC,GAAmB,GAAGC,KAAqC;AAC9F,QAAM,EAAE,SAAA9B,GAAS,aAAAC,GAAa,SAAAC,GAAS,SAAAC,GAAS,gBAAAC,GAAgB,oBAAAC,GAAoB,kBAAAC,MAClFwB,GACIC,IAAkB;AAAA,IACtB,SAAA/B;AAAA,IACA,aAAAC;AAAA,IACA,SAAAC;AAAA,IACA,SAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,kBAAAC;AAAA,EAAA;AAGF,SAAIsB,IAEA,gBAAAlB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,aAAU;AAAA,MACV,kBAAe;AAAA,MACf,WAAU;AAAA,MAEV,UAAA,gBAAAA;AAAA,QAACc;AAAA,QAAA;AAAA,UACC,SAAQ;AAAA,UACR,cAAW;AAAA,UACX,WAAWM,EAAa;AAAA,UACxB,QACE,gBAAAnB,EAAC,OAAA,EAAI,WAAU,oCACb,UAAA;AAAA,YAAA,gBAAAD,EAACX,GAAA,EAAe,GAAGgC,GAAiB,SAAO,GAAA,CAAC;AAAA,YAC5C,gBAAArB;AAAA,cAACsB;AAAA,cAAA;AAAA,gBACC,WAAU;AAAA,gBACV,OAAM;AAAA,gBACN,SAAS,MAAMH,EAAkB,EAAK;AAAA,cAAA;AAAA,YAAA;AAAA,UACxC,GACF;AAAA,UAEF,MAAMC,EAAa;AAAA,UACnB,WAAU;AAAA,QAAA;AAAA,MAAA;AAAA,IACZ;AAAA,EAAA,IAMJ,gBAAApB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,aAAU;AAAA,MACV,kBAAe;AAAA,MACf,WAAU;AAAA,MAEV,UAAA,gBAAAA;AAAA,QAACc;AAAA,QAAA;AAAA,UACC,SAAQ;AAAA,UACR,cAAW;AAAA,UACX,WAAWM,EAAa;AAAA,UACxB,QACE,gBAAAnB,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,YAAA,gBAAAD,EAAC,OAAA,EAAI,WAAU,kBACb,UAAA,gBAAAA,EAACX,KAAe,GAAGgC,GAAiB,SAAS,GAAA,CAAO,EAAA,CACtD;AAAA,YACA,gBAAArB;AAAA,cAACsB;AAAA,cAAA;AAAA,gBACC,WAAU;AAAA,gBACV,OAAM;AAAA,gBACN,SAAS,MAAMH,EAAkB,EAAI;AAAA,cAAA;AAAA,YAAA;AAAA,UACvC,GACF;AAAA,UAEF,MAAMC,EAAa;AAAA,UACnB,WAAU;AAAA,QAAA;AAAA,MAAA;AAAA,IACZ;AAAA,EAAA;AAGN;AAMA,SAASG,GAAiB,EAAE,OAAAC,KAA4C;AACtE;AAAA;AAAA;AAAA;AAAA;AAAA,IAKE,gBAAAxB,EAACyB,IAAA,EAAW,WAAU,WACpB,UAAA,gBAAAzB,EAAC0B,IAAA,EAAe,WAAU,uBACvB,UAAAF,EAAM,IAAI,CAACG,GAAMC,MAAU;AAC1B,YAAMC,IAASD,MAAUJ,EAAM,SAAS,GAClCM,IAAc,CAACD,MAAW,CAAC,CAACF,EAAK,QAAQ,CAAC,CAACA,EAAK,UAGhDI,IAAgBF,IAAS,YAAY;AAC3C,aACE,gBAAA5B,EAAC+B,EAAM,UAAN,EACE,UAAA;AAAA,QAAAJ,IAAQ,KAAK,gBAAA5B,EAACiC,IAAA,EAAoB,WAAU,YAAW,UAAA,KAAC;AAAA,QACzD,gBAAAjC,EAACkC,IAAA,EAAe,WAAWH,GACxB,UAAAF,IACC,gBAAA7B,EAACmC,IAAA,EAAe,WAAU,YAAY,UAAAR,EAAK,MAAA,CAAM,IAC/CG,KAAeH,EAAK,OACtB,gBAAA3B,EAACoC,IAAA,EAAe,MAAMT,EAAK,MAAM,WAAU,qBACxC,UAAAA,EAAK,MAAA,CACR,IACEG,KAAeH,EAAK,UACtB,gBAAA3B;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS2B,EAAK;AAAA,YAEb,UAAAA,EAAK;AAAA,UAAA;AAAA,QAAA,IAGR,gBAAA3B,EAAC,QAAA,EAAK,WAAU,mDACb,UAAA2B,EAAK,OACR,EAAA,CAEJ;AAAA,MAAA,EAAA,GAtBmB,GAAGA,EAAK,KAAK,IAAIC,CAAK,EAuB3C;AAAA,IAEJ,CAAC,GACH,EAAA,CACF;AAAA;AAEJ;AAMA,SAASS,GAAO;AAAA,EACd,aAAAC,IAAc,CAAA;AAAA,EACd,YAAAC;AAAA,EACA,cAAAC;AAAA,EACA,eAAAC;AAAA,EACA,eAAAC;AACF,GAMG;AACD,SACE,gBAAA1C;AAAA,IAAC2C;AAAA,IAAA;AAAA,MACC,aAAU;AAAA,MACV,MACE,gBAAA1C,EAAA2C,IAAA,EAGG,UAAA;AAAA,QAAAF,KAAiB,gBAAA1C,EAAC,OAAA,EAAI,WAAU,YAAY,UAAA0C,GAAc;AAAA,QAC3D,gBAAA1C,EAACuB,IAAA,EAAiB,OAAOe,EAAA,CAAa;AAAA,QACrCC,KAAc,QAAQ,gBAAAvC,EAAC,OAAA,EAAI,WAAU,YAAY,UAAAuC,EAAA,CAAW;AAAA,MAAA,GAC/D;AAAA,MAEF,QAAQC;AAAA,MACR,OAAOC;AAAA,IAAA;AAAA,EAAA;AAGb;AAMA,SAASI,GAAa;AAAA,EACpB,SAAAvD;AAAA,EACA,aAAAC;AAAA,EACA,SAAAC;AAAA,EACA,SAAAC;AAAA,EACA,WAAAqD;AAAA,EACA,WAAAnC;AAAA,EACA,gBAAAjB;AAAA,EACA,oBAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,UAAAgB;AAAA,EACA,aAAA0B,IAAc,CAAA;AAAA,EACd,YAAAC;AAAA,EACA,cAAAC;AAAA,EACA,eAAAC;AAAA,EACA,YAAAM,IAAa;AAAA,EACb,YAAAC,IAAa;AAAA,EACb,cAAAC;AAAA,EACA,cAAAC;AAAA,EACA,YAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,YAAAC,IAAa;AAAA,EACb,WAAWC;AAAA,EACX,kBAAAC,IAAmB;AAAA,EACnB,mBAAApC;AAAA,EACA,mBAAAqC,IAAoB;AAAA,EACpB,cAAAC,IAAe;AAAA,EACf,UAAAC;AAAA,EACA,WAAAC;AACF,GAAsB;AACpB,QAAM,CAACC,GAAeC,CAAgB,IAAI7B,EAAM,SAAS,EAAK,GAGxD,CAAC8B,GAAmBC,CAAoB,IAAI/B,EAAM,SAASuB,CAAgB,GAC3ErC,IAAYoC,KAAiBQ,GAC7BE,IAAehC,EAAM,OAAOd,CAAS;AAC3C,EAAA8C,EAAa,UAAU9C;AAGvB,QAAM+C,IAAmBjC,EAAM,OAAO,EAAK,GAErCkC,IAAelC,EAAM;AAAA,IACzB,CAACmC,MAAkB;AACjB,MAAAF,EAAiB,UAAU,IACvBX,MAAkB,UAAWS,EAAqBI,CAAI,GAC1DhD,IAAoBgD,CAAI;AAAA,IAC1B;AAAA,IACA,CAACb,GAAenC,CAAiB;AAAA,EAAA,GAM7BiD,IAAuBpC,EAAM,OAAO,CAACqC,MAAA;AAAA,GAAiC;AAC5E,EAAAD,EAAqB,UAAU,CAACC,MAAqB;AACnD,IAAIA,KAAW,CAACL,EAAa,WACvBV,MAAkB,UAAWS,EAAqB,EAAI,GAC1D5C,IAAoB,EAAI,GACxB8C,EAAiB,UAAU,MAClB,CAACI,KAAWJ,EAAiB,YACtCA,EAAiB,UAAU,IACvBX,MAAkB,UAAWS,EAAqB,EAAK,GAC3D5C,IAAoB,EAAK;AAAA,EAE7B,GAEAa,EAAM,UAAU,MAAM;AACpB,QAAIyB,MAAiB,MAASV,MAAe,WAAY;AACzD,UAAMuB,IAAM,OAAO,WAAWb,CAAY;AAC1C,IAAAW,EAAqB,QAAQE,EAAI,OAAO;AACxC,UAAMC,IAAW,CAACC,OAA2BJ,EAAqB,QAAQI,GAAE,OAAO;AACnF,WAAAF,EAAI,iBAAiB,UAAUC,CAAQ,GAChC,MAAMD,EAAI,oBAAoB,UAAUC,CAAQ;AAAA,EACzD,GAAG,CAACd,GAAcV,CAAU,CAAC;AAE7B,QAAM3B,IAAe;AAAA,IACnB,SAAA9B;AAAA,IACA,aAAAC;AAAA,IACA,SAAAC;AAAA,IACA,SAAAC;AAAA,IACA,WAAAkB;AAAA,IACA,gBAAAjB;AAAA,IACA,oBAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,UAAAgB;AAAA,EAAA,GAGI6D,IAAa1B,MAAe,YAG5B2B,IAAuBD,KAAczB,MAAe,WACpD2B,IACJ,CAACvB,KAAgBI,KAAqBtC,KAAa,CAACwD;AAUtD,SACE,gBAAA1E,EAAC4E,IAAA,EAAqB,OAAO,EAAE,YAAA7B,GAAY,WAAA7B,GAAW,cAAAgD,GAAc,mBAAAV,EAAA,GAClE,UAAA,gBAAAxD,EAAC6E,IAAA,EAAM,MAAMjB,GAAe,cAAcC,GACxC,UAAA,gBAAA5D;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,aAAU;AAAA,MACV,oBAAkB8C;AAAA,MAClB,kBAAgB7B,KAAa;AAAA,MAC7B,WAAWd,EAXDqE,IACd,wMACA,uMAS6Bd,CAAS;AAAA,MAGjC,UAAA;AAAA,QAAA,CAACgB,MACCF,IACC,gBAAAzE,EAAC,OAAA,EAAI,WAAU,2BACZ,UAAA0E,IACC,gBAAA1E;AAAA,UAACiB;AAAA,UAAA;AAAA,YACC,WAAAC;AAAA,YACA,mBAAmBgD;AAAA,YAClB,GAAG9C;AAAA,UAAA;AAAA,QAAA,IAGN,gBAAApB,EAACe,IAAA,EAAiB,GAAGK,EAAA,CAAc,GAEvC,IAEA,gBAAApB,EAAC,OAAA,EAAI,WAAU,0FACb,UAAA,gBAAAA;AAAA,UAACc;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,cAAW;AAAA,YACX,WAAAH;AAAA,YACA,0BAAStB,GAAA,EAAe,GAAG+B,GAAc,SAAO,IAAC,UAAS,UAAS;AAAA,YACnE,MAAMR;AAAA,UAAA;AAAA,QAAA,EACR,CACF;AAAA,QAIH4C,KAAqBtC,KAAa,CAAC+B,KAClC,gBAAAjD;AAAA,UAAC8E;AAAA,UAAA;AAAA,YACC,aAAU;AAAA,YACV,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,cAAW;AAAA,YACX,WAAU;AAAA,YACV,SAAS,MAAMZ,EAAa,EAAK;AAAA,YAEjC,UAAA,gBAAAlE,EAAC+E,IAAA,EAAa,WAAU,UAAA,CAAU;AAAA,UAAA;AAAA,QAAA;AAAA,QAKtC,gBAAA9E;AAAA,UAAC+E;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,iBAAiB;AAAA,YACjB,WAAU;AAAA,YAEV,UAAA;AAAA,cAAA,gBAAAhF,EAACiF,IAAA,EAAW,WAAU,WAAU,UAAA,cAAU;AAAA,cAC1C,gBAAAjF,EAACkF,IAAA,EAAiB,WAAU,WAAU,UAAA,+BAEtC;AAAA,cACA,gBAAAlF;AAAA,gBAACU;AAAA,gBAAA;AAAA,kBACC,SAAS;AAAA,kBACT,iBAAiB,MAAMmD,EAAiB,EAAK;AAAA,kBAC5C,GAAGzC;AAAA,gBAAA;AAAA,cAAA;AAAA,YACN;AAAA,UAAA;AAAA,QAAA;AAAA,QAID6B,KAAgB,gBAAAjD,EAAC,OAAA,EAAI,WAAU,iCAAiC,UAAAiD,GAAa;AAAA,QAG7EI,KACC,gBAAArD,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA,gBAAAA;AAAA,UAACqC;AAAA,UAAA;AAAA,YACC,aAAAC;AAAA,YACA,YAAAC;AAAA,YACA,cAAAC;AAAA,YACA,eAAAC;AAAA,YACA,eACE,gBAAAzC,EAACmF,IAAA,EAAa,SAAO,IACnB,UAAA,gBAAAnF;AAAA,cAAC8E;AAAA,cAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,cAAW;AAAA,gBACX,WAAU;AAAA,gBAEV,UAAA,gBAAA9E,EAACoF,IAAA,EAAK,WAAU,UAAA,CAAU;AAAA,cAAA;AAAA,YAAA,EAC5B,CACF;AAAA,UAAA;AAAA,QAAA,GAGN;AAAA,QAIDlC,KAAgB,gBAAAlD,EAAC,OAAA,EAAI,WAAU,2BAA2B,UAAAkD,GAAa;AAAA,QAIxE,gBAAAjD,EAAC,OAAA,EAAI,WAAU,kEACb,UAAA;AAAA,UAAA,gBAAAD;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,aAAU;AAAA,cACV,WAAU;AAAA,cAEV,UAAA,gBAAAA,EAACqF,MAAoB,MAAM,EAAQvC,GAAY,SAAArD,GAAkB,WAAAqD,GAC9D,UAAAY,EAAA,CACH;AAAA,YAAA;AAAA,UAAA;AAAA,UAIDP;AAAA,QAAA,EAAA,CACH;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,GAEJ,EAAA,CACF;AAEJ;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { VariantProps } from 'class-variance-authority';
|
|
2
2
|
import * as React from "react";
|
|
3
3
|
declare const badgeVariants: (props?: ({
|
|
4
|
-
variant?: "default" | "outline" | "secondary" | "ghost" | "destructive" | "
|
|
4
|
+
variant?: "link" | "default" | "outline" | "secondary" | "ghost" | "destructive" | "info" | "positive" | "warning" | null | undefined;
|
|
5
5
|
} & import('class-variance-authority/types').ClassProp) | undefined) => string;
|
|
6
6
|
declare function Badge({ className, variant, asChild, ...props }: React.ComponentProps<"span"> & VariantProps<typeof badgeVariants> & {
|
|
7
7
|
asChild?: boolean;
|