@plures/praxis 0.2.1 → 1.0.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 (486) hide show
  1. package/README.md +188 -61
  2. package/core/codegen/docs-generator.ts +808 -0
  3. package/core/codegen/index.ts +27 -0
  4. package/core/codegen/ts-generator.ts +15 -0
  5. package/core/db-adapter/index.ts +52 -0
  6. package/core/db-adapter/sync-engine.ts +450 -0
  7. package/core/logic-engine/engine.ts +12 -0
  8. package/core/logic-engine/index.ts +16 -0
  9. package/core/logic-engine/protocol.ts +16 -0
  10. package/core/logic-engine/psf-adapter.ts +269 -0
  11. package/core/logic-engine/rules.ts +16 -0
  12. package/core/schema-engine/compiler.ts +431 -0
  13. package/core/schema-engine/generator.ts +635 -0
  14. package/core/schema-engine/index.ts +18 -0
  15. package/core/schema-engine/psf.ts +664 -0
  16. package/core/schema-engine/types.ts +63 -0
  17. package/core/schema-engine/validator.ts +541 -0
  18. package/dist/core/codegen/docs-generator.d.ts +123 -0
  19. package/dist/core/codegen/docs-generator.d.ts.map +1 -0
  20. package/dist/core/codegen/docs-generator.js +674 -0
  21. package/dist/core/codegen/docs-generator.js.map +1 -0
  22. package/dist/core/codegen/index.d.ts +11 -0
  23. package/dist/core/codegen/index.d.ts.map +1 -0
  24. package/dist/core/codegen/index.js +13 -0
  25. package/dist/core/codegen/index.js.map +1 -0
  26. package/dist/core/codegen/ts-generator.d.ts +8 -0
  27. package/dist/core/codegen/ts-generator.d.ts.map +1 -0
  28. package/dist/core/codegen/ts-generator.js +8 -0
  29. package/dist/core/codegen/ts-generator.js.map +1 -0
  30. package/dist/core/db-adapter/index.d.ts +18 -0
  31. package/dist/core/db-adapter/index.d.ts.map +1 -0
  32. package/dist/core/db-adapter/index.js +23 -0
  33. package/dist/core/db-adapter/index.js.map +1 -0
  34. package/dist/core/db-adapter/sync-engine.d.ts +180 -0
  35. package/dist/core/db-adapter/sync-engine.d.ts.map +1 -0
  36. package/dist/core/db-adapter/sync-engine.js +342 -0
  37. package/dist/core/db-adapter/sync-engine.js.map +1 -0
  38. package/dist/core/logic-engine/engine.d.ts +8 -0
  39. package/dist/core/logic-engine/engine.d.ts.map +1 -0
  40. package/dist/core/logic-engine/engine.js +8 -0
  41. package/dist/core/logic-engine/engine.js.map +1 -0
  42. package/dist/core/logic-engine/index.d.ts +16 -0
  43. package/dist/core/logic-engine/index.d.ts.map +1 -0
  44. package/dist/core/logic-engine/index.js +16 -0
  45. package/dist/core/logic-engine/index.js.map +1 -0
  46. package/dist/core/logic-engine/protocol.d.ts +7 -0
  47. package/dist/core/logic-engine/protocol.d.ts.map +1 -0
  48. package/dist/core/logic-engine/protocol.js +7 -0
  49. package/dist/core/logic-engine/protocol.js.map +1 -0
  50. package/dist/core/logic-engine/psf-adapter.d.ts +88 -0
  51. package/dist/core/logic-engine/psf-adapter.d.ts.map +1 -0
  52. package/dist/core/logic-engine/psf-adapter.js +207 -0
  53. package/dist/core/logic-engine/psf-adapter.js.map +1 -0
  54. package/dist/core/logic-engine/rules.d.ts +7 -0
  55. package/dist/core/logic-engine/rules.d.ts.map +1 -0
  56. package/dist/core/logic-engine/rules.js +7 -0
  57. package/dist/core/logic-engine/rules.js.map +1 -0
  58. package/dist/core/schema-engine/compiler.d.ts +198 -0
  59. package/dist/core/schema-engine/compiler.d.ts.map +1 -0
  60. package/dist/core/schema-engine/compiler.js +262 -0
  61. package/dist/core/schema-engine/compiler.js.map +1 -0
  62. package/dist/core/schema-engine/generator.d.ts +115 -0
  63. package/dist/core/schema-engine/generator.d.ts.map +1 -0
  64. package/dist/core/schema-engine/generator.js +506 -0
  65. package/dist/core/schema-engine/generator.js.map +1 -0
  66. package/dist/core/schema-engine/index.d.ts +18 -0
  67. package/dist/core/schema-engine/index.d.ts.map +1 -0
  68. package/dist/core/schema-engine/index.js +18 -0
  69. package/dist/core/schema-engine/index.js.map +1 -0
  70. package/dist/core/schema-engine/psf.d.ts +612 -0
  71. package/dist/core/schema-engine/psf.d.ts.map +1 -0
  72. package/dist/core/schema-engine/psf.js +45 -0
  73. package/dist/core/schema-engine/psf.js.map +1 -0
  74. package/dist/core/schema-engine/types.d.ts +10 -0
  75. package/dist/core/schema-engine/types.d.ts.map +1 -0
  76. package/dist/core/schema-engine/types.js +7 -0
  77. package/dist/core/schema-engine/types.js.map +1 -0
  78. package/dist/core/schema-engine/validator.d.ts +140 -0
  79. package/dist/core/schema-engine/validator.d.ts.map +1 -0
  80. package/dist/core/schema-engine/validator.js +407 -0
  81. package/dist/core/schema-engine/validator.js.map +1 -0
  82. package/dist/src/adapters/cli.d.ts.map +1 -0
  83. package/dist/src/adapters/cli.js.map +1 -0
  84. package/dist/src/cli/commands/auth.d.ts.map +1 -0
  85. package/dist/src/cli/commands/auth.js.map +1 -0
  86. package/dist/src/cli/commands/build.d.ts +23 -0
  87. package/dist/src/cli/commands/build.d.ts.map +1 -0
  88. package/dist/src/cli/commands/build.js +162 -0
  89. package/dist/src/cli/commands/build.js.map +1 -0
  90. package/dist/src/cli/commands/canvas.d.ts +23 -0
  91. package/dist/src/cli/commands/canvas.d.ts.map +1 -0
  92. package/dist/src/cli/commands/canvas.js +215 -0
  93. package/dist/src/cli/commands/canvas.js.map +1 -0
  94. package/dist/src/cli/commands/cloud.d.ts.map +1 -0
  95. package/dist/src/cli/commands/cloud.js.map +1 -0
  96. package/dist/src/cli/commands/create.d.ts +21 -0
  97. package/dist/src/cli/commands/create.d.ts.map +1 -0
  98. package/dist/src/cli/commands/create.js +621 -0
  99. package/dist/src/cli/commands/create.js.map +1 -0
  100. package/dist/src/cli/commands/dev.d.ts +21 -0
  101. package/dist/src/cli/commands/dev.d.ts.map +1 -0
  102. package/dist/src/cli/commands/dev.js +71 -0
  103. package/dist/src/cli/commands/dev.js.map +1 -0
  104. package/dist/src/cli/commands/generate.d.ts.map +1 -0
  105. package/dist/src/cli/commands/generate.js.map +1 -0
  106. package/dist/src/cli/commands/orchestrate.d.ts +44 -0
  107. package/dist/src/cli/commands/orchestrate.d.ts.map +1 -0
  108. package/dist/src/cli/commands/orchestrate.js +150 -0
  109. package/dist/src/cli/commands/orchestrate.js.map +1 -0
  110. package/dist/{cli → src/cli}/index.d.ts.map +1 -1
  111. package/dist/{cli → src/cli}/index.js +53 -21
  112. package/dist/src/cli/index.js.map +1 -0
  113. package/dist/src/cloud/auth.d.ts.map +1 -0
  114. package/dist/src/cloud/auth.js.map +1 -0
  115. package/dist/src/cloud/billing.d.ts.map +1 -0
  116. package/dist/src/cloud/billing.js.map +1 -0
  117. package/dist/src/cloud/client.d.ts.map +1 -0
  118. package/dist/src/cloud/client.js.map +1 -0
  119. package/dist/src/cloud/index.d.ts.map +1 -0
  120. package/dist/src/cloud/index.js.map +1 -0
  121. package/dist/src/cloud/marketplace.d.ts.map +1 -0
  122. package/dist/src/cloud/marketplace.js.map +1 -0
  123. package/dist/src/cloud/provisioning.d.ts.map +1 -0
  124. package/dist/src/cloud/provisioning.js.map +1 -0
  125. package/dist/src/cloud/relay/endpoints.d.ts.map +1 -0
  126. package/dist/src/cloud/relay/endpoints.js.map +1 -0
  127. package/dist/src/cloud/relay/health/index.d.ts.map +1 -0
  128. package/dist/src/cloud/relay/health/index.js.map +1 -0
  129. package/dist/src/cloud/relay/stats/index.d.ts.map +1 -0
  130. package/dist/src/cloud/relay/stats/index.js.map +1 -0
  131. package/dist/src/cloud/relay/sync/index.d.ts.map +1 -0
  132. package/dist/src/cloud/relay/sync/index.js.map +1 -0
  133. package/dist/src/cloud/relay/usage/index.d.ts.map +1 -0
  134. package/dist/src/cloud/relay/usage/index.js.map +1 -0
  135. package/dist/src/cloud/sponsors.d.ts.map +1 -0
  136. package/dist/src/cloud/sponsors.js.map +1 -0
  137. package/dist/src/cloud/types.d.ts.map +1 -0
  138. package/dist/src/cloud/types.js.map +1 -0
  139. package/dist/src/components/index.d.ts.map +1 -0
  140. package/dist/src/components/index.js.map +1 -0
  141. package/dist/src/core/actors.d.ts.map +1 -0
  142. package/dist/src/core/actors.js.map +1 -0
  143. package/dist/src/core/component/generator.d.ts.map +1 -0
  144. package/dist/{core → src/core}/component/generator.js +45 -3
  145. package/dist/src/core/component/generator.js.map +1 -0
  146. package/dist/src/core/engine.d.ts.map +1 -0
  147. package/dist/src/core/engine.js.map +1 -0
  148. package/dist/src/core/introspection.d.ts.map +1 -0
  149. package/dist/src/core/introspection.js.map +1 -0
  150. package/dist/src/core/logic/generator.d.ts.map +1 -0
  151. package/dist/{core → src/core}/logic/generator.js +35 -4
  152. package/dist/src/core/logic/generator.js.map +1 -0
  153. package/dist/src/core/pluresdb/adapter.d.ts +72 -0
  154. package/dist/src/core/pluresdb/adapter.d.ts.map +1 -0
  155. package/dist/src/core/pluresdb/adapter.js +73 -0
  156. package/dist/src/core/pluresdb/adapter.js.map +1 -0
  157. package/dist/src/core/pluresdb/generator.d.ts.map +1 -0
  158. package/dist/{core → src/core}/pluresdb/generator.js +33 -4
  159. package/dist/src/core/pluresdb/generator.js.map +1 -0
  160. package/dist/src/core/pluresdb/index.d.ts +15 -0
  161. package/dist/src/core/pluresdb/index.d.ts.map +1 -0
  162. package/dist/src/core/pluresdb/index.js +11 -0
  163. package/dist/src/core/pluresdb/index.js.map +1 -0
  164. package/dist/src/core/pluresdb/schema-registry.d.ts +104 -0
  165. package/dist/src/core/pluresdb/schema-registry.d.ts.map +1 -0
  166. package/dist/src/core/pluresdb/schema-registry.js +130 -0
  167. package/dist/src/core/pluresdb/schema-registry.js.map +1 -0
  168. package/dist/src/core/pluresdb/store.d.ts +199 -0
  169. package/dist/src/core/pluresdb/store.d.ts.map +1 -0
  170. package/dist/src/core/pluresdb/store.js +344 -0
  171. package/dist/src/core/pluresdb/store.js.map +1 -0
  172. package/dist/src/core/protocol.d.ts.map +1 -0
  173. package/dist/src/core/protocol.js.map +1 -0
  174. package/dist/src/core/rules.d.ts.map +1 -0
  175. package/dist/src/core/rules.js.map +1 -0
  176. package/dist/src/core/schema/loader.d.ts.map +1 -0
  177. package/dist/src/core/schema/loader.js.map +1 -0
  178. package/dist/src/core/schema/normalize.d.ts.map +1 -0
  179. package/dist/src/core/schema/normalize.js.map +1 -0
  180. package/dist/src/core/schema/types.d.ts.map +1 -0
  181. package/dist/src/core/schema/types.js.map +1 -0
  182. package/dist/src/dsl/index.d.ts.map +1 -0
  183. package/dist/src/dsl/index.js.map +1 -0
  184. package/dist/src/dsl.d.ts.map +1 -0
  185. package/dist/src/dsl.js.map +1 -0
  186. package/dist/src/examples/advanced-todo/index.d.ts.map +1 -0
  187. package/dist/src/examples/advanced-todo/index.js.map +1 -0
  188. package/dist/src/examples/auth-basic/index.d.ts.map +1 -0
  189. package/dist/src/examples/auth-basic/index.js.map +1 -0
  190. package/dist/src/examples/cart/index.d.ts.map +1 -0
  191. package/dist/src/examples/cart/index.js.map +1 -0
  192. package/dist/src/examples/hero-ecommerce/index.d.ts.map +1 -0
  193. package/dist/src/examples/hero-ecommerce/index.js.map +1 -0
  194. package/dist/src/examples/svelte-counter/index.d.ts.map +1 -0
  195. package/dist/src/examples/svelte-counter/index.js.map +1 -0
  196. package/dist/src/flows.d.ts.map +1 -0
  197. package/dist/src/flows.js.map +1 -0
  198. package/dist/{index.d.ts → src/index.d.ts} +12 -2
  199. package/dist/src/index.d.ts.map +1 -0
  200. package/dist/{index.js → src/index.js} +6 -1
  201. package/dist/src/index.js.map +1 -0
  202. package/dist/src/integrations/code-canvas.d.ts +265 -0
  203. package/dist/src/integrations/code-canvas.d.ts.map +1 -0
  204. package/dist/src/integrations/code-canvas.js +451 -0
  205. package/dist/src/integrations/code-canvas.js.map +1 -0
  206. package/dist/src/integrations/pluresdb.d.ts +117 -0
  207. package/dist/src/integrations/pluresdb.d.ts.map +1 -0
  208. package/dist/src/integrations/pluresdb.js +117 -0
  209. package/dist/src/integrations/pluresdb.js.map +1 -0
  210. package/dist/src/integrations/state-docs.d.ts +191 -0
  211. package/dist/src/integrations/state-docs.d.ts.map +1 -0
  212. package/dist/src/integrations/state-docs.js +515 -0
  213. package/dist/src/integrations/state-docs.js.map +1 -0
  214. package/dist/src/integrations/svelte.d.ts.map +1 -0
  215. package/dist/src/integrations/svelte.js.map +1 -0
  216. package/dist/src/integrations/tauri.d.ts +360 -0
  217. package/dist/src/integrations/tauri.d.ts.map +1 -0
  218. package/dist/src/integrations/tauri.js +278 -0
  219. package/dist/src/integrations/tauri.js.map +1 -0
  220. package/dist/src/integrations/unum.d.ts +159 -0
  221. package/dist/src/integrations/unum.d.ts.map +1 -0
  222. package/dist/src/integrations/unum.js +240 -0
  223. package/dist/src/integrations/unum.js.map +1 -0
  224. package/dist/src/registry.d.ts.map +1 -0
  225. package/dist/src/registry.js.map +1 -0
  226. package/dist/{runtime → src/runtime}/terminal-adapter.d.ts +58 -7
  227. package/dist/src/runtime/terminal-adapter.d.ts.map +1 -0
  228. package/dist/src/runtime/terminal-adapter.js +237 -0
  229. package/dist/src/runtime/terminal-adapter.js.map +1 -0
  230. package/dist/src/step.d.ts.map +1 -0
  231. package/dist/src/step.js.map +1 -0
  232. package/dist/src/types.d.ts.map +1 -0
  233. package/dist/{cloud → src}/types.js.map +1 -1
  234. package/dist/tools/cli/commands/index.d.ts +7 -0
  235. package/dist/tools/cli/commands/index.d.ts.map +1 -0
  236. package/dist/tools/cli/commands/index.js +7 -0
  237. package/dist/tools/cli/commands/index.js.map +1 -0
  238. package/dist/tools/cli/index.d.ts +8 -0
  239. package/dist/tools/cli/index.d.ts.map +1 -0
  240. package/dist/tools/cli/index.js +9 -0
  241. package/dist/tools/cli/index.js.map +1 -0
  242. package/dist/tools/watcher/index.d.ts +105 -0
  243. package/dist/tools/watcher/index.d.ts.map +1 -0
  244. package/dist/tools/watcher/index.js +213 -0
  245. package/dist/tools/watcher/index.js.map +1 -0
  246. package/dist/ui/canvas/canvas-projection.d.ts +78 -0
  247. package/dist/ui/canvas/canvas-projection.d.ts.map +1 -0
  248. package/dist/ui/canvas/canvas-projection.js +416 -0
  249. package/dist/ui/canvas/canvas-projection.js.map +1 -0
  250. package/dist/ui/canvas/canvas-state.d.ts +200 -0
  251. package/dist/ui/canvas/canvas-state.d.ts.map +1 -0
  252. package/dist/ui/canvas/canvas-state.js +464 -0
  253. package/dist/ui/canvas/canvas-state.js.map +1 -0
  254. package/dist/ui/canvas/components/index.d.ts +95 -0
  255. package/dist/ui/canvas/components/index.d.ts.map +1 -0
  256. package/dist/ui/canvas/components/index.js +19 -0
  257. package/dist/ui/canvas/components/index.js.map +1 -0
  258. package/dist/ui/canvas/index.d.ts +32 -0
  259. package/dist/ui/canvas/index.d.ts.map +1 -0
  260. package/dist/ui/canvas/index.js +32 -0
  261. package/dist/ui/canvas/index.js.map +1 -0
  262. package/dist/ui/svelte-generator/index.d.ts +9 -0
  263. package/dist/ui/svelte-generator/index.d.ts.map +1 -0
  264. package/dist/ui/svelte-generator/index.js +11 -0
  265. package/dist/ui/svelte-generator/index.js.map +1 -0
  266. package/dist/ui/svelte-generator/psf-generator.d.ts +128 -0
  267. package/dist/ui/svelte-generator/psf-generator.d.ts.map +1 -0
  268. package/dist/ui/svelte-generator/psf-generator.js +506 -0
  269. package/dist/ui/svelte-generator/psf-generator.js.map +1 -0
  270. package/docs/README.md +155 -0
  271. package/docs/core/building-extensions.md +553 -0
  272. package/docs/core/cli-usage.md +498 -0
  273. package/docs/core/code-canvas-sync.md +468 -0
  274. package/docs/core/logic-engine.md +566 -0
  275. package/docs/core/pluresdb-integration.md +646 -0
  276. package/docs/core/schema-model.md +414 -0
  277. package/docs/core/ui-generation.md +580 -0
  278. package/docs/core/what-is-praxis.md +240 -0
  279. package/docs/tutorials/README.md +84 -0
  280. package/docs/tutorials/ecommerce-cart.md +631 -0
  281. package/docs/tutorials/first-app.md +529 -0
  282. package/docs/tutorials/form-builder.md +620 -0
  283. package/docs/tutorials/todo-pluresdb.md +589 -0
  284. package/package.json +1 -1
  285. package/src/__tests__/canvas-components.test.ts +450 -0
  286. package/src/__tests__/cli-create.test.ts +178 -0
  287. package/src/__tests__/code-canvas-integration.test.ts +277 -0
  288. package/src/__tests__/docs-generator.test.ts +181 -0
  289. package/src/__tests__/generators.test.ts +3 -2
  290. package/src/__tests__/pluresdb.test.ts +457 -0
  291. package/src/__tests__/psf-schema-engine.test.ts +450 -0
  292. package/src/__tests__/state-docs-integration.test.ts +297 -0
  293. package/src/__tests__/tauri-integration.test.ts +298 -0
  294. package/src/__tests__/terminal-node.test.ts +1 -1
  295. package/src/__tests__/unum-integration.test.ts +142 -0
  296. package/src/cli/commands/build.ts +203 -0
  297. package/src/cli/commands/canvas.ts +246 -0
  298. package/src/cli/commands/create.ts +666 -0
  299. package/src/cli/commands/dev.ts +95 -0
  300. package/src/cli/commands/orchestrate.ts +212 -0
  301. package/src/cli/index.ts +48 -21
  302. package/src/core/component/generator.ts +45 -3
  303. package/src/core/logic/generator.ts +39 -4
  304. package/src/core/pluresdb/adapter.ts +117 -0
  305. package/src/core/pluresdb/generator.ts +33 -4
  306. package/src/core/pluresdb/index.ts +37 -0
  307. package/src/core/pluresdb/schema-registry.ts +162 -0
  308. package/src/core/pluresdb/store.ts +443 -0
  309. package/src/index.ts +109 -0
  310. package/src/integrations/code-canvas.ts +717 -0
  311. package/src/integrations/pluresdb.ts +140 -29
  312. package/src/integrations/state-docs.ts +710 -0
  313. package/src/integrations/tauri.ts +638 -0
  314. package/src/integrations/unum.ts +395 -0
  315. package/src/runtime/terminal-adapter.ts +178 -23
  316. package/dist/adapters/cli.d.ts.map +0 -1
  317. package/dist/adapters/cli.js.map +0 -1
  318. package/dist/cli/commands/auth.d.ts.map +0 -1
  319. package/dist/cli/commands/auth.js.map +0 -1
  320. package/dist/cli/commands/cloud.d.ts.map +0 -1
  321. package/dist/cli/commands/cloud.js.map +0 -1
  322. package/dist/cli/commands/generate.d.ts.map +0 -1
  323. package/dist/cli/commands/generate.js.map +0 -1
  324. package/dist/cli/index.js.map +0 -1
  325. package/dist/cloud/auth.d.ts.map +0 -1
  326. package/dist/cloud/auth.js.map +0 -1
  327. package/dist/cloud/billing.d.ts.map +0 -1
  328. package/dist/cloud/billing.js.map +0 -1
  329. package/dist/cloud/client.d.ts.map +0 -1
  330. package/dist/cloud/client.js.map +0 -1
  331. package/dist/cloud/index.d.ts.map +0 -1
  332. package/dist/cloud/index.js.map +0 -1
  333. package/dist/cloud/marketplace.d.ts.map +0 -1
  334. package/dist/cloud/marketplace.js.map +0 -1
  335. package/dist/cloud/provisioning.d.ts.map +0 -1
  336. package/dist/cloud/provisioning.js.map +0 -1
  337. package/dist/cloud/relay/endpoints.d.ts.map +0 -1
  338. package/dist/cloud/relay/endpoints.js.map +0 -1
  339. package/dist/cloud/relay/health/index.d.ts.map +0 -1
  340. package/dist/cloud/relay/health/index.js.map +0 -1
  341. package/dist/cloud/relay/stats/index.d.ts.map +0 -1
  342. package/dist/cloud/relay/stats/index.js.map +0 -1
  343. package/dist/cloud/relay/sync/index.d.ts.map +0 -1
  344. package/dist/cloud/relay/sync/index.js.map +0 -1
  345. package/dist/cloud/relay/usage/index.d.ts.map +0 -1
  346. package/dist/cloud/relay/usage/index.js.map +0 -1
  347. package/dist/cloud/sponsors.d.ts.map +0 -1
  348. package/dist/cloud/sponsors.js.map +0 -1
  349. package/dist/cloud/types.d.ts.map +0 -1
  350. package/dist/components/index.d.ts.map +0 -1
  351. package/dist/components/index.js.map +0 -1
  352. package/dist/core/actors.d.ts.map +0 -1
  353. package/dist/core/actors.js.map +0 -1
  354. package/dist/core/component/generator.d.ts.map +0 -1
  355. package/dist/core/component/generator.js.map +0 -1
  356. package/dist/core/engine.d.ts.map +0 -1
  357. package/dist/core/engine.js.map +0 -1
  358. package/dist/core/introspection.d.ts.map +0 -1
  359. package/dist/core/introspection.js.map +0 -1
  360. package/dist/core/logic/generator.d.ts.map +0 -1
  361. package/dist/core/logic/generator.js.map +0 -1
  362. package/dist/core/pluresdb/generator.d.ts.map +0 -1
  363. package/dist/core/pluresdb/generator.js.map +0 -1
  364. package/dist/core/protocol.d.ts.map +0 -1
  365. package/dist/core/protocol.js.map +0 -1
  366. package/dist/core/rules.d.ts.map +0 -1
  367. package/dist/core/rules.js.map +0 -1
  368. package/dist/core/schema/loader.d.ts.map +0 -1
  369. package/dist/core/schema/loader.js.map +0 -1
  370. package/dist/core/schema/normalize.d.ts.map +0 -1
  371. package/dist/core/schema/normalize.js.map +0 -1
  372. package/dist/core/schema/types.d.ts.map +0 -1
  373. package/dist/core/schema/types.js.map +0 -1
  374. package/dist/dsl/index.d.ts.map +0 -1
  375. package/dist/dsl/index.js.map +0 -1
  376. package/dist/dsl.d.ts.map +0 -1
  377. package/dist/dsl.js.map +0 -1
  378. package/dist/examples/advanced-todo/index.d.ts.map +0 -1
  379. package/dist/examples/advanced-todo/index.js.map +0 -1
  380. package/dist/examples/auth-basic/index.d.ts.map +0 -1
  381. package/dist/examples/auth-basic/index.js.map +0 -1
  382. package/dist/examples/cart/index.d.ts.map +0 -1
  383. package/dist/examples/cart/index.js.map +0 -1
  384. package/dist/examples/hero-ecommerce/index.d.ts.map +0 -1
  385. package/dist/examples/hero-ecommerce/index.js.map +0 -1
  386. package/dist/examples/svelte-counter/index.d.ts.map +0 -1
  387. package/dist/examples/svelte-counter/index.js.map +0 -1
  388. package/dist/flows.d.ts.map +0 -1
  389. package/dist/flows.js.map +0 -1
  390. package/dist/index.d.ts.map +0 -1
  391. package/dist/index.js.map +0 -1
  392. package/dist/integrations/pluresdb.d.ts +0 -56
  393. package/dist/integrations/pluresdb.d.ts.map +0 -1
  394. package/dist/integrations/pluresdb.js +0 -46
  395. package/dist/integrations/pluresdb.js.map +0 -1
  396. package/dist/integrations/svelte.d.ts.map +0 -1
  397. package/dist/integrations/svelte.js.map +0 -1
  398. package/dist/registry.d.ts.map +0 -1
  399. package/dist/registry.js.map +0 -1
  400. package/dist/runtime/terminal-adapter.d.ts.map +0 -1
  401. package/dist/runtime/terminal-adapter.js +0 -113
  402. package/dist/runtime/terminal-adapter.js.map +0 -1
  403. package/dist/step.d.ts.map +0 -1
  404. package/dist/step.js.map +0 -1
  405. package/dist/types.d.ts.map +0 -1
  406. package/dist/types.js.map +0 -1
  407. /package/dist/{adapters → src/adapters}/cli.d.ts +0 -0
  408. /package/dist/{adapters → src/adapters}/cli.js +0 -0
  409. /package/dist/{cli → src/cli}/commands/auth.d.ts +0 -0
  410. /package/dist/{cli → src/cli}/commands/auth.js +0 -0
  411. /package/dist/{cli → src/cli}/commands/cloud.d.ts +0 -0
  412. /package/dist/{cli → src/cli}/commands/cloud.js +0 -0
  413. /package/dist/{cli → src/cli}/commands/generate.d.ts +0 -0
  414. /package/dist/{cli → src/cli}/commands/generate.js +0 -0
  415. /package/dist/{cli → src/cli}/index.d.ts +0 -0
  416. /package/dist/{cloud → src/cloud}/auth.d.ts +0 -0
  417. /package/dist/{cloud → src/cloud}/auth.js +0 -0
  418. /package/dist/{cloud → src/cloud}/billing.d.ts +0 -0
  419. /package/dist/{cloud → src/cloud}/billing.js +0 -0
  420. /package/dist/{cloud → src/cloud}/client.d.ts +0 -0
  421. /package/dist/{cloud → src/cloud}/client.js +0 -0
  422. /package/dist/{cloud → src/cloud}/index.d.ts +0 -0
  423. /package/dist/{cloud → src/cloud}/index.js +0 -0
  424. /package/dist/{cloud → src/cloud}/marketplace.d.ts +0 -0
  425. /package/dist/{cloud → src/cloud}/marketplace.js +0 -0
  426. /package/dist/{cloud → src/cloud}/provisioning.d.ts +0 -0
  427. /package/dist/{cloud → src/cloud}/provisioning.js +0 -0
  428. /package/dist/{cloud → src/cloud}/relay/endpoints.d.ts +0 -0
  429. /package/dist/{cloud → src/cloud}/relay/endpoints.js +0 -0
  430. /package/dist/{cloud → src/cloud}/relay/health/index.d.ts +0 -0
  431. /package/dist/{cloud → src/cloud}/relay/health/index.js +0 -0
  432. /package/dist/{cloud → src/cloud}/relay/stats/index.d.ts +0 -0
  433. /package/dist/{cloud → src/cloud}/relay/stats/index.js +0 -0
  434. /package/dist/{cloud → src/cloud}/relay/sync/index.d.ts +0 -0
  435. /package/dist/{cloud → src/cloud}/relay/sync/index.js +0 -0
  436. /package/dist/{cloud → src/cloud}/relay/usage/index.d.ts +0 -0
  437. /package/dist/{cloud → src/cloud}/relay/usage/index.js +0 -0
  438. /package/dist/{cloud → src/cloud}/sponsors.d.ts +0 -0
  439. /package/dist/{cloud → src/cloud}/sponsors.js +0 -0
  440. /package/dist/{cloud → src/cloud}/types.d.ts +0 -0
  441. /package/dist/{cloud → src/cloud}/types.js +0 -0
  442. /package/dist/{components → src/components}/index.d.ts +0 -0
  443. /package/dist/{components → src/components}/index.js +0 -0
  444. /package/dist/{core → src/core}/actors.d.ts +0 -0
  445. /package/dist/{core → src/core}/actors.js +0 -0
  446. /package/dist/{core → src/core}/component/generator.d.ts +0 -0
  447. /package/dist/{core → src/core}/engine.d.ts +0 -0
  448. /package/dist/{core → src/core}/engine.js +0 -0
  449. /package/dist/{core → src/core}/introspection.d.ts +0 -0
  450. /package/dist/{core → src/core}/introspection.js +0 -0
  451. /package/dist/{core → src/core}/logic/generator.d.ts +0 -0
  452. /package/dist/{core → src/core}/pluresdb/generator.d.ts +0 -0
  453. /package/dist/{core → src/core}/protocol.d.ts +0 -0
  454. /package/dist/{core → src/core}/protocol.js +0 -0
  455. /package/dist/{core → src/core}/rules.d.ts +0 -0
  456. /package/dist/{core → src/core}/rules.js +0 -0
  457. /package/dist/{core → src/core}/schema/loader.d.ts +0 -0
  458. /package/dist/{core → src/core}/schema/loader.js +0 -0
  459. /package/dist/{core → src/core}/schema/normalize.d.ts +0 -0
  460. /package/dist/{core → src/core}/schema/normalize.js +0 -0
  461. /package/dist/{core → src/core}/schema/types.d.ts +0 -0
  462. /package/dist/{core → src/core}/schema/types.js +0 -0
  463. /package/dist/{dsl → src/dsl}/index.d.ts +0 -0
  464. /package/dist/{dsl → src/dsl}/index.js +0 -0
  465. /package/dist/{dsl.d.ts → src/dsl.d.ts} +0 -0
  466. /package/dist/{dsl.js → src/dsl.js} +0 -0
  467. /package/dist/{examples → src/examples}/advanced-todo/index.d.ts +0 -0
  468. /package/dist/{examples → src/examples}/advanced-todo/index.js +0 -0
  469. /package/dist/{examples → src/examples}/auth-basic/index.d.ts +0 -0
  470. /package/dist/{examples → src/examples}/auth-basic/index.js +0 -0
  471. /package/dist/{examples → src/examples}/cart/index.d.ts +0 -0
  472. /package/dist/{examples → src/examples}/cart/index.js +0 -0
  473. /package/dist/{examples → src/examples}/hero-ecommerce/index.d.ts +0 -0
  474. /package/dist/{examples → src/examples}/hero-ecommerce/index.js +0 -0
  475. /package/dist/{examples → src/examples}/svelte-counter/index.d.ts +0 -0
  476. /package/dist/{examples → src/examples}/svelte-counter/index.js +0 -0
  477. /package/dist/{flows.d.ts → src/flows.d.ts} +0 -0
  478. /package/dist/{flows.js → src/flows.js} +0 -0
  479. /package/dist/{integrations → src/integrations}/svelte.d.ts +0 -0
  480. /package/dist/{integrations → src/integrations}/svelte.js +0 -0
  481. /package/dist/{registry.d.ts → src/registry.d.ts} +0 -0
  482. /package/dist/{registry.js → src/registry.js} +0 -0
  483. /package/dist/{step.d.ts → src/step.d.ts} +0 -0
  484. /package/dist/{step.js → src/step.js} +0 -0
  485. /package/dist/{types.d.ts → src/types.d.ts} +0 -0
  486. /package/dist/{types.js → src/types.js} +0 -0
@@ -0,0 +1,580 @@
1
+ # UI Generation
2
+
3
+ Praxis automatically generates Svelte components from your schema definitions. This document explains how component generation works and how to customize the output.
4
+
5
+ ## Overview
6
+
7
+ From a single schema definition, Praxis generates:
8
+ - Svelte 5 components with runes
9
+ - TypeScript type definitions
10
+ - Data binding and validation
11
+ - Event handlers
12
+ - Documentation
13
+
14
+ ```mermaid
15
+ flowchart LR
16
+ Schema[PSF Schema] --> Generator[Component Generator]
17
+ Generator --> Svelte[Svelte Components]
18
+ Generator --> Types[TypeScript Types]
19
+ Generator --> Docs[Documentation]
20
+ ```
21
+
22
+ ## Component Types
23
+
24
+ ### Form Components
25
+
26
+ Forms are generated from model definitions:
27
+
28
+ **Schema:**
29
+ ```json
30
+ {
31
+ "components": [
32
+ {
33
+ "id": "comp_user_form",
34
+ "name": "UserForm",
35
+ "type": "form",
36
+ "model": "User",
37
+ "description": "Form for creating users"
38
+ }
39
+ ]
40
+ }
41
+ ```
42
+
43
+ **Generated Component:**
44
+ ```svelte
45
+ <script lang="ts">
46
+ import type { User } from '../models';
47
+
48
+ interface Props {
49
+ user?: User;
50
+ onsubmit?: (user: User) => void;
51
+ oncancel?: () => void;
52
+ }
53
+
54
+ let { user = $bindable(), onsubmit, oncancel }: Props = $props();
55
+
56
+ let formData = $state({
57
+ username: user?.username ?? '',
58
+ email: user?.email ?? '',
59
+ role: user?.role ?? 'user',
60
+ });
61
+
62
+ let errors = $state<Record<string, string>>({});
63
+
64
+ function validate(): boolean {
65
+ errors = {};
66
+ if (!formData.username) errors.username = 'Username is required';
67
+ if (!formData.email) errors.email = 'Email is required';
68
+ return Object.keys(errors).length === 0;
69
+ }
70
+
71
+ function handleSubmit(e: Event) {
72
+ e.preventDefault();
73
+ if (validate()) {
74
+ onsubmit?.(formData as User);
75
+ }
76
+ }
77
+ </script>
78
+
79
+ <form onsubmit={handleSubmit}>
80
+ <div class="field">
81
+ <label for="username">Username</label>
82
+ <input id="username" bind:value={formData.username} />
83
+ {#if errors.username}<span class="error">{errors.username}</span>{/if}
84
+ </div>
85
+
86
+ <div class="field">
87
+ <label for="email">Email</label>
88
+ <input id="email" type="email" bind:value={formData.email} />
89
+ {#if errors.email}<span class="error">{errors.email}</span>{/if}
90
+ </div>
91
+
92
+ <div class="field">
93
+ <label for="role">Role</label>
94
+ <select id="role" bind:value={formData.role}>
95
+ <option value="admin">Admin</option>
96
+ <option value="user">User</option>
97
+ <option value="guest">Guest</option>
98
+ </select>
99
+ </div>
100
+
101
+ <div class="actions">
102
+ <button type="submit">Save</button>
103
+ <button type="button" onclick={oncancel}>Cancel</button>
104
+ </div>
105
+ </form>
106
+ ```
107
+
108
+ ### Display Components
109
+
110
+ Display components show data in read-only format:
111
+
112
+ **Schema:**
113
+ ```json
114
+ {
115
+ "components": [
116
+ {
117
+ "id": "comp_user_card",
118
+ "name": "UserCard",
119
+ "type": "display",
120
+ "model": "User",
121
+ "description": "Displays user information"
122
+ }
123
+ ]
124
+ }
125
+ ```
126
+
127
+ **Generated Component:**
128
+ ```svelte
129
+ <script lang="ts">
130
+ import type { User } from '../models';
131
+
132
+ interface Props {
133
+ user: User;
134
+ onclick?: (user: User) => void;
135
+ }
136
+
137
+ let { user, onclick }: Props = $props();
138
+ </script>
139
+
140
+ <div class="user-card" onclick={() => onclick?.(user)}>
141
+ <h3>{user.username}</h3>
142
+ <p class="email">{user.email}</p>
143
+ <span class="role">{user.role}</span>
144
+ </div>
145
+ ```
146
+
147
+ ### List Components
148
+
149
+ List components display collections:
150
+
151
+ **Schema:**
152
+ ```json
153
+ {
154
+ "components": [
155
+ {
156
+ "id": "comp_user_list",
157
+ "name": "UserList",
158
+ "type": "list",
159
+ "model": "User",
160
+ "props": [
161
+ { "name": "users", "type": "User[]", "required": true },
162
+ { "name": "filter", "type": "string", "required": false }
163
+ ]
164
+ }
165
+ ]
166
+ }
167
+ ```
168
+
169
+ **Generated Component:**
170
+ ```svelte
171
+ <script lang="ts">
172
+ import type { User } from '../models';
173
+ import UserCard from './UserCard.svelte';
174
+
175
+ interface Props {
176
+ users: User[];
177
+ filter?: string;
178
+ onselect?: (user: User) => void;
179
+ }
180
+
181
+ let { users, filter = '', onselect }: Props = $props();
182
+
183
+ let filtered = $derived(
184
+ filter
185
+ ? users.filter(u => u.username.includes(filter))
186
+ : users
187
+ );
188
+ </script>
189
+
190
+ <div class="user-list">
191
+ {#each filtered as user (user.id)}
192
+ <UserCard {user} onclick={onselect} />
193
+ {/each}
194
+
195
+ {#if filtered.length === 0}
196
+ <p class="empty">No users found</p>
197
+ {/if}
198
+ </div>
199
+ ```
200
+
201
+ ### Editor Components
202
+
203
+ Editor components provide rich editing capabilities:
204
+
205
+ **Schema:**
206
+ ```json
207
+ {
208
+ "components": [
209
+ {
210
+ "id": "comp_form_builder",
211
+ "name": "FormBuilder",
212
+ "type": "editor",
213
+ "description": "Visual form builder"
214
+ }
215
+ ]
216
+ }
217
+ ```
218
+
219
+ ## Customizing Components
220
+
221
+ ### Custom Props
222
+
223
+ Define custom props in the schema:
224
+
225
+ ```json
226
+ {
227
+ "components": [
228
+ {
229
+ "id": "comp_product_card",
230
+ "name": "ProductCard",
231
+ "type": "display",
232
+ "model": "Product",
233
+ "props": [
234
+ { "name": "product", "type": "Product", "required": true },
235
+ { "name": "showPrice", "type": "boolean", "default": true },
236
+ { "name": "currency", "type": "string", "default": "USD" }
237
+ ]
238
+ }
239
+ ]
240
+ }
241
+ ```
242
+
243
+ ### Custom Events
244
+
245
+ Define events the component emits:
246
+
247
+ ```json
248
+ {
249
+ "components": [
250
+ {
251
+ "id": "comp_cart_item",
252
+ "name": "CartItem",
253
+ "type": "display",
254
+ "props": [
255
+ { "name": "item", "type": "CartItem", "required": true }
256
+ ],
257
+ "events": [
258
+ { "name": "remove", "payload": "{ itemId: string }" },
259
+ { "name": "updateQuantity", "payload": "{ itemId: string; quantity: number }" }
260
+ ]
261
+ }
262
+ ]
263
+ }
264
+ ```
265
+
266
+ ### Extending Generated Components
267
+
268
+ Generated components can be extended without modifying them:
269
+
270
+ ```svelte
271
+ <!-- CustomProductCard.svelte -->
272
+ <script lang="ts">
273
+ import ProductCard from './generated/ProductCard.svelte';
274
+ import type { Product } from './generated/models';
275
+
276
+ interface Props {
277
+ product: Product;
278
+ }
279
+
280
+ let { product }: Props = $props();
281
+ </script>
282
+
283
+ <div class="custom-wrapper">
284
+ <ProductCard {product} showPrice={true} currency="EUR" />
285
+ <div class="custom-badge">New!</div>
286
+ </div>
287
+ ```
288
+
289
+ ## Field Type Mapping
290
+
291
+ Praxis maps schema field types to HTML input types:
292
+
293
+ | Schema Type | HTML Input | Component |
294
+ |-------------|------------|-----------|
295
+ | `string` | `<input type="text">` | Text input |
296
+ | `number` | `<input type="number">` | Number input |
297
+ | `boolean` | `<input type="checkbox">` | Checkbox |
298
+ | `datetime` | `<input type="datetime-local">` | Date picker |
299
+ | `{ enum: [...] }` | `<select>` | Dropdown |
300
+ | `{ array: {...} }` | Custom | Array editor |
301
+ | `object` | Nested form | Fieldset |
302
+ | `uuid` | Hidden | Auto-generated |
303
+
304
+ ## Validation
305
+
306
+ Generated forms include validation based on field definitions:
307
+
308
+ **Schema:**
309
+ ```json
310
+ {
311
+ "models": [
312
+ {
313
+ "name": "User",
314
+ "fields": [
315
+ { "name": "email", "type": "string", "validation": { "format": "email" } },
316
+ { "name": "age", "type": "number", "validation": { "min": 0, "max": 150 } },
317
+ { "name": "username", "type": "string", "validation": { "minLength": 3, "maxLength": 20 } }
318
+ ]
319
+ }
320
+ ]
321
+ }
322
+ ```
323
+
324
+ **Generated Validation:**
325
+ ```svelte
326
+ <script lang="ts">
327
+ function validate(): boolean {
328
+ errors = {};
329
+
330
+ if (!isValidEmail(formData.email)) {
331
+ errors.email = 'Invalid email format';
332
+ }
333
+
334
+ if (formData.age < 0 || formData.age > 150) {
335
+ errors.age = 'Age must be between 0 and 150';
336
+ }
337
+
338
+ if (formData.username.length < 3) {
339
+ errors.username = 'Username must be at least 3 characters';
340
+ }
341
+
342
+ if (formData.username.length > 20) {
343
+ errors.username = 'Username must be at most 20 characters';
344
+ }
345
+
346
+ return Object.keys(errors).length === 0;
347
+ }
348
+ </script>
349
+ ```
350
+
351
+ ## Svelte 5 Runes
352
+
353
+ Generated components use Svelte 5 runes for reactivity:
354
+
355
+ ### $props
356
+
357
+ Component props use the `$props` rune:
358
+
359
+ ```svelte
360
+ <script lang="ts">
361
+ interface Props {
362
+ user: User;
363
+ editable?: boolean;
364
+ }
365
+
366
+ let { user, editable = false }: Props = $props();
367
+ </script>
368
+ ```
369
+
370
+ ### $state
371
+
372
+ Local state uses the `$state` rune:
373
+
374
+ ```svelte
375
+ <script lang="ts">
376
+ let formData = $state({
377
+ name: '',
378
+ email: ''
379
+ });
380
+
381
+ let errors = $state<Record<string, string>>({});
382
+ </script>
383
+ ```
384
+
385
+ ### $derived
386
+
387
+ Computed values use the `$derived` rune:
388
+
389
+ ```svelte
390
+ <script lang="ts">
391
+ let filteredItems = $derived(
392
+ items.filter(item => item.name.includes(searchTerm))
393
+ );
394
+
395
+ let total = $derived(
396
+ items.reduce((sum, item) => sum + item.price, 0)
397
+ );
398
+ </script>
399
+ ```
400
+
401
+ ### $bindable
402
+
403
+ Two-way binding uses `$bindable`:
404
+
405
+ ```svelte
406
+ <script lang="ts">
407
+ interface Props {
408
+ value?: string;
409
+ }
410
+
411
+ let { value = $bindable('') }: Props = $props();
412
+ </script>
413
+
414
+ <input bind:value />
415
+ ```
416
+
417
+ ## Integration with Logic Engine
418
+
419
+ Generated components integrate with the Praxis engine:
420
+
421
+ ```svelte
422
+ <script lang="ts">
423
+ import { usePraxisEngine } from '@plures/praxis/svelte';
424
+ import { engine } from '../engine';
425
+ import { AddToCart, RemoveFromCart } from '../generated/events';
426
+
427
+ const { context, dispatch } = usePraxisEngine(engine);
428
+
429
+ function handleAddToCart(productId: string) {
430
+ dispatch([AddToCart.create({ productId, quantity: 1 })]);
431
+ }
432
+
433
+ function handleRemoveFromCart(itemId: string) {
434
+ dispatch([RemoveFromCart.create({ itemId })]);
435
+ }
436
+ </script>
437
+
438
+ <ProductList
439
+ products={context.products}
440
+ onaddtocart={handleAddToCart}
441
+ />
442
+
443
+ <ShoppingCart
444
+ items={context.cart.items}
445
+ onremove={handleRemoveFromCart}
446
+ />
447
+ ```
448
+
449
+ ## Styling
450
+
451
+ ### Default Styles
452
+
453
+ Generated components include minimal default styles:
454
+
455
+ ```svelte
456
+ <style>
457
+ .field {
458
+ margin-bottom: 1rem;
459
+ }
460
+
461
+ label {
462
+ display: block;
463
+ margin-bottom: 0.25rem;
464
+ }
465
+
466
+ input, select, textarea {
467
+ width: 100%;
468
+ padding: 0.5rem;
469
+ border: 1px solid #ccc;
470
+ border-radius: 4px;
471
+ }
472
+
473
+ .error {
474
+ color: red;
475
+ font-size: 0.875rem;
476
+ }
477
+ </style>
478
+ ```
479
+
480
+ ### Custom Styling
481
+
482
+ Override styles by:
483
+
484
+ 1. **Component-level styles**: Add to wrapper component
485
+ 2. **Global CSS**: Import a stylesheet
486
+ 3. **CSS variables**: Use CSS custom properties
487
+ 4. **Tailwind/UnoCSS**: Configure utility classes
488
+
489
+ ## Generation Commands
490
+
491
+ ### Generate All Components
492
+
493
+ ```bash
494
+ praxis generate --schema ./schema.psf.json --output ./generated
495
+ ```
496
+
497
+ ### Generate Specific Components
498
+
499
+ ```bash
500
+ praxis generate --schema ./schema.psf.json --only components --output ./generated/components
501
+ ```
502
+
503
+ ### Watch Mode
504
+
505
+ ```bash
506
+ praxis generate --schema ./schema.psf.json --watch
507
+ ```
508
+
509
+ ### Custom Templates
510
+
511
+ Use custom templates for generation:
512
+
513
+ ```bash
514
+ praxis generate --schema ./schema.psf.json --templates ./my-templates
515
+ ```
516
+
517
+ ## Best Practices
518
+
519
+ ### 1. Keep Components Focused
520
+
521
+ Each component should have a single responsibility:
522
+
523
+ ```json
524
+ {
525
+ "components": [
526
+ { "name": "UserAvatar", "type": "display" },
527
+ { "name": "UserName", "type": "display" },
528
+ { "name": "UserCard", "type": "composite" }
529
+ ]
530
+ }
531
+ ```
532
+
533
+ ### 2. Use Model References
534
+
535
+ Reference models for type safety:
536
+
537
+ ```json
538
+ {
539
+ "components": [
540
+ {
541
+ "name": "UserForm",
542
+ "type": "form",
543
+ "model": "User"
544
+ }
545
+ ]
546
+ }
547
+ ```
548
+
549
+ ### 3. Define Clear Events
550
+
551
+ Document what each event represents:
552
+
553
+ ```json
554
+ {
555
+ "events": [
556
+ {
557
+ "name": "submit",
558
+ "payload": "User",
559
+ "description": "Emitted when form is submitted with valid data"
560
+ }
561
+ ]
562
+ }
563
+ ```
564
+
565
+ ### 4. Preserve Customizations
566
+
567
+ Extend generated components instead of modifying them:
568
+
569
+ ```
570
+ components/
571
+ ├── generated/ # Auto-generated (don't edit)
572
+ │ ├── UserForm.svelte
573
+ │ └── UserList.svelte
574
+ ├── UserForm.svelte # Your customizations
575
+ └── UserList.svelte
576
+ ```
577
+
578
+ ---
579
+
580
+ **Next:** [PluresDB Integration](./pluresdb-integration.md)