@questpie/admin 2.0.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +119 -122
- 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 +7 -8
- 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 +4 -5
- 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 +17 -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 +50 -40
- package/skills/questpie-admin/SKILL.md +397 -0
- package/skills/questpie-admin/blocks/SKILL.md +305 -0
- package/skills/questpie-admin/custom-ui/SKILL.md +307 -0
- package/skills/questpie-admin/views/SKILL.md +442 -0
- package/dist/_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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"provider.mjs","names":["result: Record<string, SimpleMessages>","getServerUiLocaleFromCookie"],"sources":["../../../src/client/runtime/provider.tsx"],"sourcesContent":["/**\n * Admin Provider\n *\n * React context provider for the admin UI using Zustand store from props pattern.\n * This enables optimized re-renders through selectors.\n */\n\nimport type { QueryClient } from \"@tanstack/react-query\";\nimport type { QuestpieClient } from \"questpie/client\";\nimport { DEFAULT_LOCALE } from \"questpie/shared\";\nimport {\n createContext,\n type ReactElement,\n type ReactNode,\n useContext,\n useEffect,\n useRef,\n} from \"react\";\nimport { createStore, useStore } from \"zustand\";\nimport type { adminModule } from \"#questpie/admin/server/index.js\";\nimport { Admin, type AdminInput } from \"../builder/admin\";\nimport { I18nProvider } from \"../i18n/hooks\";\nimport { adminMessages } from \"../i18n/messages\";\nimport { createSimpleI18n, type SimpleMessages } from \"../i18n/simple\";\nimport type { I18nAdapter } from \"../i18n/types\";\nimport { ContentLocalesProvider } from \"./content-locales-provider\";\nimport { buildNavigation, type NavigationGroup } from \"./routes\";\nimport {\n getUiLocaleFromCookie as getServerUiLocaleFromCookie,\n TranslationsProvider,\n} from \"./translations-provider\";\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Cookie for UI locale (admin interface language) */\nconst UI_LOCALE_COOKIE = \"questpie_ui_locale\";\n/** Cookie for content locale (CMS content language) */\nconst CONTENT_LOCALE_COOKIE = \"questpie_content_locale\";\n/** Cookie max age (1 year) */\nconst LOCALE_COOKIE_MAX_AGE = 60 * 60 * 24 * 365;\n\n// Legacy cookie name for backwards compatibility\nconst LEGACY_LOCALE_COOKIE = \"questpie_locale\";\n\n// ============================================================================\n// Cookie Helpers\n// ============================================================================\n\nfunction getCookie(name: string): string | null {\n if (typeof document === \"undefined\") return null;\n const match = document.cookie.match(new RegExp(`${name}=([^;]+)`));\n return match ? match[1] : null;\n}\n\nfunction setCookie(name: string, value: string): void {\n if (typeof document === \"undefined\") return;\n // biome-ignore lint/suspicious/noDocumentCookie: this string is ok\n document.cookie = `${name}=${value}; path=/; max-age=${LOCALE_COOKIE_MAX_AGE}; SameSite=Lax`;\n}\n\nfunction getUiLocaleFromCookie(): string | null {\n // Try new cookie first, fall back to legacy\n return getCookie(UI_LOCALE_COOKIE) ?? getCookie(LEGACY_LOCALE_COOKIE);\n}\n\nfunction getContentLocaleFromCookie(): string | null {\n // Try new cookie first, fall back to legacy\n return getCookie(CONTENT_LOCALE_COOKIE) ?? getCookie(LEGACY_LOCALE_COOKIE);\n}\n\nfunction setUiLocaleCookie(locale: string): void {\n setCookie(UI_LOCALE_COOKIE, locale);\n}\n\nfunction setContentLocaleCookie(locale: string): void {\n setCookie(CONTENT_LOCALE_COOKIE, locale);\n}\n\n// ============================================================================\n// Store Types\n// ============================================================================\n\nexport interface AdminState {\n // Core values (from props)\n admin: Admin;\n client: QuestpieClient<(typeof adminModule)[\"$inferCms\"]>;\n authClient: any | null;\n basePath: string;\n navigate: (path: string) => void;\n realtime: {\n enabled: boolean;\n };\n\n // Content locale state (CMS content language)\n // Note: UI locale is managed by I18n adapter, not the store\n contentLocale: string;\n setContentLocale: (locale: string) => void;\n\n // Derived/cached values\n navigation: NavigationGroup[];\n brandName: string;\n}\n\nexport type AdminStore = ReturnType<typeof createAdminStore>;\n\n// ============================================================================\n// Store Factory\n// ============================================================================\n\ninterface CreateAdminStoreProps {\n admin: Admin;\n client: QuestpieClient<any>;\n authClient: any | null;\n basePath: string;\n navigate: (path: string) => void;\n realtime: {\n enabled: boolean;\n };\n initialContentLocale: string;\n}\n\nfunction createAdminStore({\n admin,\n client,\n authClient,\n basePath,\n navigate,\n realtime,\n initialContentLocale,\n}: CreateAdminStoreProps) {\n if (client && initialContentLocale && \"setLocale\" in client) {\n (client as any).setLocale(initialContentLocale);\n }\n\n return createStore<AdminState>((set) => ({\n // Core values\n admin,\n client,\n authClient,\n basePath,\n navigate,\n realtime,\n\n // Content Locale (CMS content language)\n // Note: UI locale is managed by I18n adapter, not the store\n contentLocale: initialContentLocale,\n setContentLocale: (newLocale: string) => {\n setContentLocaleCookie(newLocale);\n set({ contentLocale: newLocale });\n },\n\n // Derived values (computed once, updated when needed)\n navigation: buildNavigation(admin, { basePath }),\n brandName: \"Admin\",\n }));\n}\n\n// ============================================================================\n// Context\n// ============================================================================\n\nconst AdminStoreContext = createContext<AdminStore | null>(null);\n\n// ============================================================================\n// Provider Props\n// ============================================================================\n\nexport interface AdminProviderProps {\n /**\n * Admin configuration - pass your AdminBuilder directly.\n * Can also accept an Admin instance for backward compatibility.\n */\n admin: AdminInput<any>;\n\n /**\n * The API client for data fetching\n */\n client: QuestpieClient<any>;\n\n /**\n * The auth client for authentication (created via createAdminAuthClient)\n */\n authClient?: any;\n\n /**\n * Base path for admin routes (default: \"/admin\")\n */\n basePath?: string;\n\n /**\n * Realtime settings for auto-refreshing collection/global queries via SSE.\n *\n * - `true`: enable (default)\n * - `false`: disabled\n * - `undefined`: enabled by default\n * - object: configure enabled flag\n *\n * The SSE connection config (base URL, credentials) is handled by the client's\n * built-in `realtime` API — see `createClient()` from `questpie/client`.\n */\n realtime?:\n | boolean\n | {\n enabled?: boolean;\n };\n\n /**\n * Navigate function for routing\n */\n navigate?: (path: string) => void;\n\n /**\n * Initial UI locale (admin interface language)\n * If not provided, reads from cookie or uses default from admin config\n */\n initialUiLocale?: string;\n\n /**\n * Initial content locale (CMS content language)\n * If not provided, reads from cookie or uses default from admin config\n */\n initialContentLocale?: string;\n\n /**\n * Optional query client (if not provided, uses the nearest QueryClientProvider)\n */\n queryClient?: QueryClient;\n\n /**\n * Optional custom i18n adapter\n * If not provided, uses the built-in simple i18n with admin messages\n * @deprecated Use useServerTranslations instead\n */\n i18nAdapter?: I18nAdapter;\n\n /**\n * Use server-side translations (fetched via getAdminTranslations RPC).\n * When true, translations are fetched from the server configured via\n * .adminLocale() and .messages() on QuestpieBuilder.\n *\n * @default false (for backwards compatibility)\n *\n * @example\n * ```tsx\n * // Server configures locales and messages\n * const cms = q()\n * .use(adminModule)\n * .adminLocale({ locales: [\"en\", \"sk\"], defaultLocale: \"en\" })\n * .messages({ sk: { \"common.save\": \"Ulozit\" } })\n * .build();\n *\n * // Client fetches from server\n * <AdminProvider admin={admin} client={client} useServerTranslations>\n * {children}\n * </AdminProvider>\n * ```\n */\n useServerTranslations?: boolean;\n\n /**\n * Fallback element to show while loading server translations.\n * Only used when useServerTranslations is true.\n */\n translationsFallback?: ReactNode;\n\n /**\n * Children to render\n */\n children: ReactNode;\n}\n\n// ============================================================================\n// Provider Component\n// ============================================================================\n\n/**\n * Merge admin messages with custom translations\n */\nfunction mergeMessages(\n baseMessages: SimpleMessages,\n customTranslations: Record<string, SimpleMessages> | undefined,\n): Record<string, SimpleMessages> {\n // Start with base English messages\n const result: Record<string, SimpleMessages> = {\n en: { ...baseMessages },\n };\n\n if (!customTranslations) return result;\n\n // Merge custom translations\n for (const [locale, messages] of Object.entries(customTranslations)) {\n result[locale] = {\n ...(result[locale] ?? {}),\n ...messages,\n };\n }\n\n return result;\n}\n\n/**\n * Legacy I18n Provider (client-side translations)\n * Used when useServerTranslations is false\n */\ninterface LegacyI18nProviderProps {\n admin: Admin;\n locale: string;\n localeConfig: { default?: string; supported?: string[] };\n defaultLocale: string;\n customI18nAdapter?: I18nAdapter;\n children: ReactNode;\n}\n\nfunction LegacyI18nProvider({\n admin,\n locale,\n localeConfig,\n defaultLocale,\n customI18nAdapter,\n children,\n}: LegacyI18nProviderProps): ReactElement {\n const i18nAdapterRef = useRef<I18nAdapter | null>(null);\n if (!i18nAdapterRef.current) {\n if (customI18nAdapter) {\n i18nAdapterRef.current = customI18nAdapter;\n } else {\n // Get translations from admin builder state\n const translations = admin.getTranslations() as\n | Record<string, SimpleMessages>\n | undefined;\n const messages = mergeMessages(adminMessages, translations);\n\n i18nAdapterRef.current = createSimpleI18n({\n locale,\n locales: localeConfig.supported ?? [DEFAULT_LOCALE],\n messages,\n fallbackLocale: defaultLocale,\n // Persist UI locale to cookie when it changes\n onLocaleChange: setUiLocaleCookie,\n });\n }\n }\n\n return (\n <I18nProvider adapter={i18nAdapterRef.current}>\n <ContentLocalesProvider>{children}</ContentLocalesProvider>\n </I18nProvider>\n );\n}\n\n/**\n * Admin provider component\n *\n * Creates a scoped Zustand store for admin state management.\n * Use `useAdminStore(selector)` to access state with optimized re-renders.\n *\n * @example\n * ```tsx\n * import { AdminProvider, useAdminStore } from \"@questpie/admin/runtime\";\n *\n * function App() {\n * return (\n * <AdminProvider admin={admin} client={client}>\n * <MyComponent />\n * </AdminProvider>\n * );\n * }\n *\n * function MyComponent() {\n * // Only re-renders when locale changes\n * const locale = useAdminStore((s) => s.locale);\n * const setLocale = useAdminStore((s) => s.setLocale);\n * // ...\n * }\n * ```\n */\nexport function AdminProvider({\n admin: adminInput,\n client,\n authClient,\n basePath = \"/admin\",\n realtime,\n navigate: navigateProp,\n initialUiLocale,\n initialContentLocale,\n i18nAdapter: customI18nAdapter,\n useServerTranslations = false,\n translationsFallback,\n children,\n}: AdminProviderProps): ReactElement {\n // Normalize admin input - accepts both AdminBuilder and Admin instance\n const admin = Admin.normalize(adminInput);\n\n // Default navigate function\n const navigate =\n navigateProp ??\n ((path: string) => {\n if (typeof window !== \"undefined\") {\n window.location.href = path;\n }\n });\n\n // Get initial locales\n const localeConfig = admin.getLocale();\n const defaultLocale = localeConfig.default ?? DEFAULT_LOCALE;\n\n // Resolve UI locale (admin interface language)\n // When using server translations, prefer the server cookie\n const resolvedUiLocale = useServerTranslations\n ? (initialUiLocale ?? getServerUiLocaleFromCookie() ?? defaultLocale)\n : (initialUiLocale ?? getUiLocaleFromCookie() ?? defaultLocale);\n\n // Resolve content locale (CMS content language)\n const resolvedContentLocale =\n initialContentLocale ?? getContentLocaleFromCookie() ?? defaultLocale;\n\n // Create store (once per provider instance)\n const storeRef = useRef<AdminStore | null>(null);\n\n const realtimeConfig = {\n enabled:\n typeof realtime === \"boolean\" ? realtime : (realtime?.enabled ?? true),\n };\n\n if (!storeRef.current) {\n storeRef.current = createAdminStore({\n admin,\n client,\n authClient: authClient ?? null,\n basePath,\n navigate,\n realtime: realtimeConfig,\n initialContentLocale: resolvedContentLocale,\n });\n }\n\n useEffect(() => {\n if (storeRef.current) {\n storeRef.current.setState({\n admin,\n navigation: buildNavigation(admin, { basePath }),\n realtime: realtimeConfig,\n });\n }\n }, [admin, basePath, realtimeConfig]);\n\n // Get content locale from store for reactive updates\n const contentLocale = useStore(storeRef.current, (s) => s.contentLocale);\n\n // Sync content locale changes to API client\n // This sets Accept-Language header for all API requests\n useEffect(() => {\n if (client && contentLocale && \"setLocale\" in client) {\n (client as any).setLocale(contentLocale);\n }\n }, [client, contentLocale]);\n\n // Render with appropriate i18n provider\n const i18nContent = useServerTranslations ? (\n <TranslationsProvider\n initialLocale={resolvedUiLocale}\n fallback={translationsFallback}\n >\n <ContentLocalesProvider>{children}</ContentLocalesProvider>\n </TranslationsProvider>\n ) : (\n <LegacyI18nProvider\n admin={admin}\n locale={resolvedUiLocale}\n localeConfig={localeConfig}\n defaultLocale={defaultLocale}\n customI18nAdapter={customI18nAdapter}\n >\n {children}\n </LegacyI18nProvider>\n );\n\n return (\n <AdminStoreContext.Provider value={storeRef.current}>\n <BrandingSync />\n {i18nContent}\n </AdminStoreContext.Provider>\n );\n}\n\n// ============================================================================\n// Branding Sync (reads server config and updates store)\n// ============================================================================\n\nfunction BrandingSync() {\n const store = useContext(AdminStoreContext);\n useEffect(() => {\n if (!store) return;\n const client = store.getState().client;\n if (!client || !(client as any).rpc?.getAdminConfig) return;\n\n (client as any).rpc\n .getAdminConfig()\n .then((config: any) => {\n if (config?.branding?.name) {\n const name = config.branding.name;\n const resolved =\n typeof name === \"string\"\n ? name\n : typeof name === \"object\" && name !== null\n ? (name.en ?? Object.values(name)[0] ?? \"Admin\")\n : \"Admin\";\n store.setState({ brandName: resolved as string });\n }\n })\n .catch(() => {\n // Fail silently - keep default \"Admin\"\n });\n }, [store]);\n return null;\n}\n\n// ============================================================================\n// Store Hooks\n// ============================================================================\n\n/**\n * Access admin store with a selector for optimized re-renders.\n *\n * @example\n * ```tsx\n * // Only re-renders when locale changes\n * const locale = useAdminStore((s) => s.locale);\n *\n * // Get multiple values (re-renders when any changes)\n * const { admin, client } = useAdminStore((s) => ({\n * admin: s.admin,\n * client: s.client,\n * }));\n *\n * // Get navigation (computed once)\n * const navigation = useAdminStore((s) => s.navigation);\n * ```\n */\nexport function useAdminStore<T>(selector: (state: AdminState) => T): T {\n const store = useContext(AdminStoreContext);\n if (!store) {\n throw new Error(\n \"useAdminStore must be used within AdminProvider. \" +\n \"Wrap your app with <AdminProvider admin={admin} client={client}>\",\n );\n }\n return useStore(store, selector);\n}\n\n/**\n * Check if currently inside AdminProvider.\n * Useful for components that can work both with and without context.\n *\n * @example\n * ```tsx\n * const hasProvider = useHasAdminProvider();\n * ```\n */\nexport function useHasAdminProvider(): boolean {\n const store = useContext(AdminStoreContext);\n return store !== null;\n}\n\n/**\n * Get the raw store from context (or null if outside provider).\n * For advanced use cases where you need conditional store access.\n */\nexport function useAdminStoreRaw(): AdminStore | null {\n return useContext(AdminStoreContext);\n}\n\n// ============================================================================\n// Convenience Selectors\n// ============================================================================\n\n/** Select admin instance */\nexport const selectAdmin = (s: AdminState) => s.admin;\n\n/** Select client instance */\nexport const selectClient = (s: AdminState) => s.client;\n\n/** Select auth client instance */\nexport const selectAuthClient = (s: AdminState) => s.authClient;\n\n/** Select base path */\nexport const selectBasePath = (s: AdminState) => s.basePath;\n\n/** Select navigate function */\nexport const selectNavigate = (s: AdminState) => s.navigate;\n\n/** Select realtime config */\nexport const selectRealtime = (s: AdminState) => s.realtime;\n\n/** Select current content locale (CMS content language) */\nexport const selectContentLocale = (s: AdminState) => s.contentLocale;\n\n/** Select setContentLocale function */\nexport const selectSetContentLocale = (s: AdminState) => s.setContentLocale;\n\n/** Select navigation groups */\nexport const selectNavigation = (s: AdminState) => s.navigation;\n\n/** Select brand name */\nexport const selectBrandName = (s: AdminState) => s.brandName;\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"routes.d.mts","names":[],"sources":["../../../src/client/runtime/routes.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;KA6IY,cAAA;;SAEJ;;;SAGA,gBAAgB;;;;;;;;KASZ,iBAAA;;;;;;KAOA,iBAAA,GAAoB,iBAAiB;;;;KAKrC,eAAA;;UAEH;;SAED,gBAAgB;;UAEf;;aAEG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"routes.mjs","names":["pages: Record<string, PageRoutes>","items: NavigationItem[]"],"sources":["../../../src/client/runtime/routes.ts"],"sourcesContent":["/**\n * Type-Safe Route Builder\n *\n * Generates type-safe route helpers from admin configuration\n */\n\nimport type { Questpie } from \"questpie\";\nimport type { ComponentReference } from \"#questpie/admin/server\";\nimport type { CollectionNames, GlobalNames, IconComponent } from \"../builder\";\nimport type { Admin } from \"../builder/admin\";\nimport { isComponentReference } from \"../components/component-renderer\";\nimport type { I18nText } from \"../i18n/types\";\nimport { formatLabel } from \"../lib/utils\";\n\n// ============================================================================\n// Route Types\n// ============================================================================\n\n/**\n * Collection route helpers\n */\nexport type CollectionRoutes<TName extends string> = {\n\tlist: () => string;\n\tcreate: () => string;\n\tedit: (id: string) => string;\n\tview: (id: string) => string;\n};\n\n/**\n * Global route helpers\n */\nexport type GlobalRoutes = {\n\tedit: () => string;\n};\n\n/**\n * Page route helpers\n */\nexport type PageRoutes = {\n\tview: () => string;\n};\n\n/**\n * All routes for an admin instance\n */\nexport type AdminRoutes<TApp extends Questpie<any>> = {\n\tdashboard: () => string;\n\tcollections: {\n\t\t[K in CollectionNames<TApp> & string]: CollectionRoutes<K>;\n\t};\n\tglobals: {\n\t\t[K in GlobalNames<TApp> & string]: GlobalRoutes;\n\t};\n\tpages: Record<string, PageRoutes>;\n\tauth: {\n\t\tlogin: () => string;\n\t\tlogout: () => string;\n\t\tforgotPassword: () => string;\n\t\tresetPassword: (token: string) => string;\n\t};\n};\n\n// ============================================================================\n// Route Builder\n// ============================================================================\n\n/**\n * Options for building routes\n */\nexport type BuildRoutesOptions = {\n\t/**\n\t * Base path for admin routes (default: \"/admin\")\n\t */\n\tbasePath?: string;\n};\n\n/**\n * Build type-safe routes from admin configuration\n *\n * @example\n * ```ts\n * import { buildRoutes } from \"@questpie/admin/runtime\";\n * import { appAdmin } from \"./admin\";\n *\n * const routes = buildRoutes(appAdmin);\n *\n * // Type-safe route generation\n * routes.dashboard(); // \"/admin\"\n * routes.collections.posts.list(); // \"/admin/collections/posts\"\n * routes.collections.posts.edit(\"123\"); // \"/admin/collections/posts/123/edit\"\n * routes.globals.settings.edit(); // \"/admin/globals/settings\"\n * ```\n */\nexport function buildRoutes<TApp extends Questpie<any>>(\n\tadmin: Admin,\n\toptions: BuildRoutesOptions = {},\n): AdminRoutes<TApp> {\n\tconst { basePath = \"/admin\" } = options;\n\n\t// Helper to build path\n\tconst path = (...segments: string[]) =>\n\t\t[basePath, ...segments].filter(Boolean).join(\"/\");\n\n\t// Collection/global routes are now driven by server config.\n\t// buildRoutes returns empty collections/globals; the sidebar uses server navigation.\n\tconst collections = {} as AdminRoutes<TApp>[\"collections\"];\n\tconst globals = {} as AdminRoutes<TApp>[\"globals\"];\n\n\t// Build page routes (pages are still client-side)\n\tconst pageConfigs = admin.getPages();\n\tconst pages: Record<string, PageRoutes> = {};\n\n\tfor (const [name, config] of Object.entries(pageConfigs)) {\n\t\tconst pagePath = (config as any).path ?? name;\n\t\tpages[name] = {\n\t\t\tview: () =>\n\t\t\t\tpagePath.startsWith(\"/\") ? pagePath : path(\"pages\", pagePath),\n\t\t};\n\t}\n\n\treturn {\n\t\tdashboard: () => basePath,\n\t\tcollections,\n\t\tglobals,\n\t\tpages,\n\t\tauth: {\n\t\t\tlogin: () => path(\"auth\", \"login\"),\n\t\t\tlogout: () => path(\"auth\", \"logout\"),\n\t\t\tforgotPassword: () => path(\"auth\", \"forgot-password\"),\n\t\t\tresetPassword: (token: string) => path(\"auth\", \"reset-password\", token),\n\t\t},\n\t};\n}\n\n// ============================================================================\n// Navigation Builder\n// ============================================================================\n\n/**\n * Navigation item (clickable link)\n */\nexport type NavigationItem = {\n\tid: string;\n\tlabel: I18nText;\n\thref: string;\n\t/** Icon - can be a React component or a server-defined ComponentReference */\n\ticon?: IconComponent | ComponentReference;\n\tgroup?: string;\n\torder?: number;\n\ttype: \"collection\" | \"global\" | \"page\" | \"dashboard\" | \"link\";\n};\n\n/**\n * Navigation divider (visual separator)\n */\nexport type NavigationDivider = {\n\ttype: \"divider\";\n};\n\n/**\n * Any navigation element (item or divider)\n */\nexport type NavigationElement = NavigationItem | NavigationDivider;\n\n/**\n * Navigation group/section\n */\nexport type NavigationGroup = {\n\tid?: string;\n\tlabel?: I18nText;\n\t/** Icon - can be a React component or a server-defined ComponentReference */\n\ticon?: IconComponent | ComponentReference;\n\tcollapsed?: boolean;\n\titems?: NavigationElement[];\n\t/** Nested subsections */\n\tsections?: NavigationGroup[];\n};\n\n/**\n * Build navigation structure from admin configuration\n *\n * @example\n * ```ts\n * import { buildNavigation } from \"@questpie/admin/runtime\";\n * import { appAdmin } from \"./admin\";\n *\n * const navigation = buildNavigation(appAdmin);\n * // Returns grouped navigation items for sidebar rendering\n * ```\n */\nexport function buildNavigation<TApp extends Questpie<any>>(\n\tadmin: Admin,\n\toptions: BuildRoutesOptions = {},\n): NavigationGroup[] {\n\tconst routes = buildRoutes(admin, options);\n\tconst items: NavigationItem[] = [];\n\n\t// Add dashboard\n\titems.push({\n\t\tid: \"dashboard\",\n\t\tlabel: \"Dashboard\",\n\t\thref: routes.dashboard(),\n\t\ticon: undefined,\n\t\ttype: \"dashboard\",\n\t\torder: -1000,\n\t});\n\n\t// Collection/global navigation is now driven by server config (useServerNavigation).\n\t// Only pages are added here as they're client-only.\n\n\t// Add pages\n\tfor (const [name, config] of Object.entries(admin.getPages())) {\n\t\tif ((config as any).showInNav === false) continue;\n\n\t\titems.push({\n\t\t\tid: `page:${name}`,\n\t\t\tlabel: resolveLabel((config as any).label, name),\n\t\t\thref: routes.pages[name].view(),\n\t\t\ticon: resolveIcon((config as any).icon),\n\t\t\tgroup: (config as any).group,\n\t\t\torder: (config as any).order ?? 0,\n\t\t\ttype: \"page\",\n\t\t});\n\t}\n\n\t// Return ungrouped items (server sidebar handles grouping)\n\treturn items.length > 0 ? [{ items }] : [];\n}\n\n/**\n * Resolve label - passes through I18nText for runtime resolution\n */\nfunction resolveLabel(label: unknown, fallback: string): I18nText {\n\t// Plain string\n\tif (typeof label === \"string\") return label;\n\n\t// I18nText object (locale map or translation key) - pass through for runtime resolution\n\tif (typeof label === \"object\" && label !== null) {\n\t\treturn label as I18nText;\n\t}\n\n\t// Capitalize and format fallback\n\treturn formatLabel(fallback);\n}\n\n/**\n * Resolve icon to IconComponent or ComponentReference.\n * Handles:\n * - React components (IconComponent)\n * - Server-defined component references ({ type: \"icon\", props: { name: \"...\" } })\n * - undefined/null\n */\nfunction resolveIcon(\n\ticon: unknown,\n): IconComponent | ComponentReference | undefined {\n\tif (!icon) {\n\t\treturn undefined;\n\t}\n\n\t// Handle ComponentReference from server (e.g., { type: \"icon\", props: { name: \"ph:users\" } })\n\tif (isComponentReference(icon)) {\n\t\treturn icon;\n\t}\n\n\t// Handle React component\n\tif (typeof icon === \"function\") {\n\t\treturn icon as IconComponent;\n\t}\n\n\t// Handle object that might be a React component (e.g., forwardRef result)\n\tif (typeof icon === \"object\" && icon !== null && \"$$typeof\" in icon) {\n\t\treturn icon as IconComponent;\n\t}\n\n\treturn undefined;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA6FA,SAAgB,YACf,OACA,UAA8B,EAAE,EACZ;CACpB,MAAM,EAAE,WAAW,aAAa;CAGhC,MAAM,QAAQ,GAAG,aAChB,CAAC,UAAU,GAAG,SAAS,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI;CAIlD,MAAM,cAAc,EAAE;CACtB,MAAM,UAAU,EAAE;CAGlB,MAAM,cAAc,MAAM,UAAU;CACpC,MAAMA,QAAoC,EAAE;AAE5C,MAAK,MAAM,CAAC,MAAM,WAAW,OAAO,QAAQ,YAAY,EAAE;EACzD,MAAM,WAAY,OAAe,QAAQ;AACzC,QAAM,QAAQ,EACb,YACC,SAAS,WAAW,IAAI,GAAG,WAAW,KAAK,SAAS,SAAS,EAC9D;;AAGF,QAAO;EACN,iBAAiB;EACjB;EACA;EACA;EACA,MAAM;GACL,aAAa,KAAK,QAAQ,QAAQ;GAClC,cAAc,KAAK,QAAQ,SAAS;GACpC,sBAAsB,KAAK,QAAQ,kBAAkB;GACrD,gBAAgB,UAAkB,KAAK,QAAQ,kBAAkB,MAAM;GACvE;EACD;;;;;;;;;;;;;;AA2DF,SAAgB,gBACf,OACA,UAA8B,EAAE,EACZ;CACpB,MAAM,SAAS,YAAY,OAAO,QAAQ;CAC1C,MAAMC,QAA0B,EAAE;AAGlC,OAAM,KAAK;EACV,IAAI;EACJ,OAAO;EACP,MAAM,OAAO,WAAW;EACxB,MAAM;EACN,MAAM;EACN,OAAO;EACP,CAAC;AAMF,MAAK,MAAM,CAAC,MAAM,WAAW,OAAO,QAAQ,MAAM,UAAU,CAAC,EAAE;AAC9D,MAAK,OAAe,cAAc,MAAO;AAEzC,QAAM,KAAK;GACV,IAAI,QAAQ;GACZ,OAAO,aAAc,OAAe,OAAO,KAAK;GAChD,MAAM,OAAO,MAAM,MAAM,MAAM;GAC/B,MAAM,YAAa,OAAe,KAAK;GACvC,OAAQ,OAAe;GACvB,OAAQ,OAAe,SAAS;GAChC,MAAM;GACN,CAAC;;AAIH,QAAO,MAAM,SAAS,IAAI,CAAC,EAAE,OAAO,CAAC,GAAG,EAAE;;;;;AAM3C,SAAS,aAAa,OAAgB,UAA4B;AAEjE,KAAI,OAAO,UAAU,SAAU,QAAO;AAGtC,KAAI,OAAO,UAAU,YAAY,UAAU,KAC1C,QAAO;AAIR,QAAO,YAAY,SAAS;;;;;;;;;AAU7B,SAAS,YACR,MACiD;AACjD,KAAI,CAAC,KACJ;AAID,KAAI,qBAAqB,KAAK,CAC7B,QAAO;AAIR,KAAI,OAAO,SAAS,WACnB,QAAO;AAIR,KAAI,OAAO,SAAS,YAAY,SAAS,QAAQ,cAAc,KAC9D,QAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"translations-provider.mjs","names":[],"sources":["../../../src/client/runtime/translations-provider.tsx"],"sourcesContent":["/**\n * Translations Provider\n *\n * Fetches admin UI translations from the server and provides i18n context.\n * This enables single source of truth for all translations on the server.\n *\n * @example\n * ```tsx\n * // In AdminProvider\n * <TranslationsProvider initialLocale=\"en\">\n * {children}\n * </TranslationsProvider>\n * ```\n */\n\nimport { useQuery, useSuspenseQuery } from \"@tanstack/react-query\";\nimport { DEFAULT_LOCALE } from \"questpie/shared\";\nimport {\n type ReactElement,\n type ReactNode,\n Suspense,\n useCallback,\n useMemo,\n useState,\n} from \"react\";\nimport { I18nProvider } from \"../i18n/hooks\";\nimport { createSimpleI18n, type SimpleMessages } from \"../i18n/simple\";\nimport { selectClient, useAdminStore } from \"./provider\";\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Cookie for UI locale (admin interface language) */\nconst UI_LOCALE_COOKIE = \"questpie_ui_locale\";\n/** Cookie max age (1 year) */\nconst LOCALE_COOKIE_MAX_AGE = 60 * 60 * 24 * 365;\n\n// ============================================================================\n// Cookie Helpers\n// ============================================================================\n\nfunction getCookie(name: string): string | null {\n if (typeof document === \"undefined\") return null;\n const match = document.cookie.match(new RegExp(`${name}=([^;]+)`));\n return match ? match[1] : null;\n}\n\nfunction setCookie(name: string, value: string): void {\n if (typeof document === \"undefined\") return;\n // biome-ignore lint/suspicious/noDocumentCookie: this string is ok\n document.cookie = `${name}=${value}; path=/; max-age=${LOCALE_COOKIE_MAX_AGE}; SameSite=Lax`;\n}\n\nexport function getUiLocaleFromCookie(): string | null {\n return getCookie(UI_LOCALE_COOKIE);\n}\n\nexport function setUiLocaleCookie(locale: string): void {\n setCookie(UI_LOCALE_COOKIE, locale);\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface TranslationsProviderProps {\n /** Initial UI locale */\n initialLocale?: string;\n /** Children to render */\n children: ReactNode;\n /** Fallback while loading translations */\n fallback?: ReactNode;\n}\n\n// ============================================================================\n// Query Options\n// ============================================================================\n\n/**\n * Query options for fetching admin UI translations.\n * Can be used with TanStack Query's prefetching in loaders.\n *\n * @example\n * ```ts\n * // In TanStack Start loader\n * export const Route = createFileRoute(\"/admin\")({\n * loader: async ({ context }) => {\n * await context.queryClient.ensureQueryData(\n * getAdminTranslationsQueryOptions(context.client, \"en\")\n * );\n * },\n * });\n * ```\n */\nexport function getAdminTranslationsQueryOptions(client: any, locale: string) {\n return {\n queryKey: [\"cms\", \"adminTranslations\", locale] as const,\n queryFn: async () => {\n try {\n const result = await client.rpc.getAdminTranslations({ locale });\n return result as {\n locale: string;\n messages: SimpleMessages;\n fallbackLocale: string;\n };\n } catch {\n // Fallback if function doesn't exist (older server)\n return {\n locale: DEFAULT_LOCALE,\n messages: {} as SimpleMessages,\n fallbackLocale: DEFAULT_LOCALE,\n };\n }\n },\n staleTime: Number.POSITIVE_INFINITY, // Cache forever\n gcTime: Number.POSITIVE_INFINITY,\n };\n}\n\n/**\n * Query options for fetching available admin UI locales.\n *\n * @example\n * ```ts\n * // In TanStack Start loader\n * export const Route = createFileRoute(\"/admin\")({\n * loader: async ({ context }) => {\n * await context.queryClient.ensureQueryData(\n * getAdminLocalesQueryOptions(context.client)\n * );\n * },\n * });\n * ```\n */\nexport function getAdminLocalesQueryOptions(client: any) {\n return {\n queryKey: [\"cms\", \"adminLocales\"] as const,\n queryFn: async () => {\n try {\n const result = await client.rpc.getAdminLocales({});\n return result as {\n locales: string[];\n defaultLocale: string;\n };\n } catch {\n // Fallback if function doesn't exist\n return {\n locales: [DEFAULT_LOCALE],\n defaultLocale: DEFAULT_LOCALE,\n };\n }\n },\n staleTime: Number.POSITIVE_INFINITY,\n gcTime: Number.POSITIVE_INFINITY,\n };\n}\n\n// ============================================================================\n// Inner Provider (with Suspense)\n// ============================================================================\n\ninterface TranslationsInnerProps {\n initialLocale: string;\n children: ReactNode;\n}\n\nfunction TranslationsInner({\n initialLocale,\n children,\n}: TranslationsInnerProps): ReactElement {\n const client = useAdminStore(selectClient);\n const [locale, setLocaleState] = useState(initialLocale);\n\n // Fetch available locales\n const { data: localesData } = useSuspenseQuery(\n getAdminLocalesQueryOptions(client),\n );\n\n // Fetch translations for current locale\n const { data: translationsData } = useSuspenseQuery(\n getAdminTranslationsQueryOptions(client, locale),\n );\n\n // Handle locale change\n const setLocale = useCallback((newLocale: string) => {\n setLocaleState(newLocale);\n setUiLocaleCookie(newLocale);\n }, []);\n\n // Create i18n adapter\n const i18nAdapter = useMemo(() => {\n return createSimpleI18n({\n locale: translationsData.locale,\n locales: localesData.locales,\n messages: { [translationsData.locale]: translationsData.messages },\n fallbackLocale: translationsData.fallbackLocale,\n onLocaleChange: setLocale,\n });\n }, [translationsData, localesData.locales, setLocale]);\n\n return <I18nProvider adapter={i18nAdapter}>{children}</I18nProvider>;\n}\n\n// ============================================================================\n// Loading Fallback\n// ============================================================================\n\nfunction LoadingFallback(): ReactElement {\n return (\n <div className=\"qp-flex qp-h-screen qp-w-screen qp-items-center qp-justify-center qp-bg-background\">\n <div className=\"qp-flex qp-flex-col qp-items-center qp-gap-4\">\n <div className=\"qp-h-8 qp-w-8 qp-animate-spin qp-rounded-full qp-border-4 qp-border-primary qp-border-t-transparent\" />\n <span className=\"qp-text-sm qp-text-muted-foreground\">Loading...</span>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Provider Component\n// ============================================================================\n\n/**\n * Translations Provider\n *\n * Fetches admin UI translations from the server and provides i18n context.\n * Uses Suspense for loading state.\n *\n * @example\n * ```tsx\n * <AdminStoreContext.Provider value={store}>\n * <TranslationsProvider initialLocale=\"en\">\n * <ContentLocalesProvider>\n * {children}\n * </ContentLocalesProvider>\n * </TranslationsProvider>\n * </AdminStoreContext.Provider>\n * ```\n */\nexport function TranslationsProvider({\n initialLocale,\n children,\n fallback,\n}: TranslationsProviderProps): ReactElement {\n const resolvedLocale =\n initialLocale ?? getUiLocaleFromCookie() ?? DEFAULT_LOCALE;\n\n return (\n <Suspense fallback={fallback ?? <LoadingFallback />}>\n <TranslationsInner initialLocale={resolvedLocale}>\n {children}\n </TranslationsInner>\n </Suspense>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAkCA,MAAM,mBAAmB;;AAEzB,MAAM,wBAAwB,OAAU,KAAK;AAM7C,SAAS,UAAU,MAA6B;AAC9C,KAAI,OAAO,aAAa,YAAa,QAAO;CAC5C,MAAM,QAAQ,SAAS,OAAO,sBAAM,IAAI,OAAO,GAAG,KAAK,UAAU,CAAC;AAClE,QAAO,QAAQ,MAAM,KAAK;;AAG5B,SAAS,UAAU,MAAc,OAAqB;AACpD,KAAI,OAAO,aAAa,YAAa;AAErC,UAAS,SAAS,GAAG,KAAK,GAAG,MAAM,oBAAoB,sBAAsB;;AAG/E,SAAgB,wBAAuC;AACrD,QAAO,UAAU,iBAAiB;;AAGpC,SAAgB,kBAAkB,QAAsB;AACtD,WAAU,kBAAkB,OAAO;;;;;;;;;;;;;;;;;;AAoCrC,SAAgB,iCAAiC,QAAa,QAAgB;AAC5E,QAAO;EACL,UAAU;GAAC;GAAO;GAAqB;GAAO;EAC9C,SAAS,YAAY;AACnB,OAAI;AAEF,WADe,MAAM,OAAO,IAAI,qBAAqB,EAAE,QAAQ,CAAC;WAM1D;AAEN,WAAO;KACL,QAAQ;KACR,UAAU,EAAE;KACZ,gBAAgB;KACjB;;;EAGL,WAAW,OAAO;EAClB,QAAQ,OAAO;EAChB;;;;;;;;;;;;;;;;;AAkBH,SAAgB,4BAA4B,QAAa;AACvD,QAAO;EACL,UAAU,CAAC,OAAO,eAAe;EACjC,SAAS,YAAY;AACnB,OAAI;AAEF,WADe,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;WAK7C;AAEN,WAAO;KACL,SAAS,CAAC,eAAe;KACzB,eAAe;KAChB;;;EAGL,WAAW,OAAO;EAClB,QAAQ,OAAO;EAChB;;AAYH,SAAS,kBAAkB,EACzB,eACA,YACuC;CACvC,MAAM,SAAS,cAAc,aAAa;CAC1C,MAAM,CAAC,QAAQ,kBAAkB,SAAS,cAAc;CAGxD,MAAM,EAAE,MAAM,gBAAgB,iBAC5B,4BAA4B,OAAO,CACpC;CAGD,MAAM,EAAE,MAAM,qBAAqB,iBACjC,iCAAiC,QAAQ,OAAO,CACjD;CAGD,MAAM,YAAY,aAAa,cAAsB;AACnD,iBAAe,UAAU;AACzB,oBAAkB,UAAU;IAC3B,EAAE,CAAC;AAaN,QAAO,oBAAC;EAAa,SAVD,cAAc;AAChC,UAAO,iBAAiB;IACtB,QAAQ,iBAAiB;IACzB,SAAS,YAAY;IACrB,UAAU,GAAG,iBAAiB,SAAS,iBAAiB,UAAU;IAClE,gBAAgB,iBAAiB;IACjC,gBAAgB;IACjB,CAAC;KACD;GAAC;GAAkB,YAAY;GAAS;GAAU,CAAC;EAEV;GAAwB;;AAOtE,SAAS,kBAAgC;AACvC,QACE,oBAAC;EAAI,WAAU;YACb,qBAAC;GAAI,WAAU;cACb,oBAAC,SAAI,WAAU,wGAAwG,EACvH,oBAAC;IAAK,WAAU;cAAsC;KAAiB;IACnE;GACF;;;;;;;;;;;;;;;;;;;AAyBV,SAAgB,qBAAqB,EACnC,eACA,UACA,YAC0C;CAC1C,MAAM,iBACJ,iBAAiB,uBAAuB,IAAI;AAE9C,QACE,oBAAC;EAAS,UAAU,YAAY,oBAAC,oBAAkB;YACjD,oBAAC;GAAkB,eAAe;GAC/B;IACiB;GACX"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"picker.d.mts","names":[],"sources":["../../../src/client/scope/picker.tsx"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAwDgB,WAAA;;;;WAIN;;;;;;;;GAQP,mBAAgB,mBAAA,CAAA,GAAA,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"picker.mjs","names":[],"sources":["../../../src/client/scope/picker.tsx"],"sourcesContent":["/**\n * Scope Picker Component\n *\n * A dropdown picker for selecting the current scope in multi-tenant apps.\n * Can fetch options from a collection or use static options.\n */\n\nimport { Icon } from \"@iconify/react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useCallback, useMemo } from \"react\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"../components/ui/select\";\nimport { Skeleton } from \"../components/ui/skeleton\";\nimport { cn } from \"../lib/utils\";\nimport { useAdminStore } from \"../runtime/provider.js\";\nimport { useScope } from \"./provider\";\nimport type { ScopeOption, ScopePickerProps } from \"./types\";\n\n/**\n * Scope Picker Component\n *\n * Renders a dropdown for selecting the current scope.\n * Integrates with ScopeProvider to manage the selected scope.\n *\n * @example\n * ```tsx\n * // Fetch options from a collection\n * <ScopePicker\n * collection=\"properties\"\n * labelField=\"name\"\n * placeholder=\"Select property...\"\n * allowClear\n * />\n *\n * // Use static options\n * <ScopePicker\n * options={[\n * { value: 'org_1', label: 'Organization 1' },\n * { value: 'org_2', label: 'Organization 2' },\n * ]}\n * />\n *\n * // Use async options loader\n * <ScopePicker\n * loadOptions={async () => {\n * const response = await fetch('/api/my-scopes');\n * return response.json();\n * }}\n * />\n * ```\n */\nexport function ScopePicker({\n\tcollection,\n\tlabelField = \"name\",\n\tvalueField = \"id\",\n\toptions: staticOptions,\n\tloadOptions,\n\tplaceholder = \"Select...\",\n\tlabel,\n\tallowClear = false,\n\tclearText = \"All\",\n\tclassName,\n\tcompact = false,\n}: ScopePickerProps) {\n\tconst { scopeId, setScope, isLoading: scopeLoading } = useScope();\n\tconst client = useAdminStore((s) => s.client);\n\n\t// Fetch options from collection\n\tconst {\n\t\tdata: collectionData,\n\t\tisLoading: collectionLoading,\n\t\terror: collectionError,\n\t} = useQuery({\n\t\tqueryKey: [\"scope-picker\", collection, labelField, valueField],\n\t\tqueryFn: async () => {\n\t\t\tif (!collection || !client) return null;\n\n\t\t\tconst result = await (client.collections as any)[collection].find({\n\t\t\t\tlimit: 100,\n\t\t\t\tcolumns: {\n\t\t\t\t\t[valueField]: true,\n\t\t\t\t\t[labelField]: true,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\treturn result.docs.map((doc: any) => ({\n\t\t\t\tvalue: String(doc[valueField]),\n\t\t\t\tlabel: String(doc[labelField] ?? doc[valueField]),\n\t\t\t}));\n\t\t},\n\t\tenabled: !!collection && !!client,\n\t\tstaleTime: 60000, // 1 minute\n\t});\n\n\t// Fetch options from async loader\n\tconst {\n\t\tdata: asyncOptions,\n\t\tisLoading: asyncLoading,\n\t\terror: asyncError,\n\t} = useQuery({\n\t\tqueryKey: [\"scope-picker-async\", loadOptions?.toString()],\n\t\tqueryFn: loadOptions!,\n\t\tenabled: !!loadOptions,\n\t\tstaleTime: 60000,\n\t});\n\n\t// Combine options from all sources\n\tconst options = useMemo((): ScopeOption[] => {\n\t\tif (staticOptions) return staticOptions;\n\t\tif (collectionData) return collectionData;\n\t\tif (asyncOptions) return asyncOptions;\n\t\treturn [];\n\t}, [staticOptions, collectionData, asyncOptions]);\n\n\tconst isLoading = scopeLoading || collectionLoading || asyncLoading;\n\tconst error = collectionError || asyncError;\n\n\t// Handle selection change\n\tconst handleValueChange = useCallback(\n\t\t(value: string | null) => {\n\t\t\tif (!value || value === \"__clear__\") {\n\t\t\t\tsetScope(null);\n\t\t\t} else {\n\t\t\t\tsetScope(value);\n\t\t\t}\n\t\t},\n\t\t[setScope],\n\t);\n\n\t// Get current selection label\n\tconst selectedLabel = useMemo(() => {\n\t\tif (!scopeId) return null;\n\t\tconst option = options.find((opt) => opt.value === scopeId);\n\t\treturn option?.label ?? scopeId;\n\t}, [scopeId, options]);\n\n\tif (isLoading) {\n\t\treturn (\n\t\t\t<div className={cn(\"space-y-1.5\", className)}>\n\t\t\t\t{label && !compact && <Skeleton className=\"h-3 w-16\" />}\n\t\t\t\t<Skeleton className={cn(\"h-9 w-full\", compact && \"h-8\")} />\n\t\t\t</div>\n\t\t);\n\t}\n\n\tif (error) {\n\t\treturn (\n\t\t\t<div className={cn(\"text-xs text-destructive\", className)}>\n\t\t\t\tFailed to load options\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className={cn(\"space-y-1.5\", className)}>\n\t\t\t{label && !compact && (\n\t\t\t\t<span className=\"text-xs font-medium text-muted-foreground\">\n\t\t\t\t\t{label}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t\t<Select\n\t\t\t\tvalue={scopeId ?? \"__clear__\"}\n\t\t\t\tonValueChange={(value) => handleValueChange(value)}\n\t\t\t>\n\t\t\t\t<SelectTrigger\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"w-full\",\n\t\t\t\t\t\tcompact && \"h-8 text-xs\",\n\t\t\t\t\t\t!scopeId && \"text-muted-foreground\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<SelectValue placeholder={placeholder}>\n\t\t\t\t\t\t{scopeId ? selectedLabel : allowClear ? clearText : placeholder}\n\t\t\t\t\t</SelectValue>\n\t\t\t\t</SelectTrigger>\n\t\t\t\t<SelectContent>\n\t\t\t\t\t{allowClear && (\n\t\t\t\t\t\t<SelectItem value=\"__clear__\">\n\t\t\t\t\t\t\t<span className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\ticon=\"ph:globe\"\n\t\t\t\t\t\t\t\t\tclassName=\"size-4 text-muted-foreground\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t{clearText}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t)}\n\t\t\t\t\t{options.map((option) => (\n\t\t\t\t\t\t<SelectItem key={option.value} value={option.value}>\n\t\t\t\t\t\t\t<span className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t{option.icon}\n\t\t\t\t\t\t\t\t<span>{option.label}</span>\n\t\t\t\t\t\t\t\t{option.description && (\n\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground text-xs\">\n\t\t\t\t\t\t\t\t\t\t{option.description}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t))}\n\t\t\t\t\t{options.length === 0 && (\n\t\t\t\t\t\t<div className=\"px-2 py-1.5 text-xs text-muted-foreground\">\n\t\t\t\t\t\t\tNo options available\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</SelectContent>\n\t\t\t</Select>\n\t\t</div>\n\t);\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.mts","names":[],"sources":["../../../src/client/scope/provider.tsx"],"sourcesContent":[],"mappings":";;;;;;;;KAmBK,OAAA,GAGO,CAAA,KAAA,EAFJ,WAEI,GAFU,GAEV,EAAA,IAAA,CAAA,EADJ,WACI,EAAA,GAAP,OAAO,CAAC,QAAD,CAAA;AAqBZ;;;;;;;;AAmFA;AAYA;AA2BA;AA+BA;;;;;;iBAzJgB,aAAA;;;;;GAKb,qBAAkB,mBAAA,CAAA,GAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;iBA8EL,QAAA,CAAA,GAAY;;;;;iBAYZ,YAAA,CAAA,GAAgB;;;;;;;;;;;;;;;;;;;;;;;;iBA2BhB,cAAA,CAAA,GAAkB;;;;;;;;;;;;;;;;;iBA+BlB,iBAAA,uDAGb"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"provider.mjs","names":["value: ScopeContextValue"],"sources":["../../../src/client/scope/provider.tsx"],"sourcesContent":["/**\n * Scope Provider\n *\n * Provides scope context for multi-tenant applications.\n * Manages the selected scope ID and persists it to localStorage.\n */\n\nimport {\n\tcreateContext,\n\tuseCallback,\n\tuseContext,\n\tuseEffect,\n\tuseState,\n} from \"react\";\nimport type { ScopeContextValue, ScopeProviderProps } from \"./types\";\n\n/**\n * Fetch function type (browser-compatible, avoids Bun-specific types)\n */\ntype FetchFn = (\n\tinput: RequestInfo | URL,\n\tinit?: RequestInit,\n) => Promise<Response>;\n\nconst ScopeContext = createContext<ScopeContextValue | null>(null);\n\n/**\n * Provider component for scope selection.\n *\n * Wrap your admin app with this provider to enable scope-based filtering.\n *\n * @example\n * ```tsx\n * <ScopeProvider\n * headerName=\"x-selected-property\"\n * storageKey=\"admin-property\"\n * >\n * <AdminProvider {...props}>\n * {children}\n * </AdminProvider>\n * </ScopeProvider>\n * ```\n */\nexport function ScopeProvider({\n\tchildren,\n\theaderName,\n\tstorageKey,\n\tdefaultScope = null,\n}: ScopeProviderProps) {\n\tconst [isLoading, setIsLoading] = useState(!!storageKey);\n\tconst [scopeId, setScopeId] = useState<string | null>(() => {\n\t\t// Don't access localStorage during SSR\n\t\tif (typeof window === \"undefined\") {\n\t\t\treturn defaultScope;\n\t\t}\n\t\t// Initial load from localStorage\n\t\tif (storageKey) {\n\t\t\tconst stored = localStorage.getItem(storageKey);\n\t\t\treturn stored ?? defaultScope;\n\t\t}\n\t\treturn defaultScope;\n\t});\n\n\t// Handle hydration mismatch - only run once on mount\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: intentionally only runs on mount\n\tuseEffect(() => {\n\t\tif (storageKey && typeof window !== \"undefined\") {\n\t\t\tconst stored = localStorage.getItem(storageKey);\n\t\t\tsetScopeId(stored ?? defaultScope);\n\t\t\tsetIsLoading(false);\n\t\t}\n\t}, [storageKey]);\n\n\tconst setScope = useCallback(\n\t\t(id: string | null) => {\n\t\t\tsetScopeId(id);\n\t\t\tif (storageKey && typeof window !== \"undefined\") {\n\t\t\t\tif (id) {\n\t\t\t\t\tlocalStorage.setItem(storageKey, id);\n\t\t\t\t} else {\n\t\t\t\t\tlocalStorage.removeItem(storageKey);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[storageKey],\n\t);\n\n\tconst clearScope = useCallback(() => {\n\t\tsetScope(null);\n\t}, [setScope]);\n\n\tconst value: ScopeContextValue = {\n\t\tscopeId,\n\t\tsetScope,\n\t\tclearScope,\n\t\theaderName,\n\t\tisLoading,\n\t};\n\n\treturn (\n\t\t<ScopeContext.Provider value={value}>{children}</ScopeContext.Provider>\n\t);\n}\n\n/**\n * Hook to access the current scope context.\n *\n * @throws Error if used outside of ScopeProvider\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { scopeId, setScope, clearScope } = useScope();\n *\n * return (\n * <div>\n * Current scope: {scopeId ?? 'None'}\n * <button onClick={() => setScope('org_123')}>\n * Switch to Org 123\n * </button>\n * <button onClick={clearScope}>Clear</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useScope(): ScopeContextValue {\n\tconst context = useContext(ScopeContext);\n\tif (!context) {\n\t\tthrow new Error(\"useScope must be used within a ScopeProvider\");\n\t}\n\treturn context;\n}\n\n/**\n * Hook to check if we're inside a ScopeProvider.\n * Returns null if not inside a provider (doesn't throw).\n */\nexport function useScopeSafe(): ScopeContextValue | null {\n\treturn useContext(ScopeContext);\n}\n\n/**\n * Hook to create a fetch wrapper that automatically injects the scope header.\n *\n * Use this when creating the QuestpieClient to ensure all API calls\n * include the selected scope.\n *\n * @example\n * ```tsx\n * function AdminWithScopedClient() {\n * const scopedFetch = useScopedFetch();\n *\n * const client = useMemo(() =>\n * createClient<typeof cms>({\n * baseURL: '/api',\n * fetch: scopedFetch,\n * }),\n * [scopedFetch]\n * );\n *\n * return <AdminProvider client={client} {...rest} />;\n * }\n * ```\n */\nexport function useScopedFetch(): FetchFn {\n\tconst { scopeId, headerName } = useScope();\n\n\treturn useCallback(\n\t\t(input: RequestInfo | URL, init?: RequestInit) => {\n\t\t\tconst headers = new Headers(init?.headers);\n\t\t\tif (scopeId) {\n\t\t\t\theaders.set(headerName, scopeId);\n\t\t\t}\n\t\t\treturn fetch(input, { ...init, headers });\n\t\t},\n\t\t[scopeId, headerName],\n\t);\n}\n\n/**\n * Creates a fetch function that injects scope headers.\n * Use this outside of React components.\n *\n * @example\n * ```ts\n * let currentScopeId: string | null = null;\n *\n * const scopedFetch = createScopedFetch(\n * 'x-selected-property',\n * () => currentScopeId\n * );\n *\n * const client = createClient({ fetch: scopedFetch, ... });\n * ```\n */\nexport function createScopedFetch(\n\theaderName: string,\n\tgetScopeId: () => string | null,\n): FetchFn {\n\treturn (input: RequestInfo | URL, init?: RequestInit) => {\n\t\tconst headers = new Headers(init?.headers);\n\t\tconst scopeId = getScopeId();\n\t\tif (scopeId) {\n\t\t\theaders.set(headerName, scopeId);\n\t\t}\n\t\treturn fetch(input, { ...init, headers });\n\t};\n}\n"],"mappings":";;;;;;;;;;AAwBA,MAAM,eAAe,cAAwC,KAAK;;;;;;;;;;;;;;;;;;AAmBlE,SAAgB,cAAc,EAC7B,UACA,YACA,YACA,eAAe,QACO;CACtB,MAAM,CAAC,WAAW,gBAAgB,SAAS,CAAC,CAAC,WAAW;CACxD,MAAM,CAAC,SAAS,cAAc,eAA8B;AAE3D,MAAI,OAAO,WAAW,YACrB,QAAO;AAGR,MAAI,WAEH,QADe,aAAa,QAAQ,WAAW,IAC9B;AAElB,SAAO;GACN;AAIF,iBAAgB;AACf,MAAI,cAAc,OAAO,WAAW,aAAa;AAEhD,cADe,aAAa,QAAQ,WAAW,IAC1B,aAAa;AAClC,gBAAa,MAAM;;IAElB,CAAC,WAAW,CAAC;CAEhB,MAAM,WAAW,aACf,OAAsB;AACtB,aAAW,GAAG;AACd,MAAI,cAAc,OAAO,WAAW,YACnC,KAAI,GACH,cAAa,QAAQ,YAAY,GAAG;MAEpC,cAAa,WAAW,WAAW;IAItC,CAAC,WAAW,CACZ;CAMD,MAAMA,QAA2B;EAChC;EACA;EACA,YAPkB,kBAAkB;AACpC,YAAS,KAAK;KACZ,CAAC,SAAS,CAAC;EAMb;EACA;EACA;AAED,QACC,oBAAC,aAAa;EAAgB;EAAQ;GAAiC;;;;;;;;;;;;;;;;;;;;;;;;AA0BzE,SAAgB,WAA8B;CAC7C,MAAM,UAAU,WAAW,aAAa;AACxC,KAAI,CAAC,QACJ,OAAM,IAAI,MAAM,+CAA+C;AAEhE,QAAO;;;;;;AAOR,SAAgB,eAAyC;AACxD,QAAO,WAAW,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;AA0BhC,SAAgB,iBAA0B;CACzC,MAAM,EAAE,SAAS,eAAe,UAAU;AAE1C,QAAO,aACL,OAA0B,SAAuB;EACjD,MAAM,UAAU,IAAI,QAAQ,MAAM,QAAQ;AAC1C,MAAI,QACH,SAAQ,IAAI,YAAY,QAAQ;AAEjC,SAAO,MAAM,OAAO;GAAE,GAAG;GAAM;GAAS,CAAC;IAE1C,CAAC,SAAS,WAAW,CACrB;;;;;;;;;;;;;;;;;;AAmBF,SAAgB,kBACf,YACA,YACU;AACV,SAAQ,OAA0B,SAAuB;EACxD,MAAM,UAAU,IAAI,QAAQ,MAAM,QAAQ;EAC1C,MAAM,UAAU,YAAY;AAC5B,MAAI,QACH,SAAQ,IAAI,YAAY,QAAQ;AAEjC,SAAO,MAAM,OAAO;GAAE,GAAG;GAAM;GAAS,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.mts","names":[],"sources":["../../../src/client/scope/types.ts"],"sourcesContent":[],"mappings":";;AASA;AAgBA;AAuBA;AAUA;;;;AAwB4B,UAzEX,iBAAA,CAyEW;;;;;;;;;;;;;;;UAzDX,kBAAA;YACN,KAAA,CAAM;;;;;;;;;;;;;;;;;;;;;UAsBA,WAAA;;;;SAIT,KAAA,CAAM;;;;;UAMG,gBAAA;;;;;;;;;;;;;;;;;;;;YAoBN;;;;sBAIU,QAAQ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auto-expand-fields.mjs","names":["withFields: Record<string, boolean>","fieldsToCheck: string[]"],"sources":["../../../src/client/utils/auto-expand-fields.ts"],"sourcesContent":["/**\n * Auto Expand Fields Utility\n *\n * Automatically detects upload and relation fields that need to be expanded\n * when fetching data from the backend (e.g., for displaying in list views).\n */\n\nimport type { FieldDefinition } from \"../builder/field/field\";\n\nexport interface AutoExpandFieldsConfig {\n /**\n * Collection fields configuration\n */\n fields?: Record<string, FieldDefinition>;\n\n /**\n * List view configuration\n */\n list?: {\n /**\n * Explicit relations to include\n */\n with?: string[];\n\n /**\n * Columns to display\n */\n columns?: Array<string | { field: string }>;\n };\n\n /**\n * Known relation names from collection metadata\n */\n relations?: string[];\n}\n\n/**\n * Auto-detect upload and relation fields that need to be expanded.\n *\n * This analyzes the collection config to determine which fields require\n * data expansion when fetching from the backend:\n * - Upload fields need their asset data expanded\n * - Relation fields need their related record data expanded\n *\n * @param config - Collection configuration with fields and list view settings\n * @returns Object mapping field names to `true` for fields that need expansion\n *\n * @example\n * ```tsx\n * const expandedFields = autoExpandFields({\n * fields: config?.fields,\n * list: config?.list,\n * });\n *\n * // Use with query\n * const { data } = useCollectionList(collection, {\n * with: expandedFields,\n * });\n * ```\n */\nexport function autoExpandFields(\n config: AutoExpandFieldsConfig,\n): Record<string, boolean> {\n const withFields: Record<string, boolean> = {};\n\n // Add explicitly configured relations\n if (config.list?.with) {\n for (const rel of config.list.with) {\n withFields[rel] = true;\n }\n }\n\n // Determine which columns are displayed\n // TODO: this should adhere to visible columns based on adminPrefs\n const columnFields = config.list?.columns ?? [];\n const fieldsToCheck: string[] = [];\n\n if (columnFields.length > 0) {\n // Use explicitly configured columns\n for (const col of columnFields) {\n const fieldName = typeof col === \"string\" ? col : col.field;\n if (fieldName === \"_title\") continue;\n fieldsToCheck.push(fieldName);\n }\n } else if (config.fields) {\n // When columns not set, check all fields (buildColumns auto-generates from them)\n fieldsToCheck.push(...Object.keys(config.fields));\n }\n\n // Auto-detect upload and relation fields from columns\n for (const fieldName of fieldsToCheck) {\n const fieldDef = config.fields?.[fieldName] as any;\n if (fieldDef) {\n // fieldDef.name contains the field type (e.g., \"upload\", \"relation\")\n const fieldType = fieldDef.name;\n\n // Auto-expand upload and uploadMany fields\n if (fieldType === \"upload\" || fieldType === \"uploadMany\") {\n withFields[fieldName] = true;\n }\n // For relation fields, only expand if relationName is explicitly specified\n // This ensures we don't try to expand relations that don't exist on the backend\n else if (fieldType === \"relation\") {\n const relationName =\n fieldDef[\"~options\"]?.relationName ?? (fieldName as string);\n const knownRelations = config.relations;\n if (!relationName) continue;\n if (!knownRelations || knownRelations.length === 0) {\n withFields[relationName] = true;\n continue;\n }\n if (knownRelations.includes(relationName)) {\n withFields[relationName] = true;\n }\n }\n }\n }\n\n return withFields;\n}\n\n/**\n * Check if there are any fields to expand\n */\nexport function hasFieldsToExpand(\n expandedFields: Record<string, boolean>,\n): boolean {\n return Object.keys(expandedFields).length > 0;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AA4DA,SAAgB,iBACd,QACyB;CACzB,MAAMA,aAAsC,EAAE;AAG9C,KAAI,OAAO,MAAM,KACf,MAAK,MAAM,OAAO,OAAO,KAAK,KAC5B,YAAW,OAAO;CAMtB,MAAM,eAAe,OAAO,MAAM,WAAW,EAAE;CAC/C,MAAMC,gBAA0B,EAAE;AAElC,KAAI,aAAa,SAAS,EAExB,MAAK,MAAM,OAAO,cAAc;EAC9B,MAAM,YAAY,OAAO,QAAQ,WAAW,MAAM,IAAI;AACtD,MAAI,cAAc,SAAU;AAC5B,gBAAc,KAAK,UAAU;;UAEtB,OAAO,OAEhB,eAAc,KAAK,GAAG,OAAO,KAAK,OAAO,OAAO,CAAC;AAInD,MAAK,MAAM,aAAa,eAAe;EACrC,MAAM,WAAW,OAAO,SAAS;AACjC,MAAI,UAAU;GAEZ,MAAM,YAAY,SAAS;AAG3B,OAAI,cAAc,YAAY,cAAc,aAC1C,YAAW,aAAa;YAIjB,cAAc,YAAY;IACjC,MAAM,eACJ,SAAS,aAAa,gBAAiB;IACzC,MAAM,iBAAiB,OAAO;AAC9B,QAAI,CAAC,aAAc;AACnB,QAAI,CAAC,kBAAkB,eAAe,WAAW,GAAG;AAClD,gBAAW,gBAAgB;AAC3B;;AAEF,QAAI,eAAe,SAAS,aAAa,CACvC,YAAW,gBAAgB;;;;AAMnC,QAAO;;;;;AAMT,SAAgB,kBACd,gBACS;AACT,QAAO,OAAO,KAAK,eAAe,CAAC,SAAS"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"build-field-definitions-from-schema.mjs","names":["result: FieldDefinitionsResult","config: Record<string, unknown>"],"sources":["../../../src/client/utils/build-field-definitions-from-schema.ts"],"sourcesContent":["/**\n * Build Field Definitions from Schema\n *\n * Maps server introspection schema to admin field definitions.\n * Used by AutoForm to dynamically render forms based on server schema\n * when explicit field config is not provided.\n */\n\nimport type {\n\tCollectionSchema,\n\tFieldMetadata,\n\tGlobalSchema,\n\tNestedFieldMetadata,\n\tRelationFieldMetadata,\n\tRelationSchema,\n\tSelectFieldMetadata,\n} from \"questpie\";\nimport type { AnyAdminMeta } from \"../../augmentation\";\nimport type { FieldBuilder, FieldDefinition } from \"../builder/field/field\";\nimport { formatLabel } from \"../lib/utils\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Field registry type - maps field type names to FieldBuilder instances\n * This is what Admin.getFields() returns\n */\nexport type FieldRegistry = Record<string, FieldBuilder<any>>;\n\n/**\n * Options for building field definitions\n */\nexport interface BuildFieldDefinitionsOptions {\n\t/**\n\t * Field names to exclude from generation\n\t */\n\texclude?: string[];\n\n\t/**\n\t * Only generate these field names\n\t */\n\tinclude?: string[];\n\n\t/**\n\t * Override generated config for specific fields\n\t */\n\toverrides?: Record<string, Partial<Record<string, unknown>>>;\n}\n\n/**\n * Result of building field definitions\n */\nexport type FieldDefinitionsResult = Record<string, FieldDefinition>;\n\n// ============================================================================\n// Main Function\n// ============================================================================\n\n/**\n * Build admin field definitions from server collection schema.\n *\n * Maps server field metadata to admin FieldDefinition objects:\n * - Uses `metadata.type` to look up field in registry\n * - Applies `metadata.meta.admin` overrides\n * - Handles relation type mapping (belongsTo -> single, hasMany -> multiple)\n *\n * @param schema - Collection schema from server introspection\n * @param registry - Field registry from admin config (admin.getFields())\n * @param options - Optional configuration\n *\n * @example\n * ```tsx\n * // In a component with admin context\n * const admin = useAdminStore(selectAdmin);\n * const { data: schema } = useCollectionSchema(\"posts\");\n * const fields = buildFieldDefinitionsFromSchema(\n * schema,\n * admin.getFields(),\n * );\n * ```\n */\n\n/**\n * Build field definitions from raw field metadata.\n * Works with metadata from any source (collection schema, global schema, block fields).\n *\n * @param fields - Record of field name to field metadata\n * @param registry - Field registry from admin config\n *\n * @example\n * ```tsx\n * const admin = useAdminStore(selectAdmin);\n * const fields = buildFieldDefinitionsFromMetadata(\n * blockDef.fields,\n * admin.getFields(),\n * );\n * ```\n */\nexport function buildFieldDefinitionsFromMetadata(\n\tfields: Record<string, { metadata?: unknown; name?: string }> | undefined,\n\tregistry: FieldRegistry,\n): FieldDefinitionsResult {\n\tif (!fields) return {};\n\n\tconst result: FieldDefinitionsResult = {};\n\n\tfor (const [fieldName, fieldSchema] of Object.entries(fields)) {\n\t\tconst metadata = (fieldSchema.metadata ?? fieldSchema) as FieldMetadata;\n\t\tconst fieldType = resolveFieldType(metadata);\n\n\t\tconst fieldBuilder = registry[fieldType];\n\t\tif (!fieldBuilder) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst config = buildFieldConfig(\n\t\t\tfieldSchema.name ?? fieldName,\n\t\t\tmetadata,\n\t\t\t{},\n\t\t\tregistry,\n\t\t\tfieldType,\n\t\t);\n\n\t\tresult[fieldName] = fieldBuilder.$options(config);\n\t}\n\n\treturn result;\n}\n\nexport function buildFieldDefinitionsFromSchema(\n\tschema: CollectionSchema | GlobalSchema | null | undefined,\n\tregistry: FieldRegistry,\n\toptions: BuildFieldDefinitionsOptions = {},\n): FieldDefinitionsResult {\n\tif (!schema) return {};\n\n\tconst relations = \"relations\" in schema ? schema.relations : {};\n\n\tconst result: FieldDefinitionsResult = {};\n\n\tfor (const [fieldName, fieldSchema] of Object.entries(schema.fields)) {\n\t\t// Skip excluded fields\n\t\tif (options.exclude?.includes(fieldName)) continue;\n\n\t\t// Skip if not in include list (when include is specified)\n\t\tif (options.include && !options.include.includes(fieldName)) continue;\n\n\t\t// Skip system fields that shouldn't be in forms\n\t\tif (isSystemField(fieldName)) continue;\n\n\t\tconst fieldDef = buildFieldDefinition(\n\t\t\tfieldName,\n\t\t\tfieldSchema,\n\t\t\trelations,\n\t\t\tregistry,\n\t\t\toptions.overrides?.[fieldName],\n\t\t);\n\n\t\tif (fieldDef) {\n\t\t\tresult[fieldName] = fieldDef;\n\t\t}\n\t}\n\n\treturn result;\n}\n\n// ============================================================================\n// Field Definition Builder\n// ============================================================================\n\n/**\n * Build a single field definition from schema\n */\nfunction buildFieldDefinition(\n\tfieldName: string,\n\tfieldSchema: { metadata: FieldMetadata },\n\trelations: Record<string, RelationSchema>,\n\tregistry: FieldRegistry,\n\toverrides?: Partial<Record<string, unknown>>,\n): FieldDefinition | null {\n\tconst { metadata } = fieldSchema;\n\tconst fieldType = resolveFieldType(metadata);\n\n\t// Get field builder from registry\n\tconst fieldBuilder = registry[fieldType];\n\tif (!fieldBuilder) {\n\t\t// Unknown field type - skip silently\n\t\t// Custom fields might not be registered in admin yet\n\t\treturn null;\n\t}\n\n\t// Build field config from metadata\n\tconst config = buildFieldConfig(\n\t\tfieldName,\n\t\tmetadata,\n\t\trelations,\n\t\tregistry,\n\t\tfieldType,\n\t);\n\n\t// Apply admin overrides from server meta\n\t// The meta.admin property is added via module augmentation on field-specific meta interfaces\n\tconst adminConfig = (metadata.meta as { admin?: AnyAdminMeta } | undefined)\n\t\t?.admin;\n\tif (adminConfig) {\n\t\tapplyAdminConfig(config, adminConfig);\n\t}\n\n\t// Apply local overrides\n\tif (overrides) {\n\t\tObject.assign(config, overrides);\n\t}\n\n\t// Create field definition with options\n\treturn fieldBuilder.$options(config);\n}\n\n/**\n * Build field config from metadata\n */\nfunction buildFieldConfig(\n\tfieldName: string,\n\tmetadata: FieldMetadata,\n\trelations: Record<string, RelationSchema>,\n\tregistry: FieldRegistry,\n\tfieldType: string,\n): Record<string, unknown> {\n\tconst config: Record<string, unknown> = {\n\t\tlabel: metadata.label ?? formatLabel(fieldName),\n\t\tdescription: metadata.description,\n\t\trequired: metadata.required,\n\t\tlocalized: metadata.localized,\n\t\treadOnly: metadata.readOnly,\n\t};\n\n\t// Apply validation constraints from base metadata\n\tif (metadata.validation) {\n\t\tObject.assign(config, metadata.validation);\n\t}\n\n\t// Handle field-type-specific config via type guard\n\tif (isSelectMetadata(metadata)) {\n\t\tapplySelectConfig(config, metadata);\n\t} else if (isRelationMetadata(metadata)) {\n\t\tif (fieldType === \"upload\") {\n\t\t\tapplyUploadConfig(config, metadata, relations[fieldName]);\n\t\t} else {\n\t\t\tapplyRelationConfig(config, metadata, relations[fieldName]);\n\t\t}\n\t} else if (isNestedMetadata(metadata)) {\n\t\tapplyNestedConfig(config, metadata, relations, registry);\n\t} else if (metadata.type === \"richText\") {\n\t\tapplyRichTextConfig(config, metadata as unknown as Record<string, unknown>);\n\t}\n\n\tapplyExtraMetadata(config, metadata);\n\n\treturn config;\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\nfunction isSelectMetadata(m: FieldMetadata): m is SelectFieldMetadata {\n\treturn m.type === \"select\";\n}\n\nfunction isRelationMetadata(m: FieldMetadata): m is RelationFieldMetadata {\n\treturn m.type === \"relation\";\n}\n\nfunction isNestedMetadata(m: FieldMetadata): m is NestedFieldMetadata {\n\treturn m.type === \"object\" || m.type === \"array\" || m.type === \"blocks\";\n}\n\n// ============================================================================\n// Config Appliers (mutate config object)\n// ============================================================================\n\n/**\n * Apply select field config\n */\nfunction applySelectConfig(\n\tconfig: Record<string, unknown>,\n\tmetadata: SelectFieldMetadata,\n): void {\n\tconfig.options = metadata.options.map((opt) => ({\n\t\tvalue: opt.value,\n\t\tlabel: opt.label ?? String(opt.value),\n\t}));\n\tif (metadata.multiple !== undefined) {\n\t\tconfig.multiple = metadata.multiple;\n\t}\n}\n\n/**\n * Apply relation field config\n */\nfunction applyRelationConfig(\n\tconfig: Record<string, unknown>,\n\tmetadata: RelationFieldMetadata,\n\trelationSchema?: RelationSchema,\n): void {\n\t// Map relation type to single/multiple\n\tconst isSingle = [\"belongsTo\", \"morphTo\"].includes(metadata.relationType);\n\n\tconfig.targetCollection = metadata.targetCollection;\n\tconfig.type = isSingle ? \"single\" : \"multiple\";\n\t// Pass through relation metadata for advanced use\n\tconfig.relationType = metadata.relationType;\n\n\tif (metadata.through ?? relationSchema?.through) {\n\t\tconfig.through = metadata.through ?? relationSchema?.through;\n\t}\n\tif (metadata.foreignKey ?? relationSchema?.foreignKey) {\n\t\tconfig.foreignKey = metadata.foreignKey ?? relationSchema?.foreignKey;\n\t}\n}\n\nfunction applyUploadConfig(\n\tconfig: Record<string, unknown>,\n\tmetadata: RelationFieldMetadata,\n\trelationSchema?: RelationSchema,\n): void {\n\tconst isMultiple = [\n\t\t\"hasMany\",\n\t\t\"manyToMany\",\n\t\t\"multiple\",\n\t\t\"morphMany\",\n\t].includes(metadata.relationType);\n\n\tconfig.to = metadata.targetCollection;\n\tconfig.multiple = isMultiple;\n\n\tif (metadata.through ?? relationSchema?.through) {\n\t\tconfig.through = metadata.through ?? relationSchema?.through;\n\t}\n\tif (metadata.foreignKey ?? relationSchema?.foreignKey) {\n\t\tconfig.foreignKey = metadata.foreignKey ?? relationSchema?.foreignKey;\n\t}\n}\n\nfunction applyNestedConfig(\n\tconfig: Record<string, unknown>,\n\tmetadata: NestedFieldMetadata,\n\trelations: Record<string, RelationSchema>,\n\tregistry: FieldRegistry,\n): void {\n\tif (!metadata.nestedFields) return;\n\n\tif (metadata.type === \"object\") {\n\t\tconst nestedDefs = buildNestedFieldDefinitions(\n\t\t\tmetadata.nestedFields,\n\t\t\trelations,\n\t\t\tregistry,\n\t\t);\n\t\tconfig.fields = () => nestedDefs;\n\t\treturn;\n\t}\n\n\tif (metadata.type === \"array\") {\n\t\tconst itemMetadata = metadata.nestedFields.item as\n\t\t\t| FieldMetadata\n\t\t\t| undefined;\n\t\tif (!itemMetadata) return;\n\n\t\tif (\n\t\t\titemMetadata.type === \"object\" &&\n\t\t\t(itemMetadata as NestedFieldMetadata).nestedFields\n\t\t) {\n\t\t\tconst itemFields = buildNestedFieldDefinitions(\n\t\t\t\t(itemMetadata as NestedFieldMetadata).nestedFields ?? {},\n\t\t\t\trelations,\n\t\t\t\tregistry,\n\t\t\t);\n\t\t\tconfig.item = () => itemFields;\n\t\t\treturn;\n\t\t}\n\n\t\tconst itemType = mapArrayItemType(itemMetadata.type);\n\t\tif (itemType) {\n\t\t\tconfig.itemType = itemType;\n\t\t\tif (itemMetadata.type === \"select\") {\n\t\t\t\tapplySelectConfig(config, itemMetadata as SelectFieldMetadata);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (metadata.type === \"blocks\") {\n\t\tconst blocksMetadata = metadata as unknown as Record<string, unknown>;\n\t\tif (blocksMetadata.allowedBlocks) {\n\t\t\tconfig.allowedBlocks = blocksMetadata.allowedBlocks;\n\t\t}\n\t\tif (blocksMetadata.minBlocks !== undefined) {\n\t\t\tconfig.minBlocks = blocksMetadata.minBlocks;\n\t\t}\n\t\tif (blocksMetadata.maxBlocks !== undefined) {\n\t\t\tconfig.maxBlocks = blocksMetadata.maxBlocks;\n\t\t}\n\t}\n}\n\nfunction applyExtraMetadata(\n\tconfig: Record<string, unknown>,\n\tmetadata: FieldMetadata,\n) {\n\tconst reservedKeys = new Set([\n\t\t\"type\",\n\t\t\"label\",\n\t\t\"description\",\n\t\t\"required\",\n\t\t\"localized\",\n\t\t\"readOnly\",\n\t\t\"writeOnly\",\n\t\t\"validation\",\n\t\t\"meta\",\n\t\t\"nestedFields\",\n\t\t\"features\",\n\t]);\n\n\tfor (const [key, value] of Object.entries(\n\t\tmetadata as unknown as Record<string, unknown>,\n\t)) {\n\t\tif (reservedKeys.has(key)) continue;\n\t\tif (key.startsWith(\"_\")) continue;\n\t\tif (value === undefined) continue;\n\t\tconfig[key] = value;\n\t}\n}\n\nfunction applyRichTextConfig(\n\tconfig: Record<string, unknown>,\n\tmetadata: Record<string, unknown>,\n) {\n\tif (metadata.maxCharacters !== undefined) {\n\t\tconfig.maxCharacters = metadata.maxCharacters;\n\t\tconfig.showCharacterCount = true;\n\t}\n\tif (metadata.placeholder !== undefined) {\n\t\tconfig.placeholder = metadata.placeholder;\n\t}\n\tif (metadata.allowImages !== undefined) {\n\t\tconfig.enableImages = metadata.allowImages;\n\t}\n\tif (metadata.imageCollection !== undefined) {\n\t\tconfig.imageCollection = metadata.imageCollection;\n\t}\n}\n\nfunction buildNestedFieldDefinitions(\n\tnestedFields: Record<string, FieldMetadata>,\n\trelations: Record<string, RelationSchema>,\n\tregistry: FieldRegistry,\n): FieldDefinitionsResult {\n\tconst result: FieldDefinitionsResult = {};\n\n\tfor (const [nestedName, nestedMetadata] of Object.entries(nestedFields)) {\n\t\tconst fieldType = resolveFieldType(nestedMetadata);\n\t\tconst fieldBuilder = registry[fieldType];\n\t\tif (!fieldBuilder) continue;\n\n\t\tconst config = buildFieldConfig(\n\t\t\tnestedName,\n\t\t\tnestedMetadata,\n\t\t\trelations,\n\t\t\tregistry,\n\t\t\tfieldType,\n\t\t);\n\n\t\tconst adminConfig = (\n\t\t\tnestedMetadata.meta as { admin?: AnyAdminMeta } | undefined\n\t\t)?.admin;\n\t\tif (adminConfig) {\n\t\t\tapplyAdminConfig(config, adminConfig);\n\t\t}\n\n\t\tresult[nestedName] = fieldBuilder.$options(config);\n\t}\n\n\treturn result;\n}\n\nfunction resolveFieldType(metadata: FieldMetadata): string {\n\tif (metadata.type === \"relation\") {\n\t\tconst relationMeta = metadata as RelationFieldMetadata;\n\t\t// Upload fields are marked explicitly by server metadata\n\t\tif (relationMeta.isUpload) {\n\t\t\treturn \"upload\";\n\t\t}\n\t}\n\treturn metadata.type;\n}\n\nfunction mapArrayItemType(type: string): string | null {\n\tconst allowed = new Set([\"text\", \"number\", \"email\", \"textarea\", \"select\"]);\n\treturn allowed.has(type) ? type : null;\n}\n\n/**\n * Apply admin config overrides from server meta.admin\n *\n * Since each field type has its own admin meta with only valid properties,\n * we simply copy all defined properties from adminConfig to config.\n */\nfunction applyAdminConfig(\n\tconfig: Record<string, unknown>,\n\tadminConfig: AnyAdminMeta,\n): void {\n\t// Copy all defined properties from admin config\n\t// Each field type's admin meta only contains valid properties for that type\n\tfor (const [key, value] of Object.entries(adminConfig)) {\n\t\tif (value !== undefined) {\n\t\t\tconfig[key] = value;\n\t\t}\n\t}\n}\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\n/**\n * Check if a field is a system field that shouldn't be in forms\n */\nfunction isSystemField(fieldName: string): boolean {\n\tconst systemFields = [\n\t\t\"id\",\n\t\t\"createdAt\",\n\t\t\"updatedAt\",\n\t\t\"deletedAt\",\n\t\t\"_title\",\n\t\t\"_locale\",\n\t];\n\treturn systemFields.includes(fieldName);\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"detect-relations.mjs","names":["withRelations: Record<string, boolean>"],"sources":["../../../src/client/utils/detect-relations.ts"],"sourcesContent":["/**\n * Detect Relations Utility\n *\n * Automatically detects relation fields (especially M:N relations)\n * that need to be included when fetching data for forms.\n */\n\nimport type { CollectionSchema } from \"questpie/client\";\nimport type { FieldDefinition } from \"../builder/field/field\";\n\nexport interface DetectRelationsConfig {\n\t/**\n\t * Collection fields configuration\n\t */\n\tfields?: Record<string, FieldDefinition>;\n\n\t/**\n\t * Collection schema from introspection\n\t */\n\tschema?: CollectionSchema;\n}\n\nfunction isMultiRelationType(relationType: unknown): boolean {\n\treturn (\n\t\trelationType === \"hasMany\" ||\n\t\trelationType === \"manyToMany\" ||\n\t\trelationType === \"multiple\" ||\n\t\trelationType === \"morphMany\"\n\t);\n}\n\n/**\n * Auto-detect M:N relation fields from config and build `with` clause.\n *\n * M:N relations need to be explicitly loaded when fetching items for editing,\n * as they are stored in junction tables and not included by default.\n *\n * @param config - Collection configuration with fields\n * @returns Object mapping relation field names to `true` for M:N relations\n *\n * @example\n * ```tsx\n * const withRelations = detectManyToManyRelations({ fields: config?.fields });\n *\n * // Use with query\n * const { data } = useCollectionItem(collection, id, {\n * with: withRelations,\n * });\n * ```\n */\nexport function detectManyToManyRelations(\n\tconfig: DetectRelationsConfig,\n): Record<string, boolean> {\n\tconst withRelations: Record<string, boolean> = {};\n\n\t// Prefer schema metadata when available (source of truth from server)\n\tif (config.schema?.fields) {\n\t\tfor (const [fieldName, fieldSchema] of Object.entries(\n\t\t\tconfig.schema.fields,\n\t\t)) {\n\t\t\tconst metadata = (fieldSchema as any)?.metadata;\n\t\t\tif (metadata?.type !== \"relation\") continue;\n\n\t\t\tif (isMultiRelationType(metadata.relationType)) {\n\t\t\t\twithRelations[fieldName] = true;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Fallback to local field definitions (for compatibility when schema is unavailable)\n\tif (config?.fields) {\n\t\tfor (const [fieldName, fieldConfig] of Object.entries(config.fields)) {\n\t\t\tconst fc = fieldConfig as any;\n\t\t\t// Detect M:N relation fields (FieldDefinition.name: \"relation\" with ~options.type: \"multiple\")\n\t\t\tif (fc?.name === \"relation\" && fc?.[\"~options\"]?.type === \"multiple\") {\n\t\t\t\twithRelations[fieldName] = true;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn withRelations;\n}\n\n/**\n * Check if there are any M:N relations to include\n */\nexport function hasManyToManyRelations(\n\twithRelations: Record<string, boolean>,\n): boolean {\n\treturn Object.keys(withRelations).length > 0;\n}\n"],"mappings":";AAsBA,SAAS,oBAAoB,cAAgC;AAC5D,QACC,iBAAiB,aACjB,iBAAiB,gBACjB,iBAAiB,cACjB,iBAAiB;;;;;;;;;;;;;;;;;;;;;AAuBnB,SAAgB,0BACf,QAC0B;CAC1B,MAAMA,gBAAyC,EAAE;AAGjD,KAAI,OAAO,QAAQ,OAClB,MAAK,MAAM,CAAC,WAAW,gBAAgB,OAAO,QAC7C,OAAO,OAAO,OACd,EAAE;EACF,MAAM,WAAY,aAAqB;AACvC,MAAI,UAAU,SAAS,WAAY;AAEnC,MAAI,oBAAoB,SAAS,aAAa,CAC7C,eAAc,aAAa;;AAM9B,KAAI,QAAQ,OACX,MAAK,MAAM,CAAC,WAAW,gBAAgB,OAAO,QAAQ,OAAO,OAAO,EAAE;EACrE,MAAM,KAAK;AAEX,MAAI,IAAI,SAAS,cAAc,KAAK,aAAa,SAAS,WACzD,eAAc,aAAa;;AAK9B,QAAO;;;;;AAMR,SAAgB,uBACf,eACU;AACV,QAAO,OAAO,KAAK,cAAc,CAAC,SAAS"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"locale-to-flag.d.mts","names":[],"sources":["../../../src/client/utils/locale-to-flag.ts"],"sourcesContent":[],"mappings":";;AAiEA;AAoGA;AA2CA;AA0BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAzKiB,UAAA;;;;;;;;;;;;;;;;;;;;;;iBAoGD,cAAA,iCAEE;;;;;;;;;;;;;;;iBAyCF,aAAA,iCAEE,yBACf;;;;;;;;;;;;;;;;iBAuBa,UAAA,gDAGE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"locale-to-flag.mjs","names":["LOCALE_TO_COUNTRY: Record<string, string>"],"sources":["../../../src/client/utils/locale-to-flag.ts"],"sourcesContent":["/**\n * Locale to Flag Utility\n *\n * Converts locale codes to country codes for flag display.\n * Uses flagcdn.com for PNG flags via CDN (no dependencies).\n *\n * ## Features\n *\n * - **Smart mapping**: Automatically maps locale codes to country codes (sk → SK, en → GB, en-US → US)\n * - **Custom overrides**: Support for custom country codes via `flagCountryCode` in locale config\n * - **Lightweight**: No dependencies, uses CDN for flags\n * - **Fallback support**: Gracefully handles unknown locale codes\n *\n * ## Usage\n *\n * ### Basic Usage\n *\n * ```tsx\n * import { getFlagUrl } from \"@questpie/admin/client\";\n *\n * function LocaleBadge({ locale }: { locale: string }) {\n * return (\n * <div>\n * <img src={getFlagUrl(locale, 20)} alt={locale} />\n * {locale}\n * </div>\n * );\n * }\n * ```\n *\n * ### Custom Country Code Mapping\n *\n * If the default mapping doesn't fit your needs, you can provide custom mapping:\n *\n * ```tsx\n * // Show US flag for English instead of UK\n * const flagUrl = getFlagUrl(\"en\", 20, { en: \"us\" });\n * ```\n *\n * ### In CMS Configuration\n *\n * The best way to customize flag mapping is in your CMS locale config:\n *\n * ```ts\n * // questpie/server/cms.ts\n * q().locale({\n * locales: [\n * {\n * code: \"en\",\n * label: \"English\",\n * flagCountryCode: \"us\", // Show US flag instead of UK\n * },\n * { code: \"sk\", label: \"Slovenčina\" },\n * ],\n * defaultLocale: \"en\",\n * })\n * ```\n *\n * The `flagCountryCode` will be automatically used by `LocaleSwitcher` and other locale UI components.\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface FlagConfig {\n /** Country code (ISO 3166-1 alpha-2) */\n countryCode: string;\n /** Alt text for accessibility */\n alt: string;\n}\n\n// ============================================================================\n// Locale to Country Code Mapping\n// ============================================================================\n\n/**\n * Maps locale codes to country codes.\n * Handles both simple codes (en, sk) and region-specific (en-US, en-GB).\n */\nconst LOCALE_TO_COUNTRY: Record<string, string> = {\n // English variants\n en: \"gb\", // Default English → Great Britain\n \"en-US\": \"us\",\n \"en-GB\": \"gb\",\n \"en-CA\": \"ca\",\n \"en-AU\": \"au\",\n \"en-NZ\": \"nz\",\n \"en-IE\": \"ie\",\n\n // European languages\n sk: \"sk\", // Slovak\n cs: \"cz\", // Czech\n de: \"de\", // German\n \"de-AT\": \"at\",\n \"de-CH\": \"ch\",\n fr: \"fr\", // French\n \"fr-CA\": \"ca\",\n \"fr-CH\": \"ch\",\n es: \"es\", // Spanish\n \"es-MX\": \"mx\",\n \"es-AR\": \"ar\",\n it: \"it\", // Italian\n pt: \"pt\", // Portuguese\n \"pt-BR\": \"br\",\n nl: \"nl\", // Dutch\n pl: \"pl\", // Polish\n ru: \"ru\", // Russian\n uk: \"ua\", // Ukrainian\n tr: \"tr\", // Turkish\n sv: \"se\", // Swedish\n no: \"no\", // Norwegian\n da: \"dk\", // Danish\n fi: \"fi\", // Finnish\n hu: \"hu\", // Hungarian\n ro: \"ro\", // Romanian\n bg: \"bg\", // Bulgarian\n hr: \"hr\", // Croatian\n sr: \"rs\", // Serbian\n sl: \"si\", // Slovenian\n et: \"ee\", // Estonian\n lv: \"lv\", // Latvian\n lt: \"lt\", // Lithuanian\n\n // Asian languages\n zh: \"cn\", // Chinese\n \"zh-CN\": \"cn\",\n \"zh-TW\": \"tw\",\n \"zh-HK\": \"hk\",\n ja: \"jp\", // Japanese\n ko: \"kr\", // Korean\n th: \"th\", // Thai\n vi: \"vn\", // Vietnamese\n id: \"id\", // Indonesian\n ms: \"my\", // Malay\n hi: \"in\", // Hindi\n ar: \"sa\", // Arabic (Saudi Arabia as default)\n he: \"il\", // Hebrew\n\n // Other\n el: \"gr\", // Greek\n fa: \"ir\", // Persian\n ur: \"pk\", // Urdu\n};\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Get country code from locale code.\n *\n * @param locale - Locale code (e.g., \"en\", \"sk\", \"en-US\")\n * @param customMapping - Optional custom locale-to-country mapping (overrides defaults)\n * @returns Country code (lowercase, e.g., \"gb\", \"sk\", \"us\")\n *\n * @example\n * ```ts\n * getCountryCode(\"en\") // \"gb\" (default)\n * getCountryCode(\"en-US\") // \"us\"\n * getCountryCode(\"sk\") // \"sk\"\n * getCountryCode(\"en\", { en: \"us\" }) // \"us\" (custom mapping)\n * getCountryCode(\"unknown\") // \"unknown\" (fallback to input)\n * ```\n */\nexport function getCountryCode(\n locale: string,\n customMapping?: Record<string, string>,\n): string {\n const normalized = locale.toLowerCase();\n\n // Try custom mapping first (highest priority)\n if (customMapping?.[normalized]) {\n return customMapping[normalized].toLowerCase();\n }\n\n // Try exact match in default mapping\n if (LOCALE_TO_COUNTRY[normalized]) {\n return LOCALE_TO_COUNTRY[normalized];\n }\n\n // Try base language code (e.g., \"en-US\" → \"en\")\n const baseCode = normalized.split(\"-\")[0];\n if (baseCode && customMapping?.[baseCode]) {\n return customMapping[baseCode].toLowerCase();\n }\n if (baseCode && LOCALE_TO_COUNTRY[baseCode]) {\n return LOCALE_TO_COUNTRY[baseCode];\n }\n\n // Fallback to input (useful for direct country codes)\n return normalized;\n}\n\n/**\n * Get flag configuration for a locale.\n *\n * @param locale - Locale code\n * @param customMapping - Optional custom locale-to-country mapping\n * @returns Flag configuration with country code and alt text\n *\n * @example\n * ```ts\n * getFlagConfig(\"sk\") // { countryCode: \"sk\", alt: \"Slovakia\" }\n * getFlagConfig(\"en-US\") // { countryCode: \"us\", alt: \"United States\" }\n * getFlagConfig(\"en\", { en: \"us\" }) // { countryCode: \"us\", alt: \"EN\" }\n * ```\n */\nexport function getFlagConfig(\n locale: string,\n customMapping?: Record<string, string>,\n): FlagConfig {\n const countryCode = getCountryCode(locale, customMapping);\n return {\n countryCode,\n alt: locale.toUpperCase(),\n };\n}\n\n/**\n * Get flag image URL from flagcdn.com.\n *\n * @param locale - Locale code\n * @param size - Width in pixels (default: 20)\n * @param customMapping - Optional custom locale-to-country mapping\n * @returns URL to flag PNG\n *\n * @example\n * ```tsx\n * <img src={getFlagUrl(\"sk\")} alt=\"SK\" />\n * <img src={getFlagUrl(\"en-US\", 40)} alt=\"EN-US\" />\n * <img src={getFlagUrl(\"en\", 20, { en: \"us\" })} alt=\"EN\" />\n * ```\n */\nexport function getFlagUrl(\n locale: string,\n size = 24,\n customMapping?: Record<string, string>,\n): string {\n const { countryCode } = getFlagConfig(locale, customMapping);\n return `https://flagcdn.com/h${size}/${countryCode}.png`;\n}\n"],"mappings":";;;;;AAgFA,MAAMA,oBAA4C;CAEhD,IAAI;CACJ,SAAS;CACT,SAAS;CACT,SAAS;CACT,SAAS;CACT,SAAS;CACT,SAAS;CAGT,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,SAAS;CACT,SAAS;CACT,IAAI;CACJ,SAAS;CACT,SAAS;CACT,IAAI;CACJ,SAAS;CACT,SAAS;CACT,IAAI;CACJ,IAAI;CACJ,SAAS;CACT,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CAGJ,IAAI;CACJ,SAAS;CACT,SAAS;CACT,SAAS;CACT,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CAGJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACL;;;;;;;;;;;;;;;;;AAsBD,SAAgB,eACd,QACA,eACQ;CACR,MAAM,aAAa,OAAO,aAAa;AAGvC,KAAI,gBAAgB,YAClB,QAAO,cAAc,YAAY,aAAa;AAIhD,KAAI,kBAAkB,YACpB,QAAO,kBAAkB;CAI3B,MAAM,WAAW,WAAW,MAAM,IAAI,CAAC;AACvC,KAAI,YAAY,gBAAgB,UAC9B,QAAO,cAAc,UAAU,aAAa;AAE9C,KAAI,YAAY,kBAAkB,UAChC,QAAO,kBAAkB;AAI3B,QAAO;;;;;;;;;;;;;;;;AAiBT,SAAgB,cACd,QACA,eACY;AAEZ,QAAO;EACL,aAFkB,eAAe,QAAQ,cAAc;EAGvD,KAAK,OAAO,aAAa;EAC1B;;;;;;;;;;;;;;;;;AAkBH,SAAgB,WACd,QACA,OAAO,IACP,eACQ;CACR,MAAM,EAAE,gBAAgB,cAAc,QAAQ,cAAc;AAC5D,QAAO,wBAAwB,KAAK,GAAG,YAAY"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"routes.mjs","names":["pagePathById: Record<string, string>","pageIdByPath: Record<string, string>","pageConfigByPath: Record<string, PageDefinition<string>>","collections: AdminRoutes<TApp>[\"collections\"]","globals: AdminRoutes<TApp>[\"globals\"]","pages: AdminRoutes<TApp>[\"pages\"]","result: Record<string, string>","matches: AdminRoutes<TApp>[\"matches\"]"],"sources":["../../../src/client/utils/routes.ts"],"sourcesContent":["/**\n * Type-Safe Admin Routes\n *\n * Utilities for building type-safe routes for admin UI navigation.\n * Accepts the admin config to provide fully type-safe routing.\n */\n\nimport type { Questpie } from \"questpie\";\nimport type { Admin } from \"../builder/admin\";\nimport type { CollectionNames, GlobalNames, PageDefinition } from \"../builder\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Collection route actions\n */\nexport type CollectionAction = \"list\" | \"create\" | \"edit\" | \"view\";\n\n/**\n * Parsed route information\n */\nexport type ParsedRoute<TApp extends Questpie<any>> =\n | { type: \"dashboard\" }\n | {\n type: \"collection\";\n collection: CollectionNames<TApp>;\n action: \"list\" | \"create\" | \"edit\";\n id?: string;\n }\n | { type: \"global\"; global: GlobalNames<TApp> }\n | {\n type: \"page\";\n pageId: string;\n path: string;\n config: PageDefinition<string>;\n }\n | { type: \"unknown\"; path: string };\n\n/**\n * Admin routes builder result\n */\nexport interface AdminRoutes<TApp extends Questpie<any>> {\n /** Base path */\n basePath: string;\n\n /** Dashboard route */\n dashboard: () => string;\n\n /** Collection routes */\n collections: {\n /** List all items in a collection */\n list: <K extends CollectionNames<TApp>>(collection: K) => string;\n /** Create new item in a collection */\n create: <K extends CollectionNames<TApp>>(collection: K) => string;\n /** Edit/view a specific item */\n edit: <K extends CollectionNames<TApp>>(\n collection: K,\n id: string,\n ) => string;\n /** Alias for edit */\n view: <K extends CollectionNames<TApp>>(\n collection: K,\n id: string,\n ) => string;\n /** Get route for any action */\n route: <K extends CollectionNames<TApp>>(\n collection: K,\n action: CollectionAction,\n id?: string,\n ) => string;\n };\n\n /** Global routes */\n globals: {\n /** Edit a global */\n edit: <K extends GlobalNames<TApp>>(global: K) => string;\n };\n\n /** Custom page routes */\n pages: {\n /** Get route for a custom page by ID */\n byId: (pageId: string) => string | null;\n /** Get all page routes as record */\n all: () => Record<string, string>;\n /** Get list of all page IDs */\n ids: () => string[];\n };\n\n /** Parse current route to determine what's being viewed */\n parse: (pathname: string) => ParsedRoute<TApp>;\n\n /** Check if a path matches a specific route */\n matches: {\n dashboard: (pathname: string) => boolean;\n collection: <K extends CollectionNames<TApp>>(\n pathname: string,\n collection?: K,\n ) => boolean;\n global: <K extends GlobalNames<TApp>>(\n pathname: string,\n global?: K,\n ) => boolean;\n page: (pathname: string, pageId?: string) => boolean;\n };\n\n /** Get URL with query params */\n withQuery: (\n path: string,\n params: Record<string, string | number | boolean | undefined | null>,\n ) => string;\n}\n\n// ============================================================================\n// Route Builder\n// ============================================================================\n\n/**\n * Create type-safe admin routes from admin config\n *\n * @example\n * ```tsx\n * import { createAdminRoutes } from '@questpie/admin/utils/routes'\n * import { barbershopAdmin } from './configs/admin'\n *\n * const routes = createAdminRoutes(barbershopAdmin)\n *\n * // Type-safe route generation\n * routes.dashboard() // \"/admin\"\n * routes.collections.list('posts') // \"/admin/collections/posts\"\n * routes.collections.create('posts') // \"/admin/collections/posts/create\"\n * routes.collections.edit('posts', '1') // \"/admin/collections/posts/1\"\n * routes.globals.edit('siteSettings') // \"/admin/globals/siteSettings\"\n * routes.pages.byId('analytics') // \"/admin/analytics\" (from page config)\n *\n * // Parse current route\n * const parsed = routes.parse('/admin/collections/posts/123')\n * // { type: 'collection', collection: 'posts', action: 'edit', id: '123' }\n * ```\n */\nexport function createAdminRoutes<TApp extends Questpie<any>>(\n admin: Admin,\n options: { basePath?: string } = {},\n): AdminRoutes<TApp> {\n const basePath = options.basePath ?? \"/admin\";\n const pagesConfig = admin.getPages();\n\n // Build page path lookup\n const pagePathById: Record<string, string> = {};\n const pageIdByPath: Record<string, string> = {};\n const pageConfigByPath: Record<string, PageDefinition<string>> = {};\n\n for (const [id, config] of Object.entries(pagesConfig)) {\n const configPath = (config as any).path ?? id;\n const pagePath = configPath.startsWith(\"/\")\n ? configPath.slice(1)\n : configPath;\n pagePathById[id] = pagePath;\n pageIdByPath[pagePath] = id;\n pageConfigByPath[pagePath] = config as PageDefinition<string>;\n }\n\n // Helper to join path segments\n const joinPath = (...segments: string[]): string => {\n return segments.filter(Boolean).join(\"/\");\n };\n\n // Collection routes\n const collections: AdminRoutes<TApp>[\"collections\"] = {\n list: (collection) => joinPath(basePath, \"collections\", collection),\n\n create: (collection) =>\n joinPath(basePath, \"collections\", collection, \"create\"),\n\n edit: (collection, id) => joinPath(basePath, \"collections\", collection, id),\n\n view: (collection, id) => joinPath(basePath, \"collections\", collection, id),\n\n route: (collection, action, id) => {\n switch (action) {\n case \"list\":\n return collections.list(collection);\n case \"create\":\n return collections.create(collection);\n case \"edit\":\n case \"view\":\n if (!id) throw new Error(`ID required for ${action} action`);\n return collections.edit(collection, id);\n default:\n return collections.list(collection);\n }\n },\n };\n\n // Global routes\n const globals: AdminRoutes<TApp>[\"globals\"] = {\n edit: (global) => joinPath(basePath, \"globals\", global),\n };\n\n // Page routes\n const pages: AdminRoutes<TApp>[\"pages\"] = {\n byId: (pageId) => {\n const pagePath = pagePathById[pageId];\n if (!pagePath) return null;\n return joinPath(basePath, pagePath);\n },\n\n all: () => {\n const result: Record<string, string> = {};\n for (const [id, path] of Object.entries(pagePathById)) {\n result[id] = joinPath(basePath, path);\n }\n return result;\n },\n\n ids: () => Object.keys(pagePathById),\n };\n\n // Parse route\n const parse = (pathname: string): ParsedRoute<TApp> => {\n // Remove trailing slash and base path\n const cleanPath = pathname.replace(/\\/$/, \"\");\n const relativePath = cleanPath.startsWith(basePath)\n ? cleanPath.slice(basePath.length)\n : cleanPath;\n\n // Dashboard\n if (relativePath === \"\" || relativePath === \"/\") {\n return { type: \"dashboard\" };\n }\n\n const segments = relativePath.split(\"/\").filter(Boolean);\n\n // Collections: /collections/:name/:action?\n if (segments[0] === \"collections\" && segments[1]) {\n const collection = segments[1] as CollectionNames<TApp>;\n\n if (!segments[2]) {\n return { type: \"collection\", collection, action: \"list\" };\n }\n\n if (segments[2] === \"create\") {\n return { type: \"collection\", collection, action: \"create\" };\n }\n\n return {\n type: \"collection\",\n collection,\n action: \"edit\",\n id: segments[2],\n };\n }\n\n // Globals: /globals/:name\n if (segments[0] === \"globals\" && segments[1]) {\n return { type: \"global\", global: segments[1] as GlobalNames<TApp> };\n }\n\n // Custom pages - check against configured pages\n const pageRelativePath = segments.join(\"/\");\n if (pageIdByPath[pageRelativePath]) {\n return {\n type: \"page\",\n pageId: pageIdByPath[pageRelativePath],\n path: pageRelativePath,\n config: pageConfigByPath[pageRelativePath],\n };\n }\n\n // Also check if first segment matches a page\n if (pageIdByPath[segments[0]]) {\n return {\n type: \"page\",\n pageId: pageIdByPath[segments[0]],\n path: segments[0],\n config: pageConfigByPath[segments[0]],\n };\n }\n\n // Unknown/custom page\n return { type: \"unknown\", path: relativePath };\n };\n\n // Matchers\n const matches: AdminRoutes<TApp>[\"matches\"] = {\n dashboard: (pathname) => {\n const parsed = parse(pathname);\n return parsed.type === \"dashboard\";\n },\n\n collection: (pathname, collection?) => {\n const parsed = parse(pathname);\n if (parsed.type !== \"collection\") return false;\n if (collection && parsed.collection !== collection) return false;\n return true;\n },\n\n global: (pathname, global?) => {\n const parsed = parse(pathname);\n if (parsed.type !== \"global\") return false;\n if (global && parsed.global !== global) return false;\n return true;\n },\n\n page: (pathname, pageId?) => {\n const parsed = parse(pathname);\n if (parsed.type !== \"page\") return false;\n if (pageId && parsed.pageId !== pageId) return false;\n return true;\n },\n };\n\n // Query string helper\n const withQuery = (\n path: string,\n params: Record<string, string | number | boolean | undefined | null>,\n ): string => {\n return path + buildQueryString(params);\n };\n\n return {\n basePath,\n dashboard: () => basePath,\n collections,\n globals,\n pages,\n parse,\n matches,\n withQuery,\n };\n}\n\n// ============================================================================\n// Standalone Route Builder (without admin config)\n// ============================================================================\n\n/**\n * Create admin routes without admin config (less type-safe, but works without context)\n *\n * @example\n * ```tsx\n * const routes = createAdminRoutesSimple({ basePath: '/admin' })\n * routes.collections.list('posts')\n * ```\n */\nexport function createAdminRoutesSimple(\n options: { basePath?: string; pages?: Record<string, { path: string }> } = {},\n) {\n const basePath = options.basePath ?? \"/admin\";\n const pagesConfig = options.pages ?? {};\n\n const joinPath = (...segments: string[]): string => {\n return segments.filter(Boolean).join(\"/\");\n };\n\n return {\n basePath,\n dashboard: () => basePath,\n\n collections: {\n list: (collection: string) =>\n joinPath(basePath, \"collections\", collection),\n create: (collection: string) =>\n joinPath(basePath, \"collections\", collection, \"create\"),\n edit: (collection: string, id: string) =>\n joinPath(basePath, \"collections\", collection, id),\n },\n\n globals: {\n edit: (global: string) => joinPath(basePath, \"globals\", global),\n },\n\n pages: {\n byId: (pageId: string) => {\n const config = pagesConfig[pageId];\n if (!config) return null;\n const path = config.path.startsWith(\"/\")\n ? config.path.slice(1)\n : config.path;\n return joinPath(basePath, path);\n },\n },\n };\n}\n\n// ============================================================================\n// Route Helpers\n// ============================================================================\n\n/**\n * Build a query string from params\n */\nexport function buildQueryString(\n params: Record<string, string | number | boolean | undefined | null>,\n): string {\n const entries = Object.entries(params)\n .filter(([, value]) => value !== undefined && value !== null)\n .map(\n ([key, value]) =>\n `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`,\n );\n\n return entries.length > 0 ? `?${entries.join(\"&\")}` : \"\";\n}\n\n/**\n * Build a route with query params\n */\nexport function withQuery(\n path: string,\n params: Record<string, string | number | boolean | undefined | null>,\n): string {\n return path + buildQueryString(params);\n}\n\n/**\n * Extract collection info from a route path\n */\nexport function parseCollectionRoute(\n pathname: string,\n basePath = \"/admin\",\n): {\n collection: string;\n action: \"list\" | \"create\" | \"edit\";\n id?: string;\n} | null {\n const cleanPath = pathname.replace(/\\/$/, \"\");\n const relativePath = cleanPath.startsWith(basePath)\n ? cleanPath.slice(basePath.length)\n : cleanPath;\n\n const match = relativePath.match(/^\\/collections\\/([^/]+)(?:\\/([^/]+))?$/);\n if (!match) return null;\n\n const [, collection, actionOrId] = match;\n\n if (!actionOrId) {\n return { collection, action: \"list\" };\n }\n\n if (actionOrId === \"create\") {\n return { collection, action: \"create\" };\n }\n\n return { collection, action: \"edit\", id: actionOrId };\n}\n\n/**\n * Extract global info from a route path\n */\nexport function parseGlobalRoute(\n pathname: string,\n basePath = \"/admin\",\n): { global: string } | null {\n const cleanPath = pathname.replace(/\\/$/, \"\");\n const relativePath = cleanPath.startsWith(basePath)\n ? cleanPath.slice(basePath.length)\n : cleanPath;\n\n const match = relativePath.match(/^\\/globals\\/([^/]+)$/);\n if (!match) return null;\n\n return { global: match[1] };\n}\n\n// ============================================================================\n// Navigation Helpers\n// ============================================================================\n\n/**\n * Create a navigation helper function\n *\n * @example\n * ```tsx\n * const routes = createAdminRoutes(admin)\n * const go = createNavigator(routes, navigate)\n *\n * // Navigate to routes\n * go.dashboard()\n * go.collection('posts')\n * go.collectionCreate('posts')\n * go.collectionEdit('posts', '123')\n * go.global('siteSettings')\n * go.page('analytics')\n * ```\n */\nexport function createNavigator<TApp extends Questpie<any>>(\n routes: AdminRoutes<TApp>,\n navigate: (path: string) => void,\n) {\n return {\n /** Navigate to dashboard */\n dashboard: () => navigate(routes.dashboard()),\n\n /** Navigate to collection list */\n collection: <K extends CollectionNames<TApp>>(collection: K) =>\n navigate(routes.collections.list(collection)),\n\n /** Navigate to collection create */\n collectionCreate: <K extends CollectionNames<TApp>>(collection: K) =>\n navigate(routes.collections.create(collection)),\n\n /** Navigate to collection edit */\n collectionEdit: <K extends CollectionNames<TApp>>(\n collection: K,\n id: string,\n ) => navigate(routes.collections.edit(collection, id)),\n\n /** Navigate to global edit */\n global: <K extends GlobalNames<TApp>>(global: K) =>\n navigate(routes.globals.edit(global)),\n\n /** Navigate to custom page */\n page: (pageId: string) => {\n const path = routes.pages.byId(pageId);\n if (path) navigate(path);\n },\n\n /** Navigate to any path */\n to: (path: string) => navigate(path),\n };\n}\n\n// ============================================================================\n// Type Exports\n// ============================================================================\n\nexport type { CollectionNames, GlobalNames } from \"../builder\";\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"accept-invite-form.d.mts","names":[],"sources":["../../../../src/client/views/auth/accept-invite-form.tsx"],"sourcesContent":[],"mappings":";;;;;;AAqBY,KAAA,sBAAA,GAAsB;EAMtB,IAAA,EAAA,MAAA;EAqDI,QAAA,EAAA,MAAA;EACd,eAAA,EAAA,MAAA;CACA;AACA,KAxDU,qBAAA,GAwDV;EACA;EACA,QAAA,EAAA,CAAA,MAAA,EAxDmB,sBAwDnB,EAAA,GAxD8C,OAwD9C,CAAA,IAAA,CAAA;EACC;EAAqB,KAAA,CAAA,EAAA,MAAA;EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBANR,gBAAA;;;;;;GAMb,wBAAqB,kBAAA,CAAA,GAAA,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"accept-invite-form.mjs","names":[],"sources":["../../../../src/client/views/auth/accept-invite-form.tsx"],"sourcesContent":["/**\n * Accept Invite Form - complete registration after receiving invitation\n */\n\nimport { Icon } from \"@iconify/react\";\nimport * as React from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { Alert, AlertDescription } from \"../../components/ui/alert\";\nimport { Button } from \"../../components/ui/button\";\nimport {\n Field,\n FieldContent,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLabel,\n} from \"../../components/ui/field\";\nimport { Input } from \"../../components/ui/input\";\nimport { useTranslation } from \"../../i18n/hooks\";\nimport { cn } from \"../../lib/utils\";\n\nexport type AcceptInviteFormValues = {\n name: string;\n password: string;\n confirmPassword: string;\n};\n\nexport type AcceptInviteFormProps = {\n /** Called when form is submitted with valid data */\n onSubmit: (values: AcceptInviteFormValues) => Promise<void>;\n /** Email from the invitation (display only) */\n email?: string;\n /** Additional class name */\n className?: string;\n /** Error message from auth */\n error?: string | null;\n /** Minimum password length */\n minPasswordLength?: number;\n};\n\n/**\n * Accept invite form for new users to complete registration\n *\n * @example\n * ```tsx\n * function AcceptInvitePage({ token }: { token: string }) {\n * const authClient = useAuthClient()\n * const [error, setError] = useState<string | null>(null)\n * const [invitation, setInvitation] = useState<any>(null)\n *\n * // Fetch invitation details on mount\n * useEffect(() => {\n * authClient.admin.getInvitation({ token })\n * .then(setInvitation)\n * .catch(() => setError('Invalid or expired invitation'))\n * }, [token])\n *\n * const handleAccept = async (values: AcceptInviteFormValues) => {\n * const result = await authClient.admin.acceptInvitation({\n * token,\n * name: values.name,\n * password: values.password,\n * })\n * if (result.error) {\n * setError(result.error.message)\n * } else {\n * // Redirect to admin\n * }\n * }\n *\n * return (\n * <AcceptInviteForm\n * onSubmit={handleAccept}\n * email={invitation?.email}\n * error={error}\n * />\n * )\n * }\n * ```\n */\nexport function AcceptInviteForm({\n onSubmit,\n email,\n className,\n error,\n minPasswordLength = 8,\n}: AcceptInviteFormProps) {\n const { t } = useTranslation();\n const {\n register,\n handleSubmit,\n watch,\n formState: { errors, isSubmitting },\n } = useForm<AcceptInviteFormValues>({\n defaultValues: {\n name: \"\",\n password: \"\",\n confirmPassword: \"\",\n },\n });\n\n const password = watch(\"password\");\n\n const handleFormSubmit = handleSubmit(async (values) => {\n await onSubmit(values);\n });\n\n return (\n <form onSubmit={handleFormSubmit} className={cn(\"space-y-4\", className)}>\n <FieldGroup>\n {/* Email Display (read-only) */}\n {email && (\n <Field>\n <FieldLabel>{t(\"auth.email\")}</FieldLabel>\n <FieldContent>\n <Input type=\"email\" value={email} disabled className=\"bg-muted\" />\n </FieldContent>\n </Field>\n )}\n\n {/* Name Field */}\n <Field data-invalid={!!errors.name}>\n <FieldLabel htmlFor=\"accept-name\">{t(\"auth.name\")}</FieldLabel>\n <FieldContent>\n <div className=\"relative\">\n <Icon\n icon=\"ph:user-duotone\"\n className=\"text-muted-foreground absolute left-2 top-1/2 size-4 -translate-y-1/2\"\n />\n <Input\n id=\"accept-name\"\n type=\"text\"\n placeholder={t(\"auth.namePlaceholder\")}\n className=\"pl-8\"\n autoComplete=\"name\"\n aria-invalid={!!errors.name}\n {...register(\"name\", {\n required: t(\"auth.nameRequired\"),\n minLength: {\n value: 2,\n message: t(\"auth.nameMinLength\", { min: 2 }),\n },\n })}\n />\n </div>\n <FieldError>{errors.name?.message}</FieldError>\n </FieldContent>\n </Field>\n\n {/* Password Field */}\n <Field data-invalid={!!errors.password}>\n <FieldLabel htmlFor=\"accept-password\">\n {t(\"auth.password\")}\n </FieldLabel>\n <FieldContent>\n <div className=\"relative\">\n <Icon\n icon=\"ph:lock-duotone\"\n className=\"text-muted-foreground absolute left-2 top-1/2 size-4 -translate-y-1/2\"\n />\n <Input\n id=\"accept-password\"\n type=\"password\"\n placeholder={t(\"auth.passwordPlaceholder\")}\n className=\"pl-8\"\n autoComplete=\"new-password\"\n aria-invalid={!!errors.password}\n {...register(\"password\", {\n required: t(\"auth.passwordRequired\"),\n minLength: {\n value: minPasswordLength,\n message: t(\"auth.passwordMinLength\", {\n min: minPasswordLength,\n }),\n },\n })}\n />\n </div>\n <FieldDescription>\n {t(\"auth.passwordMinLength\", { min: minPasswordLength })}\n </FieldDescription>\n <FieldError>{errors.password?.message}</FieldError>\n </FieldContent>\n </Field>\n\n {/* Confirm Password Field */}\n <Field data-invalid={!!errors.confirmPassword}>\n <FieldLabel htmlFor=\"accept-confirm-password\">\n {t(\"auth.confirmPassword\")}\n </FieldLabel>\n <FieldContent>\n <div className=\"relative\">\n <Icon\n icon=\"ph:lock-duotone\"\n className=\"text-muted-foreground absolute left-2 top-1/2 size-4 -translate-y-1/2\"\n />\n <Input\n id=\"accept-confirm-password\"\n type=\"password\"\n placeholder={t(\"auth.confirmPasswordPlaceholder\")}\n className=\"pl-8\"\n autoComplete=\"new-password\"\n aria-invalid={!!errors.confirmPassword}\n {...register(\"confirmPassword\", {\n required: t(\"auth.passwordRequired\"),\n validate: (value) =>\n value === password || t(\"auth.passwordMismatch\"),\n })}\n />\n </div>\n <FieldError>{errors.confirmPassword?.message}</FieldError>\n </FieldContent>\n </Field>\n </FieldGroup>\n\n {/* Error Message */}\n {error && (\n <Alert variant=\"destructive\">\n <Icon icon=\"ph:warning-circle\" />\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n )}\n\n {/* Submit Button */}\n <Button\n type=\"submit\"\n className=\"w-full\"\n size=\"lg\"\n disabled={isSubmitting}\n >\n {isSubmitting ? (\n <>\n <Icon icon=\"ph:spinner-gap-bold\" className=\"animate-spin\" />\n {t(\"auth.acceptingInvite\")}\n </>\n ) : (\n t(\"auth.acceptInvite\")\n )}\n </Button>\n </form>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgFA,SAAgB,iBAAiB,EAC/B,UACA,OACA,WACA,OACA,oBAAoB,KACI;CACxB,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,EACJ,UACA,cACA,OACA,WAAW,EAAE,QAAQ,mBACnB,QAAgC,EAClC,eAAe;EACb,MAAM;EACN,UAAU;EACV,iBAAiB;EAClB,EACF,CAAC;CAEF,MAAM,WAAW,MAAM,WAAW;AAMlC,QACE,qBAAC;EAAK,UALiB,aAAa,OAAO,WAAW;AACtD,SAAM,SAAS,OAAO;IACtB;EAGkC,WAAW,GAAG,aAAa,UAAU;;GACrE,qBAAC;IAEE,SACC,qBAAC,oBACC,oBAAC,wBAAY,EAAE,aAAa,GAAc,EAC1C,oBAAC,0BACC,oBAAC;KAAM,MAAK;KAAQ,OAAO;KAAO;KAAS,WAAU;MAAa,GACrD,IACT;IAIV,qBAAC;KAAM,gBAAc,CAAC,CAAC,OAAO;gBAC5B,oBAAC;MAAW,SAAQ;gBAAe,EAAE,YAAY;OAAc,EAC/D,qBAAC,2BACC,qBAAC;MAAI,WAAU;iBACb,oBAAC;OACC,MAAK;OACL,WAAU;QACV,EACF,oBAAC;OACC,IAAG;OACH,MAAK;OACL,aAAa,EAAE,uBAAuB;OACtC,WAAU;OACV,cAAa;OACb,gBAAc,CAAC,CAAC,OAAO;OACvB,GAAI,SAAS,QAAQ;QACnB,UAAU,EAAE,oBAAoB;QAChC,WAAW;SACT,OAAO;SACP,SAAS,EAAE,sBAAsB,EAAE,KAAK,GAAG,CAAC;SAC7C;QACF,CAAC;QACF;OACE,EACN,oBAAC,wBAAY,OAAO,MAAM,UAAqB,IAClC;MACT;IAGR,qBAAC;KAAM,gBAAc,CAAC,CAAC,OAAO;gBAC5B,oBAAC;MAAW,SAAQ;gBACjB,EAAE,gBAAgB;OACR,EACb,qBAAC;MACC,qBAAC;OAAI,WAAU;kBACb,oBAAC;QACC,MAAK;QACL,WAAU;SACV,EACF,oBAAC;QACC,IAAG;QACH,MAAK;QACL,aAAa,EAAE,2BAA2B;QAC1C,WAAU;QACV,cAAa;QACb,gBAAc,CAAC,CAAC,OAAO;QACvB,GAAI,SAAS,YAAY;SACvB,UAAU,EAAE,wBAAwB;SACpC,WAAW;UACT,OAAO;UACP,SAAS,EAAE,0BAA0B,EACnC,KAAK,mBACN,CAAC;UACH;SACF,CAAC;SACF;QACE;MACN,oBAAC,8BACE,EAAE,0BAA0B,EAAE,KAAK,mBAAmB,CAAC,GACvC;MACnB,oBAAC,wBAAY,OAAO,UAAU,UAAqB;SACtC;MACT;IAGR,qBAAC;KAAM,gBAAc,CAAC,CAAC,OAAO;gBAC5B,oBAAC;MAAW,SAAQ;gBACjB,EAAE,uBAAuB;OACf,EACb,qBAAC,2BACC,qBAAC;MAAI,WAAU;iBACb,oBAAC;OACC,MAAK;OACL,WAAU;QACV,EACF,oBAAC;OACC,IAAG;OACH,MAAK;OACL,aAAa,EAAE,kCAAkC;OACjD,WAAU;OACV,cAAa;OACb,gBAAc,CAAC,CAAC,OAAO;OACvB,GAAI,SAAS,mBAAmB;QAC9B,UAAU,EAAE,wBAAwB;QACpC,WAAW,UACT,UAAU,YAAY,EAAE,wBAAwB;QACnD,CAAC;QACF;OACE,EACN,oBAAC,wBAAY,OAAO,iBAAiB,UAAqB,IAC7C;MACT;OACG;GAGZ,SACC,qBAAC;IAAM,SAAQ;eACb,oBAAC,QAAK,MAAK,sBAAsB,EACjC,oBAAC,8BAAkB,QAAyB;KACtC;GAIV,oBAAC;IACC,MAAK;IACL,WAAU;IACV,MAAK;IACL,UAAU;cAET,eACC,4CACE,oBAAC;KAAK,MAAK;KAAsB,WAAU;MAAiB,EAC3D,EAAE,uBAAuB,IACzB,GAEH,EAAE,oBAAoB;KAEjB;;GACJ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth-layout.d.mts","names":[],"sources":["../../../../src/client/views/auth/auth-layout.tsx"],"sourcesContent":[],"mappings":";;;;AAcY,KAAA,eAAA,GAAe;EAMlB;EAEE,KAAM,EAAA,MAAA;EAEL;EAAe,WAAA,CAAA,EAAA,MAAA;EAoBX;EACd,IAAA,CAAA,EAzBO,OAAA,CAAM,SAyBb;EACA;EACA,MAAA,CAAA,EAzBS,OAAA,CAAM,SAyBf;EACA;EACA,QAAA,EAzBU,OAAA,CAAM,SAyBhB;EACA;EACC,SAAA,CAAA,EAAA,MAAA;CAAe;;;;;;;;;;;;;;;;iBAPF,UAAA;;;;;;;GAOb,kBAAe,kBAAA,CAAA,GAAA,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth-layout.mjs","names":[],"sources":["../../../../src/client/views/auth/auth-layout.tsx"],"sourcesContent":["/**\n * Auth Layout - centered card layout for authentication pages\n */\n\nimport * as React from \"react\";\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from \"../../components/ui/card\";\nimport { cn } from \"../../lib/utils\";\n\nexport type AuthLayoutProps = {\n /** Page title */\n title: string;\n /** Page description */\n description?: string;\n /** Logo component or element */\n logo?: React.ReactNode;\n /** Footer content (e.g., links to other auth pages) */\n footer?: React.ReactNode;\n /** Form content */\n children: React.ReactNode;\n /** Additional class name for the card */\n className?: string;\n};\n\n/**\n * Centered layout for authentication pages (login, register, forgot password, etc.)\n *\n * @example\n * ```tsx\n * <AuthLayout\n * title=\"Sign in\"\n * description=\"Enter your credentials to access the admin panel\"\n * logo={<Logo />}\n * footer={<Link to=\"/forgot-password\">Forgot password?</Link>}\n * >\n * <LoginForm />\n * </AuthLayout>\n * ```\n */\nexport function AuthLayout({\n title,\n description,\n logo,\n footer,\n children,\n className,\n}: AuthLayoutProps) {\n return (\n <div className=\"bg-background flex min-h-screen flex-col items-center justify-center p-4\">\n <div className=\"w-full max-w-sm space-y-6\">\n {/* Logo */}\n {logo && <div className=\"flex justify-center\">{logo}</div>}\n\n {/* Main Card */}\n <Card className={cn(\"w-full\", className)}>\n <CardHeader className=\"text-center\">\n <CardTitle className=\"text-lg\">{title}</CardTitle>\n {description && <CardDescription>{description}</CardDescription>}\n </CardHeader>\n <CardContent>{children}</CardContent>\n </Card>\n\n {/* Footer */}\n {footer && (\n <div className=\"text-muted-foreground text-center text-xs\">\n {footer}\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA4CA,SAAgB,WAAW,EACzB,OACA,aACA,MACA,QACA,UACA,aACkB;AAClB,QACE,oBAAC;EAAI,WAAU;YACb,qBAAC;GAAI,WAAU;;IAEZ,QAAQ,oBAAC;KAAI,WAAU;eAAuB;MAAW;IAG1D,qBAAC;KAAK,WAAW,GAAG,UAAU,UAAU;gBACtC,qBAAC;MAAW,WAAU;iBACpB,oBAAC;OAAU,WAAU;iBAAW;QAAkB,EACjD,eAAe,oBAAC,6BAAiB,cAA8B;OACrD,EACb,oBAAC,eAAa,WAAuB;MAChC;IAGN,UACC,oBAAC;KAAI,WAAU;eACZ;MACG;;IAEJ;GACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"forgot-password-form.d.mts","names":[],"sources":["../../../../src/client/views/auth/forgot-password-form.tsx"],"sourcesContent":[],"mappings":";;;;;;AAmBY,KAAA,wBAAA,GAAwB;EAIxB,KAAA,EAAA,MAAA;CAES;AAA6B,KAFtC,uBAAA,GAEsC;EAIxB;EAAR,QAAA,EAAA,CAAA,MAAA,EAJG,wBAIH,EAAA,GAJgC,OAIhC,CAAA,IAAA,CAAA;EAAO;EAmCT,kBAAA,CAAA,EAAkB,GAAA,GAAA,IAAA;EAChC;EACA,aAAA,CAAA,EArCgB,OAqChB,CArCwB,wBAqCxB,CAAA;EACA;EACA,SAAA,CAAA,EAAA,MAAA;EACA;EACC,KAAA,CAAA,EAAA,MAAA,GAAA,IAAA;CAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBANV,kBAAA;;;;;;GAMb,0BAAuB,kBAAA,CAAA,GAAA,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"forgot-password-form.mjs","names":["React"],"sources":["../../../../src/client/views/auth/forgot-password-form.tsx"],"sourcesContent":["/**\n * Forgot Password Form - request password reset email\n */\n\nimport { Icon } from \"@iconify/react\";\nimport * as React from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { Alert, AlertDescription } from \"../../components/ui/alert\";\nimport { Button } from \"../../components/ui/button\";\nimport {\n Field,\n FieldContent,\n FieldError,\n FieldGroup,\n FieldLabel,\n} from \"../../components/ui/field\";\nimport { Input } from \"../../components/ui/input\";\nimport { cn } from \"../../lib/utils\";\n\nexport type ForgotPasswordFormValues = {\n email: string;\n};\n\nexport type ForgotPasswordFormProps = {\n /** Called when form is submitted with valid data */\n onSubmit: (values: ForgotPasswordFormValues) => Promise<void>;\n /** Called when back to login link is clicked */\n onBackToLoginClick?: () => void;\n /** Default values */\n defaultValues?: Partial<ForgotPasswordFormValues>;\n /** Additional class name */\n className?: string;\n /** Error message from auth */\n error?: string | null;\n};\n\n/**\n * Forgot password form with email field\n *\n * @example\n * ```tsx\n * const authClient = createAdminAuthClient<typeof cms>({ baseURL: '...' })\n *\n * function ForgotPasswordPage() {\n * const [error, setError] = useState<string | null>(null)\n *\n * const handleSubmit = async (values: ForgotPasswordFormValues) => {\n * const result = await authClient.forgetPassword({\n * email: values.email,\n * redirectTo: '/reset-password',\n * })\n * if (result.error) {\n * setError(result.error.message)\n * }\n * }\n *\n * return (\n * <AuthLayout title=\"Forgot password\">\n * <ForgotPasswordForm onSubmit={handleSubmit} error={error} />\n * </AuthLayout>\n * )\n * }\n * ```\n */\nexport function ForgotPasswordForm({\n onSubmit,\n onBackToLoginClick,\n defaultValues,\n className,\n error,\n}: ForgotPasswordFormProps) {\n const [isSuccess, setIsSuccess] = React.useState(false);\n\n const {\n register,\n handleSubmit,\n formState: { errors, isSubmitting },\n } = useForm<ForgotPasswordFormValues>({\n defaultValues: {\n email: \"\",\n ...defaultValues,\n },\n });\n\n const handleFormSubmit = handleSubmit(async (values) => {\n try {\n await onSubmit(values);\n // Only set success if no error was thrown\n // The parent component should throw or not set error prop before this resolves\n setIsSuccess(true);\n } catch {\n // Error will be shown via the error prop from parent\n // Do not set success state on error\n }\n });\n\n // Success state\n if (isSuccess) {\n return (\n <div className={cn(\"space-y-4 text-center\", className)}>\n <div className=\"bg-primary/10 mx-auto flex size-12 items-center justify-center\">\n <Icon\n icon=\"ph:check-circle-duotone\"\n className=\"text-primary size-6\"\n />\n </div>\n <div className=\"space-y-2\">\n <h3 className=\"text-sm font-medium\">Check your email</h3>\n <p className=\"text-muted-foreground text-xs\">\n We've sent a password reset link to your email address. Please check\n your inbox and follow the instructions.\n </p>\n </div>\n <Button\n type=\"button\"\n variant=\"outline\"\n className=\"w-full\"\n onClick={onBackToLoginClick}\n >\n Back to login\n </Button>\n </div>\n );\n }\n\n return (\n <form onSubmit={handleFormSubmit} className={cn(\"space-y-4\", className)}>\n <p className=\"text-muted-foreground text-xs\">\n Enter your email address and we'll send you a link to reset your\n password.\n </p>\n\n <FieldGroup>\n {/* Email Field */}\n <Field data-invalid={!!errors.email}>\n <FieldLabel htmlFor=\"email\">Email</FieldLabel>\n <FieldContent>\n <div className=\"relative\">\n <Icon\n icon=\"ph:envelope-duotone\"\n className=\"text-muted-foreground absolute left-2 top-1/2 size-4 -translate-y-1/2\"\n />\n <Input\n id=\"email\"\n type=\"email\"\n placeholder=\"you@example.com\"\n className=\"pl-8\"\n autoComplete=\"email\"\n aria-invalid={!!errors.email}\n {...register(\"email\", {\n required: \"Email is required\",\n pattern: {\n value: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\n message: \"Invalid email address\",\n },\n })}\n />\n </div>\n <FieldError>{errors.email?.message}</FieldError>\n </FieldContent>\n </Field>\n </FieldGroup>\n\n {/* Error Message */}\n {error && (\n <Alert variant=\"destructive\">\n <Icon icon=\"ph:warning-circle\" />\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n )}\n\n {/* Submit Button */}\n <Button\n type=\"submit\"\n className=\"w-full\"\n size=\"lg\"\n disabled={isSubmitting}\n >\n {isSubmitting ? (\n <>\n <Icon icon=\"ph:spinner-gap-bold\" className=\"animate-spin\" />\n Sending...\n </>\n ) : (\n \"Send reset link\"\n )}\n </Button>\n\n {/* Back to Login Link */}\n <p className=\"text-muted-foreground text-center text-xs\">\n Remember your password?{\" \"}\n <Button\n type=\"button\"\n variant=\"link\"\n size=\"sm\"\n onClick={onBackToLoginClick}\n className=\"h-auto p-0 text-xs\"\n >\n Back to login\n </Button>\n </p>\n </form>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgEA,SAAgB,mBAAmB,EACjC,UACA,oBACA,eACA,WACA,SAC0B;CAC1B,MAAM,CAAC,WAAW,gBAAgBA,QAAM,SAAS,MAAM;CAEvD,MAAM,EACJ,UACA,cACA,WAAW,EAAE,QAAQ,mBACnB,QAAkC,EACpC,eAAe;EACb,OAAO;EACP,GAAG;EACJ,EACF,CAAC;CAEF,MAAM,mBAAmB,aAAa,OAAO,WAAW;AACtD,MAAI;AACF,SAAM,SAAS,OAAO;AAGtB,gBAAa,KAAK;UACZ;GAIR;AAGF,KAAI,UACF,QACE,qBAAC;EAAI,WAAW,GAAG,yBAAyB,UAAU;;GACpD,oBAAC;IAAI,WAAU;cACb,oBAAC;KACC,MAAK;KACL,WAAU;MACV;KACE;GACN,qBAAC;IAAI,WAAU;eACb,oBAAC;KAAG,WAAU;eAAsB;MAAqB,EACzD,oBAAC;KAAE,WAAU;eAAgC;MAGzC;KACA;GACN,oBAAC;IACC,MAAK;IACL,SAAQ;IACR,WAAU;IACV,SAAS;cACV;KAEQ;;GACL;AAIV,QACE,qBAAC;EAAK,UAAU;EAAkB,WAAW,GAAG,aAAa,UAAU;;GACrE,oBAAC;IAAE,WAAU;cAAgC;KAGzC;GAEJ,oBAAC,wBAEC,qBAAC;IAAM,gBAAc,CAAC,CAAC,OAAO;eAC5B,oBAAC;KAAW,SAAQ;eAAQ;MAAkB,EAC9C,qBAAC,2BACC,qBAAC;KAAI,WAAU;gBACb,oBAAC;MACC,MAAK;MACL,WAAU;OACV,EACF,oBAAC;MACC,IAAG;MACH,MAAK;MACL,aAAY;MACZ,WAAU;MACV,cAAa;MACb,gBAAc,CAAC,CAAC,OAAO;MACvB,GAAI,SAAS,SAAS;OACpB,UAAU;OACV,SAAS;QACP,OAAO;QACP,SAAS;QACV;OACF,CAAC;OACF;MACE,EACN,oBAAC,wBAAY,OAAO,OAAO,UAAqB,IACnC;KACT,GACG;GAGZ,SACC,qBAAC;IAAM,SAAQ;eACb,oBAAC,QAAK,MAAK,sBAAsB,EACjC,oBAAC,8BAAkB,QAAyB;KACtC;GAIV,oBAAC;IACC,MAAK;IACL,WAAU;IACV,MAAK;IACL,UAAU;cAET,eACC,4CACE,oBAAC;KAAK,MAAK;KAAsB,WAAU;MAAiB,kBAE3D,GAEH;KAEK;GAGT,qBAAC;IAAE,WAAU;;KAA4C;KAC/B;KACxB,oBAAC;MACC,MAAK;MACL,SAAQ;MACR,MAAK;MACL,SAAS;MACT,WAAU;gBACX;OAEQ;;KACP;;GACC"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { AuthLayout, AuthLayoutProps } from "./auth-layout.mjs";
|
|
2
|
-
import { LoginForm, LoginFormProps, LoginFormValues } from "./login-form.mjs";
|
|
3
|
-
import { ForgotPasswordForm, ForgotPasswordFormProps, ForgotPasswordFormValues } from "./forgot-password-form.mjs";
|
|
4
|
-
import { ResetPasswordForm, ResetPasswordFormProps, ResetPasswordFormValues } from "./reset-password-form.mjs";
|
|
5
|
-
import "./invite-form.mjs";
|
|
6
|
-
import { AcceptInviteForm, AcceptInviteFormProps, AcceptInviteFormValues } from "./accept-invite-form.mjs";
|
|
7
|
-
import { SetupForm, SetupFormProps, SetupFormValues } from "./setup-form.mjs";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import "react/jsx-runtime";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"invite-form.mjs","names":[],"sources":["../../../../src/client/views/auth/invite-form.tsx"],"sourcesContent":["/**\n * Invite Form - invite new users to the admin\n */\n\nimport { Icon } from \"@iconify/react\";\nimport * as React from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { Alert, AlertDescription } from \"../../components/ui/alert\";\nimport { Button } from \"../../components/ui/button\";\nimport {\n Field,\n FieldContent,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLabel,\n} from \"../../components/ui/field\";\nimport { Input } from \"../../components/ui/input\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../components/ui/select\";\nimport { Textarea } from \"../../components/ui/textarea\";\nimport { useResolveText } from \"../../i18n/hooks\";\nimport { cn } from \"../../lib/utils\";\n\nexport type InviteFormValues = {\n email: string;\n role: string;\n message?: string;\n};\n\nexport type InviteFormProps = {\n /** Called when form is submitted with valid data */\n onSubmit: (values: InviteFormValues) => Promise<void>;\n /** Available roles for selection */\n roles?: Array<{ value: string; label: string }>;\n /** Default role */\n defaultRole?: string;\n /** Show custom message field */\n showMessage?: boolean;\n /** Additional class name */\n className?: string;\n /** Error message from auth */\n error?: string | null;\n /** Success message after invite sent */\n success?: string | null;\n};\n\n/**\n * Invite form for admins to invite new users\n *\n * @example\n * ```tsx\n * function InvitePage() {\n * const authClient = useAuthClient()\n * const [error, setError] = useState<string | null>(null)\n * const [success, setSuccess] = useState<string | null>(null)\n *\n * const handleInvite = async (values: InviteFormValues) => {\n * const result = await authClient.admin.createInvitation({\n * email: values.email,\n * role: values.role,\n * })\n * if (result.error) {\n * setError(result.error.message)\n * } else {\n * setSuccess(`Invitation sent to ${values.email}`)\n * }\n * }\n *\n * return (\n * <InviteForm\n * onSubmit={handleInvite}\n * error={error}\n * success={success}\n * />\n * )\n * }\n * ```\n */\nexport function InviteForm({\n onSubmit,\n roles = [\n { value: \"admin\", label: \"Admin\" },\n { value: \"user\", label: \"User\" },\n ],\n defaultRole = \"user\",\n showMessage = true,\n className,\n error,\n success,\n}: InviteFormProps) {\n const {\n register,\n handleSubmit,\n setValue,\n watch,\n reset,\n formState: { errors, isSubmitting },\n } = useForm<InviteFormValues>({\n defaultValues: {\n email: \"\",\n role: defaultRole,\n message: \"\",\n },\n });\n\n const selectedRole = watch(\"role\");\n const resolveText = useResolveText();\n\n const handleFormSubmit = handleSubmit(async (values) => {\n await onSubmit(values);\n // Reset form on success\n if (!error) {\n reset();\n }\n });\n\n return (\n <form onSubmit={handleFormSubmit} className={cn(\"space-y-4\", className)}>\n <FieldGroup>\n {/* Email Field */}\n <Field data-invalid={!!errors.email}>\n <FieldLabel htmlFor=\"invite-email\">Email Address</FieldLabel>\n <FieldContent>\n <div className=\"relative\">\n <Icon\n icon=\"ph:envelope-duotone\"\n className=\"text-muted-foreground absolute left-2 top-1/2 size-4 -translate-y-1/2\"\n />\n <Input\n id=\"invite-email\"\n type=\"email\"\n placeholder=\"user@example.com\"\n className=\"pl-8\"\n autoComplete=\"email\"\n aria-invalid={!!errors.email}\n {...register(\"email\", {\n required: \"Email is required\",\n pattern: {\n value: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\n message: \"Invalid email address\",\n },\n })}\n />\n </div>\n <FieldDescription>\n An invitation link will be sent to this email\n </FieldDescription>\n <FieldError>{errors.email?.message}</FieldError>\n </FieldContent>\n </Field>\n\n {/* Role Field */}\n <Field data-invalid={!!errors.role}>\n <FieldLabel htmlFor=\"invite-role\">Role</FieldLabel>\n <FieldContent>\n <Select\n value={selectedRole}\n onValueChange={(value) => value && setValue(\"role\", value)}\n >\n <SelectTrigger id=\"invite-role\">\n <SelectValue>\n {roles.find((r) => r.value === selectedRole)?.label\n ? resolveText(\n roles.find((r) => r.value === selectedRole)?.label,\n )\n : \"Select a role\"}\n </SelectValue>\n </SelectTrigger>\n <SelectContent>\n {roles.map((role) => (\n <SelectItem key={role.value} value={role.value}>\n {resolveText(role.label)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <FieldDescription>\n The role determines what permissions the user will have\n </FieldDescription>\n <FieldError>{errors.role?.message}</FieldError>\n </FieldContent>\n </Field>\n\n {/* Optional Message Field */}\n {showMessage && (\n <Field>\n <FieldLabel htmlFor=\"invite-message\">\n Personal Message (Optional)\n </FieldLabel>\n <FieldContent>\n <Textarea\n id=\"invite-message\"\n placeholder=\"Add a personal message to the invitation...\"\n rows={3}\n {...register(\"message\")}\n />\n <FieldDescription>\n This message will be included in the invitation email\n </FieldDescription>\n </FieldContent>\n </Field>\n )}\n </FieldGroup>\n\n {/* Error Message */}\n {error && (\n <Alert variant=\"destructive\">\n <Icon icon=\"ph:warning-circle\" />\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n )}\n\n {/* Success Message */}\n {success && (\n <Alert>\n <Icon icon=\"ph:user-plus\" />\n <AlertDescription>{success}</AlertDescription>\n </Alert>\n )}\n\n {/* Submit Button */}\n <Button\n type=\"submit\"\n className=\"w-full\"\n size=\"lg\"\n disabled={isSubmitting}\n >\n {isSubmitting ? (\n <>\n <Icon icon=\"ph:spinner-gap-bold\" className=\"animate-spin\" />\n Sending invitation...\n </>\n ) : (\n <>\n <Icon icon=\"ph:user-plus-bold\" />\n Send Invitation\n </>\n )}\n </Button>\n </form>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoFA,SAAgB,WAAW,EACzB,UACA,QAAQ,CACN;CAAE,OAAO;CAAS,OAAO;CAAS,EAClC;CAAE,OAAO;CAAQ,OAAO;CAAQ,CACjC,EACD,cAAc,QACd,cAAc,MACd,WACA,OACA,WACkB;CAClB,MAAM,EACJ,UACA,cACA,UACA,OACA,OACA,WAAW,EAAE,QAAQ,mBACnB,QAA0B,EAC5B,eAAe;EACb,OAAO;EACP,MAAM;EACN,SAAS;EACV,EACF,CAAC;CAEF,MAAM,eAAe,MAAM,OAAO;CAClC,MAAM,cAAc,gBAAgB;AAUpC,QACE,qBAAC;EAAK,UATiB,aAAa,OAAO,WAAW;AACtD,SAAM,SAAS,OAAO;AAEtB,OAAI,CAAC,MACH,QAAO;IAET;EAGkC,WAAW,GAAG,aAAa,UAAU;;GACrE,qBAAC;IAEC,qBAAC;KAAM,gBAAc,CAAC,CAAC,OAAO;gBAC5B,oBAAC;MAAW,SAAQ;gBAAe;OAA0B,EAC7D,qBAAC;MACC,qBAAC;OAAI,WAAU;kBACb,oBAAC;QACC,MAAK;QACL,WAAU;SACV,EACF,oBAAC;QACC,IAAG;QACH,MAAK;QACL,aAAY;QACZ,WAAU;QACV,cAAa;QACb,gBAAc,CAAC,CAAC,OAAO;QACvB,GAAI,SAAS,SAAS;SACpB,UAAU;SACV,SAAS;UACP,OAAO;UACP,SAAS;UACV;SACF,CAAC;SACF;QACE;MACN,oBAAC,8BAAiB,kDAEC;MACnB,oBAAC,wBAAY,OAAO,OAAO,UAAqB;SACnC;MACT;IAGR,qBAAC;KAAM,gBAAc,CAAC,CAAC,OAAO;gBAC5B,oBAAC;MAAW,SAAQ;gBAAc;OAAiB,EACnD,qBAAC;MACC,qBAAC;OACC,OAAO;OACP,gBAAgB,UAAU,SAAS,SAAS,QAAQ,MAAM;kBAE1D,oBAAC;QAAc,IAAG;kBAChB,oBAAC,yBACE,MAAM,MAAM,MAAM,EAAE,UAAU,aAAa,EAAE,QAC1C,YACE,MAAM,MAAM,MAAM,EAAE,UAAU,aAAa,EAAE,MAC9C,GACD,kBACQ;SACA,EAChB,oBAAC,2BACE,MAAM,KAAK,SACV,oBAAC;QAA4B,OAAO,KAAK;kBACtC,YAAY,KAAK,MAAM;UADT,KAAK,MAET,CACb,GACY;QACT;MACT,oBAAC,8BAAiB,4DAEC;MACnB,oBAAC,wBAAY,OAAO,MAAM,UAAqB;SAClC;MACT;IAGP,eACC,qBAAC,oBACC,oBAAC;KAAW,SAAQ;eAAiB;MAExB,EACb,qBAAC,2BACC,oBAAC;KACC,IAAG;KACH,aAAY;KACZ,MAAM;KACN,GAAI,SAAS,UAAU;MACvB,EACF,oBAAC,8BAAiB,0DAEC,IACN,IACT;OAEC;GAGZ,SACC,qBAAC;IAAM,SAAQ;eACb,oBAAC,QAAK,MAAK,sBAAsB,EACjC,oBAAC,8BAAkB,QAAyB;KACtC;GAIT,WACC,qBAAC,oBACC,oBAAC,QAAK,MAAK,iBAAiB,EAC5B,oBAAC,8BAAkB,UAA2B,IACxC;GAIV,oBAAC;IACC,MAAK;IACL,WAAU;IACV,MAAK;IACL,UAAU;cAET,eACC,4CACE,oBAAC;KAAK,MAAK;KAAsB,WAAU;MAAiB,6BAE3D,GAEH,4CACE,oBAAC,QAAK,MAAK,sBAAsB,uBAEhC;KAEE;;GACJ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"login-form.d.mts","names":[],"sources":["../../../../src/client/views/auth/login-form.tsx"],"sourcesContent":[],"mappings":";;;;;;AAqBY,KAAA,eAAA,GAAe;EAMf,KAAA,EAAA,MAAA;EAES,QAAA,EAAA,MAAA;EAAoB,UAAA,CAAA,EAAA,OAAA;CAYf;AAAR,KAdN,cAAA,GAcM;EAAO;EAqCT,QAAA,EAAA,CAAA,MAAS,EAjDJ,eAiDI,EAAA,GAjDgB,OAiDhB,CAAA,IAAA,CAAA;EACvB;EACA,aAAA,CAAA,EAAA,GAAA,GAAA,IAAA;EACA;EACA,qBAAA,CAAA,EAAA,GAAA,GAAA,IAAA;EACA;EACA,cAAA,CAAA,EAAA,OAAA;EACA;EACA,UAAA,CAAA,EAAA,OAAA;EACA;EACA,kBAAA,CAAA,EAAA,OAAA;EACC;EAAc,aAAA,CAAA,EAhDC,OAgDD,CAhDS,eAgDT,CAAA;EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAXD,SAAA;;;;;;;;;;;GAWb,iBAAc,kBAAA,CAAA,GAAA,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"login-form.mjs","names":[],"sources":["../../../../src/client/views/auth/login-form.tsx"],"sourcesContent":["/**\n * Login Form - email/password authentication\n */\n\nimport { Icon } from \"@iconify/react\";\nimport * as React from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { Alert, AlertDescription } from \"../../components/ui/alert\";\nimport { Button } from \"../../components/ui/button\";\nimport {\n Field,\n FieldContent,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLabel,\n} from \"../../components/ui/field\";\nimport { Input } from \"../../components/ui/input\";\nimport { useTranslation } from \"../../i18n/hooks\";\nimport { cn } from \"../../lib/utils\";\n\nexport type LoginFormValues = {\n email: string;\n password: string;\n rememberMe?: boolean;\n};\n\nexport type LoginFormProps = {\n /** Called when form is submitted with valid data */\n onSubmit: (values: LoginFormValues) => Promise<void>;\n /** Called when sign up link is clicked */\n onSignUpClick?: () => void;\n /** Called when forgot password link is clicked */\n onForgotPasswordClick?: () => void;\n /** Show remember me checkbox */\n showRememberMe?: boolean;\n /** Show sign up link */\n showSignUp?: boolean;\n /** Show forgot password link */\n showForgotPassword?: boolean;\n /** Default values */\n defaultValues?: Partial<LoginFormValues>;\n /** Additional class name */\n className?: string;\n /** Error message from auth */\n error?: string | null;\n /** Minimum password length (default: 8) */\n minPasswordLength?: number;\n};\n\n/**\n * Login form with email and password fields\n *\n * @example\n * ```tsx\n * const authClient = createAdminAuthClient<typeof cms>({ baseURL: '...' })\n *\n * function LoginPage() {\n * const [error, setError] = useState<string | null>(null)\n *\n * const handleLogin = async (values: LoginFormValues) => {\n * const result = await authClient.signIn.email({\n * email: values.email,\n * password: values.password,\n * })\n * if (result.error) {\n * setError(result.error.message)\n * }\n * }\n *\n * return (\n * <AuthLayout title=\"Sign in\">\n * <LoginForm onSubmit={handleLogin} error={error} />\n * </AuthLayout>\n * )\n * }\n * ```\n */\nexport function LoginForm({\n onSubmit,\n onSignUpClick,\n onForgotPasswordClick,\n showRememberMe = false,\n showSignUp = true,\n showForgotPassword = true,\n defaultValues,\n className,\n error,\n minPasswordLength = 8,\n}: LoginFormProps) {\n const { t } = useTranslation();\n const {\n register,\n handleSubmit,\n formState: { errors, isSubmitting },\n } = useForm<LoginFormValues>({\n defaultValues: {\n email: \"\",\n password: \"\",\n rememberMe: false,\n ...defaultValues,\n },\n });\n\n const handleFormSubmit = handleSubmit(async (values) => {\n await onSubmit(values);\n });\n\n return (\n <form onSubmit={handleFormSubmit} className={cn(\"space-y-4\", className)}>\n <FieldGroup>\n {/* Email Field */}\n <Field data-invalid={!!errors.email}>\n <FieldLabel htmlFor=\"email\">{t(\"auth.email\")}</FieldLabel>\n <FieldContent>\n <div className=\"relative\">\n <Icon\n icon=\"ph:envelope-duotone\"\n className=\"text-muted-foreground absolute left-2 top-1/2 size-4 -translate-y-1/2\"\n />\n <Input\n id=\"email\"\n type=\"email\"\n placeholder={t(\"auth.emailPlaceholder\")}\n className=\"pl-8\"\n autoComplete=\"email\"\n aria-invalid={!!errors.email}\n {...register(\"email\", {\n required: t(\"auth.emailRequired\"),\n pattern: {\n value: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\n message: t(\"auth.invalidEmail\"),\n },\n })}\n />\n </div>\n <FieldError>{errors.email?.message}</FieldError>\n </FieldContent>\n </Field>\n\n {/* Password Field */}\n <Field data-invalid={!!errors.password}>\n <FieldLabel htmlFor=\"password\">{t(\"auth.password\")}</FieldLabel>\n <FieldContent>\n <div className=\"relative\">\n <Icon\n icon=\"ph:lock-duotone\"\n className=\"text-muted-foreground absolute left-2 top-1/2 size-4 -translate-y-1/2\"\n />\n <Input\n id=\"password\"\n type=\"password\"\n placeholder={t(\"auth.passwordPlaceholder\")}\n className=\"pl-8\"\n autoComplete=\"current-password\"\n aria-invalid={!!errors.password}\n {...register(\"password\", {\n required: t(\"auth.passwordRequired\"),\n minLength: {\n value: minPasswordLength,\n message: t(\"auth.passwordMinLength\", {\n min: minPasswordLength,\n }),\n },\n })}\n />\n </div>\n <FieldError>{errors.password?.message}</FieldError>\n </FieldContent>\n </Field>\n\n {/* Remember Me & Forgot Password */}\n {(showRememberMe || showForgotPassword) && (\n <div className=\"flex items-center justify-between\">\n {showRememberMe && (\n <label className=\"text-muted-foreground flex items-center gap-2 text-xs\">\n <input\n type=\"checkbox\"\n className=\"rounded border-gray-300\"\n {...register(\"rememberMe\")}\n />\n {t(\"auth.rememberMe\")}\n </label>\n )}\n {showForgotPassword && (\n <Button\n type=\"button\"\n variant=\"link\"\n size=\"sm\"\n onClick={onForgotPasswordClick}\n className=\"h-auto p-0 text-xs\"\n >\n {t(\"auth.forgotPassword\")}\n </Button>\n )}\n </div>\n )}\n </FieldGroup>\n\n {/* Error Message */}\n {error && (\n <Alert variant=\"destructive\">\n <Icon icon=\"ph:warning-circle\" />\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n )}\n\n {/* Submit Button */}\n <Button\n type=\"submit\"\n className=\"w-full\"\n size=\"lg\"\n disabled={isSubmitting}\n >\n {isSubmitting ? (\n <>\n <Icon icon=\"ph:spinner-gap-bold\" className=\"animate-spin\" />\n {t(\"auth.signingIn\")}\n </>\n ) : (\n t(\"auth.signIn\")\n )}\n </Button>\n\n {/* Sign Up Link */}\n {showSignUp && (\n <p className=\"text-muted-foreground text-center text-xs\">\n {t(\"auth.dontHaveAccount\")}{\" \"}\n <Button\n type=\"button\"\n variant=\"link\"\n size=\"sm\"\n onClick={onSignUpClick}\n className=\"h-auto p-0 text-xs\"\n >\n {t(\"auth.signUp\")}\n </Button>\n </p>\n )}\n </form>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8EA,SAAgB,UAAU,EACxB,UACA,eACA,uBACA,iBAAiB,OACjB,aAAa,MACb,qBAAqB,MACrB,eACA,WACA,OACA,oBAAoB,KACH;CACjB,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,EACJ,UACA,cACA,WAAW,EAAE,QAAQ,mBACnB,QAAyB,EAC3B,eAAe;EACb,OAAO;EACP,UAAU;EACV,YAAY;EACZ,GAAG;EACJ,EACF,CAAC;AAMF,QACE,qBAAC;EAAK,UALiB,aAAa,OAAO,WAAW;AACtD,SAAM,SAAS,OAAO;IACtB;EAGkC,WAAW,GAAG,aAAa,UAAU;;GACrE,qBAAC;IAEC,qBAAC;KAAM,gBAAc,CAAC,CAAC,OAAO;gBAC5B,oBAAC;MAAW,SAAQ;gBAAS,EAAE,aAAa;OAAc,EAC1D,qBAAC,2BACC,qBAAC;MAAI,WAAU;iBACb,oBAAC;OACC,MAAK;OACL,WAAU;QACV,EACF,oBAAC;OACC,IAAG;OACH,MAAK;OACL,aAAa,EAAE,wBAAwB;OACvC,WAAU;OACV,cAAa;OACb,gBAAc,CAAC,CAAC,OAAO;OACvB,GAAI,SAAS,SAAS;QACpB,UAAU,EAAE,qBAAqB;QACjC,SAAS;SACP,OAAO;SACP,SAAS,EAAE,oBAAoB;SAChC;QACF,CAAC;QACF;OACE,EACN,oBAAC,wBAAY,OAAO,OAAO,UAAqB,IACnC;MACT;IAGR,qBAAC;KAAM,gBAAc,CAAC,CAAC,OAAO;gBAC5B,oBAAC;MAAW,SAAQ;gBAAY,EAAE,gBAAgB;OAAc,EAChE,qBAAC,2BACC,qBAAC;MAAI,WAAU;iBACb,oBAAC;OACC,MAAK;OACL,WAAU;QACV,EACF,oBAAC;OACC,IAAG;OACH,MAAK;OACL,aAAa,EAAE,2BAA2B;OAC1C,WAAU;OACV,cAAa;OACb,gBAAc,CAAC,CAAC,OAAO;OACvB,GAAI,SAAS,YAAY;QACvB,UAAU,EAAE,wBAAwB;QACpC,WAAW;SACT,OAAO;SACP,SAAS,EAAE,0BAA0B,EACnC,KAAK,mBACN,CAAC;SACH;QACF,CAAC;QACF;OACE,EACN,oBAAC,wBAAY,OAAO,UAAU,UAAqB,IACtC;MACT;KAGN,kBAAkB,uBAClB,qBAAC;KAAI,WAAU;gBACZ,kBACC,qBAAC;MAAM,WAAU;iBACf,oBAAC;OACC,MAAK;OACL,WAAU;OACV,GAAI,SAAS,aAAa;QAC1B,EACD,EAAE,kBAAkB;OACf,EAET,sBACC,oBAAC;MACC,MAAK;MACL,SAAQ;MACR,MAAK;MACL,SAAS;MACT,WAAU;gBAET,EAAE,sBAAsB;OAClB;MAEP;OAEG;GAGZ,SACC,qBAAC;IAAM,SAAQ;eACb,oBAAC,QAAK,MAAK,sBAAsB,EACjC,oBAAC,8BAAkB,QAAyB;KACtC;GAIV,oBAAC;IACC,MAAK;IACL,WAAU;IACV,MAAK;IACL,UAAU;cAET,eACC,4CACE,oBAAC;KAAK,MAAK;KAAsB,WAAU;MAAiB,EAC3D,EAAE,iBAAiB,IACnB,GAEH,EAAE,cAAc;KAEX;GAGR,cACC,qBAAC;IAAE,WAAU;;KACV,EAAE,uBAAuB;KAAE;KAC5B,oBAAC;MACC,MAAK;MACL,SAAQ;MACR,MAAK;MACL,SAAS;MACT,WAAU;gBAET,EAAE,cAAc;OACV;;KACP;;GAED"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reset-password-form.d.mts","names":[],"sources":["../../../../src/client/views/auth/reset-password-form.tsx"],"sourcesContent":[],"mappings":";;;;;;AAqBY,KAAA,uBAAA,GAAuB;EAKvB,QAAA,EAAA,MAAA;EA8CI,eAAA,EAAA,MAAiB;CAC/B;AACA,KAhDU,sBAAA,GAgDV;EACA;EACA,KAAA,EAAA,MAAA;EACA;EACA,QAAA,EAAA,CAAA,MAAA,EA/CU,uBA+CV,GAAA;IACC,KAAA,EAAA,MAAA;EAAsB,CAAA,EAAA,GA/ClB,OA+CkB,CAAA,IAAA,CAAA;EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAPT,iBAAA;;;;;;;GAOb,yBAAsB,kBAAA,CAAA,GAAA,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reset-password-form.mjs","names":["React"],"sources":["../../../../src/client/views/auth/reset-password-form.tsx"],"sourcesContent":["/**\n * Reset Password Form - set new password with token\n */\n\nimport { Icon } from \"@iconify/react\";\nimport * as React from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { Alert, AlertDescription } from \"../../components/ui/alert\";\nimport { Button } from \"../../components/ui/button\";\nimport {\n Field,\n FieldContent,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLabel,\n} from \"../../components/ui/field\";\nimport { Input } from \"../../components/ui/input\";\nimport { useTranslation } from \"../../i18n/hooks\";\nimport { cn } from \"../../lib/utils\";\n\nexport type ResetPasswordFormValues = {\n password: string;\n confirmPassword: string;\n};\n\nexport type ResetPasswordFormProps = {\n /** Reset token from URL */\n token: string;\n /** Called when form is submitted with valid data */\n onSubmit: (\n values: ResetPasswordFormValues & { token: string },\n ) => Promise<void>;\n /** Called when back to login link is clicked */\n onBackToLoginClick?: () => void;\n /** Minimum password length */\n minPasswordLength?: number;\n /** Additional class name */\n className?: string;\n /** Error message from auth */\n error?: string | null;\n};\n\n/**\n * Reset password form with password confirmation\n *\n * @example\n * ```tsx\n * const authClient = createAdminAuthClient<typeof cms>({ baseURL: '...' })\n *\n * function ResetPasswordPage() {\n * const token = useSearchParams().get('token')\n * const [error, setError] = useState<string | null>(null)\n *\n * const handleSubmit = async (values) => {\n * const result = await authClient.resetPassword({\n * token: values.token,\n * newPassword: values.password,\n * })\n * if (result.error) {\n * setError(result.error.message)\n * }\n * }\n *\n * return (\n * <AuthLayout title=\"Reset password\">\n * <ResetPasswordForm token={token} onSubmit={handleSubmit} error={error} />\n * </AuthLayout>\n * )\n * }\n * ```\n */\nexport function ResetPasswordForm({\n token,\n onSubmit,\n onBackToLoginClick,\n minPasswordLength = 8,\n className,\n error,\n}: ResetPasswordFormProps) {\n const { t } = useTranslation();\n const [isSuccess, setIsSuccess] = React.useState(false);\n\n const {\n register,\n handleSubmit,\n watch,\n formState: { errors, isSubmitting },\n } = useForm<ResetPasswordFormValues>({\n defaultValues: {\n password: \"\",\n confirmPassword: \"\",\n },\n });\n\n const password = watch(\"password\");\n\n const handleFormSubmit = handleSubmit(async (values) => {\n try {\n await onSubmit({ ...values, token });\n setIsSuccess(true);\n } catch {\n // Error will be shown via the error prop from parent\n }\n });\n\n // Success state\n if (isSuccess) {\n return (\n <div className={cn(\"space-y-4 text-center\", className)}>\n <div className=\"bg-primary/10 mx-auto flex size-12 items-center justify-center\">\n <Icon\n icon=\"ph:check-circle-duotone\"\n className=\"text-primary size-6\"\n />\n </div>\n <div className=\"space-y-2\">\n <h3 className=\"text-sm font-medium\">Password reset successful</h3>\n <p className=\"text-muted-foreground text-xs\">\n Your password has been reset successfully. You can now sign in with\n your new password.\n </p>\n </div>\n <Button\n type=\"button\"\n className=\"w-full\"\n size=\"lg\"\n onClick={onBackToLoginClick}\n >\n Sign in\n </Button>\n </div>\n );\n }\n\n return (\n <form onSubmit={handleFormSubmit} className={cn(\"space-y-4\", className)}>\n <p className=\"text-muted-foreground text-xs\">\n Enter your new password below.\n </p>\n\n <FieldGroup>\n {/* Password Field */}\n <Field data-invalid={!!errors.password}>\n <FieldLabel htmlFor=\"password\">{t(\"auth.newPassword\")}</FieldLabel>\n <FieldContent>\n <div className=\"relative\">\n <Icon\n icon=\"ph:lock-duotone\"\n className=\"text-muted-foreground absolute left-2 top-1/2 size-4 -translate-y-1/2\"\n />\n <Input\n id=\"password\"\n type=\"password\"\n placeholder={t(\"auth.newPasswordPlaceholder\")}\n className=\"pl-8\"\n autoComplete=\"new-password\"\n aria-invalid={!!errors.password}\n {...register(\"password\", {\n required: t(\"auth.passwordRequired\"),\n minLength: {\n value: minPasswordLength,\n message: t(\"auth.passwordMinLength\", {\n min: minPasswordLength,\n }),\n },\n })}\n />\n </div>\n <FieldDescription>\n {t(\"auth.passwordMinLength\", { min: minPasswordLength })}\n </FieldDescription>\n <FieldError>{errors.password?.message}</FieldError>\n </FieldContent>\n </Field>\n\n {/* Confirm Password Field */}\n <Field data-invalid={!!errors.confirmPassword}>\n <FieldLabel htmlFor=\"confirmPassword\">\n {t(\"auth.confirmPassword\")}\n </FieldLabel>\n <FieldContent>\n <div className=\"relative\">\n <Icon\n icon=\"ph:lock-duotone\"\n className=\"text-muted-foreground absolute left-2 top-1/2 size-4 -translate-y-1/2\"\n />\n <Input\n id=\"confirmPassword\"\n type=\"password\"\n placeholder={t(\"auth.confirmPasswordPlaceholder\")}\n className=\"pl-8\"\n autoComplete=\"new-password\"\n aria-invalid={!!errors.confirmPassword}\n {...register(\"confirmPassword\", {\n required: t(\"auth.passwordRequired\"),\n validate: (value) =>\n value === password || t(\"auth.passwordMismatch\"),\n })}\n />\n </div>\n <FieldError>{errors.confirmPassword?.message}</FieldError>\n </FieldContent>\n </Field>\n </FieldGroup>\n\n {/* Error Message */}\n {error && (\n <Alert variant=\"destructive\">\n <Icon icon=\"ph:warning-circle\" />\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n )}\n\n {/* Submit Button */}\n <Button\n type=\"submit\"\n className=\"w-full\"\n size=\"lg\"\n disabled={isSubmitting}\n >\n {isSubmitting ? (\n <>\n <Icon icon=\"ph:spinner-gap-bold\" className=\"animate-spin\" />\n {t(\"auth.resettingPassword\")}\n </>\n ) : (\n t(\"auth.resetPassword\")\n )}\n </Button>\n\n {/* Back to Login Link */}\n <p className=\"text-muted-foreground text-center text-xs\">\n {t(\"auth.alreadyHaveAccount\")}{\" \"}\n <Button\n type=\"button\"\n variant=\"link\"\n size=\"sm\"\n onClick={onBackToLoginClick}\n className=\"h-auto p-0 text-xs\"\n >\n {t(\"auth.signIn\")}\n </Button>\n </p>\n </form>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"setup-form.d.mts","names":[],"sources":["../../../../src/client/views/auth/setup-form.tsx"],"sourcesContent":[],"mappings":";;;;;;AAoBY,KAAA,eAAA,GAAe;EAOf,IAAA,EAAA,MAAA;EAES,KAAA,EAAA,MAAA;EAAoB,QAAA,EAAA,MAAA;EAEf,eAAA,EAAA,MAAA;CAAR;AAAO,KAJb,cAAA,GAIa;EAoCT;EACd,QAAA,EAAA,CAAA,MAAA,EAvCmB,eAuCnB,EAAA,GAvCuC,OAuCvC,CAAA,IAAA,CAAA;EACA;EACA,aAAA,CAAA,EAvCgB,OAuChB,CAvCwB,eAuCxB,CAAA;EACA;EACA,SAAA,CAAA,EAAA,MAAA;EACC;EAAc,KAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAND,SAAA;;;;;;GAMb,iBAAc,kBAAA,CAAA,GAAA,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"setup-form.mjs","names":[],"sources":["../../../../src/client/views/auth/setup-form.tsx"],"sourcesContent":["/**\n * Setup Form - create first admin account\n */\n\nimport { Icon } from \"@iconify/react\";\nimport * as React from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { Alert, AlertDescription } from \"../../components/ui/alert\";\nimport { Button } from \"../../components/ui/button\";\nimport {\n Field,\n FieldContent,\n FieldError,\n FieldGroup,\n FieldLabel,\n} from \"../../components/ui/field\";\nimport { Input } from \"../../components/ui/input\";\nimport { useTranslation } from \"../../i18n/hooks\";\nimport { cn } from \"../../lib/utils\";\n\nexport type SetupFormValues = {\n name: string;\n email: string;\n password: string;\n confirmPassword: string;\n};\n\nexport type SetupFormProps = {\n /** Called when form is submitted with valid data */\n onSubmit: (values: SetupFormValues) => Promise<void>;\n /** Default values */\n defaultValues?: Partial<SetupFormValues>;\n /** Additional class name */\n className?: string;\n /** Error message from setup */\n error?: string | null;\n /** Minimum password length (default: 8) */\n minPasswordLength?: number;\n};\n\n/**\n * Setup form for creating the first admin account.\n *\n * @example\n * ```tsx\n * function SetupPage() {\n * const [error, setError] = useState<string | null>(null)\n *\n * const handleSetup = async (values: SetupFormValues) => {\n * const result = await client.rpc.createFirstAdmin({\n * email: values.email,\n * password: values.password,\n * name: values.name,\n * })\n * if (!result.success) {\n * setError(result.error)\n * }\n * }\n *\n * return (\n * <AuthLayout title=\"Welcome\">\n * <SetupForm onSubmit={handleSetup} error={error} />\n * </AuthLayout>\n * )\n * }\n * ```\n */\nexport function SetupForm({\n onSubmit,\n defaultValues,\n className,\n error,\n minPasswordLength = 8,\n}: SetupFormProps) {\n const { t } = useTranslation();\n const {\n register,\n handleSubmit,\n watch,\n formState: { errors, isSubmitting },\n } = useForm<SetupFormValues>({\n defaultValues: {\n name: \"\",\n email: \"\",\n password: \"\",\n confirmPassword: \"\",\n ...defaultValues,\n },\n });\n\n const password = watch(\"password\");\n\n const handleFormSubmit = handleSubmit(async (values) => {\n await onSubmit(values);\n });\n\n return (\n <form onSubmit={handleFormSubmit} className={cn(\"space-y-4\", className)}>\n <FieldGroup>\n {/* Name Field */}\n <Field data-invalid={!!errors.name}>\n <FieldLabel htmlFor=\"name\">{t(\"auth.name\")}</FieldLabel>\n <FieldContent>\n <div className=\"relative\">\n <Icon\n icon=\"ph:user-duotone\"\n className=\"text-muted-foreground absolute left-2 top-1/2 size-4 -translate-y-1/2\"\n />\n <Input\n id=\"name\"\n type=\"text\"\n placeholder={t(\"auth.namePlaceholder\")}\n className=\"pl-8\"\n autoComplete=\"name\"\n aria-invalid={!!errors.name}\n {...register(\"name\", {\n required: t(\"auth.nameRequired\"),\n minLength: {\n value: 2,\n message: t(\"auth.nameMinLength\", { min: 2 }),\n },\n })}\n />\n </div>\n <FieldError>{errors.name?.message}</FieldError>\n </FieldContent>\n </Field>\n\n {/* Email Field */}\n <Field data-invalid={!!errors.email}>\n <FieldLabel htmlFor=\"email\">{t(\"auth.email\")}</FieldLabel>\n <FieldContent>\n <div className=\"relative\">\n <Icon\n icon=\"ph:envelope-duotone\"\n className=\"text-muted-foreground absolute left-2 top-1/2 size-4 -translate-y-1/2\"\n />\n <Input\n id=\"email\"\n type=\"email\"\n placeholder={t(\"auth.emailPlaceholder\")}\n className=\"pl-8\"\n autoComplete=\"email\"\n aria-invalid={!!errors.email}\n {...register(\"email\", {\n required: t(\"auth.emailRequired\"),\n pattern: {\n value: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\n message: t(\"auth.invalidEmail\"),\n },\n })}\n />\n </div>\n <FieldError>{errors.email?.message}</FieldError>\n </FieldContent>\n </Field>\n\n {/* Password Field */}\n <Field data-invalid={!!errors.password}>\n <FieldLabel htmlFor=\"password\">{t(\"auth.password\")}</FieldLabel>\n <FieldContent>\n <div className=\"relative\">\n <Icon\n icon=\"ph:lock-duotone\"\n className=\"text-muted-foreground absolute left-2 top-1/2 size-4 -translate-y-1/2\"\n />\n <Input\n id=\"password\"\n type=\"password\"\n placeholder={t(\"auth.passwordPlaceholder\")}\n className=\"pl-8\"\n autoComplete=\"new-password\"\n aria-invalid={!!errors.password}\n {...register(\"password\", {\n required: t(\"auth.passwordRequired\"),\n minLength: {\n value: minPasswordLength,\n message: t(\"auth.passwordMinLength\", {\n min: minPasswordLength,\n }),\n },\n })}\n />\n </div>\n <FieldError>{errors.password?.message}</FieldError>\n </FieldContent>\n </Field>\n\n {/* Confirm Password Field */}\n <Field data-invalid={!!errors.confirmPassword}>\n <FieldLabel htmlFor=\"confirmPassword\">\n {t(\"auth.confirmPassword\")}\n </FieldLabel>\n <FieldContent>\n <div className=\"relative\">\n <Icon\n icon=\"ph:lock-duotone\"\n className=\"text-muted-foreground absolute left-2 top-1/2 size-4 -translate-y-1/2\"\n />\n <Input\n id=\"confirmPassword\"\n type=\"password\"\n placeholder={t(\"auth.confirmPasswordPlaceholder\")}\n className=\"pl-8\"\n autoComplete=\"new-password\"\n aria-invalid={!!errors.confirmPassword}\n {...register(\"confirmPassword\", {\n required: t(\"auth.passwordRequired\"),\n validate: (value) =>\n value === password || t(\"auth.passwordMismatch\"),\n })}\n />\n </div>\n <FieldError>{errors.confirmPassword?.message}</FieldError>\n </FieldContent>\n </Field>\n </FieldGroup>\n\n {/* Error Message */}\n {error && (\n <Alert variant=\"destructive\">\n <Icon icon=\"ph:warning-circle\" />\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n )}\n\n {/* Submit Button */}\n <Button\n type=\"submit\"\n className=\"w-full\"\n size=\"lg\"\n disabled={isSubmitting}\n >\n {isSubmitting ? (\n <>\n <Icon icon=\"ph:spinner-gap-bold\" className=\"animate-spin\" />\n {t(\"auth.creatingAdmin\")}\n </>\n ) : (\n t(\"auth.createFirstAdmin\")\n )}\n </Button>\n </form>\n );\n}\n"],"mappings":"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"}
|