@questpie/admin 2.0.0 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +173 -143
- package/dist/augmentation.d.mts +110 -11
- package/dist/client/blocks/block-renderer.d.mts +5 -12
- package/dist/client/blocks/block-renderer.mjs +89 -55
- package/dist/client/blocks/index.d.mts +2 -4
- package/dist/client/blocks/types.d.mts +3 -4
- package/dist/client/blocks/types.mjs +1 -2
- package/dist/client/builder/admin-types.d.mts +11 -44
- package/dist/client/builder/admin.d.mts +34 -45
- package/dist/client/builder/admin.mjs +35 -44
- package/dist/client/builder/field/field.d.mts +27 -205
- package/dist/client/builder/field/field.mjs +22 -68
- package/dist/client/builder/index.d.mts +23 -28
- package/dist/client/builder/page/page.d.mts +15 -27
- package/dist/client/builder/page/page.mjs +21 -17
- package/dist/client/builder/registry.d.mts +14 -34
- package/dist/client/builder/types/action-registry.mjs +148 -14
- package/dist/client/builder/types/action-types.d.mts +8 -35
- package/dist/client/builder/types/collection-types.mjs +1 -2
- package/dist/client/builder/types/common.d.mts +6 -20
- package/dist/client/builder/types/field-types.d.mts +4 -5
- package/dist/client/builder/types/field-types.mjs +1 -2
- package/dist/client/builder/types/ui-config.d.mts +3 -5
- package/dist/client/builder/types/widget-types.d.mts +19 -20
- package/dist/client/builder/validation.d.mts +33 -3
- package/dist/client/builder/validation.mjs +169 -150
- package/dist/client/builder/view/view.d.mts +26 -106
- package/dist/client/builder/view/view.mjs +14 -96
- package/dist/client/builder/widget/widget.d.mts +16 -22
- package/dist/client/builder/widget/widget.mjs +11 -16
- package/dist/client/components/actions/action-button.mjs +207 -97
- package/dist/client/components/actions/action-dialog.mjs +471 -176
- package/dist/client/components/actions/confirmation-dialog.mjs +166 -47
- package/dist/client/components/actions/header-actions.mjs +164 -71
- package/dist/client/components/admin-link.d.mts +8 -9
- package/dist/client/components/admin-link.mjs +127 -48
- package/dist/client/components/auth/auth-guard.d.mts +6 -7
- package/dist/client/components/auth/auth-guard.mjs +9 -9
- package/dist/client/components/auth/auth-loading.d.mts +3 -4
- package/dist/client/components/auth/auth-loading.mjs +38 -10
- package/dist/client/components/blocks/block-canvas.mjs +111 -42
- package/dist/client/components/blocks/block-editor-context.mjs +90 -23
- package/dist/client/components/blocks/block-editor-layout.mjs +176 -59
- package/dist/client/components/blocks/block-editor-provider.mjs +219 -139
- package/dist/client/components/blocks/block-fields-renderer.mjs +212 -42
- package/dist/client/components/blocks/block-insert-button.mjs +168 -51
- package/dist/client/components/blocks/block-item-menu.mjs +312 -110
- package/dist/client/components/blocks/block-item.mjs +372 -125
- package/dist/client/components/blocks/block-library-sidebar.mjs +209 -114
- package/dist/client/components/blocks/block-tree.mjs +73 -15
- package/dist/client/components/blocks/block-type-icon.mjs +65 -20
- package/dist/client/components/blocks/utils/tree-utils.mjs +1 -2
- package/dist/client/components/component-renderer.d.mts +11 -22
- package/dist/client/components/component-renderer.mjs +151 -38
- package/dist/client/components/error-boundary.mjs +77 -25
- package/dist/client/components/fields/array-field.mjs +474 -199
- package/dist/client/components/fields/asset-preview-field.mjs +143 -44
- package/dist/client/components/fields/blocks-field/blocks-field.mjs +143 -35
- package/dist/client/components/fields/boolean-field.mjs +62 -32
- package/dist/client/components/fields/date-field.mjs +46 -12
- package/dist/client/components/fields/datetime-field.mjs +42 -11
- package/dist/client/components/fields/email-field.mjs +57 -28
- package/dist/client/components/fields/field-utils.mjs +1 -2
- package/dist/client/components/fields/field-wrapper.mjs +107 -32
- package/dist/client/components/fields/json-field.mjs +323 -110
- package/dist/client/components/fields/locale-badge.mjs +16 -8
- package/dist/client/components/fields/number-field.mjs +63 -30
- package/dist/client/components/fields/object-array-field.mjs +666 -272
- package/dist/client/components/fields/object-field.mjs +656 -98
- package/dist/client/components/fields/relation/displays/cards-display.mjs +225 -111
- package/dist/client/components/fields/relation/displays/chips-display.mjs +150 -77
- package/dist/client/components/fields/relation/displays/grid-display.mjs +186 -91
- package/dist/client/components/fields/relation/displays/list-display.mjs +230 -111
- package/dist/client/components/fields/relation/displays/table-display.mjs +241 -66
- package/dist/client/components/fields/relation/displays/types.mjs +2 -3
- package/dist/client/components/fields/relation/relation-items-display.mjs +131 -35
- package/dist/client/components/fields/relation-field.mjs +70 -15
- package/dist/client/components/fields/relation-picker.mjs +93 -98
- package/dist/client/components/fields/relation-select.mjs +42 -29
- package/dist/client/components/fields/rich-text-editor/bubble-menu.mjs +90 -41
- package/dist/client/components/fields/rich-text-editor/extensions.mjs +33 -7
- package/dist/client/components/fields/rich-text-editor/image-popover.mjs +48 -23
- package/dist/client/components/fields/rich-text-editor/index.mjs +491 -158
- package/dist/client/components/fields/rich-text-editor/link-popover.mjs +13 -14
- package/dist/client/components/fields/rich-text-editor/presets.mjs +1 -2
- package/dist/client/components/fields/rich-text-editor/slash-commands.mjs +96 -53
- package/dist/client/components/fields/rich-text-editor/table-controls.mjs +416 -107
- package/dist/client/components/fields/rich-text-editor/toolbar.mjs +476 -215
- package/dist/client/components/fields/rich-text-editor/types.mjs +1 -2
- package/dist/client/components/fields/rich-text-editor/utils.mjs +1 -2
- package/dist/client/components/fields/rich-text-field.mjs +55 -17
- package/dist/client/components/fields/select-field.mjs +79 -44
- package/dist/client/components/fields/text-field.mjs +62 -29
- package/dist/client/components/fields/textarea-field.mjs +61 -29
- package/dist/client/components/fields/time-field.mjs +39 -11
- package/dist/client/components/fields/upload-field.mjs +253 -129
- package/dist/client/components/filter-builder/columns-tab.mjs +287 -93
- package/dist/client/components/filter-builder/filter-builder-sheet.mjs +437 -138
- package/dist/client/components/filter-builder/filters-tab.mjs +409 -126
- package/dist/client/components/filter-builder/saved-views-tab.mjs +259 -106
- 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 +231 -108
- package/dist/client/components/media/media-grid.mjs +259 -84
- package/dist/client/components/media/media-picker-dialog.mjs +500 -192
- package/dist/client/components/preview/live-preview-mode.mjs +416 -124
- package/dist/client/components/preview/preview-pane.mjs +353 -144
- package/dist/client/components/primitives/asset-preview.mjs +665 -257
- package/dist/client/components/primitives/checkbox-input.mjs +37 -11
- package/dist/client/components/primitives/date-input.mjs +392 -149
- package/dist/client/components/primitives/dropzone.mjs +314 -185
- package/dist/client/components/primitives/number-input.mjs +14 -10
- package/dist/client/components/primitives/select-multi.mjs +519 -185
- package/dist/client/components/primitives/select-single.mjs +416 -126
- package/dist/client/components/primitives/text-input.mjs +10 -5
- package/dist/client/components/primitives/textarea-input.mjs +10 -5
- package/dist/client/components/primitives/time-input.mjs +118 -45
- package/dist/client/components/primitives/toggle-input.mjs +31 -11
- package/dist/client/components/primitives/types.mjs +1 -2
- package/dist/client/components/sheets/resource-sheet.mjs +72 -64
- package/dist/client/components/ui/accordion.mjs +156 -37
- package/dist/client/components/ui/alert.mjs +70 -17
- package/dist/client/components/ui/badge.mjs +57 -16
- package/dist/client/components/ui/button.mjs +49 -14
- package/dist/client/components/ui/card.mjs +194 -39
- package/dist/client/components/ui/checkbox.mjs +71 -16
- package/dist/client/components/ui/command.mjs +220 -50
- package/dist/client/components/ui/dialog.mjs +265 -52
- package/dist/client/components/ui/drawer.mjs +260 -57
- package/dist/client/components/ui/dropdown-menu.mjs +293 -67
- package/dist/client/components/ui/empty-state.mjs +72 -26
- package/dist/client/components/ui/field.mjs +332 -56
- package/dist/client/components/ui/input-group.mjs +174 -41
- package/dist/client/components/ui/input.mjs +38 -9
- package/dist/client/components/ui/kbd.mjs +37 -8
- package/dist/client/components/ui/label.mjs +38 -8
- package/dist/client/components/ui/popover.mjs +162 -35
- package/dist/client/components/ui/responsive-dialog.mjs +277 -71
- package/dist/client/components/ui/search-input.mjs +101 -36
- package/dist/client/components/ui/select.mjs +297 -57
- package/dist/client/components/ui/separator.mjs +39 -9
- package/dist/client/components/ui/sheet.mjs +253 -51
- package/dist/client/components/ui/sidebar.mjs +700 -182
- package/dist/client/components/ui/skeleton.mjs +33 -8
- package/dist/client/components/ui/sonner.d.mts +2 -3
- package/dist/client/components/ui/sonner.mjs +45 -15
- package/dist/client/components/ui/spinner.mjs +44 -10
- package/dist/client/components/ui/switch.mjs +47 -12
- package/dist/client/components/ui/table.mjs +260 -50
- package/dist/client/components/ui/tabs.mjs +140 -29
- package/dist/client/components/ui/textarea.mjs +33 -8
- package/dist/client/components/ui/toolbar.mjs +105 -23
- package/dist/client/components/ui/tooltip.mjs +130 -29
- package/dist/client/components/widgets/chart-widget.mjs +456 -156
- package/dist/client/components/widgets/progress-widget.mjs +150 -60
- package/dist/client/components/widgets/quick-actions-widget.mjs +175 -87
- package/dist/client/components/widgets/recent-items-widget.mjs +157 -62
- package/dist/client/components/widgets/stats-widget.mjs +153 -42
- package/dist/client/components/widgets/table-widget.mjs +198 -64
- package/dist/client/components/widgets/timeline-widget.mjs +193 -82
- package/dist/client/components/widgets/value-widget.mjs +257 -56
- package/dist/client/components/widgets/widget-skeletons.mjs +390 -108
- package/dist/client/contexts/breadcrumb-context.mjs +44 -16
- package/dist/client/{context → contexts}/focus-context.d.mts +6 -7
- package/dist/client/{context → contexts}/focus-context.mjs +134 -62
- package/dist/client/hooks/typed-hooks.d.mts +38 -12
- package/dist/client/hooks/typed-hooks.mjs +758 -142
- package/dist/client/hooks/use-action.mjs +197 -69
- package/dist/client/hooks/use-admin-config.mjs +39 -10
- package/dist/client/hooks/use-admin-preferences.mjs +118 -15
- package/dist/client/hooks/use-admin-routes.mjs +60 -27
- package/dist/client/hooks/use-audit-history.mjs +157 -0
- package/dist/client/hooks/use-auth.d.mts +14 -15
- package/dist/client/hooks/use-auth.mjs +8 -9
- package/dist/client/hooks/use-collection-fields.mjs +58 -19
- package/dist/client/hooks/use-collection-meta.mjs +45 -13
- package/dist/client/hooks/use-collection-schema.mjs +34 -11
- package/dist/client/hooks/use-collection-validation.mjs +39 -25
- package/dist/client/hooks/use-collection.d.mts +18 -8
- package/dist/client/hooks/use-collection.mjs +560 -101
- package/dist/client/hooks/use-current-user.d.mts +6 -3
- package/dist/client/hooks/use-current-user.mjs +2 -2
- package/dist/client/hooks/use-field-hooks.mjs +73 -65
- package/dist/client/hooks/use-field-options.d.mts +1 -34
- package/dist/client/hooks/use-field-options.mjs +233 -148
- package/dist/client/hooks/use-global-fields.mjs +47 -16
- package/dist/client/hooks/use-global-meta.mjs +57 -11
- package/dist/client/hooks/use-global-schema.mjs +31 -11
- package/dist/client/hooks/use-global.d.mts +13 -2
- package/dist/client/hooks/use-global.mjs +244 -34
- package/dist/client/hooks/use-locks.mjs +331 -124
- package/dist/client/hooks/use-media-query.d.mts +1 -2
- package/dist/client/hooks/use-media-query.mjs +38 -19
- package/dist/client/hooks/use-prefill-params.mjs +2 -2
- package/dist/client/hooks/use-questpie-query-options.mjs +33 -11
- package/dist/client/hooks/use-reactive-fields.d.mts +6 -3
- package/dist/client/hooks/use-reactive-fields.mjs +130 -93
- package/dist/client/hooks/use-realtime-highlight.mjs +115 -53
- package/dist/client/hooks/use-saved-views.mjs +109 -34
- 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 +147 -36
- package/dist/client/hooks/use-server-actions.mjs +191 -0
- package/dist/client/hooks/use-server-validation.mjs +164 -72
- package/dist/client/hooks/use-server-widget-data.d.mts +2 -3
- package/dist/client/hooks/use-server-widget-data.mjs +36 -11
- package/dist/client/hooks/use-setup-status.d.mts +3 -4
- package/dist/client/hooks/use-setup-status.mjs +28 -16
- 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 +1 -2
- package/dist/client/hooks/use-upload.mjs +189 -125
- package/dist/client/hooks/use-validation-error-map.mjs +10 -6
- package/dist/client/hooks/use-view-state.mjs +380 -162
- package/dist/client/i18n/hooks.mjs +191 -67
- package/dist/client/i18n/intl-cache.mjs +1 -2
- package/dist/client/i18n/messages.mjs +1 -2
- package/dist/client/i18n/simple.d.mts +1 -2
- package/dist/client/i18n/simple.mjs +1 -2
- package/dist/client/i18n/types.d.mts +1 -2
- 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 +1 -6
- package/dist/client/preview/block-scope-context.d.mts +5 -6
- package/dist/client/preview/block-scope-context.mjs +50 -27
- package/dist/client/preview/index.d.mts +2 -2
- package/dist/client/preview/preview-banner.d.mts +3 -4
- package/dist/client/preview/preview-banner.mjs +74 -35
- package/dist/client/preview/preview-field.d.mts +9 -10
- package/dist/client/preview/preview-field.mjs +163 -61
- package/dist/client/preview/types.d.mts +1 -2
- package/dist/client/preview/types.mjs +1 -2
- package/dist/client/preview/use-collection-preview.d.mts +1 -2
- package/dist/client/preview/use-collection-preview.mjs +105 -56
- package/dist/client/runtime/content-locales-provider.mjs +87 -36
- package/dist/client/runtime/index.d.mts +1 -3
- package/dist/client/runtime/index.mjs +1 -3
- package/dist/client/runtime/locale-scope.mjs +69 -29
- package/dist/client/runtime/provider.d.mts +18 -9922
- package/dist/client/runtime/provider.mjs +250 -86
- package/dist/client/runtime/routes.d.mts +7 -7
- package/dist/client/runtime/routes.mjs +4 -20
- package/dist/client/runtime/translations-provider.mjs +114 -53
- package/dist/client/scope/picker.d.mts +3 -4
- package/dist/client/scope/picker.mjs +324 -90
- package/dist/client/scope/provider.d.mts +4 -5
- package/dist/client/scope/provider.mjs +30 -22
- package/dist/client/scope/types.d.mts +1 -2
- package/dist/client/styles/index.css +301 -225
- package/dist/client/utils/auto-expand-fields.mjs +23 -5
- package/dist/client/utils/build-field-definitions-from-schema.mjs +10 -7
- package/dist/client/utils/dependency-tracker.mjs +61 -0
- package/dist/client/utils/detect-relations.mjs +1 -2
- package/dist/client/utils/locale-to-flag.d.mts +8 -7
- package/dist/client/utils/locale-to-flag.mjs +1 -2
- package/dist/client/utils/routes.mjs +1 -2
- package/dist/client/views/auth/accept-invite-form.d.mts +3 -4
- package/dist/client/views/auth/accept-invite-form.mjs +414 -121
- package/dist/client/views/auth/auth-layout.d.mts +5 -6
- package/dist/client/views/auth/auth-layout.mjs +93 -30
- package/dist/client/views/auth/forgot-password-form.d.mts +4 -5
- package/dist/client/views/auth/forgot-password-form.mjs +332 -100
- package/dist/client/views/auth/invite-form.mjs +447 -105
- package/dist/client/views/auth/login-form.d.mts +4 -5
- package/dist/client/views/auth/login-form.mjs +340 -120
- package/dist/client/views/auth/reset-password-form.d.mts +4 -5
- package/dist/client/views/auth/reset-password-form.mjs +458 -131
- package/dist/client/views/auth/setup-form.d.mts +2 -3
- package/dist/client/views/auth/setup-form.mjs +481 -141
- package/dist/client/views/collection/auto-form-fields.mjs +686 -266
- package/dist/client/views/collection/bulk-action-toolbar.mjs +392 -203
- package/dist/client/views/collection/cells/complex-cells.mjs +635 -216
- package/dist/client/views/collection/cells/primitive-cells.mjs +332 -102
- package/dist/client/views/collection/cells/relation-cells.mjs +227 -72
- package/dist/client/views/collection/cells/shared/asset-thumbnail.mjs +456 -136
- package/dist/client/views/collection/cells/shared/cell-helpers.mjs +49 -2
- package/dist/client/views/collection/cells/shared/relation-chip.mjs +109 -25
- package/dist/client/views/collection/cells/upload-cells.mjs +16 -8
- package/dist/client/views/collection/columns/build-columns.mjs +51 -12
- package/dist/client/views/collection/columns/column-defaults.mjs +17 -2
- package/dist/client/views/collection/field-context.mjs +10 -11
- package/dist/client/views/collection/field-renderer.mjs +237 -40
- package/dist/client/views/collection/form-view.mjs +1108 -445
- package/dist/client/views/collection/table-view.mjs +300 -163
- package/dist/client/views/collection/view-skeletons.mjs +181 -87
- package/dist/client/views/common/global-search.mjs +557 -233
- package/dist/client/views/dashboard/dashboard-grid.mjs +707 -211
- package/dist/client/views/dashboard/dashboard-widget.mjs +145 -58
- package/dist/client/views/dashboard/widget-card.mjs +315 -102
- package/dist/client/views/globals/global-form-view.mjs +1256 -131
- package/dist/client/views/layout/admin-layout-provider.d.mts +18 -21
- package/dist/client/views/layout/admin-layout-provider.mjs +135 -32
- package/dist/client/views/layout/admin-layout.d.mts +14 -32
- package/dist/client/views/layout/admin-layout.mjs +254 -96
- package/dist/client/views/layout/admin-router.d.mts +10 -42
- package/dist/client/views/layout/admin-router.mjs +1086 -426
- package/dist/client/views/layout/admin-sidebar.d.mts +10 -16
- package/dist/client/views/layout/admin-sidebar.mjs +1211 -382
- package/dist/client/views/layout/admin-topbar.mjs +220 -112
- package/dist/client/views/pages/accept-invite-page.d.mts +5 -6
- package/dist/client/views/pages/accept-invite-page.mjs +302 -96
- package/dist/client/views/pages/dashboard-page.d.mts +7 -16
- package/dist/client/views/pages/dashboard-page.mjs +62 -23
- package/dist/client/views/pages/forgot-password-page.d.mts +7 -10
- package/dist/client/views/pages/forgot-password-page.mjs +112 -40
- package/dist/client/views/pages/invite-page.d.mts +6 -7
- package/dist/client/views/pages/invite-page.mjs +121 -46
- package/dist/client/views/pages/login-page.d.mts +8 -15
- package/dist/client/views/pages/login-page.mjs +152 -57
- package/dist/client/views/pages/reset-password-page.d.mts +7 -10
- package/dist/client/views/pages/reset-password-page.mjs +209 -57
- package/dist/client/views/pages/setup-page.d.mts +7 -10
- package/dist/client/views/pages/setup-page.mjs +108 -43
- package/dist/client-module.d.mts +3 -0
- package/dist/client-module.mjs +3 -0
- package/dist/client.d.mts +55 -48
- package/dist/client.mjs +26 -28
- package/dist/components/rich-text/rich-text-renderer.d.mts +3 -4
- package/dist/components/rich-text/rich-text-renderer.mjs +97 -70
- package/dist/index.d.mts +36 -39
- package/dist/index.mjs +26 -28
- package/dist/plugin.d.mts +2 -0
- package/dist/plugin.mjs +3 -0
- package/dist/server/adapters/nextjs.d.mts +13 -14
- package/dist/server/adapters/nextjs.mjs +12 -13
- package/dist/server/adapters/tanstack.d.mts +10 -11
- package/dist/server/adapters/tanstack.mjs +11 -12
- 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 -1523
- package/dist/server/block/index.d.mts +4 -3
- 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 +10 -78
- package/dist/server/fields/blocks.mjs +74 -115
- package/dist/server/fields/index.d.mts +6 -39
- package/dist/server/fields/index.mjs +6 -7
- package/dist/server/fields/rich-text.d.mts +10 -77
- package/dist/server/fields/rich-text.mjs +59 -100
- package/dist/server/i18n/index.mjs +8 -9
- package/dist/server/i18n/messages/cs.mjs +3 -3
- package/dist/server/i18n/messages/de.mjs +3 -3
- package/dist/server/i18n/messages/en.mjs +217 -3
- package/dist/server/i18n/messages/es.mjs +3 -3
- package/dist/server/i18n/messages/fr.mjs +3 -3
- package/dist/server/i18n/messages/index.mjs +1 -2
- package/dist/server/i18n/messages/pl.mjs +3 -3
- package/dist/server/i18n/messages/pt.mjs +3 -3
- package/dist/server/i18n/messages/sk.mjs +202 -3
- 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/{auth-helpers.d.mts → modules/admin/auth-helpers.d.mts} +13 -14
- package/dist/server/{auth-helpers.mjs → modules/admin/auth-helpers.mjs} +15 -16
- package/dist/server/{block → modules/admin/block}/block-builder.d.mts +96 -32
- package/dist/server/{block → modules/admin/block}/block-builder.mjs +113 -15
- package/dist/server/modules/admin/block/index.d.mts +3 -0
- package/dist/server/{block → modules/admin/block}/introspection.d.mts +10 -5
- package/dist/server/{block → modules/admin/block}/introspection.mjs +18 -7
- package/dist/server/{block → modules/admin/block}/prefetch.d.mts +21 -17
- package/dist/server/{block → modules/admin/block}/prefetch.mjs +17 -16
- 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 +1060 -16846
- package/dist/server/modules/admin/index.mjs +17 -240
- 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/{functions → routes}/execute-action.d.mts +17 -32
- package/dist/server/modules/admin/{functions → routes}/execute-action.mjs +146 -44
- 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/{functions → routes}/preview.d.mts +25 -15
- package/dist/server/modules/admin/{functions → routes}/preview.mjs +84 -97
- package/dist/server/modules/admin/{functions → routes}/reactive.d.mts +19 -44
- package/dist/server/modules/admin/{functions → routes}/reactive.mjs +89 -117
- 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/{functions → routes}/setup.d.mts +11 -32
- 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.collection.mjs → admin-preferences.mjs} +13 -24
- package/dist/server/modules/admin-preferences/collections/locks.collection.mjs +18 -42
- 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 +30 -18
- package/dist/server.mjs +19 -16
- package/dist/shared/preview-utils.d.mts +2 -3
- package/dist/shared/preview-utils.mjs +2 -3
- package/dist/shared/types/saved-views.types.d.mts +2 -2
- package/package.json +51 -40
- package/dist/_virtual/rolldown_runtime.mjs +0 -18
- package/dist/augmentation.d.mts.map +0 -1
- package/dist/client/blocks/block-registry.d.mts +0 -199
- package/dist/client/blocks/block-registry.d.mts.map +0 -1
- package/dist/client/blocks/block-registry.mjs +0 -88
- package/dist/client/blocks/block-registry.mjs.map +0 -1
- package/dist/client/blocks/block-renderer.d.mts.map +0 -1
- package/dist/client/blocks/block-renderer.mjs.map +0 -1
- package/dist/client/blocks/prefetch.d.mts +0 -45
- package/dist/client/blocks/prefetch.d.mts.map +0 -1
- package/dist/client/blocks/prefetch.mjs +0 -26
- package/dist/client/blocks/prefetch.mjs.map +0 -1
- package/dist/client/blocks/types.d.mts.map +0 -1
- package/dist/client/blocks/types.mjs.map +0 -1
- package/dist/client/builder/admin-builder.d.mts +0 -112
- package/dist/client/builder/admin-builder.d.mts.map +0 -1
- package/dist/client/builder/admin-builder.mjs +0 -185
- package/dist/client/builder/admin-builder.mjs.map +0 -1
- package/dist/client/builder/admin-types.d.mts.map +0 -1
- package/dist/client/builder/admin.d.mts.map +0 -1
- package/dist/client/builder/admin.mjs.map +0 -1
- package/dist/client/builder/defaults/components.mjs +0 -20
- package/dist/client/builder/defaults/components.mjs.map +0 -1
- package/dist/client/builder/defaults/core.d.mts +0 -354
- package/dist/client/builder/defaults/core.d.mts.map +0 -1
- package/dist/client/builder/defaults/core.mjs +0 -49
- package/dist/client/builder/defaults/core.mjs.map +0 -1
- package/dist/client/builder/defaults/fields.mjs +0 -328
- package/dist/client/builder/defaults/fields.mjs.map +0 -1
- package/dist/client/builder/defaults/pages.mjs +0 -58
- package/dist/client/builder/defaults/pages.mjs.map +0 -1
- package/dist/client/builder/defaults/starter.d.mts +0 -351
- package/dist/client/builder/defaults/starter.d.mts.map +0 -1
- package/dist/client/builder/defaults/starter.mjs +0 -28
- package/dist/client/builder/defaults/starter.mjs.map +0 -1
- package/dist/client/builder/defaults/views.mjs +0 -27
- package/dist/client/builder/defaults/views.mjs.map +0 -1
- package/dist/client/builder/defaults/widgets.mjs +0 -31
- package/dist/client/builder/defaults/widgets.mjs.map +0 -1
- package/dist/client/builder/field/field.d.mts.map +0 -1
- package/dist/client/builder/field/field.mjs.map +0 -1
- package/dist/client/builder/index.d.mts.map +0 -1
- package/dist/client/builder/page/page.d.mts.map +0 -1
- package/dist/client/builder/page/page.mjs.map +0 -1
- package/dist/client/builder/proxies.d.mts +0 -2
- package/dist/client/builder/proxies.mjs +0 -24
- package/dist/client/builder/proxies.mjs.map +0 -1
- package/dist/client/builder/qa.d.mts +0 -50
- package/dist/client/builder/qa.d.mts.map +0 -1
- package/dist/client/builder/qa.mjs +0 -42
- package/dist/client/builder/qa.mjs.map +0 -1
- package/dist/client/builder/registry.d.mts.map +0 -1
- package/dist/client/builder/types/action-registry.d.mts +0 -2
- package/dist/client/builder/types/action-registry.mjs.map +0 -1
- package/dist/client/builder/types/action-types.d.mts.map +0 -1
- package/dist/client/builder/types/collection-types.d.mts +0 -199
- package/dist/client/builder/types/collection-types.d.mts.map +0 -1
- package/dist/client/builder/types/collection-types.mjs.map +0 -1
- package/dist/client/builder/types/common.d.mts.map +0 -1
- package/dist/client/builder/types/field-types.d.mts.map +0 -1
- package/dist/client/builder/types/field-types.mjs.map +0 -1
- package/dist/client/builder/types/global-types.d.mts +0 -22
- package/dist/client/builder/types/global-types.d.mts.map +0 -1
- package/dist/client/builder/types/ui-config.d.mts.map +0 -1
- package/dist/client/builder/types/views.d.mts +0 -89
- package/dist/client/builder/types/views.d.mts.map +0 -1
- package/dist/client/builder/types/widget-types.d.mts.map +0 -1
- package/dist/client/builder/validation.mjs.map +0 -1
- package/dist/client/builder/view/view.d.mts.map +0 -1
- package/dist/client/builder/view/view.mjs.map +0 -1
- package/dist/client/builder/widget/widget.d.mts.map +0 -1
- package/dist/client/builder/widget/widget.mjs.map +0 -1
- package/dist/client/components/actions/action-button.d.mts +0 -2
- package/dist/client/components/actions/action-button.mjs.map +0 -1
- package/dist/client/components/actions/action-dialog.d.mts +0 -2
- package/dist/client/components/actions/action-dialog.mjs.map +0 -1
- package/dist/client/components/actions/confirmation-dialog.d.mts +0 -2
- package/dist/client/components/actions/confirmation-dialog.mjs.map +0 -1
- package/dist/client/components/actions/header-actions.d.mts +0 -2
- package/dist/client/components/actions/header-actions.mjs.map +0 -1
- package/dist/client/components/actions/index.d.mts +0 -4
- package/dist/client/components/admin-link.d.mts.map +0 -1
- package/dist/client/components/admin-link.mjs.map +0 -1
- package/dist/client/components/auth/auth-guard.d.mts.map +0 -1
- package/dist/client/components/auth/auth-guard.mjs.map +0 -1
- package/dist/client/components/auth/auth-loading.d.mts.map +0 -1
- package/dist/client/components/auth/auth-loading.mjs.map +0 -1
- package/dist/client/components/auth/index.d.mts +0 -2
- package/dist/client/components/blocks/block-canvas.mjs.map +0 -1
- package/dist/client/components/blocks/block-editor-context.mjs.map +0 -1
- package/dist/client/components/blocks/block-editor-layout.mjs.map +0 -1
- package/dist/client/components/blocks/block-editor-provider.mjs.map +0 -1
- package/dist/client/components/blocks/block-fields-renderer.mjs.map +0 -1
- package/dist/client/components/blocks/block-insert-button.mjs.map +0 -1
- package/dist/client/components/blocks/block-item-menu.mjs.map +0 -1
- package/dist/client/components/blocks/block-item.mjs.map +0 -1
- package/dist/client/components/blocks/block-library-sidebar.mjs.map +0 -1
- package/dist/client/components/blocks/block-tree.mjs.map +0 -1
- package/dist/client/components/blocks/block-type-icon.mjs.map +0 -1
- package/dist/client/components/blocks/utils/tree-utils.mjs.map +0 -1
- package/dist/client/components/component-renderer.d.mts.map +0 -1
- package/dist/client/components/component-renderer.mjs.map +0 -1
- package/dist/client/components/error-boundary.mjs.map +0 -1
- package/dist/client/components/fields/array-field.d.mts +0 -44
- package/dist/client/components/fields/array-field.d.mts.map +0 -1
- package/dist/client/components/fields/array-field.mjs.map +0 -1
- package/dist/client/components/fields/asset-preview-field.d.mts +0 -52
- package/dist/client/components/fields/asset-preview-field.d.mts.map +0 -1
- package/dist/client/components/fields/asset-preview-field.mjs.map +0 -1
- package/dist/client/components/fields/blocks-field/blocks-field.d.mts +0 -41
- package/dist/client/components/fields/blocks-field/blocks-field.d.mts.map +0 -1
- package/dist/client/components/fields/blocks-field/blocks-field.mjs.map +0 -1
- package/dist/client/components/fields/blocks-field/index.d.mts +0 -1
- package/dist/client/components/fields/boolean-field.d.mts +0 -30
- package/dist/client/components/fields/boolean-field.d.mts.map +0 -1
- package/dist/client/components/fields/boolean-field.mjs.map +0 -1
- package/dist/client/components/fields/custom-field.d.mts +0 -3
- package/dist/client/components/fields/date-field.d.mts +0 -22
- package/dist/client/components/fields/date-field.d.mts.map +0 -1
- package/dist/client/components/fields/date-field.mjs.map +0 -1
- package/dist/client/components/fields/datetime-field.d.mts +0 -23
- package/dist/client/components/fields/datetime-field.d.mts.map +0 -1
- package/dist/client/components/fields/datetime-field.mjs.map +0 -1
- package/dist/client/components/fields/email-field.d.mts +0 -19
- package/dist/client/components/fields/email-field.d.mts.map +0 -1
- package/dist/client/components/fields/email-field.mjs.map +0 -1
- package/dist/client/components/fields/embedded-collection.d.mts +0 -3
- package/dist/client/components/fields/field-types.d.mts +0 -571
- package/dist/client/components/fields/field-types.d.mts.map +0 -1
- package/dist/client/components/fields/field-utils.d.mts +0 -1
- package/dist/client/components/fields/field-utils.mjs.map +0 -1
- package/dist/client/components/fields/field-wrapper.d.mts +0 -3
- package/dist/client/components/fields/field-wrapper.mjs.map +0 -1
- package/dist/client/components/fields/index.d.mts +0 -33
- package/dist/client/components/fields/json-field.d.mts +0 -84
- package/dist/client/components/fields/json-field.d.mts.map +0 -1
- package/dist/client/components/fields/json-field.mjs.map +0 -1
- package/dist/client/components/fields/locale-badge.d.mts +0 -1
- package/dist/client/components/fields/locale-badge.mjs.map +0 -1
- package/dist/client/components/fields/number-field.d.mts +0 -23
- package/dist/client/components/fields/number-field.d.mts.map +0 -1
- package/dist/client/components/fields/number-field.mjs.map +0 -1
- package/dist/client/components/fields/object-array-field.d.mts +0 -2
- package/dist/client/components/fields/object-array-field.mjs.map +0 -1
- package/dist/client/components/fields/object-field.d.mts +0 -32
- package/dist/client/components/fields/object-field.d.mts.map +0 -1
- package/dist/client/components/fields/object-field.mjs.map +0 -1
- package/dist/client/components/fields/relation/displays/cards-display.d.mts +0 -2
- package/dist/client/components/fields/relation/displays/cards-display.mjs.map +0 -1
- package/dist/client/components/fields/relation/displays/chips-display.d.mts +0 -2
- package/dist/client/components/fields/relation/displays/chips-display.mjs.map +0 -1
- package/dist/client/components/fields/relation/displays/grid-display.d.mts +0 -2
- package/dist/client/components/fields/relation/displays/grid-display.mjs.map +0 -1
- package/dist/client/components/fields/relation/displays/index.d.mts +0 -6
- package/dist/client/components/fields/relation/displays/list-display.d.mts +0 -2
- package/dist/client/components/fields/relation/displays/list-display.mjs.map +0 -1
- package/dist/client/components/fields/relation/displays/table-display.d.mts +0 -2
- package/dist/client/components/fields/relation/displays/table-display.mjs.map +0 -1
- package/dist/client/components/fields/relation/displays/types.d.mts +0 -22
- package/dist/client/components/fields/relation/displays/types.d.mts.map +0 -1
- package/dist/client/components/fields/relation/displays/types.mjs.map +0 -1
- package/dist/client/components/fields/relation/index.d.mts +0 -3
- package/dist/client/components/fields/relation/relation-items-display.d.mts +0 -5
- package/dist/client/components/fields/relation/relation-items-display.mjs.map +0 -1
- package/dist/client/components/fields/relation-field.d.mts +0 -134
- package/dist/client/components/fields/relation-field.d.mts.map +0 -1
- package/dist/client/components/fields/relation-field.mjs.map +0 -1
- package/dist/client/components/fields/relation-picker.d.mts +0 -4
- package/dist/client/components/fields/relation-picker.mjs.map +0 -1
- package/dist/client/components/fields/relation-select.d.mts +0 -3
- package/dist/client/components/fields/relation-select.mjs.map +0 -1
- package/dist/client/components/fields/reverse-relation-field.d.mts +0 -2
- package/dist/client/components/fields/rich-text-editor/bubble-menu.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/extensions.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/image-popover.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/index.d.mts +0 -4
- package/dist/client/components/fields/rich-text-editor/index.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/link-popover.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/presets.d.mts +0 -11
- package/dist/client/components/fields/rich-text-editor/presets.d.mts.map +0 -1
- package/dist/client/components/fields/rich-text-editor/presets.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/slash-commands.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/table-controls.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/toolbar.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/types.d.mts +0 -78
- package/dist/client/components/fields/rich-text-editor/types.d.mts.map +0 -1
- package/dist/client/components/fields/rich-text-editor/types.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/utils.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/variants.d.mts +0 -2
- package/dist/client/components/fields/rich-text-field.d.mts +0 -14
- package/dist/client/components/fields/rich-text-field.d.mts.map +0 -1
- package/dist/client/components/fields/rich-text-field.mjs.map +0 -1
- package/dist/client/components/fields/select-field.d.mts +0 -25
- package/dist/client/components/fields/select-field.d.mts.map +0 -1
- package/dist/client/components/fields/select-field.mjs.map +0 -1
- package/dist/client/components/fields/status-field.d.mts +0 -2
- package/dist/client/components/fields/text-field.d.mts +0 -22
- package/dist/client/components/fields/text-field.d.mts.map +0 -1
- package/dist/client/components/fields/text-field.mjs.map +0 -1
- package/dist/client/components/fields/textarea-field.d.mts +0 -22
- package/dist/client/components/fields/textarea-field.d.mts.map +0 -1
- package/dist/client/components/fields/textarea-field.mjs.map +0 -1
- package/dist/client/components/fields/time-field.d.mts +0 -20
- package/dist/client/components/fields/time-field.d.mts.map +0 -1
- package/dist/client/components/fields/time-field.mjs.map +0 -1
- package/dist/client/components/fields/upload-field.d.mts +0 -97
- package/dist/client/components/fields/upload-field.d.mts.map +0 -1
- package/dist/client/components/fields/upload-field.mjs.map +0 -1
- package/dist/client/components/filter-builder/columns-tab.d.mts +0 -1
- package/dist/client/components/filter-builder/columns-tab.mjs.map +0 -1
- package/dist/client/components/filter-builder/filter-builder-sheet.d.mts +0 -1
- package/dist/client/components/filter-builder/filter-builder-sheet.mjs.map +0 -1
- package/dist/client/components/filter-builder/filters-tab.d.mts +0 -1
- package/dist/client/components/filter-builder/filters-tab.mjs.map +0 -1
- package/dist/client/components/filter-builder/index.d.mts +0 -5
- package/dist/client/components/filter-builder/saved-views-tab.d.mts +0 -1
- package/dist/client/components/filter-builder/saved-views-tab.mjs.map +0 -1
- package/dist/client/components/index.d.mts +0 -80
- package/dist/client/components/locale-switcher.d.mts +0 -2
- package/dist/client/components/locale-switcher.mjs.map +0 -1
- package/dist/client/components/media/media-grid.mjs.map +0 -1
- package/dist/client/components/media/media-picker-dialog.mjs.map +0 -1
- package/dist/client/components/preview/live-preview-mode.mjs.map +0 -1
- package/dist/client/components/preview/preview-pane.mjs.map +0 -1
- package/dist/client/components/primitives/asset-preview.mjs.map +0 -1
- package/dist/client/components/primitives/checkbox-input.mjs.map +0 -1
- package/dist/client/components/primitives/date-input.mjs.map +0 -1
- package/dist/client/components/primitives/dropzone.mjs.map +0 -1
- package/dist/client/components/primitives/number-input.mjs.map +0 -1
- package/dist/client/components/primitives/select-multi.mjs.map +0 -1
- package/dist/client/components/primitives/select-single.mjs.map +0 -1
- package/dist/client/components/primitives/text-input.mjs.map +0 -1
- package/dist/client/components/primitives/textarea-input.mjs.map +0 -1
- package/dist/client/components/primitives/time-input.mjs.map +0 -1
- package/dist/client/components/primitives/toggle-input.mjs.map +0 -1
- package/dist/client/components/primitives/types.d.mts +0 -14
- package/dist/client/components/primitives/types.d.mts.map +0 -1
- package/dist/client/components/primitives/types.mjs.map +0 -1
- package/dist/client/components/sheets/index.d.mts +0 -1
- package/dist/client/components/sheets/resource-sheet.d.mts +0 -1
- package/dist/client/components/sheets/resource-sheet.mjs.map +0 -1
- package/dist/client/components/ui/accordion.d.mts +0 -2
- package/dist/client/components/ui/accordion.mjs.map +0 -1
- package/dist/client/components/ui/alert.mjs.map +0 -1
- package/dist/client/components/ui/avatar.d.mts +0 -3
- package/dist/client/components/ui/badge.d.mts +0 -3
- package/dist/client/components/ui/badge.mjs.map +0 -1
- package/dist/client/components/ui/button.d.mts +0 -3
- package/dist/client/components/ui/button.mjs.map +0 -1
- package/dist/client/components/ui/card.d.mts +0 -2
- package/dist/client/components/ui/card.mjs.map +0 -1
- package/dist/client/components/ui/checkbox.d.mts +0 -2
- package/dist/client/components/ui/checkbox.mjs.map +0 -1
- package/dist/client/components/ui/combobox.d.mts +0 -3
- package/dist/client/components/ui/command.mjs.map +0 -1
- package/dist/client/components/ui/dialog.d.mts +0 -3
- package/dist/client/components/ui/dialog.mjs.map +0 -1
- package/dist/client/components/ui/drawer.mjs.map +0 -1
- package/dist/client/components/ui/dropdown-menu.d.mts +0 -3
- package/dist/client/components/ui/dropdown-menu.mjs.map +0 -1
- package/dist/client/components/ui/empty-state.mjs.map +0 -1
- package/dist/client/components/ui/field.d.mts +0 -3
- package/dist/client/components/ui/field.mjs.map +0 -1
- package/dist/client/components/ui/input-group.d.mts +0 -4
- package/dist/client/components/ui/input-group.mjs.map +0 -1
- package/dist/client/components/ui/input.d.mts +0 -2
- package/dist/client/components/ui/input.mjs.map +0 -1
- package/dist/client/components/ui/kbd.mjs.map +0 -1
- package/dist/client/components/ui/label.d.mts +0 -2
- package/dist/client/components/ui/label.mjs.map +0 -1
- package/dist/client/components/ui/popover.d.mts +0 -3
- package/dist/client/components/ui/popover.mjs.map +0 -1
- package/dist/client/components/ui/responsive-dialog.mjs.map +0 -1
- package/dist/client/components/ui/scroll-area.d.mts +0 -2
- package/dist/client/components/ui/search-input.mjs.map +0 -1
- package/dist/client/components/ui/select.d.mts +0 -3
- package/dist/client/components/ui/select.mjs.map +0 -1
- package/dist/client/components/ui/separator.d.mts +0 -2
- package/dist/client/components/ui/separator.mjs.map +0 -1
- package/dist/client/components/ui/sheet.d.mts +0 -3
- package/dist/client/components/ui/sheet.mjs.map +0 -1
- package/dist/client/components/ui/sidebar.d.mts +0 -8
- package/dist/client/components/ui/sidebar.mjs.map +0 -1
- package/dist/client/components/ui/skeleton.d.mts +0 -1
- package/dist/client/components/ui/skeleton.mjs.map +0 -1
- package/dist/client/components/ui/sonner.d.mts.map +0 -1
- package/dist/client/components/ui/sonner.mjs.map +0 -1
- package/dist/client/components/ui/spinner.d.mts +0 -1
- package/dist/client/components/ui/spinner.mjs.map +0 -1
- package/dist/client/components/ui/switch.d.mts +0 -2
- package/dist/client/components/ui/switch.mjs.map +0 -1
- package/dist/client/components/ui/table.d.mts +0 -2
- package/dist/client/components/ui/table.mjs.map +0 -1
- package/dist/client/components/ui/tabs.d.mts +0 -3
- package/dist/client/components/ui/tabs.mjs.map +0 -1
- package/dist/client/components/ui/textarea.d.mts +0 -2
- package/dist/client/components/ui/textarea.mjs.map +0 -1
- package/dist/client/components/ui/toolbar.mjs.map +0 -1
- package/dist/client/components/ui/tooltip.d.mts +0 -2
- package/dist/client/components/ui/tooltip.mjs.map +0 -1
- package/dist/client/components/widgets/chart-widget.d.mts +0 -57
- package/dist/client/components/widgets/chart-widget.d.mts.map +0 -1
- package/dist/client/components/widgets/chart-widget.mjs.map +0 -1
- package/dist/client/components/widgets/progress-widget.d.mts +0 -41
- package/dist/client/components/widgets/progress-widget.d.mts.map +0 -1
- package/dist/client/components/widgets/progress-widget.mjs.map +0 -1
- package/dist/client/components/widgets/quick-actions-widget.d.mts +0 -29
- package/dist/client/components/widgets/quick-actions-widget.d.mts.map +0 -1
- package/dist/client/components/widgets/quick-actions-widget.mjs.map +0 -1
- package/dist/client/components/widgets/recent-items-widget.d.mts +0 -51
- package/dist/client/components/widgets/recent-items-widget.d.mts.map +0 -1
- package/dist/client/components/widgets/recent-items-widget.mjs.map +0 -1
- package/dist/client/components/widgets/stats-widget.d.mts +0 -55
- package/dist/client/components/widgets/stats-widget.d.mts.map +0 -1
- package/dist/client/components/widgets/stats-widget.mjs.map +0 -1
- package/dist/client/components/widgets/table-widget.d.mts +0 -31
- package/dist/client/components/widgets/table-widget.d.mts.map +0 -1
- package/dist/client/components/widgets/table-widget.mjs.map +0 -1
- package/dist/client/components/widgets/timeline-widget.d.mts +0 -51
- package/dist/client/components/widgets/timeline-widget.d.mts.map +0 -1
- package/dist/client/components/widgets/timeline-widget.mjs.map +0 -1
- package/dist/client/components/widgets/value-widget.d.mts +0 -39
- package/dist/client/components/widgets/value-widget.d.mts.map +0 -1
- package/dist/client/components/widgets/value-widget.mjs.map +0 -1
- package/dist/client/components/widgets/widget-skeletons.mjs.map +0 -1
- package/dist/client/context/focus-context.d.mts.map +0 -1
- package/dist/client/context/focus-context.mjs.map +0 -1
- package/dist/client/contexts/breadcrumb-context.mjs.map +0 -1
- package/dist/client/hooks/typed-hooks.d.mts.map +0 -1
- package/dist/client/hooks/typed-hooks.mjs.map +0 -1
- package/dist/client/hooks/use-action.mjs.map +0 -1
- package/dist/client/hooks/use-admin-config.mjs.map +0 -1
- package/dist/client/hooks/use-admin-preferences.mjs.map +0 -1
- package/dist/client/hooks/use-admin-routes.mjs.map +0 -1
- package/dist/client/hooks/use-auth.d.mts.map +0 -1
- package/dist/client/hooks/use-auth.mjs.map +0 -1
- package/dist/client/hooks/use-collection-fields.mjs.map +0 -1
- package/dist/client/hooks/use-collection-meta.mjs.map +0 -1
- package/dist/client/hooks/use-collection-schema.mjs.map +0 -1
- package/dist/client/hooks/use-collection-validation.mjs.map +0 -1
- package/dist/client/hooks/use-collection.d.mts.map +0 -1
- package/dist/client/hooks/use-collection.mjs.map +0 -1
- package/dist/client/hooks/use-current-user.d.mts.map +0 -1
- package/dist/client/hooks/use-current-user.mjs.map +0 -1
- package/dist/client/hooks/use-field-hooks.mjs.map +0 -1
- package/dist/client/hooks/use-field-options.d.mts.map +0 -1
- package/dist/client/hooks/use-field-options.mjs.map +0 -1
- package/dist/client/hooks/use-global-fields.mjs.map +0 -1
- package/dist/client/hooks/use-global-meta.mjs.map +0 -1
- package/dist/client/hooks/use-global-schema.mjs.map +0 -1
- package/dist/client/hooks/use-global.d.mts.map +0 -1
- package/dist/client/hooks/use-global.mjs.map +0 -1
- package/dist/client/hooks/use-locks.mjs.map +0 -1
- package/dist/client/hooks/use-media-query.d.mts.map +0 -1
- package/dist/client/hooks/use-media-query.mjs.map +0 -1
- package/dist/client/hooks/use-prefill-params.mjs.map +0 -1
- package/dist/client/hooks/use-questpie-query-options.mjs.map +0 -1
- package/dist/client/hooks/use-reactive-fields.d.mts.map +0 -1
- package/dist/client/hooks/use-reactive-fields.mjs.map +0 -1
- package/dist/client/hooks/use-realtime-highlight.mjs.map +0 -1
- package/dist/client/hooks/use-saved-views.mjs.map +0 -1
- package/dist/client/hooks/use-search.mjs.map +0 -1
- package/dist/client/hooks/use-server-validation.mjs.map +0 -1
- package/dist/client/hooks/use-server-widget-data.d.mts.map +0 -1
- package/dist/client/hooks/use-server-widget-data.mjs.map +0 -1
- package/dist/client/hooks/use-setup-status.d.mts.map +0 -1
- package/dist/client/hooks/use-setup-status.mjs.map +0 -1
- package/dist/client/hooks/use-upload-collection.mjs.map +0 -1
- package/dist/client/hooks/use-upload.d.mts +0 -23
- package/dist/client/hooks/use-upload.d.mts.map +0 -1
- package/dist/client/hooks/use-upload.mjs.map +0 -1
- package/dist/client/hooks/use-validation-error-map.mjs.map +0 -1
- package/dist/client/hooks/use-view-state.mjs.map +0 -1
- package/dist/client/i18n/hooks.mjs.map +0 -1
- package/dist/client/i18n/intl-cache.mjs.map +0 -1
- package/dist/client/i18n/messages.mjs.map +0 -1
- package/dist/client/i18n/simple.d.mts.map +0 -1
- package/dist/client/i18n/simple.mjs.map +0 -1
- package/dist/client/i18n/types.d.mts.map +0 -1
- package/dist/client/lib/utils.d.mts +0 -1
- package/dist/client/lib/utils.mjs.map +0 -1
- package/dist/client/preview/block-scope-context.d.mts.map +0 -1
- package/dist/client/preview/block-scope-context.mjs.map +0 -1
- package/dist/client/preview/preview-banner.d.mts.map +0 -1
- package/dist/client/preview/preview-banner.mjs.map +0 -1
- package/dist/client/preview/preview-field.d.mts.map +0 -1
- package/dist/client/preview/preview-field.mjs.map +0 -1
- package/dist/client/preview/types.d.mts.map +0 -1
- package/dist/client/preview/types.mjs.map +0 -1
- package/dist/client/preview/use-collection-preview.d.mts.map +0 -1
- package/dist/client/preview/use-collection-preview.mjs.map +0 -1
- package/dist/client/runtime/content-locales-provider.mjs.map +0 -1
- package/dist/client/runtime/locale-scope.mjs.map +0 -1
- package/dist/client/runtime/provider.d.mts.map +0 -1
- package/dist/client/runtime/provider.mjs.map +0 -1
- package/dist/client/runtime/routes.d.mts.map +0 -1
- package/dist/client/runtime/routes.mjs.map +0 -1
- package/dist/client/runtime/translations-provider.d.mts +0 -2
- package/dist/client/runtime/translations-provider.mjs.map +0 -1
- package/dist/client/scope/picker.d.mts.map +0 -1
- package/dist/client/scope/picker.mjs.map +0 -1
- package/dist/client/scope/provider.d.mts.map +0 -1
- package/dist/client/scope/provider.mjs.map +0 -1
- package/dist/client/scope/types.d.mts.map +0 -1
- package/dist/client/utils/auto-expand-fields.mjs.map +0 -1
- package/dist/client/utils/build-field-definitions-from-schema.mjs.map +0 -1
- package/dist/client/utils/detect-relations.mjs.map +0 -1
- package/dist/client/utils/locale-to-flag.d.mts.map +0 -1
- package/dist/client/utils/locale-to-flag.mjs.map +0 -1
- package/dist/client/utils/routes.mjs.map +0 -1
- package/dist/client/views/auth/accept-invite-form.d.mts.map +0 -1
- package/dist/client/views/auth/accept-invite-form.mjs.map +0 -1
- package/dist/client/views/auth/auth-layout.d.mts.map +0 -1
- package/dist/client/views/auth/auth-layout.mjs.map +0 -1
- package/dist/client/views/auth/forgot-password-form.d.mts.map +0 -1
- package/dist/client/views/auth/forgot-password-form.mjs.map +0 -1
- package/dist/client/views/auth/index.d.mts +0 -7
- package/dist/client/views/auth/invite-form.d.mts +0 -1
- package/dist/client/views/auth/invite-form.mjs.map +0 -1
- package/dist/client/views/auth/login-form.d.mts.map +0 -1
- package/dist/client/views/auth/login-form.mjs.map +0 -1
- package/dist/client/views/auth/reset-password-form.d.mts.map +0 -1
- package/dist/client/views/auth/reset-password-form.mjs.map +0 -1
- package/dist/client/views/auth/setup-form.d.mts.map +0 -1
- package/dist/client/views/auth/setup-form.mjs.map +0 -1
- package/dist/client/views/collection/auto-form-fields.d.mts +0 -4
- package/dist/client/views/collection/auto-form-fields.mjs.map +0 -1
- package/dist/client/views/collection/bulk-action-toolbar.mjs.map +0 -1
- package/dist/client/views/collection/cells/complex-cells.d.mts +0 -46
- package/dist/client/views/collection/cells/complex-cells.d.mts.map +0 -1
- package/dist/client/views/collection/cells/complex-cells.mjs.map +0 -1
- package/dist/client/views/collection/cells/index.d.mts +0 -7
- package/dist/client/views/collection/cells/primitive-cells.d.mts +0 -76
- package/dist/client/views/collection/cells/primitive-cells.d.mts.map +0 -1
- package/dist/client/views/collection/cells/primitive-cells.mjs.map +0 -1
- package/dist/client/views/collection/cells/relation-cells.d.mts +0 -21
- package/dist/client/views/collection/cells/relation-cells.d.mts.map +0 -1
- package/dist/client/views/collection/cells/relation-cells.mjs.map +0 -1
- package/dist/client/views/collection/cells/shared/asset-thumbnail.d.mts +0 -1
- package/dist/client/views/collection/cells/shared/asset-thumbnail.mjs.map +0 -1
- package/dist/client/views/collection/cells/shared/cell-helpers.d.mts +0 -2
- package/dist/client/views/collection/cells/shared/cell-helpers.mjs.map +0 -1
- package/dist/client/views/collection/cells/shared/relation-chip.d.mts +0 -1
- package/dist/client/views/collection/cells/shared/relation-chip.mjs.map +0 -1
- package/dist/client/views/collection/cells/upload-cells.d.mts +0 -25
- package/dist/client/views/collection/cells/upload-cells.d.mts.map +0 -1
- package/dist/client/views/collection/cells/upload-cells.mjs.map +0 -1
- package/dist/client/views/collection/columns/build-columns.d.mts +0 -2
- package/dist/client/views/collection/columns/build-columns.mjs.map +0 -1
- package/dist/client/views/collection/columns/column-defaults.d.mts +0 -2
- package/dist/client/views/collection/columns/column-defaults.mjs.map +0 -1
- package/dist/client/views/collection/columns/index.d.mts +0 -3
- package/dist/client/views/collection/columns/types.d.mts +0 -2
- package/dist/client/views/collection/field-context.mjs.map +0 -1
- package/dist/client/views/collection/field-renderer.mjs.map +0 -1
- package/dist/client/views/collection/form-view.d.mts +0 -112
- package/dist/client/views/collection/form-view.d.mts.map +0 -1
- package/dist/client/views/collection/form-view.mjs.map +0 -1
- package/dist/client/views/collection/index.d.mts +0 -9
- package/dist/client/views/collection/table-view.d.mts +0 -102
- package/dist/client/views/collection/table-view.d.mts.map +0 -1
- package/dist/client/views/collection/table-view.mjs.map +0 -1
- package/dist/client/views/collection/view-skeletons.mjs.map +0 -1
- package/dist/client/views/common/global-search.d.mts +0 -1
- package/dist/client/views/common/global-search.mjs.map +0 -1
- package/dist/client/views/common/index.d.mts +0 -1
- package/dist/client/views/dashboard/dashboard-grid.mjs.map +0 -1
- package/dist/client/views/dashboard/dashboard-widget.mjs.map +0 -1
- package/dist/client/views/dashboard/widget-card.mjs.map +0 -1
- package/dist/client/views/globals/global-form-view.d.mts +0 -74
- package/dist/client/views/globals/global-form-view.d.mts.map +0 -1
- package/dist/client/views/globals/global-form-view.mjs.map +0 -1
- package/dist/client/views/index.d.mts +0 -28
- package/dist/client/views/layout/admin-layout-provider.d.mts.map +0 -1
- package/dist/client/views/layout/admin-layout-provider.mjs.map +0 -1
- package/dist/client/views/layout/admin-layout.d.mts.map +0 -1
- package/dist/client/views/layout/admin-layout.mjs.map +0 -1
- package/dist/client/views/layout/admin-root.d.mts +0 -7
- package/dist/client/views/layout/admin-router.d.mts.map +0 -1
- package/dist/client/views/layout/admin-router.mjs.map +0 -1
- package/dist/client/views/layout/admin-sidebar.d.mts.map +0 -1
- package/dist/client/views/layout/admin-sidebar.mjs.map +0 -1
- package/dist/client/views/layout/admin-topbar.mjs.map +0 -1
- package/dist/client/views/layout/index.d.mts +0 -5
- package/dist/client/views/pages/accept-invite-page.d.mts.map +0 -1
- package/dist/client/views/pages/accept-invite-page.mjs.map +0 -1
- package/dist/client/views/pages/dashboard-page.d.mts.map +0 -1
- package/dist/client/views/pages/dashboard-page.mjs.map +0 -1
- package/dist/client/views/pages/forgot-password-page.d.mts.map +0 -1
- package/dist/client/views/pages/forgot-password-page.mjs.map +0 -1
- package/dist/client/views/pages/index.d.mts +0 -7
- package/dist/client/views/pages/invite-page.d.mts.map +0 -1
- package/dist/client/views/pages/invite-page.mjs.map +0 -1
- package/dist/client/views/pages/login-page.d.mts.map +0 -1
- package/dist/client/views/pages/login-page.mjs.map +0 -1
- package/dist/client/views/pages/reset-password-page.d.mts.map +0 -1
- package/dist/client/views/pages/reset-password-page.mjs.map +0 -1
- package/dist/client/views/pages/setup-page.d.mts.map +0 -1
- package/dist/client/views/pages/setup-page.mjs.map +0 -1
- package/dist/client.d.mts.map +0 -1
- package/dist/components/rich-text/rich-text-renderer.d.mts.map +0 -1
- package/dist/components/rich-text/rich-text-renderer.mjs.map +0 -1
- package/dist/server/adapters/nextjs.d.mts.map +0 -1
- package/dist/server/adapters/nextjs.mjs.map +0 -1
- package/dist/server/adapters/tanstack.d.mts.map +0 -1
- package/dist/server/adapters/tanstack.mjs.map +0 -1
- package/dist/server/augmentation.d.mts.map +0 -1
- package/dist/server/auth-helpers.d.mts.map +0 -1
- package/dist/server/auth-helpers.mjs.map +0 -1
- package/dist/server/block/block-builder.d.mts.map +0 -1
- package/dist/server/block/block-builder.mjs.map +0 -1
- package/dist/server/block/introspection.d.mts.map +0 -1
- package/dist/server/block/introspection.mjs.map +0 -1
- package/dist/server/block/prefetch.d.mts.map +0 -1
- package/dist/server/block/prefetch.mjs.map +0 -1
- package/dist/server/fields/blocks.d.mts.map +0 -1
- package/dist/server/fields/blocks.mjs.map +0 -1
- package/dist/server/fields/index.d.mts.map +0 -1
- package/dist/server/fields/index.mjs.map +0 -1
- package/dist/server/fields/rich-text.d.mts.map +0 -1
- package/dist/server/fields/rich-text.mjs.map +0 -1
- package/dist/server/i18n/index.d.mts +0 -16
- package/dist/server/i18n/index.d.mts.map +0 -1
- package/dist/server/i18n/index.mjs.map +0 -1
- package/dist/server/i18n/messages/cs.mjs.map +0 -1
- package/dist/server/i18n/messages/de.mjs.map +0 -1
- package/dist/server/i18n/messages/en.mjs.map +0 -1
- package/dist/server/i18n/messages/es.mjs.map +0 -1
- package/dist/server/i18n/messages/fr.mjs.map +0 -1
- package/dist/server/i18n/messages/index.mjs.map +0 -1
- package/dist/server/i18n/messages/pl.mjs.map +0 -1
- package/dist/server/i18n/messages/pt.mjs.map +0 -1
- package/dist/server/i18n/messages/sk.mjs.map +0 -1
- package/dist/server/index.d.mts +0 -20
- package/dist/server/modules/admin/functions/admin-config.mjs +0 -348
- package/dist/server/modules/admin/functions/admin-config.mjs.map +0 -1
- package/dist/server/modules/admin/functions/execute-action.d.mts.map +0 -1
- package/dist/server/modules/admin/functions/execute-action.mjs.map +0 -1
- package/dist/server/modules/admin/functions/locales.mjs +0 -80
- package/dist/server/modules/admin/functions/locales.mjs.map +0 -1
- package/dist/server/modules/admin/functions/preview.d.mts.map +0 -1
- package/dist/server/modules/admin/functions/preview.mjs.map +0 -1
- package/dist/server/modules/admin/functions/reactive.d.mts.map +0 -1
- package/dist/server/modules/admin/functions/reactive.mjs.map +0 -1
- package/dist/server/modules/admin/functions/setup.d.mts.map +0 -1
- package/dist/server/modules/admin/functions/setup.mjs +0 -131
- package/dist/server/modules/admin/functions/setup.mjs.map +0 -1
- package/dist/server/modules/admin/functions/translations.mjs +0 -125
- package/dist/server/modules/admin/functions/translations.mjs.map +0 -1
- package/dist/server/modules/admin/functions/widget-data.d.mts +0 -33
- package/dist/server/modules/admin/functions/widget-data.d.mts.map +0 -1
- package/dist/server/modules/admin/functions/widget-data.mjs +0 -70
- package/dist/server/modules/admin/functions/widget-data.mjs.map +0 -1
- package/dist/server/modules/admin/index.d.mts.map +0 -1
- package/dist/server/modules/admin/index.mjs.map +0 -1
- package/dist/server/modules/admin-preferences/collections/admin-preferences.collection.d.mts +0 -3
- package/dist/server/modules/admin-preferences/collections/admin-preferences.collection.mjs.map +0 -1
- package/dist/server/modules/admin-preferences/collections/locks.collection.d.mts +0 -3
- package/dist/server/modules/admin-preferences/collections/locks.collection.mjs.map +0 -1
- package/dist/server/modules/admin-preferences/collections/saved-views.collection.d.mts +0 -1490
- package/dist/server/modules/admin-preferences/collections/saved-views.collection.d.mts.map +0 -1
- package/dist/server/modules/admin-preferences/collections/saved-views.collection.mjs +0 -57
- package/dist/server/modules/admin-preferences/collections/saved-views.collection.mjs.map +0 -1
- package/dist/server/patch.d.mts +0 -100
- package/dist/server/patch.d.mts.map +0 -1
- package/dist/server/patch.mjs +0 -1062
- package/dist/server/patch.mjs.map +0 -1
- package/dist/shared/preview-utils.d.mts.map +0 -1
- package/dist/shared/preview-utils.mjs.map +0 -1
- package/dist/shared/types/saved-views.types.d.mts.map +0 -1
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { Admin } from "../../builder/admin.mjs";
|
|
2
|
-
import "./admin-sidebar.mjs";
|
|
3
|
-
import { AdminProvider } from "../../runtime/provider.mjs";
|
|
4
|
-
import { QueryClient } from "@tanstack/react-query";
|
|
5
|
-
import { QuestpieClient } from "questpie/client";
|
|
6
|
-
import "react";
|
|
7
|
-
import { Questpie } from "questpie";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"admin-router.d.mts","names":[],"sources":["../../../../src/client/views/layout/admin-router.tsx"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;AAqGgB,KA7DJ,sBAAA,GAAyB,MA6DrB,CAAA,MAAA,EAAA,GAAA,CAAA;;;;;AAgBI,KAvER,kBAAA,GAAqB,MAuEb,CAAA,MAAA,EAAA,GAAA,CAAA;AAUwB,UA/E3B,gBAAA,CA+EiC;EAKtC;;;AA2iBZ;;;;;;;;;;;;;;iBA1mBgB;;;;;gBAMD,eAAe;;;;;YAMnB,eAAe;;;;UAKjB,eAAe;;;;uBAKF,OAAA,CAAM;;;;oBAKT;;;;iBAKH;;;;yBAKQ;WAGd,OAAA,CAAM;WACN,OAAA,CAAM;;;;;qBAOI;WAGV,OAAA,CAAM;;;;;6CAO4B,OAAA,CAAM;;;;aAKtC;;;;sBAKS,OAAA,CAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAsiBX,WAAA,QAAmB,mBAAmB,OAAA,CAAM"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"admin-router.mjs","names":["React","result: Record<string, any>"],"sources":["../../../../src/client/views/layout/admin-router.tsx"],"sourcesContent":["/**\n * AdminRouter Component\n *\n * Handles routing for the admin UI based on URL segments.\n * Uses the view registry to resolve list/edit views dynamically.\n *\n * URL Patterns:\n * - /admin -> Dashboard\n * - /admin/collections/:name -> Collection list\n * - /admin/collections/:name/create -> Collection create\n * - /admin/collections/:name/:id -> Collection edit\n * - /admin/globals/:name -> Global edit\n * - /admin/:customPage -> Custom pages\n */\n\nimport { Icon } from \"@iconify/react\";\nimport * as React from \"react\";\nimport type {\n\tComponentRegistry,\n\tDashboardConfig,\n\tDefaultViewsConfig,\n\tMaybeLazyComponent,\n\tPageDefinition,\n} from \"../../builder\";\nimport { Card, Skeleton } from \"../../components/index.js\";\nimport { useSuspenseAdminConfig } from \"../../hooks/use-admin-config\";\nimport { useCollectionSchema } from \"../../hooks/use-collection-schema\";\nimport { useGlobalSchema } from \"../../hooks/use-global-schema\";\nimport { parsePrefillParams } from \"../../hooks/use-prefill-params\";\nimport { useAdminStore } from \"../../runtime/provider\";\nimport { DashboardGrid } from \"../dashboard/dashboard-grid\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Collection config as used by AdminRouter.\n * Compatible with CollectionBuilderState from admin.getCollections().\n */\nexport type CollectionRouterConfig = Record<string, any>;\n\n/**\n * Global config as used by AdminRouter.\n * Compatible with GlobalBuilderState from admin.getGlobals().\n */\nexport type GlobalRouterConfig = Record<string, any>;\n\nexport interface AdminRouterProps {\n\t/**\n\t * Current route segments (parsed from URL after /admin)\n\t * Example: [\"collections\", \"posts\", \"123\"] for /admin/collections/posts/123\n\t */\n\tsegments: string[];\n\n\t/**\n\t * Navigate function (router-specific)\n\t */\n\tnavigate: (path: string) => void;\n\n\t/**\n\t * Base path for admin routes (default: \"/admin\")\n\t */\n\tbasePath?: string;\n\n\t/**\n\t * Current URL search params (for prefill support)\n\t * If not provided, reads from window.location.search\n\t */\n\tsearchParams?: URLSearchParams;\n\n\t/**\n\t * Collection configurations.\n\t * Accepts CollectionBuilderState objects from admin.getCollections()\n\t */\n\tcollections?: Record<string, CollectionRouterConfig>;\n\n\t/**\n\t * Global configurations.\n\t * Accepts GlobalBuilderState objects from admin.getGlobals()\n\t */\n\tglobals?: Record<string, GlobalRouterConfig>;\n\n\t/**\n\t * Custom pages\n\t */\n\tpages?: Record<string, PageDefinition<string>>;\n\n\t/**\n\t * Dashboard component (legacy - use dashboardConfig instead)\n\t */\n\tDashboardComponent?: React.ComponentType;\n\n\t/**\n\t * Dashboard configuration (widgets, title, etc.)\n\t */\n\tdashboardConfig?: DashboardConfig;\n\n\t/**\n\t * Default views configuration\n\t */\n\tdefaultViews?: DefaultViewsConfig;\n\n\t/**\n\t * Custom collection components (override default views)\n\t */\n\tcollectionComponents?: Record<\n\t\tstring,\n\t\t{\n\t\t\tList?: React.ComponentType;\n\t\t\tForm?: React.ComponentType;\n\t\t}\n\t>;\n\n\t/**\n\t * Custom global components\n\t */\n\tglobalComponents?: Record<\n\t\tstring,\n\t\t{\n\t\t\tForm?: React.ComponentType;\n\t\t}\n\t>;\n\n\t/**\n\t * Render custom form fields for collection\n\t */\n\trenderFormFields?: (collection: string) => React.ReactNode;\n\n\t/**\n\t * Component registry\n\t */\n\tregistry?: ComponentRegistry;\n\n\t/**\n\t * Not found component\n\t */\n\tNotFoundComponent?: React.ComponentType;\n}\n\n// ============================================================================\n// Internal Hook - Resolve config from store (Suspense-based)\n// ============================================================================\n\ninterface RouterConfig {\n\tcollections: Record<string, CollectionRouterConfig>;\n\tglobals: Record<string, GlobalRouterConfig>;\n\tpages: Record<string, PageDefinition<string>>;\n\tlistViews: Record<string, any>;\n\teditViews: Record<string, any>;\n\tdashboardConfig?: DashboardConfig;\n\tDashboardComponent?: React.ComponentType;\n\tdefaultViews?: DefaultViewsConfig;\n}\n\n/**\n * Hook that resolves router configuration using Suspense.\n * Suspends until server config is loaded - no loading checks needed.\n */\nfunction useRouterConfig(props: {\n\tcollections?: Record<string, CollectionRouterConfig>;\n\tglobals?: Record<string, GlobalRouterConfig>;\n\tpages?: Record<string, PageDefinition<string>>;\n\tdashboardConfig?: DashboardConfig;\n\tDashboardComponent?: React.ComponentType;\n\tdefaultViews?: DefaultViewsConfig;\n}): RouterConfig {\n\t// Subscribe to admin from store reactively\n\tconst admin = useAdminStore((s) => s.admin);\n\n\t// Fetch server-side admin config (suspends until ready)\n\tconst { data: serverConfig } = useSuspenseAdminConfig();\n\n\tconst storePages = admin.getPages();\n\tconst storeListViews = admin.getListViews() as Record<string, any>;\n\tconst storeEditViews = admin.getEditViews() as Record<string, any>;\n\tconst storeDefaultViews = admin.getDefaultViews();\n\n\t// Build collection/global configs from server config keys\n\t// Hidden collections are included - they can be accessed via ResourceSheet\n\t// but won't appear in navigation (handled by sidebar)\n\tconst serverCollections = React.useMemo<Record<string, any>>(() => {\n\t\tif (props.collections) return props.collections;\n\t\tconst result: Record<string, any> = {};\n\t\tif (serverConfig?.collections) {\n\t\t\tfor (const [name, meta] of Object.entries(serverConfig.collections)) {\n\t\t\t\tresult[name] = meta ?? {};\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}, [props.collections, serverConfig?.collections]);\n\n\tconst serverGlobals = React.useMemo<Record<string, any>>(() => {\n\t\tif (props.globals) return props.globals;\n\t\tconst result: Record<string, any> = {};\n\t\tif (serverConfig?.globals) {\n\t\t\tfor (const [name, meta] of Object.entries(serverConfig.globals)) {\n\t\t\t\tresult[name] = meta ?? {};\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}, [props.globals, serverConfig?.globals]);\n\n\t// Server dashboard takes priority\n\tconst mergedDashboard = React.useMemo<DashboardConfig | undefined>(() => {\n\t\tconst serverDashboard = serverConfig?.dashboard;\n\t\tif (serverDashboard?.items?.length) {\n\t\t\treturn serverDashboard as DashboardConfig;\n\t\t}\n\t\treturn props.dashboardConfig;\n\t}, [props.dashboardConfig, serverConfig?.dashboard]);\n\n\treturn {\n\t\tcollections: serverCollections,\n\t\tglobals: serverGlobals,\n\t\tpages: props.pages ?? storePages,\n\t\tlistViews: storeListViews,\n\t\teditViews: storeEditViews,\n\t\tdashboardConfig: mergedDashboard,\n\t\tDashboardComponent: props.DashboardComponent,\n\t\tdefaultViews: props.defaultViews ?? storeDefaultViews,\n\t};\n}\n\n// ============================================================================\n// Route Matching\n// ============================================================================\n\ntype RouteMatch =\n\t| { type: \"dashboard\" }\n\t| { type: \"collection-list\"; name: string }\n\t| { type: \"collection-create\"; name: string }\n\t| { type: \"collection-edit\"; name: string; id: string }\n\t| { type: \"global-edit\"; name: string }\n\t| { type: \"page\"; name: string; config: PageDefinition<string> }\n\t| { type: \"not-found\" };\n\nfunction matchRoute(\n\tsegments: string[],\n\t_collections: Record<string, unknown> = {},\n\tglobals: Record<string, unknown> = {},\n\tpages: Record<string, PageDefinition<string>> = {},\n): RouteMatch {\n\tif (segments.length === 0) {\n\t\treturn { type: \"dashboard\" };\n\t}\n\n\tconst [first, second, third] = segments;\n\n\t// Collections: /collections/:name/...\n\tif (first === \"collections\" && second) {\n\t\tif (!third) {\n\t\t\treturn { type: \"collection-list\", name: second };\n\t\t}\n\t\tif (third === \"create\") {\n\t\t\treturn { type: \"collection-create\", name: second };\n\t\t}\n\t\treturn { type: \"collection-edit\", name: second, id: third };\n\t}\n\n\t// Globals: /globals/:name\n\tif (first === \"globals\" && second && globals[second]) {\n\t\treturn { type: \"global-edit\", name: second };\n\t}\n\n\t// Custom pages\n\tfor (const [name, config] of Object.entries(pages)) {\n\t\tif (!config?.path) continue;\n\t\tconst pagePath = config.path.replace(/^\\//, \"\");\n\t\tif (first === pagePath || segments.join(\"/\") === pagePath) {\n\t\t\treturn { type: \"page\", name, config };\n\t\t}\n\t}\n\n\treturn { type: \"not-found\" };\n}\n\nconst DEFAULT_LIST_VIEW_ID = \"table\";\nconst DEFAULT_EDIT_VIEW_ID = \"form\";\n\nfunction getConfiguredViewName(config: unknown): string | undefined {\n\tif (!config || typeof config !== \"object\") return undefined;\n\tconst maybeConfig = config as Record<string, any>;\n\tif (typeof maybeConfig.view === \"string\") return maybeConfig.view;\n\tif (typeof maybeConfig.name === \"string\") return maybeConfig.name;\n\tif (typeof maybeConfig.state?.name === \"string\")\n\t\treturn maybeConfig.state.name;\n\treturn undefined;\n}\n\nfunction getViewLoader(definition: unknown): MaybeLazyComponent | undefined {\n\tif (!definition || typeof definition !== \"object\") return undefined;\n\tconst maybeDefinition = definition as Record<string, any>;\n\treturn (\n\t\t(maybeDefinition.component as MaybeLazyComponent | undefined) ??\n\t\t(maybeDefinition.state?.component as MaybeLazyComponent | undefined)\n\t);\n}\n\nfunction getViewBaseConfig(\n\tdefinition: unknown,\n): Record<string, unknown> | undefined {\n\tif (!definition || typeof definition !== \"object\") return undefined;\n\tconst maybeDefinition = definition as Record<string, any>;\n\tconst config =\n\t\t(maybeDefinition[\"~config\"] as Record<string, unknown> | undefined) ??\n\t\t(maybeDefinition.state?.[\"~config\"] as Record<string, unknown> | undefined);\n\n\tif (!config || typeof config !== \"object\") return undefined;\n\treturn config;\n}\n\nfunction mergeViewConfig(\n\tbase: unknown,\n\toverride: unknown,\n): Record<string, unknown> | undefined {\n\tconst baseConfig =\n\t\tbase && typeof base === \"object\"\n\t\t\t? (base as Record<string, unknown>)\n\t\t\t: undefined;\n\tconst overrideConfig =\n\t\toverride && typeof override === \"object\"\n\t\t\t? (override as Record<string, unknown>)\n\t\t\t: undefined;\n\n\tif (!baseConfig && !overrideConfig) return undefined;\n\n\treturn {\n\t\t...(baseConfig ?? {}),\n\t\t...(overrideConfig ?? {}),\n\t};\n}\n\nfunction isDynamicImportLoader(\n\tloader: MaybeLazyComponent | undefined,\n): loader is () => Promise<{ default: React.ComponentType<any> }> {\n\tif (typeof loader !== \"function\") return false;\n\n\tconst candidate = loader as any;\n\tif (candidate.prototype?.isReactComponent || candidate.prototype?.render) {\n\t\treturn false;\n\t}\n\n\tif (candidate.$$typeof) {\n\t\treturn false;\n\t}\n\n\treturn loader.length === 0;\n}\n\nfunction ViewLoadingState() {\n\treturn (\n\t\t<div className=\"flex h-64 items-center justify-center text-muted-foreground\">\n\t\t\t<Icon icon=\"ph:spinner-gap\" className=\"size-6 animate-spin\" />\n\t\t</div>\n\t);\n}\n\nfunction UnknownViewState({\n\tviewKind,\n\tviewId,\n}: {\n\tviewKind: \"list\" | \"edit\";\n\tviewId: string;\n}) {\n\treturn (\n\t\t<div className=\"container \">\n\t\t\t<Card className=\"border-warning/30 bg-warning/5 p-6\">\n\t\t\t\t<h1 className=\"text-lg font-semibold\">Unknown {viewKind} view</h1>\n\t\t\t\t<p className=\"mt-2 text-sm text-muted-foreground\">\n\t\t\t\t\tView \"{viewId}\" is not registered in the admin view registry.\n\t\t\t\t</p>\n\t\t\t</Card>\n\t\t</div>\n\t);\n}\n\n/**\n * Skeleton shown while router config is loading (Suspense fallback)\n */\nfunction RouterSkeleton() {\n\treturn (\n\t\t<div className=\"container space-y-4 py-6\">\n\t\t\t<Skeleton className=\"h-8 w-48\" />\n\t\t\t<Skeleton className=\"h-10 w-full\" />\n\t\t\t<div className=\"space-y-2\">\n\t\t\t\t<Skeleton className=\"h-12 w-full\" />\n\t\t\t\t<Skeleton className=\"h-12 w-full\" />\n\t\t\t\t<Skeleton className=\"h-12 w-full\" />\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nfunction RegistryViewRenderer({\n\tloader,\n\tcomponentProps,\n\tviewKind,\n\tviewId,\n}: {\n\tloader?: MaybeLazyComponent;\n\tcomponentProps: Record<string, unknown>;\n\tviewKind: \"list\" | \"edit\";\n\tviewId: string;\n}) {\n\tconst [state, setState] = React.useState<{\n\t\tComponent: React.ComponentType<any> | React.LazyExoticComponent<any> | null;\n\t\tloading: boolean;\n\t\terror: Error | null;\n\t}>({\n\t\tComponent: null,\n\t\tloading: true,\n\t\terror: null,\n\t});\n\n\tReact.useEffect(() => {\n\t\tif (!loader) {\n\t\t\tsetState({ Component: null, loading: false, error: null });\n\t\t\treturn;\n\t\t}\n\n\t\tif (!isDynamicImportLoader(loader)) {\n\t\t\tsetState({\n\t\t\t\tComponent: loader as React.ComponentType<any>,\n\t\t\t\tloading: false,\n\t\t\t\terror: null,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tlet mounted = true;\n\t\tsetState((prev) => ({ ...prev, loading: true, error: null }));\n\n\t\t(async () => {\n\t\t\ttry {\n\t\t\t\tconst result = await loader();\n\t\t\t\tif (!mounted) return;\n\n\t\t\t\tconst Component = (result.default ||\n\t\t\t\t\tresult) as React.ComponentType<any>;\n\t\t\t\tsetState({ Component, loading: false, error: null });\n\t\t\t} catch (error) {\n\t\t\t\tif (!mounted) return;\n\t\t\t\tsetState({\n\t\t\t\t\tComponent: null,\n\t\t\t\t\tloading: false,\n\t\t\t\t\terror:\n\t\t\t\t\t\terror instanceof Error\n\t\t\t\t\t\t\t? error\n\t\t\t\t\t\t\t: new Error(\"Failed to load view component\"),\n\t\t\t\t});\n\t\t\t}\n\t\t})();\n\n\t\treturn () => {\n\t\t\tmounted = false;\n\t\t};\n\t}, [loader]);\n\n\tif (state.loading) {\n\t\treturn <ViewLoadingState />;\n\t}\n\n\tif (state.error || !state.Component) {\n\t\treturn <UnknownViewState viewKind={viewKind} viewId={viewId} />;\n\t}\n\n\tconst Component = state.Component;\n\n\treturn (\n\t\t<React.Suspense fallback={<ViewLoadingState />}>\n\t\t\t<Component {...componentProps} />\n\t\t</React.Suspense>\n\t);\n}\n\n// ============================================================================\n// Sub-components\n// ============================================================================\n\nfunction DefaultDashboard({\n\tconfig,\n}: {\n\tconfig?: DefaultViewsConfig[\"dashboard\"];\n}) {\n\tconst date = new Date().toLocaleDateString(\"en-US\", {\n\t\tweekday: \"long\",\n\t\tyear: \"numeric\",\n\t\tmonth: \"long\",\n\t\tday: \"numeric\",\n\t});\n\n\treturn (\n\t\t<div className=\"container \">\n\t\t\t<div className=\"mb-8 flex items-end justify-between\">\n\t\t\t\t<div>\n\t\t\t\t\t<h1 className=\"text-3xl font-bold tracking-tight\">\n\t\t\t\t\t\t{config?.header?.title || \"Dashboard\"}\n\t\t\t\t\t</h1>\n\t\t\t\t\t{config?.header?.showDate !== false && (\n\t\t\t\t\t\t<p className=\"text-muted-foreground mt-1 font-mono text-xs uppercase tracking-widest\">\n\t\t\t\t\t\t\t{date}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div className=\"grid grid-cols-1 gap-6 md:grid-cols-2 lg:grid-cols-3\">\n\t\t\t\t<Card className=\"relative overflow-hidden p-6\">\n\t\t\t\t\t<div className=\"absolute -right-12 -top-12 h-32 w-32 rounded-full bg-primary/10 blur-3xl\" />\n\t\t\t\t\t<div className=\"relative\">\n\t\t\t\t\t\t<div className=\"mb-4 flex items-center gap-3\">\n\t\t\t\t\t\t\t<div className=\"h-2 w-2 rounded-full bg-primary glow-primary-sm\" />\n\t\t\t\t\t\t\t<h3 className=\"font-mono text-xs font-bold uppercase tracking-widest text-primary\">\n\t\t\t\t\t\t\t\tSystem Status\n\t\t\t\t\t\t\t</h3>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<h2 className=\"mb-2 text-xl font-bold\">\n\t\t\t\t\t\t\t{config?.welcomeCard?.title || \"Welcome back\"}\n\t\t\t\t\t\t</h2>\n\t\t\t\t\t\t<p className=\"text-sm leading-relaxed text-muted-foreground\">\n\t\t\t\t\t\t\t{config?.welcomeCard?.description ||\n\t\t\t\t\t\t\t\t\"Select a collection from the sidebar to manage your content.\"}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\t\t\t\t</Card>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nfunction DefaultNotFound() {\n\treturn (\n\t\t<div className=\"container \">\n\t\t\t<h1 className=\"mb-4 text-2xl font-bold\">Page Not Found</h1>\n\t\t\t<p className=\"text-muted-foreground\">\n\t\t\t\tThe page you're looking for doesn't exist.\n\t\t\t</p>\n\t\t</div>\n\t);\n}\n\nfunction RestrictedAccess({\n\ttype,\n\tname,\n\tnavigate,\n\tbasePath,\n}: {\n\ttype: \"collection\" | \"global\";\n\tname: string;\n\tnavigate: (path: string) => void;\n\tbasePath: string;\n}) {\n\treturn (\n\t\t<div className=\"container py-12\">\n\t\t\t<Card className=\"relative mx-auto max-w-lg overflow-hidden p-8 text-center\">\n\t\t\t\t<div className=\"absolute -right-16 -top-16 h-40 w-40 rounded-full bg-muted/50 blur-3xl\" />\n\t\t\t\t<div className=\"absolute -left-16 -bottom-16 h-40 w-40 rounded-full bg-muted/30 blur-3xl\" />\n\t\t\t\t<div className=\"relative\">\n\t\t\t\t\t<div className=\"mx-auto mb-6 flex h-16 w-16 items-center justify-center rounded-full bg-muted\">\n\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\ticon=\"ph:lock-simple\"\n\t\t\t\t\t\t\tclassName=\"h-8 w-8 text-muted-foreground\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t\t<h1 className=\"mb-2 text-xl font-semibold\">Access Restricted</h1>\n\t\t\t\t\t<p className=\"mb-6 text-sm text-muted-foreground\">\n\t\t\t\t\t\tThe {type}{\" \"}\n\t\t\t\t\t\t<span className=\"font-mono text-foreground\">\"{name}\"</span> is not\n\t\t\t\t\t\tavailable in the admin panel. It may be hidden or you don't have\n\t\t\t\t\t\tpermission to access it.\n\t\t\t\t\t</p>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={() => navigate(basePath)}\n\t\t\t\t\t\tclassName=\"inline-flex items-center gap-2 rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon icon=\"ph:arrow-left\" className=\"h-4 w-4\" />\n\t\t\t\t\t\tBack to Dashboard\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</Card>\n\t\t</div>\n\t);\n}\n\nfunction LazyPageRenderer({ config }: { config: PageDefinition<string> }) {\n\tconst [Component, setComponent] = React.useState<React.ComponentType | null>(\n\t\tnull,\n\t);\n\tconst [loading, setLoading] = React.useState(true);\n\tconst [error, setError] = React.useState<Error | null>(null);\n\n\tReact.useEffect(() => {\n\t\tlet mounted = true;\n\n\t\tasync function load() {\n\t\t\ttry {\n\t\t\t\tif (typeof config.component === \"function\") {\n\t\t\t\t\tconst result = (config.component as () => any)();\n\t\t\t\t\tif (result?.then) {\n\t\t\t\t\t\tconst mod = await result;\n\t\t\t\t\t\tif (mounted) {\n\t\t\t\t\t\t\tsetComponent(() => mod.default || mod);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (mounted) {\n\t\t\t\t\t\t\tsetComponent(() => config.component as React.ComponentType);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (config.component) {\n\t\t\t\t\tif (mounted) {\n\t\t\t\t\t\tsetComponent(() => config.component as React.ComponentType);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tif (mounted) {\n\t\t\t\t\tsetError(err instanceof Error ? err : new Error(\"Failed to load\"));\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tif (mounted) {\n\t\t\t\t\tsetLoading(false);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tload();\n\t\treturn () => {\n\t\t\tmounted = false;\n\t\t};\n\t}, [config.component]);\n\n\tif (loading) {\n\t\treturn (\n\t\t\t<div className=\"flex h-64 items-center justify-center text-muted-foreground\">\n\t\t\t\t<Icon icon=\"ph:spinner-gap\" className=\"size-6 animate-spin\" />\n\t\t\t</div>\n\t\t);\n\t}\n\n\tif (error) {\n\t\treturn (\n\t\t\t<div className=\"container \">\n\t\t\t\t<h1 className=\"mb-4 text-2xl font-bold text-destructive\">Error</h1>\n\t\t\t\t<p className=\"text-muted-foreground\">{error.message}</p>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn Component ? <Component /> : <DefaultNotFound />;\n}\n\n// ============================================================================\n// Main Component\n// ============================================================================\n\n/**\n * AdminRouter Component\n *\n * Routes to the appropriate view based on URL segments.\n * Uses the view registry to resolve list/edit views dynamically.\n *\n * When used inside AdminProvider, collections/globals/pages are automatically\n * read from context if not provided as props.\n *\n * @example\n * ```tsx\n * // With AdminProvider (automatic)\n * <AdminProvider admin={admin} client={client}>\n * <AdminRouter segments={segments} navigate={navigate} />\n * </AdminProvider>\n *\n * // Without AdminProvider (manual)\n * <AdminRouter\n * segments={segments}\n * navigate={navigate}\n * collections={collections}\n * globals={globals}\n * />\n * ```\n */\n/**\n * AdminRouter Component\n *\n * Routes to the appropriate view based on URL segments.\n * Uses Suspense internally - shows skeleton while config loads.\n */\nexport function AdminRouter(props: AdminRouterProps): React.ReactElement {\n\treturn (\n\t\t<React.Suspense fallback={<RouterSkeleton />}>\n\t\t\t<AdminRouterInner {...props} />\n\t\t</React.Suspense>\n\t);\n}\n\n/**\n * Inner router component that uses Suspense for data loading.\n * Guaranteed to have config loaded when rendering.\n */\nfunction AdminRouterInner({\n\tsegments,\n\tnavigate,\n\tbasePath = \"/admin\",\n\tsearchParams: searchParamsProp,\n\tcollections: collectionsProp,\n\tglobals: globalsProp,\n\tpages: pagesProp,\n\tDashboardComponent: DashboardComponentProp,\n\tdashboardConfig: dashboardConfigProp,\n\tdefaultViews: defaultViewsProp,\n\tcollectionComponents = {},\n\tglobalComponents = {},\n\trenderFormFields,\n\tregistry,\n\tNotFoundComponent,\n}: AdminRouterProps): React.ReactElement {\n\t// Get search params (from prop or window.location)\n\tconst searchParams = React.useMemo(() => {\n\t\tif (searchParamsProp) return searchParamsProp;\n\t\tif (typeof window !== \"undefined\") {\n\t\t\treturn new URLSearchParams(window.location.search);\n\t\t}\n\t\treturn new URLSearchParams();\n\t}, [searchParamsProp]);\n\n\t// Parse prefill params from URL\n\tconst prefillValues = React.useMemo(\n\t\t() => parsePrefillParams(searchParams),\n\t\t[searchParams],\n\t);\n\n\t// Resolve config using suspense - guaranteed to have data\n\tconst {\n\t\tcollections,\n\t\tglobals,\n\t\tpages,\n\t\tlistViews,\n\t\teditViews,\n\t\tdashboardConfig,\n\t\tDashboardComponent,\n\t\tdefaultViews,\n\t} = useRouterConfig({\n\t\tcollections: collectionsProp,\n\t\tglobals: globalsProp,\n\t\tpages: pagesProp,\n\t\tdashboardConfig: dashboardConfigProp,\n\t\tDashboardComponent: DashboardComponentProp,\n\t\tdefaultViews: defaultViewsProp,\n\t});\n\n\tconst route = matchRoute(segments, collections, globals, pages);\n\n\tconst activeCollectionName =\n\t\troute.type === \"collection-list\" ||\n\t\troute.type === \"collection-create\" ||\n\t\troute.type === \"collection-edit\"\n\t\t\t? route.name\n\t\t\t: \"\";\n\n\tconst activeGlobalName = route.type === \"global-edit\" ? route.name : \"\";\n\n\tconst { data: activeCollectionSchema } = useCollectionSchema(\n\t\tactiveCollectionName as any,\n\t\t{\n\t\t\tenabled: !!activeCollectionName,\n\t\t},\n\t);\n\n\tconst { data: activeGlobalSchema } = useGlobalSchema(\n\t\tactiveGlobalName as any,\n\t\t{\n\t\t\tenabled: !!activeGlobalName,\n\t\t},\n\t);\n\n\t// Dashboard\n\tif (route.type === \"dashboard\") {\n\t\t// Priority 1: defaultViews.dashboard.component\n\t\tif (defaultViews?.dashboard?.component) {\n\t\t\tconst Component = defaultViews.dashboard.component;\n\t\t\treturn <Component />;\n\t\t}\n\n\t\t// Priority 2: Legacy DashboardComponent prop\n\t\tif (DashboardComponent) {\n\t\t\treturn <DashboardComponent />;\n\t\t}\n\n\t\t// Priority 3: DashboardGrid (if items or widgets exist)\n\t\tif (dashboardConfig?.items?.length || dashboardConfig?.widgets?.length) {\n\t\t\treturn (\n\t\t\t\t<DashboardGrid\n\t\t\t\t\tconfig={dashboardConfig}\n\t\t\t\t\tbasePath={basePath}\n\t\t\t\t\tnavigate={navigate}\n\t\t\t\t/>\n\t\t\t);\n\t\t}\n\n\t\t// Priority 4: Default Dashboard\n\t\treturn <DefaultDashboard config={defaultViews?.dashboard} />;\n\t}\n\n\t// Collection List\n\tif (route.type === \"collection-list\") {\n\t\tconst { name } = route;\n\t\tconst config = collections[name];\n\n\t\t// Collection not found - show restricted access\n\t\tif (!config) {\n\t\t\treturn (\n\t\t\t\t<RestrictedAccess\n\t\t\t\t\ttype=\"collection\"\n\t\t\t\t\tname={name}\n\t\t\t\t\tnavigate={navigate}\n\t\t\t\t\tbasePath={basePath}\n\t\t\t\t/>\n\t\t\t);\n\t\t}\n\n\t\tconst custom = collectionComponents[name];\n\t\tconst viewNameFromSchema = (activeCollectionSchema as any)?.admin?.list\n\t\t\t?.view;\n\t\tconst viewNameFromConfig = getConfiguredViewName((config as any)?.list);\n\t\tconst selectedListView =\n\t\t\tviewNameFromSchema ?? viewNameFromConfig ?? DEFAULT_LIST_VIEW_ID;\n\t\tconst selectedListViewDefinition = listViews[selectedListView];\n\t\tconst selectedListViewConfig = mergeViewConfig(\n\t\t\tgetViewBaseConfig(selectedListViewDefinition),\n\t\t\t(config as any)?.list?.[\"~config\"] ??\n\t\t\t\t(config as any)?.list ??\n\t\t\t\t(activeCollectionSchema as any)?.admin?.list,\n\t\t);\n\n\t\tconst listViewLoader =\n\t\t\tgetViewLoader(selectedListViewDefinition) ??\n\t\t\tdefaultViews?.collectionList?.component;\n\n\t\t// Priority 1: Custom component override\n\t\tif (custom?.List) {\n\t\t\treturn <custom.List />;\n\t\t}\n\n\t\t// Priority 2: Registry-resolved list view\n\t\treturn (\n\t\t\t<RegistryViewRenderer\n\t\t\t\tkey={name}\n\t\t\t\tloader={listViewLoader}\n\t\t\t\tviewKind=\"list\"\n\t\t\t\tviewId={selectedListView}\n\t\t\t\tcomponentProps={{\n\t\t\t\t\tcollection: name,\n\t\t\t\t\tconfig,\n\t\t\t\t\tviewConfig: selectedListViewConfig,\n\t\t\t\t\tnavigate,\n\t\t\t\t\tbasePath,\n\t\t\t\t\tshowSearch: defaultViews?.collectionList?.showSearch,\n\t\t\t\t\tshowFilters: defaultViews?.collectionList?.showFilters,\n\t\t\t\t\tshowToolbar: defaultViews?.collectionList?.showToolbar,\n\t\t\t\t\trealtime: defaultViews?.collectionList?.realtime,\n\t\t\t\t}}\n\t\t\t/>\n\t\t);\n\t}\n\n\t// Collection Create/Edit\n\tif (route.type === \"collection-create\" || route.type === \"collection-edit\") {\n\t\tconst { name } = route;\n\t\tconst id = route.type === \"collection-edit\" ? route.id : undefined;\n\t\tconst config = collections[name];\n\n\t\t// Collection not found - show restricted access\n\t\tif (!config) {\n\t\t\treturn (\n\t\t\t\t<RestrictedAccess\n\t\t\t\t\ttype=\"collection\"\n\t\t\t\t\tname={name}\n\t\t\t\t\tnavigate={navigate}\n\t\t\t\t\tbasePath={basePath}\n\t\t\t\t/>\n\t\t\t);\n\t\t}\n\n\t\tconst custom = collectionComponents[name];\n\t\tconst formDefaults = defaultViews?.collectionForm;\n\t\tconst viewNameFromSchema = (activeCollectionSchema as any)?.admin?.form\n\t\t\t?.view;\n\t\tconst viewNameFromConfig = getConfiguredViewName((config as any)?.form);\n\t\tconst selectedEditView =\n\t\t\tviewNameFromSchema ?? viewNameFromConfig ?? DEFAULT_EDIT_VIEW_ID;\n\t\tconst selectedEditViewDefinition = editViews[selectedEditView];\n\t\tconst selectedEditViewConfig = mergeViewConfig(\n\t\t\tgetViewBaseConfig(selectedEditViewDefinition),\n\t\t\t(config as any)?.form?.[\"~config\"] ??\n\t\t\t\t(config as any)?.form ??\n\t\t\t\t(activeCollectionSchema as any)?.admin?.form,\n\t\t);\n\n\t\tconst editViewLoader =\n\t\t\tgetViewLoader(selectedEditViewDefinition) ?? formDefaults?.component;\n\n\t\t// Priority 1: Custom component override\n\t\tif (custom?.Form) {\n\t\t\treturn <custom.Form />;\n\t\t}\n\n\t\t// Only apply prefill values when creating (not editing)\n\t\tconst defaultValues =\n\t\t\troute.type === \"collection-create\" &&\n\t\t\tObject.keys(prefillValues).length > 0\n\t\t\t\t? prefillValues\n\t\t\t\t: undefined;\n\n\t\t// Priority 2: Registry-resolved edit view\n\t\treturn (\n\t\t\t<RegistryViewRenderer\n\t\t\t\tkey={`${name}-${id ?? \"create\"}`}\n\t\t\t\tloader={editViewLoader}\n\t\t\t\tviewKind=\"edit\"\n\t\t\t\tviewId={selectedEditView}\n\t\t\t\tcomponentProps={{\n\t\t\t\t\tcollection: name,\n\t\t\t\t\tid,\n\t\t\t\t\tconfig,\n\t\t\t\t\tviewConfig: selectedEditViewConfig,\n\t\t\t\t\tnavigate,\n\t\t\t\t\tbasePath,\n\t\t\t\t\tdefaultValues,\n\t\t\t\t\tregistry,\n\t\t\t\t\tallCollectionsConfig: collections,\n\t\t\t\t\tshowMeta: formDefaults?.showMeta,\n\t\t\t\t}}\n\t\t\t/>\n\t\t);\n\t}\n\n\t// Global Edit\n\tif (route.type === \"global-edit\") {\n\t\tconst { name } = route;\n\t\tconst config = globals[name];\n\n\t\t// Global not found (may be hidden or inaccessible)\n\t\tif (!config) {\n\t\t\treturn (\n\t\t\t\t<RestrictedAccess\n\t\t\t\t\ttype=\"global\"\n\t\t\t\t\tname={name}\n\t\t\t\t\tnavigate={navigate}\n\t\t\t\t\tbasePath={basePath}\n\t\t\t\t/>\n\t\t\t);\n\t\t}\n\n\t\tconst custom = globalComponents[name];\n\t\tconst viewNameFromSchema = (activeGlobalSchema as any)?.admin?.form?.view;\n\t\tconst viewNameFromConfig = getConfiguredViewName((config as any)?.form);\n\t\t// For globals, only use editViews registry if a custom view is explicitly specified\n\t\t// Otherwise, use the dedicated globalForm default view\n\t\tconst hasCustomViewSpecified = !!(viewNameFromSchema ?? viewNameFromConfig);\n\t\tconst selectedEditView =\n\t\t\tviewNameFromSchema ?? viewNameFromConfig ?? DEFAULT_EDIT_VIEW_ID;\n\t\tconst selectedEditViewDefinition = hasCustomViewSpecified\n\t\t\t? editViews[selectedEditView]\n\t\t\t: undefined;\n\t\tconst selectedEditViewConfig = mergeViewConfig(\n\t\t\tgetViewBaseConfig(selectedEditViewDefinition),\n\t\t\t(config as any)?.form?.[\"~config\"] ??\n\t\t\t\t(config as any)?.form ??\n\t\t\t\t(activeGlobalSchema as any)?.admin?.form,\n\t\t);\n\n\t\t// For globals: prefer defaultViews.globalForm.component (GlobalFormView)\n\t\t// Only use editViews registry if a custom view was explicitly specified\n\t\tconst globalViewLoader =\n\t\t\t(hasCustomViewSpecified\n\t\t\t\t? getViewLoader(selectedEditViewDefinition)\n\t\t\t\t: undefined) ?? defaultViews?.globalForm?.component;\n\n\t\tif (custom?.Form) {\n\t\t\treturn <custom.Form />;\n\t\t}\n\n\t\treturn (\n\t\t\t<RegistryViewRenderer\n\t\t\t\tkey={name}\n\t\t\t\tloader={globalViewLoader}\n\t\t\t\tviewKind=\"edit\"\n\t\t\t\tviewId={selectedEditView}\n\t\t\t\tcomponentProps={{\n\t\t\t\t\tglobal: name,\n\t\t\t\t\tconfig,\n\t\t\t\t\tviewConfig: selectedEditViewConfig,\n\t\t\t\t\tnavigate,\n\t\t\t\t\tbasePath,\n\t\t\t\t\tregistry,\n\t\t\t\t\tallGlobalsConfig: globals,\n\t\t\t\t}}\n\t\t\t/>\n\t\t);\n\t}\n\n\t// Custom Page\n\tif (route.type === \"page\") {\n\t\treturn <LazyPageRenderer config={route.config} />;\n\t}\n\n\t// Not Found\n\tconst NotFound = NotFoundComponent || DefaultNotFound;\n\treturn <NotFound />;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"admin-sidebar.d.mts","names":[],"sources":["../../../../src/client/views/layout/admin-sidebar.tsx"],"sourcesContent":[],"mappings":";;;;;;;;AA6HO,UA3DU,kBAAA,CA2DJ;EAKH,EAAA,EAAA,MAAM;EAaF,SAAM,CAAA,EAAA,MAAA;EAiBJ,QAAM,EA3FX,OAAA,CAAM,SA2FK;EAAS,WAAA,CAAA,EAAA;;;;;;;;;;UAnFd,iBAAA;;;;;eAKH;;;;iBAKE,OAAA,CAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;QA6B7B,OAAA,CAAM;;;;;UAML;;;QAGD,OAAA,CAAM;;;;WAKH,OAAA,CAAM;;;;;;;;;;;;eAaF,OAAA,CAAM;;;;;;;;;;;;;;;;iBAiBJ,OAAA,CAAM"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"admin-sidebar.mjs","names":["React"],"sources":["../../../../src/client/views/layout/admin-sidebar.tsx"],"sourcesContent":["/**\n * AdminSidebar Component\n *\n * Navigation sidebar for the admin UI using shadcn sidebar primitives.\n * Automatically reads from AdminProvider context when props are not provided.\n */\n\nimport { Icon } from \"@iconify/react\";\nimport * as React from \"react\";\nimport { toast } from \"sonner\";\nimport { ComponentRenderer } from \"../../components/component-renderer\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuPortal,\n\tDropdownMenuSeparator,\n\tDropdownMenuSub,\n\tDropdownMenuSubContent,\n\tDropdownMenuSubTrigger,\n\tDropdownMenuTrigger,\n} from \"../../components/ui/dropdown-menu\";\nimport {\n\tSidebar,\n\tSidebarContent,\n\tSidebarFooter,\n\tSidebarGroup,\n\tSidebarGroupContent,\n\tSidebarGroupLabel,\n\tSidebarHeader,\n\tSidebarMenu,\n\tSidebarMenuItem,\n\tSidebarSeparator,\n\tuseSidebar,\n} from \"../../components/ui/sidebar\";\nimport { Skeleton } from \"../../components/ui/skeleton\";\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipTrigger,\n} from \"../../components/ui/tooltip\";\nimport { useAdminConfig } from \"../../hooks/use-admin-config\";\nimport { useAuthClientSafe } from \"../../hooks/use-auth\";\nimport { useSessionState } from \"../../hooks/use-current-user\";\nimport { useResolveText, useTranslation } from \"../../i18n/hooks\";\nimport { cn, formatLabel } from \"../../lib/utils\";\nimport {\n\tselectAdmin,\n\tselectBasePath,\n\tselectNavigate,\n\tuseAdminStore,\n} from \"../../runtime/provider\";\nimport type {\n\tNavigationElement,\n\tNavigationGroup,\n\tNavigationItem,\n} from \"../../runtime/routes\";\nimport { getFlagUrl } from \"../../utils/locale-to-flag\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Link component props (router-agnostic)\n */\nexport interface LinkComponentProps {\n\tto: string;\n\tclassName?: string;\n\tchildren: React.ReactNode;\n\tactiveProps?: { className?: string };\n\tactiveOptions?: { exact?: boolean };\n}\n\n/**\n * AdminSidebar props\n */\nexport interface AdminSidebarProps {\n\t/**\n\t * Navigation groups to render.\n\t * If not provided, reads from AdminProvider context.\n\t */\n\tnavigation?: NavigationGroup[];\n\n\t/**\n\t * Link component (router-specific)\n\t */\n\tLinkComponent: React.ComponentType<LinkComponentProps>;\n\n\t/**\n\t * Current active route\n\t */\n\tactiveRoute?: string;\n\n\t/**\n\t * Base path for admin routes\n\t */\n\tbasePath?: string;\n\n\t/**\n\t * Brand name.\n\t * If not provided, reads from AdminProvider context.\n\t */\n\tbrandName?: string;\n\n\t/**\n\t * Custom class for sidebar container\n\t */\n\tclassName?: string;\n\n\t/**\n\t * Render custom brand content\n\t */\n\trenderBrand?: (props: {\n\t\tname: string;\n\t\tcollapsed: boolean;\n\t}) => React.ReactNode;\n\n\t/**\n\t * Render custom nav item\n\t */\n\trenderNavItem?: (params: {\n\t\titem: NavigationItem;\n\t\tisActive: boolean;\n\t\tcollapsed: boolean;\n\t}) => React.ReactNode;\n\n\t/**\n\t * Custom footer content (replaces entire footer including UserFooter)\n\t */\n\tfooter?: React.ReactNode;\n\n\t/**\n\t * Content to render after the brand header.\n\t * Perfect for scope/tenant pickers in multi-tenant apps.\n\t *\n\t * @example\n\t * ```tsx\n\t * <AdminSidebar\n\t * afterBrand={<ScopePicker collection=\"properties\" />}\n\t * />\n\t * ```\n\t */\n\tafterBrand?: React.ReactNode;\n\n\t/**\n\t * Content to render before the user footer.\n\t * Useful for additional actions or quick links.\n\t *\n\t * @example\n\t * ```tsx\n\t * <AdminSidebar\n\t * beforeFooter={\n\t * <Button variant=\"outline\" className=\"w-full\">\n\t * Need Help?\n\t * </Button>\n\t * }\n\t * />\n\t * ```\n\t */\n\tbeforeFooter?: React.ReactNode;\n\n\t/**\n\t * Use framework-specific active link props (e.g., TanStack Router's activeProps)\n\t * @default true\n\t */\n\tuseActiveProps?: boolean;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Extract typed props from untyped sidebar config items.\n * Server sidebar items come as plain objects without strict typing.\n */\nfunction getSidebarItemProps(item: unknown) {\n\tconst i = item as Record<string, any>;\n\treturn {\n\t\tcollection: i.collection as string | undefined,\n\t\tglobal: i.global as string | undefined,\n\t\tpageId: i.pageId as string | undefined,\n\t\tlabel: i.label as string | undefined,\n\t\ticon: i.icon as NavigationItem[\"icon\"] | undefined,\n\t\thref: i.href as string | undefined,\n\t};\n}\n\n// ============================================================================\n// Internal Hook - Build navigation from server config\n// ============================================================================\n\n/**\n * Build NavigationGroup[] from server sidebar config, using server\n * collection/global metadata for labels/icons and local navigation\n * only for page items (which are client-only).\n */\nfunction useServerNavigation(): NavigationGroup[] | undefined {\n\tconst { data: serverConfig } = useAdminConfig();\n\tconst storeNavigation = useAdminStore((s) => s.navigation);\n\tconst basePath = useAdminStore(selectBasePath);\n\n\treturn React.useMemo(() => {\n\t\tconst sections = serverConfig?.sidebar?.sections;\n\t\tif (!sections?.length) return undefined;\n\n\t\t// Build a lookup map from local navigation for page items only\n\t\tconst pageMap = new Map<string, NavigationItem>();\n\t\tfor (const group of storeNavigation ?? []) {\n\t\t\tfor (const element of group.items ?? []) {\n\t\t\t\tif (element.type !== \"divider\" && \"id\" in element) {\n\t\t\t\t\tconst navItem = element as NavigationItem;\n\t\t\t\t\tif (navItem.type === \"page\") {\n\t\t\t\t\t\tpageMap.set(navItem.id, navItem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Convert a sidebar item to a navigation element\n\t\tfunction convertItem(item: any): NavigationElement | undefined {\n\t\t\tconst props = getSidebarItemProps(item);\n\t\t\tswitch (item.type) {\n\t\t\t\tcase \"collection\": {\n\t\t\t\t\tconst collectionName = props.collection!;\n\t\t\t\t\tconst meta = serverConfig?.collections?.[collectionName];\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: `collection:${collectionName}`,\n\t\t\t\t\t\tlabel: props.label ?? meta?.label ?? formatLabel(collectionName),\n\t\t\t\t\t\thref: `${basePath}/collections/${collectionName}`,\n\t\t\t\t\t\ticon: props.icon ?? meta?.icon,\n\t\t\t\t\t\ttype: \"collection\" as const,\n\t\t\t\t\t\torder: 0,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tcase \"global\": {\n\t\t\t\t\tconst globalName = props.global!;\n\t\t\t\t\tconst meta = serverConfig?.globals?.[globalName];\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: `global:${globalName}`,\n\t\t\t\t\t\tlabel: props.label ?? meta?.label ?? formatLabel(globalName),\n\t\t\t\t\t\thref: `${basePath}/globals/${globalName}`,\n\t\t\t\t\t\ticon: props.icon ?? meta?.icon,\n\t\t\t\t\t\ttype: \"global\" as const,\n\t\t\t\t\t\torder: 0,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tcase \"page\": {\n\t\t\t\t\tconst found = pageMap.get(`page:${props.pageId}`);\n\t\t\t\t\tif (!found) return undefined;\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...found,\n\t\t\t\t\t\tlabel: props.label ?? found.label,\n\t\t\t\t\t\ticon: props.icon ?? found.icon,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tcase \"link\":\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: `link:${props.href}`,\n\t\t\t\t\t\tlabel: props.label ?? \"\",\n\t\t\t\t\t\thref: props.href!,\n\t\t\t\t\t\ticon: props.icon,\n\t\t\t\t\t\ttype: \"link\" as const,\n\t\t\t\t\t\torder: 0,\n\t\t\t\t\t};\n\n\t\t\t\tcase \"divider\":\n\t\t\t\t\treturn { type: \"divider\" as const };\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t}\n\n\t\t// Convert a section to a navigation group (recursive for nested sections)\n\t\tfunction convertSection(section: any): NavigationGroup {\n\t\t\treturn {\n\t\t\t\tid: section.id,\n\t\t\t\tlabel: section.title,\n\t\t\t\ticon: section.icon,\n\t\t\t\tcollapsed: section.collapsed,\n\t\t\t\titems: (section.items ?? [])\n\t\t\t\t\t.map(convertItem)\n\t\t\t\t\t.filter((i: any): i is NavigationElement => i !== undefined),\n\t\t\t\tsections: section.sections?.map(convertSection),\n\t\t\t};\n\t\t}\n\n\t\treturn sections.map(convertSection);\n\t}, [serverConfig, storeNavigation, basePath]);\n}\n\n// ============================================================================\n// Internal Hook - Resolve props from store\n// ============================================================================\n\nfunction useSidebarProps(props: {\n\tnavigation?: NavigationGroup[];\n\tbrandName?: string;\n}): { navigation: NavigationGroup[]; brandName: string } {\n\t// Select individual values to avoid object identity issues\n\tconst storeNavigation = useAdminStore((s) => s.navigation);\n\tconst storeBrandName = useAdminStore((s) => s.brandName);\n\n\t// Try server-driven navigation\n\tconst serverNavigation = useServerNavigation();\n\n\t// If props provided, use them (props take priority)\n\tif (props.navigation !== undefined && props.brandName !== undefined) {\n\t\treturn {\n\t\t\tnavigation: props.navigation,\n\t\t\tbrandName: props.brandName,\n\t\t};\n\t}\n\n\treturn {\n\t\tnavigation: props.navigation ?? serverNavigation ?? storeNavigation ?? [],\n\t\tbrandName: props.brandName ?? storeBrandName ?? \"Admin\",\n\t};\n}\n\n// ============================================================================\n// Sub-components\n// ============================================================================\n\n/**\n * Render an icon - handles ComponentReference and React components.\n *\n * @example\n * ```tsx\n * // React component\n * <RenderIcon icon={UsersIcon} />\n *\n * // Server-defined reference\n * <RenderIcon icon={{ type: \"icon\", props: { name: \"ph:users\" } }} />\n * ```\n */\nfunction RenderIcon(props: {\n\ticon: NavigationItem[\"icon\"];\n\tclassName?: string;\n}) {\n\tconst { icon, className } = props;\n\n\tif (!icon) {\n\t\treturn null;\n\t}\n\n\tif (typeof icon === \"object\" && icon !== null && \"type\" in icon) {\n\t\treturn (\n\t\t\t<ComponentRenderer\n\t\t\t\treference={icon as any}\n\t\t\t\tadditionalProps={{ className: cn(\"size-4 shrink-0\", className) }}\n\t\t\t/>\n\t\t);\n\t}\n\n\tconst IconComp = icon as React.ComponentType<{ className?: string }>;\n\treturn <IconComp className={cn(\"size-4 shrink-0\", className)} />;\n}\n\nfunction QuestpieSymbol({ className }: { className?: string }) {\n\treturn (\n\t\t<svg\n\t\t\twidth=\"640\"\n\t\t\theight=\"640\"\n\t\t\tviewBox=\"0 0 640 640\"\n\t\t\tfill=\"none\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\tclassName={cn(\n\t\t\t\t\"size-8 shrink-0 text-[#02012B] dark:text-white\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<title>QUESTPIE</title>\n\t\t\t<path\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\tclipRule=\"evenodd\"\n\t\t\t\td=\"M466.377 350.987C468.486 340.983 469.595 330.611 469.595 319.98C469.595 237.377 402.624 170.406 320.001 170.406C237.378 170.406 170.406 237.377 170.406 319.98C170.406 393.857 223.976 455.23 294.402 467.372V510.268C200.465 497.754 128 417.329 128 319.98C128 213.952 213.962 128 320.001 128C426.04 128 512.002 213.952 512.002 319.98C512.002 344.198 507.517 367.37 499.332 388.708C489.817 374.897 478.748 362.239 466.377 350.987ZM320.002 469.553C381.932 469.553 435.067 431.927 457.799 378.296C468.772 389.602 478.366 402.254 486.309 415.98C453.11 473.357 391.065 511.959 320.002 511.959L320.002 469.553Z\"\n\t\t\t\tfill=\"currentColor\"\n\t\t\t/>\n\t\t\t<path\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\tclipRule=\"evenodd\"\n\t\t\t\td=\"M320.002 512H512.004V511.985C512.004 405.958 426.042 320.005 320.003 320.005C320.003 320.005 320.002 320.005 320.002 320.005V512Z\"\n\t\t\t\tfill=\"#B700FF\"\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n\n/**\n * Check if element is a navigation item (not divider)\n */\nfunction isNavigationItem(\n\telement: NavigationElement,\n): element is NavigationItem {\n\treturn element.type !== \"divider\";\n}\n\nfunction normalizeRoute(route?: string) {\n\treturn route?.replace(/\\/+$/, \"\");\n}\n\nfunction isRouteActive(\n\tactiveRoute: string | undefined,\n\titemHref: string,\n\tbasePath: string,\n\texact = false,\n) {\n\tif (!activeRoute) {\n\t\treturn false;\n\t}\n\n\tconst normalizedActive = normalizeRoute(activeRoute);\n\tconst normalizedItem = normalizeRoute(itemHref);\n\tconst normalizedBase = normalizeRoute(basePath);\n\n\tif (!normalizedActive || !normalizedItem) {\n\t\treturn false;\n\t}\n\n\t// Exact match\n\tif (normalizedActive === normalizedItem) {\n\t\treturn true;\n\t}\n\n\t// For exact mode or base path (dashboard), don't match prefixes\n\tif (exact || normalizedItem === normalizedBase) {\n\t\treturn false;\n\t}\n\n\t// Prefix match for non-exact items\n\treturn normalizedActive.startsWith(`${normalizedItem}/`);\n}\n\n/**\n * Menu button styles - QUESTPIE design: clean, technical look\n */\nconst menuButtonStyles = cn(\n\t\"flex w-full items-center gap-2.5 px-3 py-2 text-sm font-medium transition-colors duration-150\",\n\t\"text-sidebar-foreground hover:text-sidebar-foreground hover:bg-sidebar-accent\",\n\t\"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-sidebar-ring\",\n\t\"group-data-[collapsible=icon]:justify-center group-data-[collapsible=icon]:px-2 group-data-[collapsible=icon]:size-8\",\n);\n\nconst menuButtonActiveStyles = cn(\n\t\"bg-sidebar-primary/10 text-sidebar-primary border-l-2 border-sidebar-primary\",\n);\n\nfunction NavItem({\n\titem,\n\tisActive,\n\tLinkComponent,\n\trenderNavItem,\n\tuseActiveProps,\n\tclassName,\n}: {\n\titem: NavigationItem;\n\tisActive: boolean;\n\tLinkComponent: React.ComponentType<LinkComponentProps>;\n\trenderNavItem?: AdminSidebarProps[\"renderNavItem\"];\n\tuseActiveProps: boolean;\n\tclassName?: string;\n}) {\n\tconst { state, isMobile, setOpenMobile } = useSidebar();\n\tconst collapsed = state === \"collapsed\";\n\tconst resolveText = useResolveText();\n\n\t// Close sidebar on mobile when navigating\n\tconst handleClick = React.useCallback(() => {\n\t\tif (isMobile) {\n\t\t\tsetOpenMobile(false);\n\t\t}\n\t}, [isMobile, setOpenMobile]);\n\n\tif (renderNavItem) {\n\t\treturn <>{renderNavItem({ item, isActive, collapsed })}</>;\n\t}\n\n\tconst label = resolveText(item.label);\n\n\t// Dashboard and external links should use exact matching\n\t// Collections and globals should use prefix matching\n\tconst shouldUseExact =\n\t\titem.type === \"dashboard\" || item.type === \"link\" || item.type === \"page\";\n\n\tconst linkActiveProps = useActiveProps\n\t\t? {\n\t\t\t\tactiveProps: { className: menuButtonActiveStyles },\n\t\t\t\tactiveOptions: { exact: shouldUseExact },\n\t\t\t}\n\t\t: {};\n\n\tconst linkContent = (\n\t\t<LinkComponent\n\t\t\tto={item.href}\n\t\t\tclassName={cn(menuButtonStyles, isActive && menuButtonActiveStyles)}\n\t\t\t{...linkActiveProps}\n\t\t>\n\t\t\t{item.icon && <RenderIcon icon={item.icon} />}\n\t\t\t<span className=\"truncate group-data-[collapsible=icon]:hidden\">\n\t\t\t\t{label}\n\t\t\t</span>\n\t\t</LinkComponent>\n\t);\n\n\t// Show tooltip when collapsed (desktop only)\n\tif (collapsed && !isMobile) {\n\t\treturn (\n\t\t\t<SidebarMenuItem onClickCapture={handleClick}>\n\t\t\t\t<Tooltip>\n\t\t\t\t\t<TooltipTrigger\n\t\t\t\t\t\trender={\n\t\t\t\t\t\t\t<LinkComponent\n\t\t\t\t\t\t\t\tto={item.href}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\tmenuButtonStyles,\n\t\t\t\t\t\t\t\t\tisActive && menuButtonActiveStyles,\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{...linkActiveProps}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{item.icon && <RenderIcon icon={item.icon} />}\n\t\t\t\t\t\t\t\t<span className=\"truncate group-data-[collapsible=icon]:hidden\">\n\t\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</LinkComponent>\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t\t<TooltipContent side=\"right\" align=\"center\">\n\t\t\t\t\t\t{label}\n\t\t\t\t\t</TooltipContent>\n\t\t\t\t</Tooltip>\n\t\t\t</SidebarMenuItem>\n\t\t);\n\t}\n\n\treturn (\n\t\t<SidebarMenuItem className={className} onClickCapture={handleClick}>\n\t\t\t{linkContent}\n\t\t</SidebarMenuItem>\n\t);\n}\n\nfunction NavGroup({\n\tgroup,\n\tactiveRoute,\n\tLinkComponent,\n\trenderNavItem,\n\tbasePath,\n\tuseActiveProps,\n\tdepth = 0,\n}: {\n\tgroup: NavigationGroup;\n\tactiveRoute?: string;\n\tLinkComponent: React.ComponentType<LinkComponentProps>;\n\trenderNavItem?: AdminSidebarProps[\"renderNavItem\"];\n\tbasePath: string;\n\tuseActiveProps: boolean;\n\tdepth?: number;\n}) {\n\t// Track collapsed state for sections that support it\n\tconst [isCollapsed, setIsCollapsed] = React.useState(\n\t\tgroup.collapsed ?? false,\n\t);\n\tconst resolveText = useResolveText();\n\tconst groupLabel = resolveText(group.label);\n\n\tconst items = group.items ?? [];\n\tconst sections = group.sections ?? [];\n\tconst hasContent = items.length > 0 || sections.length > 0;\n\n\treturn (\n\t\t<SidebarGroup>\n\t\t\t{/* Section header with optional icon and collapse toggle */}\n\t\t\t{groupLabel && (\n\t\t\t\t<SidebarGroupLabel\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"gap-2 px-3 mt-2\",\n\t\t\t\t\t\tgroup.collapsed !== undefined &&\n\t\t\t\t\t\t\t\"cursor-pointer hover:text-sidebar-foreground\",\n\t\t\t\t\t\tdepth > 0 && \"pl-6\",\n\t\t\t\t\t)}\n\t\t\t\t\tonClick={\n\t\t\t\t\t\tgroup.collapsed !== undefined\n\t\t\t\t\t\t\t? () => setIsCollapsed(!isCollapsed)\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{group.icon && <RenderIcon icon={group.icon} className=\"size-3.5\" />}\n\t\t\t\t\t<span className=\"flex-1 font-mono text-left\">{groupLabel}</span>\n\t\t\t\t\t{group.collapsed !== undefined && (\n\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\ticon=\"ph:caret-down\"\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"size-3.5 transition-transform\",\n\t\t\t\t\t\t\t\tisCollapsed && \"-rotate-90\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</SidebarGroupLabel>\n\t\t\t)}\n\n\t\t\t{/* Section content (hidden when collapsed) */}\n\t\t\t{!isCollapsed && hasContent && (\n\t\t\t\t<SidebarGroupContent className={cn(depth > 0 && \"pl-3\")}>\n\t\t\t\t\t{/* Items */}\n\t\t\t\t\t{items.length > 0 && (\n\t\t\t\t\t\t<SidebarMenu>\n\t\t\t\t\t\t\t{items.map((element, elementIndex) => {\n\t\t\t\t\t\t\t\t// Handle dividers\n\t\t\t\t\t\t\t\tif (!isNavigationItem(element)) {\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<SidebarSeparator\n\t\t\t\t\t\t\t\t\t\t\tkey={`${group.id ?? groupLabel ?? \"group\"}-divider-${elementIndex}`}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"my-2\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Handle navigation items\n\t\t\t\t\t\t\t\t// Dashboard and links use exact matching, collections/globals use prefix\n\t\t\t\t\t\t\t\tconst shouldUseExact =\n\t\t\t\t\t\t\t\t\telement.type === \"dashboard\" ||\n\t\t\t\t\t\t\t\t\telement.type === \"link\" ||\n\t\t\t\t\t\t\t\t\telement.type === \"page\";\n\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<NavItem\n\t\t\t\t\t\t\t\t\t\tkey={element.id}\n\t\t\t\t\t\t\t\t\t\titem={element}\n\t\t\t\t\t\t\t\t\t\tisActive={isRouteActive(\n\t\t\t\t\t\t\t\t\t\t\tactiveRoute,\n\t\t\t\t\t\t\t\t\t\t\telement.href,\n\t\t\t\t\t\t\t\t\t\t\tbasePath,\n\t\t\t\t\t\t\t\t\t\t\tshouldUseExact,\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\tLinkComponent={LinkComponent}\n\t\t\t\t\t\t\t\t\t\trenderNavItem={renderNavItem}\n\t\t\t\t\t\t\t\t\t\tuseActiveProps={useActiveProps}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</SidebarMenu>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Nested sections */}\n\t\t\t\t\t{sections.map((subSection) => (\n\t\t\t\t\t\t<NavGroup\n\t\t\t\t\t\t\tkey={subSection.id}\n\t\t\t\t\t\t\tgroup={subSection}\n\t\t\t\t\t\t\tactiveRoute={activeRoute}\n\t\t\t\t\t\t\tLinkComponent={LinkComponent}\n\t\t\t\t\t\t\trenderNavItem={renderNavItem}\n\t\t\t\t\t\t\tbasePath={basePath}\n\t\t\t\t\t\t\tuseActiveProps={useActiveProps}\n\t\t\t\t\t\t\tdepth={depth + 1}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</SidebarGroupContent>\n\t\t\t)}\n\t\t</SidebarGroup>\n\t);\n}\n\n// ============================================================================\n// Main Component\n// ============================================================================\n\n/**\n * Loading skeleton for UserFooter\n */\nfunction UserFooterSkeleton({ collapsed }: { collapsed: boolean }) {\n\treturn (\n\t\t<SidebarFooter className=\"border-t border-sidebar-border/50 p-2\">\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex items-center gap-2.5 p-2\",\n\t\t\t\t\tcollapsed && \"justify-center\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<Skeleton className=\"size-8 shrink-0\" />\n\t\t\t\t{!collapsed && (\n\t\t\t\t\t<div className=\"grid flex-1 gap-1\">\n\t\t\t\t\t\t<Skeleton className=\"h-3 w-24\" />\n\t\t\t\t\t\t<Skeleton className=\"h-2 w-32\" />\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</SidebarFooter>\n\t);\n}\n\nfunction UserFooter() {\n\tconst { state, isMobile, setOpenMobile } = useSidebar();\n\tconst collapsed = state === \"collapsed\";\n\n\t// Get auth client and session state\n\tconst authClient = useAuthClientSafe();\n\tconst { user, isPending } = useSessionState();\n\tconst navigate = useAdminStore(selectNavigate);\n\tconst basePath = useAdminStore(selectBasePath);\n\tconst admin = useAdminStore(selectAdmin);\n\tconst {\n\t\tt,\n\t\tlocale: uiLocale,\n\t\tsetLocale: setUiLocale,\n\t\tgetLocaleName,\n\t} = useTranslation();\n\n\t// Get available locales from admin config\n\tconst localeConfig = admin.getLocale();\n\tconst uiLocales = localeConfig.supported ?? [\"en\"];\n\tconst hasMultipleUiLocales = uiLocales.length > 1;\n\tconst uiLocaleOptions = uiLocales.map((code) => ({\n\t\tcode,\n\t\tlabel: getLocaleName(code),\n\t}));\n\n\t// Close sidebar on mobile when navigating\n\tconst closeSidebarOnMobile = React.useCallback(() => {\n\t\tif (isMobile) {\n\t\t\tsetOpenMobile(false);\n\t\t}\n\t}, [isMobile, setOpenMobile]);\n\n\t// Handle logout\n\tconst handleLogout = React.useCallback(async () => {\n\t\tif (!authClient) return;\n\t\ttry {\n\t\t\tawait authClient.signOut();\n\t\t\tcloseSidebarOnMobile();\n\t\t\tnavigate(`${basePath}/login`);\n\t\t} catch (error) {\n\t\t\ttoast.error(t(\"auth.logoutFailed\"));\n\t\t}\n\t}, [authClient, navigate, basePath, closeSidebarOnMobile, t]);\n\n\t// Handle navigate to user profile\n\tconst handleMyAccount = React.useCallback(() => {\n\t\tif (user?.id) {\n\t\t\tcloseSidebarOnMobile();\n\t\t\tnavigate(`${basePath}/collections/user/${user.id}`);\n\t\t}\n\t}, [navigate, basePath, user?.id, closeSidebarOnMobile]);\n\n\t// Show skeleton while loading\n\tif (isPending) {\n\t\treturn <UserFooterSkeleton collapsed={collapsed} />;\n\t}\n\n\t// If no auth client or no user, don't show footer\n\tif (!authClient || !user) {\n\t\treturn null;\n\t}\n\n\t// Get display values\n\tconst displayName = user.name || user.email?.split(\"@\")[0] || \"User\";\n\tconst displayEmail = user.email || \"\";\n\n\treturn (\n\t\t<SidebarFooter className=\"border-t border-sidebar-border/50 p-2\">\n\t\t\t<SidebarMenu>\n\t\t\t\t{/* User Menu */}\n\t\t\t\t<SidebarMenuItem>\n\t\t\t\t\t<DropdownMenu>\n\t\t\t\t\t\t<DropdownMenuTrigger\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"flex w-full items-center gap-2.5 p-2 text-left transition-colors duration-150\",\n\t\t\t\t\t\t\t\t\"hover:bg-sidebar-accent text-sidebar-foreground\",\n\t\t\t\t\t\t\t\t\"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-sidebar-ring\",\n\t\t\t\t\t\t\t\tcollapsed && \"justify-center\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"flex size-8 shrink-0 items-center justify-center bg-sidebar-primary/10 text-sidebar-primary border border-sidebar-primary/20\">\n\t\t\t\t\t\t\t\t<Icon icon=\"ph:user-bold\" className=\"size-4\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{!collapsed && (\n\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t<div className=\"grid flex-1 text-left leading-tight\">\n\t\t\t\t\t\t\t\t\t\t<span className=\"truncate text-xs font-medium\">\n\t\t\t\t\t\t\t\t\t\t\t{displayName}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t<span className=\"truncate text-[10px] text-sidebar-foreground/50\">\n\t\t\t\t\t\t\t\t\t\t\t{displayEmail}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\t\ticon=\"ph:caret-up-down\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"ml-auto size-3.5 text-sidebar-foreground/40\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</DropdownMenuTrigger>\n\t\t\t\t\t\t<DropdownMenuContent\n\t\t\t\t\t\t\tside={collapsed ? \"right\" : \"top\"}\n\t\t\t\t\t\t\talign={collapsed ? \"start\" : \"start\"}\n\t\t\t\t\t\t\tclassName=\"w-56\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"px-2 py-1.5\">\n\t\t\t\t\t\t\t\t<p className=\"text-xs font-medium\">{displayName}</p>\n\t\t\t\t\t\t\t\t<p className=\"text-[10px] text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t{displayEmail}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t{user.role && (\n\t\t\t\t\t\t\t\t\t<p className=\"text-[10px] text-muted-foreground capitalize mt-0.5\">\n\t\t\t\t\t\t\t\t\t\t{user.role}\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<DropdownMenuSeparator />\n\t\t\t\t\t\t\t{/* My Account - link to user detail */}\n\t\t\t\t\t\t\t<DropdownMenuItem onClick={handleMyAccount}>\n\t\t\t\t\t\t\t\t<Icon icon=\"ph:user-circle\" className=\"size-4\" />\n\t\t\t\t\t\t\t\t{t(\"auth.myAccount\")}\n\t\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t\t\t{/* UI Language Switcher */}\n\t\t\t\t\t\t\t{hasMultipleUiLocales && (\n\t\t\t\t\t\t\t\t<DropdownMenuSub>\n\t\t\t\t\t\t\t\t\t<DropdownMenuSubTrigger>\n\t\t\t\t\t\t\t\t\t\t<Icon icon=\"ph:globe\" />\n\t\t\t\t\t\t\t\t\t\t{t(\"locale.uiLanguage\")}\n\t\t\t\t\t\t\t\t\t</DropdownMenuSubTrigger>\n\t\t\t\t\t\t\t\t\t<DropdownMenuPortal>\n\t\t\t\t\t\t\t\t\t\t<DropdownMenuSubContent>\n\t\t\t\t\t\t\t\t\t\t\t{uiLocaleOptions.map((locale) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={locale.code}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => setUiLocale(locale.code)}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsrc={getFlagUrl(locale.code)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\talt={locale.code}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"h-3 w-4 rounded-[2px] object-cover\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonError={(e) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\te.currentTarget.style.display = \"none\";\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"uppercase text-xs font-medium w-6\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{locale.code}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"flex-1\">{locale.label}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{locale.code === uiLocale && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ticon=\"ph:check\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"size-4 text-primary\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t</DropdownMenuSubContent>\n\t\t\t\t\t\t\t\t\t</DropdownMenuPortal>\n\t\t\t\t\t\t\t\t</DropdownMenuSub>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t<DropdownMenuSeparator />\n\t\t\t\t\t\t\t<DropdownMenuItem variant=\"destructive\" onClick={handleLogout}>\n\t\t\t\t\t\t\t\t<Icon icon=\"ph:sign-out\" className=\"size-4\" />\n\t\t\t\t\t\t\t\t{t(\"auth.logout\")}\n\t\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t\t</DropdownMenuContent>\n\t\t\t\t\t</DropdownMenu>\n\t\t\t\t</SidebarMenuItem>\n\t\t\t</SidebarMenu>\n\t\t</SidebarFooter>\n\t);\n}\n\n/**\n * AdminSidebar Component\n *\n * When used inside AdminProvider, navigation and brandName are automatically\n * read from context if not provided as props.\n *\n * @example\n * ```tsx\n * // With AdminProvider (automatic)\n * <AdminProvider admin={admin} client={client}>\n * <SidebarProvider>\n * <AdminSidebar LinkComponent={Link} activeRoute=\"/admin/posts\" />\n * </SidebarProvider>\n * </AdminProvider>\n *\n * // Without AdminProvider (manual)\n * <SidebarProvider>\n * <AdminSidebar\n * navigation={buildNavigation(admin)}\n * LinkComponent={Link}\n * activeRoute=\"/admin/posts\"\n * brandName=\"My CMS\"\n * />\n * </SidebarProvider>\n * ```\n */\nexport function AdminSidebar({\n\tnavigation: navigationProp,\n\tLinkComponent,\n\tactiveRoute,\n\tbasePath = \"/admin\",\n\tbrandName: brandNameProp,\n\tclassName,\n\trenderBrand,\n\trenderNavItem,\n\tfooter,\n\tafterBrand,\n\tbeforeFooter,\n\tuseActiveProps = true,\n}: AdminSidebarProps): React.ReactElement {\n\t// Resolve navigation and brandName from props or store\n\tconst { navigation, brandName } = useSidebarProps({\n\t\tnavigation: navigationProp,\n\t\tbrandName: brandNameProp,\n\t});\n\n\tconst { state, isMobile, setOpenMobile } = useSidebar();\n\tconst collapsed = state === \"collapsed\";\n\n\t// Close sidebar on mobile when navigating\n\tconst handleBrandClick = React.useCallback(() => {\n\t\tif (isMobile) {\n\t\t\tsetOpenMobile(false);\n\t\t}\n\t}, [isMobile, setOpenMobile]);\n\n\tconst brandContent = renderBrand ? (\n\t\trenderBrand({ name: brandName, collapsed })\n\t) : (\n\t\t<>\n\t\t\t<QuestpieSymbol />\n\t\t\t{!collapsed && (\n\t\t\t\t<div className=\"grid flex-1 text-left leading-tight\">\n\t\t\t\t\t<span className=\"truncate font-bold tracking-tight\">\n\t\t\t\t\t\t{brandName}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</>\n\t);\n\n\tconst brandLink = (\n\t\t<LinkComponent\n\t\t\tto={basePath}\n\t\t\tclassName={cn(\n\t\t\t\t\"flex items-center gap-2.5 p-2 transition-colors duration-150\",\n\t\t\t\t\"hover:bg-sidebar-accent\",\n\t\t\t\tcollapsed && \"justify-center\",\n\t\t\t)}\n\t\t>\n\t\t\t{brandContent}\n\t\t</LinkComponent>\n\t);\n\n\treturn (\n\t\t<Sidebar collapsible=\"icon\" className={className}>\n\t\t\t{/* Brand Header */}\n\t\t\t<SidebarHeader className=\"p-2 border-b border-sidebar-border/50\">\n\t\t\t\t<SidebarMenu>\n\t\t\t\t\t<SidebarMenuItem onClickCapture={handleBrandClick}>\n\t\t\t\t\t\t{collapsed && !isMobile ? (\n\t\t\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t\t\t<TooltipTrigger\n\t\t\t\t\t\t\t\t\trender={\n\t\t\t\t\t\t\t\t\t\t<LinkComponent\n\t\t\t\t\t\t\t\t\t\t\tto={basePath}\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\"flex items-center gap-2.5 p-2 transition-colors duration-150\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"hover:bg-sidebar-accent\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"justify-center\",\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{renderBrand ? (\n\t\t\t\t\t\t\t\t\t\t\t\trenderBrand({ name: brandName, collapsed: true })\n\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t<QuestpieSymbol />\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</LinkComponent>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<TooltipContent side=\"right\">{brandName}</TooltipContent>\n\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\tbrandLink\n\t\t\t\t\t\t)}\n\t\t\t\t\t</SidebarMenuItem>\n\t\t\t\t</SidebarMenu>\n\t\t\t</SidebarHeader>\n\n\t\t\t{/* After Brand Slot - for scope pickers, etc */}\n\t\t\t{afterBrand && !collapsed && (\n\t\t\t\t<div className=\"px-3 py-2 border-b border-sidebar-border/50\">\n\t\t\t\t\t{afterBrand}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Navigation */}\n\t\t\t<SidebarContent>\n\t\t\t\t{navigation.map((group, index) => (\n\t\t\t\t\t<NavGroup\n\t\t\t\t\t\tkey={group.id ?? `group-${index}`}\n\t\t\t\t\t\tgroup={group}\n\t\t\t\t\t\tactiveRoute={activeRoute}\n\t\t\t\t\t\tLinkComponent={LinkComponent}\n\t\t\t\t\t\trenderNavItem={renderNavItem}\n\t\t\t\t\t\tbasePath={basePath}\n\t\t\t\t\t\tuseActiveProps={useActiveProps}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</SidebarContent>\n\n\t\t\t{/* Before Footer Slot - for additional actions */}\n\t\t\t{beforeFooter && !collapsed && (\n\t\t\t\t<div className=\"px-3 py-2 border-t border-sidebar-border/50\">\n\t\t\t\t\t{beforeFooter}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Footer */}\n\t\t\t{footer ?? <UserFooter />}\n\t\t</Sidebar>\n\t);\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"admin-topbar.mjs","names":["React"],"sources":["../../../../src/client/views/layout/admin-topbar.tsx"],"sourcesContent":["import { Icon } from \"@iconify/react\";\nimport * as React from \"react\";\nimport { Button } from \"../../components/ui/button\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"../../components/ui/dropdown-menu\";\nimport { Kbd } from \"../../components/ui/kbd\";\nimport { SidebarTrigger } from \"../../components/ui/sidebar\";\nimport type { Breadcrumb } from \"../../contexts/breadcrumb-context\";\nimport { useResolveText } from \"../../i18n/hooks\";\nimport { cn } from \"../../lib/utils\";\n\nexport type Theme = \"light\" | \"dark\" | \"system\";\n\nexport interface AdminTopbarProps {\n onSearchOpen: () => void;\n breadcrumbs?: Breadcrumb[];\n theme?: Theme;\n setTheme?: (theme: Theme) => void;\n showThemeToggle?: boolean;\n}\n\nexport function AdminTopbar({\n onSearchOpen,\n breadcrumbs = [],\n theme = \"system\",\n setTheme,\n showThemeToggle,\n}: AdminTopbarProps) {\n const resolveText = useResolveText();\n\n // Show theme toggle if setTheme is provided and showThemeToggle is not explicitly false\n const shouldShowThemeToggle = setTheme && showThemeToggle !== false;\n\n return (\n <header className=\"relative sticky top-0 z-30 flex h-16 w-full items-center justify-between border-b border-border/60 bg-background/60 px-4 md:px-6 backdrop-blur-xl after:absolute after:inset-x-0 after:bottom-0 after:h-px after:bg-gradient-to-r after:from-transparent after:via-primary/15 after:to-transparent\">\n <div className=\"flex items-center gap-2\">\n {/* Sidebar toggle - works for both mobile (opens sheet) and desktop (collapses) */}\n <SidebarTrigger />\n\n {/* Breadcrumbs */}\n <nav className=\"hidden md:flex items-center gap-1.5 text-sm text-muted-foreground\">\n {breadcrumbs.map((crumb) => {\n const CrumbIcon = crumb.icon;\n const crumbLabel = resolveText(crumb.label);\n const crumbKey = crumb.href ?? crumbLabel;\n return (\n <React.Fragment key={crumbKey}>\n {breadcrumbs[0] !== crumb && (\n <span className=\"text-muted-foreground/40 mx-1\">/</span>\n )}\n\n {crumb.menu ? (\n // Breadcrumb with dropdown menu\n <DropdownMenu>\n <DropdownMenuTrigger\n render={\n <button\n type=\"button\"\n className={cn(\n \"flex items-center gap-1 hover:text-foreground transition-colors\",\n breadcrumbs[breadcrumbs.length - 1] === crumb &&\n \"text-foreground font-medium\",\n )}\n >\n {CrumbIcon && <CrumbIcon className=\"size-3.5\" />}\n {crumbLabel}\n <Icon\n icon=\"ph:caret-down\"\n className=\"size-3 opacity-50\"\n />\n </button>\n }\n />\n <DropdownMenuContent align=\"start\">\n {crumb.menu.items.map((item) => {\n const ItemIcon = item.icon;\n return (\n <DropdownMenuItem\n key={item.href}\n onClick={() => {\n window.location.href = item.href;\n }}\n >\n {ItemIcon && <ItemIcon className=\"size-3.5\" />}\n {resolveText(item.label)}\n </DropdownMenuItem>\n );\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n ) : crumb.href ? (\n // Breadcrumb with link\n <a\n href={crumb.href}\n className=\"flex items-center gap-1.5 hover:text-foreground transition-colors\"\n >\n {CrumbIcon && <CrumbIcon className=\"size-3.5\" />}\n {crumbLabel}\n </a>\n ) : (\n // Static breadcrumb (current page)\n <span\n className={cn(\n \"flex items-center gap-1.5\",\n breadcrumbs[breadcrumbs.length - 1] === crumb\n ? \"text-foreground font-medium\"\n : \"\",\n )}\n >\n {CrumbIcon && <CrumbIcon className=\"size-3.5\" />}\n {crumbLabel}\n </span>\n )}\n </React.Fragment>\n );\n })}\n </nav>\n </div>\n\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n onClick={onSearchOpen}\n className=\"gap-2 w-auto md:w-64 justify-between text-muted-foreground\"\n >\n <span className=\"flex items-center gap-2\">\n <Icon icon=\"ph:magnifying-glass\" />\n <span className=\"hidden sm:inline\">Search...</span>\n </span>\n <Kbd className=\"hidden md:inline-flex\">\n <span className=\"text-xs\">⌘</span>K\n </Kbd>\n </Button>\n\n {shouldShowThemeToggle && (\n <DropdownMenu>\n <DropdownMenuTrigger\n render={\n <Button variant=\"ghost\" size=\"icon\">\n <Icon\n icon=\"ph:sun\"\n className=\"size-4 scale-100 rotate-0 transition-all dark:scale-0 dark:-rotate-90\"\n />\n <Icon\n icon=\"ph:moon\"\n className=\"absolute size-4 scale-0 rotate-90 transition-all dark:scale-100 dark:rotate-0\"\n />\n <span className=\"sr-only\">Toggle theme</span>\n </Button>\n }\n />\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={() => setTheme(\"light\")}>\n <Icon icon=\"ph:sun\" className=\"mr-2 size-4\" />\n Light\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setTheme(\"dark\")}>\n <Icon icon=\"ph:moon\" className=\"mr-2 size-4\" />\n Dark\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setTheme(\"system\")}>\n <Icon icon=\"ph:monitor\" className=\"mr-2 size-4\" />\n System\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n </header>\n );\n}\n"],"mappings":";;;;;;;;;;;AAyBA,SAAgB,YAAY,EAC1B,cACA,cAAc,EAAE,EAChB,QAAQ,UACR,UACA,mBACmB;CACnB,MAAM,cAAc,gBAAgB;CAGpC,MAAM,wBAAwB,YAAY,oBAAoB;AAE9D,QACE,qBAAC;EAAO,WAAU;aAChB,qBAAC;GAAI,WAAU;cAEb,oBAAC,mBAAiB,EAGlB,oBAAC;IAAI,WAAU;cACZ,YAAY,KAAK,UAAU;KAC1B,MAAM,YAAY,MAAM;KACxB,MAAM,aAAa,YAAY,MAAM,MAAM;KAC3C,MAAM,WAAW,MAAM,QAAQ;AAC/B,YACE,qBAACA,QAAM,uBACJ,YAAY,OAAO,SAClB,oBAAC;MAAK,WAAU;gBAAgC;OAAQ,EAGzD,MAAM,OAEL,qBAAC,2BACC,oBAAC,uBACC,QACE,qBAAC;MACC,MAAK;MACL,WAAW,GACT,mEACA,YAAY,YAAY,SAAS,OAAO,SACtC,8BACH;;OAEA,aAAa,oBAAC,aAAU,WAAU,aAAa;OAC/C;OACD,oBAAC;QACC,MAAK;QACL,WAAU;SACV;;OACK,GAEX,EACF,oBAAC;MAAoB,OAAM;gBACxB,MAAM,KAAK,MAAM,KAAK,SAAS;OAC9B,MAAM,WAAW,KAAK;AACtB,cACE,qBAAC;QAEC,eAAe;AACb,gBAAO,SAAS,OAAO,KAAK;;mBAG7B,YAAY,oBAAC,YAAS,WAAU,aAAa,EAC7C,YAAY,KAAK,MAAM;UANnB,KAAK,KAOO;QAErB;OACkB,IACT,GACb,MAAM,OAER,qBAAC;MACC,MAAM,MAAM;MACZ,WAAU;iBAET,aAAa,oBAAC,aAAU,WAAU,aAAa,EAC/C;OACC,GAGJ,qBAAC;MACC,WAAW,GACT,6BACA,YAAY,YAAY,SAAS,OAAO,QACpC,gCACA,GACL;iBAEA,aAAa,oBAAC,aAAU,WAAU,aAAa,EAC/C;OACI,KAjEU,SAmEJ;MAEnB;KACE;IACF,EAEN,qBAAC;GAAI,WAAU;cACb,qBAAC;IACC,SAAQ;IACR,SAAS;IACT,WAAU;eAEV,qBAAC;KAAK,WAAU;gBACd,oBAAC,QAAK,MAAK,wBAAwB,EACnC,oBAAC;MAAK,WAAU;gBAAmB;OAAgB;MAC9C,EACP,qBAAC;KAAI,WAAU;gBACb,oBAAC;MAAK,WAAU;gBAAU;OAAQ;MAC9B;KACC,EAER,yBACC,qBAAC,2BACC,oBAAC,uBACC,QACE,qBAAC;IAAO,SAAQ;IAAQ,MAAK;;KAC3B,oBAAC;MACC,MAAK;MACL,WAAU;OACV;KACF,oBAAC;MACC,MAAK;MACL,WAAU;OACV;KACF,oBAAC;MAAK,WAAU;gBAAU;OAAmB;;KACtC,GAEX,EACF,qBAAC;IAAoB,OAAM;;KACzB,qBAAC;MAAiB,eAAe,SAAS,QAAQ;iBAChD,oBAAC;OAAK,MAAK;OAAS,WAAU;QAAgB;OAE7B;KACnB,qBAAC;MAAiB,eAAe,SAAS,OAAO;iBAC/C,oBAAC;OAAK,MAAK;OAAU,WAAU;QAAgB;OAE9B;KACnB,qBAAC;MAAiB,eAAe,SAAS,SAAS;iBACjD,oBAAC;OAAK,MAAK;OAAa,WAAU;QAAgB;OAEjC;;KACC,IACT;IAEb;GACC"}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { AdminSidebarProps, LinkComponentProps } from "./admin-sidebar.mjs";
|
|
2
|
-
import { AdminLayout, AdminLayoutProps } from "./admin-layout.mjs";
|
|
3
|
-
import { AdminLayoutProvider, AdminLayoutProviderProps } from "./admin-layout-provider.mjs";
|
|
4
|
-
import "./admin-root.mjs";
|
|
5
|
-
import { AdminRouter, AdminRouterProps } from "./admin-router.mjs";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"accept-invite-page.d.mts","names":[],"sources":["../../../../src/client/views/pages/accept-invite-page.tsx"],"sourcesContent":[],"mappings":";;;;;AAyFE,UAhEe,qBAAA,CAgEf;EACA;;;EAGA,KAAA,EAAA,MAAA;EACA;;;;;;;;;;;;;SAhDO,OAAA,CAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAyCC,gBAAA;;;;;;;;GAQb,wBAAqB,kBAAA,CAAA,GAAA,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"accept-invite-page.mjs","names":["React"],"sources":["../../../../src/client/views/pages/accept-invite-page.tsx"],"sourcesContent":["/**\n * Accept Invite Page\n *\n * Page for new users to complete registration after receiving invitation.\n * Uses Better Auth's admin plugin for invitation acceptance.\n */\n\nimport * as React from \"react\";\nimport { useAuthClient } from \"../../hooks/use-auth\";\nimport {\n selectBasePath,\n selectBrandName,\n selectNavigate,\n useAdminStore,\n} from \"../../runtime/provider\";\nimport { AuthLayout } from \"../auth/auth-layout\";\nimport {\n AcceptInviteForm,\n type AcceptInviteFormValues,\n} from \"../auth/accept-invite-form\";\nimport { Alert, AlertDescription } from \"../../components/ui/alert\";\nimport { Button } from \"../../components/ui/button\";\nimport { Spinner } from \"../../components/ui/spinner\";\nimport { Icon } from \"@iconify/react\";\n\nexport interface AcceptInvitePageProps {\n /**\n * Invitation token from URL\n */\n token: string;\n\n /**\n * Title shown on the page\n * @default \"Complete Registration\"\n */\n title?: string;\n\n /**\n * Description shown below the title\n * @default \"Create your account to get started\"\n */\n description?: string;\n\n /**\n * Logo component to show above the form\n */\n logo?: React.ReactNode;\n\n /**\n * Path to redirect after successful registration\n * @default basePath (e.g., \"/admin\")\n */\n redirectTo?: string;\n\n /**\n * Path to login page (for invalid/expired tokens)\n * @default \"{basePath}/login\"\n */\n loginPath?: string;\n\n /**\n * Minimum password length\n * @default 8\n */\n minPasswordLength?: number;\n}\n\ntype InvitationState =\n | { status: \"loading\" }\n | { status: \"valid\"; email: string; role?: string }\n | { status: \"invalid\"; message: string };\n\n/**\n * Accept invite page component.\n *\n * Validates the invitation token and allows new users to complete registration.\n * Uses authClient from AdminProvider.\n *\n * @example\n * ```tsx\n * // In your router\n * function AcceptInviteRoute() {\n * const { token } = useParams()\n * return <AcceptInvitePage token={token} />\n * }\n * ```\n */\nexport function AcceptInvitePage({\n token,\n title = \"Complete Registration\",\n description = \"Create your account to get started\",\n logo,\n redirectTo,\n loginPath,\n minPasswordLength = 8,\n}: AcceptInvitePageProps) {\n const authClient = useAuthClient();\n const navigate = useAdminStore(selectNavigate);\n const basePath = useAdminStore(selectBasePath);\n const brandName = useAdminStore(selectBrandName);\n\n const [invitation, setInvitation] = React.useState<InvitationState>({\n status: \"loading\",\n });\n const [error, setError] = React.useState<string | null>(null);\n\n // Validate token on mount\n React.useEffect(() => {\n const validateToken = async () => {\n try {\n const result = await authClient.admin.getInvitation({\n query: { token },\n });\n\n if (result.error || !result.data) {\n setInvitation({\n status: \"invalid\",\n message: result.error?.message || \"Invalid or expired invitation\",\n });\n return;\n }\n\n setInvitation({\n status: \"valid\",\n email: result.data.email,\n role: result.data.role,\n });\n } catch (err) {\n setInvitation({\n status: \"invalid\",\n message: \"Invalid or expired invitation\",\n });\n }\n };\n\n validateToken();\n }, [token, authClient]);\n\n const handleSubmit = async (values: AcceptInviteFormValues) => {\n setError(null);\n\n try {\n const result = await authClient.admin.acceptInvitation({\n token,\n name: values.name,\n password: values.password,\n });\n\n if (result.error) {\n setError(result.error.message || \"Failed to create account\");\n return;\n }\n\n // Redirect on success\n navigate(redirectTo ?? basePath);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"An error occurred\");\n }\n };\n\n const handleGoToLogin = () => {\n navigate(loginPath ?? `${basePath}/login`);\n };\n\n // Loading state\n if (invitation.status === \"loading\") {\n return (\n <AuthLayout\n title=\"Validating Invitation\"\n description=\"Please wait...\"\n logo={logo ?? <DefaultLogo brandName={brandName} />}\n >\n <div className=\"flex justify-center py-8\">\n <Spinner className=\"size-8\" />\n </div>\n </AuthLayout>\n );\n }\n\n // Invalid token state\n if (invitation.status === \"invalid\") {\n return (\n <AuthLayout\n title=\"Invalid Invitation\"\n description=\"This invitation link is no longer valid\"\n logo={logo ?? <DefaultLogo brandName={brandName} />}\n >\n <div className=\"space-y-4\">\n <Alert variant=\"destructive\">\n <Icon icon=\"ph:warning-circle\" />\n <AlertDescription>{invitation.message}</AlertDescription>\n </Alert>\n <p className=\"text-muted-foreground text-center text-sm\">\n The invitation may have expired or already been used. Please contact\n your administrator for a new invitation.\n </p>\n <Button\n variant=\"outline\"\n className=\"w-full\"\n onClick={handleGoToLogin}\n >\n Go to Login\n </Button>\n </div>\n </AuthLayout>\n );\n }\n\n // Valid token - show registration form\n return (\n <AuthLayout\n title={title}\n description={description}\n logo={logo ?? <DefaultLogo brandName={brandName} />}\n >\n <AcceptInviteForm\n onSubmit={handleSubmit}\n email={invitation.email}\n error={error}\n minPasswordLength={minPasswordLength}\n />\n </AuthLayout>\n );\n}\n\nfunction DefaultLogo({ brandName }: { brandName: string }) {\n return (\n <div className=\"text-center\">\n <h1 className=\"text-xl font-bold\">{brandName}</h1>\n </div>\n );\n}\n\nexport default AcceptInvitePage;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuFA,SAAgB,iBAAiB,EAC/B,OACA,QAAQ,yBACR,cAAc,sCACd,MACA,YACA,WACA,oBAAoB,KACI;CACxB,MAAM,aAAa,eAAe;CAClC,MAAM,WAAW,cAAc,eAAe;CAC9C,MAAM,WAAW,cAAc,eAAe;CAC9C,MAAM,YAAY,cAAc,gBAAgB;CAEhD,MAAM,CAAC,YAAY,iBAAiBA,QAAM,SAA0B,EAClE,QAAQ,WACT,CAAC;CACF,MAAM,CAAC,OAAO,YAAYA,QAAM,SAAwB,KAAK;AAG7D,SAAM,gBAAgB;EACpB,MAAM,gBAAgB,YAAY;AAChC,OAAI;IACF,MAAM,SAAS,MAAM,WAAW,MAAM,cAAc,EAClD,OAAO,EAAE,OAAO,EACjB,CAAC;AAEF,QAAI,OAAO,SAAS,CAAC,OAAO,MAAM;AAChC,mBAAc;MACZ,QAAQ;MACR,SAAS,OAAO,OAAO,WAAW;MACnC,CAAC;AACF;;AAGF,kBAAc;KACZ,QAAQ;KACR,OAAO,OAAO,KAAK;KACnB,MAAM,OAAO,KAAK;KACnB,CAAC;YACK,KAAK;AACZ,kBAAc;KACZ,QAAQ;KACR,SAAS;KACV,CAAC;;;AAIN,iBAAe;IACd,CAAC,OAAO,WAAW,CAAC;CAEvB,MAAM,eAAe,OAAO,WAAmC;AAC7D,WAAS,KAAK;AAEd,MAAI;GACF,MAAM,SAAS,MAAM,WAAW,MAAM,iBAAiB;IACrD;IACA,MAAM,OAAO;IACb,UAAU,OAAO;IAClB,CAAC;AAEF,OAAI,OAAO,OAAO;AAChB,aAAS,OAAO,MAAM,WAAW,2BAA2B;AAC5D;;AAIF,YAAS,cAAc,SAAS;WACzB,KAAK;AACZ,YAAS,eAAe,QAAQ,IAAI,UAAU,oBAAoB;;;CAItE,MAAM,wBAAwB;AAC5B,WAAS,aAAa,GAAG,SAAS,QAAQ;;AAI5C,KAAI,WAAW,WAAW,UACxB,QACE,oBAAC;EACC,OAAM;EACN,aAAY;EACZ,MAAM,QAAQ,oBAAC,eAAuB,YAAa;YAEnD,oBAAC;GAAI,WAAU;aACb,oBAAC,WAAQ,WAAU,WAAW;IAC1B;GACK;AAKjB,KAAI,WAAW,WAAW,UACxB,QACE,oBAAC;EACC,OAAM;EACN,aAAY;EACZ,MAAM,QAAQ,oBAAC,eAAuB,YAAa;YAEnD,qBAAC;GAAI,WAAU;;IACb,qBAAC;KAAM,SAAQ;gBACb,oBAAC,QAAK,MAAK,sBAAsB,EACjC,oBAAC,8BAAkB,WAAW,UAA2B;MACnD;IACR,oBAAC;KAAE,WAAU;eAA4C;MAGrD;IACJ,oBAAC;KACC,SAAQ;KACR,WAAU;KACV,SAAS;eACV;MAEQ;;IACL;GACK;AAKjB,QACE,oBAAC;EACQ;EACM;EACb,MAAM,QAAQ,oBAAC,eAAuB,YAAa;YAEnD,oBAAC;GACC,UAAU;GACV,OAAO,WAAW;GACX;GACY;IACnB;GACS;;AAIjB,SAAS,YAAY,EAAE,aAAoC;AACzD,QACE,oBAAC;EAAI,WAAU;YACb,oBAAC;GAAG,WAAU;aAAqB;IAAe;GAC9C"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard-page.d.mts","names":[],"sources":["../../../../src/client/views/pages/dashboard-page.tsx"],"sourcesContent":[],"mappings":";;;;;;;;;;;;UAiBiB,kBAAA;;;AAAjB;EAmCgB,KAAA,CAAA,EAAA,MAAA;EACd;;;EAGC,WAAA,CAAA,EAAA,MAAA;EAAkB;;;;;;;;;;;;;;;;;;;;;;;iBAJL,aAAA;;;;GAIb,qBAAkB,kBAAA,CAAA,GAAA,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard-page.mjs","names":[],"sources":["../../../../src/client/views/pages/dashboard-page.tsx"],"sourcesContent":["/**\n * Dashboard Page\n *\n * Default dashboard page that renders the DashboardGrid component\n * based on the admin configuration.\n */\n\nimport * as React from \"react\";\nimport type { DashboardConfig } from \"../../builder\";\nimport { useAdminConfig } from \"../../hooks/use-admin-config\";\nimport {\n selectBasePath,\n selectNavigate,\n useAdminStore,\n} from \"../../runtime/provider\";\nimport { DashboardGrid } from \"../dashboard/dashboard-grid\";\n\nexport interface DashboardPageProps {\n /**\n * Override dashboard title\n */\n title?: string;\n\n /**\n * Override dashboard description\n */\n description?: string;\n\n /**\n * Additional CSS class\n */\n className?: string;\n}\n\n/**\n * Default dashboard page component.\n *\n * Reads dashboard configuration from AdminProvider and renders DashboardGrid.\n *\n * @example\n * ```tsx\n * // In your admin config\n * const admin = qa<AppCMS>()\n * .use(coreAdminModule)\n * .dashboard({\n * title: \"Welcome\",\n * widgets: [\n * { type: \"stats\", collection: \"posts\" },\n * ],\n * })\n * ```\n */\nexport function DashboardPage({\n title,\n description,\n className,\n}: DashboardPageProps) {\n const basePath = useAdminStore(selectBasePath);\n const navigate = useAdminStore(selectNavigate);\n const { data: serverConfig } = useAdminConfig();\n\n const dashboardConfig = (serverConfig?.dashboard ?? {}) as DashboardConfig;\n\n // Merge props with config\n const config = {\n ...dashboardConfig,\n ...(title && { title }),\n ...(description && { description }),\n };\n\n return (\n <DashboardGrid\n config={config}\n basePath={basePath}\n navigate={navigate}\n className={className}\n />\n );\n}\n\nexport default DashboardPage;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAoDA,SAAgB,cAAc,EAC5B,OACA,aACA,aACqB;CACrB,MAAM,WAAW,cAAc,eAAe;CAC9C,MAAM,WAAW,cAAc,eAAe;CAC9C,MAAM,EAAE,MAAM,iBAAiB,gBAAgB;AAW/C,QACE,oBAAC;EACC,QARW;GACb,GAJuB,cAAc,aAAa,EAAE;GAKpD,GAAI,SAAS,EAAE,OAAO;GACtB,GAAI,eAAe,EAAE,aAAa;GACnC;EAKa;EACA;EACC;GACX;;AAIN,6BAAe"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"forgot-password-page.d.mts","names":[],"sources":["../../../../src/client/views/pages/forgot-password-page.tsx"],"sourcesContent":[],"mappings":";;;;;;;UAqBiB,uBAAA;;;AAAjB;AA+CA;EACE,KAAA,CAAA,EAAA,MAAA;EACA;;;;EAIC,WAAA,CAAA,EAAA,MAAA;EAAuB;;;SArCjB,OAAA,CAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+BC,kBAAA;;;;;;GAMb,0BAAuB,kBAAA,CAAA,GAAA,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"forgot-password-page.mjs","names":["React"],"sources":["../../../../src/client/views/pages/forgot-password-page.tsx"],"sourcesContent":["/**\n * Forgot Password Page\n *\n * Default forgot password page that uses AuthLayout and ForgotPasswordForm.\n * Integrates with authClient from AdminProvider context.\n */\n\nimport * as React from \"react\";\nimport { useAuthClient } from \"../../hooks/use-auth\";\nimport {\n selectBasePath,\n selectBrandName,\n selectNavigate,\n useAdminStore,\n} from \"../../runtime/provider\";\nimport { AuthLayout } from \"../auth/auth-layout\";\nimport {\n ForgotPasswordForm,\n type ForgotPasswordFormValues,\n} from \"../auth/forgot-password-form\";\n\nexport interface ForgotPasswordPageProps {\n /**\n * Title shown on the page\n * @default \"Forgot password\"\n */\n title?: string;\n\n /**\n * Description shown below the title\n * @default \"Enter your email to receive a password reset link\"\n */\n description?: string;\n\n /**\n * Logo component to show above the form\n */\n logo?: React.ReactNode;\n\n /**\n * Path to login page\n * @default \"{basePath}/login\"\n */\n loginPath?: string;\n\n /**\n * URL to redirect to after password reset (included in email)\n * @default \"{window.origin}{basePath}/reset-password\"\n */\n resetPasswordRedirectUrl?: string;\n}\n\n/**\n * Default forgot password page component.\n *\n * Uses authClient from AdminProvider to handle password reset requests.\n *\n * @example\n * ```tsx\n * // In your admin config\n * const admin = qa<AppCMS>()\n * .use(coreAdminModule)\n * .pages({\n * forgotPassword: page(\"forgot-password\", { component: ForgotPasswordPage })\n * .path(\"/forgot-password\"),\n * })\n * ```\n */\nexport function ForgotPasswordPage({\n title = \"Forgot password\",\n description = \"Enter your email to receive a password reset link\",\n logo,\n loginPath,\n resetPasswordRedirectUrl,\n}: ForgotPasswordPageProps) {\n const authClient = useAuthClient();\n const navigate = useAdminStore(selectNavigate);\n const basePath = useAdminStore(selectBasePath);\n const brandName = useAdminStore(selectBrandName);\n\n const [error, setError] = React.useState<string | null>(null);\n\n const handleSubmit = async (values: ForgotPasswordFormValues) => {\n setError(null);\n\n try {\n const redirectUrl =\n resetPasswordRedirectUrl ??\n `${typeof window !== \"undefined\" ? window.location.origin : \"\"}${basePath}/reset-password`;\n\n const result = await authClient.forgetPassword({\n email: values.email,\n redirectTo: redirectUrl,\n });\n\n if (result.error) {\n setError(result.error.message || \"Failed to send reset email\");\n return;\n }\n\n // Success is handled by the form (shows success message)\n } catch (err) {\n setError(err instanceof Error ? err.message : \"An error occurred\");\n }\n };\n\n const handleBackToLoginClick = () => {\n navigate(loginPath ?? `${basePath}/login`);\n };\n\n return (\n <AuthLayout\n title={title}\n description={description}\n logo={logo ?? <DefaultLogo brandName={brandName} />}\n >\n <ForgotPasswordForm\n onSubmit={handleSubmit}\n onBackToLoginClick={handleBackToLoginClick}\n error={error}\n />\n </AuthLayout>\n );\n}\n\nfunction DefaultLogo({ brandName }: { brandName: string }) {\n return (\n <div className=\"text-center\">\n <h1 className=\"text-xl font-bold\">{brandName}</h1>\n </div>\n );\n}\n\nexport default ForgotPasswordPage;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoEA,SAAgB,mBAAmB,EACjC,QAAQ,mBACR,cAAc,qDACd,MACA,WACA,4BAC0B;CAC1B,MAAM,aAAa,eAAe;CAClC,MAAM,WAAW,cAAc,eAAe;CAC9C,MAAM,WAAW,cAAc,eAAe;CAC9C,MAAM,YAAY,cAAc,gBAAgB;CAEhD,MAAM,CAAC,OAAO,YAAYA,QAAM,SAAwB,KAAK;CAE7D,MAAM,eAAe,OAAO,WAAqC;AAC/D,WAAS,KAAK;AAEd,MAAI;GACF,MAAM,cACJ,4BACA,GAAG,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS,KAAK,SAAS;GAE5E,MAAM,SAAS,MAAM,WAAW,eAAe;IAC7C,OAAO,OAAO;IACd,YAAY;IACb,CAAC;AAEF,OAAI,OAAO,OAAO;AAChB,aAAS,OAAO,MAAM,WAAW,6BAA6B;AAC9D;;WAIK,KAAK;AACZ,YAAS,eAAe,QAAQ,IAAI,UAAU,oBAAoB;;;CAItE,MAAM,+BAA+B;AACnC,WAAS,aAAa,GAAG,SAAS,QAAQ;;AAG5C,QACE,oBAAC;EACQ;EACM;EACb,MAAM,QAAQ,oBAAC,eAAuB,YAAa;YAEnD,oBAAC;GACC,UAAU;GACV,oBAAoB;GACb;IACP;GACS;;AAIjB,SAAS,YAAY,EAAE,aAAoC;AACzD,QACE,oBAAC;EAAI,WAAU;YACb,oBAAC;GAAG,WAAU;aAAqB;IAAe;GAC9C;;AAIV,mCAAe"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { DashboardPage, DashboardPageProps } from "./dashboard-page.mjs";
|
|
2
|
-
import { LoginPage, LoginPageProps } from "./login-page.mjs";
|
|
3
|
-
import { ForgotPasswordPage, ForgotPasswordPageProps } from "./forgot-password-page.mjs";
|
|
4
|
-
import { ResetPasswordPage, ResetPasswordPageProps } from "./reset-password-page.mjs";
|
|
5
|
-
import { InvitePage, InvitePageProps } from "./invite-page.mjs";
|
|
6
|
-
import { AcceptInvitePage, AcceptInvitePageProps } from "./accept-invite-page.mjs";
|
|
7
|
-
import { SetupPage, SetupPageProps } from "./setup-page.mjs";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"invite-page.d.mts","names":[],"sources":["../../../../src/client/views/pages/invite-page.tsx"],"sourcesContent":[],"mappings":";;;;;AA6EE,UA5De,eAAA,CA4Df;EACA;;;;EAOA,KAAA,CAAA,EAAA,MAAA;EACC;;;;;;;;SArDM,OAAA,CAAM;;;;;UAML;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoCM,UAAA;;;;;;;;GAWb,kBAAe,mBAAA,CAAA,GAAA,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"invite-page.mjs","names":["React"],"sources":["../../../../src/client/views/pages/invite-page.tsx"],"sourcesContent":["/**\n * Invite Page\n *\n * Page for admins to invite new users.\n * Uses Better Auth's admin plugin for invitations.\n */\n\nimport * as React from \"react\";\nimport { useAuthClient } from \"../../hooks/use-auth\";\nimport {\n selectBasePath,\n selectBrandName,\n useAdminStore,\n} from \"../../runtime/provider\";\nimport { AuthLayout } from \"../auth/auth-layout\";\nimport { InviteForm, type InviteFormValues } from \"../auth/invite-form\";\n\nexport interface InvitePageProps {\n /**\n * Title shown on the invite page\n * @default \"Invite User\"\n */\n title?: string;\n\n /**\n * Description shown below the title\n * @default \"Send an invitation to add a new user\"\n */\n description?: string;\n\n /**\n * Logo component to show above the form\n */\n logo?: React.ReactNode;\n\n /**\n * Available roles for selection\n * @default [{ value: \"admin\", label: \"Admin\" }, { value: \"user\", label: \"User\" }]\n */\n roles?: Array<{ value: string; label: string }>;\n\n /**\n * Default role for new users\n * @default \"user\"\n */\n defaultRole?: string;\n\n /**\n * Show custom message field\n * @default true\n */\n showMessage?: boolean;\n\n /**\n * Callback when invitation is sent successfully\n */\n onSuccess?: (email: string) => void;\n}\n\n/**\n * Default invite page component.\n *\n * Uses authClient from AdminProvider to send invitations.\n * Requires Better Auth admin plugin.\n *\n * @example\n * ```tsx\n * // In your admin config\n * const admin = qa<AppCMS>()\n * .use(adminStarterModule)\n * .pages({\n * invite: page(\"invite\", { component: InvitePage }).path(\"/invite\"),\n * })\n * ```\n */\nexport function InvitePage({\n title = \"Invite User\",\n description = \"Send an invitation to add a new user\",\n logo,\n roles = [\n { value: \"admin\", label: \"Admin\" },\n { value: \"user\", label: \"User\" },\n ],\n defaultRole = \"user\",\n showMessage = true,\n onSuccess,\n}: InvitePageProps) {\n const authClient = useAuthClient();\n const brandName = useAdminStore(selectBrandName);\n\n const [error, setError] = React.useState<string | null>(null);\n const [success, setSuccess] = React.useState<string | null>(null);\n\n const handleSubmit = async (values: InviteFormValues) => {\n setError(null);\n setSuccess(null);\n\n try {\n // Use Better Auth admin plugin to create invitation\n const result = await authClient.admin.createInvitation({\n email: values.email,\n role: values.role,\n });\n\n if (result.error) {\n setError(result.error.message || \"Failed to send invitation\");\n return;\n }\n\n setSuccess(`Invitation sent to ${values.email}`);\n onSuccess?.(values.email);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"An error occurred\");\n }\n };\n\n return (\n <AuthLayout\n title={title}\n description={description}\n logo={logo ?? <DefaultLogo brandName={brandName} />}\n >\n <InviteForm\n onSubmit={handleSubmit}\n roles={roles}\n defaultRole={defaultRole}\n showMessage={showMessage}\n error={error}\n success={success}\n />\n </AuthLayout>\n );\n}\n\nfunction DefaultLogo({ brandName }: { brandName: string }) {\n return (\n <div className=\"text-center\">\n <h1 className=\"text-xl font-bold\">{brandName}</h1>\n </div>\n );\n}\n\nexport default InvitePage;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2EA,SAAgB,WAAW,EACzB,QAAQ,eACR,cAAc,wCACd,MACA,QAAQ,CACN;CAAE,OAAO;CAAS,OAAO;CAAS,EAClC;CAAE,OAAO;CAAQ,OAAO;CAAQ,CACjC,EACD,cAAc,QACd,cAAc,MACd,aACkB;CAClB,MAAM,aAAa,eAAe;CAClC,MAAM,YAAY,cAAc,gBAAgB;CAEhD,MAAM,CAAC,OAAO,YAAYA,QAAM,SAAwB,KAAK;CAC7D,MAAM,CAAC,SAAS,cAAcA,QAAM,SAAwB,KAAK;CAEjE,MAAM,eAAe,OAAO,WAA6B;AACvD,WAAS,KAAK;AACd,aAAW,KAAK;AAEhB,MAAI;GAEF,MAAM,SAAS,MAAM,WAAW,MAAM,iBAAiB;IACrD,OAAO,OAAO;IACd,MAAM,OAAO;IACd,CAAC;AAEF,OAAI,OAAO,OAAO;AAChB,aAAS,OAAO,MAAM,WAAW,4BAA4B;AAC7D;;AAGF,cAAW,sBAAsB,OAAO,QAAQ;AAChD,eAAY,OAAO,MAAM;WAClB,KAAK;AACZ,YAAS,eAAe,QAAQ,IAAI,UAAU,oBAAoB;;;AAItE,QACE,oBAAC;EACQ;EACM;EACb,MAAM,QAAQ,oBAAC,eAAuB,YAAa;YAEnD,oBAAC;GACC,UAAU;GACH;GACM;GACA;GACN;GACE;IACT;GACS;;AAIjB,SAAS,YAAY,EAAE,aAAoC;AACzD,QACE,oBAAC;EAAI,WAAU;YACb,oBAAC;GAAG,WAAU;aAAqB;IAAe;GAC9C"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"login-page.d.mts","names":[],"sources":["../../../../src/client/views/pages/login-page.tsx"],"sourcesContent":[],"mappings":";;;;;;;UAqBiB,cAAA;EAAA;AAgEjB;;;EAGE,KAAA,CAAA,EAAA,MAAA;EACA;;;;EAIA,WAAA,CAAA,EAAA,MAAA;EACC;;;SAzDM,OAAA,CAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAgDC,SAAA;;;;;;;;;GASb,iBAAc,mBAAA,CAAA,GAAA,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"login-page.mjs","names":["React"],"sources":["../../../../src/client/views/pages/login-page.tsx"],"sourcesContent":["/**\n * Login Page\n *\n * Default login page that uses AuthLayout and LoginForm.\n * Integrates with authClient from AdminProvider context.\n *\n * Automatically redirects to setup page if no users exist.\n */\n\nimport * as React from \"react\";\nimport { useAuthClient } from \"../../hooks/use-auth\";\nimport { useSetupStatus } from \"../../hooks/use-setup-status\";\nimport {\n selectBasePath,\n selectBrandName,\n selectNavigate,\n useAdminStore,\n} from \"../../runtime/provider\";\nimport { AuthLayout } from \"../auth/auth-layout\";\nimport { LoginForm, type LoginFormValues } from \"../auth/login-form\";\n\nexport interface LoginPageProps {\n /**\n * Title shown on the login page\n * @default \"Sign in\"\n */\n title?: string;\n\n /**\n * Description shown below the title\n * @default \"Enter your credentials to access the admin panel\"\n */\n description?: string;\n\n /**\n * Logo component to show above the form\n */\n logo?: React.ReactNode;\n\n /**\n * Path to redirect after successful login\n * @default basePath (e.g., \"/admin\")\n */\n redirectTo?: string;\n\n /**\n * Path to forgot password page\n * @default \"{basePath}/forgot-password\"\n */\n forgotPasswordPath?: string;\n\n /**\n * Path to sign up page (if enabled)\n */\n signUpPath?: string;\n\n /**\n * Show forgot password link\n * @default true\n */\n showForgotPassword?: boolean;\n\n /**\n * Show sign up link\n * @default false\n */\n showSignUp?: boolean;\n}\n\n/**\n * Default login page component.\n *\n * Uses authClient from AdminProvider to handle authentication.\n * Automatically redirects to setup page if no users exist.\n *\n * @example\n * ```tsx\n * // In your admin config\n * const admin = qa<AppCMS>()\n * .use(adminModule)\n * .pages({\n * login: page(\"login\", { component: LoginPage }).path(\"/login\"),\n * })\n * ```\n */\nexport function LoginPage({\n title = \"Sign in\",\n description = \"Enter your credentials to access the admin panel\",\n logo,\n redirectTo,\n forgotPasswordPath,\n signUpPath,\n showForgotPassword = true,\n showSignUp = false,\n}: LoginPageProps) {\n const authClient = useAuthClient();\n const navigate = useAdminStore(selectNavigate);\n const basePath = useAdminStore(selectBasePath);\n const brandName = useAdminStore(selectBrandName);\n\n const [error, setError] = React.useState<string | null>(null);\n\n // Check if setup is required (no users exist)\n const { data: setupStatus, isLoading: isCheckingSetup } = useSetupStatus();\n\n // Redirect to setup page if no users exist\n React.useEffect(() => {\n if (!isCheckingSetup && setupStatus?.required) {\n navigate(`${basePath}/setup`);\n }\n }, [isCheckingSetup, setupStatus, navigate, basePath]);\n\n const handleSubmit = async (values: LoginFormValues) => {\n setError(null);\n\n try {\n const result = await authClient.signIn.email({\n email: values.email,\n password: values.password,\n });\n\n if (result.error) {\n setError(result.error.message || \"Invalid credentials\");\n return;\n }\n\n // Redirect on success\n navigate(redirectTo ?? basePath);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"An error occurred\");\n }\n };\n\n const handleForgotPasswordClick = () => {\n navigate(forgotPasswordPath ?? `${basePath}/forgot-password`);\n };\n\n const handleSignUpClick = () => {\n if (signUpPath) {\n navigate(signUpPath);\n }\n };\n\n return (\n <AuthLayout\n title={title}\n description={description}\n logo={logo ?? <DefaultLogo brandName={brandName} />}\n >\n <LoginForm\n onSubmit={handleSubmit}\n onForgotPasswordClick={handleForgotPasswordClick}\n onSignUpClick={handleSignUpClick}\n showForgotPassword={showForgotPassword}\n showSignUp={showSignUp}\n error={error}\n />\n </AuthLayout>\n );\n}\n\nfunction DefaultLogo({ brandName }: { brandName: string }) {\n return (\n <div className=\"text-center\">\n <h1 className=\"text-xl font-bold\">{brandName}</h1>\n </div>\n );\n}\n\nexport default LoginPage;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqFA,SAAgB,UAAU,EACxB,QAAQ,WACR,cAAc,oDACd,MACA,YACA,oBACA,YACA,qBAAqB,MACrB,aAAa,SACI;CACjB,MAAM,aAAa,eAAe;CAClC,MAAM,WAAW,cAAc,eAAe;CAC9C,MAAM,WAAW,cAAc,eAAe;CAC9C,MAAM,YAAY,cAAc,gBAAgB;CAEhD,MAAM,CAAC,OAAO,YAAYA,QAAM,SAAwB,KAAK;CAG7D,MAAM,EAAE,MAAM,aAAa,WAAW,oBAAoB,gBAAgB;AAG1E,SAAM,gBAAgB;AACpB,MAAI,CAAC,mBAAmB,aAAa,SACnC,UAAS,GAAG,SAAS,QAAQ;IAE9B;EAAC;EAAiB;EAAa;EAAU;EAAS,CAAC;CAEtD,MAAM,eAAe,OAAO,WAA4B;AACtD,WAAS,KAAK;AAEd,MAAI;GACF,MAAM,SAAS,MAAM,WAAW,OAAO,MAAM;IAC3C,OAAO,OAAO;IACd,UAAU,OAAO;IAClB,CAAC;AAEF,OAAI,OAAO,OAAO;AAChB,aAAS,OAAO,MAAM,WAAW,sBAAsB;AACvD;;AAIF,YAAS,cAAc,SAAS;WACzB,KAAK;AACZ,YAAS,eAAe,QAAQ,IAAI,UAAU,oBAAoB;;;CAItE,MAAM,kCAAkC;AACtC,WAAS,sBAAsB,GAAG,SAAS,kBAAkB;;CAG/D,MAAM,0BAA0B;AAC9B,MAAI,WACF,UAAS,WAAW;;AAIxB,QACE,oBAAC;EACQ;EACM;EACb,MAAM,QAAQ,oBAAC,eAAuB,YAAa;YAEnD,oBAAC;GACC,UAAU;GACV,uBAAuB;GACvB,eAAe;GACK;GACR;GACL;IACP;GACS;;AAIjB,SAAS,YAAY,EAAE,aAAoC;AACzD,QACE,oBAAC;EAAI,WAAU;YACb,oBAAC;GAAG,WAAU;aAAqB;IAAe;GAC9C;;AAIV,yBAAe"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reset-password-page.d.mts","names":[],"sources":["../../../../src/client/views/pages/reset-password-page.tsx"],"sourcesContent":[],"mappings":";;;;;;;UAsBiB,sBAAA;;;AAAjB;AAsDA;EACE,KAAA,CAAA,EAAA,MAAA;EACA;;;;EAIA,WAAA,CAAA,EAAA,MAAA;EACC;;;SA7CM,OAAA,CAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAsCC,iBAAA;;;;;;;GAOb,yBAAsB,mBAAA,CAAA,GAAA,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reset-password-page.mjs","names":["React"],"sources":["../../../../src/client/views/pages/reset-password-page.tsx"],"sourcesContent":["/**\n * Reset Password Page\n *\n * Default reset password page that uses AuthLayout and ResetPasswordForm.\n * Integrates with authClient from AdminProvider context.\n */\n\nimport * as React from \"react\";\nimport { Button } from \"../../components/ui/button\";\nimport { useAuthClient } from \"../../hooks/use-auth\";\nimport {\n selectBasePath,\n selectBrandName,\n selectNavigate,\n useAdminStore,\n} from \"../../runtime/provider\";\nimport { AuthLayout } from \"../auth/auth-layout\";\nimport {\n ResetPasswordForm,\n type ResetPasswordFormValues,\n} from \"../auth/reset-password-form\";\n\nexport interface ResetPasswordPageProps {\n /**\n * Title shown on the page\n * @default \"Reset password\"\n */\n title?: string;\n\n /**\n * Description shown below the title\n * @default \"Enter your new password\"\n */\n description?: string;\n\n /**\n * Logo component to show above the form\n */\n logo?: React.ReactNode;\n\n /**\n * Path to login page\n * @default \"{basePath}/login\"\n */\n loginPath?: string;\n\n /**\n * Minimum password length\n * @default 8\n */\n minPasswordLength?: number;\n\n /**\n * Function to get token from URL.\n * By default, reads from URL search params (?token=...)\n */\n getToken?: () => string | null;\n}\n\n/**\n * Default reset password page component.\n *\n * Uses authClient from AdminProvider to handle password reset.\n * Expects a token in the URL query params (?token=...).\n *\n * @example\n * ```tsx\n * // In your admin config\n * const admin = qa<AppCMS>()\n * .use(coreAdminModule)\n * .pages({\n * resetPassword: page(\"reset-password\", { component: ResetPasswordPage })\n * .path(\"/reset-password\"),\n * })\n * ```\n */\nexport function ResetPasswordPage({\n title = \"Reset password\",\n description = \"Enter your new password\",\n logo,\n loginPath,\n minPasswordLength = 8,\n getToken,\n}: ResetPasswordPageProps) {\n const authClient = useAuthClient();\n const navigate = useAdminStore(selectNavigate);\n const basePath = useAdminStore(selectBasePath);\n const brandName = useAdminStore(selectBrandName);\n\n const [error, setError] = React.useState<string | null>(null);\n\n // Get token from URL\n const token = React.useMemo(() => {\n if (getToken) {\n return getToken();\n }\n if (typeof window !== \"undefined\") {\n const params = new URLSearchParams(window.location.search);\n return params.get(\"token\");\n }\n return null;\n }, [getToken]);\n\n const handleSubmit = async (\n values: ResetPasswordFormValues & { token: string },\n ) => {\n setError(null);\n\n try {\n const result = await authClient.resetPassword({\n token: values.token,\n newPassword: values.password,\n });\n\n if (result.error) {\n setError(result.error.message || \"Failed to reset password\");\n return;\n }\n\n // Success is handled by the form (shows success message)\n } catch (err) {\n setError(err instanceof Error ? err.message : \"An error occurred\");\n }\n };\n\n const handleBackToLoginClick = () => {\n navigate(loginPath ?? `${basePath}/login`);\n };\n\n // Show error if no token\n if (!token) {\n return (\n <AuthLayout\n title=\"Invalid Link\"\n description=\"The password reset link is invalid or has expired.\"\n logo={logo ?? <DefaultLogo brandName={brandName} />}\n >\n <div className=\"space-y-4 text-center\">\n <p className=\"text-muted-foreground text-sm\">\n Please request a new password reset link.\n </p>\n <Button type=\"button\" variant=\"link\" onClick={handleBackToLoginClick}>\n Back to login\n </Button>\n </div>\n </AuthLayout>\n );\n }\n\n return (\n <AuthLayout\n title={title}\n description={description}\n logo={logo ?? <DefaultLogo brandName={brandName} />}\n >\n <ResetPasswordForm\n token={token}\n onSubmit={handleSubmit}\n onBackToLoginClick={handleBackToLoginClick}\n minPasswordLength={minPasswordLength}\n error={error}\n />\n </AuthLayout>\n );\n}\n\nfunction DefaultLogo({ brandName }: { brandName: string }) {\n return (\n <div className=\"text-center\">\n <h1 className=\"text-xl font-bold\">{brandName}</h1>\n </div>\n );\n}\n\nexport default ResetPasswordPage;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4EA,SAAgB,kBAAkB,EAChC,QAAQ,kBACR,cAAc,2BACd,MACA,WACA,oBAAoB,GACpB,YACyB;CACzB,MAAM,aAAa,eAAe;CAClC,MAAM,WAAW,cAAc,eAAe;CAC9C,MAAM,WAAW,cAAc,eAAe;CAC9C,MAAM,YAAY,cAAc,gBAAgB;CAEhD,MAAM,CAAC,OAAO,YAAYA,QAAM,SAAwB,KAAK;CAG7D,MAAM,QAAQA,QAAM,cAAc;AAChC,MAAI,SACF,QAAO,UAAU;AAEnB,MAAI,OAAO,WAAW,YAEpB,QADe,IAAI,gBAAgB,OAAO,SAAS,OAAO,CAC5C,IAAI,QAAQ;AAE5B,SAAO;IACN,CAAC,SAAS,CAAC;CAEd,MAAM,eAAe,OACnB,WACG;AACH,WAAS,KAAK;AAEd,MAAI;GACF,MAAM,SAAS,MAAM,WAAW,cAAc;IAC5C,OAAO,OAAO;IACd,aAAa,OAAO;IACrB,CAAC;AAEF,OAAI,OAAO,OAAO;AAChB,aAAS,OAAO,MAAM,WAAW,2BAA2B;AAC5D;;WAIK,KAAK;AACZ,YAAS,eAAe,QAAQ,IAAI,UAAU,oBAAoB;;;CAItE,MAAM,+BAA+B;AACnC,WAAS,aAAa,GAAG,SAAS,QAAQ;;AAI5C,KAAI,CAAC,MACH,QACE,oBAAC;EACC,OAAM;EACN,aAAY;EACZ,MAAM,QAAQ,oBAAC,eAAuB,YAAa;YAEnD,qBAAC;GAAI,WAAU;cACb,oBAAC;IAAE,WAAU;cAAgC;KAEzC,EACJ,oBAAC;IAAO,MAAK;IAAS,SAAQ;IAAO,SAAS;cAAwB;KAE7D;IACL;GACK;AAIjB,QACE,oBAAC;EACQ;EACM;EACb,MAAM,QAAQ,oBAAC,eAAuB,YAAa;YAEnD,oBAAC;GACQ;GACP,UAAU;GACV,oBAAoB;GACD;GACZ;IACP;GACS;;AAIjB,SAAS,YAAY,EAAE,aAAoC;AACzD,QACE,oBAAC;EAAI,WAAU;YACb,oBAAC;GAAG,WAAU;aAAqB;IAAe;GAC9C;;AAIV,kCAAe"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"setup-page.d.mts","names":[],"sources":["../../../../src/client/views/pages/setup-page.tsx"],"sourcesContent":[],"mappings":";;;;;;;UAkBiB,cAAA;;;AAAjB;AAoDA;EACE,KAAA,CAAA,EAAA,MAAA;EACA;;;;EAIA,WAAA,CAAA,EAAA,MAAA;EACC;;;SA3CM,OAAA,CAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoCC,SAAA;;;;;;;GAOb,iBAAc,mBAAA,CAAA,GAAA,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"setup-page.mjs","names":["React"],"sources":["../../../../src/client/views/pages/setup-page.tsx"],"sourcesContent":["/**\n * Setup Page\n *\n * Default setup page for creating the first admin account.\n * Uses AuthLayout and SetupForm, integrates with client from AdminProvider context.\n */\n\nimport * as React from \"react\";\nimport {\n selectBasePath,\n selectBrandName,\n selectClient,\n selectNavigate,\n useAdminStore,\n} from \"../../runtime/provider\";\nimport { AuthLayout } from \"../auth/auth-layout\";\nimport { SetupForm, type SetupFormValues } from \"../auth/setup-form\";\n\nexport interface SetupPageProps {\n /**\n * Title shown on the setup page\n * @default \"Welcome\"\n */\n title?: string;\n\n /**\n * Description shown below the title\n * @default \"Create your admin account to get started\"\n */\n description?: string;\n\n /**\n * Logo component to show above the form\n */\n logo?: React.ReactNode;\n\n /**\n * Path to redirect after successful setup\n * @default \"{basePath}/login\"\n */\n redirectTo?: string;\n\n /**\n * Path to login page (shown in footer)\n * @default \"{basePath}/login\"\n */\n loginPath?: string;\n\n /**\n * Show \"Already have an account?\" link\n * @default true\n */\n showLoginLink?: boolean;\n}\n\n/**\n * Default setup page component.\n *\n * Uses client from AdminProvider to call createFirstAdmin RPC function.\n *\n * @example\n * ```tsx\n * // In your admin config\n * const admin = qa<AppCMS>()\n * .use(coreAdminModule)\n * .pages({\n * setup: page(\"setup\", { component: SetupPage }).path(\"/setup\"),\n * })\n * ```\n */\nexport function SetupPage({\n title = \"Welcome\",\n description = \"Create your admin account to get started\",\n logo,\n redirectTo,\n loginPath,\n showLoginLink = true,\n}: SetupPageProps) {\n const client = useAdminStore(selectClient);\n const navigate = useAdminStore(selectNavigate);\n const basePath = useAdminStore(selectBasePath);\n const brandName = useAdminStore(selectBrandName);\n\n const [error, setError] = React.useState<string | null>(null);\n\n const handleSubmit = async (values: SetupFormValues) => {\n setError(null);\n\n try {\n const result = await (client as any).rpc.createFirstAdmin({\n email: values.email,\n password: values.password,\n name: values.name,\n });\n\n if (!result.success) {\n setError(result.error ?? \"Failed to create admin account\");\n return;\n }\n\n // Redirect to login on success\n navigate(redirectTo ?? `${basePath}/login`);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"An error occurred\");\n }\n };\n\n const handleLoginClick = () => {\n navigate(loginPath ?? `${basePath}/login`);\n };\n\n return (\n <AuthLayout\n title={title}\n description={description}\n logo={logo ?? <DefaultLogo brandName={brandName} />}\n footer={\n showLoginLink && (\n <p className=\"text-muted-foreground text-center text-xs\">\n Already have an account?{\" \"}\n <button\n type=\"button\"\n onClick={handleLoginClick}\n className=\"text-primary hover:underline\"\n >\n Sign in\n </button>\n </p>\n )\n }\n >\n <SetupForm onSubmit={handleSubmit} error={error} />\n </AuthLayout>\n );\n}\n\nfunction DefaultLogo({ brandName }: { brandName: string }) {\n return (\n <div className=\"text-center\">\n <h1 className=\"text-xl font-bold\">{brandName}</h1>\n </div>\n );\n}\n\nexport default SetupPage;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsEA,SAAgB,UAAU,EACxB,QAAQ,WACR,cAAc,4CACd,MACA,YACA,WACA,gBAAgB,QACC;CACjB,MAAM,SAAS,cAAc,aAAa;CAC1C,MAAM,WAAW,cAAc,eAAe;CAC9C,MAAM,WAAW,cAAc,eAAe;CAC9C,MAAM,YAAY,cAAc,gBAAgB;CAEhD,MAAM,CAAC,OAAO,YAAYA,QAAM,SAAwB,KAAK;CAE7D,MAAM,eAAe,OAAO,WAA4B;AACtD,WAAS,KAAK;AAEd,MAAI;GACF,MAAM,SAAS,MAAO,OAAe,IAAI,iBAAiB;IACxD,OAAO,OAAO;IACd,UAAU,OAAO;IACjB,MAAM,OAAO;IACd,CAAC;AAEF,OAAI,CAAC,OAAO,SAAS;AACnB,aAAS,OAAO,SAAS,iCAAiC;AAC1D;;AAIF,YAAS,cAAc,GAAG,SAAS,QAAQ;WACpC,KAAK;AACZ,YAAS,eAAe,QAAQ,IAAI,UAAU,oBAAoB;;;CAItE,MAAM,yBAAyB;AAC7B,WAAS,aAAa,GAAG,SAAS,QAAQ;;AAG5C,QACE,oBAAC;EACQ;EACM;EACb,MAAM,QAAQ,oBAAC,eAAuB,YAAa;EACnD,QACE,iBACE,qBAAC;GAAE,WAAU;;IAA4C;IAC9B;IACzB,oBAAC;KACC,MAAK;KACL,SAAS;KACT,WAAU;eACX;MAEQ;;IACP;YAIR,oBAAC;GAAU,UAAU;GAAqB;IAAS;GACxC;;AAIjB,SAAS,YAAY,EAAE,aAAoC;AACzD,QACE,oBAAC;EAAI,WAAU;YACb,oBAAC;GAAG,WAAU;aAAqB;IAAe;GAC9C;;AAIV,yBAAe"}
|
package/dist/client.d.mts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.mts","names":[],"sources":["../src/exports/client.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwUY,KA5BA,eA4BmB,CAAA,aA5BU,QA4BV,CAAA,GAAA,CAAA,CAAA,GAAA,MA3BxB,IA2BwB,CAAA,QAAA,CAAA,CAAA,aAAA,CAAA,GAAA,MAAA;;;;AAIZ,KA1BP,WA0BO,CAAA,aA1BkB,QA0BlB,CAAA,GAAA,CAAA,CAAA,GAzBlB,IAyBkB,SAzBL,QAyBK,CAAA,KAAA,QAAA,CAAA,GAAA,MAxBT,OAwBS,CAAA,SAAA,CAAA,GAAA,MAAA,GAAA,KAAA;;;;KAlBP,4BACE,6BACC,gBAAgB,SAC3B,aAAa,gBACd,QACA,WAAW,eAAe,qBAAqB;QAC9B;;;;;KAQR,iCACE,iDAEV,8BAA8B,6CAC/B,gBAAgB;;UAER"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rich-text-renderer.d.mts","names":[],"sources":["../../../src/components/rich-text/rich-text-renderer.tsx"],"sourcesContent":[],"mappings":";;;;;;AAOY,KAAA,UAAA,GAAU;EAEX,IAAA,EAAA,MAAA;EAE4B,OAAA,CAAA,EAF5B,UAE4B,EAAA;EAA9B,IAAA,CAAA,EAAA,MAAA;EACA,KAAA,CAAA,EADA,KACA,CAAA;IAAM,IAAA,EAAA,MAAA;IAGH,KAAA,CAAA,EAJ2B,MAIlB,CAAA,MAEV,EAAA,GAAA,CAAA;EAMM,CAAA,CAAA;EA0DP,KAAA,CAAA,EArED,MAqEC,CAAA,MAAA,EAAA,GAAqB,CAAA;CAIrB;AAIQ,KA1EN,SAAA,GA0EM;EAAR,IAAA,EAAA,KAAA;EAAO,OAAA,CAAA,EAxEN,UAwEM,EAAA;AA8QjB,CAAA;;;;AAIG,UApVc,cAAA,CAoVd;EAAqB,GAAA,CAAA,EAAA,MAAA;EAAA,SAAA,CAAA,EAAA,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;UA1Rd,qBAAA;;;;WAIA;;;;WAIA,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA8QF,gBAAA;;UAEP;;GAEN,wBAAqB,mBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rich-text-renderer.mjs","names":["defaultStyles: RichTextStyles","textNode: ReactNode"],"sources":["../../../src/components/rich-text/rich-text-renderer.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\n\nimport { cn } from \"#questpie/admin/client/lib/utils\";\n\n/**\n * TipTap JSON node types\n */\nexport type TipTapNode = {\n\ttype: string;\n\tcontent?: TipTapNode[];\n\ttext?: string;\n\tmarks?: Array<{ type: string; attrs?: Record<string, any> }>;\n\tattrs?: Record<string, any>;\n};\n\nexport type TipTapDoc = {\n\ttype: \"doc\";\n\tcontent?: TipTapNode[];\n};\n\n/**\n * Style configuration for rich text elements\n */\nexport interface RichTextStyles {\n\tdoc?: string;\n\tparagraph?: string;\n\theading1?: string;\n\theading2?: string;\n\theading3?: string;\n\theading4?: string;\n\theading5?: string;\n\theading6?: string;\n\tblockquote?: string;\n\tcodeBlock?: string;\n\tbulletList?: string;\n\torderedList?: string;\n\tlistItem?: string;\n\tlink?: string;\n\timage?: string;\n\ttableWrapper?: string;\n\ttable?: string;\n\ttableRow?: string;\n\ttableCell?: string;\n\ttableHeader?: string;\n\thorizontalRule?: string;\n\tbold?: string;\n\titalic?: string;\n\tcode?: string;\n\tstrike?: string;\n\tunderline?: string;\n}\n\nconst defaultStyles: RichTextStyles = {\n\tdoc: \"prose prose-sm max-w-none\",\n\tparagraph: \"mb-4 last:mb-0\",\n\theading1: \"text-3xl font-bold mb-4\",\n\theading2: \"text-2xl font-bold mb-3\",\n\theading3: \"text-xl font-semibold mb-3\",\n\theading4: \"text-lg font-semibold mb-2\",\n\theading5: \"text-base font-semibold mb-2\",\n\theading6: \"text-sm font-semibold mb-2\",\n\tblockquote: \"border-l-4 border-gray-300 pl-4 italic my-4\",\n\tcodeBlock: \"bg-muted rounded p-4 font-mono text-sm my-4 overflow-x-auto\",\n\tbulletList: \"list-disc list-inside mb-4\",\n\torderedList: \"list-decimal list-inside mb-4\",\n\tlistItem: \"mb-1\",\n\tlink: \"text-primary hover:text-primary/80 underline\",\n\timage: \"my-4 rounded-lg\",\n\ttableWrapper: \"my-4 overflow-x-auto\",\n\ttable: \"w-full border-collapse\",\n\ttableRow: \"border-b\",\n\ttableCell: \"border border-border px-3 py-2 align-top\",\n\ttableHeader: \"border border-border px-3 py-2 text-left font-semibold\",\n\thorizontalRule: \"my-4 border-t border-border\",\n\tbold: \"font-bold\",\n\titalic: \"italic\",\n\tcode: \"bg-muted rounded px-1 py-0.5 font-mono text-sm\",\n\tstrike: \"line-through\",\n\tunderline: \"underline\",\n};\n\ninterface RichTextRendererProps {\n\t/**\n\t * TipTap JSON content to render\n\t */\n\tcontent: TipTapDoc | null | undefined;\n\t/**\n\t * Custom styles for elements\n\t */\n\tstyles?: Partial<RichTextStyles>;\n\t/**\n\t * Additional className for the root element\n\t */\n\tclassName?: string;\n}\n\n/**\n * Renders a single TipTap node\n */\nfunction renderNode(\n\tnode: TipTapNode,\n\tindex: number,\n\tstyles: RichTextStyles,\n): ReactNode {\n\t// Text node\n\tif (node.text !== undefined) {\n\t\tlet textNode: ReactNode = node.text;\n\n\t\t// Apply marks (bold, italic, etc.)\n\t\tif (node.marks) {\n\t\t\tfor (const mark of node.marks) {\n\t\t\t\tswitch (mark.type) {\n\t\t\t\t\tcase \"bold\":\n\t\t\t\t\t\ttextNode = (\n\t\t\t\t\t\t\t<strong key={index} className={styles.bold}>\n\t\t\t\t\t\t\t\t{textNode}\n\t\t\t\t\t\t\t</strong>\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"italic\":\n\t\t\t\t\t\ttextNode = (\n\t\t\t\t\t\t\t<em key={index} className={styles.italic}>\n\t\t\t\t\t\t\t\t{textNode}\n\t\t\t\t\t\t\t</em>\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"code\":\n\t\t\t\t\t\ttextNode = (\n\t\t\t\t\t\t\t<code key={index} className={styles.code}>\n\t\t\t\t\t\t\t\t{textNode}\n\t\t\t\t\t\t\t</code>\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"strike\":\n\t\t\t\t\t\ttextNode = (\n\t\t\t\t\t\t\t<s key={index} className={styles.strike}>\n\t\t\t\t\t\t\t\t{textNode}\n\t\t\t\t\t\t\t</s>\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"underline\":\n\t\t\t\t\t\ttextNode = (\n\t\t\t\t\t\t\t<u key={index} className={styles.underline}>\n\t\t\t\t\t\t\t\t{textNode}\n\t\t\t\t\t\t\t</u>\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"link\": {\n\t\t\t\t\t\tconst href = mark.attrs?.href as string | undefined;\n\t\t\t\t\t\tconst target = mark.attrs?.target as string | undefined;\n\t\t\t\t\t\tconst rel =\n\t\t\t\t\t\t\t(mark.attrs?.rel as string | undefined) ||\n\t\t\t\t\t\t\t(target === \"_blank\" ? \"noopener noreferrer\" : undefined);\n\t\t\t\t\t\ttextNode = (\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\t\t\thref={href}\n\t\t\t\t\t\t\t\ttarget={target}\n\t\t\t\t\t\t\t\trel={rel}\n\t\t\t\t\t\t\t\tclassName={styles.link}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{textNode}\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn textNode;\n\t}\n\n\t// Block nodes\n\tconst children = node.content?.map((child, i) =>\n\t\trenderNode(child, i, styles),\n\t);\n\n\tswitch (node.type) {\n\t\tcase \"doc\":\n\t\t\treturn <div key={index}>{children}</div>;\n\n\t\tcase \"paragraph\": {\n\t\t\tconst paragraphAlign = node.attrs?.textAlign as\n\t\t\t\t| \"left\"\n\t\t\t\t| \"center\"\n\t\t\t\t| \"right\"\n\t\t\t\t| \"justify\"\n\t\t\t\t| undefined;\n\t\t\treturn (\n\t\t\t\t<p\n\t\t\t\t\tkey={index}\n\t\t\t\t\tclassName={styles.paragraph}\n\t\t\t\t\tstyle={paragraphAlign ? { textAlign: paragraphAlign } : undefined}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</p>\n\t\t\t);\n\t\t}\n\n\t\tcase \"heading\": {\n\t\t\tconst level = Math.min(\n\t\t\t\t6,\n\t\t\t\tMath.max(1, (node.attrs?.level as number) || 1),\n\t\t\t);\n\t\t\tconst headingAlign = node.attrs?.textAlign as\n\t\t\t\t| \"left\"\n\t\t\t\t| \"center\"\n\t\t\t\t| \"right\"\n\t\t\t\t| \"justify\"\n\t\t\t\t| undefined;\n\t\t\tconst headingClass =\n\t\t\t\tstyles[`heading${level}` as keyof RichTextStyles] || styles.heading1;\n\t\t\ttype HeadingTagName = \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n\t\t\tconst HeadingTag = `h${level}` as HeadingTagName;\n\t\t\treturn (\n\t\t\t\t<HeadingTag\n\t\t\t\t\tkey={index}\n\t\t\t\t\tclassName={headingClass}\n\t\t\t\t\tstyle={headingAlign ? { textAlign: headingAlign } : undefined}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</HeadingTag>\n\t\t\t);\n\t\t}\n\n\t\tcase \"blockquote\":\n\t\t\treturn (\n\t\t\t\t<blockquote key={index} className={styles.blockquote}>\n\t\t\t\t\t{children}\n\t\t\t\t</blockquote>\n\t\t\t);\n\n\t\tcase \"codeBlock\":\n\t\t\treturn (\n\t\t\t\t<pre key={index} className={styles.codeBlock}>\n\t\t\t\t\t<code>{children}</code>\n\t\t\t\t</pre>\n\t\t\t);\n\n\t\tcase \"bulletList\":\n\t\t\treturn (\n\t\t\t\t<ul key={index} className={styles.bulletList}>\n\t\t\t\t\t{children}\n\t\t\t\t</ul>\n\t\t\t);\n\n\t\tcase \"orderedList\":\n\t\t\treturn (\n\t\t\t\t<ol key={index} className={styles.orderedList}>\n\t\t\t\t\t{children}\n\t\t\t\t</ol>\n\t\t\t);\n\n\t\tcase \"listItem\":\n\t\t\treturn (\n\t\t\t\t<li key={index} className={styles.listItem}>\n\t\t\t\t\t{children}\n\t\t\t\t</li>\n\t\t\t);\n\n\t\tcase \"hardBreak\":\n\t\t\treturn <br key={index} />;\n\n\t\tcase \"horizontalRule\":\n\t\t\treturn <hr key={index} className={styles.horizontalRule} />;\n\n\t\tcase \"image\": {\n\t\t\tconst src = node.attrs?.src as string | undefined;\n\t\t\tif (!src) return null;\n\t\t\treturn (\n\t\t\t\t<img\n\t\t\t\t\tkey={index}\n\t\t\t\t\tsrc={src}\n\t\t\t\t\talt={(node.attrs?.alt as string | undefined) || \"\"}\n\t\t\t\t\ttitle={node.attrs?.title as string | undefined}\n\t\t\t\t\tclassName={styles.image}\n\t\t\t\t\tloading=\"lazy\"\n\t\t\t\t/>\n\t\t\t);\n\t\t}\n\n\t\tcase \"table\":\n\t\t\treturn (\n\t\t\t\t<div key={index} className={styles.tableWrapper}>\n\t\t\t\t\t<table className={styles.table}>\n\t\t\t\t\t\t<tbody>{children}</tbody>\n\t\t\t\t\t</table>\n\t\t\t\t</div>\n\t\t\t);\n\n\t\tcase \"tableRow\":\n\t\t\treturn (\n\t\t\t\t<tr key={index} className={styles.tableRow}>\n\t\t\t\t\t{children}\n\t\t\t\t</tr>\n\t\t\t);\n\n\t\tcase \"tableCell\":\n\t\t\treturn (\n\t\t\t\t<td\n\t\t\t\t\tkey={index}\n\t\t\t\t\tclassName={styles.tableCell}\n\t\t\t\t\tcolSpan={node.attrs?.colspan as number | undefined}\n\t\t\t\t\trowSpan={node.attrs?.rowspan as number | undefined}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</td>\n\t\t\t);\n\n\t\tcase \"tableHeader\":\n\t\t\treturn (\n\t\t\t\t<th\n\t\t\t\t\tkey={index}\n\t\t\t\t\tclassName={styles.tableHeader}\n\t\t\t\t\tcolSpan={node.attrs?.colspan as number | undefined}\n\t\t\t\t\trowSpan={node.attrs?.rowspan as number | undefined}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</th>\n\t\t\t);\n\n\t\tdefault:\n\t\t\t// Unknown node type - render children if available\n\t\t\treturn children ? <div key={index}>{children}</div> : null;\n\t}\n}\n\n/**\n * RichTextRenderer Component\n *\n * Renders TipTap JSON content with customizable styles.\n *\n * @example\n * ```tsx\n * const content = {\n * type: \"doc\",\n * content: [\n * {\n * type: \"paragraph\",\n * content: [{ type: \"text\", text: \"Hello world\" }]\n * }\n * ]\n * };\n *\n * <RichTextRenderer content={content} />\n * ```\n *\n * @example With custom styles\n * ```tsx\n * <RichTextRenderer\n * content={content}\n * styles={{\n * paragraph: \"text-lg leading-relaxed\",\n * heading1: \"text-4xl font-black\"\n * }}\n * />\n * ```\n */\nexport function RichTextRenderer({\n\tcontent,\n\tstyles: customStyles,\n\tclassName,\n}: RichTextRendererProps) {\n\tif (!content || !content.content || content.content.length === 0) {\n\t\treturn null;\n\t}\n\n\tconst styles = { ...defaultStyles, ...customStyles };\n\n\treturn (\n\t\t<div className={cn(styles.doc, className)}>\n\t\t\t{content.content.map((node, i) => renderNode(node, i, styles))}\n\t\t</div>\n\t);\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"nextjs.d.mts","names":[],"sources":["../../../src/server/adapters/nextjs.ts"],"sourcesContent":[],"mappings":";;;;;;;;UA8BiB,yBAAA;;;;OAIV;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAgES,wBAAA;;;;;;;GAYb,sCACyC,YAAU,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAyFxC,mBAAA;;;;WAIX;OACJ;IACN,QADc,WAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"nextjs.mjs","names":[],"sources":["../../../src/server/adapters/nextjs.ts"],"sourcesContent":["/**\n * Next.js Adapter\n *\n * Convenience helpers for Next.js middleware integration.\n *\n * @example App Router middleware\n * ```ts\n * // middleware.ts\n * import { createNextAuthMiddleware } from \"@questpie/admin/server/adapters/nextjs\";\n * import { cms } from \"./questpie/server/cms\";\n *\n * export default createNextAuthMiddleware({\n * cms,\n * loginPath: \"/admin/login\",\n * protectedPaths: [\"/admin\"],\n * publicPaths: [\"/admin/login\", \"/admin/forgot-password\"],\n * });\n *\n * export const config = {\n * matcher: [\"/admin/:path*\"],\n * };\n * ```\n */\n\nimport type { Questpie } from \"questpie\";\nimport { getAdminSession, requireAdminAuth } from \"../auth-helpers.js\";\n\n/**\n * Options for Next.js auth middleware\n */\nexport interface NextAuthMiddlewareOptions {\n /**\n * The CMS instance with auth configured\n */\n cms: Questpie<any>;\n\n /**\n * Path to redirect to when not authenticated\n * @default \"/admin/login\"\n */\n loginPath?: string;\n\n /**\n * Required role for access\n * @default \"admin\"\n */\n requiredRole?: string;\n\n /**\n * Paths that require authentication (uses startsWith matching)\n * @default [\"/admin\"]\n */\n protectedPaths?: string[];\n\n /**\n * Paths within protectedPaths that should be publicly accessible\n * @default [\"/admin/login\", \"/admin/forgot-password\", \"/admin/reset-password\", \"/admin/accept-invite\"]\n */\n publicPaths?: string[];\n\n /**\n * Query parameter name for redirect URL\n * @default \"redirect\"\n */\n redirectParam?: string;\n}\n\n/**\n * Check if a path matches any of the given patterns\n */\nfunction pathMatches(pathname: string, patterns: string[]): boolean {\n return patterns.some(\n (pattern) =>\n pathname === pattern ||\n pathname.startsWith(`${pattern}/`) ||\n pathname.startsWith(pattern),\n );\n}\n\n/**\n * Create a Next.js middleware for admin authentication.\n *\n * @example\n * ```ts\n * // middleware.ts\n * import { createNextAuthMiddleware } from \"@questpie/admin/server/adapters/nextjs\";\n * import { cms } from \"./questpie/server/cms\";\n *\n * export default createNextAuthMiddleware({\n * cms,\n * loginPath: \"/admin/login\",\n * });\n *\n * export const config = {\n * matcher: [\"/admin/:path*\"],\n * };\n * ```\n */\nexport function createNextAuthMiddleware({\n cms,\n loginPath = \"/admin/login\",\n requiredRole = \"admin\",\n protectedPaths = [\"/admin\"],\n publicPaths = [\n \"/admin/login\",\n \"/admin/forgot-password\",\n \"/admin/reset-password\",\n \"/admin/accept-invite\",\n ],\n redirectParam = \"redirect\",\n}: NextAuthMiddlewareOptions) {\n return async function middleware(request: Request): Promise<Response> {\n const url = new URL(request.url);\n const pathname = url.pathname;\n\n // Check if this is a protected path\n const isProtected = pathMatches(pathname, protectedPaths);\n const isPublic = pathMatches(pathname, publicPaths);\n\n // If not protected or is public, continue\n if (!isProtected || isPublic) {\n // Return a \"continue\" response\n // In Next.js middleware, returning undefined or NextResponse.next() continues\n // Since we're using standard Response, we'll return a special header\n return new Response(null, {\n status: 200,\n headers: {\n \"x-middleware-next\": \"1\",\n },\n });\n }\n\n // Check authentication\n const redirect = await requireAdminAuth({\n request,\n cms,\n loginPath,\n requiredRole,\n redirectParam,\n });\n\n if (redirect) {\n return redirect;\n }\n\n // Authenticated - continue\n return new Response(null, {\n status: 200,\n headers: {\n \"x-middleware-next\": \"1\",\n },\n });\n };\n}\n\n/**\n * Get the admin session in a Next.js server component or API route.\n *\n * @example Server Component\n * ```tsx\n * // app/admin/layout.tsx\n * import { getNextAdminSession } from \"@questpie/admin/server/adapters/nextjs\";\n * import { headers } from \"next/headers\";\n * import { cms } from \"~/questpie/server/cms\";\n *\n * export default async function AdminLayout({ children }) {\n * const headersList = headers();\n * const session = await getNextAdminSession({\n * headers: headersList,\n * cms,\n * });\n *\n * if (!session) {\n * redirect(\"/admin/login\");\n * }\n *\n * return <div>{children}</div>;\n * }\n * ```\n *\n * @example API Route\n * ```ts\n * // app/api/admin/users/route.ts\n * import { getNextAdminSession } from \"@questpie/admin/server/adapters/nextjs\";\n * import { cms } from \"~/questpie/server/cms\";\n *\n * export async function GET(request: Request) {\n * const session = await getNextAdminSession({\n * headers: request.headers,\n * cms,\n * });\n *\n * if (!session || session.user.role !== \"admin\") {\n * return Response.json({ error: \"Unauthorized\" }, { status: 401 });\n * }\n *\n * // ... handle request\n * }\n * ```\n */\nexport async function getNextAdminSession({\n headers,\n cms,\n}: {\n headers: Headers;\n cms: Questpie<any>;\n}) {\n // Create a minimal request object for getAdminSession\n const request = new Request(\"http://localhost\", { headers });\n return getAdminSession({ request, cms });\n}\n"],"mappings":";;;;;;AAsEA,SAAS,YAAY,UAAkB,UAA6B;AAClE,QAAO,SAAS,MACb,YACC,aAAa,WACb,SAAS,WAAW,GAAG,QAAQ,GAAG,IAClC,SAAS,WAAW,QAAQ,CAC/B;;;;;;;;;;;;;;;;;;;;;AAsBH,SAAgB,yBAAyB,EACvC,KACA,YAAY,gBACZ,eAAe,SACf,iBAAiB,CAAC,SAAS,EAC3B,cAAc;CACZ;CACA;CACA;CACA;CACD,EACD,gBAAgB,cACY;AAC5B,QAAO,eAAe,WAAW,SAAqC;EAEpE,MAAM,WADM,IAAI,IAAI,QAAQ,IAAI,CACX;EAGrB,MAAM,cAAc,YAAY,UAAU,eAAe;EACzD,MAAM,WAAW,YAAY,UAAU,YAAY;AAGnD,MAAI,CAAC,eAAe,SAIlB,QAAO,IAAI,SAAS,MAAM;GACxB,QAAQ;GACR,SAAS,EACP,qBAAqB,KACtB;GACF,CAAC;EAIJ,MAAM,WAAW,MAAM,iBAAiB;GACtC;GACA;GACA;GACA;GACA;GACD,CAAC;AAEF,MAAI,SACF,QAAO;AAIT,SAAO,IAAI,SAAS,MAAM;GACxB,QAAQ;GACR,SAAS,EACP,qBAAqB,KACtB;GACF,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiDN,eAAsB,oBAAoB,EACxC,SACA,OAIC;AAGD,QAAO,gBAAgB;EAAE,SADT,IAAI,QAAQ,oBAAoB,EAAE,SAAS,CAAC;EAC1B;EAAK,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tanstack.d.mts","names":[],"sources":["../../../src/server/adapters/tanstack.ts"],"sourcesContent":[],"mappings":";;;;;;;AAkJ4C,UA5H3B,wBAAA,CA4H2B;;;;OAxHrC;;;;;;;;;;;;;;;;;;;;UAwBU,iBAAA;;aAEJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAyCG,uBAAA;;;;;GAKb;;GAC6C,sBAAiB;;;;;;;;;;;;;;;;;;;;;iBA8CjD,2BAAA;;;OAA4C;;;GAChB,sBAAiB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tanstack.mjs","names":[],"sources":["../../../src/server/adapters/tanstack.ts"],"sourcesContent":["/**\n * TanStack Router Adapter\n *\n * Convenience helpers for TanStack Router/Start integration.\n *\n * @example\n * ```ts\n * import { createTanStackAuthGuard } from \"@questpie/admin/server/adapters/tanstack\";\n * import { cms } from \"~/questpie/server/cms\";\n *\n * export const Route = createFileRoute(\"/admin\")({\n * beforeLoad: createTanStackAuthGuard({ cms, loginPath: \"/admin/login\" }),\n * });\n * ```\n */\n\nimport type { Questpie } from \"questpie\";\nimport { requireAdminAuth } from \"../auth-helpers.js\";\n\n/**\n * Options for TanStack auth guard\n */\nexport interface TanStackAuthGuardOptions {\n /**\n * The CMS instance with auth configured\n */\n cms: Questpie<any>;\n\n /**\n * Path to redirect to when not authenticated\n * @default \"/admin/login\"\n */\n loginPath?: string;\n\n /**\n * Required role for access\n * @default \"admin\"\n */\n requiredRole?: string;\n\n /**\n * Query parameter name for redirect URL\n * @default \"redirect\"\n */\n redirectParam?: string;\n}\n\n/**\n * Context passed to TanStack Router beforeLoad\n */\nexport interface BeforeLoadContext {\n context: {\n request: Request;\n [key: string]: unknown;\n };\n [key: string]: unknown;\n}\n\n/**\n * Create a TanStack Router beforeLoad guard for admin authentication.\n *\n * Returns a function that can be used as beforeLoad in route definitions.\n * Throws a redirect Response when authentication fails.\n *\n * @example\n * ```ts\n * import { createFileRoute } from \"@tanstack/react-router\";\n * import { createTanStackAuthGuard } from \"@questpie/admin/server/adapters/tanstack\";\n * import { cms } from \"~/questpie/server/cms\";\n *\n * export const Route = createFileRoute(\"/admin\")({\n * beforeLoad: createTanStackAuthGuard({\n * cms,\n * loginPath: \"/admin/login\",\n * requiredRole: \"admin\",\n * }),\n * component: AdminLayout,\n * });\n * ```\n *\n * @example With custom context\n * ```ts\n * export const Route = createFileRoute(\"/admin\")({\n * beforeLoad: async (ctx) => {\n * // Run auth guard\n * await createTanStackAuthGuard({ cms })(ctx);\n *\n * // Add additional context\n * return { user: ctx.context.user };\n * },\n * });\n * ```\n */\nexport function createTanStackAuthGuard({\n cms,\n loginPath = \"/admin/login\",\n requiredRole = \"admin\",\n redirectParam = \"redirect\",\n}: TanStackAuthGuardOptions) {\n return async function beforeLoad({ context }: BeforeLoadContext) {\n const request = context.request;\n\n if (!request) {\n console.warn(\n \"createTanStackAuthGuard: No request in context. \" +\n \"Make sure you're using TanStack Start with SSR enabled.\",\n );\n return;\n }\n\n const redirect = await requireAdminAuth({\n request,\n cms,\n loginPath,\n requiredRole,\n redirectParam,\n });\n\n if (redirect) {\n // TanStack Router expects thrown Response for redirects\n throw redirect;\n }\n };\n}\n\n/**\n * Create a TanStack Router loader that injects the admin session into context.\n *\n * Use this when you need access to the session in your components.\n *\n * @example\n * ```ts\n * import { createTanStackSessionLoader } from \"@questpie/admin/server/adapters/tanstack\";\n *\n * export const Route = createFileRoute(\"/admin\")({\n * loader: createTanStackSessionLoader({ cms }),\n * component: AdminLayout,\n * });\n *\n * function AdminLayout() {\n * const { session } = Route.useLoaderData();\n * return <div>Hello {session?.user?.name}</div>;\n * }\n * ```\n */\nexport function createTanStackSessionLoader({ cms }: { cms: Questpie<any> }) {\n return async function loader({ context }: BeforeLoadContext) {\n const request = context.request;\n\n if (!request || !cms.auth) {\n return { session: null };\n }\n\n try {\n const session = await cms.auth.api.getSession({\n headers: request.headers,\n });\n\n return { session: session ?? null };\n } catch {\n return { session: null };\n }\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6FA,SAAgB,wBAAwB,EACtC,KACA,YAAY,gBACZ,eAAe,SACf,gBAAgB,cACW;AAC3B,QAAO,eAAe,WAAW,EAAE,WAA8B;EAC/D,MAAM,UAAU,QAAQ;AAExB,MAAI,CAAC,SAAS;AACZ,WAAQ,KACN,0GAED;AACD;;EAGF,MAAM,WAAW,MAAM,iBAAiB;GACtC;GACA;GACA;GACA;GACA;GACD,CAAC;AAEF,MAAI,SAEF,OAAM;;;;;;;;;;;;;;;;;;;;;;;AAyBZ,SAAgB,4BAA4B,EAAE,OAA+B;AAC3E,QAAO,eAAe,OAAO,EAAE,WAA8B;EAC3D,MAAM,UAAU,QAAQ;AAExB,MAAI,CAAC,WAAW,CAAC,IAAI,KACnB,QAAO,EAAE,SAAS,MAAM;AAG1B,MAAI;AAKF,UAAO,EAAE,SAJO,MAAM,IAAI,KAAK,IAAI,WAAW,EAC5C,SAAS,QAAQ,SAClB,CAAC,IAE2B,MAAM;UAC7B;AACN,UAAO,EAAE,SAAS,MAAM"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"augmentation.d.mts","names":[],"sources":["../../src/server/augmentation.ts"],"sourcesContent":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth-helpers.d.mts","names":[],"sources":["../../src/server/auth-helpers.ts"],"sourcesContent":[],"mappings":";;;;AA+NA;;;AAGE,UAtMe,WAAA,CAsMf;EACC,IAAA,EAAA;IAAqD,EAAA,EAAA,MAAA;IAAO,KAAA,EAAA,MAAA;;;;;;;;eA5LhD;;;;;;;UAQE,uBAAA;;;;WAIN;;;;OAKJ;;;;;;;;;;;;;;;;;;;;UAwBU,sBAAA;;;;WAIN;;;;OAKJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoCe,gBAAA;;;;;;GAMnB,0BAA0B,QAAQ;;;;;;;;;;;;;;;;iBAwDf,eAAA;;;GAGnB,yBAAyB,QAAQ;;;;;;;;;;;;iBAiCd,WAAA;;;;GAInB;;IAAqD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth-helpers.mjs","names":[],"sources":["../../src/server/auth-helpers.ts"],"sourcesContent":["/**\n * SSR Auth Helpers\n *\n * Server-side utilities for authentication in SSR frameworks.\n * These helpers work with Better Auth to check session on the server.\n *\n * @example TanStack Router\n * ```ts\n * import { requireAdminAuth } from \"@questpie/admin/server\";\n *\n * export const Route = createFileRoute(\"/admin\")({\n * beforeLoad: async ({ context }) => {\n * const redirect = await requireAdminAuth({\n * request: context.request,\n * cms,\n * loginPath: \"/admin/login\",\n * });\n * if (redirect) throw redirect;\n * },\n * });\n * ```\n */\n\nimport type { Questpie } from \"questpie\";\n\n/**\n * Session object from Better Auth\n */\nexport interface AuthSession {\n user: {\n id: string;\n email: string;\n name?: string | null;\n role?: string | null;\n [key: string]: unknown;\n };\n session: {\n id: string;\n userId: string;\n expiresAt: Date;\n [key: string]: unknown;\n };\n}\n\n/**\n * Options for requireAdminAuth\n */\nexport interface RequireAdminAuthOptions {\n /**\n * The incoming request\n */\n request: Request;\n\n /**\n * The CMS instance with auth configured\n */\n cms: Questpie<any>;\n\n /**\n * Path to redirect to when not authenticated\n * @default \"/admin/login\"\n */\n loginPath?: string;\n\n /**\n * Required role for access\n * @default \"admin\"\n */\n requiredRole?: string;\n\n /**\n * Query parameter name for redirect URL\n * @default \"redirect\"\n */\n redirectParam?: string;\n}\n\n/**\n * Options for getAdminSession\n */\nexport interface GetAdminSessionOptions {\n /**\n * The incoming request\n */\n request: Request;\n\n /**\n * The CMS instance with auth configured\n */\n cms: Questpie<any>;\n}\n\n/**\n * Check if user is authenticated with required role on the server.\n * Returns a redirect Response if not authenticated, null if authenticated.\n *\n * Use this in server loaders/middleware to protect routes.\n *\n * @example TanStack Router\n * ```ts\n * export const Route = createFileRoute(\"/admin\")({\n * beforeLoad: async ({ context }) => {\n * const redirect = await requireAdminAuth({\n * request: context.request,\n * cms,\n * loginPath: \"/admin/login\",\n * });\n * if (redirect) throw redirect;\n * },\n * });\n * ```\n *\n * @example Next.js Middleware\n * ```ts\n * export async function middleware(request: NextRequest) {\n * const redirect = await requireAdminAuth({\n * request,\n * cms,\n * loginPath: \"/admin/login\",\n * });\n * if (redirect) return redirect;\n * return NextResponse.next();\n * }\n * ```\n */\nexport async function requireAdminAuth({\n request,\n cms,\n loginPath = \"/admin/login\",\n requiredRole = \"admin\",\n redirectParam = \"redirect\",\n}: RequireAdminAuthOptions): Promise<Response | null> {\n // Check if auth is configured\n if (!cms.auth) {\n console.warn(\"requireAdminAuth: Auth not configured on CMS instance\");\n return null;\n }\n\n try {\n // Get session from Better Auth\n const session = await cms.auth.api.getSession({\n headers: request.headers,\n });\n\n // No session - redirect to login\n if (!session || !session.user) {\n const currentUrl = new URL(request.url);\n const redirectUrl = new URL(loginPath, currentUrl.origin);\n redirectUrl.searchParams.set(redirectParam, currentUrl.pathname);\n return Response.redirect(redirectUrl.toString(), 302);\n }\n\n // Check role - cast to any because role is added by Better Auth admin plugin\n const userRole = (session.user as any).role;\n if (userRole !== requiredRole) {\n const currentUrl = new URL(request.url);\n const redirectUrl = new URL(loginPath, currentUrl.origin);\n redirectUrl.searchParams.set(redirectParam, currentUrl.pathname);\n return Response.redirect(redirectUrl.toString(), 302);\n }\n\n // Authenticated with correct role\n return null;\n } catch (error) {\n console.error(\"requireAdminAuth: Error checking session\", error);\n // On error, redirect to login for safety\n const currentUrl = new URL(request.url);\n const redirectUrl = new URL(loginPath, currentUrl.origin);\n return Response.redirect(redirectUrl.toString(), 302);\n }\n}\n\n/**\n * Get the current admin session on the server.\n * Returns null if not authenticated.\n *\n * Use this when you need access to the session data in server code.\n *\n * @example\n * ```ts\n * const session = await getAdminSession({ request, cms });\n * if (!session) {\n * return redirect(\"/admin/login\");\n * }\n * console.log(\"User:\", session.user.name);\n * ```\n */\nexport async function getAdminSession({\n request,\n cms,\n}: GetAdminSessionOptions): Promise<AuthSession | null> {\n // Check if auth is configured\n if (!cms.auth) {\n return null;\n }\n\n try {\n const session = await cms.auth.api.getSession({\n headers: request.headers,\n });\n\n if (!session || !session.user) {\n return null;\n }\n\n return session as AuthSession;\n } catch (error) {\n console.error(\"getAdminSession: Error getting session\", error);\n return null;\n }\n}\n\n/**\n * Check if the current user has admin role on the server.\n *\n * @example\n * ```ts\n * const isAdmin = await isAdminUser({ request, cms });\n * if (!isAdmin) {\n * return json({ error: \"Unauthorized\" }, { status: 403 });\n * }\n * ```\n */\nexport async function isAdminUser({\n request,\n cms,\n requiredRole = \"admin\",\n}: GetAdminSessionOptions & { requiredRole?: string }): Promise<boolean> {\n const session = await getAdminSession({ request, cms });\n // Cast to any to access role - it's added by Better Auth admin plugin\n return (session?.user as any)?.role === requiredRole;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6HA,eAAsB,iBAAiB,EACrC,SACA,KACA,YAAY,gBACZ,eAAe,SACf,gBAAgB,cACoC;AAEpD,KAAI,CAAC,IAAI,MAAM;AACb,UAAQ,KAAK,wDAAwD;AACrE,SAAO;;AAGT,KAAI;EAEF,MAAM,UAAU,MAAM,IAAI,KAAK,IAAI,WAAW,EAC5C,SAAS,QAAQ,SAClB,CAAC;AAGF,MAAI,CAAC,WAAW,CAAC,QAAQ,MAAM;GAC7B,MAAM,aAAa,IAAI,IAAI,QAAQ,IAAI;GACvC,MAAM,cAAc,IAAI,IAAI,WAAW,WAAW,OAAO;AACzD,eAAY,aAAa,IAAI,eAAe,WAAW,SAAS;AAChE,UAAO,SAAS,SAAS,YAAY,UAAU,EAAE,IAAI;;AAKvD,MADkB,QAAQ,KAAa,SACtB,cAAc;GAC7B,MAAM,aAAa,IAAI,IAAI,QAAQ,IAAI;GACvC,MAAM,cAAc,IAAI,IAAI,WAAW,WAAW,OAAO;AACzD,eAAY,aAAa,IAAI,eAAe,WAAW,SAAS;AAChE,UAAO,SAAS,SAAS,YAAY,UAAU,EAAE,IAAI;;AAIvD,SAAO;UACA,OAAO;AACd,UAAQ,MAAM,4CAA4C,MAAM;EAEhE,MAAM,aAAa,IAAI,IAAI,QAAQ,IAAI;EACvC,MAAM,cAAc,IAAI,IAAI,WAAW,WAAW,OAAO;AACzD,SAAO,SAAS,SAAS,YAAY,UAAU,EAAE,IAAI;;;;;;;;;;;;;;;;;;AAmBzD,eAAsB,gBAAgB,EACpC,SACA,OACsD;AAEtD,KAAI,CAAC,IAAI,KACP,QAAO;AAGT,KAAI;EACF,MAAM,UAAU,MAAM,IAAI,KAAK,IAAI,WAAW,EAC5C,SAAS,QAAQ,SAClB,CAAC;AAEF,MAAI,CAAC,WAAW,CAAC,QAAQ,KACvB,QAAO;AAGT,SAAO;UACA,OAAO;AACd,UAAQ,MAAM,0CAA0C,MAAM;AAC9D,SAAO;;;;;;;;;;;;;;AAeX,eAAsB,YAAY,EAChC,SACA,KACA,eAAe,WACwD;AAGvE,UAFgB,MAAM,gBAAgB;EAAE;EAAS;EAAK,CAAC,GAEtC,OAAc,SAAS"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"block-builder.d.mts","names":[],"sources":["../../../src/server/block/block-builder.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;;;AAuLA;;;;;;;;;;;;AA6GA;AACgB,UA/NC,oBAAA,CA+ND;EAAoB;EACjB,OAAA,EAAA,MAAA;EAAsB;EAChC,SAAA,EAAA,MAAA;EAIW;EA2Bf,GAAA,EA1PC,aA0PD;EACO;EAAuB,MAAA,CAAA,EAAA,MAAA;EAClB;EAAkB,EAAA,EAAA,OAAA;;;;;;;AAmCF,KAnRrB,eAmRqB,CAAA,UAnRK,MAmRL,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,GAAA,CAAA,MAAA,EAAA;EAAlB;EAAiC,MAAA,EAjRvC,OAiRuC;EAEzC;EAAL,GAAA,EAjRI,oBAiRJ;CAAmC,EAAA,GAhR/B,OAgR+B,CAhRvB,MAgRuB,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,GAhRI,MAgRJ,CAAA,MAAA,EAAA,OAAA,CAAA;;;;;AAyBnC,KAnSU,cAAA,GAAiB,MAmS3B,CAAA,MAAA,EAAA,OAAA,CAAA,GAAA;EACA,EAAA,EAAA,MAAA;CAHE;;;;;;;;;AAkDF,KAzUU,wBAAA,GAyUV;EACkB,IAAA,CAAA,EAzUZ,MAyUY,CAAA,MAAA,EAAA,IAAA,GAzUU,wBAyUV,CAAA;CACA;;;;;;;;;;;;;;;;;;AAiBlB,KAvUU,iBAuUV,CAAA,UAvUsC,MAuUtC,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,GAAA,QAIe,MA1UJ,OA0UI,IAAA,IAAA,GA1Uc,wBA0Ud,EACoB;;;;;AAGnC,KAvUU,gBAuUV,CAAA,KAAA,CAAA,GAAA,QAA0B,MAtUf,KAsUe,IAtUN,KAsUM,CAtUA,CAsUA,CAAA,SAAA,KAAA,GAAA,SAAA,GAAA,KAAA,GApUxB,CAoUwB,GApUpB,cAoUoB,GAAA,IAAA,EATvB;;;;AA2De,UAhXH,iBAgXG,CAAA,cAAA,MAAA,GAAA,MAAA,EAAA,gBA9WH,MA8WG,CAAA,MAAA,EA5WlB,eA4WkB,CA5WF,oBA4WE,CAAA,CAAA,GA3Wf,MA2We,CAAA,MAAA,EA3WA,eA2WA,CA3WgB,oBA2WhB,CAAA,CAAA,CAAA,CAAA;EAuCJ;EACT,IAAA,EAhZA,KAgZA;EACiB;EAArB,KAAA,CAAA,EA/YM,gBA+YN;EAAY;EAaH,MAAA,CAAA,EA1ZF,OA0ZE;EAAgC;EAC3C,aAAA,CAAA,EAAA,OAAA;EAAwD;EAAhB,WAAA,CAAA,EAAA,MAAA;EAAf;EAEV,QAAA,CAAA,EAvZJ,eAuZI,CAAA,GAAA,CAAA;EAAmB;EAAiB,YAAA,CAAA,EArZpC,iBAqZoC;EAAW;EAGxD,eAAA,CAAA,EAAA,CAAA,MAAA,EAAA;IAGH,MAAA,EAAA,GAAA;IAAM,QAAA,EAvZE,MAuZF,CAAA,MAAA,EAAA,OAAA,CAAA;IAcE,GAAA,EApaL,oBAoamB;EACzB,CAAA,EAAA,GApaM,OAoaN,CApac,MAoad,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,GApayC,MAoazC,CAAA,MAAA,EAAA,OAAA,CAAA;EAAU;EAEP,eAAA,CAAA,EAAA,OAAA;EAAU;EACT,aAAA,CAAA,EAAA,MAAA,EAAA;;;;;AAGM,UAhaM,eAgaN,CAAA,eA/ZK,iBA+ZL,GA/ZyB,iBA+ZzB,CAAA,CAAA;EAKC;EAKA,SAAA,IAAA,EAtaI,MAsac,CAAA,MAAA,CAAA;;kBApab;;sBAEI,eAAe;;0BAG1B,8BACH,uBACH,QAAQ;;;;;;;;;cAgGC,4BACG,oBAAoB,qCACjB,sBAAsB,6BAChC;;qBAIW;;;;;;;;;;;;;;;;;;;;;;oBA2Bf,0BACO,uBAAuB,oBAC/B,aAAa;WAAkB;KAAoB,WAAW;;;;;;;;;;;;;;4BAiC7C,eAAe,gBAAgB,qCAErC,kBAAkB,eAAe,aAC5C,aACF,KAAK;YAA8B;KACnC,WACA;;;;;;;;;;uCAqBE,aACF;;;KACA,WACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAyCyB;YAEhB,iBAAiB;SACpB;QACA,QAAQ,YAAY,WACxB,aACF,KAAK;qBACa;qBACA;KAElB,WACA;+BAIoB,kBAAkB,iBAAiB,8BACnC;UAEd;;cAEG,iBAAiB;gBACf,iBAAiB;WACtB;UACA,QAAQ,eAAe;MAC1B,aACH,KACC;kBAGc;qBACG,iBAAiB,SAAS;KAE5C,WACA,iBAAiB,SAAS;;;;;WAuBlB,gBAAgB;;;;eA2BZ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAuCE,kCACT,QACJ;QAAqB;;;;;;;KAaZ,gCAAgC,qBAC3C,yBAAyB,eAAe,gBAAgB,uCAEzC,mBAAmB,iBAAiB,WAAW,qCAGxD,mCAGH;;;;;;;;;;;;;KAcQ,oBACX,UAAU,8CAEP,UAAU,oBACT,2BAA2B,0BAC1B,qBACA,0BACD;;;;KAKO,eAAA,GAAkB,aAAa;;;;KAK/B,kBAAA,GAAqB,gBAAgB"}
|