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,568 @@
1
+ "use client";
2
+
3
+ import { useId, useState } from "react";
4
+ import { Button, Card, Checkbox, Field, Icon, Input, Notice, PasswordInput, Select, Separator, cx } from "../../ui";
5
+
6
+ // AuthForm — the screens around an account: sign in, sign up, a magic
7
+ // link, a reset link, and changing a password. It draws the form and
8
+ // holds its state; the auth itself is the caller's. Every submit goes out
9
+ // through an async callback that returns { ok } or { ok: false, error },
10
+ // and the form shows the error. See README.md beside this file.
11
+
12
+ const PROVIDERS = {
13
+ google: { label: "Google", icon: "google" },
14
+ github: { label: "GitHub", icon: "github" },
15
+ apple: { label: "Apple", icon: "apple" },
16
+ microsoft: { label: "Microsoft", icon: "microsoft" },
17
+ sso: { label: "single sign-on (SSO)", icon: "key" },
18
+ };
19
+
20
+ /** The default rules a new password is checked against. */
21
+ export const PASSWORD_RULES = [
22
+ { label: "At least 8 characters", test: (v) => v.length >= 8 },
23
+ { label: "An uppercase letter (A–Z)", test: (v) => /[A-Z]/.test(v) },
24
+ { label: "A lowercase letter (a–z)", test: (v) => /[a-z]/.test(v) },
25
+ { label: "A number (0–9)", test: (v) => /\d/.test(v) },
26
+ { label: "A symbol, like ! ? # or %", test: (v) => /[^A-Za-z0-9\s]/.test(v) },
27
+ ];
28
+
29
+ const COPY = {
30
+ "sign-in": {
31
+ title: "Sign in",
32
+ description: "Welcome back. Enter your details to continue.",
33
+ submit: "Sign in",
34
+ verb: "Sign in with",
35
+ },
36
+ "sign-up": {
37
+ title: "Create your account",
38
+ description: "Start with your name and work email.",
39
+ submit: "Create account",
40
+ verb: "Sign up with",
41
+ },
42
+ "magic-link": {
43
+ title: "Sign in with a link",
44
+ description: "We email you a link that signs you in. No password to remember.",
45
+ submit: "Email me a link",
46
+ verb: "Continue with",
47
+ },
48
+ reset: {
49
+ title: "Reset your password",
50
+ description: "Enter the email you signed up with and we send you a link to choose a new one.",
51
+ submit: "Send reset link",
52
+ verb: "Continue with",
53
+ },
54
+ "change-password": {
55
+ title: "Change password",
56
+ description: "Choose a strong password you do not use anywhere else.",
57
+ submit: "Update password",
58
+ verb: "Continue with",
59
+ },
60
+ };
61
+
62
+ const MODES = Object.keys(COPY);
63
+
64
+ const DEFAULT_FIELDS = [{ name: "name", label: "Full name", autoComplete: "name", required: true }];
65
+
66
+ function providerOf(p) {
67
+ const id = typeof p === "string" ? p : p.id;
68
+ const known = PROVIDERS[id] ?? {};
69
+ return { id, label: (typeof p === "object" && p.label) || known.label || id, icon: (typeof p === "object" && p.icon) || known.icon || "log-in" };
70
+ }
71
+
72
+ // A link to another screen: an href (a route) or a function (switch in place).
73
+ function Go({ to, children }) {
74
+ if (!to) return null;
75
+ return typeof to === "function" ? (
76
+ <Button variant="link" size="inherit" onClick={to}>
77
+ {children}
78
+ </Button>
79
+ ) : (
80
+ <Button variant="link" size="inherit" href={to}>
81
+ {children}
82
+ </Button>
83
+ );
84
+ }
85
+
86
+ function failure(result) {
87
+ return result && result.ok === false ? result.error || "That did not work. Try again." : null;
88
+ }
89
+
90
+ async function attempt(fn) {
91
+ try {
92
+ return failure(await fn());
93
+ } catch (e) {
94
+ return e?.message || String(e);
95
+ }
96
+ }
97
+
98
+ /** The password rules as a live checklist: met rules turn on as you type. */
99
+ function RuleList({ rules, value, id }) {
100
+ return (
101
+ <ul id={id} className="grid gap-1.5" aria-label="Password rules">
102
+ {rules.map((rule) => {
103
+ const met = Boolean(rule.test(value));
104
+ return (
105
+ <li key={rule.label} className={cx("flex items-center gap-2 text-sm", met ? "text-foreground" : "text-muted-foreground")}>
106
+ <Icon name={met ? "circle-check" : "circle"} size={16} className={cx("shrink-0", met ? "text-success" : "text-muted-foreground")} />
107
+ <span>{rule.label}</span>
108
+ <span className="sr-only">{met ? "(met)" : "(not met yet)"}</span>
109
+ </li>
110
+ );
111
+ })}
112
+ </ul>
113
+ );
114
+ }
115
+
116
+ export function AuthForm({
117
+ mode = "sign-in",
118
+ onSubmit,
119
+ providers = [],
120
+ onProvider,
121
+ providersFirst = false,
122
+ password = true,
123
+ remember = false,
124
+ fields = DEFAULT_FIELDS,
125
+ confirm = true,
126
+ rules,
127
+ requireCurrent = true,
128
+ acceptTerms = false,
129
+ newsletter,
130
+ links = {},
131
+ onCancel,
132
+ logo,
133
+ title,
134
+ description,
135
+ submitLabel,
136
+ layout = "card",
137
+ defaultEmail = "",
138
+ tips,
139
+ className,
140
+ }) {
141
+ const m = MODES.includes(mode) ? mode : "sign-in";
142
+ const copy = COPY[m];
143
+ const uid = useId();
144
+ const idOf = (name) => `${uid}-${name}`;
145
+
146
+ const signUp = m === "sign-up";
147
+ const change = m === "change-password";
148
+ const emailOnly = m === "magic-link" || m === "reset";
149
+ const askPassword = (m === "sign-in" && password) || signUp;
150
+ const newRules = rules === false ? [] : rules ?? (change ? PASSWORD_RULES : []);
151
+ const extra = signUp ? fields ?? [] : [];
152
+
153
+ const [values, setValues] = useState(() => ({ email: defaultEmail, remember: false, terms: false, newsletter: false }));
154
+ const [errors, setErrors] = useState({});
155
+ const [error, setError] = useState(null);
156
+ const [busy, setBusy] = useState(null); // "submit" or a provider id
157
+ const [sent, setSent] = useState(null); // the email a link went to
158
+ const [done, setDone] = useState(false);
159
+
160
+ const set = (name) => (e) => {
161
+ const v = e?.target ? (e.target.type === "checkbox" ? e.target.checked : e.target.value) : e;
162
+ setValues((s) => ({ ...s, [name]: v }));
163
+ if (errors[name]) setErrors((s) => ({ ...s, [name]: undefined }));
164
+ if (done) setDone(false);
165
+ };
166
+
167
+ const newPassword = String((change ? values.newPassword : values.password) ?? "");
168
+ const choosing = signUp || change; // a new password is being chosen
169
+
170
+ async function submit(e) {
171
+ e.preventDefault();
172
+ if (busy) return;
173
+ setError(null);
174
+ const next = {};
175
+ if (choosing && newRules.length && !newRules.every((r) => r.test(newPassword))) {
176
+ next[change ? "newPassword" : "password"] = "Meet every rule in the list.";
177
+ }
178
+ if (choosing && confirm && values.confirm !== newPassword) next.confirm = "The two passwords do not match.";
179
+ if (change && requireCurrent && values.currentPassword && values.currentPassword === newPassword) {
180
+ next.newPassword = "Choose a password different from the current one.";
181
+ }
182
+ if (signUp && acceptTerms && !values.terms) next.terms = "Agree to the terms to continue.";
183
+ setErrors(next);
184
+ if (Object.values(next).some(Boolean)) return;
185
+
186
+ const payload = {};
187
+ if (!change) payload.email = values.email.trim();
188
+ if (askPassword) payload.password = values.password ?? "";
189
+ if (m === "sign-in" && remember) payload.remember = Boolean(values.remember);
190
+ for (const f of extra) payload[f.name] = values[f.name] ?? (f.type === "select" ? f.options?.[0]?.value ?? "" : "");
191
+ if (signUp && newsletter) payload.newsletter = Boolean(values.newsletter);
192
+ if (signUp && acceptTerms) payload.terms = true;
193
+ if (change) {
194
+ if (requireCurrent) payload.currentPassword = values.currentPassword ?? "";
195
+ payload.newPassword = newPassword;
196
+ }
197
+
198
+ setBusy("submit");
199
+ const failed = await attempt(() => onSubmit?.(payload, m));
200
+ setBusy(null);
201
+ if (failed) {
202
+ setError(failed);
203
+ return;
204
+ }
205
+ if (emailOnly) setSent(payload.email);
206
+ if (change) {
207
+ setDone(true);
208
+ setValues((s) => ({ ...s, currentPassword: "", newPassword: "", confirm: "" }));
209
+ }
210
+ }
211
+
212
+ async function provider(id) {
213
+ if (busy) return;
214
+ setError(null);
215
+ setBusy(id);
216
+ const failed = await attempt(() => onProvider?.(id));
217
+ setBusy(null);
218
+ if (failed) setError(failed);
219
+ }
220
+
221
+ const heading = title ?? copy.title;
222
+ const lede = description === undefined ? copy.description : description;
223
+ const list = (providers ?? []).filter(Boolean).map(providerOf);
224
+ const paired = providersFirst && list.length === 2;
225
+
226
+ const providerButtons = list.length ? (
227
+ <div className={cx("grid gap-2", paired && "sm:grid-cols-2")}>
228
+ {list.map((p) => (
229
+ <Button
230
+ key={p.id}
231
+ variant="secondary"
232
+ icon={p.icon}
233
+ loading={busy === p.id}
234
+ disabled={Boolean(busy) && busy !== p.id}
235
+ aria-label={paired ? `${copy.verb} ${p.label}` : undefined}
236
+ onClick={() => provider(p.id)}
237
+ >
238
+ {paired ? p.label : `${copy.verb} ${p.label}`}
239
+ </Button>
240
+ ))}
241
+ </div>
242
+ ) : null;
243
+
244
+ const disabled = Boolean(busy);
245
+
246
+ // The screen a link-sending mode shows once the link is on its way.
247
+ if (sent) {
248
+ const body = (
249
+ <div className="grid justify-items-center gap-3 text-center">
250
+ {logo ? <div className="mb-1 flex">{logo}</div> : null}
251
+ <span className="grid size-12 place-items-center rounded-full bg-muted text-foreground">
252
+ <Icon name="mail" size={22} />
253
+ </span>
254
+ <h2 className="text-xl font-semibold">Check your email</h2>
255
+ <p className="text-sm text-muted-foreground">
256
+ {m === "reset" ? "If an account exists for " : "We sent a sign-in link to "}
257
+ <span className="font-medium text-foreground">{sent}</span>
258
+ {m === "reset" ? ", a link to reset the password is on its way." : ". It works once and expires soon."}
259
+ </p>
260
+ <Button variant="secondary" className="mt-2 w-full" onClick={() => setSent(null)}>
261
+ Use a different email
262
+ </Button>
263
+ {links["sign-in"] ? (
264
+ <p className="text-sm text-muted-foreground">
265
+ <Go to={links["sign-in"]}>Back to sign in</Go>
266
+ </p>
267
+ ) : null}
268
+ </div>
269
+ );
270
+ return <Frame layout={layout} className={className}>{body}</Frame>;
271
+ }
272
+
273
+ const forgot = m === "sign-in" && askPassword && links.reset ? <Go to={links.reset}>Forgot password?</Go> : null;
274
+ const passwordRule = choosing && newRules.length ? idOf("rules") : undefined;
275
+
276
+ const form = (
277
+ <form onSubmit={submit} className="grid gap-4" aria-describedby={error ? idOf("error") : undefined}>
278
+ {extra.length ? (
279
+ <div className="grid gap-4 sm:grid-cols-2">
280
+ {extra.map((f) => (
281
+ <Field key={f.name} id={idOf(f.name)} label={f.label} hint={f.hint} required={f.required} error={errors[f.name]} className={f.half ? "" : "sm:col-span-2"}>
282
+ {f.type === "select" ? (
283
+ <Select id={idOf(f.name)} options={f.options ?? []} value={values[f.name] ?? f.options?.[0]?.value ?? ""} onChange={set(f.name)} disabled={disabled} required={f.required} />
284
+ ) : (
285
+ <Input
286
+ id={idOf(f.name)}
287
+ type={f.type ?? "text"}
288
+ autoComplete={f.autoComplete}
289
+ placeholder={f.placeholder}
290
+ required={f.required}
291
+ value={values[f.name] ?? ""}
292
+ onChange={set(f.name)}
293
+ disabled={disabled}
294
+ />
295
+ )}
296
+ </Field>
297
+ ))}
298
+ </div>
299
+ ) : null}
300
+
301
+ {!change ? (
302
+ <Field id={idOf("email")} label="Email" error={errors.email}>
303
+ <Input
304
+ id={idOf("email")}
305
+ type="email"
306
+ autoComplete={signUp ? "email" : "username"}
307
+ inputMode="email"
308
+ placeholder="you@company.com"
309
+ required
310
+ value={values.email}
311
+ onChange={set("email")}
312
+ disabled={disabled}
313
+ />
314
+ </Field>
315
+ ) : null}
316
+
317
+ {change && requireCurrent ? (
318
+ <Field id={idOf("currentPassword")} label="Current password" error={errors.currentPassword}>
319
+ <PasswordInput id={idOf("currentPassword")} required value={values.currentPassword ?? ""} onChange={set("currentPassword")} disabled={disabled} />
320
+ </Field>
321
+ ) : null}
322
+
323
+ {askPassword || change ? (
324
+ <div className="grid gap-1.5">
325
+ {forgot ? (
326
+ <div className="flex items-baseline justify-between gap-3">
327
+ <label htmlFor={idOf("password")} className="text-sm font-medium text-foreground">
328
+ Password
329
+ </label>
330
+ <span className="text-sm">{forgot}</span>
331
+ </div>
332
+ ) : null}
333
+ <Field
334
+ id={idOf(change ? "newPassword" : "password")}
335
+ label={forgot ? undefined : change ? "New password" : "Password"}
336
+ error={errors[change ? "newPassword" : "password"]}
337
+ >
338
+ <PasswordInput
339
+ id={idOf(change ? "newPassword" : "password")}
340
+ autoComplete={choosing ? "new-password" : "current-password"}
341
+ required
342
+ value={(change ? values.newPassword : values.password) ?? ""}
343
+ onChange={set(change ? "newPassword" : "password")}
344
+ aria-describedby={passwordRule}
345
+ disabled={disabled}
346
+ />
347
+ </Field>
348
+ </div>
349
+ ) : null}
350
+
351
+ {choosing && confirm ? (
352
+ <Field id={idOf("confirm")} label={change ? "Confirm new password" : "Confirm password"} error={errors.confirm}>
353
+ <PasswordInput id={idOf("confirm")} autoComplete="new-password" required value={values.confirm ?? ""} onChange={set("confirm")} disabled={disabled} />
354
+ </Field>
355
+ ) : null}
356
+
357
+ {choosing && newRules.length && !change ? <RuleList id={passwordRule} rules={newRules} value={newPassword} /> : null}
358
+
359
+ {m === "sign-in" && remember ? (
360
+ <Checkbox id={idOf("remember")} label={typeof remember === "string" ? remember : "Remember me"} checked={values.remember} onChange={set("remember")} disabled={disabled} />
361
+ ) : null}
362
+
363
+ {signUp && (newsletter || acceptTerms) ? (
364
+ <div className="grid">
365
+ {newsletter ? (
366
+ <Checkbox id={idOf("newsletter")} label={typeof newsletter === "string" ? newsletter : "Send me product news, now and then"} checked={values.newsletter} onChange={set("newsletter")} disabled={disabled} />
367
+ ) : null}
368
+ {acceptTerms ? (
369
+ <>
370
+ <Checkbox
371
+ id={idOf("terms")}
372
+ label={<TermsText links={links} lead="I agree to the" />}
373
+ checked={values.terms}
374
+ onChange={set("terms")}
375
+ disabled={disabled}
376
+ aria-invalid={errors.terms ? true : undefined}
377
+ />
378
+ {errors.terms ? (
379
+ <p role="alert" className="text-xs text-destructive">
380
+ {errors.terms}
381
+ </p>
382
+ ) : null}
383
+ </>
384
+ ) : null}
385
+ </div>
386
+ ) : null}
387
+
388
+ {error ? (
389
+ <div id={idOf("error")}>
390
+ <Notice tone="danger">{error}</Notice>
391
+ </div>
392
+ ) : null}
393
+ {done ? <Notice tone="success">Password updated. Use the new one next time you sign in.</Notice> : null}
394
+
395
+ <div className={cx(change && onCancel ? "flex flex-col-reverse gap-2 sm:flex-row sm:justify-end" : "grid")}>
396
+ {change && onCancel ? (
397
+ <Button variant="secondary" onClick={onCancel} disabled={disabled}>
398
+ Cancel
399
+ </Button>
400
+ ) : null}
401
+ <Button type="submit" variant="primary" loading={busy === "submit"} disabled={disabled && busy !== "submit"}>
402
+ {submitLabel ?? copy.submit}
403
+ </Button>
404
+ </div>
405
+ </form>
406
+ );
407
+
408
+ const divider = list.length ? <Separator label={providersFirst ? "or with email" : "or"} /> : null;
409
+
410
+ const footer = (
411
+ <FooterLinks mode={m} links={links} acceptTerms={acceptTerms} />
412
+ );
413
+
414
+ const main = (
415
+ <div className="grid gap-6">
416
+ <Head logo={logo} title={heading} description={lede} center={layout !== "plain"} />
417
+ {providersFirst ? providerButtons : null}
418
+ {providersFirst ? divider : null}
419
+ {form}
420
+ {!providersFirst ? divider : null}
421
+ {!providersFirst ? providerButtons : null}
422
+ {footer}
423
+ </div>
424
+ );
425
+
426
+ if (change && newRules.length) {
427
+ return (
428
+ <Frame layout={layout} className={className} wide>
429
+ <div className="grid gap-6 md:grid-cols-[minmax(0,1fr)_minmax(0,18rem)]">
430
+ <div className="grid content-start gap-6">
431
+ <Head logo={logo} title={heading} description={lede} icon="shield" />
432
+ {form}
433
+ </div>
434
+ <aside className="grid content-start gap-4 rounded-lg bg-muted p-4" aria-label="Password requirements">
435
+ <div className="grid gap-1">
436
+ <h3 className="flex items-center gap-2 text-sm font-semibold">
437
+ <Icon name="shield-check" size={16} className="text-muted-foreground" />
438
+ Password requirements
439
+ </h3>
440
+ <p className="text-sm text-muted-foreground">Your new password needs every one of these.</p>
441
+ </div>
442
+ <RuleList id={passwordRule} rules={newRules} value={newPassword} />
443
+ {tips?.length ? (
444
+ <div className="grid gap-2 border-t border-border pt-4">
445
+ <h4 className="text-sm font-medium">Good habits</h4>
446
+ <ul className="grid list-disc gap-1 pl-5 text-sm text-muted-foreground">
447
+ {tips.map((t) => (
448
+ <li key={t}>{t}</li>
449
+ ))}
450
+ </ul>
451
+ </div>
452
+ ) : null}
453
+ </aside>
454
+ </div>
455
+ </Frame>
456
+ );
457
+ }
458
+
459
+ return (
460
+ <Frame layout={layout} className={className}>
461
+ {main}
462
+ </Frame>
463
+ );
464
+ }
465
+
466
+ function Head({ logo, title, description, center, icon }) {
467
+ return (
468
+ <header className={cx("grid gap-2", center && "justify-items-center text-center")}>
469
+ {logo ? <div className="mb-1 flex">{logo}</div> : null}
470
+ {icon && !logo ? (
471
+ <span className="mb-1 grid size-10 place-items-center rounded-md bg-muted text-foreground">
472
+ <Icon name={icon} size={20} />
473
+ </span>
474
+ ) : null}
475
+ <h2 className="text-2xl font-semibold leading-tight tracking-tight">{title}</h2>
476
+ {description ? <p className="text-sm text-muted-foreground">{description}</p> : null}
477
+ </header>
478
+ );
479
+ }
480
+
481
+ function TermsText({ links, lead }) {
482
+ const terms = links.terms;
483
+ const privacy = links.privacy;
484
+ return (
485
+ <span>
486
+ {lead} {terms ? <Go to={terms}>Terms of Service</Go> : "Terms of Service"}
487
+ {privacy ? (
488
+ <>
489
+ {" "}and <Go to={privacy}>Privacy Policy</Go>
490
+ </>
491
+ ) : null}
492
+ </span>
493
+ );
494
+ }
495
+
496
+ function FooterLinks({ mode, links, acceptTerms }) {
497
+ const rows = [];
498
+ if (mode === "sign-in" && links["sign-up"]) {
499
+ rows.push(
500
+ <p key="up">
501
+ No account yet? <Go to={links["sign-up"]}>Sign up</Go>
502
+ </p>,
503
+ );
504
+ }
505
+ if (mode === "sign-in" && links["magic-link"]) {
506
+ rows.push(
507
+ <p key="ml">
508
+ <Go to={links["magic-link"]}>Email me a sign-in link instead</Go>
509
+ </p>,
510
+ );
511
+ }
512
+ if (mode === "magic-link" && links["sign-in"]) {
513
+ rows.push(
514
+ <p key="pw">
515
+ <Go to={links["sign-in"]}>Sign in with a password instead</Go>
516
+ </p>,
517
+ );
518
+ }
519
+ if (mode === "magic-link" && links["sign-up"]) {
520
+ rows.push(
521
+ <p key="up">
522
+ First time here? <Go to={links["sign-up"]}>Create an account</Go>
523
+ </p>,
524
+ );
525
+ }
526
+ if (mode === "sign-up" && links["sign-in"]) {
527
+ rows.push(
528
+ <p key="in">
529
+ Already have an account? <Go to={links["sign-in"]}>Sign in</Go>
530
+ </p>,
531
+ );
532
+ }
533
+ if (mode === "reset" && links["sign-in"]) {
534
+ rows.push(
535
+ <p key="in">
536
+ Remembered it? <Go to={links["sign-in"]}>Back to sign in</Go>
537
+ </p>,
538
+ );
539
+ }
540
+ const legal = !acceptTerms && mode !== "change-password" && (links.terms || links.privacy);
541
+ if (!rows.length && !legal) return null;
542
+ return (
543
+ <div className="grid gap-3 text-center text-sm text-muted-foreground">
544
+ {rows}
545
+ {legal ? (
546
+ <p className="text-xs">
547
+ <TermsText links={links} lead="By continuing, you agree to our" />.
548
+ </p>
549
+ ) : null}
550
+ </div>
551
+ );
552
+ }
553
+
554
+ // Where the form sits: a card (the default), plain (in your own column),
555
+ // or page (centred in the window, for a route of its own).
556
+ function Frame({ layout, wide, className, children }) {
557
+ const width = wide ? "max-w-3xl" : "max-w-sm";
558
+ if (layout === "plain") return <div className={cx("w-full", width, className)}>{children}</div>;
559
+ const card = (
560
+ <Card className={cx("w-full p-6 sm:p-8", width, layout !== "page" && className)} padding="none">
561
+ {children}
562
+ </Card>
563
+ );
564
+ if (layout === "page") {
565
+ return <div className={cx("grid min-h-dvh w-full place-items-center px-4 py-10", className)}>{card}</div>;
566
+ }
567
+ return card;
568
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "name": "auth-form",
3
+ "title": "AuthForm",
4
+ "description": "The account screens in one form: sign in (password, email only, or provider buttons for Google, GitHub, Apple and Microsoft), sign up with extra fields, a magic link, a reset link, and changing a password against a live rules checklist. The auth is yours: each submit is an async callback that returns { ok } or an error the form shows.",
5
+ "useWhen": "An app needs a sign-in, sign-up, forgot-password or change-password screen, or a settings page where a signed-in person changes their password.",
6
+ "tags": ["auth", "login", "sign in", "sign up", "register", "password", "reset password", "forgot password", "change password", "magic link", "oauth", "google", "github", "sso", "account"],
7
+ "exports": ["AuthForm", "PASSWORD_RULES"],
8
+ "files": ["index.js", "auth-form.jsx"],
9
+ "requires": []
10
+ }