@questpie/admin 1.1.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (965) hide show
  1. package/README.md +245 -474
  2. package/dist/_virtual/rolldown_runtime.mjs +18 -0
  3. package/dist/augmentation.d.mts +315 -0
  4. package/dist/augmentation.d.mts.map +1 -0
  5. package/dist/client/blocks/block-registry.d.mts +199 -0
  6. package/dist/client/blocks/block-registry.d.mts.map +1 -0
  7. package/dist/client/blocks/block-registry.mjs +88 -0
  8. package/dist/client/blocks/block-registry.mjs.map +1 -0
  9. package/dist/client/blocks/block-renderer.d.mts +52 -0
  10. package/dist/client/blocks/block-renderer.d.mts.map +1 -0
  11. package/dist/client/blocks/block-renderer.mjs +71 -0
  12. package/dist/client/blocks/block-renderer.mjs.map +1 -0
  13. package/dist/client/blocks/index.d.mts +4 -0
  14. package/dist/client/blocks/prefetch.d.mts +45 -0
  15. package/dist/client/blocks/prefetch.d.mts.map +1 -0
  16. package/dist/client/blocks/prefetch.mjs +26 -0
  17. package/dist/client/blocks/prefetch.mjs.map +1 -0
  18. package/dist/client/blocks/types.d.mts +69 -0
  19. package/dist/client/blocks/types.d.mts.map +1 -0
  20. package/dist/client/blocks/types.mjs +20 -0
  21. package/dist/client/blocks/types.mjs.map +1 -0
  22. package/dist/client/builder/admin-builder.d.mts +112 -0
  23. package/dist/client/builder/admin-builder.d.mts.map +1 -0
  24. package/dist/client/builder/admin-builder.mjs +185 -0
  25. package/dist/client/builder/admin-builder.mjs.map +1 -0
  26. package/dist/client/builder/admin-types.d.mts +73 -0
  27. package/dist/client/builder/admin-types.d.mts.map +1 -0
  28. package/dist/client/builder/admin.d.mts +121 -0
  29. package/dist/client/builder/admin.d.mts.map +1 -0
  30. package/dist/client/builder/admin.mjs +160 -0
  31. package/dist/client/builder/admin.mjs.map +1 -0
  32. package/dist/client/builder/defaults/components.mjs +20 -0
  33. package/dist/client/builder/defaults/components.mjs.map +1 -0
  34. package/dist/client/builder/defaults/core.d.mts +354 -0
  35. package/dist/client/builder/defaults/core.d.mts.map +1 -0
  36. package/dist/client/builder/defaults/core.mjs +49 -0
  37. package/dist/client/builder/defaults/core.mjs.map +1 -0
  38. package/dist/client/builder/defaults/fields.mjs +328 -0
  39. package/dist/client/builder/defaults/fields.mjs.map +1 -0
  40. package/dist/client/builder/defaults/pages.mjs +58 -0
  41. package/dist/client/builder/defaults/pages.mjs.map +1 -0
  42. package/dist/client/builder/defaults/starter.d.mts +351 -0
  43. package/dist/client/builder/defaults/starter.d.mts.map +1 -0
  44. package/dist/client/builder/defaults/starter.mjs +28 -0
  45. package/dist/client/builder/defaults/starter.mjs.map +1 -0
  46. package/dist/client/builder/defaults/views.mjs +27 -0
  47. package/dist/client/builder/defaults/views.mjs.map +1 -0
  48. package/dist/client/builder/defaults/widgets.mjs +31 -0
  49. package/dist/client/builder/defaults/widgets.mjs.map +1 -0
  50. package/dist/client/builder/field/field.d.mts +229 -0
  51. package/dist/client/builder/field/field.d.mts.map +1 -0
  52. package/dist/client/builder/field/field.mjs +83 -0
  53. package/dist/client/builder/field/field.mjs.map +1 -0
  54. package/dist/client/builder/index.d.mts +36 -0
  55. package/dist/client/builder/index.d.mts.map +1 -0
  56. package/dist/client/builder/page/page.d.mts +36 -0
  57. package/dist/client/builder/page/page.d.mts.map +1 -0
  58. package/dist/client/builder/page/page.mjs +27 -0
  59. package/dist/client/builder/page/page.mjs.map +1 -0
  60. package/dist/client/builder/proxies.d.mts +2 -0
  61. package/dist/client/builder/proxies.mjs +24 -0
  62. package/dist/client/builder/proxies.mjs.map +1 -0
  63. package/dist/client/builder/qa.d.mts +50 -0
  64. package/dist/client/builder/qa.d.mts.map +1 -0
  65. package/dist/client/builder/qa.mjs +42 -0
  66. package/dist/client/builder/qa.mjs.map +1 -0
  67. package/dist/client/builder/registry.d.mts +70 -0
  68. package/dist/client/builder/registry.d.mts.map +1 -0
  69. package/dist/client/builder/types/action-registry.d.mts +2 -0
  70. package/dist/client/builder/types/action-registry.mjs +142 -0
  71. package/dist/client/builder/types/action-registry.mjs.map +1 -0
  72. package/dist/client/builder/types/action-types.d.mts +253 -0
  73. package/dist/client/builder/types/action-types.d.mts.map +1 -0
  74. package/dist/client/builder/types/collection-types.d.mts +199 -0
  75. package/dist/client/builder/types/collection-types.d.mts.map +1 -0
  76. package/dist/client/builder/types/collection-types.mjs +11 -0
  77. package/dist/client/builder/types/collection-types.mjs.map +1 -0
  78. package/dist/client/builder/types/common.d.mts +60 -0
  79. package/dist/client/builder/types/common.d.mts.map +1 -0
  80. package/dist/client/builder/types/field-types.d.mts +593 -0
  81. package/dist/client/builder/types/field-types.d.mts.map +1 -0
  82. package/dist/client/builder/types/field-types.mjs +19 -0
  83. package/dist/client/builder/types/field-types.mjs.map +1 -0
  84. package/dist/client/builder/types/global-types.d.mts +22 -0
  85. package/dist/client/builder/types/global-types.d.mts.map +1 -0
  86. package/dist/client/builder/types/ui-config.d.mts +160 -0
  87. package/dist/client/builder/types/ui-config.d.mts.map +1 -0
  88. package/dist/client/builder/types/views.d.mts +89 -0
  89. package/dist/client/builder/types/views.d.mts.map +1 -0
  90. package/dist/client/builder/types/widget-types.d.mts +563 -0
  91. package/dist/client/builder/types/widget-types.d.mts.map +1 -0
  92. package/dist/client/builder/validation.d.mts +3 -0
  93. package/dist/client/builder/validation.mjs +208 -0
  94. package/dist/client/builder/validation.mjs.map +1 -0
  95. package/dist/client/builder/view/view.d.mts +129 -0
  96. package/dist/client/builder/view/view.d.mts.map +1 -0
  97. package/dist/client/builder/view/view.mjs +109 -0
  98. package/dist/client/builder/view/view.mjs.map +1 -0
  99. package/dist/client/builder/widget/widget.d.mts +33 -0
  100. package/dist/client/builder/widget/widget.d.mts.map +1 -0
  101. package/dist/client/builder/widget/widget.mjs +26 -0
  102. package/dist/client/builder/widget/widget.mjs.map +1 -0
  103. package/dist/client/components/actions/action-button.d.mts +2 -0
  104. package/dist/client/components/actions/action-button.mjs +135 -0
  105. package/dist/client/components/actions/action-button.mjs.map +1 -0
  106. package/dist/client/components/actions/action-dialog.d.mts +2 -0
  107. package/dist/client/components/actions/action-dialog.mjs +264 -0
  108. package/dist/client/components/actions/action-dialog.mjs.map +1 -0
  109. package/dist/client/components/actions/confirmation-dialog.d.mts +2 -0
  110. package/dist/client/components/actions/confirmation-dialog.mjs +82 -0
  111. package/dist/client/components/actions/confirmation-dialog.mjs.map +1 -0
  112. package/dist/client/components/actions/header-actions.d.mts +2 -0
  113. package/dist/client/components/actions/header-actions.mjs +117 -0
  114. package/dist/client/components/actions/header-actions.mjs.map +1 -0
  115. package/dist/client/components/actions/index.d.mts +4 -0
  116. package/dist/client/components/admin-link.d.mts +67 -0
  117. package/dist/client/components/admin-link.d.mts.map +1 -0
  118. package/dist/client/components/admin-link.mjs +92 -0
  119. package/dist/client/components/admin-link.mjs.map +1 -0
  120. package/dist/client/components/auth/auth-guard.d.mts +51 -0
  121. package/dist/client/components/auth/auth-guard.d.mts.map +1 -0
  122. package/dist/client/components/auth/auth-guard.mjs +60 -0
  123. package/dist/client/components/auth/auth-guard.mjs.map +1 -0
  124. package/dist/client/components/auth/auth-loading.d.mts +36 -0
  125. package/dist/client/components/auth/auth-loading.d.mts.map +1 -0
  126. package/dist/client/components/auth/auth-loading.mjs +27 -0
  127. package/dist/client/components/auth/auth-loading.mjs.map +1 -0
  128. package/dist/client/components/auth/index.d.mts +2 -0
  129. package/dist/client/components/blocks/block-canvas.mjs +90 -0
  130. package/dist/client/components/blocks/block-canvas.mjs.map +1 -0
  131. package/dist/client/components/blocks/block-editor-context.mjs +58 -0
  132. package/dist/client/components/blocks/block-editor-context.mjs.map +1 -0
  133. package/dist/client/components/blocks/block-editor-layout.mjs +82 -0
  134. package/dist/client/components/blocks/block-editor-layout.mjs.map +1 -0
  135. package/dist/client/components/blocks/block-editor-provider.mjs +155 -0
  136. package/dist/client/components/blocks/block-editor-provider.mjs.map +1 -0
  137. package/dist/client/components/blocks/block-fields-renderer.mjs +70 -0
  138. package/dist/client/components/blocks/block-fields-renderer.mjs.map +1 -0
  139. package/dist/client/components/blocks/block-insert-button.mjs +72 -0
  140. package/dist/client/components/blocks/block-insert-button.mjs.map +1 -0
  141. package/dist/client/components/blocks/block-item-menu.mjs +161 -0
  142. package/dist/client/components/blocks/block-item-menu.mjs.map +1 -0
  143. package/dist/client/components/blocks/block-item.mjs +187 -0
  144. package/dist/client/components/blocks/block-item.mjs.map +1 -0
  145. package/dist/client/components/blocks/block-library-sidebar.mjs +190 -0
  146. package/dist/client/components/blocks/block-library-sidebar.mjs.map +1 -0
  147. package/dist/client/components/blocks/block-tree.mjs +45 -0
  148. package/dist/client/components/blocks/block-tree.mjs.map +1 -0
  149. package/dist/client/components/blocks/block-type-icon.mjs +50 -0
  150. package/dist/client/components/blocks/block-type-icon.mjs.map +1 -0
  151. package/dist/client/components/blocks/utils/tree-utils.mjs +186 -0
  152. package/dist/client/components/blocks/utils/tree-utils.mjs.map +1 -0
  153. package/dist/client/components/component-renderer.d.mts +125 -0
  154. package/dist/client/components/component-renderer.d.mts.map +1 -0
  155. package/dist/client/components/component-renderer.mjs +145 -0
  156. package/dist/client/components/component-renderer.mjs.map +1 -0
  157. package/dist/client/components/error-boundary.mjs +92 -0
  158. package/dist/client/components/error-boundary.mjs.map +1 -0
  159. package/dist/client/components/fields/array-field.d.mts +44 -0
  160. package/dist/client/components/fields/array-field.d.mts.map +1 -0
  161. package/dist/client/components/fields/array-field.mjs +231 -0
  162. package/dist/client/components/fields/array-field.mjs.map +1 -0
  163. package/dist/client/components/fields/asset-preview-field.d.mts +52 -0
  164. package/dist/client/components/fields/asset-preview-field.d.mts.map +1 -0
  165. package/dist/client/components/fields/asset-preview-field.mjs +60 -0
  166. package/dist/client/components/fields/asset-preview-field.mjs.map +1 -0
  167. package/dist/client/components/fields/blocks-field/blocks-field.d.mts +41 -0
  168. package/dist/client/components/fields/blocks-field/blocks-field.d.mts.map +1 -0
  169. package/dist/client/components/fields/blocks-field/blocks-field.mjs +101 -0
  170. package/dist/client/components/fields/blocks-field/blocks-field.mjs.map +1 -0
  171. package/dist/client/components/fields/blocks-field/index.d.mts +1 -0
  172. package/dist/client/components/fields/boolean-field.d.mts +30 -0
  173. package/dist/client/components/fields/boolean-field.d.mts.map +1 -0
  174. package/dist/client/components/fields/boolean-field.mjs +47 -0
  175. package/dist/client/components/fields/boolean-field.mjs.map +1 -0
  176. package/dist/client/components/fields/custom-field.d.mts +3 -0
  177. package/dist/client/components/fields/date-field.d.mts +22 -0
  178. package/dist/client/components/fields/date-field.d.mts.map +1 -0
  179. package/dist/client/components/fields/date-field.mjs +42 -0
  180. package/dist/client/components/fields/date-field.mjs.map +1 -0
  181. package/dist/client/components/fields/datetime-field.d.mts +23 -0
  182. package/dist/client/components/fields/datetime-field.d.mts.map +1 -0
  183. package/dist/client/components/fields/datetime-field.mjs +43 -0
  184. package/dist/client/components/fields/datetime-field.mjs.map +1 -0
  185. package/dist/client/components/fields/email-field.d.mts +19 -0
  186. package/dist/client/components/fields/email-field.d.mts.map +1 -0
  187. package/dist/client/components/fields/email-field.mjs +38 -0
  188. package/dist/client/components/fields/email-field.mjs.map +1 -0
  189. package/dist/client/components/fields/embedded-collection.d.mts +3 -0
  190. package/dist/client/components/fields/field-types.d.mts +571 -0
  191. package/dist/client/components/fields/field-types.d.mts.map +1 -0
  192. package/dist/client/components/fields/field-utils.d.mts +1 -0
  193. package/dist/client/components/fields/field-utils.mjs +65 -0
  194. package/dist/client/components/fields/field-utils.mjs.map +1 -0
  195. package/dist/client/components/fields/field-wrapper.d.mts +3 -0
  196. package/dist/client/components/fields/field-wrapper.mjs +49 -0
  197. package/dist/client/components/fields/field-wrapper.mjs.map +1 -0
  198. package/dist/client/components/fields/index.d.mts +33 -0
  199. package/dist/client/components/fields/json-field.d.mts +84 -0
  200. package/dist/client/components/fields/json-field.d.mts.map +1 -0
  201. package/dist/client/components/fields/json-field.mjs +248 -0
  202. package/dist/client/components/fields/json-field.mjs.map +1 -0
  203. package/dist/client/components/fields/locale-badge.d.mts +1 -0
  204. package/dist/client/components/fields/locale-badge.mjs +17 -0
  205. package/dist/client/components/fields/locale-badge.mjs.map +1 -0
  206. package/dist/client/components/fields/number-field.d.mts +23 -0
  207. package/dist/client/components/fields/number-field.d.mts.map +1 -0
  208. package/dist/client/components/fields/number-field.mjs +40 -0
  209. package/dist/client/components/fields/number-field.mjs.map +1 -0
  210. package/dist/client/components/fields/object-array-field.d.mts +2 -0
  211. package/dist/client/components/fields/object-array-field.mjs +313 -0
  212. package/dist/client/components/fields/object-array-field.mjs.map +1 -0
  213. package/dist/client/components/fields/object-field.d.mts +32 -0
  214. package/dist/client/components/fields/object-field.d.mts.map +1 -0
  215. package/dist/client/components/fields/object-field.mjs +128 -0
  216. package/dist/client/components/fields/object-field.mjs.map +1 -0
  217. package/dist/client/components/fields/relation/displays/cards-display.d.mts +2 -0
  218. package/dist/client/components/fields/relation/displays/cards-display.mjs +140 -0
  219. package/dist/client/components/fields/relation/displays/cards-display.mjs.map +1 -0
  220. package/dist/client/components/fields/relation/displays/chips-display.d.mts +2 -0
  221. package/dist/client/components/fields/relation/displays/chips-display.mjs +100 -0
  222. package/dist/client/components/fields/relation/displays/chips-display.mjs.map +1 -0
  223. package/dist/client/components/fields/relation/displays/grid-display.d.mts +2 -0
  224. package/dist/client/components/fields/relation/displays/grid-display.mjs +114 -0
  225. package/dist/client/components/fields/relation/displays/grid-display.mjs.map +1 -0
  226. package/dist/client/components/fields/relation/displays/index.d.mts +6 -0
  227. package/dist/client/components/fields/relation/displays/list-display.d.mts +2 -0
  228. package/dist/client/components/fields/relation/displays/list-display.mjs +128 -0
  229. package/dist/client/components/fields/relation/displays/list-display.mjs.map +1 -0
  230. package/dist/client/components/fields/relation/displays/table-display.d.mts +2 -0
  231. package/dist/client/components/fields/relation/displays/table-display.mjs +134 -0
  232. package/dist/client/components/fields/relation/displays/table-display.mjs.map +1 -0
  233. package/dist/client/components/fields/relation/displays/types.d.mts +22 -0
  234. package/dist/client/components/fields/relation/displays/types.d.mts.map +1 -0
  235. package/dist/client/components/fields/relation/displays/types.mjs +73 -0
  236. package/dist/client/components/fields/relation/displays/types.mjs.map +1 -0
  237. package/dist/client/components/fields/relation/index.d.mts +3 -0
  238. package/dist/client/components/fields/relation/relation-items-display.d.mts +5 -0
  239. package/dist/client/components/fields/relation/relation-items-display.mjs +47 -0
  240. package/dist/client/components/fields/relation/relation-items-display.mjs.map +1 -0
  241. package/dist/client/components/fields/relation-field.d.mts +134 -0
  242. package/dist/client/components/fields/relation-field.d.mts.map +1 -0
  243. package/dist/client/components/fields/relation-field.mjs +106 -0
  244. package/dist/client/components/fields/relation-field.mjs.map +1 -0
  245. package/dist/client/components/fields/relation-picker.d.mts +4 -0
  246. package/dist/client/components/fields/relation-picker.mjs +301 -0
  247. package/dist/client/components/fields/relation-picker.mjs.map +1 -0
  248. package/dist/client/components/fields/relation-select.d.mts +3 -0
  249. package/dist/client/components/fields/relation-select.mjs +219 -0
  250. package/dist/client/components/fields/relation-select.mjs.map +1 -0
  251. package/dist/client/components/fields/reverse-relation-field.d.mts +2 -0
  252. package/dist/client/components/fields/rich-text-editor/bubble-menu.mjs +56 -0
  253. package/dist/client/components/fields/rich-text-editor/bubble-menu.mjs.map +1 -0
  254. package/dist/client/components/fields/rich-text-editor/extensions.mjs +118 -0
  255. package/dist/client/components/fields/rich-text-editor/extensions.mjs.map +1 -0
  256. package/dist/client/components/fields/rich-text-editor/image-popover.mjs +196 -0
  257. package/dist/client/components/fields/rich-text-editor/image-popover.mjs.map +1 -0
  258. package/dist/client/components/fields/rich-text-editor/index.d.mts +4 -0
  259. package/dist/client/components/fields/rich-text-editor/index.mjs +187 -0
  260. package/dist/client/components/fields/rich-text-editor/index.mjs.map +1 -0
  261. package/dist/client/components/fields/rich-text-editor/link-popover.mjs +86 -0
  262. package/dist/client/components/fields/rich-text-editor/link-popover.mjs.map +1 -0
  263. package/dist/client/components/fields/rich-text-editor/presets.d.mts +11 -0
  264. package/dist/client/components/fields/rich-text-editor/presets.d.mts.map +1 -0
  265. package/dist/client/components/fields/rich-text-editor/presets.mjs +124 -0
  266. package/dist/client/components/fields/rich-text-editor/presets.mjs.map +1 -0
  267. package/dist/client/components/fields/rich-text-editor/slash-commands.mjs +145 -0
  268. package/dist/client/components/fields/rich-text-editor/slash-commands.mjs.map +1 -0
  269. package/dist/client/components/fields/rich-text-editor/table-controls.mjs +124 -0
  270. package/dist/client/components/fields/rich-text-editor/table-controls.mjs.map +1 -0
  271. package/dist/client/components/fields/rich-text-editor/toolbar.mjs +280 -0
  272. package/dist/client/components/fields/rich-text-editor/toolbar.mjs.map +1 -0
  273. package/dist/client/components/fields/rich-text-editor/types.d.mts +78 -0
  274. package/dist/client/components/fields/rich-text-editor/types.d.mts.map +1 -0
  275. package/dist/client/components/fields/rich-text-editor/types.mjs +31 -0
  276. package/dist/client/components/fields/rich-text-editor/types.mjs.map +1 -0
  277. package/dist/client/components/fields/rich-text-editor/utils.mjs +51 -0
  278. package/dist/client/components/fields/rich-text-editor/utils.mjs.map +1 -0
  279. package/dist/client/components/fields/rich-text-editor/variants.d.mts +2 -0
  280. package/dist/client/components/fields/rich-text-field.d.mts +14 -0
  281. package/dist/client/components/fields/rich-text-field.d.mts.map +1 -0
  282. package/dist/client/components/fields/rich-text-field.mjs +26 -0
  283. package/dist/client/components/fields/rich-text-field.mjs.map +1 -0
  284. package/dist/client/components/fields/select-field.d.mts +25 -0
  285. package/dist/client/components/fields/select-field.d.mts.map +1 -0
  286. package/dist/client/components/fields/select-field.mjs +53 -0
  287. package/dist/client/components/fields/select-field.mjs.map +1 -0
  288. package/dist/client/components/fields/status-field.d.mts +2 -0
  289. package/dist/client/components/fields/text-field.d.mts +22 -0
  290. package/dist/client/components/fields/text-field.d.mts.map +1 -0
  291. package/dist/client/components/fields/text-field.mjs +39 -0
  292. package/dist/client/components/fields/text-field.mjs.map +1 -0
  293. package/dist/client/components/fields/textarea-field.d.mts +22 -0
  294. package/dist/client/components/fields/textarea-field.d.mts.map +1 -0
  295. package/dist/client/components/fields/textarea-field.mjs +39 -0
  296. package/dist/client/components/fields/textarea-field.mjs.map +1 -0
  297. package/dist/client/components/fields/time-field.d.mts +20 -0
  298. package/dist/client/components/fields/time-field.d.mts.map +1 -0
  299. package/dist/client/components/fields/time-field.mjs +39 -0
  300. package/dist/client/components/fields/time-field.mjs.map +1 -0
  301. package/dist/client/components/fields/upload-field.d.mts +97 -0
  302. package/dist/client/components/fields/upload-field.d.mts.map +1 -0
  303. package/dist/client/components/fields/upload-field.mjs +497 -0
  304. package/dist/client/components/fields/upload-field.mjs.map +1 -0
  305. package/dist/client/components/filter-builder/columns-tab.d.mts +1 -0
  306. package/dist/client/components/filter-builder/columns-tab.mjs +131 -0
  307. package/dist/client/components/filter-builder/columns-tab.mjs.map +1 -0
  308. package/dist/client/components/filter-builder/filter-builder-sheet.d.mts +1 -0
  309. package/dist/client/components/filter-builder/filter-builder-sheet.mjs +157 -0
  310. package/dist/client/components/filter-builder/filter-builder-sheet.mjs.map +1 -0
  311. package/dist/client/components/filter-builder/filters-tab.d.mts +1 -0
  312. package/dist/client/components/filter-builder/filters-tab.mjs +380 -0
  313. package/dist/client/components/filter-builder/filters-tab.mjs.map +1 -0
  314. package/dist/client/components/filter-builder/index.d.mts +5 -0
  315. package/dist/client/components/filter-builder/saved-views-tab.d.mts +1 -0
  316. package/dist/client/components/filter-builder/saved-views-tab.mjs +125 -0
  317. package/dist/client/components/filter-builder/saved-views-tab.mjs.map +1 -0
  318. package/dist/client/components/index.d.mts +80 -0
  319. package/dist/client/components/locale-switcher.d.mts +2 -0
  320. package/dist/client/components/locale-switcher.mjs +128 -0
  321. package/dist/client/components/locale-switcher.mjs.map +1 -0
  322. package/dist/client/components/media/media-grid.mjs +139 -0
  323. package/dist/client/components/media/media-grid.mjs.map +1 -0
  324. package/dist/client/components/media/media-picker-dialog.mjs +255 -0
  325. package/dist/client/components/media/media-picker-dialog.mjs.map +1 -0
  326. package/dist/client/components/preview/live-preview-mode.mjs +211 -0
  327. package/dist/client/components/preview/live-preview-mode.mjs.map +1 -0
  328. package/dist/client/components/preview/preview-pane.mjs +179 -0
  329. package/dist/client/components/preview/preview-pane.mjs.map +1 -0
  330. package/dist/client/components/primitives/asset-preview.mjs +363 -0
  331. package/dist/client/components/primitives/asset-preview.mjs.map +1 -0
  332. package/dist/client/components/primitives/checkbox-input.mjs +33 -0
  333. package/dist/client/components/primitives/checkbox-input.mjs.map +1 -0
  334. package/dist/client/components/primitives/date-input.mjs +218 -0
  335. package/dist/client/components/primitives/date-input.mjs.map +1 -0
  336. package/dist/client/components/primitives/dropzone.mjs +239 -0
  337. package/dist/client/components/primitives/dropzone.mjs.map +1 -0
  338. package/dist/client/components/primitives/number-input.mjs +113 -0
  339. package/dist/client/components/primitives/number-input.mjs.map +1 -0
  340. package/dist/client/components/primitives/select-multi.mjs +256 -0
  341. package/dist/client/components/primitives/select-multi.mjs.map +1 -0
  342. package/dist/client/components/primitives/select-single.mjs +183 -0
  343. package/dist/client/components/primitives/select-single.mjs.map +1 -0
  344. package/dist/client/components/primitives/text-input.mjs +40 -0
  345. package/dist/client/components/primitives/text-input.mjs.map +1 -0
  346. package/dist/client/components/primitives/textarea-input.mjs +38 -0
  347. package/dist/client/components/primitives/textarea-input.mjs.map +1 -0
  348. package/dist/client/components/primitives/time-input.mjs +72 -0
  349. package/dist/client/components/primitives/time-input.mjs.map +1 -0
  350. package/dist/client/components/primitives/toggle-input.mjs +31 -0
  351. package/dist/client/components/primitives/toggle-input.mjs.map +1 -0
  352. package/dist/client/components/primitives/types.d.mts +14 -0
  353. package/dist/client/components/primitives/types.d.mts.map +1 -0
  354. package/dist/client/components/primitives/types.mjs +13 -0
  355. package/dist/client/components/primitives/types.mjs.map +1 -0
  356. package/dist/client/components/sheets/index.d.mts +1 -0
  357. package/dist/client/components/sheets/resource-sheet.d.mts +1 -0
  358. package/dist/client/components/sheets/resource-sheet.mjs +78 -0
  359. package/dist/client/components/sheets/resource-sheet.mjs.map +1 -0
  360. package/dist/client/components/ui/accordion.d.mts +2 -0
  361. package/dist/client/components/ui/accordion.mjs +50 -0
  362. package/dist/client/components/ui/accordion.mjs.map +1 -0
  363. package/dist/client/components/ui/alert.mjs +32 -0
  364. package/dist/client/components/ui/alert.mjs.map +1 -0
  365. package/dist/client/components/ui/avatar.d.mts +3 -0
  366. package/dist/client/components/ui/badge.d.mts +3 -0
  367. package/dist/client/components/ui/badge.mjs +35 -0
  368. package/dist/client/components/ui/badge.mjs.map +1 -0
  369. package/dist/client/components/ui/button.d.mts +3 -0
  370. package/dist/client/components/ui/button.mjs +49 -0
  371. package/dist/client/components/ui/button.mjs.map +1 -0
  372. package/dist/client/components/ui/card.d.mts +2 -0
  373. package/dist/{card-BKHjBQfw.mjs → client/components/ui/card.mjs} +3 -10
  374. package/dist/{card-BKHjBQfw.mjs.map → client/components/ui/card.mjs.map} +1 -1
  375. package/dist/client/components/ui/checkbox.d.mts +2 -0
  376. package/dist/client/components/ui/checkbox.mjs +27 -0
  377. package/dist/client/components/ui/checkbox.mjs.map +1 -0
  378. package/dist/client/components/ui/combobox.d.mts +3 -0
  379. package/dist/client/components/ui/command.mjs +69 -0
  380. package/dist/client/components/ui/command.mjs.map +1 -0
  381. package/dist/client/components/ui/dialog.d.mts +3 -0
  382. package/dist/client/components/ui/dialog.mjs +83 -0
  383. package/dist/client/components/ui/dialog.mjs.map +1 -0
  384. package/dist/client/components/ui/drawer.mjs +75 -0
  385. package/dist/client/components/ui/drawer.mjs.map +1 -0
  386. package/dist/client/components/ui/dropdown-menu.d.mts +3 -0
  387. package/dist/client/components/ui/dropdown-menu.mjs +89 -0
  388. package/dist/client/components/ui/dropdown-menu.mjs.map +1 -0
  389. package/dist/client/components/ui/empty-state.mjs +53 -0
  390. package/dist/client/components/ui/empty-state.mjs.map +1 -0
  391. package/dist/client/components/ui/field.d.mts +3 -0
  392. package/dist/client/components/ui/field.mjs +78 -0
  393. package/dist/client/components/ui/field.mjs.map +1 -0
  394. package/dist/client/components/ui/input-group.d.mts +4 -0
  395. package/dist/client/components/ui/input-group.mjs +68 -0
  396. package/dist/client/components/ui/input-group.mjs.map +1 -0
  397. package/dist/client/components/ui/input.d.mts +2 -0
  398. package/dist/client/components/ui/input.mjs +17 -0
  399. package/dist/client/components/ui/input.mjs.map +1 -0
  400. package/dist/client/components/ui/kbd.mjs +24 -0
  401. package/dist/client/components/ui/kbd.mjs.map +1 -0
  402. package/dist/client/components/ui/label.d.mts +2 -0
  403. package/dist/client/components/ui/label.mjs +15 -0
  404. package/dist/client/components/ui/label.mjs.map +1 -0
  405. package/dist/client/components/ui/popover.d.mts +3 -0
  406. package/dist/client/components/ui/popover.mjs +49 -0
  407. package/dist/client/components/ui/popover.mjs.map +1 -0
  408. package/dist/client/components/ui/responsive-dialog.mjs +102 -0
  409. package/dist/client/components/ui/responsive-dialog.mjs.map +1 -0
  410. package/dist/client/components/ui/scroll-area.d.mts +2 -0
  411. package/dist/client/components/ui/search-input.mjs +74 -0
  412. package/dist/client/components/ui/search-input.mjs.map +1 -0
  413. package/dist/client/components/ui/select.d.mts +3 -0
  414. package/dist/client/components/ui/select.mjs +85 -0
  415. package/dist/client/components/ui/select.mjs.map +1 -0
  416. package/dist/client/components/ui/separator.d.mts +2 -0
  417. package/dist/client/components/ui/separator.mjs +17 -0
  418. package/dist/client/components/ui/separator.mjs.map +1 -0
  419. package/dist/client/components/ui/sheet.d.mts +3 -0
  420. package/dist/client/components/ui/sheet.mjs +78 -0
  421. package/dist/client/components/ui/sheet.mjs.map +1 -0
  422. package/dist/client/components/ui/sidebar.d.mts +8 -0
  423. package/dist/client/components/ui/sidebar.mjs +256 -0
  424. package/dist/client/components/ui/sidebar.mjs.map +1 -0
  425. package/dist/client/components/ui/skeleton.d.mts +1 -0
  426. package/dist/client/components/ui/skeleton.mjs +15 -0
  427. package/dist/client/components/ui/skeleton.mjs.map +1 -0
  428. package/dist/client/components/ui/sonner.d.mts +14 -0
  429. package/dist/client/components/ui/sonner.d.mts.map +1 -0
  430. package/dist/client/components/ui/sonner.mjs +55 -0
  431. package/dist/client/components/ui/sonner.mjs.map +1 -0
  432. package/dist/client/components/ui/spinner.d.mts +1 -0
  433. package/dist/client/components/ui/spinner.mjs +18 -0
  434. package/dist/client/components/ui/spinner.mjs.map +1 -0
  435. package/dist/client/components/ui/switch.d.mts +2 -0
  436. package/dist/client/components/ui/switch.mjs +23 -0
  437. package/dist/client/components/ui/switch.mjs.map +1 -0
  438. package/dist/client/components/ui/table.d.mts +2 -0
  439. package/dist/client/components/ui/table.mjs +66 -0
  440. package/dist/client/components/ui/table.mjs.map +1 -0
  441. package/dist/client/components/ui/tabs.d.mts +3 -0
  442. package/dist/client/components/ui/tabs.mjs +49 -0
  443. package/dist/client/components/ui/tabs.mjs.map +1 -0
  444. package/dist/client/components/ui/textarea.d.mts +2 -0
  445. package/dist/client/components/ui/textarea.mjs +15 -0
  446. package/dist/client/components/ui/textarea.mjs.map +1 -0
  447. package/dist/client/components/ui/toolbar.mjs +54 -0
  448. package/dist/client/components/ui/toolbar.mjs.map +1 -0
  449. package/dist/client/components/ui/tooltip.d.mts +2 -0
  450. package/dist/client/components/ui/tooltip.mjs +45 -0
  451. package/dist/client/components/ui/tooltip.mjs.map +1 -0
  452. package/dist/client/components/widgets/chart-widget.d.mts +57 -0
  453. package/dist/client/components/widgets/chart-widget.d.mts.map +1 -0
  454. package/dist/client/components/widgets/chart-widget.mjs +282 -0
  455. package/dist/client/components/widgets/chart-widget.mjs.map +1 -0
  456. package/dist/client/components/widgets/progress-widget.d.mts +41 -0
  457. package/dist/client/components/widgets/progress-widget.d.mts.map +1 -0
  458. package/dist/client/components/widgets/progress-widget.mjs +110 -0
  459. package/dist/client/components/widgets/progress-widget.mjs.map +1 -0
  460. package/dist/client/components/widgets/quick-actions-widget.d.mts +29 -0
  461. package/dist/client/components/widgets/quick-actions-widget.d.mts.map +1 -0
  462. package/dist/client/components/widgets/quick-actions-widget.mjs +121 -0
  463. package/dist/client/components/widgets/quick-actions-widget.mjs.map +1 -0
  464. package/dist/client/components/widgets/recent-items-widget.d.mts +51 -0
  465. package/dist/client/components/widgets/recent-items-widget.d.mts.map +1 -0
  466. package/dist/client/components/widgets/recent-items-widget.mjs +101 -0
  467. package/dist/client/components/widgets/recent-items-widget.mjs.map +1 -0
  468. package/dist/client/components/widgets/stats-widget.d.mts +55 -0
  469. package/dist/client/components/widgets/stats-widget.d.mts.map +1 -0
  470. package/dist/client/components/widgets/stats-widget.mjs +150 -0
  471. package/dist/client/components/widgets/stats-widget.mjs.map +1 -0
  472. package/dist/client/components/widgets/table-widget.d.mts +31 -0
  473. package/dist/client/components/widgets/table-widget.d.mts.map +1 -0
  474. package/dist/client/components/widgets/table-widget.mjs +139 -0
  475. package/dist/client/components/widgets/table-widget.mjs.map +1 -0
  476. package/dist/client/components/widgets/timeline-widget.d.mts +51 -0
  477. package/dist/client/components/widgets/timeline-widget.d.mts.map +1 -0
  478. package/dist/client/components/widgets/timeline-widget.mjs +168 -0
  479. package/dist/client/components/widgets/timeline-widget.mjs.map +1 -0
  480. package/dist/client/components/widgets/value-widget.d.mts +39 -0
  481. package/dist/client/components/widgets/value-widget.d.mts.map +1 -0
  482. package/dist/client/components/widgets/value-widget.mjs +111 -0
  483. package/dist/client/components/widgets/value-widget.mjs.map +1 -0
  484. package/dist/client/components/widgets/widget-skeletons.mjs +145 -0
  485. package/dist/client/components/widgets/widget-skeletons.mjs.map +1 -0
  486. package/dist/client/context/focus-context.d.mts +88 -0
  487. package/dist/client/context/focus-context.d.mts.map +1 -0
  488. package/dist/client/context/focus-context.mjs +178 -0
  489. package/dist/client/context/focus-context.mjs.map +1 -0
  490. package/dist/client/contexts/breadcrumb-context.mjs +32 -0
  491. package/dist/client/contexts/breadcrumb-context.mjs.map +1 -0
  492. package/dist/client/hooks/typed-hooks.d.mts +84 -0
  493. package/dist/client/hooks/typed-hooks.d.mts.map +1 -0
  494. package/dist/client/hooks/typed-hooks.mjs +272 -0
  495. package/dist/client/hooks/typed-hooks.mjs.map +1 -0
  496. package/dist/client/hooks/use-action.mjs +201 -0
  497. package/dist/client/hooks/use-action.mjs.map +1 -0
  498. package/dist/client/hooks/use-admin-config.mjs +40 -0
  499. package/dist/client/hooks/use-admin-config.mjs.map +1 -0
  500. package/dist/client/hooks/use-admin-preferences.mjs +68 -0
  501. package/dist/client/hooks/use-admin-preferences.mjs.map +1 -0
  502. package/dist/client/hooks/use-admin-routes.mjs +97 -0
  503. package/dist/client/hooks/use-admin-routes.mjs.map +1 -0
  504. package/dist/client/hooks/use-auth.d.mts +98 -0
  505. package/dist/client/hooks/use-auth.d.mts.map +1 -0
  506. package/dist/{use-auth-BoLmWtmU.mjs → client/hooks/use-auth.mjs} +3 -3
  507. package/dist/client/hooks/use-auth.mjs.map +1 -0
  508. package/dist/client/hooks/use-collection-fields.mjs +32 -0
  509. package/dist/client/hooks/use-collection-fields.mjs.map +1 -0
  510. package/dist/client/hooks/use-collection-meta.mjs +121 -0
  511. package/dist/client/hooks/use-collection-meta.mjs.map +1 -0
  512. package/dist/client/hooks/use-collection-schema.mjs +67 -0
  513. package/dist/client/hooks/use-collection-schema.mjs.map +1 -0
  514. package/dist/client/hooks/use-collection-validation.mjs +74 -0
  515. package/dist/client/hooks/use-collection-validation.mjs.map +1 -0
  516. package/dist/client/hooks/use-collection.d.mts +86 -0
  517. package/dist/client/hooks/use-collection.d.mts.map +1 -0
  518. package/dist/client/hooks/use-collection.mjs +214 -0
  519. package/dist/client/hooks/use-collection.mjs.map +1 -0
  520. package/dist/client/hooks/use-current-user.d.mts +57 -0
  521. package/dist/client/hooks/use-current-user.d.mts.map +1 -0
  522. package/dist/client/hooks/use-current-user.mjs +79 -0
  523. package/dist/client/hooks/use-current-user.mjs.map +1 -0
  524. package/dist/client/hooks/use-field-hooks.mjs +191 -0
  525. package/dist/client/hooks/use-field-hooks.mjs.map +1 -0
  526. package/dist/client/hooks/use-field-options.d.mts +90 -0
  527. package/dist/client/hooks/use-field-options.d.mts.map +1 -0
  528. package/dist/client/hooks/use-field-options.mjs +184 -0
  529. package/dist/client/hooks/use-field-options.mjs.map +1 -0
  530. package/dist/client/hooks/use-global-fields.mjs +27 -0
  531. package/dist/client/hooks/use-global-fields.mjs.map +1 -0
  532. package/dist/client/hooks/use-global-meta.mjs +59 -0
  533. package/dist/client/hooks/use-global-meta.mjs.map +1 -0
  534. package/dist/client/hooks/use-global-schema.mjs +33 -0
  535. package/dist/client/hooks/use-global-schema.mjs.map +1 -0
  536. package/dist/client/hooks/use-global.d.mts +40 -0
  537. package/dist/client/hooks/use-global.d.mts.map +1 -0
  538. package/dist/client/hooks/use-global.mjs +74 -0
  539. package/dist/client/hooks/use-global.mjs.map +1 -0
  540. package/dist/client/hooks/use-locks.mjs +245 -0
  541. package/dist/client/hooks/use-locks.mjs.map +1 -0
  542. package/dist/client/hooks/use-media-query.d.mts +23 -0
  543. package/dist/client/hooks/use-media-query.d.mts.map +1 -0
  544. package/dist/client/hooks/use-media-query.mjs +62 -0
  545. package/dist/client/hooks/use-media-query.mjs.map +1 -0
  546. package/dist/client/hooks/use-prefill-params.mjs +47 -0
  547. package/dist/client/hooks/use-prefill-params.mjs.map +1 -0
  548. package/dist/client/hooks/use-questpie-query-options.mjs +28 -0
  549. package/dist/client/hooks/use-questpie-query-options.mjs.map +1 -0
  550. package/dist/client/hooks/use-reactive-fields.d.mts +75 -0
  551. package/dist/client/hooks/use-reactive-fields.d.mts.map +1 -0
  552. package/dist/client/hooks/use-reactive-fields.mjs +164 -0
  553. package/dist/client/hooks/use-reactive-fields.mjs.map +1 -0
  554. package/dist/client/hooks/use-realtime-highlight.mjs +96 -0
  555. package/dist/client/hooks/use-realtime-highlight.mjs.map +1 -0
  556. package/dist/client/hooks/use-saved-views.mjs +65 -0
  557. package/dist/client/hooks/use-saved-views.mjs.map +1 -0
  558. package/dist/client/hooks/use-search.mjs +147 -0
  559. package/dist/client/hooks/use-search.mjs.map +1 -0
  560. package/dist/client/hooks/use-server-validation.mjs +199 -0
  561. package/dist/client/hooks/use-server-validation.mjs.map +1 -0
  562. package/dist/client/hooks/use-server-widget-data.d.mts +26 -0
  563. package/dist/client/hooks/use-server-widget-data.d.mts.map +1 -0
  564. package/dist/client/hooks/use-server-widget-data.mjs +40 -0
  565. package/dist/client/hooks/use-server-widget-data.mjs.map +1 -0
  566. package/dist/client/hooks/use-setup-status.d.mts +39 -0
  567. package/dist/client/hooks/use-setup-status.d.mts.map +1 -0
  568. package/dist/client/hooks/use-setup-status.mjs +50 -0
  569. package/dist/client/hooks/use-setup-status.mjs.map +1 -0
  570. package/dist/client/hooks/use-upload-collection.mjs +32 -0
  571. package/dist/client/hooks/use-upload-collection.mjs.map +1 -0
  572. package/dist/client/hooks/use-upload.d.mts +23 -0
  573. package/dist/client/hooks/use-upload.d.mts.map +1 -0
  574. package/dist/client/hooks/use-upload.mjs +145 -0
  575. package/dist/client/hooks/use-upload.mjs.map +1 -0
  576. package/dist/client/hooks/use-validation-error-map.mjs +53 -0
  577. package/dist/client/hooks/use-validation-error-map.mjs.map +1 -0
  578. package/dist/client/hooks/use-view-state.mjs +261 -0
  579. package/dist/client/hooks/use-view-state.mjs.map +1 -0
  580. package/dist/client/i18n/hooks.mjs +160 -0
  581. package/dist/client/i18n/hooks.mjs.map +1 -0
  582. package/dist/client/i18n/intl-cache.mjs +65 -0
  583. package/dist/client/i18n/intl-cache.mjs.map +1 -0
  584. package/dist/client/i18n/messages.mjs +7 -0
  585. package/dist/client/i18n/messages.mjs.map +1 -0
  586. package/dist/client/i18n/simple.d.mts +22 -0
  587. package/dist/client/i18n/simple.d.mts.map +1 -0
  588. package/dist/client/i18n/simple.mjs +157 -0
  589. package/dist/client/i18n/simple.mjs.map +1 -0
  590. package/dist/client/i18n/types.d.mts +110 -0
  591. package/dist/client/i18n/types.d.mts.map +1 -0
  592. package/dist/client/lib/utils.d.mts +1 -0
  593. package/dist/client/lib/utils.mjs +28 -0
  594. package/dist/client/lib/utils.mjs.map +1 -0
  595. package/dist/client/preview/block-scope-context.d.mts +74 -0
  596. package/dist/client/preview/block-scope-context.d.mts.map +1 -0
  597. package/dist/client/preview/block-scope-context.mjs +93 -0
  598. package/dist/client/preview/block-scope-context.mjs.map +1 -0
  599. package/dist/client/preview/index.d.mts +5 -0
  600. package/dist/client/preview/preview-banner.d.mts +46 -0
  601. package/dist/client/preview/preview-banner.d.mts.map +1 -0
  602. package/dist/client/preview/preview-banner.mjs +95 -0
  603. package/dist/client/preview/preview-banner.mjs.map +1 -0
  604. package/dist/client/preview/preview-field.d.mts +108 -0
  605. package/dist/client/preview/preview-field.d.mts.map +1 -0
  606. package/dist/client/preview/preview-field.mjs +125 -0
  607. package/dist/client/preview/preview-field.mjs.map +1 -0
  608. package/dist/client/preview/types.d.mts +115 -0
  609. package/dist/client/preview/types.d.mts.map +1 -0
  610. package/dist/client/preview/types.mjs +21 -0
  611. package/dist/client/preview/types.mjs.map +1 -0
  612. package/dist/client/preview/use-collection-preview.d.mts +71 -0
  613. package/dist/client/preview/use-collection-preview.d.mts.map +1 -0
  614. package/dist/client/preview/use-collection-preview.mjs +114 -0
  615. package/dist/client/preview/use-collection-preview.mjs.map +1 -0
  616. package/dist/client/runtime/content-locales-provider.d.mts +1 -0
  617. package/dist/client/runtime/content-locales-provider.mjs +85 -0
  618. package/dist/client/runtime/content-locales-provider.mjs.map +1 -0
  619. package/dist/client/runtime/index.d.mts +7 -0
  620. package/dist/client/runtime/index.mjs +8 -0
  621. package/dist/client/runtime/locale-scope.d.mts +2 -0
  622. package/dist/{runtime-6VZM878K.mjs → client/runtime/locale-scope.mjs} +3 -4
  623. package/dist/client/runtime/locale-scope.mjs.map +1 -0
  624. package/dist/client/runtime/provider.d.mts +10107 -0
  625. package/dist/client/runtime/provider.d.mts.map +1 -0
  626. package/dist/client/runtime/provider.mjs +229 -0
  627. package/dist/client/runtime/provider.mjs.map +1 -0
  628. package/dist/client/runtime/routes.d.mts +49 -0
  629. package/dist/client/runtime/routes.d.mts.map +1 -0
  630. package/dist/client/runtime/routes.mjs +107 -0
  631. package/dist/client/runtime/routes.mjs.map +1 -0
  632. package/dist/client/runtime/translations-provider.d.mts +2 -0
  633. package/dist/client/runtime/translations-provider.mjs +181 -0
  634. package/dist/client/runtime/translations-provider.mjs.map +1 -0
  635. package/dist/client/scope/index.d.mts +3 -0
  636. package/dist/client/scope/picker.d.mts +54 -0
  637. package/dist/client/scope/picker.d.mts.map +1 -0
  638. package/dist/client/scope/picker.mjs +161 -0
  639. package/dist/client/scope/picker.mjs.map +1 -0
  640. package/dist/client/scope/provider.d.mts +104 -0
  641. package/dist/client/scope/provider.d.mts.map +1 -0
  642. package/dist/client/scope/provider.mjs +159 -0
  643. package/dist/client/scope/provider.mjs.map +1 -0
  644. package/dist/client/scope/types.d.mts +112 -0
  645. package/dist/client/scope/types.d.mts.map +1 -0
  646. package/dist/client/styles/index.css +80 -0
  647. package/dist/client/utils/auto-expand-fields.mjs +65 -0
  648. package/dist/client/utils/auto-expand-fields.mjs.map +1 -0
  649. package/dist/client/utils/build-field-definitions-from-schema.mjs +256 -0
  650. package/dist/client/utils/build-field-definitions-from-schema.mjs.map +1 -0
  651. package/dist/client/utils/detect-relations.mjs +46 -0
  652. package/dist/client/utils/detect-relations.mjs.map +1 -0
  653. package/dist/client/utils/locale-to-flag.d.mts +118 -0
  654. package/dist/client/utils/locale-to-flag.d.mts.map +1 -0
  655. package/dist/client/utils/locale-to-flag.mjs +130 -0
  656. package/dist/client/utils/locale-to-flag.mjs.map +1 -0
  657. package/dist/client/utils/routes.mjs +196 -0
  658. package/dist/client/utils/routes.mjs.map +1 -0
  659. package/dist/client/views/auth/accept-invite-form.d.mts +73 -0
  660. package/dist/client/views/auth/accept-invite-form.d.mts.map +1 -0
  661. package/dist/client/views/auth/accept-invite-form.mjs +180 -0
  662. package/dist/client/views/auth/accept-invite-form.mjs.map +1 -0
  663. package/dist/client/views/auth/auth-layout.d.mts +44 -0
  664. package/dist/client/views/auth/auth-layout.d.mts.map +1 -0
  665. package/dist/client/views/auth/auth-layout.mjs +53 -0
  666. package/dist/client/views/auth/auth-layout.mjs.map +1 -0
  667. package/dist/client/views/auth/forgot-password-form.d.mts +59 -0
  668. package/dist/client/views/auth/forgot-password-form.d.mts.map +1 -0
  669. package/dist/{forgot-password-page-Bcp-An4Y.mjs → client/views/auth/forgot-password-form.mjs} +22 -89
  670. package/dist/client/views/auth/forgot-password-form.mjs.map +1 -0
  671. package/dist/client/views/auth/index.d.mts +7 -0
  672. package/dist/client/views/auth/invite-form.d.mts +1 -0
  673. package/dist/client/views/auth/invite-form.mjs +155 -0
  674. package/dist/client/views/auth/invite-form.mjs.map +1 -0
  675. package/dist/client/views/auth/login-form.d.mts +76 -0
  676. package/dist/client/views/auth/login-form.d.mts.map +1 -0
  677. package/dist/client/views/auth/login-form.mjs +167 -0
  678. package/dist/client/views/auth/login-form.mjs.map +1 -0
  679. package/dist/client/views/auth/reset-password-form.d.mts +66 -0
  680. package/dist/client/views/auth/reset-password-form.d.mts.map +1 -0
  681. package/dist/client/views/auth/reset-password-form.mjs +188 -0
  682. package/dist/client/views/auth/reset-password-form.mjs.map +1 -0
  683. package/dist/client/views/auth/setup-form.d.mts +61 -0
  684. package/dist/client/views/auth/setup-form.d.mts.map +1 -0
  685. package/dist/{setup-page-YAP_fzqh.mjs → client/views/auth/setup-form.mjs} +46 -124
  686. package/dist/client/views/auth/setup-form.mjs.map +1 -0
  687. package/dist/client/views/collection/auto-form-fields.d.mts +4 -0
  688. package/dist/client/views/collection/auto-form-fields.mjs +453 -0
  689. package/dist/client/views/collection/auto-form-fields.mjs.map +1 -0
  690. package/dist/client/views/collection/bulk-action-toolbar.mjs +291 -0
  691. package/dist/client/views/collection/bulk-action-toolbar.mjs.map +1 -0
  692. package/dist/client/views/collection/cells/complex-cells.d.mts +46 -0
  693. package/dist/client/views/collection/cells/complex-cells.d.mts.map +1 -0
  694. package/dist/client/views/collection/cells/complex-cells.mjs +327 -0
  695. package/dist/client/views/collection/cells/complex-cells.mjs.map +1 -0
  696. package/dist/client/views/collection/cells/index.d.mts +7 -0
  697. package/dist/client/views/collection/cells/primitive-cells.d.mts +76 -0
  698. package/dist/client/views/collection/cells/primitive-cells.d.mts.map +1 -0
  699. package/dist/client/views/collection/cells/primitive-cells.mjs +165 -0
  700. package/dist/client/views/collection/cells/primitive-cells.mjs.map +1 -0
  701. package/dist/client/views/collection/cells/relation-cells.d.mts +21 -0
  702. package/dist/client/views/collection/cells/relation-cells.d.mts.map +1 -0
  703. package/dist/client/views/collection/cells/relation-cells.mjs +105 -0
  704. package/dist/client/views/collection/cells/relation-cells.mjs.map +1 -0
  705. package/dist/client/views/collection/cells/shared/asset-thumbnail.d.mts +1 -0
  706. package/dist/client/views/collection/cells/shared/asset-thumbnail.mjs +189 -0
  707. package/dist/client/views/collection/cells/shared/asset-thumbnail.mjs.map +1 -0
  708. package/dist/client/views/collection/cells/shared/cell-helpers.d.mts +2 -0
  709. package/dist/client/views/collection/cells/shared/cell-helpers.mjs +78 -0
  710. package/dist/client/views/collection/cells/shared/cell-helpers.mjs.map +1 -0
  711. package/dist/client/views/collection/cells/shared/relation-chip.d.mts +1 -0
  712. package/dist/client/views/collection/cells/shared/relation-chip.mjs +37 -0
  713. package/dist/client/views/collection/cells/shared/relation-chip.mjs.map +1 -0
  714. package/dist/client/views/collection/cells/upload-cells.d.mts +25 -0
  715. package/dist/client/views/collection/cells/upload-cells.d.mts.map +1 -0
  716. package/dist/client/views/collection/cells/upload-cells.mjs +20 -0
  717. package/dist/client/views/collection/cells/upload-cells.mjs.map +1 -0
  718. package/dist/client/views/collection/columns/build-columns.d.mts +2 -0
  719. package/dist/client/views/collection/columns/build-columns.mjs +156 -0
  720. package/dist/client/views/collection/columns/build-columns.mjs.map +1 -0
  721. package/dist/client/views/collection/columns/column-defaults.d.mts +2 -0
  722. package/dist/client/views/collection/columns/column-defaults.mjs +108 -0
  723. package/dist/client/views/collection/columns/column-defaults.mjs.map +1 -0
  724. package/dist/client/views/collection/columns/index.d.mts +3 -0
  725. package/dist/client/views/collection/columns/types.d.mts +2 -0
  726. package/dist/client/views/collection/field-context.mjs +127 -0
  727. package/dist/client/views/collection/field-context.mjs.map +1 -0
  728. package/dist/client/views/collection/field-renderer.mjs +171 -0
  729. package/dist/client/views/collection/field-renderer.mjs.map +1 -0
  730. package/dist/client/views/collection/form-view.d.mts +112 -0
  731. package/dist/client/views/collection/form-view.d.mts.map +1 -0
  732. package/dist/client/views/collection/form-view.mjs +903 -0
  733. package/dist/client/views/collection/form-view.mjs.map +1 -0
  734. package/dist/client/views/collection/index.d.mts +9 -0
  735. package/dist/client/views/collection/table-view.d.mts +102 -0
  736. package/dist/client/views/collection/table-view.d.mts.map +1 -0
  737. package/dist/client/views/collection/table-view.mjs +695 -0
  738. package/dist/client/views/collection/table-view.mjs.map +1 -0
  739. package/dist/client/views/collection/view-skeletons.mjs +121 -0
  740. package/dist/client/views/collection/view-skeletons.mjs.map +1 -0
  741. package/dist/client/views/common/global-search.d.mts +1 -0
  742. package/dist/client/views/common/global-search.mjs +376 -0
  743. package/dist/client/views/common/global-search.mjs.map +1 -0
  744. package/dist/client/views/common/index.d.mts +1 -0
  745. package/dist/client/views/dashboard/dashboard-grid.mjs +385 -0
  746. package/dist/client/views/dashboard/dashboard-grid.mjs.map +1 -0
  747. package/dist/client/views/dashboard/dashboard-widget.mjs +178 -0
  748. package/dist/client/views/dashboard/dashboard-widget.mjs.map +1 -0
  749. package/dist/client/views/dashboard/widget-card.mjs +159 -0
  750. package/dist/client/views/dashboard/widget-card.mjs.map +1 -0
  751. package/dist/client/views/globals/global-form-view.d.mts +74 -0
  752. package/dist/client/views/globals/global-form-view.d.mts.map +1 -0
  753. package/dist/client/views/globals/global-form-view.mjs +181 -0
  754. package/dist/client/views/globals/global-form-view.mjs.map +1 -0
  755. package/dist/client/views/index.d.mts +28 -0
  756. package/dist/client/views/layout/admin-layout-provider.d.mts +140 -0
  757. package/dist/client/views/layout/admin-layout-provider.d.mts.map +1 -0
  758. package/dist/client/views/layout/admin-layout-provider.mjs +90 -0
  759. package/dist/client/views/layout/admin-layout-provider.mjs.map +1 -0
  760. package/dist/client/views/layout/admin-layout.d.mts +151 -0
  761. package/dist/client/views/layout/admin-layout.d.mts.map +1 -0
  762. package/dist/client/views/layout/admin-layout.mjs +144 -0
  763. package/dist/client/views/layout/admin-layout.mjs.map +1 -0
  764. package/dist/client/views/layout/admin-root.d.mts +7 -0
  765. package/dist/client/views/layout/admin-router.d.mts +125 -0
  766. package/dist/client/views/layout/admin-router.d.mts.map +1 -0
  767. package/dist/client/views/layout/admin-router.mjs +594 -0
  768. package/dist/client/views/layout/admin-router.mjs.map +1 -0
  769. package/dist/client/views/layout/admin-sidebar.d.mts +105 -0
  770. package/dist/client/views/layout/admin-sidebar.d.mts.map +1 -0
  771. package/dist/client/views/layout/admin-sidebar.mjs +550 -0
  772. package/dist/client/views/layout/admin-sidebar.mjs.map +1 -0
  773. package/dist/client/views/layout/admin-topbar.mjs +128 -0
  774. package/dist/client/views/layout/admin-topbar.mjs.map +1 -0
  775. package/dist/client/views/layout/index.d.mts +5 -0
  776. package/dist/client/views/pages/accept-invite-page.d.mts +67 -0
  777. package/dist/client/views/pages/accept-invite-page.d.mts.map +1 -0
  778. package/dist/client/views/pages/accept-invite-page.mjs +143 -0
  779. package/dist/client/views/pages/accept-invite-page.mjs.map +1 -0
  780. package/dist/client/views/pages/dashboard-page.d.mts +52 -0
  781. package/dist/client/views/pages/dashboard-page.d.mts.map +1 -0
  782. package/dist/client/views/pages/dashboard-page.mjs +45 -0
  783. package/dist/client/views/pages/dashboard-page.mjs.map +1 -0
  784. package/dist/client/views/pages/forgot-password-page.d.mts +59 -0
  785. package/dist/client/views/pages/forgot-password-page.d.mts.map +1 -0
  786. package/dist/client/views/pages/forgot-password-page.mjs +80 -0
  787. package/dist/client/views/pages/forgot-password-page.mjs.map +1 -0
  788. package/dist/client/views/pages/index.d.mts +7 -0
  789. package/dist/client/views/pages/invite-page.d.mts +71 -0
  790. package/dist/client/views/pages/invite-page.d.mts.map +1 -0
  791. package/dist/client/views/pages/invite-page.mjs +86 -0
  792. package/dist/client/views/pages/invite-page.mjs.map +1 -0
  793. package/dist/client/views/pages/login-page.d.mts +76 -0
  794. package/dist/client/views/pages/login-page.d.mts.map +1 -0
  795. package/dist/client/views/pages/login-page.mjs +98 -0
  796. package/dist/client/views/pages/login-page.mjs.map +1 -0
  797. package/dist/client/views/pages/reset-password-page.d.mts +66 -0
  798. package/dist/client/views/pages/reset-password-page.d.mts.map +1 -0
  799. package/dist/client/views/pages/reset-password-page.mjs +105 -0
  800. package/dist/client/views/pages/reset-password-page.mjs.map +1 -0
  801. package/dist/client/views/pages/setup-page.d.mts +64 -0
  802. package/dist/client/views/pages/setup-page.d.mts.map +1 -0
  803. package/dist/client/views/pages/setup-page.mjs +91 -0
  804. package/dist/client/views/pages/setup-page.mjs.map +1 -0
  805. package/dist/client.d.mts +92 -3
  806. package/dist/client.d.mts.map +1 -0
  807. package/dist/client.mjs +54 -12
  808. package/dist/components/rich-text/index.d.mts +1 -0
  809. package/dist/components/rich-text/rich-text-renderer.d.mts +104 -0
  810. package/dist/components/rich-text/rich-text-renderer.d.mts.map +1 -0
  811. package/dist/components/rich-text/rich-text-renderer.mjs +210 -0
  812. package/dist/components/rich-text/rich-text-renderer.mjs.map +1 -0
  813. package/dist/index.d.mts +62 -3
  814. package/dist/index.mjs +54 -12
  815. package/dist/server/adapters/nextjs.d.mts +121 -0
  816. package/dist/server/adapters/nextjs.d.mts.map +1 -0
  817. package/dist/server/adapters/nextjs.mjs +111 -0
  818. package/dist/server/adapters/nextjs.mjs.map +1 -0
  819. package/dist/server/adapters/tanstack.d.mts +133 -0
  820. package/dist/server/adapters/tanstack.d.mts.map +1 -0
  821. package/dist/server/adapters/tanstack.mjs +90 -0
  822. package/dist/server/adapters/tanstack.mjs.map +1 -0
  823. package/dist/server/augmentation.d.mts +1523 -0
  824. package/dist/server/augmentation.d.mts.map +1 -0
  825. package/dist/server/auth-helpers.d.mts +143 -0
  826. package/dist/server/auth-helpers.d.mts.map +1 -0
  827. package/dist/server/auth-helpers.mjs +108 -0
  828. package/dist/server/auth-helpers.mjs.map +1 -0
  829. package/dist/server/block/block-builder.d.mts +319 -0
  830. package/dist/server/block/block-builder.d.mts.map +1 -0
  831. package/dist/server/block/block-builder.mjs +217 -0
  832. package/dist/server/block/block-builder.mjs.map +1 -0
  833. package/dist/server/block/index.d.mts +3 -0
  834. package/dist/server/block/introspection.d.mts +84 -0
  835. package/dist/server/block/introspection.d.mts.map +1 -0
  836. package/dist/server/block/introspection.mjs +89 -0
  837. package/dist/server/block/introspection.mjs.map +1 -0
  838. package/dist/server/block/prefetch.d.mts +78 -0
  839. package/dist/server/block/prefetch.d.mts.map +1 -0
  840. package/dist/server/block/prefetch.mjs +240 -0
  841. package/dist/server/block/prefetch.mjs.map +1 -0
  842. package/dist/server/fields/blocks.d.mts +139 -0
  843. package/dist/server/fields/blocks.d.mts.map +1 -0
  844. package/dist/server/fields/blocks.mjs +192 -0
  845. package/dist/server/fields/blocks.mjs.map +1 -0
  846. package/dist/server/fields/index.d.mts +48 -0
  847. package/dist/server/fields/index.d.mts.map +1 -0
  848. package/dist/server/fields/index.mjs +16 -0
  849. package/dist/server/fields/index.mjs.map +1 -0
  850. package/dist/server/fields/rich-text.d.mts +135 -0
  851. package/dist/server/fields/rich-text.d.mts.map +1 -0
  852. package/dist/server/fields/rich-text.mjs +188 -0
  853. package/dist/server/fields/rich-text.mjs.map +1 -0
  854. package/dist/server/i18n/index.d.mts +16 -0
  855. package/dist/server/i18n/index.d.mts.map +1 -0
  856. package/dist/server/i18n/index.mjs +44 -0
  857. package/dist/server/i18n/index.mjs.map +1 -0
  858. package/dist/server/i18n/messages/cs.mjs +461 -0
  859. package/dist/server/i18n/messages/cs.mjs.map +1 -0
  860. package/dist/server/i18n/messages/de.mjs +461 -0
  861. package/dist/server/i18n/messages/de.mjs.map +1 -0
  862. package/dist/server/i18n/messages/en.mjs +493 -0
  863. package/dist/server/i18n/messages/en.mjs.map +1 -0
  864. package/dist/server/i18n/messages/es.mjs +461 -0
  865. package/dist/server/i18n/messages/es.mjs.map +1 -0
  866. package/dist/server/i18n/messages/fr.mjs +461 -0
  867. package/dist/server/i18n/messages/fr.mjs.map +1 -0
  868. package/dist/server/i18n/messages/index.mjs +24 -0
  869. package/dist/server/i18n/messages/index.mjs.map +1 -0
  870. package/dist/server/i18n/messages/pl.mjs +461 -0
  871. package/dist/server/i18n/messages/pl.mjs.map +1 -0
  872. package/dist/server/i18n/messages/pt.mjs +464 -0
  873. package/dist/server/i18n/messages/pt.mjs.map +1 -0
  874. package/dist/server/i18n/messages/sk.mjs +490 -0
  875. package/dist/server/i18n/messages/sk.mjs.map +1 -0
  876. package/dist/server/index.d.mts +20 -0
  877. package/dist/server/modules/admin/functions/admin-config.mjs +348 -0
  878. package/dist/server/modules/admin/functions/admin-config.mjs.map +1 -0
  879. package/dist/server/modules/admin/functions/execute-action.d.mts +107 -0
  880. package/dist/server/modules/admin/functions/execute-action.d.mts.map +1 -0
  881. package/dist/server/modules/admin/functions/execute-action.mjs +331 -0
  882. package/dist/server/modules/admin/functions/execute-action.mjs.map +1 -0
  883. package/dist/server/modules/admin/functions/locales.mjs +80 -0
  884. package/dist/server/modules/admin/functions/locales.mjs.map +1 -0
  885. package/dist/server/modules/admin/functions/preview.d.mts +70 -0
  886. package/dist/server/modules/admin/functions/preview.d.mts.map +1 -0
  887. package/dist/server/modules/admin/functions/preview.mjs +243 -0
  888. package/dist/server/modules/admin/functions/preview.mjs.map +1 -0
  889. package/dist/server/modules/admin/functions/reactive.d.mts +99 -0
  890. package/dist/server/modules/admin/functions/reactive.d.mts.map +1 -0
  891. package/dist/server/modules/admin/functions/reactive.mjs +378 -0
  892. package/dist/server/modules/admin/functions/reactive.mjs.map +1 -0
  893. package/dist/server/modules/admin/functions/setup.d.mts +84 -0
  894. package/dist/server/modules/admin/functions/setup.d.mts.map +1 -0
  895. package/dist/server/modules/admin/functions/setup.mjs +131 -0
  896. package/dist/server/modules/admin/functions/setup.mjs.map +1 -0
  897. package/dist/server/modules/admin/functions/translations.mjs +125 -0
  898. package/dist/server/modules/admin/functions/translations.mjs.map +1 -0
  899. package/dist/server/modules/admin/functions/widget-data.d.mts +33 -0
  900. package/dist/server/modules/admin/functions/widget-data.d.mts.map +1 -0
  901. package/dist/server/modules/admin/functions/widget-data.mjs +70 -0
  902. package/dist/server/modules/admin/functions/widget-data.mjs.map +1 -0
  903. package/dist/server/modules/admin/index.d.mts +16879 -0
  904. package/dist/server/modules/admin/index.d.mts.map +1 -0
  905. package/dist/server/modules/admin/index.mjs +249 -0
  906. package/dist/server/modules/admin/index.mjs.map +1 -0
  907. package/dist/server/modules/admin-preferences/collections/admin-preferences.collection.d.mts +3 -0
  908. package/dist/server/modules/admin-preferences/collections/admin-preferences.collection.mjs +48 -0
  909. package/dist/server/modules/admin-preferences/collections/admin-preferences.collection.mjs.map +1 -0
  910. package/dist/server/modules/admin-preferences/collections/locks.collection.d.mts +3 -0
  911. package/dist/server/modules/admin-preferences/collections/locks.collection.mjs +79 -0
  912. package/dist/server/modules/admin-preferences/collections/locks.collection.mjs.map +1 -0
  913. package/dist/server/modules/admin-preferences/collections/saved-views.collection.d.mts +1490 -0
  914. package/dist/server/modules/admin-preferences/collections/saved-views.collection.d.mts.map +1 -0
  915. package/dist/server/modules/admin-preferences/collections/saved-views.collection.mjs +57 -0
  916. package/dist/server/modules/admin-preferences/collections/saved-views.collection.mjs.map +1 -0
  917. package/dist/server/patch.d.mts +100 -0
  918. package/dist/server/patch.d.mts.map +1 -0
  919. package/dist/server/patch.mjs +1062 -0
  920. package/dist/server/patch.mjs.map +1 -0
  921. package/dist/server.d.mts +21 -250
  922. package/dist/server.mjs +19 -832
  923. package/dist/shared/preview-utils.d.mts +54 -0
  924. package/dist/shared/preview-utils.d.mts.map +1 -0
  925. package/dist/{preview-utils-BKQ9-TMa.mjs → shared/preview-utils.mjs} +2 -2
  926. package/dist/shared/preview-utils.mjs.map +1 -0
  927. package/dist/{saved-views.types-BMsz5mCy.d.mts → shared/types/saved-views.types.d.mts} +7 -2
  928. package/dist/shared/types/saved-views.types.d.mts.map +1 -0
  929. package/dist/shared.d.mts +3 -57
  930. package/dist/shared.mjs +1 -1
  931. package/package.json +12 -17
  932. package/dist/auth-layout-M8K8_q5R.mjs +0 -181
  933. package/dist/auth-layout-M8K8_q5R.mjs.map +0 -1
  934. package/dist/bulk-upload-dialog-D7w7W1Hl.mjs +0 -273
  935. package/dist/bulk-upload-dialog-D7w7W1Hl.mjs.map +0 -1
  936. package/dist/client-B7r47hEd.d.mts +0 -13403
  937. package/dist/client-B7r47hEd.d.mts.map +0 -1
  938. package/dist/client-njX1rZmi.mjs +0 -22612
  939. package/dist/client-njX1rZmi.mjs.map +0 -1
  940. package/dist/content-locales-provider-BXvuIgfg.mjs +0 -1650
  941. package/dist/content-locales-provider-BXvuIgfg.mjs.map +0 -1
  942. package/dist/dashboard-page-B4PGEdc2.mjs +0 -2500
  943. package/dist/dashboard-page-B4PGEdc2.mjs.map +0 -1
  944. package/dist/dashboard-page-mCY0pgZv.mjs +0 -3
  945. package/dist/dropzone-Do3awXKd.mjs +0 -634
  946. package/dist/dropzone-Do3awXKd.mjs.map +0 -1
  947. package/dist/forgot-password-page-Bcp-An4Y.mjs.map +0 -1
  948. package/dist/forgot-password-page-CEwsdLwn.mjs +0 -3
  949. package/dist/index-BYyqkWtn.d.mts +0 -2753
  950. package/dist/index-BYyqkWtn.d.mts.map +0 -1
  951. package/dist/login-page-BUnpCbCa.mjs +0 -3
  952. package/dist/login-page-CP4gA-dl.mjs +0 -298
  953. package/dist/login-page-CP4gA-dl.mjs.map +0 -1
  954. package/dist/preview-utils-BKQ9-TMa.mjs.map +0 -1
  955. package/dist/reset-password-page-BqfDmLxA.mjs +0 -281
  956. package/dist/reset-password-page-BqfDmLxA.mjs.map +0 -1
  957. package/dist/reset-password-page-CufHz3h3.mjs +0 -3
  958. package/dist/runtime-6VZM878K.mjs.map +0 -1
  959. package/dist/saved-views.types-BMsz5mCy.d.mts.map +0 -1
  960. package/dist/server.d.mts.map +0 -1
  961. package/dist/server.mjs.map +0 -1
  962. package/dist/setup-page-BNNzt_Z6.mjs +0 -3
  963. package/dist/setup-page-YAP_fzqh.mjs.map +0 -1
  964. package/dist/shared.d.mts.map +0 -1
  965. package/dist/use-auth-BoLmWtmU.mjs.map +0 -1
@@ -0,0 +1,75 @@
1
+ import { FieldReactiveSchema } from "questpie/client";
2
+
3
+ //#region src/client/hooks/use-reactive-fields.d.ts
4
+
5
+ /**
6
+ * Reactive field state
7
+ */
8
+ interface ReactiveFieldState {
9
+ hidden?: boolean;
10
+ readOnly?: boolean;
11
+ disabled?: boolean;
12
+ }
13
+ /**
14
+ * Reactive field result
15
+ */
16
+ interface ReactiveFieldResult {
17
+ field: string;
18
+ type: "hidden" | "readOnly" | "disabled" | "compute";
19
+ value: unknown;
20
+ error?: string;
21
+ }
22
+ /**
23
+ * Options for useReactiveFields hook
24
+ */
25
+ interface UseReactiveFieldsOptions {
26
+ /** Collection or global name */
27
+ collection: string;
28
+ /** Entity type - collection or global */
29
+ mode?: "collection" | "global";
30
+ /** Map of field paths to their reactive configs */
31
+ reactiveConfigs: Record<string, FieldReactiveSchema>;
32
+ /** Debounce delay in ms */
33
+ debounce?: number;
34
+ /** Whether to enable reactive updates */
35
+ enabled?: boolean;
36
+ }
37
+ /**
38
+ * Result from useReactiveFields hook
39
+ */
40
+ interface UseReactiveFieldsResult {
41
+ /** Field states (hidden, readOnly, disabled) by field path */
42
+ fieldStates: Record<string, ReactiveFieldState>;
43
+ /** Whether a reactive update is pending */
44
+ isPending: boolean;
45
+ /** Last error */
46
+ error: Error | null;
47
+ /** Force refresh reactive states */
48
+ refresh: () => void;
49
+ }
50
+ /**
51
+ * Hook to manage reactive field states.
52
+ * Watches form changes and triggers server-side handlers when dependencies change.
53
+ *
54
+ * @example
55
+ * ```tsx
56
+ * const { fieldStates, isPending } = useReactiveFields({
57
+ * collection: "posts",
58
+ * reactiveConfigs: fieldsWithReactive,
59
+ * });
60
+ *
61
+ * // Apply states to fields
62
+ * const isHidden = fieldStates["slug"]?.hidden ?? false;
63
+ * const isReadOnly = fieldStates["slug"]?.readOnly ?? false;
64
+ * ```
65
+ */
66
+ declare function useReactiveFields({
67
+ collection,
68
+ mode,
69
+ reactiveConfigs,
70
+ debounce,
71
+ enabled
72
+ }: UseReactiveFieldsOptions): UseReactiveFieldsResult;
73
+ //#endregion
74
+ export { ReactiveFieldResult, ReactiveFieldState, UseReactiveFieldsOptions, UseReactiveFieldsResult, useReactiveFields };
75
+ //# sourceMappingURL=use-reactive-fields.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-reactive-fields.d.mts","names":[],"sources":["../../../src/client/hooks/use-reactive-fields.ts"],"sourcesContent":[],"mappings":";;;;;;;AAkEa,UA/CI,kBAAA,CA+CJ;EAwFG,MAAA,CAAA,EAAA,OAAA;EACf,QAAA,CAAA,EAAA,OAAA;EACA,QAAA,CAAA,EAAA,OAAA;;;;;AAI6B,UApIb,mBAAA,CAoIa;EAAuB,KAAA,EAAA,MAAA;;;;;;;;UA1HpC,wBAAA;;;;;;mBAQC,eAAe;;;;;;;;;UAYhB,uBAAA;;eAEH,eAAe;;;;SAMrB;;;;;;;;;;;;;;;;;;;;iBAwFQ,iBAAA;;;;;;GAMb,2BAA2B"}
@@ -0,0 +1,164 @@
1
+ import { useAdminStore } from "../runtime/provider.mjs";
2
+ import * as React$1 from "react";
3
+ import { useFormContext, useWatch } from "react-hook-form";
4
+
5
+ //#region src/client/hooks/use-reactive-fields.ts
6
+ /**
7
+ * Get sibling data for a field path (for fields inside arrays)
8
+ */
9
+ function getSiblingData(values, fieldPath) {
10
+ const parts = fieldPath.split(".");
11
+ const numericIndex = parts.findIndex((p) => /^\d+$/.test(p));
12
+ if (numericIndex === -1) return null;
13
+ const arrayItemPath = parts.slice(0, numericIndex + 1).join(".");
14
+ let sibling = values;
15
+ for (const part of arrayItemPath.split(".")) if (sibling && typeof sibling === "object") sibling = sibling[part];
16
+ else return null;
17
+ return typeof sibling === "object" ? sibling : null;
18
+ }
19
+ /**
20
+ * Build watch dependencies from reactive configs
21
+ */
22
+ function buildWatchDependencies(reactiveConfigs) {
23
+ const deps = /* @__PURE__ */ new Set();
24
+ for (const config of Object.values(reactiveConfigs)) for (const key of [
25
+ "hidden",
26
+ "readOnly",
27
+ "disabled",
28
+ "compute"
29
+ ]) {
30
+ const reactiveConfig = config[key];
31
+ if (reactiveConfig?.watch) {
32
+ for (const dep of reactiveConfig.watch) if (!dep.startsWith("$")) deps.add(dep);
33
+ }
34
+ }
35
+ return deps;
36
+ }
37
+ /**
38
+ * Hook to manage reactive field states.
39
+ * Watches form changes and triggers server-side handlers when dependencies change.
40
+ *
41
+ * @example
42
+ * ```tsx
43
+ * const { fieldStates, isPending } = useReactiveFields({
44
+ * collection: "posts",
45
+ * reactiveConfigs: fieldsWithReactive,
46
+ * });
47
+ *
48
+ * // Apply states to fields
49
+ * const isHidden = fieldStates["slug"]?.hidden ?? false;
50
+ * const isReadOnly = fieldStates["slug"]?.readOnly ?? false;
51
+ * ```
52
+ */
53
+ function useReactiveFields({ collection, mode = "collection", reactiveConfigs, debounce = 100, enabled = true }) {
54
+ const client = useAdminStore((s) => s.client);
55
+ const form = useFormContext();
56
+ const [fieldStates, setFieldStates] = React$1.useState({});
57
+ const [isPending, setIsPending] = React$1.useState(false);
58
+ const [error, setError] = React$1.useState(null);
59
+ const watchDeps = React$1.useMemo(() => buildWatchDependencies(reactiveConfigs), [reactiveConfigs]);
60
+ const watchedValues = useWatch({ control: form.control });
61
+ const formValues = React$1.useMemo(() => watchedValues ?? {}, [watchedValues]);
62
+ const prevValuesRef = React$1.useRef({});
63
+ const debounceTimerRef = React$1.useRef(null);
64
+ const fetchReactiveStates = React$1.useCallback(async () => {
65
+ if (!enabled || !client || Object.keys(reactiveConfigs).length === 0) return;
66
+ const requests = [];
67
+ for (const [fieldPath, config] of Object.entries(reactiveConfigs)) {
68
+ const siblingData = getSiblingData(formValues, fieldPath);
69
+ const prevSiblingData = getSiblingData(prevValuesRef.current, fieldPath);
70
+ for (const type of [
71
+ "hidden",
72
+ "readOnly",
73
+ "disabled",
74
+ "compute"
75
+ ]) if (config[type]?.watch) requests.push({
76
+ field: fieldPath,
77
+ type,
78
+ formData: formValues,
79
+ siblingData,
80
+ prevData: prevValuesRef.current,
81
+ prevSiblingData
82
+ });
83
+ }
84
+ if (requests.length === 0) return;
85
+ setIsPending(true);
86
+ setError(null);
87
+ try {
88
+ const response = await client.rpc.batchReactive({
89
+ collection,
90
+ type: mode,
91
+ requests
92
+ });
93
+ const newStates = { ...fieldStates };
94
+ for (const result of response.results) {
95
+ if (!newStates[result.field]) newStates[result.field] = {};
96
+ if (result.type === "compute") {
97
+ if (result.value !== void 0) form.setValue(result.field, result.value, {
98
+ shouldDirty: true,
99
+ shouldTouch: false,
100
+ shouldValidate: false
101
+ });
102
+ } else newStates[result.field][result.type] = result.value;
103
+ }
104
+ setFieldStates(newStates);
105
+ } catch (err) {
106
+ console.error("Reactive fields error:", err);
107
+ setError(err instanceof Error ? err : new Error(String(err)));
108
+ } finally {
109
+ setIsPending(false);
110
+ }
111
+ }, [
112
+ enabled,
113
+ client,
114
+ collection,
115
+ mode,
116
+ reactiveConfigs,
117
+ formValues,
118
+ fieldStates,
119
+ form
120
+ ]);
121
+ const isInitializedRef = React$1.useRef(false);
122
+ React$1.useEffect(() => {
123
+ if (!enabled || watchDeps.size === 0) return;
124
+ if (!Object.keys(formValues).some((key) => formValues[key] !== void 0 && formValues[key] !== null)) return;
125
+ if (!isInitializedRef.current) {
126
+ isInitializedRef.current = true;
127
+ prevValuesRef.current = { ...formValues };
128
+ fetchReactiveStates();
129
+ return;
130
+ }
131
+ let hasChanges = false;
132
+ for (const dep of watchDeps) if (formValues[dep] !== prevValuesRef.current[dep]) {
133
+ hasChanges = true;
134
+ break;
135
+ }
136
+ if (!hasChanges) return;
137
+ prevValuesRef.current = { ...formValues };
138
+ if (debounceTimerRef.current) clearTimeout(debounceTimerRef.current);
139
+ debounceTimerRef.current = setTimeout(() => {
140
+ fetchReactiveStates();
141
+ }, debounce);
142
+ return () => {
143
+ if (debounceTimerRef.current) clearTimeout(debounceTimerRef.current);
144
+ };
145
+ }, [
146
+ enabled,
147
+ watchDeps,
148
+ formValues,
149
+ debounce,
150
+ fetchReactiveStates
151
+ ]);
152
+ return {
153
+ fieldStates,
154
+ isPending,
155
+ error,
156
+ refresh: React$1.useCallback(() => {
157
+ fetchReactiveStates();
158
+ }, [fetchReactiveStates])
159
+ };
160
+ }
161
+
162
+ //#endregion
163
+ export { useReactiveFields };
164
+ //# sourceMappingURL=use-reactive-fields.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-reactive-fields.mjs","names":["React","requests: Array<{\n\t\t\tfield: string;\n\t\t\ttype: \"hidden\" | \"readOnly\" | \"disabled\" | \"compute\";\n\t\t\tformData: Record<string, any>;\n\t\t\tsiblingData: Record<string, any> | null;\n\t\t\tprevData: Record<string, any> | null;\n\t\t\tprevSiblingData: Record<string, any> | null;\n\t\t}>","newStates: Record<string, ReactiveFieldState>"],"sources":["../../../src/client/hooks/use-reactive-fields.ts"],"sourcesContent":["/**\n * Reactive Fields Hook\n *\n * Watches form changes and triggers server-side reactive handlers.\n * Supports batched RPC calls with debouncing.\n */\n\nimport type { FieldReactiveSchema } from \"questpie/client\";\nimport * as React from \"react\";\nimport { useFormContext, useWatch } from \"react-hook-form\";\nimport { useAdminStore } from \"../runtime/provider.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Reactive field state\n */\nexport interface ReactiveFieldState {\n\thidden?: boolean;\n\treadOnly?: boolean;\n\tdisabled?: boolean;\n}\n\n/**\n * Reactive field result\n */\nexport interface ReactiveFieldResult {\n\tfield: string;\n\ttype: \"hidden\" | \"readOnly\" | \"disabled\" | \"compute\";\n\tvalue: unknown;\n\terror?: string;\n}\n\n/**\n * Options for useReactiveFields hook\n */\nexport interface UseReactiveFieldsOptions {\n\t/** Collection or global name */\n\tcollection: string;\n\n\t/** Entity type - collection or global */\n\tmode?: \"collection\" | \"global\";\n\n\t/** Map of field paths to their reactive configs */\n\treactiveConfigs: Record<string, FieldReactiveSchema>;\n\n\t/** Debounce delay in ms */\n\tdebounce?: number;\n\n\t/** Whether to enable reactive updates */\n\tenabled?: boolean;\n}\n\n/**\n * Result from useReactiveFields hook\n */\nexport interface UseReactiveFieldsResult {\n\t/** Field states (hidden, readOnly, disabled) by field path */\n\tfieldStates: Record<string, ReactiveFieldState>;\n\n\t/** Whether a reactive update is pending */\n\tisPending: boolean;\n\n\t/** Last error */\n\terror: Error | null;\n\n\t/** Force refresh reactive states */\n\trefresh: () => void;\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Get sibling data for a field path (for fields inside arrays)\n */\nfunction getSiblingData(\n\tvalues: Record<string, any>,\n\tfieldPath: string,\n): Record<string, any> | null {\n\t// Check if field is inside an array (e.g., \"items.0.variant\")\n\tconst parts = fieldPath.split(\".\");\n\tconst numericIndex = parts.findIndex((p) => /^\\d+$/.test(p));\n\n\tif (numericIndex === -1) {\n\t\t// Not in array\n\t\treturn null;\n\t}\n\n\t// Get the array item path (e.g., \"items.0\")\n\tconst arrayItemPath = parts.slice(0, numericIndex + 1).join(\".\");\n\n\t// Navigate to the array item\n\tlet sibling = values;\n\tfor (const part of arrayItemPath.split(\".\")) {\n\t\tif (sibling && typeof sibling === \"object\") {\n\t\t\tsibling = sibling[part];\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\treturn typeof sibling === \"object\" ? sibling : null;\n}\n\n/**\n * Build watch dependencies from reactive configs\n */\nfunction buildWatchDependencies(\n\treactiveConfigs: Record<string, FieldReactiveSchema>,\n): Set<string> {\n\tconst deps = new Set<string>();\n\n\tfor (const config of Object.values(reactiveConfigs)) {\n\t\t// Add deps from hidden, readOnly, disabled, compute\n\t\tfor (const key of [\"hidden\", \"readOnly\", \"disabled\", \"compute\"] as const) {\n\t\t\tconst reactiveConfig = config[key];\n\t\t\tif (reactiveConfig?.watch) {\n\t\t\t\tfor (const dep of reactiveConfig.watch) {\n\t\t\t\t\t// Filter out sibling deps ($sibling.*) for root-level watching\n\t\t\t\t\tif (!dep.startsWith(\"$\")) {\n\t\t\t\t\t\tdeps.add(dep);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn deps;\n}\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * Hook to manage reactive field states.\n * Watches form changes and triggers server-side handlers when dependencies change.\n *\n * @example\n * ```tsx\n * const { fieldStates, isPending } = useReactiveFields({\n * collection: \"posts\",\n * reactiveConfigs: fieldsWithReactive,\n * });\n *\n * // Apply states to fields\n * const isHidden = fieldStates[\"slug\"]?.hidden ?? false;\n * const isReadOnly = fieldStates[\"slug\"]?.readOnly ?? false;\n * ```\n */\nexport function useReactiveFields({\n\tcollection,\n\tmode = \"collection\",\n\treactiveConfigs,\n\tdebounce = 100,\n\tenabled = true,\n}: UseReactiveFieldsOptions): UseReactiveFieldsResult {\n\tconst client = useAdminStore((s) => s.client);\n\tconst form = useFormContext();\n\n\t// State\n\tconst [fieldStates, setFieldStates] = React.useState<\n\t\tRecord<string, ReactiveFieldState>\n\t>({});\n\tconst [isPending, setIsPending] = React.useState(false);\n\tconst [error, setError] = React.useState<Error | null>(null);\n\n\t// Build list of dependencies to watch\n\tconst watchDeps = React.useMemo(\n\t\t() => buildWatchDependencies(reactiveConfigs),\n\t\t[reactiveConfigs],\n\t);\n\n\t// Watch form values\n\tconst watchedValues = useWatch({ control: form.control });\n\tconst formValues = React.useMemo(\n\t\t() => (watchedValues ?? {}) as Record<string, any>,\n\t\t[watchedValues],\n\t);\n\n\t// Previous values ref for change detection\n\tconst prevValuesRef = React.useRef<Record<string, any>>({});\n\n\t// Debounce timer ref\n\tconst debounceTimerRef = React.useRef<ReturnType<typeof setTimeout> | null>(\n\t\tnull,\n\t);\n\n\t// Fetch reactive states from server\n\tconst fetchReactiveStates = React.useCallback(async () => {\n\t\tif (!enabled || !client || Object.keys(reactiveConfigs).length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Build batch requests\n\t\tconst requests: Array<{\n\t\t\tfield: string;\n\t\t\ttype: \"hidden\" | \"readOnly\" | \"disabled\" | \"compute\";\n\t\t\tformData: Record<string, any>;\n\t\t\tsiblingData: Record<string, any> | null;\n\t\t\tprevData: Record<string, any> | null;\n\t\t\tprevSiblingData: Record<string, any> | null;\n\t\t}> = [];\n\n\t\tfor (const [fieldPath, config] of Object.entries(reactiveConfigs)) {\n\t\t\tconst siblingData = getSiblingData(formValues, fieldPath);\n\t\t\tconst prevSiblingData = getSiblingData(prevValuesRef.current, fieldPath);\n\n\t\t\t// Add request for each reactive type that has a config\n\t\t\tfor (const type of [\n\t\t\t\t\"hidden\",\n\t\t\t\t\"readOnly\",\n\t\t\t\t\"disabled\",\n\t\t\t\t\"compute\",\n\t\t\t] as const) {\n\t\t\t\tif (config[type]?.watch) {\n\t\t\t\t\trequests.push({\n\t\t\t\t\t\tfield: fieldPath,\n\t\t\t\t\t\ttype,\n\t\t\t\t\t\tformData: formValues,\n\t\t\t\t\t\tsiblingData,\n\t\t\t\t\t\tprevData: prevValuesRef.current,\n\t\t\t\t\t\tprevSiblingData,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (requests.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetIsPending(true);\n\t\tsetError(null);\n\n\t\ttry {\n\t\t\tconst response = await (client.rpc as any).batchReactive({\n\t\t\t\tcollection,\n\t\t\t\ttype: mode,\n\t\t\t\trequests,\n\t\t\t});\n\n\t\t\t// Update field states\n\t\t\tconst newStates: Record<string, ReactiveFieldState> = { ...fieldStates };\n\n\t\t\tfor (const result of response.results as ReactiveFieldResult[]) {\n\t\t\t\tif (!newStates[result.field]) {\n\t\t\t\t\tnewStates[result.field] = {};\n\t\t\t\t}\n\n\t\t\t\tif (result.type === \"compute\") {\n\t\t\t\t\t// Apply computed value to form\n\t\t\t\t\tif (result.value !== undefined) {\n\t\t\t\t\t\tform.setValue(result.field, result.value, {\n\t\t\t\t\t\t\tshouldDirty: true,\n\t\t\t\t\t\t\tshouldTouch: false,\n\t\t\t\t\t\t\tshouldValidate: false,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Update field state\n\t\t\t\t\tnewStates[result.field][result.type] = result.value as boolean;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsetFieldStates(newStates);\n\t\t} catch (err) {\n\t\t\tconsole.error(\"Reactive fields error:\", err);\n\t\t\tsetError(err instanceof Error ? err : new Error(String(err)));\n\t\t} finally {\n\t\t\tsetIsPending(false);\n\t\t}\n\t}, [\n\t\tenabled,\n\t\tclient,\n\t\tcollection,\n\t\tmode,\n\t\treactiveConfigs,\n\t\tformValues,\n\t\tfieldStates,\n\t\tform,\n\t]);\n\n\t// Track if we've done initial fetch (to avoid running on empty form data)\n\tconst isInitializedRef = React.useRef(false);\n\n\t// Effect to trigger reactive updates on dep changes\n\t// Also handles initial fetch when form data becomes available (fixes race condition)\n\tReact.useEffect(() => {\n\t\tif (!enabled || watchDeps.size === 0) return;\n\n\t\t// Check if form has actual data (not empty defaults)\n\t\t// This prevents fetching before form data is loaded\n\t\tconst hasFormData = Object.keys(formValues).some(\n\t\t\t(key) => formValues[key] !== undefined && formValues[key] !== null,\n\t\t);\n\t\tif (!hasFormData) return;\n\n\t\t// Initial fetch when data first becomes available\n\t\tif (!isInitializedRef.current) {\n\t\t\tisInitializedRef.current = true;\n\t\t\tprevValuesRef.current = { ...formValues };\n\t\t\tfetchReactiveStates();\n\t\t\treturn;\n\t\t}\n\n\t\t// Check if any watched deps changed\n\t\tlet hasChanges = false;\n\t\tfor (const dep of watchDeps) {\n\t\t\tif (formValues[dep] !== prevValuesRef.current[dep]) {\n\t\t\t\thasChanges = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!hasChanges) return;\n\n\t\t// Update prev values\n\t\tprevValuesRef.current = { ...formValues };\n\n\t\t// Debounce the fetch\n\t\tif (debounceTimerRef.current) {\n\t\t\tclearTimeout(debounceTimerRef.current);\n\t\t}\n\n\t\tdebounceTimerRef.current = setTimeout(() => {\n\t\t\tfetchReactiveStates();\n\t\t}, debounce);\n\n\t\treturn () => {\n\t\t\tif (debounceTimerRef.current) {\n\t\t\t\tclearTimeout(debounceTimerRef.current);\n\t\t\t}\n\t\t};\n\t}, [enabled, watchDeps, formValues, debounce, fetchReactiveStates]);\n\n\t// Refresh function\n\tconst refresh = React.useCallback(() => {\n\t\tfetchReactiveStates();\n\t}, [fetchReactiveStates]);\n\n\treturn {\n\t\tfieldStates,\n\t\tisPending,\n\t\terror,\n\t\trefresh,\n\t};\n}\n"],"mappings":";;;;;;;;AA+EA,SAAS,eACR,QACA,WAC6B;CAE7B,MAAM,QAAQ,UAAU,MAAM,IAAI;CAClC,MAAM,eAAe,MAAM,WAAW,MAAM,QAAQ,KAAK,EAAE,CAAC;AAE5D,KAAI,iBAAiB,GAEpB,QAAO;CAIR,MAAM,gBAAgB,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC,KAAK,IAAI;CAGhE,IAAI,UAAU;AACd,MAAK,MAAM,QAAQ,cAAc,MAAM,IAAI,CAC1C,KAAI,WAAW,OAAO,YAAY,SACjC,WAAU,QAAQ;KAElB,QAAO;AAIT,QAAO,OAAO,YAAY,WAAW,UAAU;;;;;AAMhD,SAAS,uBACR,iBACc;CACd,MAAM,uBAAO,IAAI,KAAa;AAE9B,MAAK,MAAM,UAAU,OAAO,OAAO,gBAAgB,CAElD,MAAK,MAAM,OAAO;EAAC;EAAU;EAAY;EAAY;EAAU,EAAW;EACzE,MAAM,iBAAiB,OAAO;AAC9B,MAAI,gBAAgB,OACnB;QAAK,MAAM,OAAO,eAAe,MAEhC,KAAI,CAAC,IAAI,WAAW,IAAI,CACvB,MAAK,IAAI,IAAI;;;AAOlB,QAAO;;;;;;;;;;;;;;;;;;AAuBR,SAAgB,kBAAkB,EACjC,YACA,OAAO,cACP,iBACA,WAAW,KACX,UAAU,QAC2C;CACrD,MAAM,SAAS,eAAe,MAAM,EAAE,OAAO;CAC7C,MAAM,OAAO,gBAAgB;CAG7B,MAAM,CAAC,aAAa,kBAAkBA,QAAM,SAE1C,EAAE,CAAC;CACL,MAAM,CAAC,WAAW,gBAAgBA,QAAM,SAAS,MAAM;CACvD,MAAM,CAAC,OAAO,YAAYA,QAAM,SAAuB,KAAK;CAG5D,MAAM,YAAYA,QAAM,cACjB,uBAAuB,gBAAgB,EAC7C,CAAC,gBAAgB,CACjB;CAGD,MAAM,gBAAgB,SAAS,EAAE,SAAS,KAAK,SAAS,CAAC;CACzD,MAAM,aAAaA,QAAM,cACjB,iBAAiB,EAAE,EAC1B,CAAC,cAAc,CACf;CAGD,MAAM,gBAAgBA,QAAM,OAA4B,EAAE,CAAC;CAG3D,MAAM,mBAAmBA,QAAM,OAC9B,KACA;CAGD,MAAM,sBAAsBA,QAAM,YAAY,YAAY;AACzD,MAAI,CAAC,WAAW,CAAC,UAAU,OAAO,KAAK,gBAAgB,CAAC,WAAW,EAClE;EAID,MAAMC,WAOD,EAAE;AAEP,OAAK,MAAM,CAAC,WAAW,WAAW,OAAO,QAAQ,gBAAgB,EAAE;GAClE,MAAM,cAAc,eAAe,YAAY,UAAU;GACzD,MAAM,kBAAkB,eAAe,cAAc,SAAS,UAAU;AAGxE,QAAK,MAAM,QAAQ;IAClB;IACA;IACA;IACA;IACA,CACA,KAAI,OAAO,OAAO,MACjB,UAAS,KAAK;IACb,OAAO;IACP;IACA,UAAU;IACV;IACA,UAAU,cAAc;IACxB;IACA,CAAC;;AAKL,MAAI,SAAS,WAAW,EACvB;AAGD,eAAa,KAAK;AAClB,WAAS,KAAK;AAEd,MAAI;GACH,MAAM,WAAW,MAAO,OAAO,IAAY,cAAc;IACxD;IACA,MAAM;IACN;IACA,CAAC;GAGF,MAAMC,YAAgD,EAAE,GAAG,aAAa;AAExE,QAAK,MAAM,UAAU,SAAS,SAAkC;AAC/D,QAAI,CAAC,UAAU,OAAO,OACrB,WAAU,OAAO,SAAS,EAAE;AAG7B,QAAI,OAAO,SAAS,WAEnB;SAAI,OAAO,UAAU,OACpB,MAAK,SAAS,OAAO,OAAO,OAAO,OAAO;MACzC,aAAa;MACb,aAAa;MACb,gBAAgB;MAChB,CAAC;UAIH,WAAU,OAAO,OAAO,OAAO,QAAQ,OAAO;;AAIhD,kBAAe,UAAU;WACjB,KAAK;AACb,WAAQ,MAAM,0BAA0B,IAAI;AAC5C,YAAS,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,IAAI,CAAC,CAAC;YACpD;AACT,gBAAa,MAAM;;IAElB;EACF;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,CAAC;CAGF,MAAM,mBAAmBF,QAAM,OAAO,MAAM;AAI5C,SAAM,gBAAgB;AACrB,MAAI,CAAC,WAAW,UAAU,SAAS,EAAG;AAOtC,MAAI,CAHgB,OAAO,KAAK,WAAW,CAAC,MAC1C,QAAQ,WAAW,SAAS,UAAa,WAAW,SAAS,KAC9D,CACiB;AAGlB,MAAI,CAAC,iBAAiB,SAAS;AAC9B,oBAAiB,UAAU;AAC3B,iBAAc,UAAU,EAAE,GAAG,YAAY;AACzC,wBAAqB;AACrB;;EAID,IAAI,aAAa;AACjB,OAAK,MAAM,OAAO,UACjB,KAAI,WAAW,SAAS,cAAc,QAAQ,MAAM;AACnD,gBAAa;AACb;;AAIF,MAAI,CAAC,WAAY;AAGjB,gBAAc,UAAU,EAAE,GAAG,YAAY;AAGzC,MAAI,iBAAiB,QACpB,cAAa,iBAAiB,QAAQ;AAGvC,mBAAiB,UAAU,iBAAiB;AAC3C,wBAAqB;KACnB,SAAS;AAEZ,eAAa;AACZ,OAAI,iBAAiB,QACpB,cAAa,iBAAiB,QAAQ;;IAGtC;EAAC;EAAS;EAAW;EAAY;EAAU;EAAoB,CAAC;AAOnE,QAAO;EACN;EACA;EACA;EACA,SAReA,QAAM,kBAAkB;AACvC,wBAAqB;KACnB,CAAC,oBAAoB,CAAC;EAOxB"}
@@ -0,0 +1,96 @@
1
+ import { useEffect, useRef, useState } from "react";
2
+
3
+ //#region src/client/hooks/use-realtime-highlight.ts
4
+ /**
5
+ * Hook to track realtime data changes and highlight affected rows
6
+ *
7
+ * Compares previous data with new data and returns IDs of changed/new items.
8
+ * Used to show visual feedback (pulse animation) when data updates via SSE.
9
+ */
10
+ /**
11
+ * Track realtime changes and return IDs of changed/new rows
12
+ *
13
+ * @example
14
+ * ```tsx
15
+ * const { isHighlighted } = useRealtimeHighlight(data?.docs, { enabled: realtime });
16
+ *
17
+ * {items.map((row) => (
18
+ * <TableRow className={cn(
19
+ * isHighlighted(row.id) && "animate-realtime-pulse",
20
+ * )}>
21
+ * ))}
22
+ * ```
23
+ */
24
+ function useRealtimeHighlight(docs, options = {}) {
25
+ const { highlightDuration = 1500, enabled = true, initializationGracePeriod = 500 } = options;
26
+ const [highlightedIds, setHighlightedIds] = useState(/* @__PURE__ */ new Set());
27
+ const prevDocsRef = useRef(/* @__PURE__ */ new Map());
28
+ const hasInitializedRef = useRef(false);
29
+ const initializedAtRef = useRef(0);
30
+ const timersRef = useRef(/* @__PURE__ */ new Set());
31
+ useEffect(() => {
32
+ return () => {
33
+ for (const timer of timersRef.current) clearTimeout(timer);
34
+ };
35
+ }, []);
36
+ useEffect(() => {
37
+ if (!enabled || !docs) return;
38
+ const currentMap = /* @__PURE__ */ new Map();
39
+ for (const doc of docs) currentMap.set(doc.id, getDocFingerprint(doc));
40
+ if (!hasInitializedRef.current) {
41
+ hasInitializedRef.current = true;
42
+ initializedAtRef.current = Date.now();
43
+ prevDocsRef.current = currentMap;
44
+ return;
45
+ }
46
+ if (Date.now() - initializedAtRef.current < initializationGracePeriod) {
47
+ prevDocsRef.current = currentMap;
48
+ return;
49
+ }
50
+ const changedIds = [];
51
+ for (const doc of docs) {
52
+ const prevFingerprint = prevDocsRef.current.get(doc.id);
53
+ const currentFingerprint = currentMap.get(doc.id);
54
+ if (!prevFingerprint) changedIds.push(doc.id);
55
+ else if (prevFingerprint !== currentFingerprint) changedIds.push(doc.id);
56
+ }
57
+ prevDocsRef.current = currentMap;
58
+ if (changedIds.length > 0) {
59
+ setHighlightedIds((prev) => {
60
+ const next = new Set(prev);
61
+ for (const id of changedIds) next.add(id);
62
+ return next;
63
+ });
64
+ const timer = setTimeout(() => {
65
+ setHighlightedIds((prev) => {
66
+ const next = new Set(prev);
67
+ for (const id of changedIds) next.delete(id);
68
+ return next;
69
+ });
70
+ timersRef.current.delete(timer);
71
+ }, highlightDuration);
72
+ timersRef.current.add(timer);
73
+ }
74
+ }, [
75
+ docs,
76
+ enabled,
77
+ highlightDuration,
78
+ initializationGracePeriod
79
+ ]);
80
+ return {
81
+ highlightedIds,
82
+ isHighlighted: (id) => highlightedIds.has(id)
83
+ };
84
+ }
85
+ /**
86
+ * Create a fingerprint for a doc to detect changes
87
+ * Uses updatedAt if available, otherwise JSON stringify
88
+ */
89
+ function getDocFingerprint(doc) {
90
+ if (doc.updatedAt) return `${doc.id}:${String(doc.updatedAt)}`;
91
+ return JSON.stringify(doc);
92
+ }
93
+
94
+ //#endregion
95
+ export { useRealtimeHighlight };
96
+ //# sourceMappingURL=use-realtime-highlight.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-realtime-highlight.mjs","names":["changedIds: string[]"],"sources":["../../../src/client/hooks/use-realtime-highlight.ts"],"sourcesContent":["/**\n * Hook to track realtime data changes and highlight affected rows\n *\n * Compares previous data with new data and returns IDs of changed/new items.\n * Used to show visual feedback (pulse animation) when data updates via SSE.\n */\n\nimport { useEffect, useRef, useState } from \"react\";\n\ntype DocWithId = {\n\tid: string;\n\tupdatedAt?: string | Date;\n\t[key: string]: unknown;\n};\n\nexport type UseRealtimeHighlightOptions = {\n\t/** Duration in ms to keep highlight active (default: 1500) */\n\thighlightDuration?: number;\n\t/** Whether realtime is enabled */\n\tenabled?: boolean;\n\t/**\n\t * Duration in ms after initialization to ignore changes (default: 500).\n\t * This prevents false highlights on page refresh when SSE reconnects\n\t * and triggers immediate refetches.\n\t */\n\tinitializationGracePeriod?: number;\n};\n\nexport type UseRealtimeHighlightResult<T extends DocWithId> = {\n\t/** Set of row IDs that should be highlighted (updated/new) */\n\thighlightedIds: Set<string>;\n\t/** Check if a specific row should be highlighted as updated/new */\n\tisHighlighted: (id: string) => boolean;\n};\n\n/**\n * Track realtime changes and return IDs of changed/new rows\n *\n * @example\n * ```tsx\n * const { isHighlighted } = useRealtimeHighlight(data?.docs, { enabled: realtime });\n *\n * {items.map((row) => (\n * <TableRow className={cn(\n * isHighlighted(row.id) && \"animate-realtime-pulse\",\n * )}>\n * ))}\n * ```\n */\nexport function useRealtimeHighlight<T extends DocWithId>(\n\tdocs: T[] | undefined,\n\toptions: UseRealtimeHighlightOptions = {},\n): UseRealtimeHighlightResult<T> {\n\tconst {\n\t\thighlightDuration = 1500,\n\t\tenabled = true,\n\t\tinitializationGracePeriod = 500,\n\t} = options;\n\n\tconst [highlightedIds, setHighlightedIds] = useState<Set<string>>(new Set());\n\n\t// Track previous docs by fingerprint\n\tconst prevDocsRef = useRef<Map<string, string>>(new Map());\n\t// Track if we've seen any data yet (to skip initial highlight)\n\tconst hasInitializedRef = useRef(false);\n\t// Track when initialization happened to implement grace period\n\tconst initializedAtRef = useRef<number>(0);\n\tconst timersRef = useRef<Set<ReturnType<typeof setTimeout>>>(new Set());\n\n\t// Cleanup timers on unmount\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tfor (const timer of timersRef.current) {\n\t\t\t\tclearTimeout(timer);\n\t\t\t}\n\t\t};\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (!enabled || !docs) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Build current fingerprint map\n\t\tconst currentMap = new Map<string, string>();\n\t\tfor (const doc of docs) {\n\t\t\tcurrentMap.set(doc.id, getDocFingerprint(doc));\n\t\t}\n\n\t\t// Skip highlighting on first data load\n\t\tif (!hasInitializedRef.current) {\n\t\t\thasInitializedRef.current = true;\n\t\t\tinitializedAtRef.current = Date.now();\n\t\t\tprevDocsRef.current = currentMap;\n\t\t\treturn;\n\t\t}\n\n\t\t// Skip highlighting during grace period after initialization\n\t\t// This prevents false highlights on page refresh when SSE reconnects\n\t\t// and triggers immediate refetches\n\t\tconst timeSinceInit = Date.now() - initializedAtRef.current;\n\t\tif (timeSinceInit < initializationGracePeriod) {\n\t\t\tprevDocsRef.current = currentMap;\n\t\t\treturn;\n\t\t}\n\n\t\t// Find new and updated docs\n\t\tconst changedIds: string[] = [];\n\t\tfor (const doc of docs) {\n\t\t\tconst prevFingerprint = prevDocsRef.current.get(doc.id);\n\t\t\tconst currentFingerprint = currentMap.get(doc.id)!;\n\n\t\t\tif (!prevFingerprint) {\n\t\t\t\t// New doc\n\t\t\t\tchangedIds.push(doc.id);\n\t\t\t} else if (prevFingerprint !== currentFingerprint) {\n\t\t\t\t// Updated doc\n\t\t\t\tchangedIds.push(doc.id);\n\t\t\t}\n\t\t}\n\n\t\t// Update prev docs map\n\t\tprevDocsRef.current = currentMap;\n\n\t\t// Handle updated/new rows\n\t\tif (changedIds.length > 0) {\n\t\t\tsetHighlightedIds((prev) => {\n\t\t\t\tconst next = new Set(prev);\n\t\t\t\tfor (const id of changedIds) {\n\t\t\t\t\tnext.add(id);\n\t\t\t\t}\n\t\t\t\treturn next;\n\t\t\t});\n\n\t\t\t// Remove highlights after duration\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tsetHighlightedIds((prev) => {\n\t\t\t\t\tconst next = new Set(prev);\n\t\t\t\t\tfor (const id of changedIds) {\n\t\t\t\t\t\tnext.delete(id);\n\t\t\t\t\t}\n\t\t\t\t\treturn next;\n\t\t\t\t});\n\t\t\t\ttimersRef.current.delete(timer);\n\t\t\t}, highlightDuration);\n\t\t\ttimersRef.current.add(timer);\n\t\t}\n\t}, [docs, enabled, highlightDuration, initializationGracePeriod]);\n\n\treturn {\n\t\thighlightedIds,\n\t\tisHighlighted: (id: string) => highlightedIds.has(id),\n\t};\n}\n\n/**\n * Create a fingerprint for a doc to detect changes\n * Uses updatedAt if available, otherwise JSON stringify\n */\nfunction getDocFingerprint(doc: DocWithId): string {\n\tif (doc.updatedAt) {\n\t\treturn `${doc.id}:${String(doc.updatedAt)}`;\n\t}\n\t// Fallback to JSON - less efficient but works\n\treturn JSON.stringify(doc);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAiDA,SAAgB,qBACf,MACA,UAAuC,EAAE,EACT;CAChC,MAAM,EACL,oBAAoB,MACpB,UAAU,MACV,4BAA4B,QACzB;CAEJ,MAAM,CAAC,gBAAgB,qBAAqB,yBAAsB,IAAI,KAAK,CAAC;CAG5E,MAAM,cAAc,uBAA4B,IAAI,KAAK,CAAC;CAE1D,MAAM,oBAAoB,OAAO,MAAM;CAEvC,MAAM,mBAAmB,OAAe,EAAE;CAC1C,MAAM,YAAY,uBAA2C,IAAI,KAAK,CAAC;AAGvE,iBAAgB;AACf,eAAa;AACZ,QAAK,MAAM,SAAS,UAAU,QAC7B,cAAa,MAAM;;IAGnB,EAAE,CAAC;AAEN,iBAAgB;AACf,MAAI,CAAC,WAAW,CAAC,KAChB;EAID,MAAM,6BAAa,IAAI,KAAqB;AAC5C,OAAK,MAAM,OAAO,KACjB,YAAW,IAAI,IAAI,IAAI,kBAAkB,IAAI,CAAC;AAI/C,MAAI,CAAC,kBAAkB,SAAS;AAC/B,qBAAkB,UAAU;AAC5B,oBAAiB,UAAU,KAAK,KAAK;AACrC,eAAY,UAAU;AACtB;;AAOD,MADsB,KAAK,KAAK,GAAG,iBAAiB,UAChC,2BAA2B;AAC9C,eAAY,UAAU;AACtB;;EAID,MAAMA,aAAuB,EAAE;AAC/B,OAAK,MAAM,OAAO,MAAM;GACvB,MAAM,kBAAkB,YAAY,QAAQ,IAAI,IAAI,GAAG;GACvD,MAAM,qBAAqB,WAAW,IAAI,IAAI,GAAG;AAEjD,OAAI,CAAC,gBAEJ,YAAW,KAAK,IAAI,GAAG;YACb,oBAAoB,mBAE9B,YAAW,KAAK,IAAI,GAAG;;AAKzB,cAAY,UAAU;AAGtB,MAAI,WAAW,SAAS,GAAG;AAC1B,sBAAmB,SAAS;IAC3B,MAAM,OAAO,IAAI,IAAI,KAAK;AAC1B,SAAK,MAAM,MAAM,WAChB,MAAK,IAAI,GAAG;AAEb,WAAO;KACN;GAGF,MAAM,QAAQ,iBAAiB;AAC9B,uBAAmB,SAAS;KAC3B,MAAM,OAAO,IAAI,IAAI,KAAK;AAC1B,UAAK,MAAM,MAAM,WAChB,MAAK,OAAO,GAAG;AAEhB,YAAO;MACN;AACF,cAAU,QAAQ,OAAO,MAAM;MAC7B,kBAAkB;AACrB,aAAU,QAAQ,IAAI,MAAM;;IAE3B;EAAC;EAAM;EAAS;EAAmB;EAA0B,CAAC;AAEjE,QAAO;EACN;EACA,gBAAgB,OAAe,eAAe,IAAI,GAAG;EACrD;;;;;;AAOF,SAAS,kBAAkB,KAAwB;AAClD,KAAI,IAAI,UACP,QAAO,GAAG,IAAI,GAAG,GAAG,OAAO,IAAI,UAAU;AAG1C,QAAO,KAAK,UAAU,IAAI"}
@@ -0,0 +1,65 @@
1
+ import { useAdminStore } from "../runtime/provider.mjs";
2
+ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
3
+
4
+ //#region src/client/hooks/use-saved-views.ts
5
+ /**
6
+ * Hook to fetch saved views for a collection
7
+ *
8
+ * Note: This hook requires the adminModule to be used in your CMS setup.
9
+ * If adminSavedViews collection is not available, returns empty array.
10
+ */
11
+ function useSavedViews(collectionName) {
12
+ const client = useAdminStore((s) => s.client);
13
+ return useQuery({
14
+ queryKey: ["adminSavedViews", collectionName],
15
+ queryFn: async () => {
16
+ const collections = client?.collections;
17
+ if (!collections?.adminSavedViews) return { docs: [] };
18
+ return { docs: (await collections.adminSavedViews.find({ where: { collectionName } }))?.docs ?? [] };
19
+ },
20
+ enabled: !!client
21
+ });
22
+ }
23
+ /**
24
+ * Hook to save a new view
25
+ */
26
+ function useSaveView(collectionName) {
27
+ const client = useAdminStore((s) => s.client);
28
+ const queryClient = useQueryClient();
29
+ return useMutation({
30
+ mutationFn: async (data) => {
31
+ const collections = client?.collections;
32
+ if (!collections?.adminSavedViews) throw new Error("adminSavedViews collection not available. Make sure to use adminModule in your CMS setup.");
33
+ return collections.adminSavedViews.create({
34
+ ...data,
35
+ collectionName,
36
+ userId: data.userId || "anonymous",
37
+ isDefault: false
38
+ });
39
+ },
40
+ onSuccess: () => {
41
+ queryClient.invalidateQueries({ queryKey: ["adminSavedViews", collectionName] });
42
+ }
43
+ });
44
+ }
45
+ /**
46
+ * Hook to delete a view
47
+ */
48
+ function useDeleteSavedView(collectionName) {
49
+ const client = useAdminStore((s) => s.client);
50
+ const queryClient = useQueryClient();
51
+ return useMutation({
52
+ mutationFn: async (viewId) => {
53
+ const collections = client?.collections;
54
+ if (!collections?.adminSavedViews) throw new Error("adminSavedViews collection not available. Make sure to use adminModule in your CMS setup.");
55
+ return collections.adminSavedViews.delete({ id: viewId });
56
+ },
57
+ onSuccess: () => {
58
+ queryClient.invalidateQueries({ queryKey: ["adminSavedViews", collectionName] });
59
+ }
60
+ });
61
+ }
62
+
63
+ //#endregion
64
+ export { useDeleteSavedView, useSaveView, useSavedViews };
65
+ //# sourceMappingURL=use-saved-views.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-saved-views.mjs","names":[],"sources":["../../../src/client/hooks/use-saved-views.ts"],"sourcesContent":["import { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useAdminStore } from \"../runtime/provider.js\";\nimport type { SavedView } from \"../components/filter-builder/types.js\";\n\n/**\n * Hook to fetch saved views for a collection\n *\n * Note: This hook requires the adminModule to be used in your CMS setup.\n * If adminSavedViews collection is not available, returns empty array.\n */\nexport function useSavedViews(collectionName: string) {\n const client = useAdminStore((s) => s.client);\n\n return useQuery({\n queryKey: [\"adminSavedViews\", collectionName],\n queryFn: async (): Promise<{ docs: SavedView[] }> => {\n // Check if the collection exists on the client\n const collections = client?.collections as\n | Record<string, any>\n | undefined;\n if (!collections?.adminSavedViews) {\n return { docs: [] };\n }\n\n const result = await collections.adminSavedViews.find({\n where: { collectionName },\n });\n return { docs: (result?.docs ?? []) as SavedView[] };\n },\n enabled: !!client,\n });\n}\n\n/**\n * Hook to save a new view\n */\nexport function useSaveView(collectionName: string) {\n const client = useAdminStore((s) => s.client);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async (data: {\n name: string;\n configuration: SavedView[\"configuration\"];\n userId?: string;\n }) => {\n const collections = client?.collections as\n | Record<string, any>\n | undefined;\n if (!collections?.adminSavedViews) {\n throw new Error(\n \"adminSavedViews collection not available. Make sure to use adminModule in your CMS setup.\",\n );\n }\n\n return collections.adminSavedViews.create({\n ...data,\n collectionName,\n userId: data.userId || \"anonymous\",\n isDefault: false,\n });\n },\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"adminSavedViews\", collectionName],\n });\n },\n });\n}\n\n/**\n * Hook to update an existing view\n */\nexport function useUpdateSavedView(collectionName: string) {\n const client = useAdminStore((s) => s.client);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({\n id,\n data,\n }: {\n id: string;\n data: Partial<SavedView>;\n }) => {\n const collections = client?.collections as\n | Record<string, any>\n | undefined;\n if (!collections?.adminSavedViews) {\n throw new Error(\n \"adminSavedViews collection not available. Make sure to use adminModule in your CMS setup.\",\n );\n }\n\n return collections.adminSavedViews.update({ id, data });\n },\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"adminSavedViews\", collectionName],\n });\n },\n });\n}\n\n/**\n * Hook to delete a view\n */\nexport function useDeleteSavedView(collectionName: string) {\n const client = useAdminStore((s) => s.client);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async (viewId: string) => {\n const collections = client?.collections as\n | Record<string, any>\n | undefined;\n if (!collections?.adminSavedViews) {\n throw new Error(\n \"adminSavedViews collection not available. Make sure to use adminModule in your CMS setup.\",\n );\n }\n\n return collections.adminSavedViews.delete({ id: viewId });\n },\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"adminSavedViews\", collectionName],\n });\n },\n });\n}\n"],"mappings":";;;;;;;;;;AAUA,SAAgB,cAAc,gBAAwB;CACpD,MAAM,SAAS,eAAe,MAAM,EAAE,OAAO;AAE7C,QAAO,SAAS;EACd,UAAU,CAAC,mBAAmB,eAAe;EAC7C,SAAS,YAA4C;GAEnD,MAAM,cAAc,QAAQ;AAG5B,OAAI,CAAC,aAAa,gBAChB,QAAO,EAAE,MAAM,EAAE,EAAE;AAMrB,UAAO,EAAE,OAHM,MAAM,YAAY,gBAAgB,KAAK,EACpD,OAAO,EAAE,gBAAgB,EAC1B,CAAC,GACsB,QAAQ,EAAE,EAAkB;;EAEtD,SAAS,CAAC,CAAC;EACZ,CAAC;;;;;AAMJ,SAAgB,YAAY,gBAAwB;CAClD,MAAM,SAAS,eAAe,MAAM,EAAE,OAAO;CAC7C,MAAM,cAAc,gBAAgB;AAEpC,QAAO,YAAY;EACjB,YAAY,OAAO,SAIb;GACJ,MAAM,cAAc,QAAQ;AAG5B,OAAI,CAAC,aAAa,gBAChB,OAAM,IAAI,MACR,4FACD;AAGH,UAAO,YAAY,gBAAgB,OAAO;IACxC,GAAG;IACH;IACA,QAAQ,KAAK,UAAU;IACvB,WAAW;IACZ,CAAC;;EAEJ,iBAAiB;AACf,eAAY,kBAAkB,EAC5B,UAAU,CAAC,mBAAmB,eAAe,EAC9C,CAAC;;EAEL,CAAC;;;;;AAwCJ,SAAgB,mBAAmB,gBAAwB;CACzD,MAAM,SAAS,eAAe,MAAM,EAAE,OAAO;CAC7C,MAAM,cAAc,gBAAgB;AAEpC,QAAO,YAAY;EACjB,YAAY,OAAO,WAAmB;GACpC,MAAM,cAAc,QAAQ;AAG5B,OAAI,CAAC,aAAa,gBAChB,OAAM,IAAI,MACR,4FACD;AAGH,UAAO,YAAY,gBAAgB,OAAO,EAAE,IAAI,QAAQ,CAAC;;EAE3D,iBAAiB;AACf,eAAY,kBAAkB,EAC5B,UAAU,CAAC,mBAAmB,eAAe,EAC9C,CAAC;;EAEL,CAAC"}
@@ -0,0 +1,147 @@
1
+ import { selectClient, useAdminStore } from "../runtime/provider.mjs";
2
+ import { useScopedLocale } from "../runtime/locale-scope.mjs";
3
+ import { useQuery } from "@tanstack/react-query";
4
+ import { useEffect, useState } from "react";
5
+
6
+ //#region src/client/hooks/use-search.ts
7
+ /**
8
+ * Search Hook
9
+ *
10
+ * React hook for FTS-powered search using the CMS Search API.
11
+ * Returns full records with search metadata (score, highlights, indexed title).
12
+ */
13
+ /**
14
+ * Hook to debounce a value
15
+ *
16
+ * @example
17
+ * ```tsx
18
+ * const [searchTerm, setSearchTerm] = useState("");
19
+ * const debouncedSearch = useDebouncedValue(searchTerm, 300);
20
+ * ```
21
+ */
22
+ function useDebouncedValue(value, delay) {
23
+ const [debouncedValue, setDebouncedValue] = useState(value);
24
+ useEffect(() => {
25
+ const timer = setTimeout(() => {
26
+ setDebouncedValue(value);
27
+ }, delay);
28
+ return () => {
29
+ clearTimeout(timer);
30
+ };
31
+ }, [value, delay]);
32
+ return debouncedValue;
33
+ }
34
+ /**
35
+ * Hook for FTS-powered collection search
36
+ *
37
+ * Returns full records directly with search metadata attached.
38
+ * No need for a second CRUD fetch - records are populated server-side.
39
+ *
40
+ * @example
41
+ * ```tsx
42
+ * const [searchTerm, setSearchTerm] = useState("");
43
+ * const debouncedSearch = useDebouncedValue(searchTerm, 300);
44
+ *
45
+ * const { data, isLoading } = useSearch({
46
+ * collection: "posts",
47
+ * query: debouncedSearch,
48
+ * limit: 50,
49
+ * });
50
+ *
51
+ * // Use docs directly - they're full records!
52
+ * const items = data?.docs ?? [];
53
+ *
54
+ * // Access search metadata
55
+ * items.forEach(item => {
56
+ * console.log(item.title); // Full record field
57
+ * console.log(item._search.score); // Search score
58
+ * console.log(item._search.highlights?.title); // Highlighted title
59
+ * });
60
+ * ```
61
+ */
62
+ function useSearch(options, queryOptions) {
63
+ const client = useAdminStore(selectClient);
64
+ const { locale: contentLocale } = useScopedLocale();
65
+ const { collection, query, filters, limit = 50, offset = 0, highlights = true, facets, enabled } = options;
66
+ const isEnabled = enabled ?? query?.trim().length > 0;
67
+ return useQuery({
68
+ queryKey: [
69
+ "questpie",
70
+ "search",
71
+ collection,
72
+ query,
73
+ filters,
74
+ limit,
75
+ offset,
76
+ contentLocale
77
+ ],
78
+ queryFn: async () => {
79
+ return await client.search.search({
80
+ query,
81
+ collections: [collection],
82
+ locale: contentLocale,
83
+ limit,
84
+ offset,
85
+ filters,
86
+ highlights,
87
+ facets
88
+ });
89
+ },
90
+ enabled: isEnabled,
91
+ placeholderData: (prev) => prev,
92
+ staleTime: 30 * 1e3,
93
+ ...queryOptions
94
+ });
95
+ }
96
+ /**
97
+ * Hook for FTS-powered search across ALL collections
98
+ *
99
+ * Used by the global search (Cmd+K) to find records across the entire CMS.
100
+ *
101
+ * @example
102
+ * ```tsx
103
+ * const [query, setQuery] = useState("");
104
+ * const debouncedQuery = useDebouncedValue(query, 300);
105
+ *
106
+ * const { data, isLoading } = useGlobalSearch({
107
+ * query: debouncedQuery,
108
+ * limit: 10,
109
+ * });
110
+ *
111
+ * // Show results grouped by collection
112
+ * data?.docs.forEach(item => {
113
+ * console.log(`${item._collection}: ${item._search.indexedTitle}`);
114
+ * });
115
+ * ```
116
+ */
117
+ function useGlobalSearch(options, queryOptions) {
118
+ const client = useAdminStore(selectClient);
119
+ const { locale: contentLocale } = useScopedLocale();
120
+ const { query, limit = 10, highlights = true, enabled } = options;
121
+ const isEnabled = enabled ?? query?.trim().length >= 2;
122
+ return useQuery({
123
+ queryKey: [
124
+ "questpie",
125
+ "global-search",
126
+ query,
127
+ limit,
128
+ contentLocale
129
+ ],
130
+ queryFn: async () => {
131
+ return await client.search.search({
132
+ query,
133
+ locale: contentLocale,
134
+ limit,
135
+ highlights
136
+ });
137
+ },
138
+ enabled: isEnabled,
139
+ placeholderData: (prev) => prev,
140
+ staleTime: 10 * 1e3,
141
+ ...queryOptions
142
+ });
143
+ }
144
+
145
+ //#endregion
146
+ export { useDebouncedValue, useGlobalSearch, useSearch };
147
+ //# sourceMappingURL=use-search.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-search.mjs","names":[],"sources":["../../../src/client/hooks/use-search.ts"],"sourcesContent":["/**\n * Search Hook\n *\n * React hook for FTS-powered search using the CMS Search API.\n * Returns full records with search metadata (score, highlights, indexed title).\n */\n\nimport { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport { useState, useEffect } from \"react\";\nimport { selectClient, useAdminStore, useScopedLocale } from \"../runtime\";\n\n// ============================================================================\n// Debounce Hook\n// ============================================================================\n\n/**\n * Hook to debounce a value\n *\n * @example\n * ```tsx\n * const [searchTerm, setSearchTerm] = useState(\"\");\n * const debouncedSearch = useDebouncedValue(searchTerm, 300);\n * ```\n */\nexport function useDebouncedValue<T>(value: T, delay: number): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const timer = setTimeout(() => {\n setDebouncedValue(value);\n }, delay);\n\n return () => {\n clearTimeout(timer);\n };\n }, [value, delay]);\n\n return debouncedValue;\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Facet definition for search queries\n */\nexport interface SearchFacetDefinition {\n field: string;\n limit?: number;\n sortBy?: \"count\" | \"alpha\";\n}\n\n/**\n * Search options for the hook\n */\nexport interface UseSearchOptions {\n /**\n * Collection to search in (required)\n */\n collection: string;\n\n /**\n * Search query string\n */\n query: string;\n\n /**\n * Additional metadata filters\n */\n filters?: Record<string, string | string[]>;\n\n /**\n * Result limit (default: 50)\n */\n limit?: number;\n\n /**\n * Result offset (default: 0)\n */\n offset?: number;\n\n /**\n * Include highlights (default: true)\n */\n highlights?: boolean;\n\n /**\n * Facets to retrieve\n */\n facets?: SearchFacetDefinition[];\n\n /**\n * Whether the query is enabled (default: true if query is non-empty)\n */\n enabled?: boolean;\n}\n\n/**\n * Search metadata attached to each result\n */\nexport interface SearchMeta {\n /** Relevance score from search */\n score: number;\n /** Highlighted snippets with <mark> tags */\n highlights?: {\n title?: string;\n content?: string;\n };\n /** Title as stored in search index */\n indexedTitle: string;\n /** Content preview from search index */\n indexedContent?: string;\n}\n\n/**\n * Populated search result - full record with search metadata\n */\nexport interface PopulatedSearchResult<T = Record<string, any>> {\n /** Full record data (spread at top level) */\n [key: string]: any;\n /** Collection name */\n _collection: string;\n /** Search metadata */\n _search: SearchMeta;\n}\n\n/**\n * Facet value with count\n */\nexport interface SearchFacetValue {\n value: string;\n count: number;\n}\n\n/**\n * Facet result\n */\nexport interface SearchFacetResult {\n field: string;\n values: SearchFacetValue[];\n stats?: {\n min: number;\n max: number;\n };\n}\n\n/**\n * Search response with populated records\n */\nexport interface SearchResponse<T = Record<string, any>> {\n /** Full records with search metadata */\n docs: PopulatedSearchResult<T>[];\n /** Total count (accurate after access filtering) */\n total: number;\n /** Facet results (if requested) */\n facets?: SearchFacetResult[];\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook for FTS-powered collection search\n *\n * Returns full records directly with search metadata attached.\n * No need for a second CRUD fetch - records are populated server-side.\n *\n * @example\n * ```tsx\n * const [searchTerm, setSearchTerm] = useState(\"\");\n * const debouncedSearch = useDebouncedValue(searchTerm, 300);\n *\n * const { data, isLoading } = useSearch({\n * collection: \"posts\",\n * query: debouncedSearch,\n * limit: 50,\n * });\n *\n * // Use docs directly - they're full records!\n * const items = data?.docs ?? [];\n *\n * // Access search metadata\n * items.forEach(item => {\n * console.log(item.title); // Full record field\n * console.log(item._search.score); // Search score\n * console.log(item._search.highlights?.title); // Highlighted title\n * });\n * ```\n */\nexport function useSearch<T = Record<string, any>>(\n options: UseSearchOptions,\n queryOptions?: Omit<\n UseQueryOptions<SearchResponse<T>>,\n \"queryKey\" | \"queryFn\"\n >,\n) {\n const client = useAdminStore(selectClient);\n const { locale: contentLocale } = useScopedLocale();\n\n const {\n collection,\n query,\n filters,\n limit = 50,\n offset = 0,\n highlights = true,\n facets,\n enabled,\n } = options;\n\n // Determine if search should be enabled\n // By default, enabled when query has content (after trimming)\n const isEnabled = enabled ?? query?.trim().length > 0;\n\n return useQuery<SearchResponse<T>>({\n queryKey: [\n \"questpie\",\n \"search\",\n collection,\n query,\n filters,\n limit,\n offset,\n contentLocale,\n ],\n queryFn: async () => {\n // Use the client's search API\n const response = await (client as any).search.search({\n query,\n collections: [collection],\n locale: contentLocale,\n limit,\n offset,\n filters,\n highlights,\n facets,\n });\n return response;\n },\n enabled: isEnabled,\n // Keep previous data while fetching new results for smoother UX\n placeholderData: (prev) => prev,\n // Stale time for search results (30 seconds)\n staleTime: 30 * 1000,\n ...queryOptions,\n });\n}\n\n/**\n * Hook for reindexing a collection\n *\n * @example\n * ```tsx\n * const { reindex } = useReindex();\n * await reindex(\"posts\");\n * ```\n */\nexport function useReindex() {\n const client = useAdminStore(selectClient);\n\n return {\n reindex: async (collection: string) => {\n return (client as any).search.reindex(collection);\n },\n };\n}\n\n// ============================================================================\n// Global Search Hook\n// ============================================================================\n\n/**\n * Search options for global search (across all collections)\n */\nexport interface UseGlobalSearchOptions {\n /**\n * Search query string\n */\n query: string;\n\n /**\n * Result limit (default: 10)\n */\n limit?: number;\n\n /**\n * Include highlights (default: true)\n */\n highlights?: boolean;\n\n /**\n * Whether the query is enabled (default: true if query length >= 2)\n */\n enabled?: boolean;\n}\n\n/**\n * Hook for FTS-powered search across ALL collections\n *\n * Used by the global search (Cmd+K) to find records across the entire CMS.\n *\n * @example\n * ```tsx\n * const [query, setQuery] = useState(\"\");\n * const debouncedQuery = useDebouncedValue(query, 300);\n *\n * const { data, isLoading } = useGlobalSearch({\n * query: debouncedQuery,\n * limit: 10,\n * });\n *\n * // Show results grouped by collection\n * data?.docs.forEach(item => {\n * console.log(`${item._collection}: ${item._search.indexedTitle}`);\n * });\n * ```\n */\nexport function useGlobalSearch<T = Record<string, any>>(\n options: UseGlobalSearchOptions,\n queryOptions?: Omit<\n UseQueryOptions<SearchResponse<T>>,\n \"queryKey\" | \"queryFn\"\n >,\n) {\n const client = useAdminStore(selectClient);\n const { locale: contentLocale } = useScopedLocale();\n\n const { query, limit = 10, highlights = true, enabled } = options;\n\n // Require at least 2 characters by default\n const isEnabled = enabled ?? query?.trim().length >= 2;\n\n return useQuery<SearchResponse<T>>({\n queryKey: [\"questpie\", \"global-search\", query, limit, contentLocale],\n queryFn: async () => {\n // Search across ALL collections (no collections filter)\n const response = await (client as any).search.search({\n query,\n // collections: undefined - search all\n locale: contentLocale,\n limit,\n highlights,\n });\n return response;\n },\n enabled: isEnabled,\n // Keep previous data while fetching for smoother UX\n placeholderData: (prev) => prev,\n // Short stale time for global search\n staleTime: 10 * 1000,\n ...queryOptions,\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAwBA,SAAgB,kBAAqB,OAAU,OAAkB;CAC/D,MAAM,CAAC,gBAAgB,qBAAqB,SAAY,MAAM;AAE9D,iBAAgB;EACd,MAAM,QAAQ,iBAAiB;AAC7B,qBAAkB,MAAM;KACvB,MAAM;AAET,eAAa;AACX,gBAAa,MAAM;;IAEpB,CAAC,OAAO,MAAM,CAAC;AAElB,QAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0JT,SAAgB,UACd,SACA,cAIA;CACA,MAAM,SAAS,cAAc,aAAa;CAC1C,MAAM,EAAE,QAAQ,kBAAkB,iBAAiB;CAEnD,MAAM,EACJ,YACA,OACA,SACA,QAAQ,IACR,SAAS,GACT,aAAa,MACb,QACA,YACE;CAIJ,MAAM,YAAY,WAAW,OAAO,MAAM,CAAC,SAAS;AAEpD,QAAO,SAA4B;EACjC,UAAU;GACR;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EACD,SAAS,YAAY;AAYnB,UAViB,MAAO,OAAe,OAAO,OAAO;IACnD;IACA,aAAa,CAAC,WAAW;IACzB,QAAQ;IACR;IACA;IACA;IACA;IACA;IACD,CAAC;;EAGJ,SAAS;EAET,kBAAkB,SAAS;EAE3B,WAAW,KAAK;EAChB,GAAG;EACJ,CAAC;;;;;;;;;;;;;;;;;;;;;;;AAwEJ,SAAgB,gBACd,SACA,cAIA;CACA,MAAM,SAAS,cAAc,aAAa;CAC1C,MAAM,EAAE,QAAQ,kBAAkB,iBAAiB;CAEnD,MAAM,EAAE,OAAO,QAAQ,IAAI,aAAa,MAAM,YAAY;CAG1D,MAAM,YAAY,WAAW,OAAO,MAAM,CAAC,UAAU;AAErD,QAAO,SAA4B;EACjC,UAAU;GAAC;GAAY;GAAiB;GAAO;GAAO;GAAc;EACpE,SAAS,YAAY;AASnB,UAPiB,MAAO,OAAe,OAAO,OAAO;IACnD;IAEA,QAAQ;IACR;IACA;IACD,CAAC;;EAGJ,SAAS;EAET,kBAAkB,SAAS;EAE3B,WAAW,KAAK;EAChB,GAAG;EACJ,CAAC"}