@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.
- package/README.md +256 -488
- package/dist/augmentation.d.mts +414 -0
- package/dist/client/blocks/block-renderer.d.mts +45 -0
- package/dist/client/blocks/block-renderer.mjs +105 -0
- package/dist/client/blocks/index.d.mts +2 -0
- package/dist/client/blocks/types.d.mts +68 -0
- package/dist/client/blocks/types.mjs +19 -0
- package/dist/client/builder/admin-types.d.mts +40 -0
- package/dist/client/builder/admin.d.mts +110 -0
- package/dist/client/builder/admin.mjs +151 -0
- package/dist/client/builder/field/field.d.mts +51 -0
- package/dist/client/builder/field/field.mjs +37 -0
- package/dist/client/builder/index.d.mts +31 -0
- package/dist/client/builder/page/page.d.mts +24 -0
- package/dist/client/builder/page/page.mjs +31 -0
- package/dist/client/builder/registry.d.mts +50 -0
- package/dist/client/builder/types/action-registry.mjs +276 -0
- package/dist/client/builder/types/action-types.d.mts +226 -0
- package/dist/client/builder/types/collection-types.mjs +10 -0
- package/dist/client/builder/types/common.d.mts +46 -0
- package/dist/client/builder/types/field-types.d.mts +592 -0
- package/dist/client/builder/types/field-types.mjs +18 -0
- package/dist/client/builder/types/ui-config.d.mts +158 -0
- package/dist/client/builder/types/widget-types.d.mts +562 -0
- package/dist/client/builder/validation.d.mts +33 -0
- package/dist/client/builder/validation.mjs +227 -0
- package/dist/client/builder/view/view.d.mts +49 -0
- package/dist/client/builder/view/view.mjs +27 -0
- package/dist/client/builder/widget/widget.d.mts +27 -0
- package/dist/client/builder/widget/widget.mjs +21 -0
- package/dist/client/components/actions/action-button.mjs +245 -0
- package/dist/client/components/actions/action-dialog.mjs +559 -0
- package/dist/client/components/actions/confirmation-dialog.mjs +201 -0
- package/dist/client/components/actions/header-actions.mjs +210 -0
- package/dist/client/components/admin-link.d.mts +66 -0
- package/dist/client/components/admin-link.mjs +171 -0
- package/dist/client/components/auth/auth-guard.d.mts +50 -0
- package/dist/client/components/auth/auth-guard.mjs +60 -0
- package/dist/client/components/auth/auth-loading.d.mts +35 -0
- package/dist/client/components/auth/auth-loading.mjs +55 -0
- package/dist/client/components/blocks/block-canvas.mjs +159 -0
- package/dist/client/components/blocks/block-editor-context.mjs +125 -0
- package/dist/client/components/blocks/block-editor-layout.mjs +199 -0
- package/dist/client/components/blocks/block-editor-provider.mjs +235 -0
- package/dist/client/components/blocks/block-fields-renderer.mjs +240 -0
- package/dist/client/components/blocks/block-insert-button.mjs +189 -0
- package/dist/client/components/blocks/block-item-menu.mjs +363 -0
- package/dist/client/components/blocks/block-item.mjs +434 -0
- package/dist/client/components/blocks/block-library-sidebar.mjs +285 -0
- package/dist/client/components/blocks/block-tree.mjs +103 -0
- package/dist/client/components/blocks/block-type-icon.mjs +95 -0
- package/dist/client/components/blocks/utils/tree-utils.mjs +185 -0
- package/dist/client/components/component-renderer.d.mts +114 -0
- package/dist/client/components/component-renderer.mjs +258 -0
- package/dist/client/components/error-boundary.mjs +144 -0
- package/dist/client/components/fields/array-field.mjs +506 -0
- package/dist/client/components/fields/asset-preview-field.mjs +159 -0
- package/dist/client/components/fields/blocks-field/blocks-field.mjs +209 -0
- package/dist/client/components/fields/boolean-field.mjs +77 -0
- package/dist/client/components/fields/date-field.mjs +76 -0
- package/dist/client/components/fields/datetime-field.mjs +74 -0
- package/dist/client/components/fields/email-field.mjs +67 -0
- package/dist/client/components/fields/field-utils.mjs +64 -0
- package/dist/client/components/fields/field-wrapper.mjs +124 -0
- package/dist/client/components/fields/json-field.mjs +461 -0
- package/dist/client/components/fields/locale-badge.mjs +25 -0
- package/dist/client/components/fields/number-field.mjs +73 -0
- package/dist/client/components/fields/object-array-field.mjs +707 -0
- package/dist/client/components/fields/object-field.mjs +686 -0
- package/dist/client/components/fields/relation/displays/cards-display.mjs +254 -0
- package/dist/client/components/fields/relation/displays/chips-display.mjs +173 -0
- package/dist/client/components/fields/relation/displays/grid-display.mjs +209 -0
- package/dist/client/components/fields/relation/displays/list-display.mjs +247 -0
- package/dist/client/components/fields/relation/displays/table-display.mjs +309 -0
- package/dist/client/components/fields/relation/displays/types.mjs +72 -0
- package/dist/client/components/fields/relation/relation-items-display.mjs +143 -0
- package/dist/client/components/fields/relation-field.mjs +161 -0
- package/dist/client/components/fields/relation-picker.mjs +296 -0
- package/dist/client/components/fields/relation-select.mjs +232 -0
- package/dist/client/components/fields/rich-text-editor/bubble-menu.mjs +105 -0
- package/dist/client/components/fields/rich-text-editor/extensions.mjs +144 -0
- package/dist/client/components/fields/rich-text-editor/image-popover.mjs +221 -0
- package/dist/client/components/fields/rich-text-editor/index.mjs +520 -0
- package/dist/client/components/fields/rich-text-editor/link-popover.mjs +85 -0
- package/dist/client/components/fields/rich-text-editor/presets.mjs +123 -0
- package/dist/client/components/fields/rich-text-editor/slash-commands.mjs +188 -0
- package/dist/client/components/fields/rich-text-editor/table-controls.mjs +433 -0
- package/dist/client/components/fields/rich-text-editor/toolbar.mjs +541 -0
- package/dist/client/components/fields/rich-text-editor/types.mjs +30 -0
- package/dist/client/components/fields/rich-text-editor/utils.mjs +50 -0
- package/dist/client/components/fields/rich-text-field.mjs +64 -0
- package/dist/client/components/fields/select-field.mjs +88 -0
- package/dist/client/components/fields/text-field.mjs +72 -0
- package/dist/client/components/fields/textarea-field.mjs +71 -0
- package/dist/client/components/fields/time-field.mjs +67 -0
- package/dist/client/components/fields/upload-field.mjs +621 -0
- package/dist/client/components/filter-builder/columns-tab.mjs +325 -0
- package/dist/client/components/filter-builder/filter-builder-sheet.mjs +456 -0
- package/dist/client/components/filter-builder/filters-tab.mjs +663 -0
- package/dist/client/components/filter-builder/saved-views-tab.mjs +278 -0
- package/dist/client/components/history-sidebar.mjs +496 -0
- package/dist/client/components/layout/field-layout-renderer.mjs +301 -0
- package/dist/client/components/locale-switcher.mjs +251 -0
- package/dist/client/components/media/media-grid.mjs +314 -0
- package/dist/client/components/media/media-picker-dialog.mjs +563 -0
- package/dist/client/components/preview/live-preview-mode.mjs +503 -0
- package/dist/client/components/preview/preview-pane.mjs +388 -0
- package/dist/client/components/primitives/asset-preview.mjs +771 -0
- package/dist/client/components/primitives/checkbox-input.mjs +59 -0
- package/dist/client/components/primitives/date-input.mjs +461 -0
- package/dist/client/components/primitives/dropzone.mjs +368 -0
- package/dist/client/components/primitives/number-input.mjs +117 -0
- package/dist/client/components/primitives/select-multi.mjs +590 -0
- package/dist/client/components/primitives/select-single.mjs +473 -0
- package/dist/client/components/primitives/text-input.mjs +45 -0
- package/dist/client/components/primitives/textarea-input.mjs +43 -0
- package/dist/client/components/primitives/time-input.mjs +145 -0
- package/dist/client/components/primitives/toggle-input.mjs +51 -0
- package/dist/client/components/primitives/types.mjs +12 -0
- package/dist/client/components/sheets/resource-sheet.mjs +86 -0
- package/dist/client/components/ui/accordion.mjs +169 -0
- package/dist/client/components/ui/alert.mjs +85 -0
- package/dist/client/components/ui/badge.mjs +76 -0
- package/dist/client/components/ui/button.mjs +84 -0
- package/dist/client/components/ui/card.mjs +206 -0
- package/dist/client/components/ui/checkbox.mjs +82 -0
- package/dist/client/components/ui/command.mjs +239 -0
- package/dist/client/components/ui/dialog.mjs +296 -0
- package/dist/client/components/ui/drawer.mjs +278 -0
- package/dist/client/components/ui/dropdown-menu.mjs +315 -0
- package/dist/client/components/ui/empty-state.mjs +99 -0
- package/dist/client/components/ui/field.mjs +354 -0
- package/dist/client/components/ui/input-group.mjs +201 -0
- package/dist/client/components/ui/input.mjs +46 -0
- package/dist/client/components/ui/kbd.mjs +53 -0
- package/dist/client/components/ui/label.mjs +45 -0
- package/dist/client/components/ui/popover.mjs +176 -0
- package/dist/client/components/ui/responsive-dialog.mjs +308 -0
- package/dist/client/components/ui/search-input.mjs +139 -0
- package/dist/client/components/ui/select.mjs +325 -0
- package/dist/client/components/ui/separator.mjs +47 -0
- package/dist/client/components/ui/sheet.mjs +280 -0
- package/dist/client/components/ui/sidebar.mjs +774 -0
- package/dist/client/components/ui/skeleton.mjs +40 -0
- package/dist/client/components/ui/sonner.d.mts +13 -0
- package/dist/client/components/ui/sonner.mjs +85 -0
- package/dist/client/components/ui/spinner.mjs +52 -0
- package/dist/client/components/ui/switch.mjs +58 -0
- package/dist/client/components/ui/table.mjs +276 -0
- package/dist/client/components/ui/tabs.mjs +160 -0
- package/dist/client/components/ui/textarea.mjs +40 -0
- package/dist/client/components/ui/toolbar.mjs +136 -0
- package/dist/client/components/ui/tooltip.mjs +146 -0
- package/dist/client/components/widgets/chart-widget.mjs +582 -0
- package/dist/client/components/widgets/progress-widget.mjs +200 -0
- package/dist/client/components/widgets/quick-actions-widget.mjs +209 -0
- package/dist/client/components/widgets/recent-items-widget.mjs +196 -0
- package/dist/client/components/widgets/stats-widget.mjs +261 -0
- package/dist/client/components/widgets/table-widget.mjs +273 -0
- package/dist/client/components/widgets/timeline-widget.mjs +279 -0
- package/dist/client/components/widgets/value-widget.mjs +312 -0
- package/dist/client/components/widgets/widget-skeletons.mjs +427 -0
- package/dist/client/contexts/breadcrumb-context.mjs +60 -0
- package/dist/client/contexts/focus-context.d.mts +87 -0
- package/dist/client/contexts/focus-context.mjs +250 -0
- package/dist/client/hooks/typed-hooks.d.mts +110 -0
- package/dist/client/hooks/typed-hooks.mjs +888 -0
- package/dist/client/hooks/use-action.mjs +329 -0
- package/dist/client/hooks/use-admin-config.mjs +69 -0
- package/dist/client/hooks/use-admin-preferences.mjs +171 -0
- package/dist/client/hooks/use-admin-routes.mjs +130 -0
- package/dist/client/hooks/use-audit-history.mjs +157 -0
- package/dist/client/hooks/use-auth.d.mts +97 -0
- package/dist/{use-auth-BoLmWtmU.mjs → client/hooks/use-auth.mjs} +9 -10
- package/dist/client/hooks/use-collection-fields.mjs +71 -0
- package/dist/client/hooks/use-collection-meta.mjs +153 -0
- package/dist/client/hooks/use-collection-schema.mjs +90 -0
- package/dist/client/hooks/use-collection-validation.mjs +88 -0
- package/dist/client/hooks/use-collection.d.mts +96 -0
- package/dist/client/hooks/use-collection.mjs +673 -0
- package/dist/client/hooks/use-current-user.d.mts +60 -0
- package/dist/client/hooks/use-current-user.mjs +79 -0
- package/dist/client/hooks/use-field-hooks.mjs +199 -0
- package/dist/client/hooks/use-field-options.d.mts +57 -0
- package/dist/client/hooks/use-field-options.mjs +269 -0
- package/dist/client/hooks/use-global-fields.mjs +58 -0
- package/dist/client/hooks/use-global-meta.mjs +105 -0
- package/dist/client/hooks/use-global-schema.mjs +53 -0
- package/dist/client/hooks/use-global.d.mts +51 -0
- package/dist/client/hooks/use-global.mjs +284 -0
- package/dist/client/hooks/use-locks.mjs +452 -0
- package/dist/client/hooks/use-media-query.d.mts +22 -0
- package/dist/client/hooks/use-media-query.mjs +81 -0
- package/dist/client/hooks/use-prefill-params.mjs +47 -0
- package/dist/client/hooks/use-questpie-query-options.mjs +50 -0
- package/dist/client/hooks/use-reactive-fields.d.mts +78 -0
- package/dist/client/hooks/use-reactive-fields.mjs +201 -0
- package/dist/client/hooks/use-realtime-highlight.mjs +158 -0
- package/dist/client/hooks/use-saved-views.mjs +140 -0
- package/dist/client/hooks/use-search-param-toggle.d.mts +12 -0
- package/dist/client/hooks/use-search-param-toggle.mjs +115 -0
- package/dist/client/hooks/use-search.mjs +258 -0
- package/dist/client/hooks/use-server-actions.mjs +191 -0
- package/dist/client/hooks/use-server-validation.mjs +291 -0
- package/dist/client/hooks/use-server-widget-data.d.mts +25 -0
- package/dist/client/hooks/use-server-widget-data.mjs +65 -0
- package/dist/client/hooks/use-setup-status.d.mts +38 -0
- package/dist/client/hooks/use-setup-status.mjs +62 -0
- package/dist/client/hooks/use-sidebar-search-param.d.mts +9 -0
- package/dist/client/hooks/use-sidebar-search-param.mjs +104 -0
- package/dist/client/hooks/use-transition-stage.mjs +125 -0
- package/dist/client/hooks/use-upload-collection.mjs +31 -0
- package/dist/client/hooks/use-upload.mjs +209 -0
- package/dist/client/hooks/use-validation-error-map.mjs +57 -0
- package/dist/client/hooks/use-view-state.mjs +479 -0
- package/dist/client/i18n/hooks.mjs +284 -0
- package/dist/client/i18n/intl-cache.mjs +64 -0
- package/dist/client/i18n/messages.mjs +6 -0
- package/dist/client/i18n/simple.d.mts +21 -0
- package/dist/client/i18n/simple.mjs +156 -0
- package/dist/client/i18n/types.d.mts +109 -0
- package/dist/client/lib/cookies.mjs +9 -0
- package/dist/client/lib/events.mjs +5 -0
- package/dist/client/lib/render-profiler.mjs +51 -0
- package/dist/client/lib/utils.mjs +23 -0
- package/dist/client/preview/block-scope-context.d.mts +73 -0
- package/dist/client/preview/block-scope-context.mjs +116 -0
- package/dist/client/preview/index.d.mts +5 -0
- package/dist/client/preview/preview-banner.d.mts +45 -0
- package/dist/client/preview/preview-banner.mjs +134 -0
- package/dist/client/preview/preview-field.d.mts +107 -0
- package/dist/client/preview/preview-field.mjs +227 -0
- package/dist/client/preview/types.d.mts +114 -0
- package/dist/client/preview/types.mjs +20 -0
- package/dist/client/preview/use-collection-preview.d.mts +70 -0
- package/dist/client/preview/use-collection-preview.mjs +163 -0
- package/dist/client/runtime/content-locales-provider.d.mts +1 -0
- package/dist/client/runtime/content-locales-provider.mjs +136 -0
- package/dist/client/runtime/index.d.mts +5 -0
- package/dist/client/runtime/index.mjs +6 -0
- package/dist/client/runtime/locale-scope.d.mts +2 -0
- package/dist/client/runtime/locale-scope.mjs +108 -0
- package/dist/client/runtime/provider.d.mts +203 -0
- package/dist/client/runtime/provider.mjs +393 -0
- package/dist/client/runtime/routes.d.mts +49 -0
- package/dist/client/runtime/routes.mjs +91 -0
- package/dist/client/runtime/translations-provider.mjs +242 -0
- package/dist/client/scope/index.d.mts +3 -0
- package/dist/client/scope/picker.d.mts +53 -0
- package/dist/client/scope/picker.mjs +395 -0
- package/dist/client/scope/provider.d.mts +103 -0
- package/dist/client/scope/provider.mjs +167 -0
- package/dist/client/scope/types.d.mts +111 -0
- package/dist/client/styles/index.css +344 -188
- package/dist/client/utils/auto-expand-fields.mjs +83 -0
- package/dist/client/utils/build-field-definitions-from-schema.mjs +259 -0
- package/dist/client/utils/dependency-tracker.mjs +61 -0
- package/dist/client/utils/detect-relations.mjs +45 -0
- package/dist/client/utils/locale-to-flag.d.mts +119 -0
- package/dist/client/utils/locale-to-flag.mjs +129 -0
- package/dist/client/utils/routes.mjs +195 -0
- package/dist/client/views/auth/accept-invite-form.d.mts +72 -0
- package/dist/client/views/auth/accept-invite-form.mjs +473 -0
- package/dist/client/views/auth/auth-layout.d.mts +43 -0
- package/dist/client/views/auth/auth-layout.mjs +116 -0
- package/dist/client/views/auth/forgot-password-form.d.mts +58 -0
- package/dist/client/views/auth/forgot-password-form.mjs +386 -0
- package/dist/client/views/auth/invite-form.mjs +497 -0
- package/dist/client/views/auth/login-form.d.mts +75 -0
- package/dist/client/views/auth/login-form.mjs +387 -0
- package/dist/client/views/auth/reset-password-form.d.mts +65 -0
- package/dist/client/views/auth/reset-password-form.mjs +515 -0
- package/dist/client/views/auth/setup-form.d.mts +60 -0
- package/dist/client/views/auth/setup-form.mjs +526 -0
- package/dist/client/views/collection/auto-form-fields.mjs +873 -0
- package/dist/client/views/collection/bulk-action-toolbar.mjs +480 -0
- package/dist/client/views/collection/cells/complex-cells.mjs +746 -0
- package/dist/client/views/collection/cells/primitive-cells.mjs +395 -0
- package/dist/client/views/collection/cells/relation-cells.mjs +260 -0
- package/dist/client/views/collection/cells/shared/asset-thumbnail.mjs +509 -0
- package/dist/client/views/collection/cells/shared/cell-helpers.mjs +125 -0
- package/dist/client/views/collection/cells/shared/relation-chip.mjs +121 -0
- package/dist/client/views/collection/cells/upload-cells.mjs +28 -0
- package/dist/client/views/collection/columns/build-columns.mjs +195 -0
- package/dist/client/views/collection/columns/column-defaults.mjs +123 -0
- package/dist/client/views/collection/field-context.mjs +126 -0
- package/dist/client/views/collection/field-renderer.mjs +368 -0
- package/dist/client/views/collection/form-view.mjs +1566 -0
- package/dist/client/views/collection/table-view.mjs +832 -0
- package/dist/client/views/collection/view-skeletons.mjs +215 -0
- package/dist/client/views/common/global-search.mjs +700 -0
- package/dist/client/views/dashboard/dashboard-grid.mjs +881 -0
- package/dist/client/views/dashboard/dashboard-widget.mjs +265 -0
- package/dist/client/views/dashboard/widget-card.mjs +372 -0
- package/dist/client/views/globals/global-form-view.mjs +1306 -0
- package/dist/client/views/layout/admin-layout-provider.d.mts +137 -0
- package/dist/client/views/layout/admin-layout-provider.mjs +193 -0
- package/dist/client/views/layout/admin-layout.d.mts +133 -0
- package/dist/client/views/layout/admin-layout.mjs +302 -0
- package/dist/client/views/layout/admin-router.d.mts +93 -0
- package/dist/client/views/layout/admin-router.mjs +1254 -0
- package/dist/client/views/layout/admin-sidebar.d.mts +99 -0
- package/dist/client/views/layout/admin-sidebar.mjs +1379 -0
- package/dist/client/views/layout/admin-topbar.mjs +236 -0
- package/dist/client/views/pages/accept-invite-page.d.mts +66 -0
- package/dist/client/views/pages/accept-invite-page.mjs +349 -0
- package/dist/client/views/pages/dashboard-page.d.mts +43 -0
- package/dist/client/views/pages/dashboard-page.mjs +84 -0
- package/dist/client/views/pages/forgot-password-page.d.mts +56 -0
- package/dist/client/views/pages/forgot-password-page.mjs +152 -0
- package/dist/client/views/pages/invite-page.d.mts +70 -0
- package/dist/client/views/pages/invite-page.mjs +161 -0
- package/dist/client/views/pages/login-page.d.mts +69 -0
- package/dist/client/views/pages/login-page.mjs +193 -0
- package/dist/client/views/pages/reset-password-page.d.mts +63 -0
- package/dist/client/views/pages/reset-password-page.mjs +257 -0
- package/dist/client/views/pages/setup-page.d.mts +61 -0
- package/dist/client/views/pages/setup-page.mjs +156 -0
- package/dist/client-module.d.mts +3 -0
- package/dist/client-module.mjs +3 -0
- package/dist/client.d.mts +99 -3
- package/dist/client.mjs +52 -12
- package/dist/components/rich-text/index.d.mts +1 -0
- package/dist/components/rich-text/rich-text-renderer.d.mts +103 -0
- package/dist/components/rich-text/rich-text-renderer.mjs +237 -0
- package/dist/index.d.mts +59 -3
- package/dist/index.mjs +52 -12
- package/dist/plugin.d.mts +2 -0
- package/dist/plugin.mjs +3 -0
- package/dist/server/adapters/nextjs.d.mts +120 -0
- package/dist/server/adapters/nextjs.mjs +110 -0
- package/dist/server/adapters/tanstack.d.mts +132 -0
- package/dist/server/adapters/tanstack.mjs +89 -0
- package/dist/server/augmentation/actions.d.mts +279 -0
- package/dist/server/augmentation/common.d.mts +76 -0
- package/dist/server/augmentation/dashboard.d.mts +547 -0
- package/dist/server/augmentation/form-layout.d.mts +303 -0
- package/dist/server/augmentation/index.d.mts +44 -0
- package/dist/server/augmentation/index.mjs +10 -0
- package/dist/server/augmentation/sidebar.d.mts +181 -0
- package/dist/server/augmentation/views.d.mts +237 -0
- package/dist/server/augmentation.d.mts +7 -0
- package/dist/server/block/index.d.mts +4 -0
- package/dist/server/codegen/admin-client-template.mjs +93 -0
- package/dist/server/codegen/projection-validator.mjs +67 -0
- package/dist/server/fields/blocks.d.mts +71 -0
- package/dist/server/fields/blocks.mjs +151 -0
- package/dist/server/fields/index.d.mts +15 -0
- package/dist/server/fields/index.mjs +15 -0
- package/dist/server/fields/rich-text.d.mts +68 -0
- package/dist/server/fields/rich-text.mjs +147 -0
- package/dist/server/i18n/index.mjs +43 -0
- package/dist/server/i18n/messages/cs.mjs +461 -0
- package/dist/server/i18n/messages/de.mjs +461 -0
- package/dist/server/i18n/messages/en.mjs +707 -0
- package/dist/server/i18n/messages/es.mjs +461 -0
- package/dist/server/i18n/messages/fr.mjs +461 -0
- package/dist/server/i18n/messages/index.mjs +23 -0
- package/dist/server/i18n/messages/pl.mjs +461 -0
- package/dist/server/i18n/messages/pt.mjs +464 -0
- package/dist/server/i18n/messages/sk.mjs +689 -0
- package/dist/server/modules/admin/.generated/module.d.mts +52 -0
- package/dist/server/modules/admin/.generated/module.mjs +78 -0
- package/dist/server/modules/admin/.generated/registries.d.mts +22 -0
- package/dist/server/modules/admin/auth-helpers.d.mts +142 -0
- package/dist/server/modules/admin/auth-helpers.mjs +107 -0
- package/dist/server/modules/admin/block/block-builder.d.mts +383 -0
- package/dist/server/modules/admin/block/block-builder.mjs +315 -0
- package/dist/server/modules/admin/block/index.d.mts +3 -0
- package/dist/server/modules/admin/block/introspection.d.mts +89 -0
- package/dist/server/modules/admin/block/introspection.mjs +100 -0
- package/dist/server/modules/admin/block/prefetch.d.mts +78 -0
- package/dist/server/modules/admin/block/prefetch.mjs +241 -0
- package/dist/server/modules/admin/client/.generated/module.d.mts +94 -0
- package/dist/server/modules/admin/client/.generated/module.mjs +91 -0
- package/dist/server/modules/admin/client/components/badge.d.mts +1 -0
- package/dist/server/modules/admin/client/components/icon.d.mts +1 -0
- package/dist/server/modules/admin/client/fields/array.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/array.mjs +12 -0
- package/dist/server/modules/admin/client/fields/assetPreview.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/assetPreview.mjs +18 -0
- package/dist/server/modules/admin/client/fields/blocks.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/blocks.mjs +12 -0
- package/dist/server/modules/admin/client/fields/boolean.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/boolean.mjs +12 -0
- package/dist/server/modules/admin/client/fields/date.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/date.mjs +12 -0
- package/dist/server/modules/admin/client/fields/datetime.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/datetime.mjs +12 -0
- package/dist/server/modules/admin/client/fields/email.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/email.mjs +12 -0
- package/dist/server/modules/admin/client/fields/json.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/json.mjs +11 -0
- package/dist/server/modules/admin/client/fields/number.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/number.mjs +12 -0
- package/dist/server/modules/admin/client/fields/object.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/object.mjs +12 -0
- package/dist/server/modules/admin/client/fields/relation.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/relation.mjs +12 -0
- package/dist/server/modules/admin/client/fields/richText.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/richText.mjs +11 -0
- package/dist/server/modules/admin/client/fields/select.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/select.mjs +12 -0
- package/dist/server/modules/admin/client/fields/text.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/text.mjs +12 -0
- package/dist/server/modules/admin/client/fields/textarea.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/textarea.mjs +12 -0
- package/dist/server/modules/admin/client/fields/time.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/time.mjs +12 -0
- package/dist/server/modules/admin/client/fields/upload.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/upload.mjs +12 -0
- package/dist/server/modules/admin/client/fields/url.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/url.mjs +12 -0
- package/dist/server/modules/admin/client/index.d.mts +1 -0
- package/dist/server/modules/admin/client/pages/dashboard.d.mts +6 -0
- package/dist/server/modules/admin/client/pages/dashboard.mjs +11 -0
- package/dist/server/modules/admin/client/pages/forgotPassword.d.mts +6 -0
- package/dist/server/modules/admin/client/pages/forgotPassword.mjs +11 -0
- package/dist/server/modules/admin/client/pages/login.d.mts +6 -0
- package/dist/server/modules/admin/client/pages/login.mjs +11 -0
- package/dist/server/modules/admin/client/pages/resetPassword.d.mts +6 -0
- package/dist/server/modules/admin/client/pages/resetPassword.mjs +11 -0
- package/dist/server/modules/admin/client/pages/setup.d.mts +6 -0
- package/dist/server/modules/admin/client/pages/setup.mjs +11 -0
- package/dist/server/modules/admin/client/views/collection-form.mjs +10 -0
- package/dist/server/modules/admin/client/views/collection-table.mjs +10 -0
- package/dist/server/modules/admin/client/views/global-form.mjs +10 -0
- package/dist/server/modules/admin/client/widgets/chart.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/chart.mjs +7 -0
- package/dist/server/modules/admin/client/widgets/progress.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/progress.mjs +7 -0
- package/dist/server/modules/admin/client/widgets/quickActions.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/quickActions.mjs +7 -0
- package/dist/server/modules/admin/client/widgets/recentItems.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/recentItems.mjs +7 -0
- package/dist/server/modules/admin/client/widgets/stats.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/stats.mjs +7 -0
- package/dist/server/modules/admin/client/widgets/table.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/table.mjs +7 -0
- package/dist/server/modules/admin/client/widgets/timeline.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/timeline.mjs +7 -0
- package/dist/server/modules/admin/client/widgets/value.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/value.mjs +7 -0
- package/dist/server/modules/admin/collections/account.d.mts +77 -0
- package/dist/server/modules/admin/collections/account.mjs +23 -0
- package/dist/server/modules/admin/collections/admin-locks.d.mts +90 -0
- package/dist/server/modules/admin/collections/admin-locks.mjs +16 -0
- package/dist/server/modules/admin/collections/admin-preferences.d.mts +69 -0
- package/dist/server/modules/admin/collections/admin-preferences.mjs +16 -0
- package/dist/server/modules/admin/collections/admin-saved-views.d.mts +83 -0
- package/dist/server/modules/admin/collections/admin-saved-views.mjs +16 -0
- package/dist/server/modules/admin/collections/apikey.d.mts +99 -0
- package/dist/server/modules/admin/collections/apikey.mjs +15 -0
- package/dist/server/modules/admin/collections/assets.d.mts +72 -0
- package/dist/server/modules/admin/collections/assets.mjs +71 -0
- package/dist/server/modules/admin/collections/session.d.mts +69 -0
- package/dist/server/modules/admin/collections/session.mjs +15 -0
- package/dist/server/modules/admin/collections/user.d.mts +85 -0
- package/dist/server/modules/admin/collections/user.mjs +204 -0
- package/dist/server/modules/admin/collections/verification.d.mts +63 -0
- package/dist/server/modules/admin/collections/verification.mjs +15 -0
- package/dist/server/modules/admin/components/badge.d.mts +10 -0
- package/dist/server/modules/admin/components/badge.mjs +10 -0
- package/dist/server/modules/admin/components/icon.d.mts +9 -0
- package/dist/server/modules/admin/components/icon.mjs +11 -0
- package/dist/server/modules/admin/config/admin.mjs +34 -0
- package/dist/server/modules/admin/dto/admin-config.dto.mjs +102 -0
- package/dist/server/modules/admin/factories.mjs +172 -0
- package/dist/server/modules/admin/index.d.mts +1093 -0
- package/dist/server/modules/admin/index.mjs +26 -0
- package/dist/server/modules/admin/modules.mjs +11 -0
- package/dist/server/modules/admin/plugin.mjs +13 -0
- package/dist/server/modules/admin/routes/admin-config.d.mts +28 -0
- package/dist/server/modules/admin/routes/admin-config.mjs +552 -0
- package/dist/server/modules/admin/routes/execute-action.d.mts +92 -0
- package/dist/server/modules/admin/routes/execute-action.mjs +433 -0
- package/dist/server/modules/admin/routes/locales.d.mts +18 -0
- package/dist/server/modules/admin/routes/locales.mjs +69 -0
- package/dist/server/modules/admin/routes/preview.d.mts +80 -0
- package/dist/server/modules/admin/routes/preview.mjs +230 -0
- package/dist/server/modules/admin/routes/reactive.d.mts +74 -0
- package/dist/server/modules/admin/routes/reactive.mjs +350 -0
- package/dist/server/modules/admin/routes/route-helpers.d.mts +23 -0
- package/dist/server/modules/admin/routes/route-helpers.mjs +76 -0
- package/dist/server/modules/admin/routes/setup.d.mts +63 -0
- package/dist/server/modules/admin/routes/setup.mjs +114 -0
- package/dist/server/modules/admin/routes/translations.d.mts +26 -0
- package/dist/server/modules/admin/routes/translations.mjs +114 -0
- package/dist/server/modules/admin/routes/widget-data.d.mts +32 -0
- package/dist/server/modules/admin/routes/widget-data.mjs +62 -0
- package/dist/server/modules/admin/views/form.d.mts +8 -0
- package/dist/server/modules/admin/views/form.mjs +7 -0
- package/dist/server/modules/admin/views/global-form.d.mts +8 -0
- package/dist/server/modules/admin/views/global-form.mjs +7 -0
- package/dist/server/modules/admin/views/table.d.mts +8 -0
- package/dist/server/modules/admin/views/table.mjs +7 -0
- package/dist/server/modules/admin-preferences/collections/admin-preferences.mjs +37 -0
- package/dist/server/modules/admin-preferences/collections/locks.collection.mjs +55 -0
- package/dist/server/modules/admin-preferences/collections/saved-views.d.mts +99 -0
- package/dist/server/modules/admin-preferences/collections/saved-views.mjs +38 -0
- package/dist/server/modules/audit/.generated/module.d.mts +60 -0
- package/dist/server/modules/audit/.generated/module.mjs +30 -0
- package/dist/server/modules/audit/collections/audit-log.d.mts +214 -0
- package/dist/server/modules/audit/collections/audit-log.mjs +107 -0
- package/dist/server/modules/audit/config/admin.mjs +21 -0
- package/dist/server/modules/audit/config/app.mjs +262 -0
- package/dist/server/modules/audit/index.d.mts +2 -0
- package/dist/server/modules/audit/jobs/audit-cleanup.d.mts +13 -0
- package/dist/server/modules/audit/jobs/audit-cleanup.mjs +28 -0
- package/dist/server/plugin.d.mts +26 -0
- package/dist/server/plugin.mjs +385 -0
- package/dist/server/proxy-factories.d.mts +85 -0
- package/dist/server/proxy-factories.mjs +302 -0
- package/dist/server/registry-helpers.d.mts +83 -0
- package/dist/server/registry-helpers.mjs +104 -0
- package/dist/server.d.mts +33 -250
- package/dist/server.mjs +22 -832
- package/dist/shared/preview-utils.d.mts +53 -0
- package/dist/{preview-utils-BKQ9-TMa.mjs → shared/preview-utils.mjs} +2 -3
- package/dist/{saved-views.types-BMsz5mCy.d.mts → shared/types/saved-views.types.d.mts} +7 -2
- package/dist/shared.d.mts +3 -57
- package/dist/shared.mjs +1 -1
- package/package.json +56 -51
- package/skills/questpie-admin/SKILL.md +397 -0
- package/skills/questpie-admin/blocks/SKILL.md +305 -0
- package/skills/questpie-admin/custom-ui/SKILL.md +307 -0
- package/skills/questpie-admin/views/SKILL.md +442 -0
- package/dist/auth-layout-M8K8_q5R.mjs +0 -181
- package/dist/auth-layout-M8K8_q5R.mjs.map +0 -1
- package/dist/bulk-upload-dialog-D7w7W1Hl.mjs +0 -273
- package/dist/bulk-upload-dialog-D7w7W1Hl.mjs.map +0 -1
- package/dist/card-BKHjBQfw.mjs +0 -58
- package/dist/card-BKHjBQfw.mjs.map +0 -1
- package/dist/client-D1DqawtP.d.mts +0 -13403
- package/dist/client-D1DqawtP.d.mts.map +0 -1
- package/dist/client-njX1rZmi.mjs +0 -22612
- package/dist/client-njX1rZmi.mjs.map +0 -1
- package/dist/content-locales-provider-BXvuIgfg.mjs +0 -1650
- package/dist/content-locales-provider-BXvuIgfg.mjs.map +0 -1
- package/dist/dashboard-page-B4PGEdc2.mjs +0 -2500
- package/dist/dashboard-page-B4PGEdc2.mjs.map +0 -1
- package/dist/dashboard-page-mCY0pgZv.mjs +0 -3
- package/dist/dropzone-Do3awXKd.mjs +0 -634
- package/dist/dropzone-Do3awXKd.mjs.map +0 -1
- package/dist/forgot-password-page-Bcp-An4Y.mjs +0 -221
- package/dist/forgot-password-page-Bcp-An4Y.mjs.map +0 -1
- package/dist/forgot-password-page-CEwsdLwn.mjs +0 -3
- package/dist/index-B4H3amCD.d.mts +0 -2753
- package/dist/index-B4H3amCD.d.mts.map +0 -1
- package/dist/login-page-BUnpCbCa.mjs +0 -3
- package/dist/login-page-CP4gA-dl.mjs +0 -298
- package/dist/login-page-CP4gA-dl.mjs.map +0 -1
- package/dist/preview-utils-BKQ9-TMa.mjs.map +0 -1
- package/dist/reset-password-page-BqfDmLxA.mjs +0 -281
- package/dist/reset-password-page-BqfDmLxA.mjs.map +0 -1
- package/dist/reset-password-page-CufHz3h3.mjs +0 -3
- package/dist/runtime-6VZM878K.mjs +0 -69
- package/dist/runtime-6VZM878K.mjs.map +0 -1
- package/dist/saved-views.types-BMsz5mCy.d.mts.map +0 -1
- package/dist/server.d.mts.map +0 -1
- package/dist/server.mjs.map +0 -1
- package/dist/setup-page-BNNzt_Z6.mjs +0 -3
- package/dist/setup-page-YAP_fzqh.mjs +0 -264
- package/dist/setup-page-YAP_fzqh.mjs.map +0 -1
- package/dist/shared.d.mts.map +0 -1
- package/dist/use-auth-BoLmWtmU.mjs.map +0 -1
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: questpie-admin/views
|
|
3
|
+
description: QUESTPIE admin views list-view table form-view sections sidebar dashboard widgets filters bulk-actions visibility history versioning sorting search
|
|
4
|
+
type: skill
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# QUESTPIE Admin Views
|
|
8
|
+
|
|
9
|
+
This skill builds on questpie-admin.
|
|
10
|
+
|
|
11
|
+
Views control how data appears in the QUESTPIE admin panel. They are configured **server-side** on collections and globals, then rendered by the admin client via registries.
|
|
12
|
+
|
|
13
|
+
```text
|
|
14
|
+
Server Config Admin UI
|
|
15
|
+
.list(({ v }) => v.collectionTable({})) -> Table with columns, sort, search
|
|
16
|
+
.form(({ v, f }) => v.collectionForm({})) -> Form with sections, sidebar, tabs
|
|
17
|
+
sidebar({...}) -> Navigation sidebar
|
|
18
|
+
dashboard({...}) -> Dashboard with widgets
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## List Views
|
|
22
|
+
|
|
23
|
+
Configure table views with `.list()` on a collection.
|
|
24
|
+
|
|
25
|
+
### Basic Table
|
|
26
|
+
|
|
27
|
+
```ts
|
|
28
|
+
.list(({ v }) => v.collectionTable({}))
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Shows all fields as columns with default rendering.
|
|
32
|
+
|
|
33
|
+
### Custom Columns and Search
|
|
34
|
+
|
|
35
|
+
```ts
|
|
36
|
+
.list(({ v, f }) =>
|
|
37
|
+
v.collectionTable({
|
|
38
|
+
columns: [f.name, f.email, f.isActive, f.createdAt],
|
|
39
|
+
searchableFields: [f.name, f.email],
|
|
40
|
+
defaultSort: { field: f.createdAt, direction: "desc" },
|
|
41
|
+
}),
|
|
42
|
+
)
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
| Option | Type | Description |
|
|
46
|
+
| ------------------ | ---------------------- | ------------------------------ |
|
|
47
|
+
| `columns` | `Field[]` | Fields to show as columns |
|
|
48
|
+
| `searchableFields` | `Field[]` | Fields included in text search |
|
|
49
|
+
| `defaultSort` | `{ field, direction }` | Default sort order |
|
|
50
|
+
|
|
51
|
+
## Form Views
|
|
52
|
+
|
|
53
|
+
Configure edit forms with `.form()`.
|
|
54
|
+
|
|
55
|
+
### Basic Form
|
|
56
|
+
|
|
57
|
+
```ts
|
|
58
|
+
.form(({ v, f }) => v.collectionForm({}))
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Renders all fields in a single column.
|
|
62
|
+
|
|
63
|
+
### Sections
|
|
64
|
+
|
|
65
|
+
Group fields into labeled sections with optional grid layout:
|
|
66
|
+
|
|
67
|
+
```ts
|
|
68
|
+
.form(({ v, f }) =>
|
|
69
|
+
v.collectionForm({
|
|
70
|
+
fields: [
|
|
71
|
+
{
|
|
72
|
+
type: "section",
|
|
73
|
+
label: { en: "Contact Information" },
|
|
74
|
+
layout: "grid",
|
|
75
|
+
columns: 2,
|
|
76
|
+
fields: [f.name, f.email, f.phone],
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
type: "section",
|
|
80
|
+
label: { en: "Profile" },
|
|
81
|
+
fields: [f.bio],
|
|
82
|
+
},
|
|
83
|
+
],
|
|
84
|
+
}),
|
|
85
|
+
)
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
| Option | Type | Description |
|
|
89
|
+
| ------------- | ------------------- | ------------------------------------ |
|
|
90
|
+
| `type` | `"section"` | Required |
|
|
91
|
+
| `label` | `string \| i18n` | Section heading |
|
|
92
|
+
| `description` | `string \| i18n` | Section description |
|
|
93
|
+
| `layout` | `"grid" \| "stack"` | Field layout |
|
|
94
|
+
| `columns` | `number` | Grid columns (with `layout: "grid"`) |
|
|
95
|
+
| `fields` | `Field[]` | Fields in this section |
|
|
96
|
+
|
|
97
|
+
### Form Sidebar
|
|
98
|
+
|
|
99
|
+
Place fields in a right sidebar panel:
|
|
100
|
+
|
|
101
|
+
```ts
|
|
102
|
+
.form(({ v, f }) =>
|
|
103
|
+
v.collectionForm({
|
|
104
|
+
sidebar: {
|
|
105
|
+
position: "right",
|
|
106
|
+
fields: [f.isActive, f.avatar, f.status],
|
|
107
|
+
},
|
|
108
|
+
fields: [ /* main content sections */ ],
|
|
109
|
+
}),
|
|
110
|
+
)
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Computed Fields
|
|
114
|
+
|
|
115
|
+
Auto-compute values from other fields:
|
|
116
|
+
|
|
117
|
+
```ts
|
|
118
|
+
{
|
|
119
|
+
field: f.slug,
|
|
120
|
+
compute: {
|
|
121
|
+
handler: ({ data }) => {
|
|
122
|
+
if (data.name && !data.slug?.trim()) {
|
|
123
|
+
return slugify(data.name);
|
|
124
|
+
}
|
|
125
|
+
return undefined;
|
|
126
|
+
},
|
|
127
|
+
deps: ({ data }) => [data.name, data.slug],
|
|
128
|
+
debounce: 300,
|
|
129
|
+
},
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
| Option | Type | Description |
|
|
134
|
+
| ---------- | ---------------- | ------------------------ |
|
|
135
|
+
| `handler` | `(ctx) => value` | Compute function |
|
|
136
|
+
| `deps` | `(ctx) => any[]` | Reactive dependencies |
|
|
137
|
+
| `debounce` | `number` | Debounce in milliseconds |
|
|
138
|
+
|
|
139
|
+
### Conditional Visibility
|
|
140
|
+
|
|
141
|
+
Show or hide fields based on other field values:
|
|
142
|
+
|
|
143
|
+
```ts
|
|
144
|
+
{
|
|
145
|
+
field: f.cancellationReason,
|
|
146
|
+
hidden: ({ data }) => data.status !== "cancelled",
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Read-only fields:
|
|
151
|
+
|
|
152
|
+
```ts
|
|
153
|
+
{
|
|
154
|
+
field: f.customerName,
|
|
155
|
+
readOnly: ({ data }) => !!data.customer,
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Section-level visibility:
|
|
160
|
+
|
|
161
|
+
```ts
|
|
162
|
+
{
|
|
163
|
+
type: "section",
|
|
164
|
+
label: { en: "SEO" },
|
|
165
|
+
hidden: ({ data }) => !data.isPublished,
|
|
166
|
+
fields: [f.metaTitle, f.metaDescription],
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## Dashboard
|
|
171
|
+
|
|
172
|
+
Configure with `dashboard.ts`:
|
|
173
|
+
|
|
174
|
+
```ts title="dashboard.ts"
|
|
175
|
+
import { dashboard } from "#questpie";
|
|
176
|
+
|
|
177
|
+
export default dashboard({
|
|
178
|
+
title: { en: "Dashboard" },
|
|
179
|
+
description: { en: "Overview of your app" },
|
|
180
|
+
columns: 4,
|
|
181
|
+
actions: [
|
|
182
|
+
{
|
|
183
|
+
id: "new-post",
|
|
184
|
+
href: "/admin/collections/posts?create=true",
|
|
185
|
+
label: { en: "New Post" },
|
|
186
|
+
icon: { type: "icon", props: { name: "ph:plus" } },
|
|
187
|
+
variant: "primary",
|
|
188
|
+
},
|
|
189
|
+
],
|
|
190
|
+
sections: [
|
|
191
|
+
{ id: "today", label: { en: "Today" }, layout: "grid", columns: 4 },
|
|
192
|
+
{ id: "business", label: { en: "Business" }, layout: "grid", columns: 4 },
|
|
193
|
+
],
|
|
194
|
+
items: [
|
|
195
|
+
/* widget items — see widget types below */
|
|
196
|
+
],
|
|
197
|
+
});
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Widget Types
|
|
201
|
+
|
|
202
|
+
**Stats** — count records with optional filter:
|
|
203
|
+
|
|
204
|
+
```ts
|
|
205
|
+
{
|
|
206
|
+
sectionId: "today",
|
|
207
|
+
id: "pending",
|
|
208
|
+
type: "stats",
|
|
209
|
+
collection: "appointments",
|
|
210
|
+
label: { en: "Pending" },
|
|
211
|
+
filter: { status: "pending" },
|
|
212
|
+
span: 1,
|
|
213
|
+
}
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
**Value** — custom-loaded value with trend:
|
|
217
|
+
|
|
218
|
+
```ts
|
|
219
|
+
{
|
|
220
|
+
sectionId: "business",
|
|
221
|
+
id: "revenue",
|
|
222
|
+
type: "value",
|
|
223
|
+
span: 2,
|
|
224
|
+
refreshInterval: 1000 * 60 * 5,
|
|
225
|
+
loader: async ({ app }) => ({
|
|
226
|
+
value: 42000,
|
|
227
|
+
formatted: "42,000 EUR",
|
|
228
|
+
label: { en: "Monthly Revenue" },
|
|
229
|
+
trend: { value: "+12%" },
|
|
230
|
+
}),
|
|
231
|
+
}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
**Progress** — progress bar toward a goal:
|
|
235
|
+
|
|
236
|
+
```ts
|
|
237
|
+
{
|
|
238
|
+
sectionId: "business",
|
|
239
|
+
id: "goal",
|
|
240
|
+
type: "progress",
|
|
241
|
+
span: 1,
|
|
242
|
+
showPercentage: true,
|
|
243
|
+
label: { en: "Monthly Goal" },
|
|
244
|
+
loader: async ({ app }) => ({ current: 350, target: 500 }),
|
|
245
|
+
}
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
**Chart** — chart from field values:
|
|
249
|
+
|
|
250
|
+
```ts
|
|
251
|
+
{
|
|
252
|
+
sectionId: "business",
|
|
253
|
+
id: "by-status",
|
|
254
|
+
type: "chart",
|
|
255
|
+
collection: "appointments",
|
|
256
|
+
field: "status",
|
|
257
|
+
chartType: "pie",
|
|
258
|
+
label: { en: "By Status" },
|
|
259
|
+
span: 1,
|
|
260
|
+
}
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
**Recent Items** — list recent records:
|
|
264
|
+
|
|
265
|
+
```ts
|
|
266
|
+
{
|
|
267
|
+
sectionId: "ops",
|
|
268
|
+
id: "recent",
|
|
269
|
+
type: "recentItems",
|
|
270
|
+
collection: "appointments",
|
|
271
|
+
label: { en: "Recent" },
|
|
272
|
+
limit: 6,
|
|
273
|
+
dateField: "scheduledAt",
|
|
274
|
+
span: 2,
|
|
275
|
+
}
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
**Timeline** — activity stream:
|
|
279
|
+
|
|
280
|
+
```ts
|
|
281
|
+
{
|
|
282
|
+
sectionId: "ops",
|
|
283
|
+
id: "activity",
|
|
284
|
+
type: "timeline",
|
|
285
|
+
label: { en: "Activity" },
|
|
286
|
+
maxItems: 8,
|
|
287
|
+
showTimestamps: true,
|
|
288
|
+
timestampFormat: "relative",
|
|
289
|
+
loader: async ({ app }) => {
|
|
290
|
+
const res = await app.collections.appointments.find({
|
|
291
|
+
limit: 8,
|
|
292
|
+
orderBy: { updatedAt: "desc" },
|
|
293
|
+
});
|
|
294
|
+
return res.docs.map((apt) => ({
|
|
295
|
+
id: apt.id,
|
|
296
|
+
title: apt.displayTitle,
|
|
297
|
+
description: `Status: ${apt.status}`,
|
|
298
|
+
timestamp: apt.updatedAt,
|
|
299
|
+
variant: apt.status === "completed" ? "success" : "warning",
|
|
300
|
+
href: `/admin/collections/appointments/${apt.id}`,
|
|
301
|
+
}));
|
|
302
|
+
},
|
|
303
|
+
span: 2,
|
|
304
|
+
}
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
## Sidebar
|
|
308
|
+
|
|
309
|
+
Configure with `sidebar.ts`:
|
|
310
|
+
|
|
311
|
+
```ts title="sidebar.ts"
|
|
312
|
+
import { sidebar } from "#questpie";
|
|
313
|
+
|
|
314
|
+
export default sidebar({
|
|
315
|
+
sections: [
|
|
316
|
+
{ id: "overview", title: { en: "Overview" } },
|
|
317
|
+
{ id: "content", title: { en: "Content" } },
|
|
318
|
+
{ id: "external", title: { en: "External" } },
|
|
319
|
+
],
|
|
320
|
+
items: [
|
|
321
|
+
// Dashboard link
|
|
322
|
+
{
|
|
323
|
+
sectionId: "overview",
|
|
324
|
+
type: "link",
|
|
325
|
+
label: { en: "Dashboard" },
|
|
326
|
+
href: "/admin",
|
|
327
|
+
icon: { type: "icon", props: { name: "ph:house" } },
|
|
328
|
+
},
|
|
329
|
+
// Global settings
|
|
330
|
+
{ sectionId: "overview", type: "global", global: "siteSettings" },
|
|
331
|
+
// Collection — label and icon from .admin() config
|
|
332
|
+
{ sectionId: "content", type: "collection", collection: "posts" },
|
|
333
|
+
// External link
|
|
334
|
+
{
|
|
335
|
+
sectionId: "external",
|
|
336
|
+
type: "link",
|
|
337
|
+
label: { en: "Open Website" },
|
|
338
|
+
href: "/",
|
|
339
|
+
external: true,
|
|
340
|
+
icon: { type: "icon", props: { name: "ph:arrow-square-out" } },
|
|
341
|
+
},
|
|
342
|
+
],
|
|
343
|
+
});
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
Items appear in definition order within their section.
|
|
347
|
+
|
|
348
|
+
Modules contribute sidebar items automatically. `adminModule` adds "Administration" with user management. `auditModule` adds an audit log item.
|
|
349
|
+
|
|
350
|
+
## Filters & Saved Views
|
|
351
|
+
|
|
352
|
+
Filters are auto-generated from field definitions:
|
|
353
|
+
|
|
354
|
+
| Field Type | Filter Operators |
|
|
355
|
+
| ------------------- | ---------------------------------------- |
|
|
356
|
+
| `text` | Contains, equals, starts with, ends with |
|
|
357
|
+
| `number` | Equals, greater than, less than, between |
|
|
358
|
+
| `boolean` | Is true, is false |
|
|
359
|
+
| `select` | Is, is not, in |
|
|
360
|
+
| `date` / `datetime` | Before, after, between |
|
|
361
|
+
| `relation` | Is (picker) |
|
|
362
|
+
|
|
363
|
+
Users can save filter + sort + column combinations as named views.
|
|
364
|
+
|
|
365
|
+
## Bulk Actions
|
|
366
|
+
|
|
367
|
+
List views support multi-select. Check rows, then use the floating toolbar. Built-in: **Delete** (with confirmation). Soft-delete collections soft-delete instead of permanent removal.
|
|
368
|
+
|
|
369
|
+
## History & Versions
|
|
370
|
+
|
|
371
|
+
Click the clock icon in the form toolbar. Two tabs:
|
|
372
|
+
|
|
373
|
+
| Tab | Shows | Requires |
|
|
374
|
+
| ------------ | ---------------------------------------------- | ----------------------------- |
|
|
375
|
+
| **Activity** | Audit log (create, update, delete, transition) | `auditModule` |
|
|
376
|
+
| **Versions** | Full document snapshots with restore | `.versioning()` on collection |
|
|
377
|
+
|
|
378
|
+
Enable versioning:
|
|
379
|
+
|
|
380
|
+
```ts
|
|
381
|
+
export const pages = collection("pages")
|
|
382
|
+
.versioning({ drafts: true, maxVersions: 20 })
|
|
383
|
+
.fields(({ f }) => ({ ... }));
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
Disable audit for a specific collection:
|
|
387
|
+
|
|
388
|
+
```ts
|
|
389
|
+
export const logs = collection("logs")
|
|
390
|
+
.admin(() => ({ audit: false }))
|
|
391
|
+
.fields(({ f }) => ({ ... }));
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
## Common Mistakes
|
|
395
|
+
|
|
396
|
+
1. **HIGH: Defining columns that don't match field names** — `columns: [f.name]` requires a `name` field in the collection's `.fields()`. Mismatches cause empty columns.
|
|
397
|
+
|
|
398
|
+
2. **MEDIUM: Not specifying `searchableFields`** — table search bar won't work unless you explicitly list which fields to search.
|
|
399
|
+
|
|
400
|
+
3. **MEDIUM: Forgetting sidebar section ordering** — items appear in definition order. If you want "Dashboard" at the top, define it first in the `items` array.
|
|
401
|
+
|
|
402
|
+
4. **MEDIUM: Missing `sectionId` on sidebar items** — every item must reference an existing section ID.
|
|
403
|
+
|
|
404
|
+
5. **LOW: Not setting `defaultSort`** — records appear in database insertion order which is usually not what users expect.
|
|
405
|
+
|
|
406
|
+
## Form Views and Live Preview
|
|
407
|
+
|
|
408
|
+
Form views connect to the Live Preview V2 system when the collection has `.preview()` configured. The form editor becomes the source of `postMessage` patches — every field change emits a patch through the bus, giving the preview iframe instant updates.
|
|
409
|
+
|
|
410
|
+
### Enabling Preview on a Collection
|
|
411
|
+
|
|
412
|
+
Add `.preview()` to the collection definition:
|
|
413
|
+
|
|
414
|
+
```ts
|
|
415
|
+
export const pages = collection("pages")
|
|
416
|
+
.fields(({ f }) => ({
|
|
417
|
+
title: f.text({ required: true, localized: true }),
|
|
418
|
+
slug: f.text({ required: true }),
|
|
419
|
+
content: f.blocks({ localized: true }),
|
|
420
|
+
}))
|
|
421
|
+
.preview({
|
|
422
|
+
url: ({ record }) => `/${record.slug}?preview=true`,
|
|
423
|
+
watch: ["title", "slug", "content"],
|
|
424
|
+
strategy: "hybrid",
|
|
425
|
+
});
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
### Preview Strategy Options
|
|
429
|
+
|
|
430
|
+
| Strategy | Use case |
|
|
431
|
+
| ----------- | --------------------------------------------------------------------- |
|
|
432
|
+
| `"instant"` | Simple pages with no derived fields — fastest, pure client patches |
|
|
433
|
+
| `"server"` | Complex forms where every change needs server validation/computation |
|
|
434
|
+
| `"hybrid"` | Default recommendation — instant local patches + server reconcile for slugs, relations, computed fields |
|
|
435
|
+
|
|
436
|
+
### How It Works
|
|
437
|
+
|
|
438
|
+
1. The form view detects `.preview()` config and opens a split-screen layout
|
|
439
|
+
2. Field edits emit patches via `postMessage` to the preview iframe
|
|
440
|
+
3. The preview page receives patches through `useQuestpiePreview` and updates in place
|
|
441
|
+
4. Save/autosave persists to the database but is NOT the live transport
|
|
442
|
+
5. In `"hybrid"` mode, derived data (slugs, expanded relations) reconciles via server round-trip
|
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
import { g as cn } from "./content-locales-provider-BXvuIgfg.mjs";
|
|
2
|
-
import { i as CardDescription, o as CardHeader, r as CardContent, s as CardTitle, t as Card } from "./card-BKHjBQfw.mjs";
|
|
3
|
-
import { useMemo } from "react";
|
|
4
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
-
import { cva } from "class-variance-authority";
|
|
6
|
-
import { Input } from "@base-ui/react/input";
|
|
7
|
-
import { Separator } from "@base-ui/react/separator";
|
|
8
|
-
|
|
9
|
-
//#region src/client/components/ui/input.tsx
|
|
10
|
-
function Input$1({ className, type, ...props }) {
|
|
11
|
-
return /* @__PURE__ */ jsx(Input, {
|
|
12
|
-
type,
|
|
13
|
-
"data-slot": "input",
|
|
14
|
-
className: cn("bg-input/20 backdrop-blur-sm border-input/80 focus-visible:border-ring focus-visible:ring-ring/30 focus:border-ring focus:ring-ring/30 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 h-9 border px-3 py-1.5 text-sm transition-all file:h-7 file:text-sm file:font-medium focus-visible:ring-[2px] focus:ring-[2px] aria-invalid:ring-[2px] file:text-foreground placeholder:text-muted-foreground w-full min-w-0 outline-none file:inline-flex file:border-0 file:bg-transparent disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50", className),
|
|
15
|
-
...props
|
|
16
|
-
});
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
//#endregion
|
|
20
|
-
//#region src/client/components/ui/label.tsx
|
|
21
|
-
function Label({ className, ...props }) {
|
|
22
|
-
return /* @__PURE__ */ jsx("label", {
|
|
23
|
-
"data-slot": "label",
|
|
24
|
-
className: cn("gap-2 text-sm leading-none font-medium group-data-[disabled=true]:opacity-50 peer-disabled:opacity-50 flex items-center select-none group-data-[disabled=true]:pointer-events-none peer-disabled:cursor-not-allowed", className),
|
|
25
|
-
...props
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
//#endregion
|
|
30
|
-
//#region src/client/components/ui/separator.tsx
|
|
31
|
-
function Separator$1({ className, orientation = "horizontal", ...props }) {
|
|
32
|
-
return /* @__PURE__ */ jsx(Separator, {
|
|
33
|
-
"data-slot": "separator",
|
|
34
|
-
orientation,
|
|
35
|
-
className: cn("bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:w-px data-[orientation=vertical]:self-stretch", className),
|
|
36
|
-
...props
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
//#endregion
|
|
41
|
-
//#region src/client/components/ui/field.tsx
|
|
42
|
-
function FieldGroup({ className, ...props }) {
|
|
43
|
-
return /* @__PURE__ */ jsx("div", {
|
|
44
|
-
"data-slot": "field-group",
|
|
45
|
-
className: cn("gap-4 data-[slot=checkbox-group]:gap-3 [&>[data-slot=field-group]]:gap-4 group/field-group @container/field-group flex w-full flex-col", className),
|
|
46
|
-
...props
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
const fieldVariants = cva("data-[invalid=true]:text-destructive gap-2 group/field flex w-full", {
|
|
50
|
-
variants: { orientation: {
|
|
51
|
-
vertical: "flex-col [&>*]:w-full [&>.sr-only]:w-auto",
|
|
52
|
-
horizontal: "flex-row items-center [&>[data-slot=field-label]]:flex-auto has-[>[data-slot=field-content]]:items-start has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px",
|
|
53
|
-
responsive: "flex-col [&>*]:w-full [&>.sr-only]:w-auto @md/field-group:flex-row @md/field-group:items-center @md/field-group:[&>*]:w-auto @md/field-group:[&>[data-slot=field-label]]:flex-auto @md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px"
|
|
54
|
-
} },
|
|
55
|
-
defaultVariants: { orientation: "vertical" }
|
|
56
|
-
});
|
|
57
|
-
function Field({ className, orientation = "vertical", ...props }) {
|
|
58
|
-
return /* @__PURE__ */ jsx("div", {
|
|
59
|
-
role: "group",
|
|
60
|
-
"data-slot": "field",
|
|
61
|
-
"data-orientation": orientation,
|
|
62
|
-
className: cn(fieldVariants({ orientation }), className),
|
|
63
|
-
...props
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
function FieldContent({ className, ...props }) {
|
|
67
|
-
return /* @__PURE__ */ jsx("div", {
|
|
68
|
-
"data-slot": "field-content",
|
|
69
|
-
className: cn("gap-0.5 group/field-content flex flex-1 flex-col leading-snug", className),
|
|
70
|
-
...props
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
function FieldLabel({ className, ...props }) {
|
|
74
|
-
return /* @__PURE__ */ jsx(Label, {
|
|
75
|
-
"data-slot": "field-label",
|
|
76
|
-
className: cn("has-data-checked:bg-primary/5 dark:has-data-checked:bg-primary/10 gap-2 group-data-[disabled=true]/field:opacity-50 has-[>[data-slot=field]]:border [&>*]:data-[slot=field]:p-2 group/field-label peer/field-label flex w-fit leading-snug", "has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col", className),
|
|
77
|
-
...props
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
function FieldDescription({ className, ...props }) {
|
|
81
|
-
return /* @__PURE__ */ jsx("p", {
|
|
82
|
-
"data-slot": "field-description",
|
|
83
|
-
className: cn("text-muted-foreground text-left text-xs/relaxed [[data-variant=legend]+&]:-mt-1.5 leading-normal font-normal group-has-[[data-orientation=horizontal]]/field:text-balance", "last:mt-0 nth-last-2:-mt-1", "[&>a:hover]:text-primary [&>a]:underline [&>a]:underline-offset-4", className),
|
|
84
|
-
...props
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
function FieldError({ className, children, errors, ...props }) {
|
|
88
|
-
const content = useMemo(() => {
|
|
89
|
-
if (children) return children;
|
|
90
|
-
if (!errors?.length) return null;
|
|
91
|
-
const uniqueErrors = [...new Map(errors.map((error) => [error?.message, error])).values()];
|
|
92
|
-
if (uniqueErrors?.length == 1) return uniqueErrors[0]?.message;
|
|
93
|
-
return /* @__PURE__ */ jsx("ul", {
|
|
94
|
-
className: "ml-4 flex list-disc flex-col gap-1",
|
|
95
|
-
children: uniqueErrors.map((error, index) => error?.message && /* @__PURE__ */ jsx("li", { children: error.message }, index))
|
|
96
|
-
});
|
|
97
|
-
}, [children, errors]);
|
|
98
|
-
if (!content) return null;
|
|
99
|
-
return /* @__PURE__ */ jsx("div", {
|
|
100
|
-
role: "alert",
|
|
101
|
-
"data-slot": "field-error",
|
|
102
|
-
className: cn("text-destructive text-xs/relaxed font-normal", className),
|
|
103
|
-
...props,
|
|
104
|
-
children: content
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
//#endregion
|
|
109
|
-
//#region src/client/components/ui/alert.tsx
|
|
110
|
-
const alertVariants = cva("grid gap-0.5 border px-2 py-1.5 text-left text-xs/relaxed has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-18 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-1.5 *:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current *:[svg:not([class*='size-'])]:size-3.5 w-full relative group/alert", {
|
|
111
|
-
variants: { variant: {
|
|
112
|
-
default: "bg-card text-card-foreground",
|
|
113
|
-
destructive: "text-destructive bg-card *:data-[slot=alert-description]:text-destructive/90 *:[svg]:text-current"
|
|
114
|
-
} },
|
|
115
|
-
defaultVariants: { variant: "default" }
|
|
116
|
-
});
|
|
117
|
-
function Alert({ className, variant, ...props }) {
|
|
118
|
-
return /* @__PURE__ */ jsx("div", {
|
|
119
|
-
"data-slot": "alert",
|
|
120
|
-
role: "alert",
|
|
121
|
-
className: cn(alertVariants({ variant }), className),
|
|
122
|
-
...props
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
function AlertDescription({ className, ...props }) {
|
|
126
|
-
return /* @__PURE__ */ jsx("div", {
|
|
127
|
-
"data-slot": "alert-description",
|
|
128
|
-
className: cn("text-muted-foreground text-xs/relaxed text-balance md:text-pretty [&_p:not(:last-child)]:mb-4 [&_a]:hover:text-foreground [&_a]:underline [&_a]:underline-offset-3", className),
|
|
129
|
-
...props
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
//#endregion
|
|
134
|
-
//#region src/client/views/auth/auth-layout.tsx
|
|
135
|
-
/**
|
|
136
|
-
* Centered layout for authentication pages (login, register, forgot password, etc.)
|
|
137
|
-
*
|
|
138
|
-
* @example
|
|
139
|
-
* ```tsx
|
|
140
|
-
* <AuthLayout
|
|
141
|
-
* title="Sign in"
|
|
142
|
-
* description="Enter your credentials to access the admin panel"
|
|
143
|
-
* logo={<Logo />}
|
|
144
|
-
* footer={<Link to="/forgot-password">Forgot password?</Link>}
|
|
145
|
-
* >
|
|
146
|
-
* <LoginForm />
|
|
147
|
-
* </AuthLayout>
|
|
148
|
-
* ```
|
|
149
|
-
*/
|
|
150
|
-
function AuthLayout({ title, description, logo, footer, children, className }) {
|
|
151
|
-
return /* @__PURE__ */ jsx("div", {
|
|
152
|
-
className: "bg-background flex min-h-screen flex-col items-center justify-center p-4",
|
|
153
|
-
children: /* @__PURE__ */ jsxs("div", {
|
|
154
|
-
className: "w-full max-w-sm space-y-6",
|
|
155
|
-
children: [
|
|
156
|
-
logo && /* @__PURE__ */ jsx("div", {
|
|
157
|
-
className: "flex justify-center",
|
|
158
|
-
children: logo
|
|
159
|
-
}),
|
|
160
|
-
/* @__PURE__ */ jsxs(Card, {
|
|
161
|
-
className: cn("w-full", className),
|
|
162
|
-
children: [/* @__PURE__ */ jsxs(CardHeader, {
|
|
163
|
-
className: "text-center",
|
|
164
|
-
children: [/* @__PURE__ */ jsx(CardTitle, {
|
|
165
|
-
className: "text-lg",
|
|
166
|
-
children: title
|
|
167
|
-
}), description && /* @__PURE__ */ jsx(CardDescription, { children: description })]
|
|
168
|
-
}), /* @__PURE__ */ jsx(CardContent, { children })]
|
|
169
|
-
}),
|
|
170
|
-
footer && /* @__PURE__ */ jsx("div", {
|
|
171
|
-
className: "text-muted-foreground text-center text-xs",
|
|
172
|
-
children: footer
|
|
173
|
-
})
|
|
174
|
-
]
|
|
175
|
-
})
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
//#endregion
|
|
180
|
-
export { FieldContent as a, FieldGroup as c, Label as d, Input$1 as f, Field as i, FieldLabel as l, Alert as n, FieldDescription as o, AlertDescription as r, FieldError as s, AuthLayout as t, Separator$1 as u };
|
|
181
|
-
//# sourceMappingURL=auth-layout-M8K8_q5R.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth-layout-M8K8_q5R.mjs","names":["Input","InputPrimitive","Separator","SeparatorPrimitive"],"sources":["../src/client/components/ui/input.tsx","../src/client/components/ui/label.tsx","../src/client/components/ui/separator.tsx","../src/client/components/ui/field.tsx","../src/client/components/ui/alert.tsx","../src/client/views/auth/auth-layout.tsx"],"sourcesContent":["import { Input as InputPrimitive } from \"@base-ui/react/input\";\nimport type * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n\treturn (\n\t\t<InputPrimitive\n\t\t\ttype={type}\n\t\t\tdata-slot=\"input\"\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-input/20 backdrop-blur-sm border-input/80 focus-visible:border-ring focus-visible:ring-ring/30 focus:border-ring focus:ring-ring/30 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 h-9 border px-3 py-1.5 text-sm transition-all file:h-7 file:text-sm file:font-medium focus-visible:ring-[2px] focus:ring-[2px] aria-invalid:ring-[2px] file:text-foreground placeholder:text-muted-foreground w-full min-w-0 outline-none file:inline-flex file:border-0 file:bg-transparent disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport { Input };\n","import type * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Label({ className, ...props }: React.ComponentProps<\"label\">) {\n return (\n <label\n data-slot=\"label\"\n className={cn(\n \"gap-2 text-sm leading-none font-medium group-data-[disabled=true]:opacity-50 peer-disabled:opacity-50 flex items-center select-none group-data-[disabled=true]:pointer-events-none peer-disabled:cursor-not-allowed\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Label };\n","import { Separator as SeparatorPrimitive } from \"@base-ui/react/separator\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Separator({\n className,\n orientation = \"horizontal\",\n ...props\n}: SeparatorPrimitive.Props) {\n return (\n <SeparatorPrimitive\n data-slot=\"separator\"\n orientation={orientation}\n className={cn(\n \"bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:w-px data-[orientation=vertical]:self-stretch\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Separator };\n","\"use client\";\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { useMemo } from \"react\";\n\nimport { cn } from \"../../lib/utils\";\nimport { Label } from \"./label\";\nimport { Separator } from \"./separator\";\n\nfunction FieldSet({ className, ...props }: React.ComponentProps<\"fieldset\">) {\n return (\n <fieldset\n data-slot=\"field-set\"\n className={cn(\n \"gap-4 has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3 flex flex-col\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction FieldLegend({\n className,\n variant = \"legend\",\n ...props\n}: React.ComponentProps<\"legend\"> & { variant?: \"legend\" | \"label\" }) {\n return (\n <legend\n data-slot=\"field-legend\"\n data-variant={variant}\n className={cn(\n \"mb-2 font-medium data-[variant=label]:text-xs/relaxed data-[variant=legend]:text-sm\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction FieldGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-group\"\n className={cn(\n \"gap-4 data-[slot=checkbox-group]:gap-3 [&>[data-slot=field-group]]:gap-4 group/field-group @container/field-group flex w-full flex-col\",\n className,\n )}\n {...props}\n />\n );\n}\n\nconst fieldVariants = cva(\n \"data-[invalid=true]:text-destructive gap-2 group/field flex w-full\",\n {\n variants: {\n orientation: {\n vertical: \"flex-col [&>*]:w-full [&>.sr-only]:w-auto\",\n horizontal:\n \"flex-row items-center [&>[data-slot=field-label]]:flex-auto has-[>[data-slot=field-content]]:items-start has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px\",\n responsive:\n \"flex-col [&>*]:w-full [&>.sr-only]:w-auto @md/field-group:flex-row @md/field-group:items-center @md/field-group:[&>*]:w-auto @md/field-group:[&>[data-slot=field-label]]:flex-auto @md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px\",\n },\n },\n defaultVariants: {\n orientation: \"vertical\",\n },\n },\n);\n\nfunction Field({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof fieldVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"field\"\n data-orientation={orientation}\n className={cn(fieldVariants({ orientation }), className)}\n {...props}\n />\n );\n}\n\nfunction FieldContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-content\"\n className={cn(\n \"gap-0.5 group/field-content flex flex-1 flex-col leading-snug\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction FieldLabel({\n className,\n ...props\n}: React.ComponentProps<typeof Label>) {\n return (\n <Label\n data-slot=\"field-label\"\n className={cn(\n \"has-data-checked:bg-primary/5 dark:has-data-checked:bg-primary/10 gap-2 group-data-[disabled=true]/field:opacity-50 has-[>[data-slot=field]]:border [&>*]:data-[slot=field]:p-2 group/field-label peer/field-label flex w-fit leading-snug\",\n \"has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction FieldTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-label\"\n className={cn(\n \"gap-2 text-sm font-medium group-data-[disabled=true]/field:opacity-50 flex w-fit items-center leading-snug\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction FieldDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"field-description\"\n className={cn(\n \"text-muted-foreground text-left text-xs/relaxed [[data-variant=legend]+&]:-mt-1.5 leading-normal font-normal group-has-[[data-orientation=horizontal]]/field:text-balance\",\n \"last:mt-0 nth-last-2:-mt-1\",\n \"[&>a:hover]:text-primary [&>a]:underline [&>a]:underline-offset-4\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction FieldSeparator({\n children,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n children?: React.ReactNode;\n}) {\n return (\n <div\n data-slot=\"field-separator\"\n data-content={!!children}\n className={cn(\n \"-my-2 h-5 text-xs/relaxed group-data-[variant=outline]/field-group:-mb-2 relative\",\n className,\n )}\n {...props}\n >\n <Separator className=\"absolute inset-0 top-1/2\" />\n {children && (\n <span\n className=\"text-muted-foreground px-2 bg-background relative mx-auto block w-fit\"\n data-slot=\"field-separator-content\"\n >\n {children}\n </span>\n )}\n </div>\n );\n}\n\nfunction FieldError({\n className,\n children,\n errors,\n ...props\n}: React.ComponentProps<\"div\"> & {\n errors?: Array<{ message?: string } | undefined>;\n}) {\n const content = useMemo(() => {\n if (children) {\n return children;\n }\n\n if (!errors?.length) {\n return null;\n }\n\n const uniqueErrors = [\n ...new Map(errors.map((error) => [error?.message, error])).values(),\n ];\n\n if (uniqueErrors?.length == 1) {\n return uniqueErrors[0]?.message;\n }\n\n return (\n <ul className=\"ml-4 flex list-disc flex-col gap-1\">\n {uniqueErrors.map(\n (error, index) =>\n error?.message && <li key={index}>{error.message}</li>,\n )}\n </ul>\n );\n }, [children, errors]);\n\n if (!content) {\n return null;\n }\n\n return (\n <div\n role=\"alert\"\n data-slot=\"field-error\"\n className={cn(\"text-destructive text-xs/relaxed font-normal\", className)}\n {...props}\n >\n {content}\n </div>\n );\n}\n\nexport {\n Field,\n FieldLabel,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLegend,\n FieldSeparator,\n FieldSet,\n FieldContent,\n FieldTitle,\n};\n","import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"#questpie/admin/client/lib/utils\";\n\nconst alertVariants = cva(\n \"grid gap-0.5 border px-2 py-1.5 text-left text-xs/relaxed has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-18 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-1.5 *:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current *:[svg:not([class*='size-'])]:size-3.5 w-full relative group/alert\",\n {\n variants: {\n variant: {\n default: \"bg-card text-card-foreground\",\n destructive:\n \"text-destructive bg-card *:data-[slot=alert-description]:text-destructive/90 *:[svg]:text-current\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nfunction Alert({\n className,\n variant,\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof alertVariants>) {\n return (\n <div\n data-slot=\"alert\"\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n );\n}\n\nfunction AlertTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-title\"\n className={cn(\n \"font-medium group-has-[>svg]/alert:col-start-2 [&_a]:hover:text-foreground [&_a]:underline [&_a]:underline-offset-3\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AlertDescription({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-description\"\n className={cn(\n \"text-muted-foreground text-xs/relaxed text-balance md:text-pretty [&_p:not(:last-child)]:mb-4 [&_a]:hover:text-foreground [&_a]:underline [&_a]:underline-offset-3\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AlertAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-action\"\n className={cn(\"absolute top-1.5 right-2\", className)}\n {...props}\n />\n );\n}\n\nexport { Alert, AlertTitle, AlertDescription, AlertAction };\n","/**\n * Auth Layout - centered card layout for authentication pages\n */\n\nimport * as React from \"react\";\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from \"../../components/ui/card\";\nimport { cn } from \"../../lib/utils\";\n\nexport type AuthLayoutProps = {\n /** Page title */\n title: string;\n /** Page description */\n description?: string;\n /** Logo component or element */\n logo?: React.ReactNode;\n /** Footer content (e.g., links to other auth pages) */\n footer?: React.ReactNode;\n /** Form content */\n children: React.ReactNode;\n /** Additional class name for the card */\n className?: string;\n};\n\n/**\n * Centered layout for authentication pages (login, register, forgot password, etc.)\n *\n * @example\n * ```tsx\n * <AuthLayout\n * title=\"Sign in\"\n * description=\"Enter your credentials to access the admin panel\"\n * logo={<Logo />}\n * footer={<Link to=\"/forgot-password\">Forgot password?</Link>}\n * >\n * <LoginForm />\n * </AuthLayout>\n * ```\n */\nexport function AuthLayout({\n title,\n description,\n logo,\n footer,\n children,\n className,\n}: AuthLayoutProps) {\n return (\n <div className=\"bg-background flex min-h-screen flex-col items-center justify-center p-4\">\n <div className=\"w-full max-w-sm space-y-6\">\n {/* Logo */}\n {logo && <div className=\"flex justify-center\">{logo}</div>}\n\n {/* Main Card */}\n <Card className={cn(\"w-full\", className)}>\n <CardHeader className=\"text-center\">\n <CardTitle className=\"text-lg\">{title}</CardTitle>\n {description && <CardDescription>{description}</CardDescription>}\n </CardHeader>\n <CardContent>{children}</CardContent>\n </Card>\n\n {/* Footer */}\n {footer && (\n <div className=\"text-muted-foreground text-center text-xs\">\n {footer}\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;AAKA,SAASA,QAAM,EAAE,WAAW,MAAM,GAAG,SAAwC;AAC5E,QACC,oBAACC;EACM;EACN,aAAU;EACV,WAAW,GACV,moBACA,UACA;EACD,GAAI;GACH;;;;;ACXJ,SAAS,MAAM,EAAE,WAAW,GAAG,SAAwC;AACrE,QACE,oBAAC;EACC,aAAU;EACV,WAAW,GACT,uNACA,UACD;EACD,GAAI;GACJ;;;;;ACTN,SAASC,YAAU,EACjB,WACA,cAAc,cACd,GAAG,SACwB;AAC3B,QACE,oBAACC;EACC,aAAU;EACG;EACb,WAAW,GACT,wKACA,UACD;EACD,GAAI;GACJ;;;;;ACsBN,SAAS,WAAW,EAAE,WAAW,GAAG,SAAsC;AACxE,QACE,oBAAC;EACC,aAAU;EACV,WAAW,GACT,0IACA,UACD;EACD,GAAI;GACJ;;AAIN,MAAM,gBAAgB,IACpB,sEACA;CACE,UAAU,EACR,aAAa;EACX,UAAU;EACV,YACE;EACF,YACE;EACH,EACF;CACD,iBAAiB,EACf,aAAa,YACd;CACF,CACF;AAED,SAAS,MAAM,EACb,WACA,cAAc,YACd,GAAG,SACgE;AACnE,QACE,oBAAC;EACC,MAAK;EACL,aAAU;EACV,oBAAkB;EAClB,WAAW,GAAG,cAAc,EAAE,aAAa,CAAC,EAAE,UAAU;EACxD,GAAI;GACJ;;AAIN,SAAS,aAAa,EAAE,WAAW,GAAG,SAAsC;AAC1E,QACE,oBAAC;EACC,aAAU;EACV,WAAW,GACT,iEACA,UACD;EACD,GAAI;GACJ;;AAIN,SAAS,WAAW,EAClB,WACA,GAAG,SACkC;AACrC,QACE,oBAAC;EACC,aAAU;EACV,WAAW,GACT,8OACA,qEACA,UACD;EACD,GAAI;GACJ;;AAiBN,SAAS,iBAAiB,EAAE,WAAW,GAAG,SAAoC;AAC5E,QACE,oBAAC;EACC,aAAU;EACV,WAAW,GACT,6KACA,8BACA,qEACA,UACD;EACD,GAAI;GACJ;;AAkCN,SAAS,WAAW,EAClB,WACA,UACA,QACA,GAAG,SAGF;CACD,MAAM,UAAU,cAAc;AAC5B,MAAI,SACF,QAAO;AAGT,MAAI,CAAC,QAAQ,OACX,QAAO;EAGT,MAAM,eAAe,CACnB,GAAG,IAAI,IAAI,OAAO,KAAK,UAAU,CAAC,OAAO,SAAS,MAAM,CAAC,CAAC,CAAC,QAAQ,CACpE;AAED,MAAI,cAAc,UAAU,EAC1B,QAAO,aAAa,IAAI;AAG1B,SACE,oBAAC;GAAG,WAAU;aACX,aAAa,KACX,OAAO,UACN,OAAO,WAAW,oBAAC,kBAAgB,MAAM,WAAd,MAA2B,CACzD;IACE;IAEN,CAAC,UAAU,OAAO,CAAC;AAEtB,KAAI,CAAC,QACH,QAAO;AAGT,QACE,oBAAC;EACC,MAAK;EACL,aAAU;EACV,WAAW,GAAG,gDAAgD,UAAU;EACxE,GAAI;YAEH;GACG;;;;;ACzNV,MAAM,gBAAgB,IACpB,8TACA;CACE,UAAU,EACR,SAAS;EACP,SAAS;EACT,aACE;EACH,EACF;CACD,iBAAiB,EACf,SAAS,WACV;CACF,CACF;AAED,SAAS,MAAM,EACb,WACA,SACA,GAAG,SACgE;AACnE,QACE,oBAAC;EACC,aAAU;EACV,MAAK;EACL,WAAW,GAAG,cAAc,EAAE,SAAS,CAAC,EAAE,UAAU;EACpD,GAAI;GACJ;;AAiBN,SAAS,iBAAiB,EACxB,WACA,GAAG,SAC2B;AAC9B,QACE,oBAAC;EACC,aAAU;EACV,WAAW,GACT,sKACA,UACD;EACD,GAAI;GACJ;;;;;;;;;;;;;;;;;;;;ACjBN,SAAgB,WAAW,EACzB,OACA,aACA,MACA,QACA,UACA,aACkB;AAClB,QACE,oBAAC;EAAI,WAAU;YACb,qBAAC;GAAI,WAAU;;IAEZ,QAAQ,oBAAC;KAAI,WAAU;eAAuB;MAAW;IAG1D,qBAAC;KAAK,WAAW,GAAG,UAAU,UAAU;gBACtC,qBAAC;MAAW,WAAU;iBACpB,oBAAC;OAAU,WAAU;iBAAW;QAAkB,EACjD,eAAe,oBAAC,6BAAiB,cAA8B;OACrD,EACb,oBAAC,eAAa,WAAuB;MAChC;IAGN,UACC,oBAAC;KAAI,WAAU;eACZ;MACG;;IAEJ;GACF"}
|