makersclaw 0.2.0 → 0.3.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 (475) hide show
  1. package/THIRD-PARTY-NOTICES.md +180 -0
  2. package/package.json +3 -2
  3. package/r/annotate.json +62 -0
  4. package/r/approval-request.json +52 -0
  5. package/r/audio-player.json +74 -0
  6. package/r/auth-form.json +55 -0
  7. package/r/board.json +10 -6
  8. package/r/calendar-view.json +105 -0
  9. package/r/cart.json +62 -0
  10. package/r/chart.json +83 -0
  11. package/r/chat.json +95 -0
  12. package/r/code-editor.json +94 -0
  13. package/r/comment-box.json +64 -0
  14. package/r/contact-section.json +53 -0
  15. package/r/core.json +205 -8
  16. package/r/csv-import.json +63 -0
  17. package/r/data-table.json +69 -0
  18. package/r/diagram.json +74 -0
  19. package/r/doc-editor.json +82 -0
  20. package/r/doc-page.json +61 -0
  21. package/r/email-render.json +73 -0
  22. package/r/faq.json +50 -0
  23. package/r/file-upload.json +54 -0
  24. package/r/flow-canvas.json +93 -0
  25. package/r/footer.json +52 -0
  26. package/r/gantt.json +70 -0
  27. package/r/job-panel.json +12 -7
  28. package/r/json-editor.json +66 -0
  29. package/r/map.json +89 -0
  30. package/r/menubar.json +52 -0
  31. package/r/mind-map.json +67 -0
  32. package/r/navigation-menu.json +52 -0
  33. package/r/order-detail.json +54 -0
  34. package/r/org-chart.json +66 -0
  35. package/r/page-builder.json +105 -0
  36. package/r/payment-methods.json +51 -0
  37. package/r/pdf-document.json +79 -0
  38. package/r/pdf-viewer.json +88 -0
  39. package/r/product-detail.json +76 -0
  40. package/r/product-grid.json +65 -0
  41. package/r/record-form.json +67 -0
  42. package/r/record-notes.json +55 -0
  43. package/r/registry.json +3411 -29
  44. package/r/search-dialog.json +51 -0
  45. package/r/settings-list.json +66 -0
  46. package/r/setup-checklist.json +51 -0
  47. package/r/share-dialog.json +52 -0
  48. package/r/sidebar.json +69 -0
  49. package/r/signature-pad.json +72 -0
  50. package/r/sketch-canvas.json +99 -0
  51. package/r/spreadsheet.json +90 -0
  52. package/r/stat-cards.json +66 -0
  53. package/r/task-list.json +63 -0
  54. package/r/task-model.json +98 -0
  55. package/r/testimonials.json +52 -0
  56. package/r/transaction-list.json +53 -0
  57. package/r/whiteboard.json +66 -0
  58. package/registry/blocks/annotate/README.md +179 -0
  59. package/registry/blocks/annotate/annotate-data.js +250 -0
  60. package/registry/blocks/annotate/annotate.jsx +646 -0
  61. package/registry/blocks/annotate/block.json +10 -0
  62. package/registry/blocks/annotate/demo.jsx +135 -0
  63. package/registry/blocks/annotate/index.js +15 -0
  64. package/registry/blocks/approval-request/README.md +116 -0
  65. package/registry/blocks/approval-request/approval-request.jsx +386 -0
  66. package/registry/blocks/approval-request/block.json +10 -0
  67. package/registry/blocks/approval-request/demo.jsx +127 -0
  68. package/registry/blocks/approval-request/index.js +4 -0
  69. package/registry/blocks/audio-player/README.md +167 -0
  70. package/registry/blocks/audio-player/audio-player.jsx +623 -0
  71. package/registry/blocks/audio-player/block.json +14 -0
  72. package/registry/blocks/audio-player/colors.js +109 -0
  73. package/registry/blocks/audio-player/demo.jsx +209 -0
  74. package/registry/blocks/audio-player/index.js +6 -0
  75. package/registry/blocks/audio-player/time.js +67 -0
  76. package/registry/blocks/audio-player/wavesurfer.js +9 -0
  77. package/registry/blocks/auth-form/README.md +126 -0
  78. package/registry/blocks/auth-form/auth-form.jsx +568 -0
  79. package/registry/blocks/auth-form/block.json +10 -0
  80. package/registry/blocks/auth-form/demo.jsx +131 -0
  81. package/registry/blocks/auth-form/index.js +3 -0
  82. package/registry/blocks/board/README.md +55 -5
  83. package/registry/blocks/board/block.json +2 -2
  84. package/registry/blocks/board/board.jsx +230 -86
  85. package/registry/blocks/board/demo.jsx +103 -24
  86. package/registry/blocks/calendar-view/README.md +180 -0
  87. package/registry/blocks/calendar-view/agenda.jsx +147 -0
  88. package/registry/blocks/calendar-view/block.json +76 -0
  89. package/registry/blocks/calendar-view/calendar-model.js +442 -0
  90. package/registry/blocks/calendar-view/calendar.jsx +627 -0
  91. package/registry/blocks/calendar-view/demo.jsx +195 -0
  92. package/registry/blocks/calendar-view/draft.jsx +49 -0
  93. package/registry/blocks/calendar-view/index.js +39 -0
  94. package/registry/blocks/calendar-view/month.jsx +346 -0
  95. package/registry/blocks/calendar-view/paint.js +69 -0
  96. package/registry/blocks/calendar-view/time-grid.jsx +527 -0
  97. package/registry/blocks/calendar-view/tray.jsx +87 -0
  98. package/registry/blocks/cart/README.md +146 -0
  99. package/registry/blocks/cart/block.json +10 -0
  100. package/registry/blocks/cart/cart.jsx +597 -0
  101. package/registry/blocks/cart/demo.jsx +98 -0
  102. package/registry/blocks/cart/index.js +4 -0
  103. package/registry/blocks/cart/money.js +28 -0
  104. package/registry/blocks/chart/README.md +316 -0
  105. package/registry/blocks/chart/block.json +10 -0
  106. package/registry/blocks/chart/cartesian.jsx +642 -0
  107. package/registry/blocks/chart/core.jsx +262 -0
  108. package/registry/blocks/chart/demo.jsx +357 -0
  109. package/registry/blocks/chart/heatmap.jsx +336 -0
  110. package/registry/blocks/chart/index.js +8 -0
  111. package/registry/blocks/chart/pie.jsx +245 -0
  112. package/registry/blocks/chart/sparkline.jsx +88 -0
  113. package/registry/blocks/chat/README.md +273 -0
  114. package/registry/blocks/chat/attachment.jsx +95 -0
  115. package/registry/blocks/chat/block.json +10 -0
  116. package/registry/blocks/chat/chat.jsx +132 -0
  117. package/registry/blocks/chat/composer.jsx +364 -0
  118. package/registry/blocks/chat/demo.jsx +578 -0
  119. package/registry/blocks/chat/header.jsx +34 -0
  120. package/registry/blocks/chat/index.js +9 -0
  121. package/registry/blocks/chat/message.jsx +450 -0
  122. package/registry/blocks/chat/scroller.jsx +247 -0
  123. package/registry/blocks/chat/text.jsx +104 -0
  124. package/registry/blocks/code-editor/README.md +210 -0
  125. package/registry/blocks/code-editor/block.json +22 -0
  126. package/registry/blocks/code-editor/code-editor.jsx +534 -0
  127. package/registry/blocks/code-editor/codemirror.js +38 -0
  128. package/registry/blocks/code-editor/demo.jsx +205 -0
  129. package/registry/blocks/code-editor/index.js +8 -0
  130. package/registry/blocks/code-editor/json.js +317 -0
  131. package/registry/blocks/code-editor/sql.js +136 -0
  132. package/registry/blocks/code-editor/text.js +101 -0
  133. package/registry/blocks/code-editor/theme.js +186 -0
  134. package/registry/blocks/comment-box/README.md +123 -0
  135. package/registry/blocks/comment-box/block.json +10 -0
  136. package/registry/blocks/comment-box/comment-body.jsx +217 -0
  137. package/registry/blocks/comment-box/comment-box.jsx +198 -0
  138. package/registry/blocks/comment-box/comment-time.jsx +77 -0
  139. package/registry/blocks/comment-box/demo.jsx +141 -0
  140. package/registry/blocks/comment-box/index.js +8 -0
  141. package/registry/blocks/contact-section/README.md +152 -0
  142. package/registry/blocks/contact-section/block.json +11 -0
  143. package/registry/blocks/contact-section/contact-section.jsx +509 -0
  144. package/registry/blocks/contact-section/demo.jsx +93 -0
  145. package/registry/blocks/contact-section/index.js +4 -0
  146. package/registry/blocks/csv-import/README.md +133 -0
  147. package/registry/blocks/csv-import/block.json +13 -0
  148. package/registry/blocks/csv-import/csv-import.jsx +479 -0
  149. package/registry/blocks/csv-import/demo.jsx +106 -0
  150. package/registry/blocks/csv-import/import.js +200 -0
  151. package/registry/blocks/csv-import/index.js +7 -0
  152. package/registry/blocks/data-table/README.md +386 -0
  153. package/registry/blocks/data-table/block.json +10 -0
  154. package/registry/blocks/data-table/data-table.jsx +1164 -0
  155. package/registry/blocks/data-table/demo.jsx +588 -0
  156. package/registry/blocks/data-table/index.js +5 -0
  157. package/registry/blocks/data-table/model.js +169 -0
  158. package/registry/blocks/diagram/README.md +108 -0
  159. package/registry/blocks/diagram/block.json +13 -0
  160. package/registry/blocks/diagram/demo.jsx +113 -0
  161. package/registry/blocks/diagram/diagram.jsx +481 -0
  162. package/registry/blocks/diagram/index.js +7 -0
  163. package/registry/blocks/diagram/mermaid.js +52 -0
  164. package/registry/blocks/diagram/palette.js +313 -0
  165. package/registry/blocks/diagram/source.js +98 -0
  166. package/registry/blocks/doc-editor/README.md +215 -0
  167. package/registry/blocks/doc-editor/block.json +15 -0
  168. package/registry/blocks/doc-editor/demo.jsx +225 -0
  169. package/registry/blocks/doc-editor/doc-editor.jsx +291 -0
  170. package/registry/blocks/doc-editor/doc.js +309 -0
  171. package/registry/blocks/doc-editor/index.js +7 -0
  172. package/registry/blocks/doc-editor/schema.jsx +56 -0
  173. package/registry/blocks/doc-editor/shadcn-classes.js +110 -0
  174. package/registry/blocks/doc-editor/theme.js +82 -0
  175. package/registry/blocks/doc-page/README.md +119 -0
  176. package/registry/blocks/doc-page/autosave.js +104 -0
  177. package/registry/blocks/doc-page/block.json +10 -0
  178. package/registry/blocks/doc-page/demo.jsx +137 -0
  179. package/registry/blocks/doc-page/doc-page.jsx +276 -0
  180. package/registry/blocks/doc-page/index.js +4 -0
  181. package/registry/blocks/email-render/README.md +151 -0
  182. package/registry/blocks/email-render/block.json +14 -0
  183. package/registry/blocks/email-render/demo.jsx +153 -0
  184. package/registry/blocks/email-render/doc-email.jsx +210 -0
  185. package/registry/blocks/email-render/email.jsx +221 -0
  186. package/registry/blocks/email-render/index.js +10 -0
  187. package/registry/blocks/email-render/render.js +50 -0
  188. package/registry/blocks/email-render/theme.js +215 -0
  189. package/registry/blocks/faq/README.md +101 -0
  190. package/registry/blocks/faq/block.json +11 -0
  191. package/registry/blocks/faq/demo.jsx +89 -0
  192. package/registry/blocks/faq/faq.jsx +220 -0
  193. package/registry/blocks/faq/index.js +4 -0
  194. package/registry/blocks/file-upload/README.md +138 -0
  195. package/registry/blocks/file-upload/block.json +10 -0
  196. package/registry/blocks/file-upload/demo.jsx +204 -0
  197. package/registry/blocks/file-upload/file-upload.jsx +635 -0
  198. package/registry/blocks/file-upload/index.js +4 -0
  199. package/registry/blocks/flow-canvas/README.md +420 -0
  200. package/registry/blocks/flow-canvas/block.json +13 -0
  201. package/registry/blocks/flow-canvas/board.js +819 -0
  202. package/registry/blocks/flow-canvas/chrome.jsx +649 -0
  203. package/registry/blocks/flow-canvas/context.jsx +35 -0
  204. package/registry/blocks/flow-canvas/demo.jsx +249 -0
  205. package/registry/blocks/flow-canvas/edges.jsx +107 -0
  206. package/registry/blocks/flow-canvas/flow-canvas.jsx +1329 -0
  207. package/registry/blocks/flow-canvas/index.js +41 -0
  208. package/registry/blocks/flow-canvas/nodes.jsx +392 -0
  209. package/registry/blocks/flow-canvas/theme.js +174 -0
  210. package/registry/blocks/footer/README.md +133 -0
  211. package/registry/blocks/footer/block.json +11 -0
  212. package/registry/blocks/footer/demo.jsx +119 -0
  213. package/registry/blocks/footer/footer.jsx +406 -0
  214. package/registry/blocks/footer/index.js +4 -0
  215. package/registry/blocks/gantt/README.md +220 -0
  216. package/registry/blocks/gantt/block.json +10 -0
  217. package/registry/blocks/gantt/demo.jsx +148 -0
  218. package/registry/blocks/gantt/gantt.jsx +923 -0
  219. package/registry/blocks/gantt/index.js +7 -0
  220. package/registry/blocks/gantt/rows.jsx +468 -0
  221. package/registry/blocks/gantt/schedule.js +278 -0
  222. package/registry/blocks/job-panel/README.md +80 -0
  223. package/registry/blocks/job-panel/block.json +3 -3
  224. package/registry/blocks/job-panel/demo.jsx +230 -3
  225. package/registry/blocks/job-panel/job-panel.jsx +169 -3
  226. package/registry/blocks/json-editor/README.md +133 -0
  227. package/registry/blocks/json-editor/block.json +10 -0
  228. package/registry/blocks/json-editor/demo.jsx +92 -0
  229. package/registry/blocks/json-editor/index.js +7 -0
  230. package/registry/blocks/json-editor/json-editor.jsx +305 -0
  231. package/registry/blocks/json-editor/json-tree.jsx +393 -0
  232. package/registry/blocks/json-editor/tree.js +225 -0
  233. package/registry/blocks/map/README.md +221 -0
  234. package/registry/blocks/map/block.json +14 -0
  235. package/registry/blocks/map/demo.jsx +201 -0
  236. package/registry/blocks/map/geo.js +198 -0
  237. package/registry/blocks/map/index.js +8 -0
  238. package/registry/blocks/map/list.jsx +128 -0
  239. package/registry/blocks/map/map-view.jsx +715 -0
  240. package/registry/blocks/map/maplibre.js +30 -0
  241. package/registry/blocks/map/marks.jsx +146 -0
  242. package/registry/blocks/map/theme.js +142 -0
  243. package/registry/blocks/menubar/README.md +109 -0
  244. package/registry/blocks/menubar/block.json +10 -0
  245. package/registry/blocks/menubar/demo.jsx +128 -0
  246. package/registry/blocks/menubar/index.js +4 -0
  247. package/registry/blocks/menubar/menubar.jsx +199 -0
  248. package/registry/blocks/mind-map/README.md +206 -0
  249. package/registry/blocks/mind-map/block.json +10 -0
  250. package/registry/blocks/mind-map/demo.jsx +103 -0
  251. package/registry/blocks/mind-map/index.js +31 -0
  252. package/registry/blocks/mind-map/mind-map.jsx +1125 -0
  253. package/registry/blocks/mind-map/topic.jsx +143 -0
  254. package/registry/blocks/mind-map/tree.js +645 -0
  255. package/registry/blocks/navigation-menu/README.md +124 -0
  256. package/registry/blocks/navigation-menu/block.json +10 -0
  257. package/registry/blocks/navigation-menu/demo.jsx +84 -0
  258. package/registry/blocks/navigation-menu/index.js +4 -0
  259. package/registry/blocks/navigation-menu/navigation-menu.jsx +448 -0
  260. package/registry/blocks/order-detail/README.md +109 -0
  261. package/registry/blocks/order-detail/block.json +10 -0
  262. package/registry/blocks/order-detail/demo.jsx +88 -0
  263. package/registry/blocks/order-detail/index.js +4 -0
  264. package/registry/blocks/order-detail/order-detail.jsx +354 -0
  265. package/registry/blocks/org-chart/README.md +145 -0
  266. package/registry/blocks/org-chart/block.json +10 -0
  267. package/registry/blocks/org-chart/demo.jsx +94 -0
  268. package/registry/blocks/org-chart/index.js +7 -0
  269. package/registry/blocks/org-chart/org-chart.jsx +631 -0
  270. package/registry/blocks/org-chart/org.js +245 -0
  271. package/registry/blocks/org-chart/person.jsx +96 -0
  272. package/registry/blocks/page-builder/README.md +257 -0
  273. package/registry/blocks/page-builder/block.json +14 -0
  274. package/registry/blocks/page-builder/demo.jsx +145 -0
  275. package/registry/blocks/page-builder/grapes.js +18 -0
  276. package/registry/blocks/page-builder/index.js +11 -0
  277. package/registry/blocks/page-builder/page-builder.jsx +704 -0
  278. package/registry/blocks/page-builder/page-view.jsx +33 -0
  279. package/registry/blocks/page-builder/page.js +118 -0
  280. package/registry/blocks/page-builder/panels.jsx +588 -0
  281. package/registry/blocks/page-builder/sections.js +209 -0
  282. package/registry/blocks/page-builder/theme.js +87 -0
  283. package/registry/blocks/page-builder/thumbs.jsx +189 -0
  284. package/registry/blocks/page-builder/tokens.js +329 -0
  285. package/registry/blocks/payment-methods/README.md +104 -0
  286. package/registry/blocks/payment-methods/block.json +10 -0
  287. package/registry/blocks/payment-methods/demo.jsx +71 -0
  288. package/registry/blocks/payment-methods/index.js +4 -0
  289. package/registry/blocks/payment-methods/payment-methods.jsx +302 -0
  290. package/registry/blocks/pdf-document/README.md +213 -0
  291. package/registry/blocks/pdf-document/block.json +13 -0
  292. package/registry/blocks/pdf-document/demo.jsx +136 -0
  293. package/registry/blocks/pdf-document/index.js +33 -0
  294. package/registry/blocks/pdf-document/money.js +83 -0
  295. package/registry/blocks/pdf-document/pdf-document.jsx +144 -0
  296. package/registry/blocks/pdf-document/primitives.jsx +271 -0
  297. package/registry/blocks/pdf-document/quote.jsx +179 -0
  298. package/registry/blocks/pdf-document/theme.js +193 -0
  299. package/registry/blocks/pdf-viewer/README.md +191 -0
  300. package/registry/blocks/pdf-viewer/block.json +14 -0
  301. package/registry/blocks/pdf-viewer/demo.jsx +252 -0
  302. package/registry/blocks/pdf-viewer/helpers.js +270 -0
  303. package/registry/blocks/pdf-viewer/index.js +8 -0
  304. package/registry/blocks/pdf-viewer/notes.jsx +195 -0
  305. package/registry/blocks/pdf-viewer/pdf-viewer.jsx +1368 -0
  306. package/registry/blocks/pdf-viewer/pdfjs.js +37 -0
  307. package/registry/blocks/pdf-viewer/ssr-shim-end.js +6 -0
  308. package/registry/blocks/pdf-viewer/ssr-shim.js +44 -0
  309. package/registry/blocks/product-detail/README.md +217 -0
  310. package/registry/blocks/product-detail/block.json +10 -0
  311. package/registry/blocks/product-detail/demo.jsx +233 -0
  312. package/registry/blocks/product-detail/index.js +7 -0
  313. package/registry/blocks/product-detail/price.jsx +115 -0
  314. package/registry/blocks/product-detail/product-detail.jsx +348 -0
  315. package/registry/blocks/product-detail/product-media.jsx +102 -0
  316. package/registry/blocks/product-detail/product-options.jsx +144 -0
  317. package/registry/blocks/product-grid/README.md +162 -0
  318. package/registry/blocks/product-grid/block.json +10 -0
  319. package/registry/blocks/product-grid/demo.jsx +255 -0
  320. package/registry/blocks/product-grid/index.js +5 -0
  321. package/registry/blocks/product-grid/product-card.jsx +232 -0
  322. package/registry/blocks/product-grid/product-grid.jsx +235 -0
  323. package/registry/blocks/record-form/README.md +196 -0
  324. package/registry/blocks/record-form/block.json +10 -0
  325. package/registry/blocks/record-form/demo.jsx +525 -0
  326. package/registry/blocks/record-form/index.js +4 -0
  327. package/registry/blocks/record-form/record-fields.jsx +457 -0
  328. package/registry/blocks/record-form/record-form.jsx +415 -0
  329. package/registry/blocks/record-form/rules.js +81 -0
  330. package/registry/blocks/record-notes/README.md +139 -0
  331. package/registry/blocks/record-notes/block.json +10 -0
  332. package/registry/blocks/record-notes/demo.jsx +179 -0
  333. package/registry/blocks/record-notes/index.js +4 -0
  334. package/registry/blocks/record-notes/record-notes.jsx +266 -0
  335. package/registry/blocks/search-dialog/README.md +108 -0
  336. package/registry/blocks/search-dialog/block.json +10 -0
  337. package/registry/blocks/search-dialog/demo.jsx +116 -0
  338. package/registry/blocks/search-dialog/index.js +3 -0
  339. package/registry/blocks/search-dialog/search-dialog.jsx +235 -0
  340. package/registry/blocks/settings-list/README.md +171 -0
  341. package/registry/blocks/settings-list/block.json +10 -0
  342. package/registry/blocks/settings-list/demo.jsx +333 -0
  343. package/registry/blocks/settings-list/index.js +4 -0
  344. package/registry/blocks/settings-list/row-state.jsx +93 -0
  345. package/registry/blocks/settings-list/settings-list.jsx +349 -0
  346. package/registry/blocks/settings-list/settings-matrix.jsx +118 -0
  347. package/registry/blocks/setup-checklist/README.md +142 -0
  348. package/registry/blocks/setup-checklist/block.json +10 -0
  349. package/registry/blocks/setup-checklist/demo.jsx +159 -0
  350. package/registry/blocks/setup-checklist/index.js +4 -0
  351. package/registry/blocks/setup-checklist/setup-checklist.jsx +446 -0
  352. package/registry/blocks/share-dialog/README.md +113 -0
  353. package/registry/blocks/share-dialog/block.json +10 -0
  354. package/registry/blocks/share-dialog/demo.jsx +140 -0
  355. package/registry/blocks/share-dialog/index.js +3 -0
  356. package/registry/blocks/share-dialog/share-dialog.jsx +384 -0
  357. package/registry/blocks/sidebar/README.md +190 -0
  358. package/registry/blocks/sidebar/block.json +43 -0
  359. package/registry/blocks/sidebar/demo.jsx +577 -0
  360. package/registry/blocks/sidebar/index.js +4 -0
  361. package/registry/blocks/sidebar/sidebar-panel.jsx +149 -0
  362. package/registry/blocks/sidebar/sidebar.jsx +864 -0
  363. package/registry/blocks/signature-pad/README.md +137 -0
  364. package/registry/blocks/signature-pad/block.json +13 -0
  365. package/registry/blocks/signature-pad/colors.js +115 -0
  366. package/registry/blocks/signature-pad/demo.jsx +94 -0
  367. package/registry/blocks/signature-pad/index.js +6 -0
  368. package/registry/blocks/signature-pad/pad.js +7 -0
  369. package/registry/blocks/signature-pad/signature-pad.jsx +434 -0
  370. package/registry/blocks/signature-pad/signature.js +68 -0
  371. package/registry/blocks/sketch-canvas/README.md +280 -0
  372. package/registry/blocks/sketch-canvas/block.json +13 -0
  373. package/registry/blocks/sketch-canvas/demo.jsx +159 -0
  374. package/registry/blocks/sketch-canvas/excalidraw.js +40 -0
  375. package/registry/blocks/sketch-canvas/index.js +9 -0
  376. package/registry/blocks/sketch-canvas/palette.js +226 -0
  377. package/registry/blocks/sketch-canvas/sketch-canvas.jsx +1188 -0
  378. package/registry/blocks/sketch-canvas/sketch.js +179 -0
  379. package/registry/blocks/sketch-canvas/ssr-shim-end.js +6 -0
  380. package/registry/blocks/sketch-canvas/ssr-shim.js +45 -0
  381. package/registry/blocks/sketch-canvas/stamps.js +104 -0
  382. package/registry/blocks/sketch-canvas/theme.js +131 -0
  383. package/registry/blocks/spreadsheet/README.md +307 -0
  384. package/registry/blocks/spreadsheet/block.json +13 -0
  385. package/registry/blocks/spreadsheet/cells.jsx +455 -0
  386. package/registry/blocks/spreadsheet/chrome.jsx +325 -0
  387. package/registry/blocks/spreadsheet/demo.jsx +177 -0
  388. package/registry/blocks/spreadsheet/grid.js +387 -0
  389. package/registry/blocks/spreadsheet/index.js +34 -0
  390. package/registry/blocks/spreadsheet/spreadsheet.jsx +1732 -0
  391. package/registry/blocks/spreadsheet/types.js +473 -0
  392. package/registry/blocks/stat-cards/README.md +173 -0
  393. package/registry/blocks/stat-cards/block.json +10 -0
  394. package/registry/blocks/stat-cards/demo.jsx +257 -0
  395. package/registry/blocks/stat-cards/index.js +4 -0
  396. package/registry/blocks/stat-cards/stat-cards.jsx +307 -0
  397. package/registry/blocks/stat-cards/usage.jsx +243 -0
  398. package/registry/blocks/task-list/README.md +176 -0
  399. package/registry/blocks/task-list/block.json +10 -0
  400. package/registry/blocks/task-list/demo.jsx +134 -0
  401. package/registry/blocks/task-list/index.js +5 -0
  402. package/registry/blocks/task-list/task-list.jsx +907 -0
  403. package/registry/blocks/task-model/README.md +455 -0
  404. package/registry/blocks/task-model/block.json +167 -0
  405. package/registry/blocks/task-model/changes.js +89 -0
  406. package/registry/blocks/task-model/dates.js +371 -0
  407. package/registry/blocks/task-model/demo.jsx +215 -0
  408. package/registry/blocks/task-model/dnd.jsx +240 -0
  409. package/registry/blocks/task-model/index.js +97 -0
  410. package/registry/blocks/task-model/model.js +919 -0
  411. package/registry/blocks/task-model/parts.jsx +449 -0
  412. package/registry/blocks/task-model/toolbar.jsx +271 -0
  413. package/registry/blocks/testimonials/README.md +139 -0
  414. package/registry/blocks/testimonials/block.json +11 -0
  415. package/registry/blocks/testimonials/demo.jsx +137 -0
  416. package/registry/blocks/testimonials/index.js +4 -0
  417. package/registry/blocks/testimonials/testimonials.jsx +430 -0
  418. package/registry/blocks/transaction-list/README.md +126 -0
  419. package/registry/blocks/transaction-list/block.json +10 -0
  420. package/registry/blocks/transaction-list/demo.jsx +79 -0
  421. package/registry/blocks/transaction-list/index.js +4 -0
  422. package/registry/blocks/transaction-list/transaction-list.jsx +383 -0
  423. package/registry/blocks/whiteboard/README.md +179 -0
  424. package/registry/blocks/whiteboard/block.json +10 -0
  425. package/registry/blocks/whiteboard/demo.jsx +169 -0
  426. package/registry/blocks/whiteboard/index.js +6 -0
  427. package/registry/blocks/whiteboard/templates.js +150 -0
  428. package/registry/blocks/whiteboard/whiteboard.jsx +721 -0
  429. package/src/cli.mjs +19 -6
  430. package/src/install.mjs +18 -0
  431. package/src/registry.mjs +38 -4
  432. package/src/shadcn.mjs +14 -1
  433. package/templates/next/files/README.md +145 -11
  434. package/templates/next/files/app/globals.css +55 -4
  435. package/templates/next/files/check/run.mjs +3 -3
  436. package/templates/next/files/components/ui/avatar.jsx +141 -0
  437. package/templates/next/files/components/ui/breadcrumb.jsx +149 -0
  438. package/templates/next/files/components/ui/button-group.jsx +70 -0
  439. package/templates/next/files/components/ui/button.jsx +132 -12
  440. package/templates/next/files/components/ui/calendar.jsx +609 -0
  441. package/templates/next/files/components/ui/carousel.jsx +281 -0
  442. package/templates/next/files/components/ui/collapsible.jsx +208 -0
  443. package/templates/next/files/components/ui/combobox.jsx +608 -0
  444. package/templates/next/files/components/ui/command.jsx +577 -0
  445. package/templates/next/files/components/ui/context-menu.jsx +191 -0
  446. package/templates/next/files/components/ui/date-picker.jsx +360 -0
  447. package/templates/next/files/components/ui/distribution.jsx +117 -0
  448. package/templates/next/files/components/ui/feedback.jsx +143 -0
  449. package/templates/next/files/components/ui/field.jsx +115 -3
  450. package/templates/next/files/components/ui/file-input.jsx +234 -0
  451. package/templates/next/files/components/ui/icon.jsx +130 -8
  452. package/templates/next/files/components/ui/image.jsx +143 -0
  453. package/templates/next/files/components/ui/index.js +47 -2
  454. package/templates/next/files/components/ui/input-group.jsx +213 -0
  455. package/templates/next/files/components/ui/input-otp.jsx +170 -0
  456. package/templates/next/files/components/ui/item.jsx +206 -0
  457. package/templates/next/files/components/ui/menu.jsx +454 -82
  458. package/templates/next/files/components/ui/notice.jsx +126 -14
  459. package/templates/next/files/components/ui/pagination.jsx +156 -0
  460. package/templates/next/files/components/ui/popover.jsx +284 -0
  461. package/templates/next/files/components/ui/radio.jsx +193 -0
  462. package/templates/next/files/components/ui/rating.jsx +131 -0
  463. package/templates/next/files/components/ui/resizable.jsx +338 -0
  464. package/templates/next/files/components/ui/scroll-area.jsx +123 -0
  465. package/templates/next/files/components/ui/separator.jsx +119 -0
  466. package/templates/next/files/components/ui/sheet.jsx +96 -11
  467. package/templates/next/files/components/ui/slider.jsx +174 -0
  468. package/templates/next/files/components/ui/stat.jsx +574 -0
  469. package/templates/next/files/components/ui/steps.jsx +338 -0
  470. package/templates/next/files/components/ui/swatch.jsx +33 -0
  471. package/templates/next/files/components/ui/table.jsx +130 -0
  472. package/templates/next/files/components/ui/toast.jsx +440 -0
  473. package/templates/next/files/components/ui/toggle.jsx +195 -0
  474. package/templates/next/files/components/ui/tooltip.jsx +270 -0
  475. package/templates/next/template.json +264 -8
@@ -0,0 +1,273 @@
1
+ # Chat
2
+
3
+ The parts of a chat, and a thread made of them. `Message` is one turn:
4
+ avatar, name, time, the words in a `Bubble`, its files, its state
5
+ (sending, streaming, failed with Retry) and the actions that appear on
6
+ hover or focus (copy, regenerate, a menu of yours). `MessageScroller` is
7
+ the list: it keeps to the bottom while a reply streams unless the reader
8
+ scrolled up, then offers "Jump to latest"; it puts a day between days,
9
+ runs consecutive messages from one author together, loads older messages
10
+ from the top and says each finished reply to a screen reader.
11
+ `Composer` is the input: it grows with the text, Enter sends,
12
+ Shift+Enter is a new line, files come by paperclip, paste or drop, and
13
+ Send becomes Stop while a reply streams; it comes as a box or as the
14
+ round "ask anything" pill, with a "+" menu, your tools in its bar and
15
+ suggestion chips. An assistant reply can fold its reasoning away
16
+ ("Thought for 4s") and take a thumbs up or down; a user message can be
17
+ edited in place. `ChatHeader` is the strip over a thread (name, status,
18
+ actions). `Attachment` is one file. `ChatThread` puts them together from
19
+ `messages` and `onSend`.
20
+
21
+ ```jsx
22
+ import { ChatThread } from "../components/blocks/chat"; // a Makersclaw app ("./blocks/chat" from components/)
23
+ import { ChatThread } from "@/components/makersclaw/blocks/chat"; // a shadcn project
24
+ ```
25
+
26
+ Every part is a client component: render them from a `"use client"`
27
+ component. The block imports nothing but React and the kit — it holds no
28
+ conversation and calls no model. The messages come in as a prop and the
29
+ send goes out as `onSend`; where the reply comes from (your server action,
30
+ the AI SDK's `useChat`, a support inbox table) is the surface's.
31
+
32
+ This is not the app window's Agent tab — the OS draws that. It is for a
33
+ conversation that lives on your own screen: a support reply pane, a
34
+ customer-facing assistant, comments on a record.
35
+
36
+ ## The data
37
+
38
+ A message:
39
+
40
+ ```js
41
+ {
42
+ id: "m5", // stable; the list is keyed on it
43
+ role: "user", // user · assistant · system
44
+ content: "It's still showing…", // a string — or `parts: [{ type: "text", text }]`
45
+ createdAt: "2026-09-23T10:04:00Z",
46
+ author: { name: "Maya Chen", src: "https://…" }, // optional
47
+ status: "failed", // sending · streaming · failed · nothing (sent)
48
+ error: "you are offline", // shown with a failed message
49
+ attachments: [{ id, name, size, type, url }], // size in bytes; url shows an image's thumbnail
50
+ reasoning: "They asked about the double charge…", // assistant only: folded over the reply
51
+ reasoningDuration: 4, // seconds: "Thought for 4s"
52
+ feedback: "up", // up · down — the thumbs already given (assistant only)
53
+ }
54
+ ```
55
+
56
+ `reasoning` is drawn in a kit `Collapsible`, closed, over the reply.
57
+ While the message streams with no answer yet it reads "Thinking…"; give
58
+ `reasoning: ""` from the start to show that line instead of the three
59
+ dots.
60
+
61
+ A message with `parts` (the AI SDK's shape) is drawn from its text parts;
62
+ other parts are not drawn. A `system` message is a centred muted line.
63
+ An assistant message with `status: "streaming"` and no text yet shows
64
+ three dots; with text it shows a caret after it.
65
+
66
+ The words are drawn by a small safe renderer — never as HTML, and with no
67
+ markdown library. It understands fenced code blocks (with a Copy button;
68
+ an unclosed fence runs to the end, so a block still streaming already
69
+ looks like one), `code spans`, `**bold**` and line breaks. Everything else
70
+ (links, lists, headings) is plain text. `<script>` in a message is shown,
71
+ not run.
72
+
73
+ ## Props
74
+
75
+ ### ChatThread
76
+
77
+ - `messages` — the conversation, oldest first.
78
+ - `onSend(text, attachments)` — send it. The composer clears at once;
79
+ return `{ ok: false, error }` (or throw) and the text comes back to the
80
+ field with the reason under it. The usual pattern is to add the message
81
+ with `status: "sending"` here, then mark it sent or `failed`.
82
+ - `streaming` — a reply is streaming: Send becomes Stop, Esc stops.
83
+ Default: true while any message has `status: "streaming"`.
84
+ - `onStop()` — stop the reply.
85
+ - `onRetry(message)` — the Retry on a failed message. Without it, a
86
+ failed message says so and offers nothing.
87
+ - `onRegenerate(message)` — a regenerate button on assistant messages.
88
+ - `actionsOf(message)` — more items for a message's menu, kit `Menu`
89
+ shape: `[{ label, onSelect, icon?, tone?: "danger" }]`.
90
+ - `onFeedback(message, "up" | "down" | null)` — thumbs up and down on
91
+ assistant replies (pressing the chosen one again clears it: `null`).
92
+ The choice shows at once; return `{ ok: false, error }` (or throw) and
93
+ it goes back, with the reason under the message. Store it and pass it
94
+ back as `message.feedback`.
95
+ - `onEdit(message, text)` — an edit button on your own messages. The
96
+ words come back in a field: Enter or Save saves, Esc or Cancel leaves
97
+ them. Return `{ ok: false, error }` and the field stays open with the
98
+ reason. Up arrow in an empty composer edits the last message you sent.
99
+ What an edit does next (drop the replies after it, ask again) is yours.
100
+ - `header` — a node over the list, or the props of a `ChatHeader`
101
+ (`{ title, status, actions, menu }`).
102
+ - `shape` — the composer: `"box"` (default) or `"pill"` (see Composer).
103
+ - `tools` · `menu` — the composer's bar: nodes of yours, and kit `Menu`
104
+ items behind a "+" (see Composer).
105
+ - `suggestions` — prompt chips over the composer:
106
+ `[{ label, prompt?, icon?, description? }]`. Shown while the thread is
107
+ empty; `suggestionsWhen="always"` keeps them. `suggestionMode`
108
+ `"send"` (the default here: a press sends `prompt ?? label`) or
109
+ `"fill"` (puts it in the field). `suggestionsLook` `"chips"` (default)
110
+ or `"cards"`.
111
+ - `onLoadMore()` · `hasMore` (false) · `loadingMore` (false) — older
112
+ messages. Reaching the top (or pressing "Load earlier messages") calls
113
+ `onLoadMore`; prepend them to `messages` and the reader keeps their place.
114
+ - `attachments` · `onAttach(files)` · `onRemoveAttachment(att)` · `accept`
115
+ — files waiting in the composer. `onAttach` gets the browser's `File`s:
116
+ upload them and pass them back in `attachments` as
117
+ `{ id, name, size, type, url?, progress?, error? }` (`progress` 0–100
118
+ draws a bar; Send waits until every upload is at 100). Without
119
+ `onAttach` there is no paperclip. They reach `onSend` as its second
120
+ argument.
121
+ - `disabled` (false) · `disabledPlaceholder` · `placeholder` — a closed
122
+ or read-only thread.
123
+ - `variant` — how assistant words sit: `"plain"` (default, on the page)
124
+ or `"bubble"`. User messages are always filled bubbles at the end.
125
+ - `assistantName` ("Assistant") · `assistantAvatar` · `userName` ("You")
126
+ · `userAvatar` · `showUserAvatar` (false) — who is who, when a message
127
+ has no `author`.
128
+ - `emptyTitle` · `emptyBody` · `emptyState` — what an empty thread says;
129
+ `emptyState` replaces the whole thing.
130
+ - `height` — default `"min(40rem, 80dvh)"`; the list scrolls inside it.
131
+ - `label` — what the thread is called to a screen reader.
132
+ - `className` — layout around it (width, margin). Never colour.
133
+
134
+ ### Message
135
+
136
+ `message` (the shape above), `first` / `last` (its place in a run from
137
+ one author: `first` shows the avatar, name and time), `latest` (the
138
+ newest reply: its actions stay in view instead of waiting for hover), and `variant`,
139
+ `assistantName`, `assistantAvatar`, `userName`, `userAvatar`,
140
+ `showUserAvatar`, `onRetry`, `onRegenerate`, `actionsOf`, `onFeedback`,
141
+ `onEdit` as above. `editing` / `onEditingChange(next)` control the edit
142
+ field (leave them out and the message keeps its own).
143
+ `onCopy(message, text)` replaces the clipboard write; `formatTime(date)`
144
+ replaces the time's format.
145
+
146
+ ### Bubble
147
+
148
+ `from` (`"user"` · `"assistant"`), `variant` (`"bubble"` · `"plain"`),
149
+ `first` / `last`, `streaming` (draws the caret), and `text` (drawn by the
150
+ safe renderer) or `children`.
151
+
152
+ ### ChatHeader
153
+
154
+ `title`, then `status` (`{ tone: "success", label: "Online", pulse? }`,
155
+ a kit `StatusDot`) or `subtitle` (a muted line) under it, `avatar`
156
+ (`{ name?, src?, status? }`), `actions` (nodes at the end: a "New chat"
157
+ Button), `menu` (kit `Menu` items behind a "⋯") and `menuLabel`.
158
+
159
+ ### Attachment
160
+
161
+ `name`, `size` (bytes), `type` (MIME; the extension is used when it is
162
+ missing), `url` (an image shows itself; anything else opens it),
163
+ `href` (open this instead), `progress` (0–100, a bar until 100), `error`,
164
+ `onRemove`, `removeLabel`. An image's thumbnail is a kit `Image`: a
165
+ skeleton while it loads, the image glyph if it fails.
166
+
167
+ ### MessageScroller
168
+
169
+ `messages`, `renderMessage(message, { first, last, latest })` (default: a plain
170
+ `Message`), `idOf(message, i)`, `onLoadMore` · `hasMore` · `loadingMore`,
171
+ `emptyState`, `formatDay(date)` ("Today", "Yesterday", "Mon 21 Sep"),
172
+ `announce(message)` (what a screen reader hears when a reply is whole),
173
+ `jumpLabel`, `loadMoreLabel`, `label`, `className` (give it a bounded
174
+ height, or put it in a flex column), `children` (drawn after the last
175
+ message — a typing line, say).
176
+
177
+ The list is a kit `ScrollArea`. Once it overflows it joins the tab order
178
+ as a region named `label`, so a keyboard can scroll it.
179
+
180
+ ### Composer
181
+
182
+ `onSend`, `onStop`, `streaming`, `disabled`, `disabledPlaceholder`,
183
+ `placeholder`, `attachments` · `onAttach` · `onRemoveAttachment` ·
184
+ `accept` as in ChatThread, and `value` / `onValueChange` (control the
185
+ text — to quote a message into it, say), `maxRows` (8), `canSendEmpty`
186
+ (false), `label` ("Message"), `hint` (true: the Enter / Shift+Enter keys
187
+ under the field, from md up), `autoFocus`, and:
188
+
189
+ - `shape` — `"box"` (default: the text on top, the bar under it) or
190
+ `"pill"`: the "ask anything" box, one round row with the "+" menu and
191
+ the paperclip before the text and `tools` and Send after it. Past one
192
+ line (or with files waiting) it opens into a rounded box, text on top;
193
+ emptied, it is a pill again. The pill shows no key hint.
194
+ - `tools` — nodes in the bar: a model `Select`, a kit `Menu` of
195
+ settings with checkbox items, a `Toggle` for "Auto", a mic. The
196
+ composer draws them; what they choose is yours (read it in `onSend`).
197
+ - `menu` · `menuLabel` ("Add to the message") — kit `Menu` items behind
198
+ a "+" at the start of the bar: "Add files", "Search the web".
199
+ - `suggestions` — `[{ label, prompt?, icon?, description?, onSelect? }]`,
200
+ drawn `suggestionsPlacement` `"below"` (default) or `"above"` the
201
+ field. `suggestionMode` `"fill"` (default: the prompt goes in the
202
+ field, caret at its end) or `"send"`; an item's own `onSelect(item)`
203
+ replaces both. `suggestionsLook` `"chips"` (round, centred) or
204
+ `"cards"` (a two-column grid with `description` under each label).
205
+ `suggestionsLabel` names the list to a reader.
206
+ - `onEditLast()` — Up arrow in the empty field (ChatThread opens the last
207
+ message you sent for editing).
208
+
209
+ The field is the kit's multi-line `InputGroup`: the waiting files sit
210
+ above the text inside its one border, the paperclip (a kit `FileInput`)
211
+ and the hint in its bar, Send at the end. The picker leaves out files
212
+ `accept` rules out; a drop or a paste is passed on as it comes.
213
+
214
+ ## Example
215
+
216
+ ```jsx
217
+ // components/SupportChat.jsx — client: one ticket's conversation
218
+ "use client";
219
+ import { useState } from "react";
220
+ import { insertRow } from "../lib/actions";
221
+ import { ChatThread } from "./blocks/chat";
222
+
223
+ export default function SupportChat({ ticket, initial }) {
224
+ const [messages, setMessages] = useState(initial);
225
+ const patch = (id, change) => setMessages((all) => all.map((m) => (m.id === id ? { ...m, ...change } : m)));
226
+
227
+ async function send(text) {
228
+ const id = crypto.randomUUID();
229
+ const draft = { id, role: "user", content: text, createdAt: new Date().toISOString(), status: "sending" };
230
+ setMessages((all) => [...all, draft]);
231
+ const r = await insertRow({ source: "public.ticket_messages", values: { id, ticket_id: ticket.id, body: text }, detail: text });
232
+ patch(id, r.ok ? { status: undefined } : { status: "failed", error: r.error });
233
+ }
234
+
235
+ return (
236
+ <ChatThread
237
+ messages={messages}
238
+ onSend={send}
239
+ onRetry={(m) => { setMessages((all) => all.filter((x) => x.id !== m.id)); send(m.content); }}
240
+ assistantName={ticket.agent_name}
241
+ userName="You"
242
+ label={`Ticket ${ticket.number}`}
243
+ />
244
+ );
245
+ }
246
+ ```
247
+
248
+ With the AI SDK in a shadcn project, `useChat()` already has the shape:
249
+ `<ChatThread messages={messages} onSend={(text) => sendMessage({ text })}
250
+ streaming={status === "streaming" || status === "submitted"} onStop={stop}
251
+ onRegenerate={() => regenerate()} />`.
252
+
253
+ ## What it will not do
254
+
255
+ - Call a model, store a message or upload a file: those are the
256
+ surface's, through `onSend`, `onAttach` and the rows it passes back.
257
+ - Render HTML or full markdown: links, lists, tables and images inside
258
+ the text stay plain text.
259
+ - Keep the feedback or the edit: `onFeedback` and `onEdit` hand them to
260
+ you, and the rows you pass back are what shows. Emoji reactions are
261
+ yours, in `actionsOf`.
262
+ - Record audio or pick a model: a mic or a model `Select` is a node you
263
+ put in `tools`.
264
+ - Draw the app window's Agent tab, or a job the founder commissioned —
265
+ that is `job-panel`.
266
+
267
+ A chat it cannot be is your own component in `components/`, built from
268
+ these parts and the kit — not an edit to this block. Its files are fixed:
269
+ `npm run check` refuses a change, and `makersclaw add chat` restores them.
270
+
271
+ ## Credits
272
+
273
+ The pill composer, tools, suggestions, feedback, edit, reasoning and header are ported from blocks.so (https://blocks.so, ai-01–05 and chat-01–03, MIT) and Creative Tim UI (https://github.com/creativetimofficial/ui, ai-chat-streaming-01, MIT), rewritten on the Makersclaw kit.
@@ -0,0 +1,95 @@
1
+ "use client";
2
+
3
+ import { Icon, IconButton, Image, Progress, cx } from "../../ui";
4
+
5
+ // Attachment — one file on a message or waiting in the composer: an icon
6
+ // for its kind (or the picture itself when it is an image with a `url`),
7
+ // its name and size, a bar while it uploads, the reason when it failed,
8
+ // and a remove button when `onRemove` is given.
9
+
10
+ const KINDS = [
11
+ [/^image\//, "image", "Image"],
12
+ [/^(audio|video)\//, "play", "Media"],
13
+ [/(zip|tar|gzip|compressed|x-7z|rar)/, "archive", "Archive"],
14
+ [/(spreadsheet|excel|csv)/, "grid", "Spreadsheet"],
15
+ [/(pdf|word|document|text|rtf|presentation|powerpoint)/, "file", "Document"],
16
+ ];
17
+ const BY_EXT = {
18
+ png: "image/png", jpg: "image/jpeg", jpeg: "image/jpeg", gif: "image/gif", webp: "image/webp", svg: "image/svg+xml",
19
+ pdf: "application/pdf", doc: "application/msword", docx: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
20
+ txt: "text/plain", md: "text/markdown", csv: "text/csv", xls: "application/vnd.ms-excel", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
21
+ zip: "application/zip", mp3: "audio/mpeg", mp4: "video/mp4", mov: "video/quicktime",
22
+ };
23
+
24
+ export function kindOf(type, name) {
25
+ const mime = type || BY_EXT[String(name ?? "").split(".").pop()?.toLowerCase()] || "";
26
+ for (const [re, icon, label] of KINDS) if (re.test(mime)) return { icon, label, image: icon === "image" };
27
+ return { icon: "file", label: "File", image: false };
28
+ }
29
+
30
+ /** 2048 → "2 KB", 5_300_000 → "5.1 MB". */
31
+ export function formatBytes(bytes) {
32
+ const n = Number(bytes);
33
+ if (!Number.isFinite(n) || n < 0) return "";
34
+ if (n < 1024) return `${n} B`;
35
+ const units = ["KB", "MB", "GB", "TB"];
36
+ let v = n / 1024;
37
+ let u = 0;
38
+ while (v >= 1024 && u < units.length - 1) {
39
+ v /= 1024;
40
+ u += 1;
41
+ }
42
+ return `${v >= 10 ? Math.round(v) : Math.round(v * 10) / 10} ${units[u]}`;
43
+ }
44
+
45
+ export function Attachment({ name, size, type, url, href, progress, error, onRemove, removeLabel, className }) {
46
+ const kind = kindOf(type, name);
47
+ const uploading = typeof progress === "number" && progress < 100 && !error;
48
+ const thumb = kind.image && url;
49
+ const open = href ?? (!uploading && !error ? url : undefined);
50
+ const facts = error ? error : uploading ? `Uploading… ${Math.round(progress)}%` : [kind.label, formatBytes(size)].filter(Boolean).join(" · ");
51
+
52
+ const title = open ? (
53
+ // raw: an attachment opens a file URL (often a blob: or a storage
54
+ // link) in a new tab; Button's href is next/link, which is for pages.
55
+ <a
56
+ href={open}
57
+ target="_blank"
58
+ rel="noreferrer"
59
+ className="block truncate rounded-sm text-sm font-medium outline-none hover:underline focus-visible:ring-2 focus-visible:ring-ring"
60
+ >
61
+ {name}
62
+ </a>
63
+ ) : (
64
+ <p className="truncate text-sm font-medium">{name}</p>
65
+ );
66
+
67
+ return (
68
+ <div
69
+ className={cx(
70
+ "flex w-64 max-w-full min-w-0 items-center gap-2.5 rounded-lg border bg-card p-2 text-card-foreground",
71
+ error ? "border-destructive/50" : "border-border",
72
+ className,
73
+ )}
74
+ >
75
+ {thumb ? (
76
+ <Image src={url} alt="" ratio="square" className="size-10 shrink-0" />
77
+ ) : (
78
+ <span className="flex size-10 shrink-0 items-center justify-center rounded-md bg-muted text-muted-foreground">
79
+ <Icon name={error ? "warning" : kind.icon} size={18} className={error ? "text-destructive" : undefined} />
80
+ </span>
81
+ )}
82
+ <div className="grid min-w-0 flex-1 gap-1">
83
+ {title}
84
+ {uploading ? (
85
+ <Progress value={progress} aria-label={`Uploading ${name}`} valueText={`${Math.round(progress)}%`} />
86
+ ) : (
87
+ <p className={cx("truncate text-xs", error ? "text-destructive" : "text-muted-foreground")}>{facts}</p>
88
+ )}
89
+ </div>
90
+ {onRemove ? (
91
+ <IconButton icon="x" size="sm" label={removeLabel ?? `Remove ${name}`} onClick={onRemove} className="-my-1" />
92
+ ) : null}
93
+ </div>
94
+ );
95
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "name": "chat",
3
+ "title": "Chat",
4
+ "description": "The parts of a chat: messages with avatars, times, grouping, sending/failed/streaming states, hover actions, thumbs up/down feedback, in-place editing and a folding reasoning section; a scroller that sticks to the bottom with day separators and older-message loading; a composer (a box or an \"ask anything\" pill) with attachments, a + menu, tools, suggestion chips, Enter to send and Stop; a header; and ChatThread, which composes them from messages + onSend.",
5
+ "useWhen": "A conversation lives inside the app's own screen: a support inbox reply pane, a customer-facing assistant, comments between teammates on a record, a thread per object. Not the app window's Agent tab (the OS draws that) and not a one-off job the founder commissions (job-panel).",
6
+ "tags": ["chat", "messages", "conversation", "thread", "assistant", "ai", "support", "inbox", "composer", "attachments", "streaming", "bubble", "reply", "feedback", "reasoning", "prompt", "suggestions", "ask anything", "header"],
7
+ "exports": ["ChatThread", "ChatHeader", "Message", "Bubble", "Attachment", "MessageScroller", "Composer"],
8
+ "files": ["index.js", "chat.jsx", "header.jsx", "message.jsx", "text.jsx", "attachment.jsx", "scroller.jsx", "composer.jsx"],
9
+ "requires": []
10
+ }
@@ -0,0 +1,132 @@
1
+ "use client";
2
+
3
+ import { isValidElement, useState } from "react";
4
+ import { Empty, cx } from "../../ui";
5
+ import { Composer } from "./composer";
6
+ import { ChatHeader } from "./header";
7
+ import { Message } from "./message";
8
+ import { MessageScroller } from "./scroller";
9
+
10
+ // ChatThread — a whole conversation from `messages` and `onSend`: the
11
+ // scrolling list (MessageScroller) of Message rows, and the Composer under
12
+ // it; a header over it when given one. The common case in one element;
13
+ // when a thread needs a shape this cannot take, compose the same parts
14
+ // yourself (README.md).
15
+ //
16
+ // <ChatThread messages={messages} onSend={send} streaming={busy} onStop={stop}
17
+ // onRetry={resend} assistantName="Support" height="36rem" />
18
+
19
+ export function ChatThread({
20
+ messages,
21
+ onSend,
22
+ onStop,
23
+ streaming,
24
+ onRetry,
25
+ onRegenerate,
26
+ actionsOf,
27
+ onFeedback,
28
+ onEdit,
29
+ onLoadMore,
30
+ hasMore = false,
31
+ loadingMore = false,
32
+ attachments,
33
+ onAttach,
34
+ onRemoveAttachment,
35
+ accept,
36
+ disabled = false,
37
+ disabledPlaceholder,
38
+ placeholder,
39
+ variant = "plain",
40
+ assistantName = "Assistant",
41
+ assistantAvatar,
42
+ userName = "You",
43
+ userAvatar,
44
+ showUserAvatar = false,
45
+ emptyTitle = "No messages yet",
46
+ emptyBody = "Write the first one below.",
47
+ emptyState,
48
+ header,
49
+ shape = "box",
50
+ tools,
51
+ menu,
52
+ suggestions,
53
+ suggestionsWhen = "empty",
54
+ suggestionsLook = "chips",
55
+ suggestionMode = "send",
56
+ label = "Conversation",
57
+ height = "min(40rem, 80dvh)",
58
+ className,
59
+ }) {
60
+ const list = messages ?? [];
61
+ // Streaming when told so, or when the last message says it still is.
62
+ const busy = streaming ?? list.some((m) => m.status === "streaming");
63
+ // The message being edited: one at a time, and ArrowUp in an empty
64
+ // composer opens the last one you sent.
65
+ const [editingId, setEditingId] = useState(null);
66
+ const lastMine = onEdit ? [...list].reverse().find((m) => m.role === "user" && m.status !== "sending") : null;
67
+ const showSuggestions = suggestions && suggestions.length && (suggestionsWhen === "always" || list.length === 0);
68
+
69
+ const top = !header ? null : isValidElement(header) || typeof header !== "object" ? header : <ChatHeader {...header} />;
70
+
71
+ return (
72
+ <section
73
+ aria-label={label}
74
+ style={height ? { height } : undefined}
75
+ className={cx("flex min-h-0 flex-col overflow-hidden rounded-lg border border-border bg-card text-card-foreground", className)}
76
+ >
77
+ {top}
78
+ <MessageScroller
79
+ messages={list}
80
+ onLoadMore={onLoadMore}
81
+ hasMore={hasMore}
82
+ loadingMore={loadingMore}
83
+ label={`${label} messages`}
84
+ className="flex-1"
85
+ emptyState={emptyState ?? <Empty icon="mail" title={emptyTitle} body={emptyBody} className="my-auto" />}
86
+ renderMessage={(m, ctx) => (
87
+ <Message
88
+ message={m}
89
+ first={ctx.first}
90
+ last={ctx.last}
91
+ latest={ctx.latest}
92
+ variant={variant}
93
+ assistantName={assistantName}
94
+ assistantAvatar={assistantAvatar}
95
+ userName={userName}
96
+ userAvatar={userAvatar}
97
+ showUserAvatar={showUserAvatar}
98
+ onRetry={onRetry}
99
+ onRegenerate={onRegenerate}
100
+ actionsOf={actionsOf}
101
+ onFeedback={onFeedback}
102
+ onEdit={onEdit}
103
+ editing={onEdit ? editingId === m.id : undefined}
104
+ onEditingChange={(next) => setEditingId(next ? m.id : null)}
105
+ />
106
+ )}
107
+ />
108
+ <div className="border-t border-border p-2 sm:p-3">
109
+ <Composer
110
+ onSend={onSend}
111
+ onStop={onStop}
112
+ streaming={busy}
113
+ disabled={disabled}
114
+ disabledPlaceholder={disabledPlaceholder}
115
+ placeholder={placeholder}
116
+ attachments={attachments}
117
+ onAttach={onAttach}
118
+ onRemoveAttachment={onRemoveAttachment}
119
+ accept={accept}
120
+ shape={shape}
121
+ tools={tools}
122
+ menu={menu}
123
+ suggestions={showSuggestions ? suggestions : undefined}
124
+ suggestionsLook={suggestionsLook}
125
+ suggestionsPlacement="above"
126
+ suggestionMode={suggestionMode}
127
+ onEditLast={lastMine && !disabled && !busy ? () => setEditingId(lastMine.id) : undefined}
128
+ />
129
+ </div>
130
+ </section>
131
+ );
132
+ }