@questpie/admin 1.1.1 → 3.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 (566) hide show
  1. package/README.md +256 -488
  2. package/dist/augmentation.d.mts +414 -0
  3. package/dist/client/blocks/block-renderer.d.mts +45 -0
  4. package/dist/client/blocks/block-renderer.mjs +105 -0
  5. package/dist/client/blocks/index.d.mts +2 -0
  6. package/dist/client/blocks/types.d.mts +68 -0
  7. package/dist/client/blocks/types.mjs +19 -0
  8. package/dist/client/builder/admin-types.d.mts +40 -0
  9. package/dist/client/builder/admin.d.mts +110 -0
  10. package/dist/client/builder/admin.mjs +151 -0
  11. package/dist/client/builder/field/field.d.mts +51 -0
  12. package/dist/client/builder/field/field.mjs +37 -0
  13. package/dist/client/builder/index.d.mts +31 -0
  14. package/dist/client/builder/page/page.d.mts +24 -0
  15. package/dist/client/builder/page/page.mjs +31 -0
  16. package/dist/client/builder/registry.d.mts +50 -0
  17. package/dist/client/builder/types/action-registry.mjs +276 -0
  18. package/dist/client/builder/types/action-types.d.mts +226 -0
  19. package/dist/client/builder/types/collection-types.mjs +10 -0
  20. package/dist/client/builder/types/common.d.mts +46 -0
  21. package/dist/client/builder/types/field-types.d.mts +592 -0
  22. package/dist/client/builder/types/field-types.mjs +18 -0
  23. package/dist/client/builder/types/ui-config.d.mts +158 -0
  24. package/dist/client/builder/types/widget-types.d.mts +562 -0
  25. package/dist/client/builder/validation.d.mts +33 -0
  26. package/dist/client/builder/validation.mjs +227 -0
  27. package/dist/client/builder/view/view.d.mts +49 -0
  28. package/dist/client/builder/view/view.mjs +27 -0
  29. package/dist/client/builder/widget/widget.d.mts +27 -0
  30. package/dist/client/builder/widget/widget.mjs +21 -0
  31. package/dist/client/components/actions/action-button.mjs +245 -0
  32. package/dist/client/components/actions/action-dialog.mjs +559 -0
  33. package/dist/client/components/actions/confirmation-dialog.mjs +201 -0
  34. package/dist/client/components/actions/header-actions.mjs +210 -0
  35. package/dist/client/components/admin-link.d.mts +66 -0
  36. package/dist/client/components/admin-link.mjs +171 -0
  37. package/dist/client/components/auth/auth-guard.d.mts +50 -0
  38. package/dist/client/components/auth/auth-guard.mjs +60 -0
  39. package/dist/client/components/auth/auth-loading.d.mts +35 -0
  40. package/dist/client/components/auth/auth-loading.mjs +55 -0
  41. package/dist/client/components/blocks/block-canvas.mjs +159 -0
  42. package/dist/client/components/blocks/block-editor-context.mjs +125 -0
  43. package/dist/client/components/blocks/block-editor-layout.mjs +199 -0
  44. package/dist/client/components/blocks/block-editor-provider.mjs +235 -0
  45. package/dist/client/components/blocks/block-fields-renderer.mjs +240 -0
  46. package/dist/client/components/blocks/block-insert-button.mjs +189 -0
  47. package/dist/client/components/blocks/block-item-menu.mjs +363 -0
  48. package/dist/client/components/blocks/block-item.mjs +434 -0
  49. package/dist/client/components/blocks/block-library-sidebar.mjs +285 -0
  50. package/dist/client/components/blocks/block-tree.mjs +103 -0
  51. package/dist/client/components/blocks/block-type-icon.mjs +95 -0
  52. package/dist/client/components/blocks/utils/tree-utils.mjs +185 -0
  53. package/dist/client/components/component-renderer.d.mts +114 -0
  54. package/dist/client/components/component-renderer.mjs +258 -0
  55. package/dist/client/components/error-boundary.mjs +144 -0
  56. package/dist/client/components/fields/array-field.mjs +506 -0
  57. package/dist/client/components/fields/asset-preview-field.mjs +159 -0
  58. package/dist/client/components/fields/blocks-field/blocks-field.mjs +209 -0
  59. package/dist/client/components/fields/boolean-field.mjs +77 -0
  60. package/dist/client/components/fields/date-field.mjs +76 -0
  61. package/dist/client/components/fields/datetime-field.mjs +74 -0
  62. package/dist/client/components/fields/email-field.mjs +67 -0
  63. package/dist/client/components/fields/field-utils.mjs +64 -0
  64. package/dist/client/components/fields/field-wrapper.mjs +124 -0
  65. package/dist/client/components/fields/json-field.mjs +461 -0
  66. package/dist/client/components/fields/locale-badge.mjs +25 -0
  67. package/dist/client/components/fields/number-field.mjs +73 -0
  68. package/dist/client/components/fields/object-array-field.mjs +707 -0
  69. package/dist/client/components/fields/object-field.mjs +686 -0
  70. package/dist/client/components/fields/relation/displays/cards-display.mjs +254 -0
  71. package/dist/client/components/fields/relation/displays/chips-display.mjs +173 -0
  72. package/dist/client/components/fields/relation/displays/grid-display.mjs +209 -0
  73. package/dist/client/components/fields/relation/displays/list-display.mjs +247 -0
  74. package/dist/client/components/fields/relation/displays/table-display.mjs +309 -0
  75. package/dist/client/components/fields/relation/displays/types.mjs +72 -0
  76. package/dist/client/components/fields/relation/relation-items-display.mjs +143 -0
  77. package/dist/client/components/fields/relation-field.mjs +161 -0
  78. package/dist/client/components/fields/relation-picker.mjs +296 -0
  79. package/dist/client/components/fields/relation-select.mjs +232 -0
  80. package/dist/client/components/fields/rich-text-editor/bubble-menu.mjs +105 -0
  81. package/dist/client/components/fields/rich-text-editor/extensions.mjs +144 -0
  82. package/dist/client/components/fields/rich-text-editor/image-popover.mjs +221 -0
  83. package/dist/client/components/fields/rich-text-editor/index.mjs +520 -0
  84. package/dist/client/components/fields/rich-text-editor/link-popover.mjs +85 -0
  85. package/dist/client/components/fields/rich-text-editor/presets.mjs +123 -0
  86. package/dist/client/components/fields/rich-text-editor/slash-commands.mjs +188 -0
  87. package/dist/client/components/fields/rich-text-editor/table-controls.mjs +433 -0
  88. package/dist/client/components/fields/rich-text-editor/toolbar.mjs +541 -0
  89. package/dist/client/components/fields/rich-text-editor/types.mjs +30 -0
  90. package/dist/client/components/fields/rich-text-editor/utils.mjs +50 -0
  91. package/dist/client/components/fields/rich-text-field.mjs +64 -0
  92. package/dist/client/components/fields/select-field.mjs +88 -0
  93. package/dist/client/components/fields/text-field.mjs +72 -0
  94. package/dist/client/components/fields/textarea-field.mjs +71 -0
  95. package/dist/client/components/fields/time-field.mjs +67 -0
  96. package/dist/client/components/fields/upload-field.mjs +621 -0
  97. package/dist/client/components/filter-builder/columns-tab.mjs +325 -0
  98. package/dist/client/components/filter-builder/filter-builder-sheet.mjs +456 -0
  99. package/dist/client/components/filter-builder/filters-tab.mjs +663 -0
  100. package/dist/client/components/filter-builder/saved-views-tab.mjs +278 -0
  101. package/dist/client/components/history-sidebar.mjs +496 -0
  102. package/dist/client/components/layout/field-layout-renderer.mjs +301 -0
  103. package/dist/client/components/locale-switcher.mjs +251 -0
  104. package/dist/client/components/media/media-grid.mjs +314 -0
  105. package/dist/client/components/media/media-picker-dialog.mjs +563 -0
  106. package/dist/client/components/preview/live-preview-mode.mjs +503 -0
  107. package/dist/client/components/preview/preview-pane.mjs +388 -0
  108. package/dist/client/components/primitives/asset-preview.mjs +771 -0
  109. package/dist/client/components/primitives/checkbox-input.mjs +59 -0
  110. package/dist/client/components/primitives/date-input.mjs +461 -0
  111. package/dist/client/components/primitives/dropzone.mjs +368 -0
  112. package/dist/client/components/primitives/number-input.mjs +117 -0
  113. package/dist/client/components/primitives/select-multi.mjs +590 -0
  114. package/dist/client/components/primitives/select-single.mjs +473 -0
  115. package/dist/client/components/primitives/text-input.mjs +45 -0
  116. package/dist/client/components/primitives/textarea-input.mjs +43 -0
  117. package/dist/client/components/primitives/time-input.mjs +145 -0
  118. package/dist/client/components/primitives/toggle-input.mjs +51 -0
  119. package/dist/client/components/primitives/types.mjs +12 -0
  120. package/dist/client/components/sheets/resource-sheet.mjs +86 -0
  121. package/dist/client/components/ui/accordion.mjs +169 -0
  122. package/dist/client/components/ui/alert.mjs +85 -0
  123. package/dist/client/components/ui/badge.mjs +76 -0
  124. package/dist/client/components/ui/button.mjs +84 -0
  125. package/dist/client/components/ui/card.mjs +206 -0
  126. package/dist/client/components/ui/checkbox.mjs +82 -0
  127. package/dist/client/components/ui/command.mjs +239 -0
  128. package/dist/client/components/ui/dialog.mjs +296 -0
  129. package/dist/client/components/ui/drawer.mjs +278 -0
  130. package/dist/client/components/ui/dropdown-menu.mjs +315 -0
  131. package/dist/client/components/ui/empty-state.mjs +99 -0
  132. package/dist/client/components/ui/field.mjs +354 -0
  133. package/dist/client/components/ui/input-group.mjs +201 -0
  134. package/dist/client/components/ui/input.mjs +46 -0
  135. package/dist/client/components/ui/kbd.mjs +53 -0
  136. package/dist/client/components/ui/label.mjs +45 -0
  137. package/dist/client/components/ui/popover.mjs +176 -0
  138. package/dist/client/components/ui/responsive-dialog.mjs +308 -0
  139. package/dist/client/components/ui/search-input.mjs +139 -0
  140. package/dist/client/components/ui/select.mjs +325 -0
  141. package/dist/client/components/ui/separator.mjs +47 -0
  142. package/dist/client/components/ui/sheet.mjs +280 -0
  143. package/dist/client/components/ui/sidebar.mjs +774 -0
  144. package/dist/client/components/ui/skeleton.mjs +40 -0
  145. package/dist/client/components/ui/sonner.d.mts +13 -0
  146. package/dist/client/components/ui/sonner.mjs +85 -0
  147. package/dist/client/components/ui/spinner.mjs +52 -0
  148. package/dist/client/components/ui/switch.mjs +58 -0
  149. package/dist/client/components/ui/table.mjs +276 -0
  150. package/dist/client/components/ui/tabs.mjs +160 -0
  151. package/dist/client/components/ui/textarea.mjs +40 -0
  152. package/dist/client/components/ui/toolbar.mjs +136 -0
  153. package/dist/client/components/ui/tooltip.mjs +146 -0
  154. package/dist/client/components/widgets/chart-widget.mjs +582 -0
  155. package/dist/client/components/widgets/progress-widget.mjs +200 -0
  156. package/dist/client/components/widgets/quick-actions-widget.mjs +209 -0
  157. package/dist/client/components/widgets/recent-items-widget.mjs +196 -0
  158. package/dist/client/components/widgets/stats-widget.mjs +261 -0
  159. package/dist/client/components/widgets/table-widget.mjs +273 -0
  160. package/dist/client/components/widgets/timeline-widget.mjs +279 -0
  161. package/dist/client/components/widgets/value-widget.mjs +312 -0
  162. package/dist/client/components/widgets/widget-skeletons.mjs +427 -0
  163. package/dist/client/contexts/breadcrumb-context.mjs +60 -0
  164. package/dist/client/contexts/focus-context.d.mts +87 -0
  165. package/dist/client/contexts/focus-context.mjs +250 -0
  166. package/dist/client/hooks/typed-hooks.d.mts +110 -0
  167. package/dist/client/hooks/typed-hooks.mjs +888 -0
  168. package/dist/client/hooks/use-action.mjs +329 -0
  169. package/dist/client/hooks/use-admin-config.mjs +69 -0
  170. package/dist/client/hooks/use-admin-preferences.mjs +171 -0
  171. package/dist/client/hooks/use-admin-routes.mjs +130 -0
  172. package/dist/client/hooks/use-audit-history.mjs +157 -0
  173. package/dist/client/hooks/use-auth.d.mts +97 -0
  174. package/dist/{use-auth-BoLmWtmU.mjs → client/hooks/use-auth.mjs} +9 -10
  175. package/dist/client/hooks/use-collection-fields.mjs +71 -0
  176. package/dist/client/hooks/use-collection-meta.mjs +153 -0
  177. package/dist/client/hooks/use-collection-schema.mjs +90 -0
  178. package/dist/client/hooks/use-collection-validation.mjs +88 -0
  179. package/dist/client/hooks/use-collection.d.mts +96 -0
  180. package/dist/client/hooks/use-collection.mjs +673 -0
  181. package/dist/client/hooks/use-current-user.d.mts +60 -0
  182. package/dist/client/hooks/use-current-user.mjs +79 -0
  183. package/dist/client/hooks/use-field-hooks.mjs +199 -0
  184. package/dist/client/hooks/use-field-options.d.mts +57 -0
  185. package/dist/client/hooks/use-field-options.mjs +269 -0
  186. package/dist/client/hooks/use-global-fields.mjs +58 -0
  187. package/dist/client/hooks/use-global-meta.mjs +105 -0
  188. package/dist/client/hooks/use-global-schema.mjs +53 -0
  189. package/dist/client/hooks/use-global.d.mts +51 -0
  190. package/dist/client/hooks/use-global.mjs +284 -0
  191. package/dist/client/hooks/use-locks.mjs +452 -0
  192. package/dist/client/hooks/use-media-query.d.mts +22 -0
  193. package/dist/client/hooks/use-media-query.mjs +81 -0
  194. package/dist/client/hooks/use-prefill-params.mjs +47 -0
  195. package/dist/client/hooks/use-questpie-query-options.mjs +50 -0
  196. package/dist/client/hooks/use-reactive-fields.d.mts +78 -0
  197. package/dist/client/hooks/use-reactive-fields.mjs +201 -0
  198. package/dist/client/hooks/use-realtime-highlight.mjs +158 -0
  199. package/dist/client/hooks/use-saved-views.mjs +140 -0
  200. package/dist/client/hooks/use-search-param-toggle.d.mts +12 -0
  201. package/dist/client/hooks/use-search-param-toggle.mjs +115 -0
  202. package/dist/client/hooks/use-search.mjs +258 -0
  203. package/dist/client/hooks/use-server-actions.mjs +191 -0
  204. package/dist/client/hooks/use-server-validation.mjs +291 -0
  205. package/dist/client/hooks/use-server-widget-data.d.mts +25 -0
  206. package/dist/client/hooks/use-server-widget-data.mjs +65 -0
  207. package/dist/client/hooks/use-setup-status.d.mts +38 -0
  208. package/dist/client/hooks/use-setup-status.mjs +62 -0
  209. package/dist/client/hooks/use-sidebar-search-param.d.mts +9 -0
  210. package/dist/client/hooks/use-sidebar-search-param.mjs +104 -0
  211. package/dist/client/hooks/use-transition-stage.mjs +125 -0
  212. package/dist/client/hooks/use-upload-collection.mjs +31 -0
  213. package/dist/client/hooks/use-upload.mjs +209 -0
  214. package/dist/client/hooks/use-validation-error-map.mjs +57 -0
  215. package/dist/client/hooks/use-view-state.mjs +479 -0
  216. package/dist/client/i18n/hooks.mjs +284 -0
  217. package/dist/client/i18n/intl-cache.mjs +64 -0
  218. package/dist/client/i18n/messages.mjs +6 -0
  219. package/dist/client/i18n/simple.d.mts +21 -0
  220. package/dist/client/i18n/simple.mjs +156 -0
  221. package/dist/client/i18n/types.d.mts +109 -0
  222. package/dist/client/lib/cookies.mjs +9 -0
  223. package/dist/client/lib/events.mjs +5 -0
  224. package/dist/client/lib/render-profiler.mjs +51 -0
  225. package/dist/client/lib/utils.mjs +23 -0
  226. package/dist/client/preview/block-scope-context.d.mts +73 -0
  227. package/dist/client/preview/block-scope-context.mjs +116 -0
  228. package/dist/client/preview/index.d.mts +5 -0
  229. package/dist/client/preview/preview-banner.d.mts +45 -0
  230. package/dist/client/preview/preview-banner.mjs +134 -0
  231. package/dist/client/preview/preview-field.d.mts +107 -0
  232. package/dist/client/preview/preview-field.mjs +227 -0
  233. package/dist/client/preview/types.d.mts +114 -0
  234. package/dist/client/preview/types.mjs +20 -0
  235. package/dist/client/preview/use-collection-preview.d.mts +70 -0
  236. package/dist/client/preview/use-collection-preview.mjs +163 -0
  237. package/dist/client/runtime/content-locales-provider.d.mts +1 -0
  238. package/dist/client/runtime/content-locales-provider.mjs +136 -0
  239. package/dist/client/runtime/index.d.mts +5 -0
  240. package/dist/client/runtime/index.mjs +6 -0
  241. package/dist/client/runtime/locale-scope.d.mts +2 -0
  242. package/dist/client/runtime/locale-scope.mjs +108 -0
  243. package/dist/client/runtime/provider.d.mts +203 -0
  244. package/dist/client/runtime/provider.mjs +393 -0
  245. package/dist/client/runtime/routes.d.mts +49 -0
  246. package/dist/client/runtime/routes.mjs +91 -0
  247. package/dist/client/runtime/translations-provider.mjs +242 -0
  248. package/dist/client/scope/index.d.mts +3 -0
  249. package/dist/client/scope/picker.d.mts +53 -0
  250. package/dist/client/scope/picker.mjs +395 -0
  251. package/dist/client/scope/provider.d.mts +103 -0
  252. package/dist/client/scope/provider.mjs +167 -0
  253. package/dist/client/scope/types.d.mts +111 -0
  254. package/dist/client/styles/index.css +344 -188
  255. package/dist/client/utils/auto-expand-fields.mjs +83 -0
  256. package/dist/client/utils/build-field-definitions-from-schema.mjs +259 -0
  257. package/dist/client/utils/dependency-tracker.mjs +61 -0
  258. package/dist/client/utils/detect-relations.mjs +45 -0
  259. package/dist/client/utils/locale-to-flag.d.mts +119 -0
  260. package/dist/client/utils/locale-to-flag.mjs +129 -0
  261. package/dist/client/utils/routes.mjs +195 -0
  262. package/dist/client/views/auth/accept-invite-form.d.mts +72 -0
  263. package/dist/client/views/auth/accept-invite-form.mjs +473 -0
  264. package/dist/client/views/auth/auth-layout.d.mts +43 -0
  265. package/dist/client/views/auth/auth-layout.mjs +116 -0
  266. package/dist/client/views/auth/forgot-password-form.d.mts +58 -0
  267. package/dist/client/views/auth/forgot-password-form.mjs +386 -0
  268. package/dist/client/views/auth/invite-form.mjs +497 -0
  269. package/dist/client/views/auth/login-form.d.mts +75 -0
  270. package/dist/client/views/auth/login-form.mjs +387 -0
  271. package/dist/client/views/auth/reset-password-form.d.mts +65 -0
  272. package/dist/client/views/auth/reset-password-form.mjs +515 -0
  273. package/dist/client/views/auth/setup-form.d.mts +60 -0
  274. package/dist/client/views/auth/setup-form.mjs +526 -0
  275. package/dist/client/views/collection/auto-form-fields.mjs +873 -0
  276. package/dist/client/views/collection/bulk-action-toolbar.mjs +480 -0
  277. package/dist/client/views/collection/cells/complex-cells.mjs +746 -0
  278. package/dist/client/views/collection/cells/primitive-cells.mjs +395 -0
  279. package/dist/client/views/collection/cells/relation-cells.mjs +260 -0
  280. package/dist/client/views/collection/cells/shared/asset-thumbnail.mjs +509 -0
  281. package/dist/client/views/collection/cells/shared/cell-helpers.mjs +125 -0
  282. package/dist/client/views/collection/cells/shared/relation-chip.mjs +121 -0
  283. package/dist/client/views/collection/cells/upload-cells.mjs +28 -0
  284. package/dist/client/views/collection/columns/build-columns.mjs +195 -0
  285. package/dist/client/views/collection/columns/column-defaults.mjs +123 -0
  286. package/dist/client/views/collection/field-context.mjs +126 -0
  287. package/dist/client/views/collection/field-renderer.mjs +368 -0
  288. package/dist/client/views/collection/form-view.mjs +1566 -0
  289. package/dist/client/views/collection/table-view.mjs +832 -0
  290. package/dist/client/views/collection/view-skeletons.mjs +215 -0
  291. package/dist/client/views/common/global-search.mjs +700 -0
  292. package/dist/client/views/dashboard/dashboard-grid.mjs +881 -0
  293. package/dist/client/views/dashboard/dashboard-widget.mjs +265 -0
  294. package/dist/client/views/dashboard/widget-card.mjs +372 -0
  295. package/dist/client/views/globals/global-form-view.mjs +1306 -0
  296. package/dist/client/views/layout/admin-layout-provider.d.mts +137 -0
  297. package/dist/client/views/layout/admin-layout-provider.mjs +193 -0
  298. package/dist/client/views/layout/admin-layout.d.mts +133 -0
  299. package/dist/client/views/layout/admin-layout.mjs +302 -0
  300. package/dist/client/views/layout/admin-router.d.mts +93 -0
  301. package/dist/client/views/layout/admin-router.mjs +1254 -0
  302. package/dist/client/views/layout/admin-sidebar.d.mts +99 -0
  303. package/dist/client/views/layout/admin-sidebar.mjs +1379 -0
  304. package/dist/client/views/layout/admin-topbar.mjs +236 -0
  305. package/dist/client/views/pages/accept-invite-page.d.mts +66 -0
  306. package/dist/client/views/pages/accept-invite-page.mjs +349 -0
  307. package/dist/client/views/pages/dashboard-page.d.mts +43 -0
  308. package/dist/client/views/pages/dashboard-page.mjs +84 -0
  309. package/dist/client/views/pages/forgot-password-page.d.mts +56 -0
  310. package/dist/client/views/pages/forgot-password-page.mjs +152 -0
  311. package/dist/client/views/pages/invite-page.d.mts +70 -0
  312. package/dist/client/views/pages/invite-page.mjs +161 -0
  313. package/dist/client/views/pages/login-page.d.mts +69 -0
  314. package/dist/client/views/pages/login-page.mjs +193 -0
  315. package/dist/client/views/pages/reset-password-page.d.mts +63 -0
  316. package/dist/client/views/pages/reset-password-page.mjs +257 -0
  317. package/dist/client/views/pages/setup-page.d.mts +61 -0
  318. package/dist/client/views/pages/setup-page.mjs +156 -0
  319. package/dist/client-module.d.mts +3 -0
  320. package/dist/client-module.mjs +3 -0
  321. package/dist/client.d.mts +99 -3
  322. package/dist/client.mjs +52 -12
  323. package/dist/components/rich-text/index.d.mts +1 -0
  324. package/dist/components/rich-text/rich-text-renderer.d.mts +103 -0
  325. package/dist/components/rich-text/rich-text-renderer.mjs +237 -0
  326. package/dist/index.d.mts +59 -3
  327. package/dist/index.mjs +52 -12
  328. package/dist/plugin.d.mts +2 -0
  329. package/dist/plugin.mjs +3 -0
  330. package/dist/server/adapters/nextjs.d.mts +120 -0
  331. package/dist/server/adapters/nextjs.mjs +110 -0
  332. package/dist/server/adapters/tanstack.d.mts +132 -0
  333. package/dist/server/adapters/tanstack.mjs +89 -0
  334. package/dist/server/augmentation/actions.d.mts +279 -0
  335. package/dist/server/augmentation/common.d.mts +76 -0
  336. package/dist/server/augmentation/dashboard.d.mts +547 -0
  337. package/dist/server/augmentation/form-layout.d.mts +303 -0
  338. package/dist/server/augmentation/index.d.mts +44 -0
  339. package/dist/server/augmentation/index.mjs +10 -0
  340. package/dist/server/augmentation/sidebar.d.mts +181 -0
  341. package/dist/server/augmentation/views.d.mts +237 -0
  342. package/dist/server/augmentation.d.mts +7 -0
  343. package/dist/server/block/index.d.mts +4 -0
  344. package/dist/server/codegen/admin-client-template.mjs +93 -0
  345. package/dist/server/codegen/projection-validator.mjs +67 -0
  346. package/dist/server/fields/blocks.d.mts +71 -0
  347. package/dist/server/fields/blocks.mjs +151 -0
  348. package/dist/server/fields/index.d.mts +15 -0
  349. package/dist/server/fields/index.mjs +15 -0
  350. package/dist/server/fields/rich-text.d.mts +68 -0
  351. package/dist/server/fields/rich-text.mjs +147 -0
  352. package/dist/server/i18n/index.mjs +43 -0
  353. package/dist/server/i18n/messages/cs.mjs +461 -0
  354. package/dist/server/i18n/messages/de.mjs +461 -0
  355. package/dist/server/i18n/messages/en.mjs +707 -0
  356. package/dist/server/i18n/messages/es.mjs +461 -0
  357. package/dist/server/i18n/messages/fr.mjs +461 -0
  358. package/dist/server/i18n/messages/index.mjs +23 -0
  359. package/dist/server/i18n/messages/pl.mjs +461 -0
  360. package/dist/server/i18n/messages/pt.mjs +464 -0
  361. package/dist/server/i18n/messages/sk.mjs +689 -0
  362. package/dist/server/modules/admin/.generated/module.d.mts +52 -0
  363. package/dist/server/modules/admin/.generated/module.mjs +78 -0
  364. package/dist/server/modules/admin/.generated/registries.d.mts +22 -0
  365. package/dist/server/modules/admin/auth-helpers.d.mts +142 -0
  366. package/dist/server/modules/admin/auth-helpers.mjs +107 -0
  367. package/dist/server/modules/admin/block/block-builder.d.mts +383 -0
  368. package/dist/server/modules/admin/block/block-builder.mjs +315 -0
  369. package/dist/server/modules/admin/block/index.d.mts +3 -0
  370. package/dist/server/modules/admin/block/introspection.d.mts +89 -0
  371. package/dist/server/modules/admin/block/introspection.mjs +100 -0
  372. package/dist/server/modules/admin/block/prefetch.d.mts +78 -0
  373. package/dist/server/modules/admin/block/prefetch.mjs +241 -0
  374. package/dist/server/modules/admin/client/.generated/module.d.mts +94 -0
  375. package/dist/server/modules/admin/client/.generated/module.mjs +91 -0
  376. package/dist/server/modules/admin/client/components/badge.d.mts +1 -0
  377. package/dist/server/modules/admin/client/components/icon.d.mts +1 -0
  378. package/dist/server/modules/admin/client/fields/array.d.mts +6 -0
  379. package/dist/server/modules/admin/client/fields/array.mjs +12 -0
  380. package/dist/server/modules/admin/client/fields/assetPreview.d.mts +6 -0
  381. package/dist/server/modules/admin/client/fields/assetPreview.mjs +18 -0
  382. package/dist/server/modules/admin/client/fields/blocks.d.mts +6 -0
  383. package/dist/server/modules/admin/client/fields/blocks.mjs +12 -0
  384. package/dist/server/modules/admin/client/fields/boolean.d.mts +6 -0
  385. package/dist/server/modules/admin/client/fields/boolean.mjs +12 -0
  386. package/dist/server/modules/admin/client/fields/date.d.mts +6 -0
  387. package/dist/server/modules/admin/client/fields/date.mjs +12 -0
  388. package/dist/server/modules/admin/client/fields/datetime.d.mts +6 -0
  389. package/dist/server/modules/admin/client/fields/datetime.mjs +12 -0
  390. package/dist/server/modules/admin/client/fields/email.d.mts +6 -0
  391. package/dist/server/modules/admin/client/fields/email.mjs +12 -0
  392. package/dist/server/modules/admin/client/fields/json.d.mts +6 -0
  393. package/dist/server/modules/admin/client/fields/json.mjs +11 -0
  394. package/dist/server/modules/admin/client/fields/number.d.mts +6 -0
  395. package/dist/server/modules/admin/client/fields/number.mjs +12 -0
  396. package/dist/server/modules/admin/client/fields/object.d.mts +6 -0
  397. package/dist/server/modules/admin/client/fields/object.mjs +12 -0
  398. package/dist/server/modules/admin/client/fields/relation.d.mts +6 -0
  399. package/dist/server/modules/admin/client/fields/relation.mjs +12 -0
  400. package/dist/server/modules/admin/client/fields/richText.d.mts +6 -0
  401. package/dist/server/modules/admin/client/fields/richText.mjs +11 -0
  402. package/dist/server/modules/admin/client/fields/select.d.mts +6 -0
  403. package/dist/server/modules/admin/client/fields/select.mjs +12 -0
  404. package/dist/server/modules/admin/client/fields/text.d.mts +6 -0
  405. package/dist/server/modules/admin/client/fields/text.mjs +12 -0
  406. package/dist/server/modules/admin/client/fields/textarea.d.mts +6 -0
  407. package/dist/server/modules/admin/client/fields/textarea.mjs +12 -0
  408. package/dist/server/modules/admin/client/fields/time.d.mts +6 -0
  409. package/dist/server/modules/admin/client/fields/time.mjs +12 -0
  410. package/dist/server/modules/admin/client/fields/upload.d.mts +6 -0
  411. package/dist/server/modules/admin/client/fields/upload.mjs +12 -0
  412. package/dist/server/modules/admin/client/fields/url.d.mts +6 -0
  413. package/dist/server/modules/admin/client/fields/url.mjs +12 -0
  414. package/dist/server/modules/admin/client/index.d.mts +1 -0
  415. package/dist/server/modules/admin/client/pages/dashboard.d.mts +6 -0
  416. package/dist/server/modules/admin/client/pages/dashboard.mjs +11 -0
  417. package/dist/server/modules/admin/client/pages/forgotPassword.d.mts +6 -0
  418. package/dist/server/modules/admin/client/pages/forgotPassword.mjs +11 -0
  419. package/dist/server/modules/admin/client/pages/login.d.mts +6 -0
  420. package/dist/server/modules/admin/client/pages/login.mjs +11 -0
  421. package/dist/server/modules/admin/client/pages/resetPassword.d.mts +6 -0
  422. package/dist/server/modules/admin/client/pages/resetPassword.mjs +11 -0
  423. package/dist/server/modules/admin/client/pages/setup.d.mts +6 -0
  424. package/dist/server/modules/admin/client/pages/setup.mjs +11 -0
  425. package/dist/server/modules/admin/client/views/collection-form.mjs +10 -0
  426. package/dist/server/modules/admin/client/views/collection-table.mjs +10 -0
  427. package/dist/server/modules/admin/client/views/global-form.mjs +10 -0
  428. package/dist/server/modules/admin/client/widgets/chart.d.mts +6 -0
  429. package/dist/server/modules/admin/client/widgets/chart.mjs +7 -0
  430. package/dist/server/modules/admin/client/widgets/progress.d.mts +6 -0
  431. package/dist/server/modules/admin/client/widgets/progress.mjs +7 -0
  432. package/dist/server/modules/admin/client/widgets/quickActions.d.mts +6 -0
  433. package/dist/server/modules/admin/client/widgets/quickActions.mjs +7 -0
  434. package/dist/server/modules/admin/client/widgets/recentItems.d.mts +6 -0
  435. package/dist/server/modules/admin/client/widgets/recentItems.mjs +7 -0
  436. package/dist/server/modules/admin/client/widgets/stats.d.mts +6 -0
  437. package/dist/server/modules/admin/client/widgets/stats.mjs +7 -0
  438. package/dist/server/modules/admin/client/widgets/table.d.mts +6 -0
  439. package/dist/server/modules/admin/client/widgets/table.mjs +7 -0
  440. package/dist/server/modules/admin/client/widgets/timeline.d.mts +6 -0
  441. package/dist/server/modules/admin/client/widgets/timeline.mjs +7 -0
  442. package/dist/server/modules/admin/client/widgets/value.d.mts +6 -0
  443. package/dist/server/modules/admin/client/widgets/value.mjs +7 -0
  444. package/dist/server/modules/admin/collections/account.d.mts +77 -0
  445. package/dist/server/modules/admin/collections/account.mjs +23 -0
  446. package/dist/server/modules/admin/collections/admin-locks.d.mts +90 -0
  447. package/dist/server/modules/admin/collections/admin-locks.mjs +16 -0
  448. package/dist/server/modules/admin/collections/admin-preferences.d.mts +69 -0
  449. package/dist/server/modules/admin/collections/admin-preferences.mjs +16 -0
  450. package/dist/server/modules/admin/collections/admin-saved-views.d.mts +83 -0
  451. package/dist/server/modules/admin/collections/admin-saved-views.mjs +16 -0
  452. package/dist/server/modules/admin/collections/apikey.d.mts +99 -0
  453. package/dist/server/modules/admin/collections/apikey.mjs +15 -0
  454. package/dist/server/modules/admin/collections/assets.d.mts +72 -0
  455. package/dist/server/modules/admin/collections/assets.mjs +71 -0
  456. package/dist/server/modules/admin/collections/session.d.mts +69 -0
  457. package/dist/server/modules/admin/collections/session.mjs +15 -0
  458. package/dist/server/modules/admin/collections/user.d.mts +85 -0
  459. package/dist/server/modules/admin/collections/user.mjs +204 -0
  460. package/dist/server/modules/admin/collections/verification.d.mts +63 -0
  461. package/dist/server/modules/admin/collections/verification.mjs +15 -0
  462. package/dist/server/modules/admin/components/badge.d.mts +10 -0
  463. package/dist/server/modules/admin/components/badge.mjs +10 -0
  464. package/dist/server/modules/admin/components/icon.d.mts +9 -0
  465. package/dist/server/modules/admin/components/icon.mjs +11 -0
  466. package/dist/server/modules/admin/config/admin.mjs +34 -0
  467. package/dist/server/modules/admin/dto/admin-config.dto.mjs +102 -0
  468. package/dist/server/modules/admin/factories.mjs +172 -0
  469. package/dist/server/modules/admin/index.d.mts +1093 -0
  470. package/dist/server/modules/admin/index.mjs +26 -0
  471. package/dist/server/modules/admin/modules.mjs +11 -0
  472. package/dist/server/modules/admin/plugin.mjs +13 -0
  473. package/dist/server/modules/admin/routes/admin-config.d.mts +28 -0
  474. package/dist/server/modules/admin/routes/admin-config.mjs +552 -0
  475. package/dist/server/modules/admin/routes/execute-action.d.mts +92 -0
  476. package/dist/server/modules/admin/routes/execute-action.mjs +433 -0
  477. package/dist/server/modules/admin/routes/locales.d.mts +18 -0
  478. package/dist/server/modules/admin/routes/locales.mjs +69 -0
  479. package/dist/server/modules/admin/routes/preview.d.mts +80 -0
  480. package/dist/server/modules/admin/routes/preview.mjs +230 -0
  481. package/dist/server/modules/admin/routes/reactive.d.mts +74 -0
  482. package/dist/server/modules/admin/routes/reactive.mjs +350 -0
  483. package/dist/server/modules/admin/routes/route-helpers.d.mts +23 -0
  484. package/dist/server/modules/admin/routes/route-helpers.mjs +76 -0
  485. package/dist/server/modules/admin/routes/setup.d.mts +63 -0
  486. package/dist/server/modules/admin/routes/setup.mjs +114 -0
  487. package/dist/server/modules/admin/routes/translations.d.mts +26 -0
  488. package/dist/server/modules/admin/routes/translations.mjs +114 -0
  489. package/dist/server/modules/admin/routes/widget-data.d.mts +32 -0
  490. package/dist/server/modules/admin/routes/widget-data.mjs +62 -0
  491. package/dist/server/modules/admin/views/form.d.mts +8 -0
  492. package/dist/server/modules/admin/views/form.mjs +7 -0
  493. package/dist/server/modules/admin/views/global-form.d.mts +8 -0
  494. package/dist/server/modules/admin/views/global-form.mjs +7 -0
  495. package/dist/server/modules/admin/views/table.d.mts +8 -0
  496. package/dist/server/modules/admin/views/table.mjs +7 -0
  497. package/dist/server/modules/admin-preferences/collections/admin-preferences.mjs +37 -0
  498. package/dist/server/modules/admin-preferences/collections/locks.collection.mjs +55 -0
  499. package/dist/server/modules/admin-preferences/collections/saved-views.d.mts +99 -0
  500. package/dist/server/modules/admin-preferences/collections/saved-views.mjs +38 -0
  501. package/dist/server/modules/audit/.generated/module.d.mts +60 -0
  502. package/dist/server/modules/audit/.generated/module.mjs +30 -0
  503. package/dist/server/modules/audit/collections/audit-log.d.mts +214 -0
  504. package/dist/server/modules/audit/collections/audit-log.mjs +107 -0
  505. package/dist/server/modules/audit/config/admin.mjs +21 -0
  506. package/dist/server/modules/audit/config/app.mjs +262 -0
  507. package/dist/server/modules/audit/index.d.mts +2 -0
  508. package/dist/server/modules/audit/jobs/audit-cleanup.d.mts +13 -0
  509. package/dist/server/modules/audit/jobs/audit-cleanup.mjs +28 -0
  510. package/dist/server/plugin.d.mts +26 -0
  511. package/dist/server/plugin.mjs +385 -0
  512. package/dist/server/proxy-factories.d.mts +85 -0
  513. package/dist/server/proxy-factories.mjs +302 -0
  514. package/dist/server/registry-helpers.d.mts +83 -0
  515. package/dist/server/registry-helpers.mjs +104 -0
  516. package/dist/server.d.mts +33 -250
  517. package/dist/server.mjs +22 -832
  518. package/dist/shared/preview-utils.d.mts +53 -0
  519. package/dist/{preview-utils-BKQ9-TMa.mjs → shared/preview-utils.mjs} +2 -3
  520. package/dist/{saved-views.types-BMsz5mCy.d.mts → shared/types/saved-views.types.d.mts} +7 -2
  521. package/dist/shared.d.mts +3 -57
  522. package/dist/shared.mjs +1 -1
  523. package/package.json +56 -51
  524. package/skills/questpie-admin/SKILL.md +397 -0
  525. package/skills/questpie-admin/blocks/SKILL.md +305 -0
  526. package/skills/questpie-admin/custom-ui/SKILL.md +307 -0
  527. package/skills/questpie-admin/views/SKILL.md +442 -0
  528. package/dist/auth-layout-M8K8_q5R.mjs +0 -181
  529. package/dist/auth-layout-M8K8_q5R.mjs.map +0 -1
  530. package/dist/bulk-upload-dialog-D7w7W1Hl.mjs +0 -273
  531. package/dist/bulk-upload-dialog-D7w7W1Hl.mjs.map +0 -1
  532. package/dist/card-BKHjBQfw.mjs +0 -58
  533. package/dist/card-BKHjBQfw.mjs.map +0 -1
  534. package/dist/client-D1DqawtP.d.mts +0 -13403
  535. package/dist/client-D1DqawtP.d.mts.map +0 -1
  536. package/dist/client-njX1rZmi.mjs +0 -22612
  537. package/dist/client-njX1rZmi.mjs.map +0 -1
  538. package/dist/content-locales-provider-BXvuIgfg.mjs +0 -1650
  539. package/dist/content-locales-provider-BXvuIgfg.mjs.map +0 -1
  540. package/dist/dashboard-page-B4PGEdc2.mjs +0 -2500
  541. package/dist/dashboard-page-B4PGEdc2.mjs.map +0 -1
  542. package/dist/dashboard-page-mCY0pgZv.mjs +0 -3
  543. package/dist/dropzone-Do3awXKd.mjs +0 -634
  544. package/dist/dropzone-Do3awXKd.mjs.map +0 -1
  545. package/dist/forgot-password-page-Bcp-An4Y.mjs +0 -221
  546. package/dist/forgot-password-page-Bcp-An4Y.mjs.map +0 -1
  547. package/dist/forgot-password-page-CEwsdLwn.mjs +0 -3
  548. package/dist/index-B4H3amCD.d.mts +0 -2753
  549. package/dist/index-B4H3amCD.d.mts.map +0 -1
  550. package/dist/login-page-BUnpCbCa.mjs +0 -3
  551. package/dist/login-page-CP4gA-dl.mjs +0 -298
  552. package/dist/login-page-CP4gA-dl.mjs.map +0 -1
  553. package/dist/preview-utils-BKQ9-TMa.mjs.map +0 -1
  554. package/dist/reset-password-page-BqfDmLxA.mjs +0 -281
  555. package/dist/reset-password-page-BqfDmLxA.mjs.map +0 -1
  556. package/dist/reset-password-page-CufHz3h3.mjs +0 -3
  557. package/dist/runtime-6VZM878K.mjs +0 -69
  558. package/dist/runtime-6VZM878K.mjs.map +0 -1
  559. package/dist/saved-views.types-BMsz5mCy.d.mts.map +0 -1
  560. package/dist/server.d.mts.map +0 -1
  561. package/dist/server.mjs.map +0 -1
  562. package/dist/setup-page-BNNzt_Z6.mjs +0 -3
  563. package/dist/setup-page-YAP_fzqh.mjs +0 -264
  564. package/dist/setup-page-YAP_fzqh.mjs.map +0 -1
  565. package/dist/shared.d.mts.map +0 -1
  566. package/dist/use-auth-BoLmWtmU.mjs.map +0 -1
package/README.md CHANGED
@@ -1,570 +1,338 @@
1
1
  # @questpie/admin
2
2
 
3
- **Config-driven, batteries-included admin UI for QUESTPIE CMS**
3
+ Server-driven admin UI for QUESTPIE. Reads your server schema via introspection and generates a complete admin panel — dashboard, table views, form editors, sidebar navigation, block editor — all from the definitions you already wrote on the server.
4
4
 
5
- A fully-featured admin interface using the `qa()` builder pattern for type-safe configuration.
5
+ ## How It Works
6
6
 
7
- ## Features
7
+ QUESTPIE follows a **server-first** architecture. All schema, layout, and behavior is defined on the server with the `questpie` core package. The admin UI consumes this via introspection — no duplicate config needed on the client.
8
8
 
9
- - **Builder Pattern** - Type-safe `qa()` builder with autocomplete
10
- - **Config-Driven** - UI auto-generated from builder configuration
11
- - **Type-Safe** - Full TypeScript inference with module augmentation
12
- - **Tailwind v4** - Built with Tailwind CSS v4 + shadcn/ui components
13
- - **Rich Text** - Tiptap editor with toolbar controls
14
- - **Relations** - Single select, multi-picker with drag-and-drop
15
- - **Layouts** - Sections, tabs, columns, grids, sidebars
16
- - **Realtime** - SSE-powered live updates
17
- - **Versioning** - Built-in version history
18
- - **i18n Ready** - Localization support for content
9
+ | Layer | Package | Defines |
10
+ | ---------- | ------------------------------------- | ----------------------------------------------------------------- |
11
+ | **Server** | `questpie` + `@questpie/admin/server` | Schema, fields, access, hooks, sidebar, dashboard, branding |
12
+ | **Client** | `@questpie/admin/client` | Field renderers, view renderers, component registry, UI overrides |
19
13
 
20
14
  ## Installation
21
15
 
22
16
  ```bash
23
- bun add @questpie/admin questpie @questpie/tanstack-query
24
- bun add @tanstack/react-query
17
+ bun add @questpie/admin questpie @questpie/tanstack-query @tanstack/react-query
25
18
  ```
26
19
 
27
- ## Quick Start
20
+ ## Server Setup
28
21
 
29
- ### 1. Create Admin Builder
22
+ The admin plugin is registered in `questpie.config.ts`, and the admin module is added to `modules.ts`:
30
23
 
31
- ```typescript
32
- // src/admin/builder.ts
33
- import { qa, adminModule } from "@questpie/admin/client";
34
- import type { AppCMS } from "./server/cms";
35
-
36
- // Create typed builder with admin fields/views
37
- export const qab = qa<AppCMS>().use(adminModule).toNamespace();
38
- ```
24
+ ```ts
25
+ // questpie.config.ts
26
+ import { runtimeConfig } from "questpie";
27
+ import { adminPlugin } from "@questpie/admin/plugin";
39
28
 
40
- ### 2. Define Collection Configs
41
-
42
- ```typescript
43
- // src/admin/collections/posts.ts
44
- import { qab } from "../builder";
45
-
46
- export const postsAdmin = qab
47
- .collection("posts")
48
- .meta({
49
- label: "Blog Posts",
50
- icon: FileTextIcon, // React component
51
- })
52
- // Fields with registry callback - ({ r }) gives autocomplete!
53
- .fields(({ r }) => ({
54
- title: r.text({
55
- label: "Title",
56
- placeholder: "Post title...",
57
- maxLength: 200,
58
- }),
59
- slug: r.text({
60
- label: "Slug",
61
- }),
62
- content: r.textarea({
63
- label: "Content",
64
- }),
65
- status: r.select({
66
- label: "Status",
67
- options: [
68
- { label: "Draft", value: "draft" },
69
- { label: "Published", value: "published" },
70
- ],
71
- }),
72
- publishedAt: r.datetime({
73
- label: "Publish Date",
74
- }),
75
- authorId: r.relation({
76
- label: "Author",
77
- targetCollection: "users",
78
- }),
79
- }))
80
- // List view with field proxy - ({ v, f }) gives autocomplete!
81
- .list(({ v, f }) =>
82
- v.table({
83
- columns: [f.title, f.status, f.authorId, f.publishedAt],
84
- }),
85
- )
86
- // Form view
87
- .form(({ v, f }) =>
88
- v.form({
89
- sections: [
90
- {
91
- title: "Content",
92
- fields: [f.title, f.slug, f.content],
93
- },
94
- {
95
- title: "Publishing",
96
- fields: [f.status, f.publishedAt, f.authorId],
97
- },
98
- ],
99
- }),
100
- );
29
+ export default runtimeConfig({
30
+ plugins: [adminPlugin()],
31
+ app: { url: process.env.APP_URL! },
32
+ db: { url: process.env.DATABASE_URL! },
33
+ secret: process.env.AUTH_SECRET!,
34
+ });
101
35
  ```
102
36
 
103
- ### 3. Build Admin Configuration
37
+ ```ts
38
+ // modules.ts
39
+ import { adminModule } from "@questpie/admin/server";
104
40
 
105
- ```typescript
106
- // src/admin/admin.ts
107
- import { qa, adminModule } from "@questpie/admin/client";
108
- import { postsAdmin } from "./collections/posts";
109
- import { sidebarConfig } from "./sidebar";
110
-
111
- export const admin = qa()
112
- .use(adminModule)
113
- .branding({
114
- name: "My Admin",
115
- })
116
- .collections({
117
- posts: postsAdmin,
118
- })
119
- .sidebar(sidebarConfig);
120
-
121
- // Module augmentation for global type inference
122
- declare module "@questpie/admin/client" {
123
- interface AdminTypeRegistry {
124
- cms: AppCMS;
125
- admin: typeof admin;
126
- }
127
- }
41
+ export default [adminModule] as const;
128
42
  ```
129
43
 
130
- ### 4. Configure Sidebar
131
-
132
- ```typescript
133
- // src/admin/sidebar.ts
134
- import { qa } from "@questpie/admin/client";
135
- import { HouseIcon, FileTextIcon } from "@phosphor-icons/react";
136
-
137
- export const sidebarConfig = qa
138
- .sidebar()
139
- .section("main", (s) =>
140
- s.items([
141
- { type: "link", label: "Dashboard", href: "/admin", icon: HouseIcon },
142
- ]),
143
- )
144
- .section("content", (s) =>
145
- s
146
- .title("Content")
147
- .icon(FileTextIcon)
148
- .items([{ type: "collection", collection: "posts", icon: FileTextIcon }]),
149
- );
44
+ Branding, sidebar, and dashboard are configured via the file convention (e.g. `branding.ts`, `sidebar.ts`, `dashboard.ts`) and auto-discovered by codegen.
45
+
46
+ Collections, globals, routes, and jobs are auto-discovered via file convention. Codegen produces a `.generated/index.ts` with the fully-typed `App` and runtime `app` instance.
47
+
48
+ ### Collection Admin Config
49
+
50
+ Admin metadata, list views, and form views are defined on the collection itself:
51
+
52
+ ```ts
53
+ const posts = collection("posts")
54
+ .fields(({ f }) => ({
55
+ title: f.text(255).required().label("Title"),
56
+ content: f.richText().label("Content"),
57
+ status: f.select(["draft", "published"]).label("Status"),
58
+ cover: f.upload({ to: "assets", mimeTypes: ["image/*"] }),
59
+ publishedAt: f.date(),
60
+ }))
61
+ .title(({ f }) => f.title)
62
+ .admin(({ c }) => ({
63
+ label: { en: "Blog Posts" },
64
+ icon: c.icon("ph:article"),
65
+ }))
66
+ .list(({ v, f }) =>
67
+ v.collectionTable({
68
+ columns: [f.title, f.status, f.publishedAt],
69
+ }),
70
+ )
71
+ .form(({ v, f }) =>
72
+ v.collectionForm({
73
+ layout: "with-sidebar",
74
+ sidebar: {
75
+ position: "right",
76
+ fields: [f.status, f.publishedAt, f.cover],
77
+ },
78
+ fields: [
79
+ { type: "section", label: "Content", fields: [f.title, f.content] },
80
+ ],
81
+ }),
82
+ );
150
83
  ```
151
84
 
152
- ### 5. Setup Tailwind CSS
85
+ ### Component References
153
86
 
154
- In your main CSS file, import admin styles and configure Tailwind to scan the admin package:
87
+ The server emits serializable `ComponentReference` objects instead of React elements. Use the `c` factory in admin config callbacks:
155
88
 
156
- ```css
157
- /* src/styles.css */
158
- @import "tailwindcss";
159
- @import "tw-animate-css";
160
- @import "shadcn/tailwind.css";
161
- @import "@questpie/admin/styles/index.css";
89
+ ```ts
90
+ .admin(({ c }) => ({
91
+ icon: c.icon("ph:article"), // → { type: "icon", props: { name: "ph:article" } }
92
+ badge: c.badge({ text: "New" }), // → { type: "badge", props: { text: "New" } }
93
+ }))
94
+ ```
162
95
 
163
- /* IMPORTANT: Tell Tailwind to scan admin package for utility classes */
164
- @source "../node_modules/@questpie/admin/dist";
96
+ Icons use the [Iconify](https://icon-sets.iconify.design/) format with the Phosphor set (`ph:icon-name`).
165
97
 
166
- /* Your app's theme variables... */
167
- ```
98
+ ### Form Layouts
168
99
 
169
- ### 6. Mount in React
100
+ ```ts
101
+ // Sections
102
+ .form(({ v, f }) => v.collectionForm({
103
+ fields: [
104
+ { type: "section", label: "Basic Info", layout: "grid", columns: 2,
105
+ fields: [f.name, f.email, f.phone, f.city] },
106
+ { type: "section", label: "Content", fields: [f.body] },
107
+ ],
108
+ }))
170
109
 
171
- ```tsx
172
- // routes/admin.tsx (TanStack Router example)
173
- import { Admin, AdminLayoutProvider } from "@questpie/admin/client";
174
- import { Link, Outlet, useLocation } from "@tanstack/react-router";
175
- import { admin } from "~/admin/admin";
176
- import { cmsClient } from "~/lib/cms-client";
177
- import { queryClient } from "~/lib/query-client";
178
-
179
- // Create runtime instance
180
- const adminInstance = Admin.from(admin);
181
-
182
- function AdminLayout() {
183
- const location = useLocation();
184
-
185
- return (
186
- <AdminLayoutProvider
187
- admin={adminInstance}
188
- client={cmsClient}
189
- queryClient={queryClient}
190
- LinkComponent={Link}
191
- activeRoute={location.pathname}
192
- basePath="/admin"
193
- >
194
- <Outlet />
195
- </AdminLayoutProvider>
196
- );
197
- }
198
- ```
110
+ // Sidebar layout
111
+ .form(({ v, f }) => v.collectionForm({
112
+ layout: "with-sidebar",
113
+ sidebar: { position: "right", fields: [f.status, f.image] },
114
+ fields: [f.title, f.content],
115
+ }))
199
116
 
200
- ## Builder API
117
+ // Tabs
118
+ .form(({ v, f }) => v.collectionForm({
119
+ tabs: [
120
+ { id: "content", label: "Content", fields: [f.title, f.body] },
121
+ { id: "meta", label: "Metadata", fields: [f.seoTitle, f.seoDescription] },
122
+ ],
123
+ }))
124
+ ```
201
125
 
202
- ### Main Entry Point
126
+ ### Reactive Fields
203
127
 
204
- ```typescript
205
- import { qa, adminModule } from "@questpie/admin/client";
128
+ Server-evaluated reactive behaviors in form config:
206
129
 
207
- // Start from admin module (includes built-in fields/views + user management)
208
- const admin = qa()
209
- .use(adminModule)
210
- .branding({ name: "My Admin" })
211
- .collections({ posts: postsAdmin })
212
- .globals({ settings: settingsAdmin })
213
- .sidebar(sidebarConfig)
214
- .dashboard(dashboardConfig);
130
+ ```ts
131
+ .form(({ v, f }) => v.collectionForm({
132
+ fields: [
133
+ {
134
+ field: f.slug,
135
+ compute: {
136
+ handler: ({ data }) => slugify(data.title),
137
+ deps: ({ data }) => [data.title],
138
+ debounce: 300,
139
+ },
140
+ },
141
+ { field: f.publishedAt, hidden: ({ data }) => !data.published },
142
+ { field: f.reason, readOnly: ({ data }) => data.status !== "cancelled" },
143
+ ],
144
+ }))
215
145
  ```
216
146
 
217
- ### Collection Builder
218
-
219
- ```typescript
220
- const postsAdmin = qa
221
- .collection("posts")
222
- .meta({ label: "Posts", icon: PostIcon })
223
- .fields(({ r }) => ({
224
- // r = FieldRegistryProxy with autocomplete for registered fields
225
- title: r.text({ maxLength: 200 }),
226
- content: r.richText(),
227
- status: r.select({ options: [...] }),
228
- }))
229
- .list(({ v, f }) => v.table({
230
- // v = ViewRegistryProxy, f = FieldProxy
231
- columns: [f.title, f.status],
232
- }))
233
- .form(({ v, f }) => v.form({
234
- fields: [f.title, f.content, f.status],
235
- }));
236
- ```
147
+ ### Dashboard Actions
237
148
 
238
- ### Global Builder
239
-
240
- ```typescript
241
- const settingsAdmin = qa
242
- .global("settings")
243
- .meta({ label: "Site Settings", icon: SettingsIcon })
244
- .fields(({ r }) => ({
245
- siteName: r.text({ maxLength: 100 }),
246
- logo: r.text(), // TODO: image field
247
- }))
248
- .form(({ v, f }) =>
249
- v.form({
250
- fields: [f.siteName, f.logo],
251
- }),
252
- );
149
+ ```ts
150
+ .dashboard(({ d, c, a }) => d.dashboard({
151
+ actions: [
152
+ a.create({ collection: "posts", label: { en: "New Post" }, icon: c.icon("ph:plus"), variant: "primary" }),
153
+ a.global({ global: "siteSettings", label: { en: "Settings" }, icon: c.icon("ph:gear-six") }),
154
+ a.link({ href: "/", label: { en: "Open Site" }, icon: c.icon("ph:arrow-square-out"), variant: "outline" }),
155
+ ],
156
+ items: [
157
+ { type: "section", items: [
158
+ { type: "stats", collection: "posts", label: "Posts" },
159
+ ]},
160
+ ],
161
+ }))
253
162
  ```
254
163
 
255
- ### Sidebar Builder
256
-
257
- ```typescript
258
- const sidebarConfig = qa
259
- .sidebar()
260
- .section("main", (s) =>
261
- s.items([
262
- { type: "link", label: "Dashboard", href: "/admin", icon: HomeIcon },
263
- ]),
264
- )
265
- .section("content", (s) =>
266
- s
267
- .title("Content")
268
- .items([
269
- { type: "collection", collection: "posts" },
270
- { type: "collection", collection: "pages" },
271
- { type: "divider" },
272
- { type: "global", global: "settings" },
273
- ]),
274
- );
275
- ```
164
+ ## Client Setup
276
165
 
277
- **Typed Sidebar (Recommended)**
166
+ The client creates a typed admin builder and mounts the admin UI in React:
278
167
 
279
- ```typescript
280
- import type { AppCMS } from "./server/cms";
281
- import type { SidebarItemForApp } from "@questpie/admin/client";
168
+ ### 1. Admin Builder
282
169
 
283
- const sidebarConfig = qa.sidebar<AppCMS>().section("content", (s) =>
284
- s.title("Content").items([
285
- { type: "collection", collection: "posts" },
286
- { type: "global", global: "settings" },
287
- ]),
288
- );
170
+ ```ts
171
+ // questpie/admin/builder.ts
172
+ import { qa, adminModule } from "@questpie/admin/client";
173
+ import type { App } from "#questpie";
289
174
 
290
- // Standalone typed items
291
- const items: SidebarItemForApp<AppCMS>[] = [
292
- { type: "collection", collection: "posts" },
293
- { type: "global", global: "settings" },
294
- ];
175
+ export const admin = qa<App>().use(adminModule);
295
176
  ```
296
177
 
297
- ## Built-in Field Types
298
-
299
- The `adminModule` provides these field types:
300
-
301
- | Field | Usage | Description |
302
- | ---------- | ---------------------------------- | --------------------------- |
303
- | `text` | `r.text({ maxLength })` | Single-line text input |
304
- | `email` | `r.email()` | Email input with validation |
305
- | `password` | `r.password()` | Password input |
306
- | `textarea` | `r.textarea({ rows })` | Multi-line text |
307
- | `number` | `r.number({ min, max })` | Numeric input |
308
- | `checkbox` | `r.checkbox()` | Boolean checkbox |
309
- | `switch` | `r.switch()` | Toggle switch |
310
- | `select` | `r.select({ options })` | Dropdown select |
311
- | `date` | `r.date()` | Date picker |
312
- | `datetime` | `r.datetime()` | Date + time picker |
313
- | `relation` | `r.relation({ targetCollection })` | Relation field |
314
- | `json` | `r.json()` | JSON editor |
315
- | `richText` | `r.richText()` | Rich text editor (Tiptap) |
316
-
317
- ## Form Layouts
318
-
319
- ### Sections
320
-
321
- ```typescript
322
- .form(({ v, f }) => v.form({
323
- sections: [
324
- {
325
- title: "Basic Info",
326
- description: "Main details",
327
- fields: [f.title, f.slug],
328
- collapsible: true,
329
- defaultOpen: true,
330
- },
331
- {
332
- title: "Content",
333
- fields: [f.content],
334
- },
335
- ],
336
- }))
337
- ```
178
+ > **Note:** The old `.toNamespace()` call has been removed. `qa<App>().use(adminModule)` is the complete builder.
338
179
 
339
- ### Columns Layout
340
-
341
- ```typescript
342
- sections: [
343
- {
344
- title: "Contact",
345
- layout: "columns",
346
- columns: 2,
347
- fields: [f.firstName, f.lastName, f.email, f.phone],
348
- },
349
- ];
350
- ```
180
+ ### 2. Typed Hooks
351
181
 
352
- ### Grid Layout
353
-
354
- ```typescript
355
- sections: [
356
- {
357
- layout: "grid",
358
- grid: { columns: 4, gap: 4 },
359
- fields: [
360
- { field: f.title, span: 4 }, // full width
361
- { field: f.price, span: 1 }, // 1/4
362
- { field: f.currency, span: 1 }, // 1/4
363
- { field: f.stock, span: 2 }, // 2/4
364
- ],
365
- },
366
- ];
182
+ ```ts
183
+ // questpie/admin/hooks.ts
184
+ import { createTypedHooks } from "@questpie/admin/client";
185
+ import type { App } from "#questpie";
186
+
187
+ export const {
188
+ useCollectionList,
189
+ useCollectionItem,
190
+ useCollectionCreate,
191
+ useCollectionUpdate,
192
+ useCollectionDelete,
193
+ useGlobal,
194
+ useGlobalUpdate,
195
+ } = createTypedHooks<App>();
367
196
  ```
368
197
 
369
- ### Tabs
198
+ ### 3. Mount in React
370
199
 
371
- ```typescript
372
- .form(({ v, f }) => v.form({
373
- tabs: [
374
- {
375
- id: "content",
376
- label: "Content",
377
- fields: [f.title, f.content],
378
- },
379
- {
380
- id: "meta",
381
- label: "Metadata",
382
- fields: [f.seo, f.tags],
383
- },
384
- ],
385
- }))
200
+ ```tsx
201
+ // routes/admin.tsx
202
+ import { AdminRouter } from "@questpie/admin/client";
203
+ import { admin } from "@/questpie/admin/builder";
204
+ import { appClient } from "@/lib/client";
205
+ import { queryClient } from "@/lib/query-client";
206
+
207
+ export default function AdminRoute() {
208
+ return (
209
+ <AdminRouter
210
+ admin={admin}
211
+ client={client}
212
+ queryClient={queryClient}
213
+ basePath="/admin"
214
+ />
215
+ );
216
+ }
386
217
  ```
387
218
 
388
- ### Sidebar Layout
219
+ ### 4. Tailwind CSS
389
220
 
390
- ```typescript
391
- .form(({ v, f }) => v.form({
392
- layout: "with-sidebar",
393
- sections: [
394
- { title: "Content", fields: [f.title, f.content] },
395
- ],
396
- sidebar: {
397
- position: "right",
398
- width: "300px",
399
- fields: [f.status, f.publishedAt],
400
- },
401
- }))
402
- ```
221
+ Import admin styles and scan the admin package:
403
222
 
404
- ## Conditional Fields
405
-
406
- ```typescript
407
- .fields(({ r }) => ({
408
- status: r.select({
409
- options: [
410
- { label: "Active", value: "active" },
411
- { label: "Cancelled", value: "cancelled" },
412
- ],
413
- }),
414
- // Show only when status is "cancelled"
415
- cancellationReason: r.textarea({
416
- visible: (values) => values.status === "cancelled",
417
- required: (values) => values.status === "cancelled",
418
- }),
419
- // Readonly unless draft
420
- publishedAt: r.datetime({
421
- readOnly: (values) => values.status !== "draft",
422
- }),
423
- }))
424
- ```
223
+ ```css
224
+ @import "tailwindcss";
225
+ @import "@questpie/admin/styles/index.css";
425
226
 
426
- ## Relation Fields
427
-
428
- ```typescript
429
- .fields(({ r }) => ({
430
- // Single relation
431
- authorId: r.relation({
432
- label: "Author",
433
- targetCollection: "users",
434
- }),
435
- // Multiple relations with ordering
436
- tags: r.relation({
437
- label: "Tags",
438
- targetCollection: "tags",
439
- type: "multiple",
440
- orderable: true,
441
- }),
442
- }))
227
+ @source "../node_modules/@questpie/admin/dist";
443
228
  ```
444
229
 
445
- ## Hooks
230
+ ## Block Editor
231
+
232
+ The admin includes a full drag-and-drop block editor. Blocks are defined server-side:
233
+
234
+ ```ts
235
+ const heroBlock = block("hero")
236
+ .admin(({ c }) => ({
237
+ label: { en: "Hero Section" },
238
+ icon: c.icon("ph:image"),
239
+ category: { label: "Sections", icon: c.icon("ph:layout") },
240
+ }))
241
+ .fields(({ f }) => ({
242
+ title: f.text({ required: true }),
243
+ subtitle: f.textarea(),
244
+ backgroundImage: f.upload({ to: "assets", mimeTypes: ["image/*"] }),
245
+ }))
246
+ .prefetch({ with: { backgroundImage: true } });
247
+ ```
446
248
 
447
- ```typescript
448
- import {
449
- useAdminStore,
450
- useAdminContext,
451
- useCollectionList,
452
- useCollectionItem,
453
- useCollectionCreate,
454
- useCollectionUpdate,
455
- useCollectionDelete,
456
- useGlobal,
457
- useGlobalUpdate,
458
- useAuthClient,
459
- useAdminRoutes,
460
- } from "@questpie/admin/client";
249
+ Render blocks on the client with `BlockRenderer`:
461
250
 
462
- // Collection list with pagination
463
- const { data, isLoading } = useCollectionList("posts", {
464
- limit: 10,
465
- offset: 0,
251
+ ```tsx
252
+ import { BlockRenderer, createBlockRegistry } from "@questpie/admin/client";
253
+
254
+ const registry = createBlockRegistry({
255
+ hero: ({ block }) => (
256
+ <section style={{ backgroundImage: `url(${block.backgroundImage?.url})` }}>
257
+ <h1>{block.title}</h1>
258
+ <p>{block.subtitle}</p>
259
+ </section>
260
+ ),
466
261
  });
467
262
 
468
- // Single item
469
- const { data: post } = useCollectionItem("posts", id);
263
+ function Page({ blocks }) {
264
+ return <BlockRenderer blocks={blocks} registry={registry} />;
265
+ }
266
+ ```
267
+
268
+ ## Actions System
470
269
 
471
- // CRUD mutations
472
- const createPost = useCollectionCreate("posts");
473
- const updatePost = useCollectionUpdate("posts");
474
- const deletePost = useCollectionDelete("posts");
270
+ Collection-level actions with multiple handler types:
475
271
 
476
- // Global data
477
- const { data: settings } = useGlobal("settings");
478
- const updateSettings = useGlobalUpdate("settings");
272
+ | Type | Description |
273
+ | ---------- | ------------------------------------------- |
274
+ | `navigate` | Client-side routing |
275
+ | `api` | HTTP API call |
276
+ | `form` | Dialog with field inputs |
277
+ | `server` | Server-side execution with full app context |
278
+ | `custom` | Arbitrary client-side code |
479
279
 
480
- // Admin store
481
- const { admin, client, basePath } = useAdminStore((s) => ({
482
- admin: s.admin,
483
- client: s.client,
484
- basePath: s.basePath,
485
- }));
280
+ Actions can be scoped to `header` (list toolbar), `bulk` (selected items), `single` (per-item), or `row`.
486
281
 
487
- // Auth
488
- const authClient = useAuthClient();
489
- const session = authClient.useSession();
282
+ ## Realtime
490
283
 
491
- // Routes
492
- const { routes, navigate } = useAdminRoutes();
493
- navigate({ collection: "posts", action: "create" });
494
- ```
284
+ SSE-powered live updates are enabled by default. Collection lists and dashboard widgets auto-refresh when data changes.
495
285
 
496
- ## Components
286
+ ```ts
287
+ // Disable globally
288
+ <AdminRouter admin={admin} client={client} realtime={false} />
497
289
 
498
- ```typescript
499
- import {
500
- // Navigation
501
- AdminLink,
502
- CollectionLink,
503
- CollectionCreateLink,
504
- CollectionEditLink,
505
- GlobalLink,
506
- DashboardLink,
507
-
508
- // Fields
509
- TextField,
510
- EmailField,
511
- NumberField,
512
- SelectField,
513
- CheckboxField,
514
- SwitchField,
515
- DateField,
516
- RelationField,
517
- JsonField,
518
-
519
- // UI (shadcn)
520
- Button,
521
- Card,
522
- Dialog,
523
- Sheet,
524
- Tabs,
525
- Table,
526
- // ... 27+ shadcn components
527
- } from "@questpie/admin/client";
290
+ // Disable per collection view
291
+ .list(({ v }) => v.collectionTable({ realtime: false }))
528
292
  ```
529
293
 
294
+ ## URL-Synced Panels
295
+
296
+ Admin keeps major panel states in URL search params so links are shareable and browser navigation works as expected.
297
+
298
+ - `sidebar=view-options` - collection list view options sheet
299
+ - `sidebar=history` - version history sidebar (collection/global forms)
300
+ - `sidebar=block-library` - block editor library sidebar
301
+ - `preview=true` - live preview mode (collection form)
302
+
303
+ Legacy params (`history`, `viewOptions`, and `sidebar=preview`) are still read for backward compatibility.
304
+
530
305
  ## Package Exports
531
306
 
532
- ```typescript
533
- // Main client exports (recommended)
307
+ ```ts
308
+ // Client (React components, builder, hooks)
534
309
  import {
535
- qa,
536
- Admin,
537
- AdminBuilder,
538
- adminModule,
539
- AdminProvider,
540
- useAdminStore,
541
- useCollectionList,
542
- useAdminRoutes,
543
- AdminLayoutProvider,
544
- CollectionList,
545
- CollectionForm,
310
+ qa,
311
+ adminModule,
312
+ AdminRouter,
313
+ createTypedHooks,
314
+ BlockRenderer,
315
+ createBlockRegistry,
546
316
  } from "@questpie/admin/client";
547
317
 
548
- // Server exports (for backend CMS setup)
549
- import { adminModule } from "@questpie/admin/server";
318
+ // Server (admin module + plugin for QUESTPIE config)
319
+ import { adminModule, auditModule } from "@questpie/admin/server";
320
+ import { adminPlugin } from "@questpie/admin/plugin";
550
321
 
551
322
  // Styles
552
- import "@questpie/admin/client/styles/index.css";
323
+ import "@questpie/admin/styles/index.css";
553
324
  ```
554
325
 
555
- ## Styling
556
-
557
- Built with Tailwind CSS v4 + shadcn/ui:
326
+ ## Component Stack
558
327
 
559
- - 27+ pre-built components
560
- - Light/dark theme support
561
- - oklch color space
562
- - Customizable via Tailwind tokens
563
- - Styles scoped under `.questpie-admin`
328
+ - **Primitives**: `@base-ui/react` (NOT Radix)
329
+ - **Icons**: `@iconify/react` with Phosphor set (`ph:icon-name`)
330
+ - **Styling**: Tailwind CSS v4 + shadcn components
331
+ - **Toast**: `sonner`
564
332
 
565
- ## Examples
333
+ ## Documentation
566
334
 
567
- See [tanstack-barbershop](../../examples/tanstack-barbershop) for a complete working example.
335
+ Full documentation: [https://questpie.com/docs/admin](https://questpie.com/docs/admin)
568
336
 
569
337
  ## License
570
338