@svgrid/enterprise 2.5.3 → 2.6.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 (624) hide show
  1. package/dist/SvAlertRuleEditor.svelte.d.ts +13 -0
  2. package/dist/SvAlertsManager.svelte.d.ts +14 -0
  3. package/dist/SvAlertsPanel.svelte.d.ts +9 -0
  4. package/dist/SvAuthGate.svelte.d.ts +22 -0
  5. package/dist/SvBoard.svelte.d.ts +35 -0
  6. package/dist/SvExportMenu.svelte.d.ts +61 -0
  7. package/{src → dist}/SvExpressionEditor.svelte +4 -1
  8. package/dist/SvExpressionEditor.svelte.d.ts +12 -0
  9. package/dist/SvFileInput.svelte.d.ts +20 -0
  10. package/dist/SvGridAlerts.svelte.d.ts +77 -0
  11. package/dist/SvGridBoard.svelte.d.ts +30 -0
  12. package/{src → dist}/SvGridEditPanel.svelte +173 -28
  13. package/dist/SvGridEditPanel.svelte.d.ts +75 -0
  14. package/dist/SvGridMasterDetail.svelte.d.ts +49 -0
  15. package/dist/SvGridScheduler.svelte.d.ts +30 -0
  16. package/dist/SvImportDialog.svelte.d.ts +88 -0
  17. package/dist/SvLookupInput.svelte.d.ts +21 -0
  18. package/dist/SvPivotDesigner.svelte.d.ts +176 -0
  19. package/dist/SvRecordDetail.svelte.d.ts +58 -0
  20. package/dist/SvSchedule.svelte.d.ts +29 -0
  21. package/dist/SvSchemaChart.svelte.d.ts +61 -0
  22. package/dist/SvSchemaDashboard.svelte.d.ts +46 -0
  23. package/dist/alerts/alert-engine-attach.d.ts +79 -0
  24. package/dist/alerts/alert-engine-attach.js +106 -0
  25. package/dist/alerts/alert-engine.d.ts +42 -0
  26. package/dist/alerts/alert-engine.js +196 -0
  27. package/dist/alerts/alert-formats.d.ts +26 -0
  28. package/dist/alerts/alert-formats.js +58 -0
  29. package/dist/alerts/alert-observer.d.ts +54 -0
  30. package/dist/alerts/alert-observer.js +156 -0
  31. package/dist/alerts/alert-scheduler.d.ts +30 -0
  32. package/dist/alerts/alert-scheduler.js +54 -0
  33. package/dist/alerts/alert-storage.d.ts +31 -0
  34. package/dist/alerts/alert-storage.js +92 -0
  35. package/dist/alerts/alert-store.svelte.d.ts +24 -0
  36. package/dist/alerts/alert-store.svelte.js +69 -0
  37. package/dist/alerts/alert-types.d.ts +86 -0
  38. package/dist/alerts/alert-types.js +1 -0
  39. package/dist/alerts.d.ts +2 -0
  40. package/{src/alerts.ts → dist/alerts.js} +9 -9
  41. package/dist/board.d.ts +7 -0
  42. package/{src/board.ts → dist/board.js} +13 -14
  43. package/dist/cdn/svgrid-enterprise.svelte-external.js +3220 -2607
  44. package/dist/designer/assets/index-BfzoL904.css +1 -0
  45. package/dist/designer/assets/{index-CBYU-KNn.js → index-CKdwDseq.js} +139 -139
  46. package/dist/designer/assets/src-DCKhP5Xy.css +1 -0
  47. package/dist/designer/assets/{src-i309BeJb.js → src-DLsSdh3J.js} +213 -193
  48. package/dist/designer/index.html +4 -4
  49. package/dist/edit-panel.d.ts +105 -0
  50. package/dist/edit-panel.js +350 -0
  51. package/dist/export-conditional.d.ts +31 -0
  52. package/dist/export-conditional.js +65 -0
  53. package/dist/export-ooxml.d.ts +93 -0
  54. package/dist/export-ooxml.js +385 -0
  55. package/dist/export-pdf.d.ts +107 -0
  56. package/dist/export-pdf.js +144 -0
  57. package/dist/export-print.d.ts +55 -0
  58. package/dist/export-print.js +91 -0
  59. package/{src/export-serialize.ts → dist/export-serialize.d.ts} +11 -24
  60. package/dist/export-serialize.js +11 -0
  61. package/dist/export-xls.d.ts +26 -0
  62. package/dist/export-xls.js +157 -0
  63. package/dist/export.d.ts +323 -0
  64. package/dist/export.js +1021 -0
  65. package/dist/expressions/evaluate.d.ts +17 -0
  66. package/dist/expressions/evaluate.js +214 -0
  67. package/dist/expressions/expression-columns.d.ts +61 -0
  68. package/dist/expressions/expression-columns.js +72 -0
  69. package/dist/expressions/expression-types.d.ts +125 -0
  70. package/dist/expressions/expression-types.js +1 -0
  71. package/dist/expressions/parse.d.ts +25 -0
  72. package/dist/expressions/parse.js +537 -0
  73. package/dist/import.d.ts +232 -0
  74. package/dist/import.js +846 -0
  75. package/dist/index.d.ts +66 -0
  76. package/dist/index.js +91 -0
  77. package/dist/install.d.ts +70 -0
  78. package/dist/install.js +61 -0
  79. package/dist/license-core.d.ts +37 -0
  80. package/dist/license-core.js +81 -0
  81. package/dist/license.d.ts +30 -0
  82. package/dist/license.js +139 -0
  83. package/dist/master-detail.d.ts +23 -0
  84. package/dist/master-detail.js +35 -0
  85. package/dist/node/studio.js +683 -13
  86. package/dist/pivot-chart.d.ts +28 -0
  87. package/dist/pivot-chart.js +71 -0
  88. package/dist/pivot-designer.d.ts +69 -0
  89. package/dist/pivot-designer.js +38 -0
  90. package/dist/pivot-enable.d.ts +6 -0
  91. package/{src/pivot-enable.ts → dist/pivot-enable.js} +13 -18
  92. package/dist/pivot.d.ts +111 -0
  93. package/dist/pivot.js +353 -0
  94. package/dist/print.d.ts +33 -0
  95. package/dist/print.js +61 -0
  96. package/dist/revoked.d.ts +1 -0
  97. package/{src/revoked.ts → dist/revoked.js} +5 -6
  98. package/dist/scheduler-assignments.d.ts +64 -0
  99. package/dist/scheduler-assignments.js +92 -0
  100. package/dist/scheduler-axis.d.ts +81 -0
  101. package/dist/scheduler-axis.js +180 -0
  102. package/{src/scheduler-booking.ts → dist/scheduler-booking.d.ts} +10 -43
  103. package/dist/scheduler-booking.js +50 -0
  104. package/dist/scheduler-config.d.ts +177 -0
  105. package/dist/scheduler-config.js +1 -0
  106. package/dist/scheduler-dependencies.d.ts +89 -0
  107. package/dist/scheduler-dependencies.js +179 -0
  108. package/dist/scheduler-freebusy.d.ts +19 -0
  109. package/{src/scheduler-freebusy.ts → dist/scheduler-freebusy.js} +9 -19
  110. package/{src/scheduler-heatmap.ts → dist/scheduler-heatmap.d.ts} +12 -35
  111. package/dist/scheduler-heatmap.js +41 -0
  112. package/dist/scheduler-resource-tree.d.ts +48 -0
  113. package/dist/scheduler-resource-tree.js +78 -0
  114. package/dist/scheduler-slots.d.ts +37 -0
  115. package/dist/scheduler-slots.js +80 -0
  116. package/dist/scheduler-summary.d.ts +41 -0
  117. package/dist/scheduler-summary.js +54 -0
  118. package/dist/scheduler.d.ts +7 -0
  119. package/{src/scheduler.ts → dist/scheduler.js} +13 -14
  120. package/dist/scheduling.d.ts +132 -0
  121. package/dist/scheduling.js +228 -0
  122. package/dist/schema-designer.d.ts +42 -0
  123. package/dist/schema-designer.js +117 -0
  124. package/dist/schema.d.ts +408 -0
  125. package/dist/schema.js +225 -0
  126. package/dist/smart-shim.d.ts +62 -0
  127. package/dist/smart-shim.js +34 -0
  128. package/dist/sources/aggregate.d.ts +43 -0
  129. package/dist/sources/aggregate.js +60 -0
  130. package/dist/sources/auth-supabase.d.ts +69 -0
  131. package/dist/sources/auth-supabase.js +39 -0
  132. package/dist/sources/dashboard.d.ts +65 -0
  133. package/dist/sources/dashboard.js +95 -0
  134. package/dist/sources/field-inference.d.ts +23 -0
  135. package/dist/sources/field-inference.js +52 -0
  136. package/dist/sources/filters.d.ts +35 -0
  137. package/dist/sources/filters.js +52 -0
  138. package/dist/sources/index.d.ts +18 -0
  139. package/dist/sources/index.js +18 -0
  140. package/dist/sources/introspect-supabase.d.ts +30 -0
  141. package/dist/sources/introspect-supabase.js +134 -0
  142. package/dist/sources/realtime-supabase.d.ts +37 -0
  143. package/dist/sources/realtime-supabase.js +52 -0
  144. package/dist/sources/relation-lookup.d.ts +50 -0
  145. package/dist/sources/relation-lookup.js +77 -0
  146. package/dist/sources/rest-adapters.d.ts +48 -0
  147. package/dist/sources/rest-adapters.js +85 -0
  148. package/dist/sources/rest.d.ts +38 -0
  149. package/dist/sources/rest.js +86 -0
  150. package/dist/sources/schema-from-columns.d.ts +37 -0
  151. package/dist/sources/schema-from-columns.js +48 -0
  152. package/dist/sources/supabase.d.ts +33 -0
  153. package/dist/sources/supabase.js +74 -0
  154. package/dist/sources/with-entity-rules.d.ts +25 -0
  155. package/dist/sources/with-entity-rules.js +47 -0
  156. package/dist/sources/with-relation-labels.d.ts +26 -0
  157. package/dist/sources/with-relation-labels.js +38 -0
  158. package/dist/staged-editing.d.ts +85 -0
  159. package/dist/staged-editing.js +0 -0
  160. package/dist/studio/bug-report.d.ts +61 -0
  161. package/dist/studio/bug-report.js +126 -0
  162. package/dist/studio/cli.d.ts +56 -0
  163. package/dist/studio/cli.js +70 -0
  164. package/dist/studio/copilot-core.d.ts +22 -0
  165. package/{src/studio/copilot-core.ts → dist/studio/copilot-core.js} +34 -38
  166. package/dist/studio/csv.d.ts +36 -0
  167. package/dist/studio/csv.js +173 -0
  168. package/dist/studio/db-connect-string.d.ts +45 -0
  169. package/dist/studio/db-connect-string.js +113 -0
  170. package/dist/studio/deploy-cli.d.ts +35 -0
  171. package/dist/studio/deploy-cli.js +81 -0
  172. package/dist/studio/emit-project.d.ts +77 -0
  173. package/dist/studio/emit-project.js +5463 -0
  174. package/dist/studio/emit-schema.d.ts +110 -0
  175. package/dist/studio/emit-schema.js +1128 -0
  176. package/dist/studio/index.d.ts +35 -0
  177. package/dist/studio/index.js +41 -0
  178. package/dist/studio/init-flow.d.ts +58 -0
  179. package/dist/studio/init-flow.js +451 -0
  180. package/dist/studio/introspect-db.d.ts +47 -0
  181. package/dist/studio/introspect-db.js +255 -0
  182. package/dist/studio/introspect-openapi.d.ts +19 -0
  183. package/dist/studio/introspect-openapi.js +244 -0
  184. package/dist/studio/introspect-prisma.d.ts +25 -0
  185. package/dist/studio/introspect-prisma.js +164 -0
  186. package/dist/studio/introspect.d.ts +35 -0
  187. package/dist/studio/introspect.js +306 -0
  188. package/dist/studio/project.d.ts +1448 -0
  189. package/dist/studio/project.js +2187 -0
  190. package/dist/studio/sample-data.d.ts +19 -0
  191. package/dist/studio/sample-data.js +207 -0
  192. package/dist/studio/samples/ats.d.ts +2 -0
  193. package/dist/studio/samples/ats.js +194 -0
  194. package/dist/studio/samples/clinic.d.ts +2 -0
  195. package/dist/studio/samples/clinic.js +171 -0
  196. package/dist/studio/samples/crm.d.ts +2 -0
  197. package/dist/studio/samples/crm.js +280 -0
  198. package/dist/studio/samples/datasets.d.ts +38 -0
  199. package/dist/studio/samples/datasets.js +296 -0
  200. package/dist/studio/samples/ecommerce.d.ts +2 -0
  201. package/dist/studio/samples/ecommerce.js +178 -0
  202. package/dist/studio/samples/events.d.ts +2 -0
  203. package/dist/studio/samples/events.js +192 -0
  204. package/dist/studio/samples/fleet.d.ts +2 -0
  205. package/dist/studio/samples/fleet.js +203 -0
  206. package/dist/studio/samples/gym.d.ts +2 -0
  207. package/dist/studio/samples/gym.js +205 -0
  208. package/dist/studio/samples/hr.d.ts +2 -0
  209. package/dist/studio/samples/hr.js +186 -0
  210. package/dist/studio/samples/index.d.ts +13 -0
  211. package/dist/studio/samples/index.js +44 -0
  212. package/dist/studio/samples/insurance.d.ts +2 -0
  213. package/dist/studio/samples/insurance.js +220 -0
  214. package/dist/studio/samples/inventory.d.ts +2 -0
  215. package/dist/studio/samples/inventory.js +204 -0
  216. package/dist/studio/samples/invoicing.d.ts +2 -0
  217. package/dist/studio/samples/invoicing.js +154 -0
  218. package/dist/studio/samples/library.d.ts +2 -0
  219. package/dist/studio/samples/library.js +171 -0
  220. package/dist/studio/samples/live-data.d.ts +5 -0
  221. package/dist/studio/samples/live-data.js +261 -0
  222. package/dist/studio/samples/projects.d.ts +2 -0
  223. package/dist/studio/samples/projects.js +203 -0
  224. package/dist/studio/samples/realestate.d.ts +2 -0
  225. package/dist/studio/samples/realestate.js +187 -0
  226. package/dist/studio/samples/restaurant.d.ts +2 -0
  227. package/dist/studio/samples/restaurant.js +180 -0
  228. package/dist/studio/samples/school.d.ts +2 -0
  229. package/dist/studio/samples/school.js +188 -0
  230. package/dist/studio/samples/shared.d.ts +142 -0
  231. package/dist/studio/samples/shared.js +164 -0
  232. package/dist/studio/samples/starter.d.ts +4 -0
  233. package/dist/studio/samples/starter.js +237 -0
  234. package/dist/studio/samples/subscriptions.d.ts +2 -0
  235. package/dist/studio/samples/subscriptions.js +175 -0
  236. package/dist/studio/samples/support.d.ts +2 -0
  237. package/dist/studio/samples/support.js +209 -0
  238. package/dist/studio/scaffold-app.d.ts +22 -0
  239. package/{src/studio/scaffold-app.ts → dist/studio/scaffold-app.js} +45 -63
  240. package/dist/studio/scaffold.d.ts +63 -0
  241. package/dist/studio/scaffold.js +346 -0
  242. package/dist/studio/screen-suites.d.ts +193 -0
  243. package/dist/studio/screen-suites.js +297 -0
  244. package/dist/studio/themes.d.ts +34 -0
  245. package/dist/studio/themes.js +41 -0
  246. package/dist/studio/ui-components.d.ts +89 -0
  247. package/dist/studio/ui-components.generated.d.ts +29 -0
  248. package/dist/studio/ui-components.generated.js +7319 -0
  249. package/dist/studio/ui-components.js +673 -0
  250. package/dist/studio/user-error.d.ts +23 -0
  251. package/{src/studio/user-error.ts → dist/studio/user-error.js} +10 -13
  252. package/dist/studio/verify.d.ts +34 -0
  253. package/dist/studio/verify.js +47 -0
  254. package/dist/sveltekit/in-memory.d.ts +14 -0
  255. package/dist/sveltekit/in-memory.js +113 -0
  256. package/dist/sveltekit/index.d.ts +6 -0
  257. package/dist/sveltekit/index.js +5 -0
  258. package/dist/sveltekit/query-plan.d.ts +44 -0
  259. package/dist/sveltekit/query-plan.js +76 -0
  260. package/dist/sveltekit/sql-source.d.ts +47 -0
  261. package/dist/sveltekit/sql-source.js +106 -0
  262. package/dist/sveltekit/sql.d.ts +48 -0
  263. package/dist/sveltekit/sql.js +73 -0
  264. package/dist/sveltekit/transport.d.ts +209 -0
  265. package/dist/sveltekit/transport.js +219 -0
  266. package/{src/sveltekit/types.ts → dist/sveltekit/types.d.ts} +8 -11
  267. package/dist/sveltekit/types.js +1 -0
  268. package/dist/upgrade-prompt.d.ts +16 -0
  269. package/dist/upgrade-prompt.js +141 -0
  270. package/dist/version.d.ts +13 -0
  271. package/{src/version.ts → dist/version.js} +1 -1
  272. package/dist/watermark.d.ts +2 -0
  273. package/dist/watermark.js +146 -0
  274. package/package.json +28 -26
  275. package/dist/designer/assets/index-oYok52zd.css +0 -1
  276. package/dist/designer/assets/src-D-O2F805.css +0 -1
  277. package/src/SvBoard.dom.test.ts +0 -67
  278. package/src/SvGridAlerts.dom.test.ts +0 -113
  279. package/src/SvGridEditPanel.dom.test.ts +0 -320
  280. package/src/SvRecordDetail.dom.test.ts +0 -137
  281. package/src/SvSchedule.dom.test.ts +0 -57
  282. package/src/ai-export-pdf.dom.test.ts +0 -77
  283. package/src/ai-export-xlsx.dom.test.ts +0 -90
  284. package/src/ai-export.dom.test.ts +0 -114
  285. package/src/alerts/alert-engine-attach.ts +0 -165
  286. package/src/alerts/alert-engine.test.ts +0 -135
  287. package/src/alerts/alert-engine.ts +0 -260
  288. package/src/alerts/alert-formats.test.ts +0 -87
  289. package/src/alerts/alert-formats.ts +0 -77
  290. package/src/alerts/alert-observer.test.ts +0 -189
  291. package/src/alerts/alert-observer.ts +0 -208
  292. package/src/alerts/alert-scheduler.ts +0 -96
  293. package/src/alerts/alert-storage.test.ts +0 -54
  294. package/src/alerts/alert-storage.ts +0 -116
  295. package/src/alerts/alert-store.svelte.ts +0 -80
  296. package/src/alerts/alert-types.ts +0 -94
  297. package/src/board.dom.test.ts +0 -941
  298. package/src/edit-panel.test.ts +0 -322
  299. package/src/edit-panel.ts +0 -379
  300. package/src/export-conditional.test.ts +0 -60
  301. package/src/export-conditional.ts +0 -94
  302. package/src/export-ooxml.test.ts +0 -152
  303. package/src/export-ooxml.ts +0 -489
  304. package/src/export-pdf.test.ts +0 -138
  305. package/src/export-pdf.ts +0 -245
  306. package/src/export-print.test.ts +0 -66
  307. package/src/export-print.ts +0 -132
  308. package/src/export-serialize.test.ts +0 -56
  309. package/src/export-xls.ts +0 -199
  310. package/src/export-xlsx-roundtrip.test.ts +0 -120
  311. package/src/export-xlsx.test.ts +0 -150
  312. package/src/export.test.ts +0 -349
  313. package/src/export.ts +0 -1464
  314. package/src/expressions/evaluate.test.ts +0 -111
  315. package/src/expressions/evaluate.ts +0 -237
  316. package/src/expressions/expression-columns.ts +0 -133
  317. package/src/expressions/expression-types.ts +0 -84
  318. package/src/expressions/parse.test.ts +0 -106
  319. package/src/expressions/parse.ts +0 -610
  320. package/src/import-automap.test.ts +0 -131
  321. package/src/import-hardening.test.ts +0 -158
  322. package/src/import.test.ts +0 -415
  323. package/src/import.ts +0 -1044
  324. package/src/index.ts +0 -569
  325. package/src/install.ts +0 -154
  326. package/src/license-core.test.ts +0 -23
  327. package/src/license-core.ts +0 -107
  328. package/src/license-expiry.test.ts +0 -144
  329. package/src/license.ts +0 -157
  330. package/src/master-detail.test.ts +0 -61
  331. package/src/master-detail.ts +0 -42
  332. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/_metadata.json +0 -178
  333. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-ZrPsKxob.js +0 -3875
  334. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-ZrPsKxob.js.map +0 -1
  335. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-ACqvWGE2.js +0 -21
  336. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-ACqvWGE2.js.map +0 -1
  337. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-D3w5jt92.js +0 -1938
  338. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-D3w5jt92.js.map +0 -1
  339. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-CC2V3H0y.js +0 -205
  340. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-CC2V3H0y.js.map +0 -1
  341. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-BXP37tAa.js +0 -18
  342. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-BXP37tAa.js.map +0 -1
  343. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-DwubnU5b.js +0 -264
  344. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-DwubnU5b.js.map +0 -1
  345. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-hD7f6PUz.js +0 -697
  346. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-hD7f6PUz.js.map +0 -1
  347. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js +0 -134
  348. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js.map +0 -1
  349. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js +0 -55
  350. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js.map +0 -1
  351. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_attachments.js +0 -2
  352. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js +0 -46843
  353. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js.map +0 -1
  354. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js +0 -237
  355. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js.map +0 -1
  356. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_events.js +0 -2
  357. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js +0 -4
  358. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js.map +0 -1
  359. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_client.js +0 -7
  360. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js +0 -4
  361. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js.map +0 -1
  362. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js +0 -5
  363. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js.map +0 -1
  364. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js +0 -5
  365. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js.map +0 -1
  366. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js +0 -5
  367. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js.map +0 -1
  368. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_server.js +0 -6
  369. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js +0 -83
  370. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js.map +0 -1
  371. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js +0 -559
  372. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js.map +0 -1
  373. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js +0 -24
  374. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js.map +0 -1
  375. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js +0 -122
  376. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js.map +0 -1
  377. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_server.js +0 -2
  378. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js +0 -89
  379. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js.map +0 -1
  380. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js +0 -241
  381. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js.map +0 -1
  382. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DBx1SCN6.js +0 -4938
  383. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DBx1SCN6.js.map +0 -1
  384. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-gjfpSTFS.js +0 -495
  385. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-gjfpSTFS.js.map +0 -1
  386. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-DKoOKg8S.js +0 -190
  387. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-DKoOKg8S.js.map +0 -1
  388. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-C0MiR7eR.js +0 -8
  389. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-C0MiR7eR.js.map +0 -1
  390. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-B6Y7P0Q-.js +0 -138
  391. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-B6Y7P0Q-.js.map +0 -1
  392. package/src/pivot-chart.test.ts +0 -86
  393. package/src/pivot-chart.ts +0 -112
  394. package/src/pivot-designer.ts +0 -101
  395. package/src/pivot.test.ts +0 -335
  396. package/src/pivot.ts +0 -578
  397. package/src/print.ts +0 -107
  398. package/src/scheduler-assignments.test.ts +0 -97
  399. package/src/scheduler-assignments.ts +0 -134
  400. package/src/scheduler-axis.test.ts +0 -108
  401. package/src/scheduler-axis.ts +0 -238
  402. package/src/scheduler-booking.test.ts +0 -57
  403. package/src/scheduler-config.ts +0 -179
  404. package/src/scheduler-dependencies.test.ts +0 -155
  405. package/src/scheduler-dependencies.ts +0 -223
  406. package/src/scheduler-freebusy.test.ts +0 -41
  407. package/src/scheduler-heatmap.test.ts +0 -39
  408. package/src/scheduler-resource-tree.test.ts +0 -84
  409. package/src/scheduler-resource-tree.ts +0 -107
  410. package/src/scheduler-slots.test.ts +0 -53
  411. package/src/scheduler-slots.ts +0 -94
  412. package/src/scheduler-summary.test.ts +0 -47
  413. package/src/scheduler-summary.ts +0 -81
  414. package/src/scheduling.test.ts +0 -194
  415. package/src/scheduling.ts +0 -293
  416. package/src/schema-designer.test.ts +0 -121
  417. package/src/schema-designer.ts +0 -142
  418. package/src/schema.test.ts +0 -268
  419. package/src/schema.ts +0 -562
  420. package/src/smart-shim.ts +0 -107
  421. package/src/sources/aggregate.test.ts +0 -79
  422. package/src/sources/aggregate.ts +0 -102
  423. package/src/sources/auth-supabase.test.ts +0 -80
  424. package/src/sources/auth-supabase.ts +0 -87
  425. package/src/sources/dashboard.kpi.test.ts +0 -50
  426. package/src/sources/dashboard.test.ts +0 -61
  427. package/src/sources/dashboard.ts +0 -136
  428. package/src/sources/field-inference.test.ts +0 -60
  429. package/src/sources/field-inference.ts +0 -63
  430. package/src/sources/filters.test.ts +0 -58
  431. package/src/sources/filters.ts +0 -70
  432. package/src/sources/index.ts +0 -67
  433. package/src/sources/introspect-supabase.test.ts +0 -112
  434. package/src/sources/introspect-supabase.ts +0 -139
  435. package/src/sources/realtime-supabase.test.ts +0 -93
  436. package/src/sources/realtime-supabase.ts +0 -99
  437. package/src/sources/relation-lookup.test.ts +0 -99
  438. package/src/sources/relation-lookup.ts +0 -128
  439. package/src/sources/rest-adapters.test.ts +0 -95
  440. package/src/sources/rest-adapters.ts +0 -120
  441. package/src/sources/rest.test.ts +0 -104
  442. package/src/sources/rest.ts +0 -129
  443. package/src/sources/schema-from-columns.test.ts +0 -106
  444. package/src/sources/schema-from-columns.ts +0 -88
  445. package/src/sources/supabase.test.ts +0 -110
  446. package/src/sources/supabase.ts +0 -99
  447. package/src/sources/with-entity-rules.test.ts +0 -104
  448. package/src/sources/with-entity-rules.ts +0 -78
  449. package/src/sources/with-relation-labels.test.ts +0 -75
  450. package/src/sources/with-relation-labels.ts +0 -73
  451. package/src/staged-editing.ts +0 -0
  452. package/src/studio/bug-report.test.ts +0 -101
  453. package/src/studio/bug-report.ts +0 -165
  454. package/src/studio/cli.test.ts +0 -187
  455. package/src/studio/cli.ts +0 -117
  456. package/src/studio/copilot-core.test.ts +0 -45
  457. package/src/studio/csv.test.ts +0 -90
  458. package/src/studio/csv.ts +0 -165
  459. package/src/studio/db-connect-string.test.ts +0 -94
  460. package/src/studio/db-connect-string.ts +0 -128
  461. package/src/studio/deploy-cli.test.ts +0 -56
  462. package/src/studio/deploy-cli.ts +0 -100
  463. package/src/studio/emit-project.test.ts +0 -3324
  464. package/src/studio/emit-project.ts +0 -5377
  465. package/src/studio/emit-schema.test.ts +0 -111
  466. package/src/studio/emit-schema.ts +0 -1181
  467. package/src/studio/index.ts +0 -380
  468. package/src/studio/init-flow.test.ts +0 -514
  469. package/src/studio/init-flow.ts +0 -556
  470. package/src/studio/introspect-db.test.ts +0 -186
  471. package/src/studio/introspect-db.ts +0 -312
  472. package/src/studio/introspect-openapi.test.ts +0 -84
  473. package/src/studio/introspect-openapi.ts +0 -252
  474. package/src/studio/introspect-prisma.test.ts +0 -99
  475. package/src/studio/introspect-prisma.ts +0 -175
  476. package/src/studio/introspect.test.ts +0 -172
  477. package/src/studio/introspect.ts +0 -310
  478. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/_svelte_metadata.json +0 -1
  479. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/package.json +0 -3
  480. package/src/studio/pipeline.test.ts +0 -42
  481. package/src/studio/project-robust.test.ts +0 -157
  482. package/src/studio/project.test.ts +0 -929
  483. package/src/studio/project.ts +0 -2394
  484. package/src/studio/sample-data.test.ts +0 -58
  485. package/src/studio/sample-data.ts +0 -203
  486. package/src/studio/samples/ats.ts +0 -202
  487. package/src/studio/samples/clinic.ts +0 -179
  488. package/src/studio/samples/crm.ts +0 -291
  489. package/src/studio/samples/datasets.test.ts +0 -84
  490. package/src/studio/samples/datasets.ts +0 -340
  491. package/src/studio/samples/ecommerce.ts +0 -187
  492. package/src/studio/samples/events.ts +0 -201
  493. package/src/studio/samples/fleet.ts +0 -213
  494. package/src/studio/samples/gym.ts +0 -215
  495. package/src/studio/samples/hr.ts +0 -195
  496. package/src/studio/samples/index.ts +0 -55
  497. package/src/studio/samples/insurance.ts +0 -229
  498. package/src/studio/samples/inventory.ts +0 -213
  499. package/src/studio/samples/invoicing.ts +0 -162
  500. package/src/studio/samples/library.ts +0 -180
  501. package/src/studio/samples/live-data.test.ts +0 -99
  502. package/src/studio/samples/live-data.ts +0 -306
  503. package/src/studio/samples/projects.ts +0 -212
  504. package/src/studio/samples/realestate.ts +0 -196
  505. package/src/studio/samples/restaurant.ts +0 -189
  506. package/src/studio/samples/samples.test.ts +0 -304
  507. package/src/studio/samples/school.ts +0 -197
  508. package/src/studio/samples/seed-floor.test.ts +0 -25
  509. package/src/studio/samples/shared.ts +0 -237
  510. package/src/studio/samples/starter.ts +0 -251
  511. package/src/studio/samples/subscriptions.ts +0 -183
  512. package/src/studio/samples/support.ts +0 -216
  513. package/src/studio/scaffold-app.test.ts +0 -91
  514. package/src/studio/scaffold.test.ts +0 -192
  515. package/src/studio/scaffold.ts +0 -390
  516. package/src/studio/screen-suites.test.ts +0 -269
  517. package/src/studio/screen-suites.ts +0 -448
  518. package/src/studio/themes.ts +0 -62
  519. package/src/studio/ui-components-surface.test.ts +0 -185
  520. package/src/studio/ui-components.generated.ts +0 -7154
  521. package/src/studio/ui-components.ts +0 -742
  522. package/src/studio/verify.test.ts +0 -47
  523. package/src/studio/verify.ts +0 -79
  524. package/src/sveltekit/in-memory.test.ts +0 -104
  525. package/src/sveltekit/in-memory.ts +0 -129
  526. package/src/sveltekit/index.ts +0 -24
  527. package/src/sveltekit/query-plan.test.ts +0 -109
  528. package/src/sveltekit/query-plan.ts +0 -125
  529. package/src/sveltekit/sql-source.test.ts +0 -198
  530. package/src/sveltekit/sql-source.ts +0 -171
  531. package/src/sveltekit/sql.test.ts +0 -80
  532. package/src/sveltekit/sql.ts +0 -131
  533. package/src/sveltekit/transport-scope.test.ts +0 -125
  534. package/src/sveltekit/transport.test.ts +0 -201
  535. package/src/sveltekit/transport.ts +0 -373
  536. package/src/upgrade-prompt.test.ts +0 -71
  537. package/src/upgrade-prompt.ts +0 -162
  538. package/src/version.test.ts +0 -17
  539. package/src/watermark.test.ts +0 -97
  540. package/src/watermark.ts +0 -156
  541. /package/{src → dist}/SvAlertRuleEditor.svelte +0 -0
  542. /package/{src → dist}/SvAlertsManager.svelte +0 -0
  543. /package/{src → dist}/SvAlertsPanel.svelte +0 -0
  544. /package/{src → dist}/SvAuthGate.svelte +0 -0
  545. /package/{src → dist}/SvBoard.svelte +0 -0
  546. /package/{src → dist}/SvExportMenu.svelte +0 -0
  547. /package/{src → dist}/SvFileInput.svelte +0 -0
  548. /package/{src → dist}/SvGridAlerts.svelte +0 -0
  549. /package/{src → dist}/SvGridBoard.svelte +0 -0
  550. /package/{src → dist}/SvGridMasterDetail.svelte +0 -0
  551. /package/{src → dist}/SvGridScheduler.svelte +0 -0
  552. /package/{src → dist}/SvImportDialog.svelte +0 -0
  553. /package/{src → dist}/SvLookupInput.svelte +0 -0
  554. /package/{src → dist}/SvPivotDesigner.svelte +0 -0
  555. /package/{src → dist}/SvRecordDetail.svelte +0 -0
  556. /package/{src → dist}/SvSchedule.svelte +0 -0
  557. /package/{src → dist}/SvSchemaChart.svelte +0 -0
  558. /package/{src → dist}/SvSchemaDashboard.svelte +0 -0
  559. /package/{src → dist}/pdfmake-shims.d.ts +0 -0
  560. /package/{src → dist}/smart.export.d.ts +0 -0
  561. /package/{src → dist}/smart.export.js +0 -0
  562. /package/{src → dist}/studio/HANDLERS-DESIGN.md +0 -0
  563. /package/{src → dist/studio}/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/_svelte_metadata.json +0 -0
  564. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/_metadata.json +0 -0
  565. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-BOv1rBKp.js +0 -0
  566. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-BOv1rBKp.js.map +0 -0
  567. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-B9vgIdCd.js +0 -0
  568. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-B9vgIdCd.js.map +0 -0
  569. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-T1qbW_qD.js +0 -0
  570. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-T1qbW_qD.js.map +0 -0
  571. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-Bo11SfVK.js +0 -0
  572. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-Bo11SfVK.js.map +0 -0
  573. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-X7D4vfrZ.js +0 -0
  574. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-X7D4vfrZ.js.map +0 -0
  575. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-oyUje5i1.js +0 -0
  576. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-oyUje5i1.js.map +0 -0
  577. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-DeSQgSFm.js +0 -0
  578. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-DeSQgSFm.js.map +0 -0
  579. /package/{src → dist/studio}/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/package.json +0 -0
  580. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js +0 -0
  581. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js.map +0 -0
  582. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js +0 -0
  583. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js.map +0 -0
  584. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_attachments.js +0 -0
  585. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js +0 -0
  586. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js.map +0 -0
  587. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js +0 -0
  588. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js.map +0 -0
  589. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_events.js +0 -0
  590. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js +0 -0
  591. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js.map +0 -0
  592. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_client.js +0 -0
  593. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js +0 -0
  594. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js.map +0 -0
  595. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js +0 -0
  596. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js.map +0 -0
  597. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js +0 -0
  598. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js.map +0 -0
  599. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js +0 -0
  600. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js.map +0 -0
  601. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_server.js +0 -0
  602. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js +0 -0
  603. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js.map +0 -0
  604. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js +0 -0
  605. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js.map +0 -0
  606. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js +0 -0
  607. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js.map +0 -0
  608. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js +0 -0
  609. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js.map +0 -0
  610. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_server.js +0 -0
  611. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js +0 -0
  612. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js.map +0 -0
  613. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js +0 -0
  614. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js.map +0 -0
  615. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-BbWyXNk1.js +0 -0
  616. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-BbWyXNk1.js.map +0 -0
  617. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DI_fC7vt.js +0 -0
  618. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DI_fC7vt.js.map +0 -0
  619. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-Dyr3lQv9.js +0 -0
  620. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-Dyr3lQv9.js.map +0 -0
  621. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-_9FHH-LF.js +0 -0
  622. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-_9FHH-LF.js.map +0 -0
  623. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-CUbSPnyP.js +0 -0
  624. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-CUbSPnyP.js.map +0 -0
@@ -66,6 +66,15 @@ function hiddenFor(field, surface) {
66
66
  return false;
67
67
  }
68
68
  /**
69
+ * Whether a field is hidden from one surface. Public because the `hidden`
70
+ * union (`true` means both surfaces, an object names them) is exactly the kind
71
+ * of logic that drifts when every caller re-derives it - the form builder's
72
+ * "Hidden from this form" tray is one such caller.
73
+ */
74
+ function isFieldHidden(field, surface) {
75
+ return hiddenFor(field, surface);
76
+ }
77
+ /**
69
78
  * Derive grid columns from a schema. Read-only fields become non-editable
70
79
  * columns; `enum` carries its options through as `editorOptions`. The
71
80
  * per-field `column` escape hatch is merged last, so any explicit grid prop
@@ -2552,6 +2561,13 @@ var GENERATED_UI_SURFACE = {
2552
2561
  "description": "Marks the control invalid (`aria-invalid` + error styling).",
2553
2562
  "group": "behavior"
2554
2563
  },
2564
+ {
2565
+ "key": "block",
2566
+ "label": "Block",
2567
+ "type": "boolean",
2568
+ "description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
2569
+ "group": "appearance"
2570
+ },
2555
2571
  {
2556
2572
  "key": "error",
2557
2573
  "label": "Error",
@@ -2674,6 +2690,13 @@ var GENERATED_UI_SURFACE = {
2674
2690
  "description": "Marks the control invalid (`aria-invalid` + error styling).",
2675
2691
  "group": "behavior"
2676
2692
  },
2693
+ {
2694
+ "key": "block",
2695
+ "label": "Block",
2696
+ "type": "boolean",
2697
+ "description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
2698
+ "group": "appearance"
2699
+ },
2677
2700
  {
2678
2701
  "key": "error",
2679
2702
  "label": "Error",
@@ -2809,6 +2832,14 @@ var GENERATED_UI_SURFACE = {
2809
2832
  "description": "Marks the control invalid (`aria-invalid` + error styling).",
2810
2833
  "group": "behavior"
2811
2834
  },
2835
+ {
2836
+ "key": "block",
2837
+ "label": "Block",
2838
+ "type": "boolean",
2839
+ "default": false,
2840
+ "description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
2841
+ "group": "appearance"
2842
+ },
2812
2843
  {
2813
2844
  "key": "error",
2814
2845
  "label": "Error",
@@ -3039,6 +3070,13 @@ var GENERATED_UI_SURFACE = {
3039
3070
  "description": "Marks the control invalid (`aria-invalid` + error styling).",
3040
3071
  "group": "behavior"
3041
3072
  },
3073
+ {
3074
+ "key": "block",
3075
+ "label": "Block",
3076
+ "type": "boolean",
3077
+ "description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
3078
+ "group": "appearance"
3079
+ },
3042
3080
  {
3043
3081
  "key": "error",
3044
3082
  "label": "Error",
@@ -3214,6 +3252,14 @@ var GENERATED_UI_SURFACE = {
3214
3252
  "description": "Marks the control invalid (`aria-invalid` + error styling).",
3215
3253
  "group": "behavior"
3216
3254
  },
3255
+ {
3256
+ "key": "block",
3257
+ "label": "Block",
3258
+ "type": "boolean",
3259
+ "default": false,
3260
+ "description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
3261
+ "group": "appearance"
3262
+ },
3217
3263
  {
3218
3264
  "key": "error",
3219
3265
  "label": "Error",
@@ -3438,6 +3484,14 @@ var GENERATED_UI_SURFACE = {
3438
3484
  "description": "Marks the control invalid (`aria-invalid` + error styling).",
3439
3485
  "group": "behavior"
3440
3486
  },
3487
+ {
3488
+ "key": "block",
3489
+ "label": "Block",
3490
+ "type": "boolean",
3491
+ "default": false,
3492
+ "description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
3493
+ "group": "appearance"
3494
+ },
3441
3495
  {
3442
3496
  "key": "error",
3443
3497
  "label": "Error",
@@ -3612,6 +3666,14 @@ var GENERATED_UI_SURFACE = {
3612
3666
  "description": "Marks the control invalid (`aria-invalid` + error styling).",
3613
3667
  "group": "behavior"
3614
3668
  },
3669
+ {
3670
+ "key": "block",
3671
+ "label": "Block",
3672
+ "type": "boolean",
3673
+ "default": false,
3674
+ "description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
3675
+ "group": "appearance"
3676
+ },
3615
3677
  {
3616
3678
  "key": "error",
3617
3679
  "label": "Error",
@@ -3763,6 +3825,13 @@ var GENERATED_UI_SURFACE = {
3763
3825
  "description": "Marks the control invalid (`aria-invalid` + error styling).",
3764
3826
  "group": "behavior"
3765
3827
  },
3828
+ {
3829
+ "key": "block",
3830
+ "label": "Block",
3831
+ "type": "boolean",
3832
+ "description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
3833
+ "group": "appearance"
3834
+ },
3766
3835
  {
3767
3836
  "key": "error",
3768
3837
  "label": "Error",
@@ -3898,6 +3967,13 @@ var GENERATED_UI_SURFACE = {
3898
3967
  "description": "Marks the control invalid (`aria-invalid` + error styling).",
3899
3968
  "group": "behavior"
3900
3969
  },
3970
+ {
3971
+ "key": "block",
3972
+ "label": "Block",
3973
+ "type": "boolean",
3974
+ "description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
3975
+ "group": "appearance"
3976
+ },
3901
3977
  {
3902
3978
  "key": "error",
3903
3979
  "label": "Error",
@@ -4049,6 +4125,14 @@ var GENERATED_UI_SURFACE = {
4049
4125
  "description": "Marks the control invalid (`aria-invalid` + error styling).",
4050
4126
  "group": "behavior"
4051
4127
  },
4128
+ {
4129
+ "key": "block",
4130
+ "label": "Block",
4131
+ "type": "boolean",
4132
+ "default": false,
4133
+ "description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
4134
+ "group": "appearance"
4135
+ },
4052
4136
  {
4053
4137
  "key": "error",
4054
4138
  "label": "Error",
@@ -4770,6 +4854,14 @@ var GENERATED_UI_SURFACE = {
4770
4854
  "description": "Marks the control invalid (`aria-invalid` + error styling).",
4771
4855
  "group": "behavior"
4772
4856
  },
4857
+ {
4858
+ "key": "block",
4859
+ "label": "Block",
4860
+ "type": "boolean",
4861
+ "default": false,
4862
+ "description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
4863
+ "group": "appearance"
4864
+ },
4773
4865
  {
4774
4866
  "key": "error",
4775
4867
  "label": "Error",
@@ -4944,6 +5036,14 @@ var GENERATED_UI_SURFACE = {
4944
5036
  "description": "Marks the control invalid (`aria-invalid` + error styling).",
4945
5037
  "group": "behavior"
4946
5038
  },
5039
+ {
5040
+ "key": "block",
5041
+ "label": "Block",
5042
+ "type": "boolean",
5043
+ "default": false,
5044
+ "description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
5045
+ "group": "appearance"
5046
+ },
4947
5047
  {
4948
5048
  "key": "error",
4949
5049
  "label": "Error",
@@ -5103,6 +5203,14 @@ var GENERATED_UI_SURFACE = {
5103
5203
  "description": "Marks the control invalid (`aria-invalid` + error styling).",
5104
5204
  "group": "behavior"
5105
5205
  },
5206
+ {
5207
+ "key": "block",
5208
+ "label": "Block",
5209
+ "type": "boolean",
5210
+ "default": false,
5211
+ "description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
5212
+ "group": "appearance"
5213
+ },
5106
5214
  {
5107
5215
  "key": "error",
5108
5216
  "label": "Error",
@@ -5252,6 +5360,14 @@ var GENERATED_UI_SURFACE = {
5252
5360
  "description": "Marks the control invalid (`aria-invalid` + error styling).",
5253
5361
  "group": "behavior"
5254
5362
  },
5363
+ {
5364
+ "key": "block",
5365
+ "label": "Block",
5366
+ "type": "boolean",
5367
+ "default": false,
5368
+ "description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
5369
+ "group": "appearance"
5370
+ },
5255
5371
  {
5256
5372
  "key": "error",
5257
5373
  "label": "Error",
@@ -5434,6 +5550,13 @@ var GENERATED_UI_SURFACE = {
5434
5550
  "description": "Marks the control invalid (`aria-invalid` + error styling).",
5435
5551
  "group": "behavior"
5436
5552
  },
5553
+ {
5554
+ "key": "block",
5555
+ "label": "Block",
5556
+ "type": "boolean",
5557
+ "description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
5558
+ "group": "appearance"
5559
+ },
5437
5560
  {
5438
5561
  "key": "error",
5439
5562
  "label": "Error",
@@ -5568,6 +5691,13 @@ var GENERATED_UI_SURFACE = {
5568
5691
  "description": "Marks the control invalid (`aria-invalid` + error styling).",
5569
5692
  "group": "behavior"
5570
5693
  },
5694
+ {
5695
+ "key": "block",
5696
+ "label": "Block",
5697
+ "type": "boolean",
5698
+ "description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
5699
+ "group": "appearance"
5700
+ },
5571
5701
  {
5572
5702
  "key": "error",
5573
5703
  "label": "Error",
@@ -5719,6 +5849,14 @@ var GENERATED_UI_SURFACE = {
5719
5849
  "description": "Marks the control invalid (`aria-invalid` + error styling).",
5720
5850
  "group": "behavior"
5721
5851
  },
5852
+ {
5853
+ "key": "block",
5854
+ "label": "Block",
5855
+ "type": "boolean",
5856
+ "default": false,
5857
+ "description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
5858
+ "group": "appearance"
5859
+ },
5722
5860
  {
5723
5861
  "key": "error",
5724
5862
  "label": "Error",
@@ -5901,6 +6039,13 @@ var GENERATED_UI_SURFACE = {
5901
6039
  "description": "Marks the control invalid (`aria-invalid` + error styling).",
5902
6040
  "group": "behavior"
5903
6041
  },
6042
+ {
6043
+ "key": "block",
6044
+ "label": "Block",
6045
+ "type": "boolean",
6046
+ "description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
6047
+ "group": "appearance"
6048
+ },
5904
6049
  {
5905
6050
  "key": "error",
5906
6051
  "label": "Error",
@@ -6082,6 +6227,13 @@ var GENERATED_UI_SURFACE = {
6082
6227
  "description": "Marks the control invalid (`aria-invalid` + error styling).",
6083
6228
  "group": "behavior"
6084
6229
  },
6230
+ {
6231
+ "key": "block",
6232
+ "label": "Block",
6233
+ "type": "boolean",
6234
+ "description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
6235
+ "group": "appearance"
6236
+ },
6085
6237
  {
6086
6238
  "key": "error",
6087
6239
  "label": "Error",
@@ -6269,6 +6421,13 @@ var GENERATED_UI_SURFACE = {
6269
6421
  "description": "Marks the control invalid (`aria-invalid` + error styling).",
6270
6422
  "group": "behavior"
6271
6423
  },
6424
+ {
6425
+ "key": "block",
6426
+ "label": "Block",
6427
+ "type": "boolean",
6428
+ "description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
6429
+ "group": "appearance"
6430
+ },
6272
6431
  {
6273
6432
  "key": "error",
6274
6433
  "label": "Error",
@@ -6830,6 +6989,14 @@ var GENERATED_UI_SURFACE = {
6830
6989
  "description": "Marks the control invalid (`aria-invalid` + error styling).",
6831
6990
  "group": "behavior"
6832
6991
  },
6992
+ {
6993
+ "key": "block",
6994
+ "label": "Block",
6995
+ "type": "boolean",
6996
+ "default": false,
6997
+ "description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
6998
+ "group": "appearance"
6999
+ },
6833
7000
  {
6834
7001
  "key": "error",
6835
7002
  "label": "Error",
@@ -7504,6 +7671,14 @@ var GENERATED_UI_SURFACE = {
7504
7671
  "description": "Marks the control invalid (`aria-invalid` + error styling).",
7505
7672
  "group": "behavior"
7506
7673
  },
7674
+ {
7675
+ "key": "block",
7676
+ "label": "Block",
7677
+ "type": "boolean",
7678
+ "default": false,
7679
+ "description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
7680
+ "group": "appearance"
7681
+ },
7507
7682
  {
7508
7683
  "key": "error",
7509
7684
  "label": "Error",
@@ -7905,6 +8080,13 @@ var GENERATED_UI_SURFACE = {
7905
8080
  "description": "Marks the control invalid (`aria-invalid` + error styling).",
7906
8081
  "group": "behavior"
7907
8082
  },
8083
+ {
8084
+ "key": "block",
8085
+ "label": "Block",
8086
+ "type": "boolean",
8087
+ "description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
8088
+ "group": "appearance"
8089
+ },
7908
8090
  {
7909
8091
  "key": "error",
7910
8092
  "label": "Error",
@@ -8201,6 +8383,13 @@ var GENERATED_UI_SURFACE = {
8201
8383
  "description": "Marks the control invalid (`aria-invalid` + error styling).",
8202
8384
  "group": "behavior"
8203
8385
  },
8386
+ {
8387
+ "key": "block",
8388
+ "label": "Block",
8389
+ "type": "boolean",
8390
+ "description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
8391
+ "group": "appearance"
8392
+ },
8204
8393
  {
8205
8394
  "key": "error",
8206
8395
  "label": "Error",
@@ -11064,6 +11253,18 @@ function gridApiSettableProps() {
11064
11253
  }
11065
11254
  //#endregion
11066
11255
  //#region src/studio/project.ts
11256
+ /**
11257
+ * Studio project model - the declarative spine the visual designer edits and the
11258
+ * codegen emits. A project is a multi-entity app: `entities` (the data model) +
11259
+ * `screens` (one per entity by default), where a screen is an ordered list of
11260
+ * data-bound `blocks` (grid, form, chart, dashboard, KPI, master-detail, lookup).
11261
+ *
11262
+ * Pure + node-safe (lives in the `./studio` subtree - `.js` imports, no Svelte,
11263
+ * no `sources/`), mirroring the immutable-ops style of `schema-designer.ts`:
11264
+ * every mutation returns a NEW project so Svelte reactivity + undo stay simple.
11265
+ * Block-config unions are defined here (not imported from `sources/`) to keep the
11266
+ * module resolvable under node16.
11267
+ */
11067
11268
  /** Block kinds allowed inside a Tabs / Accordion container: the controller-free,
11068
11269
  * `allRows`-driven display blocks (no grid / form / master-detail, which need the
11069
11270
  * screen controller). `component` covers any UI-kit component added by key. */
@@ -11652,13 +11853,18 @@ function setJob(project, id, job) {
11652
11853
  jobs: next.length ? next : void 0
11653
11854
  };
11654
11855
  }
11655
- /** The designer's block palette, in menu order. (Editing is a Grid property, so
11656
- * there's no standalone form block.) */
11856
+ /** The designer's block palette, in menu order. A grid owns edit-in-popup and a
11857
+ * record panel edits the selected row, so the standalone Form block is the one
11858
+ * that creates: a form on its own page, with no grid behind it. */
11657
11859
  var blockPalette = [
11658
11860
  {
11659
11861
  kind: "grid",
11660
11862
  label: "Grid"
11661
11863
  },
11864
+ {
11865
+ kind: "form",
11866
+ label: "Form"
11867
+ },
11662
11868
  {
11663
11869
  kind: "chart",
11664
11870
  label: "Chart",
@@ -11779,7 +11985,8 @@ function defaultBlockConfig(kind, entity) {
11779
11985
  };
11780
11986
  case "form": return {
11781
11987
  kind,
11782
- presentation: "modal"
11988
+ presentation: "inline",
11989
+ afterSave: "reset"
11783
11990
  };
11784
11991
  case "chart": {
11785
11992
  const measure = pickMeasure(entity);
@@ -12398,6 +12605,403 @@ function removeEntity(project, name) {
12398
12605
  screens: project.screens.filter((s) => s.entity !== name)
12399
12606
  };
12400
12607
  }
12608
+ /**
12609
+ * The fields a form actually renders, in schema order. Arranging anything else
12610
+ * would be a lie: a field hidden from the form cannot be put in a section and
12611
+ * then appear there.
12612
+ */
12613
+ function formFieldNames(schema) {
12614
+ return schemaToFormFields(schema).map((f) => f.field);
12615
+ }
12616
+ /**
12617
+ * The sections as a builder should show them, plus the fields no section claims.
12618
+ *
12619
+ * Sections name their fields by string, so a rename, a delete, or hiding a field
12620
+ * from the form can leave a name behind. Those are dropped here rather than
12621
+ * drawn as ghosts, and a field in no section comes back in `unassigned` - which
12622
+ * is where the form itself puts it too, in a trailing untitled group.
12623
+ */
12624
+ function formPlan(schema, override) {
12625
+ const inForm = formFieldNames(schema);
12626
+ const known = new Set(inForm);
12627
+ const source = override ?? schema.form?.sections ?? [];
12628
+ const seen = /* @__PURE__ */ new Set();
12629
+ return {
12630
+ sections: source.map((section) => {
12631
+ const fields = section.fields.filter((f) => {
12632
+ if (!known.has(f) || seen.has(f)) return false;
12633
+ seen.add(f);
12634
+ return true;
12635
+ });
12636
+ return {
12637
+ ...section,
12638
+ fields
12639
+ };
12640
+ }),
12641
+ unassigned: inForm.filter((f) => !seen.has(f))
12642
+ };
12643
+ }
12644
+ /** Replace an entity's form layout. `undefined` drops it back to the default. */
12645
+ function setEntityForm(project, entityName, form) {
12646
+ return mapEntity(project, entityName, (schema) => {
12647
+ const next = { ...schema };
12648
+ if (form && (form.columns !== void 0 || form.sections?.length)) next.form = form;
12649
+ else delete next.form;
12650
+ return next;
12651
+ });
12652
+ }
12653
+ /** Set the form's column count, or clear it back to the default. */
12654
+ function setFormColumns(project, entityName, columns) {
12655
+ const schema = entityOf(project, entityName);
12656
+ if (!schema) return project;
12657
+ return setEntityForm(project, entityName, {
12658
+ ...schema.form,
12659
+ columns
12660
+ });
12661
+ }
12662
+ /** Append a section. New sections start empty - fields move in afterwards. */
12663
+ function addFormSection(project, entityName, title = "Section") {
12664
+ const schema = entityOf(project, entityName);
12665
+ if (!schema) return project;
12666
+ return setEntityForm(project, entityName, {
12667
+ ...schema.form,
12668
+ sections: [...schema.form?.sections ?? [], {
12669
+ title,
12670
+ fields: []
12671
+ }]
12672
+ });
12673
+ }
12674
+ /** Patch one section. An out-of-range index is a no-op rather than an error. */
12675
+ function updateFormSection(project, entityName, index, patch) {
12676
+ const schema = entityOf(project, entityName);
12677
+ const sections = schema?.form?.sections;
12678
+ if (!sections?.[index]) return project;
12679
+ const next = sections.map((s, i) => {
12680
+ if (i !== index) return s;
12681
+ const merged = {
12682
+ ...s,
12683
+ ...patch
12684
+ };
12685
+ if (!merged.title) delete merged.title;
12686
+ if (!merged.description) delete merged.description;
12687
+ if (!merged.visibleWhen) delete merged.visibleWhen;
12688
+ if (!merged.columns) delete merged.columns;
12689
+ if (!merged.collapsible) {
12690
+ delete merged.collapsible;
12691
+ delete merged.collapsed;
12692
+ }
12693
+ if (!merged.collapsed) delete merged.collapsed;
12694
+ return merged;
12695
+ });
12696
+ return setEntityForm(project, entityName, {
12697
+ ...schema.form,
12698
+ sections: next
12699
+ });
12700
+ }
12701
+ /**
12702
+ * Remove a section. Its fields stay in the form - they fall back to the trailing
12703
+ * untitled group, so deleting a heading never deletes the questions under it.
12704
+ */
12705
+ function removeFormSection(project, entityName, index) {
12706
+ const schema = entityOf(project, entityName);
12707
+ const sections = schema?.form?.sections;
12708
+ if (!sections?.[index]) return project;
12709
+ return setEntityForm(project, entityName, {
12710
+ ...schema.form,
12711
+ sections: sections.filter((_, i) => i !== index)
12712
+ });
12713
+ }
12714
+ /** Reorder the sections themselves. */
12715
+ function moveFormSection(project, entityName, from, to) {
12716
+ const schema = entityOf(project, entityName);
12717
+ const sections = schema?.form?.sections;
12718
+ if (!sections?.[from] || to < 0 || to >= sections.length || from === to) return project;
12719
+ const next = [...sections];
12720
+ next.splice(to, 0, next.splice(from, 1)[0]);
12721
+ return setEntityForm(project, entityName, {
12722
+ ...schema.form,
12723
+ sections: next
12724
+ });
12725
+ }
12726
+ /**
12727
+ * Move a field into a section at a position, or out of every section when
12728
+ * `toSection` is null. The field is pulled out of wherever it was first, so it
12729
+ * can never end up in two sections - which would render the control twice.
12730
+ */
12731
+ function moveFormField(project, entityName, field, toSection, toIndex = Number.MAX_SAFE_INTEGER) {
12732
+ const schema = entityOf(project, entityName);
12733
+ if (!schema || !formFieldNames(schema).includes(field)) return project;
12734
+ const sections = schema.form?.sections ?? [];
12735
+ if (toSection !== null && !sections[toSection]) return project;
12736
+ const stripped = sections.map((s) => ({
12737
+ ...s,
12738
+ fields: s.fields.filter((f) => f !== field)
12739
+ }));
12740
+ if (toSection === null) return setEntityForm(project, entityName, {
12741
+ ...schema.form,
12742
+ sections: stripped
12743
+ });
12744
+ const target = stripped[toSection];
12745
+ const at = Math.max(0, Math.min(toIndex, target.fields.length));
12746
+ const fields = [...target.fields];
12747
+ fields.splice(at, 0, field);
12748
+ return setEntityForm(project, entityName, {
12749
+ ...schema.form,
12750
+ sections: stripped.map((s, i) => i === toSection ? {
12751
+ ...s,
12752
+ fields
12753
+ } : s)
12754
+ });
12755
+ }
12756
+ /**
12757
+ * Move several fields at once, as one contiguous block in the order given.
12758
+ *
12759
+ * Not a loop of {@link moveFormField}: each single move both shifts the target
12760
+ * indices and re-resolves the plan, so a loop lands the group scattered or
12761
+ * reversed. Strip every named field first, then splice the whole group at the
12762
+ * index computed against the stripped target.
12763
+ *
12764
+ * Unknown and hidden-from-form names are dropped, duplicates keep their first
12765
+ * position, and an input that resolves to nothing returns the project
12766
+ * unchanged (same reference), so an undo stack never records a no-op.
12767
+ */
12768
+ function moveFormFields(project, entityName, fields, toSection, toIndex = Number.MAX_SAFE_INTEGER) {
12769
+ const schema = entityOf(project, entityName);
12770
+ if (!schema) return project;
12771
+ const movable = new Set(formFieldNames(schema));
12772
+ const group = [];
12773
+ for (const f of fields) if (movable.has(f) && !group.includes(f)) group.push(f);
12774
+ if (!group.length) return project;
12775
+ const sections = schema.form?.sections ?? [];
12776
+ if (toSection !== null && !sections[toSection]) return project;
12777
+ const moving = new Set(group);
12778
+ const stripped = sections.map((s) => ({
12779
+ ...s,
12780
+ fields: s.fields.filter((f) => !moving.has(f))
12781
+ }));
12782
+ if (toSection === null) return setEntityForm(project, entityName, {
12783
+ ...schema.form,
12784
+ sections: stripped
12785
+ });
12786
+ const target = stripped[toSection];
12787
+ const at = Math.max(0, Math.min(toIndex, target.fields.length));
12788
+ const next = [...target.fields];
12789
+ next.splice(at, 0, ...group);
12790
+ return setEntityForm(project, entityName, {
12791
+ ...schema.form,
12792
+ sections: stripped.map((s, i) => i === toSection ? {
12793
+ ...s,
12794
+ fields: next
12795
+ } : s)
12796
+ });
12797
+ }
12798
+ /**
12799
+ * Set (or clear) a field's value-driven conditions. Each is a `PredicateExpr`,
12800
+ * so it stays data all the way into the generated app - see `EntityField.when`.
12801
+ */
12802
+ function setFieldConditions(project, entityName, field, when) {
12803
+ return mapEntity(project, entityName, (schema) => ({
12804
+ ...schema,
12805
+ fields: schema.fields.map((f) => {
12806
+ if (f.field !== field) return f;
12807
+ const next = { ...f };
12808
+ if (when?.visible || when?.disabled || when?.required) next.when = {
12809
+ ...when.visible && { visible: when.visible },
12810
+ ...when.disabled && { disabled: when.disabled },
12811
+ ...when.required && { required: when.required }
12812
+ };
12813
+ else delete next.when;
12814
+ return next;
12815
+ })
12816
+ }));
12817
+ }
12818
+ /**
12819
+ * Patch one field of one entity. The form builder edits an entity that is not
12820
+ * necessarily the selected screen's, so it needs the project-level door rather
12821
+ * than the schema-level `updateField`.
12822
+ *
12823
+ * Deliberately shallow: `type` changes belong to the schema designer, which also
12824
+ * has to clean up `options` / `relation` when the type moves.
12825
+ */
12826
+ function updateEntityField(project, entityName, field, patch) {
12827
+ return mapEntity(project, entityName, (schema) => ({
12828
+ ...schema,
12829
+ fields: schema.fields.map((f) => f.field === field ? {
12830
+ ...f,
12831
+ ...patch
12832
+ } : f)
12833
+ }));
12834
+ }
12835
+ /**
12836
+ * Patch a field's form presentation (`EntityField.input`). Merges rather than
12837
+ * replaces, and a key set to `undefined` or `''` is removed - so clearing a
12838
+ * placeholder leaves no empty string behind, and emptying the last key drops
12839
+ * `input` itself rather than persisting `input: {}`.
12840
+ */
12841
+ function setFieldInput(project, entityName, field, patch) {
12842
+ return mapEntity(project, entityName, (schema) => ({
12843
+ ...schema,
12844
+ fields: schema.fields.map((f) => {
12845
+ if (f.field !== field) return f;
12846
+ const input = { ...f.input };
12847
+ for (const [key, value] of Object.entries(patch)) if (value === void 0 || value === "") delete input[key];
12848
+ else input[key] = value;
12849
+ const next = { ...f };
12850
+ if (Object.keys(input).length) next.input = input;
12851
+ else delete next.input;
12852
+ return next;
12853
+ })
12854
+ }));
12855
+ }
12856
+ /**
12857
+ * Show or hide a field on one surface, keeping the other surface's answer.
12858
+ * `hidden: true` means both, so it is expanded before one half is changed -
12859
+ * otherwise hiding a field from the form would silently un-hide its column.
12860
+ */
12861
+ function setFieldHidden(project, entityName, field, surface, hidden) {
12862
+ return mapEntity(project, entityName, (schema) => ({
12863
+ ...schema,
12864
+ fields: schema.fields.map((f) => {
12865
+ if (f.field !== field) return f;
12866
+ const merged = {
12867
+ ...f.hidden === true ? {
12868
+ grid: true,
12869
+ form: true
12870
+ } : { ...f.hidden || {} },
12871
+ [surface]: hidden
12872
+ };
12873
+ const next = { ...f };
12874
+ if (merged.grid && merged.form) next.hidden = true;
12875
+ else if (merged.grid || merged.form) next.hidden = {
12876
+ ...merged.grid && { grid: true },
12877
+ ...merged.form && { form: true }
12878
+ };
12879
+ else delete next.hidden;
12880
+ return next;
12881
+ })
12882
+ }));
12883
+ }
12884
+ /**
12885
+ * The form controls worth offering for a field type. A form builder that listed
12886
+ * every editor for every type would be a wall of mostly-wrong choices - a date
12887
+ * field has no business rendering as a colour picker. The first entry is what
12888
+ * the field renders as when `input.editorType` is unset.
12889
+ */
12890
+ function formControlsFor(type) {
12891
+ switch (type) {
12892
+ case "number": return [
12893
+ "number",
12894
+ "slider",
12895
+ "rating",
12896
+ "text"
12897
+ ];
12898
+ case "boolean": return ["checkbox"];
12899
+ case "date":
12900
+ case "dateString": return ["date", "date-native"];
12901
+ case "datetime": return [
12902
+ "datetime",
12903
+ "datetime-native",
12904
+ "time"
12905
+ ];
12906
+ case "enum": return [
12907
+ "select",
12908
+ "rich-select",
12909
+ "list",
12910
+ "chips",
12911
+ "autocomplete"
12912
+ ];
12913
+ case "relation": return ["select", "autocomplete"];
12914
+ case "json": return ["textarea", "text"];
12915
+ default: return [
12916
+ "text",
12917
+ "textarea",
12918
+ "password",
12919
+ "phone",
12920
+ "country",
12921
+ "mask",
12922
+ "color",
12923
+ "autocomplete",
12924
+ "chips"
12925
+ ];
12926
+ }
12927
+ }
12928
+ function formControlSettings(control, type) {
12929
+ const kind = control ?? formControlsFor(type)[0];
12930
+ if (kind === "mask") return ["mask"];
12931
+ if (kind === "slider" || kind === "rating") return ["range", "step"];
12932
+ if (kind === "number" || type === "number" && kind !== "text") return [
12933
+ "range",
12934
+ "step",
12935
+ "precision",
12936
+ "affix"
12937
+ ];
12938
+ return [];
12939
+ }
12940
+ /**
12941
+ * A first pass at sectioning an unarranged form, by what the field names say
12942
+ * they are. Studio's promise is a working app in a few clicks, and an entity of
12943
+ * fifteen fields in one flat list is not that.
12944
+ *
12945
+ * A guess, offered once: it returns sections for a builder to drop in and then
12946
+ * edit, and it never invents a group for a form small enough not to need one.
12947
+ */
12948
+ var SECTION_HINTS = [
12949
+ {
12950
+ title: "Contact",
12951
+ match: /^(email|phone|mobile|fax|website|url|contact)/i
12952
+ },
12953
+ {
12954
+ title: "Address",
12955
+ match: /(address|street|city|state|province|zip|postcode|postal|country|region)/i
12956
+ },
12957
+ {
12958
+ title: "Money",
12959
+ match: /(amount|price|cost|total|revenue|mrr|arr|salary|budget|value|balance|fee|tax|discount)/i
12960
+ },
12961
+ {
12962
+ title: "Dates",
12963
+ match: /(date|_at$|At$|deadline|due|expires|starts|ends)/i
12964
+ },
12965
+ {
12966
+ title: "Notes",
12967
+ match: /(note|notes|comment|comments|description|summary|remark)/i
12968
+ }
12969
+ ];
12970
+ function suggestFormSections(schema) {
12971
+ const names = formFieldNames(schema);
12972
+ if (names.length < 6) return [];
12973
+ const buckets = /* @__PURE__ */ new Map();
12974
+ const rest = [];
12975
+ for (const name of names) {
12976
+ const hint = SECTION_HINTS.find((h) => h.match.test(name));
12977
+ if (!hint) {
12978
+ rest.push(name);
12979
+ continue;
12980
+ }
12981
+ const bucket = buckets.get(hint.title);
12982
+ if (bucket) bucket.push(name);
12983
+ else buckets.set(hint.title, [name]);
12984
+ }
12985
+ const sections = [];
12986
+ for (const [title, fields] of buckets) if (fields.length > 1) sections.push({
12987
+ title,
12988
+ fields
12989
+ });
12990
+ else rest.push(...fields);
12991
+ if (!sections.length) return [];
12992
+ return rest.length ? [{
12993
+ title: "Details",
12994
+ fields: rest
12995
+ }, ...sections] : sections;
12996
+ }
12997
+ /** Apply a change to one entity's schema, leaving the project alone if it is unknown. */
12998
+ function mapEntity(project, entityName, fn) {
12999
+ if (!entityOf(project, entityName)) return project;
13000
+ return {
13001
+ ...project,
13002
+ entities: project.entities.map((e) => e.name === entityName ? fn(e) : e)
13003
+ };
13004
+ }
12401
13005
  /** Append a screen, making its id AND route unique against the existing set. */
12402
13006
  function appendScreen(project, base, keyBase) {
12403
13007
  const ids = new Set(project.screens.map((s) => s.id));
@@ -13550,7 +14154,13 @@ function validateProject(project) {
13550
14154
  block: b.id
13551
14155
  });
13552
14156
  const c = b.config;
13553
- if (c.kind === "master-detail") {
14157
+ if (c.kind === "form") {
14158
+ if (!s.entity) issues.push(at("A Form block needs a screen bound to an entity.", "error"));
14159
+ if (c.afterSave === "navigate") {
14160
+ if (!c.navigateTo) issues.push(at("The form is set to open a screen after saving, but no screen is chosen."));
14161
+ else if (!project.screens.some((x) => x.id === c.navigateTo)) issues.push(at(`The form opens a missing screen "${c.navigateTo}" after saving.`, "error"));
14162
+ }
14163
+ } else if (c.kind === "master-detail") {
13554
14164
  if (!c.childEntity || !c.foreignKey) issues.push(at("Master/detail needs a child entity + foreign key."));
13555
14165
  else if (!entityOf(project, c.childEntity)) issues.push(at(`Master/detail points at a missing child entity "${c.childEntity}".`));
13556
14166
  } else if (c.kind === "tree") {
@@ -15130,7 +15740,7 @@ function hasFieldConditions(schema) {
15130
15740
  *
15131
15741
  * `version.test.ts` asserts this matches `package.json`, so the two cannot drift.
15132
15742
  */
15133
- var SVGRID_VERSION = "2.5.3";
15743
+ var SVGRID_VERSION = "2.6.0";
15134
15744
  //#endregion
15135
15745
  //#region src/studio/emit-project.ts
15136
15746
  var has = (blocks, kind) => blocks.some((b) => b.config.kind === kind);
@@ -15528,9 +16138,35 @@ ${panels}
15528
16138
  }
15529
16139
  case "lookup": return ` <div ${span}${cls}><!-- lookup (${cfg.field}): shown in the edit form --></div>`;
15530
16140
  case "component": return componentBlockMarkup(block, cfg, ctx.handleNames?.get(block.id), rowsExpr);
16141
+ case "form": return createFormMarkup(entity, schemaVar, block, cfg);
15531
16142
  default: return "";
15532
16143
  }
15533
16144
  }
16145
+ /**
16146
+ * A standalone create form: blank, always on the page, submits a new row.
16147
+ *
16148
+ * Keyed on `formSaves` so a successful create remounts the panel with empty
16149
+ * values - the panel seeds itself from `row` once, so without the key the
16150
+ * previous entry would still be sitting in the fields.
16151
+ */
16152
+ function createFormMarkup(entity, schemaVar, block, cfg) {
16153
+ const span = wrapperStyle(block);
16154
+ const cls = wrapperClass(block);
16155
+ const attrs = [
16156
+ `schema={${schemaVar}}`,
16157
+ "row={null}",
16158
+ "presentation=\"inline\""
16159
+ ];
16160
+ attrs.push(`title={${jsStr(cfg.title ?? `New ${entity.label ?? entity.name}`)}}`);
16161
+ if (cfg.submitLabel) attrs.push(`submitLabel={${jsStr(cfg.submitLabel)}}`);
16162
+ if (cfg.width && cfg.width !== "md") attrs.push(`formSize=${jsStr(cfg.width)}`);
16163
+ return ` <div ${span}${cls}>${cfg.afterSave === "navigate" ? "" : `
16164
+ {#if formSaves}<p class="st-form__done" role="status">Saved. Add another below.</p>{/if}`}
16165
+ {#key formSaves}
16166
+ <SvGridEditPanel ${attrs.join(" ")} onSubmit={createRecord} />
16167
+ {/key}
16168
+ </div>`;
16169
+ }
15534
16170
  /** Emits a UI-kit component block (see `UI_COMPONENT_REGISTRY`): a literal
15535
16171
  * `<SvXxx .../>` tag carrying its configured "chrome" props + optional text
15536
16172
  * content. Entity-agnostic - used both from `blockMarkup` (mixed onto an
@@ -16707,14 +17343,14 @@ function screenPage(schema, rawSchema, screen, resolve, rawResolve, accessEnable
16707
17343
  const codeGridBlockId = firstGridBlockId(screen);
16708
17344
  const handleNames = handleNameMap(screen);
16709
17345
  const codeWire = codeEnabled ? codeWiring(screen, n.type, void 0) : null;
16710
- const hasForm = has(blocks, "form");
17346
+ const createForm = blocks.map((b) => b.config).find((c) => c.kind === "form");
16711
17347
  const gridConfigs = blocks.map((b) => b.config).filter((c) => c.kind === "grid");
16712
17348
  const formGrid = gridConfigs.find((c) => c.editing === "form");
16713
17349
  const hasEditAction = gridConfigs.some((c) => c.rowActions?.some((a) => a.kind === "edit"));
16714
17350
  const hasRowActions = gridConfigs.some((c) => (c.rowActions?.length ?? 0) > 0);
16715
17351
  const cellRenderKinds = new Set(gridConfigs.flatMap((c) => c.columns.filter((col) => col.show && col.cellType).map((col) => col.cellType.kind)));
16716
17352
  const hasCellRenderers = cellRenderKinds.size > 0;
16717
- const wantsForm = !!formGrid || hasForm || hasEditAction;
17353
+ const wantsForm = !!formGrid || hasEditAction;
16718
17354
  const gridPageSize = gridConfigs[0] ? gridConfigs[0].paginated !== false ? gridConfigs[0].pageSize ?? 10 : 1e3 : 10;
16719
17355
  const formPres = formGrid?.formPresentation ?? "modal";
16720
17356
  const formLayoutProps = editPanelLayoutProps(formGrid);
@@ -16722,7 +17358,7 @@ function screenPage(schema, rawSchema, screen, resolve, rawResolve, accessEnable
16722
17358
  const hasFilter = has(blocks, "filter");
16723
17359
  const hasRecord = has(blocks, "record");
16724
17360
  const recordEditable = blocks.some((b) => b.config.kind === "record" && b.config.editable);
16725
- const needsController = hasGrid || wantsForm || hasFilter || hasRecord;
17361
+ const needsController = hasGrid || wantsForm || hasFilter || hasRecord || !!createForm;
16726
17362
  const rtSupabase = !ssrData && needsController && entSource?.kind === "supabase" && entSource.realtime === true;
16727
17363
  const rtTable = rtSupabase ? entSource.table : "";
16728
17364
  const hasAgg = has(allBlocks, "chart") || has(allBlocks, "dashboard") || has(allBlocks, "kpi") || has(allBlocks, "gauge") || has(allBlocks, "tree");
@@ -16790,7 +17426,7 @@ function screenPage(schema, rawSchema, screen, resolve, rawResolve, accessEnable
16790
17426
  ...childSourceVars,
16791
17427
  ...wantsForm ? [...lookupVars, "nextId"] : []
16792
17428
  ])].filter(Boolean);
16793
- const usesGoto = blocks.some((b) => b.config.kind === "grid" && b.config.rowLink && routeById.has(b.config.rowLink.screen) || b.config.kind === "grid" && b.config.rowActions?.some((a) => a.kind === "navigate" && a.screen && routeById.has(a.screen)) || b.config.kind === "chart" && b.config.drillScreen && routeById.has(b.config.drillScreen) || (b.config.kind === "board" || b.config.kind === "calendar") && b.config.openScreen != null && routeById.has(b.config.openScreen) || b.config.kind === "master-detail" && b.config.linkScreen != null && routeById.has(b.config.linkScreen));
17429
+ const usesGoto = blocks.some((b) => b.config.kind === "grid" && b.config.rowLink && routeById.has(b.config.rowLink.screen) || b.config.kind === "grid" && b.config.rowActions?.some((a) => a.kind === "navigate" && a.screen && routeById.has(a.screen)) || b.config.kind === "chart" && b.config.drillScreen && routeById.has(b.config.drillScreen) || (b.config.kind === "board" || b.config.kind === "calendar") && b.config.openScreen != null && routeById.has(b.config.openScreen) || b.config.kind === "master-detail" && b.config.linkScreen != null && routeById.has(b.config.linkScreen) || b.config.kind === "form" && b.config.afterSave === "navigate" && b.config.navigateTo != null && routeById.has(b.config.navigateTo));
16794
17430
  const applyUrlFilters = drillEnabled && needsController;
16795
17431
  const filterableFieldNames = schema.fields.filter((f) => !f.primaryKey).map((f) => f.field);
16796
17432
  const gatesUi = accessEnabled && (wantsForm || gridConfigs.some((c) => c.editing === "inline") || hasRowActions);
@@ -16877,6 +17513,15 @@ function screenPage(schema, rawSchema, screen, resolve, rawResolve, accessEnable
16877
17513
  if (mode === 'create') { await controller.createRow({ [idField]: nextId('${n.idPrefix}'), ...values } as Partial<${n.type}>); controller.setPage(view.pageCount - 1) }
16878
17514
  else if (id) { await controller.updateRow(id, values) }${submitBody}
16879
17515
  editing = undefined${needsAllRows ? "\n await loadAll()" : ""}
17516
+ }`);
17517
+ }
17518
+ if (createForm) {
17519
+ const nav = createForm.afterSave === "navigate" && createForm.navigateTo ? routeById.get(createForm.navigateTo) : void 0;
17520
+ const after = nav ? `\n await goto('/${nav}')` : "";
17521
+ parts.push(`let formSaves = $state(0)
17522
+ async function createRecord({ values }: { mode: 'create' | 'edit'; id: string | null; values: Partial<${n.type}> }) {
17523
+ await controller.createRow({ [idField]: nextId('${n.idPrefix}'), ...values } as Partial<${n.type}>)${submitBody}
17524
+ formSaves += 1${after}
16880
17525
  }`);
16881
17526
  }
16882
17527
  if (hasRecord) parts.push(`let selectedRecord = $state<${n.type} | null>(null)${recordEditable ? `
@@ -17303,14 +17948,19 @@ ${hint ? ` {#if !form?.errors?.[${key}]}<small class="sk-hint">${htmlEs
17303
17948
  const ssrSections = layout?.sections?.length ? (() => {
17304
17949
  const assigned = /* @__PURE__ */ new Set();
17305
17950
  const groups = layout.sections.map((s) => {
17951
+ const names = [];
17306
17952
  const items = s.fields.map((name) => {
17307
17953
  assigned.add(name);
17954
+ names.push(name);
17308
17955
  return blockFor(name);
17309
17956
  }).filter(Boolean);
17310
17957
  return {
17311
17958
  title: s.title,
17312
17959
  description: s.description,
17313
17960
  columns: s.columns,
17961
+ collapsible: s.collapsible,
17962
+ collapsed: s.collapsed,
17963
+ names,
17314
17964
  items
17315
17965
  };
17316
17966
  }).filter((g) => g.items.length);
@@ -17319,13 +17969,26 @@ ${hint ? ` {#if !form?.errors?.[${key}]}<small class="sk-hint">${htmlEs
17319
17969
  title: void 0,
17320
17970
  description: void 0,
17321
17971
  columns: void 0,
17972
+ collapsible: false,
17973
+ collapsed: false,
17974
+ names: [],
17322
17975
  items: rest
17323
17976
  }] : groups;
17324
17977
  })() : null;
17325
17978
  const formCols = layout?.columns ?? 1;
17326
- const fieldsMarkup = ssrSections ? ssrSections.map((g) => ` <fieldset class="sk-group" style="--sk-cols: ${g.columns ?? formCols}">
17327
- ${g.title ? ` <legend>${htmlEsc(g.title)}</legend>\n` : ""}${g.description ? ` <p class="sk-group__desc">${htmlEsc(g.description)}</p>\n` : ""}${g.items.join("\n")}
17328
- </fieldset>`).join("\n") : ` <div class="sk-group" style="--sk-cols: ${formCols}">\n${fieldBlocks.join("\n")}\n </div>`;
17979
+ const fieldsMarkup = ssrSections ? ssrSections.map((g) => {
17980
+ const inner = `${g.description ? ` <p class="sk-group__desc">${htmlEsc(g.description)}</p>\n` : ""}${g.items.join("\n")}`;
17981
+ if (g.collapsible && g.title) {
17982
+ const open = g.collapsed ? `{${JSON.stringify(g.names)}.some((f) => form?.errors?.[f])}` : "{true}";
17983
+ return ` <details class="sk-group sk-group--fold" style="--sk-cols: ${g.columns ?? formCols}" open=${open}>
17984
+ <summary>${htmlEsc(g.title)}</summary>
17985
+ ${inner}
17986
+ </details>`;
17987
+ }
17988
+ return ` <fieldset class="sk-group" style="--sk-cols: ${g.columns ?? formCols}">
17989
+ ${g.title ? ` <legend>${htmlEsc(g.title)}</legend>\n` : ""}${inner}
17990
+ </fieldset>`;
17991
+ }).join("\n") : ` <div class="sk-group" style="--sk-cols: ${formCols}">\n${fieldBlocks.join("\n")}\n </div>`;
17329
17992
  const page = `<script lang="ts">
17330
17993
  import { SvGrid, renderSnippet, type ColumnDef, type CellContext } from '@svgrid/grid'
17331
17994
  import { schemaToColumns } from '@svgrid/enterprise'
@@ -17437,6 +18100,13 @@ ${facetCss} .sk-rowact { display: flex; gap: 10px; }
17437
18100
  .sk-group + .sk-group { margin-top: 14px; padding-top: 14px; border-top: 1px solid var(--sg-border, #e2e8f0); }
17438
18101
  .sk-group legend { grid-column: 1 / -1; padding: 0; font-size: 12px; font-weight: 700; letter-spacing: 0.02em; text-transform: uppercase; color: var(--sg-muted, #64748b); }
17439
18102
  .sk-group__desc { grid-column: 1 / -1; margin: 0; font-size: 12px; color: var(--sg-muted, #64748b); }
18103
+ /* A foldable group is a native <details>, so it works with JavaScript off.
18104
+ display:grid on the element itself would lay the <summary> out as a grid
18105
+ item and break the disclosure, so the grid moves to [open] children. */
18106
+ .sk-group--fold { display: block; }
18107
+ .sk-group--fold > summary { grid-column: 1 / -1; margin-bottom: 12px; font-size: 13.5px; font-weight: 650; color: var(--sg-fg, #0f172a); cursor: pointer; list-style-position: inside; }
18108
+ .sk-group--fold[open] { display: grid; }
18109
+ .sk-group--fold[open] > summary { margin-bottom: 0; }
17440
18110
  .sk-field--wide { grid-column: 1 / -1; }
17441
18111
  .sk-hint { color: var(--sg-muted, #64748b); font-size: 11.5px; }
17442
18112
  @media (max-width: 560px) { .sk-group { grid-template-columns: 1fr; } }
@@ -40770,4 +41440,4 @@ function checkLicenseKey(key, now = /* @__PURE__ */ new Date()) {
40770
41440
  };
40771
41441
  }
40772
41442
  //#endregion
40773
- export { CANVAS_COLS, CANVAS_GAP_PX, CANVAS_ROW_PX, CONTAINER_CHILD_KINDS, CONTAINER_DISPLAY_KINDS, CRUD_ACTIONS, DEFAULT_PORT, DRIVER_PACKAGE, FORM_SUBMIT, GRID_API_MEMBERS, GRID_CURATED_PROPS, GRID_EVENTS, GRID_PRESETS, MANAGED_END, MANAGED_START, ON_LOAD, PANE_LAYOUTS, STANDARD_UI_EVENTS, TAB_CHILD_KINDS, TRIGGER_EVENTS, UI_COMPONENT_REGISTRY, UserError, addAccordionBlock, addAccordionComponent, addAccordionSection, addBlock, addBlockAt, addComponentBlock, addCrudSuite, addEntity, addFreestandingScreen, addHandlerStep, addScreen, addScreenAction, addScreenFromTemplate, addStateVar, addTab, addTabBlock, addTabComponent, applyGridPreset, blockClassName, blockColumns, blockPalette, blockStyleCss, buildCanvasLayout, buildConnectionString, buildCopilotMessages, buildDockLayout, buildStudioBugReport, canvasOpts, canvasRectOf, changeSlot, checkLicenseKey, clickSlot, compileCondition, compileHandlerSteps, compileStep, compileTriggerStep, compileTriggerSteps, compileValue, componentHandleMembers, componentHandleName, componentHasBindings, countTableRows, createProject, crudAppFromSchemas, crudSuiteScreens, csvToEntity, ctxAmbientDts, ctxCompletions, dashScreen, defaultBlockConfig, defaultEntitySource, defaultScreenFor, defaultStudioTheme, deployCommands, detailScreen, detectDelimiter, disableScreenCode, dockOpts, dockPaneIds, dockPaneTitleOf, duplicateBlock, duplicateScreen, emitEntityModules, emitStudioApp, emitStudioAppBundle, emitStudioFragment, emitStudioProject, enableScreenCode, entityDataSource, entityOf, entityScreenPage, eventSlot, flattenBlocks, formScreen, generateRows, generateValue, getLiveDataSample, getSampleApp, getStarterDataset, getStudioTheme, gridApiSettableProps, gridColumns, gridConfig, gridOpts, gridPresetLabel, gridPropSurface, inferType, insertBlock, introspectDatabase, introspectDrizzle, introspectDrizzleAll, introspectJson, introspectOpenApi, introspectPrisma, introspectPrismaAll, isDarkTheme, isFileDialect, isPaneLayout, isProjectValid, isTenantScoped, isUserError, linkRelationLabels, listDatabaseTables, listScreen, liveDataSamples, mapSqlType, mergeBlockStyle, mergeManaged, missingEnvKeys, moveBlock, moveHandlerStep, parseConnectionString, parseCsv, parseProject, parseSelection, pickLabelField, prepareEntities, probeConnection, projectFromModelText, reconcileDock, redactConnectionString, refineField, refineFields, removeAccordionBlock, removeAccordionSection, removeBlock, removeEntity, removeScreen, removeScreenAction, removeStateVar, removeTab, removeTabBlock, renameAccordionSection, renameTab, reorderBlock, reorderScreen, reseedScreenDock, resolveDeployTarget, resolveIdField, resolveSchema, resolveSchemas, resolveThemeTokens, resolveThemeTokensFor, roleCanAction, roleCanScreen, rowSelectSlot, runStudioAdd, runStudioAddApp, runStudioInit, runtimeDeps, sampleApps, sanitizeClassName, sanitizeProject, sanitizeStudioProject, scaffold, scaffoldApp, schemaToColumns, schemaToFormFields, screenDataset, screenFromTemplate, screenHandles, screenLayoutOf, seedUsers, serializeProject, setAccordionMultiple, setAuth, setCanvasRect, setComponentBinding, setComponentName, setDataLayer, setDataSource, setDeployTarget, setDockPaneTitle, setEntityDataSource, setHandlerBody, setHandlerSteps, setJob, setLayoutOpts, setScreenDock, setScreenHandlersSource, setScreenLayout, setScreenRenderGrid, setScreenRenderMode, setShell, setTenancy, setTheme, setThemePreset, setTrigger, skipUserOwned, splitOpts, ssrEligible, ssrScreenShape, stackOpts, starterDatasets, starterProject, stateInitExpr, stateTsType, statusPills, stepsToCode, studioDeployInfo, studioThemes, summarizeVerify, syncDockPanes, tenantField, themeStyleString, triggersOf, uiComponentSpec, updateBlock, updateEntity, updateHandlerStep, updateScreen, updateStateVar, validateProject, verifyScaffold, withSsrDefaults };
41443
+ export { CANVAS_COLS, CANVAS_GAP_PX, CANVAS_ROW_PX, CONTAINER_CHILD_KINDS, CONTAINER_DISPLAY_KINDS, CRUD_ACTIONS, DEFAULT_PORT, DRIVER_PACKAGE, FORM_SUBMIT, GRID_API_MEMBERS, GRID_CURATED_PROPS, GRID_EVENTS, GRID_PRESETS, MANAGED_END, MANAGED_START, ON_LOAD, PANE_LAYOUTS, STANDARD_UI_EVENTS, TAB_CHILD_KINDS, TRIGGER_EVENTS, UI_COMPONENT_REGISTRY, UserError, addAccordionBlock, addAccordionComponent, addAccordionSection, addBlock, addBlockAt, addComponentBlock, addCrudSuite, addEntity, addFormSection, addFreestandingScreen, addHandlerStep, addScreen, addScreenAction, addScreenFromTemplate, addStateVar, addTab, addTabBlock, addTabComponent, applyGridPreset, blockClassName, blockColumns, blockPalette, blockStyleCss, buildCanvasLayout, buildConnectionString, buildCopilotMessages, buildDockLayout, buildStudioBugReport, canvasOpts, canvasRectOf, changeSlot, checkLicenseKey, clickSlot, compileCondition, compileHandlerSteps, compileStep, compileTriggerStep, compileTriggerSteps, compileValue, componentHandleMembers, componentHandleName, componentHasBindings, countTableRows, createProject, crudAppFromSchemas, crudSuiteScreens, csvToEntity, ctxAmbientDts, ctxCompletions, dashScreen, defaultBlockConfig, defaultEntitySource, defaultScreenFor, defaultStudioTheme, deployCommands, detailScreen, detectDelimiter, disableScreenCode, dockOpts, dockPaneIds, dockPaneTitleOf, duplicateBlock, duplicateScreen, emitEntityModules, emitStudioApp, emitStudioAppBundle, emitStudioFragment, emitStudioProject, enableScreenCode, entityDataSource, entityOf, entityScreenPage, eventSlot, flattenBlocks, formControlSettings, formControlsFor, formPlan, formScreen, generateRows, generateValue, getLiveDataSample, getSampleApp, getStarterDataset, getStudioTheme, gridApiSettableProps, gridColumns, gridConfig, gridOpts, gridPresetLabel, gridPropSurface, inferType, insertBlock, introspectDatabase, introspectDrizzle, introspectDrizzleAll, introspectJson, introspectOpenApi, introspectPrisma, introspectPrismaAll, isDarkTheme, isFieldHidden, isFileDialect, isPaneLayout, isProjectValid, isTenantScoped, isUserError, linkRelationLabels, listDatabaseTables, listScreen, liveDataSamples, mapSqlType, mergeBlockStyle, mergeManaged, missingEnvKeys, moveBlock, moveFormField, moveFormFields, moveFormSection, moveHandlerStep, parseConnectionString, parseCsv, parseProject, parseSelection, pickLabelField, prepareEntities, probeConnection, projectFromModelText, reconcileDock, redactConnectionString, refineField, refineFields, removeAccordionBlock, removeAccordionSection, removeBlock, removeEntity, removeFormSection, removeScreen, removeScreenAction, removeStateVar, removeTab, removeTabBlock, renameAccordionSection, renameTab, reorderBlock, reorderScreen, reseedScreenDock, resolveDeployTarget, resolveIdField, resolveSchema, resolveSchemas, resolveThemeTokens, resolveThemeTokensFor, roleCanAction, roleCanScreen, rowSelectSlot, runStudioAdd, runStudioAddApp, runStudioInit, runtimeDeps, sampleApps, sanitizeClassName, sanitizeProject, sanitizeStudioProject, scaffold, scaffoldApp, schemaToColumns, schemaToFormFields, screenDataset, screenFromTemplate, screenHandles, screenLayoutOf, seedUsers, serializeProject, setAccordionMultiple, setAuth, setCanvasRect, setComponentBinding, setComponentName, setDataLayer, setDataSource, setDeployTarget, setDockPaneTitle, setEntityDataSource, setEntityForm, setFieldConditions, setFieldHidden, setFieldInput, setFormColumns, setHandlerBody, setHandlerSteps, setJob, setLayoutOpts, setScreenDock, setScreenHandlersSource, setScreenLayout, setScreenRenderGrid, setScreenRenderMode, setShell, setTenancy, setTheme, setThemePreset, setTrigger, skipUserOwned, splitOpts, ssrEligible, ssrScreenShape, stackOpts, starterDatasets, starterProject, stateInitExpr, stateTsType, statusPills, stepsToCode, studioDeployInfo, studioThemes, suggestFormSections, summarizeVerify, syncDockPanes, tenantField, themeStyleString, triggersOf, uiComponentSpec, updateBlock, updateEntity, updateEntityField, updateFormSection, updateHandlerStep, updateScreen, updateStateVar, validateProject, verifyScaffold, withSsrDefaults };