@devalok/shilp-sutra 0.44.1 → 0.45.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +13 -11
- package/BREAKING.json +209 -27
- package/MIGRATION.md +34 -0
- package/README.md +12 -0
- package/dist/_chunks/badge-group.js +1 -0
- package/dist/_chunks/badge-group.js.map +1 -1
- package/dist/_chunks/block-shell.js +25 -0
- package/dist/_chunks/block-shell.js.map +1 -0
- package/dist/_chunks/chat.js +153 -150
- package/dist/_chunks/chat.js.map +1 -1
- package/dist/_chunks/document-preview.js +1 -1
- package/dist/_chunks/image-preview.js +4 -4
- package/dist/_chunks/mention.js +5 -0
- package/dist/_chunks/mention.js.map +1 -0
- package/dist/_chunks/shared.js +65 -78
- package/dist/_chunks/shared.js.map +1 -1
- package/dist/_chunks/success.js +108 -106
- package/dist/_chunks/success.js.map +1 -1
- package/dist/ai/blocks/block-shell.d.ts +19 -0
- package/dist/ai/blocks/block-shell.d.ts.map +1 -0
- package/dist/ai/blocks/block-table.d.ts.map +1 -1
- package/dist/ai/blocks/confirm.d.ts.map +1 -1
- package/dist/ai/blocks/error.d.ts.map +1 -1
- package/dist/ai/blocks/error.js +5 -5
- package/dist/ai/blocks/error.js.map +1 -1
- package/dist/ai/blocks/success.d.ts.map +1 -1
- package/dist/ai/blocks/text.d.ts.map +1 -1
- package/dist/ai/blocks/text.js +4 -3
- package/dist/ai/blocks/text.js.map +1 -1
- package/dist/composed/activity-feed.d.ts.map +1 -1
- package/dist/composed/activity-feed.js +14 -12
- package/dist/composed/activity-feed.js.map +1 -1
- package/dist/composed/file-preview/audio-preview.d.ts.map +1 -1
- package/dist/composed/file-preview/shared.d.ts +10 -0
- package/dist/composed/file-preview/shared.d.ts.map +1 -1
- package/dist/composed/file-preview/video-preview.d.ts.map +1 -1
- package/dist/composed/file-preview.js +151 -188
- package/dist/composed/file-preview.js.map +1 -1
- package/dist/composed/master-detail.d.ts.map +1 -1
- package/dist/composed/master-detail.js +13 -4
- package/dist/composed/master-detail.js.map +1 -1
- package/dist/composed/rich-chat-input.d.ts.map +1 -1
- package/dist/composed/rich-chat-input.js +514 -503
- package/dist/composed/rich-chat-input.js.map +1 -1
- package/dist/composed/rich-text-editor.d.ts.map +1 -1
- package/dist/composed/rich-text-editor.js +144 -143
- package/dist/composed/rich-text-editor.js.map +1 -1
- package/dist/composed/schedule-view.d.ts.map +1 -1
- package/dist/composed/schedule-view.js +52 -39
- package/dist/composed/schedule-view.js.map +1 -1
- package/dist/shell/notification-preferences.d.ts.map +1 -1
- package/dist/shell/notification-preferences.js +115 -114
- package/dist/shell/notification-preferences.js.map +1 -1
- package/dist/ui/badge-group.d.ts.map +1 -1
- package/dist/ui/card.d.ts +66 -16
- package/dist/ui/card.d.ts.map +1 -1
- package/dist/ui/card.js +85 -60
- package/dist/ui/card.js.map +1 -1
- package/dist/ui/chat/message.d.ts.map +1 -1
- package/dist/ui/color-input.d.ts.map +1 -1
- package/dist/ui/color-input.js +18 -18
- package/dist/ui/color-input.js.map +1 -1
- package/dist/ui/data-table-body.d.ts.map +1 -1
- package/dist/ui/data-table-body.js +94 -64
- package/dist/ui/data-table-body.js.map +1 -1
- package/dist/ui/data-table-card.d.ts.map +1 -1
- package/dist/ui/data-table-card.js +50 -43
- package/dist/ui/data-table-card.js.map +1 -1
- package/dist/ui/data-table-context.d.ts +0 -4
- package/dist/ui/data-table-context.d.ts.map +1 -1
- package/dist/ui/data-table-context.js +8 -12
- package/dist/ui/data-table-context.js.map +1 -1
- package/dist/ui/data-table-header.d.ts.map +1 -1
- package/dist/ui/data-table-header.js +2 -2
- package/dist/ui/data-table-header.js.map +1 -1
- package/dist/ui/data-table.d.ts.map +1 -1
- package/dist/ui/data-table.js +185 -182
- package/dist/ui/data-table.js.map +1 -1
- package/dist/ui/index.d.ts +3 -2
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +59 -58
- package/dist/ui/index.js.map +1 -1
- package/dist/ui/lib/mention.d.ts +11 -0
- package/dist/ui/lib/mention.d.ts.map +1 -0
- package/dist/ui/segmented-control.js +4 -4
- package/dist/ui/segmented-control.js.map +1 -1
- package/dist/ui/separator.d.ts +6 -5
- package/dist/ui/separator.d.ts.map +1 -1
- package/dist/ui/separator.js +7 -10
- package/dist/ui/separator.js.map +1 -1
- package/dist/ui/split-button.d.ts.map +1 -1
- package/dist/ui/split-button.js +62 -129
- package/dist/ui/split-button.js.map +1 -1
- package/dist/ui/stat-card.d.ts +7 -0
- package/dist/ui/stat-card.d.ts.map +1 -1
- package/dist/ui/stat-card.js +144 -126
- package/dist/ui/stat-card.js.map +1 -1
- package/dist/ui/table-row-link.d.ts +45 -0
- package/dist/ui/table-row-link.d.ts.map +1 -0
- package/dist/ui/table-row-link.js +16 -0
- package/dist/ui/table-row-link.js.map +1 -0
- package/dist/ui/table.d.ts +49 -5
- package/dist/ui/table.d.ts.map +1 -1
- package/dist/ui/table.js +39 -29
- package/dist/ui/table.js.map +1 -1
- package/dist/ui/toast-types.d.ts +10 -0
- package/dist/ui/toast-types.d.ts.map +1 -1
- package/dist/ui/toast.d.ts +6 -2
- package/dist/ui/toast.d.ts.map +1 -1
- package/dist/ui/toast.js +56 -54
- package/dist/ui/toast.js.map +1 -1
- package/docs/components/composed/content-card.md +2 -0
- package/docs/components/ui/button.md +3 -3
- package/docs/components/ui/card.md +27 -10
- package/docs/components/ui/chat.md +1 -1
- package/docs/components/ui/color-input.md +2 -2
- package/docs/components/ui/data-table.md +8 -1
- package/docs/components/ui/segmented-control.md +2 -2
- package/docs/components/ui/separator.md +3 -1
- package/docs/components/ui/split-button.md +3 -0
- package/docs/components/ui/stat-card.md +10 -2
- package/docs/components/ui/table-row-link.md +41 -0
- package/docs/components/ui/table.md +69 -0
- package/docs/components/ui/toast.md +10 -6
- package/docs/recipes/install-next-app-router.md +1 -1
- package/docs/recipes/troubleshoot.md +1 -1
- package/llms.txt +159 -781
- package/make-kit/components/card.md +54 -16
- package/make-kit/components/table.md +45 -7
- package/make-kit/foundations/spacing.md +3 -1
- package/make-kit/foundations/surfaces.md +1 -1
- package/mcp-manifest.json +12349 -0
- package/mcp-manifest.schema.json +232 -0
- package/package.json +8 -3
- package/skill/README.md +0 -1
- package/skill/SKILL.md +9 -8
- package/skill/references/components.md +159 -781
- package/skill/references/setup-next-app-router.md +1 -1
- package/skill/references/troubleshoot.md +1 -1
- package/llms-full.txt +0 -7198
- package/llms-quick.txt +0 -251
- package/skill/references/components-full.md +0 -7200
package/llms.txt
CHANGED
|
@@ -1,783 +1,161 @@
|
|
|
1
1
|
# @devalok/shilp-sutra
|
|
2
2
|
|
|
3
|
-
> Radix UI + Tailwind 4 (CSS-first) + CVA design system for Devalok apps.
|
|
4
|
-
> Built on the same primitives as shadcn/ui but with
|
|
5
|
-
>
|
|
6
|
-
|
|
7
|
-
##
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
- `
|
|
26
|
-
- `
|
|
27
|
-
- `
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
-
|
|
51
|
-
-
|
|
52
|
-
-
|
|
53
|
-
-
|
|
54
|
-
-
|
|
55
|
-
-
|
|
56
|
-
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
-
|
|
65
|
-
-
|
|
66
|
-
-
|
|
67
|
-
-
|
|
68
|
-
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
-
|
|
81
|
-
-
|
|
82
|
-
-
|
|
83
|
-
-
|
|
84
|
-
-
|
|
85
|
-
-
|
|
86
|
-
-
|
|
87
|
-
-
|
|
88
|
-
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
-
|
|
93
|
-
-
|
|
94
|
-
-
|
|
95
|
-
-
|
|
96
|
-
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
-
|
|
101
|
-
-
|
|
102
|
-
-
|
|
103
|
-
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
-
|
|
108
|
-
-
|
|
109
|
-
-
|
|
110
|
-
-
|
|
111
|
-
-
|
|
112
|
-
-
|
|
113
|
-
-
|
|
114
|
-
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
-
|
|
120
|
-
-
|
|
121
|
-
-
|
|
122
|
-
-
|
|
123
|
-
-
|
|
124
|
-
-
|
|
125
|
-
-
|
|
126
|
-
-
|
|
127
|
-
-
|
|
128
|
-
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
-
|
|
135
|
-
-
|
|
136
|
-
-
|
|
137
|
-
-
|
|
138
|
-
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
-
|
|
147
|
-
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
-
|
|
152
|
-
-
|
|
153
|
-
-
|
|
154
|
-
-
|
|
155
|
-
-
|
|
156
|
-
-
|
|
157
|
-
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
- **Button:** `variant="default"` removed (use `"solid"`), `variant="destructive"` removed (use `variant="solid" color="error"`), `color="default"` removed (use `"accent"`).
|
|
163
|
-
- **Chip:** Removed. Use `Badge` instead.
|
|
164
|
-
- **SegmentedControl:** Rewritten. Variants are `"default"` (white pill) and `"solid"` (brand pill). `SegmentedControlItem` no longer exported.
|
|
165
|
-
- **TopBar:** Now renders as `<header>` (was `<div>`).
|
|
166
|
-
- **Sidebar:** Now renders as `<aside>` (was `<div>`).
|
|
167
|
-
- **InfoBlock:** `role="status"` (was `role="alert"`).
|
|
168
|
-
- **Border tokens:** One step darker system-wide.
|
|
169
|
-
- **Dark mode button text:** Pure white `neutral-0` (#fff) on brand-colored buttons.
|
|
170
|
-
- **BottomNavbar:** Bottom padding is now `pb-safe` (safe-area-inset).
|
|
171
|
-
- **iOS inputs:** Forced to `font-size: max(16px, 1em)` on mobile via preset.
|
|
172
|
-
|
|
173
|
-
## CHANGES (v0.32.0)
|
|
174
|
-
|
|
175
|
-
- **Mobile Responsiveness:**
|
|
176
|
-
- Dialog auto-fullScreens on mobile (<768px). Opt out: `<DialogContent responsive={false}>`.
|
|
177
|
-
- Sheet auto-bottom with swipe-to-dismiss on mobile. Drag handle, 30% threshold. Opt out: `<SheetContent responsive={false}>`.
|
|
178
|
-
- Popover renders as bottom drawer on mobile automatically.
|
|
179
|
-
- `.touch-target` utility — 44px invisible hit area for Apple HIG compliance.
|
|
180
|
-
- `.pt-safe`, `.pb-safe`, `.pl-safe`, `.pr-safe`, `.p-safe` — safe area inset utilities.
|
|
181
|
-
- `useTouchDevice()` — detects touch capability (vs viewport width).
|
|
182
|
-
- `useViewportHeight()` — dynamic viewport height via Visual Viewport API.
|
|
183
|
-
- Sidebar has swipe-to-close on mobile.
|
|
184
|
-
- **DataTable `mobileView="card"`** — Rows render as stacked cards below 640px. First column = card title, rest = label-value pairs.
|
|
185
|
-
- **DataTable `aria-sort`** — Sortable column headers include `aria-sort`.
|
|
186
|
-
- **Charts `ariaLabel` prop** — Configurable screen reader label on all chart components.
|
|
187
|
-
- **SegmentedControl** — Redesigned: `variant="default"` (white pill + shadow-raised) | `variant="solid"` (brand pill). Inset radius, snappy spring animation.
|
|
188
|
-
- **`--shadow-kbd` token** — Keyboard shortcut badge shadow. Use `shadow-kbd` utility.
|
|
189
|
-
- **Checkbox/Radio `size` prop** — `sm | md (default) | lg`.
|
|
190
|
-
|
|
191
|
-
## CHANGES (v0.31.0)
|
|
192
|
-
- **Alert `size` prop** — `sm | md (default) | lg`. Scales padding, gap, icon, text.
|
|
193
|
-
- **Card `color` prop** — `default | accent | error | success | warning | info | neutral`. Semantic border color.
|
|
194
|
-
- **Card `size` prop** — `sm | md (default) | lg`. Propagated to sub-components via context.
|
|
195
|
-
- **Select `variant` prop** — `default | outline | ghost` on SelectTrigger.
|
|
196
|
-
- **Select `color` prop** — `default | error | success | warning` on SelectTrigger. Sets `aria-invalid` when error.
|
|
197
|
-
- **Tabs `color` prop** — `accent (default) | neutral`. Affects line variant indicator.
|
|
198
|
-
- **Tabs `size` prop** — `sm | md (default) | lg`. Scales height and padding.
|
|
199
|
-
- **Badge `truncate` prop** — Enables ellipsis truncation. Combine with fixed width or `maxWidth`.
|
|
200
|
-
- **New subpath exports** — `./ui/icon`, `./ui/icon-context`, `./ui/icon-group`, `./ui/badge-group`, `./ui/badge-indicator`, `./ui/devalok-grain`, `./ai/types`.
|
|
201
|
-
- **Server-safe fix** — `empty-state`, `priority-indicator`, `status-badge` now correctly get `"use client"` (were incorrectly omitted).
|
|
202
|
-
- **Server-safe detection** — Hardcoded allowlist replaced with `// @server-safe` source annotations.
|
|
203
|
-
|
|
204
|
-
## CHANGES (v0.30.0)
|
|
205
|
-
- **RichTextEditor `toolbar` prop** — `toolbar?: ToolbarItem[]` whitelist of toolbar items to display. Omit to show all (default). `ToolbarItem` type exported.
|
|
206
|
-
- **`@devalok/shilp-sutra-karm` removed** — Domain components moved to Karm app repo. npm package deprecated.
|
|
207
|
-
- **Warning dark mode fixed** — `warning-*` tokens now have proper dark mode values (higher chroma than category amber).
|
|
208
|
-
- **tailwind-merge fix** — All `text-ds-*` sizes now correctly registered. `cn('text-ds-lg', 'text-accent-11')` no longer strips the color.
|
|
209
|
-
- **AvatarGroup fixes** — Overflow badge text matches avatar size, indicator dots scale with size, aria-labels added.
|
|
210
|
-
|
|
211
|
-
## BREAKING CHANGES (v0.27.0 — Externalized Dependencies)
|
|
212
|
-
|
|
213
|
-
FilePreview and MarkdownViewer dependencies are now **external** (not bundled).
|
|
214
|
-
Install them if you use these components:
|
|
215
|
-
|
|
216
|
-
```bash
|
|
217
|
-
pnpm add react-pdf react-zoom-pan-pinch react-syntax-highlighter
|
|
218
|
-
```
|
|
219
|
-
|
|
220
|
-
These are optional peerDependencies — consumers who don't use FilePreview or MarkdownViewer are unaffected.
|
|
221
|
-
|
|
222
|
-
**Next.js optimization:** Add to your `next.config.js`:
|
|
223
|
-
```js
|
|
224
|
-
optimizePackageImports: ['@devalok/shilp-sutra']
|
|
225
|
-
```
|
|
226
|
-
|
|
227
|
-
## BREAKING CHANGES (v0.23.0 — Semantic Surface & Shadow Tokens)
|
|
228
|
-
|
|
229
|
-
**Surface tokens renamed:** Numeric `surface-1..4` replaced with semantic names.
|
|
230
|
-
| Old | New | Usage |
|
|
231
|
-
|-----|-----|-------|
|
|
232
|
-
| `bg-surface-1` | `bg-surface-base` | Page background |
|
|
233
|
-
| `bg-surface-1` | `bg-surface-sunken` | Shell chrome (sidebar, topbar), board columns |
|
|
234
|
-
| `bg-surface-1` | `bg-surface-overlay` | Dialogs, popovers, dropdowns, inputs |
|
|
235
|
-
| `bg-surface-2` | `bg-surface-raised` | Cards, widgets, panels |
|
|
236
|
-
| `bg-surface-3` | `bg-surface-raised-hover` | Hover states on raised elements |
|
|
237
|
-
| `bg-surface-4` | `bg-surface-raised-active` | Active/pressed states |
|
|
238
|
-
|
|
239
|
-
Same pattern for `border-surface-*`, `text-surface-*`, `ring-surface-*`.
|
|
240
|
-
|
|
241
|
-
**Shadow tokens renamed:** Numeric `shadow-01..05` replaced with semantic names.
|
|
242
|
-
| Old | New |
|
|
243
|
-
|-----|-----|
|
|
244
|
-
| `shadow-01` | `shadow-raised` |
|
|
245
|
-
| `shadow-02` | `shadow-raised-hover` |
|
|
246
|
-
| `shadow-03` | `shadow-floating` |
|
|
247
|
-
| `shadow-04` | `shadow-overlay` |
|
|
248
|
-
| `shadow-05` | (removed — was unused) |
|
|
249
|
-
|
|
250
|
-
**New surface tokens:**
|
|
251
|
-
- `bg-surface-sunken` — recessed areas (sidebar, board columns, segmented track)
|
|
252
|
-
- `bg-surface-overlay` — floating elements (dialogs, popovers, inputs). Diverges from base in dark mode.
|
|
253
|
-
- `bg-surface-inverted` / `text-surface-inverted-fg` — tooltips, inverted badges
|
|
254
|
-
- `bg-surface-disabled` / `text-surface-fg-disabled` — disabled elements
|
|
255
|
-
- `border-surface-border-subtle` — hairline dividers
|
|
256
|
-
- `bg-backdrop` — dialog/sheet backdrop overlay
|
|
257
|
-
|
|
258
|
-
**New shadow tokens:**
|
|
259
|
-
- `shadow-glow` — selection/focus accent glow
|
|
260
|
-
- `shadow-inset` — toggle/segmented track deboss
|
|
261
|
-
- `shadow-ring` / `shadow-ring-sm` — focus ring / subtle separator
|
|
262
|
-
|
|
263
|
-
**Hard rule: never combine explicit border + shadow.** Shadows include a 1px ring layer. Adding a CSS border creates a 2px edge. Use shadow OR border, never both.
|
|
264
|
-
|
|
265
|
-
**Breaking:** Old numeric aliases (`--color-surface-1..4`, `--shadow-01..05`, Tailwind `bg-surface-1..4`, `shadow-01..05`) have been removed. Use the semantic names listed above.
|
|
266
|
-
|
|
267
|
-
**Component Decision Matrix:**
|
|
268
|
-
| Building... | Surface | Shadow |
|
|
269
|
-
|-------------|---------|--------|
|
|
270
|
-
| Page/layout | `surface-base` | none |
|
|
271
|
-
| Shell (sidebar/topbar) | `surface-sunken` | `shadow-raised` |
|
|
272
|
-
| Card/widget/panel | `surface-raised` | `shadow-raised` |
|
|
273
|
-
| Card hover | `surface-raised` | `shadow-raised-hover` |
|
|
274
|
-
| Board column/well | `surface-sunken` | none |
|
|
275
|
-
| Popover/menu/dropdown | `surface-overlay` | `shadow-floating` |
|
|
276
|
-
| Dialog/modal/sheet | `surface-overlay` | `shadow-overlay` |
|
|
277
|
-
| Tooltip | `surface-inverted` | `shadow-floating` |
|
|
278
|
-
| Toast | `surface-overlay` | `shadow-floating` |
|
|
279
|
-
| Input (rest) | `surface-overlay` | none |
|
|
280
|
-
| Input (focus) | `surface-overlay` | `shadow-ring` |
|
|
281
|
-
| Button (solid) | accent colors | `shadow-raised` |
|
|
282
|
-
| Button (disabled) | `surface-disabled` | none |
|
|
283
|
-
| Segmented track | `surface-sunken` | `shadow-inset` |
|
|
284
|
-
| Selected item | current surface | `shadow-glow` |
|
|
285
|
-
|
|
286
|
-
## BREAKING CHANGES (v0.18.0 — Framer Motion + OKLCH)
|
|
287
|
-
|
|
288
|
-
**New runtime dependency:** `framer-motion@^12.36.0` (bundled). Karm consumers must install `framer-motion@^12.0.0` as peer dep.
|
|
289
|
-
|
|
290
|
-
**Transitions removed:** `Fade`, `Collapse`, `Grow`, `Slide` from `./ui/transitions` no longer exist. Use `MotionFade`, `MotionCollapse`, `MotionSlide` from `@devalok/shilp-sutra/motion/primitives`.
|
|
291
|
-
|
|
292
|
-
**CSS keyframe animations removed:** 18 keyframes (`fade-in`, `fade-out`, `slide-up`, `scale-in`, etc.) and their `animate-*` utilities removed from Tailwind preset. Use motion primitives instead.
|
|
293
|
-
|
|
294
|
-
**`useReducedMotion()` removed:** Use `<MotionProvider reducedMotion="user">` at app root.
|
|
295
|
-
|
|
296
|
-
**New motion system:**
|
|
297
|
-
- `import { MotionProvider, springs, tweens } from '@devalok/shilp-sutra/motion'`
|
|
298
|
-
- `import { MotionFade, MotionCollapse, MotionSlide, MotionPop, MotionScale, MotionStagger } from '@devalok/shilp-sutra/motion/primitives'`
|
|
299
|
-
- Springs: `springs.snappy`, `springs.smooth`, `springs.bouncy`, `springs.gentle`
|
|
300
|
-
- Tweens: `tweens.fade`, `tweens.colorShift`
|
|
301
|
-
|
|
302
|
-
**Spinner v2:** New props `state?: 'spinning' | 'success' | 'error'`, `variant?: 'filled' | 'bare'`, `delay?: number`, `onComplete?: () => void`
|
|
303
|
-
|
|
304
|
-
**Button `onClickAsync`:** New prop `onClickAsync?: (e) => Promise<void>` — auto-manages loading → success/error → idle states. `asyncFeedbackDuration?: number` (default 1500ms).
|
|
305
|
-
|
|
306
|
-
**Server safety changes:** EmptyState, StatusBadge, PriorityIndicator, Spinner are NOT server-safe (they use Framer Motion). Do NOT import from RSC.
|
|
307
|
-
|
|
308
|
-
**Build:** `framer-motion` and `sonner` moved from `dependencies` to `devDependencies` (bundled at build time — no consumer install needed for core).
|
|
309
|
-
|
|
310
|
-
**New APIs in v0.18.0:**
|
|
311
|
-
- Combobox: `accessibleLabel?: string` — custom aria-label for trigger (falls back to placeholder)
|
|
312
|
-
- Slider: multi-thumb support — pass array `defaultValue={[25, 75]}` for range sliders
|
|
313
|
-
|
|
314
|
-
## CHANGES (v0.16.0)
|
|
315
|
-
- **DataTable server-side features**: `onSort` callback (manual sorting), `pagination` prop (server-side pagination with page/total/onPageChange), `selectedIds` + `selectableFilter` (controlled selection), `loading` shimmer, `emptyState` ReactNode, `singleExpand`, `stickyHeader`, `onRowClick`, `bulkActions` floating bar
|
|
316
|
-
- **DataTable display**: `density?: 'compact' | 'standard' | 'comfortable'` (compact=4px padding, standard=16px, comfortable=32px). `toolbar?: boolean` (column visibility + density + export controls). Column `meta: { align: 'right' }` for numeric columns (auto-applies text-right tabular-nums). Column `meta: { hideBelow: 'md' }` for responsive column hiding (hidden below breakpoint). `selectableFilter?: (row) => boolean` to disable selection on certain rows (e.g. only PENDING rows selectable).
|
|
317
|
-
- **ActivityFeed**: New composed component — `@devalok/shilp-sutra/composed/activity-feed` — vertical timeline with colored dots, actor avatars, expandable detail, compact mode, load more
|
|
318
|
-
- EmptyState: `iconSize?: 'sm' | 'md' | 'lg'` prop for icon dimension control
|
|
319
|
-
- BottomNavbar: `badge?: number` on BottomNavItem for notification counts (99+ cap)
|
|
320
|
-
- AppSidebar: `preFooterClassName?: string` for scrollable preFooterSlot
|
|
321
|
-
|
|
322
|
-
## CHANGES (v0.15.0)
|
|
323
|
-
- **Input font standardization**: All input sizes (sm, md, lg) now use text-ds-md (14px). Previously lg used text-ds-lg (18px). Affects Input, Select, SearchInput, Textarea.
|
|
324
|
-
- CommandPalette: Staggered slide-up animations for items, fade-in for groups, scale-in search icon, active item color transitions
|
|
325
|
-
|
|
326
|
-
## CHANGES (v0.14.0)
|
|
327
|
-
- **BREAKING z-index**: Select, Combobox, Autocomplete, DropdownMenu, ContextMenu, Menubar, HoverCard promoted from z-dropdown (1000) to z-popover (1400). Fixes dropdowns rendering behind Sheet/Dialog. If you had custom z-index overrides (e.g. `[data-radix-popper-content-wrapper] { z-index: 1400 !important }`) you can now remove them.
|
|
328
|
-
- TabsTrigger: Added gap-ds-02 (4px) between icon and label
|
|
329
|
-
- AppSidebar: footer.version now accepts string | { label, href } for clickable version links
|
|
330
|
-
|
|
331
|
-
## CHANGES (v0.13.0)
|
|
332
|
-
- EmptyState: icon prop now accepts ComponentType (e.g. Tabler icon references) in addition to ReactNode
|
|
333
|
-
- NotificationCenter: Notification.actions?: NotificationAction[] — inline action buttons (Approve/Deny) per notification
|
|
334
|
-
- NotificationCenter: Tier dot now doubles as read/unread marker; separate unread dot removed
|
|
335
|
-
- AppSidebar: footer.promo?: SidebarPromo — dismissable promo banner with icon, text, action button
|
|
336
|
-
- AppSidebar: Footer links + version render on same line with · dividers
|
|
337
|
-
- Collapsible: Now uses height-based expand/collapse animation (animate-collapsible-down/up)
|
|
338
|
-
- Tailwind preset: 4 new keyframes + utilities — accordion-down, accordion-up, collapsible-down, collapsible-up
|
|
339
|
-
|
|
340
|
-
## CHANGES (v0.12.0)
|
|
341
|
-
- Input: Softer resting border (border-subtle instead of border), subtler focus ring (ring-1 ring-focus/50 instead of ring-2 ring-focus)
|
|
342
|
-
- Tailwind preset: 9 animation keyframes + utilities (fade-in, fade-out, slide-up, slide-right, scale-in, scale-out, glow-pulse, scale-bounce, lift)
|
|
343
|
-
- Tailwind preset: Stagger plugins — .delay-stagger (30ms × --stagger-index), .delay-stagger-50 (50ms × --stagger-index)
|
|
344
|
-
|
|
345
|
-
## BREAKING CHANGES (v0.11.0 — dark mode)
|
|
346
|
-
- Dark mode interactive colors shifted: --color-interactive pink-400→pink-500, --color-interactive-hover pink-300→pink-600, --color-interactive-active pink-200→pink-700, --color-interactive-subtle pink-950→pink-1000
|
|
347
|
-
- Dark mode text status colors shifted: --color-text-error red-200→red-300, --color-text-success green-200→green-300, --color-text-warning yellow-200→yellow-300, --color-text-link blue-200→blue-300, --color-text-brand pink-300→pink-400
|
|
348
|
-
- New primitive token: --pink-1000 (#150208) near-black
|
|
349
|
-
|
|
350
|
-
## BREAKING CHANGES (v0.8.0)
|
|
351
|
-
- Combobox: Now uses discriminated union. Single: `multiple?: false, value: string, onValueChange: (v: string) => void`. Multiple: `multiple: true, value: string[], onValueChange: (v: string[]) => void`. No more `v as string[]` casts.
|
|
352
|
-
- StatusBadge: Pass either `status` OR `color`, not both (discriminated union).
|
|
353
|
-
- Input/Textarea: Now auto-inherit state, aria-describedby, aria-required from FormField context. Explicit props override.
|
|
354
|
-
|
|
355
|
-
## BREAKING CHANGES (v0.18.0 — OKLCH token migration, continued)
|
|
356
|
-
- All color primitives migrated from hex (50-950 shades) to OKLCH (12 functional steps)
|
|
357
|
-
- Old shade numbers: --pink-50..950. New step numbers: --pink-1..12 (OKLCH values)
|
|
358
|
-
- Step purposes: 1=app-bg, 2=subtle-bg, 3=component-bg, 4=hover, 5=active, 6=border-subtle, 7=border, 8=border-strong, 9=solid/accent, 10=solid-hover, 11=lo-contrast-text, 12=hi-contrast-text
|
|
359
|
-
- New semantic tokens: --color-accent-{1-12}, --color-secondary-{1-12}, --color-surface-{base,raised,raised-hover,raised-active,sunken,overlay,inverted,disabled}, --color-surface-fg/fg-muted/fg-subtle/border/border-subtle
|
|
360
|
-
- Status tokens: --color-error-{3,7,9,11,fg}, --color-success-{3,7,9,11,fg}, --color-warning-{3,7,9,11,fg}, --color-info-{3,7,9,11,fg}
|
|
361
|
-
- New Tailwind utilities: accent-1..12, secondary-1..12, surface-base/raised/sunken/overlay/inverted/disabled, status/category step utilities
|
|
362
|
-
- Backward compat: ALL old semantic token names preserved as aliases. --color-interactive still works → maps to --color-accent-9
|
|
363
|
-
- Consumer rebranding: override --color-accent-1..12 CSS vars OR use generateScale() utility with a seed color
|
|
364
|
-
- Dark mode: algorithmically derived (OKLCH curves), NOT hex overrides. Surfaces lighten with elevation.
|
|
365
|
-
- If you reference --pink-500 etc directly, migrate: 50→1, 100→2, 200→3, 300→4, 400→5, 500→7, 600→8, 700→9, 800→10, 900→11, 950→12
|
|
366
|
-
|
|
367
|
-
## v0.22.0 — UI Polish & Micro-Refinement
|
|
368
|
-
|
|
369
|
-
**Shadows**: All shadow tokens now use 3-layer stacks. Visual change only — same token names. Shadow tokens renamed in v0.23.0 (see breaking changes above).
|
|
370
|
-
|
|
371
|
-
**Transitions**: All CSS transitions use `ease-productive-standard` easing. Tween presets aligned: `tweens.fade` = 0.11s, `tweens.colorShift` = 0.07s.
|
|
372
|
-
|
|
373
|
-
**New Tailwind utilities**:
|
|
374
|
-
- `.focus-ring` — double-ring (2px surface + 2px accent), use on custom interactive elements (buttons, cards)
|
|
375
|
-
- `.focus-ring-inset` — inset ring, use on buttons over solid backgrounds
|
|
376
|
-
- `.focus-ring-sm` — 1px subtle ring, use on inputs and small controls
|
|
377
|
-
- `.tabular-nums` — aligned numbers via `font-variant-numeric: tabular-nums`
|
|
378
|
-
|
|
379
|
-
**Category color utilities** (standalone, not tied to Badge/Chip):
|
|
380
|
-
- 7 colors: teal, amber, slate, indigo, cyan, orange, emerald
|
|
381
|
-
- 4 steps each: bg-category-{color}-{3|7|9|11}, text-category-{color}-{3|7|9|11}, border-category-{color}-{3|7|9|11}
|
|
382
|
-
- Use for: board column accents, status indicators, tag colors, category chips
|
|
383
|
-
|
|
384
|
-
**Dense size variant (xs)** added to Input, Select, SearchInput, Button, Textarea:
|
|
385
|
-
- xs = 28px height (h-ds-xs-plus), 12px text (text-ds-sm), compact padding
|
|
386
|
-
- Designed for filter bars, toolbar controls, and dense UI contexts
|
|
387
|
-
- Button also gets icon-xs (28×28) for compact icon buttons
|
|
388
|
-
- Size matrix: xs=28px | sm=32px | md=40px (default) | lg=48px
|
|
389
|
-
|
|
390
|
-
**Separator**: New `variant` prop — `"gradient" | "gradient-left" | "gradient-right"`. Default unchanged.
|
|
391
|
-
|
|
392
|
-
**Checkbox**: Path-draw animation (stroke draws progressively). Uncontrolled usage now works.
|
|
393
|
-
|
|
394
|
-
**Tooltip**: Auto-wraps with `<TooltipProvider>` — no manual provider needed. Text color fixed for dark mode.
|
|
395
|
-
|
|
396
|
-
**Avatar fallback**: Now respects `shape` prop (was always circle). Font size auto-scales with avatar size (v0.22.3).
|
|
397
|
-
|
|
398
|
-
**AvatarGroup renderAvatar**: Wrapper is positioning-only — pass `size` directly to your Avatar, do NOT use `className="h-full w-full"` (v0.22.3).
|
|
399
|
-
|
|
400
|
-
**New hover states**: Checkbox, Radio, Switch track, Select items, DropdownMenu items, Combobox trigger.
|
|
401
|
-
|
|
402
|
-
## AI Command System (v0.25.0+)
|
|
403
|
-
|
|
404
|
-
New `@devalok/shilp-sutra/ai` module — composable AI command interface.
|
|
405
|
-
|
|
406
|
-
**CommandBar** — Unified input (hero/inline/floating variants):
|
|
407
|
-
```tsx
|
|
408
|
-
<CommandBar
|
|
409
|
-
variant="hero"
|
|
410
|
-
onSubmit={(query) => sendToAI(query)} // AI submission
|
|
411
|
-
groups={commandGroups} // optional command palette filtering
|
|
412
|
-
state="idle" // idle | typing | processing | responded
|
|
413
|
-
greeting="Good morning, Mudit."
|
|
414
|
-
hints={['Add member...', 'Check status...']}
|
|
415
|
-
agentName="Devadoot"
|
|
416
|
-
agentIcon={<DevadootIcon state={iconState} />}
|
|
417
|
-
>
|
|
418
|
-
<AIConversation messages={messages} isProcessing={loading} />
|
|
419
|
-
</CommandBar>
|
|
420
|
-
```
|
|
421
|
-
|
|
422
|
-
**BlockRenderer** — Renders AI response JSON as DS components:
|
|
423
|
-
```tsx
|
|
424
|
-
<BlockRenderer blocks={response.blocks} onAction={handleAction} customBlocks={myBlocks} />
|
|
425
|
-
```
|
|
426
|
-
|
|
427
|
-
Block types: `text`, `table`, `confirm`, `success`, `error`, `info`, `loading`, `divider`, `stat_row`.
|
|
428
|
-
|
|
429
|
-
**AICommandProvider** — Optional context wrapper:
|
|
430
|
-
```tsx
|
|
431
|
-
<AICommandProvider customBlocks={karmBlocks} onAction={handle} agent={{ name: 'Devadoot' }}>
|
|
432
|
-
{/* CommandBar + AIConversation auto-wire from context */}
|
|
433
|
-
</AICommandProvider>
|
|
434
|
-
```
|
|
435
|
-
|
|
436
|
-
**DevadootIcon** — Animated Devalok chakra with gradient state animations:
|
|
437
|
-
```tsx
|
|
438
|
-
<DevadootIcon state="processing" size={20} /> // idle | processing | responded | error
|
|
439
|
-
```
|
|
440
|
-
|
|
441
|
-
## Install & Setup
|
|
442
|
-
|
|
443
|
-
pnpm add @devalok/shilp-sutra
|
|
444
|
-
|
|
445
|
-
### Next.js Setup (Required for Next.js + pnpm)
|
|
446
|
-
|
|
447
|
-
Add to next.config.js:
|
|
448
|
-
```js
|
|
449
|
-
transpilePackages: ["@devalok/shilp-sutra"]
|
|
450
|
-
```
|
|
451
|
-
|
|
452
|
-
// Import components (barrel):
|
|
453
|
-
import { Button, Card, Dialog } from '@devalok/shilp-sutra'
|
|
454
|
-
|
|
455
|
-
// Import per-component (recommended for Server Components):
|
|
456
|
-
import { Button } from '@devalok/shilp-sutra/ui/button'
|
|
457
|
-
import { PageHeader } from '@devalok/shilp-sutra/composed/page-header'
|
|
458
|
-
import { TopBar } from '@devalok/shilp-sutra/shell/top-bar'
|
|
459
|
-
|
|
460
|
-
// Chat primitives (v0.29.0+):
|
|
461
|
-
import { MessageList, Message, SystemMessage, MessageInput, DateSeparator, UnreadSeparator, TypingIndicator } from '@devalok/shilp-sutra/ui/chat'
|
|
462
|
-
|
|
463
|
-
// AI command system (v0.25.0+):
|
|
464
|
-
import { CommandBar, AIConversation, BlockRenderer, AICommandProvider, DevadootIcon } from '@devalok/shilp-sutra/ai'
|
|
465
|
-
|
|
466
|
-
// Toast (imperative, no hook needed):
|
|
467
|
-
import { toast } from '@devalok/shilp-sutra/ui/toast'
|
|
468
|
-
|
|
469
|
-
// Hooks:
|
|
470
|
-
import { useColorMode } from '@devalok/shilp-sutra/hooks/use-color-mode'
|
|
471
|
-
|
|
472
|
-
// CSS tokens (import once at app root — already included in /css):
|
|
473
|
-
import '@devalok/shilp-sutra/css'
|
|
474
|
-
|
|
475
|
-
## IMPORT PATH CHEATSHEET (don't guess — these subpaths are NOT always the kebab-case of the component name)
|
|
476
|
-
|
|
477
|
-
> **0.40.0 — barrel peer-cliff cleanup.** Components below marked `MANDATORY per-component` were removed from their parent barrel (`/ui`, `/composed`, `/ai`, `/ai/blocks`) because they statically import optional peers (`input-otp`, `sonner`, `date-fns`, `@emoji-mart/*`, `react-pdf`, `react-zoom-pan-pinch`, `react-markdown`, `remark-gfm`, `react-syntax-highlighter`, `@tiptap/*`). Fresh consumers using the barrel were getting `Module not found` at build time. The per-component subpath is now the ONLY way to import them. See MIGRATION.md → "v0.40.0 — barrel peer-cliff cleanup" for the full before/after.
|
|
478
|
-
|
|
479
|
-
Common confusions to memorize:
|
|
480
|
-
|
|
481
|
-
| Component / API | Exact import path |
|
|
482
|
-
|------------------------------------------------|----------------------------------------------------------------|
|
|
483
|
-
| `FormField`, `FormHelperText`, `useFormField` | `@devalok/shilp-sutra/ui/form` (NOT `ui/form-field`)|
|
|
484
|
-
| `Label` | `@devalok/shilp-sutra/ui/label` |
|
|
485
|
-
| `AppSidebar` | `@devalok/shilp-sutra/shell/sidebar` (NOT `shell/app-sidebar`)|
|
|
486
|
-
| `TopBar`, `TopBar.*` | `@devalok/shilp-sutra/shell/top-bar` |
|
|
487
|
-
| `BottomNavbar` | `@devalok/shilp-sutra/shell/bottom-navbar` |
|
|
488
|
-
| `AppCommandPalette` | `@devalok/shilp-sutra/shell/app-command-palette` |
|
|
489
|
-
| `CommandRegistryProvider`, `useCommandRegistry`| `@devalok/shilp-sutra/shell/command-registry` |
|
|
490
|
-
| `NotificationCenter` | `@devalok/shilp-sutra/shell/notification-center` |
|
|
491
|
-
| `NotificationPreferences` | `@devalok/shilp-sutra/shell/notification-preferences` |
|
|
492
|
-
| `LinkProvider`, `useLink` | `@devalok/shilp-sutra/shell/link-context` |
|
|
493
|
-
| `CommandPalette` (lower-level palette) | `@devalok/shilp-sutra/composed/command-palette` |
|
|
494
|
-
| `BarChart`, `LineChart`, `AreaChart`, `PieChart`, `RadarChart`, `GaugeChart`, `Sparkline`, `ChartContainer`, `Legend` | `@devalok/shilp-sutra/ui/charts` (full barrel, pulls all 9 d3-\* peers) — **prefer per-chart subpath when possible: `/ui/charts/bar-chart`, `/ui/charts/line-chart`, `/ui/charts/area-chart`, `/ui/charts/pie-chart`, `/ui/charts/radar-chart`, `/ui/charts/gauge-chart`, `/ui/charts/sparkline`, `/ui/charts/chart-container`** (each pulls only the d3-\* peers it needs — BarChart needs `d3-scale` + `d3-axis` + `d3-selection`; PieChart/RadarChart need only `d3-shape`) |
|
|
495
|
-
| `DataTable` | `@devalok/shilp-sutra/ui/data-table` |
|
|
496
|
-
| `DataTableToolbar` | `@devalok/shilp-sutra/ui/data-table-toolbar` |
|
|
497
|
-
| `DatePicker`, `DateRangePicker`, `DateTimePicker`, `TimePicker`, `CalendarGrid`, `YearPicker`, `MonthPicker`, `Presets`, `useCalendar` | `@devalok/shilp-sutra/composed/date-picker` **MANDATORY per-component (0.40.0+)** — pulls `date-fns` |
|
|
498
|
-
| `Toaster` | `@devalok/shilp-sutra/ui/toaster` **MANDATORY per-component (0.40.0+)** — pulls `sonner` |
|
|
499
|
-
| `toast` | `@devalok/shilp-sutra/ui/toast` **MANDATORY per-component (0.40.0+)** — pulls `sonner` |
|
|
500
|
-
| `InputOTP`, `InputOTPGroup`, `InputOTPSeparator`, `InputOTPSlot` | `@devalok/shilp-sutra/ui/input-otp` **MANDATORY per-component (0.40.0+)** — pulls `input-otp` |
|
|
501
|
-
| `EmojiPicker`, `EmojiPickerPopover`, `EmojiData`, `EmojiSet` | `@devalok/shilp-sutra/composed/emoji-picker` **MANDATORY per-component (0.40.0+)** — pulls `@emoji-mart/data` + `@emoji-mart/react` |
|
|
502
|
-
| `EmojiNode`, `EmojiNodeAttrs` | `@devalok/shilp-sutra/composed/extensions/emoji-node` **MANDATORY per-component (0.40.0+)** — pulls `@tiptap/*` |
|
|
503
|
-
| `createEmojiSuggestion` | `@devalok/shilp-sutra/composed/extensions/emoji-suggestion` **MANDATORY per-component (0.40.0+)** — pulls `@tiptap/*` |
|
|
504
|
-
| `FilePreview`, `FilePreviewProps` | `@devalok/shilp-sutra/composed/file-preview` **MANDATORY per-component (0.40.0+)** — pulls `react-pdf` + `react-zoom-pan-pinch` |
|
|
505
|
-
| `MarkdownViewer` | `@devalok/shilp-sutra/composed/markdown-viewer` **MANDATORY per-component (0.40.0+)** — pulls `react-markdown` + `react-syntax-highlighter` + `remark-gfm` |
|
|
506
|
-
| `RichChatInput`, `AudioPlayer`, `AudioWaveform`, `useVoiceRecorder` | `@devalok/shilp-sutra/composed/rich-chat-input` **MANDATORY per-component (0.40.0+)** — pulls `@tiptap/*` |
|
|
507
|
-
| `RichTextEditor`, `RichTextViewer`, `MentionItem`, `ToolbarItem` | `@devalok/shilp-sutra/composed/rich-text-editor` **MANDATORY per-component (0.40.0+)** — pulls `@tiptap/*` |
|
|
508
|
-
| `MessageList`, `Message`, `SystemMessage`, `MessageInput`, `DateSeparator`, `UnreadSeparator`, `TypingIndicator` | `@devalok/shilp-sutra/ui/chat` |
|
|
509
|
-
| `CommandBar` | `@devalok/shilp-sutra/ai/command-bar` (also re-exported from `/ai`) |
|
|
510
|
-
| `AIConversation` | `@devalok/shilp-sutra/ai/conversation` |
|
|
511
|
-
| `BlockRenderer` | `@devalok/shilp-sutra/ai/block-renderer` **MANDATORY per-component (0.40.0+)** — transitively pulls `react-markdown` + `remark-gfm` via ErrorBlock/TextBlock |
|
|
512
|
-
| `AICommandProvider` | `@devalok/shilp-sutra/ai/ai-command-provider` |
|
|
513
|
-
| `DevadootIcon` | `@devalok/shilp-sutra/ai` |
|
|
514
|
-
| `ErrorBlock` | `@devalok/shilp-sutra/ai/blocks/error` **MANDATORY per-component (0.40.0+)** — pulls `react-markdown` + `remark-gfm` |
|
|
515
|
-
| `TextBlock` | `@devalok/shilp-sutra/ai/blocks/text` **MANDATORY per-component (0.40.0+)** — pulls `react-markdown` + `remark-gfm` |
|
|
516
|
-
| `BlockTable`, `ConfirmBlock`, `DividerBlock`, `InfoBlock`, `LoadingBlock`, `StatRowBlock`, `SuccessBlock` | `@devalok/shilp-sutra/ai/blocks` (barrel — these 7 are peer-cliff-free) |
|
|
517
|
-
| `useColorMode` | `@devalok/shilp-sutra/hooks/use-color-mode` |
|
|
518
|
-
| `useMobile` | `@devalok/shilp-sutra/hooks/use-mobile` |
|
|
519
|
-
| `MotionProvider`, `springs`, `tweens`, `stagger`, `useMotion` | `@devalok/shilp-sutra/motion` |
|
|
520
|
-
| `MotionFade`, `MotionScale`, `MotionPop`, `MotionSlide`, `MotionCollapse`, `MotionStagger`, `MotionStaggerItem` | `@devalok/shilp-sutra/motion/primitives` |
|
|
521
|
-
|
|
522
|
-
Components named directly after their file (`Button` → `ui/button`, `Card` → `ui/card`, `Avatar` → `ui/avatar`, `Stack` → `ui/stack`, `Text` → `ui/text`, etc.) follow the kebab-case-of-name rule. The table above is for the ones that DON'T.
|
|
523
|
-
|
|
524
|
-
**When in doubt:** `cat node_modules/@devalok/shilp-sutra/package.json | jq '.exports | keys'` lists every available subpath in the installed version.
|
|
525
|
-
|
|
526
|
-
## ICON API — one shape across every component (v0.40.0+)
|
|
527
|
-
|
|
528
|
-
Every icon-accepting prop in the design system (`startIcon`, `endIcon`, `icon`, etc. — see list below) takes the **`IconInput`** type. Pass any of these four shapes interchangeably:
|
|
529
|
-
|
|
530
|
-
```tsx
|
|
531
|
-
import { IconPlus } from '@tabler/icons-react'
|
|
532
|
-
import { Icon } from '@devalok/shilp-sutra/ui/icon'
|
|
533
|
-
|
|
534
|
-
<Button startIcon={<Icon icon={IconPlus} />}>Add</Button> // canonical
|
|
535
|
-
<Button startIcon={<IconPlus />}>Add</Button> // raw Tabler element
|
|
536
|
-
<Button startIcon={IconPlus}>Add</Button> // component ref
|
|
537
|
-
<Button startIcon={<span>+</span>}>Add</Button> // custom node
|
|
538
|
-
```
|
|
539
|
-
|
|
540
|
-
All four work identically at the call site. The component wraps its icon slot in `<IconProvider size={...}>` so size + stroke flow via React context — no `className="h-4 w-4"` overrides needed.
|
|
541
|
-
|
|
542
|
-
**Upgrading 0.39→0.40 — one narrowing:** `IconInput` (`ReactElement | ComponentType | null | undefined`) excludes `string`/`number`/iterables that `React.ReactNode` allows. The 14 components previously typed `React.ReactNode` (Combobox, Stepper, TreeItem, OAuthButton, AppCommandPalette, CommandRegistry, BottomNavbar, Sidebar nav items, TopBar, Chat.Message.Avatar, SystemMessage, AIConversation, ActivityFeed, CommandPalette) now accept less. If you feed them icons from a `Record<string, React.ReactNode>` map or `?: React.ReactNode` field, `tsc` fails — retype the source to `React.ReactElement`. Build-time only; runtime JSX is unaffected.
|
|
543
|
-
|
|
544
|
-
**Components on the unified API:** Button, IconButton, Badge, Combobox, SegmentedControl, Stepper, StatCard, TreeItem (TreeNode.icon), OAuthButton (icon + linkedIcon), Chat.Message.Avatar, Chat.Message.Action, Chat.SystemMessage, AIConversation (agent.icon), AICommandProvider (agent.icon), CommandBar (item.icon), EmptyState (kills the dual ReactNode|ComponentType signature), BulkActionBar (action.icon), ActivityFeed (item.icon), CommandPalette (item.icon), TopBar (UserMenuItem.icon, TopBar.IconButton.icon), Sidebar (NavItem.icon, NavSubItem.icon, footer.promo.icon), BottomNavbar (item.icon), AppCommandPalette (SearchResult.icon), CommandRegistry (CommandPageItem.icon).
|
|
545
|
-
|
|
546
|
-
**Internals** (`<Toaster>`, `<Toast>`'s success/error icons) use Sonner's own type contract and don't accept consumer-passed icons — that's by design.
|
|
547
|
-
|
|
548
|
-
**When to use which shape:**
|
|
549
|
-
- `<Icon icon={IconX} />` when you want explicit size/stroke control (size flows from context if not set)
|
|
550
|
-
- `<IconX />` when you trust the surrounding `IconProvider` and don't need stroke control
|
|
551
|
-
- `IconX` (raw ref) when you want the helper to do the wrapping for you (auto-wraps to `<Icon icon={IconX} />`)
|
|
552
|
-
- Custom node when the "icon" is actually `<span>$</span>` or an emoji
|
|
553
|
-
|
|
554
|
-
**Migration:** zero consumer changes needed if you were already passing valid React content. Components that previously took strict `IconProps['icon']` (BulkActionBar, Message.Action) or `ComponentType<{className}>` (SegmentedControl) now also accept the other three shapes. Strict-to-loose type widening — no breaking calls.
|
|
555
|
-
|
|
556
|
-
## CRITICAL: Differences from shadcn/ui
|
|
557
|
-
|
|
558
|
-
If you have shadcn/ui knowledge, these are the differences that WILL trip you up:
|
|
559
|
-
|
|
560
|
-
| shadcn/ui pattern | shilp-sutra equivalent | Notes |
|
|
561
|
-
|---|---|---|
|
|
562
|
-
| variant="destructive" | color="error" | Two-axis system: variant=shape, color=intent |
|
|
563
|
-
| size="default" | size="md" | All sizes: sm, md, lg (never "default") |
|
|
564
|
-
| <Select size="lg"> | <SelectTrigger size="lg"> | Size goes on trigger, NOT root |
|
|
565
|
-
| <Chip> | <Badge onClick={...}> | Chip is deprecated, use Badge with onClick |
|
|
566
|
-
| useToast() + toast({ variant }) | toast.success('msg') | Imperative API, no hook needed |
|
|
567
|
-
| Badge variant="destructive" | Badge variant="solid" color="error" | Two-axis: variant + color |
|
|
568
|
-
| Alert + AlertTitle + AlertDescription | <Alert title="..." color="error"> | Single component, not compound |
|
|
569
|
-
| Form + FormField + FormItem + FormLabel + FormControl + FormDescription + FormMessage | FormField + Label + Input + FormHelperText + useFormField() | Simpler API, hook-based a11y wiring |
|
|
570
|
-
| Pagination | PaginationRoot | Root component name differs |
|
|
571
|
-
|
|
572
|
-
### The Two-Axis Variant System
|
|
573
|
-
|
|
574
|
-
Many components use TWO props where shadcn uses one:
|
|
575
|
-
- `variant` controls SHAPE/SURFACE: solid, outline, ghost, subtle, filled, etc.
|
|
576
|
-
- `color` controls INTENT/SEMANTICS: default, error, success, warning, info, etc.
|
|
577
|
-
|
|
578
|
-
Examples:
|
|
579
|
-
<Button variant="solid" color="error">Delete</Button> // red solid button
|
|
580
|
-
<Button variant="soft" color="warning">Pending</Button> // amber tinted button
|
|
581
|
-
<Button variant="soft" color="accent">Cancel</Button> // preferred for secondary actions
|
|
582
|
-
<Badge variant="solid" color="success">Active</Badge> // green solid badge
|
|
583
|
-
<Alert variant="solid" color="warning">Warning!</Alert> // amber filled alert
|
|
584
|
-
|
|
585
|
-
**Design preference (Devalok default):** for **secondary** Button actions, reach for `variant="soft"` before `variant="outline"`. Soft feels warmer, brand-consistent, and reads better in data-dense UIs. Use `outline` only when soft's tint would disappear (colored bg, surface-raised), in toolbar/icon-dense contexts, or when you need outline's stronger hierarchy next to a primary action.
|
|
586
|
-
|
|
587
|
-
Components with two-axis system: Button, Badge, Alert, Banner, Progress, StatusBadge
|
|
588
|
-
|
|
589
|
-
## Component Quick Reference
|
|
590
|
-
|
|
591
|
-
### Inputs & Controls
|
|
592
|
-
- Button: variant(solid|soft|outline|ghost|link) color(accent|error|success|warning|neutral) size(xs|sm|md|lg|compact-xs|compact-sm|compact-md|icon-xs|icon-sm|icon-md|icon-lg) shape(default|pill) weight(semibold|normal) + loading, startIcon, endIcon, asChild, processing?('ambient'|'working'|'urgent'|boolean — marching ants SVG border, forces soft variant), processingColor?('accent'|'error'|'success'|'warning'|'neutral'), processingDisabled?(boolean, default true — set false for cancel-by-click). onClickAsync auto-activates processing='working' during loading phase. Layout animation always on. Deprecated aliases still work: variant="default"→solid, variant="destructive"→solid+error, color="default"→accent
|
|
593
|
-
- IconButton: icon(ReactNode, required as PROP — NOT children) shape(square|circle) size(sm|md|lg) + aria-label required. **Children rejected by type** (`Omit<ButtonProps, 'children'>`); pass the icon via `icon=` prop. Correct: `<IconButton icon={<Icon icon={IconArrowRight} />} aria-label="Submit" />`. Wrong: `<IconButton><Icon icon={IconArrowRight} /></IconButton>` (TS error). Wrap with `<Icon icon={…} />` (not raw Tabler `<IconX />`) so the size context cascades.
|
|
594
|
-
- SplitButton: [Action | ▼] button with dropdown. Props: variant(solid|soft|outline), color, size(xs|sm|md|icon-xs|icon-sm|icon-md), triggerSide(left|right, default right), triggerWidth?(number|string), placement?(Floating UI Placement, default top-end), dropdownContent(ReactNode), open?, onOpenChange?, dropdownLabel?, dropdownIcon?. ARIA: role="group", aria-haspopup="menu", aria-expanded.
|
|
595
|
-
- ButtonGroup: Visually merges adjacent Buttons. Props: variant, color, size, disabled (propagates), orientation(horizontal|vertical), attached(true|false, default true), fullWidth. Compound pattern: Button reads position from context, applies radius + border-removal inline. Tonal dividers for solid/soft/ghost. Focus z-index isolation.
|
|
596
|
-
- Icon: `<Icon icon={IconPlus} />` — context-aware wrapper for Tabler icons. Size tiers: xs(14px) sm(16px) md(18px) lg(20px) xl(24px) 2xl(32px). Default: md. Stroke: light(1.5) regular(2) bold(2.5). Default: regular. Scales per size tier. Reads size from parent Button/IconGroup via IconContext. Explicit props override. Accessibility: aria-hidden by default. Pass label="Add item" for accessible icons. Animation: animate="spin|pulse|bounce|draw". `draw` renders SVG path-draw animation (check/X icons draw progressively via pathLength; other icons fall back to static). State machine: state="idle|loading|success|error". Button integration: startIcon={<Icon icon={IconPlus} />} (NOT raw <IconPlus />). IconGroup: <IconGroup size="sm" gap="tight"> for toolbar patterns.
|
|
597
|
-
- Input: size(xs|sm|md|lg) state(InputState) + startSection(ReactNode), endSection(ReactNode), startSectionClickable(bool), endSectionClickable(bool), startSectionType('icon'|'label'), endSectionType('icon'|'label'), wrapperClassName(string). Container-level focus ring wraps input + sections as one unit. Sections are pointer-events-none by default; use *SectionClickable for interactive content (clear buttons, toggles). Section type auto-inferred: strings→'label' (tinted bg + border separator), React elements→'icon' (fixed-width centered). Override with *SectionType. Flexbox section layout. Icons auto-size via IconProvider per input size. className targets <input>, wrapperClassName targets wrapper div. Type: InputState = 'default' | 'error' | 'warning' | 'success'
|
|
598
|
-
- SearchInput: size(xs|sm|md|lg) + loading, onClear. Delegates to Input v2 sections internally.
|
|
599
|
-
- NumberInput: value + onValueChange, min, max, step (controlled only)
|
|
600
|
-
- Textarea: size(xs|sm|md|lg) state(default|error|warning|success)
|
|
601
|
-
- ColorInput: value(hex string) onChange(value) presets({hex,label}[]|string[]|false, default: 10 named colors) variant('default'|'inline') showPicker(boolean, default:true) defaultFormat('hex'|'rgb'|'hsl') align('start'|'center'|'end') disabled. Popover trigger opens interactive picker (react-colorful) + format switcher + preset swatches + undo/reset. Inline variant renders entire trigger as the color with contrast-aware text.
|
|
602
|
-
- Checkbox: checked, onCheckedChange, error(boolean), indeterminate(boolean)
|
|
603
|
-
- Switch: checked, onCheckedChange, error(boolean), size(sm|md|lg), color(accent|success|warning), thumbIcon(ReactNode)
|
|
604
|
-
- RadioGroup > RadioGroupItem(value)
|
|
605
|
-
- Select > SelectTrigger(size: xs|sm|md|lg) > SelectValue; SelectContent > SelectItem(value)
|
|
606
|
-
- Toggle: variant(default|outline) size(sm|md|lg)
|
|
607
|
-
- ToggleGroup > ToggleGroupItem (variant/size propagate from root)
|
|
608
|
-
- SegmentedControl: variant(default|solid) size(sm|md|lg) options selectedId onSelect. Types: SegmentedControlOption = { id, text, icon? }, SegmentedControlSize = 'sm' | 'md' | 'lg', SegmentedControlVariant = 'default' | 'solid'
|
|
609
|
-
- Slider: standard Radix slider
|
|
610
|
-
|
|
611
|
-
### Feedback & Notifications
|
|
612
|
-
- Alert: variant(subtle|solid|outline) color(info|success|warning|error|neutral) size(sm|md|lg) + title, onDismiss
|
|
613
|
-
- Banner: color(info|success|warning|error|neutral) + actions?(ReactNode), onDismiss. Mobile flex-wrap for multiple buttons.
|
|
614
|
-
- Toast: imperative API via toast.success/error/warning/info/loading/message/undo/promise/upload/custom — REQUIRES <Toaster> at layout root
|
|
615
|
-
- Spinner: size(sm|md|lg) — renders with role="status"
|
|
616
|
-
- Progress: track size(sm|md|lg), indicator color(default|success|warning|error), autoColor(boolean, auto-shifts color by value: 0-59=default, 60-84=warning, 85-100=success, >100=error)
|
|
617
|
-
|
|
618
|
-
NOTIFICATION SELECTION GUIDE:
|
|
619
|
-
- Alert: inline contextual feedback within a form or page section
|
|
620
|
-
- Banner: persistent page-level notification above content
|
|
621
|
-
- Toast: transient notification triggered by user action (needs <Toaster>, then call toast.success() etc.)
|
|
622
|
-
|
|
623
|
-
### Data Display
|
|
624
|
-
- Badge: variant(subtle|solid|outline|soft) color(default|accent|error|success|warning|info|neutral + 7 category colors + custom) size(xs|sm|md|lg) + onClick, onDismiss, selected, disabled, dot, startIcon, endIcon, maxWidth, circle, asChild. Compound: Badge.Indicator(count, max, dot, color, invisible, showZero, placement, children), Badge.Group(max, gap, size, onOverflowClick, children). Custom colors: color="custom" + style={{'--badge-color':'#hex'}}. Grain-ready (has relative/overflow-hidden/isolate).
|
|
625
|
-
- Chip: DEPRECATED — Use `<Badge onClick={...}>` instead. Chip wrapper maps label prop to children for backward compat.
|
|
626
|
-
- Avatar: size(xs|sm|md|lg|xl) shape(circle|square|rounded) status?(AvatarStatus) ring?('lead'|'admin'|'client') badge?(number|'dot'|ReactNode) loading?(boolean) > AvatarImage + AvatarFallback(colorSeed?). Types: AvatarStatus = 'online'|'offline'|'busy'|'away', AvatarRing = 'none'|'lead'|'admin'|'client'. Fallback colors are deterministic from name hash (8 categorical). Online dot pulses. Badge pops in with MotionPop.
|
|
627
|
-
- Card: variant(default|elevated|outline|flat) interactive(boolean) accent?(left|top|right|bottom) accentColor?(default|secondary|error|success|warning|info) > CardHeader > CardTitle, CardDescription; CardContent; CardFooter
|
|
628
|
-
- Table > TableHeader > TableRow > TableHead; TableBody > TableRow > TableCell; TableFooter; TableCaption
|
|
629
|
-
- Text: variant(TextVariant) as(element). Type: TextVariant = 'heading-2xl' | 'heading-xl' | 'heading-lg' | 'heading-md' | 'heading-sm' | 'heading-xs' | 'body-lg' | 'body-md' | 'body-sm' | 'body-xs' | 'label-lg' | 'label-md' | 'label-sm' | 'label-xs' | 'caption' | 'overline'
|
|
630
|
-
- Code: variant(inline|block)
|
|
631
|
-
- Skeleton: variant(rectangle|circle|text) animation(pulse|shimmer|none)
|
|
632
|
-
- StatCard: title/label, value, delta, icon, prefix, suffix, comparisonLabel, secondaryLabel, progress, sparkline, onClick, href, accent(default|success|warning|error|info), footer
|
|
633
|
-
- ColorSwatch: color(CSS string) size(sm|md|lg) shape(circle|square|rounded) ring(boolean) — for dynamic runtime colors
|
|
634
|
-
- StatusDot: status(healthy|warning|critical|neutral|inactive) size(sm|md|lg) pulse?(boolean, default true for healthy) label?(string)
|
|
635
|
-
- ProgressRing: value(number) max?(100) size(sm|md|lg) color(default|success|warning|error|info) showValue?(boolean) label?(string). Also: MultiProgressRing for concentric Activity Ring style
|
|
636
|
-
- DevalokGrain: Brand texture overlay — drop inside any element with `relative overflow-hidden isolate`. Props: intensity('subtle'|'medium'|'heavy'), surface('solid'|'soft'), sheen(boolean, inner highlight), animated(boolean, fade-in on mount), hoverIntensify(boolean, parent needs `group` class), tint(CSS color string for directional gradient). No gradient rendered without tint.
|
|
637
|
-
|
|
638
|
-
### Chat Primitives (ui/chat/)
|
|
639
|
-
Import: `@devalok/shilp-sutra/ui/chat`
|
|
640
|
-
- MessageList: children, autoScroll?(true), newMessageCount?(number, shows floating "N new" pill), onScrollToBottom?(), onLoadMore?(), isLoadingMore?(boolean), emptySlot?(ReactNode), headerSlot?(ReactNode). role="log" aria-live="polite".
|
|
641
|
-
- Message: COMPOUND — variant('flat'|'bubble') placement('start'|'end') highlight?('mention'|'internal') grouped?(boolean) deleted?(boolean) deletedText?(string). Sub-parts: Message.Avatar(src?, fallback?, icon?, size?('sm'|'md')), Message.Content, Message.Author(name, badge?, timestamp?, formattedTimestamp?, timestampFormat?), Message.Body, Message.EditableBody(content, onSave, onCancel?, canEdit?, renderContent?), Message.Reactions(reactions[{emoji,count,reacted}], onReact), Message.Actions(children, delay?), Message.Action(icon, label, onClick, variant?('default'|'danger'))
|
|
642
|
-
- SystemMessage: variant('event'|'alert') icon?(ReactNode) timestamp?(string) children
|
|
643
|
-
- MessageInput: onSubmit(text=>void), placeholder?, disabled?, isStreaming?(boolean, shows stop button), onCancel?(), leadingSlot?, trailingSlot?, disclaimer?(string), sendIcon?(ReactNode). Enter to send, Shift+Enter for newline.
|
|
644
|
-
- DateSeparator: date(Date|string), format?((date)=>string). Shows "Today", "Yesterday", or "Mar 15".
|
|
645
|
-
- UnreadSeparator: label?('NEW'), count?(number). Accent-colored horizontal rule.
|
|
646
|
-
- TypingIndicator: users({name, image?}[]). Shows animated bouncing dots + "Alice is typing..." / "Alice and Bob are typing..." / "Several people are typing..."
|
|
647
|
-
|
|
648
|
-
### Overlays
|
|
649
|
-
- Dialog > DialogTrigger; DialogContent > DialogHeader > DialogTitle, DialogDescription; [content]; DialogFooter
|
|
650
|
-
- AlertDialog > AlertDialogTrigger; AlertDialogContent > AlertDialogHeader > AlertDialogTitle; AlertDialogFooter > AlertDialogCancel, AlertDialogAction
|
|
651
|
-
- Sheet: side(top|bottom|left|right) > SheetTrigger; SheetContent > SheetHeader > SheetTitle; [content]; SheetFooter
|
|
652
|
-
- Popover > PopoverTrigger; PopoverContent
|
|
653
|
-
- Tooltip: auto-wraps with <TooltipProvider> (no manual provider needed) > Tooltip > TooltipTrigger; TooltipContent
|
|
654
|
-
- HoverCard > HoverCardTrigger; HoverCardContent
|
|
655
|
-
- Collapsible > CollapsibleTrigger; CollapsibleContent
|
|
656
|
-
|
|
657
|
-
### Navigation
|
|
658
|
-
- Tabs > TabsList(variant: line|contained) > TabsTrigger(value); TabsContent(value) — variant propagates via context
|
|
659
|
-
- Accordion(type: single|multiple) > AccordionItem(value) > AccordionTrigger(chevronPosition?: 'left'|'right', default 'right'); AccordionContent
|
|
660
|
-
- Breadcrumb > BreadcrumbList > BreadcrumbItem > BreadcrumbLink | BreadcrumbPage; BreadcrumbSeparator
|
|
661
|
-
- PaginationRoot > PaginationContent > PaginationItem > PaginationLink(isActive) | PaginationPrevious | PaginationNext | PaginationEllipsis
|
|
662
|
-
- DropdownMenu > DropdownMenuTrigger; DropdownMenuContent > DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuCheckboxItem, DropdownMenuRadioGroup > DropdownMenuRadioItem
|
|
663
|
-
- ContextMenu > ContextMenuTrigger (right-click); ContextMenuContent > same sub-components as DropdownMenu
|
|
664
|
-
- Menubar > MenubarMenu > MenubarTrigger; MenubarContent > same sub-components
|
|
665
|
-
- NavigationMenu > NavigationMenuList > NavigationMenuItem > NavigationMenuTrigger, NavigationMenuContent, NavigationMenuLink
|
|
666
|
-
|
|
667
|
-
### Layout
|
|
668
|
-
- Stack: direction(vertical|horizontal) gap(SpacingToken|number) align, justify, wrap
|
|
669
|
-
- Container: maxWidth(default|body|full)
|
|
670
|
-
- Separator: orientation(horizontal|vertical)
|
|
671
|
-
- Sidebar: complex — see llms-full.txt for complete tree
|
|
672
|
-
|
|
673
|
-
### Form Pattern
|
|
674
|
-
- FormField: state(FormHelperState) > Label + Input + FormHelperText. Type: FormHelperState = 'helper' | 'error' | 'warning' | 'success'
|
|
675
|
-
- useFormField() hook returns { state, helperTextId, required } from FormField context
|
|
676
|
-
- Wire accessibility: const { state, helperTextId } = useFormField(); then aria-describedby={helperTextId}, aria-invalid={state === 'error'}
|
|
677
|
-
- Input/Textarea auto-wire from FormField context (no manual hookup needed). Explicit props override.
|
|
678
|
-
|
|
679
|
-
### Composed Components
|
|
680
|
-
- ConfirmDialog: open, onOpenChange, title, description, onConfirm + confirmText, cancelText, color(default|error), loading
|
|
681
|
-
- PageHeader: title, subtitle, breadcrumbs[], actions(ReactNode)
|
|
682
|
-
- AvatarGroup: users(AvatarUser[]), max?(number), size?(xs|sm|md|lg|xl), showTooltip?, borderColor?('surface-base'|'surface-raised'), onOverflowClick?(), renderAvatar?((user,index)=>ReactNode), expandDirection?('left'|'right'), expandAmount?('compact'|'default'|'wide'). Type: AvatarUser = { name, image?, ring?, indicator?('lead'|'admin'|ReactNode) }. GPU-composited hover expand via translateX. Use expandDirection="left" for right-aligned groups. indicator renders a small dot on avatar: 'lead'=warning-9, 'admin'=accent-9, or custom ReactNode.
|
|
683
|
-
- StatusBadge: DISCRIMINATED UNION — pass status OR color, not both. status(active|pending|approved|rejected|completed|blocked|in-progress|review|cancelled|draft) color(success|warning|error|info|neutral) size(sm|md) onClick?(() => void, renders as button with auto chevron-down icon) icon?(ReactNode, custom trailing icon)
|
|
684
|
-
- ContentCard: variant(default|outline|ghost) padding(default|compact|spacious|none)
|
|
685
|
-
- EmptyState: icon(ReactNode or ComponentType), title(required), description, action(ReactNode), compact
|
|
686
|
-
- PriorityIndicator: priority(Priority) display(compact|full). Type: Priority = 'LOW' | 'MEDIUM' | 'HIGH' | 'URGENT' | 'low' | 'medium' | 'high' | 'urgent'
|
|
687
|
-
- SimpleTooltip: wraps Tooltip compound into single component
|
|
688
|
-
- DatePicker, DateRangePicker, DateTimePicker
|
|
689
|
-
- TimePicker: standalone time selector — value(Date|null), onChange, format('12h'|'24h'), minuteStep, showSeconds, disabled
|
|
690
|
-
- CalendarGrid: low-level calendar widget — currentMonth, selected, rangeStart/End, onSelect, onMonthChange, events(CalendarEvent[])
|
|
691
|
-
- YearPicker: decade year grid — currentYear, selectedYear, onYearSelect, minDate, maxDate
|
|
692
|
-
- MonthPicker: month grid — currentYear, selectedMonth(0-11), onMonthSelect, minDate, maxDate
|
|
693
|
-
- Presets: date range quick-select buttons — presets(PresetKey[]), onSelect(start, end). Keys: today, yesterday, last7days, last30days, thisMonth, lastMonth, thisYear
|
|
694
|
-
- useCalendar: hook for calendar month state — returns currentMonth, goToPreviousMonth, goToNextMonth, goToMonth, goToYear
|
|
695
|
-
- (UploadProgress REMOVED — upload tracking is now built into toast.upload())
|
|
696
|
-
- RichTextEditor: Tiptap editor — bold/italic/underline/strike/highlight, headings, blockquote, lists (bullet/ordered/task), code, links, images (paste/drop/upload), file attachments, @mentions, emoji picker + :shortcode:, text alignment, HR. Props: onImageUpload?, onFileUpload?, mentions?, onMentionSearch?, onMentionSelect?(item: MentionItem), emojiSet?(native|apple|google|twitter|facebook)
|
|
697
|
-
- RichTextViewer: read-only renderer for RichTextEditor HTML content (renders all above content types)
|
|
698
|
-
- RichChatInput: compact rich text chat input for AI/messaging. Output: RichChatInputMessage { html, plainText, attachments?, voiceNote? }. Variants: compact(default), expanded, minimal, inline. Key props: onSubmit(msg), onSchedule?(msg,date), emojiSet?, mentions?, slashCommands?, onFileUpload?, onImageUpload?, onVoiceRecord?, replyTo?, toolbar?(bool|items[]|ReactNode), actionButton?(ReactNode|false), enterBehavior?(send|newline), maxLength?, isStreaming?, onCancel?, disclaimer?, sendOptions?, leadingSlot?, trailingSlot?. Composable toolbar primitives exported: ToolbarButton, ToolbarDivider, ToolbarGroup, BoldButton, ItalicButton, etc.
|
|
699
|
-
- ActivityFeed: items(ActivityItem[]), onLoadMore, loading, hasMore, emptyState, compact, maxInitialItems, groupBy?('time'|'none'), groupLabels?({ today, yesterday, thisWeek, older }), renderItem?((item, index) => ReactNode|undefined, custom renderer per item — return ReactNode for custom, undefined for default). Type: ActivityItem = { id, actor?, action, timestamp, icon?, color?, detail? }. Utility: groupItemsByTime(items, labels) exported.
|
|
700
|
-
- CommandPalette: open, defaultOpen, onOpenChange (controlled/uncontrolled), keybinding(string|string[]|false), maxHeight, emptyState(ReactNode), footerHints(FooterHint[]|false). CommandItem: label(string|ReactNode), description(string|ReactNode), renderLabel(query=>ReactNode), filterValue(string), shortcut(rendered as keycap badges). Keyboard shortcuts rendered per-key with platform-aware Cmd/Ctrl. Reduced-motion support via MotionProvider.
|
|
701
|
-
- MemberPicker: thin wrapper around MultiSelectPopover with Avatar rendering
|
|
702
|
-
- MultiSelectPopover: items/groups, value, onValueChange, searchPlaceholder, onSearch?(async), renderItem?, emptyMessage, maxSelections. Generic multi-select popover with search + checkmarks.
|
|
703
|
-
- FilterBar: searchValue, onSearchChange, onClearAll, size(xs|sm|md). Children: FilterSelect(label, value, onValueChange, options), FilterMultiSelect(label, value, onValueChange, options). Size propagates via context.
|
|
704
|
-
- InlineEdit: value, onSave(string=>void|Promise), placeholder, textClassName, inputSize(xs|sm|md), multiline, readOnly, maxLength, saving. Click-to-edit text → input transition.
|
|
705
|
-
- FormSection: title, description?, collapsible?, defaultOpen?. Titled form section with separator, optional collapse.
|
|
706
|
-
- BulkActionBar: show, count, onClearSelection, actions[{label,icon?,onClick,color?,disabled?}]. Fixed bottom floating bar for multi-select contexts.
|
|
707
|
-
- DeadlineIndicator: deadline(Date|string), warningThreshold?(1440min), criticalThreshold?(240min), format(relative|absolute), showIcon. Color transitions: green→yellow→red→overdue.
|
|
708
|
-
- MasterDetail: selected, onBack, masterWidth, breakpoint(sm|md|lg). Compound: MasterDetail.List, MasterDetail.Detail, MasterDetail.ListItem(active). Desktop=grid, mobile=stacked with back button.
|
|
709
|
-
- MarkdownViewer: content(string), compact?, allowHtml?(false), linkTarget?('_blank'). Renders markdown with design system tokens.
|
|
710
|
-
- EmojiPicker: onSelect(emoji), set?(native|apple|google|twitter|facebook), theme(auto|light|dark). EmojiPickerPopover wraps in Popover. Lazy-loads emoji-mart with set-specific data.
|
|
711
|
-
- EmojiNode: TipTap inline atom node for spritesheet emoji rendering. Attrs: id, native, set, x, y. Use createEmojiSuggestion(set) to wire :shortcode: autocomplete. Export: EmojiNode, EmojiNodeAttrs, createEmojiSuggestion.
|
|
712
|
-
- FilePreview: url, type?(image|pdf|video|audio|embed), mimeType?, alt?. Auto-detects type. Image zoom, PDF iframe, native video/audio, embed for Figma/YouTube/Loom.
|
|
713
|
-
- ErrorDisplay, GlobalLoading
|
|
714
|
-
- Loading skeletons: CardSkeleton, TableSkeleton, BoardSkeleton, ListSkeleton
|
|
715
|
-
- Page skeletons: DashboardSkeleton, ProjectListSkeleton, TaskDetailSkeleton (no props, server-safe)
|
|
716
|
-
|
|
717
|
-
### Shell Components (app-level layout)
|
|
718
|
-
- TopBar: Composition-based. Subcomponents: TopBar.Left, TopBar.Center (optional, triggers grid), TopBar.Right, TopBar.Section(gap: tight|default|loose), TopBar.IconButton(icon, tooltip), TopBar.Title, TopBar.UserMenu(user, onNavigate?, onLogout?, userMenuItems?). Types: TopBarUser = { name, email?, image? }, UserMenuItem = { label, icon?, href?, onClick?, separator?, color?, badge?, disabled? }
|
|
719
|
-
- AppSidebar: navigation tree with NavItem[], NavGroup[]. Types: NavItem = { title, href, icon, exact?, badge?, children?, defaultOpen? }, NavSubItem = { title, href, icon?, exact? }, NavGroup = { label, items, action? }, SidebarUser = { name, email?, image?, designation?, role? }
|
|
720
|
-
|
|
721
|
-
### AppSidebar (v0.10.0 additions)
|
|
722
|
-
- NavItem.children?: NavSubItem[] — collapsible sub-list with chevron toggle
|
|
723
|
-
- NavItem.defaultOpen?: boolean — control initial collapsed state
|
|
724
|
-
- NavItem.badge?: string | number — badge on nav item (99+ cap for numbers)
|
|
725
|
-
- NavGroup.action?: ReactNode — action button next to group label
|
|
726
|
-
- footer?: SidebarFooterConfig — structured footer with links, version, slot, promo (replaces footerLinks)
|
|
727
|
-
- headerSlot?: ReactNode — content between user info and navigation
|
|
728
|
-
- preFooterSlot?: ReactNode — content between navigation and footer
|
|
729
|
-
- renderItem?: (item, defaultRender) => ReactNode | null — custom item rendering
|
|
730
|
-
|
|
731
|
-
- BottomNavbar: mobile navigation, user is optional. Types: BottomNavItem = { title, href, icon, exact?, badge? }, BottomNavbarUser = { name, role? }
|
|
732
|
-
- NotificationCenter: notifications[], onMarkRead, onMarkAllRead, onNavigate, getNotificationRoute?, footerSlot?, emptyState?, headerActions?, popoverClassName?, onDismiss?(id). Types: Notification = { id, title, body?, tier, isRead, createdAt, entityType?, entityId?, projectId?, project?, actions? }, NotificationAction = { label, variant?, onClick }
|
|
733
|
-
- NotificationPreferences: preferences[], projects[], onSave, onToggleMute, onUpdateTier, onDelete. Types: NotificationPreference = { id, userId?, projectId, channel, minTier, muted }, NotificationProject = { id, title }
|
|
734
|
-
- AppCommandPalette: user, isAdmin, onNavigate, onSearch, searchResults, searchResultGroups(SearchResultGroup[]), isSearching, onSearchResultSelect (when provided, consumer owns routing — no internal URL computation), searchResultsLabel(string|((count)=>string)), open, defaultOpen, onOpenChange, keybinding, maxHeight, emptyState, footerHints. Types: SearchResult = { id, title, snippet?, entityType, projectId?, metadata?, icon?(ReactNode), rank?(number), shortcut?(string) }, SearchResultGroup = { label, results: SearchResult[] }, AppCommandPaletteUser = { name, role? }
|
|
735
|
-
- LinkProvider: wraps app with router-agnostic Link component — component(ForwardRefComponent), children. useLink() hook returns the Link component.
|
|
736
|
-
|
|
737
|
-
### Motion System (Framer Motion)
|
|
738
|
-
- Setup: Wrap app root with `<MotionProvider>` from `@devalok/shilp-sutra/motion`. Handles reduced-motion detection globally.
|
|
739
|
-
- Import presets: `import { springs, tweens, stagger } from '@devalok/shilp-sutra/motion'`
|
|
740
|
-
- Import primitives: `import { MotionFade, MotionScale, MotionPop, MotionSlide, MotionCollapse, MotionStagger, MotionStaggerItem } from '@devalok/shilp-sutra/motion/primitives'`
|
|
741
|
-
- Spring presets (spatial: position, scale, size): snappy (buttons/hover), smooth (dialogs/panels), bouncy (toasts/pop-ins), gentle (collapse/expand)
|
|
742
|
-
- Tween presets (non-spatial: opacity, color): fade (opacity enter/exit), colorShift (hover color/bg)
|
|
743
|
-
- All primitives take `show: boolean` to control mount/unmount via AnimatePresence
|
|
744
|
-
- MotionSlide: additional `direction` prop (up|down|left|right)
|
|
745
|
-
- MotionStagger + MotionStaggerItem: orchestrated stagger with configurable `delay` (default 0.04s)
|
|
746
|
-
- All primitives support `layout`, `layoutId`, `whileInView`, `viewportOnce`, `preset` props
|
|
747
|
-
- useMotion() hook returns { springs, tweens, reducedMotion: boolean }
|
|
748
|
-
- Old Fade/Collapse/Grow/Slide from @devalok/shilp-sutra/ui/transitions are REMOVED — use Motion* equivalents
|
|
749
|
-
|
|
750
|
-
### Hooks
|
|
751
|
-
- toast: imperative API — import { toast } from '@devalok/shilp-sutra/ui/toast'. **Signature is `(message: string, options?: { description?, duration?, action?, … })`** (sonner-style positional, NOT object-first). Examples: `toast.success('Saved')`, `toast.error('Failed to fetch', { description: 'Check your network', duration: 7000 })`, `toast.promise(fn, { loading: '…', success: '…', error: '…' })`, `toast.upload(file, { onProgress, onComplete })`. Methods: toast.success/error/warning/info/loading/message/undo/promise/upload/custom/dismiss. useToast() is deprecated. Mount `<Toaster />` at layout root or `toast()` calls are no-ops + log a dev warning.
|
|
752
|
-
- useColorMode(): returns { colorMode, setColorMode, toggleColorMode }
|
|
753
|
-
- useMobile(): returns boolean (true if viewport < 768px)
|
|
754
|
-
- useLink(): returns router-agnostic Link component from LinkProvider context (shell/link-context)
|
|
755
|
-
|
|
756
|
-
## Server-Safe Components (no "use client")
|
|
757
|
-
|
|
758
|
-
These can be imported directly in Next.js Server Components:
|
|
759
|
-
- UI: Text, Skeleton, Stack, Container, Table (and sub-components), Code, VisuallyHidden
|
|
760
|
-
- Composed: ContentCard, PageHeader, LoadingSkeleton, PageSkeletons, PriorityIndicator
|
|
761
|
-
|
|
762
|
-
Use per-component imports for server components:
|
|
763
|
-
import { Text } from '@devalok/shilp-sutra/ui/text'
|
|
764
|
-
import { PageHeader } from '@devalok/shilp-sutra/composed/page-header'
|
|
765
|
-
|
|
766
|
-
DO NOT use barrel imports in Server Components — they include "use client" components.
|
|
767
|
-
|
|
768
|
-
## Common Mistakes -- DO NOT
|
|
769
|
-
|
|
770
|
-
- DO NOT use variant="destructive" — use color="error"
|
|
771
|
-
- DO NOT use size="default" — use size="md" (or sm, lg)
|
|
772
|
-
- DO NOT put size on <Select> — put it on <SelectTrigger size="md">
|
|
773
|
-
- DO NOT use <Chip> — Chip is deprecated. Use <Badge onClick={...}> instead
|
|
774
|
-
- DO NOT use useToast() hook — use import { toast } from '@devalok/shilp-sutra/ui/toast' (imperative)
|
|
775
|
-
- DO NOT use toast({ title, color }) object syntax — use toast.success('message'), toast.error('message'), etc.
|
|
776
|
-
- DO NOT call toast() without <Toaster /> mounted at your layout root
|
|
777
|
-
- DO NOT use <Alert><AlertTitle>...</AlertTitle></Alert> — use <Alert title="..." />
|
|
778
|
-
- DO NOT import from barrel in Next.js Server Components — use per-component imports
|
|
779
|
-
- DO NOT use variant="secondary" on Button — use variant="outline" or variant="ghost"
|
|
780
|
-
- DO NOT use variant="default" on Button — use variant="solid" (deprecated alias, still works)
|
|
781
|
-
- DO NOT use variant="destructive" on Button — use variant="solid" color="error" (deprecated alias, still works)
|
|
782
|
-
- DO NOT use color="default" on Button — use color="accent" (deprecated alias, still works)
|
|
783
|
-
- DO NOT put variant on individual TabsTrigger — put it on TabsList (propagates via context)
|
|
3
|
+
> Radix UI + Tailwind 4 (CSS-first) + CVA design system for Devalok apps, v0.45.1.
|
|
4
|
+
> Built on the same primitives as shadcn/ui but with DIFFERENT prop APIs — never guess from shadcn knowledge; verify every prop.
|
|
5
|
+
> This file is a ROUTER: it tells you what exists and where to get details. Do not look for prop tables here — fetch them per component (MCP tool or per-component doc file below).
|
|
6
|
+
|
|
7
|
+
## How to get component details (in priority order)
|
|
8
|
+
|
|
9
|
+
1. **shilp-sutra MCP** (if connected): `get_component(name)` — version-exact props/variants/examples/composition as JSON. Also: `find_component(query)`, `get_tokens(category)`, `get_setup(framework)`, `upgrade(from, to)`, `search_docs(query)`. Pass your installed version (`node_modules/@devalok/shilp-sutra/package.json`) as `version` on every call.
|
|
10
|
+
Connect: `claude mcp add --transport http shilp-sutra https://shilp-sutra.devalok.in/mcp`
|
|
11
|
+
2. **No MCP?** Read the single per-component file linked in the index below (`node_modules/@devalok/shilp-sutra/docs/components/...`, ~3K tokens each). Read only the components you need — never bulk-read the directory.
|
|
12
|
+
3. **Machine-readable everything**: `mcp-manifest.json` at the package root (all props/tokens/composition as JSON, react-docgen shape). Prefer targeted reads of it over any prose.
|
|
13
|
+
|
|
14
|
+
## Project setup (first install)
|
|
15
|
+
|
|
16
|
+
Use a recipe — do not improvise. Recipes ship at `node_modules/@devalok/shilp-sutra/docs/recipes/`:
|
|
17
|
+
install-next-app-router.md · install-next-pages.md · install-vite.md · install-astro.md · install-remix.md · install-tanstack-start.md · customize-brand.md (token overrides) · server-components.md (RSC matrix) · troubleshoot.md
|
|
18
|
+
|
|
19
|
+
Branding fast path: **https://shilp-sutra.devalok.in/themer** — archetypes (`/themer/archetypes`), brand color (`/themer/brand`), wizard (`/themer/wizard`). Paste the result CSS after `@import "@devalok/shilp-sutra/css";`.
|
|
20
|
+
|
|
21
|
+
## Hard rules (always apply)
|
|
22
|
+
|
|
23
|
+
- Prefer Button `variant="soft"` over `variant="outline"` for non-primary actions.
|
|
24
|
+
- No `variant="destructive"` / `variant="secondary"` / `color="danger"` — use `variant="solid" color="error"`, `variant="soft"`, `color="error"`.
|
|
25
|
+
- Spacing cadence: `ds-03` (related) / `ds-05` (grouped) / `ds-07` (section).
|
|
26
|
+
- Cards/widgets/panels sit on `bg-surface-2`; `bg-surface-1` is for page + overlays only.
|
|
27
|
+
- Compose, don't re-roll: build on existing components (check `get_component(name, sections:["composition"])` or the doc's Composability section) instead of rebuilding their surface.
|
|
28
|
+
- Icons: `startIcon={<Icon icon={IconX} />}` wrapper form, never bare icon components.
|
|
29
|
+
|
|
30
|
+
## Upgrading
|
|
31
|
+
|
|
32
|
+
Breaking changes are machine-readable in `BREAKING.json` (see `BREAKING.schema.json`); human guide in `MIGRATION.md`. Via MCP: `upgrade(from: "<installed>", to: "<target>")`.
|
|
33
|
+
|
|
34
|
+
## Component index
|
|
35
|
+
|
|
36
|
+
Format: `[name](doc path): summary`. Import paths follow `@devalok/shilp-sutra/<tier>/<name>`.
|
|
37
|
+
|
|
38
|
+
### ui
|
|
39
|
+
- [accordion](docs/components/ui/accordion.md)
|
|
40
|
+
- [alert](docs/components/ui/alert.md)
|
|
41
|
+
- [alert-dialog](docs/components/ui/alert-dialog.md)
|
|
42
|
+
- [aspect-ratio](docs/components/ui/aspect-ratio.md)
|
|
43
|
+
- [autocomplete](docs/components/ui/autocomplete.md)
|
|
44
|
+
- [avatar](docs/components/ui/avatar.md)
|
|
45
|
+
- [badge](docs/components/ui/badge.md)
|
|
46
|
+
- [badge-group](docs/components/ui/badge-group.md)
|
|
47
|
+
- [badge-indicator](docs/components/ui/badge-indicator.md)
|
|
48
|
+
- [banner](docs/components/ui/banner.md)
|
|
49
|
+
- [breadcrumb](docs/components/ui/breadcrumb.md)
|
|
50
|
+
- [button](docs/components/ui/button.md)
|
|
51
|
+
- [button-group](docs/components/ui/button-group.md)
|
|
52
|
+
- [button-processing](docs/components/ui/button-processing.md)
|
|
53
|
+
- [card](docs/components/ui/card.md)
|
|
54
|
+
- [charts](docs/components/ui/charts.md)
|
|
55
|
+
- [chat](docs/components/ui/chat.md): Seven primitives for building chat interfaces: MessageList, Message (compound), SystemMessage, MessageInput, DateSeparator, UnreadSeparator, TypingIndicator
|
|
56
|
+
- [checkbox](docs/components/ui/checkbox.md)
|
|
57
|
+
- [code](docs/components/ui/code.md)
|
|
58
|
+
- [collapsible](docs/components/ui/collapsible.md)
|
|
59
|
+
- [color-input](docs/components/ui/color-input.md)
|
|
60
|
+
- [color-swatch](docs/components/ui/color-swatch.md)
|
|
61
|
+
- [combobox](docs/components/ui/combobox.md)
|
|
62
|
+
- [container](docs/components/ui/container.md)
|
|
63
|
+
- [context-menu](docs/components/ui/context-menu.md)
|
|
64
|
+
- [data-table](docs/components/ui/data-table.md)
|
|
65
|
+
- [data-table-toolbar](docs/components/ui/data-table-toolbar.md)
|
|
66
|
+
- [devalok-grain](docs/components/ui/devalok-grain.md)
|
|
67
|
+
- [dialog](docs/components/ui/dialog.md)
|
|
68
|
+
- [dropdown-menu](docs/components/ui/dropdown-menu.md)
|
|
69
|
+
- [file-upload](docs/components/ui/file-upload.md)
|
|
70
|
+
- [form](docs/components/ui/form.md)
|
|
71
|
+
- [hover-card](docs/components/ui/hover-card.md)
|
|
72
|
+
- [icon](docs/components/ui/icon.md)
|
|
73
|
+
- [icon-button](docs/components/ui/icon-button.md)
|
|
74
|
+
- [icon-context](docs/components/ui/icon-context.md)
|
|
75
|
+
- [icon-group](docs/components/ui/icon-group.md)
|
|
76
|
+
- [input](docs/components/ui/input.md)
|
|
77
|
+
- [input-otp](docs/components/ui/input-otp.md)
|
|
78
|
+
- [label](docs/components/ui/label.md)
|
|
79
|
+
- [link](docs/components/ui/link.md)
|
|
80
|
+
- [menubar](docs/components/ui/menubar.md)
|
|
81
|
+
- [navigation-menu](docs/components/ui/navigation-menu.md)
|
|
82
|
+
- [number-input](docs/components/ui/number-input.md)
|
|
83
|
+
- [oauth-button](docs/components/ui/oauth-button.md)
|
|
84
|
+
- [pagination](docs/components/ui/pagination.md)
|
|
85
|
+
- [popover](docs/components/ui/popover.md)
|
|
86
|
+
- [progress](docs/components/ui/progress.md)
|
|
87
|
+
- [progress-ring](docs/components/ui/progress-ring.md)
|
|
88
|
+
- [radio](docs/components/ui/radio.md)
|
|
89
|
+
- [search-input](docs/components/ui/search-input.md)
|
|
90
|
+
- [segmented-control](docs/components/ui/segmented-control.md)
|
|
91
|
+
- [select](docs/components/ui/select.md)
|
|
92
|
+
- [separator](docs/components/ui/separator.md)
|
|
93
|
+
- [sheet](docs/components/ui/sheet.md)
|
|
94
|
+
- [skeleton](docs/components/ui/skeleton.md)
|
|
95
|
+
- [slider](docs/components/ui/slider.md)
|
|
96
|
+
- [spinner](docs/components/ui/spinner.md)
|
|
97
|
+
- [split-button](docs/components/ui/split-button.md): A compound button that combines a primary action with a dropdown trigger, rendered as a single visual unit `[Action | ▼]`
|
|
98
|
+
- [stack](docs/components/ui/stack.md)
|
|
99
|
+
- [stat-card](docs/components/ui/stat-card.md)
|
|
100
|
+
- [stat-flash](docs/components/ui/stat-flash.md)
|
|
101
|
+
- [status-dot](docs/components/ui/status-dot.md)
|
|
102
|
+
- [stepper](docs/components/ui/stepper.md)
|
|
103
|
+
- [switch](docs/components/ui/switch.md)
|
|
104
|
+
- [table](docs/components/ui/table.md)
|
|
105
|
+
- [table-row-link](docs/components/ui/table-row-link.md)
|
|
106
|
+
- [tabs](docs/components/ui/tabs.md)
|
|
107
|
+
- [text](docs/components/ui/text.md)
|
|
108
|
+
- [textarea](docs/components/ui/textarea.md)
|
|
109
|
+
- [toast](docs/components/ui/toast.md)
|
|
110
|
+
- [toaster](docs/components/ui/toaster.md)
|
|
111
|
+
- [toggle](docs/components/ui/toggle.md)
|
|
112
|
+
- [toggle-group](docs/components/ui/toggle-group.md)
|
|
113
|
+
- [tooltip](docs/components/ui/tooltip.md)
|
|
114
|
+
- [tree-view](docs/components/ui/tree-view.md)
|
|
115
|
+
- [truncated-text](docs/components/ui/truncated-text.md)
|
|
116
|
+
- [visually-hidden](docs/components/ui/visually-hidden.md)
|
|
117
|
+
|
|
118
|
+
### composed
|
|
119
|
+
- [activity-feed](docs/components/composed/activity-feed.md)
|
|
120
|
+
- [avatar-group](docs/components/composed/avatar-group.md)
|
|
121
|
+
- [bulk-action-bar](docs/components/composed/bulk-action-bar.md)
|
|
122
|
+
- [command-palette](docs/components/composed/command-palette.md)
|
|
123
|
+
- [confirm-dialog](docs/components/composed/confirm-dialog.md)
|
|
124
|
+
- [content-card](docs/components/composed/content-card.md): **DEPRECATED (v0.44.0)** — will be removed in the next major
|
|
125
|
+
- [date-picker](docs/components/composed/date-picker.md)
|
|
126
|
+
- [deadline-indicator](docs/components/composed/deadline-indicator.md)
|
|
127
|
+
- [emoji-picker](docs/components/composed/emoji-picker.md)
|
|
128
|
+
- [empty-state](docs/components/composed/empty-state.md): Note: EmptyState was server-safe prior to v0.18.0 but is NO LONGER server-safe due to Framer Motion dependency
|
|
129
|
+
- [error-boundary](docs/components/composed/error-boundary.md)
|
|
130
|
+
- [file-preview](docs/components/composed/file-preview.md)
|
|
131
|
+
- [filter-bar](docs/components/composed/filter-bar.md)
|
|
132
|
+
- [form-section](docs/components/composed/form-section.md)
|
|
133
|
+
- [global-loading](docs/components/composed/global-loading.md)
|
|
134
|
+
- [inline-edit](docs/components/composed/inline-edit.md)
|
|
135
|
+
- [loading-skeleton](docs/components/composed/loading-skeleton.md): Exports: CardSkeleton, TableSkeleton, BoardSkeleton, ListSkeleton
|
|
136
|
+
- [markdown-viewer](docs/components/composed/markdown-viewer.md)
|
|
137
|
+
- [master-detail](docs/components/composed/master-detail.md)
|
|
138
|
+
- [member-picker](docs/components/composed/member-picker.md)
|
|
139
|
+
- [multi-select-popover](docs/components/composed/multi-select-popover.md)
|
|
140
|
+
- [page-header](docs/components/composed/page-header.md)
|
|
141
|
+
- [page-skeletons](docs/components/composed/page-skeletons.md): Exports: DashboardSkeleton, ProjectListSkeleton, TaskDetailSkeleton
|
|
142
|
+
- [priority-indicator](docs/components/composed/priority-indicator.md)
|
|
143
|
+
- [rich-chat-input](docs/components/composed/rich-chat-input.md): Compact rich text chat input for unified human+AI workspaces
|
|
144
|
+
- [rich-text-editor](docs/components/composed/rich-text-editor.md): Exports: RichTextEditor, RichTextViewer
|
|
145
|
+
- [schedule-view](docs/components/composed/schedule-view.md)
|
|
146
|
+
- [simple-tooltip](docs/components/composed/simple-tooltip.md)
|
|
147
|
+
- [status-badge](docs/components/composed/status-badge.md): Note: StatusBadge was server-safe prior to v0.18.0 but is NO LONGER server-safe due to Framer Motion dependency
|
|
148
|
+
|
|
149
|
+
### shell
|
|
150
|
+
- [app-command-palette](docs/components/shell/app-command-palette.md)
|
|
151
|
+
- [bottom-navbar](docs/components/shell/bottom-navbar.md)
|
|
152
|
+
- [command-registry](docs/components/shell/command-registry.md): Exports: CommandRegistryProvider, useCommandRegistry
|
|
153
|
+
- [link-context](docs/components/shell/link-context.md): Exports: LinkProvider, useLink
|
|
154
|
+
- [notification-center](docs/components/shell/notification-center.md)
|
|
155
|
+
- [notification-preferences](docs/components/shell/notification-preferences.md)
|
|
156
|
+
- [sidebar](docs/components/shell/sidebar.md)
|
|
157
|
+
- [top-bar](docs/components/shell/top-bar.md)
|
|
158
|
+
|
|
159
|
+
## Tokens
|
|
160
|
+
|
|
161
|
+
Categories: color, spacing (`ds-01`…), typography (`text-ds-*`), radius (`rounded-ds-*`), shadow (`shadow-raised`/`shadow-overlay`/…), motion, z-layers. Full reference: `get_tokens(category)` via MCP, or the `tokens` object in `mcp-manifest.json`.
|