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,313 @@
1
+ // The diagram's colours are the workspace's tokens.
2
+ //
3
+ // Mermaid draws with concrete colours and derives shades from them, so it
4
+ // cannot read var(--color-primary). At run time the block reads each token
5
+ // from the page (resolvePalette, the browser half at the bottom), and
6
+ // mermaidTheme turns that palette into Mermaid's `themeVariables`: node
7
+ // fills are soft tints of the primary and the chart hues on the card,
8
+ // lines are muted-foreground, text is the foreground, notes a warning tint,
9
+ // and the pie / git / mind-map colours are the chart hues. No colour value
10
+ // is written in this file: every one comes from the page.
11
+ //
12
+ // Everything but resolvePalette() is a plain function of plain objects,
13
+ // so it runs in node and on the server.
14
+
15
+ /** The tokens read from the page. */
16
+ export const SLOTS = [
17
+ "background",
18
+ "foreground",
19
+ "card",
20
+ "card-foreground",
21
+ "muted",
22
+ "muted-foreground",
23
+ "border",
24
+ "primary",
25
+ "primary-foreground",
26
+ "accent",
27
+ "destructive",
28
+ "success",
29
+ "warning",
30
+ "info",
31
+ "chart-1",
32
+ "chart-2",
33
+ "chart-3",
34
+ "chart-4",
35
+ "chart-5",
36
+ ];
37
+
38
+ const HEXISH = /^#?([0-9a-f]{6})([0-9a-f]{2})?$/i;
39
+
40
+ /** "#rrggbb" → [r, g, b], or null. */
41
+ export function parseHex(value) {
42
+ const m = HEXISH.exec(String(value ?? "").trim());
43
+ if (!m) return null;
44
+ const n = parseInt(m[1], 16);
45
+ return [(n >> 16) & 255, (n >> 8) & 255, n & 255];
46
+ }
47
+
48
+ const byte = (n) => Math.max(0, Math.min(255, Math.round(n))).toString(16).padStart(2, "0");
49
+ export const toHex = ([r, g, b]) => "#" + byte(r) + byte(g) + byte(b);
50
+
51
+ /** `t` of colour a over (1 - t) of colour b, both hex. */
52
+ export function mix(a, b, t) {
53
+ const x = parseHex(a);
54
+ const y = parseHex(b);
55
+ if (!x || !y) return a ?? b ?? null;
56
+ const k = Math.max(0, Math.min(1, t));
57
+ return toHex([0, 1, 2].map((i) => x[i] * k + y[i] * (1 - k)));
58
+ }
59
+
60
+ /** Relative luminance, 0 (black) … 1 (white). */
61
+ export function luminance(hex) {
62
+ const c = parseHex(hex);
63
+ if (!c) return 0;
64
+ const [r, g, b] = c.map((v) => {
65
+ const s = v / 255;
66
+ return s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;
67
+ });
68
+ return 0.2126 * r + 0.7152 * g + 0.0722 * b;
69
+ }
70
+
71
+ const contrast = (a, b) => {
72
+ const [x, y] = [luminance(a), luminance(b)].sort((p, q) => q - p);
73
+ return (x + 0.05) / (y + 0.05);
74
+ };
75
+
76
+ /** Of the theme's own ink and paper, whichever reads on `fill`. */
77
+ export function readableOn(fill, palette) {
78
+ const ink = palette.foreground;
79
+ const paper = palette.background;
80
+ if (!ink || !paper) return ink ?? paper;
81
+ return contrast(fill, ink) >= contrast(fill, paper) ? ink : paper;
82
+ }
83
+
84
+ /** A stable fingerprint: equal strings, nothing to redraw. */
85
+ export const paletteKey = (p) =>
86
+ Object.keys(p ?? {})
87
+ .sort()
88
+ .map((k) => `${k}=${p[k]}`)
89
+ .join(";");
90
+
91
+ /**
92
+ * Mermaid's `themeVariables` (theme "base") from a palette of hex colours.
93
+ * An empty palette gives {} — Mermaid's own base look — so a page without
94
+ * the tokens still draws.
95
+ */
96
+ export function mermaidTheme(palette, { fontFamily } = {}) {
97
+ const p = palette ?? {};
98
+ if (!p.foreground || !p.card) return fontFamily ? { fontFamily } : {};
99
+ const card = p.card;
100
+ const fg = p["card-foreground"] ?? p.foreground;
101
+ const soft = (slot, t = 0.16) => mix(p[slot] ?? p.primary ?? fg, card, t);
102
+ const edge = (slot, t = 0.6) => mix(p[slot] ?? p.primary ?? fg, card, t);
103
+ const dark = luminance(card) < 0.4;
104
+ const hues = ["chart-1", "chart-2", "chart-3", "chart-4", "chart-5"].map((s) => p[s] ?? p.primary ?? fg);
105
+ const hueAt = (i) => hues[i % hues.length];
106
+ const softAt = (i) => mix(hueAt(i), card, i < 5 ? 0.22 : 0.4);
107
+ const out = {
108
+ darkMode: dark,
109
+ background: card,
110
+ fontFamily: fontFamily || undefined,
111
+ fontSize: "14px",
112
+ useGradient: false,
113
+ dropShadow: "none",
114
+
115
+ primaryColor: soft("primary"),
116
+ primaryTextColor: fg,
117
+ primaryBorderColor: edge("primary"),
118
+ secondaryColor: soft("chart-2"),
119
+ secondaryTextColor: fg,
120
+ secondaryBorderColor: edge("chart-2"),
121
+ tertiaryColor: p.muted ?? soft("primary", 0.08),
122
+ tertiaryTextColor: fg,
123
+ tertiaryBorderColor: p.border ?? edge("primary", 0.3),
124
+ lineColor: p["muted-foreground"] ?? fg,
125
+ arrowheadColor: p["muted-foreground"] ?? fg,
126
+ textColor: fg,
127
+ titleColor: fg,
128
+ mainBkg: soft("primary"),
129
+ nodeBkg: soft("primary"),
130
+ nodeBorder: edge("primary"),
131
+ nodeTextColor: fg,
132
+ clusterBkg: p.muted ?? card,
133
+ clusterBorder: p.border ?? edge("primary", 0.3),
134
+ defaultLinkColor: p["muted-foreground"] ?? fg,
135
+ edgeLabelBackground: card,
136
+ labelBackgroundColor: card,
137
+
138
+ noteBkgColor: soft("warning", 0.16),
139
+ noteTextColor: fg,
140
+ noteBorderColor: edge("warning", 0.5),
141
+
142
+ // sequence
143
+ actorBkg: soft("primary"),
144
+ actorBorder: edge("primary"),
145
+ actorTextColor: fg,
146
+ actorLineColor: p["muted-foreground"] ?? fg,
147
+ signalColor: fg,
148
+ signalTextColor: fg,
149
+ labelBoxBkgColor: p.muted ?? card,
150
+ labelBoxBorderColor: p.border ?? fg,
151
+ labelTextColor: fg,
152
+ loopTextColor: fg,
153
+ activationBkgColor: p.muted ?? card,
154
+ activationBorderColor: p.border ?? fg,
155
+ sequenceNumberColor: readableOn(p["muted-foreground"] ?? fg, p),
156
+
157
+ // gantt
158
+ sectionBkgColor: p.muted ?? card,
159
+ altSectionBkgColor: card,
160
+ sectionBkgColor2: p.muted ?? card,
161
+ gridColor: p.border ?? fg,
162
+ taskBkgColor: soft("primary", 0.3),
163
+ taskBorderColor: edge("primary"),
164
+ taskTextColor: fg,
165
+ taskTextLightColor: fg,
166
+ taskTextDarkColor: fg,
167
+ taskTextOutsideColor: fg,
168
+ taskTextClickableColor: p.primary ?? fg,
169
+ activeTaskBkgColor: soft("chart-2", 0.3),
170
+ activeTaskBorderColor: edge("chart-2"),
171
+ doneTaskBkgColor: p.muted ?? card,
172
+ doneTaskBorderColor: p.border ?? fg,
173
+ critBkgColor: soft("destructive", 0.24),
174
+ critBorderColor: p.destructive ?? fg,
175
+ todayLineColor: p.destructive ?? fg,
176
+ vertLineColor: p["muted-foreground"] ?? fg,
177
+ excludeBkgColor: p.muted ?? card,
178
+
179
+ // state, class, er
180
+ stateBkg: soft("primary"),
181
+ stateLabelColor: fg,
182
+ compositeBackground: p.muted ?? card,
183
+ compositeTitleBackground: p.muted ?? card,
184
+ compositeBorder: p.border ?? fg,
185
+ altBackground: p.muted ?? card,
186
+ innerEndBackground: fg,
187
+ specialStateColor: fg,
188
+ transitionColor: p["muted-foreground"] ?? fg,
189
+ transitionLabelColor: fg,
190
+ classText: fg,
191
+ rowOdd: card,
192
+ rowEven: p.muted ?? card,
193
+ relationColor: p["muted-foreground"] ?? fg,
194
+ relationLabelBackground: card,
195
+ relationLabelColor: fg,
196
+ requirementBackground: soft("primary"),
197
+ requirementBorderColor: edge("primary"),
198
+ requirementTextColor: fg,
199
+
200
+ errorBkgColor: soft("destructive", 0.2),
201
+ errorTextColor: p.destructive ?? fg,
202
+
203
+ // pie
204
+ pieTitleTextColor: fg,
205
+ pieSectionTextColor: readableOn(hueAt(1), p),
206
+ pieLegendTextColor: fg,
207
+ pieStrokeColor: card,
208
+ pieOuterStrokeColor: p.border ?? card,
209
+ pieOpacity: "1",
210
+
211
+ // quadrant
212
+ quadrant1Fill: softAt(0),
213
+ quadrant2Fill: softAt(1),
214
+ quadrant3Fill: softAt(2),
215
+ quadrant4Fill: softAt(3),
216
+ quadrant1TextFill: fg,
217
+ quadrant2TextFill: fg,
218
+ quadrant3TextFill: fg,
219
+ quadrant4TextFill: fg,
220
+ quadrantPointFill: p.primary ?? fg,
221
+ quadrantPointTextFill: fg,
222
+ quadrantXAxisTextFill: fg,
223
+ quadrantYAxisTextFill: fg,
224
+ quadrantTitleFill: fg,
225
+ quadrantInternalBorderStrokeFill: p.border ?? fg,
226
+ quadrantExternalBorderStrokeFill: p.border ?? fg,
227
+
228
+ // xy chart
229
+ xyChart: {
230
+ backgroundColor: card,
231
+ titleColor: fg,
232
+ xAxisLabelColor: fg,
233
+ xAxisTitleColor: fg,
234
+ xAxisTickColor: p["muted-foreground"] ?? fg,
235
+ xAxisLineColor: p.border ?? fg,
236
+ yAxisLabelColor: fg,
237
+ yAxisTitleColor: fg,
238
+ yAxisTickColor: p["muted-foreground"] ?? fg,
239
+ yAxisLineColor: p.border ?? fg,
240
+ plotColorPalette: hues.join(","),
241
+ },
242
+ scaleLabelColor: fg,
243
+ commitLabelColor: fg,
244
+ commitLabelBackground: p.muted ?? card,
245
+ tagLabelColor: fg,
246
+ tagLabelBackground: p.muted ?? card,
247
+ tagLabelBorder: p.border ?? fg,
248
+ };
249
+ for (let i = 0; i < 12; i++) {
250
+ out[`pie${i + 1}`] = i < 5 ? hueAt(i) : mix(hueAt(i), card, 0.55);
251
+ out[`cScale${i}`] = softAt(i);
252
+ out[`cScaleLabel${i}`] = fg;
253
+ }
254
+ for (let i = 0; i < 8; i++) {
255
+ out[`git${i}`] = hueAt(i);
256
+ out[`gitInv${i}`] = readableOn(hueAt(i), p);
257
+ out[`gitBranchLabel${i}`] = readableOn(hueAt(i), p);
258
+ }
259
+ for (let i = 0; i < 8; i++) out[`fillType${i}`] = softAt(i);
260
+ return out;
261
+ }
262
+
263
+ // ---- the browser half -------------------------------------------------------
264
+
265
+ /** Read every slot from the CSS variables in effect at `el` (so a theme
266
+ * scoped to an ancestor counts). A probe takes `color: var(--color-…)`;
267
+ * the browser resolves var(), light-dark(), mixes and relative colours
268
+ * into its computed colour, and a 1×1 canvas turns that into bytes
269
+ * whatever syntax it came back in. */
270
+ export function resolvePalette(el) {
271
+ if (typeof document === "undefined" || !el) return {};
272
+ const probe = document.createElement("span");
273
+ probe.setAttribute("aria-hidden", "true");
274
+ probe.style.position = "absolute";
275
+ probe.style.visibility = "hidden";
276
+ probe.style.pointerEvents = "none";
277
+ el.appendChild(probe);
278
+ const canvas = document.createElement("canvas");
279
+ canvas.width = 1;
280
+ canvas.height = 1;
281
+ const ctx = canvas.getContext?.("2d", { willReadFrequently: true });
282
+ const out = {};
283
+ // The card first: a see-through token (the border is 15% ink) is laid
284
+ // over it, so what Mermaid gets is the colour as it looks on the card.
285
+ const order = ["card", ...SLOTS.filter((s) => s !== "card")];
286
+ try {
287
+ for (const slot of order) {
288
+ probe.style.color = "";
289
+ probe.style.color = `var(--color-${slot})`;
290
+ const computed = getComputedStyle(probe).color;
291
+ if (!computed) continue;
292
+ if (!ctx) {
293
+ const hex = parseHex(computed);
294
+ if (hex) out[slot] = toHex(hex);
295
+ continue;
296
+ }
297
+ ctx.clearRect(0, 0, 1, 1);
298
+ if (out.card) {
299
+ ctx.fillStyle = out.card;
300
+ ctx.fillRect(0, 0, 1, 1);
301
+ }
302
+ ctx.fillStyle = "transparent";
303
+ ctx.fillStyle = computed;
304
+ ctx.fillRect(0, 0, 1, 1);
305
+ const [r, g, b, a] = ctx.getImageData(0, 0, 1, 1).data;
306
+ if (a === 0) continue;
307
+ out[slot] = toHex([r, g, b]);
308
+ }
309
+ } finally {
310
+ probe.remove();
311
+ }
312
+ return out;
313
+ }
@@ -0,0 +1,98 @@
1
+ // Reading Mermaid text: what kind of diagram it is, and what went wrong.
2
+ // Plain functions of strings, so they run in node and on the server.
3
+
4
+ const KINDS = [
5
+ [/^flowchart\b|^graph\b/, "Flowchart"],
6
+ [/^sequenceDiagram\b/, "Sequence diagram"],
7
+ [/^classDiagram(?:-v2)?\b/, "Class diagram"],
8
+ [/^stateDiagram(?:-v2)?\b/, "State diagram"],
9
+ [/^erDiagram\b/, "Entity relationships"],
10
+ [/^journey\b/, "User journey"],
11
+ [/^gantt\b/, "Gantt chart"],
12
+ [/^pie\b/, "Pie chart"],
13
+ [/^quadrantChart\b/, "Quadrant chart"],
14
+ [/^requirementDiagram\b/, "Requirements"],
15
+ [/^gitGraph\b/, "Git graph"],
16
+ [/^mindmap\b/, "Mind map"],
17
+ [/^timeline\b/, "Timeline"],
18
+ [/^sankey(?:-beta)?\b/, "Sankey diagram"],
19
+ [/^xychart(?:-beta)?\b/, "XY chart"],
20
+ [/^block(?:-beta)?\b/, "Block diagram"],
21
+ [/^packet(?:-beta)?\b/, "Packet diagram"],
22
+ [/^kanban\b/, "Kanban"],
23
+ [/^architecture(?:-beta)?\b/, "Architecture"],
24
+ [/^radar(?:-beta)?\b/, "Radar chart"],
25
+ [/^C4\w*/, "C4 diagram"],
26
+ ];
27
+
28
+ /** The first line that says something: past blank lines, %% comments and
29
+ * a --- front-matter block. */
30
+ export function firstStatement(source) {
31
+ const lines = String(source ?? "").split("\n");
32
+ let i = 0;
33
+ if (lines[0]?.trim() === "---") {
34
+ i = 1;
35
+ while (i < lines.length && lines[i].trim() !== "---") i++;
36
+ i++;
37
+ }
38
+ for (; i < lines.length; i++) {
39
+ const t = lines[i].trim();
40
+ if (t && !t.startsWith("%%")) return { line: i + 1, text: t };
41
+ }
42
+ return null;
43
+ }
44
+
45
+ /** "Flowchart", "Sequence diagram"… or null when the text names no kind. */
46
+ export function diagramKind(source) {
47
+ const first = firstStatement(source);
48
+ if (!first) return null;
49
+ for (const [re, name] of KINDS) if (re.test(first.text)) return name;
50
+ return null;
51
+ }
52
+
53
+ /** The diagram's own title (`title …` in front matter or a line), or null. */
54
+ export function diagramTitle(source) {
55
+ const m = /^\s*(?:title\s*:?\s*)(.+)$/m.exec(String(source ?? ""));
56
+ return m ? m[1].trim().replace(/^["']|["']$/g, "") : null;
57
+ }
58
+
59
+ /**
60
+ * What a Mermaid error means, for people: { line, message, detail }.
61
+ * `line` is 1-based in the source, or null when Mermaid did not say.
62
+ * `message` is ours ("Line 3 has a mistake"), `detail` Mermaid's own
63
+ * words, trimmed of the ASCII art pointer.
64
+ */
65
+ export function describeError(error, source) {
66
+ const raw = String(error?.message ?? error?.str ?? error ?? "").trim();
67
+ const hash = error?.hash;
68
+ let line = null;
69
+ if (Number.isFinite(hash?.loc?.first_line)) line = hash.loc.first_line;
70
+ else if (Number.isFinite(hash?.line)) line = hash.line + 1;
71
+ else {
72
+ const m = /\bline[:\s]+(\d+)/i.exec(raw);
73
+ if (m) line = Number(m[1]);
74
+ }
75
+ const lines = String(source ?? "").split("\n");
76
+ if (line != null) line = Math.max(1, Math.min(lines.length, line));
77
+
78
+ if (!firstStatement(source)) return { line: null, message: "There is no diagram here yet", detail: "Start with a type on the first line: flowchart LR, sequenceDiagram, gantt, pie…" };
79
+ if (/No diagram type detected|UnknownDiagramError/i.test(raw) || (!diagramKind(source) && !line)) {
80
+ const first = firstStatement(source);
81
+ return {
82
+ line: first.line,
83
+ message: "The first line should name the diagram type",
84
+ detail: `"${first.text.slice(0, 40)}" is not one Mermaid knows. Try flowchart LR, sequenceDiagram, classDiagram, stateDiagram-v2, erDiagram, gantt, pie, mindmap or timeline.`,
85
+ };
86
+ }
87
+ const detail = raw
88
+ .split("\n")
89
+ .filter((l) => !/^\s*-*\^\s*$/.test(l) && !/^\.\.\./.test(l.trim()))
90
+ .filter((l) => !/^Parse error on line \d+:?$/i.test(l.trim()))
91
+ .join(" ")
92
+ .replace(/\s+/g, " ")
93
+ .replace(/^Error:\s*/, "")
94
+ .replace(/^Parsing failed:\s*/, "")
95
+ .replace(/ at offset: \d+, skipped \d+ characters?\./g, ".")
96
+ .trim();
97
+ return { line, message: line ? `Line ${line} has a mistake` : "Mermaid could not read this diagram", detail: detail || null };
98
+ }
@@ -0,0 +1,215 @@
1
+ # DocEditor
2
+
3
+ A Notion-style rich-text editor in the workspace theme. Type `/` for a
4
+ block (headings, lists, checklists, quotes, code, tables, images,
5
+ dividers), or use markdown shortcuts (`#`, `-`, `1.`, `[]`, `>`). Select
6
+ text for the formatting toolbar; hover a block for its drag handle. `@`
7
+ mentions a person, `{` inserts a merge field; both sit in the text as
8
+ chips. In `minimal` mode it is a comment box: no side menu, no `/` menu,
9
+ and Cmd/Ctrl+Enter submits.
10
+
11
+ It is [BlockNote](https://www.blocknotejs.org) (MPL-2.0) underneath, with
12
+ its colours, face and radius mapped onto the workspace's tokens. The
13
+ other text blocks — `doc-page`, `comment-box`, `record-notes`,
14
+ `email-composer`, `meeting-notes`, `brief-doc`, `knowledge-base` — are
15
+ built on this one: they import it, never `@blocknote/*`.
16
+
17
+ ```jsx
18
+ import { DocEditor, docToMarkdown } from "../components/blocks/doc-editor"; // a Makersclaw app ("./blocks/doc-editor" from components/)
19
+ import { DocEditor, docToMarkdown } from "@/components/makersclaw/blocks/doc-editor"; // a shadcn project
20
+ ```
21
+
22
+ `DocEditor` is a client component: render it from a `"use client"`
23
+ component. The helpers (`docToMarkdown`, `docToText`, `docChecklist`…) are
24
+ plain functions and work on the server too.
25
+
26
+ `makersclaw add doc-editor` adds `@blocknote/core`, `@blocknote/react` and
27
+ `@blocknote/shadcn` (pinned, exact) to package.json: run `npm install`
28
+ after. It loads with the page (no `import()`): the editor is created
29
+ after the first render, and until then — on the server — the box shows
30
+ the doc's words as plain text.
31
+
32
+ ## The data
33
+
34
+ The document is BlockNote's JSON: an array of blocks. Store it as it
35
+ comes out of `onChange` (a `jsonb` column).
36
+
37
+ ```js
38
+ [
39
+ { id: "…", type: "heading", props: { level: 2 }, content: [{ type: "text", text: "Launch", styles: {} }], children: [] },
40
+ { id: "…", type: "paragraph", content: [
41
+ { type: "text", text: "Hi ", styles: {} },
42
+ { type: "field", props: { key: "first_name", label: "First name" } },
43
+ { type: "text", text: ", ", styles: {} },
44
+ { type: "mention", props: { id: "u-42", label: "Priya Raman" } },
45
+ { type: "text", text: " will call.", styles: { bold: true } },
46
+ ], children: [] },
47
+ { id: "…", type: "checkListItem", props: { checked: false }, content: [{ type: "text", text: "Send the deck", styles: {} }], children: [] },
48
+ ]
49
+ ```
50
+
51
+ - Block types: `paragraph`, `heading` (`props.level` 1–3), `bulletListItem`,
52
+ `numberedListItem`, `checkListItem` (`props.checked`), `toggleListItem`,
53
+ `quote`, `codeBlock` (`props.language`), `table`, `image` (`props.url`,
54
+ `caption`), `divider`. Blocks nest through `children`.
55
+ - Inline content: `text` (`styles`: `bold`, `italic`, `underline`,
56
+ `strike`, `code`), `link` (`href`, `content`), and two of ours:
57
+ - `{ type: "mention", props: { id, label } }` — a person, drawn `@Label`.
58
+ - `{ type: "field", props: { key, label } }` — a merge field, drawn as a
59
+ chip with its label, written out as `{key}` or its value.
60
+ - When you write a doc by hand (a starter doc, a template), ids, `props`
61
+ and `children` may be left out and `content` may be a string:
62
+ `[{ type: "paragraph", content: "Hello" }]`. The editor gives blocks
63
+ ids on the first edit; give them ids yourself when something reads
64
+ them before that (`setChecklistItem` on a starter checklist).
65
+
66
+ ## Props
67
+
68
+ - `value` — the doc, controlled. A new `value` that differs from what the
69
+ editor last sent through `onChange` replaces the document (loading
70
+ another record). Pass back exactly what `onChange` gave you and nothing
71
+ resets.
72
+ - `defaultValue` — the starting doc, uncontrolled. With neither, the doc
73
+ starts empty.
74
+ - `onChange(doc)` — every edit, with the whole doc. Debounce a save
75
+ yourself (doc-page does).
76
+ - `editable` — `true` (default). `false` shows the doc read-only: no
77
+ caret, no menus.
78
+ - `placeholder` — shown while the doc is empty (and on the server while
79
+ it is).
80
+ - `minimal` — `false` (default). `true` for a comment box: no side menu
81
+ (drag handles, +), no `/` menu, no emoji picker, smaller text, no
82
+ padding of its own. Mentions, fields and the formatting toolbar still
83
+ work.
84
+ - `compact` — `false` (default). `true` keeps the full editor (menus,
85
+ handles) in a short box: 4rem at least instead of 10rem. For a doc cut
86
+ into many small sections (brief-doc).
87
+ - `autoFocus` — put the caret in it when it mounts.
88
+ - `onSubmit(doc)` — called on Cmd/Ctrl+Enter (and not passed to the
89
+ editor). Post a comment, send a reply. Clear the box yourself through
90
+ the handle (below).
91
+ - `onKeyDown(event)` — every other key, before the editor sees it
92
+ (`event.preventDefault()` stops it).
93
+ - `mentions` — `async (query) => [{ id, label, description? }]`: turns on
94
+ `@`. Called as the person types after `@` (`query` is the text after
95
+ it, `""` at first); return at most 20. A throw shows nothing. The chosen
96
+ person goes in as a mention chip.
97
+ - `fields` — `[{ key, label }]`: turns on merge fields. `{` opens a menu of
98
+ them, filtered as you type; the `/` menu lists them under "Fields".
99
+ Each goes in as a field chip showing its label.
100
+ - `slashItems` — more entries for the `/` menu: `[{ title, onSelect(handle),
101
+ subtext?, aliases?, group?, icon? }]`. `onSelect` gets the handle
102
+ (below); `group` puts it under a heading ("Other" when left out);
103
+ `icon` is a kit icon name. BlockNote's own entries come first.
104
+ - `uploadFile` — `async (file) => url`: lets an image block upload a
105
+ file (without it, an image is added by URL).
106
+ - `editorRef` — a ref (`useDocEditor()`) that receives the handle.
107
+ - `label` — the accessible name of the editing area ("Meeting notes").
108
+ - `className` — layout around it (width, margin, min-height). Never colour.
109
+
110
+ The handle (`editorRef.current`, and what a slash item's `onSelect` gets):
111
+
112
+ - `focus()` · `clear()` · `isEmpty()` · `getDoc()` · `setDoc(doc)`
113
+ - `insertText(text)` · `insertField(key, label?)` · `insertMention({ id, label })`
114
+ — at the caret.
115
+ - `editor` — the BlockNote editor itself, for anything else
116
+ (`editor.insertBlocks(…)`, `editor.getTextCursorPosition()`). Reaching
117
+ for it ties you to BlockNote's API; prefer the methods above.
118
+
119
+ The helpers (import them from the block; they take a doc and never throw
120
+ on a partial one):
121
+
122
+ - `emptyDoc()` — `[{ type: "paragraph", content: [] }]`.
123
+ - `isDocEmpty(doc)` — no text, chip or non-paragraph block. Use it to
124
+ disable Post.
125
+ - `docToText(doc, { fields? })` — plain text: one line per block (an empty
126
+ paragraph is an empty line), children indented, list markers kept
127
+ (`- `, `1. `, `[ ] `/`[x] `), a mention as `@Label`, a field as its value
128
+ or `{key}`. `fields` is `{ key: value }` or `(key, props) => value`; an
129
+ empty value leaves `{key}` in place.
130
+ - `docToMarkdown(doc, { fields? })` — GitHub markdown: headings, nested
131
+ lists, `- [ ]` checklists, quotes, fenced code, tables, images, dividers,
132
+ bold/italic/strike/code, links; mentions and fields as in `docToText`.
133
+ Lossy where markdown has no word: underline, colours, alignment.
134
+ - `docChecklist(doc)` — `[{ id, text, checked, depth, mentions: [{ id,
135
+ label }] }]`, every checklist item in order, nested ones too. Read an
136
+ owner off its mentions.
137
+ - `setChecklistItem(doc, id, checked)` — a new doc with that item ticked
138
+ or not (for a side list of action items).
139
+ - `docFields(doc)` — `[{ key, label, count }]`, the merge fields the doc
140
+ uses, in order of first use. Compare with a recipient's values to warn
141
+ of a missing one.
142
+ - `docMentions(doc)` — `[{ id, label, count }]`, the people it mentions.
143
+
144
+ ## Example
145
+
146
+ ```jsx
147
+ // components/DealNotes.jsx — client
148
+ "use client";
149
+ import { useState } from "react";
150
+ import { updateRow } from "../lib/actions";
151
+ import { DocEditor } from "./blocks/doc-editor";
152
+
153
+ export default function DealNotes({ deal, team }) {
154
+ const [doc, setDoc] = useState(deal.notes); // jsonb, may be null
155
+ return (
156
+ <DocEditor
157
+ value={doc}
158
+ onChange={(d) => {
159
+ setDoc(d);
160
+ updateRow({ source: "public.deals", id: deal.id, patch: { notes: d } }); // debounce this in a real app
161
+ }}
162
+ mentions={async (q) => team.filter((p) => p.name.toLowerCase().includes(q.toLowerCase())).map((p) => ({ id: p.id, label: p.name }))}
163
+ placeholder="Notes on this deal…"
164
+ label="Deal notes"
165
+ />
166
+ );
167
+ }
168
+ ```
169
+
170
+ A comment box that posts on Cmd/Ctrl+Enter and clears itself:
171
+
172
+ ```jsx
173
+ const box = useDocEditor();
174
+ const post = async (doc) => {
175
+ if (isDocEmpty(doc)) return;
176
+ const res = await insertRow({ source: "public.comments", values: { body: doc, body_text: docToText(doc) } });
177
+ if (res.ok) box.current?.clear();
178
+ };
179
+
180
+ <DocEditor minimal editorRef={box} onSubmit={post} mentions={findPeople} placeholder="Write a comment…" />
181
+ ```
182
+
183
+ An email body with merge fields, filled per recipient:
184
+
185
+ ```jsx
186
+ const FIELDS = [{ key: "first_name", label: "First name" }, { key: "company", label: "Company" }];
187
+
188
+ <DocEditor value={body} onChange={setBody} fields={FIELDS} />
189
+ const text = docToText(body, { fields: contact }); // "Hi Ana, …"
190
+ const missing = docFields(body).filter((f) => !contact[f.key]); // warn before sending
191
+ ```
192
+
193
+ ## What it will not do
194
+
195
+ - Collaborate live (several carets at once): that is BlockNote's Yjs
196
+ mode, not wired here. Saves are last-write-wins.
197
+ - Export to PDF or Word, multi-column layouts or AI writing: those are
198
+ BlockNote's `xl-` packages (GPL / commercial), which never come here.
199
+ - Colour text: the toolbar has no colour picker (the theme has no red or
200
+ purple to offer). Coloured text pasted in is shown in status and chart
201
+ tokens.
202
+ - Upload files, audio or video: an image by URL, or through your
203
+ `uploadFile`.
204
+ - Render on the server as rich text: the server shows the plain text
205
+ (`docToText`) until the editor mounts. For a read-only page that must
206
+ be rich in the HTML, render `docToMarkdown` yourself.
207
+
208
+ An editor it cannot be is your own component in `components/` — not an
209
+ edit to this block. Its files are fixed: `npm run check` refuses a change,
210
+ and `makersclaw add doc-editor` restores them.
211
+
212
+ ## Credits
213
+
214
+ BlockNote (https://github.com/TypeCellOS/BlockNote), MPL-2.0 — installed
215
+ from npm as a dependency, not copied here. See THIRD-PARTY-NOTICES.md.
@@ -0,0 +1,15 @@
1
+ {
2
+ "name": "doc-editor",
3
+ "title": "DocEditor",
4
+ "description": "A Notion-style rich-text editor (BlockNote) painted in the workspace theme: headings, lists, checklists, quotes, code, tables, images and dividers from a / menu or markdown shortcuts, a formatting toolbar, drag handles; @mentions and {merge fields} as inline chips; a minimal mode for comment boxes with Cmd/Ctrl+Enter to submit. The document is BlockNote JSON; helpers turn it into markdown or plain text and read its checklist, fields and mentions.",
5
+ "useWhen": "A screen edits rich text: a wiki or doc page, notes on a record, a brief, meeting notes, an email body with merge fields, a comment field with mentions. The other text blocks (doc-page, record-notes, comment-box…) are built on it. Not for one line of plain text (the kit's Input) or a form of fields (record-form).",
6
+ "tags": ["editor", "rich text", "document", "notion", "blocknote", "markdown", "notes", "wiki", "mention", "merge field", "slash", "comment", "checklist", "wysiwyg"],
7
+ "exports": ["DocEditor", "useDocEditor", "docToMarkdown", "docToText", "emptyDoc", "isDocEmpty", "docChecklist", "setChecklistItem", "docFields", "docMentions"],
8
+ "files": ["index.js", "doc-editor.jsx", "schema.jsx", "theme.js", "doc.js", "shadcn-classes.js"],
9
+ "requires": [],
10
+ "dependencies": {
11
+ "@blocknote/core": "0.55.0",
12
+ "@blocknote/react": "0.55.0",
13
+ "@blocknote/shadcn": "0.55.0"
14
+ }
15
+ }