@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 +164 -0
- package/dist/index.d.ts +473 -0
- package/dist/index.js +1393 -0
- package/dist/index.js.map +1 -0
- package/package.json +40 -0
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
|
+
```
|
package/dist/index.d.ts
ADDED
|
@@ -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 };
|