@questpie/admin 2.0.0 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +173 -143
- package/dist/augmentation.d.mts +110 -11
- package/dist/client/blocks/block-renderer.d.mts +5 -12
- package/dist/client/blocks/block-renderer.mjs +89 -55
- package/dist/client/blocks/index.d.mts +2 -4
- package/dist/client/blocks/types.d.mts +3 -4
- package/dist/client/blocks/types.mjs +1 -2
- package/dist/client/builder/admin-types.d.mts +11 -44
- package/dist/client/builder/admin.d.mts +34 -45
- package/dist/client/builder/admin.mjs +35 -44
- package/dist/client/builder/field/field.d.mts +27 -205
- package/dist/client/builder/field/field.mjs +22 -68
- package/dist/client/builder/index.d.mts +23 -28
- package/dist/client/builder/page/page.d.mts +15 -27
- package/dist/client/builder/page/page.mjs +21 -17
- package/dist/client/builder/registry.d.mts +14 -34
- package/dist/client/builder/types/action-registry.mjs +148 -14
- package/dist/client/builder/types/action-types.d.mts +8 -35
- package/dist/client/builder/types/collection-types.mjs +1 -2
- package/dist/client/builder/types/common.d.mts +6 -20
- package/dist/client/builder/types/field-types.d.mts +4 -5
- package/dist/client/builder/types/field-types.mjs +1 -2
- package/dist/client/builder/types/ui-config.d.mts +3 -5
- package/dist/client/builder/types/widget-types.d.mts +19 -20
- package/dist/client/builder/validation.d.mts +33 -3
- package/dist/client/builder/validation.mjs +169 -150
- package/dist/client/builder/view/view.d.mts +26 -106
- package/dist/client/builder/view/view.mjs +14 -96
- package/dist/client/builder/widget/widget.d.mts +16 -22
- package/dist/client/builder/widget/widget.mjs +11 -16
- package/dist/client/components/actions/action-button.mjs +207 -97
- package/dist/client/components/actions/action-dialog.mjs +471 -176
- package/dist/client/components/actions/confirmation-dialog.mjs +166 -47
- package/dist/client/components/actions/header-actions.mjs +164 -71
- package/dist/client/components/admin-link.d.mts +8 -9
- package/dist/client/components/admin-link.mjs +127 -48
- package/dist/client/components/auth/auth-guard.d.mts +6 -7
- package/dist/client/components/auth/auth-guard.mjs +9 -9
- package/dist/client/components/auth/auth-loading.d.mts +3 -4
- package/dist/client/components/auth/auth-loading.mjs +38 -10
- package/dist/client/components/blocks/block-canvas.mjs +111 -42
- package/dist/client/components/blocks/block-editor-context.mjs +90 -23
- package/dist/client/components/blocks/block-editor-layout.mjs +176 -59
- package/dist/client/components/blocks/block-editor-provider.mjs +219 -139
- package/dist/client/components/blocks/block-fields-renderer.mjs +212 -42
- package/dist/client/components/blocks/block-insert-button.mjs +168 -51
- package/dist/client/components/blocks/block-item-menu.mjs +312 -110
- package/dist/client/components/blocks/block-item.mjs +372 -125
- package/dist/client/components/blocks/block-library-sidebar.mjs +209 -114
- package/dist/client/components/blocks/block-tree.mjs +73 -15
- package/dist/client/components/blocks/block-type-icon.mjs +65 -20
- package/dist/client/components/blocks/utils/tree-utils.mjs +1 -2
- package/dist/client/components/component-renderer.d.mts +11 -22
- package/dist/client/components/component-renderer.mjs +151 -38
- package/dist/client/components/error-boundary.mjs +77 -25
- package/dist/client/components/fields/array-field.mjs +474 -199
- package/dist/client/components/fields/asset-preview-field.mjs +143 -44
- package/dist/client/components/fields/blocks-field/blocks-field.mjs +143 -35
- package/dist/client/components/fields/boolean-field.mjs +62 -32
- package/dist/client/components/fields/date-field.mjs +46 -12
- package/dist/client/components/fields/datetime-field.mjs +42 -11
- package/dist/client/components/fields/email-field.mjs +57 -28
- package/dist/client/components/fields/field-utils.mjs +1 -2
- package/dist/client/components/fields/field-wrapper.mjs +107 -32
- package/dist/client/components/fields/json-field.mjs +323 -110
- package/dist/client/components/fields/locale-badge.mjs +16 -8
- package/dist/client/components/fields/number-field.mjs +63 -30
- package/dist/client/components/fields/object-array-field.mjs +666 -272
- package/dist/client/components/fields/object-field.mjs +656 -98
- package/dist/client/components/fields/relation/displays/cards-display.mjs +225 -111
- package/dist/client/components/fields/relation/displays/chips-display.mjs +150 -77
- package/dist/client/components/fields/relation/displays/grid-display.mjs +186 -91
- package/dist/client/components/fields/relation/displays/list-display.mjs +230 -111
- package/dist/client/components/fields/relation/displays/table-display.mjs +241 -66
- package/dist/client/components/fields/relation/displays/types.mjs +2 -3
- package/dist/client/components/fields/relation/relation-items-display.mjs +131 -35
- package/dist/client/components/fields/relation-field.mjs +70 -15
- package/dist/client/components/fields/relation-picker.mjs +93 -98
- package/dist/client/components/fields/relation-select.mjs +42 -29
- package/dist/client/components/fields/rich-text-editor/bubble-menu.mjs +90 -41
- package/dist/client/components/fields/rich-text-editor/extensions.mjs +33 -7
- package/dist/client/components/fields/rich-text-editor/image-popover.mjs +48 -23
- package/dist/client/components/fields/rich-text-editor/index.mjs +491 -158
- package/dist/client/components/fields/rich-text-editor/link-popover.mjs +13 -14
- package/dist/client/components/fields/rich-text-editor/presets.mjs +1 -2
- package/dist/client/components/fields/rich-text-editor/slash-commands.mjs +96 -53
- package/dist/client/components/fields/rich-text-editor/table-controls.mjs +416 -107
- package/dist/client/components/fields/rich-text-editor/toolbar.mjs +476 -215
- package/dist/client/components/fields/rich-text-editor/types.mjs +1 -2
- package/dist/client/components/fields/rich-text-editor/utils.mjs +1 -2
- package/dist/client/components/fields/rich-text-field.mjs +55 -17
- package/dist/client/components/fields/select-field.mjs +79 -44
- package/dist/client/components/fields/text-field.mjs +62 -29
- package/dist/client/components/fields/textarea-field.mjs +61 -29
- package/dist/client/components/fields/time-field.mjs +39 -11
- package/dist/client/components/fields/upload-field.mjs +253 -129
- package/dist/client/components/filter-builder/columns-tab.mjs +287 -93
- package/dist/client/components/filter-builder/filter-builder-sheet.mjs +437 -138
- package/dist/client/components/filter-builder/filters-tab.mjs +409 -126
- package/dist/client/components/filter-builder/saved-views-tab.mjs +259 -106
- package/dist/client/components/history-sidebar.mjs +496 -0
- package/dist/client/components/layout/field-layout-renderer.mjs +301 -0
- package/dist/client/components/locale-switcher.mjs +231 -108
- package/dist/client/components/media/media-grid.mjs +259 -84
- package/dist/client/components/media/media-picker-dialog.mjs +500 -192
- package/dist/client/components/preview/live-preview-mode.mjs +416 -124
- package/dist/client/components/preview/preview-pane.mjs +353 -144
- package/dist/client/components/primitives/asset-preview.mjs +665 -257
- package/dist/client/components/primitives/checkbox-input.mjs +37 -11
- package/dist/client/components/primitives/date-input.mjs +392 -149
- package/dist/client/components/primitives/dropzone.mjs +314 -185
- package/dist/client/components/primitives/number-input.mjs +14 -10
- package/dist/client/components/primitives/select-multi.mjs +519 -185
- package/dist/client/components/primitives/select-single.mjs +416 -126
- package/dist/client/components/primitives/text-input.mjs +10 -5
- package/dist/client/components/primitives/textarea-input.mjs +10 -5
- package/dist/client/components/primitives/time-input.mjs +118 -45
- package/dist/client/components/primitives/toggle-input.mjs +31 -11
- package/dist/client/components/primitives/types.mjs +1 -2
- package/dist/client/components/sheets/resource-sheet.mjs +72 -64
- package/dist/client/components/ui/accordion.mjs +156 -37
- package/dist/client/components/ui/alert.mjs +70 -17
- package/dist/client/components/ui/badge.mjs +57 -16
- package/dist/client/components/ui/button.mjs +49 -14
- package/dist/client/components/ui/card.mjs +194 -39
- package/dist/client/components/ui/checkbox.mjs +71 -16
- package/dist/client/components/ui/command.mjs +220 -50
- package/dist/client/components/ui/dialog.mjs +265 -52
- package/dist/client/components/ui/drawer.mjs +260 -57
- package/dist/client/components/ui/dropdown-menu.mjs +293 -67
- package/dist/client/components/ui/empty-state.mjs +72 -26
- package/dist/client/components/ui/field.mjs +332 -56
- package/dist/client/components/ui/input-group.mjs +174 -41
- package/dist/client/components/ui/input.mjs +38 -9
- package/dist/client/components/ui/kbd.mjs +37 -8
- package/dist/client/components/ui/label.mjs +38 -8
- package/dist/client/components/ui/popover.mjs +162 -35
- package/dist/client/components/ui/responsive-dialog.mjs +277 -71
- package/dist/client/components/ui/search-input.mjs +101 -36
- package/dist/client/components/ui/select.mjs +297 -57
- package/dist/client/components/ui/separator.mjs +39 -9
- package/dist/client/components/ui/sheet.mjs +253 -51
- package/dist/client/components/ui/sidebar.mjs +700 -182
- package/dist/client/components/ui/skeleton.mjs +33 -8
- package/dist/client/components/ui/sonner.d.mts +2 -3
- package/dist/client/components/ui/sonner.mjs +45 -15
- package/dist/client/components/ui/spinner.mjs +44 -10
- package/dist/client/components/ui/switch.mjs +47 -12
- package/dist/client/components/ui/table.mjs +260 -50
- package/dist/client/components/ui/tabs.mjs +140 -29
- package/dist/client/components/ui/textarea.mjs +33 -8
- package/dist/client/components/ui/toolbar.mjs +105 -23
- package/dist/client/components/ui/tooltip.mjs +130 -29
- package/dist/client/components/widgets/chart-widget.mjs +456 -156
- package/dist/client/components/widgets/progress-widget.mjs +150 -60
- package/dist/client/components/widgets/quick-actions-widget.mjs +175 -87
- package/dist/client/components/widgets/recent-items-widget.mjs +157 -62
- package/dist/client/components/widgets/stats-widget.mjs +153 -42
- package/dist/client/components/widgets/table-widget.mjs +198 -64
- package/dist/client/components/widgets/timeline-widget.mjs +193 -82
- package/dist/client/components/widgets/value-widget.mjs +257 -56
- package/dist/client/components/widgets/widget-skeletons.mjs +390 -108
- package/dist/client/contexts/breadcrumb-context.mjs +44 -16
- package/dist/client/{context → contexts}/focus-context.d.mts +6 -7
- package/dist/client/{context → contexts}/focus-context.mjs +134 -62
- package/dist/client/hooks/typed-hooks.d.mts +38 -12
- package/dist/client/hooks/typed-hooks.mjs +758 -142
- package/dist/client/hooks/use-action.mjs +197 -69
- package/dist/client/hooks/use-admin-config.mjs +39 -10
- package/dist/client/hooks/use-admin-preferences.mjs +118 -15
- package/dist/client/hooks/use-admin-routes.mjs +60 -27
- package/dist/client/hooks/use-audit-history.mjs +157 -0
- package/dist/client/hooks/use-auth.d.mts +14 -15
- package/dist/client/hooks/use-auth.mjs +8 -9
- package/dist/client/hooks/use-collection-fields.mjs +58 -19
- package/dist/client/hooks/use-collection-meta.mjs +45 -13
- package/dist/client/hooks/use-collection-schema.mjs +34 -11
- package/dist/client/hooks/use-collection-validation.mjs +39 -25
- package/dist/client/hooks/use-collection.d.mts +18 -8
- package/dist/client/hooks/use-collection.mjs +560 -101
- package/dist/client/hooks/use-current-user.d.mts +6 -3
- package/dist/client/hooks/use-current-user.mjs +2 -2
- package/dist/client/hooks/use-field-hooks.mjs +73 -65
- package/dist/client/hooks/use-field-options.d.mts +1 -34
- package/dist/client/hooks/use-field-options.mjs +233 -148
- package/dist/client/hooks/use-global-fields.mjs +47 -16
- package/dist/client/hooks/use-global-meta.mjs +57 -11
- package/dist/client/hooks/use-global-schema.mjs +31 -11
- package/dist/client/hooks/use-global.d.mts +13 -2
- package/dist/client/hooks/use-global.mjs +244 -34
- package/dist/client/hooks/use-locks.mjs +331 -124
- package/dist/client/hooks/use-media-query.d.mts +1 -2
- package/dist/client/hooks/use-media-query.mjs +38 -19
- package/dist/client/hooks/use-prefill-params.mjs +2 -2
- package/dist/client/hooks/use-questpie-query-options.mjs +33 -11
- package/dist/client/hooks/use-reactive-fields.d.mts +6 -3
- package/dist/client/hooks/use-reactive-fields.mjs +130 -93
- package/dist/client/hooks/use-realtime-highlight.mjs +115 -53
- package/dist/client/hooks/use-saved-views.mjs +109 -34
- package/dist/client/hooks/use-search-param-toggle.d.mts +12 -0
- package/dist/client/hooks/use-search-param-toggle.mjs +115 -0
- package/dist/client/hooks/use-search.mjs +147 -36
- package/dist/client/hooks/use-server-actions.mjs +191 -0
- package/dist/client/hooks/use-server-validation.mjs +164 -72
- package/dist/client/hooks/use-server-widget-data.d.mts +2 -3
- package/dist/client/hooks/use-server-widget-data.mjs +36 -11
- package/dist/client/hooks/use-setup-status.d.mts +3 -4
- package/dist/client/hooks/use-setup-status.mjs +28 -16
- package/dist/client/hooks/use-sidebar-search-param.d.mts +9 -0
- package/dist/client/hooks/use-sidebar-search-param.mjs +104 -0
- package/dist/client/hooks/use-transition-stage.mjs +125 -0
- package/dist/client/hooks/use-upload-collection.mjs +1 -2
- package/dist/client/hooks/use-upload.mjs +189 -125
- package/dist/client/hooks/use-validation-error-map.mjs +10 -6
- package/dist/client/hooks/use-view-state.mjs +380 -162
- package/dist/client/i18n/hooks.mjs +191 -67
- package/dist/client/i18n/intl-cache.mjs +1 -2
- package/dist/client/i18n/messages.mjs +1 -2
- package/dist/client/i18n/simple.d.mts +1 -2
- package/dist/client/i18n/simple.mjs +1 -2
- package/dist/client/i18n/types.d.mts +1 -2
- package/dist/client/lib/cookies.mjs +9 -0
- package/dist/client/lib/events.mjs +5 -0
- package/dist/client/lib/render-profiler.mjs +51 -0
- package/dist/client/lib/utils.mjs +1 -6
- package/dist/client/preview/block-scope-context.d.mts +5 -6
- package/dist/client/preview/block-scope-context.mjs +50 -27
- package/dist/client/preview/index.d.mts +2 -2
- package/dist/client/preview/preview-banner.d.mts +3 -4
- package/dist/client/preview/preview-banner.mjs +74 -35
- package/dist/client/preview/preview-field.d.mts +9 -10
- package/dist/client/preview/preview-field.mjs +163 -61
- package/dist/client/preview/types.d.mts +1 -2
- package/dist/client/preview/types.mjs +1 -2
- package/dist/client/preview/use-collection-preview.d.mts +1 -2
- package/dist/client/preview/use-collection-preview.mjs +105 -56
- package/dist/client/runtime/content-locales-provider.mjs +87 -36
- package/dist/client/runtime/index.d.mts +1 -3
- package/dist/client/runtime/index.mjs +1 -3
- package/dist/client/runtime/locale-scope.mjs +69 -29
- package/dist/client/runtime/provider.d.mts +18 -9922
- package/dist/client/runtime/provider.mjs +250 -86
- package/dist/client/runtime/routes.d.mts +7 -7
- package/dist/client/runtime/routes.mjs +4 -20
- package/dist/client/runtime/translations-provider.mjs +114 -53
- package/dist/client/scope/picker.d.mts +3 -4
- package/dist/client/scope/picker.mjs +324 -90
- package/dist/client/scope/provider.d.mts +4 -5
- package/dist/client/scope/provider.mjs +30 -22
- package/dist/client/scope/types.d.mts +1 -2
- package/dist/client/styles/index.css +301 -225
- package/dist/client/utils/auto-expand-fields.mjs +23 -5
- package/dist/client/utils/build-field-definitions-from-schema.mjs +10 -7
- package/dist/client/utils/dependency-tracker.mjs +61 -0
- package/dist/client/utils/detect-relations.mjs +1 -2
- package/dist/client/utils/locale-to-flag.d.mts +8 -7
- package/dist/client/utils/locale-to-flag.mjs +1 -2
- package/dist/client/utils/routes.mjs +1 -2
- package/dist/client/views/auth/accept-invite-form.d.mts +3 -4
- package/dist/client/views/auth/accept-invite-form.mjs +414 -121
- package/dist/client/views/auth/auth-layout.d.mts +5 -6
- package/dist/client/views/auth/auth-layout.mjs +93 -30
- package/dist/client/views/auth/forgot-password-form.d.mts +4 -5
- package/dist/client/views/auth/forgot-password-form.mjs +332 -100
- package/dist/client/views/auth/invite-form.mjs +447 -105
- package/dist/client/views/auth/login-form.d.mts +4 -5
- package/dist/client/views/auth/login-form.mjs +340 -120
- package/dist/client/views/auth/reset-password-form.d.mts +4 -5
- package/dist/client/views/auth/reset-password-form.mjs +458 -131
- package/dist/client/views/auth/setup-form.d.mts +2 -3
- package/dist/client/views/auth/setup-form.mjs +481 -141
- package/dist/client/views/collection/auto-form-fields.mjs +686 -266
- package/dist/client/views/collection/bulk-action-toolbar.mjs +392 -203
- package/dist/client/views/collection/cells/complex-cells.mjs +635 -216
- package/dist/client/views/collection/cells/primitive-cells.mjs +332 -102
- package/dist/client/views/collection/cells/relation-cells.mjs +227 -72
- package/dist/client/views/collection/cells/shared/asset-thumbnail.mjs +456 -136
- package/dist/client/views/collection/cells/shared/cell-helpers.mjs +49 -2
- package/dist/client/views/collection/cells/shared/relation-chip.mjs +109 -25
- package/dist/client/views/collection/cells/upload-cells.mjs +16 -8
- package/dist/client/views/collection/columns/build-columns.mjs +51 -12
- package/dist/client/views/collection/columns/column-defaults.mjs +17 -2
- package/dist/client/views/collection/field-context.mjs +10 -11
- package/dist/client/views/collection/field-renderer.mjs +237 -40
- package/dist/client/views/collection/form-view.mjs +1108 -445
- package/dist/client/views/collection/table-view.mjs +300 -163
- package/dist/client/views/collection/view-skeletons.mjs +181 -87
- package/dist/client/views/common/global-search.mjs +557 -233
- package/dist/client/views/dashboard/dashboard-grid.mjs +707 -211
- package/dist/client/views/dashboard/dashboard-widget.mjs +145 -58
- package/dist/client/views/dashboard/widget-card.mjs +315 -102
- package/dist/client/views/globals/global-form-view.mjs +1256 -131
- package/dist/client/views/layout/admin-layout-provider.d.mts +18 -21
- package/dist/client/views/layout/admin-layout-provider.mjs +135 -32
- package/dist/client/views/layout/admin-layout.d.mts +14 -32
- package/dist/client/views/layout/admin-layout.mjs +254 -96
- package/dist/client/views/layout/admin-router.d.mts +10 -42
- package/dist/client/views/layout/admin-router.mjs +1086 -426
- package/dist/client/views/layout/admin-sidebar.d.mts +10 -16
- package/dist/client/views/layout/admin-sidebar.mjs +1211 -382
- package/dist/client/views/layout/admin-topbar.mjs +220 -112
- package/dist/client/views/pages/accept-invite-page.d.mts +5 -6
- package/dist/client/views/pages/accept-invite-page.mjs +302 -96
- package/dist/client/views/pages/dashboard-page.d.mts +7 -16
- package/dist/client/views/pages/dashboard-page.mjs +62 -23
- package/dist/client/views/pages/forgot-password-page.d.mts +7 -10
- package/dist/client/views/pages/forgot-password-page.mjs +112 -40
- package/dist/client/views/pages/invite-page.d.mts +6 -7
- package/dist/client/views/pages/invite-page.mjs +121 -46
- package/dist/client/views/pages/login-page.d.mts +8 -15
- package/dist/client/views/pages/login-page.mjs +152 -57
- package/dist/client/views/pages/reset-password-page.d.mts +7 -10
- package/dist/client/views/pages/reset-password-page.mjs +209 -57
- package/dist/client/views/pages/setup-page.d.mts +7 -10
- package/dist/client/views/pages/setup-page.mjs +108 -43
- package/dist/client-module.d.mts +3 -0
- package/dist/client-module.mjs +3 -0
- package/dist/client.d.mts +55 -48
- package/dist/client.mjs +26 -28
- package/dist/components/rich-text/rich-text-renderer.d.mts +3 -4
- package/dist/components/rich-text/rich-text-renderer.mjs +97 -70
- package/dist/index.d.mts +36 -39
- package/dist/index.mjs +26 -28
- package/dist/plugin.d.mts +2 -0
- package/dist/plugin.mjs +3 -0
- package/dist/server/adapters/nextjs.d.mts +13 -14
- package/dist/server/adapters/nextjs.mjs +12 -13
- package/dist/server/adapters/tanstack.d.mts +10 -11
- package/dist/server/adapters/tanstack.mjs +11 -12
- package/dist/server/augmentation/actions.d.mts +279 -0
- package/dist/server/augmentation/common.d.mts +76 -0
- package/dist/server/augmentation/dashboard.d.mts +547 -0
- package/dist/server/augmentation/form-layout.d.mts +303 -0
- package/dist/server/augmentation/index.d.mts +44 -0
- package/dist/server/augmentation/index.mjs +10 -0
- package/dist/server/augmentation/sidebar.d.mts +181 -0
- package/dist/server/augmentation/views.d.mts +237 -0
- package/dist/server/augmentation.d.mts +7 -1523
- package/dist/server/block/index.d.mts +4 -3
- package/dist/server/codegen/admin-client-template.mjs +93 -0
- package/dist/server/codegen/projection-validator.mjs +67 -0
- package/dist/server/fields/blocks.d.mts +10 -78
- package/dist/server/fields/blocks.mjs +74 -115
- package/dist/server/fields/index.d.mts +6 -39
- package/dist/server/fields/index.mjs +6 -7
- package/dist/server/fields/rich-text.d.mts +10 -77
- package/dist/server/fields/rich-text.mjs +59 -100
- package/dist/server/i18n/index.mjs +8 -9
- package/dist/server/i18n/messages/cs.mjs +3 -3
- package/dist/server/i18n/messages/de.mjs +3 -3
- package/dist/server/i18n/messages/en.mjs +217 -3
- package/dist/server/i18n/messages/es.mjs +3 -3
- package/dist/server/i18n/messages/fr.mjs +3 -3
- package/dist/server/i18n/messages/index.mjs +1 -2
- package/dist/server/i18n/messages/pl.mjs +3 -3
- package/dist/server/i18n/messages/pt.mjs +3 -3
- package/dist/server/i18n/messages/sk.mjs +202 -3
- package/dist/server/modules/admin/.generated/module.d.mts +52 -0
- package/dist/server/modules/admin/.generated/module.mjs +78 -0
- package/dist/server/modules/admin/.generated/registries.d.mts +22 -0
- package/dist/server/{auth-helpers.d.mts → modules/admin/auth-helpers.d.mts} +13 -14
- package/dist/server/{auth-helpers.mjs → modules/admin/auth-helpers.mjs} +15 -16
- package/dist/server/{block → modules/admin/block}/block-builder.d.mts +96 -32
- package/dist/server/{block → modules/admin/block}/block-builder.mjs +113 -15
- package/dist/server/modules/admin/block/index.d.mts +3 -0
- package/dist/server/{block → modules/admin/block}/introspection.d.mts +10 -5
- package/dist/server/{block → modules/admin/block}/introspection.mjs +18 -7
- package/dist/server/{block → modules/admin/block}/prefetch.d.mts +21 -17
- package/dist/server/{block → modules/admin/block}/prefetch.mjs +17 -16
- package/dist/server/modules/admin/client/.generated/module.d.mts +94 -0
- package/dist/server/modules/admin/client/.generated/module.mjs +91 -0
- package/dist/server/modules/admin/client/components/badge.d.mts +1 -0
- package/dist/server/modules/admin/client/components/icon.d.mts +1 -0
- package/dist/server/modules/admin/client/fields/array.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/array.mjs +12 -0
- package/dist/server/modules/admin/client/fields/assetPreview.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/assetPreview.mjs +18 -0
- package/dist/server/modules/admin/client/fields/blocks.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/blocks.mjs +12 -0
- package/dist/server/modules/admin/client/fields/boolean.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/boolean.mjs +12 -0
- package/dist/server/modules/admin/client/fields/date.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/date.mjs +12 -0
- package/dist/server/modules/admin/client/fields/datetime.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/datetime.mjs +12 -0
- package/dist/server/modules/admin/client/fields/email.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/email.mjs +12 -0
- package/dist/server/modules/admin/client/fields/json.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/json.mjs +11 -0
- package/dist/server/modules/admin/client/fields/number.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/number.mjs +12 -0
- package/dist/server/modules/admin/client/fields/object.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/object.mjs +12 -0
- package/dist/server/modules/admin/client/fields/relation.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/relation.mjs +12 -0
- package/dist/server/modules/admin/client/fields/richText.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/richText.mjs +11 -0
- package/dist/server/modules/admin/client/fields/select.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/select.mjs +12 -0
- package/dist/server/modules/admin/client/fields/text.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/text.mjs +12 -0
- package/dist/server/modules/admin/client/fields/textarea.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/textarea.mjs +12 -0
- package/dist/server/modules/admin/client/fields/time.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/time.mjs +12 -0
- package/dist/server/modules/admin/client/fields/upload.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/upload.mjs +12 -0
- package/dist/server/modules/admin/client/fields/url.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/url.mjs +12 -0
- package/dist/server/modules/admin/client/index.d.mts +1 -0
- package/dist/server/modules/admin/client/pages/dashboard.d.mts +6 -0
- package/dist/server/modules/admin/client/pages/dashboard.mjs +11 -0
- package/dist/server/modules/admin/client/pages/forgotPassword.d.mts +6 -0
- package/dist/server/modules/admin/client/pages/forgotPassword.mjs +11 -0
- package/dist/server/modules/admin/client/pages/login.d.mts +6 -0
- package/dist/server/modules/admin/client/pages/login.mjs +11 -0
- package/dist/server/modules/admin/client/pages/resetPassword.d.mts +6 -0
- package/dist/server/modules/admin/client/pages/resetPassword.mjs +11 -0
- package/dist/server/modules/admin/client/pages/setup.d.mts +6 -0
- package/dist/server/modules/admin/client/pages/setup.mjs +11 -0
- package/dist/server/modules/admin/client/views/collection-form.mjs +10 -0
- package/dist/server/modules/admin/client/views/collection-table.mjs +10 -0
- package/dist/server/modules/admin/client/views/global-form.mjs +10 -0
- package/dist/server/modules/admin/client/widgets/chart.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/chart.mjs +7 -0
- package/dist/server/modules/admin/client/widgets/progress.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/progress.mjs +7 -0
- package/dist/server/modules/admin/client/widgets/quickActions.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/quickActions.mjs +7 -0
- package/dist/server/modules/admin/client/widgets/recentItems.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/recentItems.mjs +7 -0
- package/dist/server/modules/admin/client/widgets/stats.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/stats.mjs +7 -0
- package/dist/server/modules/admin/client/widgets/table.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/table.mjs +7 -0
- package/dist/server/modules/admin/client/widgets/timeline.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/timeline.mjs +7 -0
- package/dist/server/modules/admin/client/widgets/value.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/value.mjs +7 -0
- package/dist/server/modules/admin/collections/account.d.mts +77 -0
- package/dist/server/modules/admin/collections/account.mjs +23 -0
- package/dist/server/modules/admin/collections/admin-locks.d.mts +90 -0
- package/dist/server/modules/admin/collections/admin-locks.mjs +16 -0
- package/dist/server/modules/admin/collections/admin-preferences.d.mts +69 -0
- package/dist/server/modules/admin/collections/admin-preferences.mjs +16 -0
- package/dist/server/modules/admin/collections/admin-saved-views.d.mts +83 -0
- package/dist/server/modules/admin/collections/admin-saved-views.mjs +16 -0
- package/dist/server/modules/admin/collections/apikey.d.mts +99 -0
- package/dist/server/modules/admin/collections/apikey.mjs +15 -0
- package/dist/server/modules/admin/collections/assets.d.mts +72 -0
- package/dist/server/modules/admin/collections/assets.mjs +71 -0
- package/dist/server/modules/admin/collections/session.d.mts +69 -0
- package/dist/server/modules/admin/collections/session.mjs +15 -0
- package/dist/server/modules/admin/collections/user.d.mts +85 -0
- package/dist/server/modules/admin/collections/user.mjs +204 -0
- package/dist/server/modules/admin/collections/verification.d.mts +63 -0
- package/dist/server/modules/admin/collections/verification.mjs +15 -0
- package/dist/server/modules/admin/components/badge.d.mts +10 -0
- package/dist/server/modules/admin/components/badge.mjs +10 -0
- package/dist/server/modules/admin/components/icon.d.mts +9 -0
- package/dist/server/modules/admin/components/icon.mjs +11 -0
- package/dist/server/modules/admin/config/admin.mjs +34 -0
- package/dist/server/modules/admin/dto/admin-config.dto.mjs +102 -0
- package/dist/server/modules/admin/factories.mjs +172 -0
- package/dist/server/modules/admin/index.d.mts +1060 -16846
- package/dist/server/modules/admin/index.mjs +17 -240
- package/dist/server/modules/admin/modules.mjs +11 -0
- package/dist/server/modules/admin/plugin.mjs +13 -0
- package/dist/server/modules/admin/routes/admin-config.d.mts +28 -0
- package/dist/server/modules/admin/routes/admin-config.mjs +552 -0
- package/dist/server/modules/admin/{functions → routes}/execute-action.d.mts +17 -32
- package/dist/server/modules/admin/{functions → routes}/execute-action.mjs +146 -44
- package/dist/server/modules/admin/routes/locales.d.mts +18 -0
- package/dist/server/modules/admin/routes/locales.mjs +69 -0
- package/dist/server/modules/admin/{functions → routes}/preview.d.mts +25 -15
- package/dist/server/modules/admin/{functions → routes}/preview.mjs +84 -97
- package/dist/server/modules/admin/{functions → routes}/reactive.d.mts +19 -44
- package/dist/server/modules/admin/{functions → routes}/reactive.mjs +89 -117
- package/dist/server/modules/admin/routes/route-helpers.d.mts +23 -0
- package/dist/server/modules/admin/routes/route-helpers.mjs +76 -0
- package/dist/server/modules/admin/{functions → routes}/setup.d.mts +11 -32
- package/dist/server/modules/admin/routes/setup.mjs +114 -0
- package/dist/server/modules/admin/routes/translations.d.mts +26 -0
- package/dist/server/modules/admin/routes/translations.mjs +114 -0
- package/dist/server/modules/admin/routes/widget-data.d.mts +32 -0
- package/dist/server/modules/admin/routes/widget-data.mjs +62 -0
- package/dist/server/modules/admin/views/form.d.mts +8 -0
- package/dist/server/modules/admin/views/form.mjs +7 -0
- package/dist/server/modules/admin/views/global-form.d.mts +8 -0
- package/dist/server/modules/admin/views/global-form.mjs +7 -0
- package/dist/server/modules/admin/views/table.d.mts +8 -0
- package/dist/server/modules/admin/views/table.mjs +7 -0
- package/dist/server/modules/admin-preferences/collections/{admin-preferences.collection.mjs → admin-preferences.mjs} +13 -24
- package/dist/server/modules/admin-preferences/collections/locks.collection.mjs +18 -42
- package/dist/server/modules/admin-preferences/collections/saved-views.d.mts +99 -0
- package/dist/server/modules/admin-preferences/collections/saved-views.mjs +38 -0
- package/dist/server/modules/audit/.generated/module.d.mts +60 -0
- package/dist/server/modules/audit/.generated/module.mjs +30 -0
- package/dist/server/modules/audit/collections/audit-log.d.mts +214 -0
- package/dist/server/modules/audit/collections/audit-log.mjs +107 -0
- package/dist/server/modules/audit/config/admin.mjs +21 -0
- package/dist/server/modules/audit/config/app.mjs +262 -0
- package/dist/server/modules/audit/index.d.mts +2 -0
- package/dist/server/modules/audit/jobs/audit-cleanup.d.mts +13 -0
- package/dist/server/modules/audit/jobs/audit-cleanup.mjs +28 -0
- package/dist/server/plugin.d.mts +26 -0
- package/dist/server/plugin.mjs +385 -0
- package/dist/server/proxy-factories.d.mts +85 -0
- package/dist/server/proxy-factories.mjs +302 -0
- package/dist/server/registry-helpers.d.mts +83 -0
- package/dist/server/registry-helpers.mjs +104 -0
- package/dist/server.d.mts +30 -18
- package/dist/server.mjs +19 -16
- package/dist/shared/preview-utils.d.mts +2 -3
- package/dist/shared/preview-utils.mjs +2 -3
- package/dist/shared/types/saved-views.types.d.mts +2 -2
- package/package.json +51 -40
- package/dist/_virtual/rolldown_runtime.mjs +0 -18
- package/dist/augmentation.d.mts.map +0 -1
- package/dist/client/blocks/block-registry.d.mts +0 -199
- package/dist/client/blocks/block-registry.d.mts.map +0 -1
- package/dist/client/blocks/block-registry.mjs +0 -88
- package/dist/client/blocks/block-registry.mjs.map +0 -1
- package/dist/client/blocks/block-renderer.d.mts.map +0 -1
- package/dist/client/blocks/block-renderer.mjs.map +0 -1
- package/dist/client/blocks/prefetch.d.mts +0 -45
- package/dist/client/blocks/prefetch.d.mts.map +0 -1
- package/dist/client/blocks/prefetch.mjs +0 -26
- package/dist/client/blocks/prefetch.mjs.map +0 -1
- package/dist/client/blocks/types.d.mts.map +0 -1
- package/dist/client/blocks/types.mjs.map +0 -1
- package/dist/client/builder/admin-builder.d.mts +0 -112
- package/dist/client/builder/admin-builder.d.mts.map +0 -1
- package/dist/client/builder/admin-builder.mjs +0 -185
- package/dist/client/builder/admin-builder.mjs.map +0 -1
- package/dist/client/builder/admin-types.d.mts.map +0 -1
- package/dist/client/builder/admin.d.mts.map +0 -1
- package/dist/client/builder/admin.mjs.map +0 -1
- package/dist/client/builder/defaults/components.mjs +0 -20
- package/dist/client/builder/defaults/components.mjs.map +0 -1
- package/dist/client/builder/defaults/core.d.mts +0 -354
- package/dist/client/builder/defaults/core.d.mts.map +0 -1
- package/dist/client/builder/defaults/core.mjs +0 -49
- package/dist/client/builder/defaults/core.mjs.map +0 -1
- package/dist/client/builder/defaults/fields.mjs +0 -328
- package/dist/client/builder/defaults/fields.mjs.map +0 -1
- package/dist/client/builder/defaults/pages.mjs +0 -58
- package/dist/client/builder/defaults/pages.mjs.map +0 -1
- package/dist/client/builder/defaults/starter.d.mts +0 -351
- package/dist/client/builder/defaults/starter.d.mts.map +0 -1
- package/dist/client/builder/defaults/starter.mjs +0 -28
- package/dist/client/builder/defaults/starter.mjs.map +0 -1
- package/dist/client/builder/defaults/views.mjs +0 -27
- package/dist/client/builder/defaults/views.mjs.map +0 -1
- package/dist/client/builder/defaults/widgets.mjs +0 -31
- package/dist/client/builder/defaults/widgets.mjs.map +0 -1
- package/dist/client/builder/field/field.d.mts.map +0 -1
- package/dist/client/builder/field/field.mjs.map +0 -1
- package/dist/client/builder/index.d.mts.map +0 -1
- package/dist/client/builder/page/page.d.mts.map +0 -1
- package/dist/client/builder/page/page.mjs.map +0 -1
- package/dist/client/builder/proxies.d.mts +0 -2
- package/dist/client/builder/proxies.mjs +0 -24
- package/dist/client/builder/proxies.mjs.map +0 -1
- package/dist/client/builder/qa.d.mts +0 -50
- package/dist/client/builder/qa.d.mts.map +0 -1
- package/dist/client/builder/qa.mjs +0 -42
- package/dist/client/builder/qa.mjs.map +0 -1
- package/dist/client/builder/registry.d.mts.map +0 -1
- package/dist/client/builder/types/action-registry.d.mts +0 -2
- package/dist/client/builder/types/action-registry.mjs.map +0 -1
- package/dist/client/builder/types/action-types.d.mts.map +0 -1
- package/dist/client/builder/types/collection-types.d.mts +0 -199
- package/dist/client/builder/types/collection-types.d.mts.map +0 -1
- package/dist/client/builder/types/collection-types.mjs.map +0 -1
- package/dist/client/builder/types/common.d.mts.map +0 -1
- package/dist/client/builder/types/field-types.d.mts.map +0 -1
- package/dist/client/builder/types/field-types.mjs.map +0 -1
- package/dist/client/builder/types/global-types.d.mts +0 -22
- package/dist/client/builder/types/global-types.d.mts.map +0 -1
- package/dist/client/builder/types/ui-config.d.mts.map +0 -1
- package/dist/client/builder/types/views.d.mts +0 -89
- package/dist/client/builder/types/views.d.mts.map +0 -1
- package/dist/client/builder/types/widget-types.d.mts.map +0 -1
- package/dist/client/builder/validation.mjs.map +0 -1
- package/dist/client/builder/view/view.d.mts.map +0 -1
- package/dist/client/builder/view/view.mjs.map +0 -1
- package/dist/client/builder/widget/widget.d.mts.map +0 -1
- package/dist/client/builder/widget/widget.mjs.map +0 -1
- package/dist/client/components/actions/action-button.d.mts +0 -2
- package/dist/client/components/actions/action-button.mjs.map +0 -1
- package/dist/client/components/actions/action-dialog.d.mts +0 -2
- package/dist/client/components/actions/action-dialog.mjs.map +0 -1
- package/dist/client/components/actions/confirmation-dialog.d.mts +0 -2
- package/dist/client/components/actions/confirmation-dialog.mjs.map +0 -1
- package/dist/client/components/actions/header-actions.d.mts +0 -2
- package/dist/client/components/actions/header-actions.mjs.map +0 -1
- package/dist/client/components/actions/index.d.mts +0 -4
- package/dist/client/components/admin-link.d.mts.map +0 -1
- package/dist/client/components/admin-link.mjs.map +0 -1
- package/dist/client/components/auth/auth-guard.d.mts.map +0 -1
- package/dist/client/components/auth/auth-guard.mjs.map +0 -1
- package/dist/client/components/auth/auth-loading.d.mts.map +0 -1
- package/dist/client/components/auth/auth-loading.mjs.map +0 -1
- package/dist/client/components/auth/index.d.mts +0 -2
- package/dist/client/components/blocks/block-canvas.mjs.map +0 -1
- package/dist/client/components/blocks/block-editor-context.mjs.map +0 -1
- package/dist/client/components/blocks/block-editor-layout.mjs.map +0 -1
- package/dist/client/components/blocks/block-editor-provider.mjs.map +0 -1
- package/dist/client/components/blocks/block-fields-renderer.mjs.map +0 -1
- package/dist/client/components/blocks/block-insert-button.mjs.map +0 -1
- package/dist/client/components/blocks/block-item-menu.mjs.map +0 -1
- package/dist/client/components/blocks/block-item.mjs.map +0 -1
- package/dist/client/components/blocks/block-library-sidebar.mjs.map +0 -1
- package/dist/client/components/blocks/block-tree.mjs.map +0 -1
- package/dist/client/components/blocks/block-type-icon.mjs.map +0 -1
- package/dist/client/components/blocks/utils/tree-utils.mjs.map +0 -1
- package/dist/client/components/component-renderer.d.mts.map +0 -1
- package/dist/client/components/component-renderer.mjs.map +0 -1
- package/dist/client/components/error-boundary.mjs.map +0 -1
- package/dist/client/components/fields/array-field.d.mts +0 -44
- package/dist/client/components/fields/array-field.d.mts.map +0 -1
- package/dist/client/components/fields/array-field.mjs.map +0 -1
- package/dist/client/components/fields/asset-preview-field.d.mts +0 -52
- package/dist/client/components/fields/asset-preview-field.d.mts.map +0 -1
- package/dist/client/components/fields/asset-preview-field.mjs.map +0 -1
- package/dist/client/components/fields/blocks-field/blocks-field.d.mts +0 -41
- package/dist/client/components/fields/blocks-field/blocks-field.d.mts.map +0 -1
- package/dist/client/components/fields/blocks-field/blocks-field.mjs.map +0 -1
- package/dist/client/components/fields/blocks-field/index.d.mts +0 -1
- package/dist/client/components/fields/boolean-field.d.mts +0 -30
- package/dist/client/components/fields/boolean-field.d.mts.map +0 -1
- package/dist/client/components/fields/boolean-field.mjs.map +0 -1
- package/dist/client/components/fields/custom-field.d.mts +0 -3
- package/dist/client/components/fields/date-field.d.mts +0 -22
- package/dist/client/components/fields/date-field.d.mts.map +0 -1
- package/dist/client/components/fields/date-field.mjs.map +0 -1
- package/dist/client/components/fields/datetime-field.d.mts +0 -23
- package/dist/client/components/fields/datetime-field.d.mts.map +0 -1
- package/dist/client/components/fields/datetime-field.mjs.map +0 -1
- package/dist/client/components/fields/email-field.d.mts +0 -19
- package/dist/client/components/fields/email-field.d.mts.map +0 -1
- package/dist/client/components/fields/email-field.mjs.map +0 -1
- package/dist/client/components/fields/embedded-collection.d.mts +0 -3
- package/dist/client/components/fields/field-types.d.mts +0 -571
- package/dist/client/components/fields/field-types.d.mts.map +0 -1
- package/dist/client/components/fields/field-utils.d.mts +0 -1
- package/dist/client/components/fields/field-utils.mjs.map +0 -1
- package/dist/client/components/fields/field-wrapper.d.mts +0 -3
- package/dist/client/components/fields/field-wrapper.mjs.map +0 -1
- package/dist/client/components/fields/index.d.mts +0 -33
- package/dist/client/components/fields/json-field.d.mts +0 -84
- package/dist/client/components/fields/json-field.d.mts.map +0 -1
- package/dist/client/components/fields/json-field.mjs.map +0 -1
- package/dist/client/components/fields/locale-badge.d.mts +0 -1
- package/dist/client/components/fields/locale-badge.mjs.map +0 -1
- package/dist/client/components/fields/number-field.d.mts +0 -23
- package/dist/client/components/fields/number-field.d.mts.map +0 -1
- package/dist/client/components/fields/number-field.mjs.map +0 -1
- package/dist/client/components/fields/object-array-field.d.mts +0 -2
- package/dist/client/components/fields/object-array-field.mjs.map +0 -1
- package/dist/client/components/fields/object-field.d.mts +0 -32
- package/dist/client/components/fields/object-field.d.mts.map +0 -1
- package/dist/client/components/fields/object-field.mjs.map +0 -1
- package/dist/client/components/fields/relation/displays/cards-display.d.mts +0 -2
- package/dist/client/components/fields/relation/displays/cards-display.mjs.map +0 -1
- package/dist/client/components/fields/relation/displays/chips-display.d.mts +0 -2
- package/dist/client/components/fields/relation/displays/chips-display.mjs.map +0 -1
- package/dist/client/components/fields/relation/displays/grid-display.d.mts +0 -2
- package/dist/client/components/fields/relation/displays/grid-display.mjs.map +0 -1
- package/dist/client/components/fields/relation/displays/index.d.mts +0 -6
- package/dist/client/components/fields/relation/displays/list-display.d.mts +0 -2
- package/dist/client/components/fields/relation/displays/list-display.mjs.map +0 -1
- package/dist/client/components/fields/relation/displays/table-display.d.mts +0 -2
- package/dist/client/components/fields/relation/displays/table-display.mjs.map +0 -1
- package/dist/client/components/fields/relation/displays/types.d.mts +0 -22
- package/dist/client/components/fields/relation/displays/types.d.mts.map +0 -1
- package/dist/client/components/fields/relation/displays/types.mjs.map +0 -1
- package/dist/client/components/fields/relation/index.d.mts +0 -3
- package/dist/client/components/fields/relation/relation-items-display.d.mts +0 -5
- package/dist/client/components/fields/relation/relation-items-display.mjs.map +0 -1
- package/dist/client/components/fields/relation-field.d.mts +0 -134
- package/dist/client/components/fields/relation-field.d.mts.map +0 -1
- package/dist/client/components/fields/relation-field.mjs.map +0 -1
- package/dist/client/components/fields/relation-picker.d.mts +0 -4
- package/dist/client/components/fields/relation-picker.mjs.map +0 -1
- package/dist/client/components/fields/relation-select.d.mts +0 -3
- package/dist/client/components/fields/relation-select.mjs.map +0 -1
- package/dist/client/components/fields/reverse-relation-field.d.mts +0 -2
- package/dist/client/components/fields/rich-text-editor/bubble-menu.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/extensions.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/image-popover.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/index.d.mts +0 -4
- package/dist/client/components/fields/rich-text-editor/index.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/link-popover.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/presets.d.mts +0 -11
- package/dist/client/components/fields/rich-text-editor/presets.d.mts.map +0 -1
- package/dist/client/components/fields/rich-text-editor/presets.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/slash-commands.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/table-controls.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/toolbar.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/types.d.mts +0 -78
- package/dist/client/components/fields/rich-text-editor/types.d.mts.map +0 -1
- package/dist/client/components/fields/rich-text-editor/types.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/utils.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/variants.d.mts +0 -2
- package/dist/client/components/fields/rich-text-field.d.mts +0 -14
- package/dist/client/components/fields/rich-text-field.d.mts.map +0 -1
- package/dist/client/components/fields/rich-text-field.mjs.map +0 -1
- package/dist/client/components/fields/select-field.d.mts +0 -25
- package/dist/client/components/fields/select-field.d.mts.map +0 -1
- package/dist/client/components/fields/select-field.mjs.map +0 -1
- package/dist/client/components/fields/status-field.d.mts +0 -2
- package/dist/client/components/fields/text-field.d.mts +0 -22
- package/dist/client/components/fields/text-field.d.mts.map +0 -1
- package/dist/client/components/fields/text-field.mjs.map +0 -1
- package/dist/client/components/fields/textarea-field.d.mts +0 -22
- package/dist/client/components/fields/textarea-field.d.mts.map +0 -1
- package/dist/client/components/fields/textarea-field.mjs.map +0 -1
- package/dist/client/components/fields/time-field.d.mts +0 -20
- package/dist/client/components/fields/time-field.d.mts.map +0 -1
- package/dist/client/components/fields/time-field.mjs.map +0 -1
- package/dist/client/components/fields/upload-field.d.mts +0 -97
- package/dist/client/components/fields/upload-field.d.mts.map +0 -1
- package/dist/client/components/fields/upload-field.mjs.map +0 -1
- package/dist/client/components/filter-builder/columns-tab.d.mts +0 -1
- package/dist/client/components/filter-builder/columns-tab.mjs.map +0 -1
- package/dist/client/components/filter-builder/filter-builder-sheet.d.mts +0 -1
- package/dist/client/components/filter-builder/filter-builder-sheet.mjs.map +0 -1
- package/dist/client/components/filter-builder/filters-tab.d.mts +0 -1
- package/dist/client/components/filter-builder/filters-tab.mjs.map +0 -1
- package/dist/client/components/filter-builder/index.d.mts +0 -5
- package/dist/client/components/filter-builder/saved-views-tab.d.mts +0 -1
- package/dist/client/components/filter-builder/saved-views-tab.mjs.map +0 -1
- package/dist/client/components/index.d.mts +0 -80
- package/dist/client/components/locale-switcher.d.mts +0 -2
- package/dist/client/components/locale-switcher.mjs.map +0 -1
- package/dist/client/components/media/media-grid.mjs.map +0 -1
- package/dist/client/components/media/media-picker-dialog.mjs.map +0 -1
- package/dist/client/components/preview/live-preview-mode.mjs.map +0 -1
- package/dist/client/components/preview/preview-pane.mjs.map +0 -1
- package/dist/client/components/primitives/asset-preview.mjs.map +0 -1
- package/dist/client/components/primitives/checkbox-input.mjs.map +0 -1
- package/dist/client/components/primitives/date-input.mjs.map +0 -1
- package/dist/client/components/primitives/dropzone.mjs.map +0 -1
- package/dist/client/components/primitives/number-input.mjs.map +0 -1
- package/dist/client/components/primitives/select-multi.mjs.map +0 -1
- package/dist/client/components/primitives/select-single.mjs.map +0 -1
- package/dist/client/components/primitives/text-input.mjs.map +0 -1
- package/dist/client/components/primitives/textarea-input.mjs.map +0 -1
- package/dist/client/components/primitives/time-input.mjs.map +0 -1
- package/dist/client/components/primitives/toggle-input.mjs.map +0 -1
- package/dist/client/components/primitives/types.d.mts +0 -14
- package/dist/client/components/primitives/types.d.mts.map +0 -1
- package/dist/client/components/primitives/types.mjs.map +0 -1
- package/dist/client/components/sheets/index.d.mts +0 -1
- package/dist/client/components/sheets/resource-sheet.d.mts +0 -1
- package/dist/client/components/sheets/resource-sheet.mjs.map +0 -1
- package/dist/client/components/ui/accordion.d.mts +0 -2
- package/dist/client/components/ui/accordion.mjs.map +0 -1
- package/dist/client/components/ui/alert.mjs.map +0 -1
- package/dist/client/components/ui/avatar.d.mts +0 -3
- package/dist/client/components/ui/badge.d.mts +0 -3
- package/dist/client/components/ui/badge.mjs.map +0 -1
- package/dist/client/components/ui/button.d.mts +0 -3
- package/dist/client/components/ui/button.mjs.map +0 -1
- package/dist/client/components/ui/card.d.mts +0 -2
- package/dist/client/components/ui/card.mjs.map +0 -1
- package/dist/client/components/ui/checkbox.d.mts +0 -2
- package/dist/client/components/ui/checkbox.mjs.map +0 -1
- package/dist/client/components/ui/combobox.d.mts +0 -3
- package/dist/client/components/ui/command.mjs.map +0 -1
- package/dist/client/components/ui/dialog.d.mts +0 -3
- package/dist/client/components/ui/dialog.mjs.map +0 -1
- package/dist/client/components/ui/drawer.mjs.map +0 -1
- package/dist/client/components/ui/dropdown-menu.d.mts +0 -3
- package/dist/client/components/ui/dropdown-menu.mjs.map +0 -1
- package/dist/client/components/ui/empty-state.mjs.map +0 -1
- package/dist/client/components/ui/field.d.mts +0 -3
- package/dist/client/components/ui/field.mjs.map +0 -1
- package/dist/client/components/ui/input-group.d.mts +0 -4
- package/dist/client/components/ui/input-group.mjs.map +0 -1
- package/dist/client/components/ui/input.d.mts +0 -2
- package/dist/client/components/ui/input.mjs.map +0 -1
- package/dist/client/components/ui/kbd.mjs.map +0 -1
- package/dist/client/components/ui/label.d.mts +0 -2
- package/dist/client/components/ui/label.mjs.map +0 -1
- package/dist/client/components/ui/popover.d.mts +0 -3
- package/dist/client/components/ui/popover.mjs.map +0 -1
- package/dist/client/components/ui/responsive-dialog.mjs.map +0 -1
- package/dist/client/components/ui/scroll-area.d.mts +0 -2
- package/dist/client/components/ui/search-input.mjs.map +0 -1
- package/dist/client/components/ui/select.d.mts +0 -3
- package/dist/client/components/ui/select.mjs.map +0 -1
- package/dist/client/components/ui/separator.d.mts +0 -2
- package/dist/client/components/ui/separator.mjs.map +0 -1
- package/dist/client/components/ui/sheet.d.mts +0 -3
- package/dist/client/components/ui/sheet.mjs.map +0 -1
- package/dist/client/components/ui/sidebar.d.mts +0 -8
- package/dist/client/components/ui/sidebar.mjs.map +0 -1
- package/dist/client/components/ui/skeleton.d.mts +0 -1
- package/dist/client/components/ui/skeleton.mjs.map +0 -1
- package/dist/client/components/ui/sonner.d.mts.map +0 -1
- package/dist/client/components/ui/sonner.mjs.map +0 -1
- package/dist/client/components/ui/spinner.d.mts +0 -1
- package/dist/client/components/ui/spinner.mjs.map +0 -1
- package/dist/client/components/ui/switch.d.mts +0 -2
- package/dist/client/components/ui/switch.mjs.map +0 -1
- package/dist/client/components/ui/table.d.mts +0 -2
- package/dist/client/components/ui/table.mjs.map +0 -1
- package/dist/client/components/ui/tabs.d.mts +0 -3
- package/dist/client/components/ui/tabs.mjs.map +0 -1
- package/dist/client/components/ui/textarea.d.mts +0 -2
- package/dist/client/components/ui/textarea.mjs.map +0 -1
- package/dist/client/components/ui/toolbar.mjs.map +0 -1
- package/dist/client/components/ui/tooltip.d.mts +0 -2
- package/dist/client/components/ui/tooltip.mjs.map +0 -1
- package/dist/client/components/widgets/chart-widget.d.mts +0 -57
- package/dist/client/components/widgets/chart-widget.d.mts.map +0 -1
- package/dist/client/components/widgets/chart-widget.mjs.map +0 -1
- package/dist/client/components/widgets/progress-widget.d.mts +0 -41
- package/dist/client/components/widgets/progress-widget.d.mts.map +0 -1
- package/dist/client/components/widgets/progress-widget.mjs.map +0 -1
- package/dist/client/components/widgets/quick-actions-widget.d.mts +0 -29
- package/dist/client/components/widgets/quick-actions-widget.d.mts.map +0 -1
- package/dist/client/components/widgets/quick-actions-widget.mjs.map +0 -1
- package/dist/client/components/widgets/recent-items-widget.d.mts +0 -51
- package/dist/client/components/widgets/recent-items-widget.d.mts.map +0 -1
- package/dist/client/components/widgets/recent-items-widget.mjs.map +0 -1
- package/dist/client/components/widgets/stats-widget.d.mts +0 -55
- package/dist/client/components/widgets/stats-widget.d.mts.map +0 -1
- package/dist/client/components/widgets/stats-widget.mjs.map +0 -1
- package/dist/client/components/widgets/table-widget.d.mts +0 -31
- package/dist/client/components/widgets/table-widget.d.mts.map +0 -1
- package/dist/client/components/widgets/table-widget.mjs.map +0 -1
- package/dist/client/components/widgets/timeline-widget.d.mts +0 -51
- package/dist/client/components/widgets/timeline-widget.d.mts.map +0 -1
- package/dist/client/components/widgets/timeline-widget.mjs.map +0 -1
- package/dist/client/components/widgets/value-widget.d.mts +0 -39
- package/dist/client/components/widgets/value-widget.d.mts.map +0 -1
- package/dist/client/components/widgets/value-widget.mjs.map +0 -1
- package/dist/client/components/widgets/widget-skeletons.mjs.map +0 -1
- package/dist/client/context/focus-context.d.mts.map +0 -1
- package/dist/client/context/focus-context.mjs.map +0 -1
- package/dist/client/contexts/breadcrumb-context.mjs.map +0 -1
- package/dist/client/hooks/typed-hooks.d.mts.map +0 -1
- package/dist/client/hooks/typed-hooks.mjs.map +0 -1
- package/dist/client/hooks/use-action.mjs.map +0 -1
- package/dist/client/hooks/use-admin-config.mjs.map +0 -1
- package/dist/client/hooks/use-admin-preferences.mjs.map +0 -1
- package/dist/client/hooks/use-admin-routes.mjs.map +0 -1
- package/dist/client/hooks/use-auth.d.mts.map +0 -1
- package/dist/client/hooks/use-auth.mjs.map +0 -1
- package/dist/client/hooks/use-collection-fields.mjs.map +0 -1
- package/dist/client/hooks/use-collection-meta.mjs.map +0 -1
- package/dist/client/hooks/use-collection-schema.mjs.map +0 -1
- package/dist/client/hooks/use-collection-validation.mjs.map +0 -1
- package/dist/client/hooks/use-collection.d.mts.map +0 -1
- package/dist/client/hooks/use-collection.mjs.map +0 -1
- package/dist/client/hooks/use-current-user.d.mts.map +0 -1
- package/dist/client/hooks/use-current-user.mjs.map +0 -1
- package/dist/client/hooks/use-field-hooks.mjs.map +0 -1
- package/dist/client/hooks/use-field-options.d.mts.map +0 -1
- package/dist/client/hooks/use-field-options.mjs.map +0 -1
- package/dist/client/hooks/use-global-fields.mjs.map +0 -1
- package/dist/client/hooks/use-global-meta.mjs.map +0 -1
- package/dist/client/hooks/use-global-schema.mjs.map +0 -1
- package/dist/client/hooks/use-global.d.mts.map +0 -1
- package/dist/client/hooks/use-global.mjs.map +0 -1
- package/dist/client/hooks/use-locks.mjs.map +0 -1
- package/dist/client/hooks/use-media-query.d.mts.map +0 -1
- package/dist/client/hooks/use-media-query.mjs.map +0 -1
- package/dist/client/hooks/use-prefill-params.mjs.map +0 -1
- package/dist/client/hooks/use-questpie-query-options.mjs.map +0 -1
- package/dist/client/hooks/use-reactive-fields.d.mts.map +0 -1
- package/dist/client/hooks/use-reactive-fields.mjs.map +0 -1
- package/dist/client/hooks/use-realtime-highlight.mjs.map +0 -1
- package/dist/client/hooks/use-saved-views.mjs.map +0 -1
- package/dist/client/hooks/use-search.mjs.map +0 -1
- package/dist/client/hooks/use-server-validation.mjs.map +0 -1
- package/dist/client/hooks/use-server-widget-data.d.mts.map +0 -1
- package/dist/client/hooks/use-server-widget-data.mjs.map +0 -1
- package/dist/client/hooks/use-setup-status.d.mts.map +0 -1
- package/dist/client/hooks/use-setup-status.mjs.map +0 -1
- package/dist/client/hooks/use-upload-collection.mjs.map +0 -1
- package/dist/client/hooks/use-upload.d.mts +0 -23
- package/dist/client/hooks/use-upload.d.mts.map +0 -1
- package/dist/client/hooks/use-upload.mjs.map +0 -1
- package/dist/client/hooks/use-validation-error-map.mjs.map +0 -1
- package/dist/client/hooks/use-view-state.mjs.map +0 -1
- package/dist/client/i18n/hooks.mjs.map +0 -1
- package/dist/client/i18n/intl-cache.mjs.map +0 -1
- package/dist/client/i18n/messages.mjs.map +0 -1
- package/dist/client/i18n/simple.d.mts.map +0 -1
- package/dist/client/i18n/simple.mjs.map +0 -1
- package/dist/client/i18n/types.d.mts.map +0 -1
- package/dist/client/lib/utils.d.mts +0 -1
- package/dist/client/lib/utils.mjs.map +0 -1
- package/dist/client/preview/block-scope-context.d.mts.map +0 -1
- package/dist/client/preview/block-scope-context.mjs.map +0 -1
- package/dist/client/preview/preview-banner.d.mts.map +0 -1
- package/dist/client/preview/preview-banner.mjs.map +0 -1
- package/dist/client/preview/preview-field.d.mts.map +0 -1
- package/dist/client/preview/preview-field.mjs.map +0 -1
- package/dist/client/preview/types.d.mts.map +0 -1
- package/dist/client/preview/types.mjs.map +0 -1
- package/dist/client/preview/use-collection-preview.d.mts.map +0 -1
- package/dist/client/preview/use-collection-preview.mjs.map +0 -1
- package/dist/client/runtime/content-locales-provider.mjs.map +0 -1
- package/dist/client/runtime/locale-scope.mjs.map +0 -1
- package/dist/client/runtime/provider.d.mts.map +0 -1
- package/dist/client/runtime/provider.mjs.map +0 -1
- package/dist/client/runtime/routes.d.mts.map +0 -1
- package/dist/client/runtime/routes.mjs.map +0 -1
- package/dist/client/runtime/translations-provider.d.mts +0 -2
- package/dist/client/runtime/translations-provider.mjs.map +0 -1
- package/dist/client/scope/picker.d.mts.map +0 -1
- package/dist/client/scope/picker.mjs.map +0 -1
- package/dist/client/scope/provider.d.mts.map +0 -1
- package/dist/client/scope/provider.mjs.map +0 -1
- package/dist/client/scope/types.d.mts.map +0 -1
- package/dist/client/utils/auto-expand-fields.mjs.map +0 -1
- package/dist/client/utils/build-field-definitions-from-schema.mjs.map +0 -1
- package/dist/client/utils/detect-relations.mjs.map +0 -1
- package/dist/client/utils/locale-to-flag.d.mts.map +0 -1
- package/dist/client/utils/locale-to-flag.mjs.map +0 -1
- package/dist/client/utils/routes.mjs.map +0 -1
- package/dist/client/views/auth/accept-invite-form.d.mts.map +0 -1
- package/dist/client/views/auth/accept-invite-form.mjs.map +0 -1
- package/dist/client/views/auth/auth-layout.d.mts.map +0 -1
- package/dist/client/views/auth/auth-layout.mjs.map +0 -1
- package/dist/client/views/auth/forgot-password-form.d.mts.map +0 -1
- package/dist/client/views/auth/forgot-password-form.mjs.map +0 -1
- package/dist/client/views/auth/index.d.mts +0 -7
- package/dist/client/views/auth/invite-form.d.mts +0 -1
- package/dist/client/views/auth/invite-form.mjs.map +0 -1
- package/dist/client/views/auth/login-form.d.mts.map +0 -1
- package/dist/client/views/auth/login-form.mjs.map +0 -1
- package/dist/client/views/auth/reset-password-form.d.mts.map +0 -1
- package/dist/client/views/auth/reset-password-form.mjs.map +0 -1
- package/dist/client/views/auth/setup-form.d.mts.map +0 -1
- package/dist/client/views/auth/setup-form.mjs.map +0 -1
- package/dist/client/views/collection/auto-form-fields.d.mts +0 -4
- package/dist/client/views/collection/auto-form-fields.mjs.map +0 -1
- package/dist/client/views/collection/bulk-action-toolbar.mjs.map +0 -1
- package/dist/client/views/collection/cells/complex-cells.d.mts +0 -46
- package/dist/client/views/collection/cells/complex-cells.d.mts.map +0 -1
- package/dist/client/views/collection/cells/complex-cells.mjs.map +0 -1
- package/dist/client/views/collection/cells/index.d.mts +0 -7
- package/dist/client/views/collection/cells/primitive-cells.d.mts +0 -76
- package/dist/client/views/collection/cells/primitive-cells.d.mts.map +0 -1
- package/dist/client/views/collection/cells/primitive-cells.mjs.map +0 -1
- package/dist/client/views/collection/cells/relation-cells.d.mts +0 -21
- package/dist/client/views/collection/cells/relation-cells.d.mts.map +0 -1
- package/dist/client/views/collection/cells/relation-cells.mjs.map +0 -1
- package/dist/client/views/collection/cells/shared/asset-thumbnail.d.mts +0 -1
- package/dist/client/views/collection/cells/shared/asset-thumbnail.mjs.map +0 -1
- package/dist/client/views/collection/cells/shared/cell-helpers.d.mts +0 -2
- package/dist/client/views/collection/cells/shared/cell-helpers.mjs.map +0 -1
- package/dist/client/views/collection/cells/shared/relation-chip.d.mts +0 -1
- package/dist/client/views/collection/cells/shared/relation-chip.mjs.map +0 -1
- package/dist/client/views/collection/cells/upload-cells.d.mts +0 -25
- package/dist/client/views/collection/cells/upload-cells.d.mts.map +0 -1
- package/dist/client/views/collection/cells/upload-cells.mjs.map +0 -1
- package/dist/client/views/collection/columns/build-columns.d.mts +0 -2
- package/dist/client/views/collection/columns/build-columns.mjs.map +0 -1
- package/dist/client/views/collection/columns/column-defaults.d.mts +0 -2
- package/dist/client/views/collection/columns/column-defaults.mjs.map +0 -1
- package/dist/client/views/collection/columns/index.d.mts +0 -3
- package/dist/client/views/collection/columns/types.d.mts +0 -2
- package/dist/client/views/collection/field-context.mjs.map +0 -1
- package/dist/client/views/collection/field-renderer.mjs.map +0 -1
- package/dist/client/views/collection/form-view.d.mts +0 -112
- package/dist/client/views/collection/form-view.d.mts.map +0 -1
- package/dist/client/views/collection/form-view.mjs.map +0 -1
- package/dist/client/views/collection/index.d.mts +0 -9
- package/dist/client/views/collection/table-view.d.mts +0 -102
- package/dist/client/views/collection/table-view.d.mts.map +0 -1
- package/dist/client/views/collection/table-view.mjs.map +0 -1
- package/dist/client/views/collection/view-skeletons.mjs.map +0 -1
- package/dist/client/views/common/global-search.d.mts +0 -1
- package/dist/client/views/common/global-search.mjs.map +0 -1
- package/dist/client/views/common/index.d.mts +0 -1
- package/dist/client/views/dashboard/dashboard-grid.mjs.map +0 -1
- package/dist/client/views/dashboard/dashboard-widget.mjs.map +0 -1
- package/dist/client/views/dashboard/widget-card.mjs.map +0 -1
- package/dist/client/views/globals/global-form-view.d.mts +0 -74
- package/dist/client/views/globals/global-form-view.d.mts.map +0 -1
- package/dist/client/views/globals/global-form-view.mjs.map +0 -1
- package/dist/client/views/index.d.mts +0 -28
- package/dist/client/views/layout/admin-layout-provider.d.mts.map +0 -1
- package/dist/client/views/layout/admin-layout-provider.mjs.map +0 -1
- package/dist/client/views/layout/admin-layout.d.mts.map +0 -1
- package/dist/client/views/layout/admin-layout.mjs.map +0 -1
- package/dist/client/views/layout/admin-root.d.mts +0 -7
- package/dist/client/views/layout/admin-router.d.mts.map +0 -1
- package/dist/client/views/layout/admin-router.mjs.map +0 -1
- package/dist/client/views/layout/admin-sidebar.d.mts.map +0 -1
- package/dist/client/views/layout/admin-sidebar.mjs.map +0 -1
- package/dist/client/views/layout/admin-topbar.mjs.map +0 -1
- package/dist/client/views/layout/index.d.mts +0 -5
- package/dist/client/views/pages/accept-invite-page.d.mts.map +0 -1
- package/dist/client/views/pages/accept-invite-page.mjs.map +0 -1
- package/dist/client/views/pages/dashboard-page.d.mts.map +0 -1
- package/dist/client/views/pages/dashboard-page.mjs.map +0 -1
- package/dist/client/views/pages/forgot-password-page.d.mts.map +0 -1
- package/dist/client/views/pages/forgot-password-page.mjs.map +0 -1
- package/dist/client/views/pages/index.d.mts +0 -7
- package/dist/client/views/pages/invite-page.d.mts.map +0 -1
- package/dist/client/views/pages/invite-page.mjs.map +0 -1
- package/dist/client/views/pages/login-page.d.mts.map +0 -1
- package/dist/client/views/pages/login-page.mjs.map +0 -1
- package/dist/client/views/pages/reset-password-page.d.mts.map +0 -1
- package/dist/client/views/pages/reset-password-page.mjs.map +0 -1
- package/dist/client/views/pages/setup-page.d.mts.map +0 -1
- package/dist/client/views/pages/setup-page.mjs.map +0 -1
- package/dist/client.d.mts.map +0 -1
- package/dist/components/rich-text/rich-text-renderer.d.mts.map +0 -1
- package/dist/components/rich-text/rich-text-renderer.mjs.map +0 -1
- package/dist/server/adapters/nextjs.d.mts.map +0 -1
- package/dist/server/adapters/nextjs.mjs.map +0 -1
- package/dist/server/adapters/tanstack.d.mts.map +0 -1
- package/dist/server/adapters/tanstack.mjs.map +0 -1
- package/dist/server/augmentation.d.mts.map +0 -1
- package/dist/server/auth-helpers.d.mts.map +0 -1
- package/dist/server/auth-helpers.mjs.map +0 -1
- package/dist/server/block/block-builder.d.mts.map +0 -1
- package/dist/server/block/block-builder.mjs.map +0 -1
- package/dist/server/block/introspection.d.mts.map +0 -1
- package/dist/server/block/introspection.mjs.map +0 -1
- package/dist/server/block/prefetch.d.mts.map +0 -1
- package/dist/server/block/prefetch.mjs.map +0 -1
- package/dist/server/fields/blocks.d.mts.map +0 -1
- package/dist/server/fields/blocks.mjs.map +0 -1
- package/dist/server/fields/index.d.mts.map +0 -1
- package/dist/server/fields/index.mjs.map +0 -1
- package/dist/server/fields/rich-text.d.mts.map +0 -1
- package/dist/server/fields/rich-text.mjs.map +0 -1
- package/dist/server/i18n/index.d.mts +0 -16
- package/dist/server/i18n/index.d.mts.map +0 -1
- package/dist/server/i18n/index.mjs.map +0 -1
- package/dist/server/i18n/messages/cs.mjs.map +0 -1
- package/dist/server/i18n/messages/de.mjs.map +0 -1
- package/dist/server/i18n/messages/en.mjs.map +0 -1
- package/dist/server/i18n/messages/es.mjs.map +0 -1
- package/dist/server/i18n/messages/fr.mjs.map +0 -1
- package/dist/server/i18n/messages/index.mjs.map +0 -1
- package/dist/server/i18n/messages/pl.mjs.map +0 -1
- package/dist/server/i18n/messages/pt.mjs.map +0 -1
- package/dist/server/i18n/messages/sk.mjs.map +0 -1
- package/dist/server/index.d.mts +0 -20
- package/dist/server/modules/admin/functions/admin-config.mjs +0 -348
- package/dist/server/modules/admin/functions/admin-config.mjs.map +0 -1
- package/dist/server/modules/admin/functions/execute-action.d.mts.map +0 -1
- package/dist/server/modules/admin/functions/execute-action.mjs.map +0 -1
- package/dist/server/modules/admin/functions/locales.mjs +0 -80
- package/dist/server/modules/admin/functions/locales.mjs.map +0 -1
- package/dist/server/modules/admin/functions/preview.d.mts.map +0 -1
- package/dist/server/modules/admin/functions/preview.mjs.map +0 -1
- package/dist/server/modules/admin/functions/reactive.d.mts.map +0 -1
- package/dist/server/modules/admin/functions/reactive.mjs.map +0 -1
- package/dist/server/modules/admin/functions/setup.d.mts.map +0 -1
- package/dist/server/modules/admin/functions/setup.mjs +0 -131
- package/dist/server/modules/admin/functions/setup.mjs.map +0 -1
- package/dist/server/modules/admin/functions/translations.mjs +0 -125
- package/dist/server/modules/admin/functions/translations.mjs.map +0 -1
- package/dist/server/modules/admin/functions/widget-data.d.mts +0 -33
- package/dist/server/modules/admin/functions/widget-data.d.mts.map +0 -1
- package/dist/server/modules/admin/functions/widget-data.mjs +0 -70
- package/dist/server/modules/admin/functions/widget-data.mjs.map +0 -1
- package/dist/server/modules/admin/index.d.mts.map +0 -1
- package/dist/server/modules/admin/index.mjs.map +0 -1
- package/dist/server/modules/admin-preferences/collections/admin-preferences.collection.d.mts +0 -3
- package/dist/server/modules/admin-preferences/collections/admin-preferences.collection.mjs.map +0 -1
- package/dist/server/modules/admin-preferences/collections/locks.collection.d.mts +0 -3
- package/dist/server/modules/admin-preferences/collections/locks.collection.mjs.map +0 -1
- package/dist/server/modules/admin-preferences/collections/saved-views.collection.d.mts +0 -1490
- package/dist/server/modules/admin-preferences/collections/saved-views.collection.d.mts.map +0 -1
- package/dist/server/modules/admin-preferences/collections/saved-views.collection.mjs +0 -57
- package/dist/server/modules/admin-preferences/collections/saved-views.collection.mjs.map +0 -1
- package/dist/server/patch.d.mts +0 -100
- package/dist/server/patch.d.mts.map +0 -1
- package/dist/server/patch.mjs +0 -1062
- package/dist/server/patch.mjs.map +0 -1
- package/dist/shared/preview-utils.d.mts.map +0 -1
- package/dist/shared/preview-utils.mjs.map +0 -1
- package/dist/shared/types/saved-views.types.d.mts.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"action-dialog.mjs","names":["errors: FieldErrors","React","ctx: ActionContext<TItem>"],"sources":["../../../../src/client/components/actions/action-dialog.tsx"],"sourcesContent":["/**\n * Action Dialog\n *\n * Renders dialog-type and form-type actions.\n * Supports lazy-loaded components and inline form definitions.\n * Form actions use AutoFormFields for full field system support.\n */\n\n\"use client\";\n\nimport { Icon } from \"@iconify/react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport * as React from \"react\";\nimport {\n type FieldErrors,\n FormProvider,\n type Resolver,\n useForm,\n} from \"react-hook-form\";\nimport { toast } from \"sonner\";\nimport type {\n ActionContext,\n ActionDefinition,\n ActionHelpers,\n DialogHandler,\n FormHandler,\n} from \"../../builder/types/action-types\";\nimport type { FieldDefinition } from \"../../builder/field/field\";\nimport { buildValidationSchema } from \"../../builder/validation\";\nimport { useResolveText, useTranslation } from \"../../i18n/hooks\";\nimport { selectAdmin, useAdminStore } from \"../../runtime/provider\";\nimport { AutoFormFields } from \"../../views/collection/auto-form-fields\";\nimport { Button } from \"../ui/button\";\nimport {\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n} from \"../ui/responsive-dialog\";\n\nexport interface ActionDialogProps<TItem = any> {\n /** Whether the dialog is open */\n open: boolean;\n /** Callback when dialog should close */\n onOpenChange: (open: boolean) => void;\n /** The action being rendered */\n action: ActionDefinition<TItem>;\n /** Collection name */\n collection: string;\n /** Item for row actions */\n item?: TItem;\n /** Items for bulk actions */\n items?: TItem[];\n /** Action helpers */\n helpers: ActionHelpers;\n}\n\n/**\n * Create a custom resolver for action form validation\n * Uses buildValidationSchema and handles Zod v4 compatibility\n */\nfunction createActionFormResolver(\n fields: Record<string, FieldDefinition>,\n registry: Record<string, FieldDefinition>,\n): Resolver<Record<string, any>> {\n const schema = buildValidationSchema(fields, registry);\n\n return async (values) => {\n const result = schema.safeParse(values);\n\n if (result.success) {\n return {\n values: result.data,\n errors: {},\n };\n }\n\n const errors: FieldErrors = {};\n for (const issue of result.error.issues) {\n const path = issue.path.join(\".\");\n if (path && !errors[path]) {\n errors[path] = {\n type: issue.code,\n message: issue.message,\n };\n }\n }\n\n return {\n values: {},\n errors,\n };\n };\n}\n\n/**\n * Form Dialog content - renders form fields using AutoFormFields\n *\n * Uses buildValidationSchema for automatic Zod schema generation\n * from field definitions, providing full field system support.\n */\nfunction FormDialogContent<TItem>({\n action,\n ctx,\n onClose,\n}: {\n action: ActionDefinition<TItem>;\n ctx: ActionContext<TItem>;\n onClose: () => void;\n}) {\n const handler = action.handler as FormHandler<TItem>;\n const { config } = handler;\n const resolveText = useResolveText();\n const { t } = useTranslation();\n const admin = useAdminStore(selectAdmin);\n\n // Create resolver from field definitions\n const resolver = React.useMemo(() => {\n if (!admin) return undefined;\n return createActionFormResolver(config.fields, admin.getFields());\n }, [admin, config.fields]);\n\n const form = useForm({\n defaultValues: config.defaultValues || {},\n resolver,\n });\n\n const [isSubmitting, setIsSubmitting] = React.useState(false);\n\n const handleSubmit = form.handleSubmit(async (data) => {\n setIsSubmitting(true);\n\n const submitPromise = async () => {\n await config.onSubmit(data, ctx);\n return data;\n };\n\n toast.promise(submitPromise(), {\n loading: t(\"toast.processing\"),\n success: () => {\n onClose();\n return t(\"toast.actionSuccess\");\n },\n error: (error) => {\n return error instanceof Error ? error.message : t(\"toast.actionFailed\");\n },\n finally: () => {\n setIsSubmitting(false);\n },\n });\n });\n\n // Build collection config for AutoFormFields\n const collectionConfig = React.useMemo(\n () => ({\n fields: config.fields,\n }),\n [config.fields],\n );\n\n return (\n <FormProvider {...form}>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>\n {resolveText(config.title)}\n </ResponsiveDialogTitle>\n {config.description && (\n <ResponsiveDialogDescription>\n {resolveText(config.description)}\n </ResponsiveDialogDescription>\n )}\n </ResponsiveDialogHeader>\n\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <AutoFormFields collection=\"__action__\" config={collectionConfig} />\n\n <ResponsiveDialogFooter className=\"mt-6\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={onClose}\n disabled={isSubmitting}\n >\n {resolveText(config.cancelLabel, t(\"common.cancel\"))}\n </Button>\n <Button type=\"submit\" disabled={isSubmitting}>\n {isSubmitting\n ? t(\"common.loading\")\n : resolveText(config.submitLabel, t(\"common.submit\"))}\n </Button>\n </ResponsiveDialogFooter>\n </form>\n </FormProvider>\n );\n}\n\n/**\n * Custom Dialog content - renders lazy-loaded component\n */\nfunction CustomDialogContent<TItem>({\n action,\n ctx,\n onClose,\n}: {\n action: ActionDefinition<TItem>;\n ctx: ActionContext<TItem>;\n onClose: () => void;\n}) {\n const handler = action.handler as DialogHandler<TItem>;\n const [Component, setComponent] =\n React.useState<React.ComponentType<any> | null>(null);\n const [loading, setLoading] = React.useState(true);\n const [error, setError] = React.useState<Error | null>(null);\n\n React.useEffect(() => {\n let mounted = true;\n\n async function loadComponent() {\n try {\n const comp = handler.component;\n\n // Handle lazy-loaded components\n if (typeof comp === \"function\") {\n // Check if it's a React.lazy component by looking for _payload\n const lazyComp = comp as any;\n if (lazyComp._payload !== undefined) {\n // It's a lazy component, resolve it\n const resolved = await lazyComp._payload();\n if (mounted) {\n setComponent(() => resolved.default || resolved);\n }\n } else {\n // It's a direct component function or import\n const result = (comp as () => any)();\n if (result?.then) {\n const mod = await result;\n if (mounted) {\n setComponent(() => mod.default || mod);\n }\n } else {\n // Direct component\n if (mounted) {\n setComponent(() => comp as React.ComponentType<any>);\n }\n }\n }\n } else {\n // Direct component\n if (mounted) {\n setComponent(() => comp as React.ComponentType<any>);\n }\n }\n } catch (err) {\n if (mounted) {\n setError(err instanceof Error ? err : new Error(\"Failed to load\"));\n }\n } finally {\n if (mounted) {\n setLoading(false);\n }\n }\n }\n\n loadComponent();\n return () => {\n mounted = false;\n };\n }, [handler.component]);\n\n if (loading) {\n return (\n <div className=\"flex h-32 items-center justify-center\">\n <Icon\n icon=\"ph:spinner-gap\"\n className=\"size-6 animate-spin text-muted-foreground\"\n />\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"p-4 text-center\">\n <p className=\"text-destructive\">{error.message}</p>\n <Button variant=\"outline\" onClick={onClose} className=\"mt-4\">\n Close\n </Button>\n </div>\n );\n }\n\n if (!Component) {\n return (\n <div className=\"p-4 text-center\">\n <p className=\"text-muted-foreground\">Component not found</p>\n <Button variant=\"outline\" onClick={onClose} className=\"mt-4\">\n Close\n </Button>\n </div>\n );\n }\n\n return (\n <Component\n item={ctx.item}\n items={ctx.items}\n collection={ctx.collection}\n onClose={onClose}\n onSuccess={() => {\n ctx.helpers.refresh();\n onClose();\n }}\n />\n );\n}\n\n/**\n * ActionDialog - Renders dialog-type and form-type actions\n *\n * @example\n * ```tsx\n * <ActionDialog\n * open={!!activeAction}\n * onOpenChange={(open) => !open && setActiveAction(null)}\n * action={activeAction}\n * collection=\"users\"\n * item={selectedUser}\n * helpers={actionHelpers}\n * />\n * ```\n */\nexport function ActionDialog<TItem = any>({\n open,\n onOpenChange,\n action,\n collection,\n item,\n items,\n helpers,\n}: ActionDialogProps<TItem>): React.ReactElement | null {\n const queryClient = useQueryClient();\n\n // Build action context\n const ctx: ActionContext<TItem> = React.useMemo(\n () => ({\n item,\n items,\n collection,\n helpers: {\n ...helpers,\n closeDialog: () => onOpenChange(false),\n },\n queryClient: {\n invalidateQueries: (filters) => queryClient.invalidateQueries(filters),\n resetQueries: (filters) => queryClient.resetQueries(filters),\n refetchQueries: (filters) => queryClient.refetchQueries(filters),\n },\n }),\n [item, items, collection, helpers, onOpenChange, queryClient],\n );\n\n const handleClose = () => onOpenChange(false);\n\n // Determine dialog size based on handler type and config\n const getDialogClassName = () => {\n if (action.handler.type === \"form\") {\n const width = (action.handler as FormHandler).config.width || \"md\";\n const widthMap = {\n sm: \"sm:max-w-sm\",\n md: \"sm:max-w-md\",\n lg: \"sm:max-w-lg\",\n xl: \"sm:max-w-xl\",\n };\n return widthMap[width];\n }\n if (action.handler.type === \"dialog\") {\n return \"sm:max-w-lg\";\n }\n return \"sm:max-w-md\";\n };\n\n return (\n <ResponsiveDialog open={open} onOpenChange={onOpenChange}>\n <ResponsiveDialogContent className={getDialogClassName()}>\n {action.handler.type === \"form\" && (\n <FormDialogContent action={action} ctx={ctx} onClose={handleClose} />\n )}\n {action.handler.type === \"dialog\" && (\n <CustomDialogContent\n action={action}\n ctx={ctx}\n onClose={handleClose}\n />\n )}\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"confirmation-dialog.mjs","names":["React"],"sources":["../../../../src/client/components/actions/confirmation-dialog.tsx"],"sourcesContent":["/**\n * Confirmation Dialog\n *\n * Reusable confirmation dialog for destructive or important actions.\n * Uses base-ui dialog primitives with responsive design.\n */\n\n\"use client\";\n\nimport { Icon } from \"@iconify/react\";\nimport * as React from \"react\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"../ui/dialog\";\nimport { Button } from \"../ui/button\";\nimport type { ConfirmationConfig } from \"../../builder/types/action-types\";\n\nexport interface ConfirmationDialogProps {\n /** Whether the dialog is open */\n open: boolean;\n /** Callback when dialog should close */\n onOpenChange: (open: boolean) => void;\n /** Confirmation configuration */\n config: ConfirmationConfig;\n /** Callback when user confirms */\n onConfirm: () => void | Promise<void>;\n /** Whether the action is currently loading */\n loading?: boolean;\n}\n\n/**\n * ConfirmationDialog - Prompts user to confirm an action\n *\n * @example\n * ```tsx\n * <ConfirmationDialog\n * open={showConfirm}\n * onOpenChange={setShowConfirm}\n * config={{\n * title: \"Delete item?\",\n * description: \"This action cannot be undone.\",\n * destructive: true,\n * }}\n * onConfirm={handleDelete}\n * />\n * ```\n */\nexport function ConfirmationDialog({\n open,\n onOpenChange,\n config,\n onConfirm,\n loading = false,\n}: ConfirmationDialogProps): React.ReactElement {\n const [isProcessing, setIsProcessing] = React.useState(false);\n\n const handleConfirm = async () => {\n setIsProcessing(true);\n try {\n await onConfirm();\n onOpenChange(false);\n } finally {\n setIsProcessing(false);\n }\n };\n\n const isLoading = loading || isProcessing;\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-[425px]\">\n <DialogHeader>\n <div className=\"flex items-start gap-3\">\n {config.destructive && (\n <div className=\"flex size-10 shrink-0 items-center justify-center rounded-full bg-destructive/10\">\n <Icon icon=\"ph:warning\" className=\"size-5 text-destructive\" />\n </div>\n )}\n <div className=\"space-y-1\">\n <DialogTitle>{config.title}</DialogTitle>\n {config.description && (\n <DialogDescription>{config.description}</DialogDescription>\n )}\n </div>\n </div>\n </DialogHeader>\n <DialogFooter className=\"mt-4\">\n <Button\n variant=\"outline\"\n onClick={() => onOpenChange(false)}\n disabled={isLoading}\n >\n {config.cancelLabel || \"Cancel\"}\n </Button>\n <Button\n variant={config.destructive ? \"destructive\" : \"default\"}\n onClick={handleConfirm}\n disabled={isLoading}\n >\n {isLoading ? \"Processing...\" : config.confirmLabel || \"Confirm\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoDA,SAAgB,mBAAmB,EACjC,MACA,cACA,QACA,WACA,UAAU,SACoC;CAC9C,MAAM,CAAC,cAAc,mBAAmBA,QAAM,SAAS,MAAM;CAE7D,MAAM,gBAAgB,YAAY;AAChC,kBAAgB,KAAK;AACrB,MAAI;AACF,SAAM,WAAW;AACjB,gBAAa,MAAM;YACX;AACR,mBAAgB,MAAM;;;CAI1B,MAAM,YAAY,WAAW;AAE7B,QACE,oBAAC;EAAa;EAAoB;YAChC,qBAAC;GAAc,WAAU;cACvB,oBAAC,0BACC,qBAAC;IAAI,WAAU;eACZ,OAAO,eACN,oBAAC;KAAI,WAAU;eACb,oBAAC;MAAK,MAAK;MAAa,WAAU;OAA4B;MAC1D,EAER,qBAAC;KAAI,WAAU;gBACb,oBAAC,yBAAa,OAAO,QAAoB,EACxC,OAAO,eACN,oBAAC,+BAAmB,OAAO,cAAgC;MAEzD;KACF,GACO,EACf,qBAAC;IAAa,WAAU;eACtB,oBAAC;KACC,SAAQ;KACR,eAAe,aAAa,MAAM;KAClC,UAAU;eAET,OAAO,eAAe;MAChB,EACT,oBAAC;KACC,SAAS,OAAO,cAAc,gBAAgB;KAC9C,SAAS;KACT,UAAU;eAET,YAAY,kBAAkB,OAAO,gBAAgB;MAC/C;KACI;IACD;GACT"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"header-actions.mjs","names":["actionQueryClient: ActionQueryClient","React","ctx: ActionContext<TItem>"],"sources":["../../../../src/client/components/actions/header-actions.tsx"],"sourcesContent":["/**\n * Header Actions\n *\n * Renders action buttons for the collection header area.\n * Primary actions are shown as buttons, secondary in a dropdown menu.\n */\n\n\"use client\";\n\nimport { Icon } from \"@iconify/react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport * as React from \"react\";\nimport type {\n ActionContext,\n ActionDefinition,\n ActionHelpers,\n ActionQueryClient,\n HeaderActionsConfig,\n} from \"../../builder/types/action-types\";\nimport { resolveIconElement } from \"../../components/component-renderer\";\nimport { useResolveText } from \"../../i18n/hooks\";\nimport { selectAuthClient, useAdminStore } from \"../../runtime/provider\";\nimport { Button } from \"../ui/button\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../ui/dropdown-menu\";\nimport { ActionButton } from \"./action-button\";\n\nexport interface HeaderActionsProps<TItem = any> {\n /** Header actions config with primary/secondary */\n actions: HeaderActionsConfig<TItem>;\n /** Collection name */\n collection: string;\n /** Action helpers */\n helpers: ActionHelpers;\n /** Callback when action dialog should open */\n onOpenDialog?: (action: ActionDefinition<TItem>) => void;\n}\n\n/**\n * HeaderActions - Renders action buttons in the header area\n *\n * Primary actions are shown as buttons.\n * Secondary actions are shown in a dropdown menu.\n *\n * @example\n * ```tsx\n * <HeaderActions\n * actions={{\n * primary: [createAction],\n * secondary: [exportAction, importAction],\n * }}\n * collection=\"posts\"\n * helpers={actionHelpers}\n * onOpenDialog={(action) => setDialogAction(action)}\n * />\n * ```\n */\nexport function HeaderActions<TItem = any>({\n actions,\n collection,\n helpers,\n onOpenDialog,\n}: HeaderActionsProps<TItem>): React.ReactElement | null {\n const resolveText = useResolveText();\n const authClient = useAdminStore(selectAuthClient);\n const queryClient = useQueryClient();\n\n // Wrapped query client for action context\n const actionQueryClient: ActionQueryClient = React.useMemo(\n () => ({\n invalidateQueries: (filters) => queryClient.invalidateQueries(filters),\n refetchQueries: (filters) => queryClient.refetchQueries(filters),\n resetQueries: (filters) => queryClient.resetQueries(filters),\n }),\n [queryClient],\n );\n\n // Build action context for visibility checks\n const ctx: ActionContext<TItem> = React.useMemo(\n () => ({\n collection,\n helpers,\n queryClient: actionQueryClient,\n authClient,\n }),\n [collection, helpers, actionQueryClient, authClient],\n );\n\n // Filter visible actions\n const filterVisible = React.useCallback(\n (actionList: ActionDefinition<TItem>[] | undefined) => {\n if (!actionList) return [];\n return actionList.filter((action) => {\n if (action.visible === undefined) return true;\n if (typeof action.visible === \"function\") {\n return action.visible(ctx);\n }\n return action.visible;\n });\n },\n [ctx],\n );\n\n const visiblePrimary = React.useMemo(\n () => filterVisible(actions.primary),\n [actions.primary, filterVisible],\n );\n\n const visibleSecondary = React.useMemo(\n () => filterVisible(actions.secondary),\n [actions.secondary, filterVisible],\n );\n\n // Group secondary actions by variant (destructive at the end)\n const regularSecondary = visibleSecondary.filter(\n (a) => a.variant !== \"destructive\",\n );\n const destructiveSecondary = visibleSecondary.filter(\n (a) => a.variant === \"destructive\",\n );\n\n if (visiblePrimary.length === 0 && visibleSecondary.length === 0) {\n return null;\n }\n\n return (\n <div className=\"flex items-center gap-2\">\n {/* Primary actions as buttons */}\n {visiblePrimary.map((action) => (\n <ActionButton\n key={action.id}\n action={action}\n collection={collection}\n helpers={helpers}\n onOpenDialog={onOpenDialog}\n />\n ))}\n\n {/* Secondary actions in dropdown */}\n {visibleSecondary.length > 0 && (\n <DropdownMenu>\n <DropdownMenuTrigger\n render={<Button variant=\"outline\" size=\"icon\" className=\"size-9\" />}\n >\n <Icon icon=\"ph:dots-three-vertical\" className=\"size-4\" />\n <span className=\"sr-only\">More actions</span>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {regularSecondary.map((action) => {\n const iconElement = resolveIconElement(action.icon, {\n className: \"mr-2 size-4\",\n });\n return (\n <DropdownMenuItem\n key={action.id}\n onClick={() => onOpenDialog?.(action)}\n >\n {iconElement}\n {resolveText(action.label)}\n </DropdownMenuItem>\n );\n })}\n\n {regularSecondary.length > 0 && destructiveSecondary.length > 0 && (\n <DropdownMenuSeparator />\n )}\n\n {destructiveSecondary.map((action) => {\n const iconElement = resolveIconElement(action.icon, {\n className: \"mr-2 size-4\",\n });\n return (\n <DropdownMenuItem\n key={action.id}\n variant=\"destructive\"\n onClick={() => onOpenDialog?.(action)}\n >\n {iconElement}\n {resolveText(action.label)}\n </DropdownMenuItem>\n );\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8DA,SAAgB,cAA2B,EACzC,SACA,YACA,SACA,gBACuD;CACvD,MAAM,cAAc,gBAAgB;CACpC,MAAM,aAAa,cAAc,iBAAiB;CAClD,MAAM,cAAc,gBAAgB;CAGpC,MAAMA,oBAAuCC,QAAM,eAC1C;EACL,oBAAoB,YAAY,YAAY,kBAAkB,QAAQ;EACtE,iBAAiB,YAAY,YAAY,eAAe,QAAQ;EAChE,eAAe,YAAY,YAAY,aAAa,QAAQ;EAC7D,GACD,CAAC,YAAY,CACd;CAGD,MAAMC,MAA4BD,QAAM,eAC/B;EACL;EACA;EACA,aAAa;EACb;EACD,GACD;EAAC;EAAY;EAAS;EAAmB;EAAW,CACrD;CAGD,MAAM,gBAAgBA,QAAM,aACzB,eAAsD;AACrD,MAAI,CAAC,WAAY,QAAO,EAAE;AAC1B,SAAO,WAAW,QAAQ,WAAW;AACnC,OAAI,OAAO,YAAY,OAAW,QAAO;AACzC,OAAI,OAAO,OAAO,YAAY,WAC5B,QAAO,OAAO,QAAQ,IAAI;AAE5B,UAAO,OAAO;IACd;IAEJ,CAAC,IAAI,CACN;CAED,MAAM,iBAAiBA,QAAM,cACrB,cAAc,QAAQ,QAAQ,EACpC,CAAC,QAAQ,SAAS,cAAc,CACjC;CAED,MAAM,mBAAmBA,QAAM,cACvB,cAAc,QAAQ,UAAU,EACtC,CAAC,QAAQ,WAAW,cAAc,CACnC;CAGD,MAAM,mBAAmB,iBAAiB,QACvC,MAAM,EAAE,YAAY,cACtB;CACD,MAAM,uBAAuB,iBAAiB,QAC3C,MAAM,EAAE,YAAY,cACtB;AAED,KAAI,eAAe,WAAW,KAAK,iBAAiB,WAAW,EAC7D,QAAO;AAGT,QACE,qBAAC;EAAI,WAAU;aAEZ,eAAe,KAAK,WACnB,oBAAC;GAES;GACI;GACH;GACK;KAJT,OAAO,GAKZ,CACF,EAGD,iBAAiB,SAAS,KACzB,qBAAC,2BACC,qBAAC;GACC,QAAQ,oBAAC;IAAO,SAAQ;IAAU,MAAK;IAAO,WAAU;KAAW;cAEnE,oBAAC;IAAK,MAAK;IAAyB,WAAU;KAAW,EACzD,oBAAC;IAAK,WAAU;cAAU;KAAmB;IACzB,EACtB,qBAAC;GAAoB,OAAM;;IACxB,iBAAiB,KAAK,WAAW;AAIhC,YACE,qBAAC;MAEC,eAAe,eAAe,OAAO;iBANrB,mBAAmB,OAAO,MAAM,EAClD,WAAW,eACZ,CAAC,EAOG,YAAY,OAAO,MAAM;QAJrB,OAAO,GAKK;MAErB;IAED,iBAAiB,SAAS,KAAK,qBAAqB,SAAS,KAC5D,oBAAC,0BAAwB;IAG1B,qBAAqB,KAAK,WAAW;AAIpC,YACE,qBAAC;MAEC,SAAQ;MACR,eAAe,eAAe,OAAO;iBAPrB,mBAAmB,OAAO,MAAM,EAClD,WAAW,eACZ,CAAC,EAQG,YAAY,OAAO,MAAM;QALrB,OAAO,GAMK;MAErB;;IACkB,IACT;GAEb"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"admin-link.d.mts","names":[],"sources":["../../../src/client/components/admin-link.tsx"],"sourcesContent":[],"mappings":";;;;;;;AAqBE,UADe,cACT,CAAA,aADqC,QACrC,CAAA,GAAA,CAAA,CAAA,SAD4D,IAC5D,CAAN,OAAA,CAAM,oBAAA,CAAqB,iBAArB,CAAA,EAAA,MAAA,CAAA,CAAA;EAMuB;EAAhB,EAAA,CAAA,EAAA,WAAA;EAMQ;EAAZ,UAAA,CAAA,EANI,eAMJ,CANoB,IAMpB,CAAA;EAQC;EArBwD,MAAA,CAAA,EAAA,MAAA,GAAA,QAAA,GAAA,MAAA;EAAI;EAoDxD,EAAA,CAAA,EAAA,MAAA;EAAuB;EACrC,MAAA,CAAA,EAxCS,WAwCT,CAxCqB,IAwCrB,CAAA;EACA;EACA,MAAA,CAAA,EAAA,MAAA;EACA;EACA,IAAA,CAAA,EAAA,MAAA;EACA;EACM,WAAA,CAAA,EAAA,OAAA;EACN;EACA,QAAA,EAxCU,OAAA,CAAM,SAwChB;;;;;;;;;;;;;;;;;;;;;;;;;;iBATc,uBAAuB;;;;;;;QAO/B;;;;;GAKL,eAAe,QAAK,mBAAA,CAAA,GAAA,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"admin-link.mjs","names":["React"],"sources":["../../../src/client/components/admin-link.tsx"],"sourcesContent":["/**\n * AdminLink Component\n *\n * A type-safe link component for navigating within the admin UI.\n * Automatically generates correct URLs based on collection, global, or page targets.\n */\n\nimport * as React from \"react\";\nimport type { Questpie } from \"questpie\";\nimport {\n useAdminRoutes,\n getAdminLinkHref,\n type AdminLinkProps as AdminLinkTargetProps,\n} from \"../hooks/use-admin-routes\";\nimport type { CollectionNames, GlobalNames } from \"../builder\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface AdminLinkProps<TApp extends Questpie<any>> extends Omit<\n React.AnchorHTMLAttributes<HTMLAnchorElement>,\n \"href\"\n> {\n /** Link to dashboard */\n to?: \"dashboard\";\n /** Link to collection */\n collection?: CollectionNames<TApp>;\n /** Collection action */\n action?: \"list\" | \"create\" | \"edit\";\n /** Item ID for edit action */\n id?: string;\n /** Link to global */\n global?: GlobalNames<TApp>;\n /** Link to custom page by ID */\n pageId?: string;\n /** Custom href (overrides other props) */\n href?: string;\n /** Whether to use the navigate function instead of native anchor */\n useNavigate?: boolean;\n /** Children */\n children: React.ReactNode;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Type-safe link component for admin navigation\n *\n * @example\n * ```tsx\n * // Link to dashboard\n * <AdminLink to=\"dashboard\">Dashboard</AdminLink>\n *\n * // Link to collection list\n * <AdminLink collection=\"posts\">View Posts</AdminLink>\n *\n * // Link to create new item\n * <AdminLink collection=\"posts\" action=\"create\">New Post</AdminLink>\n *\n * // Link to edit item\n * <AdminLink collection=\"posts\" action=\"edit\" id=\"123\">Edit Post</AdminLink>\n *\n * // Link to global\n * <AdminLink global=\"siteSettings\">Site Settings</AdminLink>\n *\n * // Link to custom page\n * <AdminLink pageId=\"analytics\">Analytics</AdminLink>\n * ```\n */\nexport function AdminLink<TApp extends Questpie<any>>({\n to,\n collection,\n action,\n id,\n global,\n pageId,\n href: customHref,\n useNavigate = false,\n children,\n onClick,\n ...rest\n}: AdminLinkProps<TApp>) {\n const { routes } = useAdminRoutes<TApp>();\n\n // Determine the href\n const href = React.useMemo(() => {\n if (customHref) return customHref;\n\n const targetProps: AdminLinkTargetProps<TApp> = {\n to,\n collection,\n action,\n id,\n global,\n pageId,\n };\n\n return getAdminLinkHref(routes, targetProps);\n }, [customHref, to, collection, action, id, global, pageId, routes]);\n\n // Handle click for navigate mode\n const handleClick = React.useCallback(\n (e: React.MouseEvent<HTMLAnchorElement>) => {\n if (onClick) {\n onClick(e);\n }\n\n if (useNavigate && !e.defaultPrevented) {\n e.preventDefault();\n // Navigate will be called via routes context\n if (typeof window !== \"undefined\") {\n window.history.pushState({}, \"\", href);\n window.dispatchEvent(new PopStateEvent(\"popstate\"));\n }\n }\n },\n [onClick, useNavigate, href],\n );\n\n return (\n <a href={href} onClick={handleClick} {...rest}>\n {children}\n </a>\n );\n}\n\n// ============================================================================\n// Convenience Components\n// ============================================================================\n\n/**\n * Link to a collection list\n */\nexport function CollectionLink<TApp extends Questpie<any>>({\n collection,\n ...rest\n}: Omit<AdminLinkProps<TApp>, \"to\" | \"global\" | \"pageId\" | \"action\" | \"id\"> & {\n collection: CollectionNames<TApp>;\n}) {\n return <AdminLink<TApp> collection={collection} action=\"list\" {...rest} />;\n}\n\n/**\n * Link to create a new item in a collection\n */\nexport function CollectionCreateLink<TApp extends Questpie<any>>({\n collection,\n ...rest\n}: Omit<AdminLinkProps<TApp>, \"to\" | \"global\" | \"pageId\" | \"action\" | \"id\"> & {\n collection: CollectionNames<TApp>;\n}) {\n return <AdminLink<TApp> collection={collection} action=\"create\" {...rest} />;\n}\n\n/**\n * Link to edit an item in a collection\n */\nexport function CollectionEditLink<TApp extends Questpie<any>>({\n collection,\n id,\n ...rest\n}: Omit<AdminLinkProps<TApp>, \"to\" | \"global\" | \"pageId\" | \"action\"> & {\n collection: CollectionNames<TApp>;\n id: string;\n}) {\n return (\n <AdminLink<TApp> collection={collection} action=\"edit\" id={id} {...rest} />\n );\n}\n\n/**\n * Link to a global settings page\n */\nexport function GlobalLink<TApp extends Questpie<any>>({\n global,\n ...rest\n}: Omit<\n AdminLinkProps<TApp>,\n \"to\" | \"collection\" | \"pageId\" | \"action\" | \"id\"\n> & {\n global: GlobalNames<TApp>;\n}) {\n return <AdminLink<TApp> global={global} {...rest} />;\n}\n\n/**\n * Link to dashboard\n */\nexport function DashboardLink<TApp extends Questpie<any>>(\n props: Omit<\n AdminLinkProps<TApp>,\n \"to\" | \"collection\" | \"global\" | \"pageId\" | \"action\" | \"id\"\n >,\n) {\n return <AdminLink<TApp> to=\"dashboard\" {...props} />;\n}\n\nexport default AdminLink;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwEA,SAAgB,UAAsC,EACpD,IACA,YACA,QACA,IACA,QACA,QACA,MAAM,YACN,cAAc,OACd,UACA,SACA,GAAG,QACoB;CACvB,MAAM,EAAE,WAAW,gBAAsB;CAGzC,MAAM,OAAOA,QAAM,cAAc;AAC/B,MAAI,WAAY,QAAO;AAWvB,SAAO,iBAAiB,QATwB;GAC9C;GACA;GACA;GACA;GACA;GACA;GACD,CAE2C;IAC3C;EAAC;EAAY;EAAI;EAAY;EAAQ;EAAI;EAAQ;EAAQ;EAAO,CAAC;AAqBpE,QACE,oBAAC;EAAQ;EAAM,SAnBGA,QAAM,aACvB,MAA2C;AAC1C,OAAI,QACF,SAAQ,EAAE;AAGZ,OAAI,eAAe,CAAC,EAAE,kBAAkB;AACtC,MAAE,gBAAgB;AAElB,QAAI,OAAO,WAAW,aAAa;AACjC,YAAO,QAAQ,UAAU,EAAE,EAAE,IAAI,KAAK;AACtC,YAAO,cAAc,IAAI,cAAc,WAAW,CAAC;;;KAIzD;GAAC;GAAS;GAAa;GAAK,CAC7B;EAGsC,GAAI;EACtC;GACC;;;;;AAmCR,SAAgB,mBAA+C,EAC7D,YACA,IACA,GAAG,QAIF;AACD,QACE,oBAAC;EAA4B;EAAY,QAAO;EAAW;EAAI,GAAI;GAAQ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth-guard.d.mts","names":[],"sources":["../../../../src/client/components/auth/auth-guard.tsx"],"sourcesContent":[],"mappings":";;;;AAiFG,UArDc,cAAA,CAqDd;EAAiB;;;YAjDR,OAAA,CAAM;;;;;oBAME,OAAA,CAAM;;;;;;;;;yBAWD,OAAA,CAAM;;;;;;;;;;;;;;;;;;iBAyBf,SAAA;;;;;;;GAOb,iBAAiB,OAAA,CAAM"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth-guard.mjs","names":[],"sources":["../../../../src/client/components/auth/auth-guard.tsx"],"sourcesContent":["/**\n * Auth Guard Component\n *\n * Wraps protected content and handles authentication state.\n * Shows loading state while checking session, redirects to login\n * if not authenticated or missing required role.\n *\n * @example\n * ```tsx\n * <AuthGuard loginPath=\"/admin/login\" requiredRole=\"admin\">\n * <ProtectedContent />\n * </AuthGuard>\n * ```\n */\n\nimport * as React from \"react\";\nimport { useAuthClientSafe } from \"../../hooks/use-auth\";\nimport {\n selectBasePath,\n selectNavigate,\n useAdminStore,\n} from \"../../runtime/provider\";\nimport { AuthLoading } from \"./auth-loading\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface AuthGuardProps {\n /**\n * Content to render when authenticated\n */\n children: React.ReactNode;\n\n /**\n * Fallback to show while checking session\n * @default <AuthLoading />\n */\n loadingFallback?: React.ReactNode;\n\n /**\n * Path to redirect to when not authenticated\n * @default \"{basePath}/login\"\n */\n loginPath?: string;\n\n /**\n * Custom component to show when unauthorized (instead of redirect)\n */\n unauthorizedFallback?: React.ReactNode;\n\n /**\n * Required role for access\n * @default \"admin\"\n */\n requiredRole?: string;\n\n /**\n * Disable the auth guard (render children directly)\n * Useful for public pages within the admin layout\n */\n disabled?: boolean;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Auth Guard Component\n *\n * Protects content by checking authentication state and user role.\n * Uses Better Auth's useSession() hook internally.\n */\nexport function AuthGuard({\n children,\n loadingFallback,\n loginPath,\n unauthorizedFallback,\n requiredRole = \"admin\",\n disabled = false,\n}: AuthGuardProps): React.ReactElement {\n const authClient = useAuthClientSafe();\n const basePath = useAdminStore(selectBasePath);\n const navigate = useAdminStore(selectNavigate);\n\n // Determine if auth is enabled (not disabled and has auth client)\n const authEnabled = !disabled && authClient !== null;\n\n // Use Better Auth's session hook - always call to follow Rules of Hooks\n // When authClient is null, we use a stable mock that returns no session\n const sessionResult = authClient?.useSession();\n const session = authEnabled ? sessionResult?.data : null;\n const isPending = authEnabled ? (sessionResult?.isPending ?? false) : false;\n\n // Handle redirect after render (useEffect for side effects)\n const resolvedLoginPath = loginPath ?? `${basePath}/login`;\n const shouldRedirect =\n authEnabled &&\n !isPending &&\n (!session || session.user?.role !== requiredRole);\n\n React.useEffect(() => {\n if (shouldRedirect && !unauthorizedFallback) {\n // Store current path for redirect after login\n const currentPath =\n typeof window !== \"undefined\" ? window.location.pathname : \"\";\n const redirectUrl = currentPath\n ? `${resolvedLoginPath}?redirect=${encodeURIComponent(currentPath)}`\n : resolvedLoginPath;\n navigate(redirectUrl);\n }\n }, [shouldRedirect, unauthorizedFallback, resolvedLoginPath, navigate]);\n\n // If disabled or no auth client, render children directly\n if (!authEnabled) {\n return <>{children}</>;\n }\n\n // Loading state\n if (isPending) {\n return <>{loadingFallback ?? <AuthLoading />}</>;\n }\n\n // Not authenticated or wrong role\n if (!session || session.user?.role !== requiredRole) {\n // Show unauthorized fallback if provided\n if (unauthorizedFallback) {\n return <>{unauthorizedFallback}</>;\n }\n\n // Otherwise show loading while redirect happens\n return <>{loadingFallback ?? <AuthLoading />}</>;\n }\n\n // Authenticated with correct role - render children\n return <>{children}</>;\n}\n\nexport default AuthGuard;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA0EA,SAAgB,UAAU,EACxB,UACA,iBACA,WACA,sBACA,eAAe,SACf,WAAW,SAC0B;CACrC,MAAM,aAAa,mBAAmB;CACtC,MAAM,WAAW,cAAc,eAAe;CAC9C,MAAM,WAAW,cAAc,eAAe;CAG9C,MAAM,cAAc,CAAC,YAAY,eAAe;CAIhD,MAAM,gBAAgB,YAAY,YAAY;CAC9C,MAAM,UAAU,cAAc,eAAe,OAAO;CACpD,MAAM,YAAY,cAAe,eAAe,aAAa,QAAS;CAGtE,MAAM,oBAAoB,aAAa,GAAG,SAAS;CACnD,MAAM,iBACJ,eACA,CAAC,cACA,CAAC,WAAW,QAAQ,MAAM,SAAS;AAEtC,SAAM,gBAAgB;AACpB,MAAI,kBAAkB,CAAC,sBAAsB;GAE3C,MAAM,cACJ,OAAO,WAAW,cAAc,OAAO,SAAS,WAAW;AAI7D,YAHoB,cAChB,GAAG,kBAAkB,YAAY,mBAAmB,YAAY,KAChE,kBACiB;;IAEtB;EAAC;EAAgB;EAAsB;EAAmB;EAAS,CAAC;AAGvE,KAAI,CAAC,YACH,QAAO,gCAAG,WAAY;AAIxB,KAAI,UACF,QAAO,0CAAG,mBAAmB,oBAAC,gBAAc,GAAI;AAIlD,KAAI,CAAC,WAAW,QAAQ,MAAM,SAAS,cAAc;AAEnD,MAAI,qBACF,QAAO,0CAAG,uBAAwB;AAIpC,SAAO,0CAAG,mBAAmB,oBAAC,gBAAc,GAAI;;AAIlD,QAAO,gCAAG,WAAY"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth-loading.d.mts","names":[],"sources":["../../../../src/client/components/auth/auth-loading.tsx"],"sourcesContent":[],"mappings":";;;;AAiDE,UAlCe,gBAAA,CAkCf;EACC;;;;;;;;;;;;;;;;;;;;;;;iBAJa,WAAA;;;;GAIb,mBAAmB,OAAA,CAAM"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth-loading.mjs","names":[],"sources":["../../../../src/client/components/auth/auth-loading.tsx"],"sourcesContent":["/**\n * Auth Loading Component\n *\n * Full-page loading state shown while checking authentication.\n * Used as the default loadingFallback in AuthGuard.\n */\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Spinner } from \"../ui/spinner\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface AuthLoadingProps {\n /**\n * Custom class name for the container\n */\n className?: string;\n\n /**\n * Loading message to display\n * @default \"Loading...\"\n */\n message?: string;\n\n /**\n * Show the loading message\n * @default true\n */\n showMessage?: boolean;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Full-page loading state for authentication\n *\n * @example\n * ```tsx\n * <AuthLoading message=\"Checking authentication...\" />\n * ```\n */\nexport function AuthLoading({\n className,\n message = \"Loading...\",\n showMessage = true,\n}: AuthLoadingProps): React.ReactElement {\n return (\n <div\n className={cn(\n \"flex min-h-screen flex-col items-center justify-center gap-4\",\n className,\n )}\n >\n <Spinner className=\"size-8 text-primary\" />\n {showMessage && (\n <p className=\"text-sm text-muted-foreground\">{message}</p>\n )}\n </div>\n );\n}\n\nexport default AuthLoading;\n"],"mappings":";;;;;;;;;;;;;;AA8CA,SAAgB,YAAY,EAC1B,WACA,UAAU,cACV,cAAc,QACyB;AACvC,QACE,qBAAC;EACC,WAAW,GACT,gEACA,UACD;aAED,oBAAC,WAAQ,WAAU,wBAAwB,EAC1C,eACC,oBAAC;GAAE,WAAU;aAAiC;IAAY;GAExD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"block-canvas.mjs","names":["React"],"sources":["../../../../src/client/components/blocks/block-canvas.tsx"],"sourcesContent":["/**\n * Block Canvas\n *\n * Main canvas area for displaying and editing the block tree.\n * Supports drag-and-drop reordering and inline field editing.\n */\n\n\"use client\";\n\nimport {\n\tclosestCenter,\n\tDndContext,\n\ttype DragEndEvent,\n\tDragOverlay,\n\ttype DragStartEvent,\n\tKeyboardSensor,\n\tPointerSensor,\n\tuseSensor,\n\tuseSensors,\n} from \"@dnd-kit/core\";\nimport { sortableKeyboardCoordinates } from \"@dnd-kit/sortable\";\nimport { Icon } from \"@iconify/react\";\nimport * as React from \"react\";\nimport {\n\tuseBlockEditor,\n\tuseBlockEditorActions,\n} from \"./block-editor-context.js\";\nimport { BlockTree } from \"./block-tree.js\";\nimport { BlockIcon } from \"./block-type-icon.js\";\nimport { findBlockById, findBlockPosition } from \"./utils/tree-utils.js\";\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function BlockCanvas() {\n\tconst { state } = useBlockEditor();\n\tconst actions = useBlockEditorActions();\n\tconst [activeId, setActiveId] = React.useState<string | null>(null);\n\n\t// Configure drag sensors with keyboard support\n\tconst sensors = useSensors(\n\t\tuseSensor(PointerSensor, {\n\t\t\tactivationConstraint: {\n\t\t\t\tdistance: 8, // Require 8px of movement before starting drag\n\t\t\t},\n\t\t}),\n\t\tuseSensor(KeyboardSensor, {\n\t\t\tcoordinateGetter: sortableKeyboardCoordinates,\n\t\t}),\n\t);\n\n\t// Handle drag start - track active item for overlay\n\tconst handleDragStart = (event: DragStartEvent) => {\n\t\tsetActiveId(event.active.id as string);\n\t};\n\n\t// Handle drag end - reorder within same parent only\n\tconst handleDragEnd = (event: DragEndEvent) => {\n\t\tconst { active, over } = event;\n\t\tsetActiveId(null);\n\n\t\tif (!over || active.id === over.id) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst draggedId = active.id as string;\n\t\tconst overId = over.id as string;\n\n\t\t// Find positions of both blocks\n\t\tconst activePosition = findBlockPosition(state.content._tree, draggedId);\n\t\tconst overPosition = findBlockPosition(state.content._tree, overId);\n\n\t\tif (!activePosition || !overPosition) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Only allow reordering within the same parent\n\t\tif (activePosition.parentId !== overPosition.parentId) {\n\t\t\treturn;\n\t\t}\n\n\t\tactions.moveBlock(\n\t\t\tdraggedId,\n\t\t\tactivePosition.parentId,\n\t\t\tactivePosition.index,\n\t\t\toverPosition.index,\n\t\t);\n\t};\n\n\t// Handle drag cancel - reset state\n\tconst handleDragCancel = () => {\n\t\tsetActiveId(null);\n\t};\n\n\t// Get active block for overlay\n\tconst activeBlock = activeId\n\t\t? findBlockById(state.content._tree, activeId)\n\t\t: null;\n\tconst activeBlockSchema = activeBlock ? state.blocks[activeBlock.type] : null;\n\n\treturn (\n\t\t<DndContext\n\t\t\tsensors={sensors}\n\t\t\tcollisionDetection={closestCenter}\n\t\t\tonDragStart={handleDragStart}\n\t\t\tonDragEnd={handleDragEnd}\n\t\t\tonDragCancel={handleDragCancel}\n\t\t>\n\t\t\t<BlockTree blocks={state.content._tree} level={0} parentId={null} />\n\n\t\t\t{/* Drag overlay - shows what's being dragged */}\n\t\t\t<DragOverlay>\n\t\t\t\t{activeBlock && (\n\t\t\t\t\t<div className=\"flex items-center gap-2 rounded-md border bg-background p-2 shadow-lg\">\n\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\ticon=\"ph:dots-six-vertical\"\n\t\t\t\t\t\t\tclassName=\"h-4 w-4 text-muted-foreground\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<BlockIcon\n\t\t\t\t\t\t\ticon={activeBlockSchema?.admin?.icon}\n\t\t\t\t\t\t\tsize={16}\n\t\t\t\t\t\t\tclassName=\"text-muted-foreground\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<span className=\"text-sm font-medium\">\n\t\t\t\t\t\t\t{getBlockLabel(activeBlockSchema, activeBlock.type)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</DragOverlay>\n\t\t</DndContext>\n\t);\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nimport type { BlockSchema } from \"#questpie/admin/server\";\n\nfunction getBlockLabel(\n\tblockSchema: BlockSchema | null | undefined,\n\ttype: string,\n): string {\n\tif (!blockSchema) {\n\t\treturn type.charAt(0).toUpperCase() + type.slice(1);\n\t}\n\n\tconst label = blockSchema.admin?.label;\n\n\tif (!label) {\n\t\treturn type.charAt(0).toUpperCase() + type.slice(1);\n\t}\n\n\tif (typeof label === \"string\") return label;\n\n\tif (typeof label === \"object\" && label !== null) {\n\t\tif (\"en\" in label && typeof label.en === \"string\") return label.en;\n\t\tconst first = Object.values(label)[0];\n\t\tif (typeof first === \"string\") return first;\n\t}\n\n\treturn type.charAt(0).toUpperCase() + type.slice(1);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAmCA,SAAgB,cAAc;CAC7B,MAAM,EAAE,UAAU,gBAAgB;CAClC,MAAM,UAAU,uBAAuB;CACvC,MAAM,CAAC,UAAU,eAAeA,QAAM,SAAwB,KAAK;CAGnE,MAAM,UAAU,WACf,UAAU,eAAe,EACxB,sBAAsB,EACrB,UAAU,GACV,EACD,CAAC,EACF,UAAU,gBAAgB,EACzB,kBAAkB,6BAClB,CAAC,CACF;CAGD,MAAM,mBAAmB,UAA0B;AAClD,cAAY,MAAM,OAAO,GAAa;;CAIvC,MAAM,iBAAiB,UAAwB;EAC9C,MAAM,EAAE,QAAQ,SAAS;AACzB,cAAY,KAAK;AAEjB,MAAI,CAAC,QAAQ,OAAO,OAAO,KAAK,GAC/B;EAGD,MAAM,YAAY,OAAO;EACzB,MAAM,SAAS,KAAK;EAGpB,MAAM,iBAAiB,kBAAkB,MAAM,QAAQ,OAAO,UAAU;EACxE,MAAM,eAAe,kBAAkB,MAAM,QAAQ,OAAO,OAAO;AAEnE,MAAI,CAAC,kBAAkB,CAAC,aACvB;AAID,MAAI,eAAe,aAAa,aAAa,SAC5C;AAGD,UAAQ,UACP,WACA,eAAe,UACf,eAAe,OACf,aAAa,MACb;;CAIF,MAAM,yBAAyB;AAC9B,cAAY,KAAK;;CAIlB,MAAM,cAAc,WACjB,cAAc,MAAM,QAAQ,OAAO,SAAS,GAC5C;CACH,MAAM,oBAAoB,cAAc,MAAM,OAAO,YAAY,QAAQ;AAEzE,QACC,qBAAC;EACS;EACT,oBAAoB;EACpB,aAAa;EACb,WAAW;EACX,cAAc;aAEd,oBAAC;GAAU,QAAQ,MAAM,QAAQ;GAAO,OAAO;GAAG,UAAU;IAAQ,EAGpE,oBAAC,yBACC,eACA,qBAAC;GAAI,WAAU;;IACd,oBAAC;KACA,MAAK;KACL,WAAU;MACT;IACF,oBAAC;KACA,MAAM,mBAAmB,OAAO;KAChC,MAAM;KACN,WAAU;MACT;IACF,oBAAC;KAAK,WAAU;eACd,cAAc,mBAAmB,YAAY,KAAK;MAC7C;;IACF,GAEM;GACF;;AAUf,SAAS,cACR,aACA,MACS;AACT,KAAI,CAAC,YACJ,QAAO,KAAK,OAAO,EAAE,CAAC,aAAa,GAAG,KAAK,MAAM,EAAE;CAGpD,MAAM,QAAQ,YAAY,OAAO;AAEjC,KAAI,CAAC,MACJ,QAAO,KAAK,OAAO,EAAE,CAAC,aAAa,GAAG,KAAK,MAAM,EAAE;AAGpD,KAAI,OAAO,UAAU,SAAU,QAAO;AAEtC,KAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAChD,MAAI,QAAQ,SAAS,OAAO,MAAM,OAAO,SAAU,QAAO,MAAM;EAChE,MAAM,QAAQ,OAAO,OAAO,MAAM,CAAC;AACnC,MAAI,OAAO,UAAU,SAAU,QAAO;;AAGvC,QAAO,KAAK,OAAO,EAAE,CAAC,aAAa,GAAG,KAAK,MAAM,EAAE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"block-editor-context.mjs","names":["React"],"sources":["../../../../src/client/components/blocks/block-editor-context.tsx"],"sourcesContent":["/**\n * Block Editor Context\n *\n * Context and hooks for the block editor state management.\n */\n\n\"use client\";\n\nimport * as React from \"react\";\nimport type { BlockSchema } from \"#questpie/admin/server\";\nimport type { BlockContent } from \"../../blocks/types.js\";\nimport type { InsertPosition } from \"./utils/tree-utils.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Block editor state.\n */\nexport type BlockEditorState = {\n\t/** Block content (tree + values) */\n\tcontent: BlockContent;\n\t/** Currently selected block ID */\n\tselectedBlockId: string | null;\n\t/** Expanded block IDs (for nested blocks) */\n\texpandedBlockIds: Set<string>;\n\t/** Is block library open */\n\tisLibraryOpen: boolean;\n\t/** Insert position when adding new block */\n\tinsertPosition: InsertPosition | null;\n\t/** Registered block definitions (from server introspection) */\n\tblocks: Record<string, BlockSchema>;\n\t/** Allowed block types for this field */\n\tallowedBlocks: string[] | null;\n\t/** Current locale for editing */\n\tlocale: string;\n};\n\n/**\n * Block editor actions.\n */\nexport type BlockEditorActions = {\n\t// Selection\n\tselectBlock: (id: string | null) => void;\n\ttoggleExpanded: (id: string) => void;\n\texpandAll: () => void;\n\tcollapseAll: () => void;\n\n\t// CRUD\n\taddBlock: (type: string, position: InsertPosition) => void;\n\tremoveBlock: (id: string) => void;\n\tduplicateBlock: (id: string) => void;\n\n\t// Reorder\n\tmoveBlock: (\n\t\tid: string,\n\t\tparentId: string | null,\n\t\tfromIndex: number,\n\t\ttoIndex: number,\n\t) => void;\n\n\t// Values\n\tupdateBlockValues: (id: string, values: Record<string, unknown>) => void;\n\n\t// Library\n\topenLibrary: (position: InsertPosition) => void;\n\tcloseLibrary: () => void;\n};\n\n/**\n * Block editor context value.\n */\nexport type BlockEditorContextValue = {\n\tstate: BlockEditorState;\n\tactions: BlockEditorActions;\n};\n\n// ============================================================================\n// Context\n// ============================================================================\n\nconst BlockEditorContext = React.createContext<BlockEditorContextValue | null>(\n\tnull,\n);\n\n/**\n * Hook to access block editor state and actions.\n * Must be used within BlockEditorProvider.\n */\nexport function useBlockEditor(): BlockEditorContextValue {\n\tconst ctx = React.useContext(BlockEditorContext);\n\tif (!ctx) {\n\t\tthrow new Error(\"useBlockEditor must be used within BlockEditorProvider\");\n\t}\n\treturn ctx;\n}\n\n/**\n * Hook to access only block editor state.\n */\nexport function useBlockEditorState(): BlockEditorState {\n\treturn useBlockEditor().state;\n}\n\n/**\n * Hook to access only block editor actions.\n */\nexport function useBlockEditorActions(): BlockEditorActions {\n\treturn useBlockEditor().actions;\n}\n\n/**\n * Hook to check if a block is selected.\n */\nexport function useIsBlockSelected(blockId: string): boolean {\n\tconst { state } = useBlockEditor();\n\treturn state.selectedBlockId === blockId;\n}\n\n/**\n * Hook to check if a block is expanded.\n */\nexport function useIsBlockExpanded(blockId: string): boolean {\n\tconst { state } = useBlockEditor();\n\treturn state.expandedBlockIds.has(blockId);\n}\n\n/**\n * Hook to get a block schema by type.\n */\nexport function useBlockSchema(blockType: string): BlockSchema | undefined {\n\tconst { state } = useBlockEditor();\n\treturn state.blocks[blockType];\n}\n\n/**\n * Hook to get the selected block's schema.\n * @deprecated Use useBlockSchema instead\n */\nexport function useBlockDefinition(blockType: string): BlockSchema | undefined {\n\treturn useBlockSchema(blockType);\n}\n\n/**\n * Hook to get the selected block's schema.\n */\nexport function useSelectedBlockSchema(): BlockSchema | undefined {\n\tconst { state } = useBlockEditor();\n\tif (!state.selectedBlockId) return undefined;\n\n\tconst blockNode = findBlockNodeById(\n\t\tstate.content._tree,\n\t\tstate.selectedBlockId,\n\t);\n\tif (!blockNode) return undefined;\n\n\treturn state.blocks[blockNode.type];\n}\n\n/**\n * Hook to get the selected block's definition.\n * @deprecated Use useSelectedBlockSchema instead\n */\nexport function useSelectedBlockDefinition(): BlockSchema | undefined {\n\treturn useSelectedBlockSchema();\n}\n\n/**\n * Hook to get the selected block's values.\n */\nexport function useSelectedBlockValues(): Record<string, unknown> | undefined {\n\tconst { state } = useBlockEditor();\n\tif (!state.selectedBlockId) return undefined;\n\treturn state.content._values[state.selectedBlockId];\n}\n\n// ============================================================================\n// Provider Component\n// ============================================================================\n\nexport const BlockEditorContextProvider = BlockEditorContext.Provider;\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nimport type { BlockNode } from \"../../blocks/types.js\";\n\nfunction findBlockNodeById(\n\ttree: BlockNode[],\n\tid: string,\n): BlockNode | undefined {\n\tfor (const node of tree) {\n\t\tif (node.id === id) return node;\n\t\tconst found = findBlockNodeById(node.children, id);\n\t\tif (found) return found;\n\t}\n\treturn undefined;\n}\n"],"mappings":";;;;;;;;;;AAkFA,MAAM,qBAAqBA,QAAM,cAChC,KACA;;;;;AAMD,SAAgB,iBAA0C;CACzD,MAAM,MAAMA,QAAM,WAAW,mBAAmB;AAChD,KAAI,CAAC,IACJ,OAAM,IAAI,MAAM,yDAAyD;AAE1E,QAAO;;;;;AAMR,SAAgB,sBAAwC;AACvD,QAAO,gBAAgB,CAAC;;;;;AAMzB,SAAgB,wBAA4C;AAC3D,QAAO,gBAAgB,CAAC;;;;;AAczB,SAAgB,mBAAmB,SAA0B;CAC5D,MAAM,EAAE,UAAU,gBAAgB;AAClC,QAAO,MAAM,iBAAiB,IAAI,QAAQ;;;;;AAM3C,SAAgB,eAAe,WAA4C;CAC1E,MAAM,EAAE,UAAU,gBAAgB;AAClC,QAAO,MAAM,OAAO;;;;;;AAOrB,SAAgB,mBAAmB,WAA4C;AAC9E,QAAO,eAAe,UAAU;;AAwCjC,MAAa,6BAA6B,mBAAmB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"block-editor-layout.mjs","names":["React"],"sources":["../../../../src/client/components/blocks/block-editor-layout.tsx"],"sourcesContent":["/**\n * Block Editor Layout\n *\n * Main layout for the block editor with inline editable blocks.\n * Uses a scrollable container with FAB for adding blocks.\n */\n\n\"use client\";\n\nimport { Icon } from \"@iconify/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils.js\";\nimport { Button } from \"../ui/button.js\";\nimport { BlockCanvas } from \"./block-canvas.js\";\nimport {\n\tuseBlockEditor,\n\tuseBlockEditorActions,\n} from \"./block-editor-context.js\";\nimport { BlockLibrarySidebar } from \"./block-library-sidebar.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type BlockEditorLayoutProps = {\n\t/** Custom class name */\n\tclassName?: string;\n\t/** Minimum height for the editor */\n\tminHeight?: number;\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function BlockEditorLayout({\n\tclassName,\n\tminHeight = 500,\n}: BlockEditorLayoutProps) {\n\tconst { state } = useBlockEditor();\n\tconst actions = useBlockEditorActions();\n\tconst [sidebarOpen, setSidebarOpen] = React.useState(false);\n\n\t// Open sidebar with insert position at end of root\n\tconst handleOpenSidebar = () => {\n\t\tactions.openLibrary({ parentId: null, index: state.content._tree.length });\n\t\tsetSidebarOpen(true);\n\t};\n\n\t// Handle sidebar close\n\tconst handleCloseSidebar = () => {\n\t\tsetSidebarOpen(false);\n\t\tactions.closeLibrary();\n\t};\n\n\t// Sync sidebar state with context\n\tReact.useEffect(() => {\n\t\tif (state.isLibraryOpen && !sidebarOpen) {\n\t\t\tsetSidebarOpen(true);\n\t\t}\n\t}, [state.isLibraryOpen, sidebarOpen]);\n\n\tconst hasBlocks = state.content._tree.length > 0;\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\"relative flex flex-col\", className)}\n\t\t\tstyle={{ minHeight }}\n\t\t>\n\t\t\t{/* Main content area */}\n\t\t\t\t<BlockCanvas />\n\n\t\t\t\t{/* Empty state hint */}\n\t\t\t\t{!hasBlocks && (\n\t\t\t\t\t<div className=\"py-8 text-center\">\n\t\t\t\t\t\t<div className=\"text-muted-foreground\">\n\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\ticon=\"ph:stack\"\n\t\t\t\t\t\t\t\tclassName=\"mx-auto h-12 w-12 text-muted-foreground/30 mb-4\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<p className=\"text-sm font-medium\">No blocks yet</p>\n\t\t\t\t\t\t\t<p className=\"text-xs text-muted-foreground mt-1\">\n\t\t\t\t\t\t\t\tAdd your first block to get started\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\tclassName=\"mt-4\"\n\t\t\t\t\t\t\tonClick={handleOpenSidebar}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Icon icon=\"ph:plus\" className=\"mr-2 h-4 w-4\" />\n\t\t\t\t\t\t\tAdd block\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\n\t\t\t{/* Block Library Sidebar */}\n\t\t\t<BlockLibrarySidebar open={sidebarOpen} onClose={handleCloseSidebar} />\n\t\t</div>\n\t);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAmCA,SAAgB,kBAAkB,EACjC,WACA,YAAY,OACc;CAC1B,MAAM,EAAE,UAAU,gBAAgB;CAClC,MAAM,UAAU,uBAAuB;CACvC,MAAM,CAAC,aAAa,kBAAkBA,QAAM,SAAS,MAAM;CAG3D,MAAM,0BAA0B;AAC/B,UAAQ,YAAY;GAAE,UAAU;GAAM,OAAO,MAAM,QAAQ,MAAM;GAAQ,CAAC;AAC1E,iBAAe,KAAK;;CAIrB,MAAM,2BAA2B;AAChC,iBAAe,MAAM;AACrB,UAAQ,cAAc;;AAIvB,SAAM,gBAAgB;AACrB,MAAI,MAAM,iBAAiB,CAAC,YAC3B,gBAAe,KAAK;IAEnB,CAAC,MAAM,eAAe,YAAY,CAAC;CAEtC,MAAM,YAAY,MAAM,QAAQ,MAAM,SAAS;AAE/C,QACC,qBAAC;EACA,WAAW,GAAG,0BAA0B,UAAU;EAClD,OAAO,EAAE,WAAW;;GAGnB,oBAAC,gBAAc;GAGd,CAAC,aACD,qBAAC;IAAI,WAAU;eACd,qBAAC;KAAI,WAAU;;MACd,oBAAC;OACA,MAAK;OACL,WAAU;QACT;MACF,oBAAC;OAAE,WAAU;iBAAsB;QAAiB;MACpD,oBAAC;OAAE,WAAU;iBAAqC;QAE9C;;MACC,EACN,qBAAC;KACA,SAAQ;KACR,MAAK;KACL,WAAU;KACV,SAAS;gBAET,oBAAC;MAAK,MAAK;MAAU,WAAU;OAAiB;MAExC;KACJ;GAKR,oBAAC;IAAoB,MAAM;IAAa,SAAS;KAAsB;;GAClE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"block-editor-provider.mjs","names":["React","actions: BlockEditorActions","newBlock: BlockNode","state: BlockEditorState"],"sources":["../../../../src/client/components/blocks/block-editor-provider.tsx"],"sourcesContent":["/**\n * Block Editor Provider\n *\n * Provides state and actions for the block editor.\n */\n\n\"use client\";\n\nimport * as React from \"react\";\nimport type { BlockSchema } from \"#questpie/admin/server\";\nimport type { BlockContent, BlockNode } from \"../../blocks/types.js\";\nimport {\n\ttype BlockEditorActions,\n\tBlockEditorContextProvider,\n\ttype BlockEditorState,\n} from \"./block-editor-context.js\";\nimport {\n\tduplicateBlockInTree,\n\tfindBlockById,\n\tgetAllBlockIds,\n\tgetDefaultValues,\n\ttype InsertPosition,\n\tinsertBlockInTree,\n\treorderBlockInTree,\n\tremoveBlockFromTree,\n} from \"./utils/tree-utils.js\";\n\n// ============================================================================\n// Props\n// ============================================================================\n\nexport type BlockEditorProviderProps = {\n\t/** Initial/controlled content */\n\tvalue: BlockContent;\n\t/** Change handler */\n\tonChange: (content: BlockContent) => void;\n\t/** Registered blocks (from server introspection) */\n\tblocks: Record<string, BlockSchema>;\n\t/** Allowed block types (optional filter) */\n\tallowedBlocks?: string[];\n\t/** Current locale */\n\tlocale?: string;\n\t/** Children */\n\tchildren: React.ReactNode;\n};\n\n// ============================================================================\n// Provider Component\n// ============================================================================\n\nexport function BlockEditorProvider({\n\tvalue,\n\tonChange,\n\tblocks,\n\tallowedBlocks,\n\tlocale = \"en\",\n\tchildren,\n}: BlockEditorProviderProps) {\n\t// Selection state\n\tconst [selectedBlockId, setSelectedBlockId] = React.useState<string | null>(\n\t\tnull,\n\t);\n\n\t// Expanded blocks state\n\tconst [expandedBlockIds, setExpandedBlockIds] = React.useState<Set<string>>(\n\t\t() => new Set(),\n\t);\n\n\t// Library state\n\tconst [isLibraryOpen, setIsLibraryOpen] = React.useState(false);\n\tconst [insertPosition, setInsertPosition] =\n\t\tReact.useState<InsertPosition | null>(null);\n\n\t// Actions\n\tconst actions: BlockEditorActions = React.useMemo(\n\t\t() => ({\n\t\t\t// Selection\n\t\t\tselectBlock: (id) => {\n\t\t\t\tsetSelectedBlockId(id);\n\t\t\t\t// Close library when selecting a block\n\t\t\t\tif (id !== null) {\n\t\t\t\t\tsetIsLibraryOpen(false);\n\t\t\t\t\tsetInsertPosition(null);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\ttoggleExpanded: (id) => {\n\t\t\t\tsetExpandedBlockIds((prev) => {\n\t\t\t\t\tconst next = new Set(prev);\n\t\t\t\t\tif (next.has(id)) {\n\t\t\t\t\t\tnext.delete(id);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnext.add(id);\n\t\t\t\t\t}\n\t\t\t\t\treturn next;\n\t\t\t\t});\n\t\t\t},\n\n\t\t\texpandAll: () => {\n\t\t\t\tconst allIds = getAllBlockIds(value._tree);\n\t\t\t\tsetExpandedBlockIds(new Set(allIds));\n\t\t\t},\n\n\t\t\tcollapseAll: () => {\n\t\t\t\tsetExpandedBlockIds(new Set());\n\t\t\t},\n\n\t\t\t// CRUD\n\t\t\taddBlock: (type, position) => {\n\t\t\t\tconst blockDef = blocks[type];\n\t\t\t\tif (!blockDef) {\n\t\t\t\t\tif (process.env.NODE_ENV !== \"production\") {\n\t\t\t\t\t\tconsole.warn(`Block type \"${type}\" not found`);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst newBlock: BlockNode = {\n\t\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\t\ttype,\n\t\t\t\t\tchildren: [],\n\t\t\t\t};\n\n\t\t\t\tconst newValues = getDefaultValues(\n\t\t\t\t\tblockDef.fields as Record<\n\t\t\t\t\t\tstring,\n\t\t\t\t\t\t{ \"~options\"?: { defaultValue?: unknown } }\n\t\t\t\t\t>,\n\t\t\t\t);\n\n\t\t\t\tonChange({\n\t\t\t\t\t_tree: insertBlockInTree(value._tree, newBlock, position),\n\t\t\t\t\t_values: { ...value._values, [newBlock.id]: newValues },\n\t\t\t\t});\n\n\t\t\t\t// Select the new block and close library\n\t\t\t\tsetSelectedBlockId(newBlock.id);\n\t\t\t\tsetIsLibraryOpen(false);\n\t\t\t\tsetInsertPosition(null);\n\n\t\t\t\t// Expand parent if inserting as child\n\t\t\t\tif (position.parentId) {\n\t\t\t\t\tsetExpandedBlockIds((prev) => new Set([...prev, position.parentId!]));\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tremoveBlock: (id) => {\n\t\t\t\tconst { newTree, removedIds } = removeBlockFromTree(value._tree, id);\n\t\t\t\tconst newValues = { ...value._values };\n\t\t\t\tfor (const removedId of removedIds) {\n\t\t\t\t\tdelete newValues[removedId];\n\t\t\t\t}\n\n\t\t\t\tonChange({ _tree: newTree, _values: newValues });\n\n\t\t\t\t// Clear selection if removed block was selected\n\t\t\t\tif (selectedBlockId === id || removedIds.includes(selectedBlockId!)) {\n\t\t\t\t\tsetSelectedBlockId(null);\n\t\t\t\t}\n\n\t\t\t\t// Clear from expanded\n\t\t\t\tsetExpandedBlockIds((prev) => {\n\t\t\t\t\tconst next = new Set(prev);\n\t\t\t\t\tfor (const removedId of removedIds) {\n\t\t\t\t\t\tnext.delete(removedId);\n\t\t\t\t\t}\n\t\t\t\t\treturn next;\n\t\t\t\t});\n\t\t\t},\n\n\t\t\tduplicateBlock: (id) => {\n\t\t\t\tconst { newTree, newIds, newValues } = duplicateBlockInTree(\n\t\t\t\t\tvalue._tree,\n\t\t\t\t\tvalue._values,\n\t\t\t\t\tid,\n\t\t\t\t);\n\n\t\t\t\tonChange({\n\t\t\t\t\t_tree: newTree,\n\t\t\t\t\t_values: { ...value._values, ...newValues },\n\t\t\t\t});\n\n\t\t\t\t// Select the first duplicated block\n\t\t\t\tif (newIds.length > 0) {\n\t\t\t\t\tsetSelectedBlockId(newIds[0]);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Reorder (same-parent only, uses arrayMove for correct index handling)\n\t\t\tmoveBlock: (_id, parentId, fromIndex, toIndex) => {\n\t\t\t\tonChange({\n\t\t\t\t\t...value,\n\t\t\t\t\t_tree: reorderBlockInTree(value._tree, parentId, fromIndex, toIndex),\n\t\t\t\t});\n\t\t\t},\n\n\t\t\t// Values\n\t\t\tupdateBlockValues: (id, newValues) => {\n\t\t\t\tonChange({\n\t\t\t\t\t...value,\n\t\t\t\t\t_values: {\n\t\t\t\t\t\t...value._values,\n\t\t\t\t\t\t[id]: { ...value._values[id], ...newValues },\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t},\n\n\t\t\t// Library\n\t\t\topenLibrary: (position) => {\n\t\t\t\tsetInsertPosition(position);\n\t\t\t\tsetIsLibraryOpen(true);\n\t\t\t\tsetSelectedBlockId(null);\n\t\t\t},\n\n\t\t\tcloseLibrary: () => {\n\t\t\t\tsetIsLibraryOpen(false);\n\t\t\t\tsetInsertPosition(null);\n\t\t\t},\n\t\t}),\n\t\t[value, onChange, blocks, selectedBlockId],\n\t);\n\n\t// State object\n\tconst state: BlockEditorState = React.useMemo(\n\t\t() => ({\n\t\t\tcontent: value,\n\t\t\tselectedBlockId,\n\t\t\texpandedBlockIds,\n\t\t\tisLibraryOpen,\n\t\t\tinsertPosition,\n\t\t\tblocks,\n\t\t\tallowedBlocks: allowedBlocks || null,\n\t\t\tlocale,\n\t\t}),\n\t\t[\n\t\t\tvalue,\n\t\t\tselectedBlockId,\n\t\t\texpandedBlockIds,\n\t\t\tisLibraryOpen,\n\t\t\tinsertPosition,\n\t\t\tblocks,\n\t\t\tallowedBlocks,\n\t\t\tlocale,\n\t\t],\n\t);\n\n\t// Context value\n\tconst contextValue = React.useMemo(\n\t\t() => ({ state, actions }),\n\t\t[state, actions],\n\t);\n\n\treturn (\n\t\t<BlockEditorContextProvider value={contextValue}>\n\t\t\t{children}\n\t\t</BlockEditorContextProvider>\n\t);\n}\n"],"mappings":";;;;;;;;;;;;;AAkDA,SAAgB,oBAAoB,EACnC,OACA,UACA,QACA,eACA,SAAS,MACT,YAC4B;CAE5B,MAAM,CAAC,iBAAiB,sBAAsBA,QAAM,SACnD,KACA;CAGD,MAAM,CAAC,kBAAkB,uBAAuBA,QAAM,+BAC/C,IAAI,KAAK,CACf;CAGD,MAAM,CAAC,eAAe,oBAAoBA,QAAM,SAAS,MAAM;CAC/D,MAAM,CAAC,gBAAgB,qBACtBA,QAAM,SAAgC,KAAK;CAG5C,MAAMC,UAA8BD,QAAM,eAClC;EAEN,cAAc,OAAO;AACpB,sBAAmB,GAAG;AAEtB,OAAI,OAAO,MAAM;AAChB,qBAAiB,MAAM;AACvB,sBAAkB,KAAK;;;EAIzB,iBAAiB,OAAO;AACvB,wBAAqB,SAAS;IAC7B,MAAM,OAAO,IAAI,IAAI,KAAK;AAC1B,QAAI,KAAK,IAAI,GAAG,CACf,MAAK,OAAO,GAAG;QAEf,MAAK,IAAI,GAAG;AAEb,WAAO;KACN;;EAGH,iBAAiB;GAChB,MAAM,SAAS,eAAe,MAAM,MAAM;AAC1C,uBAAoB,IAAI,IAAI,OAAO,CAAC;;EAGrC,mBAAmB;AAClB,uCAAoB,IAAI,KAAK,CAAC;;EAI/B,WAAW,MAAM,aAAa;GAC7B,MAAM,WAAW,OAAO;AACxB,OAAI,CAAC,UAAU;AACd,QAAI,QAAQ,IAAI,aAAa,aAC5B,SAAQ,KAAK,eAAe,KAAK,aAAa;AAE/C;;GAGD,MAAME,WAAsB;IAC3B,IAAI,OAAO,YAAY;IACvB;IACA,UAAU,EAAE;IACZ;GAED,MAAM,YAAY,iBACjB,SAAS,OAIT;AAED,YAAS;IACR,OAAO,kBAAkB,MAAM,OAAO,UAAU,SAAS;IACzD,SAAS;KAAE,GAAG,MAAM;MAAU,SAAS,KAAK;KAAW;IACvD,CAAC;AAGF,sBAAmB,SAAS,GAAG;AAC/B,oBAAiB,MAAM;AACvB,qBAAkB,KAAK;AAGvB,OAAI,SAAS,SACZ,sBAAqB,SAAS,IAAI,IAAI,CAAC,GAAG,MAAM,SAAS,SAAU,CAAC,CAAC;;EAIvE,cAAc,OAAO;GACpB,MAAM,EAAE,SAAS,eAAe,oBAAoB,MAAM,OAAO,GAAG;GACpE,MAAM,YAAY,EAAE,GAAG,MAAM,SAAS;AACtC,QAAK,MAAM,aAAa,WACvB,QAAO,UAAU;AAGlB,YAAS;IAAE,OAAO;IAAS,SAAS;IAAW,CAAC;AAGhD,OAAI,oBAAoB,MAAM,WAAW,SAAS,gBAAiB,CAClE,oBAAmB,KAAK;AAIzB,wBAAqB,SAAS;IAC7B,MAAM,OAAO,IAAI,IAAI,KAAK;AAC1B,SAAK,MAAM,aAAa,WACvB,MAAK,OAAO,UAAU;AAEvB,WAAO;KACN;;EAGH,iBAAiB,OAAO;GACvB,MAAM,EAAE,SAAS,QAAQ,cAAc,qBACtC,MAAM,OACN,MAAM,SACN,GACA;AAED,YAAS;IACR,OAAO;IACP,SAAS;KAAE,GAAG,MAAM;KAAS,GAAG;KAAW;IAC3C,CAAC;AAGF,OAAI,OAAO,SAAS,EACnB,oBAAmB,OAAO,GAAG;;EAK/B,YAAY,KAAK,UAAU,WAAW,YAAY;AACjD,YAAS;IACR,GAAG;IACH,OAAO,mBAAmB,MAAM,OAAO,UAAU,WAAW,QAAQ;IACpE,CAAC;;EAIH,oBAAoB,IAAI,cAAc;AACrC,YAAS;IACR,GAAG;IACH,SAAS;KACR,GAAG,MAAM;MACR,KAAK;MAAE,GAAG,MAAM,QAAQ;MAAK,GAAG;MAAW;KAC5C;IACD,CAAC;;EAIH,cAAc,aAAa;AAC1B,qBAAkB,SAAS;AAC3B,oBAAiB,KAAK;AACtB,sBAAmB,KAAK;;EAGzB,oBAAoB;AACnB,oBAAiB,MAAM;AACvB,qBAAkB,KAAK;;EAExB,GACD;EAAC;EAAO;EAAU;EAAQ;EAAgB,CAC1C;CAGD,MAAMC,QAA0BH,QAAM,eAC9B;EACN,SAAS;EACT;EACA;EACA;EACA;EACA;EACA,eAAe,iBAAiB;EAChC;EACA,GACD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,CACD;AAQD,QACC,oBAAC;EAA2B,OANRA,QAAM,eACnB;GAAE;GAAO;GAAS,GACzB,CAAC,OAAO,QAAQ,CAChB;EAIE;GAC2B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"block-fields-renderer.mjs","names":["React"],"sources":["../../../../src/client/components/blocks/block-fields-renderer.tsx"],"sourcesContent":["/**\n * Block Fields Renderer\n *\n * Renders form fields for a block inline (inside the block card).\n * Uses registered field components from the admin config.\n */\n\n\"use client\";\n\nimport * as React from \"react\";\nimport type { BlockSchema } from \"#questpie/admin/server\";\nimport type { FieldDefinition } from \"../../builder/field/field.js\";\nimport { useResolveText } from \"../../i18n/hooks.js\";\nimport { selectAdmin, useAdminStore } from \"../../runtime/index.js\";\nimport { buildFieldDefinitionsFromMetadata } from \"../../utils/build-field-definitions-from-schema.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type BlockFieldsRendererProps = {\n\t/** Block ID for scoping field names */\n\tblockId: string;\n\t/** Block schema containing field definitions */\n\tblockSchema: BlockSchema;\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function BlockFieldsRenderer({\n\tblockId,\n\tblockSchema,\n}: BlockFieldsRendererProps) {\n\tconst admin = useAdminStore(selectAdmin);\n\n\t// Convert block field metadata to field definitions with component references\n\tconst blockFields = React.useMemo(() => {\n\t\tif (!blockSchema?.fields || !admin) return {};\n\t\treturn buildFieldDefinitionsFromMetadata(\n\t\t\tblockSchema.fields as Record<\n\t\t\t\tstring,\n\t\t\t\t{ metadata?: unknown; name?: string }\n\t\t\t>,\n\t\t\tadmin.getFields() as any,\n\t\t);\n\t}, [blockSchema?.fields, admin]);\n\n\tif (Object.keys(blockFields).length === 0) {\n\t\treturn (\n\t\t\t<div className=\"text-center text-sm text-muted-foreground py-4\">\n\t\t\t\tThis block has no editable fields.\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t{Object.entries(blockFields).map(([fieldName, fieldDef]) => (\n\t\t\t\t<BlockField\n\t\t\t\t\t// Include blockId in key to ensure fresh Controller instances per block\n\t\t\t\t\tkey={`${blockId}:${fieldName}`}\n\t\t\t\t\tname={fieldName}\n\t\t\t\t\tblockId={blockId}\n\t\t\t\t\tdefinition={fieldDef}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</div>\n\t);\n}\n\n// ============================================================================\n// Individual Field\n// ============================================================================\n\ntype BlockFieldProps = {\n\tname: string;\n\tblockId: string;\n\tdefinition: FieldDefinition;\n};\n\nfunction BlockField({ name, blockId, definition }: BlockFieldProps) {\n\tconst resolveText = useResolveText();\n\tconst options = (definition as any)[\"~options\"] || {};\n\tconst fieldType = definition.name;\n\n\t// Resolve i18n texts\n\tconst label = resolveText(options.label, name);\n\tconst description = resolveText(options.description, \"\");\n\tconst placeholder = resolveText(options.placeholder, \"\");\n\n\t// Scope the field name to the block's values in the parent form\n\t// This ensures block fields don't conflict with collection-level fields\n\tconst scopedName = `content._values.${blockId}.${name}`;\n\n\t// Check if field has a registered component\n\tconst FieldComponent = definition.field?.component as\n\t\t| React.ComponentType<any>\n\t\t| undefined;\n\n\t// All fields should have a registered component (registry-first)\n\tif (!FieldComponent) {\n\t\treturn (\n\t\t\t<div className=\"text-sm text-destructive\">\n\t\t\t\tNo component registered for field type: {fieldType}\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst componentProps = {\n\t\tname: scopedName,\n\t\tlabel,\n\t\tdescription,\n\t\tplaceholder,\n\t\trequired: options.required ?? false,\n\t\tdisabled: options.disabled ?? false,\n\t\treadOnly: options.readOnly ?? false,\n\t\tlocalized: options.localized ?? false,\n\t\t...stripUiOptions(options),\n\t};\n\n\treturn <FieldComponent {...componentProps} />;\n}\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\n/**\n * Strip UI-specific options that shouldn't be passed to field components\n */\nfunction stripUiOptions(options: Record<string, any>) {\n\tconst {\n\t\tlabel: _label,\n\t\tdescription: _description,\n\t\tplaceholder: _placeholder,\n\t\trequired: _required,\n\t\tdisabled: _disabled,\n\t\treadOnly: _readOnly,\n\t\thidden: _hidden,\n\t\tvisible: _visible,\n\t\tlocalized: _localized,\n\t\tlocale: _locale,\n\t\tcompute: _compute,\n\t\tonChange: _onChange,\n\t\t...rest\n\t} = options;\n\treturn rest;\n}\n"],"mappings":";;;;;;;;;;;;;;;AA+BA,SAAgB,oBAAoB,EACnC,SACA,eAC4B;CAC5B,MAAM,QAAQ,cAAc,YAAY;CAGxC,MAAM,cAAcA,QAAM,cAAc;AACvC,MAAI,CAAC,aAAa,UAAU,CAAC,MAAO,QAAO,EAAE;AAC7C,SAAO,kCACN,YAAY,QAIZ,MAAM,WAAW,CACjB;IACC,CAAC,aAAa,QAAQ,MAAM,CAAC;AAEhC,KAAI,OAAO,KAAK,YAAY,CAAC,WAAW,EACvC,QACC,oBAAC;EAAI,WAAU;YAAiD;GAE1D;AAIR,QACC,oBAAC;EAAI,WAAU;YACb,OAAO,QAAQ,YAAY,CAAC,KAAK,CAAC,WAAW,cAC7C,oBAAC;GAGA,MAAM;GACG;GACT,YAAY;KAHP,GAAG,QAAQ,GAAG,YAIlB,CACD;GACG;;AAcR,SAAS,WAAW,EAAE,MAAM,SAAS,cAA+B;CACnE,MAAM,cAAc,gBAAgB;CACpC,MAAM,UAAW,WAAmB,eAAe,EAAE;CACrD,MAAM,YAAY,WAAW;CAG7B,MAAM,QAAQ,YAAY,QAAQ,OAAO,KAAK;CAC9C,MAAM,cAAc,YAAY,QAAQ,aAAa,GAAG;CACxD,MAAM,cAAc,YAAY,QAAQ,aAAa,GAAG;CAIxD,MAAM,aAAa,mBAAmB,QAAQ,GAAG;CAGjD,MAAM,iBAAiB,WAAW,OAAO;AAKzC,KAAI,CAAC,eACJ,QACC,qBAAC;EAAI,WAAU;aAA2B,4CACA;GACpC;AAgBR,QAAO,oBAAC;EAXP,MAAM;EACN;EACA;EACA;EACA,UAAU,QAAQ,YAAY;EAC9B,UAAU,QAAQ,YAAY;EAC9B,UAAU,QAAQ,YAAY;EAC9B,WAAW,QAAQ,aAAa;EAChC,GAAG,eAAe,QAAQ;GAGkB;;;;;AAU9C,SAAS,eAAe,SAA8B;CACrD,MAAM,EACL,OAAO,QACP,aAAa,cACb,aAAa,cACb,UAAU,WACV,UAAU,WACV,UAAU,WACV,QAAQ,SACR,SAAS,UACT,WAAW,YACX,QAAQ,SACR,SAAS,UACT,UAAU,WACV,GAAG,SACA;AACJ,QAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"block-insert-button.mjs","names":[],"sources":["../../../../src/client/components/blocks/block-insert-button.tsx"],"sourcesContent":["/**\n * Block Insert Button\n *\n * Button to add new blocks at a specific position.\n * Opens the block library sidebar.\n */\n\n\"use client\";\n\nimport { Icon } from \"@iconify/react\";\nimport { cn } from \"../../lib/utils.js\";\nimport { Button } from \"../ui/button.js\";\nimport { useBlockEditorActions } from \"./block-editor-context.js\";\nimport type { InsertPosition } from \"./utils/tree-utils.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type BlockInsertButtonProps = {\n\t/** Position where the block will be inserted */\n\tposition: InsertPosition;\n\t/** Compact style (shows on hover between blocks) */\n\tcompact?: boolean;\n\t/** Rail variant for nested blocks (shows \"Add to X\" label) */\n\tvariant?: \"default\" | \"compact\" | \"rail\";\n\t/** Parent block label (for rail variant) */\n\tparentLabel?: string;\n\t/** Custom class name */\n\tclassName?: string;\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function \tBlockInsertButton({\n\tposition,\n\tcompact = false,\n\tvariant = \"default\",\n\tparentLabel,\n\tclassName,\n}: BlockInsertButtonProps) {\n\tconst { openLibrary } = useBlockEditorActions();\n\n\tconst handleOpen = () => {\n\t\topenLibrary(position);\n\t};\n\n\t// Compact variant - thin hover line with add badge\n\tif (variant === \"compact\" || compact) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"group relative w-full cursor-pointer -my-0.5 z-10\",\n\t\t\t\t\t\"h-2 sm:h-1.5\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\trole=\"button\"\n\t\t\t\ttabIndex={0}\n\t\t\t\tonClick={handleOpen}\n\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\tif (e.key === \"Enter\" || e.key === \" \") {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\thandleOpen();\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{/* Hover indicator line */}\n\t\t\t\t<div className=\"absolute inset-x-0 top-1/2 h-0.5 -translate-y-1/2 bg-primary/40 transition-colors sm:bg-transparent sm:group-hover:bg-primary\" />\n\n\t\t\t\t{/* Add button that appears on hover */}\n\t\t\t\t<div className=\"pointer-events-none absolute inset-x-0 top-1/2 flex -translate-y-1/2 items-center justify-center opacity-100 transition-opacity sm:opacity-0 sm:group-hover:opacity-100\">\n\t\t\t\t\t<div className=\"pointer-events-auto flex items-center gap-1 rounded-full bg-primary px-2 py-0.5 text-xs text-primary-foreground shadow-sm cursor-pointer\">\n\t\t\t\t\t\t<Icon icon=\"ph:plus-bold\" width={10} height={10} />\n\t\t\t\t\t\t<span>Add</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n\n\t// Rail variant - for nested blocks with icon and label\n\tif (variant === \"rail\") {\n\t\treturn (\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"group flex items-center gap-2 text-xs font-medium text-muted-foreground hover:text-foreground transition-colors relative\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tonClick={handleOpen}\n\t\t\t>\n\n\t\t\t\t{/* Add button */}\n\t\t\t\t<div className=\"flex items-center justify-center w-5 h-5 rounded-full border border-border bg-background text-muted-foreground group-hover:border-foreground group-hover:text-foreground transition-all relative z-10\">\n\t\t\t\t\t<Icon icon=\"ph:plus\" className=\"w-3 h-3\" />\n\t\t\t\t</div>\n\n\t\t\t\t{/* Label */}\n\t\t\t\t<span className=\"truncate\">\n\t\t\t\t\t{parentLabel ? `Add to ${parentLabel}` : \"Add block\"}\n\t\t\t\t</span>\n\t\t\t</button>\n\t\t);\n\t}\n\n\t// Default variant - full button\n\treturn (\n\t\t<Button\n\t\t\tvariant=\"outline\"\n\t\t\tclassName={cn(\"w-full border-dashed\", className)}\n\t\t\tonClick={handleOpen}\n\t\t>\n\t\t\t<Icon icon=\"ph:plus\" className=\"mr-2 h-4 w-4\" />\n\t\t\tAdd block\n\t\t</Button>\n\t);\n}\n"],"mappings":";;;;;;;;;;;;;;;AAoCA,SAAiB,kBAAkB,EAClC,UACA,UAAU,OACV,UAAU,WACV,aACA,aAC0B;CAC1B,MAAM,EAAE,gBAAgB,uBAAuB;CAE/C,MAAM,mBAAmB;AACxB,cAAY,SAAS;;AAItB,KAAI,YAAY,aAAa,QAC5B,QACC,qBAAC;EACA,WAAW,GACV,qDACA,gBACA,UACA;EACD,MAAK;EACL,UAAU;EACV,SAAS;EACT,YAAY,MAAM;AACjB,OAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACvC,MAAE,gBAAgB;AAClB,gBAAY;;;aAKd,oBAAC,SAAI,WAAU,kIAAkI,EAGjJ,oBAAC;GAAI,WAAU;aACd,qBAAC;IAAI,WAAU;eACd,oBAAC;KAAK,MAAK;KAAe,OAAO;KAAI,QAAQ;MAAM,EACnD,oBAAC,oBAAK,QAAU;KACX;IACD;GACD;AAKR,KAAI,YAAY,OACf,QACC,qBAAC;EACA,MAAK;EACL,WAAW,GACV,4HACA,UACA;EACD,SAAS;aAIT,oBAAC;GAAI,WAAU;aACd,oBAAC;IAAK,MAAK;IAAU,WAAU;KAAY;IACtC,EAGN,oBAAC;GAAK,WAAU;aACd,cAAc,UAAU,gBAAgB;IACnC;GACC;AAKX,QACC,qBAAC;EACA,SAAQ;EACR,WAAW,GAAG,wBAAwB,UAAU;EAChD,SAAS;aAET,oBAAC;GAAK,MAAK;GAAU,WAAU;IAAiB;GAExC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"block-item-menu.mjs","names":["React"],"sources":["../../../../src/client/components/blocks/block-item-menu.tsx"],"sourcesContent":["/**\n * Block Item Menu\n *\n * Shared menu items for block context menu and dropdown.\n * Provides actions like duplicate, delete, add child, etc.\n */\n\n\"use client\";\n\nimport { Icon } from \"@iconify/react\";\nimport * as React from \"react\";\nimport { useTranslation } from \"../../i18n/hooks.js\";\nimport { Button } from \"../ui/button.js\";\nimport {\n\tContextMenu,\n\tContextMenuContent,\n\tContextMenuItem,\n\tContextMenuSeparator,\n\tContextMenuSub,\n\tContextMenuSubContent,\n\tContextMenuSubTrigger,\n\tContextMenuTrigger,\n} from \"../ui/context-menu.js\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuSeparator,\n\tDropdownMenuSub,\n\tDropdownMenuSubContent,\n\tDropdownMenuSubTrigger,\n\tDropdownMenuTrigger,\n} from \"../ui/dropdown-menu.js\";\nimport { useBlockEditor } from \"./block-editor-context.js\";\nimport { BlockTypeIcon } from \"./block-type-icon.js\";\nimport { findBlockById, findBlockPosition } from \"./utils/tree-utils.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface BlockItemMenuProps {\n\t/** Block ID */\n\tblockId: string;\n\t/** Whether this block can have children */\n\tcanHaveChildren: boolean;\n\t/** Callback for duplicate */\n\tonDuplicate: () => void;\n\t/** Callback for remove */\n\tonRemove: () => void;\n}\n\n// ============================================================================\n// Shared Menu Content\n// ============================================================================\n\ninterface MenuItemsProps extends BlockItemMenuProps {\n\t/** Render function for menu item */\n\tMenuItem: React.ComponentType<{\n\t\tonClick?: () => void;\n\t\tvariant?: \"default\" | \"destructive\";\n\t\tchildren: React.ReactNode;\n\t}>;\n\t/** Render function for separator */\n\tSeparator: React.ComponentType;\n\t/** Render function for submenu */\n\tSubMenu: React.ComponentType<{ children: React.ReactNode }>;\n\t/** Render function for submenu trigger */\n\tSubMenuTrigger: React.ComponentType<{ children: React.ReactNode }>;\n\t/** Render function for submenu content */\n\tSubMenuContent: React.ComponentType<{ children: React.ReactNode }>;\n\t/** Close the menu */\n\tonClose?: () => void;\n}\n\nfunction MenuItems({\n\tblockId,\n\tcanHaveChildren,\n\tonDuplicate,\n\tonRemove,\n\tMenuItem,\n\tSeparator,\n\tSubMenu,\n\tSubMenuTrigger,\n\tSubMenuContent,\n\tonClose,\n}: MenuItemsProps) {\n\tconst { t } = useTranslation();\n\tconst { state, actions } = useBlockEditor();\n\n\t// Get available block types for add actions\n\tconst blockTypes = React.useMemo(() => {\n\t\treturn Object.entries(state.blocks)\n\t\t\t.filter(([type]) => {\n\t\t\t\tif (!state.allowedBlocks) return true;\n\t\t\t\treturn state.allowedBlocks.includes(type);\n\t\t\t})\n\t\t\t.map(([type, def]) => ({\n\t\t\t\ttype,\n\t\t\t\tlabel: getBlockLabel(def),\n\t\t\t}))\n\t\t\t.sort((a, b) => a.label.localeCompare(b.label));\n\t}, [state.blocks, state.allowedBlocks]);\n\n\tconst blockPosition = React.useMemo(\n\t\t() => findBlockPosition(state.content._tree, blockId),\n\t\t[state.content._tree, blockId],\n\t);\n\n\tconst handleAddChild = (blockType: string) => {\n\t\t// Find current block to get children count\n\t\tconst block = findBlockById(state.content._tree, blockId);\n\t\tconst childrenCount = block?.children.length ?? 0;\n\n\t\tactions.addBlock(blockType, {\n\t\t\tparentId: blockId,\n\t\t\tindex: childrenCount,\n\t\t});\n\n\t\t// Make sure block is expanded\n\t\tif (!state.expandedBlockIds.has(blockId)) {\n\t\t\tactions.toggleExpanded(blockId);\n\t\t}\n\n\t\tonClose?.();\n\t};\n\n\tconst handleAddAbove = (blockType: string) => {\n\t\tif (!blockPosition) return;\n\t\tactions.addBlock(blockType, {\n\t\t\tparentId: blockPosition.parentId,\n\t\t\tindex: blockPosition.index,\n\t\t});\n\t\tonClose?.();\n\t};\n\n\tconst handleAddBelow = (blockType: string) => {\n\t\tif (!blockPosition) return;\n\t\tactions.addBlock(blockType, {\n\t\t\tparentId: blockPosition.parentId,\n\t\t\tindex: blockPosition.index + 1,\n\t\t});\n\t\tonClose?.();\n\t};\n\n\tconst handleDuplicate = () => {\n\t\tonDuplicate();\n\t\tonClose?.();\n\t};\n\n\tconst handleRemove = () => {\n\t\tonRemove();\n\t\tonClose?.();\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t{blockTypes.length > 0 && blockPosition && (\n\t\t\t\t<>\n\t\t\t\t\t<SubMenu>\n\t\t\t\t\t\t<SubMenuTrigger>\n\t\t\t\t\t\t\t<Icon icon=\"ph:arrow-up\" className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t{t(\"blocks.addAbove\")}\n\t\t\t\t\t\t</SubMenuTrigger>\n\t\t\t\t\t\t<SubMenuContent>\n\t\t\t\t\t\t\t{blockTypes.map(({ type, label }) => (\n\t\t\t\t\t\t\t\t<MenuItem key={type} onClick={() => handleAddAbove(type)}>\n\t\t\t\t\t\t\t\t\t<BlockTypeIcon type={type} className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t\t</MenuItem>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</SubMenuContent>\n\t\t\t\t\t</SubMenu>\n\t\t\t\t\t<SubMenu>\n\t\t\t\t\t\t<SubMenuTrigger>\n\t\t\t\t\t\t\t<Icon icon=\"ph:arrow-down\" className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t{t(\"blocks.addBelow\")}\n\t\t\t\t\t\t</SubMenuTrigger>\n\t\t\t\t\t\t<SubMenuContent>\n\t\t\t\t\t\t\t{blockTypes.map(({ type, label }) => (\n\t\t\t\t\t\t\t\t<MenuItem key={type} onClick={() => handleAddBelow(type)}>\n\t\t\t\t\t\t\t\t\t<BlockTypeIcon type={type} className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t\t</MenuItem>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</SubMenuContent>\n\t\t\t\t\t</SubMenu>\n\t\t\t\t\t{canHaveChildren && (\n\t\t\t\t\t\t<SubMenu>\n\t\t\t\t\t\t\t<SubMenuTrigger>\n\t\t\t\t\t\t\t\t<Icon icon=\"ph:plus\" className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t{t(\"blocks.addChild\")}\n\t\t\t\t\t\t\t</SubMenuTrigger>\n\t\t\t\t\t\t\t<SubMenuContent>\n\t\t\t\t\t\t\t\t{blockTypes.map(({ type, label }) => (\n\t\t\t\t\t\t\t\t\t<MenuItem key={type} onClick={() => handleAddChild(type)}>\n\t\t\t\t\t\t\t\t\t\t<BlockTypeIcon type={type} className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t\t\t</MenuItem>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</SubMenuContent>\n\t\t\t\t\t\t</SubMenu>\n\t\t\t\t\t)}\n\t\t\t\t\t<Separator />\n\t\t\t\t</>\n\t\t\t)}\n\n\t\t\t{/* Duplicate */}\n\t\t\t<MenuItem onClick={handleDuplicate}>\n\t\t\t\t<Icon icon=\"ph:copy\" className=\"h-4 w-4\" />\n\t\t\t\t{t(\"common.duplicate\")}\n\t\t\t</MenuItem>\n\n\t\t\t<Separator />\n\n\t\t\t{/* Delete */}\n\t\t\t<MenuItem variant=\"destructive\" onClick={handleRemove}>\n\t\t\t\t<Icon icon=\"ph:trash\" className=\"h-4 w-4\" />\n\t\t\t\t{t(\"common.delete\")}\n\t\t\t</MenuItem>\n\t\t</>\n\t);\n}\n\n// ============================================================================\n// Context Menu Wrapper\n// ============================================================================\n\nexport interface BlockItemContextMenuProps extends BlockItemMenuProps {\n\tchildren: React.ReactNode;\n}\n\nexport function BlockItemContextMenu({\n\tchildren,\n\t...menuProps\n}: BlockItemContextMenuProps) {\n\treturn (\n\t\t<ContextMenu>\n\t\t\t<ContextMenuTrigger className=\"block\">{children}</ContextMenuTrigger>\n\t\t\t<ContextMenuContent>\n\t\t\t\t<MenuItems\n\t\t\t\t\t{...menuProps}\n\t\t\t\t\tMenuItem={ContextMenuItem}\n\t\t\t\t\tSeparator={ContextMenuSeparator}\n\t\t\t\t\tSubMenu={ContextMenuSub}\n\t\t\t\t\tSubMenuTrigger={ContextMenuSubTrigger}\n\t\t\t\t\tSubMenuContent={ContextMenuSubContent}\n\t\t\t\t/>\n\t\t\t</ContextMenuContent>\n\t\t</ContextMenu>\n\t);\n}\n\n// ============================================================================\n// Dropdown Menu Button\n// ============================================================================\n\nexport interface BlockItemDropdownMenuProps extends BlockItemMenuProps {\n\tclassName?: string;\n}\n\nexport function BlockItemDropdownMenu({\n\tclassName,\n\t...menuProps\n}: BlockItemDropdownMenuProps) {\n\tconst [open, setOpen] = React.useState(false);\n\n\treturn (\n\t\t<DropdownMenu open={open} onOpenChange={setOpen}>\n\t\t\t<DropdownMenuTrigger\n\t\t\t\trender={\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tclassName={className}\n\t\t\t\t\t\tonClick={(e) => e.stopPropagation()}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t<Icon icon=\"ph:dots-three-vertical\" className=\"h-4 w-4\" />\n\t\t\t\t<span className=\"sr-only\">Block actions</span>\n\t\t\t</DropdownMenuTrigger>\n\t\t\t<DropdownMenuContent align=\"end\">\n\t\t\t\t<MenuItems\n\t\t\t\t\t{...menuProps}\n\t\t\t\t\tMenuItem={DropdownMenuItem}\n\t\t\t\t\tSeparator={DropdownMenuSeparator}\n\t\t\t\t\tSubMenu={DropdownMenuSub}\n\t\t\t\t\tSubMenuTrigger={DropdownMenuSubTrigger}\n\t\t\t\t\tSubMenuContent={DropdownMenuSubContent}\n\t\t\t\t\tonClose={() => setOpen(false)}\n\t\t\t\t/>\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nimport type { BlockSchema } from \"#questpie/admin/server\";\n\nfunction getBlockLabel(blockDef: BlockSchema): string {\n\tconst label = blockDef.admin?.label;\n\n\tif (!label) {\n\t\treturn blockDef.name || \"Block\";\n\t}\n\n\tif (typeof label === \"string\") {\n\t\treturn label;\n\t}\n\n\tif (\"key\" in label) {\n\t\treturn label.fallback || blockDef.name || \"Block\";\n\t}\n\n\t// I18nLocaleMap\n\treturn label.en || Object.values(label)[0] || blockDef.name || \"Block\";\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"block-item.mjs","names":["React"],"sources":["../../../../src/client/components/blocks/block-item.tsx"],"sourcesContent":["/**\n * Block Item\n *\n * Single block item with inline editable fields.\n * Click header to expand/collapse, drag handle for reordering.\n */\n\n\"use client\";\n\nimport { useSortable } from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport { Icon } from \"@iconify/react\";\nimport * as React from \"react\";\nimport type { BlockNode } from \"../../blocks/types.js\";\nimport { cn } from \"../../lib/utils.js\";\nimport { Card, CardContent, CardHeader } from \"../ui/card.js\";\nimport {\n\tuseBlockEditor,\n\tuseBlockSchema,\n\tuseIsBlockExpanded,\n} from \"./block-editor-context.js\";\nimport { BlockFieldsRenderer } from \"./block-fields-renderer.js\";\nimport { BlockInsertButton } from \"./block-insert-button.js\";\nimport { BlockItemDropdownMenu } from \"./block-item-menu.js\";\nimport { BlockTree } from \"./block-tree.js\";\nimport { BlockIcon } from \"./block-type-icon.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type BlockItemProps = {\n\t/** Block node data */\n\tblock: BlockNode;\n\t/** Nesting level (0 = root) */\n\tlevel: number;\n\t/** Index in parent's children */\n\tindex: number;\n\t/** Parent block ID (null = root) */\n\tparentId: string | null;\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function BlockItem({\n\tblock,\n\tlevel,\n\tindex: _index,\n\tparentId: _parentId,\n}: BlockItemProps) {\n\tconst { state, actions } = useBlockEditor();\n\tconst blockSchema = useBlockSchema(block.type);\n\tconst isExpanded = useIsBlockExpanded(block.id);\n\tconst canHaveChildren = blockSchema?.allowChildren ?? false;\n\n\t// Drag and drop\n\tconst {\n\t\tattributes,\n\t\tlisteners,\n\t\tsetNodeRef,\n\t\ttransform,\n\t\ttransition,\n\t\tisDragging,\n\t\tisOver,\n\t\tactive,\n\t} = useSortable({ id: block.id });\n\n\tconst style = {\n\t\ttransform: CSS.Transform.toString(transform),\n\t\ttransition,\n\t};\n\n\t// Show drop indicator when dragging over this item (but not self)\n\tconst showDropIndicator = isOver && active?.id !== block.id;\n\n\t// Get block label from values or definition\n\tconst values = state.content._values[block.id];\n\tconst blockLabel = getBlockLabel(block, blockSchema, values);\n\n\t// Handlers\n\tconst handleToggleExpand = (e: React.MouseEvent) => {\n\t\t// Don't toggle if clicking on drag handle or actions\n\t\tconst target = e.target as HTMLElement;\n\t\tif (\n\t\t\ttarget.closest(\"[data-drag-handle]\") ||\n\t\t\ttarget.closest(\"[data-actions-menu]\")\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tactions.toggleExpanded(block.id);\n\t};\n\n\tconst handleDuplicate = React.useCallback(() => {\n\t\tactions.duplicateBlock(block.id);\n\t}, [actions, block.id]);\n\n\tconst handleRemove = React.useCallback(() => {\n\t\tactions.removeBlock(block.id);\n\t}, [actions, block.id]);\n\n\t// Keyboard handler for header\n\tconst handleKeyDown = (e: React.KeyboardEvent) => {\n\t\tif (e.key === \"Enter\" || e.key === \" \") {\n\t\t\te.preventDefault();\n\t\t\tactions.toggleExpanded(block.id);\n\t\t}\n\t};\n\n\tconst isRoot = level === 0;\n\n\treturn (\n\t\t<div\n\t\t\tref={setNodeRef}\n\t\t\tstyle={style}\n\t\t\tclassName={cn(\"relative\", isDragging && \"opacity-50\")}\n\t\t>\n\t\t\t{/* Drop indicator line */}\n\t\t\t{showDropIndicator && (\n\t\t\t\t<div className=\"absolute -top-0.5 left-0 right-0 z-10 h-0.5 bg-primary\" />\n\t\t\t)}\n\n\t\t\t{/* Block card */}\n\t\t\t<Card\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"overflow-hidden transition-shadow p-0 gap-0\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{/* Header - clickable to expand/collapse */}\n\t\t\t\t<CardHeader\n\t\t\t\t\trole=\"button\"\n\t\t\t\t\ttabIndex={0}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"group flex flex-row items-center gap-2 px-3 py-2 cursor-pointer select-none\",\n\t\t\t\t\t\t\"hover:bg-muted/50 transition-colors\",\n\t\t\t\t\t\t\"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-inset\",\n\t\t\t\t\t)}\n\t\t\t\t\tonClick={handleToggleExpand}\n\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t>\n\t\t\t\t\t{/* Drag handle */}\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tdata-drag-handle\n\t\t\t\t\t\tclassName=\"cursor-grab active:cursor-grabbing p-1 -ml-1 rounded hover:bg-muted\"\n\t\t\t\t\t\t{...attributes}\n\t\t\t\t\t\t{...listeners}\n\t\t\t\t\t\tonClick={(e) => e.stopPropagation()}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\ticon=\"ph:dots-six-vertical\"\n\t\t\t\t\t\t\tclassName=\"h-4 w-4 text-muted-foreground\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</button>\n\n\t\t\t\t\t{/* Expand/collapse icon */}\n\t\t\t\t\t<div className=\"text-muted-foreground\">\n\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\ticon={\"ph:caret-right\"}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"h-4 w-4 transition-transform duration-150 ease-in-out\",\n\t\t\t\t\t\t\t\tisExpanded && \"rotate-90\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Block icon */}\n\t\t\t\t\t<BlockIcon\n\t\t\t\t\t\ticon={blockSchema?.admin?.icon}\n\t\t\t\t\t\tsize={14}\n\t\t\t\t\t\tclassName={isRoot ? \"text-foreground\" : \"text-muted-foreground\"}\n\t\t\t\t\t/>\n\n\t\t\t\t\t{/* Block label */}\n\t\t\t\t\t<div className=\"flex-1 min-w-0 flex items-baseline gap-2\">\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"text-sm font-medium truncate\",\n\t\t\t\t\t\t\t\tisRoot ? \"text-foreground\" : \"text-foreground/90\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{blockLabel}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{/* Show preview text if available */}\n\t\t\t\t\t\t{values && (\n\t\t\t\t\t\t\t<span className=\"text-xs text-muted-foreground truncate hidden sm:inline\">\n\t\t\t\t\t\t\t\t{getPreviewText(values)}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Actions menu */}\n\t\t\t\t\t<div data-actions-menu>\n\t\t\t\t\t\t<BlockItemDropdownMenu\n\t\t\t\t\t\t\tblockId={block.id}\n\t\t\t\t\t\t\tcanHaveChildren={canHaveChildren}\n\t\t\t\t\t\t\tonDuplicate={handleDuplicate}\n\t\t\t\t\t\t\tonRemove={handleRemove}\n\t\t\t\t\t\t\tclassName=\"h-7 w-7 opacity-0 group-hover:opacity-100 transition-opacity\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</CardHeader>\n\n\t\t\t\t{/* Body with inline fields - only when expanded */}\n\t\t\t\t{isExpanded && blockSchema && (\n\t\t\t\t\t<CardContent className={cn(\"p-3\", !isRoot && \"py-2\")}>\n\t\t\t\t\t\t<BlockFieldsRenderer blockId={block.id} blockSchema={blockSchema} />\n\t\t\t\t\t</CardContent>\n\t\t\t\t)}\n\t\t\t</Card>\n\n\t\t\t{/* Children with rail */}\n\t\t\t{canHaveChildren && isExpanded && block.children.length > 0 && (\n\t\t\t\t<div className=\"relative\">\n\t\t\t\t\t{/* Rail line */}\n\t\t\t\t\t<div className=\"absolute left-3 top-0 bottom-0 w-px bg-border\" />\n\t\t\t\t\t<div className=\"pl-8 pt-2 space-y-2\">\n\t\t\t\t\t\t<BlockTree\n\t\t\t\t\t\t\tblocks={block.children}\n\t\t\t\t\t\t\tlevel={level + 1}\n\t\t\t\t\t\t\tparentId={block.id}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Add child button - only for blocks that can have children */}\n\t\t\t{canHaveChildren && isExpanded && (\n\t\t\t\t<div className=\"pl-8 relative mt-2\">\n\t\t\t\t\t<div className=\"absolute left-3 -top-2 w-px h-[calc(50%+8px)] bg-border\" />\n\t\t\t\t\t{/* Horizontal rail connector */}\n\t\t\t\t\t<div className=\"absolute left-3 top-1/2 w-5 h-px bg-border\" />\n\t\t\t\t\t<BlockInsertButton\n\t\t\t\t\t\tposition={{ parentId: block.id, index: block.children.length }}\n\t\t\t\t\t\tvariant=\"rail\"\n\t\t\t\t\t\tparentLabel={blockLabel}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nimport type { BlockSchema } from \"#questpie/admin/server\";\n\nfunction getBlockLabel(\n\tblock: BlockNode,\n\tblockSchema: BlockSchema | undefined,\n\tvalues: Record<string, unknown> | undefined,\n): string {\n\t// Try to get meaningful label from values\n\tif (values) {\n\t\tconst title = values.title || values.name || values.label || values.heading;\n\t\tif (title && typeof title === \"string\") {\n\t\t\treturn title.slice(0, 50);\n\t\t}\n\t}\n\n\t// Fall back to block type label\n\tconst label = blockSchema?.admin?.label;\n\tif (label) {\n\t\t// Handle string directly\n\t\tif (typeof label === \"string\") {\n\t\t\treturn label;\n\t\t}\n\n\t\t// Handle key-based translation object\n\t\tif (\"key\" in label) {\n\t\t\treturn label.fallback || block.type;\n\t\t}\n\n\t\t// Handle I18nLocaleMap - use English or first available\n\t\tconst localeLabel = label.en;\n\t\tif (localeLabel) {\n\t\t\treturn localeLabel;\n\t\t}\n\t\tconst firstValue = Object.values(label)[0];\n\t\tif (typeof firstValue === \"string\") {\n\t\t\treturn firstValue;\n\t\t}\n\t}\n\n\t// Fall back to type name\n\treturn block.type.charAt(0).toUpperCase() + block.type.slice(1);\n}\n\nfunction getPreviewText(values: Record<string, unknown>): string {\n\t// Extract a short preview from common fields\n\tconst previewFields = [\n\t\t\"subtitle\",\n\t\t\"description\",\n\t\t\"text\",\n\t\t\"caption\",\n\t\t\"summary\",\n\t];\n\tfor (const field of previewFields) {\n\t\tconst value = values[field];\n\t\tif (value && typeof value === \"string\") {\n\t\t\tconst text = value.slice(0, 60);\n\t\t\treturn text.length < (value as string).length ? `${text}...` : text;\n\t\t}\n\t}\n\treturn \"\";\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"block-library-sidebar.mjs","names":["React","uncategorizedConfig: BlockCategoryConfig","key: string","config: BlockCategoryConfig"],"sources":["../../../../src/client/components/blocks/block-library-sidebar.tsx"],"sourcesContent":["/**\n * Block Library Sidebar\n *\n * Drawer component for selecting block types to add.\n * Uses shadcn Sheet component for mobile-friendly sidebar.\n */\n\n\"use client\";\n\nimport { Icon } from \"@iconify/react\";\nimport * as React from \"react\";\nimport type { BlockCategoryConfig, BlockSchema } from \"#questpie/admin/server\";\nimport { cn } from \"../../lib/utils.js\";\nimport { Input } from \"../ui/input.js\";\nimport {\n\tSheet,\n\tSheetContent,\n\tSheetDescription,\n\tSheetHeader,\n\tSheetTitle,\n} from \"../ui/sheet.js\";\nimport {\n\tuseBlockEditorActions,\n\tuseBlockEditorState,\n} from \"./block-editor-context.js\";\nimport { BlockIcon } from \"./block-type-icon.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type BlockLibrarySidebarProps = {\n\t/** Whether the sidebar is open */\n\topen: boolean;\n\t/** Callback when sidebar closes */\n\tonClose: () => void;\n};\n\ntype BlockWithName = BlockSchema & { name: string };\n\ntype CategoryInfo = {\n\tkey: string;\n\tconfig: BlockCategoryConfig;\n\tblocks: BlockWithName[];\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function BlockLibrarySidebar({\n\topen,\n\tonClose,\n}: BlockLibrarySidebarProps) {\n\tconst state = useBlockEditorState();\n\tconst actions = useBlockEditorActions();\n\tconst [search, setSearch] = React.useState(\"\");\n\n\t// Group blocks by category\n\tconst categories = React.useMemo(() => {\n\t\tconst categoryMap = new Map<string, CategoryInfo>();\n\n\t\t// Default uncategorized category\n\t\tconst uncategorizedConfig: BlockCategoryConfig = {\n\t\t\tlabel: { en: \"Other\" },\n\t\t\torder: 999,\n\t\t};\n\n\t\tfor (const [name, def] of Object.entries(state.blocks)) {\n\t\t\t// Filter by allowed blocks\n\t\t\tif (state.allowedBlocks && !state.allowedBlocks.includes(name)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Skip hidden blocks\n\t\t\tif (def.admin?.hidden) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Filter by search\n\t\t\tif (search) {\n\t\t\t\tconst label = getBlockDisplayLabel(def);\n\t\t\t\tif (!label.toLowerCase().includes(search.toLowerCase())) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst categoryConfig = def.admin?.category;\n\t\t\tlet key: string;\n\t\t\tlet config: BlockCategoryConfig;\n\n\t\t\tif (categoryConfig) {\n\t\t\t\tkey = getCategoryKey(categoryConfig);\n\t\t\t\tconfig = categoryConfig;\n\t\t\t} else {\n\t\t\t\tkey = \"uncategorized\";\n\t\t\t\tconfig = uncategorizedConfig;\n\t\t\t}\n\n\t\t\tif (!categoryMap.has(key)) {\n\t\t\t\tcategoryMap.set(key, { key, config, blocks: [] });\n\t\t\t}\n\t\t\tcategoryMap.get(key)?.blocks.push({ ...def, name });\n\t\t}\n\n\t\t// Convert to array and sort\n\t\tconst result = Array.from(categoryMap.values());\n\n\t\t// Sort categories by order\n\t\tresult.sort((a, b) => (a.config.order ?? 999) - (b.config.order ?? 999));\n\n\t\t// Sort blocks within each category by order\n\t\tfor (const category of result) {\n\t\t\tcategory.blocks.sort(\n\t\t\t\t(a, b) => (a.admin?.order ?? 999) - (b.admin?.order ?? 999),\n\t\t\t);\n\t\t}\n\n\t\treturn result;\n\t}, [state.blocks, state.allowedBlocks, search]);\n\n\t// Focus search on open\n\tconst searchInputRef = React.useRef<HTMLInputElement>(null);\n\tReact.useEffect(() => {\n\t\tif (open) {\n\t\t\tconst timer = setTimeout(() => searchInputRef.current?.focus(), 100);\n\t\t\treturn () => clearTimeout(timer);\n\t\t}\n\t}, [open]);\n\n\t// Handle block selection\n\tconst handleSelectBlock = (type: string) => {\n\t\tif (state.insertPosition) {\n\t\t\tactions.addBlock(type, state.insertPosition);\n\t\t}\n\t\tonClose();\n\t\tsetSearch(\"\");\n\t};\n\n\treturn (\n\t\t<Sheet open={open} onOpenChange={onClose}>\n\t\t\t<SheetContent side=\"left\" className=\"w-full sm:max-w-md flex flex-col\">\n\t\t\t\t<SheetHeader className=\"space-y-2\">\n\t\t\t\t\t<SheetTitle>Add Block</SheetTitle>\n\t\t\t\t\t<SheetDescription>\n\t\t\t\t\t\tSelect a block type to add to your content\n\t\t\t\t\t</SheetDescription>\n\t\t\t\t</SheetHeader>\n\n\t\t\t\t{/* Search */}\n\t\t\t\t<div className=\"px-6 py-4\">\n\t\t\t\t\t<div className=\"relative\">\n\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\ticon=\"ph:magnifying-glass\"\n\t\t\t\t\t\t\tclassName=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\tref={searchInputRef}\n\t\t\t\t\t\t\tplaceholder=\"Search blocks...\"\n\t\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\t\tonChange={(e) => setSearch(e.target.value)}\n\t\t\t\t\t\t\tclassName=\"pl-9\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Block list by category */}\n\t\t\t\t<div className=\"flex-1 overflow-y-auto px-6 pb-6\">\n\t\t\t\t\t{categories.length === 0 ? (\n\t\t\t\t\t\t<div className=\"flex flex-col items-center justify-center py-12 text-center\">\n\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\ticon=\"ph:cube\"\n\t\t\t\t\t\t\t\tclassName=\"h-12 w-12 text-muted-foreground/50 mb-4\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">No blocks found</p>\n\t\t\t\t\t\t\t{search && (\n\t\t\t\t\t\t\t\t<p className=\"text-xs text-muted-foreground mt-1\">\n\t\t\t\t\t\t\t\t\tTry a different search term\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<div className=\"space-y-6\">\n\t\t\t\t\t\t\t{categories.map((category) => (\n\t\t\t\t\t\t\t\t<div key={category.key}>\n\t\t\t\t\t\t\t\t\t{/* Category header */}\n\t\t\t\t\t\t\t\t\t<div className=\"mb-3 flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t{category.config.icon && (\n\t\t\t\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\t\t\t\ticon={category.config.icon.props.name as string}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"h-4 w-4 text-muted-foreground\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t<h4 className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t{getCategoryDisplayLabel(category.config)}\n\t\t\t\t\t\t\t\t\t\t</h4>\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t{/* Blocks grid */}\n\t\t\t\t\t\t\t\t\t<div className=\"grid grid-cols-2 gap-2\">\n\t\t\t\t\t\t\t\t\t\t{category.blocks.map((block) => (\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\tkey={block.name}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"flex flex-col items-start gap-2 rounded-md border p-3 text-left\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"transition-colors hover:border-primary hover:bg-accent\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"focus:outline-none focus-visible:ring-2 focus-visible:ring-primary\",\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleSelectBlock(block.name)}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<BlockIcon\n\t\t\t\t\t\t\t\t\t\t\t\t\ticon={block.admin?.icon}\n\t\t\t\t\t\t\t\t\t\t\t\t\tsize={20}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-muted-foreground\"\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"min-w-0\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<p className=\"text-sm font-medium truncate\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{getBlockDisplayLabel(block)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{block.admin?.description && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p className=\"text-xs text-muted-foreground line-clamp-2 mt-0.5\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{getDescriptionText(block.admin.description)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</SheetContent>\n\t\t</Sheet>\n\t);\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nimport type { I18nText } from \"../../i18n/types.js\";\n\nfunction getBlockDisplayLabel(block: BlockSchema & { name: string }): string {\n\tconst label = block.admin?.label;\n\n\tif (!label) {\n\t\treturn block.name;\n\t}\n\n\tif (typeof label === \"string\") {\n\t\treturn label;\n\t}\n\n\tif (\"key\" in label) {\n\t\treturn label.fallback || block.name;\n\t}\n\n\t// I18nLocaleMap\n\treturn label.en || Object.values(label)[0] || block.name;\n}\n\nfunction getCategoryKey(config: BlockCategoryConfig): string {\n\tconst { label } = config;\n\n\tif (typeof label === \"string\") {\n\t\treturn label.toLowerCase().replace(/\\s+/g, \"-\");\n\t}\n\n\tif (\"key\" in label) {\n\t\treturn label.key.toLowerCase().replace(/[.:]/g, \"-\");\n\t}\n\n\t// I18nLocaleMap\n\tconst text = label.en ?? Object.values(label)[0] ?? \"\";\n\treturn text.toLowerCase().replace(/\\s+/g, \"-\");\n}\n\nfunction getCategoryDisplayLabel(config: BlockCategoryConfig): string {\n\tconst { label } = config;\n\n\tif (typeof label === \"string\") {\n\t\treturn label;\n\t}\n\n\tif (\"key\" in label) {\n\t\treturn label.fallback || label.key;\n\t}\n\n\t// I18nLocaleMap\n\treturn label.en || Object.values(label)[0] || \"Other\";\n}\n\nfunction getDescriptionText(description: I18nText | undefined): string {\n\tif (!description) return \"\";\n\n\tif (typeof description === \"string\") {\n\t\treturn description;\n\t}\n\n\tif (typeof description === \"function\") {\n\t\treturn \"\";\n\t}\n\n\tif (\"key\" in description) {\n\t\treturn description.fallback || \"\";\n\t}\n\n\tconst localeMap = description as Record<string, string>;\n\treturn localeMap.en || Object.values(localeMap)[0] || \"\";\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"block-tree.mjs","names":["React"],"sources":["../../../../src/client/components/blocks/block-tree.tsx"],"sourcesContent":["/**\n * Block Tree\n *\n * Renders a list of blocks with drag-and-drop support and rail visual for hierarchy.\n */\n\n\"use client\";\n\nimport {\n\tSortableContext,\n\tverticalListSortingStrategy,\n} from \"@dnd-kit/sortable\";\nimport * as React from \"react\";\nimport type { BlockNode } from \"../../blocks/types.js\";\nimport { cn } from \"../../lib/utils.js\";\nimport { BlockInsertButton } from \"./block-insert-button.js\";\nimport { BlockItem } from \"./block-item.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type BlockTreeProps = {\n\t/** Block nodes to render */\n\tblocks: BlockNode[];\n\t/** Nesting level (0 = root) */\n\tlevel: number;\n\t/** Parent block ID (null = root) */\n\tparentId: string | null;\n\t/** Custom class name */\n\tclassName?: string;\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function BlockTree({\n\tblocks,\n\tlevel,\n\tparentId,\n\tclassName,\n}: BlockTreeProps) {\n\t// Get block IDs for sortable context\n\tconst blockIds = React.useMemo(() => blocks.map((b) => b.id), [blocks]);\n\n\tconst isRoot = level === 0;\n\n\treturn (\n\t\t<div className={cn(\"space-y-2\", className)}>\n\t\t\t<SortableContext items={blockIds} strategy={verticalListSortingStrategy}>\n\t\t\t\t{blocks.map((block, index) => (\n\t\t\t\t\t<BlockItem\n\t\t\t\t\t\tkey={block.id}\n\t\t\t\t\t\tblock={block}\n\t\t\t\t\t\tlevel={level}\n\t\t\t\t\t\tindex={index}\n\t\t\t\t\t\tparentId={parentId}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</SortableContext>\n\n\t\t\t{/* Add block at end - only for root level */}\n\t\t\t{isRoot && (\n\t\t\t\t<div className=\"mt-4\">\n\t\t\t\t\t<BlockInsertButton\n\t\t\t\t\t\tposition={{ parentId, index: blocks.length }}\n\t\t\t\t\t\tvariant=\"default\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n"],"mappings":";;;;;;;;;;;;;;;AAqCA,SAAgB,UAAU,EACzB,QACA,OACA,UACA,aACkB;CAElB,MAAM,WAAWA,QAAM,cAAc,OAAO,KAAK,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC;CAEvE,MAAM,SAAS,UAAU;AAEzB,QACC,qBAAC;EAAI,WAAW,GAAG,aAAa,UAAU;aACzC,oBAAC;GAAgB,OAAO;GAAU,UAAU;aAC1C,OAAO,KAAK,OAAO,UACnB,oBAAC;IAEO;IACA;IACA;IACG;MAJL,MAAM,GAKV,CACD;IACe,EAGjB,UACA,oBAAC;GAAI,WAAU;aACd,oBAAC;IACA,UAAU;KAAE;KAAU,OAAO,OAAO;KAAQ;IAC5C,SAAQ;KACP;IACG;GAEF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"block-type-icon.mjs","names":[],"sources":["../../../../src/client/components/blocks/block-type-icon.tsx"],"sourcesContent":["/**\n * Block Type Icon\n *\n * Displays the icon for a block type using component references.\n */\n\n\"use client\";\n\nimport type { ComponentReference } from \"#questpie/admin/server\";\nimport { ComponentRenderer } from \"../../components/component-renderer\";\nimport { cn } from \"../../lib/utils.js\";\nimport { useBlockDefinition } from \"./block-editor-context.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type BlockTypeIconProps = {\n\t/** Block type name */\n\ttype: string;\n\t/** Custom class name */\n\tclassName?: string;\n\t/** Icon size */\n\tsize?: number;\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function BlockTypeIcon({\n\ttype,\n\tclassName,\n\tsize = 16,\n}: BlockTypeIconProps) {\n\tconst blockDef = useBlockDefinition(type);\n\tconst iconRef = blockDef?.admin?.icon;\n\n\t// Use BlockIcon which provides default cube icon\n\treturn <BlockIcon icon={iconRef} className={className} size={size} />;\n}\n\n/**\n * Standalone icon component that doesn't require context.\n * Useful for rendering icons outside the editor.\n * Shows a default cube icon if no icon is provided.\n */\nexport function BlockIcon({\n\ticon,\n\tclassName,\n\tsize = 16,\n}: {\n\ticon?: ComponentReference | string;\n\tclassName?: string;\n\tsize?: number;\n}) {\n\tconst reference = normalizeIconReference(icon);\n\n\t// Use default cube icon if no icon provided\n\tconst finalReference = reference ?? {\n\t\ttype: \"icon\",\n\t\tprops: { name: \"ph:cube\" },\n\t};\n\n\treturn (\n\t\t<ComponentRenderer\n\t\t\treference={finalReference}\n\t\t\tadditionalProps={{ className: cn(\"shrink-0\", className), size }}\n\t\t/>\n\t);\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction normalizeIconReference(\n\ticon?: ComponentReference | string,\n): ComponentReference | undefined {\n\tif (!icon) return undefined;\n\tif (typeof icon === \"string\") {\n\t\treturn { type: \"icon\", props: { name: icon } };\n\t}\n\treturn icon;\n}\n"],"mappings":";;;;;;;;;;;;;AA8BA,SAAgB,cAAc,EAC7B,MACA,WACA,OAAO,MACe;CAEtB,MAAM,UADW,mBAAmB,KAAK,EACf,OAAO;AAGjC,QAAO,oBAAC;EAAU,MAAM;EAAoB;EAAiB;GAAQ;;;;;;;AAQtE,SAAgB,UAAU,EACzB,MACA,WACA,OAAO,MAKL;AASF,QACC,oBAAC;EACA,WAVgB,uBAAuB,KAAK,IAGV;GACnC,MAAM;GACN,OAAO,EAAE,MAAM,WAAW;GAC1B;EAKC,iBAAiB;GAAE,WAAW,GAAG,YAAY,UAAU;GAAE;GAAM;GAC9D;;AAQJ,SAAS,uBACR,MACiC;AACjC,KAAI,CAAC,KAAM,QAAO;AAClB,KAAI,OAAO,SAAS,SACnB,QAAO;EAAE,MAAM;EAAQ,OAAO,EAAE,MAAM,MAAM;EAAE;AAE/C,QAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tree-utils.mjs","names":["removedIds: string[]","newIds: string[]","newValues: Record<string, Record<string, unknown>>","ids: string[]","values: Record<string, unknown>"],"sources":["../../../../../src/client/components/blocks/utils/tree-utils.ts"],"sourcesContent":["/**\n * Block Tree Utilities\n *\n * Functions for manipulating the block tree structure.\n * All functions are pure and return new objects.\n */\n\nimport { arrayMove } from \"@dnd-kit/sortable\";\nimport type { BlockNode } from \"../../../blocks/types.js\";\n\n/**\n * Position where a block should be inserted.\n */\nexport type InsertPosition = {\n /** Parent block ID (null = root level) */\n parentId: string | null;\n /** Index within parent's children or root */\n index: number;\n};\n\n/**\n * Find a block by ID in the tree.\n */\nexport function findBlockById(tree: BlockNode[], id: string): BlockNode | null {\n for (const node of tree) {\n if (node.id === id) return node;\n const found = findBlockById(node.children, id);\n if (found) return found;\n }\n return null;\n}\n\n/**\n * Find a block's position (parent and index) in the tree.\n */\nexport function findBlockPosition(\n tree: BlockNode[],\n id: string,\n parentId: string | null = null,\n): InsertPosition | null {\n for (let i = 0; i < tree.length; i++) {\n const node = tree[i];\n if (node.id === id) {\n return { parentId, index: i };\n }\n const found = findBlockPosition(node.children, id, node.id);\n if (found) return found;\n }\n return null;\n}\n\n/**\n * Insert a block at the specified position.\n */\nexport function insertBlockInTree(\n tree: BlockNode[],\n block: BlockNode,\n position: InsertPosition,\n): BlockNode[] {\n if (position.parentId === null) {\n // Insert at root level\n const newTree = [...tree];\n newTree.splice(position.index, 0, block);\n return newTree;\n }\n\n // Insert as child of parent\n return tree.map((node) => {\n if (node.id === position.parentId) {\n const newChildren = [...node.children];\n newChildren.splice(position.index, 0, block);\n return { ...node, children: newChildren };\n }\n return {\n ...node,\n children: insertBlockInTree(node.children, block, position),\n };\n });\n}\n\n/**\n * Remove a block and all its children from the tree.\n * Returns the new tree and list of removed block IDs.\n */\nexport function removeBlockFromTree(\n tree: BlockNode[],\n id: string,\n): { newTree: BlockNode[]; removedIds: string[] } {\n const removedIds: string[] = [];\n\n function collectIds(node: BlockNode) {\n removedIds.push(node.id);\n node.children.forEach(collectIds);\n }\n\n function remove(nodes: BlockNode[]): BlockNode[] {\n return nodes\n .filter((node) => {\n if (node.id === id) {\n collectIds(node);\n return false;\n }\n return true;\n })\n .map((node) => ({\n ...node,\n children: remove(node.children),\n }));\n }\n\n return { newTree: remove(tree), removedIds };\n}\n\n/**\n * Move a block to a new position in the tree (remove + insert).\n * Used for cross-parent moves (e.g., from context menu).\n */\nexport function moveBlockInTree(\n tree: BlockNode[],\n blockId: string,\n toPosition: InsertPosition,\n): BlockNode[] {\n // Find and remove block\n const block = findBlockById(tree, blockId);\n if (!block) return tree;\n\n const { newTree } = removeBlockFromTree(tree, blockId);\n\n // Insert at new position\n return insertBlockInTree(newTree, block, toPosition);\n}\n\n/**\n * Reorder a block within the same parent using arrayMove.\n * Used for DnD reordering — avoids remove+insert index shifting issues.\n */\nexport function reorderBlockInTree(\n tree: BlockNode[],\n parentId: string | null,\n fromIndex: number,\n toIndex: number,\n): BlockNode[] {\n if (parentId === null) {\n return arrayMove(tree, fromIndex, toIndex);\n }\n\n return tree.map((node) => {\n if (node.id === parentId) {\n return {\n ...node,\n children: arrayMove(node.children, fromIndex, toIndex),\n };\n }\n return {\n ...node,\n children: reorderBlockInTree(node.children, parentId, fromIndex, toIndex),\n };\n });\n}\n\n/**\n * Duplicate a block and all its children.\n * Returns the new tree, list of new IDs, and new values.\n */\nexport function duplicateBlockInTree(\n tree: BlockNode[],\n values: Record<string, Record<string, unknown>>,\n blockId: string,\n): {\n newTree: BlockNode[];\n newIds: string[];\n newValues: Record<string, Record<string, unknown>>;\n} {\n const block = findBlockById(tree, blockId);\n if (!block) {\n return { newTree: tree, newIds: [], newValues: {} };\n }\n\n const newIds: string[] = [];\n const newValues: Record<string, Record<string, unknown>> = {};\n\n function cloneNode(node: BlockNode): BlockNode {\n const newId = crypto.randomUUID();\n newIds.push(newId);\n newValues[newId] = { ...values[node.id] };\n\n return {\n id: newId,\n type: node.type,\n children: node.children.map(cloneNode),\n };\n }\n\n const clonedBlock = cloneNode(block);\n\n // Find parent and index\n const position = findBlockPosition(tree, blockId);\n if (!position) {\n return { newTree: tree, newIds: [], newValues: {} };\n }\n\n // Insert after original\n const newTree = insertBlockInTree(tree, clonedBlock, {\n parentId: position.parentId,\n index: position.index + 1,\n });\n\n return { newTree, newIds, newValues };\n}\n\n/**\n * Get all block IDs in the tree (flattened).\n */\nexport function getAllBlockIds(tree: BlockNode[]): string[] {\n const ids: string[] = [];\n\n function collect(nodes: BlockNode[]) {\n for (const node of nodes) {\n ids.push(node.id);\n collect(node.children);\n }\n }\n\n collect(tree);\n return ids;\n}\n\n/**\n * Count total blocks in the tree.\n */\nexport function countBlocks(tree: BlockNode[]): number {\n let count = 0;\n\n function traverse(nodes: BlockNode[]) {\n for (const node of nodes) {\n count++;\n traverse(node.children);\n }\n }\n\n traverse(tree);\n return count;\n}\n\n/**\n * Get default values for block fields.\n */\nexport function getDefaultValues(\n fields:\n | Record<string, { \"~options\"?: { defaultValue?: unknown } }>\n | undefined,\n): Record<string, unknown> {\n if (!fields) return {};\n\n const values: Record<string, unknown> = {};\n\n for (const [key, field] of Object.entries(fields)) {\n const defaultValue = field[\"~options\"]?.defaultValue;\n if (defaultValue !== undefined) {\n values[key] = defaultValue;\n }\n }\n\n return values;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"component-renderer.d.mts","names":[],"sources":["../../../src/client/components/component-renderer.tsx"],"sourcesContent":[],"mappings":";;;;;;;;;AA+FgB,UAnEC,gBAAA,CAmEK;EAAY;EA0BtB,IAAA,EAAA,MAAA;EAYK;EAEL,IAAA,CAAA,EAAA,MAAA,GAAA,MAAA;EAEA;EAEA,SAAM,CAAA,EAAA,MAAA;EAEC;EAAM,KAAA,CAAA,EAAA,MAAA;AA2BzB;;;;;;;;AAoCA;AAqBA;;AAGI,iBAnLY,WAAA,CAmLN;EAAA,IAAA;EAAA,IAAA;EAAA,SAAA;EAAA;AAAA,CAAA,EA9KP,gBA8KO,CAAA,EA9KY,OAAA,CAAM,YA8KlB;;;;AAMQ,UAjKD,UAAA,CAiKC;EAgDF;EAA8B,IAAA,EAAA,MAAA;EAGzC;EACA,KAAM,CAAA,EAAA,SAAA,GAAA,SAAA,GAAA,WAAA,GAAA,aAAA,GAAA,SAAA,GAAA,SAAA;EAID;EACN,SAAM,CAAA,EAAA,MAAA;;;;;iBAxMM,KAAA;;;;GAIb,aAAa,OAAA,CAAM;;;;KA0BV,yBAAA,GAA4B,eAEvC,OAAA,CAAM;;;;UAUU,sBAAA;;aAEL;;aAEA;;aAEA,OAAA,CAAM;;oBAEC;;;;;;;;;;;;;;;;;;;;;;;;;;iBA2BH,iBAAA;;;;;GAKb,yBAAyB,OAAA,CAAM;;;;iBA+BlB,oBAAA,2BAEJ;;;;;;;;;iBAmBI,kBAAA,OAEZ,qBACA,OAAA,CAAM,wDAID,oCACG,4BACT,OAAA,CAAM;;;;;;;;iBAgDO,kBAAA,YAA8B,mCAGzC,qBACA,OAAA,CAAM,wDAID,4BACN,OAAA,CAAM"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"component-renderer.mjs","names":["colorClasses: Record<string, string>","React"],"sources":["../../../src/client/components/component-renderer.tsx"],"sourcesContent":["/**\n * Component Renderer\n *\n * Resolves server-defined component references to React components.\n * This is the bridge between server config (serializable references)\n * and client rendering (React components).\n *\n * @example\n * ```tsx\n * // Server sends: { type: \"icon\", props: { name: \"ph:users\" } }\n * // Client renders: <IconifyIcon name=\"ph:users\" />\n *\n * <ComponentRenderer reference={{ type: \"icon\", props: { name: \"ph:users\" } }} />\n * ```\n */\n\nimport { Icon } from \"@iconify/react\";\nimport * as React from \"react\";\nimport type { ComponentReference } from \"#questpie/admin/server\";\nimport { selectAdmin, useAdminStore } from \"../runtime\";\n\n// ============================================================================\n// Icon Component\n// ============================================================================\n\n/**\n * Props for IconifyIcon component\n */\nexport interface IconifyIconProps {\n\t/** Iconify icon name (e.g., \"ph:users\", \"mdi:home\") */\n\tname: string;\n\t/** Icon size */\n\tsize?: number | string;\n\t/** Additional class name */\n\tclassName?: string;\n\t/** Icon color */\n\tcolor?: string;\n}\n\n/**\n * Iconify-based icon component.\n * Renders icons from any Iconify icon set (Phosphor, Material Design, etc.)\n *\n * @example\n * ```tsx\n * <IconifyIcon name=\"ph:users\" size={24} />\n * <IconifyIcon name=\"mdi:home\" className=\"text-blue-500\" />\n * ```\n */\nexport function IconifyIcon({\n\tname,\n\tsize,\n\tclassName,\n\tcolor,\n}: IconifyIconProps): React.ReactElement {\n\treturn (\n\t\t<Icon\n\t\t\ticon={name}\n\t\t\twidth={size}\n\t\t\theight={size}\n\t\t\tclassName={className}\n\t\t\tcolor={color}\n\t\t/>\n\t);\n}\n\n// ============================================================================\n// Badge Component\n// ============================================================================\n\n/**\n * Props for Badge component\n */\nexport interface BadgeProps {\n\t/** Badge text */\n\ttext: string;\n\t/** Badge color variant */\n\tcolor?:\n\t\t| \"default\"\n\t\t| \"primary\"\n\t\t| \"secondary\"\n\t\t| \"destructive\"\n\t\t| \"success\"\n\t\t| \"warning\";\n\t/** Additional class name */\n\tclassName?: string;\n}\n\n/**\n * Badge component for status indicators\n */\nexport function Badge({\n\ttext,\n\tcolor = \"default\",\n\tclassName,\n}: BadgeProps): React.ReactElement {\n\tconst colorClasses: Record<string, string> = {\n\t\tdefault: \"bg-muted text-muted-foreground\",\n\t\tprimary: \"bg-primary/10 text-primary\",\n\t\tsecondary: \"bg-secondary text-secondary-foreground\",\n\t\tdestructive: \"bg-destructive/10 text-destructive\",\n\t\tsuccess: \"bg-success/10 text-success\",\n\t\twarning: \"bg-warning/10 text-warning\",\n\t};\n\n\treturn (\n\t\t<span\n\t\t\tclassName={`inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium ${colorClasses[color] ?? colorClasses.default} ${className ?? \"\"}`}\n\t\t>\n\t\t\t{text}\n\t\t</span>\n\t);\n}\n\n// ============================================================================\n// Component Registry\n// ============================================================================\n\n/**\n * Component renderer registry type\n */\nexport type ComponentRendererRegistry = Record<\n\tstring,\n\tReact.ComponentType<any>\n>;\n\n// ============================================================================\n// Component Renderer\n// ============================================================================\n\n/**\n * Props for ComponentRenderer\n */\nexport interface ComponentRendererProps {\n\t/** Server-defined component reference */\n\treference: ComponentReference | null | undefined;\n\t/** Component registry override (defaults to admin context registry) */\n\tregistry?: ComponentRendererRegistry;\n\t/** Fallback to render if component type not found */\n\tfallback?: React.ReactNode;\n\t/** Additional props to pass to the component */\n\tadditionalProps?: Record<string, unknown>;\n}\n\n/**\n * Renders a server-defined component reference.\n *\n * Looks up the component type in the registry and renders it with the provided props.\n * Falls back gracefully if the component type is not found.\n *\n * @example\n * ```tsx\n * // Basic usage\n * <ComponentRenderer reference={{ type: \"icon\", props: { name: \"ph:users\" } }} />\n *\n * // With custom registry\n * <ComponentRenderer\n * reference={{ type: \"custom\", props: { value: 42 } }}\n * registry={{ custom: MyCustomComponent }}\n * />\n *\n * // With fallback\n * <ComponentRenderer\n * reference={{ type: \"unknown\", props: {} }}\n * fallback={<span>?</span>}\n * />\n * ```\n */\nexport function ComponentRenderer({\n\treference,\n\tregistry,\n\tfallback = null,\n\tadditionalProps,\n}: ComponentRendererProps): React.ReactNode {\n\tif (!reference) {\n\t\treturn fallback;\n\t}\n\n\tconst admin = useAdminStore(selectAdmin);\n\tconst contextRegistry =\n\t\t(admin?.getComponents?.() as ComponentRendererRegistry | undefined) ?? {};\n\tconst mergedRegistry = registry ?? contextRegistry;\n\tconst Component = mergedRegistry[reference.type];\n\n\tif (!Component) {\n\t\tif (process.env.NODE_ENV === \"development\") {\n\t\t\tconsole.warn(\n\t\t\t\t`[ComponentRenderer] Unknown component type: \"${reference.type}\". ` +\n\t\t\t\t\t`Available types: ${Object.keys(mergedRegistry).join(\", \")}`,\n\t\t\t);\n\t\t}\n\t\treturn fallback;\n\t}\n\n\treturn <Component {...reference.props} {...additionalProps} />;\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Check if a value is a component reference\n */\nexport function isComponentReference(\n\tvalue: unknown,\n): value is ComponentReference {\n\treturn (\n\t\ttypeof value === \"object\" &&\n\t\tvalue !== null &&\n\t\t\"type\" in value &&\n\t\t\"props\" in value &&\n\t\ttypeof (value as any).type === \"string\" &&\n\t\ttypeof (value as any).props === \"object\"\n\t);\n}\n\n/**\n * Resolve an icon to a React element.\n * Handles both ComponentReference objects and direct React components.\n *\n * @param icon - Icon to resolve (ComponentReference, React component, or undefined)\n * @param props - Additional props to pass to the icon\n * @returns React element or null\n */\nexport function resolveIconElement(\n\ticon:\n\t\t| ComponentReference\n\t\t| React.ComponentType<any>\n\t\t| string\n\t\t| undefined\n\t\t| null,\n\tprops?: Record<string, unknown>,\n\tregistry?: ComponentRendererRegistry,\n): React.ReactNode {\n\tif (!icon) {\n\t\treturn null;\n\t}\n\n\t// Handle ComponentReference\n\tif (isComponentReference(icon)) {\n\t\treturn (\n\t\t\t<ComponentRenderer\n\t\t\t\treference={icon}\n\t\t\t\tadditionalProps={props}\n\t\t\t\tregistry={registry}\n\t\t\t/>\n\t\t);\n\t}\n\n\t// Handle legacy string icon names by treating them as icon component references\n\tif (typeof icon === \"string\") {\n\t\treturn (\n\t\t\t<ComponentRenderer\n\t\t\t\treference={{ type: \"icon\", props: { name: icon } }}\n\t\t\t\tadditionalProps={props}\n\t\t\t\tregistry={registry}\n\t\t\t/>\n\t\t);\n\t}\n\n\t// Handle React component\n\tif (typeof icon === \"function\") {\n\t\tconst IconComponent = icon;\n\t\treturn <IconComponent {...props} />;\n\t}\n\n\t// Handle object that might be a React element\n\tif (typeof icon === \"object\" && React.isValidElement(icon)) {\n\t\treturn icon;\n\t}\n\n\treturn null;\n}\n\n/**\n * Create a render function for icons.\n * Useful for rendering icons in table cells or list items.\n *\n * @param registry - Custom component registry\n * @returns Function that renders an icon from a ComponentReference\n */\nexport function createIconRenderer(registry?: ComponentRendererRegistry) {\n\treturn (\n\t\ticon:\n\t\t\t| ComponentReference\n\t\t\t| React.ComponentType<any>\n\t\t\t| string\n\t\t\t| undefined\n\t\t\t| null,\n\t\tprops?: Record<string, unknown>,\n\t): React.ReactNode => {\n\t\tif (!icon) return null;\n\n\t\treturn resolveIconElement(icon, props, registry);\n\t};\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiDA,SAAgB,YAAY,EAC3B,MACA,MACA,WACA,SACwC;AACxC,QACC,oBAAC;EACA,MAAM;EACN,OAAO;EACP,QAAQ;EACG;EACJ;GACN;;;;;AA6BJ,SAAgB,MAAM,EACrB,MACA,QAAQ,WACR,aACkC;CAClC,MAAMA,eAAuC;EAC5C,SAAS;EACT,SAAS;EACT,WAAW;EACX,aAAa;EACb,SAAS;EACT,SAAS;EACT;AAED,QACC,oBAAC;EACA,WAAW,yEAAyE,aAAa,UAAU,aAAa,QAAQ,GAAG,aAAa;YAE/I;GACK;;;;;;;;;;;;;;;;;;;;;;;;;;AA0DT,SAAgB,kBAAkB,EACjC,WACA,UACA,WAAW,MACX,mBAC2C;AAC3C,KAAI,CAAC,UACJ,QAAO;CAIR,MAAM,kBADQ,cAAc,YAAY,EAE/B,iBAAiB,IAA8C,EAAE;CAC1E,MAAM,iBAAiB,YAAY;CACnC,MAAM,YAAY,eAAe,UAAU;AAE3C,KAAI,CAAC,WAAW;AACf,MAAI,QAAQ,IAAI,aAAa,cAC5B,SAAQ,KACP,gDAAgD,UAAU,KAAK,sBAC1C,OAAO,KAAK,eAAe,CAAC,KAAK,KAAK,GAC3D;AAEF,SAAO;;AAGR,QAAO,oBAAC;EAAU,GAAI,UAAU;EAAO,GAAI;GAAmB;;;;;AAU/D,SAAgB,qBACf,OAC8B;AAC9B,QACC,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACV,WAAW,SACX,OAAQ,MAAc,SAAS,YAC/B,OAAQ,MAAc,UAAU;;;;;;;;;;AAYlC,SAAgB,mBACf,MAMA,OACA,UACkB;AAClB,KAAI,CAAC,KACJ,QAAO;AAIR,KAAI,qBAAqB,KAAK,CAC7B,QACC,oBAAC;EACA,WAAW;EACX,iBAAiB;EACP;GACT;AAKJ,KAAI,OAAO,SAAS,SACnB,QACC,oBAAC;EACA,WAAW;GAAE,MAAM;GAAQ,OAAO,EAAE,MAAM,MAAM;GAAE;EAClD,iBAAiB;EACP;GACT;AAKJ,KAAI,OAAO,SAAS,WAEnB,QAAO,oBADe,QACA,GAAI,QAAS;AAIpC,KAAI,OAAO,SAAS,YAAYC,QAAM,eAAe,KAAK,CACzD,QAAO;AAGR,QAAO;;;;;;;;;AAUR,SAAgB,mBAAmB,UAAsC;AACxE,SACC,MAMA,UACqB;AACrB,MAAI,CAAC,KAAM,QAAO;AAElB,SAAO,mBAAmB,MAAM,OAAO,SAAS"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"error-boundary.mjs","names":["React"],"sources":["../../../src/client/components/error-boundary.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\ninterface ErrorBoundaryProps {\n\tchildren: React.ReactNode;\n\tfallback?: React.ReactNode | ((error: Error) => React.ReactNode);\n\tonError?: (error: Error, errorInfo: React.ErrorInfo) => void;\n}\n\ninterface ErrorBoundaryState {\n\thasError: boolean;\n\terror: Error | null;\n}\n\n/**\n * ErrorBoundary - Catches JavaScript errors in child component tree\n *\n * Prevents entire UI from crashing when a component throws an error.\n * Use around widgets, sections, or any component that might fail.\n *\n * @example\n * ```tsx\n * <ErrorBoundary fallback={<WidgetError />}>\n * <ChartWidget config={config} />\n * </ErrorBoundary>\n *\n * // With error callback\n * <ErrorBoundary\n * fallback={(error) => <p>Error: {error.message}</p>}\n * onError={(error) => logToService(error)}\n * >\n * <DashboardWidget config={config} />\n * </ErrorBoundary>\n * ```\n */\nexport class ErrorBoundary extends React.Component<\n\tErrorBoundaryProps,\n\tErrorBoundaryState\n> {\n\tconstructor(props: ErrorBoundaryProps) {\n\t\tsuper(props);\n\t\tthis.state = { hasError: false, error: null };\n\t}\n\n\tstatic getDerivedStateFromError(error: Error): ErrorBoundaryState {\n\t\treturn { hasError: true, error };\n\t}\n\n\tcomponentDidCatch(error: Error, errorInfo: React.ErrorInfo): void {\n\t\tthis.props.onError?.(error, errorInfo);\n\t}\n\n\trender(): React.ReactNode {\n\t\tif (this.state.hasError && this.state.error) {\n\t\t\tconst { fallback } = this.props;\n\n\t\t\tif (typeof fallback === \"function\") {\n\t\t\t\treturn fallback(this.state.error);\n\t\t\t}\n\n\t\t\tif (fallback) {\n\t\t\t\treturn fallback;\n\t\t\t}\n\n\t\t\t// Default fallback\n\t\t\treturn (\n\t\t\t\t<div className=\"rounded-lg border border-destructive/20 bg-destructive/5 p-4\">\n\t\t\t\t\t<p className=\"text-sm font-medium text-destructive\">\n\t\t\t\t\t\tSomething went wrong\n\t\t\t\t\t</p>\n\t\t\t\t\t<p className=\"mt-1 text-xs text-muted-foreground\">\n\t\t\t\t\t\t{this.state.error.message}\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\treturn this.props.children;\n\t}\n}\n\n/**\n * WidgetErrorBoundary - Specialized error boundary for dashboard widgets\n */\nexport function WidgetErrorBoundary({\n\tchildren,\n\twidgetType,\n}: {\n\tchildren: React.ReactNode;\n\twidgetType?: string;\n}) {\n\treturn (\n\t\t<ErrorBoundary\n\t\t\tfallback={(error) => (\n\t\t\t\t<div className=\"rounded-lg border border-destructive/20 bg-destructive/5 p-4\">\n\t\t\t\t\t<p className=\"text-sm font-medium text-destructive\">Widget Error</p>\n\t\t\t\t\t{widgetType && (\n\t\t\t\t\t\t<p className=\"text-xs text-muted-foreground\">Type: {widgetType}</p>\n\t\t\t\t\t)}\n\t\t\t\t\t<p className=\"mt-1 text-xs text-muted-foreground\">{error.message}</p>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t>\n\t\t\t{children}\n\t\t</ErrorBoundary>\n\t);\n}\n\n/**\n * ViewErrorBoundary - Error boundary for collection views (table, form)\n *\n * Use with Suspense boundaries to gracefully handle loading and error states.\n *\n * @example\n * ```tsx\n * <ViewErrorBoundary viewType=\"table\" collection=\"posts\">\n * <Suspense fallback={<TableViewSkeleton />}>\n * <TableViewInner collection=\"posts\" />\n * </Suspense>\n * </ViewErrorBoundary>\n * ```\n */\nexport function ViewErrorBoundary({\n\tchildren,\n\tviewType,\n\tcollection,\n\tonRetry,\n}: {\n\tchildren: React.ReactNode;\n\tviewType?: \"table\" | \"form\" | string;\n\tcollection?: string;\n\tonRetry?: () => void;\n}) {\n\treturn (\n\t\t<ErrorBoundary\n\t\t\tfallback={(error) => (\n\t\t\t\t<div className=\"container\">\n\t\t\t\t\t<div className=\"rounded-lg border border-destructive/20 bg-destructive/5 p-6 my-8\">\n\t\t\t\t\t\t<div className=\"flex items-start gap-4\">\n\t\t\t\t\t\t\t<div className=\"rounded-full bg-destructive/10 p-2\">\n\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t\t\t\tclassName=\"size-5 text-destructive\"\n\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<title>Error</title>\n\t\t\t\t\t\t\t\t\t<circle cx=\"12\" cy=\"12\" r=\"10\" />\n\t\t\t\t\t\t\t\t\t<line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n\t\t\t\t\t\t\t\t\t<line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className=\"flex-1\">\n\t\t\t\t\t\t\t\t<h3 className=\"text-sm font-semibold text-destructive\">\n\t\t\t\t\t\t\t\t\tFailed to load {viewType ?? \"view\"}\n\t\t\t\t\t\t\t\t\t{collection && ` for ${collection}`}\n\t\t\t\t\t\t\t\t</h3>\n\t\t\t\t\t\t\t\t<p className=\"mt-1 text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t{error.message || \"An unexpected error occurred\"}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t{onRetry && (\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={onRetry}\n\t\t\t\t\t\t\t\t\t\tclassName=\"mt-3 text-sm font-medium text-primary hover:underline\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tTry again\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t>\n\t\t\t{children}\n\t\t</ErrorBoundary>\n\t);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,IAAa,gBAAb,cAAmCA,QAAM,UAGvC;CACD,YAAY,OAA2B;AACtC,QAAM,MAAM;AACZ,OAAK,QAAQ;GAAE,UAAU;GAAO,OAAO;GAAM;;CAG9C,OAAO,yBAAyB,OAAkC;AACjE,SAAO;GAAE,UAAU;GAAM;GAAO;;CAGjC,kBAAkB,OAAc,WAAkC;AACjE,OAAK,MAAM,UAAU,OAAO,UAAU;;CAGvC,SAA0B;AACzB,MAAI,KAAK,MAAM,YAAY,KAAK,MAAM,OAAO;GAC5C,MAAM,EAAE,aAAa,KAAK;AAE1B,OAAI,OAAO,aAAa,WACvB,QAAO,SAAS,KAAK,MAAM,MAAM;AAGlC,OAAI,SACH,QAAO;AAIR,UACC,qBAAC;IAAI,WAAU;eACd,oBAAC;KAAE,WAAU;eAAuC;MAEhD,EACJ,oBAAC;KAAE,WAAU;eACX,KAAK,MAAM,MAAM;MACf;KACC;;AAIR,SAAO,KAAK,MAAM;;;;;;AAOpB,SAAgB,oBAAoB,EACnC,UACA,cAIE;AACF,QACC,oBAAC;EACA,WAAW,UACV,qBAAC;GAAI,WAAU;;IACd,oBAAC;KAAE,WAAU;eAAuC;MAAgB;IACnE,cACA,qBAAC;KAAE,WAAU;gBAAgC,UAAO;MAAe;IAEpE,oBAAC;KAAE,WAAU;eAAsC,MAAM;MAAY;;IAChE;EAGN;GACc"}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { FieldComponentProps } from "../../builder/types/field-types.mjs";
|
|
2
|
-
import { ArrayFieldConfig } from "./field-types.mjs";
|
|
3
|
-
import "../../builder/index.mjs";
|
|
4
|
-
import * as react_jsx_runtime203 from "react/jsx-runtime";
|
|
5
|
-
|
|
6
|
-
//#region src/client/components/fields/array-field.d.ts
|
|
7
|
-
|
|
8
|
-
type ArrayFieldItemType = "text" | "number" | "email" | "textarea" | "select";
|
|
9
|
-
interface ArrayFieldProps extends FieldComponentProps<any[]>, Pick<ArrayFieldConfig, "item" | "mode" | "layout" | "columns" | "itemLabel"> {
|
|
10
|
-
itemType?: ArrayFieldItemType;
|
|
11
|
-
options?: Array<{
|
|
12
|
-
label: string;
|
|
13
|
-
value: any;
|
|
14
|
-
}>;
|
|
15
|
-
orderable?: boolean;
|
|
16
|
-
minItems?: number;
|
|
17
|
-
maxItems?: number;
|
|
18
|
-
}
|
|
19
|
-
declare function ArrayField({
|
|
20
|
-
name,
|
|
21
|
-
value,
|
|
22
|
-
label,
|
|
23
|
-
description,
|
|
24
|
-
placeholder,
|
|
25
|
-
required,
|
|
26
|
-
disabled,
|
|
27
|
-
readOnly,
|
|
28
|
-
error,
|
|
29
|
-
localized,
|
|
30
|
-
locale,
|
|
31
|
-
itemType,
|
|
32
|
-
options,
|
|
33
|
-
orderable,
|
|
34
|
-
minItems,
|
|
35
|
-
maxItems,
|
|
36
|
-
item,
|
|
37
|
-
mode,
|
|
38
|
-
layout,
|
|
39
|
-
columns,
|
|
40
|
-
itemLabel
|
|
41
|
-
}: ArrayFieldProps): react_jsx_runtime203.JSX.Element;
|
|
42
|
-
//#endregion
|
|
43
|
-
export { ArrayField, ArrayFieldItemType, ArrayFieldProps };
|
|
44
|
-
//# sourceMappingURL=array-field.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"array-field.d.mts","names":[],"sources":["../../../../src/client/components/fields/array-field.tsx"],"sourcesContent":[],"mappings":";;;;;;;AA+BM,KAXM,kBAAA,GAWN,MAAA,GAAA,QAAA,GAAA,OAAA,GAAA,UAAA,GAAA,QAAA;AAGO,UAPI,eAAA,SAEb,mBAKS,CAAA,GAAA,EAAA,CAAA,EAJT,IAIS,CAHP,gBAGO,EAAA,MAAA,GAAA,MAAA,GAAA,QAAA,GAAA,SAAA,GAAA,WAAA,CAAA,CAAA;EACD,QAAA,CAAA,EADC,kBACD;EANR,OAAA,CAAA,EAMQ,KANR,CAAA;IACA,KAAA,EAAA,MAAA;IAAI,KAAA,EAAA,GAAA;EAWQ,CAAA,CAAA;EACd,SAAA,CAAA,EAAA,OAAA;EACA,QAAA,CAAA,EAAA,MAAA;EACA,QAAA,CAAA,EAAA,MAAA;;AAEA,iBALc,UAAA,CAKd;EAAA,IAAA;EAAA,KAAA;EAAA,KAAA;EAAA,WAAA;EAAA,WAAA;EAAA,QAAA;EAAA,QAAA;EAAA,QAAA;EAAA,KAAA;EAAA,SAAA;EAAA,MAAA;EAAA,QAAA;EAAA,OAAA;EAAA,SAAA;EAAA,QAAA;EAAA,QAAA;EAAA,IAAA;EAAA,IAAA;EAAA,MAAA;EAAA,OAAA;EAAA;AAAA,CAAA,EAkBC,eAlBD,CAAA,EAkBgB,oBAAA,CAAA,GAAA,CAAA,OAlBhB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"array-field.mjs","names":["React","value"],"sources":["../../../../src/client/components/fields/array-field.tsx"],"sourcesContent":["/**\n * ArrayField Component\n *\n * Handles arrays of primitive values or objects with optional ordering.\n * When `item` prop is provided, delegates to ObjectArrayField for object items.\n */\n\nimport { Icon } from \"@iconify/react\";\nimport * as React from \"react\";\nimport { useFieldArray, useFormContext, useWatch } from \"react-hook-form\";\nimport type { FieldComponentProps } from \"../../builder\";\nimport { useResolveText, useTranslation } from \"../../i18n/hooks\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\nimport { Select, SelectContent, SelectItem, SelectTrigger } from \"../ui/select\";\nimport { Textarea } from \"../ui/textarea\";\nimport type { ArrayFieldConfig } from \"./field-types\";\nimport { LocaleBadge } from \"./locale-badge\";\nimport { ObjectArrayField } from \"./object-array-field\";\n\nexport type ArrayFieldItemType =\n | \"text\"\n | \"number\"\n | \"email\"\n | \"textarea\"\n | \"select\";\n\nexport interface ArrayFieldProps\n extends\n FieldComponentProps<any[]>,\n Pick<\n ArrayFieldConfig,\n \"item\" | \"mode\" | \"layout\" | \"columns\" | \"itemLabel\"\n > {\n itemType?: ArrayFieldItemType;\n options?: Array<{ label: string; value: any }>;\n orderable?: boolean;\n minItems?: number;\n maxItems?: number;\n}\n\nexport function ArrayField({\n name,\n value,\n label,\n description,\n placeholder,\n required,\n disabled,\n readOnly,\n error,\n localized,\n locale,\n itemType = \"text\",\n options,\n orderable = false,\n minItems,\n maxItems,\n // Object array props\n item,\n mode,\n layout,\n columns,\n itemLabel,\n}: ArrayFieldProps) {\n const { t } = useTranslation();\n const resolveText = useResolveText();\n const resolvedPlaceholder = placeholder\n ? resolveText(placeholder)\n : undefined;\n const resolvedDescription = description\n ? resolveText(description)\n : undefined;\n const resolvedLabel = label ? resolveText(label) : undefined;\n const fallbackLabel = resolvedLabel || \"item\";\n const emptyLabel = t(\"array.empty\", { name: fallbackLabel });\n const addLabel = t(\"array.addItem\", { name: fallbackLabel });\n const form = useFormContext();\n const { control } = form;\n const { fields, append, remove, move } = useFieldArray({ control, name });\n const values = (useWatch({ control, name }) as any[] | undefined) ?? value;\n\n const canAddMore = !maxItems || fields.length < maxItems;\n const canRemove = !readOnly && (!minItems || fields.length > minItems);\n\n const createEmptyItem = React.useCallback(() => {\n if (itemType === \"number\") return undefined;\n if (itemType === \"select\") {\n return options?.[0]?.value ?? \"\";\n }\n return \"\";\n }, [itemType, options]);\n\n // Delegate to ObjectArrayField if item prop is provided (object array)\n if (item) {\n return (\n <ObjectArrayField\n name={name}\n label={label}\n description={description}\n placeholder={placeholder}\n required={required}\n disabled={disabled}\n localized={localized}\n locale={locale}\n item={item}\n mode={mode}\n layout={layout}\n columns={columns}\n itemLabel={itemLabel}\n orderable={orderable}\n minItems={minItems}\n maxItems={maxItems}\n />\n );\n }\n\n // Primitive array handling below\n\n const handleAdd = () => {\n if (disabled || readOnly || !canAddMore) return;\n append(createEmptyItem());\n };\n\n const handleRemove = (index: number) => {\n if (!canRemove) return;\n remove(index);\n };\n\n const handleMove = (from: number, to: number) => {\n if (to < 0 || to >= fields.length) return;\n move(from, to);\n };\n\n const renderItemInput = (index: number) => {\n const itemName = `${name}.${index}`;\n const itemValue = values?.[index];\n const itemPlaceholder = resolvedPlaceholder || `Item ${index + 1}`;\n\n if (itemType === \"textarea\") {\n return (\n <Textarea\n id={itemName}\n placeholder={itemPlaceholder}\n disabled={disabled || readOnly}\n defaultValue={itemValue ?? \"\"}\n {...form.register(itemName)}\n />\n );\n }\n\n if (itemType === \"select\") {\n return (\n <Select\n value={itemValue ?? \"\"}\n onValueChange={(value) =>\n form.setValue(itemName, value, {\n shouldDirty: true,\n shouldTouch: true,\n })\n }\n disabled={disabled || readOnly}\n >\n <SelectTrigger id={itemName}>\n <span className=\"truncate\">\n {options?.find((o) => o.value === itemValue)?.label\n ? resolveText(options.find((o) => o.value === itemValue)?.label)\n : itemPlaceholder}\n </span>\n </SelectTrigger>\n <SelectContent>\n {options?.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {resolveText(option.label)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n }\n\n return (\n <Input\n id={itemName}\n type={itemType === \"email\" ? \"email\" : itemType}\n placeholder={itemPlaceholder}\n disabled={disabled || readOnly}\n defaultValue={itemValue ?? \"\"}\n {...form.register(\n itemName,\n itemType === \"number\" ? { valueAsNumber: true } : undefined,\n )}\n />\n );\n };\n\n return (\n <div className=\"space-y-2\">\n {label && (\n <div className=\"flex items-center gap-2\">\n <label htmlFor={name} className=\"text-sm font-medium\">\n {resolvedLabel}\n {required && <span className=\"text-destructive\">*</span>}\n {maxItems && (\n <span className=\"ml-2 text-xs text-muted-foreground\">\n ({fields.length}/{maxItems})\n </span>\n )}\n </label>\n {localized && <LocaleBadge locale={locale || \"i18n\"} />}\n </div>\n )}\n {resolvedDescription && (\n <p className=\"text-sm text-muted-foreground\">{resolvedDescription}</p>\n )}\n\n <div className=\"space-y-2\">\n {fields.length === 0 ? (\n <div className=\"rounded-lg border border-dashed p-4 text-center\">\n <p className=\"text-sm text-muted-foreground\">\n {resolvedPlaceholder || emptyLabel}\n </p>\n </div>\n ) : (\n fields.map((field, index) => {\n const canMoveUp = orderable && index > 0;\n const canMoveDown = orderable && index < fields.length - 1;\n\n return (\n <div key={field.id} className=\"flex items-start gap-2\">\n <div className=\"flex-1\">{renderItemInput(index)}</div>\n {orderable && !readOnly && (\n <div className=\"flex flex-col gap-1\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n onClick={() => handleMove(index, index - 1)}\n disabled={!canMoveUp || disabled}\n title=\"Move up\"\n aria-label=\"Move item up\"\n >\n <Icon icon=\"ph:caret-up\" className=\"h-3 w-3\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n onClick={() => handleMove(index, index + 1)}\n disabled={!canMoveDown || disabled}\n title=\"Move down\"\n aria-label=\"Move item down\"\n >\n <Icon icon=\"ph:caret-down\" className=\"h-3 w-3\" />\n </Button>\n </div>\n )}\n {!readOnly && canRemove && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n onClick={() => handleRemove(index)}\n disabled={disabled}\n title=\"Remove\"\n aria-label=\"Remove item\"\n >\n <Icon icon=\"ph:trash\" className=\"h-3 w-3\" />\n </Button>\n )}\n </div>\n );\n })\n )}\n </div>\n\n {!readOnly && canAddMore && (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleAdd}\n disabled={disabled}\n >\n <Icon icon=\"ph:plus\" className=\"h-4 w-4\" />\n {addLabel}\n </Button>\n )}\n\n {error && <p className=\"text-sm text-destructive\">{error}</p>}\n </div>\n );\n}\n"],"mappings":"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"}
|