@tetrascience-npm/tetrascience-react-ui 0.6.0 → 0.7.0-beta.103.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/README.md +55 -0
- package/dist/components/ai/chain-of-thought.cjs +1 -1
- package/dist/components/ai/chain-of-thought.cjs.map +1 -1
- package/dist/components/ai/chain-of-thought.js +5 -5
- package/dist/components/ai/chain-of-thought.js.map +1 -1
- package/dist/components/ai/conversation.cjs +2 -2
- package/dist/components/ai/conversation.cjs.map +1 -1
- package/dist/components/ai/conversation.js +2 -2
- package/dist/components/ai/conversation.js.map +1 -1
- package/dist/components/ai/queue.cjs +1 -1
- package/dist/components/ai/queue.cjs.map +1 -1
- package/dist/components/ai/queue.js +9 -9
- package/dist/components/ai/queue.js.map +1 -1
- package/dist/components/charts/AreaGraph/AreaGraph.cjs +1 -1
- package/dist/components/charts/AreaGraph/AreaGraph.cjs.map +1 -1
- package/dist/components/charts/AreaGraph/AreaGraph.js +165 -103
- package/dist/components/charts/AreaGraph/AreaGraph.js.map +1 -1
- package/dist/components/charts/BarGraph/BarGraph.cjs +1 -1
- package/dist/components/charts/BarGraph/BarGraph.cjs.map +1 -1
- package/dist/components/charts/BarGraph/BarGraph.js +135 -90
- package/dist/components/charts/BarGraph/BarGraph.js.map +1 -1
- package/dist/components/charts/Boxplot/Boxplot.cjs +1 -1
- package/dist/components/charts/Boxplot/Boxplot.cjs.map +1 -1
- package/dist/components/charts/Boxplot/Boxplot.js +130 -92
- package/dist/components/charts/Boxplot/Boxplot.js.map +1 -1
- package/dist/components/charts/ChartTooltip/ChartTooltip.cjs +2 -0
- package/dist/components/charts/ChartTooltip/ChartTooltip.cjs.map +1 -0
- package/dist/components/charts/ChartTooltip/ChartTooltip.js +163 -0
- package/dist/components/charts/ChartTooltip/ChartTooltip.js.map +1 -0
- package/dist/components/charts/ChartTooltip/lines.cjs +2 -0
- package/dist/components/charts/ChartTooltip/lines.cjs.map +1 -0
- package/dist/components/charts/ChartTooltip/lines.js +29 -0
- package/dist/components/charts/ChartTooltip/lines.js.map +1 -0
- package/dist/components/charts/Chromatogram/Chromatogram.cjs +1 -1
- package/dist/components/charts/Chromatogram/Chromatogram.cjs.map +1 -1
- package/dist/components/charts/Chromatogram/Chromatogram.js +75 -61
- package/dist/components/charts/Chromatogram/Chromatogram.js.map +1 -1
- package/dist/components/charts/ChromatogramChart/ChromatogramChart.cjs +1 -1
- package/dist/components/charts/ChromatogramChart/ChromatogramChart.cjs.map +1 -1
- package/dist/components/charts/ChromatogramChart/ChromatogramChart.js +116 -108
- package/dist/components/charts/ChromatogramChart/ChromatogramChart.js.map +1 -1
- package/dist/components/charts/ChromatogramChart/annotations.cjs +1 -1
- package/dist/components/charts/ChromatogramChart/annotations.cjs.map +1 -1
- package/dist/components/charts/ChromatogramChart/annotations.js +32 -32
- package/dist/components/charts/ChromatogramChart/annotations.js.map +1 -1
- package/dist/components/charts/ChromatogramChart/boundaryMarkers.cjs +1 -1
- package/dist/components/charts/ChromatogramChart/boundaryMarkers.cjs.map +1 -1
- package/dist/components/charts/ChromatogramChart/boundaryMarkers.js +6 -6
- package/dist/components/charts/ChromatogramChart/boundaryMarkers.js.map +1 -1
- package/dist/components/charts/ChromatogramChart/constants.cjs +1 -1
- package/dist/components/charts/ChromatogramChart/constants.cjs.map +1 -1
- package/dist/components/charts/ChromatogramChart/constants.js +11 -5
- package/dist/components/charts/ChromatogramChart/constants.js.map +1 -1
- package/dist/components/charts/ChromatogramChart/dataProcessing.cjs +1 -1
- package/dist/components/charts/ChromatogramChart/dataProcessing.cjs.map +1 -1
- package/dist/components/charts/ChromatogramChart/dataProcessing.js +38 -49
- package/dist/components/charts/ChromatogramChart/dataProcessing.js.map +1 -1
- package/dist/components/charts/DotPlot/DotPlot.cjs +1 -1
- package/dist/components/charts/DotPlot/DotPlot.cjs.map +1 -1
- package/dist/components/charts/DotPlot/DotPlot.js +112 -88
- package/dist/components/charts/DotPlot/DotPlot.js.map +1 -1
- package/dist/components/charts/Histogram/Histogram.cjs +1 -1
- package/dist/components/charts/Histogram/Histogram.cjs.map +1 -1
- package/dist/components/charts/Histogram/Histogram.js +132 -115
- package/dist/components/charts/Histogram/Histogram.js.map +1 -1
- package/dist/components/charts/LineGraph/LineGraph.cjs +1 -1
- package/dist/components/charts/LineGraph/LineGraph.cjs.map +1 -1
- package/dist/components/charts/LineGraph/LineGraph.js +151 -111
- package/dist/components/charts/LineGraph/LineGraph.js.map +1 -1
- package/dist/components/charts/PieChart/PieChart.cjs +1 -1
- package/dist/components/charts/PieChart/PieChart.cjs.map +1 -1
- package/dist/components/charts/PieChart/PieChart.js +81 -70
- package/dist/components/charts/PieChart/PieChart.js.map +1 -1
- package/dist/components/charts/PlateMap/PlateMap.cjs +1 -1
- package/dist/components/charts/PlateMap/PlateMap.cjs.map +1 -1
- package/dist/components/charts/PlateMap/PlateMap.js +271 -256
- package/dist/components/charts/PlateMap/PlateMap.js.map +1 -1
- package/dist/components/charts/PlateMap/constants.cjs +1 -1
- package/dist/components/charts/PlateMap/constants.cjs.map +1 -1
- package/dist/components/charts/PlateMap/constants.js +20 -29
- package/dist/components/charts/PlateMap/constants.js.map +1 -1
- package/dist/components/charts/ScatterGraph/ScatterGraph.cjs +1 -1
- package/dist/components/charts/ScatterGraph/ScatterGraph.cjs.map +1 -1
- package/dist/components/charts/ScatterGraph/ScatterGraph.js +154 -106
- package/dist/components/charts/ScatterGraph/ScatterGraph.js.map +1 -1
- 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.js +118 -111
- package/dist/components/composed/DataAppShell/DataAppShell.js.map +1 -1
- package/dist/components/composed/PlateMapEditor/PlateMapGrid.cjs +1 -1
- package/dist/components/composed/PlateMapEditor/PlateMapGrid.cjs.map +1 -1
- package/dist/components/composed/PlateMapEditor/PlateMapGrid.js +1 -1
- package/dist/components/composed/PlateMapEditor/PlateMapGrid.js.map +1 -1
- package/dist/components/composed/PlateMapEditor/WellLegend.cjs +1 -1
- package/dist/components/composed/PlateMapEditor/WellLegend.cjs.map +1 -1
- package/dist/components/composed/PlateMapEditor/WellLegend.js +8 -8
- package/dist/components/composed/PlateMapEditor/WellLegend.js.map +1 -1
- package/dist/components/composed/RichListItem/RichListItem.cjs +1 -1
- package/dist/components/composed/RichListItem/RichListItem.cjs.map +1 -1
- package/dist/components/composed/RichListItem/RichListItem.js +16 -16
- package/dist/components/composed/RichListItem/RichListItem.js.map +1 -1
- package/dist/components/ui/accordion.cjs +1 -1
- package/dist/components/ui/accordion.cjs.map +1 -1
- package/dist/components/ui/accordion.js +1 -1
- package/dist/components/ui/accordion.js.map +1 -1
- package/dist/components/ui/badge.cjs +1 -1
- package/dist/components/ui/badge.cjs.map +1 -1
- package/dist/components/ui/badge.js +8 -8
- package/dist/components/ui/badge.js.map +1 -1
- package/dist/components/ui/button.cjs +1 -1
- package/dist/components/ui/button.cjs.map +1 -1
- package/dist/components/ui/button.js +11 -11
- package/dist/components/ui/button.js.map +1 -1
- package/dist/components/ui/checkbox.cjs +1 -1
- package/dist/components/ui/checkbox.cjs.map +1 -1
- package/dist/components/ui/checkbox.js +1 -1
- package/dist/components/ui/checkbox.js.map +1 -1
- package/dist/components/ui/combobox.cjs +1 -1
- package/dist/components/ui/combobox.cjs.map +1 -1
- package/dist/components/ui/combobox.js +12 -12
- package/dist/components/ui/combobox.js.map +1 -1
- package/dist/components/ui/input-group.cjs +1 -1
- package/dist/components/ui/input-group.cjs.map +1 -1
- package/dist/components/ui/input-group.js +19 -19
- package/dist/components/ui/input-group.js.map +1 -1
- package/dist/components/ui/item.cjs +1 -1
- package/dist/components/ui/item.cjs.map +1 -1
- package/dist/components/ui/item.js +1 -1
- package/dist/components/ui/item.js.map +1 -1
- package/dist/components/ui/menubar.cjs +1 -1
- package/dist/components/ui/menubar.cjs.map +1 -1
- package/dist/components/ui/menubar.js +1 -1
- package/dist/components/ui/menubar.js.map +1 -1
- package/dist/components/ui/navigation-menu.cjs +1 -1
- package/dist/components/ui/navigation-menu.cjs.map +1 -1
- package/dist/components/ui/navigation-menu.js +54 -54
- package/dist/components/ui/navigation-menu.js.map +1 -1
- package/dist/components/ui/radio-group.cjs +1 -1
- package/dist/components/ui/radio-group.cjs.map +1 -1
- package/dist/components/ui/radio-group.js +1 -1
- package/dist/components/ui/radio-group.js.map +1 -1
- package/dist/components/ui/resizable.cjs +1 -1
- package/dist/components/ui/resizable.cjs.map +1 -1
- package/dist/components/ui/resizable.js +27 -15
- package/dist/components/ui/resizable.js.map +1 -1
- package/dist/components/ui/select.cjs +1 -1
- package/dist/components/ui/select.cjs.map +1 -1
- package/dist/components/ui/select.js +1 -1
- package/dist/components/ui/select.js.map +1 -1
- package/dist/components/ui/slider.cjs +1 -1
- package/dist/components/ui/slider.cjs.map +1 -1
- package/dist/components/ui/slider.js +9 -9
- package/dist/components/ui/slider.js.map +1 -1
- package/dist/components/ui/table.cjs +1 -1
- package/dist/components/ui/table.cjs.map +1 -1
- package/dist/components/ui/table.js +13 -13
- package/dist/components/ui/table.js.map +1 -1
- package/dist/components/ui/tabs.cjs +1 -1
- package/dist/components/ui/tabs.cjs.map +1 -1
- package/dist/components/ui/tabs.js +7 -7
- package/dist/components/ui/tabs.js.map +1 -1
- package/dist/components/ui/toggle.cjs +1 -1
- package/dist/components/ui/toggle.cjs.map +1 -1
- package/dist/components/ui/toggle.js +12 -12
- package/dist/components/ui/toggle.js.map +1 -1
- package/dist/hooks/use-element-size.cjs +2 -0
- package/dist/hooks/use-element-size.cjs.map +1 -0
- package/dist/hooks/use-element-size.js +21 -0
- package/dist/hooks/use-element-size.js.map +1 -0
- package/dist/hooks/use-plotly-theme.cjs +1 -1
- package/dist/hooks/use-plotly-theme.cjs.map +1 -1
- package/dist/hooks/use-plotly-theme.js +4 -2
- package/dist/hooks/use-plotly-theme.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.css +1 -1
- package/dist/index.d.ts +254 -77
- package/dist/index.js +587 -581
- package/dist/index.js.map +1 -1
- package/dist/index.tailwind.css +1 -1
- package/dist/utils/colors.cjs +1 -1
- package/dist/utils/colors.cjs.map +1 -1
- package/dist/utils/colors.js +38 -93
- package/dist/utils/colors.js.map +1 -1
- package/package.json +18 -12
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { jsx as e, jsxs as r } from "react/jsx-runtime";
|
|
2
|
-
import { cva as
|
|
3
|
-
import { Menu as
|
|
1
|
+
import { jsx as e, jsxs as r, Fragment as M } from "react/jsx-runtime";
|
|
2
|
+
import { cva as P } from "class-variance-authority";
|
|
3
|
+
import { Menu as L, ArrowLeft as k, HelpCircle as O } from "lucide-react";
|
|
4
4
|
import * as w from "react";
|
|
5
|
-
import { TDPLink as
|
|
6
|
-
import { Breadcrumb as
|
|
7
|
-
import { Button as
|
|
8
|
-
import { DropdownMenu as
|
|
9
|
-
import { Sheet as
|
|
10
|
-
import { TooltipProvider as
|
|
11
|
-
import { cn as
|
|
12
|
-
const
|
|
5
|
+
import { TDPLink as z } from "../tdp-link.js";
|
|
6
|
+
import { Breadcrumb as I, BreadcrumbList as $, BreadcrumbSeparator as E, BreadcrumbItem as F, BreadcrumbPage as H, BreadcrumbLink as R } from "../../ui/breadcrumb.js";
|
|
7
|
+
import { Button as T } from "../../ui/button.js";
|
|
8
|
+
import { DropdownMenu as V, DropdownMenuTrigger as K, DropdownMenuContent as q, DropdownMenuSeparator as G, DropdownMenuItem as J } from "../../ui/dropdown-menu.js";
|
|
9
|
+
import { Sheet as Q, SheetContent as U, SheetTitle as W, SheetDescription as X, SheetTrigger as Y } from "../../ui/sheet.js";
|
|
10
|
+
import { TooltipProvider as A, Tooltip as B, TooltipTrigger as D, TooltipContent as S } from "../../ui/tooltip.js";
|
|
11
|
+
import { cn as a } from "../../../lib/utils.js";
|
|
12
|
+
const C = P(
|
|
13
13
|
"flex items-center justify-center rounded-lg transition-colors duration-150",
|
|
14
14
|
{
|
|
15
15
|
variants: {
|
|
@@ -18,59 +18,61 @@ const k = j(
|
|
|
18
18
|
false: "bg-transparent"
|
|
19
19
|
},
|
|
20
20
|
compact: {
|
|
21
|
-
true: "w-9 h-9 hover:bg-
|
|
21
|
+
true: "w-9 h-9 hover:bg-accent",
|
|
22
22
|
false: "w-8 h-8"
|
|
23
23
|
}
|
|
24
24
|
},
|
|
25
25
|
defaultVariants: { active: !1, compact: !0 }
|
|
26
26
|
}
|
|
27
27
|
);
|
|
28
|
-
function
|
|
28
|
+
function j({
|
|
29
29
|
appName: i,
|
|
30
30
|
appFullName: d,
|
|
31
|
-
appIcon:
|
|
32
|
-
version:
|
|
31
|
+
appIcon: m,
|
|
32
|
+
version: f,
|
|
33
33
|
navGroups: t,
|
|
34
34
|
onAppNameClick: o,
|
|
35
35
|
backToPlatformPath: c,
|
|
36
36
|
onBackToPlatform: h,
|
|
37
37
|
userMenu: b,
|
|
38
|
-
compact:
|
|
38
|
+
compact: l,
|
|
39
39
|
onAfterNavClick: v
|
|
40
40
|
}) {
|
|
41
|
-
return /* @__PURE__ */ r(
|
|
41
|
+
return /* @__PURE__ */ r(A, { children: [
|
|
42
42
|
/* @__PURE__ */ e(
|
|
43
43
|
"div",
|
|
44
44
|
{
|
|
45
|
-
className:
|
|
46
|
-
"shrink-0
|
|
47
|
-
|
|
45
|
+
className: a(
|
|
46
|
+
"shrink-0 flex",
|
|
47
|
+
// Expanded: full-width header border. Collapsed: no full-width border —
|
|
48
|
+
// a short centered divider (below) aligns under the icon column instead.
|
|
49
|
+
l ? "justify-center py-2" : "px-3 py-2.5 border-b border-sidebar-border"
|
|
48
50
|
),
|
|
49
|
-
children: /* @__PURE__ */ r(
|
|
50
|
-
/* @__PURE__ */ e(
|
|
51
|
+
children: /* @__PURE__ */ r(V, { children: [
|
|
52
|
+
/* @__PURE__ */ e(K, { asChild: !0, children: /* @__PURE__ */ r(
|
|
51
53
|
"button",
|
|
52
54
|
{
|
|
53
55
|
type: "button",
|
|
54
|
-
className:
|
|
56
|
+
className: a(
|
|
55
57
|
"cursor-pointer bg-transparent border-none p-0",
|
|
56
|
-
!
|
|
58
|
+
!l && "flex items-center gap-3 w-full text-left"
|
|
57
59
|
),
|
|
58
60
|
children: [
|
|
59
61
|
/* @__PURE__ */ e(
|
|
60
62
|
"span",
|
|
61
63
|
{
|
|
62
|
-
className:
|
|
64
|
+
className: a(
|
|
63
65
|
"flex items-center justify-center rounded-lg bg-sidebar-accent border border-sidebar-border font-bold text-foreground shrink-0",
|
|
64
|
-
|
|
66
|
+
l ? "w-9 h-9 text-[11px]" : "w-8 h-8 text-[10px]"
|
|
65
67
|
),
|
|
66
|
-
children:
|
|
68
|
+
children: m ?? i
|
|
67
69
|
}
|
|
68
70
|
),
|
|
69
|
-
!
|
|
71
|
+
!l && /* @__PURE__ */ e("span", { className: "text-sm font-semibold text-foreground truncate leading-snug", children: d ?? i })
|
|
70
72
|
]
|
|
71
73
|
}
|
|
72
74
|
) }),
|
|
73
|
-
/* @__PURE__ */ r(
|
|
75
|
+
/* @__PURE__ */ r(q, { side: "right", align: "start", className: "min-w-[220px]", children: [
|
|
74
76
|
/* @__PURE__ */ r(
|
|
75
77
|
"div",
|
|
76
78
|
{
|
|
@@ -82,23 +84,23 @@ function S({
|
|
|
82
84
|
s.key === "Enter" && o?.();
|
|
83
85
|
},
|
|
84
86
|
children: [
|
|
85
|
-
/* @__PURE__ */ e("div", { className: "w-8 h-8 rounded-lg bg-sidebar-accent border border-sidebar-border flex items-center justify-center shrink-0", children: /* @__PURE__ */ e("span", { className: "text-[10px] font-bold text-foreground", children:
|
|
87
|
+
/* @__PURE__ */ e("div", { className: "w-8 h-8 rounded-lg bg-sidebar-accent border border-sidebar-border flex items-center justify-center shrink-0", children: /* @__PURE__ */ e("span", { className: "text-[10px] font-bold text-foreground", children: m ?? i }) }),
|
|
86
88
|
/* @__PURE__ */ r("div", { className: "flex flex-col min-w-0", children: [
|
|
87
89
|
/* @__PURE__ */ e("span", { className: "text-sm font-semibold text-foreground truncate", children: d ?? i }),
|
|
88
|
-
|
|
90
|
+
f && /* @__PURE__ */ e("span", { className: "text-[10px] text-muted-foreground/70 font-mono leading-none mt-0.5", children: f })
|
|
89
91
|
] })
|
|
90
92
|
]
|
|
91
93
|
}
|
|
92
94
|
),
|
|
93
|
-
/* @__PURE__ */ e(
|
|
94
|
-
/* @__PURE__ */ e(
|
|
95
|
-
|
|
95
|
+
/* @__PURE__ */ e(G, {}),
|
|
96
|
+
/* @__PURE__ */ e(J, { className: "gap-2.5 p-0", asChild: !0, children: c ? /* @__PURE__ */ r(
|
|
97
|
+
z,
|
|
96
98
|
{
|
|
97
99
|
path: c,
|
|
98
100
|
navigationOptions: { newTab: !1 },
|
|
99
101
|
className: "flex items-center gap-2.5 w-full px-2 py-1.5 !no-underline hover:!no-underline",
|
|
100
102
|
children: [
|
|
101
|
-
/* @__PURE__ */ e(
|
|
103
|
+
/* @__PURE__ */ e(k, { className: "w-4 h-4 text-muted-foreground" }),
|
|
102
104
|
"Back to TDP Platform"
|
|
103
105
|
]
|
|
104
106
|
}
|
|
@@ -109,7 +111,7 @@ function S({
|
|
|
109
111
|
className: "flex items-center gap-2.5 w-full px-2 py-1.5 bg-transparent border-none cursor-pointer",
|
|
110
112
|
onClick: h,
|
|
111
113
|
children: [
|
|
112
|
-
/* @__PURE__ */ e(
|
|
114
|
+
/* @__PURE__ */ e(k, { className: "w-4 h-4 text-muted-foreground" }),
|
|
113
115
|
"Back to TDP Platform"
|
|
114
116
|
]
|
|
115
117
|
}
|
|
@@ -118,36 +120,37 @@ function S({
|
|
|
118
120
|
] })
|
|
119
121
|
}
|
|
120
122
|
),
|
|
123
|
+
l && /* @__PURE__ */ e("div", { className: "shrink-0 mx-auto w-8 border-t border-sidebar-border" }),
|
|
121
124
|
/* @__PURE__ */ e(
|
|
122
125
|
"div",
|
|
123
126
|
{
|
|
124
|
-
className:
|
|
127
|
+
className: a(
|
|
125
128
|
"flex-1 min-h-0",
|
|
126
|
-
|
|
129
|
+
l ? "flex flex-col items-center gap-1 px-2 pt-3 overflow-y-auto" : "flex flex-col py-2 overflow-y-auto"
|
|
127
130
|
),
|
|
128
|
-
children: t.map((s,
|
|
129
|
-
|
|
131
|
+
children: t.map((s, u) => /* @__PURE__ */ r(w.Fragment, { children: [
|
|
132
|
+
u > 0 && /* @__PURE__ */ e(
|
|
130
133
|
"div",
|
|
131
134
|
{
|
|
132
|
-
className:
|
|
135
|
+
className: a(
|
|
133
136
|
"border-t border-sidebar-border",
|
|
134
|
-
|
|
137
|
+
l ? "w-8 my-2" : "mx-3 my-1"
|
|
135
138
|
)
|
|
136
139
|
}
|
|
137
140
|
),
|
|
138
|
-
!
|
|
141
|
+
!l && s.label && /* @__PURE__ */ e("span", { className: "px-3 py-1 text-[10px] uppercase tracking-widest text-muted-foreground/60 font-semibold", children: s.label }),
|
|
139
142
|
/* @__PURE__ */ e(
|
|
140
143
|
"div",
|
|
141
144
|
{
|
|
142
|
-
className:
|
|
145
|
+
className: a(
|
|
143
146
|
"flex flex-col",
|
|
144
|
-
|
|
147
|
+
l ? "items-center gap-3 w-full" : "gap-0.5"
|
|
145
148
|
),
|
|
146
149
|
children: s.pages.map((n) => {
|
|
147
|
-
const
|
|
148
|
-
|
|
150
|
+
const p = n.icon, x = p ? /* @__PURE__ */ e(
|
|
151
|
+
p,
|
|
149
152
|
{
|
|
150
|
-
className:
|
|
153
|
+
className: a(
|
|
151
154
|
"w-5 h-5",
|
|
152
155
|
n.isActive ? "text-primary" : "text-muted-foreground"
|
|
153
156
|
)
|
|
@@ -155,27 +158,27 @@ function S({
|
|
|
155
158
|
) : /* @__PURE__ */ e(
|
|
156
159
|
"div",
|
|
157
160
|
{
|
|
158
|
-
className:
|
|
161
|
+
className: a(
|
|
159
162
|
"w-2 h-2 rounded-full",
|
|
160
163
|
n.isActive ? "bg-primary" : "bg-muted-foreground/40"
|
|
161
164
|
)
|
|
162
165
|
}
|
|
163
|
-
),
|
|
166
|
+
), g = () => {
|
|
164
167
|
n.onClick?.(), v?.();
|
|
165
168
|
};
|
|
166
|
-
return
|
|
167
|
-
/* @__PURE__ */ e(
|
|
169
|
+
return l ? /* @__PURE__ */ r(B, { children: [
|
|
170
|
+
/* @__PURE__ */ e(D, { asChild: !0, children: /* @__PURE__ */ r(
|
|
168
171
|
"button",
|
|
169
172
|
{
|
|
170
173
|
type: "button",
|
|
171
174
|
className: "flex flex-col items-center gap-0.5 cursor-pointer bg-transparent border-none p-0 w-full",
|
|
172
|
-
onClick:
|
|
175
|
+
onClick: g,
|
|
173
176
|
children: [
|
|
174
|
-
/* @__PURE__ */ e("div", { className:
|
|
177
|
+
/* @__PURE__ */ e("div", { className: a(C({ active: n.isActive ?? !1, compact: !0 })), children: x }),
|
|
175
178
|
/* @__PURE__ */ e(
|
|
176
179
|
"span",
|
|
177
180
|
{
|
|
178
|
-
className:
|
|
181
|
+
className: a(
|
|
179
182
|
"text-[10px] font-medium leading-tight text-center",
|
|
180
183
|
n.isActive ? "text-foreground font-semibold" : "text-muted-foreground"
|
|
181
184
|
),
|
|
@@ -185,18 +188,18 @@ function S({
|
|
|
185
188
|
]
|
|
186
189
|
}
|
|
187
190
|
) }),
|
|
188
|
-
/* @__PURE__ */ e(
|
|
191
|
+
/* @__PURE__ */ e(S, { side: "right", children: n.label })
|
|
189
192
|
] }, n.id) : /* @__PURE__ */ r(
|
|
190
193
|
"button",
|
|
191
194
|
{
|
|
192
195
|
type: "button",
|
|
193
|
-
className:
|
|
196
|
+
className: a(
|
|
194
197
|
"flex items-center gap-3 w-full px-3 py-2 text-sm cursor-pointer bg-transparent border-none text-left transition-colors duration-150 rounded-md mx-1",
|
|
195
198
|
n.isActive ? "bg-sidebar-accent text-sidebar-foreground font-medium" : "text-muted-foreground hover:bg-sidebar-accent/60 hover:text-foreground"
|
|
196
199
|
),
|
|
197
|
-
onClick:
|
|
200
|
+
onClick: g,
|
|
198
201
|
children: [
|
|
199
|
-
/* @__PURE__ */ e("div", { className:
|
|
202
|
+
/* @__PURE__ */ e("div", { className: a(C({ active: n.isActive ?? !1, compact: !1 })), children: x }),
|
|
200
203
|
/* @__PURE__ */ e("span", { children: n.label })
|
|
201
204
|
]
|
|
202
205
|
},
|
|
@@ -205,37 +208,40 @@ function S({
|
|
|
205
208
|
})
|
|
206
209
|
}
|
|
207
210
|
)
|
|
208
|
-
] }, `${
|
|
211
|
+
] }, `${u}-${s.label ?? ""}`))
|
|
209
212
|
}
|
|
210
213
|
),
|
|
211
|
-
b && /* @__PURE__ */
|
|
212
|
-
"div",
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
214
|
+
b && /* @__PURE__ */ r(M, { children: [
|
|
215
|
+
l && /* @__PURE__ */ e("div", { className: "shrink-0 mx-auto w-8 border-t border-sidebar-border" }),
|
|
216
|
+
/* @__PURE__ */ e(
|
|
217
|
+
"div",
|
|
218
|
+
{
|
|
219
|
+
className: a(
|
|
220
|
+
"shrink-0",
|
|
221
|
+
l ? "flex flex-col items-center py-2" : "p-2 border-t border-sidebar-border"
|
|
222
|
+
),
|
|
223
|
+
children: b
|
|
224
|
+
}
|
|
225
|
+
)
|
|
226
|
+
] })
|
|
221
227
|
] });
|
|
222
228
|
}
|
|
223
|
-
function
|
|
229
|
+
function Z(i) {
|
|
224
230
|
return /* @__PURE__ */ e(
|
|
225
231
|
"nav",
|
|
226
232
|
{
|
|
227
233
|
"data-slot": "data-app-sidebar-rail",
|
|
228
234
|
"aria-label": "Application navigation",
|
|
229
235
|
className: "hidden md:flex w-[60px] flex-col shrink-0 bg-sidebar border-r border-sidebar-border h-full z-50",
|
|
230
|
-
children: /* @__PURE__ */ e(
|
|
236
|
+
children: /* @__PURE__ */ e(j, { compact: !0, ...i })
|
|
231
237
|
}
|
|
232
238
|
);
|
|
233
239
|
}
|
|
234
|
-
function
|
|
240
|
+
function _({
|
|
235
241
|
breadcrumbs: i = [],
|
|
236
242
|
onHelpClick: d,
|
|
237
|
-
headerActions:
|
|
238
|
-
mobileTrigger:
|
|
243
|
+
headerActions: m,
|
|
244
|
+
mobileTrigger: f
|
|
239
245
|
}) {
|
|
240
246
|
return /* @__PURE__ */ r(
|
|
241
247
|
"div",
|
|
@@ -243,12 +249,12 @@ function Y({
|
|
|
243
249
|
"data-slot": "data-app-top-nav",
|
|
244
250
|
className: "flex items-center h-10 px-3 bg-sidebar border-b border-sidebar-border sticky top-0 z-40 w-full gap-2",
|
|
245
251
|
children: [
|
|
246
|
-
|
|
247
|
-
/* @__PURE__ */ e(
|
|
252
|
+
f,
|
|
253
|
+
/* @__PURE__ */ e(I, { className: "flex-1 min-w-0", children: /* @__PURE__ */ e($, { children: i.map((t, o) => {
|
|
248
254
|
const c = o === i.length - 1, h = !c && (!!t.href || !!t.onClick);
|
|
249
255
|
return /* @__PURE__ */ r(w.Fragment, { children: [
|
|
250
|
-
o > 0 && /* @__PURE__ */ e(
|
|
251
|
-
/* @__PURE__ */ e(
|
|
256
|
+
o > 0 && /* @__PURE__ */ e(E, { children: "/" }),
|
|
257
|
+
/* @__PURE__ */ e(F, { children: c ? /* @__PURE__ */ e(H, { children: t.label }) : h && t.href ? /* @__PURE__ */ e(R, { href: t.href, children: t.label }) : h && t.onClick ? /* @__PURE__ */ e(
|
|
252
258
|
"button",
|
|
253
259
|
{
|
|
254
260
|
type: "button",
|
|
@@ -260,76 +266,77 @@ function Y({
|
|
|
260
266
|
] }, `${t.label}-${o}`);
|
|
261
267
|
}) }) }),
|
|
262
268
|
/* @__PURE__ */ r("div", { className: "flex items-center gap-2 shrink-0", children: [
|
|
263
|
-
|
|
264
|
-
d && /* @__PURE__ */ e(
|
|
265
|
-
/* @__PURE__ */ e(
|
|
266
|
-
|
|
269
|
+
m,
|
|
270
|
+
d && /* @__PURE__ */ e(A, { children: /* @__PURE__ */ r(B, { children: [
|
|
271
|
+
/* @__PURE__ */ e(D, { asChild: !0, children: /* @__PURE__ */ e(
|
|
272
|
+
T,
|
|
267
273
|
{
|
|
268
274
|
variant: "ghost",
|
|
269
275
|
size: "icon",
|
|
270
276
|
className: "w-7 h-7 text-muted-foreground",
|
|
271
277
|
onClick: d,
|
|
272
278
|
"aria-label": "Help",
|
|
273
|
-
children: /* @__PURE__ */ e(
|
|
279
|
+
children: /* @__PURE__ */ e(O, { className: "w-4 h-4" })
|
|
274
280
|
}
|
|
275
281
|
) }),
|
|
276
|
-
/* @__PURE__ */ e(
|
|
282
|
+
/* @__PURE__ */ e(S, { side: "bottom", children: "Help" })
|
|
277
283
|
] }) })
|
|
278
284
|
] })
|
|
279
285
|
]
|
|
280
286
|
}
|
|
281
287
|
);
|
|
282
288
|
}
|
|
283
|
-
function
|
|
289
|
+
function ce({
|
|
284
290
|
appName: i,
|
|
285
291
|
appFullName: d,
|
|
286
|
-
appIcon:
|
|
287
|
-
version:
|
|
292
|
+
appIcon: m,
|
|
293
|
+
version: f,
|
|
288
294
|
navGroups: t,
|
|
289
295
|
onAppNameClick: o,
|
|
290
296
|
backToPlatformPath: c,
|
|
291
297
|
onBackToPlatform: h,
|
|
292
298
|
userMenu: b,
|
|
293
|
-
breadcrumbs:
|
|
299
|
+
breadcrumbs: l = [],
|
|
294
300
|
onHelpClick: v,
|
|
295
301
|
headerActions: s,
|
|
296
|
-
sidebarPanel:
|
|
297
|
-
|
|
302
|
+
sidebarPanel: u,
|
|
303
|
+
showNavRail: n = !0,
|
|
304
|
+
children: p,
|
|
298
305
|
className: x
|
|
299
306
|
}) {
|
|
300
|
-
const [g,
|
|
307
|
+
const [g, N] = w.useState(!1), y = {
|
|
301
308
|
appName: i,
|
|
302
309
|
appFullName: d,
|
|
303
|
-
appIcon:
|
|
304
|
-
version:
|
|
310
|
+
appIcon: m,
|
|
311
|
+
version: f,
|
|
305
312
|
navGroups: t,
|
|
306
313
|
onAppNameClick: o,
|
|
307
314
|
backToPlatformPath: c,
|
|
308
315
|
onBackToPlatform: h,
|
|
309
316
|
userMenu: b
|
|
310
317
|
};
|
|
311
|
-
return /* @__PURE__ */ e(
|
|
318
|
+
return /* @__PURE__ */ e(Q, { open: g, onOpenChange: N, children: /* @__PURE__ */ r(
|
|
312
319
|
"div",
|
|
313
320
|
{
|
|
314
321
|
"data-slot": "data-app-shell",
|
|
315
|
-
className:
|
|
322
|
+
className: a("flex flex-row w-full h-screen overflow-hidden", x),
|
|
316
323
|
children: [
|
|
317
|
-
/* @__PURE__ */ e(
|
|
324
|
+
n && /* @__PURE__ */ e(Z, { ...y }),
|
|
318
325
|
/* @__PURE__ */ r(
|
|
319
|
-
|
|
326
|
+
U,
|
|
320
327
|
{
|
|
321
328
|
side: "left",
|
|
322
329
|
showCloseButton: !1,
|
|
323
330
|
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",
|
|
324
331
|
children: [
|
|
325
|
-
/* @__PURE__ */ e(
|
|
326
|
-
/* @__PURE__ */ e(
|
|
332
|
+
/* @__PURE__ */ e(W, { className: "sr-only", children: "Navigation" }),
|
|
333
|
+
/* @__PURE__ */ e(X, { className: "sr-only", children: "Application navigation menu" }),
|
|
327
334
|
/* @__PURE__ */ e("nav", { "aria-label": "Application navigation", className: "flex flex-col h-full", children: /* @__PURE__ */ e(
|
|
328
|
-
|
|
335
|
+
j,
|
|
329
336
|
{
|
|
330
337
|
compact: !1,
|
|
331
|
-
onAfterNavClick: () =>
|
|
332
|
-
...
|
|
338
|
+
onAfterNavClick: () => N(!1),
|
|
339
|
+
...y
|
|
333
340
|
}
|
|
334
341
|
) })
|
|
335
342
|
]
|
|
@@ -337,31 +344,31 @@ function se({
|
|
|
337
344
|
),
|
|
338
345
|
/* @__PURE__ */ r("div", { className: "flex flex-1 flex-col min-w-0 overflow-hidden", children: [
|
|
339
346
|
/* @__PURE__ */ e(
|
|
340
|
-
|
|
347
|
+
_,
|
|
341
348
|
{
|
|
342
|
-
breadcrumbs:
|
|
349
|
+
breadcrumbs: l,
|
|
343
350
|
onHelpClick: v,
|
|
344
351
|
headerActions: s,
|
|
345
|
-
mobileTrigger: /* @__PURE__ */ e(
|
|
346
|
-
|
|
352
|
+
mobileTrigger: /* @__PURE__ */ e(Y, { asChild: !0, children: /* @__PURE__ */ e(
|
|
353
|
+
T,
|
|
347
354
|
{
|
|
348
355
|
variant: "ghost",
|
|
349
356
|
size: "icon",
|
|
350
357
|
"aria-label": "Open navigation menu",
|
|
351
358
|
className: "md:hidden w-7 h-7 shrink-0 text-muted-foreground",
|
|
352
|
-
children: /* @__PURE__ */ e(
|
|
359
|
+
children: /* @__PURE__ */ e(L, { className: "w-4 h-4" })
|
|
353
360
|
}
|
|
354
361
|
) })
|
|
355
362
|
}
|
|
356
363
|
),
|
|
357
364
|
/* @__PURE__ */ r("div", { className: "flex flex-1 min-h-0 overflow-hidden", children: [
|
|
358
|
-
|
|
365
|
+
u,
|
|
359
366
|
/* @__PURE__ */ e(
|
|
360
367
|
"main",
|
|
361
368
|
{
|
|
362
369
|
"data-slot": "data-app-shell-content",
|
|
363
370
|
className: "flex-1 overflow-auto bg-background",
|
|
364
|
-
children:
|
|
371
|
+
children: p
|
|
365
372
|
}
|
|
366
373
|
)
|
|
367
374
|
] })
|
|
@@ -371,6 +378,6 @@ function se({
|
|
|
371
378
|
) });
|
|
372
379
|
}
|
|
373
380
|
export {
|
|
374
|
-
|
|
381
|
+
ce as DataAppShell
|
|
375
382
|
};
|
|
376
383
|
//# sourceMappingURL=DataAppShell.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataAppShell.js","sources":["../../../../src/components/composed/DataAppShell/DataAppShell.tsx"],"sourcesContent":["import { cva } from \"class-variance-authority\";\nimport {\n ArrowLeft,\n HelpCircle,\n Menu,\n type LucideIcon,\n} from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { TDPLink } from \"@/components/composed/tdp-link\";\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 {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { cn } from \"@/lib/utils\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface NavPage {\n /** Unique identifier */\n id: string;\n /** Display label */\n label: string;\n /** Lucide icon or custom React SVG component */\n icon?: LucideIcon | React.FC<React.SVGProps<SVGSVGElement>>;\n /** Whether this page is currently active */\n isActive?: boolean;\n /** Click handler */\n onClick?: () => void;\n}\n\nexport interface NavGroup {\n /** Optional group label shown as a section header in expanded nav */\n label?: string;\n /** Page entries in this group */\n pages: NavPage[];\n}\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 /** Callback when the help button is clicked; omit to hide the button */\n onHelpClick?: () => void;\n /** Slot for right-side actions in the top nav (e.g. data count pills, next button) */\n headerActions?: React.ReactNode;\n\n // -- Shell --\n /** Slot rendered between the icon rail and the content (e.g. WorkflowPanel) */\n sidebarPanel?: React.ReactNode;\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 (60px): icons + tiny labels stacked, 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\nconst pageIconVariants = cva(\n \"flex items-center justify-center rounded-lg transition-colors duration-150\",\n {\n variants: {\n active: {\n true: \"bg-primary/10\",\n false: \"bg-transparent\",\n },\n compact: {\n true: \"w-9 h-9 hover:bg-muted\",\n false: \"w-8 h-8\",\n },\n },\n defaultVariants: { active: false, compact: true },\n }\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 <TooltipProvider>\n {/* ── Header: app icon / name + version ──────────────────────────────── */}\n <div\n className={cn(\n \"shrink-0 border-b border-sidebar-border\",\n compact ? \"flex justify-center py-2\" : \"flex px-3 py-2.5\"\n )}\n >\n <DropdownMenu>\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 gap-3 w-full text-left\"\n )}\n >\n {/* Icon */}\n <span\n className={cn(\n \"flex items-center justify-center rounded-lg bg-sidebar-accent border border-sidebar-border font-bold text-foreground shrink-0\",\n compact ? \"w-9 h-9 text-[11px]\" : \"w-8 h-8 text-[10px]\"\n )}\n >\n {appIcon ?? appName}\n </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=\"right\" align=\"start\" className=\"min-w-[220px]\">\n <div\n className=\"flex items-center gap-3 px-3 py-2.5 cursor-pointer\"\n onClick={onAppNameClick}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") onAppNameClick?.();\n }}\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 </div>\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 </div>\n\n {/* ── Nav groups ──────────────────────────────────────────────────────── */}\n <div\n className={cn(\n \"flex-1 min-h-0\",\n compact\n ? \"flex flex-col items-center gap-1 px-2 pt-3 overflow-y-auto\"\n : \"flex flex-col py-2 overflow-y-auto\"\n )}\n >\n {navGroups.map((group, groupIndex) => (\n <React.Fragment key={`${groupIndex}-${group.label ?? \"\"}`}>\n {groupIndex > 0 && (\n <div\n className={cn(\n \"border-t border-sidebar-border\",\n compact ? \"w-8 my-2\" : \"mx-3 my-1\"\n )}\n />\n )}\n {!compact && group.label && (\n <span className=\"px-3 py-1 text-[10px] uppercase tracking-widest text-muted-foreground/60 font-semibold\">\n {group.label}\n </span>\n )}\n <div\n className={cn(\n \"flex flex-col\",\n compact ? \"items-center gap-3 w-full\" : \"gap-0.5\"\n )}\n >\n {group.pages.map((page) => {\n const Icon = page.icon;\n const iconEl = Icon ? (\n <Icon\n className={cn(\n \"w-5 h-5\",\n page.isActive ? \"text-primary\" : \"text-muted-foreground\"\n )}\n />\n ) : (\n <div\n className={cn(\n \"w-2 h-2 rounded-full\",\n page.isActive ? \"bg-primary\" : \"bg-muted-foreground/40\"\n )}\n />\n );\n\n const handleClick = () => {\n page.onClick?.();\n onAfterNavClick?.();\n };\n\n if (compact) {\n return (\n <Tooltip key={page.id}>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n className=\"flex flex-col items-center gap-0.5 cursor-pointer bg-transparent border-none p-0 w-full\"\n onClick={handleClick}\n >\n <div className={cn(pageIconVariants({ active: page.isActive ?? false, compact: true }))}>\n {iconEl}\n </div>\n <span\n className={cn(\n \"text-[10px] font-medium leading-tight text-center\",\n page.isActive\n ? \"text-foreground font-semibold\"\n : \"text-muted-foreground\"\n )}\n >\n {page.label}\n </span>\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"right\">{page.label}</TooltipContent>\n </Tooltip>\n );\n }\n\n // Expanded (mobile) row\n return (\n <button\n key={page.id}\n type=\"button\"\n className={cn(\n \"flex items-center gap-3 w-full px-3 py-2 text-sm cursor-pointer bg-transparent border-none text-left transition-colors duration-150 rounded-md mx-1\",\n page.isActive\n ? \"bg-sidebar-accent text-sidebar-foreground font-medium\"\n : \"text-muted-foreground hover:bg-sidebar-accent/60 hover:text-foreground\"\n )}\n onClick={handleClick}\n >\n <div className={cn(pageIconVariants({ active: page.isActive ?? false, compact: false }))}>\n {iconEl}\n </div>\n <span>{page.label}</span>\n </button>\n );\n })}\n </div>\n </React.Fragment>\n ))}\n </div>\n\n {/* ── Bottom: user menu slot ──────────────────────────────────────────── */}\n {userMenu && (\n <div\n className={cn(\n \"shrink-0 border-t border-sidebar-border\",\n compact ? \"flex flex-col items-center py-2\" : \"p-2\"\n )}\n >\n {userMenu}\n </div>\n )}\n </TooltipProvider>\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 <nav\n data-slot=\"data-app-sidebar-rail\"\n aria-label=\"Application navigation\"\n className=\"hidden md:flex w-[60px] flex-col shrink-0 bg-sidebar border-r border-sidebar-border h-full z-50\"\n >\n <SidebarBody compact {...props} />\n </nav>\n );\n}\n\n// =============================================================================\n// Top nav\n// =============================================================================\n\nfunction TopNav({\n breadcrumbs = [],\n onHelpClick,\n headerActions,\n mobileTrigger,\n}: {\n breadcrumbs?: BreadcrumbItemConfig[];\n onHelpClick?: () => void;\n headerActions?: React.ReactNode;\n mobileTrigger?: React.ReactNode;\n}) {\n return (\n <div\n data-slot=\"data-app-top-nav\"\n className=\"flex items-center h-10 px-3 bg-sidebar border-b border-sidebar-border sticky top-0 z-40 w-full gap-2\"\n >\n {/* Mobile hamburger (hidden on md+) */}\n {mobileTrigger}\n\n {/* Left: Breadcrumbs */}\n <Breadcrumb className=\"flex-1 min-w-0\">\n <BreadcrumbList>\n {breadcrumbs.map((item, index) => {\n const isLast = index === breadcrumbs.length - 1;\n const isClickable = !isLast && (!!item.href || !!item.onClick);\n return (\n <React.Fragment key={`${item.label}-${index}`}>\n {index > 0 && <BreadcrumbSeparator>/</BreadcrumbSeparator>}\n <BreadcrumbItem>\n {isLast ? (\n <BreadcrumbPage>{item.label}</BreadcrumbPage>\n ) : isClickable && item.href ? (\n <BreadcrumbLink href={item.href}>{item.label}</BreadcrumbLink>\n ) : isClickable && item.onClick ? (\n <button\n type=\"button\"\n className=\"text-[13px] text-primary hover:underline cursor-pointer bg-transparent border-none p-0 font-normal\"\n onClick={item.onClick}\n >\n {item.label}\n </button>\n ) : (\n <span className=\"text-[13px] text-muted-foreground\">{item.label}</span>\n )}\n </BreadcrumbItem>\n </React.Fragment>\n );\n })}\n </BreadcrumbList>\n </Breadcrumb>\n\n {/* Right: header actions + help */}\n <div className=\"flex items-center gap-2 shrink-0\">\n {headerActions}\n\n {onHelpClick && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"w-7 h-7 text-muted-foreground\"\n onClick={onHelpClick}\n aria-label=\"Help\"\n >\n <HelpCircle className=\"w-4 h-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">Help</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n </div>\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 onHelpClick,\n headerActions,\n sidebarPanel,\n children,\n className,\n}: DataAppShellProps) {\n const [mobileNavOpen, setMobileNavOpen] = React.useState(false);\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 return (\n <Sheet open={mobileNavOpen} onOpenChange={setMobileNavOpen}>\n <div\n data-slot=\"data-app-shell\"\n className={cn(\"flex flex-row w-full h-screen overflow-hidden\", className)}\n >\n {/* Desktop icon rail (hidden on mobile) */}\n <IconRailSidebar {...sidebarProps} />\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 <nav aria-label=\"Application navigation\" className=\"flex flex-col h-full\">\n <SidebarBody\n compact={false}\n onAfterNavClick={() => setMobileNavOpen(false)}\n {...sidebarProps}\n />\n </nav>\n </SheetContent>\n\n {/* Right: top nav + panel + content */}\n <div className=\"flex flex-1 flex-col min-w-0 overflow-hidden\">\n <TopNav\n breadcrumbs={breadcrumbs}\n onHelpClick={onHelpClick}\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\n <div className=\"flex flex-1 min-h-0 overflow-hidden\">\n {/* Sidebar panel slot (e.g. WorkflowPanel) */}\n {sidebarPanel}\n\n {/* Content area */}\n <main\n data-slot=\"data-app-shell-content\"\n className=\"flex-1 overflow-auto bg-background\"\n >\n {children}\n </main>\n </div>\n </div>\n </div>\n </Sheet>\n );\n}\n\nexport default DataAppShell;\nexport { DataAppShell };\n"],"names":["pageIconVariants","cva","SidebarBody","appName","appFullName","appIcon","version","navGroups","onAppNameClick","backToPlatformPath","onBackToPlatform","userMenu","compact","onAfterNavClick","TooltipProvider","jsx","cn","DropdownMenu","DropdownMenuTrigger","jsxs","DropdownMenuContent","e","DropdownMenuSeparator","DropdownMenuItem","TDPLink","ArrowLeft","group","groupIndex","React","page","Icon","iconEl","handleClick","Tooltip","TooltipTrigger","TooltipContent","IconRailSidebar","props","TopNav","breadcrumbs","onHelpClick","headerActions","mobileTrigger","Breadcrumb","BreadcrumbList","item","index","isLast","isClickable","BreadcrumbSeparator","BreadcrumbItem","BreadcrumbPage","BreadcrumbLink","Button","HelpCircle","DataAppShell","sidebarPanel","children","className","mobileNavOpen","setMobileNavOpen","sidebarProps","Sheet","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 { cva } from \"class-variance-authority\";\nimport {\n ArrowLeft,\n HelpCircle,\n Menu,\n type LucideIcon,\n} from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { TDPLink } from \"@/components/composed/tdp-link\";\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 {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { cn } from \"@/lib/utils\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface NavPage {\n /** Unique identifier */\n id: string;\n /** Display label */\n label: string;\n /** Lucide icon or custom React SVG component */\n icon?: LucideIcon | React.FC<React.SVGProps<SVGSVGElement>>;\n /** Whether this page is currently active */\n isActive?: boolean;\n /** Click handler */\n onClick?: () => void;\n}\n\nexport interface NavGroup {\n /** Optional group label shown as a section header in expanded nav */\n label?: string;\n /** Page entries in this group */\n pages: NavPage[];\n}\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 /** Callback when the help button is clicked; omit to hide the button */\n onHelpClick?: () => void;\n /** Slot for right-side actions in the top nav (e.g. data count pills, next button) */\n headerActions?: React.ReactNode;\n\n // -- Shell --\n /** Slot rendered between the icon rail and the content (e.g. WorkflowPanel) */\n sidebarPanel?: React.ReactNode;\n /** Show the desktop icon nav rail. Set false to reclaim width when the panel is collapsed. */\n showNavRail?: boolean; // default true\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 (60px): icons + tiny labels stacked, 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\nconst pageIconVariants = cva(\n \"flex items-center justify-center rounded-lg transition-colors duration-150\",\n {\n variants: {\n active: {\n true: \"bg-primary/10\",\n false: \"bg-transparent\",\n },\n compact: {\n true: \"w-9 h-9 hover:bg-accent\",\n false: \"w-8 h-8\",\n },\n },\n defaultVariants: { active: false, compact: true },\n }\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 <TooltipProvider>\n {/* ── Header: app icon / name + version ──────────────────────────────── */}\n <div\n className={cn(\n \"shrink-0 flex\",\n // Expanded: full-width header border. Collapsed: no full-width border —\n // a short centered divider (below) aligns under the icon column instead.\n compact ? \"justify-center py-2\" : \"px-3 py-2.5 border-b border-sidebar-border\"\n )}\n >\n <DropdownMenu>\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 gap-3 w-full text-left\"\n )}\n >\n {/* Icon */}\n <span\n className={cn(\n \"flex items-center justify-center rounded-lg bg-sidebar-accent border border-sidebar-border font-bold text-foreground shrink-0\",\n compact ? \"w-9 h-9 text-[11px]\" : \"w-8 h-8 text-[10px]\"\n )}\n >\n {appIcon ?? appName}\n </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=\"right\" align=\"start\" className=\"min-w-[220px]\">\n <div\n className=\"flex items-center gap-3 px-3 py-2.5 cursor-pointer\"\n onClick={onAppNameClick}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") onAppNameClick?.();\n }}\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 </div>\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 </div>\n\n {/* Collapsed: short centered divider aligned under the icon column\n (matches the nav-group dividers). Expanded uses the header's border-b. */}\n {compact && <div className=\"shrink-0 mx-auto w-8 border-t border-sidebar-border\" />}\n\n {/* ── Nav groups ──────────────────────────────────────────────────────── */}\n <div\n className={cn(\n \"flex-1 min-h-0\",\n compact\n ? \"flex flex-col items-center gap-1 px-2 pt-3 overflow-y-auto\"\n : \"flex flex-col py-2 overflow-y-auto\"\n )}\n >\n {navGroups.map((group, groupIndex) => (\n <React.Fragment key={`${groupIndex}-${group.label ?? \"\"}`}>\n {groupIndex > 0 && (\n <div\n className={cn(\n \"border-t border-sidebar-border\",\n compact ? \"w-8 my-2\" : \"mx-3 my-1\"\n )}\n />\n )}\n {!compact && group.label && (\n <span className=\"px-3 py-1 text-[10px] uppercase tracking-widest text-muted-foreground/60 font-semibold\">\n {group.label}\n </span>\n )}\n <div\n className={cn(\n \"flex flex-col\",\n compact ? \"items-center gap-3 w-full\" : \"gap-0.5\"\n )}\n >\n {group.pages.map((page) => {\n const Icon = page.icon;\n const iconEl = Icon ? (\n <Icon\n className={cn(\n \"w-5 h-5\",\n page.isActive ? \"text-primary\" : \"text-muted-foreground\"\n )}\n />\n ) : (\n <div\n className={cn(\n \"w-2 h-2 rounded-full\",\n page.isActive ? \"bg-primary\" : \"bg-muted-foreground/40\"\n )}\n />\n );\n\n const handleClick = () => {\n page.onClick?.();\n onAfterNavClick?.();\n };\n\n if (compact) {\n return (\n <Tooltip key={page.id}>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n className=\"flex flex-col items-center gap-0.5 cursor-pointer bg-transparent border-none p-0 w-full\"\n onClick={handleClick}\n >\n <div className={cn(pageIconVariants({ active: page.isActive ?? false, compact: true }))}>\n {iconEl}\n </div>\n <span\n className={cn(\n \"text-[10px] font-medium leading-tight text-center\",\n page.isActive\n ? \"text-foreground font-semibold\"\n : \"text-muted-foreground\"\n )}\n >\n {page.label}\n </span>\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"right\">{page.label}</TooltipContent>\n </Tooltip>\n );\n }\n\n // Expanded (mobile) row\n return (\n <button\n key={page.id}\n type=\"button\"\n className={cn(\n \"flex items-center gap-3 w-full px-3 py-2 text-sm cursor-pointer bg-transparent border-none text-left transition-colors duration-150 rounded-md mx-1\",\n page.isActive\n ? \"bg-sidebar-accent text-sidebar-foreground font-medium\"\n : \"text-muted-foreground hover:bg-sidebar-accent/60 hover:text-foreground\"\n )}\n onClick={handleClick}\n >\n <div className={cn(pageIconVariants({ active: page.isActive ?? false, compact: false }))}>\n {iconEl}\n </div>\n <span>{page.label}</span>\n </button>\n );\n })}\n </div>\n </React.Fragment>\n ))}\n </div>\n\n {/* ── Bottom: user menu slot ──────────────────────────────────────────── */}\n {userMenu && (\n <>\n {/* Collapsed: short centered divider aligned under the icon column.\n Expanded uses the full-width border on the wrapper below. */}\n {compact && (\n <div className=\"shrink-0 mx-auto w-8 border-t border-sidebar-border\" />\n )}\n <div\n className={cn(\n \"shrink-0\",\n compact\n ? \"flex flex-col items-center py-2\"\n : \"p-2 border-t border-sidebar-border\"\n )}\n >\n {userMenu}\n </div>\n </>\n )}\n </TooltipProvider>\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 <nav\n data-slot=\"data-app-sidebar-rail\"\n aria-label=\"Application navigation\"\n className=\"hidden md:flex w-[60px] flex-col shrink-0 bg-sidebar border-r border-sidebar-border h-full z-50\"\n >\n <SidebarBody compact {...props} />\n </nav>\n );\n}\n\n// =============================================================================\n// Top nav\n// =============================================================================\n\nfunction TopNav({\n breadcrumbs = [],\n onHelpClick,\n headerActions,\n mobileTrigger,\n}: {\n breadcrumbs?: BreadcrumbItemConfig[];\n onHelpClick?: () => void;\n headerActions?: React.ReactNode;\n mobileTrigger?: React.ReactNode;\n}) {\n return (\n <div\n data-slot=\"data-app-top-nav\"\n className=\"flex items-center h-10 px-3 bg-sidebar border-b border-sidebar-border sticky top-0 z-40 w-full gap-2\"\n >\n {/* Mobile hamburger (hidden on md+) */}\n {mobileTrigger}\n\n {/* Left: Breadcrumbs */}\n <Breadcrumb className=\"flex-1 min-w-0\">\n <BreadcrumbList>\n {breadcrumbs.map((item, index) => {\n const isLast = index === breadcrumbs.length - 1;\n const isClickable = !isLast && (!!item.href || !!item.onClick);\n return (\n <React.Fragment key={`${item.label}-${index}`}>\n {index > 0 && <BreadcrumbSeparator>/</BreadcrumbSeparator>}\n <BreadcrumbItem>\n {isLast ? (\n <BreadcrumbPage>{item.label}</BreadcrumbPage>\n ) : isClickable && item.href ? (\n <BreadcrumbLink href={item.href}>{item.label}</BreadcrumbLink>\n ) : isClickable && item.onClick ? (\n <button\n type=\"button\"\n className=\"text-[13px] text-primary hover:underline cursor-pointer bg-transparent border-none p-0 font-normal\"\n onClick={item.onClick}\n >\n {item.label}\n </button>\n ) : (\n <span className=\"text-[13px] text-muted-foreground\">{item.label}</span>\n )}\n </BreadcrumbItem>\n </React.Fragment>\n );\n })}\n </BreadcrumbList>\n </Breadcrumb>\n\n {/* Right: header actions + help */}\n <div className=\"flex items-center gap-2 shrink-0\">\n {headerActions}\n\n {onHelpClick && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"w-7 h-7 text-muted-foreground\"\n onClick={onHelpClick}\n aria-label=\"Help\"\n >\n <HelpCircle className=\"w-4 h-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">Help</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n </div>\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 onHelpClick,\n headerActions,\n sidebarPanel,\n showNavRail = true,\n children,\n className,\n}: DataAppShellProps) {\n const [mobileNavOpen, setMobileNavOpen] = React.useState(false);\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 return (\n <Sheet open={mobileNavOpen} onOpenChange={setMobileNavOpen}>\n <div\n data-slot=\"data-app-shell\"\n className={cn(\"flex flex-row w-full h-screen overflow-hidden\", className)}\n >\n {/* Desktop icon rail (hidden on mobile, or when showNavRail is false) */}\n {showNavRail && <IconRailSidebar {...sidebarProps} />}\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 <nav aria-label=\"Application navigation\" className=\"flex flex-col h-full\">\n <SidebarBody\n compact={false}\n onAfterNavClick={() => setMobileNavOpen(false)}\n {...sidebarProps}\n />\n </nav>\n </SheetContent>\n\n {/* Right: top nav + panel + content */}\n <div className=\"flex flex-1 flex-col min-w-0 overflow-hidden\">\n <TopNav\n breadcrumbs={breadcrumbs}\n onHelpClick={onHelpClick}\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\n <div className=\"flex flex-1 min-h-0 overflow-hidden\">\n {/* Sidebar panel slot (e.g. WorkflowPanel) */}\n {sidebarPanel}\n\n {/* Content area */}\n <main\n data-slot=\"data-app-shell-content\"\n className=\"flex-1 overflow-auto bg-background\"\n >\n {children}\n </main>\n </div>\n </div>\n </div>\n </Sheet>\n );\n}\n\nexport default DataAppShell;\nexport { DataAppShell };\n"],"names":["pageIconVariants","cva","SidebarBody","appName","appFullName","appIcon","version","navGroups","onAppNameClick","backToPlatformPath","onBackToPlatform","userMenu","compact","onAfterNavClick","TooltipProvider","jsx","cn","DropdownMenu","DropdownMenuTrigger","jsxs","DropdownMenuContent","e","DropdownMenuSeparator","DropdownMenuItem","TDPLink","ArrowLeft","group","groupIndex","React","page","Icon","iconEl","handleClick","Tooltip","TooltipTrigger","TooltipContent","Fragment","IconRailSidebar","props","TopNav","breadcrumbs","onHelpClick","headerActions","mobileTrigger","Breadcrumb","BreadcrumbList","item","index","isLast","isClickable","BreadcrumbSeparator","BreadcrumbItem","BreadcrumbPage","BreadcrumbLink","Button","HelpCircle","DataAppShell","sidebarPanel","showNavRail","children","className","mobileNavOpen","setMobileNavOpen","sidebarProps","Sheet","SheetContent","SheetTitle","SheetDescription","SheetTrigger","Menu"],"mappings":"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"}
|