@pilotiq/pilotiq 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1409) hide show
  1. package/.turbo/turbo-build.log +4 -0
  2. package/CHANGELOG.md +11 -0
  3. package/CLAUDE.md +207 -0
  4. package/LICENSE +21 -0
  5. package/dist/Cluster.d.ts +56 -0
  6. package/dist/Cluster.d.ts.map +1 -0
  7. package/dist/Cluster.js +62 -0
  8. package/dist/Cluster.js.map +1 -0
  9. package/dist/Column.d.ts +378 -0
  10. package/dist/Column.d.ts.map +1 -0
  11. package/dist/Column.js +434 -0
  12. package/dist/Column.js.map +1 -0
  13. package/dist/Global.d.ts +123 -0
  14. package/dist/Global.d.ts.map +1 -0
  15. package/dist/Global.js +124 -0
  16. package/dist/Global.js.map +1 -0
  17. package/dist/Page.d.ts +90 -0
  18. package/dist/Page.d.ts.map +1 -0
  19. package/dist/Page.js +107 -0
  20. package/dist/Page.js.map +1 -0
  21. package/dist/Pilotiq.d.ts +505 -0
  22. package/dist/Pilotiq.d.ts.map +1 -0
  23. package/dist/Pilotiq.js +463 -0
  24. package/dist/Pilotiq.js.map +1 -0
  25. package/dist/PilotiqRegistry.d.ts +10 -0
  26. package/dist/PilotiqRegistry.d.ts.map +1 -0
  27. package/dist/PilotiqRegistry.js +32 -0
  28. package/dist/PilotiqRegistry.js.map +1 -0
  29. package/dist/PilotiqServiceProvider.d.ts +16 -0
  30. package/dist/PilotiqServiceProvider.d.ts.map +1 -0
  31. package/dist/PilotiqServiceProvider.js +57 -0
  32. package/dist/PilotiqServiceProvider.js.map +1 -0
  33. package/dist/RelationManager.d.ts +372 -0
  34. package/dist/RelationManager.d.ts.map +1 -0
  35. package/dist/RelationManager.js +342 -0
  36. package/dist/RelationManager.js.map +1 -0
  37. package/dist/RenderHook.d.ts +86 -0
  38. package/dist/RenderHook.d.ts.map +1 -0
  39. package/dist/RenderHook.js +116 -0
  40. package/dist/RenderHook.js.map +1 -0
  41. package/dist/Resource.d.ts +290 -0
  42. package/dist/Resource.d.ts.map +1 -0
  43. package/dist/Resource.js +362 -0
  44. package/dist/Resource.js.map +1 -0
  45. package/dist/RightPanel.d.ts +92 -0
  46. package/dist/RightPanel.d.ts.map +1 -0
  47. package/dist/RightPanel.js +61 -0
  48. package/dist/RightPanel.js.map +1 -0
  49. package/dist/Tab.d.ts +92 -0
  50. package/dist/Tab.d.ts.map +1 -0
  51. package/dist/Tab.js +93 -0
  52. package/dist/Tab.js.map +1 -0
  53. package/dist/UserMenuItem.d.ts +76 -0
  54. package/dist/UserMenuItem.d.ts.map +1 -0
  55. package/dist/UserMenuItem.js +87 -0
  56. package/dist/UserMenuItem.js.map +1 -0
  57. package/dist/actions/Action.d.ts +888 -0
  58. package/dist/actions/Action.d.ts.map +1 -0
  59. package/dist/actions/Action.js +1652 -0
  60. package/dist/actions/Action.js.map +1 -0
  61. package/dist/actions/ActionGroup.d.ts +85 -0
  62. package/dist/actions/ActionGroup.d.ts.map +1 -0
  63. package/dist/actions/ActionGroup.js +132 -0
  64. package/dist/actions/ActionGroup.js.map +1 -0
  65. package/dist/actions/attachFactory.d.ts +67 -0
  66. package/dist/actions/attachFactory.d.ts.map +1 -0
  67. package/dist/actions/attachFactory.js +115 -0
  68. package/dist/actions/attachFactory.js.map +1 -0
  69. package/dist/actions/exportFactory.d.ts +88 -0
  70. package/dist/actions/exportFactory.d.ts.map +1 -0
  71. package/dist/actions/exportFactory.js +144 -0
  72. package/dist/actions/exportFactory.js.map +1 -0
  73. package/dist/actions/importFactory.d.ts +97 -0
  74. package/dist/actions/importFactory.d.ts.map +1 -0
  75. package/dist/actions/importFactory.js +143 -0
  76. package/dist/actions/importFactory.js.map +1 -0
  77. package/dist/actions/index.d.ts +3 -0
  78. package/dist/actions/index.d.ts.map +1 -0
  79. package/dist/actions/index.js +3 -0
  80. package/dist/actions/index.js.map +1 -0
  81. package/dist/applyPageHooks.d.ts +54 -0
  82. package/dist/applyPageHooks.d.ts.map +1 -0
  83. package/dist/applyPageHooks.js +149 -0
  84. package/dist/applyPageHooks.js.map +1 -0
  85. package/dist/cells/coerce.d.ts +25 -0
  86. package/dist/cells/coerce.d.ts.map +1 -0
  87. package/dist/cells/coerce.js +87 -0
  88. package/dist/cells/coerce.js.map +1 -0
  89. package/dist/clusterPaths.d.ts +9 -0
  90. package/dist/clusterPaths.d.ts.map +1 -0
  91. package/dist/clusterPaths.js +19 -0
  92. package/dist/clusterPaths.js.map +1 -0
  93. package/dist/columns/BadgeColumn.d.ts +16 -0
  94. package/dist/columns/BadgeColumn.d.ts.map +1 -0
  95. package/dist/columns/BadgeColumn.js +25 -0
  96. package/dist/columns/BadgeColumn.js.map +1 -0
  97. package/dist/columns/BooleanColumn.d.ts +10 -0
  98. package/dist/columns/BooleanColumn.d.ts.map +1 -0
  99. package/dist/columns/BooleanColumn.js +18 -0
  100. package/dist/columns/BooleanColumn.js.map +1 -0
  101. package/dist/columns/ColorColumn.d.ts +27 -0
  102. package/dist/columns/ColorColumn.d.ts.map +1 -0
  103. package/dist/columns/ColorColumn.js +35 -0
  104. package/dist/columns/ColorColumn.js.map +1 -0
  105. package/dist/columns/IconColumn.d.ts +22 -0
  106. package/dist/columns/IconColumn.d.ts.map +1 -0
  107. package/dist/columns/IconColumn.js +28 -0
  108. package/dist/columns/IconColumn.js.map +1 -0
  109. package/dist/columns/ImageColumn.d.ts +17 -0
  110. package/dist/columns/ImageColumn.d.ts.map +1 -0
  111. package/dist/columns/ImageColumn.js +24 -0
  112. package/dist/columns/ImageColumn.js.map +1 -0
  113. package/dist/columns/SelectColumn.d.ts +36 -0
  114. package/dist/columns/SelectColumn.d.ts.map +1 -0
  115. package/dist/columns/SelectColumn.js +52 -0
  116. package/dist/columns/SelectColumn.js.map +1 -0
  117. package/dist/columns/TextColumn.d.ts +18 -0
  118. package/dist/columns/TextColumn.d.ts.map +1 -0
  119. package/dist/columns/TextColumn.js +20 -0
  120. package/dist/columns/TextColumn.js.map +1 -0
  121. package/dist/columns/TextInputColumn.d.ts +47 -0
  122. package/dist/columns/TextInputColumn.d.ts.map +1 -0
  123. package/dist/columns/TextInputColumn.js +60 -0
  124. package/dist/columns/TextInputColumn.js.map +1 -0
  125. package/dist/columns/ToggleColumn.d.ts +32 -0
  126. package/dist/columns/ToggleColumn.d.ts.map +1 -0
  127. package/dist/columns/ToggleColumn.js +45 -0
  128. package/dist/columns/ToggleColumn.js.map +1 -0
  129. package/dist/columns/index.d.ts +10 -0
  130. package/dist/columns/index.d.ts.map +1 -0
  131. package/dist/columns/index.js +10 -0
  132. package/dist/columns/index.js.map +1 -0
  133. package/dist/defaultGlobalPages.d.ts +11 -0
  134. package/dist/defaultGlobalPages.d.ts.map +1 -0
  135. package/dist/defaultGlobalPages.js +87 -0
  136. package/dist/defaultGlobalPages.js.map +1 -0
  137. package/dist/defaultPages.d.ts +247 -0
  138. package/dist/defaultPages.d.ts.map +1 -0
  139. package/dist/defaultPages.js +558 -0
  140. package/dist/defaultPages.js.map +1 -0
  141. package/dist/elements/Form.d.ts +219 -0
  142. package/dist/elements/Form.d.ts.map +1 -0
  143. package/dist/elements/Form.js +259 -0
  144. package/dist/elements/Form.js.map +1 -0
  145. package/dist/elements/ListTabs.d.ts +17 -0
  146. package/dist/elements/ListTabs.d.ts.map +1 -0
  147. package/dist/elements/ListTabs.js +23 -0
  148. package/dist/elements/ListTabs.js.map +1 -0
  149. package/dist/elements/Table.d.ts +535 -0
  150. package/dist/elements/Table.d.ts.map +1 -0
  151. package/dist/elements/Table.js +481 -0
  152. package/dist/elements/Table.js.map +1 -0
  153. package/dist/elements/TableGroup.d.ts +121 -0
  154. package/dist/elements/TableGroup.d.ts.map +1 -0
  155. package/dist/elements/TableGroup.js +162 -0
  156. package/dist/elements/TableGroup.js.map +1 -0
  157. package/dist/elements/dispatchAction.d.ts +127 -0
  158. package/dist/elements/dispatchAction.d.ts.map +1 -0
  159. package/dist/elements/dispatchAction.js +254 -0
  160. package/dist/elements/dispatchAction.js.map +1 -0
  161. package/dist/elements/dispatchForm.d.ts +220 -0
  162. package/dist/elements/dispatchForm.d.ts.map +1 -0
  163. package/dist/elements/dispatchForm.js +1645 -0
  164. package/dist/elements/dispatchForm.js.map +1 -0
  165. package/dist/elements/dispatchTable.d.ts +69 -0
  166. package/dist/elements/dispatchTable.d.ts.map +1 -0
  167. package/dist/elements/dispatchTable.js +606 -0
  168. package/dist/elements/dispatchTable.js.map +1 -0
  169. package/dist/elements/index.d.ts +3 -0
  170. package/dist/elements/index.d.ts.map +1 -0
  171. package/dist/elements/index.js +3 -0
  172. package/dist/elements/index.js.map +1 -0
  173. package/dist/entries/BadgeEntry.d.ts +21 -0
  174. package/dist/entries/BadgeEntry.d.ts.map +1 -0
  175. package/dist/entries/BadgeEntry.js +32 -0
  176. package/dist/entries/BadgeEntry.js.map +1 -0
  177. package/dist/entries/CodeEntry.d.ts +38 -0
  178. package/dist/entries/CodeEntry.d.ts.map +1 -0
  179. package/dist/entries/CodeEntry.js +44 -0
  180. package/dist/entries/CodeEntry.js.map +1 -0
  181. package/dist/entries/ColorEntry.d.ts +32 -0
  182. package/dist/entries/ColorEntry.d.ts.map +1 -0
  183. package/dist/entries/ColorEntry.js +48 -0
  184. package/dist/entries/ColorEntry.js.map +1 -0
  185. package/dist/entries/ComponentEntry.d.ts +66 -0
  186. package/dist/entries/ComponentEntry.d.ts.map +1 -0
  187. package/dist/entries/ComponentEntry.js +86 -0
  188. package/dist/entries/ComponentEntry.js.map +1 -0
  189. package/dist/entries/Entry.d.ts +175 -0
  190. package/dist/entries/Entry.d.ts.map +1 -0
  191. package/dist/entries/Entry.js +233 -0
  192. package/dist/entries/Entry.js.map +1 -0
  193. package/dist/entries/IconEntry.d.ts +30 -0
  194. package/dist/entries/IconEntry.d.ts.map +1 -0
  195. package/dist/entries/IconEntry.js +34 -0
  196. package/dist/entries/IconEntry.js.map +1 -0
  197. package/dist/entries/ImageEntry.d.ts +33 -0
  198. package/dist/entries/ImageEntry.d.ts.map +1 -0
  199. package/dist/entries/ImageEntry.js +47 -0
  200. package/dist/entries/ImageEntry.js.map +1 -0
  201. package/dist/entries/KeyValueEntry.d.ts +30 -0
  202. package/dist/entries/KeyValueEntry.d.ts.map +1 -0
  203. package/dist/entries/KeyValueEntry.js +38 -0
  204. package/dist/entries/KeyValueEntry.js.map +1 -0
  205. package/dist/entries/RepeatableEntry.d.ts +122 -0
  206. package/dist/entries/RepeatableEntry.d.ts.map +1 -0
  207. package/dist/entries/RepeatableEntry.js +121 -0
  208. package/dist/entries/RepeatableEntry.js.map +1 -0
  209. package/dist/entries/TextEntry.d.ts +38 -0
  210. package/dist/entries/TextEntry.d.ts.map +1 -0
  211. package/dist/entries/TextEntry.js +49 -0
  212. package/dist/entries/TextEntry.js.map +1 -0
  213. package/dist/entries/index.d.ts +2 -0
  214. package/dist/entries/index.d.ts.map +1 -0
  215. package/dist/entries/index.js +8 -0
  216. package/dist/entries/index.js.map +1 -0
  217. package/dist/entries/registry.d.ts +41 -0
  218. package/dist/entries/registry.d.ts.map +1 -0
  219. package/dist/entries/registry.js +17 -0
  220. package/dist/entries/registry.js.map +1 -0
  221. package/dist/fields/BuilderField.d.ts +420 -0
  222. package/dist/fields/BuilderField.d.ts.map +1 -0
  223. package/dist/fields/BuilderField.js +359 -0
  224. package/dist/fields/BuilderField.js.map +1 -0
  225. package/dist/fields/CheckboxField.d.ts +18 -0
  226. package/dist/fields/CheckboxField.d.ts.map +1 -0
  227. package/dist/fields/CheckboxField.js +23 -0
  228. package/dist/fields/CheckboxField.js.map +1 -0
  229. package/dist/fields/CheckboxListField.d.ts +25 -0
  230. package/dist/fields/CheckboxListField.d.ts.map +1 -0
  231. package/dist/fields/CheckboxListField.js +46 -0
  232. package/dist/fields/CheckboxListField.js.map +1 -0
  233. package/dist/fields/ColorPickerField.d.ts +16 -0
  234. package/dist/fields/ColorPickerField.d.ts.map +1 -0
  235. package/dist/fields/ColorPickerField.js +21 -0
  236. package/dist/fields/ColorPickerField.js.map +1 -0
  237. package/dist/fields/DateField.d.ts +29 -0
  238. package/dist/fields/DateField.d.ts.map +1 -0
  239. package/dist/fields/DateField.js +45 -0
  240. package/dist/fields/DateField.js.map +1 -0
  241. package/dist/fields/EmailField.d.ts +8 -0
  242. package/dist/fields/EmailField.d.ts.map +1 -0
  243. package/dist/fields/EmailField.js +13 -0
  244. package/dist/fields/EmailField.js.map +1 -0
  245. package/dist/fields/Field.d.ts +485 -0
  246. package/dist/fields/Field.d.ts.map +1 -0
  247. package/dist/fields/Field.js +539 -0
  248. package/dist/fields/Field.js.map +1 -0
  249. package/dist/fields/FileUploadField.d.ts +43 -0
  250. package/dist/fields/FileUploadField.d.ts.map +1 -0
  251. package/dist/fields/FileUploadField.js +60 -0
  252. package/dist/fields/FileUploadField.js.map +1 -0
  253. package/dist/fields/HiddenField.d.ts +19 -0
  254. package/dist/fields/HiddenField.d.ts.map +1 -0
  255. package/dist/fields/HiddenField.js +24 -0
  256. package/dist/fields/HiddenField.js.map +1 -0
  257. package/dist/fields/KeyValueField.d.ts +36 -0
  258. package/dist/fields/KeyValueField.d.ts.map +1 -0
  259. package/dist/fields/KeyValueField.js +47 -0
  260. package/dist/fields/KeyValueField.js.map +1 -0
  261. package/dist/fields/MarkdownField.d.ts +79 -0
  262. package/dist/fields/MarkdownField.d.ts.map +1 -0
  263. package/dist/fields/MarkdownField.js +117 -0
  264. package/dist/fields/MarkdownField.js.map +1 -0
  265. package/dist/fields/NumberField.d.ts +17 -0
  266. package/dist/fields/NumberField.d.ts.map +1 -0
  267. package/dist/fields/NumberField.js +27 -0
  268. package/dist/fields/NumberField.js.map +1 -0
  269. package/dist/fields/RadioField.d.ts +26 -0
  270. package/dist/fields/RadioField.d.ts.map +1 -0
  271. package/dist/fields/RadioField.js +47 -0
  272. package/dist/fields/RadioField.js.map +1 -0
  273. package/dist/fields/RepeaterField.d.ts +594 -0
  274. package/dist/fields/RepeaterField.d.ts.map +1 -0
  275. package/dist/fields/RepeaterField.js +504 -0
  276. package/dist/fields/RepeaterField.js.map +1 -0
  277. package/dist/fields/RowButton.d.ts +86 -0
  278. package/dist/fields/RowButton.d.ts.map +1 -0
  279. package/dist/fields/RowButton.js +85 -0
  280. package/dist/fields/RowButton.js.map +1 -0
  281. package/dist/fields/SelectField.d.ts +127 -0
  282. package/dist/fields/SelectField.d.ts.map +1 -0
  283. package/dist/fields/SelectField.js +160 -0
  284. package/dist/fields/SelectField.js.map +1 -0
  285. package/dist/fields/SliderField.d.ts +31 -0
  286. package/dist/fields/SliderField.d.ts.map +1 -0
  287. package/dist/fields/SliderField.js +45 -0
  288. package/dist/fields/SliderField.js.map +1 -0
  289. package/dist/fields/SlugField.d.ts +11 -0
  290. package/dist/fields/SlugField.d.ts.map +1 -0
  291. package/dist/fields/SlugField.js +19 -0
  292. package/dist/fields/SlugField.js.map +1 -0
  293. package/dist/fields/TagsInputField.d.ts +65 -0
  294. package/dist/fields/TagsInputField.d.ts.map +1 -0
  295. package/dist/fields/TagsInputField.js +104 -0
  296. package/dist/fields/TagsInputField.js.map +1 -0
  297. package/dist/fields/TextField.d.ts +11 -0
  298. package/dist/fields/TextField.d.ts.map +1 -0
  299. package/dist/fields/TextField.js +19 -0
  300. package/dist/fields/TextField.js.map +1 -0
  301. package/dist/fields/TextareaField.d.ts +40 -0
  302. package/dist/fields/TextareaField.d.ts.map +1 -0
  303. package/dist/fields/TextareaField.js +51 -0
  304. package/dist/fields/TextareaField.js.map +1 -0
  305. package/dist/fields/ToggleButtonsField.d.ts +24 -0
  306. package/dist/fields/ToggleButtonsField.d.ts.map +1 -0
  307. package/dist/fields/ToggleButtonsField.js +41 -0
  308. package/dist/fields/ToggleButtonsField.js.map +1 -0
  309. package/dist/fields/ToggleField.d.ts +8 -0
  310. package/dist/fields/ToggleField.d.ts.map +1 -0
  311. package/dist/fields/ToggleField.js +13 -0
  312. package/dist/fields/ToggleField.js.map +1 -0
  313. package/dist/fields/optionsResolver.d.ts +54 -0
  314. package/dist/fields/optionsResolver.d.ts.map +1 -0
  315. package/dist/fields/optionsResolver.js +62 -0
  316. package/dist/fields/optionsResolver.js.map +1 -0
  317. package/dist/fields/resolveField.d.ts +21 -0
  318. package/dist/fields/resolveField.d.ts.map +1 -0
  319. package/dist/fields/resolveField.js +26 -0
  320. package/dist/fields/resolveField.js.map +1 -0
  321. package/dist/filters/BooleanFilter.d.ts +20 -0
  322. package/dist/filters/BooleanFilter.d.ts.map +1 -0
  323. package/dist/filters/BooleanFilter.js +31 -0
  324. package/dist/filters/BooleanFilter.js.map +1 -0
  325. package/dist/filters/DateRangeFilter.d.ts +68 -0
  326. package/dist/filters/DateRangeFilter.d.ts.map +1 -0
  327. package/dist/filters/DateRangeFilter.js +137 -0
  328. package/dist/filters/DateRangeFilter.js.map +1 -0
  329. package/dist/filters/Filter.d.ts +140 -0
  330. package/dist/filters/Filter.d.ts.map +1 -0
  331. package/dist/filters/Filter.js +99 -0
  332. package/dist/filters/Filter.js.map +1 -0
  333. package/dist/filters/FormFilter.d.ts +103 -0
  334. package/dist/filters/FormFilter.d.ts.map +1 -0
  335. package/dist/filters/FormFilter.js +180 -0
  336. package/dist/filters/FormFilter.js.map +1 -0
  337. package/dist/filters/MultiSelectFilter.d.ts +41 -0
  338. package/dist/filters/MultiSelectFilter.d.ts.map +1 -0
  339. package/dist/filters/MultiSelectFilter.js +67 -0
  340. package/dist/filters/MultiSelectFilter.js.map +1 -0
  341. package/dist/filters/QueryBuilderFilter.d.ts +145 -0
  342. package/dist/filters/QueryBuilderFilter.d.ts.map +1 -0
  343. package/dist/filters/QueryBuilderFilter.js +323 -0
  344. package/dist/filters/QueryBuilderFilter.js.map +1 -0
  345. package/dist/filters/SelectFilter.d.ts +26 -0
  346. package/dist/filters/SelectFilter.d.ts.map +1 -0
  347. package/dist/filters/SelectFilter.js +35 -0
  348. package/dist/filters/SelectFilter.js.map +1 -0
  349. package/dist/filters/TernaryFilter.d.ts +35 -0
  350. package/dist/filters/TernaryFilter.d.ts.map +1 -0
  351. package/dist/filters/TernaryFilter.js +71 -0
  352. package/dist/filters/TernaryFilter.js.map +1 -0
  353. package/dist/filters/TrashedFilter.d.ts +28 -0
  354. package/dist/filters/TrashedFilter.d.ts.map +1 -0
  355. package/dist/filters/TrashedFilter.js +52 -0
  356. package/dist/filters/TrashedFilter.js.map +1 -0
  357. package/dist/filters/queryBuilder/BooleanConstraint.d.ts +13 -0
  358. package/dist/filters/queryBuilder/BooleanConstraint.d.ts.map +1 -0
  359. package/dist/filters/queryBuilder/BooleanConstraint.js +27 -0
  360. package/dist/filters/queryBuilder/BooleanConstraint.js.map +1 -0
  361. package/dist/filters/queryBuilder/Constraint.d.ts +74 -0
  362. package/dist/filters/queryBuilder/Constraint.d.ts.map +1 -0
  363. package/dist/filters/queryBuilder/Constraint.js +45 -0
  364. package/dist/filters/queryBuilder/Constraint.js.map +1 -0
  365. package/dist/filters/queryBuilder/DateConstraint.d.ts +18 -0
  366. package/dist/filters/queryBuilder/DateConstraint.d.ts.map +1 -0
  367. package/dist/filters/queryBuilder/DateConstraint.js +63 -0
  368. package/dist/filters/queryBuilder/DateConstraint.js.map +1 -0
  369. package/dist/filters/queryBuilder/NumberConstraint.d.ts +12 -0
  370. package/dist/filters/queryBuilder/NumberConstraint.d.ts.map +1 -0
  371. package/dist/filters/queryBuilder/NumberConstraint.js +61 -0
  372. package/dist/filters/queryBuilder/NumberConstraint.js.map +1 -0
  373. package/dist/filters/queryBuilder/SelectConstraint.d.ts +22 -0
  374. package/dist/filters/queryBuilder/SelectConstraint.d.ts.map +1 -0
  375. package/dist/filters/queryBuilder/SelectConstraint.js +66 -0
  376. package/dist/filters/queryBuilder/SelectConstraint.js.map +1 -0
  377. package/dist/filters/queryBuilder/TextConstraint.d.ts +18 -0
  378. package/dist/filters/queryBuilder/TextConstraint.d.ts.map +1 -0
  379. package/dist/filters/queryBuilder/TextConstraint.js +58 -0
  380. package/dist/filters/queryBuilder/TextConstraint.js.map +1 -0
  381. package/dist/filters/queryBuilder/index.d.ts +7 -0
  382. package/dist/filters/queryBuilder/index.d.ts.map +1 -0
  383. package/dist/filters/queryBuilder/index.js +7 -0
  384. package/dist/filters/queryBuilder/index.js.map +1 -0
  385. package/dist/icons/index.d.ts +3 -0
  386. package/dist/icons/index.d.ts.map +1 -0
  387. package/dist/icons/index.js +3 -0
  388. package/dist/icons/index.js.map +1 -0
  389. package/dist/icons/lucide.d.ts +16 -0
  390. package/dist/icons/lucide.d.ts.map +1 -0
  391. package/dist/icons/lucide.js +173 -0
  392. package/dist/icons/lucide.js.map +1 -0
  393. package/dist/icons/registry.d.ts +27 -0
  394. package/dist/icons/registry.d.ts.map +1 -0
  395. package/dist/icons/registry.js +35 -0
  396. package/dist/icons/registry.js.map +1 -0
  397. package/dist/icons/types.d.ts +38 -0
  398. package/dist/icons/types.d.ts.map +1 -0
  399. package/dist/icons/types.js +23 -0
  400. package/dist/icons/types.js.map +1 -0
  401. package/dist/index.d.ts +118 -0
  402. package/dist/index.d.ts.map +1 -0
  403. package/dist/index.js +135 -0
  404. package/dist/index.js.map +1 -0
  405. package/dist/io/csv.d.ts +51 -0
  406. package/dist/io/csv.d.ts.map +1 -0
  407. package/dist/io/csv.js +168 -0
  408. package/dist/io/csv.js.map +1 -0
  409. package/dist/notifications/Notification.d.ts +181 -0
  410. package/dist/notifications/Notification.d.ts.map +1 -0
  411. package/dist/notifications/Notification.js +290 -0
  412. package/dist/notifications/Notification.js.map +1 -0
  413. package/dist/notifications/broadcast.d.ts +58 -0
  414. package/dist/notifications/broadcast.d.ts.map +1 -0
  415. package/dist/notifications/broadcast.js +72 -0
  416. package/dist/notifications/broadcast.js.map +1 -0
  417. package/dist/notifications/database.d.ts +164 -0
  418. package/dist/notifications/database.d.ts.map +1 -0
  419. package/dist/notifications/database.js +321 -0
  420. package/dist/notifications/database.js.map +1 -0
  421. package/dist/notifications/dispatchNotificationAction.d.ts +48 -0
  422. package/dist/notifications/dispatchNotificationAction.d.ts.map +1 -0
  423. package/dist/notifications/dispatchNotificationAction.js +100 -0
  424. package/dist/notifications/dispatchNotificationAction.js.map +1 -0
  425. package/dist/notifications/flash.d.ts +34 -0
  426. package/dist/notifications/flash.d.ts.map +1 -0
  427. package/dist/notifications/flash.js +51 -0
  428. package/dist/notifications/flash.js.map +1 -0
  429. package/dist/notifications/index.d.ts +8 -0
  430. package/dist/notifications/index.d.ts.map +1 -0
  431. package/dist/notifications/index.js +6 -0
  432. package/dist/notifications/index.js.map +1 -0
  433. package/dist/notifications/registerBroadcastAuth.d.ts +45 -0
  434. package/dist/notifications/registerBroadcastAuth.d.ts.map +1 -0
  435. package/dist/notifications/registerBroadcastAuth.js +86 -0
  436. package/dist/notifications/registerBroadcastAuth.js.map +1 -0
  437. package/dist/notifications/resolveSavedNotification.d.ts +21 -0
  438. package/dist/notifications/resolveSavedNotification.d.ts.map +1 -0
  439. package/dist/notifications/resolveSavedNotification.js +43 -0
  440. package/dist/notifications/resolveSavedNotification.js.map +1 -0
  441. package/dist/notifications/types.d.ts +87 -0
  442. package/dist/notifications/types.d.ts.map +1 -0
  443. package/dist/notifications/types.js +2 -0
  444. package/dist/notifications/types.js.map +1 -0
  445. package/dist/orm/m2mAccessor.d.ts +49 -0
  446. package/dist/orm/m2mAccessor.d.ts.map +1 -0
  447. package/dist/orm/m2mAccessor.js +45 -0
  448. package/dist/orm/m2mAccessor.js.map +1 -0
  449. package/dist/orm/modelDefaults.d.ts +347 -0
  450. package/dist/orm/modelDefaults.d.ts.map +1 -0
  451. package/dist/orm/modelDefaults.js +375 -0
  452. package/dist/orm/modelDefaults.js.map +1 -0
  453. package/dist/pageData.d.ts +778 -0
  454. package/dist/pageData.d.ts.map +1 -0
  455. package/dist/pageData.js +3725 -0
  456. package/dist/pageData.js.map +1 -0
  457. package/dist/plugins/index.d.ts +2 -0
  458. package/dist/plugins/index.d.ts.map +1 -0
  459. package/dist/plugins/index.js +2 -0
  460. package/dist/plugins/index.js.map +1 -0
  461. package/dist/plugins/themeEditor.d.ts +17 -0
  462. package/dist/plugins/themeEditor.d.ts.map +1 -0
  463. package/dist/plugins/themeEditor.js +23 -0
  464. package/dist/plugins/themeEditor.js.map +1 -0
  465. package/dist/react/AppShell.d.ts +58 -0
  466. package/dist/react/AppShell.d.ts.map +1 -0
  467. package/dist/react/AppShell.js +58 -0
  468. package/dist/react/AppShell.js.map +1 -0
  469. package/dist/react/CommandPalette.d.ts +21 -0
  470. package/dist/react/CommandPalette.d.ts.map +1 -0
  471. package/dist/react/CommandPalette.js +236 -0
  472. package/dist/react/CommandPalette.js.map +1 -0
  473. package/dist/react/FormStateContext.d.ts +83 -0
  474. package/dist/react/FormStateContext.d.ts.map +1 -0
  475. package/dist/react/FormStateContext.js +284 -0
  476. package/dist/react/FormStateContext.js.map +1 -0
  477. package/dist/react/HeadHooks.d.ts +26 -0
  478. package/dist/react/HeadHooks.d.ts.map +1 -0
  479. package/dist/react/HeadHooks.js +141 -0
  480. package/dist/react/HeadHooks.js.map +1 -0
  481. package/dist/react/NotificationActionStrip.d.ts +39 -0
  482. package/dist/react/NotificationActionStrip.d.ts.map +1 -0
  483. package/dist/react/NotificationActionStrip.js +129 -0
  484. package/dist/react/NotificationActionStrip.js.map +1 -0
  485. package/dist/react/NotificationBell.d.ts +20 -0
  486. package/dist/react/NotificationBell.d.ts.map +1 -0
  487. package/dist/react/NotificationBell.js +273 -0
  488. package/dist/react/NotificationBell.js.map +1 -0
  489. package/dist/react/RenderHookSlot.d.ts +20 -0
  490. package/dist/react/RenderHookSlot.d.ts.map +1 -0
  491. package/dist/react/RenderHookSlot.js +24 -0
  492. package/dist/react/RenderHookSlot.js.map +1 -0
  493. package/dist/react/RightSidebar.d.ts +33 -0
  494. package/dist/react/RightSidebar.d.ts.map +1 -0
  495. package/dist/react/RightSidebar.js +82 -0
  496. package/dist/react/RightSidebar.js.map +1 -0
  497. package/dist/react/RightSidebarContext.d.ts +62 -0
  498. package/dist/react/RightSidebarContext.d.ts.map +1 -0
  499. package/dist/react/RightSidebarContext.js +178 -0
  500. package/dist/react/RightSidebarContext.js.map +1 -0
  501. package/dist/react/RightSidebarTrigger.d.ts +16 -0
  502. package/dist/react/RightSidebarTrigger.d.ts.map +1 -0
  503. package/dist/react/RightSidebarTrigger.js +24 -0
  504. package/dist/react/RightSidebarTrigger.js.map +1 -0
  505. package/dist/react/SchemaRenderer.d.ts +63 -0
  506. package/dist/react/SchemaRenderer.d.ts.map +1 -0
  507. package/dist/react/SchemaRenderer.js +3458 -0
  508. package/dist/react/SchemaRenderer.js.map +1 -0
  509. package/dist/react/SearchTrigger.d.ts +13 -0
  510. package/dist/react/SearchTrigger.d.ts.map +1 -0
  511. package/dist/react/SearchTrigger.js +30 -0
  512. package/dist/react/SearchTrigger.js.map +1 -0
  513. package/dist/react/ThemeProvider.d.ts +18 -0
  514. package/dist/react/ThemeProvider.d.ts.map +1 -0
  515. package/dist/react/ThemeProvider.js +66 -0
  516. package/dist/react/ThemeProvider.js.map +1 -0
  517. package/dist/react/ThemeSettingsPage.d.ts +10 -0
  518. package/dist/react/ThemeSettingsPage.d.ts.map +1 -0
  519. package/dist/react/ThemeSettingsPage.js +293 -0
  520. package/dist/react/ThemeSettingsPage.js.map +1 -0
  521. package/dist/react/ThemeToggle.d.ts +2 -0
  522. package/dist/react/ThemeToggle.d.ts.map +1 -0
  523. package/dist/react/ThemeToggle.js +8 -0
  524. package/dist/react/ThemeToggle.js.map +1 -0
  525. package/dist/react/Toaster.d.ts +25 -0
  526. package/dist/react/Toaster.d.ts.map +1 -0
  527. package/dist/react/Toaster.js +89 -0
  528. package/dist/react/Toaster.js.map +1 -0
  529. package/dist/react/UserMenu.d.ts +23 -0
  530. package/dist/react/UserMenu.d.ts.map +1 -0
  531. package/dist/react/UserMenu.js +78 -0
  532. package/dist/react/UserMenu.js.map +1 -0
  533. package/dist/react/WidgetDataContext.d.ts +64 -0
  534. package/dist/react/WidgetDataContext.d.ts.map +1 -0
  535. package/dist/react/WidgetDataContext.js +89 -0
  536. package/dist/react/WidgetDataContext.js.map +1 -0
  537. package/dist/react/cells/EditableCell.d.ts +20 -0
  538. package/dist/react/cells/EditableCell.d.ts.map +1 -0
  539. package/dist/react/cells/EditableCell.js +251 -0
  540. package/dist/react/cells/EditableCell.js.map +1 -0
  541. package/dist/react/fieldJsHandler.d.ts +33 -0
  542. package/dist/react/fieldJsHandler.d.ts.map +1 -0
  543. package/dist/react/fieldJsHandler.js +61 -0
  544. package/dist/react/fieldJsHandler.js.map +1 -0
  545. package/dist/react/fields/BuilderInput.d.ts +21 -0
  546. package/dist/react/fields/BuilderInput.d.ts.map +1 -0
  547. package/dist/react/fields/BuilderInput.js +553 -0
  548. package/dist/react/fields/BuilderInput.js.map +1 -0
  549. package/dist/react/fields/CheckboxInput.d.ts +9 -0
  550. package/dist/react/fields/CheckboxInput.d.ts.map +1 -0
  551. package/dist/react/fields/CheckboxInput.js +23 -0
  552. package/dist/react/fields/CheckboxInput.js.map +1 -0
  553. package/dist/react/fields/CheckboxListInput.d.ts +19 -0
  554. package/dist/react/fields/CheckboxListInput.d.ts.map +1 -0
  555. package/dist/react/fields/CheckboxListInput.js +53 -0
  556. package/dist/react/fields/CheckboxListInput.js.map +1 -0
  557. package/dist/react/fields/ColorInput.d.ts +12 -0
  558. package/dist/react/fields/ColorInput.d.ts.map +1 -0
  559. package/dist/react/fields/ColorInput.js +29 -0
  560. package/dist/react/fields/ColorInput.js.map +1 -0
  561. package/dist/react/fields/DateFieldInput.d.ts +8 -0
  562. package/dist/react/fields/DateFieldInput.d.ts.map +1 -0
  563. package/dist/react/fields/DateFieldInput.js +39 -0
  564. package/dist/react/fields/DateFieldInput.js.map +1 -0
  565. package/dist/react/fields/DateTimeInput.d.ts +13 -0
  566. package/dist/react/fields/DateTimeInput.d.ts.map +1 -0
  567. package/dist/react/fields/DateTimeInput.js +29 -0
  568. package/dist/react/fields/DateTimeInput.js.map +1 -0
  569. package/dist/react/fields/FieldShell.d.ts +23 -0
  570. package/dist/react/fields/FieldShell.d.ts.map +1 -0
  571. package/dist/react/fields/FieldShell.js +46 -0
  572. package/dist/react/fields/FieldShell.js.map +1 -0
  573. package/dist/react/fields/FileUploadInput.d.ts +21 -0
  574. package/dist/react/fields/FileUploadInput.d.ts.map +1 -0
  575. package/dist/react/fields/FileUploadInput.js +120 -0
  576. package/dist/react/fields/FileUploadInput.js.map +1 -0
  577. package/dist/react/fields/HiddenInput.d.ts +11 -0
  578. package/dist/react/fields/HiddenInput.d.ts.map +1 -0
  579. package/dist/react/fields/HiddenInput.js +14 -0
  580. package/dist/react/fields/HiddenInput.js.map +1 -0
  581. package/dist/react/fields/KeyValueInput.d.ts +18 -0
  582. package/dist/react/fields/KeyValueInput.d.ts.map +1 -0
  583. package/dist/react/fields/KeyValueInput.js +122 -0
  584. package/dist/react/fields/KeyValueInput.js.map +1 -0
  585. package/dist/react/fields/MarkdownInput.d.ts +29 -0
  586. package/dist/react/fields/MarkdownInput.d.ts.map +1 -0
  587. package/dist/react/fields/MarkdownInput.js +250 -0
  588. package/dist/react/fields/MarkdownInput.js.map +1 -0
  589. package/dist/react/fields/RadioInput.d.ts +18 -0
  590. package/dist/react/fields/RadioInput.d.ts.map +1 -0
  591. package/dist/react/fields/RadioInput.js +34 -0
  592. package/dist/react/fields/RadioInput.js.map +1 -0
  593. package/dist/react/fields/RepeaterInput.d.ts +92 -0
  594. package/dist/react/fields/RepeaterInput.d.ts.map +1 -0
  595. package/dist/react/fields/RepeaterInput.js +705 -0
  596. package/dist/react/fields/RepeaterInput.js.map +1 -0
  597. package/dist/react/fields/SelectFieldInput.d.ts +23 -0
  598. package/dist/react/fields/SelectFieldInput.d.ts.map +1 -0
  599. package/dist/react/fields/SelectFieldInput.js +146 -0
  600. package/dist/react/fields/SelectFieldInput.js.map +1 -0
  601. package/dist/react/fields/SliderInput.d.ts +16 -0
  602. package/dist/react/fields/SliderInput.d.ts.map +1 -0
  603. package/dist/react/fields/SliderInput.js +37 -0
  604. package/dist/react/fields/SliderInput.js.map +1 -0
  605. package/dist/react/fields/TagsInput.d.ts +27 -0
  606. package/dist/react/fields/TagsInput.d.ts.map +1 -0
  607. package/dist/react/fields/TagsInput.js +189 -0
  608. package/dist/react/fields/TagsInput.js.map +1 -0
  609. package/dist/react/fields/TextLikeInput.d.ts +18 -0
  610. package/dist/react/fields/TextLikeInput.d.ts.map +1 -0
  611. package/dist/react/fields/TextLikeInput.js +46 -0
  612. package/dist/react/fields/TextLikeInput.js.map +1 -0
  613. package/dist/react/fields/ToggleButtonsInput.d.ts +20 -0
  614. package/dist/react/fields/ToggleButtonsInput.d.ts.map +1 -0
  615. package/dist/react/fields/ToggleButtonsInput.js +42 -0
  616. package/dist/react/fields/ToggleButtonsInput.js.map +1 -0
  617. package/dist/react/fields/ToggleFieldInput.d.ts +7 -0
  618. package/dist/react/fields/ToggleFieldInput.d.ts.map +1 -0
  619. package/dist/react/fields/ToggleFieldInput.js +30 -0
  620. package/dist/react/fields/ToggleFieldInput.js.map +1 -0
  621. package/dist/react/fields/rowChromeButton.d.ts +84 -0
  622. package/dist/react/fields/rowChromeButton.d.ts.map +1 -0
  623. package/dist/react/fields/rowChromeButton.js +111 -0
  624. package/dist/react/fields/rowChromeButton.js.map +1 -0
  625. package/dist/react/fields/syncRowGates.d.ts +11 -0
  626. package/dist/react/fields/syncRowGates.d.ts.map +1 -0
  627. package/dist/react/fields/syncRowGates.js +55 -0
  628. package/dist/react/fields/syncRowGates.js.map +1 -0
  629. package/dist/react/formStateHelpers.d.ts +44 -0
  630. package/dist/react/formStateHelpers.d.ts.map +1 -0
  631. package/dist/react/formStateHelpers.js +230 -0
  632. package/dist/react/formStateHelpers.js.map +1 -0
  633. package/dist/react/hooks/use-mobile.d.ts +2 -0
  634. package/dist/react/hooks/use-mobile.d.ts.map +1 -0
  635. package/dist/react/hooks/use-mobile.js +16 -0
  636. package/dist/react/hooks/use-mobile.js.map +1 -0
  637. package/dist/react/icon-context.d.ts +35 -0
  638. package/dist/react/icon-context.d.ts.map +1 -0
  639. package/dist/react/icon-context.js +45 -0
  640. package/dist/react/icon-context.js.map +1 -0
  641. package/dist/react/index.d.ts +26 -0
  642. package/dist/react/index.d.ts.map +1 -0
  643. package/dist/react/index.js +28 -0
  644. package/dist/react/index.js.map +1 -0
  645. package/dist/react/layouts/SidebarLayout.d.ts +3 -0
  646. package/dist/react/layouts/SidebarLayout.d.ts.map +1 -0
  647. package/dist/react/layouts/SidebarLayout.js +85 -0
  648. package/dist/react/layouts/SidebarLayout.js.map +1 -0
  649. package/dist/react/layouts/TopbarLayout.d.ts +3 -0
  650. package/dist/react/layouts/TopbarLayout.d.ts.map +1 -0
  651. package/dist/react/layouts/TopbarLayout.js +103 -0
  652. package/dist/react/layouts/TopbarLayout.js.map +1 -0
  653. package/dist/react/navigate.d.ts +22 -0
  654. package/dist/react/navigate.d.ts.map +1 -0
  655. package/dist/react/navigate.js +30 -0
  656. package/dist/react/navigate.js.map +1 -0
  657. package/dist/react/registry.d.ts +35 -0
  658. package/dist/react/registry.d.ts.map +1 -0
  659. package/dist/react/registry.js +22 -0
  660. package/dist/react/registry.js.map +1 -0
  661. package/dist/react/right-panel-registry.d.ts +32 -0
  662. package/dist/react/right-panel-registry.d.ts.map +1 -0
  663. package/dist/react/right-panel-registry.js +20 -0
  664. package/dist/react/right-panel-registry.js.map +1 -0
  665. package/dist/react/theme-preview/apply.d.ts +11 -0
  666. package/dist/react/theme-preview/apply.d.ts.map +1 -0
  667. package/dist/react/theme-preview/apply.js +93 -0
  668. package/dist/react/theme-preview/apply.js.map +1 -0
  669. package/dist/react/theme-preview/build-html.d.ts +3 -0
  670. package/dist/react/theme-preview/build-html.d.ts.map +1 -0
  671. package/dist/react/theme-preview/build-html.js +437 -0
  672. package/dist/react/theme-preview/build-html.js.map +1 -0
  673. package/dist/react/ui/button.d.ts +9 -0
  674. package/dist/react/ui/button.d.ts.map +1 -0
  675. package/dist/react/ui/button.js +35 -0
  676. package/dist/react/ui/button.js.map +1 -0
  677. package/dist/react/ui/calendar.d.ts +5 -0
  678. package/dist/react/ui/calendar.d.ts.map +1 -0
  679. package/dist/react/ui/calendar.js +34 -0
  680. package/dist/react/ui/calendar.js.map +1 -0
  681. package/dist/react/ui/checkbox.d.ts +4 -0
  682. package/dist/react/ui/checkbox.d.ts.map +1 -0
  683. package/dist/react/ui/checkbox.js +9 -0
  684. package/dist/react/ui/checkbox.js.map +1 -0
  685. package/dist/react/ui/dialog.d.ts +12 -0
  686. package/dist/react/ui/dialog.d.ts.map +1 -0
  687. package/dist/react/ui/dialog.js +34 -0
  688. package/dist/react/ui/dialog.js.map +1 -0
  689. package/dist/react/ui/dropdown-menu.d.ts +12 -0
  690. package/dist/react/ui/dropdown-menu.d.ts.map +1 -0
  691. package/dist/react/ui/dropdown-menu.js +23 -0
  692. package/dist/react/ui/dropdown-menu.js.map +1 -0
  693. package/dist/react/ui/input.d.ts +4 -0
  694. package/dist/react/ui/input.d.ts.map +1 -0
  695. package/dist/react/ui/input.js +8 -0
  696. package/dist/react/ui/input.js.map +1 -0
  697. package/dist/react/ui/label.d.ts +4 -0
  698. package/dist/react/ui/label.d.ts.map +1 -0
  699. package/dist/react/ui/label.js +7 -0
  700. package/dist/react/ui/label.js.map +1 -0
  701. package/dist/react/ui/popover.d.ts +6 -0
  702. package/dist/react/ui/popover.d.ts.map +1 -0
  703. package/dist/react/ui/popover.js +14 -0
  704. package/dist/react/ui/popover.js.map +1 -0
  705. package/dist/react/ui/select.d.ts +17 -0
  706. package/dist/react/ui/select.d.ts.map +1 -0
  707. package/dist/react/ui/select.js +39 -0
  708. package/dist/react/ui/select.js.map +1 -0
  709. package/dist/react/ui/separator.d.ts +4 -0
  710. package/dist/react/ui/separator.d.ts.map +1 -0
  711. package/dist/react/ui/separator.js +9 -0
  712. package/dist/react/ui/separator.js.map +1 -0
  713. package/dist/react/ui/sheet.d.ts +15 -0
  714. package/dist/react/ui/sheet.d.ts.map +1 -0
  715. package/dist/react/ui/sheet.js +37 -0
  716. package/dist/react/ui/sheet.js.map +1 -0
  717. package/dist/react/ui/sidebar.d.ts +64 -0
  718. package/dist/react/ui/sidebar.d.ts.map +1 -0
  719. package/dist/react/ui/sidebar.js +257 -0
  720. package/dist/react/ui/sidebar.js.map +1 -0
  721. package/dist/react/ui/skeleton.d.ts +3 -0
  722. package/dist/react/ui/skeleton.d.ts.map +1 -0
  723. package/dist/react/ui/skeleton.js +7 -0
  724. package/dist/react/ui/skeleton.js.map +1 -0
  725. package/dist/react/ui/slider.d.ts +4 -0
  726. package/dist/react/ui/slider.d.ts.map +1 -0
  727. package/dist/react/ui/slider.js +8 -0
  728. package/dist/react/ui/slider.js.map +1 -0
  729. package/dist/react/ui/switch.d.ts +4 -0
  730. package/dist/react/ui/switch.d.ts.map +1 -0
  731. package/dist/react/ui/switch.js +8 -0
  732. package/dist/react/ui/switch.js.map +1 -0
  733. package/dist/react/ui/table.d.ts +11 -0
  734. package/dist/react/ui/table.d.ts.map +1 -0
  735. package/dist/react/ui/table.js +28 -0
  736. package/dist/react/ui/table.js.map +1 -0
  737. package/dist/react/ui/tabs.d.ts +7 -0
  738. package/dist/react/ui/tabs.d.ts.map +1 -0
  739. package/dist/react/ui/tabs.js +17 -0
  740. package/dist/react/ui/tabs.js.map +1 -0
  741. package/dist/react/ui/textarea.d.ts +4 -0
  742. package/dist/react/ui/textarea.d.ts.map +1 -0
  743. package/dist/react/ui/textarea.js +7 -0
  744. package/dist/react/ui/textarea.js.map +1 -0
  745. package/dist/react/ui/tooltip.d.ts +7 -0
  746. package/dist/react/ui/tooltip.d.ts.map +1 -0
  747. package/dist/react/ui/tooltip.js +17 -0
  748. package/dist/react/ui/tooltip.js.map +1 -0
  749. package/dist/react/useResizableWidth.d.ts +47 -0
  750. package/dist/react/useResizableWidth.d.ts.map +1 -0
  751. package/dist/react/useResizableWidth.js +99 -0
  752. package/dist/react/useResizableWidth.js.map +1 -0
  753. package/dist/react/utils.d.ts +3 -0
  754. package/dist/react/utils.d.ts.map +1 -0
  755. package/dist/react/utils.js +6 -0
  756. package/dist/react/utils.js.map +1 -0
  757. package/dist/react/widgetRegistry.d.ts +33 -0
  758. package/dist/react/widgetRegistry.d.ts.map +1 -0
  759. package/dist/react/widgetRegistry.js +15 -0
  760. package/dist/react/widgetRegistry.js.map +1 -0
  761. package/dist/react/widgets/StatsOverviewRenderer.d.ts +6 -0
  762. package/dist/react/widgets/StatsOverviewRenderer.d.ts.map +1 -0
  763. package/dist/react/widgets/StatsOverviewRenderer.js +124 -0
  764. package/dist/react/widgets/StatsOverviewRenderer.js.map +1 -0
  765. package/dist/react/widgets/TableWidgetRenderer.d.ts +6 -0
  766. package/dist/react/widgets/TableWidgetRenderer.d.ts.map +1 -0
  767. package/dist/react/widgets/TableWidgetRenderer.js +123 -0
  768. package/dist/react/widgets/TableWidgetRenderer.js.map +1 -0
  769. package/dist/react/widgets/ViewRenderer.d.ts +16 -0
  770. package/dist/react/widgets/ViewRenderer.d.ts.map +1 -0
  771. package/dist/react/widgets/ViewRenderer.js +26 -0
  772. package/dist/react/widgets/ViewRenderer.js.map +1 -0
  773. package/dist/richtext/index.d.ts +2 -0
  774. package/dist/richtext/index.d.ts.map +1 -0
  775. package/dist/richtext/index.js +2 -0
  776. package/dist/richtext/index.js.map +1 -0
  777. package/dist/richtext/registry.d.ts +55 -0
  778. package/dist/richtext/registry.d.ts.map +1 -0
  779. package/dist/richtext/registry.js +66 -0
  780. package/dist/richtext/registry.js.map +1 -0
  781. package/dist/routes.d.ts +9 -0
  782. package/dist/routes.d.ts.map +1 -0
  783. package/dist/routes.js +3116 -0
  784. package/dist/routes.js.map +1 -0
  785. package/dist/schema/Alert.d.ts +33 -0
  786. package/dist/schema/Alert.d.ts.map +1 -0
  787. package/dist/schema/Alert.js +41 -0
  788. package/dist/schema/Alert.js.map +1 -0
  789. package/dist/schema/Block.d.ts +112 -0
  790. package/dist/schema/Block.d.ts.map +1 -0
  791. package/dist/schema/Block.js +136 -0
  792. package/dist/schema/Block.js.map +1 -0
  793. package/dist/schema/Breadcrumbs.d.ts +31 -0
  794. package/dist/schema/Breadcrumbs.d.ts.map +1 -0
  795. package/dist/schema/Breadcrumbs.js +30 -0
  796. package/dist/schema/Breadcrumbs.js.map +1 -0
  797. package/dist/schema/Card.d.ts +17 -0
  798. package/dist/schema/Card.d.ts.map +1 -0
  799. package/dist/schema/Card.js +31 -0
  800. package/dist/schema/Card.js.map +1 -0
  801. package/dist/schema/Divider.d.ts +12 -0
  802. package/dist/schema/Divider.d.ts.map +1 -0
  803. package/dist/schema/Divider.js +19 -0
  804. package/dist/schema/Divider.js.map +1 -0
  805. package/dist/schema/Element.d.ts +150 -0
  806. package/dist/schema/Element.d.ts.map +1 -0
  807. package/dist/schema/Element.js +124 -0
  808. package/dist/schema/Element.js.map +1 -0
  809. package/dist/schema/EmptyState.d.ts +48 -0
  810. package/dist/schema/EmptyState.d.ts.map +1 -0
  811. package/dist/schema/EmptyState.js +57 -0
  812. package/dist/schema/EmptyState.js.map +1 -0
  813. package/dist/schema/Fieldset.d.ts +25 -0
  814. package/dist/schema/Fieldset.d.ts.map +1 -0
  815. package/dist/schema/Fieldset.js +39 -0
  816. package/dist/schema/Fieldset.js.map +1 -0
  817. package/dist/schema/Grid.d.ts +23 -0
  818. package/dist/schema/Grid.d.ts.map +1 -0
  819. package/dist/schema/Grid.js +36 -0
  820. package/dist/schema/Grid.js.map +1 -0
  821. package/dist/schema/Group.d.ts +19 -0
  822. package/dist/schema/Group.d.ts.map +1 -0
  823. package/dist/schema/Group.js +26 -0
  824. package/dist/schema/Group.js.map +1 -0
  825. package/dist/schema/Heading.d.ts +25 -0
  826. package/dist/schema/Heading.d.ts.map +1 -0
  827. package/dist/schema/Heading.js +34 -0
  828. package/dist/schema/Heading.js.map +1 -0
  829. package/dist/schema/Html.d.ts +48 -0
  830. package/dist/schema/Html.d.ts.map +1 -0
  831. package/dist/schema/Html.js +60 -0
  832. package/dist/schema/Html.js.map +1 -0
  833. package/dist/schema/Icon.d.ts +34 -0
  834. package/dist/schema/Icon.d.ts.map +1 -0
  835. package/dist/schema/Icon.js +40 -0
  836. package/dist/schema/Icon.js.map +1 -0
  837. package/dist/schema/Image.d.ts +38 -0
  838. package/dist/schema/Image.d.ts.map +1 -0
  839. package/dist/schema/Image.js +48 -0
  840. package/dist/schema/Image.js.map +1 -0
  841. package/dist/schema/LinkTag.d.ts +48 -0
  842. package/dist/schema/LinkTag.d.ts.map +1 -0
  843. package/dist/schema/LinkTag.js +16 -0
  844. package/dist/schema/LinkTag.js.map +1 -0
  845. package/dist/schema/Markdown.d.ts +57 -0
  846. package/dist/schema/Markdown.d.ts.map +1 -0
  847. package/dist/schema/Markdown.js +75 -0
  848. package/dist/schema/Markdown.js.map +1 -0
  849. package/dist/schema/MetaTag.d.ts +41 -0
  850. package/dist/schema/MetaTag.d.ts.map +1 -0
  851. package/dist/schema/MetaTag.js +16 -0
  852. package/dist/schema/MetaTag.js.map +1 -0
  853. package/dist/schema/RelationTabs.d.ts +50 -0
  854. package/dist/schema/RelationTabs.d.ts.map +1 -0
  855. package/dist/schema/RelationTabs.js +48 -0
  856. package/dist/schema/RelationTabs.js.map +1 -0
  857. package/dist/schema/ScriptTag.d.ts +63 -0
  858. package/dist/schema/ScriptTag.d.ts.map +1 -0
  859. package/dist/schema/ScriptTag.js +16 -0
  860. package/dist/schema/ScriptTag.js.map +1 -0
  861. package/dist/schema/Section.d.ts +93 -0
  862. package/dist/schema/Section.d.ts.map +1 -0
  863. package/dist/schema/Section.js +127 -0
  864. package/dist/schema/Section.js.map +1 -0
  865. package/dist/schema/ServerDataElement.d.ts +101 -0
  866. package/dist/schema/ServerDataElement.d.ts.map +1 -0
  867. package/dist/schema/ServerDataElement.js +135 -0
  868. package/dist/schema/ServerDataElement.js.map +1 -0
  869. package/dist/schema/Split.d.ts +31 -0
  870. package/dist/schema/Split.d.ts.map +1 -0
  871. package/dist/schema/Split.js +41 -0
  872. package/dist/schema/Split.js.map +1 -0
  873. package/dist/schema/Stat.d.ts +92 -0
  874. package/dist/schema/Stat.d.ts.map +1 -0
  875. package/dist/schema/Stat.js +116 -0
  876. package/dist/schema/Stat.js.map +1 -0
  877. package/dist/schema/StatsOverview.d.ts +76 -0
  878. package/dist/schema/StatsOverview.d.ts.map +1 -0
  879. package/dist/schema/StatsOverview.js +71 -0
  880. package/dist/schema/StatsOverview.js.map +1 -0
  881. package/dist/schema/StyleTag.d.ts +32 -0
  882. package/dist/schema/StyleTag.d.ts.map +1 -0
  883. package/dist/schema/StyleTag.js +38 -0
  884. package/dist/schema/StyleTag.js.map +1 -0
  885. package/dist/schema/TableWidget.d.ts +148 -0
  886. package/dist/schema/TableWidget.d.ts.map +1 -0
  887. package/dist/schema/TableWidget.js +190 -0
  888. package/dist/schema/TableWidget.js.map +1 -0
  889. package/dist/schema/Tabs.d.ts +40 -0
  890. package/dist/schema/Tabs.d.ts.map +1 -0
  891. package/dist/schema/Tabs.js +66 -0
  892. package/dist/schema/Tabs.js.map +1 -0
  893. package/dist/schema/Text.d.ts +33 -0
  894. package/dist/schema/Text.d.ts.map +1 -0
  895. package/dist/schema/Text.js +40 -0
  896. package/dist/schema/Text.js.map +1 -0
  897. package/dist/schema/UnorderedList.d.ts +36 -0
  898. package/dist/schema/UnorderedList.d.ts.map +1 -0
  899. package/dist/schema/UnorderedList.js +42 -0
  900. package/dist/schema/UnorderedList.js.map +1 -0
  901. package/dist/schema/View.d.ts +81 -0
  902. package/dist/schema/View.d.ts.map +1 -0
  903. package/dist/schema/View.js +81 -0
  904. package/dist/schema/View.js.map +1 -0
  905. package/dist/schema/Wizard.d.ts +67 -0
  906. package/dist/schema/Wizard.d.ts.map +1 -0
  907. package/dist/schema/Wizard.js +94 -0
  908. package/dist/schema/Wizard.js.map +1 -0
  909. package/dist/schema/index.d.ts +26 -0
  910. package/dist/schema/index.d.ts.map +1 -0
  911. package/dist/schema/index.js +26 -0
  912. package/dist/schema/index.js.map +1 -0
  913. package/dist/schema/resolveSchema.d.ts +122 -0
  914. package/dist/schema/resolveSchema.d.ts.map +1 -0
  915. package/dist/schema/resolveSchema.js +648 -0
  916. package/dist/schema/resolveSchema.js.map +1 -0
  917. package/dist/schema/sanitize.d.ts +21 -0
  918. package/dist/schema/sanitize.d.ts.map +1 -0
  919. package/dist/schema/sanitize.js +46 -0
  920. package/dist/schema/sanitize.js.map +1 -0
  921. package/dist/search.d.ts +53 -0
  922. package/dist/search.d.ts.map +1 -0
  923. package/dist/search.js +114 -0
  924. package/dist/search.js.map +1 -0
  925. package/dist/sessionFilters.d.ts +8 -0
  926. package/dist/sessionFilters.d.ts.map +1 -0
  927. package/dist/sessionFilters.js +115 -0
  928. package/dist/sessionFilters.js.map +1 -0
  929. package/dist/summarizers/Summarizer.d.ts +65 -0
  930. package/dist/summarizers/Summarizer.d.ts.map +1 -0
  931. package/dist/summarizers/Summarizer.js +98 -0
  932. package/dist/summarizers/Summarizer.js.map +1 -0
  933. package/dist/summarizers/index.d.ts +2 -0
  934. package/dist/summarizers/index.d.ts.map +1 -0
  935. package/dist/summarizers/index.js +2 -0
  936. package/dist/summarizers/index.js.map +1 -0
  937. package/dist/theme/base-colors.d.ts +3 -0
  938. package/dist/theme/base-colors.d.ts.map +1 -0
  939. package/dist/theme/base-colors.js +64 -0
  940. package/dist/theme/base-colors.js.map +1 -0
  941. package/dist/theme/chart-colors.d.ts +3 -0
  942. package/dist/theme/chart-colors.d.ts.map +1 -0
  943. package/dist/theme/chart-colors.js +46 -0
  944. package/dist/theme/chart-colors.js.map +1 -0
  945. package/dist/theme/colors.d.ts +56 -0
  946. package/dist/theme/colors.d.ts.map +1 -0
  947. package/dist/theme/colors.js +410 -0
  948. package/dist/theme/colors.js.map +1 -0
  949. package/dist/theme/generate-css.d.ts +9 -0
  950. package/dist/theme/generate-css.d.ts.map +1 -0
  951. package/dist/theme/generate-css.js +36 -0
  952. package/dist/theme/generate-css.js.map +1 -0
  953. package/dist/theme/generate-scale.d.ts +3 -0
  954. package/dist/theme/generate-scale.d.ts.map +1 -0
  955. package/dist/theme/generate-scale.js +89 -0
  956. package/dist/theme/generate-scale.js.map +1 -0
  957. package/dist/theme/icon-map.d.ts +9 -0
  958. package/dist/theme/icon-map.d.ts.map +1 -0
  959. package/dist/theme/icon-map.js +40 -0
  960. package/dist/theme/icon-map.js.map +1 -0
  961. package/dist/theme/index.d.ts +15 -0
  962. package/dist/theme/index.d.ts.map +1 -0
  963. package/dist/theme/index.js +13 -0
  964. package/dist/theme/index.js.map +1 -0
  965. package/dist/theme/migrate.d.ts +14 -0
  966. package/dist/theme/migrate.d.ts.map +1 -0
  967. package/dist/theme/migrate.js +79 -0
  968. package/dist/theme/migrate.js.map +1 -0
  969. package/dist/theme/presets.d.ts +30 -0
  970. package/dist/theme/presets.d.ts.map +1 -0
  971. package/dist/theme/presets.js +128 -0
  972. package/dist/theme/presets.js.map +1 -0
  973. package/dist/theme/radius.d.ts +11 -0
  974. package/dist/theme/radius.d.ts.map +1 -0
  975. package/dist/theme/radius.js +17 -0
  976. package/dist/theme/radius.js.map +1 -0
  977. package/dist/theme/resolve.d.ts +13 -0
  978. package/dist/theme/resolve.d.ts.map +1 -0
  979. package/dist/theme/resolve.js +91 -0
  980. package/dist/theme/resolve.js.map +1 -0
  981. package/dist/theme/spacing.d.ts +14 -0
  982. package/dist/theme/spacing.d.ts.map +1 -0
  983. package/dist/theme/spacing.js +17 -0
  984. package/dist/theme/spacing.js.map +1 -0
  985. package/dist/theme/theme-colors.d.ts +9 -0
  986. package/dist/theme/theme-colors.d.ts.map +1 -0
  987. package/dist/theme/theme-colors.js +84 -0
  988. package/dist/theme/theme-colors.js.map +1 -0
  989. package/dist/theme/types.d.ts +94 -0
  990. package/dist/theme/types.d.ts.map +1 -0
  991. package/dist/theme/types.js +2 -0
  992. package/dist/theme/types.js.map +1 -0
  993. package/dist/uploads/UploadAdapter.d.ts +34 -0
  994. package/dist/uploads/UploadAdapter.d.ts.map +1 -0
  995. package/dist/uploads/UploadAdapter.js +2 -0
  996. package/dist/uploads/UploadAdapter.js.map +1 -0
  997. package/dist/uploads/index.d.ts +3 -0
  998. package/dist/uploads/index.d.ts.map +1 -0
  999. package/dist/uploads/index.js +2 -0
  1000. package/dist/uploads/index.js.map +1 -0
  1001. package/dist/uploads/localUpload.d.ts +25 -0
  1002. package/dist/uploads/localUpload.d.ts.map +1 -0
  1003. package/dist/uploads/localUpload.js +65 -0
  1004. package/dist/uploads/localUpload.js.map +1 -0
  1005. package/dist/validation/Validator.d.ts +40 -0
  1006. package/dist/validation/Validator.d.ts.map +1 -0
  1007. package/dist/validation/Validator.js +25 -0
  1008. package/dist/validation/Validator.js.map +1 -0
  1009. package/dist/validation/index.d.ts +5 -0
  1010. package/dist/validation/index.d.ts.map +1 -0
  1011. package/dist/validation/index.js +5 -0
  1012. package/dist/validation/index.js.map +1 -0
  1013. package/dist/validation/rules.d.ts +9 -0
  1014. package/dist/validation/rules.d.ts.map +1 -0
  1015. package/dist/validation/rules.js +61 -0
  1016. package/dist/validation/rules.js.map +1 -0
  1017. package/dist/validation/runValidators.d.ts +30 -0
  1018. package/dist/validation/runValidators.d.ts.map +1 -0
  1019. package/dist/validation/runValidators.js +438 -0
  1020. package/dist/validation/runValidators.js.map +1 -0
  1021. package/dist/validation/uniqueValidator.d.ts +61 -0
  1022. package/dist/validation/uniqueValidator.d.ts.map +1 -0
  1023. package/dist/validation/uniqueValidator.js +80 -0
  1024. package/dist/validation/uniqueValidator.js.map +1 -0
  1025. package/dist/vite.d.ts +19 -0
  1026. package/dist/vite.d.ts.map +1 -0
  1027. package/dist/vite.js +696 -0
  1028. package/dist/vite.js.map +1 -0
  1029. package/dist/widgets/index.d.ts +2 -0
  1030. package/dist/widgets/index.d.ts.map +1 -0
  1031. package/dist/widgets/index.js +7 -0
  1032. package/dist/widgets/index.js.map +1 -0
  1033. package/dist/widgets/registry.d.ts +32 -0
  1034. package/dist/widgets/registry.d.ts.map +1 -0
  1035. package/dist/widgets/registry.js +17 -0
  1036. package/dist/widgets/registry.js.map +1 -0
  1037. package/package.json +101 -0
  1038. package/src/Cluster.test.ts +283 -0
  1039. package/src/Cluster.ts +83 -0
  1040. package/src/Column.test.ts +140 -0
  1041. package/src/Column.ts +612 -0
  1042. package/src/Global.test.ts +367 -0
  1043. package/src/Global.ts +169 -0
  1044. package/src/Page.test.ts +50 -0
  1045. package/src/Page.ts +139 -0
  1046. package/src/Pilotiq.test.ts +47 -0
  1047. package/src/Pilotiq.ts +705 -0
  1048. package/src/PilotiqRegistry.ts +36 -0
  1049. package/src/PilotiqServiceProvider.ts +69 -0
  1050. package/src/RelationManager.test.ts +400 -0
  1051. package/src/RelationManager.ts +527 -0
  1052. package/src/RenderHook.test.ts +252 -0
  1053. package/src/RenderHook.ts +226 -0
  1054. package/src/Resource.test.ts +240 -0
  1055. package/src/Resource.ts +439 -0
  1056. package/src/RightPanel.test.ts +202 -0
  1057. package/src/RightPanel.ts +132 -0
  1058. package/src/Tab.test.ts +91 -0
  1059. package/src/Tab.ts +156 -0
  1060. package/src/UserMenuItem.ts +145 -0
  1061. package/src/actions/Action.test.ts +2479 -0
  1062. package/src/actions/Action.ts +2124 -0
  1063. package/src/actions/ActionGroup.test.ts +112 -0
  1064. package/src/actions/ActionGroup.ts +173 -0
  1065. package/src/actions/attachFactory.ts +172 -0
  1066. package/src/actions/exportFactory.ts +215 -0
  1067. package/src/actions/importFactory.ts +222 -0
  1068. package/src/actions/index.ts +17 -0
  1069. package/src/applyPageHooks.test.ts +298 -0
  1070. package/src/applyPageHooks.ts +242 -0
  1071. package/src/authorization.test.ts +483 -0
  1072. package/src/breadcrumbs.test.ts +238 -0
  1073. package/src/cells/coerce.test.ts +85 -0
  1074. package/src/cells/coerce.ts +84 -0
  1075. package/src/clusterPaths.ts +35 -0
  1076. package/src/columns/BadgeColumn.test.ts +54 -0
  1077. package/src/columns/BadgeColumn.ts +32 -0
  1078. package/src/columns/BooleanColumn.test.ts +41 -0
  1079. package/src/columns/BooleanColumn.ts +18 -0
  1080. package/src/columns/ColorColumn.test.ts +37 -0
  1081. package/src/columns/ColorColumn.ts +38 -0
  1082. package/src/columns/IconColumn.test.ts +54 -0
  1083. package/src/columns/IconColumn.ts +37 -0
  1084. package/src/columns/ImageColumn.test.ts +41 -0
  1085. package/src/columns/ImageColumn.ts +28 -0
  1086. package/src/columns/SelectColumn.ts +60 -0
  1087. package/src/columns/TextColumn.test.ts +190 -0
  1088. package/src/columns/TextColumn.ts +20 -0
  1089. package/src/columns/TextInputColumn.ts +68 -0
  1090. package/src/columns/ToggleColumn.ts +46 -0
  1091. package/src/columns/editableColumns.test.ts +193 -0
  1092. package/src/columns/index.ts +9 -0
  1093. package/src/defaultGlobalPages.ts +95 -0
  1094. package/src/defaultPages.test.ts +634 -0
  1095. package/src/defaultPages.ts +614 -0
  1096. package/src/defaultViewPage.test.ts +147 -0
  1097. package/src/elements/Form.test.ts +223 -0
  1098. package/src/elements/Form.ts +397 -0
  1099. package/src/elements/ListTabs.ts +28 -0
  1100. package/src/elements/Table.test.ts +422 -0
  1101. package/src/elements/Table.ts +816 -0
  1102. package/src/elements/TableGroup.test.ts +149 -0
  1103. package/src/elements/TableGroup.ts +199 -0
  1104. package/src/elements/dispatchAction.test.ts +463 -0
  1105. package/src/elements/dispatchAction.ts +355 -0
  1106. package/src/elements/dispatchForm.test.ts +455 -0
  1107. package/src/elements/dispatchForm.ts +1855 -0
  1108. package/src/elements/dispatchTable.test.ts +1247 -0
  1109. package/src/elements/dispatchTable.ts +666 -0
  1110. package/src/elements/index.ts +21 -0
  1111. package/src/entries/BadgeEntry.ts +39 -0
  1112. package/src/entries/CodeEntry.test.ts +40 -0
  1113. package/src/entries/CodeEntry.ts +52 -0
  1114. package/src/entries/ColorEntry.ts +63 -0
  1115. package/src/entries/ComponentEntry.test.ts +173 -0
  1116. package/src/entries/ComponentEntry.ts +95 -0
  1117. package/src/entries/Entry.ts +304 -0
  1118. package/src/entries/IconEntry.ts +49 -0
  1119. package/src/entries/ImageEntry.ts +61 -0
  1120. package/src/entries/KeyValueEntry.ts +47 -0
  1121. package/src/entries/RepeatableEntry.test.ts +239 -0
  1122. package/src/entries/RepeatableEntry.ts +173 -0
  1123. package/src/entries/TextEntry.test.ts +394 -0
  1124. package/src/entries/TextEntry.ts +60 -0
  1125. package/src/entries/index.ts +12 -0
  1126. package/src/entries/leaves.test.ts +306 -0
  1127. package/src/entries/registry.ts +54 -0
  1128. package/src/fields/BuilderField.test.ts +1188 -0
  1129. package/src/fields/BuilderField.ts +568 -0
  1130. package/src/fields/BuilderRelationship.test.ts +811 -0
  1131. package/src/fields/CheckboxField.test.ts +44 -0
  1132. package/src/fields/CheckboxField.ts +27 -0
  1133. package/src/fields/CheckboxListField.test.ts +99 -0
  1134. package/src/fields/CheckboxListField.ts +66 -0
  1135. package/src/fields/ColorPickerField.test.ts +33 -0
  1136. package/src/fields/ColorPickerField.ts +25 -0
  1137. package/src/fields/DateField.ts +54 -0
  1138. package/src/fields/DateTimeField.test.ts +55 -0
  1139. package/src/fields/EmailField.ts +16 -0
  1140. package/src/fields/Field.test.ts +639 -0
  1141. package/src/fields/Field.ts +773 -0
  1142. package/src/fields/FileUploadField.test.ts +97 -0
  1143. package/src/fields/FileUploadField.ts +71 -0
  1144. package/src/fields/HiddenField.test.ts +27 -0
  1145. package/src/fields/HiddenField.ts +28 -0
  1146. package/src/fields/KeyValueField.test.ts +105 -0
  1147. package/src/fields/KeyValueField.ts +55 -0
  1148. package/src/fields/MarkdownField.test.ts +167 -0
  1149. package/src/fields/MarkdownField.ts +151 -0
  1150. package/src/fields/NumberField.ts +33 -0
  1151. package/src/fields/RadioField.test.ts +94 -0
  1152. package/src/fields/RadioField.ts +67 -0
  1153. package/src/fields/RepeaterField.test.ts +1806 -0
  1154. package/src/fields/RepeaterField.ts +791 -0
  1155. package/src/fields/RepeaterRelationship.test.ts +1630 -0
  1156. package/src/fields/RepeaterSimple.test.ts +248 -0
  1157. package/src/fields/RowButton.test.ts +149 -0
  1158. package/src/fields/RowButton.ts +125 -0
  1159. package/src/fields/SelectField.test.ts +192 -0
  1160. package/src/fields/SelectField.ts +235 -0
  1161. package/src/fields/SliderField.test.ts +50 -0
  1162. package/src/fields/SliderField.ts +53 -0
  1163. package/src/fields/SlugField.ts +24 -0
  1164. package/src/fields/TagsInputField.test.ts +154 -0
  1165. package/src/fields/TagsInputField.ts +133 -0
  1166. package/src/fields/TextField.ts +24 -0
  1167. package/src/fields/TextareaField.test.ts +58 -0
  1168. package/src/fields/TextareaField.ts +59 -0
  1169. package/src/fields/ToggleButtonsField.test.ts +106 -0
  1170. package/src/fields/ToggleButtonsField.ts +59 -0
  1171. package/src/fields/ToggleField.ts +16 -0
  1172. package/src/fields/disableOptionsWhenSelectedInSiblingRepeaterItems.test.ts +319 -0
  1173. package/src/fields/optionsResolver.ts +95 -0
  1174. package/src/fields/resolveField.ts +28 -0
  1175. package/src/filters/BooleanFilter.ts +35 -0
  1176. package/src/filters/DateRangeFilter.test.ts +194 -0
  1177. package/src/filters/DateRangeFilter.ts +148 -0
  1178. package/src/filters/Filter.test.ts +268 -0
  1179. package/src/filters/Filter.ts +184 -0
  1180. package/src/filters/FormFilter.test.ts +238 -0
  1181. package/src/filters/FormFilter.ts +215 -0
  1182. package/src/filters/MultiSelectFilter.test.ts +119 -0
  1183. package/src/filters/MultiSelectFilter.ts +78 -0
  1184. package/src/filters/QueryBuilderFilter.test.ts +644 -0
  1185. package/src/filters/QueryBuilderFilter.ts +398 -0
  1186. package/src/filters/SelectFilter.ts +46 -0
  1187. package/src/filters/TernaryFilter.test.ts +160 -0
  1188. package/src/filters/TernaryFilter.ts +72 -0
  1189. package/src/filters/TrashedFilter.test.ts +149 -0
  1190. package/src/filters/TrashedFilter.ts +55 -0
  1191. package/src/filters/queryBuilder/BooleanConstraint.ts +31 -0
  1192. package/src/filters/queryBuilder/Constraint.ts +115 -0
  1193. package/src/filters/queryBuilder/DateConstraint.ts +69 -0
  1194. package/src/filters/queryBuilder/NumberConstraint.ts +66 -0
  1195. package/src/filters/queryBuilder/SelectConstraint.ts +72 -0
  1196. package/src/filters/queryBuilder/TextConstraint.ts +65 -0
  1197. package/src/filters/queryBuilder/index.ts +12 -0
  1198. package/src/icons/index.ts +2 -0
  1199. package/src/icons/lucide.ts +204 -0
  1200. package/src/icons/registry.test.ts +56 -0
  1201. package/src/icons/registry.ts +41 -0
  1202. package/src/icons/types.ts +47 -0
  1203. package/src/index.ts +521 -0
  1204. package/src/io/csv.test.ts +142 -0
  1205. package/src/io/csv.ts +170 -0
  1206. package/src/nestedRelationManagerData.test.ts +526 -0
  1207. package/src/notifications/Notification.test.ts +210 -0
  1208. package/src/notifications/Notification.ts +354 -0
  1209. package/src/notifications/broadcast.test.ts +110 -0
  1210. package/src/notifications/broadcast.ts +95 -0
  1211. package/src/notifications/database.test.ts +383 -0
  1212. package/src/notifications/database.ts +398 -0
  1213. package/src/notifications/databaseNotifications.test.ts +187 -0
  1214. package/src/notifications/dispatchNotificationAction.test.ts +341 -0
  1215. package/src/notifications/dispatchNotificationAction.ts +142 -0
  1216. package/src/notifications/flash.test.ts +89 -0
  1217. package/src/notifications/flash.ts +71 -0
  1218. package/src/notifications/index.ts +45 -0
  1219. package/src/notifications/registerBroadcastAuth.test.ts +134 -0
  1220. package/src/notifications/registerBroadcastAuth.ts +100 -0
  1221. package/src/notifications/resolveSavedNotification.test.ts +82 -0
  1222. package/src/notifications/resolveSavedNotification.ts +59 -0
  1223. package/src/notifications/types.ts +93 -0
  1224. package/src/orm/m2mAccessor.ts +66 -0
  1225. package/src/orm/modelDefaults.test.ts +633 -0
  1226. package/src/orm/modelDefaults.ts +632 -0
  1227. package/src/pageData.test.ts +1121 -0
  1228. package/src/pageData.ts +4662 -0
  1229. package/src/plugins/index.ts +1 -0
  1230. package/src/plugins/themeEditor.ts +24 -0
  1231. package/src/react/AppShell.tsx +148 -0
  1232. package/src/react/CommandPalette.tsx +375 -0
  1233. package/src/react/FormStateContext.tsx +398 -0
  1234. package/src/react/HeadHooks.tsx +126 -0
  1235. package/src/react/NotificationActionStrip.tsx +263 -0
  1236. package/src/react/NotificationBell.tsx +426 -0
  1237. package/src/react/RenderHookSlot.tsx +32 -0
  1238. package/src/react/RightSidebar.tsx +257 -0
  1239. package/src/react/RightSidebarContext.tsx +211 -0
  1240. package/src/react/RightSidebarTrigger.tsx +53 -0
  1241. package/src/react/SchemaRenderer.tsx +6128 -0
  1242. package/src/react/SearchTrigger.tsx +46 -0
  1243. package/src/react/ThemeProvider.tsx +93 -0
  1244. package/src/react/ThemeSettingsPage.tsx +579 -0
  1245. package/src/react/ThemeToggle.tsx +20 -0
  1246. package/src/react/Toaster.tsx +158 -0
  1247. package/src/react/UserMenu.tsx +196 -0
  1248. package/src/react/WidgetDataContext.tsx +157 -0
  1249. package/src/react/cells/EditableCell.tsx +376 -0
  1250. package/src/react/fieldJsHandler.test.ts +166 -0
  1251. package/src/react/fieldJsHandler.ts +79 -0
  1252. package/src/react/fields/BuilderInput.tsx +995 -0
  1253. package/src/react/fields/CheckboxInput.tsx +39 -0
  1254. package/src/react/fields/CheckboxListInput.tsx +81 -0
  1255. package/src/react/fields/ColorInput.tsx +51 -0
  1256. package/src/react/fields/DateFieldInput.tsx +70 -0
  1257. package/src/react/fields/DateTimeInput.tsx +42 -0
  1258. package/src/react/fields/FieldShell.tsx +107 -0
  1259. package/src/react/fields/FileUploadInput.tsx +189 -0
  1260. package/src/react/fields/HiddenInput.tsx +17 -0
  1261. package/src/react/fields/KeyValueInput.tsx +200 -0
  1262. package/src/react/fields/MarkdownInput.tsx +333 -0
  1263. package/src/react/fields/RadioInput.tsx +60 -0
  1264. package/src/react/fields/RepeaterInput.test.ts +116 -0
  1265. package/src/react/fields/RepeaterInput.tsx +1313 -0
  1266. package/src/react/fields/SelectFieldInput.tsx +257 -0
  1267. package/src/react/fields/SliderInput.tsx +63 -0
  1268. package/src/react/fields/TagsInput.tsx +265 -0
  1269. package/src/react/fields/TextLikeInput.tsx +54 -0
  1270. package/src/react/fields/ToggleButtonsInput.tsx +60 -0
  1271. package/src/react/fields/ToggleFieldInput.tsx +35 -0
  1272. package/src/react/fields/rowChromeButton.tsx +225 -0
  1273. package/src/react/fields/syncRowGates.test.ts +202 -0
  1274. package/src/react/fields/syncRowGates.ts +66 -0
  1275. package/src/react/formStateHelpers.test.ts +295 -0
  1276. package/src/react/formStateHelpers.ts +218 -0
  1277. package/src/react/hooks/use-mobile.ts +19 -0
  1278. package/src/react/icon-context.tsx +60 -0
  1279. package/src/react/index.ts +85 -0
  1280. package/src/react/layouts/SidebarLayout.tsx +239 -0
  1281. package/src/react/layouts/TopbarLayout.tsx +245 -0
  1282. package/src/react/navigate.tsx +37 -0
  1283. package/src/react/registry.ts +48 -0
  1284. package/src/react/right-panel-registry.tsx +47 -0
  1285. package/src/react/theme-preview/apply.ts +99 -0
  1286. package/src/react/theme-preview/build-html.ts +436 -0
  1287. package/src/react/ui/button.tsx +51 -0
  1288. package/src/react/ui/calendar.tsx +67 -0
  1289. package/src/react/ui/checkbox.tsx +29 -0
  1290. package/src/react/ui/dialog.tsx +108 -0
  1291. package/src/react/ui/dropdown-menu.tsx +97 -0
  1292. package/src/react/ui/input.tsx +20 -0
  1293. package/src/react/ui/label.tsx +21 -0
  1294. package/src/react/ui/popover.tsx +50 -0
  1295. package/src/react/ui/select.tsx +169 -0
  1296. package/src/react/ui/separator.tsx +25 -0
  1297. package/src/react/ui/sheet.tsx +136 -0
  1298. package/src/react/ui/sidebar.tsx +723 -0
  1299. package/src/react/ui/skeleton.tsx +13 -0
  1300. package/src/react/ui/slider.tsx +34 -0
  1301. package/src/react/ui/switch.tsx +28 -0
  1302. package/src/react/ui/table.tsx +105 -0
  1303. package/src/react/ui/tabs.tsx +63 -0
  1304. package/src/react/ui/textarea.tsx +18 -0
  1305. package/src/react/ui/tooltip.tsx +64 -0
  1306. package/src/react/useResizableWidth.ts +139 -0
  1307. package/src/react/utils.ts +6 -0
  1308. package/src/react/widgetRegistry.test.ts +43 -0
  1309. package/src/react/widgetRegistry.ts +50 -0
  1310. package/src/react/widgets/StatsOverviewRenderer.tsx +232 -0
  1311. package/src/react/widgets/TableWidgetRenderer.tsx +231 -0
  1312. package/src/react/widgets/ViewRenderer.tsx +71 -0
  1313. package/src/relationManagerData.test.ts +1146 -0
  1314. package/src/richtext/index.ts +8 -0
  1315. package/src/richtext/registry.ts +89 -0
  1316. package/src/routes-nested-relations.test.ts +676 -0
  1317. package/src/routes-relations.test.ts +972 -0
  1318. package/src/routes.test.ts +1886 -0
  1319. package/src/routes.ts +3262 -0
  1320. package/src/schema/Alert.test.ts +63 -0
  1321. package/src/schema/Alert.ts +49 -0
  1322. package/src/schema/Block.ts +169 -0
  1323. package/src/schema/Breadcrumbs.ts +40 -0
  1324. package/src/schema/Card.ts +35 -0
  1325. package/src/schema/Divider.ts +20 -0
  1326. package/src/schema/Element.ts +219 -0
  1327. package/src/schema/EmptyState.test.ts +37 -0
  1328. package/src/schema/EmptyState.ts +63 -0
  1329. package/src/schema/Fieldset.ts +43 -0
  1330. package/src/schema/Grid.ts +43 -0
  1331. package/src/schema/Group.ts +30 -0
  1332. package/src/schema/Heading.ts +39 -0
  1333. package/src/schema/Html.ts +67 -0
  1334. package/src/schema/Icon.ts +54 -0
  1335. package/src/schema/Image.ts +57 -0
  1336. package/src/schema/LinkTag.ts +41 -0
  1337. package/src/schema/Markdown.ts +85 -0
  1338. package/src/schema/MetaTag.ts +41 -0
  1339. package/src/schema/RelationTabs.ts +71 -0
  1340. package/src/schema/ScriptTag.ts +55 -0
  1341. package/src/schema/Section.ts +143 -0
  1342. package/src/schema/ServerDataElement.test.ts +140 -0
  1343. package/src/schema/ServerDataElement.ts +156 -0
  1344. package/src/schema/Split.ts +50 -0
  1345. package/src/schema/Stat.test.ts +118 -0
  1346. package/src/schema/Stat.ts +154 -0
  1347. package/src/schema/StatsOverview.test.ts +141 -0
  1348. package/src/schema/StatsOverview.ts +119 -0
  1349. package/src/schema/StyleTag.ts +35 -0
  1350. package/src/schema/TableWidget.test.ts +297 -0
  1351. package/src/schema/TableWidget.ts +289 -0
  1352. package/src/schema/Tabs.ts +79 -0
  1353. package/src/schema/Text.ts +58 -0
  1354. package/src/schema/UnorderedList.ts +49 -0
  1355. package/src/schema/View.test.ts +111 -0
  1356. package/src/schema/View.ts +127 -0
  1357. package/src/schema/Wizard.ts +108 -0
  1358. package/src/schema/containers.test.ts +446 -0
  1359. package/src/schema/headTags.test.ts +134 -0
  1360. package/src/schema/index.ts +39 -0
  1361. package/src/schema/primes.test.ts +269 -0
  1362. package/src/schema/resolveSchema.test.ts +329 -0
  1363. package/src/schema/resolveSchema.ts +807 -0
  1364. package/src/schema/sanitize.ts +49 -0
  1365. package/src/search.test.ts +446 -0
  1366. package/src/search.ts +178 -0
  1367. package/src/sessionFilters.test.ts +352 -0
  1368. package/src/sessionFilters.ts +133 -0
  1369. package/src/summarizers/Summarizer.test.ts +84 -0
  1370. package/src/summarizers/Summarizer.ts +123 -0
  1371. package/src/summarizers/index.ts +11 -0
  1372. package/src/theme/base-colors.ts +68 -0
  1373. package/src/theme/chart-colors.ts +50 -0
  1374. package/src/theme/colors.ts +447 -0
  1375. package/src/theme/generate-css.test.ts +139 -0
  1376. package/src/theme/generate-css.ts +44 -0
  1377. package/src/theme/generate-scale.test.ts +106 -0
  1378. package/src/theme/generate-scale.ts +97 -0
  1379. package/src/theme/icon-map.ts +42 -0
  1380. package/src/theme/index.ts +28 -0
  1381. package/src/theme/migrate.ts +81 -0
  1382. package/src/theme/presets.ts +135 -0
  1383. package/src/theme/radius.ts +18 -0
  1384. package/src/theme/resolve.test.ts +238 -0
  1385. package/src/theme/resolve.ts +96 -0
  1386. package/src/theme/spacing.ts +18 -0
  1387. package/src/theme/theme-colors.ts +88 -0
  1388. package/src/theme/types.ts +125 -0
  1389. package/src/uploads/UploadAdapter.ts +35 -0
  1390. package/src/uploads/index.ts +2 -0
  1391. package/src/uploads/localUpload.test.ts +70 -0
  1392. package/src/uploads/localUpload.ts +84 -0
  1393. package/src/validation/Validator.ts +49 -0
  1394. package/src/validation/index.ts +28 -0
  1395. package/src/validation/rules.ts +78 -0
  1396. package/src/validation/runValidators.ts +435 -0
  1397. package/src/validation/uniqueValidator.test.ts +196 -0
  1398. package/src/validation/uniqueValidator.ts +133 -0
  1399. package/src/validation/validators.test.ts +268 -0
  1400. package/src/vite.ts +758 -0
  1401. package/src/widgets/index.ts +10 -0
  1402. package/src/widgets/registry.ts +45 -0
  1403. package/src/widgets.test.ts +592 -0
  1404. package/tsconfig.build.json +11 -0
  1405. package/tsconfig.json +4 -0
  1406. package/tsconfig.test.json +10 -0
  1407. package/views/react/Dashboard.tsx +27 -0
  1408. package/views/react/Resources/Form.tsx +102 -0
  1409. package/views/react/Resources/Index.tsx +49 -0
@@ -0,0 +1,1121 @@
1
+ import { describe, it } from 'node:test'
2
+ import assert from 'node:assert/strict'
3
+
4
+ import { Form } from './elements/Form.js'
5
+ import { ListTab } from './Tab.js'
6
+ import { ListTabs } from './elements/ListTabs.js'
7
+ import {
8
+ applyFillPipeline,
9
+ formCreateOptionData,
10
+ formStateData,
11
+ mentionResolveData,
12
+ panelInfo,
13
+ resolveActiveTab,
14
+ tagFormStateUrls,
15
+ tagRichTextMentionUrls,
16
+ tagSelectCreateOptionUrls,
17
+ tagTableReorderUrls,
18
+ tagCellEditUrls,
19
+ } from './pageData.js'
20
+ import { Element } from './schema/Element.js'
21
+ import { Table } from './elements/Table.js'
22
+ import { Column } from './Column.js'
23
+ import { TextInputColumn, ToggleColumn } from './columns/index.js'
24
+ import { Pilotiq } from './Pilotiq.js'
25
+ import { Resource } from './Resource.js'
26
+ import { Global } from './Global.js'
27
+ import { Page } from './Page.js'
28
+ import { TextField } from './fields/TextField.js'
29
+ import { SelectField } from './fields/SelectField.js'
30
+ import { ToggleField } from './fields/ToggleField.js'
31
+ import { Section } from './schema/Section.js'
32
+ import { Repeater } from './fields/RepeaterField.js'
33
+ import { Builder } from './fields/BuilderField.js'
34
+ import { Block } from './schema/Block.js'
35
+
36
+ describe('applyFillPipeline', () => {
37
+ it('defaults to a shallow record copy when nothing is configured', async () => {
38
+ const form = Form.make()
39
+ const record = { id: 1, title: 'Hello' }
40
+ const values = await applyFillPipeline(form, record)
41
+ assert.deepEqual(values, { id: 1, title: 'Hello' })
42
+ assert.notEqual(values, record)
43
+ })
44
+
45
+ it('runs mutateFormDataBeforeFill before fillFromRecord', async () => {
46
+ const order: string[] = []
47
+ const form = Form.make<{ id: number; tags: string[] }>()
48
+ .mutateFormDataBeforeFill(v => { order.push('before'); return { ...v, tagsCsv: '' } })
49
+ .fillFromRecord(r => { order.push('fill'); return { id: r.id, tagsCsv: r.tags.join(',') } })
50
+
51
+ const values = await applyFillPipeline(form, { id: 1, tags: ['a', 'b'] })
52
+ assert.deepEqual(order, ['before', 'fill'])
53
+ assert.deepEqual(values, { id: 1, tagsCsv: 'a,b' })
54
+ })
55
+
56
+ it('runs mutateFormDataAfterFill after fillFromRecord', async () => {
57
+ const form = Form.make<{ id: number; title: string }>()
58
+ .fillFromRecord(r => ({ id: r.id, title: r.title }))
59
+ .mutateFormDataAfterFill(v => ({ ...v, title: String(v['title']).toUpperCase() }))
60
+
61
+ const values = await applyFillPipeline(form, { id: 1, title: 'hello' })
62
+ assert.deepEqual(values, { id: 1, title: 'HELLO' })
63
+ })
64
+
65
+ it('passes the loaded record on ctx.record to both mutators', async () => {
66
+ const seen: { before?: unknown; after?: unknown } = {}
67
+ const form = Form.make<{ id: number; secret: string }>()
68
+ .mutateFormDataBeforeFill((v, ctx) => { seen.before = ctx.record; return v })
69
+ .mutateFormDataAfterFill((v, ctx) => { seen.after = ctx.record; return v })
70
+
71
+ const record = { id: 1, secret: 'hidden' }
72
+ await applyFillPipeline(form, record)
73
+ assert.equal(seen.before, record)
74
+ assert.equal(seen.after, record)
75
+ })
76
+
77
+ it('supports async mutators', async () => {
78
+ const form = Form.make<{ id: number }>()
79
+ .mutateFormDataAfterFill(async v => ({ ...v, async: true }))
80
+ const values = await applyFillPipeline(form, { id: 1 })
81
+ assert.deepEqual(values, { id: 1, async: true })
82
+ })
83
+ })
84
+
85
+ describe('resolveActiveTab', () => {
86
+ it('is a no-op when the schema has no ListTabs', async () => {
87
+ // Just shouldn't throw; nothing to assert besides the absence of side effects.
88
+ await resolveActiveTab([Form.make()], {}, '/admin/articles')
89
+ })
90
+
91
+ it('marks the first tab active when ?tab= is absent and no tab is .default()', async () => {
92
+ const all = ListTab.make('all').label('All')
93
+ const drafts = ListTab.make('drafts').label('Drafts')
94
+ const tabs = ListTabs.make().tabs([all, drafts])
95
+
96
+ await resolveActiveTab([tabs], {}, '/admin/articles')
97
+ assert.equal(all.isActive(), true)
98
+ assert.equal(drafts.isActive(), false)
99
+ })
100
+
101
+ it('honors .default() over the first-tab fallback', async () => {
102
+ const all = ListTab.make('all').label('All')
103
+ const drafts = ListTab.make('drafts').label('Drafts').default()
104
+ const tabs = ListTabs.make().tabs([all, drafts])
105
+
106
+ await resolveActiveTab([tabs], {}, '/admin/articles')
107
+ assert.equal(all.isActive(), false)
108
+ assert.equal(drafts.isActive(), true)
109
+ })
110
+
111
+ it('resolves the URL-supplied ?tab=name to the matching tab', async () => {
112
+ const all = ListTab.make('all').default()
113
+ const drafts = ListTab.make('drafts')
114
+ const tabs = ListTabs.make().tabs([all, drafts])
115
+
116
+ await resolveActiveTab([tabs], { tab: 'drafts' }, '/admin/articles')
117
+ assert.equal(all.isActive(), false)
118
+ assert.equal(drafts.isActive(), true)
119
+ })
120
+
121
+ it('falls through to default when ?tab= names a non-existent tab', async () => {
122
+ const all = ListTab.make('all').default()
123
+ const drafts = ListTab.make('drafts')
124
+ const tabs = ListTabs.make().tabs([all, drafts])
125
+
126
+ await resolveActiveTab([tabs], { tab: 'bogus' }, '/admin/articles')
127
+ assert.equal(all.isActive(), true)
128
+ assert.equal(drafts.isActive(), false)
129
+ })
130
+
131
+ it('stamps per-tab URLs that carry forward search/sort/filters but reset page', async () => {
132
+ const all = ListTab.make('all')
133
+ const drafts = ListTab.make('drafts')
134
+ const tabs = ListTabs.make().tabs([all, drafts])
135
+
136
+ await resolveActiveTab(
137
+ [tabs],
138
+ { search: 'hi', sort: 'title:desc', page: '3', status: 'published' },
139
+ '/admin/articles',
140
+ )
141
+
142
+ const allUrl = all.toMeta().url
143
+ const draftsUrl = drafts.toMeta().url
144
+ // Tab name + carry-forward params, no `page`.
145
+ for (const url of [allUrl, draftsUrl]) {
146
+ assert.ok(url.startsWith('/admin/articles?'), `${url} should be absolute under the index path`)
147
+ assert.ok(url.includes('search=hi'), 'search carries forward')
148
+ assert.ok(url.includes('sort=title%3Adesc') || url.includes('sort=title:desc'), 'sort carries forward')
149
+ assert.ok(url.includes('status=published'), 'filter values carry forward')
150
+ assert.ok(!url.includes('page='), 'page resets on tab change')
151
+ }
152
+ // `all` is the implicit default tab (first, none marked `.default()`)
153
+ // — its canonical URL omits `?tab=`. Non-default tabs include it.
154
+ assert.ok(!allUrl.includes('tab='), 'default tab URL omits ?tab=')
155
+ assert.ok(draftsUrl.includes('tab=drafts'), 'non-default tab URL includes ?tab=')
156
+ })
157
+
158
+ it('default tab URL is the bare path when no other params are present', async () => {
159
+ const all = ListTab.make('all')
160
+ const drafts = ListTab.make('drafts')
161
+ const tabs = ListTabs.make().tabs([all, drafts])
162
+
163
+ await resolveActiveTab([tabs], {}, '/admin/articles')
164
+
165
+ // Default tab → no query string at all.
166
+ assert.equal(all.toMeta().url, '/admin/articles')
167
+ // Non-default still names itself.
168
+ assert.equal(drafts.toMeta().url, '/admin/articles?tab=drafts')
169
+ })
170
+
171
+ it('explicitly-marked .default() tab gets the paramless URL even when not first', async () => {
172
+ const all = ListTab.make('all')
173
+ const drafts = ListTab.make('drafts').default()
174
+ const tabs = ListTabs.make().tabs([all, drafts])
175
+
176
+ await resolveActiveTab([tabs], {}, '/admin/articles')
177
+
178
+ assert.equal(drafts.toMeta().url, '/admin/articles', 'marked-default tab → bare path')
179
+ assert.equal(all.toMeta().url, '/admin/articles?tab=all')
180
+ })
181
+
182
+ it('resolves badge handlers in parallel and stamps the result on each tab', async () => {
183
+ const order: string[] = []
184
+ const a = ListTab.make('a').badge(async () => {
185
+ order.push('a-start')
186
+ await new Promise(r => setTimeout(r, 10))
187
+ order.push('a-end')
188
+ return 1
189
+ })
190
+ const b = ListTab.make('b').badge(async () => {
191
+ order.push('b-start')
192
+ await new Promise(r => setTimeout(r, 5))
193
+ order.push('b-end')
194
+ return 2
195
+ })
196
+ const tabs = ListTabs.make().tabs([a, b])
197
+
198
+ await resolveActiveTab([tabs], {}, '/admin/articles')
199
+ assert.equal(a.toMeta().badge, '1')
200
+ assert.equal(b.toMeta().badge, '2')
201
+ // Both started before either finished — confirms Promise.all parallelism.
202
+ assert.equal(order.indexOf('a-start') < order.indexOf('b-end'), true)
203
+ assert.equal(order.indexOf('b-start') < order.indexOf('a-end'), true)
204
+ })
205
+
206
+ it('swallows errors thrown by badge handlers', async () => {
207
+ const broken = ListTab.make('broken').badge(async () => { throw new Error('oops') })
208
+ const tabs = ListTabs.make().tabs([broken])
209
+ await resolveActiveTab([tabs], {}, '/admin/articles')
210
+ // No badge stamped; meta has no `badge` key.
211
+ assert.equal(broken.toMeta().badge, undefined)
212
+ })
213
+
214
+ it('badge handler returning undefined leaves the badge unset', async () => {
215
+ const tab = ListTab.make('drafts').badge(async () => undefined)
216
+ const tabs = ListTabs.make().tabs([tab])
217
+ await resolveActiveTab([tabs], {}, '/admin/articles')
218
+ assert.equal(tab.toMeta().badge, undefined)
219
+ })
220
+
221
+ it('static badge survives unchanged when no handler is set', async () => {
222
+ const tab = ListTab.make('drafts').badge('5')
223
+ const tabs = ListTabs.make().tabs([tab])
224
+ await resolveActiveTab([tabs], {}, '/admin/articles')
225
+ assert.equal(tab.toMeta().badge, '5')
226
+ })
227
+ })
228
+
229
+ describe('panelInfo — icon serialization', () => {
230
+ it('ships string-typed Resource.icon as-is', async () => {
231
+ class StringIconResource extends Resource {
232
+ static override label = 'Things'
233
+ static override icon = 'newspaper'
234
+ }
235
+ const panel = Pilotiq.make('T').path('/admin').resources([StringIconResource])
236
+ const info = await panelInfo(panel)
237
+ const r = info.navigation[0]!
238
+ assert.equal(r.icon, 'newspaper')
239
+ assert.equal(r.name, 'StringIconResource')
240
+ })
241
+
242
+ it('ships component-typed Resource.icon as { class: ownerName }', async () => {
243
+ const FakeIcon = () => null
244
+ class CmpIconResource extends Resource {
245
+ static override label = 'Things'
246
+ static override icon = FakeIcon as unknown as string
247
+ }
248
+ const panel = Pilotiq.make('T').path('/admin').resources([CmpIconResource])
249
+ const info = await panelInfo(panel)
250
+ const r = info.navigation[0]!
251
+ assert.deepEqual(r.icon, { class: 'CmpIconResource' })
252
+ assert.equal(r.name, 'CmpIconResource')
253
+ })
254
+
255
+ it('serializes Global.icon and Page.icon the same way', async () => {
256
+ const FakeIcon = () => null
257
+ class CmpIconGlobal extends Global {
258
+ static override label = 'Settings'
259
+ static override icon = FakeIcon as unknown as string
260
+ }
261
+ const panel = Pilotiq.make('T').path('/admin').globals([CmpIconGlobal])
262
+ const info = await panelInfo(panel)
263
+ assert.deepEqual(info.navigation[0]!.icon, { class: 'CmpIconGlobal' })
264
+ })
265
+ })
266
+
267
+ describe('panelInfo — navigation tree (Plan #9)', () => {
268
+ it('builds a flat tree when no group / sort / parent metadata is set', async () => {
269
+ class Articles extends Resource { static override label = 'Articles' }
270
+ class Users extends Resource { static override label = 'Users' }
271
+ const panel = Pilotiq.make('T').path('/admin').resources([Articles, Users])
272
+ const info = await panelInfo(panel)
273
+ assert.equal(info.navigation.length, 2)
274
+ assert.equal(info.navigation[0]!.name, 'Articles')
275
+ assert.equal(info.navigation[0]!.url, '/admin/articles')
276
+ assert.equal(info.navigation[0]!.group, undefined)
277
+ assert.equal(info.navigation[0]!.children, undefined)
278
+ assert.equal(info.navigation[1]!.name, 'Users')
279
+ })
280
+
281
+ it('uses navigationLabel + navigationIcon when set, otherwise label + icon', async () => {
282
+ const Pencil = () => null
283
+ class Posts extends Resource {
284
+ static override label = 'Articles'
285
+ static override icon = 'newspaper'
286
+ static override navigationLabel = 'Posts'
287
+ static override navigationIcon = Pencil as unknown as string
288
+ }
289
+ const info = await panelInfo(Pilotiq.make('T').path('/admin').resources([Posts]))
290
+ assert.equal(info.navigation[0]!.label, 'Posts')
291
+ assert.deepEqual(info.navigation[0]!.icon, { class: 'Posts' })
292
+ })
293
+
294
+ it('Globals default navigationGroup to "Settings"; explicit null opts out', async () => {
295
+ class Brand extends Global { static override label = 'Brand' }
296
+ class Site extends Global {
297
+ static override label = 'Site'
298
+ static override navigationGroup = null
299
+ }
300
+ const info = await panelInfo(Pilotiq.make('T').path('/admin').globals([Brand, Site]))
301
+ const brand = info.navigation.find(n => n.name === 'Brand')!
302
+ const site = info.navigation.find(n => n.name === 'Site')!
303
+ assert.equal(brand.group, 'Settings')
304
+ assert.equal(site.group, undefined)
305
+ })
306
+
307
+ it('preserves group order based on first appearance in registration', async () => {
308
+ class A extends Resource { static override label = 'A'; static override navigationGroup = 'Beta' }
309
+ class B extends Resource { static override label = 'B'; static override navigationGroup = 'Alpha' }
310
+ class C extends Resource { static override label = 'C'; static override navigationGroup = 'Beta' }
311
+ const info = await panelInfo(Pilotiq.make('T').path('/admin').resources([A, B, C]))
312
+ // Items live flat on the tree carrying `group`; later code groups by it.
313
+ // Order is A (Beta), B (Alpha), C (Beta) — Beta appeared first.
314
+ assert.deepEqual(info.navigation.map(n => n.group), ['Beta', 'Alpha', 'Beta'])
315
+ })
316
+
317
+ it('sorts within siblings by navigationSort (asc), then registration order; sorted before unsorted', async () => {
318
+ class A extends Resource { static override label = 'A'; static override navigationSort = 30 }
319
+ class B extends Resource { static override label = 'B'; static override navigationSort = 10 }
320
+ class C extends Resource { static override label = 'C' /* no sort */ }
321
+ class D extends Resource { static override label = 'D'; static override navigationSort = 20 }
322
+ class E extends Resource { static override label = 'E' /* no sort, comes after C */ }
323
+ const info = await panelInfo(Pilotiq.make('T').path('/admin').resources([A, B, C, D, E]))
324
+ assert.deepEqual(info.navigation.map(n => n.name), ['B', 'D', 'A', 'C', 'E'])
325
+ })
326
+
327
+ it('nests under navigationParentItem (class-name reference)', async () => {
328
+ class Parent extends Resource { static override label = 'Parent' }
329
+ class Child extends Resource {
330
+ static override label = 'Child'
331
+ static override navigationParentItem = 'Parent'
332
+ }
333
+ const info = await panelInfo(Pilotiq.make('T').path('/admin').resources([Parent, Child]))
334
+ assert.equal(info.navigation.length, 1)
335
+ assert.equal(info.navigation[0]!.name, 'Parent')
336
+ assert.equal(info.navigation[0]!.children?.length, 1)
337
+ assert.equal(info.navigation[0]!.children![0]!.name, 'Child')
338
+ })
339
+
340
+ it('renders dangling parent references at top level (no console error)', async () => {
341
+ class Orphan extends Resource {
342
+ static override label = 'Orphan'
343
+ static override navigationParentItem = 'DoesNotExist'
344
+ }
345
+ const info = await panelInfo(Pilotiq.make('T').path('/admin').resources([Orphan]))
346
+ assert.equal(info.navigation.length, 1)
347
+ assert.equal(info.navigation[0]!.name, 'Orphan')
348
+ assert.equal(info.navigation[0]!.children, undefined)
349
+ })
350
+
351
+ it('breaks parent cycles: A → B → A both render at top level', async () => {
352
+ class A extends Resource { static override label = 'A'; static override navigationParentItem = 'B' }
353
+ class B extends Resource { static override label = 'B'; static override navigationParentItem = 'A' }
354
+ // Suppress the dev warning.
355
+ const origWarn = console.warn
356
+ console.warn = () => {}
357
+ try {
358
+ const info = await panelInfo(Pilotiq.make('T').path('/admin').resources([A, B]))
359
+ const names = info.navigation.map(n => n.name).sort()
360
+ assert.deepEqual(names, ['A', 'B'])
361
+ } finally {
362
+ console.warn = origWarn
363
+ }
364
+ })
365
+
366
+ it('resolves navigationBadge handlers in parallel and stamps the result', async () => {
367
+ const order: string[] = []
368
+ class Slow extends Resource {
369
+ static override label = 'Slow'
370
+ static override navigationBadge = async () => {
371
+ order.push('slow-start')
372
+ await new Promise(r => setTimeout(r, 10))
373
+ order.push('slow-end')
374
+ return 1
375
+ }
376
+ }
377
+ class Fast extends Resource {
378
+ static override label = 'Fast'
379
+ static override navigationBadge = async () => {
380
+ order.push('fast-start')
381
+ await new Promise(r => setTimeout(r, 5))
382
+ order.push('fast-end')
383
+ return 2
384
+ }
385
+ }
386
+ const info = await panelInfo(Pilotiq.make('T').path('/admin').resources([Slow, Fast]))
387
+ const slow = info.navigation.find(n => n.name === 'Slow')!
388
+ const fast = info.navigation.find(n => n.name === 'Fast')!
389
+ assert.equal(slow.badge, '1')
390
+ assert.equal(fast.badge, '2')
391
+ // Both started before either finished — confirms Promise.all parallelism.
392
+ assert.equal(order.indexOf('slow-start') < order.indexOf('fast-end'), true)
393
+ assert.equal(order.indexOf('fast-start') < order.indexOf('slow-end'), true)
394
+ })
395
+
396
+ it('swallows badge handler errors so the page still renders', async () => {
397
+ class Broken extends Resource {
398
+ static override label = 'Broken'
399
+ static override navigationBadge = async () => { throw new Error('boom') }
400
+ }
401
+ const info = await panelInfo(Pilotiq.make('T').path('/admin').resources([Broken]))
402
+ assert.equal(info.navigation[0]!.badge, undefined)
403
+ })
404
+
405
+ it('omits badge when handler returns undefined or null', async () => {
406
+ class Empty extends Resource {
407
+ static override label = 'Empty'
408
+ static override navigationBadge = async () => undefined
409
+ }
410
+ const info = await panelInfo(Pilotiq.make('T').path('/admin').resources([Empty]))
411
+ assert.equal(info.navigation[0]!.badge, undefined)
412
+ })
413
+
414
+ it('exposes navigationBadgeColor when not "default"', async () => {
415
+ class Drafty extends Resource {
416
+ static override label = 'Drafty'
417
+ static override navigationBadge = () => 3
418
+ static override navigationBadgeColor = 'warning' as const
419
+ }
420
+ const info = await panelInfo(Pilotiq.make('T').path('/admin').resources([Drafty]))
421
+ assert.equal(info.navigation[0]!.badge, '3')
422
+ assert.equal(info.navigation[0]!.badgeColor, 'warning')
423
+ })
424
+ })
425
+
426
+ describe('tagFormStateUrls (Plan #5)', () => {
427
+ it('stamps stateUrl on forms that have at least one live() field', () => {
428
+ const form = Form.make().formId('f1').schema([
429
+ TextField.make('a'),
430
+ TextField.make('b').live(),
431
+ ])
432
+ tagFormStateUrls([form], (id) => `/admin/x/_form/${id}/state`)
433
+ assert.equal(form.getStateUrl(), '/admin/x/_form/f1/state')
434
+ })
435
+
436
+ it('skips forms whose descendants are not live', () => {
437
+ const form = Form.make().formId('f2').schema([TextField.make('a')])
438
+ tagFormStateUrls([form], (id) => `/admin/x/_form/${id}/state`)
439
+ assert.equal(form.getStateUrl(), undefined)
440
+ })
441
+
442
+ it('walks nested containers to detect live fields', () => {
443
+ const form = Form.make().formId('f3').schema([
444
+ Section.make('s').schema([ToggleField.make('flag').live()]),
445
+ ])
446
+ tagFormStateUrls([form], (id) => `/admin/x/_form/${id}/state`)
447
+ assert.equal(form.getStateUrl(), '/admin/x/_form/f3/state')
448
+ })
449
+
450
+ it('handles multiple forms independently', () => {
451
+ const live = Form.make().formId('live').schema([TextField.make('a').live()])
452
+ const inert = Form.make().formId('inert').schema([TextField.make('b')])
453
+ tagFormStateUrls([live, inert], (id) => `/x/${id}`)
454
+ assert.equal(live.getStateUrl(), '/x/live')
455
+ assert.equal(inert.getStateUrl(), undefined)
456
+ })
457
+
458
+ it('also stamps stateUrl on forms with afterStateUpdatedJs but no live()', () => {
459
+ // JS-only forms still need FormStateProvider mounted (so $get/$set
460
+ // can read + write the values map). The endpoint URL is unused for
461
+ // these — the client never POSTs unless a field is `live()`.
462
+ const form = Form.make().formId('js').schema([
463
+ TextField.make('title').afterStateUpdatedJs(`$set('slug', $state)`),
464
+ ])
465
+ tagFormStateUrls([form], (id) => `/admin/x/_form/${id}/state`)
466
+ assert.equal(form.getStateUrl(), '/admin/x/_form/js/state')
467
+ })
468
+ })
469
+
470
+ describe('tagSelectCreateOptionUrls (audit row 2026-05-07 cont\'d⁸)', () => {
471
+ it('stamps url on SelectFields configured with createOptionForm', () => {
472
+ const sel = SelectField.make('categoryId').options([])
473
+ .createOptionForm([TextField.make('name')])
474
+ .createOptionUsing(async () => ({ value: '1', label: 'x' }))
475
+ const form = Form.make().formId('post-create').schema([sel])
476
+
477
+ tagSelectCreateOptionUrls(
478
+ [form],
479
+ (formId, fieldName) => `/admin/posts/_form/${formId}/create-option/${fieldName}`,
480
+ )
481
+ assert.equal(sel.getCreateOptionUrl(), '/admin/posts/_form/post-create/create-option/categoryId')
482
+ })
483
+
484
+ it('skips bare SelectFields with no createOptionForm', () => {
485
+ const sel = SelectField.make('status').options([{ value: 'a', label: 'A' }])
486
+ const form = Form.make().formId('f').schema([sel])
487
+ tagSelectCreateOptionUrls([form], (id, name) => `/x/${id}/${name}`)
488
+ assert.equal(sel.getCreateOptionUrl(), undefined)
489
+ })
490
+
491
+ it('walks nested layout containers', () => {
492
+ const sel = SelectField.make('tagId').options([])
493
+ .createOptionForm([TextField.make('name')])
494
+ .createOptionUsing(async () => ({ value: '1', label: 'x' }))
495
+ const form = Form.make().formId('nest').schema([
496
+ Section.make('Meta').schema([sel]),
497
+ ])
498
+ tagSelectCreateOptionUrls(
499
+ [form],
500
+ (id, name) => `/p/_form/${id}/create-option/${name}`,
501
+ )
502
+ assert.equal(sel.getCreateOptionUrl(), '/p/_form/nest/create-option/tagId')
503
+ })
504
+
505
+ it('does not overwrite an already-stamped url', () => {
506
+ const sel = SelectField.make('a').options([])
507
+ .createOptionForm([TextField.make('name')])
508
+ .createOptionUsing(async () => ({ value: '1', label: 'x' }))
509
+ .withCreateOptionUrl('/preset')
510
+ const form = Form.make().formId('f').schema([sel])
511
+ tagSelectCreateOptionUrls([form], () => '/clobber')
512
+ assert.equal(sel.getCreateOptionUrl(), '/preset')
513
+ })
514
+
515
+ it('stamps url on multiple selects independently', () => {
516
+ const a = SelectField.make('a').options([])
517
+ .createOptionForm([TextField.make('n')])
518
+ .createOptionUsing(async () => ({ value: '1', label: 'x' }))
519
+ const b = SelectField.make('b').options([])
520
+ .createOptionForm([TextField.make('n')])
521
+ .createOptionUsing(async () => ({ value: '2', label: 'y' }))
522
+ const form = Form.make().formId('multi').schema([a, b])
523
+ tagSelectCreateOptionUrls(
524
+ [form],
525
+ (id, name) => `/p/${id}/${name}`,
526
+ )
527
+ assert.equal(a.getCreateOptionUrl(), '/p/multi/a')
528
+ assert.equal(b.getCreateOptionUrl(), '/p/multi/b')
529
+ })
530
+
531
+ it('stops at Repeater boundaries — inside-row SelectFields are not stamped', () => {
532
+ const innerSel = SelectField.make('childCat').options([])
533
+ .createOptionForm([TextField.make('n')])
534
+ .createOptionUsing(async () => ({ value: '1', label: 'x' }))
535
+ const outerSel = SelectField.make('rootCat').options([])
536
+ .createOptionForm([TextField.make('n')])
537
+ .createOptionUsing(async () => ({ value: '1', label: 'x' }))
538
+ const form = Form.make().formId('rep').schema([
539
+ outerSel,
540
+ Repeater.make('rows').schema([innerSel]),
541
+ ])
542
+ tagSelectCreateOptionUrls([form], (id, name) => `/p/${id}/${name}`)
543
+ assert.equal(outerSel.getCreateOptionUrl(), '/p/rep/rootCat')
544
+ assert.equal(innerSel.getCreateOptionUrl(), undefined)
545
+ })
546
+ })
547
+
548
+ describe('formCreateOptionData (audit row 2026-05-07 cont\'d⁸)', () => {
549
+ function makePanelWithCreateOption(opts?: {
550
+ handler?: (values: Record<string, unknown>) => Promise<{ value: string; label: string }>
551
+ authorize?: import('./actions/Action.js').VisibilityRule
552
+ createForm?: Element[]
553
+ }) {
554
+ const handler = opts?.handler ?? (async (v: Record<string, unknown>) => ({ value: 'new-id', label: String(v['name']) }))
555
+ const createForm = opts?.createForm ?? [TextField.make('name')]
556
+
557
+ class DemoPage extends Page {
558
+ static override slug = 'demo'
559
+ static override async schema() {
560
+ const sel = SelectField.make('categoryId').options([])
561
+ .createOptionForm(createForm)
562
+ .createOptionUsing(handler)
563
+ if (opts?.authorize !== undefined) sel.createOptionAuthorize(opts.authorize)
564
+ // Two forms on the page so `selectFormById` doesn't fall back to
565
+ // the only form (single-form fallback is intentional for SPA
566
+ // edge cases — strict-match tests need 2+ forms).
567
+ return [
568
+ Form.make().formId('the-form').schema([sel]),
569
+ Form.make().formId('other-form').schema([TextField.make('decoy')]),
570
+ ]
571
+ }
572
+ }
573
+ return Pilotiq.make('T').path('/admin').pages([DemoPage])
574
+ }
575
+
576
+ it('returns null when route prefix does not resolve', async () => {
577
+ const panel = Pilotiq.make('T').path('/admin')
578
+ const result = await formCreateOptionData(
579
+ panel,
580
+ { kind: 'page', pageSlug: 'no-such-page' },
581
+ { formId: 'x', fieldName: 'y', values: {} },
582
+ )
583
+ assert.equal(result, null)
584
+ })
585
+
586
+ it('returns 404 when form is not found on page', async () => {
587
+ const panel = makePanelWithCreateOption()
588
+ const result = await formCreateOptionData(
589
+ panel,
590
+ { kind: 'page', pageSlug: 'demo' },
591
+ { formId: 'wrong-form', fieldName: 'categoryId', values: { name: 'X' } },
592
+ )
593
+ assert.deepEqual(result, { ok: false, status: 404, error: 'Form "wrong-form" not found on page' })
594
+ })
595
+
596
+ it('returns 404 when SelectField is not found on form', async () => {
597
+ const panel = makePanelWithCreateOption()
598
+ const result = await formCreateOptionData(
599
+ panel,
600
+ { kind: 'page', pageSlug: 'demo' },
601
+ { formId: 'the-form', fieldName: 'unknownField', values: {} },
602
+ )
603
+ const r = result as { ok: false; status: number; error: string }
604
+ assert.equal(r.ok, false)
605
+ assert.equal(r.status, 404)
606
+ assert.match(r.error, /not found on form/)
607
+ })
608
+
609
+ it('returns 403 when authorize rule rejects', async () => {
610
+ const panel = makePanelWithCreateOption({ authorize: false })
611
+ const result = await formCreateOptionData(
612
+ panel,
613
+ { kind: 'page', pageSlug: 'demo' },
614
+ { formId: 'the-form', fieldName: 'categoryId', values: { name: 'X' } },
615
+ )
616
+ assert.deepEqual(result, { ok: false, status: 403, error: 'createOptionAuthorize denied' })
617
+ })
618
+
619
+ it('returns 422 when validation fails', async () => {
620
+ const panel = makePanelWithCreateOption({
621
+ createForm: [TextField.make('name').required()],
622
+ })
623
+ const result = await formCreateOptionData(
624
+ panel,
625
+ { kind: 'page', pageSlug: 'demo' },
626
+ { formId: 'the-form', fieldName: 'categoryId', values: { name: '' } },
627
+ )
628
+ const r = result as { ok: false; status: number; errors: Record<string, string[]> }
629
+ assert.equal(r.ok, false)
630
+ assert.equal(r.status, 422)
631
+ assert.ok(r.errors['name'])
632
+ })
633
+
634
+ it('returns 200 + option on happy path', async () => {
635
+ const panel = makePanelWithCreateOption()
636
+ const result = await formCreateOptionData(
637
+ panel,
638
+ { kind: 'page', pageSlug: 'demo' },
639
+ { formId: 'the-form', fieldName: 'categoryId', values: { name: 'Tech' } },
640
+ )
641
+ assert.deepEqual(result, { ok: true, option: { value: 'new-id', label: 'Tech' } })
642
+ })
643
+
644
+ it('returns 500 when handler throws', async () => {
645
+ const panel = makePanelWithCreateOption({
646
+ handler: async () => { throw new Error('boom') },
647
+ })
648
+ const result = await formCreateOptionData(
649
+ panel,
650
+ { kind: 'page', pageSlug: 'demo' },
651
+ { formId: 'the-form', fieldName: 'categoryId', values: { name: 'X' } },
652
+ )
653
+ assert.deepEqual(result, { ok: false, status: 500, error: 'boom' })
654
+ })
655
+
656
+ it('returns 500 when handler returns malformed shape', async () => {
657
+ const panel = makePanelWithCreateOption({
658
+ // @ts-expect-error testing runtime shape guard
659
+ handler: async () => ({ value: 'x' /* missing label */ }),
660
+ })
661
+ const result = await formCreateOptionData(
662
+ panel,
663
+ { kind: 'page', pageSlug: 'demo' },
664
+ { formId: 'the-form', fieldName: 'categoryId', values: { name: 'X' } },
665
+ )
666
+ const r = result as { ok: false; status: number; error: string }
667
+ assert.equal(r.ok, false)
668
+ assert.equal(r.status, 500)
669
+ assert.match(r.error, /\{ value: string, label: string \}/)
670
+ })
671
+ })
672
+
673
+ /**
674
+ * Minimal duck-typed RichTextField stand-in. The walker uses
675
+ * `getType() === 'richtext'` + `hasAsyncMentions` + `withMentionsUrl` —
676
+ * matching the same shape `@pilotiq/tiptap`'s real `RichTextField`
677
+ * exposes. Pilotiq core never imports the adapter; the walker contract
678
+ * has to be testable with a plain `Element` subclass.
679
+ */
680
+ class FakeRichTextField extends Element {
681
+ readonly name: string
682
+ private readonly _hasAsync: boolean
683
+ public stamped: string | undefined = undefined
684
+
685
+ constructor(name: string, hasAsync: boolean) {
686
+ super()
687
+ this.name = name
688
+ this._hasAsync = hasAsync
689
+ }
690
+ override getType(): string { return 'richtext' }
691
+ override toMeta(): Record<string, unknown> {
692
+ return {
693
+ type: 'field', fieldType: 'richtext', name: this.name,
694
+ ...(this.stamped !== undefined ? { mentionsUrl: this.stamped } : {}),
695
+ }
696
+ }
697
+ hasAsyncMentions(): boolean { return this._hasAsync }
698
+ withMentionsUrl(url: string): this { this.stamped = url; return this }
699
+ async resolveMention(
700
+ trigger: string,
701
+ query: string,
702
+ _ctx: Record<string, unknown>,
703
+ ): Promise<Array<{ id: string; label: string }> | null> {
704
+ if (trigger === '@') return [{ id: query, label: `User:${query}` }]
705
+ return null
706
+ }
707
+ }
708
+
709
+ describe('tagRichTextMentionUrls (async mention items)', () => {
710
+ it('stamps mentionsUrl on RichTextFields with async providers', () => {
711
+ const f = new FakeRichTextField('body', true)
712
+ const form = Form.make().formId('art').schema([f])
713
+ tagRichTextMentionUrls([form], (id) => `/admin/articles/_form/${id}/mentions`)
714
+ assert.equal(f.stamped, '/admin/articles/_form/art/mentions')
715
+ })
716
+
717
+ it('skips RichTextFields with only static providers', () => {
718
+ const staticField = new FakeRichTextField('body', false)
719
+ const form = Form.make().formId('art').schema([staticField])
720
+ tagRichTextMentionUrls([form], (id) => `/x/${id}`)
721
+ assert.equal(staticField.stamped, undefined)
722
+ })
723
+
724
+ it('walks nested containers to find rich-text fields', () => {
725
+ const inner = new FakeRichTextField('body', true)
726
+ const form = Form.make().formId('art').schema([
727
+ Section.make('s').schema([inner]),
728
+ ])
729
+ tagRichTextMentionUrls([form], (id) => `/admin/_form/${id}/mentions`)
730
+ assert.equal(inner.stamped, '/admin/_form/art/mentions')
731
+ })
732
+
733
+ it('handles multiple forms — each gets its own URL', () => {
734
+ const a = new FakeRichTextField('body', true)
735
+ const b = new FakeRichTextField('body', true)
736
+ const formA = Form.make().formId('a').schema([a])
737
+ const formB = Form.make().formId('b').schema([b])
738
+ tagRichTextMentionUrls([formA, formB], (id) => `/x/_form/${id}/mentions`)
739
+ assert.equal(a.stamped, '/x/_form/a/mentions')
740
+ assert.equal(b.stamped, '/x/_form/b/mentions')
741
+ })
742
+
743
+ it('skips non-richtext elements that share method names by accident', () => {
744
+ // The fast filter `getType() === 'richtext'` keeps a coincidental
745
+ // duck-type collision (e.g. someone naming a custom element with
746
+ // `withMentionsUrl`) from being mistakenly stamped.
747
+ class WrongType extends Element {
748
+ stamped: string | undefined = undefined
749
+ override getType(): string { return 'custom' }
750
+ override toMeta(): Record<string, unknown> { return { type: 'custom' } }
751
+ hasAsyncMentions(): boolean { return true }
752
+ withMentionsUrl(url: string): this { this.stamped = url; return this }
753
+ }
754
+ const wrong = new WrongType()
755
+ const form = Form.make().formId('f').schema([wrong as unknown as Element])
756
+ tagRichTextMentionUrls([form], (id) => `/x/${id}`)
757
+ assert.equal(wrong.stamped, undefined)
758
+ })
759
+ })
760
+
761
+ describe('tagTableReorderUrls (reorderable rows)', () => {
762
+ it('stamps reorderUrl on tables with reorderable() opted in', () => {
763
+ const t = Table.make().reorderable('sort').columns([Column.make('id')])
764
+ tagTableReorderUrls([t], '/admin/posts/_reorder')
765
+ assert.equal(t.getReorderUrl(), '/admin/posts/_reorder')
766
+ })
767
+
768
+ it('skips tables without reorderable()', () => {
769
+ const t = Table.make().columns([Column.make('id')])
770
+ tagTableReorderUrls([t], '/admin/posts/_reorder')
771
+ assert.equal(t.getReorderUrl(), undefined)
772
+ })
773
+
774
+ it('preserves a previously stamped URL (idempotent)', () => {
775
+ const t = Table.make().reorderable('sort').withReorderUrl('/x/_reorder')
776
+ tagTableReorderUrls([t], '/y/_reorder')
777
+ assert.equal(t.getReorderUrl(), '/x/_reorder')
778
+ })
779
+ })
780
+
781
+ describe('tagCellEditUrls (editable columns)', () => {
782
+ it('stamps _cellEditUrls only on rows that already carry _cellEditable', () => {
783
+ const t = Table.make<Record<string, unknown>>()
784
+ .columns([Column.make('id'), TextInputColumn.make('title')])
785
+ .withRows([
786
+ { id: '1', _cellEditable: { title: true } },
787
+ { id: '2' /* canEdit was false — no editable map */ },
788
+ ], 2)
789
+
790
+ tagCellEditUrls([t], '/admin/posts')
791
+ const rows = t.getRows() as Array<Record<string, unknown>>
792
+ assert.deepEqual(rows[0]!['_cellEditUrls'], { title: '/admin/posts/1/_cell/title' })
793
+ assert.equal(rows[1]!['_cellEditUrls'], undefined)
794
+ })
795
+
796
+ it('skips tables that have no editable columns', () => {
797
+ const t = Table.make<Record<string, unknown>>()
798
+ .columns([Column.make('id')])
799
+ .withRows([{ id: '1' }], 1)
800
+
801
+ tagCellEditUrls([t], '/admin/posts')
802
+ const rows = t.getRows() as Array<Record<string, unknown>>
803
+ assert.equal(rows[0]!['_cellEditUrls'], undefined)
804
+ })
805
+
806
+ it('builds a URL per editable column on the row', () => {
807
+ const t = Table.make<Record<string, unknown>>()
808
+ .columns([
809
+ Column.make('id'),
810
+ TextInputColumn.make('title'),
811
+ ToggleColumn.make('featured'),
812
+ ])
813
+ .withRows([
814
+ { id: '7', _cellEditable: { title: true, featured: true } },
815
+ ], 1)
816
+
817
+ tagCellEditUrls([t], '/admin/posts')
818
+ const rows = t.getRows() as Array<Record<string, unknown>>
819
+ assert.deepEqual(rows[0]!['_cellEditUrls'], {
820
+ title: '/admin/posts/7/_cell/title',
821
+ featured: '/admin/posts/7/_cell/featured',
822
+ })
823
+ })
824
+
825
+ it('encodes the row id and column name', () => {
826
+ const t = Table.make<Record<string, unknown>>()
827
+ .columns([Column.make('id'), TextInputColumn.make('weird name')])
828
+ .withRows([
829
+ { id: 'a/b', _cellEditable: { 'weird name': true } },
830
+ ], 1)
831
+
832
+ tagCellEditUrls([t], '/admin/posts')
833
+ const rows = t.getRows() as Array<Record<string, unknown>>
834
+ assert.deepEqual(rows[0]!['_cellEditUrls'], {
835
+ 'weird name': '/admin/posts/a%2Fb/_cell/weird%20name',
836
+ })
837
+ })
838
+ })
839
+
840
+ describe('formStateData (Plan #5)', () => {
841
+ it('returns null when the page-scope is unknown', async () => {
842
+ class Articles extends Resource {
843
+ static override label = 'Articles'
844
+ }
845
+ const panel = Pilotiq.make('T').path('/admin').resources([Articles])
846
+ const result = await formStateData(panel, { kind: 'resource-edit', slug: 'missing', recordId: '1' }, { formId: 'f', changed: 'x', values: {} })
847
+ assert.equal(result, null)
848
+ })
849
+
850
+ it('returns 404 when the form id misses on a multi-form page', async () => {
851
+ class TestPage extends Page {
852
+ static override slug = 'demo'
853
+ static override schema() {
854
+ return [
855
+ Form.make().formId('one').schema([TextField.make('x').live()]),
856
+ Form.make().formId('two').schema([TextField.make('y').live()]),
857
+ ]
858
+ }
859
+ }
860
+ const panel = Pilotiq.make('T').path('/admin').pages([TestPage])
861
+ const result = await formStateData(panel, { kind: 'page', pageSlug: 'demo' }, { formId: 'wrong-id', changed: 'x', values: { x: 'v' } })
862
+ assert.notEqual(result, null)
863
+ assert.equal((result as { ok: false; status: number }).ok, false)
864
+ assert.equal((result as { ok: false; status: number }).status, 404)
865
+ })
866
+
867
+ it('falls back to the only form when the formId misses on a single-form page', async () => {
868
+ // Removes the auto-counter desync footgun for reactive demos —
869
+ // see selectFormById in elements/dispatchForm.ts.
870
+ class TestPage extends Page {
871
+ static override slug = 'demo'
872
+ static override schema() {
873
+ return [Form.make().formId('the-form').schema([TextField.make('x').live()])]
874
+ }
875
+ }
876
+ const panel = Pilotiq.make('T').path('/admin').pages([TestPage])
877
+ const result = await formStateData(panel, { kind: 'page', pageSlug: 'demo' }, { formId: 'mismatched-counter', changed: 'x', values: { x: 'v' } })
878
+ assert.notEqual(result, null)
879
+ assert.equal((result as { ok: true }).ok, true)
880
+ })
881
+
882
+ it('returns 422 when the changed field does not exist on the form', async () => {
883
+ class TestPage extends Page {
884
+ static override slug = 'demo'
885
+ static override schema() {
886
+ return [Form.make().formId('the-form').schema([TextField.make('x').live()])]
887
+ }
888
+ }
889
+ const panel = Pilotiq.make('T').path('/admin').pages([TestPage])
890
+ const result = await formStateData(panel, { kind: 'page', pageSlug: 'demo' }, { formId: 'the-form', changed: 'missing', values: {} })
891
+ assert.notEqual(result, null)
892
+ assert.equal((result as { ok: false; status: number }).ok, false)
893
+ assert.equal((result as { ok: false; status: number }).status, 422)
894
+ })
895
+
896
+ it('runs afterStateUpdated and returns the resolved form meta', async () => {
897
+ class TestPage extends Page {
898
+ static override slug = 'demo'
899
+ static override schema() {
900
+ return [Form.make().formId('the-form').schema([
901
+ TextField.make('title').live().afterStateUpdated((value, { $set }) => {
902
+ $set('slug', String(value).toLowerCase().replace(/\s+/g, '-'))
903
+ }),
904
+ TextField.make('slug'),
905
+ ])]
906
+ }
907
+ }
908
+ const panel = Pilotiq.make('T').path('/admin').pages([TestPage])
909
+ const result = await formStateData(
910
+ panel,
911
+ { kind: 'page', pageSlug: 'demo' },
912
+ { formId: 'the-form', changed: 'title', values: { title: 'Hello World', slug: 'old' } },
913
+ )
914
+ assert.notEqual(result, null)
915
+ if (result === null || !result.ok) throw new Error('expected ok result')
916
+ assert.deepEqual(result.dirty.sort(), ['slug', 'title'])
917
+ const formMeta = result.form as { values?: Record<string, unknown> }
918
+ assert.equal(formMeta.values?.['slug'], 'hello-world')
919
+ })
920
+ })
921
+
922
+ describe('mentionResolveData (async mention items)', () => {
923
+ it('returns null when the page scope misses', async () => {
924
+ class Articles extends Resource {
925
+ static override label = 'Articles'
926
+ }
927
+ const panel = Pilotiq.make('T').path('/admin').resources([Articles])
928
+ const result = await mentionResolveData(
929
+ panel,
930
+ { kind: 'resource-edit', slug: 'missing', recordId: '1' },
931
+ { formId: 'f', field: 'body', trigger: '@', query: 'a' },
932
+ )
933
+ assert.equal(result, null)
934
+ })
935
+
936
+ it('returns 404 when the form id misses on a multi-form page', async () => {
937
+ class TestPage extends Page {
938
+ static override slug = 'demo'
939
+ static override schema() {
940
+ return [
941
+ Form.make().formId('one').schema([new FakeRichTextField('body', true)]),
942
+ Form.make().formId('two').schema([TextField.make('a')]),
943
+ ]
944
+ }
945
+ }
946
+ const panel = Pilotiq.make('T').path('/admin').pages([TestPage])
947
+ const result = await mentionResolveData(
948
+ panel,
949
+ { kind: 'page', pageSlug: 'demo' },
950
+ { formId: 'wrong', field: 'body', trigger: '@', query: 'a' },
951
+ )
952
+ assert.notEqual(result, null)
953
+ if (result === null) throw new Error('expected non-null result')
954
+ assert.equal((result as { ok: false; status: number }).ok, false)
955
+ assert.equal((result as { ok: false; status: number }).status, 404)
956
+ })
957
+
958
+ it('returns 404 when the field is not on the form', async () => {
959
+ class TestPage extends Page {
960
+ static override slug = 'demo'
961
+ static override schema() {
962
+ return [Form.make().formId('the-form').schema([new FakeRichTextField('intro', true)])]
963
+ }
964
+ }
965
+ const panel = Pilotiq.make('T').path('/admin').pages([TestPage])
966
+ const result = await mentionResolveData(
967
+ panel,
968
+ { kind: 'page', pageSlug: 'demo' },
969
+ { formId: 'the-form', field: 'body', trigger: '@', query: 'a' },
970
+ )
971
+ assert.notEqual(result, null)
972
+ assert.equal((result as { ok: false; status: number }).ok, false)
973
+ assert.equal((result as { ok: false; status: number }).status, 404)
974
+ })
975
+
976
+ it('returns 404 when the trigger has no provider', async () => {
977
+ class TestPage extends Page {
978
+ static override slug = 'demo'
979
+ static override schema() {
980
+ return [Form.make().formId('the-form').schema([new FakeRichTextField('body', true)])]
981
+ }
982
+ }
983
+ const panel = Pilotiq.make('T').path('/admin').pages([TestPage])
984
+ const result = await mentionResolveData(
985
+ panel,
986
+ { kind: 'page', pageSlug: 'demo' },
987
+ { formId: 'the-form', field: 'body', trigger: '!', query: 'a' },
988
+ )
989
+ assert.notEqual(result, null)
990
+ if (result === null) throw new Error('expected non-null result')
991
+ assert.equal((result as { ok: false; status: number }).ok, false)
992
+ assert.equal((result as { ok: false; status: number }).status, 404)
993
+ })
994
+
995
+ it('returns the resolved items for a known trigger', async () => {
996
+ class TestPage extends Page {
997
+ static override slug = 'demo'
998
+ static override schema() {
999
+ return [Form.make().formId('the-form').schema([new FakeRichTextField('body', true)])]
1000
+ }
1001
+ }
1002
+ const panel = Pilotiq.make('T').path('/admin').pages([TestPage])
1003
+ const result = await mentionResolveData(
1004
+ panel,
1005
+ { kind: 'page', pageSlug: 'demo' },
1006
+ { formId: 'the-form', field: 'body', trigger: '@', query: 'sleman' },
1007
+ )
1008
+ assert.notEqual(result, null)
1009
+ if (result === null || !result.ok) throw new Error('expected ok result')
1010
+ assert.equal(result.items.length, 1)
1011
+ assert.equal(result.items[0]!.id, 'sleman')
1012
+ assert.equal(result.items[0]!.label, 'User:sleman')
1013
+ })
1014
+
1015
+ it('resolves a RichTextField nested inside a Repeater row via dotted path', async () => {
1016
+ class TestPage extends Page {
1017
+ static override slug = 'demo'
1018
+ static override schema() {
1019
+ return [Form.make().formId('the-form').schema([
1020
+ Repeater.make('items').schema([new FakeRichTextField('body', true)]),
1021
+ ])]
1022
+ }
1023
+ }
1024
+ const panel = Pilotiq.make('T').path('/admin').pages([TestPage])
1025
+ const result = await mentionResolveData(
1026
+ panel,
1027
+ { kind: 'page', pageSlug: 'demo' },
1028
+ { formId: 'the-form', field: 'items.0.body', trigger: '@', query: 'sleman' },
1029
+ )
1030
+ assert.notEqual(result, null)
1031
+ if (result === null || !result.ok) throw new Error('expected ok result')
1032
+ assert.equal(result.items[0]!.id, 'sleman')
1033
+ })
1034
+
1035
+ it('resolves a RichTextField nested inside a Builder block via dotted path', async () => {
1036
+ class TestPage extends Page {
1037
+ static override slug = 'demo'
1038
+ static override schema() {
1039
+ return [Form.make().formId('the-form').schema([
1040
+ Builder.make('blocks').blocks([
1041
+ Block.make('callout').schema([new FakeRichTextField('body', true)]),
1042
+ ]),
1043
+ ])]
1044
+ }
1045
+ }
1046
+ const panel = Pilotiq.make('T').path('/admin').pages([TestPage])
1047
+ const result = await mentionResolveData(
1048
+ panel,
1049
+ { kind: 'page', pageSlug: 'demo' },
1050
+ { formId: 'the-form', field: 'blocks.0.data.body', trigger: '@', query: 'sleman' },
1051
+ )
1052
+ assert.notEqual(result, null)
1053
+ if (result === null || !result.ok) throw new Error('expected ok result')
1054
+ assert.equal(result.items[0]!.id, 'sleman')
1055
+ })
1056
+
1057
+ it('returns 404 when a Repeater dotted path does not match any inner field', async () => {
1058
+ class TestPage extends Page {
1059
+ static override slug = 'demo'
1060
+ static override schema() {
1061
+ return [Form.make().formId('the-form').schema([
1062
+ Repeater.make('items').schema([new FakeRichTextField('body', true)]),
1063
+ ])]
1064
+ }
1065
+ }
1066
+ const panel = Pilotiq.make('T').path('/admin').pages([TestPage])
1067
+ const result = await mentionResolveData(
1068
+ panel,
1069
+ { kind: 'page', pageSlug: 'demo' },
1070
+ { formId: 'the-form', field: 'items.0.missing', trigger: '@', query: 'a' },
1071
+ )
1072
+ assert.notEqual(result, null)
1073
+ assert.equal((result as { ok: false; status: number }).ok, false)
1074
+ assert.equal((result as { ok: false; status: number }).status, 404)
1075
+ })
1076
+
1077
+ it('returns 404 for a Builder path missing the literal `data` segment', async () => {
1078
+ class TestPage extends Page {
1079
+ static override slug = 'demo'
1080
+ static override schema() {
1081
+ return [Form.make().formId('the-form').schema([
1082
+ Builder.make('blocks').blocks([
1083
+ Block.make('callout').schema([new FakeRichTextField('body', true)]),
1084
+ ]),
1085
+ ])]
1086
+ }
1087
+ }
1088
+ const panel = Pilotiq.make('T').path('/admin').pages([TestPage])
1089
+ // Repeater-shaped path doesn't reach a Builder leaf.
1090
+ const result = await mentionResolveData(
1091
+ panel,
1092
+ { kind: 'page', pageSlug: 'demo' },
1093
+ { formId: 'the-form', field: 'blocks.0.body', trigger: '@', query: 'a' },
1094
+ )
1095
+ assert.notEqual(result, null)
1096
+ assert.equal((result as { ok: false; status: number }).ok, false)
1097
+ assert.equal((result as { ok: false; status: number }).status, 404)
1098
+ })
1099
+ })
1100
+
1101
+ describe('tagRichTextMentionUrls — nested Repeater + Builder rows', () => {
1102
+ it('stamps a Repeater template field via the form-level URL', () => {
1103
+ const inner = new FakeRichTextField('body', true)
1104
+ const form = Form.make().formId('art').schema([
1105
+ Repeater.make('items').schema([inner]),
1106
+ ])
1107
+ tagRichTextMentionUrls([form], (id) => `/admin/_form/${id}/mentions`)
1108
+ assert.equal(inner.stamped, '/admin/_form/art/mentions')
1109
+ })
1110
+
1111
+ it('stamps a Builder block leaf even though Builder.getChildren() is undefined', () => {
1112
+ const inner = new FakeRichTextField('body', true)
1113
+ const form = Form.make().formId('art').schema([
1114
+ Builder.make('blocks').blocks([
1115
+ Block.make('callout').schema([inner]),
1116
+ ]),
1117
+ ])
1118
+ tagRichTextMentionUrls([form], (id) => `/admin/_form/${id}/mentions`)
1119
+ assert.equal(inner.stamped, '/admin/_form/art/mentions')
1120
+ })
1121
+ })