@vadimcomanescu/nadicode-design-system 5.0.1 → 5.0.2
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/.agents/skills/seed/SKILL.md +39 -17
- package/.agents/skills/seed/references/composition.md +37 -21
- package/.agents/skills/seed/references/glass-and-effects.md +7 -5
- package/.agents/skills/seed/references/responsive.md +22 -63
- package/.agents/skills/seed/references/state-machines.md +54 -46
- package/dist/{TeamPage-IYWL6N4I.js → TeamPage-UO3V2JDK.js} +7 -6
- package/dist/catalog/components.js +2 -2
- package/dist/{chunk-PIFVLS5S.js → chunk-WGQHM56J.js} +1 -1
- package/dist/{chunk-XX4XJJSH.js → chunk-XUWKGDUY.js} +1 -1
- package/dist/components/blocks/DashboardBlock.js +1 -1
- package/package.json +1 -1
|
@@ -200,17 +200,39 @@ Token source of truth: `src/lib/tokens.config.js` (authored), `src/index.css` (g
|
|
|
200
200
|
|
|
201
201
|
Use `Heading` for semantic headings. Use `Typography` for non-heading copy only.
|
|
202
202
|
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
203
|
+
```json
|
|
204
|
+
{
|
|
205
|
+
"page-title": {
|
|
206
|
+
"type": "Heading",
|
|
207
|
+
"props": { "level": 1, "size": null, "className": null },
|
|
208
|
+
"children": ["Page title"]
|
|
209
|
+
},
|
|
210
|
+
"section-title": {
|
|
211
|
+
"type": "Heading",
|
|
212
|
+
"props": { "level": 2, "size": "section", "className": null },
|
|
213
|
+
"children": ["Section title"]
|
|
214
|
+
},
|
|
215
|
+
"card-title": {
|
|
216
|
+
"type": "Heading",
|
|
217
|
+
"props": { "level": 3, "size": "label", "className": null },
|
|
218
|
+
"children": ["Card title"]
|
|
219
|
+
},
|
|
220
|
+
"body-text": {
|
|
221
|
+
"type": "Typography",
|
|
222
|
+
"props": { "variant": null, "className": null },
|
|
223
|
+
"children": ["Body copy"]
|
|
224
|
+
},
|
|
225
|
+
"meta-text": {
|
|
226
|
+
"type": "Typography",
|
|
227
|
+
"props": { "variant": "small", "className": null },
|
|
228
|
+
"children": ["Meta text"]
|
|
229
|
+
},
|
|
230
|
+
"muted-text": {
|
|
231
|
+
"type": "Typography",
|
|
232
|
+
"props": { "variant": "muted", "className": null },
|
|
233
|
+
"children": ["Muted text"]
|
|
234
|
+
}
|
|
235
|
+
}
|
|
214
236
|
```
|
|
215
237
|
|
|
216
238
|
**Heading props**
|
|
@@ -353,12 +375,12 @@ Do not copy DS catalog files into the app.
|
|
|
353
375
|
**Test helpers**
|
|
354
376
|
Consumer apps can import `SeedTestProvider` from `@vadimcomanescu/nadicode-design-system/test` when they need the package-owned test wrapper. The showcase app keeps its local `@/test/SeedTestProvider` wrapper for in-repo tests.
|
|
355
377
|
|
|
356
|
-
**LanguageSwitcher** (
|
|
357
|
-
|
|
378
|
+
**LanguageSwitcher** (catalog: `seedComponents.LanguageSwitcher`)
|
|
379
|
+
Consumed via the catalog. Schema props: `locales` (string[], default `['en','it']`), `value` (current locale), `className`. Fires `emit('localeChange')` for locale changes. Uses `useTranslations('components.languageSwitcher')` for labels. Without a `localeChange` handler, sets a `NEXT_LOCALE` cookie and calls `router.refresh()`.
|
|
358
380
|
|
|
359
|
-
**SettingsModal** (
|
|
360
|
-
Exports: `defaultSettingsTabs`, `SettingsTabDef` (interface)
|
|
361
|
-
|
|
381
|
+
**SettingsModal** (catalog: `seedComponents.SettingsModal`)
|
|
382
|
+
Consumed via the catalog. Exports: `defaultSettingsTabs`, `SettingsTabDef` (interface).
|
|
383
|
+
Schema props: `open`, `defaultTab`, `tabs` (SettingsTabDef[]). Fires `emit('openChange')` and `emit('renderContent')` for modal state and tab content. Uses `useTranslations('pages.settings')` for tab labels and headings. The default language tab renders `LanguageSwitcher` automatically.
|
|
362
384
|
|
|
363
385
|
---
|
|
364
386
|
|
|
@@ -376,7 +398,7 @@ Every page = **Shell > Sections > Components**.
|
|
|
376
398
|
|
|
377
399
|
| Intent | Shell | Components |
|
|
378
400
|
|--------|-------|------------|
|
|
379
|
-
| App (dashboard, settings, CRUD, analytics, agents) | `app-shell` | `Sidebar` + top bar + `
|
|
401
|
+
| App (dashboard, settings, CRUD, analytics, agents) | `app-shell` | `Sidebar` + top bar + `CommandPaletteBlock` |
|
|
380
402
|
| Marketing (landing, pricing, blog) | `marketing-shell` | `HeaderBlock` + `FooterBlock` |
|
|
381
403
|
| Auth | `auth-shell` | `AuthLayout` (split/centered) |
|
|
382
404
|
| Onboarding | `onboarding-shell` | Minimal header + progress bar |
|
|
@@ -26,7 +26,7 @@ Shell -- persistent frame (sidebar, header, footer)
|
|
|
26
26
|
|
|
27
27
|
| Intent | Shell | Components |
|
|
28
28
|
|--------|-------|------------|
|
|
29
|
-
| App pages (dashboard, settings, CRUD, analytics, agents) | `app-shell` | `Sidebar` + top bar + `
|
|
29
|
+
| App pages (dashboard, settings, CRUD, analytics, agents) | `app-shell` | `Sidebar` + top bar + `CommandPaletteBlock` |
|
|
30
30
|
| Marketing (landing, pricing, blog) | `marketing-shell` | `HeaderBlock` + `FooterBlock` |
|
|
31
31
|
| Auth (login, signup, reset) | `auth-shell` | `AuthLayout` (split-screen or centered) |
|
|
32
32
|
| Onboarding | `onboarding-shell` | Minimal header + progress bar, no nav |
|
|
@@ -110,26 +110,42 @@ Is it marketing / public?
|
|
|
110
110
|
|
|
111
111
|
### Section Template
|
|
112
112
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
113
|
+
App section — heading + action bar above content:
|
|
114
|
+
|
|
115
|
+
```json
|
|
116
|
+
{
|
|
117
|
+
"component": "section",
|
|
118
|
+
"props": { "className": "py-6 md:py-8" },
|
|
119
|
+
"children": [
|
|
120
|
+
{
|
|
121
|
+
"component": "div",
|
|
122
|
+
"props": { "className": "flex items-center justify-between mb-4" },
|
|
123
|
+
"children": [
|
|
124
|
+
{ "component": "Heading", "props": { "level": 3, "size": "subsection", "children": "Section Title" } },
|
|
125
|
+
{ "component": "Button", "props": { "variant": "outline", "size": "sm", "children": "Action" } }
|
|
126
|
+
]
|
|
127
|
+
}
|
|
128
|
+
]
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Marketing section — centered heading + lead text above content:
|
|
133
|
+
|
|
134
|
+
```json
|
|
135
|
+
{
|
|
136
|
+
"component": "section",
|
|
137
|
+
"props": { "className": "py-16 md:py-24" },
|
|
138
|
+
"children": [
|
|
139
|
+
{
|
|
140
|
+
"component": "div",
|
|
141
|
+
"props": { "className": "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 text-center" },
|
|
142
|
+
"children": [
|
|
143
|
+
{ "component": "Heading", "props": { "level": 2, "size": "section", "className": "mb-4", "children": "Section Title" } },
|
|
144
|
+
{ "component": "Typography", "props": { "variant": "lead", "className": "mb-12 text-text-secondary", "children": "Section description" } }
|
|
145
|
+
]
|
|
146
|
+
}
|
|
147
|
+
]
|
|
148
|
+
}
|
|
133
149
|
```
|
|
134
150
|
|
|
135
151
|
---
|
|
@@ -95,13 +95,15 @@
|
|
|
95
95
|
|
|
96
96
|
### AmbientGrid
|
|
97
97
|
|
|
98
|
-
Subtle CSS grid overlay for structural rhythm.
|
|
98
|
+
Subtle CSS grid overlay for structural rhythm. Cataloged — use via `seedComponents`.
|
|
99
99
|
|
|
100
100
|
```tsx
|
|
101
|
-
import {
|
|
102
|
-
<AmbientGrid
|
|
103
|
-
|
|
104
|
-
<AmbientGrid
|
|
101
|
+
import { seedComponents } from "@vadimcomanescu/nadicode-design-system/catalog/components"
|
|
102
|
+
<seedComponents.AmbientGrid props={{}} emit={() => {}} on={{}} />
|
|
103
|
+
// With custom cell size:
|
|
104
|
+
<seedComponents.AmbientGrid props={{ size: 32 }} emit={() => {}} on={{}} />
|
|
105
|
+
// Debug mode (0.15 opacity for alignment checking):
|
|
106
|
+
<seedComponents.AmbientGrid props={{ debug: true }} emit={() => {}} on={{}} />
|
|
105
107
|
```
|
|
106
108
|
|
|
107
109
|
### MeteorShower
|
|
@@ -99,78 +99,37 @@ Breakpoint contracts, mobile-first patterns, touch targets, and responsive rules
|
|
|
99
99
|
|
|
100
100
|
### Navigation Collapse
|
|
101
101
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
<main className="flex-1">
|
|
110
|
-
<header className="lg:hidden flex items-center p-4">
|
|
111
|
-
<SidebarTrigger />
|
|
112
|
-
<span className="ml-3 font-medium">Page Title</span>
|
|
113
|
-
</header>
|
|
114
|
-
{children}
|
|
115
|
-
</main>
|
|
116
|
-
</SidebarProvider>
|
|
117
|
-
```
|
|
102
|
+
Desktop shows the full sidebar; mobile hides it behind a sheet triggered by a hamburger button.
|
|
103
|
+
|
|
104
|
+
- Sidebar element: `className="hidden lg:flex"` (visible only at `lg:` and up).
|
|
105
|
+
- Mobile header: `className="lg:hidden"` — contains `SidebarTrigger` and the page title.
|
|
106
|
+
- The `SidebarProvider` wraps the layout; the sheet/drawer behavior is built into the `Sidebar` block.
|
|
107
|
+
|
|
108
|
+
CSS classes that drive this pattern: `hidden lg:flex` on the sidebar, `lg:hidden` on the mobile header bar.
|
|
118
109
|
|
|
119
110
|
### Table to Card List
|
|
120
111
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
<div className="sm:hidden space-y-3">
|
|
127
|
-
{data.map((item) => (
|
|
128
|
-
<Card key={item.id} className="p-4">
|
|
129
|
-
{/* Card representation of row */}
|
|
130
|
-
</Card>
|
|
131
|
-
))}
|
|
132
|
-
</div>
|
|
133
|
-
```
|
|
112
|
+
At `sm:` and up, render `DataTable`. Below `sm:`, render a card list with one `Card` per row.
|
|
113
|
+
|
|
114
|
+
- Table wrapper: `className="hidden sm:block"`
|
|
115
|
+
- Card list wrapper: `className="sm:hidden space-y-3"`
|
|
116
|
+
- Each card uses `className="p-4"` and mirrors the key fields of the table row.
|
|
134
117
|
|
|
135
118
|
### Tab Navigation Scroll
|
|
136
119
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
<TabsTrigger value="general">General</TabsTrigger>
|
|
142
|
-
<TabsTrigger value="security">Security</TabsTrigger>
|
|
143
|
-
<TabsTrigger value="billing">Billing</TabsTrigger>
|
|
144
|
-
</TabsList>
|
|
145
|
-
</div>
|
|
146
|
-
```
|
|
120
|
+
Settings and similar pages use horizontally scrollable tab lists on mobile so all tabs are reachable without wrapping.
|
|
121
|
+
|
|
122
|
+
- Outer wrapper: `className="overflow-x-auto -mx-4 px-4"` (negative margin bleeds to viewport edge, then re-pads).
|
|
123
|
+
- `TabsList`: `className="inline-flex w-auto min-w-full sm:w-full"` — `inline-flex w-auto` allows scroll; `min-w-full` ensures full width when content is narrow; `sm:w-full` snaps to full width on larger screens.
|
|
147
124
|
|
|
148
125
|
### Multi-Panel to Drawers
|
|
149
126
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
<main className="flex-1 flex flex-col">
|
|
157
|
-
<header className="xl:hidden flex items-center gap-2 p-3 border-b border-border">
|
|
158
|
-
<Sheet>
|
|
159
|
-
<SheetTrigger asChild>
|
|
160
|
-
<Button variant="ghost" size="icon"><UsersIcon size={16} /></Button>
|
|
161
|
-
</SheetTrigger>
|
|
162
|
-
<SheetContent side="left"><TeamPanel /></SheetContent>
|
|
163
|
-
</Sheet>
|
|
164
|
-
<span className="flex-1 text-center font-medium">Agent Chat</span>
|
|
165
|
-
</header>
|
|
166
|
-
<ConversationArea />
|
|
167
|
-
<Composer />
|
|
168
|
-
</main>
|
|
169
|
-
<aside className="hidden xl:block w-[320px] border-l border-border">
|
|
170
|
-
<WorkPanel />
|
|
171
|
-
</aside>
|
|
172
|
-
</div>
|
|
173
|
-
```
|
|
127
|
+
3-panel agent workbench: both side panels are visible at `xl:`, the left panel is visible at `lg:`, and on mobile both panels move into sheet drawers.
|
|
128
|
+
|
|
129
|
+
- Left panel (`aside`): `className="hidden xl:block w-[280px] border-r border-border"`.
|
|
130
|
+
- Right panel (`aside`): `className="hidden xl:block w-[320px] border-l border-border"`.
|
|
131
|
+
- Mobile header: `className="xl:hidden"` — contains `Sheet`/`SheetTrigger` buttons to open each panel as a drawer.
|
|
132
|
+
- Main area: `className="flex-1 flex flex-col"` with `h-dvh` on the outer container (never `h-screen`).
|
|
174
133
|
|
|
175
134
|
---
|
|
176
135
|
|
|
@@ -79,39 +79,33 @@ Expected wait time?
|
|
|
79
79
|
|
|
80
80
|
### Form Implementation Pattern
|
|
81
81
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
</FormControl>
|
|
102
|
-
<FormMessage /> {/* Validation error */}
|
|
103
|
-
</FormItem>
|
|
104
|
-
)}
|
|
105
|
-
/>
|
|
106
|
-
<Button type="submit" disabled={!isDirty || isSubmitting}>
|
|
107
|
-
{isSubmitting ? <Spinner /> : "Save"}
|
|
108
|
-
</Button>
|
|
109
|
-
</form>
|
|
110
|
-
</Form>
|
|
111
|
-
)
|
|
82
|
+
Forms are specified as JSON element trees. Use `$bindState` to wire form fields to block state, and emit `"submit"` when the form is submitted. The block handles `isDirty` / `isSubmitting` state internally via `useBoundProp`.
|
|
83
|
+
|
|
84
|
+
```json
|
|
85
|
+
{
|
|
86
|
+
"component": "FormBlock",
|
|
87
|
+
"props": {
|
|
88
|
+
"fields": [
|
|
89
|
+
{
|
|
90
|
+
"name": "name",
|
|
91
|
+
"label": "Name",
|
|
92
|
+
"type": "text",
|
|
93
|
+
"required": true
|
|
94
|
+
}
|
|
95
|
+
],
|
|
96
|
+
"submitLabel": "Save"
|
|
97
|
+
},
|
|
98
|
+
"on": {
|
|
99
|
+
"submit": "handleSave"
|
|
100
|
+
}
|
|
112
101
|
}
|
|
113
102
|
```
|
|
114
103
|
|
|
104
|
+
Key rules:
|
|
105
|
+
- Labels always stacked above their field (never inline).
|
|
106
|
+
- `FormMessage` (field-level validation error) renders below the field automatically.
|
|
107
|
+
- Submit button shows `Spinner` while `isSubmitting`; disabled when form is `pristine`.
|
|
108
|
+
|
|
115
109
|
---
|
|
116
110
|
|
|
117
111
|
## CRUD List States
|
|
@@ -213,22 +207,36 @@ function MyForm() {
|
|
|
213
207
|
|
|
214
208
|
### Streaming Implementation
|
|
215
209
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
210
|
+
Streaming chat UI is composed in JSON spec element trees. The block controls `isStreaming` state internally and exposes it through `$bindState`. Each message, tool call, and thinking indicator maps to a catalog component:
|
|
211
|
+
|
|
212
|
+
- `ChatMessage` — wraps a single turn; `props.role` is `"assistant"` or `"user"`.
|
|
213
|
+
- `ChatMessageContent` — renders streaming text; `props.isStreaming` shows the cursor while tokens arrive.
|
|
214
|
+
- `ChatToolCall` — shows a tool invocation; `props.state` is one of `"input-available"`, `"output-available"`, or `"output-error"`.
|
|
215
|
+
- `ChatThinkingMessage` — animated dots; `props.variant` is `"pill"` (block) or `"dots"` (inline).
|
|
216
|
+
|
|
217
|
+
Example spec fragment for a streaming assistant turn with a tool call:
|
|
218
|
+
|
|
219
|
+
```json
|
|
220
|
+
[
|
|
221
|
+
{
|
|
222
|
+
"component": "ChatMessage",
|
|
223
|
+
"props": { "role": "assistant" },
|
|
224
|
+
"children": [
|
|
225
|
+
{
|
|
226
|
+
"component": "ChatMessageContent",
|
|
227
|
+
"props": { "$bindState": "isStreaming", "text": "$bindState:streamingContent" }
|
|
228
|
+
}
|
|
229
|
+
]
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
"component": "ChatToolCall",
|
|
233
|
+
"props": { "state": "input-available", "name": "search_files", "input": { "query": "utils.ts" } }
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
"component": "ChatThinkingMessage",
|
|
237
|
+
"props": { "variant": "pill" }
|
|
238
|
+
}
|
|
239
|
+
]
|
|
232
240
|
```
|
|
233
241
|
|
|
234
242
|
---
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { seedComponents } from './chunk-
|
|
1
|
+
import { seedComponents } from './chunk-WGQHM56J.js';
|
|
2
2
|
import './chunk-PQOL3E2V.js';
|
|
3
3
|
import './chunk-YGDO5KDY.js';
|
|
4
4
|
import './chunk-EJQ73FJ5.js';
|
|
@@ -60,7 +60,7 @@ import './chunk-GE4WUAAE.js';
|
|
|
60
60
|
import './chunk-H3KTAHJP.js';
|
|
61
61
|
import './chunk-NDQO7AO6.js';
|
|
62
62
|
import './chunk-AP5SGSN7.js';
|
|
63
|
-
import './chunk-
|
|
63
|
+
import './chunk-XUWKGDUY.js';
|
|
64
64
|
import './chunk-D6MFOI3N.js';
|
|
65
65
|
import './chunk-7AUNUDHM.js';
|
|
66
66
|
import './chunk-4ZST7OY5.js';
|
|
@@ -367,6 +367,9 @@ import './chunk-QYZT24TS.js';
|
|
|
367
367
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
368
368
|
|
|
369
369
|
var { InviteUserModal } = seedComponents;
|
|
370
|
+
var noop = () => {
|
|
371
|
+
};
|
|
372
|
+
var noopOn = () => ({ emit: noop, shouldPreventDefault: false, bound: false });
|
|
370
373
|
var initialMembers = [
|
|
371
374
|
{
|
|
372
375
|
id: "1",
|
|
@@ -412,10 +415,8 @@ function TeamPage() {
|
|
|
412
415
|
InviteUserModal,
|
|
413
416
|
{
|
|
414
417
|
props: { email: null, role: null },
|
|
415
|
-
emit:
|
|
416
|
-
|
|
417
|
-
on: () => ({ emit: () => {
|
|
418
|
-
}, shouldPreventDefault: false, bound: false })
|
|
418
|
+
emit: noop,
|
|
419
|
+
on: noopOn
|
|
419
420
|
}
|
|
420
421
|
)
|
|
421
422
|
] }),
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
export { seedComponents } from '../chunk-
|
|
2
|
+
export { seedComponents } from '../chunk-WGQHM56J.js';
|
|
3
3
|
import '../chunk-PQOL3E2V.js';
|
|
4
4
|
import '../chunk-YGDO5KDY.js';
|
|
5
5
|
import '../chunk-EJQ73FJ5.js';
|
|
@@ -61,7 +61,7 @@ import '../chunk-GE4WUAAE.js';
|
|
|
61
61
|
import '../chunk-H3KTAHJP.js';
|
|
62
62
|
import '../chunk-NDQO7AO6.js';
|
|
63
63
|
import '../chunk-AP5SGSN7.js';
|
|
64
|
-
import '../chunk-
|
|
64
|
+
import '../chunk-XUWKGDUY.js';
|
|
65
65
|
import '../chunk-D6MFOI3N.js';
|
|
66
66
|
import '../chunk-7AUNUDHM.js';
|
|
67
67
|
import '../chunk-4ZST7OY5.js';
|
|
@@ -35,7 +35,7 @@ import { ComparisonBlock } from './chunk-GE4WUAAE.js';
|
|
|
35
35
|
import { ContactBlock } from './chunk-H3KTAHJP.js';
|
|
36
36
|
import { CreateBlock } from './chunk-NDQO7AO6.js';
|
|
37
37
|
import { CrudListBlock } from './chunk-AP5SGSN7.js';
|
|
38
|
-
import { DashboardBlock } from './chunk-
|
|
38
|
+
import { DashboardBlock } from './chunk-XUWKGDUY.js';
|
|
39
39
|
import { DataGridBlock } from './chunk-D6MFOI3N.js';
|
|
40
40
|
import { DirectoryBlock } from './chunk-7AUNUDHM.js';
|
|
41
41
|
import { BlogIndexBlock } from './chunk-4ZST7OY5.js';
|
|
@@ -25,7 +25,7 @@ import dynamic from 'next/dynamic';
|
|
|
25
25
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
26
26
|
|
|
27
27
|
var ProfilePage = dynamic(() => import('./ProfilePage-KJVA3ZQ5.js').then((m) => ({ default: m.ProfilePage })), { ssr: false, loading: () => null });
|
|
28
|
-
var TeamPage = dynamic(() => import('./TeamPage-
|
|
28
|
+
var TeamPage = dynamic(() => import('./TeamPage-UO3V2JDK.js').then((m) => ({ default: m.TeamPage })), { ssr: false, loading: () => null });
|
|
29
29
|
function SettingsContent({ tab }) {
|
|
30
30
|
switch (tab) {
|
|
31
31
|
case "profile":
|