@clayer/dashboard-layout 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,164 @@
1
+ # `@clayer/dashboard-layout`
2
+
3
+ Reusable dashboard shell for React applications built on top of:
4
+
5
+ - `@clayer/theme`
6
+ - `@clayer/utils`
7
+
8
+ This package intentionally does **not** depend on `@clayer/ui` yet.
9
+
10
+ ## Current Scope
11
+
12
+ The package currently provides:
13
+
14
+ - `DashboardLayout`
15
+ - `DashboardShell`
16
+ - `DashboardHeader`
17
+ - `DashboardContent`
18
+ - `DashboardFooter`
19
+ - `DashboardMobileNav`
20
+ - `DashboardUserMenu`
21
+ - `DashboardBreadcrumbs`
22
+ - `DashboardActionGroup`
23
+ - `DashboardSidebar`
24
+ - `SidebarNav`
25
+ - `SidebarNavItem`
26
+ - `SidebarNavGroup`
27
+
28
+ ## Architecture
29
+
30
+ Dependency direction:
31
+
32
+ ```txt
33
+ @clayer/utils
34
+ @clayer/theme
35
+
36
+ @clayer/dashboard-layout
37
+ ```
38
+
39
+ The layout package is theme-aware and slot-style aware, but keeps ownership of:
40
+
41
+ - responsive shell composition
42
+ - sidebar behavior
43
+ - header and breadcrumb behavior
44
+ - mobile drawer / bottom-nav behavior
45
+
46
+ Consumer apps own:
47
+
48
+ - routes
49
+ - business data
50
+ - theme preset selection
51
+ - custom background components
52
+ - custom mobile utility items
53
+
54
+ ## Main Behaviors
55
+
56
+ ### Sidebar
57
+
58
+ - config-based links, groups, dividers
59
+ - active route detection
60
+ - parent group active state when a child route is active
61
+ - desktop collapse / expand
62
+ - collapsed rail expands only on explicit click, not on hover
63
+ - clicking a nav item or group while collapsed expands the sidebar first
64
+ - collapsed rail tooltips render as a fixed overlay, not inside the scroll container
65
+ - sticky bottom panel is hidden while the desktop sidebar is collapsed
66
+
67
+ ### Header and Breadcrumbs
68
+
69
+ - title and subtitle
70
+ - sticky header
71
+ - breadcrumb row rendered below the main header row
72
+ - optional scroll-aware breadcrumb hide/show
73
+ - hysteresis-based breadcrumb behavior to avoid flicker on small scroll movement
74
+
75
+ ### Background Model
76
+
77
+ Two background paths exist:
78
+
79
+ 1. `layout.background`
80
+ 2. `layout.backgroundComponents`
81
+
82
+ Rules:
83
+
84
+ - `layout.background` is the default path
85
+ - `layout.backgroundComponents.<surface>` overrides `layout.background.<surface>`
86
+ - `background` supports `"transparent"` and `"inherit"` semantics
87
+
88
+ Supported surfaces:
89
+
90
+ - `root`
91
+ - `shell`
92
+ - `sidebar`
93
+ - `header`
94
+ - `breadcrumb`
95
+ - `main`
96
+ - `content`
97
+ - `footer`
98
+ - `mobileBottomNav`
99
+
100
+ ### Mobile
101
+
102
+ Mobile behavior is intentionally different from desktop:
103
+
104
+ - mobile header shows page title / subtitle and breadcrumbs
105
+ - header actions are hidden on mobile
106
+ - user menu is hidden from the mobile header
107
+ - when mobile bottom nav is enabled, the header sidebar toggle is removed from the header
108
+ - bottom nav supports:
109
+ - primary nav items on the left
110
+ - utility controls on the right
111
+
112
+ Current mobile utility item types:
113
+
114
+ - `sidebar-toggle`
115
+ - `user-menu`
116
+ - `custom`
117
+
118
+ `mobile.utilityItems` can be used to extend the right-side mobile controls.
119
+
120
+ ## Theme Integration
121
+
122
+ This package consumes `@clayer/theme` slot styles through:
123
+
124
+ - `theme.layout.DashboardLayout`
125
+
126
+ Current practice in the playground:
127
+
128
+ - CSS variables define token values
129
+ - theme presets switch token values at the app boundary
130
+ - `ThemeProvider` merges slot classes
131
+ - background animation or branded visuals are provided through `layout.backgroundComponents`
132
+
133
+ ## Playground Context
134
+
135
+ `apps/playground` currently demonstrates:
136
+
137
+ - route-based navigation using `window.history.pushState`
138
+ - multiple theme presets:
139
+ - `Day`
140
+ - `Lemonade`
141
+ - `Midnight`
142
+ - `Evergreen`
143
+ - midnight-only Neat animated root background via `@firecms/neat`
144
+ - configurable mobile utility items
145
+ - config-driven shell backgrounds and styles
146
+
147
+ ## Important Current Decisions
148
+
149
+ - no `@clayer/ui` dependency yet
150
+ - collapsed sidebar does not expand on hover
151
+ - sticky sidebar bottom panel is hidden when the desktop sidebar is collapsed
152
+ - mobile header is content-focused; utilities live in the bottom nav
153
+ - background animation belongs at the app layer, not inside the package core
154
+
155
+ ## Validation
156
+
157
+ Typical validation commands:
158
+
159
+ ```bash
160
+ pnpm --filter @clayer/dashboard-layout typecheck
161
+ pnpm --filter @clayer/dashboard-layout build
162
+ pnpm --filter playground typecheck
163
+ pnpm --filter playground build
164
+ ```
@@ -0,0 +1,473 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode, CSSProperties, ComponentType, HTMLAttributes } from 'react';
3
+
4
+ type DashboardIcon = ComponentType<{
5
+ className?: string;
6
+ "aria-hidden"?: boolean;
7
+ }>;
8
+ type DashboardNavItem = DashboardNavLink | DashboardNavGroup | DashboardNavDivider;
9
+ type DashboardNavLink = {
10
+ type?: "link";
11
+ label: string;
12
+ href: string;
13
+ icon?: DashboardIcon;
14
+ badge?: string | number;
15
+ disabled?: boolean;
16
+ external?: boolean;
17
+ exact?: boolean;
18
+ permission?: string;
19
+ hidden?: boolean;
20
+ pinned?: boolean;
21
+ onClick?: () => void;
22
+ };
23
+ type DashboardNavGroup = {
24
+ type: "group";
25
+ label: string;
26
+ icon?: DashboardIcon;
27
+ badge?: string | number;
28
+ defaultOpen?: boolean;
29
+ permission?: string;
30
+ hidden?: boolean;
31
+ children: DashboardNavLink[];
32
+ };
33
+ type DashboardNavDivider = {
34
+ type: "divider";
35
+ label?: string;
36
+ };
37
+ type HeaderAction = {
38
+ type: "button";
39
+ label: string;
40
+ icon?: DashboardIcon;
41
+ variant?: "solid" | "outline" | "ghost" | "soft";
42
+ tone?: "primary" | "neutral" | "danger";
43
+ onClick?: () => void;
44
+ } | {
45
+ type: "icon";
46
+ label: string;
47
+ icon: DashboardIcon;
48
+ badge?: string | number;
49
+ onClick?: () => void;
50
+ } | {
51
+ type: "dropdown";
52
+ label: string;
53
+ icon?: DashboardIcon;
54
+ items: {
55
+ label: string;
56
+ icon?: DashboardIcon;
57
+ onClick?: () => void;
58
+ }[];
59
+ } | {
60
+ type: "custom";
61
+ render: ReactNode;
62
+ };
63
+ type DashboardUserMenuItem = {
64
+ type?: "item";
65
+ label: string;
66
+ href?: string;
67
+ icon?: DashboardIcon;
68
+ onClick?: () => void;
69
+ } | {
70
+ type: "divider";
71
+ };
72
+ type DashboardUser = {
73
+ name?: string;
74
+ email?: string;
75
+ role?: string;
76
+ avatarUrl?: string;
77
+ initials?: string;
78
+ icon?: DashboardIcon;
79
+ menuItems?: DashboardUserMenuItem[];
80
+ };
81
+ type DashboardHeaderConfig = {
82
+ title?: ReactNode;
83
+ subtitle?: ReactNode;
84
+ sticky?: boolean;
85
+ height?: number | string;
86
+ showSidebarToggle?: boolean;
87
+ showBreadcrumbs?: boolean;
88
+ breadcrumbBehavior?: "static" | "hide-on-scroll";
89
+ userMenu?: {
90
+ bordered?: boolean;
91
+ background?: "transparent" | "background" | "muted";
92
+ radius?: "none" | "sm" | "md" | "lg" | "full";
93
+ padding?: "none" | "sm" | "md";
94
+ shadow?: "none" | "sm" | "md";
95
+ showRole?: boolean;
96
+ };
97
+ breadcrumbs?: {
98
+ label: string;
99
+ href?: string;
100
+ }[];
101
+ actions?: HeaderAction[];
102
+ };
103
+ type DashboardSidebarConfig = {
104
+ collapsible?: boolean;
105
+ defaultCollapsed?: boolean;
106
+ collapsed?: boolean;
107
+ onCollapsedChange?: (collapsed: boolean) => void;
108
+ width?: number;
109
+ collapsedWidth?: number;
110
+ showTooltipsWhenCollapsed?: boolean;
111
+ closeOnNavigateMobile?: boolean;
112
+ };
113
+ type DashboardMobileConfig = {
114
+ drawer?: boolean;
115
+ bottomNav?: boolean;
116
+ bottomNavItems?: DashboardNavLink[];
117
+ utilityItems?: DashboardMobileUtilityItem[];
118
+ breakpoint?: "sm" | "md" | "lg";
119
+ showHeader?: boolean;
120
+ showBottomSafeArea?: boolean;
121
+ };
122
+ type DashboardMobileUtilityItem = {
123
+ type: "sidebar-toggle";
124
+ label?: string;
125
+ icon?: DashboardIcon;
126
+ } | {
127
+ type: "user-menu";
128
+ label?: string;
129
+ } | {
130
+ type: "custom";
131
+ key: string;
132
+ render: ReactNode;
133
+ };
134
+ type DashboardContentConfig = {
135
+ padded?: boolean;
136
+ maxWidth?: "none" | "screen-xl" | "screen-2xl" | "7xl";
137
+ centered?: boolean;
138
+ };
139
+ type DashboardBackgroundComponent = ReactNode | {
140
+ content: ReactNode;
141
+ className?: string;
142
+ style?: CSSProperties;
143
+ /**
144
+ * Background components are pointer-events-none by default.
145
+ * Set interactive when the component needs to receive pointer events.
146
+ */
147
+ interactive?: boolean;
148
+ };
149
+ type DashboardSidebarBottomPanelConfig = {
150
+ /**
151
+ * Optional panel title. When collapsible, this appears in the panel header.
152
+ */
153
+ title?: ReactNode;
154
+ /**
155
+ * Panel content shown when the sidebar is expanded, and in the mobile drawer.
156
+ */
157
+ content: ReactNode;
158
+ /**
159
+ * Optional compact content shown when the desktop sidebar is collapsed.
160
+ */
161
+ collapsedContent?: ReactNode;
162
+ /**
163
+ * Fixed panel height. Number values are treated as px.
164
+ */
165
+ height?: number | string;
166
+ /**
167
+ * If false, the panel is hidden while the desktop sidebar is collapsed.
168
+ */
169
+ showWhenCollapsed?: boolean;
170
+ /**
171
+ * Allows the panel body to collapse independently from the sidebar.
172
+ */
173
+ collapsible?: boolean;
174
+ /**
175
+ * Initial collapsed state for uncontrolled usage.
176
+ */
177
+ defaultCollapsed?: boolean;
178
+ /**
179
+ * Controlled collapsed state for the panel body.
180
+ */
181
+ collapsed?: boolean;
182
+ /**
183
+ * Called when the panel body collapse state changes.
184
+ */
185
+ onCollapsedChange?: (collapsed: boolean) => void;
186
+ /**
187
+ * Fixed panel height while the panel body is collapsed. Number values are px.
188
+ */
189
+ collapsedHeight?: number | string;
190
+ /**
191
+ * Accessible label for the panel collapse toggle.
192
+ */
193
+ collapseButtonLabel?: string;
194
+ /**
195
+ * If true, keeps the panel pinned below the scrollable nav area.
196
+ */
197
+ sticky?: boolean;
198
+ /**
199
+ * Adds the default separator border above the panel.
200
+ */
201
+ bordered?: boolean;
202
+ /**
203
+ * Local className for the panel root.
204
+ */
205
+ className?: string;
206
+ };
207
+ type DashboardLayoutConfig = {
208
+ /**
209
+ * Controls the viewport wrapper spacing around the dashboard shell.
210
+ * Useful for floating/admin-console layouts.
211
+ */
212
+ padding?: "none" | "sm" | "md" | "lg";
213
+ /**
214
+ * Adds a border around the complete dashboard shell.
215
+ */
216
+ bordered?: boolean;
217
+ /**
218
+ * Controls shell corner radius. Mobile remains square by default where appropriate.
219
+ */
220
+ radius?: "none" | "sm" | "md" | "lg" | "xl";
221
+ /**
222
+ * Adds shell elevation.
223
+ */
224
+ shadow?: "none" | "sm" | "md" | "lg";
225
+ /**
226
+ * Controls whether the header, sidebar, and footer render separator borders.
227
+ */
228
+ borders?: {
229
+ sidebar?: boolean;
230
+ header?: boolean;
231
+ footer?: boolean;
232
+ mobileBottomNav?: boolean;
233
+ };
234
+ /**
235
+ * Common class-based background hooks for layout-level surfaces.
236
+ * These are the default styling path.
237
+ * Use values like:
238
+ * - "bg-background"
239
+ * - "bg-transparent"
240
+ * - "bg-inherit"
241
+ * - any custom utility/class string
242
+ *
243
+ * When a matching `backgroundComponents` entry is provided for the same
244
+ * surface, that component takes precedence and the class-based background
245
+ * is not applied for that surface.
246
+ */
247
+ background?: {
248
+ root?: string;
249
+ shell?: string;
250
+ sidebar?: string;
251
+ header?: string;
252
+ breadcrumb?: string;
253
+ main?: string;
254
+ content?: string;
255
+ footer?: string;
256
+ mobileBottomNav?: string;
257
+ };
258
+ /**
259
+ * Render one arbitrary full-size background component behind each major
260
+ * dashboard surface. Use this for images, animations, canvas/video,
261
+ * overlays, solid blocks, or transparent branded backgrounds.
262
+ *
263
+ * These override `background` for the same surface.
264
+ */
265
+ backgroundComponents?: {
266
+ root?: DashboardBackgroundComponent;
267
+ shell?: DashboardBackgroundComponent;
268
+ sidebar?: DashboardBackgroundComponent;
269
+ header?: DashboardBackgroundComponent;
270
+ breadcrumb?: DashboardBackgroundComponent;
271
+ main?: DashboardBackgroundComponent;
272
+ content?: DashboardBackgroundComponent;
273
+ footer?: DashboardBackgroundComponent;
274
+ mobileBottomNav?: DashboardBackgroundComponent;
275
+ };
276
+ };
277
+ type DashboardLayoutStyles = {
278
+ root?: string;
279
+ shell?: string;
280
+ sidebar?: string;
281
+ sidebarInner?: string;
282
+ sidebarHeader?: string;
283
+ sidebarLogo?: string;
284
+ sidebarToggle?: string;
285
+ sidebarNav?: string;
286
+ sidebarNavSection?: string;
287
+ sidebarNavItem?: string;
288
+ sidebarNavItemActive?: string;
289
+ sidebarNavItemIcon?: string;
290
+ sidebarNavItemLabel?: string;
291
+ sidebarNavItemBadge?: string;
292
+ sidebarGroup?: string;
293
+ sidebarGroupTrigger?: string;
294
+ sidebarGroupContent?: string;
295
+ sidebarGroupChildItem?: string;
296
+ sidebarFooter?: string;
297
+ header?: string;
298
+ headerInner?: string;
299
+ headerLeft?: string;
300
+ headerTitle?: string;
301
+ headerSubtitle?: string;
302
+ headerBreadcrumbs?: string;
303
+ headerActions?: string;
304
+ headerActionButton?: string;
305
+ headerUserMenu?: string;
306
+ main?: string;
307
+ content?: string;
308
+ pageContainer?: string;
309
+ footer?: string;
310
+ mobileHeader?: string;
311
+ mobileDrawer?: string;
312
+ mobileBottomNav?: string;
313
+ };
314
+ type DashboardRenderLinkProps = {
315
+ href: string;
316
+ children: ReactNode;
317
+ className?: string;
318
+ onClick?: () => void;
319
+ external?: boolean;
320
+ "aria-current"?: "page";
321
+ };
322
+ type DashboardLayoutProps = {
323
+ children: ReactNode;
324
+ logo?: ReactNode;
325
+ sidebarItems?: DashboardNavItem[];
326
+ currentPath?: string;
327
+ isItemActive?: (item: DashboardNavLink, currentPath?: string) => boolean;
328
+ renderLink?: (props: DashboardRenderLinkProps) => ReactNode;
329
+ user?: DashboardUser;
330
+ header?: DashboardHeaderConfig;
331
+ sidebar?: DashboardSidebarConfig;
332
+ mobile?: DashboardMobileConfig;
333
+ content?: DashboardContentConfig;
334
+ layout?: DashboardLayoutConfig;
335
+ headerActions?: ReactNode;
336
+ sidebarBottomPanel?: DashboardSidebarBottomPanelConfig;
337
+ /**
338
+ * @deprecated Use sidebarBottomPanel.content for configurable bottom content.
339
+ */
340
+ sidebarFooter?: ReactNode;
341
+ sidebarHeader?: ReactNode;
342
+ footer?: ReactNode;
343
+ variant?: "classic" | "floating" | "compact" | "mini";
344
+ density?: "compact" | "comfortable" | "spacious";
345
+ styles?: DashboardLayoutStyles;
346
+ className?: string;
347
+ style?: CSSProperties;
348
+ };
349
+
350
+ declare const defaultSidebar: Required<Pick<DashboardSidebarConfig, "collapsible" | "defaultCollapsed" | "width" | "collapsedWidth" | "showTooltipsWhenCollapsed" | "closeOnNavigateMobile">>;
351
+ declare const densityClasses: {
352
+ compact: {
353
+ header: string;
354
+ content: string;
355
+ navItem: string;
356
+ childItem: string;
357
+ };
358
+ comfortable: {
359
+ header: string;
360
+ content: string;
361
+ navItem: string;
362
+ childItem: string;
363
+ };
364
+ spacious: {
365
+ header: string;
366
+ content: string;
367
+ navItem: string;
368
+ childItem: string;
369
+ };
370
+ };
371
+ type ResolvedDashboardLayoutConfig = {
372
+ padding: NonNullable<DashboardLayoutConfig["padding"]>;
373
+ bordered: boolean;
374
+ radius: NonNullable<DashboardLayoutConfig["radius"]>;
375
+ shadow: NonNullable<DashboardLayoutConfig["shadow"]>;
376
+ borders: {
377
+ sidebar: boolean;
378
+ header: boolean;
379
+ footer: boolean;
380
+ mobileBottomNav: boolean;
381
+ };
382
+ background: NonNullable<DashboardLayoutConfig["background"]>;
383
+ backgroundComponents: NonNullable<DashboardLayoutConfig["backgroundComponents"]>;
384
+ };
385
+ declare function SidebarNav({ items, collapsed, currentPath, isItemActive, closeMobile, onExpandPersist, onCollapsedTooltipChange, renderLink, styles, density }: {
386
+ items: DashboardNavItem[];
387
+ collapsed: boolean;
388
+ currentPath?: string;
389
+ isItemActive: (item: DashboardNavLink, currentPath?: string) => boolean;
390
+ closeMobile?: () => void;
391
+ onExpandPersist?: () => void;
392
+ onCollapsedTooltipChange?: (tooltip: {
393
+ label: string;
394
+ top: number;
395
+ left: number;
396
+ } | null) => void;
397
+ renderLink: (props: DashboardRenderLinkProps) => ReactNode;
398
+ styles?: DashboardLayoutStyles;
399
+ density: keyof typeof densityClasses;
400
+ }): react_jsx_runtime.JSX.Element;
401
+ declare function DashboardSidebar({ logo, sidebarHeader, sidebarBottomPanel, sidebarFooter, items, collapsed, onCollapsedChange, sidebar, currentPath, isItemActive, closeMobile, renderLink, styles, density, layout, mobile }: {
402
+ logo?: ReactNode;
403
+ sidebarHeader?: ReactNode;
404
+ sidebarBottomPanel?: DashboardSidebarBottomPanelConfig;
405
+ sidebarFooter?: ReactNode;
406
+ items: DashboardNavItem[];
407
+ collapsed: boolean;
408
+ onCollapsedChange: (collapsed: boolean) => void;
409
+ sidebar: typeof defaultSidebar;
410
+ currentPath?: string;
411
+ isItemActive: (item: DashboardNavLink, currentPath?: string) => boolean;
412
+ closeMobile?: () => void;
413
+ renderLink: (props: DashboardRenderLinkProps) => ReactNode;
414
+ styles?: DashboardLayoutStyles;
415
+ density: keyof typeof densityClasses;
416
+ layout: ResolvedDashboardLayoutConfig;
417
+ mobile?: boolean;
418
+ }): react_jsx_runtime.JSX.Element;
419
+ declare function DashboardBreadcrumbs({ breadcrumbs, renderLink, styles, }: {
420
+ breadcrumbs?: DashboardHeaderConfig["breadcrumbs"];
421
+ renderLink: (props: DashboardRenderLinkProps) => ReactNode;
422
+ styles?: DashboardLayoutStyles;
423
+ }): react_jsx_runtime.JSX.Element | null;
424
+ declare function DashboardUserMenu({ user, config, styles, placement, triggerClassName, menuClassName }: {
425
+ user?: DashboardUser;
426
+ config?: DashboardHeaderConfig["userMenu"];
427
+ styles?: DashboardLayoutStyles;
428
+ placement?: "top" | "bottom";
429
+ triggerClassName?: string;
430
+ menuClassName?: string;
431
+ }): react_jsx_runtime.JSX.Element | null;
432
+ declare function DashboardHeader({ header, user, mobile, mobileOpen, setMobileOpen, renderLink, headerActions, styles, density, layout, breadcrumbsVisible }: {
433
+ header?: DashboardHeaderConfig;
434
+ user?: DashboardUser;
435
+ mobile?: DashboardMobileConfig;
436
+ mobileOpen: boolean;
437
+ setMobileOpen: (open: boolean) => void;
438
+ renderLink: (props: DashboardRenderLinkProps) => ReactNode;
439
+ headerActions?: ReactNode;
440
+ styles?: DashboardLayoutStyles;
441
+ density: keyof typeof densityClasses;
442
+ layout: ResolvedDashboardLayoutConfig;
443
+ breadcrumbsVisible: boolean;
444
+ }): react_jsx_runtime.JSX.Element;
445
+ declare function DashboardContent({ children, content, styles, density, layout }: {
446
+ children: ReactNode;
447
+ content?: DashboardContentConfig;
448
+ styles?: DashboardLayoutStyles;
449
+ density: keyof typeof densityClasses;
450
+ layout: ResolvedDashboardLayoutConfig;
451
+ }): react_jsx_runtime.JSX.Element;
452
+ declare function MobileBottomNav({ items, currentPath, isItemActive, renderLink, user, userMenuConfig, mobileOpen, setMobileOpen, utilityItems, styles, layout }: {
453
+ items?: DashboardNavLink[];
454
+ currentPath?: string;
455
+ isItemActive: (item: DashboardNavLink, currentPath?: string) => boolean;
456
+ renderLink: (props: DashboardRenderLinkProps) => ReactNode;
457
+ user?: DashboardUser;
458
+ userMenuConfig?: DashboardHeaderConfig["userMenu"];
459
+ mobileOpen: boolean;
460
+ setMobileOpen: (open: boolean) => void;
461
+ utilityItems?: DashboardMobileUtilityItem[];
462
+ styles?: DashboardLayoutStyles;
463
+ layout: ResolvedDashboardLayoutConfig;
464
+ }): react_jsx_runtime.JSX.Element | null;
465
+ declare function DashboardLayout({ children, logo, sidebarItems, currentPath, isItemActive, renderLink, user, header, sidebar: sidebarConfig, mobile, content, layout: layoutConfig, headerActions, sidebarBottomPanel, sidebarFooter, sidebarHeader, footer, variant, density, styles, className, style }: DashboardLayoutProps): react_jsx_runtime.JSX.Element;
466
+ declare function DashboardShell({ className, ...props }: HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
467
+ declare function DashboardMain({ className, ...props }: HTMLAttributes<HTMLElement>): react_jsx_runtime.JSX.Element;
468
+ declare function DashboardFooter({ className, ...props }: HTMLAttributes<HTMLElement>): react_jsx_runtime.JSX.Element;
469
+ declare function DashboardActionGroup({ className, ...props }: HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
470
+ declare function SidebarNavItem({ className, ...props }: HTMLAttributes<HTMLLIElement>): react_jsx_runtime.JSX.Element;
471
+ declare function SidebarNavGroup({ className, ...props }: HTMLAttributes<HTMLLIElement>): react_jsx_runtime.JSX.Element;
472
+
473
+ export { DashboardActionGroup, type DashboardBackgroundComponent, DashboardBreadcrumbs, DashboardContent, type DashboardContentConfig, DashboardFooter, DashboardHeader, type DashboardHeaderConfig, type DashboardIcon, DashboardLayout, type DashboardLayoutConfig, type DashboardLayoutProps, type DashboardLayoutStyles, DashboardMain, type DashboardMobileConfig, MobileBottomNav as DashboardMobileNav, type DashboardMobileUtilityItem, type DashboardNavDivider, type DashboardNavGroup, type DashboardNavItem, type DashboardNavLink, type DashboardRenderLinkProps, DashboardShell, DashboardSidebar, type DashboardSidebarBottomPanelConfig, type DashboardSidebarConfig, type DashboardUser, DashboardUserMenu, type DashboardUserMenuItem, type HeaderAction, SidebarNav, SidebarNavGroup, SidebarNavItem };