makersclaw 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (473) 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/install.mjs +18 -0
  430. package/src/shadcn.mjs +8 -0
  431. package/templates/next/files/README.md +145 -11
  432. package/templates/next/files/app/globals.css +55 -4
  433. package/templates/next/files/check/run.mjs +3 -3
  434. package/templates/next/files/components/ui/avatar.jsx +141 -0
  435. package/templates/next/files/components/ui/breadcrumb.jsx +149 -0
  436. package/templates/next/files/components/ui/button-group.jsx +70 -0
  437. package/templates/next/files/components/ui/button.jsx +132 -12
  438. package/templates/next/files/components/ui/calendar.jsx +609 -0
  439. package/templates/next/files/components/ui/carousel.jsx +281 -0
  440. package/templates/next/files/components/ui/collapsible.jsx +208 -0
  441. package/templates/next/files/components/ui/combobox.jsx +608 -0
  442. package/templates/next/files/components/ui/command.jsx +577 -0
  443. package/templates/next/files/components/ui/context-menu.jsx +191 -0
  444. package/templates/next/files/components/ui/date-picker.jsx +360 -0
  445. package/templates/next/files/components/ui/distribution.jsx +117 -0
  446. package/templates/next/files/components/ui/feedback.jsx +143 -0
  447. package/templates/next/files/components/ui/field.jsx +115 -3
  448. package/templates/next/files/components/ui/file-input.jsx +234 -0
  449. package/templates/next/files/components/ui/icon.jsx +130 -8
  450. package/templates/next/files/components/ui/image.jsx +143 -0
  451. package/templates/next/files/components/ui/index.js +47 -2
  452. package/templates/next/files/components/ui/input-group.jsx +213 -0
  453. package/templates/next/files/components/ui/input-otp.jsx +170 -0
  454. package/templates/next/files/components/ui/item.jsx +206 -0
  455. package/templates/next/files/components/ui/menu.jsx +454 -82
  456. package/templates/next/files/components/ui/notice.jsx +126 -14
  457. package/templates/next/files/components/ui/pagination.jsx +156 -0
  458. package/templates/next/files/components/ui/popover.jsx +284 -0
  459. package/templates/next/files/components/ui/radio.jsx +193 -0
  460. package/templates/next/files/components/ui/rating.jsx +131 -0
  461. package/templates/next/files/components/ui/resizable.jsx +338 -0
  462. package/templates/next/files/components/ui/scroll-area.jsx +123 -0
  463. package/templates/next/files/components/ui/separator.jsx +119 -0
  464. package/templates/next/files/components/ui/sheet.jsx +96 -11
  465. package/templates/next/files/components/ui/slider.jsx +174 -0
  466. package/templates/next/files/components/ui/stat.jsx +574 -0
  467. package/templates/next/files/components/ui/steps.jsx +338 -0
  468. package/templates/next/files/components/ui/swatch.jsx +33 -0
  469. package/templates/next/files/components/ui/table.jsx +130 -0
  470. package/templates/next/files/components/ui/toast.jsx +440 -0
  471. package/templates/next/files/components/ui/toggle.jsx +195 -0
  472. package/templates/next/files/components/ui/tooltip.jsx +270 -0
  473. package/templates/next/template.json +264 -8
@@ -0,0 +1,7 @@
1
+ // The Gantt block — `makersclaw add gantt` (it brings task-model). Tasks
2
+ // on a timeline: drag, resize, link, zoom, the critical path. Fixed:
3
+ // compose it through its props (README.md beside this file); a timeline
4
+ // it cannot be is your own component in components/, built from
5
+ // task-model's helpers and these schedule helpers.
6
+ export { Gantt } from "./gantt";
7
+ export { ZOOMS, ganttRange, headerTiers, planMove, afterBlockersPatch, isMilestone, summarySpan, arrowPath } from "./schedule";
@@ -0,0 +1,468 @@
1
+ "use client";
2
+
3
+ import { useEffect, useState } from "react";
4
+ import { Avatar, Button, Icon, Input, Menu, StatusDot, cx } from "../../ui";
5
+ import { GroupLabel, formatDate, useDraggableTask, useDropTarget } from "../task-model";
6
+ import { daysFromPixels, lengthOf } from "./schedule";
7
+
8
+ // The gantt's rows: the list pane's row (a task, a group heading, a
9
+ // quick-add) and the timeline's row (a bar, a milestone diamond, a
10
+ // summary bracket, or — for a task without dates — a ghost bar that
11
+ // schedules it where it is clicked). Geometry comes in from gantt.jsx;
12
+ // what a drag did goes back out through `on`.
13
+
14
+ export const ROW = 36;
15
+ export const ADD_ROW = 48;
16
+ const BAR_H = 24;
17
+
18
+ // Bar colours, written out whole so Tailwind finds every class: a
19
+ // project's hue (chart-1…5) or a status tone. `fill` is the progress.
20
+ export const TINTS = {
21
+ 1: { bar: "bg-chart-1/25 border-chart-1/70", fill: "bg-chart-1/45", solid: "bg-chart-1" },
22
+ 2: { bar: "bg-chart-2/25 border-chart-2/70", fill: "bg-chart-2/45", solid: "bg-chart-2" },
23
+ 3: { bar: "bg-chart-3/25 border-chart-3/70", fill: "bg-chart-3/45", solid: "bg-chart-3" },
24
+ 4: { bar: "bg-chart-4/25 border-chart-4/70", fill: "bg-chart-4/45", solid: "bg-chart-4" },
25
+ 5: { bar: "bg-chart-5/25 border-chart-5/70", fill: "bg-chart-5/45", solid: "bg-chart-5" },
26
+ primary: { bar: "bg-primary/25 border-primary/70", fill: "bg-primary/45", solid: "bg-primary" },
27
+ info: { bar: "bg-info/25 border-info/70", fill: "bg-info/45", solid: "bg-info" },
28
+ success: { bar: "bg-success/25 border-success/70", fill: "bg-success/45", solid: "bg-success" },
29
+ warning: { bar: "bg-warning/25 border-warning/70", fill: "bg-warning/45", solid: "bg-warning" },
30
+ danger: { bar: "bg-destructive/25 border-destructive/70", fill: "bg-destructive/45", solid: "bg-destructive" },
31
+ neutral: { bar: "bg-muted-foreground/15 border-muted-foreground/55", fill: "bg-muted-foreground/30", solid: "bg-muted-foreground" },
32
+ };
33
+
34
+ /** "Sep 22 – 26" · "Sep 29 – Oct 3" · "Sep 22" */
35
+ export function spanWords(span, locale) {
36
+ if (!span) return "No dates";
37
+ const a = formatDate(span.start, { month: "short", day: "numeric" }, { locale });
38
+ if (span.start === span.end) return a;
39
+ const sameMonth = span.start.slice(0, 7) === span.end.slice(0, 7);
40
+ const b = formatDate(span.end, sameMonth ? { day: "numeric" } : { month: "short", day: "numeric" }, { locale });
41
+ return `${a} – ${b}`;
42
+ }
43
+
44
+ // ---- the list pane -------------------------------------------------------
45
+
46
+ /** A group's heading in the list pane: fold, face, count. */
47
+ export function GroupRow({ group, by, ctx, folded, onFold, hot, onHot, count }) {
48
+ return (
49
+ <div
50
+ className={cx("flex items-center gap-1 border-t border-border bg-muted/40 pe-2 ps-1 first:border-t-0", hot && "bg-accent/60")}
51
+ style={{ height: ROW }}
52
+ onPointerEnter={onHot}
53
+ >
54
+ {/* raw: the heading folds its group; a kit Button would centre it
55
+ and weigh it as an action. */}
56
+ <button
57
+ type="button"
58
+ aria-expanded={!folded}
59
+ onClick={onFold}
60
+ className="flex h-8 min-w-0 flex-1 items-center gap-1.5 rounded-md px-1 text-left outline-none hover:bg-accent focus-visible:ring-2 focus-visible:ring-ring"
61
+ >
62
+ <Icon name={folded ? "chevron-right" : "chevron-down"} size={14} className="shrink-0 text-muted-foreground" />
63
+ <GroupLabel group={group} by={by} ctx={ctx} className="min-w-0" />
64
+ <span data-nums className="shrink-0 text-xs font-normal tabular-nums text-muted-foreground">
65
+ {count}
66
+ </span>
67
+ </button>
68
+ </div>
69
+ );
70
+ }
71
+
72
+ /** A task's row in the list pane: fold (a parent), status, title, the
73
+ * first face and its length; a menu on hover. */
74
+ export function ListRow({ row, ctx, hot, onHot, onFold, onOpen, menu, conflict, blockers }) {
75
+ const t = row.task;
76
+ const status = ctx.statusById.get(String(t.status));
77
+ const person = t.assignees?.[0] ? ctx.personById.get(t.assignees[0]) : null;
78
+ const len = lengthOf(row.span);
79
+ const title = t.title || "Untitled";
80
+ return (
81
+ <div
82
+ className={cx("group/row flex items-center gap-1.5 pe-1", hot && "bg-accent/60")}
83
+ style={{ height: ROW, paddingInlineStart: 4 + row.depth * 16 }}
84
+ onPointerEnter={onHot}
85
+ >
86
+ {row.hasChildren ? (
87
+ // raw: a 24px fold inside a 36px row; the kit's IconButton is a
88
+ // 36/44px target that would push the title out of line.
89
+ <button
90
+ type="button"
91
+ aria-expanded={!row.collapsed}
92
+ aria-label={`${row.collapsed ? "Show" : "Hide"} the subtasks of ${title}`}
93
+ onClick={onFold}
94
+ className="inline-flex size-6 shrink-0 items-center justify-center rounded-sm text-muted-foreground outline-none hover:bg-accent hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring"
95
+ >
96
+ <Icon name={row.collapsed ? "chevron-right" : "chevron-down"} size={14} />
97
+ </button>
98
+ ) : (
99
+ <span aria-hidden="true" className="size-6 shrink-0" />
100
+ )}
101
+ {row.milestone ? (
102
+ <Icon name="diamond" size={12} className="shrink-0 text-muted-foreground" />
103
+ ) : (
104
+ <StatusDot tone={status ? status.tone ?? (status.hue ? undefined : "neutral") : "neutral"} hue={status?.hue} size="sm" />
105
+ )}
106
+ {onOpen ? (
107
+ // raw: a title that opens the task; a kit Button would centre and
108
+ // pad it as an action.
109
+ <button
110
+ type="button"
111
+ title={title}
112
+ onClick={() => onOpen(t)}
113
+ className={cx(
114
+ "min-w-0 flex-1 truncate rounded-sm text-left text-sm outline-none hover:underline focus-visible:ring-2 focus-visible:ring-ring",
115
+ row.done && "text-muted-foreground line-through",
116
+ row.hasChildren && "font-medium",
117
+ )}
118
+ >
119
+ {title}
120
+ </button>
121
+ ) : (
122
+ <span title={title} className={cx("min-w-0 flex-1 truncate text-sm", row.done && "text-muted-foreground line-through", row.hasChildren && "font-medium")}>
123
+ {title}
124
+ </span>
125
+ )}
126
+ {conflict ? (
127
+ <span className="shrink-0 text-destructive" title={`Starts before ${blockers} ends`}>
128
+ <Icon name="warning" size={14} />
129
+ <span className="sr-only">Starts before {blockers} ends</span>
130
+ </span>
131
+ ) : null}
132
+ {person ? <Avatar name={person.name} src={person.src} size="xs" className="hidden shrink-0 sm:inline-flex" /> : null}
133
+ <span data-nums className="hidden w-8 shrink-0 text-end text-xs tabular-nums text-muted-foreground sm:inline">
134
+ {len ? `${len}d` : "–"}
135
+ <span className="sr-only">{len ? (len === 1 ? " day" : " days") : "no dates"}</span>
136
+ </span>
137
+ {menu?.length ? (
138
+ <Menu
139
+ label={`More for ${title}`}
140
+ items={menu}
141
+ className="shrink-0 opacity-0 transition-opacity duration-150 focus-visible:opacity-100 group-hover/row:opacity-100 group-focus-within/row:opacity-100 aria-expanded:opacity-100 [@media(hover:none)]:opacity-100"
142
+ />
143
+ ) : null}
144
+ </div>
145
+ );
146
+ }
147
+
148
+ /** The last row of a group: "Add task", then a field — Enter adds and
149
+ * stays open for the next one, Escape closes. */
150
+ export function QuickAdd({ group, open, onOpen, onClose, onCreate, addLabel, uid }) {
151
+ const [draft, setDraft] = useState("");
152
+ const [busy, setBusy] = useState(false);
153
+ const id = `${uid}-add-${group.key}`;
154
+ async function submit() {
155
+ const title = draft.trim();
156
+ if (!title || busy) return;
157
+ setBusy(true);
158
+ const r = await onCreate(title, group.key);
159
+ setBusy(false);
160
+ if (r?.ok !== false) setDraft("");
161
+ }
162
+ return (
163
+ <div className="flex items-center px-1.5" style={{ height: ADD_ROW }}>
164
+ {open ? (
165
+ <>
166
+ <label htmlFor={id} className="sr-only">
167
+ New task in {group.label}
168
+ </label>
169
+ <Input
170
+ id={id}
171
+ autoFocus
172
+ value={draft}
173
+ disabled={busy}
174
+ placeholder="Task name, then Enter"
175
+ onChange={(e) => setDraft(e.target.value)}
176
+ onKeyDown={(e) => {
177
+ if (e.key === "Enter" && !e.nativeEvent.isComposing) {
178
+ e.preventDefault();
179
+ submit();
180
+ } else if (e.key === "Escape") {
181
+ setDraft("");
182
+ onClose();
183
+ }
184
+ }}
185
+ onBlur={() => {
186
+ if (!draft.trim()) onClose();
187
+ }}
188
+ />
189
+ </>
190
+ ) : (
191
+ <Button variant="quiet" size="sm" icon="plus" align="start" onClick={onOpen} className="text-muted-foreground">
192
+ {addLabel}
193
+ </Button>
194
+ )}
195
+ </div>
196
+ );
197
+ }
198
+
199
+ // ---- the timeline --------------------------------------------------------
200
+
201
+ /** A task's row on the timeline: the drop target a link lands on, and
202
+ * whatever the task draws. */
203
+ export function TimelineRow({ row, hot, onHot, linking, children }) {
204
+ const drop = useDropTarget(`drop:${row.key}`, { task: row.task, label: row.task.title || "Untitled" }, { disabled: !linking });
205
+ const over = drop.isOver && drop.active?.data?.kind === "link" && drop.active.data.task.id !== row.task.id;
206
+ return (
207
+ <div ref={drop.setNodeRef} className={cx("relative", hot && "bg-accent/40", over && "z-[6]")} style={{ height: ROW }} onPointerEnter={onHot} data-over={over || undefined}>
208
+ {typeof children === "function" ? children(over) : children}
209
+ </div>
210
+ );
211
+ }
212
+
213
+ /** A task's bar: drag the body to move it, an edge to change its start or
214
+ * end, the dot past its end onto another bar to make that one wait on
215
+ * it. Arrow keys move it a day; Shift changes its end, Alt its start.
216
+ * A parent's bar is a summary bracket (moves with its subtasks); a
217
+ * milestone is a diamond on its day. */
218
+ export function Bar({
219
+ row,
220
+ x,
221
+ w,
222
+ dayWidth,
223
+ tint,
224
+ shape = "bar",
225
+ editable,
226
+ onOpen,
227
+ onPreview,
228
+ onNudge,
229
+ clickGuard,
230
+ dim,
231
+ critical,
232
+ over,
233
+ moving,
234
+ hintId,
235
+ locale,
236
+ }) {
237
+ const t = row.task;
238
+ const title = t.title || "Untitled";
239
+ const bar = shape === "bar";
240
+ const move = useDraggableTask(`bar:${row.key}`, { task: t, kind: "move", label: title }, { disabled: !editable });
241
+ const start = useDraggableTask(`start:${row.key}`, { task: t, kind: "start", label: `the start of ${title}` }, { disabled: !editable || !bar });
242
+ const end = useDraggableTask(`end:${row.key}`, { task: t, kind: "end", label: `the end of ${title}` }, { disabled: !editable || !bar });
243
+ const link = useDraggableTask(`link:${row.key}`, { task: t, kind: "link", label: `a link from ${title}` }, { disabled: !editable });
244
+
245
+ const active = move.isDragging ? ["move", move] : start.isDragging ? ["start", start] : end.isDragging ? ["end", end] : null;
246
+ const days = active ? daysFromPixels(active[1].transform?.x, dayWidth) : 0;
247
+ const kind = active?.[0];
248
+ useEffect(() => {
249
+ if (kind) onPreview?.(t.id, kind, days);
250
+ }, [kind, days, t.id, onPreview]);
251
+
252
+ const words = spanWords(row.span, locale);
253
+ const len = lengthOf(row.span);
254
+ const progress = typeof row.progress === "number" ? Math.max(0, Math.min(100, row.progress)) : null;
255
+ const label = `${title}${shape === "milestone" ? ", milestone" : ""}, ${words}${len > 1 ? `, ${len} days` : ""}${progress !== null && bar ? `, ${Math.round(progress)}% done` : ""}${row.done ? ", done" : ""}`;
256
+ const inside = bar && w >= 64;
257
+ const dragging = Boolean(kind) || moving;
258
+
259
+ function onKeyDown(e) {
260
+ if (!editable) {
261
+ if ((e.key === "Enter" || e.key === " ") && onOpen) {
262
+ e.preventDefault();
263
+ onOpen(t);
264
+ }
265
+ return;
266
+ }
267
+ if (e.key === "ArrowLeft" || e.key === "ArrowRight") {
268
+ e.preventDefault();
269
+ const step = e.key === "ArrowRight" ? 1 : -1;
270
+ onNudge(t.id, bar && e.shiftKey ? "end" : bar && e.altKey ? "start" : "move", step);
271
+ } else if (e.key === "Enter" || e.key === " ") {
272
+ e.preventDefault();
273
+ if (moving) onNudge(t.id, null, 0, "flush");
274
+ else onOpen?.(t);
275
+ } else if (e.key === "Escape" && moving) {
276
+ e.preventDefault();
277
+ onNudge(t.id, null, 0, "cancel");
278
+ }
279
+ }
280
+
281
+ const body = cx(
282
+ "absolute outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-card",
283
+ editable ? "cursor-grab touch-manipulation active:cursor-grabbing" : onOpen ? "cursor-pointer" : "cursor-default",
284
+ over && "ring-2 ring-primary ring-offset-1 ring-offset-card",
285
+ critical && !over && "ring-2 ring-primary/70",
286
+ );
287
+ const handle = editable ? { ...move.handle } : {};
288
+ // Our keys, not dnd-kit's keyboard drag: a bar moves by whole days.
289
+ const common = {
290
+ ...handle,
291
+ ref: move.setNodeRef,
292
+ role: onOpen || editable ? "button" : "img",
293
+ tabIndex: onOpen || editable ? 0 : undefined,
294
+ "aria-roledescription": editable ? "timeline bar" : undefined,
295
+ "aria-describedby": editable ? hintId : undefined,
296
+ "aria-label": label,
297
+ onKeyDown,
298
+ onClick: () => {
299
+ if (clickGuard?.()) return;
300
+ onOpen?.(t);
301
+ },
302
+ };
303
+
304
+ return (
305
+ <div
306
+ className={cx(
307
+ "group/bar absolute",
308
+ !dragging && "motion-safe:transition-[left,width,opacity] motion-safe:duration-150",
309
+ dim && !dragging && "opacity-40",
310
+ dragging && "z-20",
311
+ )}
312
+ style={{ left: x, width: w, top: shape === "bar" ? (ROW - BAR_H) / 2 : 0, height: shape === "bar" ? BAR_H : ROW }}
313
+ >
314
+ {shape === "milestone" ? (
315
+ // raw: a draggable diamond on the timeline; no kit part is a
316
+ // shape that moves.
317
+ <div {...common} className={cx(body, "left-1/2 top-1/2 size-3.5 -translate-x-1/2 -translate-y-1/2 rotate-45 rounded-[3px] shadow-sm", row.done ? "bg-success" : tint.solid)} />
318
+ ) : shape === "summary" ? (
319
+ // raw: the summary bracket over a parent's subtasks; it drags the
320
+ // whole family.
321
+ <div {...common} className={cx(body, "inset-x-0 top-1/2 h-3 -translate-y-1/2 rounded-sm")}>
322
+ <span aria-hidden="true" className="absolute inset-x-0 top-0 h-1.5 rounded-sm bg-foreground/70" />
323
+ <span aria-hidden="true" className="absolute start-0 top-0 h-3 w-1.5 rounded-b-sm bg-foreground/70" />
324
+ <span aria-hidden="true" className="absolute end-0 top-0 h-3 w-1.5 rounded-b-sm bg-foreground/70" />
325
+ </div>
326
+ ) : (
327
+ // raw: the bar is a draggable, resizable shape; a kit Button would
328
+ // centre and pad it as an action.
329
+ <div
330
+ {...common}
331
+ className={cx(
332
+ body,
333
+ "inset-0 overflow-hidden rounded-md border text-xs text-foreground shadow-xs",
334
+ tint.bar,
335
+ row.done && "opacity-70",
336
+ dragging && "shadow-md",
337
+ )}
338
+ >
339
+ {progress ? <span aria-hidden="true" className={cx("absolute inset-y-0 start-0", tint.fill)} style={{ width: `${progress}%` }} /> : null}
340
+ {inside ? (
341
+ <span className="relative flex h-full items-center gap-1 px-2">
342
+ {row.done ? <Icon name="check" size={12} className="shrink-0 text-success" /> : null}
343
+ <span className={cx("truncate font-medium", row.done && "line-through decoration-muted-foreground")}>{title}</span>
344
+ </span>
345
+ ) : null}
346
+ </div>
347
+ )}
348
+
349
+ {editable && bar ? (
350
+ <>
351
+ {/* raw: pointer-only edge grips (the keyboard uses Shift/Alt +
352
+ arrows); dnd-kit's listeners go on the element that drags. */}
353
+ <span
354
+ ref={start.setNodeRef}
355
+ {...start.handle}
356
+ role={undefined}
357
+ tabIndex={-1}
358
+ aria-hidden="true"
359
+ className="absolute inset-y-0 -start-1 z-10 flex w-3 cursor-ew-resize touch-none items-center justify-center opacity-0 transition-opacity duration-150 group-hover/bar:opacity-100 [@media(hover:none)]:hidden"
360
+ >
361
+ <span className="h-3 w-1 rounded-full bg-foreground/50" />
362
+ </span>
363
+ <span
364
+ ref={end.setNodeRef}
365
+ {...end.handle}
366
+ role={undefined}
367
+ tabIndex={-1}
368
+ aria-hidden="true"
369
+ className="absolute inset-y-0 -end-1 z-10 flex w-3 cursor-ew-resize touch-none items-center justify-center opacity-0 transition-opacity duration-150 group-hover/bar:opacity-100 [@media(hover:none)]:hidden"
370
+ >
371
+ <span className="h-3 w-1 rounded-full bg-foreground/50" />
372
+ </span>
373
+ </>
374
+ ) : null}
375
+ {editable ? (
376
+ <LinkDot link={link} title={title} />
377
+ ) : null}
378
+
379
+ {/* The words beside the bar: its title when it does not fit inside,
380
+ its dates on hover, focus and while it moves. */}
381
+ <span
382
+ className={cx(
383
+ "pointer-events-none absolute top-1/2 flex -translate-y-1/2 items-center gap-2 whitespace-nowrap ps-2 text-xs",
384
+ editable ? "start-[calc(100%+14px)]" : "start-full",
385
+ )}
386
+ >
387
+ {!inside ? <span className={cx("font-medium text-foreground", row.done && "text-muted-foreground line-through")}>{title}</span> : null}
388
+ <span
389
+ data-nums
390
+ className={cx(
391
+ "tabular-nums text-muted-foreground transition-opacity duration-150",
392
+ dragging ? "opacity-100" : "opacity-0 group-hover/bar:opacity-100 group-focus-within/bar:opacity-100",
393
+ )}
394
+ >
395
+ {words}
396
+ {len > 1 ? ` · ${len}d` : ""}
397
+ </span>
398
+ </span>
399
+ </div>
400
+ );
401
+ }
402
+
403
+ // The dot past a bar's end: drag it onto another bar to link them. While
404
+ // it is dragged, a dashed line follows the pointer.
405
+ function LinkDot({ link, title }) {
406
+ const tx = link.transform?.x ?? 0;
407
+ const ty = link.transform?.y ?? 0;
408
+ return (
409
+ <>
410
+ {/* raw: a pointer-only link grip (the keyboard links from the row's
411
+ menu, "Waits on"). */}
412
+ <span
413
+ ref={link.setNodeRef}
414
+ {...link.handle}
415
+ role={undefined}
416
+ tabIndex={-1}
417
+ aria-hidden="true"
418
+ title={`Drag onto another task to make it wait on ${title}`}
419
+ className={cx(
420
+ "absolute -end-3.5 top-1/2 z-10 flex size-4 -translate-y-1/2 cursor-crosshair touch-none items-center justify-center",
421
+ link.isDragging ? "opacity-100" : "opacity-0 transition-opacity duration-150 group-hover/bar:opacity-100 [@media(hover:none)]:hidden",
422
+ )}
423
+ >
424
+ <span className="size-2.5 rounded-full border-2 border-primary bg-card" />
425
+ </span>
426
+ {link.isDragging ? (
427
+ // raw: an SVG drawing — the link being drawn; no kit part draws one.
428
+ <svg aria-hidden="true" className="pointer-events-none absolute -end-1.5 top-1/2 z-20 overflow-visible" width="1" height="1">
429
+ <path d={`M0 0 L${tx} ${ty}`} className="stroke-primary" strokeWidth={1.5} strokeDasharray="4 3" fill="none" />
430
+ <circle cx={tx} cy={ty} r={3.5} className="fill-primary" />
431
+ </svg>
432
+ ) : null}
433
+ </>
434
+ );
435
+ }
436
+
437
+ /** A task with no dates: a ghost bar follows the pointer; a click (or a
438
+ * tap) schedules it there. */
439
+ export function Unscheduled({ row, dayWidth, length, onSchedule }) {
440
+ const [day, setDay] = useState(null);
441
+ const dayAt = (e) => {
442
+ const r = e.currentTarget.getBoundingClientRect();
443
+ return Math.max(0, Math.floor((e.clientX - r.left) / dayWidth));
444
+ };
445
+ const w = Math.max(length * dayWidth, 24);
446
+ return (
447
+ // raw: a whole timeline row is the place to click; a kit Button would
448
+ // be one small target in a row a person points anywhere along.
449
+ <button
450
+ type="button"
451
+ aria-label={`Schedule ${row.task.title || "Untitled"}: pick a day`}
452
+ tabIndex={-1}
453
+ className="absolute inset-0 cursor-copy outline-none"
454
+ onPointerMove={(e) => setDay(dayAt(e))}
455
+ onPointerLeave={() => setDay(null)}
456
+ onClick={(e) => onSchedule(row.task, dayAt(e))}
457
+ >
458
+ {day !== null ? (
459
+ <span
460
+ className="pointer-events-none absolute flex items-center overflow-hidden whitespace-nowrap rounded-md border border-dashed border-primary/60 bg-primary/5 px-2 text-xs text-muted-foreground"
461
+ style={{ left: day * dayWidth, width: w, top: (ROW - BAR_H) / 2, height: BAR_H }}
462
+ >
463
+ {w >= 96 ? "Click to schedule" : ""}
464
+ </span>
465
+ ) : null}
466
+ </button>
467
+ );
468
+ }