@mikenotthepope/substrateui 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,112 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+ import { T as Tabs, a as TabsContent, b as TabsList, c as TabsTrigger } from './tabs-d_9ZRlWe.js';
4
+ import '@radix-ui/react-tabs';
5
+
6
+ /** Full-height application shell container with horizontal flex layout.
7
+ *
8
+ * @example
9
+ * <AppShell><AppShellSidebar>...</AppShellSidebar><AppShellMain>...</AppShellMain></AppShell>
10
+ */
11
+ declare function AppShell({ className, ref, ...props }: React.ComponentPropsWithRef<"div">): react_jsx_runtime.JSX.Element;
12
+ /** Fixed-width sidebar panel hidden on mobile, visible on md+ screens.
13
+ *
14
+ * @prop collapsed - Whether the sidebar is in collapsed state.
15
+ */
16
+ declare function AppShellSidebar({ collapsed, className, ref, ...props }: React.ComponentPropsWithRef<"aside"> & {
17
+ collapsed?: boolean;
18
+ }): react_jsx_runtime.JSX.Element;
19
+ /** Logo area at the top of the sidebar with a bottom border. */
20
+ declare function AppShellLogo({ className, ref, ...props }: React.ComponentPropsWithRef<"div">): react_jsx_runtime.JSX.Element;
21
+ /** Scrollable navigation region within the sidebar. */
22
+ declare function AppShellNav({ className, ref, ...props }: React.ComponentPropsWithRef<"nav">): react_jsx_runtime.JSX.Element;
23
+ /** Props for AppShellNavItem including optional icon and active state. */
24
+ interface AppShellNavItemProps extends React.ComponentPropsWithRef<"a"> {
25
+ icon?: React.ComponentType<{
26
+ className?: string;
27
+ }>;
28
+ active?: boolean;
29
+ }
30
+ /** Navigation link with optional leading icon and active highlight.
31
+ *
32
+ * @example
33
+ * <AppShellNavItem icon={HomeIcon} active href="/">Home</AppShellNavItem>
34
+ *
35
+ * @prop icon - Optional icon component rendered before the label.
36
+ * @prop active - Whether this item represents the current page.
37
+ */
38
+ declare function AppShellNavItem({ icon: Icon, active, className, children, ref, ...props }: AppShellNavItemProps): react_jsx_runtime.JSX.Element;
39
+ /** Footer area pinned to the bottom of the sidebar with a top border. */
40
+ declare function AppShellFooter({ className, ref, ...props }: React.ComponentPropsWithRef<"div">): react_jsx_runtime.JSX.Element;
41
+ /** Scrollable main content area that fills remaining horizontal space. */
42
+ declare function AppShellMain({ className, ref, ...props }: React.ComponentPropsWithRef<"main">): react_jsx_runtime.JSX.Element;
43
+
44
+ /** Props for PageBody including optional full-width mode and padding control. */
45
+ interface PageBodyProps extends React.ComponentPropsWithRef<"div"> {
46
+ fullWidth?: boolean;
47
+ padding?: "default" | "none";
48
+ }
49
+ /** Main page content area with optional max-width centering and padding.
50
+ *
51
+ * @example
52
+ * <PageBody fullWidth>{children}</PageBody>
53
+ *
54
+ * @prop fullWidth - Skip the max-width Center wrapper when true.
55
+ * @prop padding - Use "none" to remove default padding.
56
+ */
57
+ declare function PageBody({ fullWidth, padding, className, children, ref, ...props }: PageBodyProps): react_jsx_runtime.JSX.Element;
58
+
59
+ /** Page-level header with bottom border, card background, and vertical stack layout.
60
+ *
61
+ * @example
62
+ * <PageHeader><PageHeaderContent><PageHeaderTitle>Dashboard</PageHeaderTitle></PageHeaderContent></PageHeader>
63
+ */
64
+ declare function PageHeader({ className, ref, ...props }: React.ComponentPropsWithRef<"header">): react_jsx_runtime.JSX.Element;
65
+ /** Container for breadcrumb navigation above the page title. */
66
+ declare function PageHeaderBreadcrumb({ className, ref, ...props }: React.ComponentPropsWithRef<"div">): react_jsx_runtime.JSX.Element;
67
+ /** Flex row that spaces the title area and actions apart responsively. */
68
+ declare function PageHeaderContent({ className, ref, ...props }: React.ComponentPropsWithRef<"div">): react_jsx_runtime.JSX.Element;
69
+ /** Primary page heading rendered as a bold h1. */
70
+ declare function PageHeaderTitle({ className, ref, ...props }: React.ComponentPropsWithRef<"h1">): react_jsx_runtime.JSX.Element;
71
+ /** Short muted description text displayed below the page title. */
72
+ declare function PageHeaderDescription({ className, ref, ...props }: React.ComponentPropsWithRef<"p">): react_jsx_runtime.JSX.Element;
73
+ /** Container for action buttons aligned to the right of the header. */
74
+ declare function PageHeaderActions({ className, ref, ...props }: React.ComponentPropsWithRef<"div">): react_jsx_runtime.JSX.Element;
75
+
76
+ /** Full-width page-level tabs container.
77
+ *
78
+ * @example
79
+ * <PageTabs defaultValue="overview"><PageTabsList><PageTabsTrigger value="overview">Overview</PageTabsTrigger></PageTabsList><PageTabsContent value="overview">...</PageTabsContent></PageTabs>
80
+ */
81
+ declare function PageTabs({ className, ...props }: React.ComponentProps<typeof Tabs>): react_jsx_runtime.JSX.Element;
82
+ /** Underline-style tab list with transparent background and bottom border. */
83
+ declare function PageTabsList({ className, ref, ...props }: React.ComponentPropsWithRef<typeof TabsList>): react_jsx_runtime.JSX.Element;
84
+ /** Individual page tab trigger with an active underline indicator. */
85
+ declare function PageTabsTrigger({ className, ref, ...props }: React.ComponentPropsWithRef<typeof TabsTrigger>): react_jsx_runtime.JSX.Element;
86
+ /** Content panel associated with a page tab value. */
87
+ declare function PageTabsContent({ className, ref, ...props }: React.ComponentPropsWithRef<typeof TabsContent>): react_jsx_runtime.JSX.Element;
88
+
89
+ /** Props for StatCard including title, value, and optional change indicator. */
90
+ interface StatCardProps extends Omit<React.ComponentPropsWithRef<"div">, "title"> {
91
+ title: string;
92
+ value: string;
93
+ change?: string;
94
+ changeType?: "positive" | "negative" | "neutral";
95
+ icon?: React.ComponentType<{
96
+ className?: string;
97
+ }>;
98
+ }
99
+ /** Card displaying a key metric with title, value, optional change badge, and icon.
100
+ *
101
+ * @example
102
+ * <StatCard title="Revenue" value="$12,345" change="+12%" changeType="positive" />
103
+ *
104
+ * @prop title - Metric label displayed in uppercase monospace.
105
+ * @prop value - Primary numeric or text value.
106
+ * @prop change - Optional change indicator text (e.g. "+5%").
107
+ * @prop changeType - Color coding: "positive", "negative", or "neutral".
108
+ * @prop icon - Optional icon component displayed at top-right.
109
+ */
110
+ declare function StatCard({ title, value, change, changeType, icon: Icon, className, ref, ...props }: StatCardProps): react_jsx_runtime.JSX.Element;
111
+
112
+ export { AppShell, AppShellFooter, AppShellLogo, AppShellMain, AppShellNav, AppShellNavItem, type AppShellNavItemProps, AppShellSidebar, PageBody, type PageBodyProps, PageHeader, PageHeaderActions, PageHeaderBreadcrumb, PageHeaderContent, PageHeaderDescription, PageHeaderTitle, PageTabs, PageTabsContent, PageTabsList, PageTabsTrigger, StatCard, type StatCardProps };
@@ -0,0 +1,403 @@
1
+ "use client";
2
+ import { Stack, Center, Tabs, TabsList, TabsTrigger, TabsContent, Card, CardContent } from './chunk-IRBORST3.js';
3
+ import { __objRest, __spreadValues, cn, __spreadProps } from './chunk-IQWAGBDM.js';
4
+ import { jsx, jsxs } from 'react/jsx-runtime';
5
+
6
+ function AppShell(_a) {
7
+ var _b = _a, {
8
+ className,
9
+ ref
10
+ } = _b, props = __objRest(_b, [
11
+ "className",
12
+ "ref"
13
+ ]);
14
+ return /* @__PURE__ */ jsx(
15
+ "div",
16
+ __spreadValues({
17
+ ref,
18
+ "data-slot": "app-shell",
19
+ className: cn("flex h-screen overflow-hidden bg-background", className)
20
+ }, props)
21
+ );
22
+ }
23
+ function AppShellSidebar(_a) {
24
+ var _b = _a, {
25
+ collapsed = false,
26
+ className,
27
+ ref
28
+ } = _b, props = __objRest(_b, [
29
+ "collapsed",
30
+ "className",
31
+ "ref"
32
+ ]);
33
+ return /* @__PURE__ */ jsx(
34
+ "aside",
35
+ __spreadValues({
36
+ ref,
37
+ "data-slot": "app-shell-sidebar",
38
+ className: cn(
39
+ "flex-col w-64 shrink-0 border-e-2 bg-card",
40
+ collapsed ? "hidden md:flex" : "hidden md:flex",
41
+ className
42
+ )
43
+ }, props)
44
+ );
45
+ }
46
+ function AppShellLogo(_a) {
47
+ var _b = _a, {
48
+ className,
49
+ ref
50
+ } = _b, props = __objRest(_b, [
51
+ "className",
52
+ "ref"
53
+ ]);
54
+ return /* @__PURE__ */ jsx(
55
+ "div",
56
+ __spreadValues({
57
+ ref,
58
+ "data-slot": "app-shell-logo",
59
+ className: cn(
60
+ "flex items-center h-16 px-6 border-b-2 shrink-0",
61
+ className
62
+ )
63
+ }, props)
64
+ );
65
+ }
66
+ function AppShellNav(_a) {
67
+ var _b = _a, {
68
+ className,
69
+ ref
70
+ } = _b, props = __objRest(_b, [
71
+ "className",
72
+ "ref"
73
+ ]);
74
+ return /* @__PURE__ */ jsx(
75
+ "nav",
76
+ {
77
+ ref,
78
+ "data-slot": "app-shell-nav",
79
+ className: cn("flex-1 overflow-y-auto py-4 px-3", className),
80
+ children: /* @__PURE__ */ jsx(Stack, __spreadValues({ gap: "xs" }, props))
81
+ }
82
+ );
83
+ }
84
+ function AppShellNavItem(_a) {
85
+ var _b = _a, {
86
+ icon: Icon,
87
+ active = false,
88
+ className,
89
+ children,
90
+ ref
91
+ } = _b, props = __objRest(_b, [
92
+ "icon",
93
+ "active",
94
+ "className",
95
+ "children",
96
+ "ref"
97
+ ]);
98
+ return /* @__PURE__ */ jsxs(
99
+ "a",
100
+ __spreadProps(__spreadValues({
101
+ ref,
102
+ "data-slot": "app-shell-nav-item",
103
+ "data-active": active || void 0,
104
+ className: cn(
105
+ "flex items-center gap-3 rounded-md px-3 py-2 text-sm transition-colors active:translate-y-[1.5px] transition-transform",
106
+ active ? "bg-accent text-accent-foreground font-medium" : "text-muted-foreground hover:bg-surface-interactive hover:text-foreground",
107
+ className
108
+ )
109
+ }, props), {
110
+ children: [
111
+ Icon && /* @__PURE__ */ jsx(Icon, { className: "size-4" }),
112
+ children
113
+ ]
114
+ })
115
+ );
116
+ }
117
+ function AppShellFooter(_a) {
118
+ var _b = _a, {
119
+ className,
120
+ ref
121
+ } = _b, props = __objRest(_b, [
122
+ "className",
123
+ "ref"
124
+ ]);
125
+ return /* @__PURE__ */ jsx(
126
+ "div",
127
+ __spreadValues({
128
+ ref,
129
+ "data-slot": "app-shell-footer",
130
+ className: cn("shrink-0 border-t-2 p-4", className)
131
+ }, props)
132
+ );
133
+ }
134
+ function AppShellMain(_a) {
135
+ var _b = _a, {
136
+ className,
137
+ ref
138
+ } = _b, props = __objRest(_b, [
139
+ "className",
140
+ "ref"
141
+ ]);
142
+ return /* @__PURE__ */ jsx(
143
+ "main",
144
+ __spreadValues({
145
+ ref,
146
+ "data-slot": "app-shell-main",
147
+ className: cn("flex-1 overflow-y-auto", className)
148
+ }, props)
149
+ );
150
+ }
151
+ function PageBody(_a) {
152
+ var _b = _a, {
153
+ fullWidth = false,
154
+ padding = "default",
155
+ className,
156
+ children,
157
+ ref
158
+ } = _b, props = __objRest(_b, [
159
+ "fullWidth",
160
+ "padding",
161
+ "className",
162
+ "children",
163
+ "ref"
164
+ ]);
165
+ return /* @__PURE__ */ jsx(
166
+ "div",
167
+ __spreadProps(__spreadValues({
168
+ ref,
169
+ "data-slot": "page-body",
170
+ className: cn(padding === "default" && "px-6 py-6", className)
171
+ }, props), {
172
+ children: fullWidth ? children : /* @__PURE__ */ jsx(Center, { max: "2xl", children })
173
+ })
174
+ );
175
+ }
176
+ function PageHeader(_a) {
177
+ var _b = _a, {
178
+ className,
179
+ ref
180
+ } = _b, props = __objRest(_b, [
181
+ "className",
182
+ "ref"
183
+ ]);
184
+ return /* @__PURE__ */ jsx(
185
+ "header",
186
+ {
187
+ ref,
188
+ "data-slot": "page-header",
189
+ className: cn("border-b-2 bg-card px-6 py-6", className),
190
+ children: /* @__PURE__ */ jsx(Stack, __spreadValues({ gap: "md" }, props))
191
+ }
192
+ );
193
+ }
194
+ function PageHeaderBreadcrumb(_a) {
195
+ var _b = _a, {
196
+ className,
197
+ ref
198
+ } = _b, props = __objRest(_b, [
199
+ "className",
200
+ "ref"
201
+ ]);
202
+ return /* @__PURE__ */ jsx(
203
+ "div",
204
+ __spreadValues({
205
+ ref,
206
+ "data-slot": "page-header-breadcrumb",
207
+ className
208
+ }, props)
209
+ );
210
+ }
211
+ function PageHeaderContent(_a) {
212
+ var _b = _a, {
213
+ className,
214
+ ref
215
+ } = _b, props = __objRest(_b, [
216
+ "className",
217
+ "ref"
218
+ ]);
219
+ return /* @__PURE__ */ jsx(
220
+ "div",
221
+ __spreadValues({
222
+ ref,
223
+ "data-slot": "page-header-content",
224
+ className: cn(
225
+ "flex flex-col sm:flex-row sm:items-center justify-between gap-4",
226
+ className
227
+ )
228
+ }, props)
229
+ );
230
+ }
231
+ function PageHeaderTitle(_a) {
232
+ var _b = _a, {
233
+ className,
234
+ ref
235
+ } = _b, props = __objRest(_b, [
236
+ "className",
237
+ "ref"
238
+ ]);
239
+ return /* @__PURE__ */ jsx(
240
+ "h1",
241
+ __spreadValues({
242
+ ref,
243
+ "data-slot": "page-header-title",
244
+ className: cn("text-2xl font-bold tracking-tight", className)
245
+ }, props)
246
+ );
247
+ }
248
+ function PageHeaderDescription(_a) {
249
+ var _b = _a, {
250
+ className,
251
+ ref
252
+ } = _b, props = __objRest(_b, [
253
+ "className",
254
+ "ref"
255
+ ]);
256
+ return /* @__PURE__ */ jsx(
257
+ "p",
258
+ __spreadValues({
259
+ ref,
260
+ "data-slot": "page-header-description",
261
+ className: cn("text-sm text-muted-foreground mt-1", className)
262
+ }, props)
263
+ );
264
+ }
265
+ function PageHeaderActions(_a) {
266
+ var _b = _a, {
267
+ className,
268
+ ref
269
+ } = _b, props = __objRest(_b, [
270
+ "className",
271
+ "ref"
272
+ ]);
273
+ return /* @__PURE__ */ jsx(
274
+ "div",
275
+ __spreadValues({
276
+ ref,
277
+ "data-slot": "page-header-actions",
278
+ className: cn("flex items-center gap-2 shrink-0", className)
279
+ }, props)
280
+ );
281
+ }
282
+ function PageTabs(_a) {
283
+ var _b = _a, {
284
+ className
285
+ } = _b, props = __objRest(_b, [
286
+ "className"
287
+ ]);
288
+ return /* @__PURE__ */ jsx(
289
+ Tabs,
290
+ __spreadValues({
291
+ "data-slot": "page-tabs",
292
+ className: cn("w-full", className)
293
+ }, props)
294
+ );
295
+ }
296
+ function PageTabsList(_a) {
297
+ var _b = _a, {
298
+ className,
299
+ ref
300
+ } = _b, props = __objRest(_b, [
301
+ "className",
302
+ "ref"
303
+ ]);
304
+ return /* @__PURE__ */ jsx(
305
+ TabsList,
306
+ __spreadValues({
307
+ ref,
308
+ "data-slot": "page-tabs-list",
309
+ className: cn(
310
+ "bg-transparent border-b-2 rounded-none h-auto p-0 w-full justify-start",
311
+ className
312
+ )
313
+ }, props)
314
+ );
315
+ }
316
+ function PageTabsTrigger(_a) {
317
+ var _b = _a, {
318
+ className,
319
+ ref
320
+ } = _b, props = __objRest(_b, [
321
+ "className",
322
+ "ref"
323
+ ]);
324
+ return /* @__PURE__ */ jsx(
325
+ TabsTrigger,
326
+ __spreadValues({
327
+ ref,
328
+ "data-slot": "page-tabs-trigger",
329
+ className: cn(
330
+ "rounded-none border-b-2 border-transparent data-[state=active]:border-primary data-[state=active]:bg-transparent data-[state=active]:shadow-none px-4 pb-3 pt-2",
331
+ className
332
+ )
333
+ }, props)
334
+ );
335
+ }
336
+ function PageTabsContent(_a) {
337
+ var _b = _a, {
338
+ className,
339
+ ref
340
+ } = _b, props = __objRest(_b, [
341
+ "className",
342
+ "ref"
343
+ ]);
344
+ return /* @__PURE__ */ jsx(
345
+ TabsContent,
346
+ __spreadValues({
347
+ ref,
348
+ "data-slot": "page-tabs-content",
349
+ className
350
+ }, props)
351
+ );
352
+ }
353
+ var changeTypeStyles = {
354
+ positive: "text-status-success-text",
355
+ negative: "text-status-error-text",
356
+ neutral: "text-muted-foreground"
357
+ };
358
+ var changeTypeIndicators = {
359
+ positive: { glyph: "\u25B2", label: "Increase of" },
360
+ negative: { glyph: "\u25BC", label: "Decrease of" },
361
+ neutral: { glyph: "\u2022", label: "Change of" }
362
+ };
363
+ function StatCard(_a) {
364
+ var _b = _a, {
365
+ title,
366
+ value,
367
+ change,
368
+ changeType = "neutral",
369
+ icon: Icon,
370
+ className,
371
+ ref
372
+ } = _b, props = __objRest(_b, [
373
+ "title",
374
+ "value",
375
+ "change",
376
+ "changeType",
377
+ "icon",
378
+ "className",
379
+ "ref"
380
+ ]);
381
+ return /* @__PURE__ */ jsx(Card, __spreadProps(__spreadValues({ ref, "data-slot": "stat-card", className }, props), { children: /* @__PURE__ */ jsx(CardContent, { className: "p-6", children: /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between", children: [
382
+ /* @__PURE__ */ jsxs("div", { children: [
383
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-muted-foreground font-mono uppercase tracking-wider", children: title }),
384
+ /* @__PURE__ */ jsx("p", { className: "text-3xl font-bold tracking-tight mt-1", children: value }),
385
+ change && /* @__PURE__ */ jsxs("p", { className: cn("text-xs font-mono mt-1", changeTypeStyles[changeType]), children: [
386
+ /* @__PURE__ */ jsxs("span", { "aria-hidden": "true", children: [
387
+ changeTypeIndicators[changeType].glyph,
388
+ " "
389
+ ] }),
390
+ /* @__PURE__ */ jsxs("span", { className: "sr-only", children: [
391
+ changeTypeIndicators[changeType].label,
392
+ " "
393
+ ] }),
394
+ change
395
+ ] })
396
+ ] }),
397
+ Icon && /* @__PURE__ */ jsx(Icon, { className: "text-muted-foreground size-5" })
398
+ ] }) }) }));
399
+ }
400
+
401
+ export { AppShell, AppShellFooter, AppShellLogo, AppShellMain, AppShellNav, AppShellNavItem, AppShellSidebar, PageBody, PageHeader, PageHeaderActions, PageHeaderBreadcrumb, PageHeaderContent, PageHeaderDescription, PageHeaderTitle, PageTabs, PageTabsContent, PageTabsList, PageTabsTrigger, StatCard };
402
+ //# sourceMappingURL=organisms.js.map
403
+ //# sourceMappingURL=organisms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/app-shell.tsx","../src/components/page-body.tsx","../src/components/page-header.tsx","../src/components/page-tabs.tsx","../src/components/stat-card.tsx"],"names":["jsx","jsxs"],"mappings":"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","file":"organisms.js","sourcesContent":["import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Stack } from \"@/components/ui/stack\"\n\n/** Full-height application shell container with horizontal flex layout.\n *\n * @example\n * <AppShell><AppShellSidebar>...</AppShellSidebar><AppShellMain>...</AppShellMain></AppShell>\n */\nfunction AppShell({\n className,\n ref,\n ...props\n}: React.ComponentPropsWithRef<\"div\">) {\n return (\n <div\n ref={ref}\n data-slot=\"app-shell\"\n className={cn(\"flex h-screen overflow-hidden bg-background\", className)}\n {...props}\n />\n )\n}\n\n/** Fixed-width sidebar panel hidden on mobile, visible on md+ screens.\n *\n * @prop collapsed - Whether the sidebar is in collapsed state.\n */\nfunction AppShellSidebar({\n collapsed = false,\n className,\n ref,\n ...props\n}: React.ComponentPropsWithRef<\"aside\"> & { collapsed?: boolean }) {\n return (\n <aside\n ref={ref}\n data-slot=\"app-shell-sidebar\"\n className={cn(\n \"flex-col w-64 shrink-0 border-e-2 bg-card\",\n collapsed ? \"hidden md:flex\" : \"hidden md:flex\",\n className,\n )}\n {...props}\n />\n )\n}\n\n/** Logo area at the top of the sidebar with a bottom border. */\nfunction AppShellLogo({\n className,\n ref,\n ...props\n}: React.ComponentPropsWithRef<\"div\">) {\n return (\n <div\n ref={ref}\n data-slot=\"app-shell-logo\"\n className={cn(\n \"flex items-center h-16 px-6 border-b-2 shrink-0\",\n className,\n )}\n {...props}\n />\n )\n}\n\n/** Scrollable navigation region within the sidebar. */\nfunction AppShellNav({\n className,\n ref,\n ...props\n}: React.ComponentPropsWithRef<\"nav\">) {\n return (\n <nav\n ref={ref}\n data-slot=\"app-shell-nav\"\n className={cn(\"flex-1 overflow-y-auto py-4 px-3\", className)}\n >\n <Stack gap=\"xs\" {...props} />\n </nav>\n )\n}\n\n/** Props for AppShellNavItem including optional icon and active state. */\ninterface AppShellNavItemProps extends React.ComponentPropsWithRef<\"a\"> {\n icon?: React.ComponentType<{ className?: string }>\n active?: boolean\n}\n\n/** Navigation link with optional leading icon and active highlight.\n *\n * @example\n * <AppShellNavItem icon={HomeIcon} active href=\"/\">Home</AppShellNavItem>\n *\n * @prop icon - Optional icon component rendered before the label.\n * @prop active - Whether this item represents the current page.\n */\nfunction AppShellNavItem({\n icon: Icon,\n active = false,\n className,\n children,\n ref,\n ...props\n}: AppShellNavItemProps) {\n return (\n <a\n ref={ref}\n data-slot=\"app-shell-nav-item\"\n data-active={active || undefined}\n className={cn(\n \"flex items-center gap-3 rounded-md px-3 py-2 text-sm transition-colors active:translate-y-[1.5px] transition-transform\",\n active\n ? \"bg-accent text-accent-foreground font-medium\"\n : \"text-muted-foreground hover:bg-surface-interactive hover:text-foreground\",\n className,\n )}\n {...props}\n >\n {Icon && <Icon className=\"size-4\" />}\n {children}\n </a>\n )\n}\n\n/** Footer area pinned to the bottom of the sidebar with a top border. */\nfunction AppShellFooter({\n className,\n ref,\n ...props\n}: React.ComponentPropsWithRef<\"div\">) {\n return (\n <div\n ref={ref}\n data-slot=\"app-shell-footer\"\n className={cn(\"shrink-0 border-t-2 p-4\", className)}\n {...props}\n />\n )\n}\n\n/** Scrollable main content area that fills remaining horizontal space. */\nfunction AppShellMain({\n className,\n ref,\n ...props\n}: React.ComponentPropsWithRef<\"main\">) {\n return (\n <main\n ref={ref}\n data-slot=\"app-shell-main\"\n className={cn(\"flex-1 overflow-y-auto\", className)}\n {...props}\n />\n )\n}\n\nexport {\n AppShell,\n AppShellSidebar,\n AppShellLogo,\n AppShellNav,\n AppShellNavItem,\n AppShellFooter,\n AppShellMain,\n type AppShellNavItemProps,\n}\n","import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Center } from \"@/components/ui/center\"\n\n/** Props for PageBody including optional full-width mode and padding control. */\ninterface PageBodyProps extends React.ComponentPropsWithRef<\"div\"> {\n fullWidth?: boolean\n padding?: \"default\" | \"none\"\n}\n\n/** Main page content area with optional max-width centering and padding.\n *\n * @example\n * <PageBody fullWidth>{children}</PageBody>\n *\n * @prop fullWidth - Skip the max-width Center wrapper when true.\n * @prop padding - Use \"none\" to remove default padding.\n */\nfunction PageBody({\n fullWidth = false,\n padding = \"default\",\n className,\n children,\n ref,\n ...props\n}: PageBodyProps) {\n return (\n <div\n ref={ref}\n data-slot=\"page-body\"\n className={cn(padding === \"default\" && \"px-6 py-6\", className)}\n {...props}\n >\n {fullWidth ? children : <Center max=\"2xl\">{children}</Center>}\n </div>\n )\n}\n\nexport { PageBody, type PageBodyProps }\n","import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Stack } from \"@/components/ui/stack\"\n\n/** Page-level header with bottom border, card background, and vertical stack layout.\n *\n * @example\n * <PageHeader><PageHeaderContent><PageHeaderTitle>Dashboard</PageHeaderTitle></PageHeaderContent></PageHeader>\n */\nfunction PageHeader({\n className,\n ref,\n ...props\n}: React.ComponentPropsWithRef<\"header\">) {\n return (\n <header\n ref={ref}\n data-slot=\"page-header\"\n className={cn(\"border-b-2 bg-card px-6 py-6\", className)}\n >\n <Stack gap=\"md\" {...props} />\n </header>\n )\n}\n\n/** Container for breadcrumb navigation above the page title. */\nfunction PageHeaderBreadcrumb({\n className,\n ref,\n ...props\n}: React.ComponentPropsWithRef<\"div\">) {\n return (\n <div\n ref={ref}\n data-slot=\"page-header-breadcrumb\"\n className={className}\n {...props}\n />\n )\n}\n\n/** Flex row that spaces the title area and actions apart responsively. */\nfunction PageHeaderContent({\n className,\n ref,\n ...props\n}: React.ComponentPropsWithRef<\"div\">) {\n return (\n <div\n ref={ref}\n data-slot=\"page-header-content\"\n className={cn(\n \"flex flex-col sm:flex-row sm:items-center justify-between gap-4\",\n className,\n )}\n {...props}\n />\n )\n}\n\n/** Primary page heading rendered as a bold h1. */\nfunction PageHeaderTitle({\n className,\n ref,\n ...props\n}: React.ComponentPropsWithRef<\"h1\">) {\n return (\n <h1\n ref={ref}\n data-slot=\"page-header-title\"\n className={cn(\"text-2xl font-bold tracking-tight\", className)}\n {...props}\n />\n )\n}\n\n/** Short muted description text displayed below the page title. */\nfunction PageHeaderDescription({\n className,\n ref,\n ...props\n}: React.ComponentPropsWithRef<\"p\">) {\n return (\n <p\n ref={ref}\n data-slot=\"page-header-description\"\n className={cn(\"text-sm text-muted-foreground mt-1\", className)}\n {...props}\n />\n )\n}\n\n/** Container for action buttons aligned to the right of the header. */\nfunction PageHeaderActions({\n className,\n ref,\n ...props\n}: React.ComponentPropsWithRef<\"div\">) {\n return (\n <div\n ref={ref}\n data-slot=\"page-header-actions\"\n className={cn(\"flex items-center gap-2 shrink-0\", className)}\n {...props}\n />\n )\n}\n\nexport {\n PageHeader,\n PageHeaderBreadcrumb,\n PageHeaderContent,\n PageHeaderTitle,\n PageHeaderDescription,\n PageHeaderActions,\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from \"@/components/ui/tabs\"\n\n/** Full-width page-level tabs container.\n *\n * @example\n * <PageTabs defaultValue=\"overview\"><PageTabsList><PageTabsTrigger value=\"overview\">Overview</PageTabsTrigger></PageTabsList><PageTabsContent value=\"overview\">...</PageTabsContent></PageTabs>\n */\nfunction PageTabs({\n className,\n ...props\n}: React.ComponentProps<typeof Tabs>) {\n return (\n <Tabs\n data-slot=\"page-tabs\"\n className={cn(\"w-full\", className)}\n {...props}\n />\n )\n}\n\n/** Underline-style tab list with transparent background and bottom border. */\nfunction PageTabsList({\n className,\n ref,\n ...props\n}: React.ComponentPropsWithRef<typeof TabsList>) {\n return (\n <TabsList\n ref={ref}\n data-slot=\"page-tabs-list\"\n className={cn(\n \"bg-transparent border-b-2 rounded-none h-auto p-0 w-full justify-start\",\n className,\n )}\n {...props}\n />\n )\n}\n\n/** Individual page tab trigger with an active underline indicator. */\nfunction PageTabsTrigger({\n className,\n ref,\n ...props\n}: React.ComponentPropsWithRef<typeof TabsTrigger>) {\n return (\n <TabsTrigger\n ref={ref}\n data-slot=\"page-tabs-trigger\"\n className={cn(\n \"rounded-none border-b-2 border-transparent data-[state=active]:border-primary data-[state=active]:bg-transparent data-[state=active]:shadow-none px-4 pb-3 pt-2\",\n className,\n )}\n {...props}\n />\n )\n}\n\n/** Content panel associated with a page tab value. */\nfunction PageTabsContent({\n className,\n ref,\n ...props\n}: React.ComponentPropsWithRef<typeof TabsContent>) {\n return (\n <TabsContent\n ref={ref}\n data-slot=\"page-tabs-content\"\n className={className}\n {...props}\n />\n )\n}\n\nexport { PageTabs, PageTabsList, PageTabsTrigger, PageTabsContent }\n","import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Card, CardContent } from \"@/components/ui/card\"\n\n/** Props for StatCard including title, value, and optional change indicator. */\ninterface StatCardProps extends Omit<React.ComponentPropsWithRef<\"div\">, \"title\"> {\n title: string\n value: string\n change?: string\n changeType?: \"positive\" | \"negative\" | \"neutral\"\n icon?: React.ComponentType<{ className?: string }>\n}\n\n/** Color map for stat change indicators keyed by sentiment. */\nconst changeTypeStyles = {\n positive: \"text-status-success-text\",\n negative: \"text-status-error-text\",\n neutral: \"text-muted-foreground\",\n} as const\n\n/** Non-color sentiment indicators (prefixed glyphs + screen-reader text). */\nconst changeTypeIndicators = {\n positive: { glyph: \"▲\", label: \"Increase of\" },\n negative: { glyph: \"▼\", label: \"Decrease of\" },\n neutral: { glyph: \"•\", label: \"Change of\" },\n} as const\n\n/** Card displaying a key metric with title, value, optional change badge, and icon.\n *\n * @example\n * <StatCard title=\"Revenue\" value=\"$12,345\" change=\"+12%\" changeType=\"positive\" />\n *\n * @prop title - Metric label displayed in uppercase monospace.\n * @prop value - Primary numeric or text value.\n * @prop change - Optional change indicator text (e.g. \"+5%\").\n * @prop changeType - Color coding: \"positive\", \"negative\", or \"neutral\".\n * @prop icon - Optional icon component displayed at top-right.\n */\nfunction StatCard({\n title,\n value,\n change,\n changeType = \"neutral\",\n icon: Icon,\n className,\n ref,\n ...props\n}: StatCardProps) {\n return (\n <Card ref={ref} data-slot=\"stat-card\" className={className} {...props}>\n <CardContent className=\"p-6\">\n <div className=\"flex items-start justify-between\">\n <div>\n <p className=\"text-sm font-medium text-muted-foreground font-mono uppercase tracking-wider\">\n {title}\n </p>\n <p className=\"text-3xl font-bold tracking-tight mt-1\">{value}</p>\n {change && (\n <p className={cn(\"text-xs font-mono mt-1\", changeTypeStyles[changeType])}>\n <span aria-hidden=\"true\">{changeTypeIndicators[changeType].glyph} </span>\n <span className=\"sr-only\">{changeTypeIndicators[changeType].label} </span>\n {change}\n </p>\n )}\n </div>\n {Icon && <Icon className=\"text-muted-foreground size-5\" />}\n </div>\n </CardContent>\n </Card>\n )\n}\n\nexport { StatCard, type StatCardProps }\n"]}