@devalok/shilp-sutra 0.28.0 → 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (246) hide show
  1. package/dist/_chunks/badge-group.js +299 -0
  2. package/dist/_chunks/framer.js +1915 -1980
  3. package/dist/_chunks/keybinding.js +4 -5
  4. package/dist/_chunks/primitives.js +3198 -3272
  5. package/dist/_chunks/sonner.js +29 -31
  6. package/dist/_chunks/stat-row.js +110 -131
  7. package/dist/_chunks/tiptap.js +42 -78
  8. package/dist/_chunks/tree-view.js +138 -149
  9. package/dist/_chunks/typing-indicator.js +565 -0
  10. package/dist/_chunks/use-calendar.js +416 -439
  11. package/dist/_chunks/vendor-client.js +5 -5
  12. package/dist/_chunks/vendor-utils.js +5 -5
  13. package/dist/ai/block-renderer.js +22 -22
  14. package/dist/ai/blocks/loading.d.ts.map +1 -1
  15. package/dist/ai/command-bar.d.ts.map +1 -1
  16. package/dist/ai/command-bar.js +241 -263
  17. package/dist/ai/conversation.d.ts.map +1 -1
  18. package/dist/ai/conversation.js +87 -107
  19. package/dist/composed/activity-feed.d.ts +2 -0
  20. package/dist/composed/activity-feed.d.ts.map +1 -1
  21. package/dist/composed/activity-feed.js +118 -90
  22. package/dist/composed/avatar-group.d.ts +1 -0
  23. package/dist/composed/avatar-group.d.ts.map +1 -1
  24. package/dist/composed/avatar-group.js +125 -86
  25. package/dist/composed/bulk-action-bar.d.ts.map +1 -1
  26. package/dist/composed/bulk-action-bar.js +29 -28
  27. package/dist/composed/command-palette.d.ts.map +1 -1
  28. package/dist/composed/command-palette.js +99 -113
  29. package/dist/composed/content-card.js +1 -1
  30. package/dist/composed/date-picker/calendar-grid.d.ts.map +1 -1
  31. package/dist/composed/date-picker/date-picker.d.ts.map +1 -1
  32. package/dist/composed/date-picker/date-range-picker.d.ts.map +1 -1
  33. package/dist/composed/date-picker/date-time-picker.d.ts.map +1 -1
  34. package/dist/composed/date-picker/time-picker.d.ts.map +1 -1
  35. package/dist/composed/deadline-indicator.d.ts.map +1 -1
  36. package/dist/composed/deadline-indicator.js +29 -28
  37. package/dist/composed/error-boundary.d.ts.map +1 -1
  38. package/dist/composed/error-boundary.js +30 -27
  39. package/dist/composed/extensions/file-attachment.d.ts.map +1 -1
  40. package/dist/composed/file-preview.d.ts.map +1 -1
  41. package/dist/composed/file-preview.js +261 -271
  42. package/dist/composed/filter-bar.d.ts.map +1 -1
  43. package/dist/composed/filter-bar.js +49 -48
  44. package/dist/composed/form-section.d.ts.map +1 -1
  45. package/dist/composed/form-section.js +12 -11
  46. package/dist/composed/global-loading.js +1 -1
  47. package/dist/composed/index.d.ts +1 -1
  48. package/dist/composed/index.d.ts.map +1 -1
  49. package/dist/composed/index.js +63 -63
  50. package/dist/composed/inline-edit.d.ts.map +1 -1
  51. package/dist/composed/inline-edit.js +55 -54
  52. package/dist/composed/markdown-viewer.d.ts.map +1 -1
  53. package/dist/composed/markdown-viewer.js +44 -43
  54. package/dist/composed/master-detail.d.ts.map +1 -1
  55. package/dist/composed/master-detail.js +35 -34
  56. package/dist/composed/multi-select-popover.d.ts.map +1 -1
  57. package/dist/composed/multi-select-popover.js +73 -73
  58. package/dist/composed/page-header.d.ts.map +1 -1
  59. package/dist/composed/page-header.js +42 -35
  60. package/dist/composed/priority-indicator.d.ts.map +1 -1
  61. package/dist/composed/priority-indicator.js +37 -36
  62. package/dist/composed/rich-text-editor.d.ts +3 -0
  63. package/dist/composed/rich-text-editor.d.ts.map +1 -1
  64. package/dist/composed/rich-text-editor.js +295 -311
  65. package/dist/composed/schedule-view.js +62 -62
  66. package/dist/composed/status-badge.d.ts +4 -2
  67. package/dist/composed/status-badge.d.ts.map +1 -1
  68. package/dist/composed/status-badge.js +58 -45
  69. package/dist/shell/app-command-palette.d.ts.map +1 -1
  70. package/dist/shell/app-command-palette.js +93 -93
  71. package/dist/shell/bottom-navbar.d.ts.map +1 -1
  72. package/dist/shell/bottom-navbar.js +21 -20
  73. package/dist/shell/index.js +18 -18
  74. package/dist/shell/notification-center.d.ts.map +1 -1
  75. package/dist/shell/notification-center.js +96 -95
  76. package/dist/shell/notification-preferences.d.ts.map +1 -1
  77. package/dist/shell/notification-preferences.js +82 -85
  78. package/dist/shell/sidebar.js +59 -60
  79. package/dist/shell/top-bar.d.ts.map +1 -1
  80. package/dist/shell/top-bar.js +103 -103
  81. package/dist/tailwind/index.cjs +37 -4
  82. package/dist/tailwind/preset.d.ts.map +1 -1
  83. package/dist/tailwind/preset.js +38 -5
  84. package/dist/tokens/primitives.css +20 -0
  85. package/dist/tokens/semantic.css +74 -7
  86. package/dist/ui/accordion.d.ts +5 -2
  87. package/dist/ui/accordion.d.ts.map +1 -1
  88. package/dist/ui/accordion.js +44 -39
  89. package/dist/ui/alert-dialog.js +57 -57
  90. package/dist/ui/alert.d.ts +1 -1
  91. package/dist/ui/alert.d.ts.map +1 -1
  92. package/dist/ui/alert.js +30 -29
  93. package/dist/ui/aspect-ratio.js +4 -4
  94. package/dist/ui/autocomplete.js +56 -56
  95. package/dist/ui/avatar.js +2 -2
  96. package/dist/ui/badge-group.d.ts +22 -0
  97. package/dist/ui/badge-group.d.ts.map +1 -0
  98. package/dist/ui/badge-group.js +8 -0
  99. package/dist/ui/badge-indicator.d.ts +32 -0
  100. package/dist/ui/badge-indicator.d.ts.map +1 -0
  101. package/dist/ui/badge-indicator.js +54 -0
  102. package/dist/ui/badge.d.ts +27 -24
  103. package/dist/ui/badge.d.ts.map +1 -1
  104. package/dist/ui/badge.js +13 -129
  105. package/dist/ui/banner.d.ts +1 -1
  106. package/dist/ui/banner.d.ts.map +1 -1
  107. package/dist/ui/banner.js +27 -26
  108. package/dist/ui/breadcrumb.d.ts.map +1 -1
  109. package/dist/ui/breadcrumb.js +37 -36
  110. package/dist/ui/button-group.d.ts +12 -6
  111. package/dist/ui/button-group.d.ts.map +1 -1
  112. package/dist/ui/button-group.js +18 -18
  113. package/dist/ui/button-processing.d.ts +16 -0
  114. package/dist/ui/button-processing.d.ts.map +1 -0
  115. package/dist/ui/button-processing.js +77 -0
  116. package/dist/ui/button.d.ts +50 -25
  117. package/dist/ui/button.d.ts.map +1 -1
  118. package/dist/ui/button.js +243 -127
  119. package/dist/ui/card.js +20 -21
  120. package/dist/ui/charts/index.js +499 -508
  121. package/dist/ui/chat/date-separator.d.ts +12 -0
  122. package/dist/ui/chat/date-separator.d.ts.map +1 -0
  123. package/dist/ui/chat/index.d.ts +9 -0
  124. package/dist/ui/chat/index.d.ts.map +1 -0
  125. package/dist/ui/chat/index.js +12 -0
  126. package/dist/ui/chat/message-input.d.ts +16 -0
  127. package/dist/ui/chat/message-input.d.ts.map +1 -0
  128. package/dist/ui/chat/message-list.d.ts +24 -0
  129. package/dist/ui/chat/message-list.d.ts.map +1 -0
  130. package/dist/ui/chat/message.d.ts +108 -0
  131. package/dist/ui/chat/message.d.ts.map +1 -0
  132. package/dist/ui/chat/system-message.d.ts +11 -0
  133. package/dist/ui/chat/system-message.d.ts.map +1 -0
  134. package/dist/ui/chat/typing-indicator.d.ts +14 -0
  135. package/dist/ui/chat/typing-indicator.d.ts.map +1 -0
  136. package/dist/ui/chat/unread-separator.d.ts +12 -0
  137. package/dist/ui/chat/unread-separator.d.ts.map +1 -0
  138. package/dist/ui/checkbox.js +18 -18
  139. package/dist/ui/chip.d.ts +13 -62
  140. package/dist/ui/chip.d.ts.map +1 -1
  141. package/dist/ui/chip.js +10 -109
  142. package/dist/ui/collapsible.js +4 -4
  143. package/dist/ui/color-input.js +134 -134
  144. package/dist/ui/color-swatch.js +11 -11
  145. package/dist/ui/combobox.d.ts.map +1 -1
  146. package/dist/ui/combobox.js +74 -80
  147. package/dist/ui/context-menu.d.ts.map +1 -1
  148. package/dist/ui/context-menu.js +86 -85
  149. package/dist/ui/data-table-toolbar.d.ts.map +1 -1
  150. package/dist/ui/data-table-toolbar.js +51 -57
  151. package/dist/ui/data-table.d.ts.map +1 -1
  152. package/dist/ui/data-table.js +268 -296
  153. package/dist/ui/devalok-grain.d.ts +81 -0
  154. package/dist/ui/devalok-grain.d.ts.map +1 -0
  155. package/dist/ui/devalok-grain.js +69 -0
  156. package/dist/ui/dialog.d.ts.map +1 -1
  157. package/dist/ui/dialog.js +73 -72
  158. package/dist/ui/dropdown-menu.d.ts.map +1 -1
  159. package/dist/ui/dropdown-menu.js +93 -92
  160. package/dist/ui/file-upload.d.ts.map +1 -1
  161. package/dist/ui/file-upload.js +82 -82
  162. package/dist/ui/hover-card.js +29 -29
  163. package/dist/ui/icon-button.d.ts +7 -7
  164. package/dist/ui/icon-button.d.ts.map +1 -1
  165. package/dist/ui/icon-context.d.ts +15 -0
  166. package/dist/ui/icon-context.d.ts.map +1 -0
  167. package/dist/ui/icon-context.js +20 -0
  168. package/dist/ui/icon-group.d.ts +22 -0
  169. package/dist/ui/icon-group.d.ts.map +1 -0
  170. package/dist/ui/icon-group.js +32 -0
  171. package/dist/ui/icon.d.ts +57 -0
  172. package/dist/ui/icon.d.ts.map +1 -0
  173. package/dist/ui/icon.js +122 -0
  174. package/dist/ui/index.d.ts +8 -1
  175. package/dist/ui/index.d.ts.map +1 -1
  176. package/dist/ui/index.js +351 -329
  177. package/dist/ui/input-otp.d.ts.map +1 -1
  178. package/dist/ui/input-otp.js +21 -20
  179. package/dist/ui/input.d.ts +32 -11
  180. package/dist/ui/input.d.ts.map +1 -1
  181. package/dist/ui/input.js +149 -44
  182. package/dist/ui/lib/motion.d.ts +2 -0
  183. package/dist/ui/lib/motion.d.ts.map +1 -1
  184. package/dist/ui/lib/motion.js +13 -11
  185. package/dist/ui/lib/utils.js +4 -4
  186. package/dist/ui/menubar.d.ts.map +1 -1
  187. package/dist/ui/menubar.js +87 -86
  188. package/dist/ui/navigation-menu.d.ts.map +1 -1
  189. package/dist/ui/navigation-menu.js +23 -28
  190. package/dist/ui/number-input.d.ts.map +1 -1
  191. package/dist/ui/number-input.js +54 -53
  192. package/dist/ui/pagination.d.ts.map +1 -1
  193. package/dist/ui/pagination.js +45 -44
  194. package/dist/ui/popover.js +28 -28
  195. package/dist/ui/progress.d.ts +3 -1
  196. package/dist/ui/progress.d.ts.map +1 -1
  197. package/dist/ui/progress.js +43 -39
  198. package/dist/ui/search-input.d.ts.map +1 -1
  199. package/dist/ui/search-input.js +47 -60
  200. package/dist/ui/segmented-control.js +1 -1
  201. package/dist/ui/select.d.ts.map +1 -1
  202. package/dist/ui/select.js +54 -53
  203. package/dist/ui/sheet.d.ts.map +1 -1
  204. package/dist/ui/sheet.js +46 -45
  205. package/dist/ui/sidebar.d.ts.map +1 -1
  206. package/dist/ui/sidebar.js +196 -193
  207. package/dist/ui/skeleton.js +1 -1
  208. package/dist/ui/spinner.js +74 -74
  209. package/dist/ui/stat-card.d.ts.map +1 -1
  210. package/dist/ui/stat-card.js +85 -86
  211. package/dist/ui/switch.d.ts +3 -0
  212. package/dist/ui/switch.d.ts.map +1 -1
  213. package/dist/ui/switch.js +41 -27
  214. package/dist/ui/tabs.js +43 -43
  215. package/dist/ui/text.js +1 -1
  216. package/dist/ui/textarea.js +10 -10
  217. package/dist/ui/toast.d.ts.map +1 -1
  218. package/dist/ui/toast.js +169 -169
  219. package/dist/ui/toggle.js +4 -4
  220. package/dist/ui/tooltip.js +40 -40
  221. package/dist/ui/tree-view/tree-item.d.ts.map +1 -1
  222. package/docs/components/_header.md +4 -4
  223. package/docs/components/composed/activity-feed.md +7 -0
  224. package/docs/components/composed/avatar-group.md +8 -5
  225. package/docs/components/composed/rich-text-editor.md +6 -0
  226. package/docs/components/composed/status-badge.md +14 -1
  227. package/docs/components/ui/accordion.md +5 -2
  228. package/docs/components/ui/badge-group.md +38 -0
  229. package/docs/components/ui/badge-indicator.md +40 -0
  230. package/docs/components/ui/badge.md +36 -5
  231. package/docs/components/ui/button-processing.md +15 -0
  232. package/docs/components/ui/button.md +40 -11
  233. package/docs/components/ui/chat.md +214 -0
  234. package/docs/components/ui/data-table.md +3 -0
  235. package/docs/components/ui/devalok-grain.md +55 -0
  236. package/docs/components/ui/icon-button.md +12 -5
  237. package/docs/components/ui/icon-context.md +38 -0
  238. package/docs/components/ui/icon-group.md +36 -0
  239. package/docs/components/ui/icon.md +47 -0
  240. package/docs/components/ui/input.md +32 -6
  241. package/docs/components/ui/progress.md +5 -0
  242. package/docs/components/ui/spinner.md +3 -0
  243. package/docs/components/ui/switch.md +13 -0
  244. package/llms-full.txt +672 -40
  245. package/llms.txt +46 -21
  246. package/package.json +7 -2
package/llms.txt CHANGED
@@ -4,6 +4,13 @@
4
4
  > Built on the same primitives as shadcn/ui but with key API differences.
5
5
  > Read this file BEFORE writing any UI code. Do NOT guess from shadcn/ui knowledge.
6
6
 
7
+ ## CHANGES (v0.30.0)
8
+ - **RichTextEditor `toolbar` prop** — `toolbar?: ToolbarItem[]` whitelist of toolbar items to display. Omit to show all (default). `ToolbarItem` type exported.
9
+ - **`@devalok/shilp-sutra-karm` removed** — Domain components moved to Karm app repo. npm package deprecated.
10
+ - **Warning dark mode fixed** — `warning-*` tokens now have proper dark mode values (higher chroma than category amber).
11
+ - **tailwind-merge fix** — All `text-ds-*` sizes now correctly registered. `cn('text-ds-lg', 'text-accent-11')` no longer strips the color.
12
+ - **AvatarGroup fixes** — Overflow badge text matches avatar size, indicator dots scale with size, aria-labels added.
13
+
7
14
  ## BREAKING CHANGES (v0.27.0 — Externalized Dependencies)
8
15
 
9
16
  FilePreview and MarkdownViewer dependencies are now **external** (not bundled).
@@ -101,12 +108,11 @@ Same pattern for `border-surface-*`, `text-surface-*`, `ring-surface-*`.
101
108
 
102
109
  **Server safety changes:** EmptyState, StatusBadge, Spinner are NO LONGER server-safe (they now use Framer Motion). Remove from RSC imports.
103
110
 
104
- **Build:** `framer-motion` and `sonner` moved from `dependencies` to `devDependencies` (bundled at build time — no consumer install needed for core, but karm consumers must install `framer-motion` as peer dep).
111
+ **Build:** `framer-motion` and `sonner` moved from `dependencies` to `devDependencies` (bundled at build time — no consumer install needed for core).
105
112
 
106
113
  **New APIs in v0.18.0:**
107
114
  - Combobox: `accessibleLabel?: string` — custom aria-label for trigger (falls back to placeholder)
108
115
  - Slider: multi-thumb support — pass array `defaultValue={[25, 75]}` for range sliders
109
- - StreamingText (karm): `isComplete?: boolean` — debounces aria-live, announces only on completion
110
116
 
111
117
  ## CHANGES (v0.16.0)
112
118
  - **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
@@ -243,7 +249,7 @@ pnpm add @devalok/shilp-sutra
243
249
 
244
250
  Add to next.config.js:
245
251
  ```js
246
- transpilePackages: ["@devalok/shilp-sutra", "@devalok/shilp-sutra-karm", "@devalok/shilp-sutra-brand"]
252
+ transpilePackages: ["@devalok/shilp-sutra", "@devalok/shilp-sutra-brand"]
247
253
  ```
248
254
 
249
255
  // Import components (barrel):
@@ -254,6 +260,9 @@ import { Button } from '@devalok/shilp-sutra/ui/button'
254
260
  import { PageHeader } from '@devalok/shilp-sutra/composed/page-header'
255
261
  import { TopBar } from '@devalok/shilp-sutra/shell/top-bar'
256
262
 
263
+ // Chat primitives (v0.29.0+):
264
+ import { MessageList, Message, SystemMessage, MessageInput, DateSeparator, UnreadSeparator, TypingIndicator } from '@devalok/shilp-sutra/ui/chat'
265
+
257
266
  // AI command system (v0.25.0+):
258
267
  import { CommandBar, AIConversation, BlockRenderer, AICommandProvider, DevadootIcon } from '@devalok/shilp-sutra/ai'
259
268
 
@@ -278,7 +287,7 @@ If you have shadcn/ui knowledge, these are the differences that WILL trip you up
278
287
  | variant="destructive" | color="error" | Two-axis system: variant=shape, color=intent |
279
288
  | size="default" | size="md" | All sizes: sm, md, lg (never "default") |
280
289
  | <Select size="lg"> | <SelectTrigger size="lg"> | Size goes on trigger, NOT root |
281
- | <Chip>text</Chip> | <Chip label="text" /> | Chip uses label prop, NOT children |
290
+ | <Chip> | <Badge onClick={...}> | Chip is deprecated, use Badge with onClick |
282
291
  | useToast() + toast({ variant }) | toast.success('msg') | Imperative API, no hook needed |
283
292
  | Badge variant="destructive" | Badge variant="solid" color="error" | Two-axis: variant + color |
284
293
  | Alert + AlertTitle + AlertDescription | <Alert title="..." color="error"> | Single component, not compound |
@@ -292,25 +301,27 @@ Many components use TWO props where shadcn uses one:
292
301
  - `color` controls INTENT/SEMANTICS: default, error, success, warning, info, etc.
293
302
 
294
303
  Examples:
295
- <Button variant="solid" color="error">Delete</Button> // red solid button
296
- <Button variant="outline" color="error">Cancel</Button> // red outline button
297
- <Badge variant="solid" color="success">Active</Badge> // green solid badge
298
- <Alert variant="filled" color="warning">Warning!</Alert> // yellow filled alert
304
+ <Button variant="solid" color="error">Delete</Button> // red solid button
305
+ <Button variant="soft" color="warning">Pending</Button> // amber tinted button
306
+ <Button variant="outline" color="success">Approve</Button> // green outline button
307
+ <Badge variant="solid" color="success">Active</Badge> // green solid badge
308
+ <Alert variant="filled" color="warning">Warning!</Alert> // amber filled alert
299
309
 
300
- Components with two-axis system: Button, Badge, Alert, Chip, Banner, Progress, StatusBadge
310
+ Components with two-axis system: Button, Badge, Alert, Banner, Progress, StatusBadge
301
311
 
302
312
  ## Component Quick Reference
303
313
 
304
314
  ### Inputs & Controls
305
- - Button: variant(solid|default|outline|ghost|link) color(default|error) size(xs|sm|md|lg|icon-xs|icon-sm|icon-md|icon-lg) + loading, startIcon, endIcon, asChild
315
+ - 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
306
316
  - IconButton: icon(ReactNode, required) shape(square|circle) size(sm|md|lg) + aria-label required
307
- - Input: size(xs|sm|md|lg) state(InputState) + startIcon, endIcon. Type: InputState = 'default' | 'error' | 'warning' | 'success'
308
- - SearchInput: size(xs|sm|md|lg) + loading, onClear
317
+ - 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.
318
+ - 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. Deprecated aliases: startIcon→startSection, endIcon→endSection, inputVariants→inputWrapperVariants. Type: InputState = 'default' | 'error' | 'warning' | 'success'
319
+ - SearchInput: size(xs|sm|md|lg) + loading, onClear. Delegates to Input v2 sections internally.
309
320
  - NumberInput: value + onValueChange, min, max, step (controlled only)
310
321
  - Textarea: size(xs|sm|md|lg) state(default|error|warning|success)
311
322
  - 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.
312
323
  - Checkbox: checked, onCheckedChange, error(boolean), indeterminate(boolean)
313
- - Switch: checked, onCheckedChange, error(boolean)
324
+ - Switch: checked, onCheckedChange, error(boolean), size(sm|md|lg), color(accent|success|warning), thumbIcon(ReactNode)
314
325
  - RadioGroup > RadioGroupItem(value)
315
326
  - Select > SelectTrigger(size: xs|sm|md|lg) > SelectValue; SelectContent > SelectItem(value)
316
327
  - Toggle: variant(default|outline) size(sm|md|lg)
@@ -323,7 +334,7 @@ Components with two-axis system: Button, Badge, Alert, Chip, Banner, Progress, S
323
334
  - Banner: color(info|success|warning|error|neutral) + actions?(ReactNode), onDismiss. `action` (singular) deprecated, use `actions`. Mobile flex-wrap for multiple buttons.
324
335
  - Toast: imperative API via toast.success/error/warning/info/loading/message/undo/promise/upload/custom — REQUIRES <Toaster> at layout root
325
336
  - Spinner: size(sm|md|lg) — renders with role="status"
326
- - Progress: track size(sm|md|lg), indicator color(default|success|warning|error)
337
+ - 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)
327
338
 
328
339
  NOTIFICATION SELECTION GUIDE:
329
340
  - Alert: inline contextual feedback within a form or page section
@@ -331,8 +342,8 @@ NOTIFICATION SELECTION GUIDE:
331
342
  - Toast: transient notification triggered by user action (needs <Toaster>, then call toast.success() etc.)
332
343
 
333
344
  ### Data Display
334
- - Badge: variant(subtle|solid|outline) color(default|info|success|error|warning|brand|accent + 7 category colors) size(xs|sm|md|lg) + onDismiss
335
- - Chip: variant(subtle|outline) color(default|primary|success|error|warning|info + 7 category) size(sm|md|lg) label(string, REQUIRED) + onDismiss, onClick
345
+ - 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).
346
+ - Chip: DEPRECATED Use `<Badge onClick={...}>` instead. Chip wrapper maps label prop to children for backward compat.
336
347
  - 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.
337
348
  - 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
338
349
  - Table > TableHeader > TableRow > TableHead; TableBody > TableRow > TableCell; TableFooter; TableCaption
@@ -343,6 +354,17 @@ NOTIFICATION SELECTION GUIDE:
343
354
  - ColorSwatch: color(CSS string) size(sm|md|lg) shape(circle|square|rounded) ring(boolean) — for dynamic runtime colors
344
355
  - StatusDot: status(healthy|warning|critical|neutral|inactive) size(sm|md|lg) pulse?(boolean, default true for healthy) label?(string)
345
356
  - 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
357
+ - 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.
358
+
359
+ ### Chat Primitives (ui/chat/)
360
+ Import: `@devalok/shilp-sutra/ui/chat`
361
+ - MessageList: children, autoScroll?(true), newMessageCount?(number, shows floating "N new" pill), onScrollToBottom?(), onLoadMore?(), isLoadingMore?(boolean), emptySlot?(ReactNode), headerSlot?(ReactNode). role="log" aria-live="polite".
362
+ - 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'))
363
+ - SystemMessage: variant('event'|'alert') icon?(ReactNode) timestamp?(string) children
364
+ - 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.
365
+ - DateSeparator: date(Date|string), format?((date)=>string). Shows "Today", "Yesterday", or "Mar 15".
366
+ - UnreadSeparator: label?('NEW'), count?(number). Accent-colored horizontal rule.
367
+ - TypingIndicator: users({name, image?}[]). Shows animated bouncing dots + "Alice is typing..." / "Alice and Bob are typing..." / "Several people are typing..."
346
368
 
347
369
  ### Overlays
348
370
  - Dialog > DialogTrigger; DialogContent > DialogHeader > DialogTitle, DialogDescription; [content]; DialogFooter
@@ -355,7 +377,7 @@ NOTIFICATION SELECTION GUIDE:
355
377
 
356
378
  ### Navigation
357
379
  - Tabs > TabsList(variant: line|contained) > TabsTrigger(value); TabsContent(value) — variant propagates via context
358
- - Accordion(type: single|multiple) > AccordionItem(value) > AccordionTrigger; AccordionContent
380
+ - Accordion(type: single|multiple) > AccordionItem(value) > AccordionTrigger(chevronPosition?: 'left'|'right', default 'right'); AccordionContent
359
381
  - Breadcrumb > BreadcrumbList > BreadcrumbItem > BreadcrumbLink | BreadcrumbPage; BreadcrumbSeparator
360
382
  - PaginationRoot > PaginationContent > PaginationItem > PaginationLink(isActive) | PaginationPrevious | PaginationNext | PaginationEllipsis
361
383
  - DropdownMenu > DropdownMenuTrigger; DropdownMenuContent > DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuCheckboxItem, DropdownMenuRadioGroup > DropdownMenuRadioItem
@@ -378,8 +400,8 @@ NOTIFICATION SELECTION GUIDE:
378
400
  ### Composed Components
379
401
  - ConfirmDialog: open, onOpenChange, title, description, onConfirm + confirmText, cancelText, color(default|error), loading
380
402
  - PageHeader: title, subtitle, breadcrumbs[], actions(ReactNode)
381
- - 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? }. GPU-composited hover expand via translateX. Use expandDirection="left" for right-aligned groups.
382
- - StatusBadge: DISCRIMINATED UNION — pass status OR color, not both. status(active|pending|approved|rejected|completed|blocked|cancelled|draft) color(success|warning|error|info|neutral) size(sm|md)
403
+ - 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.
404
+ - 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)
383
405
  - ContentCard: variant(default|outline|ghost) padding(default|compact|spacious|none)
384
406
  - EmptyState: icon(ReactNode or ComponentType), title(required), description, action(ReactNode), compact
385
407
  - PriorityIndicator: priority(Priority) display(compact|full). Type: Priority = 'LOW' | 'MEDIUM' | 'HIGH' | 'URGENT' | 'low' | 'medium' | 'high' | 'urgent'
@@ -394,7 +416,7 @@ NOTIFICATION SELECTION GUIDE:
394
416
  - (UploadProgress REMOVED — upload tracking is now built into toast.upload())
395
417
  - 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)
396
418
  - RichTextViewer: read-only renderer for RichTextEditor HTML content (renders all above content types)
397
- - ActivityFeed: items(ActivityItem[]), onLoadMore, loading, hasMore, emptyState, compact, maxInitialItems, groupBy?('time'|'none'), groupLabels?({ today, yesterday, thisWeek, older }). Type: ActivityItem = { id, actor?, action, timestamp, icon?, color?, detail? }. Utility: groupItemsByTime(items, labels) exported.
419
+ - 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.
398
420
  - 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.
399
421
  - MemberPicker: thin wrapper around MultiSelectPopover with Avatar rendering
400
422
  - MultiSelectPopover: items/groups, value, onValueChange, searchPlaceholder, onSearch?(async), renderItem?, emptyMessage, maxSelections. Generic multi-select popover with search + checkmarks.
@@ -468,11 +490,14 @@ DO NOT use barrel imports in Server Components — they include "use client" com
468
490
  - DO NOT use variant="destructive" — use color="error"
469
491
  - DO NOT use size="default" — use size="md" (or sm, lg)
470
492
  - DO NOT put size on <Select> — put it on <SelectTrigger size="md">
471
- - DO NOT use <Chip>text</Chip>use <Chip label="text" />
493
+ - DO NOT use <Chip> — Chip is deprecated. Use <Badge onClick={...}> instead
472
494
  - DO NOT use useToast() hook — use import { toast } from '@devalok/shilp-sutra/ui/toast' (imperative)
473
495
  - DO NOT use toast({ title, color }) object syntax — use toast.success('message'), toast.error('message'), etc.
474
496
  - DO NOT call toast() without <Toaster /> mounted at your layout root
475
497
  - DO NOT use <Alert><AlertTitle>...</AlertTitle></Alert> — use <Alert title="..." />
476
498
  - DO NOT import from barrel in Next.js Server Components — use per-component imports
477
499
  - DO NOT use variant="secondary" on Button — use variant="outline" or variant="ghost"
500
+ - DO NOT use variant="default" on Button — use variant="solid" (deprecated alias, still works)
501
+ - DO NOT use variant="destructive" on Button — use variant="solid" color="error" (deprecated alias, still works)
502
+ - DO NOT use color="default" on Button — use color="accent" (deprecated alias, still works)
478
503
  - DO NOT put variant on individual TabsTrigger — put it on TabsList (propagates via context)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devalok/shilp-sutra",
3
- "version": "0.28.0",
3
+ "version": "0.30.0",
4
4
  "description": "Devalok Design System — tokens, components, and patterns for Next.js",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -363,6 +363,11 @@
363
363
  "default": "./dist/ui/tree-view/index.js",
364
364
  "types": "./dist/ui/tree-view/index.d.ts"
365
365
  },
366
+ "./ui/chat": {
367
+ "import": "./dist/ui/chat/index.js",
368
+ "default": "./dist/ui/chat/index.js",
369
+ "types": "./dist/ui/chat/index.d.ts"
370
+ },
366
371
  "./composed": {
367
372
  "import": "./dist/composed/index.js",
368
373
  "default": "./dist/composed/index.js",
@@ -815,7 +820,7 @@
815
820
  "tailwind-merge": "^3.0.1"
816
821
  },
817
822
  "engines": {
818
- "node": ">=20.0.0"
823
+ "node": ">=20.19.0"
819
824
  },
820
825
  "packageManager": "pnpm@10.0.0"
821
826
  }