@alexgorbatchev/shadcn 0.0.18 → 0.0.20

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 (502) hide show
  1. package/README.md +32 -9
  2. package/dist/{chunk-q2ewq67a.js → chunk-02qymemz.js} +1 -1
  3. package/dist/{chunk-q9qm7skj.js → chunk-0ewzb2ax.js} +4 -4
  4. package/dist/{chunk-rrd9fsz6.js → chunk-14qj6w54.js} +5 -5
  5. package/dist/{chunk-yn3e9w1j.js → chunk-1c5jjkhw.js} +1 -1
  6. package/dist/{chunk-6aqm34nb.js → chunk-1qhf8gh8.js} +4 -3
  7. package/dist/{chunk-tsekdy3w.js → chunk-1tgrhacr.js} +12 -3
  8. package/dist/{chunk-zgpdhtkw.js → chunk-21x1n6gn.js} +6 -6
  9. package/dist/{chunk-22678d2t.js → chunk-24pefkd5.js} +1 -1
  10. package/dist/{chunk-msave608.js → chunk-2bx2r98r.js} +1 -1
  11. package/dist/{chunk-41wykzq3.js → chunk-2tmvz090.js} +1 -1
  12. package/dist/{chunk-gknaq8ep.js → chunk-3d9v39ga.js} +1 -1
  13. package/dist/{chunk-2b9agdrf.js → chunk-3dyqen8w.js} +1 -1
  14. package/dist/{chunk-f63f8w58.js → chunk-3jrsp186.js} +1 -1
  15. package/dist/{chunk-njzam0hx.js → chunk-3qqdfft7.js} +1 -0
  16. package/dist/{chunk-gfm2arhj.js → chunk-43hfchxf.js} +1 -1
  17. package/dist/{chunk-6xr41wyr.js → chunk-46jdxdzy.js} +3 -3
  18. package/dist/{chunk-x7z9jzyf.js → chunk-4djw71cv.js} +22 -12
  19. package/dist/{chunk-fh3nme7f.js → chunk-4drqqqz1.js} +1 -1
  20. package/dist/{chunk-mjpc4qf7.js → chunk-52e8a05a.js} +1 -1
  21. package/dist/{chunk-1hbge1cb.js → chunk-553bzh59.js} +1 -1
  22. package/dist/{chunk-a6e11wj6.js → chunk-5ayp2vkw.js} +1 -1
  23. package/dist/{chunk-19441s27.js → chunk-5pvyxayg.js} +2 -2
  24. package/dist/{chunk-vx7c2xhq.js → chunk-5v4typ39.js} +3 -3
  25. package/dist/{chunk-gt8m0zeq.js → chunk-5wndb6hx.js} +1 -1
  26. package/dist/{chunk-550z7s64.js → chunk-6432235c.js} +3 -3
  27. package/dist/{chunk-0xrvhezs.js → chunk-6f3qpy7v.js} +1 -1
  28. package/dist/{chunk-2gten6a1.js → chunk-6wvhq8wq.js} +2 -2
  29. package/dist/{chunk-zhnwybhq.js → chunk-70vndezn.js} +16 -5
  30. package/dist/{chunk-r7fy89jq.js → chunk-79667fz5.js} +3 -3
  31. package/dist/{chunk-4gby2v61.js → chunk-7pyt4e5t.js} +1 -1
  32. package/dist/{chunk-c6nvc3ft.js → chunk-84ca0dpc.js} +2 -2
  33. package/dist/{chunk-9msk1t9e.js → chunk-8a15x4a8.js} +1 -1
  34. package/dist/{chunk-0qcknj5n.js → chunk-8fcjx3he.js} +5 -5
  35. package/dist/{chunk-h8awhm19.js → chunk-96wh7ccv.js} +1 -1
  36. package/dist/{chunk-pe1vvkp7.js → chunk-9jct7hv0.js} +3 -3
  37. package/dist/{chunk-xqn8mef3.js → chunk-a6kyjjfk.js} +1 -0
  38. package/dist/chunk-aa7m22zj.js +22 -0
  39. package/dist/{chunk-h77yk9sn.js → chunk-bcpy6gpz.js} +1 -1
  40. package/dist/chunk-bygq5yqf.js +139 -0
  41. package/dist/{chunk-2m0zpzbm.js → chunk-cn81dnqb.js} +1 -0
  42. package/dist/{chunk-m1a9e1py.js → chunk-d2z4gebj.js} +1 -1
  43. package/dist/{chunk-mx21wpq0.js → chunk-d4bm5rzy.js} +12 -2
  44. package/dist/{chunk-jy6nfnbx.js → chunk-d9jbqd99.js} +2 -2
  45. package/dist/{chunk-3hvpcsb4.js → chunk-dgkj6442.js} +1 -1
  46. package/dist/{chunk-wwfj7ga3.js → chunk-djm7qq62.js} +1 -1
  47. package/dist/{chunk-9dw4dyzq.js → chunk-e0pv0me5.js} +1 -1
  48. package/dist/{chunk-dd53t01w.js → chunk-ecmk3vgd.js} +1 -1
  49. package/dist/{chunk-0yqwq0ev.js → chunk-eq88qk1d.js} +10 -10
  50. package/dist/{chunk-jq6tc65r.js → chunk-f5hphka1.js} +7 -1
  51. package/dist/{chunk-7g39g3h8.js → chunk-fb6h4fzt.js} +1 -1
  52. package/dist/{chunk-fq8taatb.js → chunk-fba5hr7b.js} +1 -1
  53. package/dist/{chunk-3esarnmt.js → chunk-g03nphs1.js} +1 -1
  54. package/dist/{chunk-jxwfkmdh.js → chunk-gabqzfq0.js} +3 -3
  55. package/dist/{chunk-zcwynyr0.js → chunk-gykrcxd1.js} +1 -0
  56. package/dist/{chunk-xvs5y4v7.js → chunk-h979cxnh.js} +15 -4
  57. package/dist/{chunk-m54kq3he.js → chunk-hh43wg05.js} +22 -12
  58. package/dist/{chunk-6hbx647r.js → chunk-j4gd5awk.js} +6 -6
  59. package/dist/{chunk-j5wk4ffj.js → chunk-jba22682.js} +3 -3
  60. package/dist/{chunk-5h7vkgvz.js → chunk-jf0y740b.js} +1 -1
  61. package/dist/{chunk-avrh238b.js → chunk-jpamrhdk.js} +1 -1
  62. package/dist/{chunk-gyg2s982.js → chunk-k4qz4q7r.js} +1 -0
  63. package/dist/{chunk-erpzgt57.js → chunk-kv1akmf5.js} +1 -1
  64. package/dist/{chunk-2g0zzx6f.js → chunk-m2ct74my.js} +1 -0
  65. package/dist/{chunk-34ndz1gf.js → chunk-mrrbycgx.js} +3 -3
  66. package/dist/chunk-mz3e810d.js +83 -0
  67. package/dist/{chunk-serw27sv.js → chunk-nkw2vsf3.js} +1 -0
  68. package/dist/{chunk-wf5cnpdg.js → chunk-p45ytcc2.js} +3 -3
  69. package/dist/{chunk-86211e5a.js → chunk-p8gshf3k.js} +1 -1
  70. package/dist/{chunk-dnja1pz5.js → chunk-p8qtk151.js} +1 -1
  71. package/dist/{chunk-3552jz55.js → chunk-qcsxnn16.js} +1 -0
  72. package/dist/{chunk-q40gqpwh.js → chunk-qgjjcmpa.js} +1 -1
  73. package/dist/{chunk-jwajmmfb.js → chunk-qv19jhdk.js} +1 -1
  74. package/dist/{chunk-1x2ch0xc.js → chunk-rffrerg5.js} +3 -1
  75. package/dist/{chunk-hhvp5352.js → chunk-s46hvhjw.js} +1 -1
  76. package/dist/{chunk-h561m2ae.js → chunk-s83v0taa.js} +1 -1
  77. package/dist/{chunk-emasqc8x.js → chunk-sat9hjv7.js} +1 -1
  78. package/dist/{chunk-ets9h67e.js → chunk-tea1nrwn.js} +2 -2
  79. package/dist/{chunk-47xfhw4f.js → chunk-v9r6t8bz.js} +1 -0
  80. package/dist/{chunk-48b1ya7g.js → chunk-ve9gpkxd.js} +1 -1
  81. package/dist/{chunk-jacxpetf.js → chunk-vjtbpkht.js} +2 -2
  82. package/dist/{chunk-1apg76a7.js → chunk-vq8nc5xa.js} +1 -1
  83. package/dist/{chunk-55bcw5ff.js → chunk-w1w71edg.js} +1 -0
  84. package/dist/{chunk-9zyam2cn.js → chunk-wkpf4bv7.js} +1 -1
  85. package/dist/{chunk-ed49y20r.js → chunk-ws4y7ctw.js} +1 -1
  86. package/dist/{chunk-ha24sd50.js → chunk-ykt5sv7n.js} +1 -1
  87. package/dist/{chunk-yncp9nsv.js → chunk-z4jpedvh.js} +1 -0
  88. package/dist/{chunk-b12s32e3.js → chunk-zj06vvcz.js} +1 -1
  89. package/dist/{chunk-5h6m9dsm.js → chunk-ztcbee24.js} +1 -1
  90. package/dist/components/AlertDialog.d.ts +1 -1
  91. package/dist/components/ButtonLink.d.ts +12 -0
  92. package/dist/components/Card.d.ts +6 -2
  93. package/dist/components/ContextMenu.d.ts +1 -1
  94. package/dist/components/DensityProvider.d.ts +9 -4
  95. package/dist/components/Dialog.d.ts +1 -1
  96. package/dist/components/Drawer.d.ts +1 -1
  97. package/dist/components/DropdownMenu.d.ts +1 -1
  98. package/dist/components/ScrollGuard.d.ts +6 -0
  99. package/dist/components/Toast.d.ts +1 -1
  100. package/dist/components/assistant-ui/elements/AgentCard.js +1 -1
  101. package/dist/components/assistant-ui/elements/ApprovalCard.js +1 -1
  102. package/dist/components/assistant-ui/elements/ArtifactCard.js +1 -1
  103. package/dist/components/assistant-ui/elements/BackgroundInbox.js +2 -2
  104. package/dist/components/assistant-ui/elements/Chart.js +2 -2
  105. package/dist/components/assistant-ui/elements/ChatPanel.js +1 -1
  106. package/dist/components/assistant-ui/elements/Citation.js +3 -2
  107. package/dist/components/assistant-ui/elements/CodeDiff.js +2 -2
  108. package/dist/components/assistant-ui/elements/CommandPalette.js +4 -3
  109. package/dist/components/assistant-ui/elements/ComparisonCard.js +1 -1
  110. package/dist/components/assistant-ui/elements/ComposerContext.js +3 -2
  111. package/dist/components/assistant-ui/elements/ContextDisplay.js +9 -8
  112. package/dist/components/assistant-ui/elements/ContextDisplayBar.js +6 -5
  113. package/dist/components/assistant-ui/elements/ContextDisplayContent.js +3 -2
  114. package/dist/components/assistant-ui/elements/ContextDisplayRing.js +6 -5
  115. package/dist/components/assistant-ui/elements/ContextDisplayRoot.js +3 -2
  116. package/dist/components/assistant-ui/elements/ContextDisplayText.js +6 -5
  117. package/dist/components/assistant-ui/elements/ContextDisplayTrigger.js +3 -2
  118. package/dist/components/assistant-ui/elements/ConversationMap.js +3 -2
  119. package/dist/components/assistant-ui/elements/DataTable.js +2 -2
  120. package/dist/components/assistant-ui/elements/EditMessage.js +2 -2
  121. package/dist/components/assistant-ui/elements/ElicitationForm.js +2 -2
  122. package/dist/components/assistant-ui/elements/FeedbackDialog.js +2 -2
  123. package/dist/components/assistant-ui/elements/FileTree.js +2 -2
  124. package/dist/components/assistant-ui/elements/FlowGraph.js +2 -2
  125. package/dist/components/assistant-ui/elements/GenerativeUi.js +5 -4
  126. package/dist/components/assistant-ui/elements/Image.js +3 -2
  127. package/dist/components/assistant-ui/elements/ImageGallery.js +3 -2
  128. package/dist/components/assistant-ui/elements/MarkdownText.js +4 -3
  129. package/dist/components/assistant-ui/elements/McpServerPanel.js +2 -2
  130. package/dist/components/assistant-ui/elements/MermaidDiagram.js +4 -3
  131. package/dist/components/assistant-ui/elements/MermaidZoom.js +3 -2
  132. package/dist/components/assistant-ui/elements/ModelPicker.js +2 -2
  133. package/dist/components/assistant-ui/elements/ModelSelector.js +13 -12
  134. package/dist/components/assistant-ui/elements/ModelSelectorContent.js +10 -9
  135. package/dist/components/assistant-ui/elements/ModelSelectorEmpty.js +4 -3
  136. package/dist/components/assistant-ui/elements/ModelSelectorFocusAnchor.js +4 -3
  137. package/dist/components/assistant-ui/elements/ModelSelectorGroup.js +4 -3
  138. package/dist/components/assistant-ui/elements/ModelSelectorItem.js +4 -3
  139. package/dist/components/assistant-ui/elements/ModelSelectorList.js +6 -5
  140. package/dist/components/assistant-ui/elements/ModelSelectorRoot.js +3 -2
  141. package/dist/components/assistant-ui/elements/ModelSelectorSearch.js +4 -3
  142. package/dist/components/assistant-ui/elements/ModelSelectorSeparator.js +4 -3
  143. package/dist/components/assistant-ui/elements/ModelSelectorTrigger.js +3 -2
  144. package/dist/components/assistant-ui/elements/ReasoningPanel.js +1 -1
  145. package/dist/components/assistant-ui/elements/RecommendationCard.js +1 -1
  146. package/dist/components/assistant-ui/elements/RegenerateMenu.js +3 -2
  147. package/dist/components/assistant-ui/elements/ScheduleCard.js +1 -1
  148. package/dist/components/assistant-ui/elements/ScrollAnchor.js +1 -1
  149. package/dist/components/assistant-ui/elements/SettingsPanel.js +1 -1
  150. package/dist/components/assistant-ui/elements/SpecSheet.js +1 -1
  151. package/dist/components/assistant-ui/elements/TaskCard.js +1 -1
  152. package/dist/components/assistant-ui/elements/TooltipIconButton.js +3 -2
  153. package/dist/components/assistant-ui/index.js +61 -60
  154. package/dist/components/assistant-ui/native/AssistantModal.js +11 -10
  155. package/dist/components/assistant-ui/native/AssistantSidebar.js +11 -10
  156. package/dist/components/assistant-ui/native/AttachmentPreview.js +5 -4
  157. package/dist/components/assistant-ui/native/ComposerTriggerPopover.js +1 -1
  158. package/dist/components/assistant-ui/native/ContextDisplay.js +11 -10
  159. package/dist/components/assistant-ui/native/ContextDisplayBar.js +8 -7
  160. package/dist/components/assistant-ui/native/ContextDisplayRing.js +8 -7
  161. package/dist/components/assistant-ui/native/ContextDisplayRoot.js +5 -4
  162. package/dist/components/assistant-ui/native/ContextDisplayRuntimeRoot.js +4 -3
  163. package/dist/components/assistant-ui/native/ContextDisplayText.js +8 -7
  164. package/dist/components/assistant-ui/native/ConversationMapAui.js +4 -3
  165. package/dist/components/assistant-ui/native/McpConfigDialog.js +3 -2
  166. package/dist/components/assistant-ui/native/MermaidDiagram.js +5 -4
  167. package/dist/components/assistant-ui/native/MessageTiming.js +3 -2
  168. package/dist/components/assistant-ui/native/ModelSelector.js +15 -14
  169. package/dist/components/assistant-ui/native/Reasoning.js +5 -4
  170. package/dist/components/assistant-ui/native/TaskCard.js +6 -5
  171. package/dist/components/assistant-ui/native/TaskGroup.js +7 -6
  172. package/dist/components/assistant-ui/native/TaskTray.js +3 -2
  173. package/dist/components/assistant-ui/native/Thread.js +9 -8
  174. package/dist/components/assistant-ui/native/ThreadList.js +1 -1
  175. package/dist/components/assistant-ui/native/ThreadListSidebar.js +5 -4
  176. package/dist/components/assistant-ui/native/VoiceControl.js +6 -5
  177. package/dist/components/assistant-ui/native/VoiceDisconnectButton.js +4 -3
  178. package/dist/components/assistant-ui/native/VoiceMuteButton.js +4 -3
  179. package/dist/components/assistant-ui/native/index.js +53 -52
  180. package/dist/components/command/index.js +3 -2
  181. package/dist/components/questionnaire/index.js +2 -2
  182. package/dist/components/resizable/Resizable.d.ts +1 -1
  183. package/dist/components/resizable/index.js +1 -1
  184. package/dist/hooks/useCardSpotlight.d.ts +7 -0
  185. package/dist/hooks/usePortalNode.d.ts +14 -0
  186. package/dist/index.d.ts +3 -0
  187. package/dist/index.js +649 -435
  188. package/dist/theme.css +91 -16
  189. package/dist/utils/observeScrollGuards.d.ts +4 -0
  190. package/llms/components/actions/Button.md +433 -0
  191. package/llms/components/actions/ButtonGroup.md +278 -0
  192. package/llms/components/actions/ButtonLink.md +189 -0
  193. package/llms/components/actions/Toggle.md +191 -0
  194. package/llms/components/actions/ToggleGroup.md +161 -0
  195. package/llms/components/assistant-ui/elements/agents-tasks/AgentCard.md +60 -0
  196. package/llms/components/assistant-ui/elements/agents-tasks/AgentHandoff.md +78 -0
  197. package/llms/components/assistant-ui/elements/agents-tasks/AgentPlan.md +57 -0
  198. package/llms/components/assistant-ui/elements/agents-tasks/AgentStatus.md +88 -0
  199. package/llms/components/assistant-ui/elements/agents-tasks/JobProgress.md +84 -0
  200. package/llms/components/assistant-ui/elements/agents-tasks/RunActivity.md +75 -0
  201. package/llms/components/assistant-ui/elements/agents-tasks/ScheduleCard.md +91 -0
  202. package/llms/components/assistant-ui/elements/agents-tasks/StoppedRun.md +54 -0
  203. package/llms/components/assistant-ui/elements/agents-tasks/SubagentList.md +72 -0
  204. package/llms/components/assistant-ui/elements/agents-tasks/TaskCard.md +101 -0
  205. package/llms/components/assistant-ui/elements/agents-tasks/TaskStateIcon.md +86 -0
  206. package/llms/components/assistant-ui/elements/agents-tasks/TodoList.md +99 -0
  207. package/llms/components/assistant-ui/elements/branding/ClaudeLogo.md +36 -0
  208. package/llms/components/assistant-ui/elements/branding/GeminiLogo.md +47 -0
  209. package/llms/components/assistant-ui/elements/branding/GitHubIcon.md +41 -0
  210. package/llms/components/assistant-ui/elements/branding/OpenAILogo.md +36 -0
  211. package/llms/components/assistant-ui/elements/code-diffs/CodeDiff.md +67 -0
  212. package/llms/components/assistant-ui/elements/code-diffs/CodeRunner.md +66 -0
  213. package/llms/components/assistant-ui/elements/code-diffs/DiffViewer.md +144 -0
  214. package/llms/components/assistant-ui/elements/code-diffs/DiffViewerContent.md +50 -0
  215. package/llms/components/assistant-ui/elements/code-diffs/DiffViewerFile.md +50 -0
  216. package/llms/components/assistant-ui/elements/code-diffs/DiffViewerFileBadge.md +50 -0
  217. package/llms/components/assistant-ui/elements/code-diffs/DiffViewerFileContent.md +59 -0
  218. package/llms/components/assistant-ui/elements/code-diffs/DiffViewerHeader.md +81 -0
  219. package/llms/components/assistant-ui/elements/code-diffs/DiffViewerLine.md +50 -0
  220. package/llms/components/assistant-ui/elements/code-diffs/DiffViewerSplitLine.md +55 -0
  221. package/llms/components/assistant-ui/elements/code-diffs/DiffViewerStats.md +50 -0
  222. package/llms/components/assistant-ui/elements/code-diffs/DiffViewerText.md +44 -0
  223. package/llms/components/assistant-ui/elements/code-diffs/ReviewableDiff.md +102 -0
  224. package/llms/components/assistant-ui/elements/code-diffs/ShikiHighlighter.md +131 -0
  225. package/llms/components/assistant-ui/elements/code-diffs/SyntaxHighlighter.md +62 -0
  226. package/llms/components/assistant-ui/elements/code-diffs/TerminalAnsiFragment.md +66 -0
  227. package/llms/components/assistant-ui/elements/code-diffs/TerminalBlock.md +131 -0
  228. package/llms/components/assistant-ui/elements/composer/CommandPalette.md +79 -0
  229. package/llms/components/assistant-ui/elements/composer/Composer.md +62 -0
  230. package/llms/components/assistant-ui/elements/composer/ComposerActions.md +34 -0
  231. package/llms/components/assistant-ui/elements/composer/ComposerAttachButton.md +50 -0
  232. package/llms/components/assistant-ui/elements/composer/ComposerAttachmentChip.md +58 -0
  233. package/llms/components/assistant-ui/elements/composer/ComposerAttachments.md +42 -0
  234. package/llms/components/assistant-ui/elements/composer/ComposerBar.md +42 -0
  235. package/llms/components/assistant-ui/elements/composer/ComposerCommandItem.md +42 -0
  236. package/llms/components/assistant-ui/elements/composer/ComposerContext.md +50 -0
  237. package/llms/components/assistant-ui/elements/composer/ComposerInput.md +56 -0
  238. package/llms/components/assistant-ui/elements/composer/ComposerMenu.md +59 -0
  239. package/llms/components/assistant-ui/elements/composer/ComposerMenuItem.md +50 -0
  240. package/llms/components/assistant-ui/elements/composer/ComposerModelItem.md +42 -0
  241. package/llms/components/assistant-ui/elements/composer/ComposerModelTrigger.md +42 -0
  242. package/llms/components/assistant-ui/elements/composer/ComposerPersonItem.md +42 -0
  243. package/llms/components/assistant-ui/elements/composer/ComposerSend.md +58 -0
  244. package/llms/components/assistant-ui/elements/composer/ComposerToolbar.md +34 -0
  245. package/llms/components/assistant-ui/elements/composer/ComposerVoice.md +58 -0
  246. package/llms/components/assistant-ui/elements/composer/ComposerVoiceButton.md +50 -0
  247. package/llms/components/assistant-ui/elements/composer/MobileComposer.md +82 -0
  248. package/llms/components/assistant-ui/elements/composer/PromptLibrary.md +99 -0
  249. package/llms/components/assistant-ui/elements/composer/Suggestions.md +62 -0
  250. package/llms/components/assistant-ui/elements/context/ContextBreakdown.md +58 -0
  251. package/llms/components/assistant-ui/elements/context/ContextDisplay.md +37 -0
  252. package/llms/components/assistant-ui/elements/context/ContextDisplayBar.md +28 -0
  253. package/llms/components/assistant-ui/elements/context/ContextDisplayContent.md +31 -0
  254. package/llms/components/assistant-ui/elements/context/ContextDisplayRing.md +28 -0
  255. package/llms/components/assistant-ui/elements/context/ContextDisplayRoot.md +54 -0
  256. package/llms/components/assistant-ui/elements/context/ContextDisplayText.md +28 -0
  257. package/llms/components/assistant-ui/elements/context/ContextDisplayTrigger.md +51 -0
  258. package/llms/components/assistant-ui/elements/context/ContextDisplayValue.md +58 -0
  259. package/llms/components/assistant-ui/elements/context/MemoryChips.md +57 -0
  260. package/llms/components/assistant-ui/elements/conversations/BackgroundInbox.md +57 -0
  261. package/llms/components/assistant-ui/elements/conversations/CanvasSplit.md +68 -0
  262. package/llms/components/assistant-ui/elements/conversations/ChatPanel.md +82 -0
  263. package/llms/components/assistant-ui/elements/conversations/CheckpointHistory.md +57 -0
  264. package/llms/components/assistant-ui/elements/conversations/ConversationMap.md +59 -0
  265. package/llms/components/assistant-ui/elements/conversations/ConversationSearch.md +83 -0
  266. package/llms/components/assistant-ui/elements/conversations/DaySeparator.md +44 -0
  267. package/llms/components/assistant-ui/elements/conversations/DraftRestore.md +48 -0
  268. package/llms/components/assistant-ui/elements/conversations/EditMessage.md +97 -0
  269. package/llms/components/assistant-ui/elements/conversations/LauncherBubble.md +79 -0
  270. package/llms/components/assistant-ui/elements/conversations/MessageActions.md +68 -0
  271. package/llms/components/assistant-ui/elements/conversations/MessageAttachments.md +57 -0
  272. package/llms/components/assistant-ui/elements/conversations/MessageBranches.md +76 -0
  273. package/llms/components/assistant-ui/elements/conversations/MessagePair.md +57 -0
  274. package/llms/components/assistant-ui/elements/conversations/MessageQueue.md +54 -0
  275. package/llms/components/assistant-ui/elements/conversations/MessageTiming.md +78 -0
  276. package/llms/components/assistant-ui/elements/conversations/QuoteReply.md +83 -0
  277. package/llms/components/assistant-ui/elements/conversations/RegenerateMenu.md +117 -0
  278. package/llms/components/assistant-ui/elements/conversations/ScrollAnchor.md +56 -0
  279. package/llms/components/assistant-ui/elements/conversations/SharedConversation.md +81 -0
  280. package/llms/components/assistant-ui/elements/conversations/ThreadList.md +121 -0
  281. package/llms/components/assistant-ui/elements/conversations/ThreadSearch.md +131 -0
  282. package/llms/components/assistant-ui/elements/data-visualization/ActivityGraph.md +51 -0
  283. package/llms/components/assistant-ui/elements/data-visualization/ArtifactCard.md +50 -0
  284. package/llms/components/assistant-ui/elements/data-visualization/Chart.md +58 -0
  285. package/llms/components/assistant-ui/elements/data-visualization/ComparisonCard.md +58 -0
  286. package/llms/components/assistant-ui/elements/data-visualization/CostMeter.md +49 -0
  287. package/llms/components/assistant-ui/elements/data-visualization/DataTable.md +240 -0
  288. package/llms/components/assistant-ui/elements/data-visualization/Diagram.md +77 -0
  289. package/llms/components/assistant-ui/elements/data-visualization/DotMatrix.md +188 -0
  290. package/llms/components/assistant-ui/elements/data-visualization/FlowGraph.md +61 -0
  291. package/llms/components/assistant-ui/elements/data-visualization/GenerativeUi.md +110 -0
  292. package/llms/components/assistant-ui/elements/data-visualization/GenerativeUiTheme.md +67 -0
  293. package/llms/components/assistant-ui/elements/data-visualization/GeoMap.md +91 -0
  294. package/llms/components/assistant-ui/elements/data-visualization/HeatGraph.md +57 -0
  295. package/llms/components/assistant-ui/elements/data-visualization/MapAnswer.md +58 -0
  296. package/llms/components/assistant-ui/elements/data-visualization/MermaidDiagram.md +66 -0
  297. package/llms/components/assistant-ui/elements/data-visualization/NumberRoll.md +88 -0
  298. package/llms/components/assistant-ui/elements/data-visualization/NumberRollDigit.md +28 -0
  299. package/llms/components/assistant-ui/elements/data-visualization/NumberRollPart.md +28 -0
  300. package/llms/components/assistant-ui/elements/data-visualization/NumberTicker.md +87 -0
  301. package/llms/components/assistant-ui/elements/data-visualization/RecommendationCard.md +86 -0
  302. package/llms/components/assistant-ui/elements/data-visualization/ScoreBreakdown.md +72 -0
  303. package/llms/components/assistant-ui/elements/data-visualization/ShareMeter.md +50 -0
  304. package/llms/components/assistant-ui/elements/data-visualization/SpecSheet.md +69 -0
  305. package/llms/components/assistant-ui/elements/data-visualization/Timeline.md +72 -0
  306. package/llms/components/assistant-ui/elements/data-visualization/TraceWaterfall.md +88 -0
  307. package/llms/components/assistant-ui/elements/media-voice/AudioPlayer.md +50 -0
  308. package/llms/components/assistant-ui/elements/media-voice/File.md +122 -0
  309. package/llms/components/assistant-ui/elements/media-voice/FileTree.md +59 -0
  310. package/llms/components/assistant-ui/elements/media-voice/Image.md +201 -0
  311. package/llms/components/assistant-ui/elements/media-voice/ImageGallery.md +64 -0
  312. package/llms/components/assistant-ui/elements/media-voice/ImageGeneration.md +50 -0
  313. package/llms/components/assistant-ui/elements/media-voice/ReadAloud.md +89 -0
  314. package/llms/components/assistant-ui/elements/media-voice/SpeakerIdentity.md +60 -0
  315. package/llms/components/assistant-ui/elements/media-voice/VideoPlayer.md +42 -0
  316. package/llms/components/assistant-ui/elements/media-voice/VoiceConversation.md +78 -0
  317. package/llms/components/assistant-ui/elements/media-voice/VoiceOrb.md +110 -0
  318. package/llms/components/assistant-ui/elements/models/ModelPicker.md +79 -0
  319. package/llms/components/assistant-ui/elements/models/ModelSelector.md +48 -0
  320. package/llms/components/assistant-ui/elements/models/ModelSelectorContent.md +45 -0
  321. package/llms/components/assistant-ui/elements/models/ModelSelectorEffort.md +31 -0
  322. package/llms/components/assistant-ui/elements/models/ModelSelectorEmpty.md +30 -0
  323. package/llms/components/assistant-ui/elements/models/ModelSelectorFocusAnchor.md +31 -0
  324. package/llms/components/assistant-ui/elements/models/ModelSelectorGroup.md +40 -0
  325. package/llms/components/assistant-ui/elements/models/ModelSelectorItem.md +38 -0
  326. package/llms/components/assistant-ui/elements/models/ModelSelectorList.md +30 -0
  327. package/llms/components/assistant-ui/elements/models/ModelSelectorRoot.md +72 -0
  328. package/llms/components/assistant-ui/elements/models/ModelSelectorSearch.md +31 -0
  329. package/llms/components/assistant-ui/elements/models/ModelSelectorSeparator.md +34 -0
  330. package/llms/components/assistant-ui/elements/models/ModelSelectorTrigger.md +66 -0
  331. package/llms/components/assistant-ui/elements/models/ModelSelectorValue.md +32 -0
  332. package/llms/components/assistant-ui/elements/models/ReasoningEffort.md +86 -0
  333. package/llms/components/assistant-ui/elements/reasoning/GenerationLoader.md +88 -0
  334. package/llms/components/assistant-ui/elements/reasoning/ReasoningContent.md +59 -0
  335. package/llms/components/assistant-ui/elements/reasoning/ReasoningFade.md +62 -0
  336. package/llms/components/assistant-ui/elements/reasoning/ReasoningPanel.md +75 -0
  337. package/llms/components/assistant-ui/elements/reasoning/ReasoningRoot.md +101 -0
  338. package/llms/components/assistant-ui/elements/reasoning/ReasoningText.md +59 -0
  339. package/llms/components/assistant-ui/elements/reasoning/ReasoningTrigger.md +59 -0
  340. package/llms/components/assistant-ui/elements/reasoning/ThinkingIndicator.md +54 -0
  341. package/llms/components/assistant-ui/elements/reasoning/TypingIndicator.md +62 -0
  342. package/llms/components/assistant-ui/elements/sources-research/Citation.md +103 -0
  343. package/llms/components/assistant-ui/elements/sources-research/ConfidenceMarker.md +94 -0
  344. package/llms/components/assistant-ui/elements/sources-research/DocumentReference.md +60 -0
  345. package/llms/components/assistant-ui/elements/sources-research/InlineCitation.md +56 -0
  346. package/llms/components/assistant-ui/elements/sources-research/LinkPreview.md +65 -0
  347. package/llms/components/assistant-ui/elements/sources-research/ResearchReport.md +72 -0
  348. package/llms/components/assistant-ui/elements/sources-research/RetrievalChunks.md +75 -0
  349. package/llms/components/assistant-ui/elements/sources-research/SourceGlyph.md +54 -0
  350. package/llms/components/assistant-ui/elements/sources-research/Sources.md +150 -0
  351. package/llms/components/assistant-ui/elements/sources-research/WebPreview.md +80 -0
  352. package/llms/components/assistant-ui/elements/sources-research/WebSearch.md +72 -0
  353. package/llms/components/assistant-ui/elements/states-settings/ConnectionState.md +58 -0
  354. package/llms/components/assistant-ui/elements/states-settings/ElicitationForm.md +101 -0
  355. package/llms/components/assistant-ui/elements/states-settings/EmptyState.md +64 -0
  356. package/llms/components/assistant-ui/elements/states-settings/EmptyStateComposer.md +88 -0
  357. package/llms/components/assistant-ui/elements/states-settings/EmptyStateGreeting.md +56 -0
  358. package/llms/components/assistant-ui/elements/states-settings/EmptyStateSuggestion.md +66 -0
  359. package/llms/components/assistant-ui/elements/states-settings/EmptyStateSuggestions.md +61 -0
  360. package/llms/components/assistant-ui/elements/states-settings/ErrorState.md +47 -0
  361. package/llms/components/assistant-ui/elements/states-settings/EveAskQuestion.md +166 -0
  362. package/llms/components/assistant-ui/elements/states-settings/FeedbackDialog.md +85 -0
  363. package/llms/components/assistant-ui/elements/states-settings/Onboarding.md +84 -0
  364. package/llms/components/assistant-ui/elements/states-settings/OptionList.md +74 -0
  365. package/llms/components/assistant-ui/elements/states-settings/OptionText.md +38 -0
  366. package/llms/components/assistant-ui/elements/states-settings/QuestionFlow.md +85 -0
  367. package/llms/components/assistant-ui/elements/states-settings/QuotaBanner.md +91 -0
  368. package/llms/components/assistant-ui/elements/states-settings/SettingsPanel.md +92 -0
  369. package/llms/components/assistant-ui/elements/text-formatting/DirectiveText.md +94 -0
  370. package/llms/components/assistant-ui/elements/text-formatting/Frac.md +28 -0
  371. package/llms/components/assistant-ui/elements/text-formatting/MarkdownText.md +66 -0
  372. package/llms/components/assistant-ui/elements/text-formatting/MathBlock.md +67 -0
  373. package/llms/components/assistant-ui/elements/text-formatting/StreamingText.md +62 -0
  374. package/llms/components/assistant-ui/elements/text-formatting/Sub.md +28 -0
  375. package/llms/components/assistant-ui/elements/text-formatting/Sup.md +28 -0
  376. package/llms/components/assistant-ui/elements/tools-approvals/ApprovalCard.md +96 -0
  377. package/llms/components/assistant-ui/elements/tools-approvals/ComputerUse.md +58 -0
  378. package/llms/components/assistant-ui/elements/tools-approvals/GuardrailNotice.md +78 -0
  379. package/llms/components/assistant-ui/elements/tools-approvals/McpServerPanel.md +73 -0
  380. package/llms/components/assistant-ui/elements/tools-approvals/PermissionGrant.md +104 -0
  381. package/llms/components/assistant-ui/elements/tools-approvals/ToolCall.md +81 -0
  382. package/llms/components/assistant-ui/elements/tools-approvals/ToolError.md +89 -0
  383. package/llms/components/assistant-ui/elements/tools-approvals/ToolGroup.md +101 -0
  384. package/llms/components/assistant-ui/elements/tools-approvals/ToolTimeline.md +87 -0
  385. package/llms/components/assistant-ui/native/agents-tasks/AgentStatus.md +87 -0
  386. package/llms/components/assistant-ui/native/agents-tasks/TaskCard.md +111 -0
  387. package/llms/components/assistant-ui/native/agents-tasks/TaskGroup.md +82 -0
  388. package/llms/components/assistant-ui/native/agents-tasks/TaskTray.md +66 -0
  389. package/llms/components/assistant-ui/native/code-diffs/SyntaxHighlighter.md +48 -0
  390. package/llms/components/assistant-ui/native/composer/AttachmentPreview.md +58 -0
  391. package/llms/components/assistant-ui/native/composer/ComposerTriggerPopover.md +42 -0
  392. package/llms/components/assistant-ui/native/composer/FollowupSuggestionsRow.md +36 -0
  393. package/llms/components/assistant-ui/native/context/ContextDisplay.md +42 -0
  394. package/llms/components/assistant-ui/native/context/ContextDisplayBar.md +52 -0
  395. package/llms/components/assistant-ui/native/context/ContextDisplayRing.md +52 -0
  396. package/llms/components/assistant-ui/native/context/ContextDisplayRoot.md +42 -0
  397. package/llms/components/assistant-ui/native/context/ContextDisplayRuntimeRoot.md +42 -0
  398. package/llms/components/assistant-ui/native/context/ContextDisplayText.md +52 -0
  399. package/llms/components/assistant-ui/native/conversations/AssistantModal.md +60 -0
  400. package/llms/components/assistant-ui/native/conversations/AssistantSidebar.md +44 -0
  401. package/llms/components/assistant-ui/native/conversations/ConversationMapAui.md +50 -0
  402. package/llms/components/assistant-ui/native/conversations/MessageTiming.md +83 -0
  403. package/llms/components/assistant-ui/native/conversations/QuoteBlock.md +34 -0
  404. package/llms/components/assistant-ui/native/conversations/SelectionToolbar.md +53 -0
  405. package/llms/components/assistant-ui/native/conversations/Thread.md +144 -0
  406. package/llms/components/assistant-ui/native/conversations/ThreadList.md +67 -0
  407. package/llms/components/assistant-ui/native/conversations/ThreadListSidebar.md +45 -0
  408. package/llms/components/assistant-ui/native/data-visualization/MermaidDiagram.md +34 -0
  409. package/llms/components/assistant-ui/native/media-voice/VoiceConnectButton.md +69 -0
  410. package/llms/components/assistant-ui/native/media-voice/VoiceControl.md +52 -0
  411. package/llms/components/assistant-ui/native/media-voice/VoiceConversation.md +64 -0
  412. package/llms/components/assistant-ui/native/media-voice/VoiceDisconnectButton.md +53 -0
  413. package/llms/components/assistant-ui/native/media-voice/VoiceMuteButton.md +59 -0
  414. package/llms/components/assistant-ui/native/media-voice/VoiceOrb.md +66 -0
  415. package/llms/components/assistant-ui/native/media-voice/VoiceStatusDot.md +58 -0
  416. package/llms/components/assistant-ui/native/models/ModelSelector.md +50 -0
  417. package/llms/components/assistant-ui/native/reasoning/Reasoning.md +87 -0
  418. package/llms/components/assistant-ui/native/sources-research/Sources.md +145 -0
  419. package/llms/components/assistant-ui/native/text-formatting/DirectiveText.md +42 -0
  420. package/llms/components/assistant-ui/native/tools-approvals/McpConfigDialog.md +54 -0
  421. package/llms/components/assistant-ui/native/tools-approvals/ToolFallbackApproval.md +352 -0
  422. package/llms/components/assistant-ui/native/tools-approvals/ToolFallbackRoot.md +84 -0
  423. package/llms/components/assistant-ui/native/tools-approvals/ToolGroup.md +63 -0
  424. package/llms/components/data-display/Avatar.md +254 -0
  425. package/llms/components/data-display/Badge.md +221 -0
  426. package/llms/components/data-display/Carousel.md +465 -0
  427. package/llms/components/data-display/Chart.md +546 -0
  428. package/llms/components/data-display/Item.md +502 -0
  429. package/llms/components/data-display/JsonViewer.md +38 -0
  430. package/llms/components/data-display/Kbd.md +99 -0
  431. package/llms/components/data-display/Table.md +254 -0
  432. package/llms/components/data-display/VirtualTable.md +57 -0
  433. package/llms/components/dates/Calendar.md +539 -0
  434. package/llms/components/dates/PersianCalendar.md +117 -0
  435. package/llms/components/drag-drop/DragDropPreview.md +46 -0
  436. package/llms/components/drag-drop/DragDropProvider.md +28 -0
  437. package/llms/components/feedback/Alert.md +117 -0
  438. package/llms/components/feedback/Empty.md +193 -0
  439. package/llms/components/feedback/EmptyState.md +38 -0
  440. package/llms/components/feedback/PageMessage.md +49 -0
  441. package/llms/components/feedback/Progress.md +140 -0
  442. package/llms/components/feedback/Skeleton.md +157 -0
  443. package/llms/components/feedback/Sonner.md +325 -0
  444. package/llms/components/feedback/Spinner.md +119 -0
  445. package/llms/components/feedback/Toast.md +242 -0
  446. package/llms/components/forms/Checkbox.md +204 -0
  447. package/llms/components/forms/Combobox.md +594 -0
  448. package/llms/components/forms/Field.md +511 -0
  449. package/llms/components/forms/ImagePicker.md +63 -0
  450. package/llms/components/forms/InlineEdit.md +67 -0
  451. package/llms/components/forms/Input.md +380 -0
  452. package/llms/components/forms/InputGroup.md +628 -0
  453. package/llms/components/forms/InputOTP.md +400 -0
  454. package/llms/components/forms/Label.md +181 -0
  455. package/llms/components/forms/NativeSelect.md +128 -0
  456. package/llms/components/forms/Questionnaire.md +267 -0
  457. package/llms/components/forms/RadioGroup.md +401 -0
  458. package/llms/components/forms/Select.md +575 -0
  459. package/llms/components/forms/Slider.md +234 -0
  460. package/llms/components/forms/StarRating.md +60 -0
  461. package/llms/components/forms/Switch.md +240 -0
  462. package/llms/components/forms/Textarea.md +219 -0
  463. package/llms/components/layout/Accordion.md +249 -0
  464. package/llms/components/layout/AspectRatio.md +68 -0
  465. package/llms/components/layout/Card.md +391 -0
  466. package/llms/components/layout/Collapsible.md +231 -0
  467. package/llms/components/layout/Resizable.md +267 -0
  468. package/llms/components/layout/ScrollArea.md +170 -0
  469. package/llms/components/layout/Separator.md +104 -0
  470. package/llms/components/layout/SplitView.md +92 -0
  471. package/llms/components/messaging/Attachment.md +324 -0
  472. package/llms/components/messaging/Bubble.md +411 -0
  473. package/llms/components/messaging/Marker.md +203 -0
  474. package/llms/components/messaging/Message.md +268 -0
  475. package/llms/components/messaging/MessageScroller.md +227 -0
  476. package/llms/components/navigation/Breadcrumb.md +159 -0
  477. package/llms/components/navigation/Command.md +471 -0
  478. package/llms/components/navigation/ContextMenu.md +596 -0
  479. package/llms/components/navigation/DropdownMenu.md +602 -0
  480. package/llms/components/navigation/Menubar.md +397 -0
  481. package/llms/components/navigation/NavigationMenu.md +379 -0
  482. package/llms/components/navigation/Pagination.md +222 -0
  483. package/llms/components/navigation/Sidebar.md +330 -0
  484. package/llms/components/navigation/Tabs.md +418 -0
  485. package/llms/components/overlays/AlertDialog.md +365 -0
  486. package/llms/components/overlays/ConfirmationDialog.md +77 -0
  487. package/llms/components/overlays/Dialog.md +559 -0
  488. package/llms/components/overlays/Drawer.md +597 -0
  489. package/llms/components/overlays/HoverCard.md +276 -0
  490. package/llms/components/overlays/Popover.md +286 -0
  491. package/llms/components/overlays/Sheet.md +433 -0
  492. package/llms/components/overlays/Tooltip.md +318 -0
  493. package/llms/components/providers/DensityProvider.md +171 -0
  494. package/llms/components/providers/DirectionProvider.md +39 -0
  495. package/llms/components/providers/PortalProvider.md +264 -0
  496. package/llms/components/providers/ScrollGuard.md +24 -0
  497. package/llms/components/providers/ThemeProvider.md +71 -0
  498. package/llms/setup.md +380 -0
  499. package/llms.txt +428 -0
  500. package/package.json +8 -5
  501. package/dist/chunk-czg9p52v.js +0 -74
  502. package/dist/chunk-fqekyjkh.js +0 -65
package/llms/setup.md ADDED
@@ -0,0 +1,380 @@
1
+ > [!IMPORTANT]
2
+ > **AI agents:** Before using this package, run the following command from the consuming project and read the linked setup and component documentation:
3
+ >
4
+ > ```sh
5
+ > cat node_modules/@alexgorbatchev/shadcn/llms.txt
6
+ > ```
7
+ >
8
+ > Resolve the index's relative links from `node_modules/@alexgorbatchev/shadcn/`.
9
+
10
+ `@alexgorbatchev/shadcn` is a standalone React component library for Bun applications that need the sharp, monospace devhost design language. Install it as an npm-compatible package and explore its components in the local interactive Storybook catalog. Consuming apps do not depend on the devhost project.
11
+
12
+ # What It Does
13
+
14
+ - **Consistent controls**: Provides buttons, forms, selections, navigation, overlays, and loading states.
15
+ - **Two densities**: Offers compact 20px controls and comfortable 28px controls, with provider and component overrides.
16
+ - **Theme choices**: Supports light, dark, and system preference, with customizable accent colors and fonts.
17
+ - **Interactive reference**: Shows component variants and states in Storybook with editable controls and source examples.
18
+
19
+ # How It Works
20
+
21
+ 1. Install the package in a Bun React project and import its theme into your Tailwind stylesheet.
22
+ 2. Wrap the app in a theme provider and a density provider, then compose the exported components.
23
+ 3. Open the local Storybook catalog to explore components, switch palettes and densities, and inspect examples.
24
+
25
+ # How it Really Works
26
+
27
+ 1. The stylesheet supplies semantic tokens and base body styling. Your Tailwind build scans the installed package to generate component utilities. Font loading is optional; importing `fonts.css` serves JetBrains Mono through your app's asset pipeline.
28
+ 2. Theme preference persists in browser local storage, and system mode follows the operating system color preference. The theme provider sets `data-theme` and `color-scheme` on the document root, so dialogs and menus share that palette. Use one provider per document. Density also follows components into their portals. A component's `density` prop overrides its own presentation; nest a `DensityProvider` to change a subtree and its popups together. A provider declares every density token, so its subtree keeps its density whatever an ancestor or a host page declares. It renders a `div` by default; pass `render`, such as `render={<section aria-label="Tools" className="flex gap-2" />}`, to make your own element the density root instead of adding a wrapper. `useTheme()` throws outside `ThemeProvider`.
29
+ 3. Storybook's Theme and Density toolbars change the component examples. Docs backgrounds and example frames follow the selected palette; the preview starts in dark mode with comfortable density.
30
+
31
+ # Prerequisites
32
+
33
+ - [Bun](https://bun.com/docs), validated with 1.4.2.
34
+ - [React](https://react.dev) and React DOM 19.3, as specified by the package peer dependencies.
35
+ - [Tailwind CSS](https://tailwindcss.com/docs/installation) v4; the consumer build must process the imported theme.
36
+
37
+ The package targets client-rendered Bun React applications.
38
+
39
+ # Installation
40
+
41
+ Install the package in a consuming project:
42
+
43
+ ```sh
44
+ bun add @alexgorbatchev/shadcn
45
+ ```
46
+
47
+ Package preparation and contributor commands are documented in [AGENTS.md](https://github.com/alexgorbatchev/shadcn/blob/main/AGENTS.md#commands).
48
+
49
+ ## Optional features
50
+
51
+ Import shared controls and providers from `@alexgorbatchev/shadcn`. Import the following features from their dedicated entry points and install only the peers you use. These features, their hooks, and their types are not exported from the package root.
52
+
53
+ | Import path suffix | Components | Install alongside the package |
54
+ | ------------------- | ------------------------------------------------------- | ------------------------------------------------------------- |
55
+ | `/chart` | Chart components, ChartStyle, useChart, and chart types | `bun add recharts@3.8.0 cssesc@3.0.0 es-toolkit@1.52.0` |
56
+ | `/calendar` | Calendar, CalendarDayButton | `bun add @daypicker/react@^10.0.2` |
57
+ | `/persian-calendar` | PersianCalendar | `bun add @daypicker/persian@^10.0.2 @daypicker/react@^10.0.2` |
58
+ | `/carousel` | Carousel components, useCarousel, and carousel types | `bun add embla-carousel-react@^8.6.0` |
59
+ | `/command` | Command components, including CommandDialog | `bun add cmdk@^1.1.1` |
60
+ | `/resizable` | Resizable components and SplitView | `bun add react-resizable-panels@^4.14.3` |
61
+ | `/fonts.css` | JetBrains Mono font stylesheet | `bun add @fontsource-variable/jetbrains-mono@^5.3.0` |
62
+ | `/sonner` | Sonner, SonnerToaster, Toaster, toast, useSonner | No additional install; patched implementation is bundled |
63
+ | `/input-otp` | InputOTP components | No additional install; patched implementation is bundled |
64
+ | `/virtual-table` | VirtualTable and row measurement props | `@tanstack/react-virtual@3.14.13` |
65
+ | `/message-scroller` | MessageScroller components, hooks, and types | No additional install; patched implementation is bundled |
66
+ | `/questionnaire` | Questionnaire components and types | No additional install; patched implementation is bundled |
67
+
68
+ For example:
69
+
70
+ ```tsx
71
+ import { Button, DensityProvider } from "@alexgorbatchev/shadcn";
72
+ import { ChartContainer, type ChartConfig } from "@alexgorbatchev/shadcn/chart";
73
+ import { Carousel, CarouselContent, CarouselItem } from "@alexgorbatchev/shadcn/carousel";
74
+ ```
75
+
76
+ The patched `sonner`, `input-otp`, and `@shadcn/react` packages remain regular dependencies pending upstream fixes. `@base-ui/utils` is a regular dependency at the exact version `@base-ui/react` requires, so the portal components share Base UI's own ref merging without installing a second copy. Other feature dependencies are optional peers, so a core-only installation does not request them. Shared providers work across entry points.
77
+
78
+ The optional assistant-ui catalog provides presentational families under `/assistant-ui/<family>` and runtime adapters under `/assistant-ui/native/<family>`. For example, import `ApprovalCard` from `@alexgorbatchev/shadcn/assistant-ui/approval-card`. Add `@alexgorbatchev/shadcn/assistant-ui.css` to your stylesheet. Native threads require an actual assistant-ui runtime and the selected family's optional peers. See the [assistant-ui reference](https://github.com/alexgorbatchev/shadcn/blob/main/docs/internal/assistant-ui.md) for imports, dependency-bearing styles, source inventory, and the SelectionToolbar isolation limitation.
79
+
80
+ For embedded surfaces, import `PortalProvider` from the package root and pass the real overlay `container`. Dialogs, alerts, sheets, drawers, menus, navigation popups, comboboxes, selects, hover cards, tooltips, popovers, and Base UI toasts inherit that container. The container applies to the outermost popup: a popup opened inside another one, such as a select in a dialog, renders inside that popup's portal, where a modal dialog counts it as inside the dialog and keeps it reachable by assistive technology and the pointer. Native portal props can still supply an explicit container override.
81
+
82
+ # Quick Start
83
+
84
+ For Bun's native HTML server, install its Tailwind plugin:
85
+
86
+ ```sh
87
+ bun add -d tailwindcss bun-plugin-tailwind
88
+ ```
89
+
90
+ The stylesheet example below also uses the optional font:
91
+
92
+ ```sh
93
+ bun add @fontsource-variable/jetbrains-mono@^5.3.0
94
+ ```
95
+
96
+ Register the plugin in your app's `bunfig.toml`:
97
+
98
+ ```toml
99
+ [serve.static]
100
+ plugins = ["bun-plugin-tailwind"]
101
+ ```
102
+
103
+ In `src/styles.css`, import the theme after Tailwind and explicitly scan the installed package. The `@source` path is relative to this stylesheet; Tailwind excludes `node_modules` from automatic scanning. See [Tailwind source detection](https://tailwindcss.com/docs/detecting-classes-in-source-files#explicitly-registering-sources).
104
+
105
+ ```css
106
+ @import "tailwindcss";
107
+ @import "@alexgorbatchev/shadcn/theme.css";
108
+ @import "@alexgorbatchev/shadcn/fonts.css";
109
+ @source "../node_modules/@alexgorbatchev/shadcn/dist";
110
+ ```
111
+
112
+ Omit the `fonts.css` import if your app supplies its own font. Bun's plugin registration is documented in [HTML and static sites](https://bun.com/docs/bundler/html-static#tailwind-css).
113
+
114
+ The theme sets `body { position: relative; }`. Preserve a positioned body when overriding global styles: Drawer's absolute Safari backdrop needs it to cover a scrolled page. See the [Base UI Safari setup](https://base-ui.com/react/overview/quick-start#ios-26-safari).
115
+
116
+ Give your application root `isolation: isolate` so page stacking levels stay below portaled menus and dialogs. For example, add `#root { isolation: isolate; }` to the stylesheet when mounting React into `#root`. SidebarProvider also isolates its own layout. See [Base UI portal setup](https://base-ui.com/react/overview/quick-start#portals).
117
+
118
+ Import that stylesheet from your app entry, then render:
119
+
120
+ ```tsx
121
+ import { useState, type ReactElement } from "react";
122
+ import { Button, DensityProvider, ThemeProvider } from "@alexgorbatchev/shadcn";
123
+ import "./styles.css";
124
+
125
+ export function App(): ReactElement {
126
+ const [count, setCount] = useState(0);
127
+ return (
128
+ <ThemeProvider defaultTheme="system">
129
+ <DensityProvider density="comfortable">
130
+ <Button onClick={() => setCount(count + 1)}>Clicked {count} times</Button>
131
+ <Button density="compact" variant="outline">
132
+ Compact action
133
+ </Button>
134
+ </DensityProvider>
135
+ </ThemeProvider>
136
+ );
137
+ }
138
+ ```
139
+
140
+ For a Vite consumer, install the maintained React and Tailwind plugins:
141
+
142
+ ```sh
143
+ bun add -d vite @vitejs/plugin-react @tailwindcss/vite tailwindcss
144
+ ```
145
+
146
+ Use this `vite.config.ts`, with the same stylesheet imports and `@source` declaration above:
147
+
148
+ ```ts
149
+ import { defineConfig } from "vite";
150
+ import react from "@vitejs/plugin-react";
151
+ import tailwindcss from "@tailwindcss/vite";
152
+
153
+ export default defineConfig({
154
+ plugins: [react(), tailwindcss()],
155
+ });
156
+ ```
157
+
158
+ An independent production Vite consumer installed from the archive verifies RTL grouped corners, tab markers, and portaled controls with `lang="en"`. Bun’s native CSS pipeline has the logical-property limitation described below. See the [Tailwind Vite integration](https://tailwindcss.com/docs/installation/using-vite).
159
+
160
+ # Configuration
161
+
162
+ | Option | Type | Default | Description |
163
+ | :--------------------------- | :------------------------------ | :------------------------------ | :--------------------------------------------------------------------- |
164
+ | `ThemeProvider.defaultTheme` | `"light" \| "dark" \| "system"` | `"system"` | Initial preference when storage has no saved value. |
165
+ | `ThemeProvider.storageKey` | `string` | `"shadcn-alexgorbatchev-theme"` | Local storage key for the preference. |
166
+ | `ThemeProvider.forcedTheme` | `"light" \| "dark"` | unset | Overrides the displayed palette without changing the saved preference. |
167
+ | `DensityProvider.density` | `"compact" \| "comfortable"` | `"comfortable"` | Density for descendants and their portals. |
168
+ | Component `density` | `"compact" \| "comfortable"` | inherited | Local override on styled components that expose the prop. |
169
+
170
+ `useTheme()` returns `theme`, `resolvedTheme`, and `setTheme`. Call `setTheme("light")`, `setTheme("dark")`, or `setTheme("system")` from a component inside the provider.
171
+
172
+ Override tokens after the theme imports. This example uses the existing success palette as the primary accent:
173
+
174
+ ```css
175
+ :root,
176
+ [data-theme="light"],
177
+ [data-theme="dark"] {
178
+ --ag-font: ui-sans-serif, system-ui, sans-serif;
179
+ --primary: var(--success);
180
+ --primary-foreground: var(--success-foreground);
181
+ --ring: var(--success);
182
+ }
183
+ ```
184
+
185
+ # LLM Documentation
186
+
187
+ Storybook serves a generated `llms.txt` index at its site root, with linked setup instructions and a reference page for each story file. Pages contain public package imports, documented story controls, default args, and Storybook CSF examples with interaction tests omitted. The excerpts can depend on local helpers and fixtures; each page links to its full source. Story controls describe the configured controls, rather than the complete TypeScript props API.
188
+
189
+ The npm package includes the same index at `llms.txt` in its root and its linked pages under `llms/`. Package and Storybook builds regenerate these files from the public exports, README, and story catalog.
190
+
191
+ # Component Catalog
192
+
193
+ | Area | Components |
194
+ | :----------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
195
+ | Actions and status | Alert, Badge, Button, ButtonGroup, ButtonLink, Sonner, Toast, Toggle, ToggleGroup |
196
+ | Forms and selections | Calendar, Checkbox, Combobox, Command, Field, Input, InputGroup, InputOTP, Label, NativeSelect, Questionnaire, RadioGroup, Select, Slider, Switch, Textarea |
197
+ | Structure and navigation | Accordion, AspectRatio, Avatar, Breadcrumb, Card, Carousel, Chart, Collapsible, Empty, Item, Kbd, Menubar, NavigationMenu, Pagination, Resizable, ScrollArea, Separator, Sidebar, Table, Tabs |
198
+ | Overlays | AlertDialog, ContextMenu, Dialog, Drawer, DropdownMenu, HoverCard, Popover, Sheet, Tooltip |
199
+ | Loading | Progress, Skeleton, Spinner |
200
+ | Conversations | Attachment, Bubble, Marker, Message, MessageScroller |
201
+ | App configuration | DensityProvider, DirectionProvider, ThemeProvider |
202
+
203
+ Use the composed parts exported from the package root, such as `DialogTrigger`, `DialogContent`, and `DialogTitle`. Storybook provides working compositions, variants, disabled states, and action callbacks. The local preview starts with `bun run storybook` and binds to `127.0.0.1:6006`.
204
+
205
+ `ScrollArea` supplies a native scroll viewport and one vertical `ScrollBar` by default. Set `scrollbars={<ScrollBar orientation="horizontal" />}` for a wide horizontal layout, or supply a fragment containing vertical and horizontal parts for both axes. The tracks stay outside the viewport and reserve their shared corner. `keepMounted` belongs to `ScrollBar`; root and track className callbacks receive native overflow/scroll state. Focus the viewport for native keyboard scrolling.
206
+
207
+ Scrolling is intentional: cards, panels, dialogs, sheets, and floating surfaces carry `data-scroll="none"`. Put long content in a nested `ScrollArea` or an explicitly styled native scroll viewport; the outer surface stays stationary. `DialogContent` bounds its height to the viewport and uses a flex column, so give a nested `ScrollArea` `className="min-h-0"` to let it shrink within the dialog. Headers and footers stay outside that scroll area when they need to remain visible.
208
+
209
+ `ThemeProvider` mounts the development-only `ScrollGuard`. Without a theme provider, mount `<ScrollGuard />` once in your app. Add `data-scroll="none"` to any HTML element to apply the same check. The guard throws a browser error identifying the element, axis, and scroll range when computed `overflow: auto` or `scroll` permits overflowing content to scroll. It checks the marked element itself, including portaled elements in the same document, after content and size changes; nested scroll viewports remain independent. Hidden and clipped overflow do not trigger it. Duplicate mounts share one observer per document, and the final unmount disconnects it. Pass `ownerDocument` to check an iframe's document; shadow roots require their own layout validation. The guard installs no observers when the consuming application's `NODE_ENV` is `"production"`.
210
+
211
+ `ButtonLink` renders a native anchor with Button's `variant`, `size`, `align`, `truncate`, `fullWidth`, and `density` options, so navigation keeps the link role, Enter activation, and browser link behavior without `role="button"`. Pass `href` for a plain link, or a router link element through `render`, such as `<ButtonLink variant="outline" render={<Link to="/settings" />}>Settings</ButtonLink>`; class names, children, handlers, and refs merge with the rendered element. Its render callback receives typed slot and density state. Mark icons with `data-icon="inline-start"` or `data-icon="inline-end"` as in Button. Use `Button` for actions that do not navigate.
212
+
213
+ `Badge` renders a span by default. Use `render={<a href="https://base-ui.com/" />}` for navigation or a native button for actions; handlers and refs merge with the rendered element. Its render callback receives typed variant, density, and slot state. Mark icons with `data-icon="inline-start"` or `data-icon="inline-end"`; their spacing follows inline direction. Use the success and warning variants for those statuses.
214
+
215
+ Compose `CardHeader`, `CardTitle`, `CardDescription`, `CardAction`, `CardContent`, and `CardFooter` inside `Card`. Use a native heading inside `CardTitle` when the title belongs in the document outline. The `size="sm"` option reduces spacing; density controls the base inset. A leading image meets the frame without top padding, and cards without footers retain bottom padding. The `--card-spacing` CSS variable adjusts both section gaps and insets.
216
+
217
+ `Label` retains native explicit and implicit associations and refs. Connect it to an input with `htmlFor` and the input's `id`, or wrap the input. Prefer `FieldLabel` in Field compositions. For disabled styling, mark a wrapper with `className="group"` and `data-disabled="true"`, or mark a preceding disabled control with `className="peer"`. `Skeleton` supplies a visual placeholder and respects reduced-motion preference; your loading region owns status announcements and `aria-busy`, and replaces placeholders when content arrives.
218
+
219
+ Compose forms with `FieldGroup`, `Field`, labels, descriptions, and `FieldError`. The Field catalog demonstrates React Hook Form controllers with Zod validation, invalid-field focus, submission, and reset. To use that example, install `react-hook-form@7.89.0`, `@hookform/resolvers@5.9.1`, and `zod@4.6.5` in your app. These are optional example dependencies. The example uses `noValidate` to demonstrate schema errors; choose your app's browser-validation policy explicitly. `FieldError` deduplicates messages and omits alerts when the errors contain no nonempty messages. See the [official form guide](https://ui.shadcn.com/docs/forms/react-hook-form).
220
+
221
+ `Input` exposes Base UI's native props, including `onValueChange`, state-based className/style callbacks, `render`, and refs. `Textarea` uses native HTML textarea props and `onChange`; its content sizing grows and shrinks with text. Both support browser form submission, validation, disabled/read-only states, and uncontrolled reset. Restore controlled values through your form's reset handler. Input's field-state callbacks require Base UI's native Field context; the styled `Field` composition is an HTML layout.
222
+
223
+ Compose grouped controls with InputGroupInput or InputGroupTextarea, then place InputGroupAddon after the control in the DOM. Its align prop positions content at inline-start/end or block-start/end. Clicking addon text focuses the control; caller click handlers still run, and preventDefault cancels that focus. Links and buttons retain their own focus. InputGroupInput preserves Input’s native props and callbacks; InputGroupButton preserves Button’s native callbacks and defaults to type="button". Set type="submit" or type="reset" explicitly for form actions. Small text/icon actions fit the group frame in both densities. See the [official Input Group guide](https://ui.shadcn.com/docs/components/base/input-group).
224
+
225
+ `Checkbox` and `Switch` support controlled `checked`/`onCheckedChange`, initial `defaultChecked`, read-only and disabled states, cancellable changes, and state-based className callbacks. Named controls submit through their native hidden inputs; `uncheckedValue` supplies an explicit off value. For forms with reset actions, own the checked state and restore it in the form's `onReset` handler or through your form library. Base UI 1.9.0's uncontrolled Checkbox and Switch retain their rendered checked state on native form reset while their hidden inputs reset, so submitted values can disagree with the visible controls. The Switch thumb follows inline direction and stays inside its track in both sizes.
226
+
227
+ `RadioGroup` uses `value`/`onValueChange` for controlled selection and `defaultValue` for initial selection. Name the group and each option; use `FieldSet`/`FieldLegend` and `Field`/`FieldLabel` for visible labels. Arrow keys select options and skip disabled items; Space selects a focused option. Both the group and `RadioGroupItem` preserve native state-based className and style callbacks. Use `nativeButton` with `render={<button type="button" />}` for sibling labels on button-rendered items. `name`, `required`, and `form` connect selection to browser form submission and validation, including an external form. The required-form story restores controlled selection through `onReset`.
228
+
229
+ `Select` supports single, multiple, and object values through its native generic props. Pass `items` to display labels instead of raw values; provide object comparison and serialization through `isItemEqualToValue` and `itemToStringValue`. Disabled options remain focusable while rejecting selection. Read-only selection permits browsing and blocks value changes. The composed parts preserve state-based className callbacks, and portaled content follows density and DirectionProvider context. Named multiple selects submit repeated form entries. Restore controlled values in your form's reset handler. Bun-built RTL menus currently place the selection checkmark on the wrong side; verify that layout in consuming apps. See the [Base UI Select reference](https://base-ui.com/react/components/select).
230
+
231
+ `Combobox` retains native filtering, single/multiple selection, cancellation, controlled values, object identity comparison, and keyboard focus. Give its input an accessible name; an input inside the popup uses a named trigger. `ComboboxInput.className` belongs to the native input and accepts its state callback; use `frameClassName` for the surrounding InputGroup. Built-in controls use “Open popup” and “Clear selection”; customize them with `triggerLabel` and `clearLabel`. Chips use density metrics, and their removal button is named “Remove item”. Keep `ComboboxEmpty` mounted so its polite live region can announce results. In grouped lists, pass `items={group.items}` to each `ComboboxGroup`. Popup density and direction follow their providers, including through portals; reduced motion disables popup animations. See the [Base UI Combobox reference](https://base-ui.com/react/components/combobox).
232
+
233
+ `Slider` preserves scalar, mutable-array, and readonly-array value types and callbacks. Use `getAriaLabel` to name each thumb and `getAriaValueText` for custom spoken values. Vertical sliders accept an explicit height; `step`, `largeStep`, `minStepsBetweenValues`, and `format` retain native behavior. Named ranges submit a repeated entry for each thumb. Restore controlled values through your form's reset handler. See the [Base UI Slider reference](https://base-ui.com/react/components/slider).
234
+
235
+ `Dialog` traps keyboard focus by default, closes on Escape or an outside press, and restores focus when dismissed. Set `disablePointerDismissal` to block outside dismissal. `modal={false}` permits outside interaction and closes when focus leaves; `modal="trap-focus"` preserves Tab cycling while permitting outside pointer interaction. `AlertDialog` blocks outside dismissal; Escape and Cancel request closing. `AlertDialogAction` is a button: your app controls confirmation and closing. Use native `initialFocus` and `finalFocus` refs for custom focus targets. Both compositions preserve typed trigger payloads, state-based className callbacks, native render/ref behavior, density/direction in portals, and reduced-motion preference. Bun-built RTL Dialog close icons currently remain on the right; verify their placement in consuming apps. See the [Dialog](https://base-ui.com/react/components/dialog) and [Alert Dialog](https://base-ui.com/react/components/alert-dialog) references.
236
+
237
+ `Tabs` supports horizontal and vertical layouts. Its default keyboard behavior moves focus with arrow keys and activates with Enter or Space; `TabsList activateOnFocus` activates as focus moves. Disabled tabs remain focusable and reject activation. `TabsContent keepMounted` preserves panel inputs while hidden. Uncontrolled selection falls back when the active tab is removed or disabled. `Accordion` uses an array of expanded values, with `multiple` for independent panels. Its disabled native button triggers are skipped by Tab, as are disabled Collapsible triggers; enabled Accordion headings remain in the Tab order. Native className callbacks are preserved throughout both compositions, and AccordionContent applies its className to the native panel. Panel height follows dynamic content and reduced-motion preference. The current Bun consumer renders a vertical RTL line-tab marker on the wrong side; the same story passes under Storybook's Vite pipeline, so inspect RTL marker placement in Bun-built apps.
238
+
239
+ Compose a date picker from `Popover`, `Button`, and `Calendar`. The Calendar catalog demonstrates selection with popup dismissal and focus restoration, ranges, birth-date dropdowns, presets, a native time input, and editable date inputs. Input examples use `chrono-node` for strict dates or natural-language phrases such as “tomorrow”; install that dependency in apps using those examples. Invalid or cleared text clears the selected date. ArrowDown opens the calendar, and dismissal restores input focus. Keep the selected date in your app's state; there is no separate `DatePicker` export. See the [official date picker guide](https://ui.shadcn.com/docs/components/base/date-picker).
240
+
241
+ For rendered HTML or Markdown output, import `@alexgorbatchev/shadcn/typeset.css` after Tailwind and the package theme, then wrap the content in a native element with `className="typeset"`. Text follows its container's font size, document palette, and density leading. Set `--typeset-size`, `--typeset-leading`, and `--typeset-flow` in your own preset to tune reading rhythm. Your layout owns the content width. Add `not-typeset` or `data-not-typeset` to keep embedded UI and nested containers outside the prose styles. Wide tables can use a named, keyboard-focusable `typeset-scroll` wrapper; bare tables retain table semantics and wrap to fit. The Storybook Typeset composition page demonstrates these contracts. See the [official Typeset guide](https://ui.shadcn.com/docs/typeset).
242
+
243
+ Compose data tables with the exported Table parts and `@tanstack/react-table@9.2.8`, installed directly in your app. `Table dir="rtl"` sets both column direction and the overflow container's reading edge; headers align to the inline start. The Table catalog demonstrates TanStack v9's native `useTable` with sorting, filtering, pagination, column visibility, selection across pages, and row actions that copy invoice IDs or open invoice details. Pass the checkbox's original event to the row-selection handler to retain Shift range selection. There is no separate `DataTable` export. Both the [TanStack v9 quick start](https://tanstack.com/table/latest/docs/framework/react/quick-start) and [shadcn composition guide](https://ui.shadcn.com/docs/components/base/data-table) use the v9 API.
244
+
245
+ Compose `Sidebar` and `SidebarInset` inside `SidebarProvider`. Use Header, Content, Group, Menu, and Footer parts to organize navigation, and `SidebarTrigger` or `SidebarRail` to toggle it. `useSidebar` exposes desktop and mobile state. Desktop collapse supports `offcanvas`, `icon`, and `none`; the mobile panel uses a titled Sheet with Escape dismissal and focus restoration. Menu buttons accept native custom elements through `render`; use anchors for navigation and keep their accessible text when collapsed. Cmd/Ctrl+B toggles the sidebar while focus is inside its provider. Set `open`/`onOpenChange` for controlled desktop state, or observe changes without supplying `open`. Persist changes in your application through `onOpenChange`, and restore them through `defaultOpen` or controlled `open`. Set widths through the typed `SidebarStyle` variables `--sidebar-width`, `--sidebar-width-mobile`, and `--sidebar-width-icon`. Sidebar colors follow the palette of the subtree they render in; set `--sidebar`, `--sidebar-foreground`, `--sidebar-primary`, `--sidebar-primary-foreground`, `--sidebar-accent`, `--sidebar-accent-foreground`, `--sidebar-border`, or `--sidebar-ring` to give the sidebar its own colors.
246
+
247
+ `InputOTP` uses one real input for typing, selection, paste, and autofill. Compose its visual slots inside `InputOTPGroup`; supply `maxLength` and an accessible label. Use `defaultValue` to initialize an uncontrolled code, or `value` and `onChange` to control it. Changing `defaultValue` after mounting preserves the current input. Import the OTP parts together from `@alexgorbatchev/shadcn/input-otp`; its bundled implementation owns their context. `Calendar` supports single, multiple, and range selection. `ResizablePanelGroup` sizes use explicit percentage strings such as `defaultSize="50%"`; numeric sizes are pixels. `CommandDialog` supplies the modal title and description; set `Command`'s `label` to name its search input.
248
+
249
+ Use the Theme toolbar to select light, dark, or system palettes; Docs and example frames follow that selection. Local and routed previews can run on separate ports with independent dependency caches. Reload an open preview after restarting it on a different port.
250
+
251
+ `Carousel` supports horizontal, vertical, and right-to-left navigation. Focus its named region to use the arrow keys; arrow keys inside slide inputs retain their input behavior. Supply `opts` and `plugins` for carousel configuration, and `setApi` to receive its API. Reduced-motion preference disables programmatic slide animation.
252
+
253
+ Compose `ChartContainer`, `ChartTooltip`, and `ChartLegend` with Recharts components. Import the chart parts from `@alexgorbatchev/shadcn/chart` and install its peers listed above. Give the container a height or aspect ratio; `ChartConfig` supplies series labels, icons, and either one color or light/dark colors. Use semantic values such as `var(--primary)` and keep `accessibilityLayer` enabled for keyboard tooltips. Use `labelKey` and `nameKey` for custom tooltip data, and legend content's `nameKey` for custom legend labels. Keep series selection in application state; the tooltip's `defaultIndex` only sets its initial state.
254
+
255
+ Supply HTML attributes and refs to tooltip or legend content through `htmlProps`; Recharts injects its own chart props into those content components, so those props do not go to the DOM. An `onClick` legend callback renders keyboard-accessible buttons. Omit the tooltip's `portal` prop for native floating positioning; custom portal targets own their positioning through the native `wrapperStyle` API. Tooltip and legend content preserve chart density, direction and configured colors through portals. A container's `dir` overrides DirectionProvider context, and content's `htmlProps.dir` overrides the chart direction. Reverse Recharts' `XAxis` explicitly for RTL data ordering; native keyboard movement follows that axis. See the [Chart guide](https://ui.shadcn.com/docs/components/base/chart).
256
+
257
+ For notifications, mount `Sonner` (also exported as `Toaster` and `SonnerToaster`) inside `ThemeProvider` and call `toast.success("Saved")`. Use one host per document, or give hosts unique `id` values and target them with `toasterId`. `ToastToaster` provides the separate Base UI composition: call `useToastManager()` inside its provider, or create a manager with `createToastManager()` and pass it through `toastManager`. Both compositions provide actions, dismissal, promise feedback, and density overrides. The Base UI manager uses `{ title: "Uploading" }` for promise titles; a plain string sets the description.
258
+
259
+ Sonner inherits `DirectionProvider` and accepts an explicit `dir` override. Use `mobileOffset={{ left: 24, right: 40 }}` for independent mobile margins. To update a notification in place, retain the ID returned by `toast.loading()` and pass it as `id` to `toast.success()` or `toast.error()`. Sonner's `cancel` option accepts `{ label, onClick }` and dismisses the notification after the callback.
260
+
261
+ For Base UI notifications, retain the ID from `manager.add()` and call `manager.update(id, options)`; adding an existing ID updates that notification in place. `onClose` signals dismissal and `onRemove` signals removal after the exit transition. A provider's `limit` keeps older notifications mounted but inactive until space becomes available.
262
+
263
+ Set Sonner's `expand={false}` to show a collapsed stack that expands on hover. Older notification content stays hidden while collapsed; cards retain their width. Per-notification `onAutoClose` and `onDismiss` callbacks receive the notification, including its ID. Native timers pause while hovering the host. Use `toast.custom((id) => ...)` for custom content and `toast.dismiss(id)` from its action.
264
+
265
+ Import `Sonner`, `toast`, and `useSonner` together from `@alexgorbatchev/shadcn/sonner`. The package bundles a patched Sonner 2.0.8 implementation that remeasures open notifications after density changes, preserving their IDs and running timers. A separate direct import from `sonner` uses a different notification store.
266
+
267
+ `Bubble` provides seven visual variants, start/end alignment, grouped replies, and overlapping reactions. Compose interactive content with `BubbleContent render={<button type="button" />}` or a native anchor. Leave extra space between replies with reactions, such as `BubbleGroup className="gap-8"`; layout overrides replace the package's density spacing utilities. `Marker` presents conversation notes, statuses, bordered rows, and labeled dividers. Use `role="status"` for updates, and `render` for native links or buttons. Labeled dividers retain their text semantics; their lines are decorative. Icons in `MarkerIcon` are hidden from assistive technology. Separator labels wrap inside narrow columns; use `className="flex-col"` on Marker to stack its icon above the content.
268
+
269
+ For a Bubble tooltip or popover, keep `BubbleContent` outermost: `render={<TooltipTrigger render={<button type="button" />} />}` or the corresponding `PopoverTrigger`. This preserves the content slot used by Bubble variant styles. Base UI tooltips are visual only; give the trigger an accessible name containing the same information. Put essential error or delivery details in a popover or inline content. See the [native tooltip recommendations](https://base-ui.com/react/components/tooltip#recommendations). `MarkerContent shimmer` animates a pending status and restores static readable text under reduced motion.
270
+
271
+ Compose `MessageAvatar` and `MessageContent` inside `Message`; the content holds an optional `MessageHeader`, a Bubble or other surface, and an optional `MessageFooter`. Set `align="end"` for an outgoing reply. Headers stay at the content's start; surfaces and footers follow alignment. Avatar placement tracks the rendered footer height and spacing, including live density and content changes. `MessageGroup` stacks consecutive replies; an empty `MessageAvatar` reserves alignment space for earlier replies from the same sender.
272
+
273
+ `Attachment` displays file metadata and a caller-controlled state: `idle`, `uploading`, `processing`, `error`, or `done`. It provides three sizes, horizontal or vertical layout, and icon or image media. Uploading and processing titles shimmer; reduced-motion preference leaves static readable text. The exported theme includes the required shimmer and scroll-fade utilities. `AttachmentTrigger` fills the card with a native button or an element supplied through `render`, while `AttachmentAction` remains independently clickable. Give triggers and icon actions accessible labels and include the error reason in `AttachmentDescription`. `AttachmentGroup` provides a snapping scroll row; add `tabIndex={0}`, `role="group"`, and an accessible label when the items have no interactive controls.
274
+
275
+ Place `MessageScroller` inside `MessageScrollerProvider` and a container with a defined height. Wrap every regular transcript row in `MessageScrollerItem` with a stable `messageId`; set `scrollAnchor` for a new turn. The viewport is a named keyboard-scrollable region, and content is a live log for added rows. `defaultScrollPosition` opens at the start, end, or last anchor. Auto-scroll is opt-in; wheel scrolling, scroll keys and pointer interaction release following, and the reader can return with the scroll button. Older rows preserve the current reading position when prepended. The three exported hooks provide commands, available edges, and visible rows/current anchor. Scroll buttons become inert at their target edge and use instant scrolling under reduced-motion preference. Rows use normal layout because the registry's content-visibility optimization makes message jumps and history preservation unstable in the verified browser tests; this package does not claim the upstream optimization's long-transcript performance.
276
+
277
+ For virtualized history, use `MessageScrollerViewport` as the virtualizer's scroll element. Let the virtualizer own row measurement, positioning and indexed jumps; use block content with its total height instead of wrapping virtual rows in `MessageScrollerItem`. The Storybook `VirtualizedHistory` example uses TanStack Virtual with 1,000 rows and expandable content. The application supplies that optional dependency.
278
+
279
+ To animate a sent row, the `AnimatedNewTurn` example uses `motion.create(MessageScrollerItem)` from Motion, preserving its ref, stable `messageId` and `scrollAnchor`. Animate transform and opacity with a tween; keep the streamed reply in a regular row. Anchoring uses the row's layout position, so its entrance translation does not change the target. Disable the entrance when the reader prefers reduced motion. Motion is an optional application dependency; the component package does not import it.
280
+
281
+ Server-rendered transcripts opening at `end` or `last-anchor` remain hidden through `data-pending-scroll` until hydration applies their position; `start` remains visible. Keep the same transcript and opening position on the server and client. The [upstream guide](https://ui.shadcn.com/docs/components/base/message-scroller#avoiding-a-flash-on-reload) also describes an optional application-owned inline script for first-paint `end` positioning; that script is outside this package's verified hydration path.
282
+
283
+ Import the scroller parts and hooks together from `@alexgorbatchev/shadcn/message-scroller`. Its bundled native implementation preserves both caller root refs and the frame's scroll-state attributes; hooks imported directly from a separate `@shadcn/react/message-scroller` module use a different provider context. `scrollToMessage(id)` can queue a permalink before transcript rows mount; a true result means accepted or queued, rather than already visible. After rows mount, an unknown ID returns false. Anchors can mark system events as well as replies. The current-anchor hook retains the most recent anchor that has reached its tracking boundary, even after that row scrolls above the viewport.
284
+
285
+ Bun 1.4.0's CSS bundler lowers logical positioning to language-based selectors. A plain CSS reproduction confirms that `dir="rtl"` with inherited `lang="en"` positions a logical inline-end marker on the wrong side; production CSS contains the same lowering. This affects Bubble reactions and vertical line-tab markers. Direction changes independent of language remain a Bun consumer limitation. The Storybook/Vite build preserves native logical positioning. See [Bun's CSS lowering documentation](https://bun.com/docs/bundler/css#dir-selector).
286
+
287
+ Compose `QuestionnaireItem`, `QuestionnaireTitle`, and answer controls inside `Questionnaire`, which renders a native form. `QuestionnaireChoice` supplies native radios or, with `multiple`, checkboxes; label every `QuestionnaireInput`. Read answers with `FormData.get()` or `getAll()`. `QuestionnaireProgress` and the Previous, Skip, Next, and Submit parts follow the active item. Optional steps need an answer or an explicit skip; observe `onStatusChange` to distinguish skipped answers. Letter and number shortcuts select answers without advancing. Use `item`/`onItemChange` for controlled navigation and `invalid` for external validation. Draft defaults and native reset restore initial answers and navigation. These parts accept density overrides and native render/ref props where supported. See the [upstream composition guide](https://ui.shadcn.com/docs/components/base/questionnaire).
288
+
289
+ # Inline editing and ratings
290
+
291
+ `InlineEdit` mounts an edit session with a controlled `value`, `onValueChange`, `onCommit`, and `onCancel`. Mount it in place of the displayed label. Its input focuses and selects its text by default; `shouldSelectOnMount={false}` preserves the initial caret. Enter or blur commits once, Escape cancels without committing, and asynchronous saves disable the input until completion. Rejected saves display an error and allow retry.
292
+
293
+ `VirtualTable` renders a bounded, dynamically measured set of native table rows using TanStack Virtual. Supply `items`, stable `getItemKey`, `header`, `columnCount`, `label`, and `renderRow`; spread the supplied measurement props onto each native row. Optional `columns` accepts a colgroup. `maxHeight` defaults to `65vh`, `estimateRowHeight` to 80 pixels, and `overscan` to five rows. `retainedKeys` keeps editing rows mounted; the focused row is retained automatically. Filtering and selection belong to the consumer.
294
+
295
+ `StarRating` takes a controlled numeric `value` from 0 to 5, `onValueChange`, and an accessible `label`. Its native radio buttons support keyboard selection and an Unrated option to clear the rating. Set `disabled` while saving. `Avatar shape="square"` displays square artwork with matching image, fallback, and border corners.
296
+
297
+ `DialogContent size="wide"` uses a desktop maximum width of 576px; `size="narrow"` uses 192px, and the default uses 384px. Dialogs remain bounded by the viewport. `FieldGroup columns={2}` arranges fields in two columns on desktop and one on mobile.
298
+
299
+ `ImagePicker` displays a 256px square preview with upload and unset buttons. Supply the existing `src`, a staged `file` (`undefined` for the existing image, `null` for removal), and `onFileChange`/`onClear` callbacks. It accepts PNG, JPEG, and GIF files and releases local preview URLs when they change or unmount. The consumer owns saving and removal confirmation.
300
+
301
+ `ConfirmationDialog` uses an alert dialog with Cancel and a destructive confirmation button. Supply `open`, `onOpenChange`, `title`, `description`, `confirmLabel`, and `onConfirm`. It waits for asynchronous work, keeps the dialog open on failure, and prevents cancellation while that work is pending.
302
+
303
+ # Split views
304
+
305
+ `SplitView` pairs a `sidebar` with its `children` in equally padded, borderless panels. Provide `sidebarLabel`, `contentLabel`, and `resizeLabel` for accessibility and a unique `storageKey` to remember the resized layout in localStorage. The desktop sidebar defaults to 325px (`defaultSidebarSize`), with a 200px minimum and a 50% maximum. Its 2px divider supports mouse, touch, and keyboard resizing. Below 1024px, the panels stack vertically while preserving the desktop preference. Storage failures leave the layout usable.
306
+
307
+ `ResizableHandle thickness="strong"` and `Separator thickness="strong"` use 2px dividers; their default thickness is 1px.
308
+
309
+ `TableHead` and `TableCell` accept `textAlign="start"`, `"center"`, or `"end"` to align labels and numeric columns consistently in either text direction.
310
+
311
+ # Drag and drop
312
+
313
+ Wrap draggable sources and drop targets in `DragDropProvider`. `DragSource` and `DropTarget` accept Base UI's `render` composition, so a button, table row, or sidebar item keeps its native element. For compositions that already manage rendering, use `useDragSource` and `useDropTarget` and spread their `props` onto the existing element.
314
+
315
+ ```tsx
316
+ import { useState, type ReactElement } from "react";
317
+ import { Button, DragDropProvider, DragSource, DropTarget } from "@alexgorbatchev/shadcn";
318
+
319
+ export function MoveExample(): ReactElement {
320
+ const [result, setResult] = useState("Waiting");
321
+ return (
322
+ <DragDropProvider>
323
+ <DragSource
324
+ type="application/x-music"
325
+ data={{ title: "First light" }}
326
+ labels={["First light"]}
327
+ render={<Button />}
328
+ >
329
+ Drag track
330
+ </DragSource>
331
+ <DropTarget
332
+ accept={["application/x-music"]}
333
+ onDrop={(item) => setResult(JSON.stringify(item.data))}
334
+ render={<Button variant="outline" />}
335
+ >
336
+ Drop here
337
+ </DropTarget>
338
+ <Button onClick={() => setResult("Moved First light")}>Move without dragging</Button>
339
+ <output>{result}</output>
340
+ </DragDropProvider>
341
+ );
342
+ }
343
+ ```
344
+
345
+ Supply JSON-serializable `data` and display-only `labels`. Native drags preserve the custom MIME payload, plain-text labels, and keyboard modifiers. `canDrop` rejects unavailable destinations; `getDropEffect` chooses `move`, `copy`, or `link`. Drop callbacks receive the item and native drag event. Validate external payloads before applying application changes.
346
+
347
+ The preview shows compact individual badges, up to five labels followed by `+N more…`. Set `maxPreviewItems` on the provider to change the limit, or use `DragDropPreview` directly. `useDropTarget` exposes the hovered MIME `type`, `isOver`, `isAlt`, and `effect` for hints and highlighting. The provider clears drag state after drops and cancellation. Native drag gestures need an equivalent keyboard-accessible action, such as the move button above or a context-menu command.
348
+
349
+ `useDropTarget().feedback` retains the last accepted MIME type, Alt modifier, and drop effect after leaving or dropping. Use this snapshot for hint content that remains visible during an exit animation; use `isOver` to control visibility and active highlighting. New accepted drag events update feedback immediately, including modifier changes. The live `type`, `isAlt`, and `effect` fields still describe the current hover.
350
+
351
+ `EmptyState` composes a title, description, and optional child actions. `JsonViewer` displays a read-only formatted JSON value with configurable `label` and `rows`.
352
+
353
+ # Devhost Preview
354
+
355
+ The routed preview serves Storybook at `shadcn.localhost` through devhost. To use a different hostname, copy [.env.example](https://github.com/alexgorbatchev/shadcn/blob/main/.env.example) to `.env.local` and set `SHADCN_DEV_HOST_SUFFIX`; the Storybook host becomes `shadcn` followed by that suffix. Exported environment variables take precedence over `.env.local`, which stays untracked.
356
+
357
+ From this repository, start the configured Storybook service:
358
+
359
+ ```sh
360
+ just run
361
+ ```
362
+
363
+ `just run` loads `.env.local`, applies the `.localhost` default, and runs `devhost start`. Running `devhost start` directly requires `SHADCN_DEV_HOST_SUFFIX` in the environment; devhost rejects the manifest when it is undefined.
364
+
365
+ Open the hostname printed by devhost over HTTPS. The manifest allocates a port automatically and serves Storybook through the shared devhost HTTPS proxy. The hostname must resolve to the machine running devhost, and the managed Caddy instance must be running (`devhost caddy start`).
366
+
367
+ Storybook binds to IPv4 loopback and allows the configured hostname in both Storybook and Vite. Caddy listens on all interfaces and serves HTTP as well as HTTPS, so the external devbox gateway can reach it. The direct `just storybook` preview remains available on `127.0.0.1:6006`.
368
+
369
+ # Troubleshooting
370
+
371
+ - **Components render without styling**: Check that your app imports the stylesheet, processes it with Tailwind v4, and registers the package's `dist` directory with `@source`. Adjust that path if your stylesheet lives somewhere other than `src/styles.css`.
372
+ - **A feature dependency cannot be resolved**: Install the peers listed for that feature under [Optional features](#optional-features). Importing a feature does not install its peers.
373
+ - **An export is missing from the package root**: Import feature components, hooks, and types from their dedicated entry point, such as `@alexgorbatchev/shadcn/chart` or `@alexgorbatchev/shadcn/resizable` for `SplitView`.
374
+ - **The custom font does not appear**: Install `@fontsource-variable/jetbrains-mono` and import `@alexgorbatchev/shadcn/fonts.css`, or override `--ag-font` with your app's font stack.
375
+ - **Theme controls throw a provider error**: Render components that call `useTheme()` inside the document's `ThemeProvider`.
376
+ - **Docs use an unexpected palette**: Select the desired Theme toolbar option. System uses the saved preview preference when one exists, otherwise the operating system preference. Reload an open preview after its server restarts on a different port.
377
+
378
+ # License
379
+
380
+ [MIT](https://github.com/alexgorbatchev/shadcn/blob/main/LICENSE). See [third-party notices](https://github.com/alexgorbatchev/shadcn/blob/main/THIRD_PARTY_NOTICES.md) for component and font attribution.