@devalok/shilp-sutra 0.34.1 → 0.36.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.
Files changed (440) hide show
  1. package/LICENSE +21 -21
  2. package/dist/_chunks/badge-group.js +95 -95
  3. package/dist/_chunks/badge-group.js.map +1 -0
  4. package/dist/_chunks/chat.js +7 -2
  5. package/dist/_chunks/chat.js.map +1 -0
  6. package/dist/_chunks/date-picker.js.map +1 -0
  7. package/dist/_chunks/document-preview.js.map +1 -0
  8. package/dist/_chunks/file-preview.js.map +1 -0
  9. package/dist/_chunks/framer.js +62 -62
  10. package/dist/_chunks/framer.js.map +1 -0
  11. package/dist/_chunks/image-preview.js +1 -1
  12. package/dist/_chunks/image-preview.js.map +1 -0
  13. package/dist/_chunks/keybinding.js.map +1 -0
  14. package/dist/_chunks/link-context.js.map +1 -0
  15. package/dist/_chunks/mention-suggestion.js.map +1 -0
  16. package/dist/_chunks/motion-provider.js.map +1 -0
  17. package/dist/_chunks/popover.js +32 -36
  18. package/dist/_chunks/popover.js.map +1 -0
  19. package/dist/_chunks/primitives.js +686 -686
  20. package/dist/_chunks/primitives.js.map +1 -0
  21. package/dist/_chunks/rich-chat-input.js +651 -650
  22. package/dist/_chunks/rich-chat-input.js.map +1 -0
  23. package/dist/_chunks/shared.js.map +1 -0
  24. package/dist/_chunks/sonner.js.map +1 -0
  25. package/dist/_chunks/stat-row.js +158 -158
  26. package/dist/_chunks/stat-row.js.map +1 -0
  27. package/dist/_chunks/tiptap.js +11 -11
  28. package/dist/_chunks/tiptap.js.map +1 -0
  29. package/dist/_chunks/tree-view.js +1 -1
  30. package/dist/_chunks/tree-view.js.map +1 -0
  31. package/dist/_chunks/use-calendar.js.map +1 -0
  32. package/dist/_chunks/vendor-client.js +1 -1
  33. package/dist/_chunks/vendor-client.js.map +1 -0
  34. package/dist/_chunks/vendor-utils.js.map +1 -0
  35. package/dist/ai/ai-command-provider.js.map +1 -0
  36. package/dist/ai/block-renderer.js.map +1 -0
  37. package/dist/ai/blocks/loading.d.ts.map +1 -1
  38. package/dist/ai/command-bar.js.map +1 -0
  39. package/dist/ai/conversation.js +76 -76
  40. package/dist/ai/conversation.js.map +1 -0
  41. package/dist/ai/devadoot-icon.d.ts.map +1 -1
  42. package/dist/ai/index.js.map +1 -0
  43. package/dist/composed/activity-feed.js.map +1 -0
  44. package/dist/composed/avatar-group.js +1 -1
  45. package/dist/composed/avatar-group.js.map +1 -0
  46. package/dist/composed/bulk-action-bar.js +13 -21
  47. package/dist/composed/bulk-action-bar.js.map +1 -0
  48. package/dist/composed/command-palette.js.map +1 -0
  49. package/dist/composed/confirm-dialog.js.map +1 -0
  50. package/dist/composed/content-card.js.map +1 -0
  51. package/dist/composed/deadline-indicator.js.map +1 -0
  52. package/dist/composed/emoji-picker.js.map +1 -0
  53. package/dist/composed/empty-state.d.ts.map +1 -1
  54. package/dist/composed/empty-state.js +30 -30
  55. package/dist/composed/empty-state.js.map +1 -0
  56. package/dist/composed/error-boundary.js.map +1 -0
  57. package/dist/composed/filter-bar.js.map +1 -0
  58. package/dist/composed/form-section.js.map +1 -0
  59. package/dist/composed/global-loading.js.map +1 -0
  60. package/dist/composed/inline-edit.js.map +1 -0
  61. package/dist/composed/lib/string-utils.js.map +1 -0
  62. package/dist/composed/loading-skeleton.js.map +1 -0
  63. package/dist/composed/markdown-viewer.js.map +1 -0
  64. package/dist/composed/master-detail.js.map +1 -0
  65. package/dist/composed/member-picker.js.map +1 -0
  66. package/dist/composed/multi-select-popover.d.ts.map +1 -1
  67. package/dist/composed/multi-select-popover.js +4 -0
  68. package/dist/composed/multi-select-popover.js.map +1 -0
  69. package/dist/composed/page-header.js.map +1 -0
  70. package/dist/composed/page-skeletons.js.map +1 -0
  71. package/dist/composed/priority-indicator.js.map +1 -0
  72. package/dist/composed/responsive-overlay.js.map +1 -0
  73. package/dist/composed/rich-chat-input/attachment-strip.d.ts.map +1 -1
  74. package/dist/composed/rich-chat-input/reply-banner.d.ts.map +1 -1
  75. package/dist/composed/rich-chat-input/schedule-send.d.ts.map +1 -1
  76. package/dist/composed/rich-chat-input.d.ts.map +1 -1
  77. package/dist/composed/rich-text-editor.js +1 -1
  78. package/dist/composed/rich-text-editor.js.map +1 -0
  79. package/dist/composed/schedule-view.js.map +1 -0
  80. package/dist/composed/simple-tooltip.js.map +1 -0
  81. package/dist/composed/status-badge.d.ts.map +1 -1
  82. package/dist/composed/status-badge.js.map +1 -0
  83. package/dist/hooks/use-color-mode.js.map +1 -0
  84. package/dist/hooks/use-mobile.js.map +1 -0
  85. package/dist/hooks/use-touch-device.js.map +1 -0
  86. package/dist/hooks/use-viewport-height.js.map +1 -0
  87. package/dist/motion/check-motion-provider.d.ts +3 -0
  88. package/dist/motion/check-motion-provider.d.ts.map +1 -0
  89. package/dist/motion/index.js +14 -0
  90. package/dist/motion/index.js.map +1 -0
  91. package/dist/motion/primitives-index.js.map +1 -0
  92. package/dist/primitives/react-accordion.d.ts +114 -114
  93. package/dist/primitives/react-alert-dialog.d.ts +51 -51
  94. package/dist/primitives/react-aspect-ratio.d.ts +11 -11
  95. package/dist/primitives/react-avatar.d.ts +24 -24
  96. package/dist/primitives/react-checkbox.d.ts +50 -50
  97. package/dist/primitives/react-collapsible.d.ts +33 -33
  98. package/dist/primitives/react-context-menu.d.ts +96 -96
  99. package/dist/primitives/react-dialog.d.ts +103 -103
  100. package/dist/primitives/react-dropdown-menu.d.ts +97 -97
  101. package/dist/primitives/react-hover-card.d.ts +79 -79
  102. package/dist/primitives/react-label.d.ts +10 -10
  103. package/dist/primitives/react-menu.d.ts +169 -169
  104. package/dist/primitives/react-menubar.d.ts +115 -115
  105. package/dist/primitives/react-navigation-menu.d.ts +126 -126
  106. package/dist/primitives/react-popover.d.ts +85 -85
  107. package/dist/primitives/react-progress.d.ts +19 -19
  108. package/dist/primitives/react-radio-group.d.ts +58 -58
  109. package/dist/primitives/react-roving-focus.d.ts +49 -49
  110. package/dist/primitives/react-select.d.ts +137 -137
  111. package/dist/primitives/react-separator.d.ts +21 -21
  112. package/dist/primitives/react-slider.d.ts +75 -75
  113. package/dist/primitives/react-switch.d.ts +21 -21
  114. package/dist/primitives/react-tabs.d.ts +56 -56
  115. package/dist/primitives/react-toast.d.ts +120 -120
  116. package/dist/primitives/react-toggle-group.d.ts +75 -75
  117. package/dist/primitives/react-toggle.d.ts +24 -24
  118. package/dist/primitives/react-tooltip.d.ts +101 -101
  119. package/dist/primitives/react-visually-hidden.d.ts +22 -22
  120. package/dist/shell/app-command-palette.d.ts +2 -0
  121. package/dist/shell/app-command-palette.d.ts.map +1 -1
  122. package/dist/shell/app-command-palette.js +42 -155
  123. package/dist/shell/app-command-palette.js.map +1 -0
  124. package/dist/shell/bottom-navbar.js +1 -1
  125. package/dist/shell/bottom-navbar.js.map +1 -0
  126. package/dist/shell/command-registry.js.map +1 -0
  127. package/dist/shell/notification-center.d.ts.map +1 -1
  128. package/dist/shell/notification-center.js +194 -169
  129. package/dist/shell/notification-center.js.map +1 -0
  130. package/dist/shell/notification-preferences.js.map +1 -0
  131. package/dist/shell/sidebar.js.map +1 -0
  132. package/dist/shell/top-bar.js +1 -1
  133. package/dist/shell/top-bar.js.map +1 -0
  134. package/dist/tailwind/index.cjs +48 -1
  135. package/dist/tailwind/preset.d.ts.map +1 -1
  136. package/dist/tailwind/preset.js +48 -1
  137. package/dist/tailwind/preset.js.map +1 -0
  138. package/dist/tokens/index.css +4 -4
  139. package/dist/tokens/primitives.css +442 -442
  140. package/dist/tokens/semantic.css +742 -547
  141. package/dist/tokens/typography-semantic.css +123 -100
  142. package/dist/tokens/typography.css +422 -422
  143. package/dist/ui/accordion.js +13 -13
  144. package/dist/ui/accordion.js.map +1 -0
  145. package/dist/ui/alert-dialog.d.ts +6 -2
  146. package/dist/ui/alert-dialog.d.ts.map +1 -1
  147. package/dist/ui/alert-dialog.js +43 -42
  148. package/dist/ui/alert-dialog.js.map +1 -0
  149. package/dist/ui/alert.d.ts +3 -2
  150. package/dist/ui/alert.d.ts.map +1 -1
  151. package/dist/ui/alert.js +31 -5
  152. package/dist/ui/alert.js.map +1 -0
  153. package/dist/ui/aspect-ratio.js +1 -1
  154. package/dist/ui/aspect-ratio.js.map +1 -0
  155. package/dist/ui/autocomplete.d.ts.map +1 -1
  156. package/dist/ui/autocomplete.js +92 -67
  157. package/dist/ui/autocomplete.js.map +1 -0
  158. package/dist/ui/avatar.js +9 -9
  159. package/dist/ui/avatar.js.map +1 -0
  160. package/dist/ui/badge-indicator.js.map +1 -0
  161. package/dist/ui/banner.js.map +1 -0
  162. package/dist/ui/breadcrumb.js +1 -1
  163. package/dist/ui/breadcrumb.js.map +1 -0
  164. package/dist/ui/button-group.js.map +1 -0
  165. package/dist/ui/button-processing.d.ts.map +1 -1
  166. package/dist/ui/button-processing.js +61 -40
  167. package/dist/ui/button-processing.js.map +1 -0
  168. package/dist/ui/button.js +8 -8
  169. package/dist/ui/button.js.map +1 -0
  170. package/dist/ui/card.js.map +1 -0
  171. package/dist/ui/charts/bar-chart.d.ts.map +1 -1
  172. package/dist/ui/charts/chart-container.d.ts +2 -0
  173. package/dist/ui/charts/chart-container.d.ts.map +1 -1
  174. package/dist/ui/charts/index.js +88 -65
  175. package/dist/ui/charts/index.js.map +1 -0
  176. package/dist/ui/charts/line-chart.d.ts.map +1 -1
  177. package/dist/ui/chat/message-input.d.ts.map +1 -1
  178. package/dist/ui/chat/message-list.d.ts +1 -1
  179. package/dist/ui/chat/message-list.d.ts.map +1 -1
  180. package/dist/ui/chat/message.d.ts.map +1 -1
  181. package/dist/ui/chat/system-message.d.ts.map +1 -1
  182. package/dist/ui/checkbox.d.ts.map +1 -1
  183. package/dist/ui/checkbox.js +33 -28
  184. package/dist/ui/checkbox.js.map +1 -0
  185. package/dist/ui/code.js.map +1 -0
  186. package/dist/ui/collapsible.js +1 -1
  187. package/dist/ui/collapsible.js.map +1 -0
  188. package/dist/ui/color-input.d.ts.map +1 -1
  189. package/dist/ui/color-input.js +165 -163
  190. package/dist/ui/color-input.js.map +1 -0
  191. package/dist/ui/color-swatch.js.map +1 -0
  192. package/dist/ui/combobox.d.ts +7 -0
  193. package/dist/ui/combobox.d.ts.map +1 -1
  194. package/dist/ui/combobox.js +147 -113
  195. package/dist/ui/combobox.js.map +1 -0
  196. package/dist/ui/container.js +1 -1
  197. package/dist/ui/container.js.map +1 -0
  198. package/dist/ui/context-menu.js.map +1 -0
  199. package/dist/ui/data-table-body.js.map +1 -0
  200. package/dist/ui/data-table-bulk-actions.js +1 -1
  201. package/dist/ui/data-table-bulk-actions.js.map +1 -0
  202. package/dist/ui/data-table-card.js.map +1 -0
  203. package/dist/ui/data-table-context.js.map +1 -0
  204. package/dist/ui/data-table-header.js.map +1 -0
  205. package/dist/ui/data-table-pagination.js.map +1 -0
  206. package/dist/ui/data-table-toolbar.js.map +1 -0
  207. package/dist/ui/data-table.js +34 -31
  208. package/dist/ui/data-table.js.map +1 -0
  209. package/dist/ui/devalok-grain.js.map +1 -0
  210. package/dist/ui/dialog.js +31 -35
  211. package/dist/ui/dialog.js.map +1 -0
  212. package/dist/ui/dropdown-menu.js.map +1 -0
  213. package/dist/ui/file-upload.js +120 -120
  214. package/dist/ui/file-upload.js.map +1 -0
  215. package/dist/ui/form.d.ts +8 -0
  216. package/dist/ui/form.d.ts.map +1 -1
  217. package/dist/ui/form.js +14 -12
  218. package/dist/ui/form.js.map +1 -0
  219. package/dist/ui/hover-card.js.map +1 -0
  220. package/dist/ui/icon-button.js.map +1 -0
  221. package/dist/ui/icon-context.js.map +1 -0
  222. package/dist/ui/icon-group.js.map +1 -0
  223. package/dist/ui/icon.js.map +1 -0
  224. package/dist/ui/index.d.ts +4 -4
  225. package/dist/ui/index.d.ts.map +1 -1
  226. package/dist/ui/index.js +82 -66
  227. package/dist/ui/index.js.map +1 -0
  228. package/dist/ui/input-otp.d.ts +12 -3
  229. package/dist/ui/input-otp.d.ts.map +1 -1
  230. package/dist/ui/input-otp.js +41 -27
  231. package/dist/ui/input-otp.js.map +1 -0
  232. package/dist/ui/input.d.ts.map +1 -1
  233. package/dist/ui/input.js +16 -15
  234. package/dist/ui/input.js.map +1 -0
  235. package/dist/ui/label.d.ts.map +1 -1
  236. package/dist/ui/label.js +19 -14
  237. package/dist/ui/label.js.map +1 -0
  238. package/dist/ui/lib/check-tokens.d.ts +3 -0
  239. package/dist/ui/lib/check-tokens.d.ts.map +1 -0
  240. package/dist/ui/lib/date-utils.js.map +1 -0
  241. package/dist/ui/lib/motion.d.ts +15 -4
  242. package/dist/ui/lib/motion.d.ts.map +1 -1
  243. package/dist/ui/lib/motion.js +18 -9
  244. package/dist/ui/lib/motion.js.map +1 -0
  245. package/dist/ui/lib/utils.js.map +1 -0
  246. package/dist/ui/link.js +2 -2
  247. package/dist/ui/link.js.map +1 -0
  248. package/dist/ui/menubar.js.map +1 -0
  249. package/dist/ui/navigation-menu.js.map +1 -0
  250. package/dist/ui/number-input.d.ts +16 -1
  251. package/dist/ui/number-input.d.ts.map +1 -1
  252. package/dist/ui/number-input.js +79 -49
  253. package/dist/ui/number-input.js.map +1 -0
  254. package/dist/ui/pagination.js +1 -1
  255. package/dist/ui/pagination.js.map +1 -0
  256. package/dist/ui/progress-ring.d.ts.map +1 -1
  257. package/dist/ui/progress-ring.js.map +1 -0
  258. package/dist/ui/progress.js.map +1 -0
  259. package/dist/ui/radio.d.ts.map +1 -1
  260. package/dist/ui/radio.js +27 -20
  261. package/dist/ui/radio.js.map +1 -0
  262. package/dist/ui/search-input.js.map +1 -0
  263. package/dist/ui/segmented-control.d.ts +1 -1
  264. package/dist/ui/segmented-control.d.ts.map +1 -1
  265. package/dist/ui/segmented-control.js +3 -1
  266. package/dist/ui/segmented-control.js.map +1 -0
  267. package/dist/ui/select.d.ts.map +1 -1
  268. package/dist/ui/select.js +54 -48
  269. package/dist/ui/select.js.map +1 -0
  270. package/dist/ui/separator.d.ts.map +1 -1
  271. package/dist/ui/separator.js +10 -7
  272. package/dist/ui/separator.js.map +1 -0
  273. package/dist/ui/sheet.js +29 -29
  274. package/dist/ui/sheet.js.map +1 -0
  275. package/dist/ui/sidebar.js +9 -9
  276. package/dist/ui/sidebar.js.map +1 -0
  277. package/dist/ui/skeleton.js.map +1 -0
  278. package/dist/ui/slider.d.ts +22 -3
  279. package/dist/ui/slider.d.ts.map +1 -1
  280. package/dist/ui/slider.js +57 -19
  281. package/dist/ui/slider.js.map +1 -0
  282. package/dist/ui/spinner.js.map +1 -0
  283. package/dist/ui/split-button.d.ts.map +1 -1
  284. package/dist/ui/split-button.js +77 -76
  285. package/dist/ui/split-button.js.map +1 -0
  286. package/dist/ui/stack.js.map +1 -0
  287. package/dist/ui/stat-card.js.map +1 -0
  288. package/dist/ui/status-dot.js.map +1 -0
  289. package/dist/ui/stepper.d.ts +10 -0
  290. package/dist/ui/stepper.d.ts.map +1 -1
  291. package/dist/ui/stepper.js +80 -75
  292. package/dist/ui/stepper.js.map +1 -0
  293. package/dist/ui/switch.d.ts.map +1 -1
  294. package/dist/ui/switch.js +26 -22
  295. package/dist/ui/switch.js.map +1 -0
  296. package/dist/ui/table.js.map +1 -0
  297. package/dist/ui/tabs.d.ts +3 -1
  298. package/dist/ui/tabs.d.ts.map +1 -1
  299. package/dist/ui/tabs.js +68 -48
  300. package/dist/ui/tabs.js.map +1 -0
  301. package/dist/ui/text.d.ts +1 -1
  302. package/dist/ui/text.d.ts.map +1 -1
  303. package/dist/ui/text.js +10 -2
  304. package/dist/ui/text.js.map +1 -0
  305. package/dist/ui/textarea.js +1 -1
  306. package/dist/ui/textarea.js.map +1 -0
  307. package/dist/ui/toast-registry.d.ts +8 -0
  308. package/dist/ui/toast-registry.d.ts.map +1 -0
  309. package/dist/ui/toast-registry.js +13 -0
  310. package/dist/ui/toast-registry.js.map +1 -0
  311. package/dist/ui/toast.d.ts.map +1 -1
  312. package/dist/ui/toast.js +141 -136
  313. package/dist/ui/toast.js.map +1 -0
  314. package/dist/ui/toaster.d.ts.map +1 -1
  315. package/dist/ui/toaster.js +15 -14
  316. package/dist/ui/toaster.js.map +1 -0
  317. package/dist/ui/toggle-group.d.ts +2 -0
  318. package/dist/ui/toggle-group.d.ts.map +1 -1
  319. package/dist/ui/toggle-group.js +23 -16
  320. package/dist/ui/toggle-group.js.map +1 -0
  321. package/dist/ui/toggle.d.ts +2 -0
  322. package/dist/ui/toggle.d.ts.map +1 -1
  323. package/dist/ui/toggle.js +14 -6
  324. package/dist/ui/toggle.js.map +1 -0
  325. package/dist/ui/tooltip.js.map +1 -0
  326. package/dist/ui/visually-hidden.js.map +1 -0
  327. package/docs/components/_header.md +85 -85
  328. package/docs/components/composed/activity-feed.md +62 -62
  329. package/docs/components/composed/avatar-group.md +65 -65
  330. package/docs/components/composed/bulk-action-bar.md +40 -40
  331. package/docs/components/composed/command-palette.md +40 -40
  332. package/docs/components/composed/confirm-dialog.md +46 -46
  333. package/docs/components/composed/content-card.md +36 -36
  334. package/docs/components/composed/date-picker.md +130 -130
  335. package/docs/components/composed/deadline-indicator.md +27 -27
  336. package/docs/components/composed/emoji-picker.md +52 -52
  337. package/docs/components/composed/empty-state.md +53 -53
  338. package/docs/components/composed/error-boundary.md +29 -29
  339. package/docs/components/composed/file-preview.md +40 -40
  340. package/docs/components/composed/filter-bar.md +57 -57
  341. package/docs/components/composed/form-section.md +31 -31
  342. package/docs/components/composed/global-loading.md +27 -27
  343. package/docs/components/composed/inline-edit.md +35 -35
  344. package/docs/components/composed/loading-skeleton.md +51 -51
  345. package/docs/components/composed/markdown-viewer.md +27 -27
  346. package/docs/components/composed/master-detail.md +48 -48
  347. package/docs/components/composed/member-picker.md +35 -35
  348. package/docs/components/composed/multi-select-popover.md +62 -62
  349. package/docs/components/composed/page-header.md +41 -41
  350. package/docs/components/composed/page-skeletons.md +32 -32
  351. package/docs/components/composed/priority-indicator.md +32 -32
  352. package/docs/components/composed/responsive-overlay.md +34 -34
  353. package/docs/components/composed/rich-text-editor.md +82 -82
  354. package/docs/components/composed/schedule-view.md +39 -39
  355. package/docs/components/composed/simple-tooltip.md +33 -33
  356. package/docs/components/composed/status-badge.md +55 -55
  357. package/docs/components/shell/app-command-palette.md +44 -44
  358. package/docs/components/shell/bottom-navbar.md +52 -52
  359. package/docs/components/shell/command-registry.md +48 -48
  360. package/docs/components/shell/link-context.md +41 -41
  361. package/docs/components/shell/notification-center.md +63 -63
  362. package/docs/components/shell/notification-preferences.md +42 -42
  363. package/docs/components/shell/sidebar.md +92 -92
  364. package/docs/components/shell/top-bar.md +143 -143
  365. package/docs/components/ui/accordion.md +51 -51
  366. package/docs/components/ui/alert-dialog.md +61 -61
  367. package/docs/components/ui/alert.md +46 -46
  368. package/docs/components/ui/aspect-ratio.md +25 -25
  369. package/docs/components/ui/autocomplete.md +48 -48
  370. package/docs/components/ui/avatar.md +56 -56
  371. package/docs/components/ui/badge.md +83 -82
  372. package/docs/components/ui/banner.md +42 -42
  373. package/docs/components/ui/breadcrumb.md +37 -37
  374. package/docs/components/ui/button-group.md +41 -41
  375. package/docs/components/ui/button.md +94 -93
  376. package/docs/components/ui/card.md +52 -52
  377. package/docs/components/ui/charts.md +43 -43
  378. package/docs/components/ui/checkbox.md +36 -36
  379. package/docs/components/ui/chip.md +47 -47
  380. package/docs/components/ui/code.md +28 -28
  381. package/docs/components/ui/collapsible.md +40 -40
  382. package/docs/components/ui/color-input.md +91 -91
  383. package/docs/components/ui/color-swatch.md +25 -25
  384. package/docs/components/ui/combobox.md +54 -54
  385. package/docs/components/ui/container.md +26 -26
  386. package/docs/components/ui/context-menu.md +43 -43
  387. package/docs/components/ui/data-table-body.md +1 -1
  388. package/docs/components/ui/data-table-bulk-actions.md +1 -1
  389. package/docs/components/ui/data-table-card.md +1 -1
  390. package/docs/components/ui/data-table-context.md +1 -1
  391. package/docs/components/ui/data-table-header.md +1 -1
  392. package/docs/components/ui/data-table-pagination.md +1 -1
  393. package/docs/components/ui/data-table-toolbar.md +44 -44
  394. package/docs/components/ui/data-table.md +94 -94
  395. package/docs/components/ui/dialog.md +54 -54
  396. package/docs/components/ui/dropdown-menu.md +48 -48
  397. package/docs/components/ui/file-upload.md +41 -41
  398. package/docs/components/ui/form.md +51 -51
  399. package/docs/components/ui/hover-card.md +32 -32
  400. package/docs/components/ui/icon-button.md +40 -40
  401. package/docs/components/ui/input-otp.md +44 -44
  402. package/docs/components/ui/input.md +74 -74
  403. package/docs/components/ui/label.md +25 -25
  404. package/docs/components/ui/link.md +29 -29
  405. package/docs/components/ui/menubar.md +44 -44
  406. package/docs/components/ui/navigation-menu.md +46 -46
  407. package/docs/components/ui/number-input.md +44 -44
  408. package/docs/components/ui/pagination.md +48 -48
  409. package/docs/components/ui/popover.md +30 -30
  410. package/docs/components/ui/progress-ring.md +41 -41
  411. package/docs/components/ui/progress.md +34 -34
  412. package/docs/components/ui/radio.md +34 -34
  413. package/docs/components/ui/search-input.md +43 -43
  414. package/docs/components/ui/segmented-control.md +50 -50
  415. package/docs/components/ui/select.md +53 -53
  416. package/docs/components/ui/separator.md +32 -32
  417. package/docs/components/ui/sheet.md +47 -47
  418. package/docs/components/ui/sidebar.md +72 -72
  419. package/docs/components/ui/skeleton.md +77 -77
  420. package/docs/components/ui/slider.md +29 -29
  421. package/docs/components/ui/spinner.md +54 -54
  422. package/docs/components/ui/stack.md +39 -39
  423. package/docs/components/ui/stat-card.md +61 -61
  424. package/docs/components/ui/status-dot.md +26 -26
  425. package/docs/components/ui/stepper.md +49 -49
  426. package/docs/components/ui/switch.md +47 -47
  427. package/docs/components/ui/table.md +47 -47
  428. package/docs/components/ui/tabs.md +60 -60
  429. package/docs/components/ui/text.md +37 -37
  430. package/docs/components/ui/textarea.md +39 -39
  431. package/docs/components/ui/toast.md +65 -65
  432. package/docs/components/ui/toaster.md +47 -47
  433. package/docs/components/ui/toggle-group.md +43 -43
  434. package/docs/components/ui/toggle.md +37 -37
  435. package/docs/components/ui/tooltip.md +38 -38
  436. package/docs/components/ui/tree-view.md +65 -65
  437. package/docs/components/ui/visually-hidden.md +21 -21
  438. package/llms-full.txt +5266 -5264
  439. package/llms.txt +624 -580
  440. package/package.json +7 -8
@@ -1,40 +1,40 @@
1
- # FilePreview
2
-
3
- - Import: @devalok/shilp-sutra/composed/file-preview
4
- - Server-safe: No
5
- - Category: composed
6
-
7
- ## Props
8
- url: string (file URL — required)
9
- type: "image" | "pdf" | "video" | "audio" | "embed" (auto-detected from URL/mimeType)
10
- mimeType: string (helps auto-detection)
11
- alt: string (image alt text)
12
- initialPage: number (PDF starting page, default 1)
13
- fileName: string (displayed in file info bar)
14
- fileSize: string (displayed as badge, e.g. "2.4 MB")
15
- onError: (error: string) => void (called on load failures)
16
-
17
- ## Defaults
18
- initialPage={1}, type auto-detected
19
-
20
- ## Features by Type
21
-
22
- **Image:** Pinch/scroll zoom (0.1x–8x), double-click toggle, floating toolbar (zoom %/reset/fullscreen), keyboard (+/-/0/F/Esc)
23
- **PDF:** react-pdf page nav (prev/next + direct input), keyboard (←→), crossfade between pages
24
- **Video:** Custom branded player, play overlay, auto-hiding controls, progress bar + scrub handle, mute, fullscreen
25
- **Audio:** Branded mini-player, full-width progress bar with hover tooltip + scrub handle, volume, file name display
26
- **Embed:** 16:9 aspect ratio, auto-converts YouTube/Vimeo/Figma/Loom URLs, 15s timeout
27
-
28
- ## Example
29
- ```jsx
30
- <FilePreview url="/uploads/mockup.png" fileName="mockup.png" fileSize="2.4 MB" />
31
- <FilePreview url="/docs/contract.pdf" initialPage={3} />
32
- <FilePreview url="https://youtube.com/watch?v=..." />
33
- ```
34
-
35
- ## Gotchas
36
- - Image/PDF lazy-loaded (Skeleton on first render)
37
- - PDF worker from unpkg CDN — configure workerSrc for offline apps
38
- - All types have error fallback with download link
39
- - Embed URLs auto-converted to embed format
40
- - Audio player doesn't show separate Download button (integrated in card)
1
+ # FilePreview
2
+
3
+ - Import: @devalok/shilp-sutra/composed/file-preview
4
+ - Server-safe: No
5
+ - Category: composed
6
+
7
+ ## Props
8
+ url: string (file URL — required)
9
+ type: "image" | "pdf" | "video" | "audio" | "embed" (auto-detected from URL/mimeType)
10
+ mimeType: string (helps auto-detection)
11
+ alt: string (image alt text)
12
+ initialPage: number (PDF starting page, default 1)
13
+ fileName: string (displayed in file info bar)
14
+ fileSize: string (displayed as badge, e.g. "2.4 MB")
15
+ onError: (error: string) => void (called on load failures)
16
+
17
+ ## Defaults
18
+ initialPage={1}, type auto-detected
19
+
20
+ ## Features by Type
21
+
22
+ **Image:** Pinch/scroll zoom (0.1x–8x), double-click toggle, floating toolbar (zoom %/reset/fullscreen), keyboard (+/-/0/F/Esc)
23
+ **PDF:** react-pdf page nav (prev/next + direct input), keyboard (←→), crossfade between pages
24
+ **Video:** Custom branded player, play overlay, auto-hiding controls, progress bar + scrub handle, mute, fullscreen
25
+ **Audio:** Branded mini-player, full-width progress bar with hover tooltip + scrub handle, volume, file name display
26
+ **Embed:** 16:9 aspect ratio, auto-converts YouTube/Vimeo/Figma/Loom URLs, 15s timeout
27
+
28
+ ## Example
29
+ ```jsx
30
+ <FilePreview url="/uploads/mockup.png" fileName="mockup.png" fileSize="2.4 MB" />
31
+ <FilePreview url="/docs/contract.pdf" initialPage={3} />
32
+ <FilePreview url="https://youtube.com/watch?v=..." />
33
+ ```
34
+
35
+ ## Gotchas
36
+ - Image/PDF lazy-loaded (Skeleton on first render)
37
+ - PDF worker from unpkg CDN — configure workerSrc for offline apps
38
+ - All types have error fallback with download link
39
+ - Embed URLs auto-converted to embed format
40
+ - Audio player doesn't show separate Download button (integrated in card)
@@ -1,57 +1,57 @@
1
- # FilterBar
2
-
3
- - Import: @devalok/shilp-sutra/composed/filter-bar
4
- - Server-safe: No
5
- - Category: composed
6
-
7
- ## Exports
8
- FilterBar, FilterSelect, FilterMultiSelect
9
-
10
- ## Props
11
-
12
- ### FilterBar
13
- searchValue: string
14
- onSearchChange: (value: string) => void (renders SearchInput when provided)
15
- searchPlaceholder: string
16
- onClearAll: () => void (renders "Clear all" button when provided)
17
- size: "xs" | "sm" | "md" (propagated to all child controls via context)
18
- children: ReactNode (FilterSelect / FilterMultiSelect controls)
19
-
20
- ### FilterSelect
21
- label: string
22
- value: string
23
- onValueChange: (value: string) => void
24
- options: { value: string; label: string }[]
25
- allLabel: string (label for the "all" option)
26
-
27
- ### FilterMultiSelect
28
- label: string
29
- value: string[]
30
- onValueChange: (values: string[]) => void
31
- options: { value: string; label: string }[]
32
-
33
- ## Defaults
34
- size="sm", searchPlaceholder="Search...", allLabel="All"
35
-
36
- ## Example
37
- ```jsx
38
- <FilterBar searchValue={search} onSearchChange={setSearch} onClearAll={clearFilters}>
39
- <FilterSelect
40
- label="Status"
41
- value={status}
42
- onValueChange={setStatus}
43
- options={[{ value: 'active', label: 'Active' }, { value: 'done', label: 'Done' }]}
44
- />
45
- <FilterMultiSelect
46
- label="Assignees"
47
- value={assignees}
48
- onValueChange={setAssignees}
49
- options={memberOptions}
50
- />
51
- </FilterBar>
52
- ```
53
-
54
- ## Gotchas
55
- - FilterSelect and FilterMultiSelect must be direct children of FilterBar to inherit the size context
56
- - FilterSelect uses `"all"` as the sentinel value for "no filter" — do not use `"all"` as a real option value
57
- - Active filters get an accent border highlight automatically
1
+ # FilterBar
2
+
3
+ - Import: @devalok/shilp-sutra/composed/filter-bar
4
+ - Server-safe: No
5
+ - Category: composed
6
+
7
+ ## Exports
8
+ FilterBar, FilterSelect, FilterMultiSelect
9
+
10
+ ## Props
11
+
12
+ ### FilterBar
13
+ searchValue: string
14
+ onSearchChange: (value: string) => void (renders SearchInput when provided)
15
+ searchPlaceholder: string
16
+ onClearAll: () => void (renders "Clear all" button when provided)
17
+ size: "xs" | "sm" | "md" (propagated to all child controls via context)
18
+ children: ReactNode (FilterSelect / FilterMultiSelect controls)
19
+
20
+ ### FilterSelect
21
+ label: string
22
+ value: string
23
+ onValueChange: (value: string) => void
24
+ options: { value: string; label: string }[]
25
+ allLabel: string (label for the "all" option)
26
+
27
+ ### FilterMultiSelect
28
+ label: string
29
+ value: string[]
30
+ onValueChange: (values: string[]) => void
31
+ options: { value: string; label: string }[]
32
+
33
+ ## Defaults
34
+ size="sm", searchPlaceholder="Search...", allLabel="All"
35
+
36
+ ## Example
37
+ ```jsx
38
+ <FilterBar searchValue={search} onSearchChange={setSearch} onClearAll={clearFilters}>
39
+ <FilterSelect
40
+ label="Status"
41
+ value={status}
42
+ onValueChange={setStatus}
43
+ options={[{ value: 'active', label: 'Active' }, { value: 'done', label: 'Done' }]}
44
+ />
45
+ <FilterMultiSelect
46
+ label="Assignees"
47
+ value={assignees}
48
+ onValueChange={setAssignees}
49
+ options={memberOptions}
50
+ />
51
+ </FilterBar>
52
+ ```
53
+
54
+ ## Gotchas
55
+ - FilterSelect and FilterMultiSelect must be direct children of FilterBar to inherit the size context
56
+ - FilterSelect uses `"all"` as the sentinel value for "no filter" — do not use `"all"` as a real option value
57
+ - Active filters get an accent border highlight automatically
@@ -1,31 +1,31 @@
1
- # FormSection
2
-
3
- - Import: @devalok/shilp-sutra/composed/form-section
4
- - Server-safe: No
5
- - Category: composed
6
-
7
- ## Props
8
- title: string
9
- description: string (subtitle text below the title)
10
- collapsible: boolean (wraps content in a Collapsible)
11
- defaultOpen: boolean (initial open state when collapsible)
12
- children: ReactNode (form fields)
13
-
14
- ## Defaults
15
- collapsible={false}, defaultOpen={true}
16
-
17
- ## Example
18
- ```jsx
19
- <FormSection title="General" description="Basic project settings">
20
- <FormField .../>
21
- <FormField .../>
22
- </FormSection>
23
-
24
- <FormSection title="Advanced" collapsible defaultOpen={false}>
25
- <FormField .../>
26
- </FormSection>
27
- ```
28
-
29
- ## Gotchas
30
- - `defaultOpen` only applies when `collapsible={true}` — otherwise the section is always open
31
- - Renders a horizontal rule between the header and content automatically
1
+ # FormSection
2
+
3
+ - Import: @devalok/shilp-sutra/composed/form-section
4
+ - Server-safe: No
5
+ - Category: composed
6
+
7
+ ## Props
8
+ title: string
9
+ description: string (subtitle text below the title)
10
+ collapsible: boolean (wraps content in a Collapsible)
11
+ defaultOpen: boolean (initial open state when collapsible)
12
+ children: ReactNode (form fields)
13
+
14
+ ## Defaults
15
+ collapsible={false}, defaultOpen={true}
16
+
17
+ ## Example
18
+ ```jsx
19
+ <FormSection title="General" description="Basic project settings">
20
+ <FormField .../>
21
+ <FormField .../>
22
+ </FormSection>
23
+
24
+ <FormSection title="Advanced" collapsible defaultOpen={false}>
25
+ <FormField .../>
26
+ </FormSection>
27
+ ```
28
+
29
+ ## Gotchas
30
+ - `defaultOpen` only applies when `collapsible={true}` — otherwise the section is always open
31
+ - Renders a horizontal rule between the header and content automatically
@@ -1,27 +1,27 @@
1
- # GlobalLoading
2
-
3
- - Import: @devalok/shilp-sutra/composed/global-loading
4
- - Server-safe: No
5
- - Category: composed
6
-
7
- ## Props
8
- isLoading: boolean (REQUIRED)
9
-
10
- ## Defaults
11
- None
12
-
13
- ## Example
14
- ```jsx
15
- <GlobalLoading isLoading={isNavigating} />
16
- ```
17
-
18
- ## Gotchas
19
- - Fixed-position bar at top of viewport (z-toast layer)
20
- - Renders nothing when `isLoading` is false
21
-
22
- ## Changes
23
- ### v0.18.0
24
- - **Fixed** Track `setTimeout` with ref, add cleanup on unmount
25
-
26
- ### v0.1.0
27
- - **Added** Initial release
1
+ # GlobalLoading
2
+
3
+ - Import: @devalok/shilp-sutra/composed/global-loading
4
+ - Server-safe: No
5
+ - Category: composed
6
+
7
+ ## Props
8
+ isLoading: boolean (REQUIRED)
9
+
10
+ ## Defaults
11
+ None
12
+
13
+ ## Example
14
+ ```jsx
15
+ <GlobalLoading isLoading={isNavigating} />
16
+ ```
17
+
18
+ ## Gotchas
19
+ - Fixed-position bar at top of viewport (z-toast layer)
20
+ - Renders nothing when `isLoading` is false
21
+
22
+ ## Changes
23
+ ### v0.18.0
24
+ - **Fixed** Track `setTimeout` with ref, add cleanup on unmount
25
+
26
+ ### v0.1.0
27
+ - **Added** Initial release
@@ -1,35 +1,35 @@
1
- # InlineEdit
2
-
3
- - Import: @devalok/shilp-sutra/composed/inline-edit
4
- - Server-safe: No
5
- - Category: composed
6
-
7
- ## Props
8
- value: string (current text value)
9
- onSave: (newValue: string) => void | Promise<void> (called on commit; async shows spinner)
10
- placeholder: string (shown when value is empty)
11
- textClassName: string (CSS class for the editable text, e.g. "text-ds-lg font-semibold")
12
- readOnly: boolean
13
- maxLength: number
14
- saving: boolean (external saving state — shows spinner, disables editing)
15
-
16
- ## Defaults
17
- placeholder="Click to edit", readOnly={false}, saving={false}
18
-
19
- ## Example
20
- ```jsx
21
- <InlineEdit
22
- value={title}
23
- onSave={(v) => updateTitle(v)}
24
- textClassName="text-ds-lg font-semibold"
25
- />
26
- ```
27
-
28
- ## Gotchas
29
- - Uses contentEditable — the text IS the editor. No input field appears.
30
- - Click to focus → cursor appears in text. Type to edit. Enter saves. Escape reverts.
31
- - Text is auto-selected on focus (like renaming a file in Finder)
32
- - Paste is restricted to plain text (no rich content)
33
- - The value is trimmed before calling `onSave`; if unchanged, `onSave` is not called
34
- - If `onSave` returns a Promise, a spinner is shown and editing is disabled until it resolves
35
- - On Promise rejection, the text reverts to the original value
1
+ # InlineEdit
2
+
3
+ - Import: @devalok/shilp-sutra/composed/inline-edit
4
+ - Server-safe: No
5
+ - Category: composed
6
+
7
+ ## Props
8
+ value: string (current text value)
9
+ onSave: (newValue: string) => void | Promise<void> (called on commit; async shows spinner)
10
+ placeholder: string (shown when value is empty)
11
+ textClassName: string (CSS class for the editable text, e.g. "text-ds-lg font-semibold")
12
+ readOnly: boolean
13
+ maxLength: number
14
+ saving: boolean (external saving state — shows spinner, disables editing)
15
+
16
+ ## Defaults
17
+ placeholder="Click to edit", readOnly={false}, saving={false}
18
+
19
+ ## Example
20
+ ```jsx
21
+ <InlineEdit
22
+ value={title}
23
+ onSave={(v) => updateTitle(v)}
24
+ textClassName="text-ds-lg font-semibold"
25
+ />
26
+ ```
27
+
28
+ ## Gotchas
29
+ - Uses contentEditable — the text IS the editor. No input field appears.
30
+ - Click to focus → cursor appears in text. Type to edit. Enter saves. Escape reverts.
31
+ - Text is auto-selected on focus (like renaming a file in Finder)
32
+ - Paste is restricted to plain text (no rich content)
33
+ - The value is trimmed before calling `onSave`; if unchanged, `onSave` is not called
34
+ - If `onSave` returns a Promise, a spinner is shown and editing is disabled until it resolves
35
+ - On Promise rejection, the text reverts to the original value
@@ -1,51 +1,51 @@
1
- # LoadingSkeleton
2
-
3
- - Import: @devalok/shilp-sutra/composed/loading-skeleton
4
- - Server-safe: Yes
5
- - Category: composed
6
-
7
- Exports: CardSkeleton, TableSkeleton, BoardSkeleton, ListSkeleton
8
-
9
- ## Props
10
-
11
- ### CardSkeleton
12
- className: string
13
-
14
- ### TableSkeleton
15
- rows: number (default: 5)
16
- columns: number (default: 4)
17
- className: string
18
-
19
- ### BoardSkeleton
20
- columns: number (default: 4)
21
- cardsPerColumn: number (default: 3)
22
- className: string
23
-
24
- ### ListSkeleton
25
- rows: number (default: 6)
26
- showAvatar: boolean (default: true)
27
- className: string
28
-
29
- ## Defaults
30
- TableSkeleton: rows=5, columns=4
31
- BoardSkeleton: columns=4, cardsPerColumn=3
32
- ListSkeleton: rows=6, showAvatar=true
33
-
34
- ## Example
35
- ```jsx
36
- <CardSkeleton />
37
- <TableSkeleton rows={8} columns={5} />
38
- <BoardSkeleton columns={3} cardsPerColumn={4} />
39
- <ListSkeleton rows={10} showAvatar={false} />
40
- ```
41
-
42
- ## Gotchas
43
- - Server-safe: can be imported directly in Next.js Server Components
44
- - These are pre-composed skeleton layouts — for individual skeleton shapes, use the `Skeleton` UI component
45
-
46
- ## Changes
47
- ### v0.2.0
48
- - **Added** Identified as server-safe component
49
-
50
- ### v0.1.0
51
- - **Added** Initial release
1
+ # LoadingSkeleton
2
+
3
+ - Import: @devalok/shilp-sutra/composed/loading-skeleton
4
+ - Server-safe: Yes
5
+ - Category: composed
6
+
7
+ Exports: CardSkeleton, TableSkeleton, BoardSkeleton, ListSkeleton
8
+
9
+ ## Props
10
+
11
+ ### CardSkeleton
12
+ className: string
13
+
14
+ ### TableSkeleton
15
+ rows: number (default: 5)
16
+ columns: number (default: 4)
17
+ className: string
18
+
19
+ ### BoardSkeleton
20
+ columns: number (default: 4)
21
+ cardsPerColumn: number (default: 3)
22
+ className: string
23
+
24
+ ### ListSkeleton
25
+ rows: number (default: 6)
26
+ showAvatar: boolean (default: true)
27
+ className: string
28
+
29
+ ## Defaults
30
+ TableSkeleton: rows=5, columns=4
31
+ BoardSkeleton: columns=4, cardsPerColumn=3
32
+ ListSkeleton: rows=6, showAvatar=true
33
+
34
+ ## Example
35
+ ```jsx
36
+ <CardSkeleton />
37
+ <TableSkeleton rows={8} columns={5} />
38
+ <BoardSkeleton columns={3} cardsPerColumn={4} />
39
+ <ListSkeleton rows={10} showAvatar={false} />
40
+ ```
41
+
42
+ ## Gotchas
43
+ - Server-safe: can be imported directly in Next.js Server Components
44
+ - These are pre-composed skeleton layouts — for individual skeleton shapes, use the `Skeleton` UI component
45
+
46
+ ## Changes
47
+ ### v0.2.0
48
+ - **Added** Identified as server-safe component
49
+
50
+ ### v0.1.0
51
+ - **Added** Initial release
@@ -1,27 +1,27 @@
1
- # MarkdownViewer
2
-
3
- - Import: @devalok/shilp-sutra/composed/markdown-viewer
4
- - Server-safe: No
5
- - Category: composed
6
-
7
- ## Props
8
- content: string (markdown source)
9
- compact: boolean (tighter spacing for inline use)
10
- allowHtml: boolean (allow raw HTML in markdown)
11
- linkTarget: string (target attribute for links)
12
-
13
- ## Defaults
14
- compact={false}, allowHtml={false}, linkTarget="_blank"
15
-
16
- ## Example
17
- ```jsx
18
- <MarkdownViewer content={message.body} />
19
- <MarkdownViewer content={comment} compact />
20
- <MarkdownViewer content={trustedHtml} allowHtml />
21
- ```
22
-
23
- ## Gotchas
24
- - Code blocks with a language fence are syntax-highlighted via `react-syntax-highlighter` (lazy-loaded) — the first render shows a plain `<pre>` fallback
25
- - GFM (tables, strikethrough, task lists) is supported via `remark-gfm`
26
- - Raw HTML is stripped by default — only enable `allowHtml` for trusted content
27
- - Links open in a new tab by default (`target="_blank"` with `rel="noopener noreferrer"`)
1
+ # MarkdownViewer
2
+
3
+ - Import: @devalok/shilp-sutra/composed/markdown-viewer
4
+ - Server-safe: No
5
+ - Category: composed
6
+
7
+ ## Props
8
+ content: string (markdown source)
9
+ compact: boolean (tighter spacing for inline use)
10
+ allowHtml: boolean (allow raw HTML in markdown)
11
+ linkTarget: string (target attribute for links)
12
+
13
+ ## Defaults
14
+ compact={false}, allowHtml={false}, linkTarget="_blank"
15
+
16
+ ## Example
17
+ ```jsx
18
+ <MarkdownViewer content={message.body} />
19
+ <MarkdownViewer content={comment} compact />
20
+ <MarkdownViewer content={trustedHtml} allowHtml />
21
+ ```
22
+
23
+ ## Gotchas
24
+ - Code blocks with a language fence are syntax-highlighted via `react-syntax-highlighter` (lazy-loaded) — the first render shows a plain `<pre>` fallback
25
+ - GFM (tables, strikethrough, task lists) is supported via `remark-gfm`
26
+ - Raw HTML is stripped by default — only enable `allowHtml` for trusted content
27
+ - Links open in a new tab by default (`target="_blank"` with `rel="noopener noreferrer"`)
@@ -1,48 +1,48 @@
1
- # MasterDetail
2
-
3
- - Import: @devalok/shilp-sutra/composed/master-detail
4
- - Server-safe: No
5
- - Category: composed
6
-
7
- ## Compound Components
8
- MasterDetail (root), MasterDetail.List, MasterDetail.Detail, MasterDetail.ListItem
9
-
10
- ## Props
11
-
12
- ### MasterDetail (root)
13
- selected: string | null (ID of currently selected item; null = show list on mobile)
14
- onBack: () => void (called when mobile back button is pressed)
15
- masterWidth: string (master panel width on desktop)
16
- breakpoint: "sm" | "md" | "lg" (below this, stacked mobile mode activates)
17
-
18
- ### MasterDetail.ListItem
19
- active: boolean (highlights the item)
20
- (extends ButtonHTMLAttributes)
21
-
22
- ## Defaults
23
- selected={null}, masterWidth="280px", breakpoint="md"
24
-
25
- ## Example
26
- ```jsx
27
- <MasterDetail selected={selectedId} onBack={() => setSelectedId(null)}>
28
- <MasterDetail.List>
29
- {items.map((item) => (
30
- <MasterDetail.ListItem
31
- key={item.id}
32
- active={item.id === selectedId}
33
- onClick={() => setSelectedId(item.id)}
34
- >
35
- {item.name}
36
- </MasterDetail.ListItem>
37
- ))}
38
- </MasterDetail.List>
39
- <MasterDetail.Detail>
40
- {selectedId ? <ItemDetail id={selectedId} /> : <EmptyState />}
41
- </MasterDetail.Detail>
42
- </MasterDetail>
43
- ```
44
-
45
- ## Gotchas
46
- - On mobile (below breakpoint), List and Detail are mutually exclusive — selecting an item hides the list
47
- - The `onBack` callback is required for the mobile back button to appear in the Detail pane
48
- - Uses `window.matchMedia` — SSR renders desktop layout initially, then hydrates to correct mode
1
+ # MasterDetail
2
+
3
+ - Import: @devalok/shilp-sutra/composed/master-detail
4
+ - Server-safe: No
5
+ - Category: composed
6
+
7
+ ## Compound Components
8
+ MasterDetail (root), MasterDetail.List, MasterDetail.Detail, MasterDetail.ListItem
9
+
10
+ ## Props
11
+
12
+ ### MasterDetail (root)
13
+ selected: string | null (ID of currently selected item; null = show list on mobile)
14
+ onBack: () => void (called when mobile back button is pressed)
15
+ masterWidth: string (master panel width on desktop)
16
+ breakpoint: "sm" | "md" | "lg" (below this, stacked mobile mode activates)
17
+
18
+ ### MasterDetail.ListItem
19
+ active: boolean (highlights the item)
20
+ (extends ButtonHTMLAttributes)
21
+
22
+ ## Defaults
23
+ selected={null}, masterWidth="280px", breakpoint="md"
24
+
25
+ ## Example
26
+ ```jsx
27
+ <MasterDetail selected={selectedId} onBack={() => setSelectedId(null)}>
28
+ <MasterDetail.List>
29
+ {items.map((item) => (
30
+ <MasterDetail.ListItem
31
+ key={item.id}
32
+ active={item.id === selectedId}
33
+ onClick={() => setSelectedId(item.id)}
34
+ >
35
+ {item.name}
36
+ </MasterDetail.ListItem>
37
+ ))}
38
+ </MasterDetail.List>
39
+ <MasterDetail.Detail>
40
+ {selectedId ? <ItemDetail id={selectedId} /> : <EmptyState />}
41
+ </MasterDetail.Detail>
42
+ </MasterDetail>
43
+ ```
44
+
45
+ ## Gotchas
46
+ - On mobile (below breakpoint), List and Detail are mutually exclusive — selecting an item hides the list
47
+ - The `onBack` callback is required for the mobile back button to appear in the Detail pane
48
+ - Uses `window.matchMedia` — SSR renders desktop layout initially, then hydrates to correct mode