@fungi.computer/caps 0.0.0-stage → 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (387) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1125 -2
  3. package/dist/blocks/app-bar.d.ts +43 -0
  4. package/dist/blocks/app-bar.js +244 -0
  5. package/dist/blocks/app-status-bar.d.ts +93 -0
  6. package/dist/blocks/app-status-bar.js +42 -0
  7. package/dist/blocks/async-state.d.ts +21 -0
  8. package/dist/blocks/async-state.js +8 -0
  9. package/dist/blocks/card-grid.d.ts +11 -0
  10. package/dist/blocks/card-grid.js +21 -0
  11. package/dist/blocks/command-menu.d.ts +26 -0
  12. package/dist/blocks/command-menu.js +70 -0
  13. package/dist/blocks/composer.d.ts +23 -0
  14. package/dist/blocks/composer.js +13 -0
  15. package/dist/blocks/empty-state.d.ts +59 -0
  16. package/dist/blocks/empty-state.js +35 -0
  17. package/dist/blocks/faq-chat.d.ts +62 -0
  18. package/dist/blocks/faq-chat.js +77 -0
  19. package/dist/blocks/game-share-card.d.ts +17 -0
  20. package/dist/blocks/game-share-card.js +9 -0
  21. package/dist/blocks/launcher-grid.d.ts +50 -0
  22. package/dist/blocks/launcher-grid.js +11 -0
  23. package/dist/blocks/listing-detail.d.ts +23 -0
  24. package/dist/blocks/listing-detail.js +12 -0
  25. package/dist/blocks/loading-state.d.ts +5 -0
  26. package/dist/blocks/loading-state.js +8 -0
  27. package/dist/blocks/mosaic.d.ts +29 -0
  28. package/dist/blocks/mosaic.js +19 -0
  29. package/dist/blocks/permission-grid.d.ts +45 -0
  30. package/dist/blocks/permission-grid.js +14 -0
  31. package/dist/blocks/pricing-card.d.ts +53 -0
  32. package/dist/blocks/pricing-card.js +12 -0
  33. package/dist/blocks/release-tag.d.ts +20 -0
  34. package/dist/blocks/release-tag.js +10 -0
  35. package/dist/blocks/resource-select.d.ts +22 -0
  36. package/dist/blocks/resource-select.js +16 -0
  37. package/dist/blocks/result-state.d.ts +15 -0
  38. package/dist/blocks/result-state.js +8 -0
  39. package/dist/blocks/section-card.d.ts +31 -0
  40. package/dist/blocks/section-card.js +7 -0
  41. package/dist/blocks/section-heading.d.ts +13 -0
  42. package/dist/blocks/section-heading.js +11 -0
  43. package/dist/blocks/spec-sheet.d.ts +125 -0
  44. package/dist/blocks/spec-sheet.js +47 -0
  45. package/dist/blocks/status-tray.d.ts +83 -0
  46. package/dist/blocks/status-tray.js +79 -0
  47. package/dist/blocks/upload-queue.d.ts +48 -0
  48. package/dist/blocks/upload-queue.js +24 -0
  49. package/dist/components/action-row.d.ts +16 -0
  50. package/dist/components/action-row.js +11 -0
  51. package/dist/components/activity-line.d.ts +33 -0
  52. package/dist/components/activity-line.js +69 -0
  53. package/dist/components/alert.d.ts +17 -0
  54. package/dist/components/alert.js +17 -0
  55. package/dist/components/badge.d.ts +19 -0
  56. package/dist/components/badge.js +24 -0
  57. package/dist/components/button.d.ts +55 -0
  58. package/dist/components/button.js +230 -0
  59. package/dist/components/card.d.ts +61 -0
  60. package/dist/components/card.js +48 -0
  61. package/dist/components/chat-bubble.d.ts +34 -0
  62. package/dist/components/chat-bubble.js +10 -0
  63. package/dist/components/checkbox-bead.d.ts +6 -0
  64. package/dist/components/checkbox-bead.js +67 -0
  65. package/dist/components/checkbox.d.ts +21 -0
  66. package/dist/components/checkbox.js +46 -0
  67. package/dist/components/code-input.d.ts +35 -0
  68. package/dist/components/code-input.js +126 -0
  69. package/dist/components/combobox.d.ts +86 -0
  70. package/dist/components/combobox.js +218 -0
  71. package/dist/components/confirm-action.d.ts +23 -0
  72. package/dist/components/confirm-action.js +64 -0
  73. package/dist/components/copy-field.d.ts +53 -0
  74. package/dist/components/copy-field.js +49 -0
  75. package/dist/components/count-badge.d.ts +15 -0
  76. package/dist/components/count-badge.js +9 -0
  77. package/dist/components/cover-pattern.d.ts +19 -0
  78. package/dist/components/cover-pattern.js +74 -0
  79. package/dist/components/data-list.d.ts +25 -0
  80. package/dist/components/data-list.js +16 -0
  81. package/dist/components/dialog.d.ts +39 -0
  82. package/dist/components/dialog.js +73 -0
  83. package/dist/components/diff-view.d.ts +14 -0
  84. package/dist/components/diff-view.js +13 -0
  85. package/dist/components/disclosure.d.ts +29 -0
  86. package/dist/components/disclosure.js +19 -0
  87. package/dist/components/dropdown-menu.d.ts +49 -0
  88. package/dist/components/dropdown-menu.js +98 -0
  89. package/dist/components/field-guide.d.ts +41 -0
  90. package/dist/components/field-guide.js +18 -0
  91. package/dist/components/field.d.ts +164 -0
  92. package/dist/components/field.js +228 -0
  93. package/dist/components/game-feedback.d.ts +84 -0
  94. package/dist/components/game-feedback.js +48 -0
  95. package/dist/components/game-hud.d.ts +126 -0
  96. package/dist/components/game-hud.js +136 -0
  97. package/dist/components/generation-frame.d.ts +36 -0
  98. package/dist/components/generation-frame.js +97 -0
  99. package/dist/components/gooey.d.ts +32 -0
  100. package/dist/components/gooey.js +25 -0
  101. package/dist/components/hold-button.d.ts +26 -0
  102. package/dist/components/hold-button.js +115 -0
  103. package/dist/components/icon-button.d.ts +24 -0
  104. package/dist/components/icon-button.js +18 -0
  105. package/dist/components/icon-checkbox.d.ts +20 -0
  106. package/dist/components/icon-checkbox.js +9 -0
  107. package/dist/components/icon-choice-mark.d.ts +6 -0
  108. package/dist/components/icon-choice-mark.js +5 -0
  109. package/dist/components/icon-lamp.d.ts +42 -0
  110. package/dist/components/icon-lamp.js +15 -0
  111. package/dist/components/icon-radio.d.ts +16 -0
  112. package/dist/components/icon-radio.js +9 -0
  113. package/dist/components/inline-code.d.ts +3 -0
  114. package/dist/components/inline-code.js +7 -0
  115. package/dist/components/input-group.d.ts +9 -0
  116. package/dist/components/input-group.js +15 -0
  117. package/dist/components/input.d.ts +15 -0
  118. package/dist/components/input.js +15 -0
  119. package/dist/components/item-grid.d.ts +110 -0
  120. package/dist/components/item-grid.js +136 -0
  121. package/dist/components/keycap.d.ts +80 -0
  122. package/dist/components/keycap.js +18 -0
  123. package/dist/components/label.d.ts +13 -0
  124. package/dist/components/label.js +7 -0
  125. package/dist/components/listbox.d.ts +50 -0
  126. package/dist/components/listbox.js +134 -0
  127. package/dist/components/loader-blobs.d.ts +5 -0
  128. package/dist/components/loader-blobs.js +128 -0
  129. package/dist/components/loader.d.ts +21 -0
  130. package/dist/components/loader.js +25 -0
  131. package/dist/components/markdown.d.ts +23 -0
  132. package/dist/components/markdown.js +70 -0
  133. package/dist/components/minimap-labels.d.ts +39 -0
  134. package/dist/components/minimap-labels.js +113 -0
  135. package/dist/components/monogram.d.ts +32 -0
  136. package/dist/components/monogram.js +24 -0
  137. package/dist/components/motion-visibility.d.ts +2 -0
  138. package/dist/components/motion-visibility.js +25 -0
  139. package/dist/components/navigation-rail.d.ts +11 -0
  140. package/dist/components/navigation-rail.js +55 -0
  141. package/dist/components/overlay-root.d.ts +16 -0
  142. package/dist/components/overlay-root.js +24 -0
  143. package/dist/components/pixel-number.d.ts +50 -0
  144. package/dist/components/pixel-number.js +113 -0
  145. package/dist/components/popover.d.ts +31 -0
  146. package/dist/components/popover.js +24 -0
  147. package/dist/components/presence.d.ts +59 -0
  148. package/dist/components/presence.js +232 -0
  149. package/dist/components/price-tag.d.ts +11 -0
  150. package/dist/components/price-tag.js +6 -0
  151. package/dist/components/progress.d.ts +25 -0
  152. package/dist/components/progress.js +24 -0
  153. package/dist/components/prose.d.ts +14 -0
  154. package/dist/components/prose.js +10 -0
  155. package/dist/components/quota-meter.d.ts +24 -0
  156. package/dist/components/quota-meter.js +11 -0
  157. package/dist/components/radio-bead.d.ts +4 -0
  158. package/dist/components/radio-bead.js +53 -0
  159. package/dist/components/radio-group.d.ts +54 -0
  160. package/dist/components/radio-group.js +64 -0
  161. package/dist/components/resize-handle.d.ts +23 -0
  162. package/dist/components/resize-handle.js +31 -0
  163. package/dist/components/rough-drawing.d.ts +42 -0
  164. package/dist/components/rough-drawing.js +231 -0
  165. package/dist/components/rough.d.ts +68 -0
  166. package/dist/components/rough.js +33 -0
  167. package/dist/components/scroll-area.d.ts +12 -0
  168. package/dist/components/scroll-area.js +96 -0
  169. package/dist/components/scroll-motion.d.ts +12 -0
  170. package/dist/components/scroll-motion.js +31 -0
  171. package/dist/components/scroll-to-bottom-blob-state.d.ts +40 -0
  172. package/dist/components/scroll-to-bottom-blob-state.js +109 -0
  173. package/dist/components/scroll-to-bottom-blob.d.ts +16 -0
  174. package/dist/components/scroll-to-bottom-blob.js +174 -0
  175. package/dist/components/select.d.ts +9 -0
  176. package/dist/components/select.js +12 -0
  177. package/dist/components/selectable.d.ts +13 -0
  178. package/dist/components/selectable.js +45 -0
  179. package/dist/components/send-action.d.ts +33 -0
  180. package/dist/components/send-action.js +96 -0
  181. package/dist/components/separator.d.ts +11 -0
  182. package/dist/components/separator.js +7 -0
  183. package/dist/components/skeleton.d.ts +5 -0
  184. package/dist/components/skeleton.js +7 -0
  185. package/dist/components/slider.d.ts +18 -0
  186. package/dist/components/slider.js +31 -0
  187. package/dist/components/stat.d.ts +17 -0
  188. package/dist/components/stat.js +7 -0
  189. package/dist/components/status-bead.d.ts +9 -0
  190. package/dist/components/status-bead.js +107 -0
  191. package/dist/components/status-mark.d.ts +12 -0
  192. package/dist/components/status-mark.js +177 -0
  193. package/dist/components/status.d.ts +38 -0
  194. package/dist/components/status.js +28 -0
  195. package/dist/components/store-card.d.ts +21 -0
  196. package/dist/components/store-card.js +10 -0
  197. package/dist/components/surface.d.ts +89 -0
  198. package/dist/components/surface.js +31 -0
  199. package/dist/components/switch-bead.d.ts +4 -0
  200. package/dist/components/switch-bead.js +62 -0
  201. package/dist/components/switch.d.ts +11 -0
  202. package/dist/components/switch.js +36 -0
  203. package/dist/components/tabs.d.ts +55 -0
  204. package/dist/components/tabs.js +81 -0
  205. package/dist/components/technonomicon.d.ts +192 -0
  206. package/dist/components/technonomicon.js +121 -0
  207. package/dist/components/textarea.d.ts +9 -0
  208. package/dist/components/textarea.js +11 -0
  209. package/dist/components/toaster.d.ts +4 -0
  210. package/dist/components/toaster.js +13 -0
  211. package/dist/components/tool-call-chip.d.ts +22 -0
  212. package/dist/components/tool-call-chip.js +100 -0
  213. package/dist/components/tooltip.d.ts +41 -0
  214. package/dist/components/tooltip.js +169 -0
  215. package/dist/components/trading-card.d.ts +60 -0
  216. package/dist/components/trading-card.js +13 -0
  217. package/dist/components/undo-action.d.ts +52 -0
  218. package/dist/components/undo-action.js +100 -0
  219. package/dist/components/undo-toast.d.ts +21 -0
  220. package/dist/components/undo-toast.js +58 -0
  221. package/dist/components/visually-hidden.d.ts +9 -0
  222. package/dist/components/visually-hidden.js +11 -0
  223. package/dist/components/window.d.ts +65 -0
  224. package/dist/components/window.js +31 -0
  225. package/dist/components/wizard.d.ts +17 -0
  226. package/dist/components/wizard.js +19 -0
  227. package/dist/enhance/cigarette-card.d.ts +8 -0
  228. package/dist/enhance/cigarette-card.js +33 -0
  229. package/dist/enhance/sketch.d.ts +16 -0
  230. package/dist/enhance/sketch.js +130 -0
  231. package/dist/form-error.d.ts +7 -0
  232. package/dist/form-error.js +14 -0
  233. package/dist/form-fields.d.ts +15 -0
  234. package/dist/form-fields.js +250 -0
  235. package/dist/form-schema.d.ts +166 -0
  236. package/dist/form-schema.js +398 -0
  237. package/dist/form.d.ts +30 -0
  238. package/dist/form.js +20 -0
  239. package/dist/lib/cn.d.ts +8 -0
  240. package/dist/lib/cn.js +12 -0
  241. package/dist/lib/format-money.d.ts +2 -0
  242. package/dist/lib/format-money.js +22 -0
  243. package/dist/lib/glide.d.ts +12 -0
  244. package/dist/lib/glide.js +143 -0
  245. package/dist/lib/ime.d.ts +3 -0
  246. package/dist/lib/ime.js +8 -0
  247. package/dist/lib/motion-spring.d.ts +27 -0
  248. package/dist/lib/motion-spring.js +36 -0
  249. package/dist/lib/motion.d.ts +51 -0
  250. package/dist/lib/motion.js +161 -0
  251. package/dist/lib/reorder-motion.d.ts +13 -0
  252. package/dist/lib/reorder-motion.js +201 -0
  253. package/dist/lib/seed-hash.d.ts +6 -0
  254. package/dist/lib/seed-hash.js +13 -0
  255. package/dist/lib/tanstack-highlight.d.ts +4 -0
  256. package/dist/lib/tanstack-highlight.js +41 -0
  257. package/dist/schema-form.d.ts +120 -0
  258. package/dist/schema-form.js +129 -0
  259. package/dist/styles.css +18814 -0
  260. package/docs/api/README.md +134 -0
  261. package/docs/api/blocks/app-bar.md +227 -0
  262. package/docs/api/blocks/app-status-bar.md +257 -0
  263. package/docs/api/blocks/async-state.md +53 -0
  264. package/docs/api/blocks/card-grid.md +31 -0
  265. package/docs/api/blocks/command-menu.md +89 -0
  266. package/docs/api/blocks/composer.md +40 -0
  267. package/docs/api/blocks/empty-state.md +97 -0
  268. package/docs/api/blocks/faq-chat.md +147 -0
  269. package/docs/api/blocks/game-share-card.md +40 -0
  270. package/docs/api/blocks/launcher-grid.md +86 -0
  271. package/docs/api/blocks/listing-detail.md +51 -0
  272. package/docs/api/blocks/loading-state.md +21 -0
  273. package/docs/api/blocks/mosaic.md +94 -0
  274. package/docs/api/blocks/permission-grid.md +79 -0
  275. package/docs/api/blocks/pricing-card.md +90 -0
  276. package/docs/api/blocks/release-tag.md +62 -0
  277. package/docs/api/blocks/resource-select.md +126 -0
  278. package/docs/api/blocks/result-state.md +42 -0
  279. package/docs/api/blocks/section-card.md +42 -0
  280. package/docs/api/blocks/section-heading.md +61 -0
  281. package/docs/api/blocks/spec-sheet.md +400 -0
  282. package/docs/api/blocks/status-tray.md +141 -0
  283. package/docs/api/blocks/upload-queue.md +110 -0
  284. package/docs/api/components/action-row.md +51 -0
  285. package/docs/api/components/activity-line.md +103 -0
  286. package/docs/api/components/alert.md +60 -0
  287. package/docs/api/components/badge.md +77 -0
  288. package/docs/api/components/button.md +94 -0
  289. package/docs/api/components/card.md +165 -0
  290. package/docs/api/components/chat-bubble.md +66 -0
  291. package/docs/api/components/checkbox-bead.md +20 -0
  292. package/docs/api/components/checkbox.md +42 -0
  293. package/docs/api/components/code-input.md +61 -0
  294. package/docs/api/components/combobox.md +303 -0
  295. package/docs/api/components/confirm-action.md +58 -0
  296. package/docs/api/components/copy-field.md +106 -0
  297. package/docs/api/components/count-badge.md +39 -0
  298. package/docs/api/components/cover-pattern.md +43 -0
  299. package/docs/api/components/data-list.md +80 -0
  300. package/docs/api/components/dialog.md +235 -0
  301. package/docs/api/components/diff-view.md +59 -0
  302. package/docs/api/components/disclosure.md +71 -0
  303. package/docs/api/components/dropdown-menu.md +269 -0
  304. package/docs/api/components/field-guide.md +174 -0
  305. package/docs/api/components/field.md +252 -0
  306. package/docs/api/components/game-feedback.md +157 -0
  307. package/docs/api/components/game-hud.md +359 -0
  308. package/docs/api/components/generation-frame.md +59 -0
  309. package/docs/api/components/hold-button.md +44 -0
  310. package/docs/api/components/icon-button.md +56 -0
  311. package/docs/api/components/icon-checkbox.md +42 -0
  312. package/docs/api/components/icon-choice-mark.md +31 -0
  313. package/docs/api/components/icon-lamp.md +92 -0
  314. package/docs/api/components/icon-radio.md +42 -0
  315. package/docs/api/components/inline-code.md +21 -0
  316. package/docs/api/components/input-group.md +53 -0
  317. package/docs/api/components/input.md +54 -0
  318. package/docs/api/components/item-grid.md +262 -0
  319. package/docs/api/components/keycap.md +102 -0
  320. package/docs/api/components/label.md +40 -0
  321. package/docs/api/components/listbox.md +131 -0
  322. package/docs/api/components/loader-blobs.md +9 -0
  323. package/docs/api/components/loader.md +51 -0
  324. package/docs/api/components/markdown.md +91 -0
  325. package/docs/api/components/minimap-labels.md +84 -0
  326. package/docs/api/components/monogram.md +96 -0
  327. package/docs/api/components/motion-visibility.md +9 -0
  328. package/docs/api/components/navigation-rail.md +37 -0
  329. package/docs/api/components/overlay-root.md +92 -0
  330. package/docs/api/components/pixel-number.md +120 -0
  331. package/docs/api/components/popover.md +80 -0
  332. package/docs/api/components/presence.md +106 -0
  333. package/docs/api/components/price-tag.md +48 -0
  334. package/docs/api/components/progress.md +90 -0
  335. package/docs/api/components/prose.md +48 -0
  336. package/docs/api/components/quota-meter.md +47 -0
  337. package/docs/api/components/radio-bead.md +9 -0
  338. package/docs/api/components/radio-group.md +126 -0
  339. package/docs/api/components/resize-handle.md +46 -0
  340. package/docs/api/components/rough-drawing.md +122 -0
  341. package/docs/api/components/rough.md +66 -0
  342. package/docs/api/components/scroll-area.md +22 -0
  343. package/docs/api/components/scroll-motion.md +9 -0
  344. package/docs/api/components/scroll-to-bottom-blob-state.md +162 -0
  345. package/docs/api/components/scroll-to-bottom-blob.md +73 -0
  346. package/docs/api/components/select.md +39 -0
  347. package/docs/api/components/send-action.md +58 -0
  348. package/docs/api/components/separator.md +38 -0
  349. package/docs/api/components/skeleton.md +31 -0
  350. package/docs/api/components/slider.md +70 -0
  351. package/docs/api/components/stat.md +42 -0
  352. package/docs/api/components/status-bead.md +19 -0
  353. package/docs/api/components/status-mark.md +19 -0
  354. package/docs/api/components/status.md +105 -0
  355. package/docs/api/components/store-card.md +53 -0
  356. package/docs/api/components/surface.md +161 -0
  357. package/docs/api/components/switch-bead.md +9 -0
  358. package/docs/api/components/switch.md +40 -0
  359. package/docs/api/components/tabs.md +138 -0
  360. package/docs/api/components/technonomicon.md +773 -0
  361. package/docs/api/components/textarea.md +40 -0
  362. package/docs/api/components/toaster.md +29 -0
  363. package/docs/api/components/tool-call-chip.md +68 -0
  364. package/docs/api/components/tooltip.md +113 -0
  365. package/docs/api/components/trading-card.md +95 -0
  366. package/docs/api/components/undo-action.md +117 -0
  367. package/docs/api/components/undo-toast.md +49 -0
  368. package/docs/api/components/visually-hidden.md +37 -0
  369. package/docs/api/components/window.md +291 -0
  370. package/docs/api/components/wizard.md +65 -0
  371. package/docs/api/enhance/cigarette-card.md +52 -0
  372. package/docs/api/enhance/sketch.md +42 -0
  373. package/docs/api/form.md +1623 -0
  374. package/docs/api/lib/cn.md +46 -0
  375. package/docs/api/lib/format-money.md +30 -0
  376. package/docs/api/lib/glide.md +36 -0
  377. package/docs/api/lib/ime.md +29 -0
  378. package/docs/api/lib/motion-spring.md +91 -0
  379. package/docs/api/lib/motion.md +212 -0
  380. package/docs/api/lib/reorder-motion.md +46 -0
  381. package/docs/api/lib/seed-hash.md +31 -0
  382. package/docs/api/lib/tanstack-highlight.md +40 -0
  383. package/package.json +597 -3
  384. package/src/app-status-bar.css +158 -0
  385. package/src/fonts.css +1 -0
  386. package/src/status-tray.css +282 -0
  387. package/src/styles.css +10177 -0
@@ -0,0 +1,120 @@
1
+ import { type ReactFormExtendedApi, type StandardSchemaV1 } from "@tanstack/react-form";
2
+ import { type ReactNode } from "react";
3
+ import { type ButtonProps } from "./components/button.js";
4
+ import { type FormFooterProps, type FormProps } from "./components/field.js";
5
+ import { type FormDescription, type FormSchema, type FormValues } from "./form-schema.js";
6
+ /**
7
+ * What a submit handler reports. Return nothing (or `saved`) when the change
8
+ * landed; return `refused` with a form-level `error` and/or per-field `fields`
9
+ * messages when the server said no. Field messages clear when that field
10
+ * changes; the form message clears on the next change anywhere.
11
+ */
12
+ export type SubmitResult<V extends FormValues> = {
13
+ readonly kind: "saved";
14
+ /** The new baseline; defaults to the submitted values. Clear secrets here. */
15
+ readonly values?: V;
16
+ /** Replaces the default "Saved" readout. */
17
+ readonly message?: string;
18
+ } | {
19
+ readonly kind: "refused";
20
+ readonly error?: string;
21
+ readonly fields?: Partial<Readonly<Record<keyof V & string, string>>>;
22
+ };
23
+ /** Options accepted by useSchemaForm and an unbound SchemaForm. */
24
+ export type SchemaFormOptions<V extends FormValues, Out> = {
25
+ /**
26
+ * The single source: an Effect `Schema.Struct` (house path) or a Zod
27
+ * object. It validates raw input, parses the submitted value, and its
28
+ * annotations (`field`, `sections`) give labels, kinds, help, options,
29
+ * order and grouping.
30
+ */
31
+ schema: FormSchema<V, Out>;
32
+ /** The raw values to start from, such as the saved settings. */
33
+ defaultValues: V;
34
+ /** Receives the parsed value, never the raw input. */
35
+ onSubmit: (value: Out, raw: V) => Promise<SubmitResult<V> | undefined> | Promise<void> | SubmitResult<V> | undefined;
36
+ };
37
+ /** The schema as TanStack validates it: raw values in, any output. */
38
+ export type Validator<V> = StandardSchemaV1<V, unknown>;
39
+ /** The TanStack form a schema form owns: typed values, schema validators. */
40
+ export type SchemaFormApi<V extends FormValues> = ReactFormExtendedApi<V, undefined, Validator<V>, undefined, undefined, undefined, Validator<V>, undefined, undefined, undefined, undefined, unknown>;
41
+ /** The model returned by useSchemaForm and read by SchemaForm, FormFields and SaveBar. */
42
+ export type SchemaFormModel<V extends FormValues> = {
43
+ /** The fields, kinds and sections read from the schema. */
44
+ readonly description: FormDescription;
45
+ /** TanStack's typed form: read values with `useSelector(model.form.store, …)`. */
46
+ readonly form: SchemaFormApi<V>;
47
+ /** The last refused submit's form-level message. */
48
+ readonly error: string | null;
49
+ /** The last landed submit's readout, until the next change. */
50
+ readonly saved: string | null;
51
+ /** Restore the baseline values and clear every message. */
52
+ readonly discard: () => void;
53
+ /** Submit through the schema; the same path as the native submit event. */
54
+ readonly submit: () => Promise<void>;
55
+ };
56
+ /**
57
+ * One form, declared by its schema. TanStack owns field state and timing; the
58
+ * schema owns validation and parses the submitted value; the handler only
59
+ * sees parsed data and reports `saved` or `refused`.
60
+ */
61
+ export declare function useSchemaForm<V extends FormValues, Out>(options: SchemaFormOptions<V, Out>): SchemaFormModel<V>;
62
+ /** Live status for leave guards and save bars. */
63
+ export type SchemaFormStatus = {
64
+ /** Values differ from the baseline. */
65
+ dirty: boolean;
66
+ submitting: boolean;
67
+ /** Validation allows a submit right now. */
68
+ canSubmit: boolean;
69
+ };
70
+ /** Subscribe to a schema form's dirty and submitting state. */
71
+ export declare function useSchemaFormStatus<V extends FormValues>(model: SchemaFormModel<V>): SchemaFormStatus;
72
+ /** How a SchemaForm presents its actions and state. */
73
+ export type SchemaFormPresentation = {
74
+ /** The primary action's label; defaults to "Save changes". */
75
+ submitLabel?: ReactNode;
76
+ /** Show a Discard action while there are unsaved changes. */
77
+ discardLabel?: ReactNode;
78
+ /** Keep the primary action available on a clean form (create forms). */
79
+ allowClean?: boolean;
80
+ /** Replaces the SaveBar, such as a footer with a retry key; `null` drops it. */
81
+ footer?: ReactNode;
82
+ /**
83
+ * Replaces the generated field list, for custom layouts such as Screen
84
+ * cells: place fields with `<FormFields model names={[…]} />`.
85
+ */
86
+ children?: ReactNode;
87
+ /** Disable every field, such as while an uncertain request is retried. */
88
+ disabled?: boolean;
89
+ } & Omit<FormProps, "busy" | "onSubmit" | "noValidate" | "children">;
90
+ /** Props accepted by SchemaForm: a model from useSchemaForm, or its options. */
91
+ export type SchemaFormProps<V extends FormValues, Out> = SchemaFormPresentation & ({
92
+ model: SchemaFormModel<V>;
93
+ } | SchemaFormOptions<V, Out>);
94
+ /**
95
+ * A whole form from its schema: fields, sections, validation, busy state and
96
+ * the SaveBar. Pass `schema`, `defaultValues` and `onSubmit`, or a `model`
97
+ * from useSchemaForm when the page needs its status or a custom layout.
98
+ */
99
+ export declare function SchemaForm<V extends FormValues, Out>(props: SchemaFormProps<V, Out>): import("react/jsx-runtime").JSX.Element;
100
+ /** Props accepted by SaveBar. */
101
+ export type SaveBarProps<V extends FormValues> = {
102
+ model: SchemaFormModel<V>;
103
+ /** The primary action, such as "Save changes" or "Create Team". */
104
+ label: ReactNode;
105
+ /** Show a Discard action while there are unsaved changes. */
106
+ discardLabel?: ReactNode;
107
+ /**
108
+ * Keep the primary action available on a clean form (create forms that may
109
+ * submit their defaults). By default a clean form has nothing to save.
110
+ */
111
+ allowClean?: boolean;
112
+ /** The quiet readout while there are unsaved changes. */
113
+ dirtyLabel?: ReactNode;
114
+ buttonProps?: Omit<ButtonProps, "type" | "disabled" | "loading" | "children" | "onClick" | "asChild">;
115
+ } & Omit<FormFooterProps, "children" | "error" | "status">;
116
+ /**
117
+ * The form's action row: the refused-submit error, a quiet "Unsaved changes"
118
+ * or "Saved" readout, an optional Discard, and the one primary submit.
119
+ */
120
+ export declare function SaveBar<V extends FormValues>({ model, label, discardLabel, allowClean, dirtyLabel, buttonProps, ...props }: SaveBarProps<V>): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,129 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { evaluate, useForm, useSelector, } from "@tanstack/react-form";
3
+ import { useMemo, useState } from "react";
4
+ import { Button } from "./components/button.js";
5
+ import { Form, FormFooter, } from "./components/field.js";
6
+ import { Status } from "./components/status.js";
7
+ import { FormFields } from "./form-fields.js";
8
+ import { describeSchema, standardSchema, } from "./form-schema.js";
9
+ const serverKey = "onServer";
10
+ function hasServerError(field) {
11
+ return field.state.meta.errorMap.onServer !== undefined;
12
+ }
13
+ function clearServerError(field) {
14
+ field.setMeta((meta) => ({
15
+ ...meta,
16
+ errorMap: { ...meta.errorMap, [serverKey]: undefined },
17
+ }));
18
+ }
19
+ function setServerError(form, name, message) {
20
+ form.setFieldMeta(name, (meta) => ({
21
+ ...meta,
22
+ isBlurred: true,
23
+ errorMap: { ...meta.errorMap, [serverKey]: message },
24
+ }));
25
+ }
26
+ /**
27
+ * One form, declared by its schema. TanStack owns field state and timing; the
28
+ * schema owns validation and parses the submitted value; the handler only
29
+ * sees parsed data and reports `saved` or `refused`.
30
+ */
31
+ export function useSchemaForm(options) {
32
+ const [error, setError] = useState(null);
33
+ const [saved, setSaved] = useState(null);
34
+ // The last saved values become the baseline until the caller's defaults
35
+ // change; TanStack re-reads `defaultValues` on every render.
36
+ const [source, setSource] = useState(options.defaultValues);
37
+ const [savedBaseline, setSavedBaseline] = useState(null);
38
+ if (!evaluate(source, options.defaultValues)) {
39
+ setSource(options.defaultValues);
40
+ setSavedBaseline(null);
41
+ }
42
+ const { schema } = options;
43
+ const description = useMemo(() => describeSchema(schema), [schema]);
44
+ const validator = useMemo(() => standardSchema(schema), [schema]);
45
+ const form = useForm({
46
+ defaultValues: savedBaseline ?? source,
47
+ validators: { onChange: validator, onSubmit: validator },
48
+ listeners: {
49
+ onChange: ({ fieldApi }) => {
50
+ setError(null);
51
+ setSaved(null);
52
+ if (hasServerError(fieldApi))
53
+ clearServerError(fieldApi);
54
+ },
55
+ },
56
+ onSubmit: async ({ value, formApi }) => {
57
+ setError(null);
58
+ setSaved(null);
59
+ const parsed = await standardSchema(schema)["~standard"].validate(value);
60
+ if (parsed.issues) {
61
+ setError(parsed.issues[0]?.message ?? "Check the form and try again.");
62
+ return;
63
+ }
64
+ const result = (await options.onSubmit(parsed.value, value)) ?? {
65
+ kind: "saved",
66
+ };
67
+ if (result.kind === "refused") {
68
+ setError(result.error ?? null);
69
+ const wide = formApi;
70
+ for (const [name, message] of Object.entries(result.fields ?? {}))
71
+ if (message !== undefined && message.length > 0)
72
+ setServerError(wide, name, message);
73
+ return;
74
+ }
75
+ const baseline = result.values ?? value;
76
+ setSavedBaseline(baseline);
77
+ formApi.reset(baseline);
78
+ setSaved(result.message ?? "Saved");
79
+ },
80
+ });
81
+ return {
82
+ description,
83
+ form,
84
+ error,
85
+ saved,
86
+ discard: () => {
87
+ setError(null);
88
+ setSaved(null);
89
+ form.reset();
90
+ },
91
+ submit: () => form.handleSubmit(),
92
+ };
93
+ }
94
+ /** Subscribe to a schema form's dirty and submitting state. */
95
+ export function useSchemaFormStatus(model) {
96
+ const dirty = useSelector(model.form.store, (state) => !state.isDefaultValue);
97
+ const submitting = useSelector(model.form.store, (state) => state.isSubmitting);
98
+ const canSubmit = useSelector(model.form.store, (state) => state.canSubmit);
99
+ return { dirty, submitting, canSubmit };
100
+ }
101
+ function BoundSchemaForm({ model, submitLabel = "Save changes", discardLabel, allowClean, footer, children, disabled = false, ...props }) {
102
+ const { submitting } = useSchemaFormStatus(model);
103
+ return (_jsxs(Form, { ...props, busy: submitting, noValidate: true, onSubmit: (event) => {
104
+ event.preventDefault();
105
+ if (!model.form.state.isSubmitting)
106
+ void model.submit();
107
+ }, children: [children ?? _jsx(FormFields, { model: model, disabled: disabled }), footer !== undefined ? (footer) : (_jsx(SaveBar, { model: model, label: submitLabel, ...(discardLabel === undefined ? {} : { discardLabel }), ...(allowClean === undefined ? {} : { allowClean }) }))] }));
108
+ }
109
+ function OwnedSchemaForm({ schema, defaultValues, onSubmit, ...props }) {
110
+ const model = useSchemaForm({ schema, defaultValues, onSubmit });
111
+ return _jsx(BoundSchemaForm, { ...props, model: model });
112
+ }
113
+ /**
114
+ * A whole form from its schema: fields, sections, validation, busy state and
115
+ * the SaveBar. Pass `schema`, `defaultValues` and `onSubmit`, or a `model`
116
+ * from useSchemaForm when the page needs its status or a custom layout.
117
+ */
118
+ export function SchemaForm(props) {
119
+ return "model" in props ? (_jsx(BoundSchemaForm, { ...props })) : (_jsx(OwnedSchemaForm, { ...props }));
120
+ }
121
+ /**
122
+ * The form's action row: the refused-submit error, a quiet "Unsaved changes"
123
+ * or "Saved" readout, an optional Discard, and the one primary submit.
124
+ */
125
+ export function SaveBar({ model, label, discardLabel, allowClean = false, dirtyLabel = "Unsaved changes", buttonProps, ...props }) {
126
+ const { dirty, submitting, canSubmit } = useSchemaFormStatus(model);
127
+ const status = submitting ? null : model.saved && !dirty ? (_jsx(Status, { tone: "success", size: "compact", label: model.saved })) : dirty ? (_jsx(Status, { tone: "neutral", size: "compact", label: dirtyLabel })) : null;
128
+ return (_jsxs(FormFooter, { ...props, error: model.error, status: status, children: [discardLabel && dirty ? (_jsx(Button, { type: "button", variant: "ghost", disabled: submitting, onClick: model.discard, children: discardLabel })) : null, _jsx(Button, { ...buttonProps, type: "submit", loading: submitting, disabled: submitting || !canSubmit || (!dirty && !allowClean), children: label })] }));
129
+ }