@questpie/admin 1.1.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +245 -474
- package/dist/_virtual/rolldown_runtime.mjs +18 -0
- package/dist/augmentation.d.mts +315 -0
- package/dist/augmentation.d.mts.map +1 -0
- package/dist/client/blocks/block-registry.d.mts +199 -0
- package/dist/client/blocks/block-registry.d.mts.map +1 -0
- package/dist/client/blocks/block-registry.mjs +88 -0
- package/dist/client/blocks/block-registry.mjs.map +1 -0
- package/dist/client/blocks/block-renderer.d.mts +52 -0
- package/dist/client/blocks/block-renderer.d.mts.map +1 -0
- package/dist/client/blocks/block-renderer.mjs +71 -0
- package/dist/client/blocks/block-renderer.mjs.map +1 -0
- package/dist/client/blocks/index.d.mts +4 -0
- package/dist/client/blocks/prefetch.d.mts +45 -0
- package/dist/client/blocks/prefetch.d.mts.map +1 -0
- package/dist/client/blocks/prefetch.mjs +26 -0
- package/dist/client/blocks/prefetch.mjs.map +1 -0
- package/dist/client/blocks/types.d.mts +69 -0
- package/dist/client/blocks/types.d.mts.map +1 -0
- package/dist/client/blocks/types.mjs +20 -0
- package/dist/client/blocks/types.mjs.map +1 -0
- package/dist/client/builder/admin-builder.d.mts +112 -0
- package/dist/client/builder/admin-builder.d.mts.map +1 -0
- package/dist/client/builder/admin-builder.mjs +185 -0
- package/dist/client/builder/admin-builder.mjs.map +1 -0
- package/dist/client/builder/admin-types.d.mts +73 -0
- package/dist/client/builder/admin-types.d.mts.map +1 -0
- package/dist/client/builder/admin.d.mts +121 -0
- package/dist/client/builder/admin.d.mts.map +1 -0
- package/dist/client/builder/admin.mjs +160 -0
- package/dist/client/builder/admin.mjs.map +1 -0
- package/dist/client/builder/defaults/components.mjs +20 -0
- package/dist/client/builder/defaults/components.mjs.map +1 -0
- package/dist/client/builder/defaults/core.d.mts +354 -0
- package/dist/client/builder/defaults/core.d.mts.map +1 -0
- package/dist/client/builder/defaults/core.mjs +49 -0
- package/dist/client/builder/defaults/core.mjs.map +1 -0
- package/dist/client/builder/defaults/fields.mjs +328 -0
- package/dist/client/builder/defaults/fields.mjs.map +1 -0
- package/dist/client/builder/defaults/pages.mjs +58 -0
- package/dist/client/builder/defaults/pages.mjs.map +1 -0
- package/dist/client/builder/defaults/starter.d.mts +351 -0
- package/dist/client/builder/defaults/starter.d.mts.map +1 -0
- package/dist/client/builder/defaults/starter.mjs +28 -0
- package/dist/client/builder/defaults/starter.mjs.map +1 -0
- package/dist/client/builder/defaults/views.mjs +27 -0
- package/dist/client/builder/defaults/views.mjs.map +1 -0
- package/dist/client/builder/defaults/widgets.mjs +31 -0
- package/dist/client/builder/defaults/widgets.mjs.map +1 -0
- package/dist/client/builder/field/field.d.mts +229 -0
- package/dist/client/builder/field/field.d.mts.map +1 -0
- package/dist/client/builder/field/field.mjs +83 -0
- package/dist/client/builder/field/field.mjs.map +1 -0
- package/dist/client/builder/index.d.mts +36 -0
- package/dist/client/builder/index.d.mts.map +1 -0
- package/dist/client/builder/page/page.d.mts +36 -0
- package/dist/client/builder/page/page.d.mts.map +1 -0
- package/dist/client/builder/page/page.mjs +27 -0
- package/dist/client/builder/page/page.mjs.map +1 -0
- package/dist/client/builder/proxies.d.mts +2 -0
- package/dist/client/builder/proxies.mjs +24 -0
- package/dist/client/builder/proxies.mjs.map +1 -0
- package/dist/client/builder/qa.d.mts +50 -0
- package/dist/client/builder/qa.d.mts.map +1 -0
- package/dist/client/builder/qa.mjs +42 -0
- package/dist/client/builder/qa.mjs.map +1 -0
- package/dist/client/builder/registry.d.mts +70 -0
- package/dist/client/builder/registry.d.mts.map +1 -0
- package/dist/client/builder/types/action-registry.d.mts +2 -0
- package/dist/client/builder/types/action-registry.mjs +142 -0
- package/dist/client/builder/types/action-registry.mjs.map +1 -0
- package/dist/client/builder/types/action-types.d.mts +253 -0
- package/dist/client/builder/types/action-types.d.mts.map +1 -0
- package/dist/client/builder/types/collection-types.d.mts +199 -0
- package/dist/client/builder/types/collection-types.d.mts.map +1 -0
- package/dist/client/builder/types/collection-types.mjs +11 -0
- package/dist/client/builder/types/collection-types.mjs.map +1 -0
- package/dist/client/builder/types/common.d.mts +60 -0
- package/dist/client/builder/types/common.d.mts.map +1 -0
- package/dist/client/builder/types/field-types.d.mts +593 -0
- package/dist/client/builder/types/field-types.d.mts.map +1 -0
- package/dist/client/builder/types/field-types.mjs +19 -0
- package/dist/client/builder/types/field-types.mjs.map +1 -0
- package/dist/client/builder/types/global-types.d.mts +22 -0
- package/dist/client/builder/types/global-types.d.mts.map +1 -0
- package/dist/client/builder/types/ui-config.d.mts +160 -0
- package/dist/client/builder/types/ui-config.d.mts.map +1 -0
- package/dist/client/builder/types/views.d.mts +89 -0
- package/dist/client/builder/types/views.d.mts.map +1 -0
- package/dist/client/builder/types/widget-types.d.mts +563 -0
- package/dist/client/builder/types/widget-types.d.mts.map +1 -0
- package/dist/client/builder/validation.d.mts +3 -0
- package/dist/client/builder/validation.mjs +208 -0
- package/dist/client/builder/validation.mjs.map +1 -0
- package/dist/client/builder/view/view.d.mts +129 -0
- package/dist/client/builder/view/view.d.mts.map +1 -0
- package/dist/client/builder/view/view.mjs +109 -0
- package/dist/client/builder/view/view.mjs.map +1 -0
- package/dist/client/builder/widget/widget.d.mts +33 -0
- package/dist/client/builder/widget/widget.d.mts.map +1 -0
- package/dist/client/builder/widget/widget.mjs +26 -0
- package/dist/client/builder/widget/widget.mjs.map +1 -0
- package/dist/client/components/actions/action-button.d.mts +2 -0
- package/dist/client/components/actions/action-button.mjs +135 -0
- package/dist/client/components/actions/action-button.mjs.map +1 -0
- package/dist/client/components/actions/action-dialog.d.mts +2 -0
- package/dist/client/components/actions/action-dialog.mjs +264 -0
- package/dist/client/components/actions/action-dialog.mjs.map +1 -0
- package/dist/client/components/actions/confirmation-dialog.d.mts +2 -0
- package/dist/client/components/actions/confirmation-dialog.mjs +82 -0
- package/dist/client/components/actions/confirmation-dialog.mjs.map +1 -0
- package/dist/client/components/actions/header-actions.d.mts +2 -0
- package/dist/client/components/actions/header-actions.mjs +117 -0
- package/dist/client/components/actions/header-actions.mjs.map +1 -0
- package/dist/client/components/actions/index.d.mts +4 -0
- package/dist/client/components/admin-link.d.mts +67 -0
- package/dist/client/components/admin-link.d.mts.map +1 -0
- package/dist/client/components/admin-link.mjs +92 -0
- package/dist/client/components/admin-link.mjs.map +1 -0
- package/dist/client/components/auth/auth-guard.d.mts +51 -0
- package/dist/client/components/auth/auth-guard.d.mts.map +1 -0
- package/dist/client/components/auth/auth-guard.mjs +60 -0
- package/dist/client/components/auth/auth-guard.mjs.map +1 -0
- package/dist/client/components/auth/auth-loading.d.mts +36 -0
- package/dist/client/components/auth/auth-loading.d.mts.map +1 -0
- package/dist/client/components/auth/auth-loading.mjs +27 -0
- package/dist/client/components/auth/auth-loading.mjs.map +1 -0
- package/dist/client/components/auth/index.d.mts +2 -0
- package/dist/client/components/blocks/block-canvas.mjs +90 -0
- package/dist/client/components/blocks/block-canvas.mjs.map +1 -0
- package/dist/client/components/blocks/block-editor-context.mjs +58 -0
- package/dist/client/components/blocks/block-editor-context.mjs.map +1 -0
- package/dist/client/components/blocks/block-editor-layout.mjs +82 -0
- package/dist/client/components/blocks/block-editor-layout.mjs.map +1 -0
- package/dist/client/components/blocks/block-editor-provider.mjs +155 -0
- package/dist/client/components/blocks/block-editor-provider.mjs.map +1 -0
- package/dist/client/components/blocks/block-fields-renderer.mjs +70 -0
- package/dist/client/components/blocks/block-fields-renderer.mjs.map +1 -0
- package/dist/client/components/blocks/block-insert-button.mjs +72 -0
- package/dist/client/components/blocks/block-insert-button.mjs.map +1 -0
- package/dist/client/components/blocks/block-item-menu.mjs +161 -0
- package/dist/client/components/blocks/block-item-menu.mjs.map +1 -0
- package/dist/client/components/blocks/block-item.mjs +187 -0
- package/dist/client/components/blocks/block-item.mjs.map +1 -0
- package/dist/client/components/blocks/block-library-sidebar.mjs +190 -0
- package/dist/client/components/blocks/block-library-sidebar.mjs.map +1 -0
- package/dist/client/components/blocks/block-tree.mjs +45 -0
- package/dist/client/components/blocks/block-tree.mjs.map +1 -0
- package/dist/client/components/blocks/block-type-icon.mjs +50 -0
- package/dist/client/components/blocks/block-type-icon.mjs.map +1 -0
- package/dist/client/components/blocks/utils/tree-utils.mjs +186 -0
- package/dist/client/components/blocks/utils/tree-utils.mjs.map +1 -0
- package/dist/client/components/component-renderer.d.mts +125 -0
- package/dist/client/components/component-renderer.d.mts.map +1 -0
- package/dist/client/components/component-renderer.mjs +145 -0
- package/dist/client/components/component-renderer.mjs.map +1 -0
- package/dist/client/components/error-boundary.mjs +92 -0
- package/dist/client/components/error-boundary.mjs.map +1 -0
- package/dist/client/components/fields/array-field.d.mts +44 -0
- package/dist/client/components/fields/array-field.d.mts.map +1 -0
- package/dist/client/components/fields/array-field.mjs +231 -0
- package/dist/client/components/fields/array-field.mjs.map +1 -0
- package/dist/client/components/fields/asset-preview-field.d.mts +52 -0
- package/dist/client/components/fields/asset-preview-field.d.mts.map +1 -0
- package/dist/client/components/fields/asset-preview-field.mjs +60 -0
- package/dist/client/components/fields/asset-preview-field.mjs.map +1 -0
- package/dist/client/components/fields/blocks-field/blocks-field.d.mts +41 -0
- package/dist/client/components/fields/blocks-field/blocks-field.d.mts.map +1 -0
- package/dist/client/components/fields/blocks-field/blocks-field.mjs +101 -0
- package/dist/client/components/fields/blocks-field/blocks-field.mjs.map +1 -0
- package/dist/client/components/fields/blocks-field/index.d.mts +1 -0
- package/dist/client/components/fields/boolean-field.d.mts +30 -0
- package/dist/client/components/fields/boolean-field.d.mts.map +1 -0
- package/dist/client/components/fields/boolean-field.mjs +47 -0
- package/dist/client/components/fields/boolean-field.mjs.map +1 -0
- package/dist/client/components/fields/custom-field.d.mts +3 -0
- package/dist/client/components/fields/date-field.d.mts +22 -0
- package/dist/client/components/fields/date-field.d.mts.map +1 -0
- package/dist/client/components/fields/date-field.mjs +42 -0
- package/dist/client/components/fields/date-field.mjs.map +1 -0
- package/dist/client/components/fields/datetime-field.d.mts +23 -0
- package/dist/client/components/fields/datetime-field.d.mts.map +1 -0
- package/dist/client/components/fields/datetime-field.mjs +43 -0
- package/dist/client/components/fields/datetime-field.mjs.map +1 -0
- package/dist/client/components/fields/email-field.d.mts +19 -0
- package/dist/client/components/fields/email-field.d.mts.map +1 -0
- package/dist/client/components/fields/email-field.mjs +38 -0
- package/dist/client/components/fields/email-field.mjs.map +1 -0
- package/dist/client/components/fields/embedded-collection.d.mts +3 -0
- package/dist/client/components/fields/field-types.d.mts +571 -0
- package/dist/client/components/fields/field-types.d.mts.map +1 -0
- package/dist/client/components/fields/field-utils.d.mts +1 -0
- package/dist/client/components/fields/field-utils.mjs +65 -0
- package/dist/client/components/fields/field-utils.mjs.map +1 -0
- package/dist/client/components/fields/field-wrapper.d.mts +3 -0
- package/dist/client/components/fields/field-wrapper.mjs +49 -0
- package/dist/client/components/fields/field-wrapper.mjs.map +1 -0
- package/dist/client/components/fields/index.d.mts +33 -0
- package/dist/client/components/fields/json-field.d.mts +84 -0
- package/dist/client/components/fields/json-field.d.mts.map +1 -0
- package/dist/client/components/fields/json-field.mjs +248 -0
- package/dist/client/components/fields/json-field.mjs.map +1 -0
- package/dist/client/components/fields/locale-badge.d.mts +1 -0
- package/dist/client/components/fields/locale-badge.mjs +17 -0
- package/dist/client/components/fields/locale-badge.mjs.map +1 -0
- package/dist/client/components/fields/number-field.d.mts +23 -0
- package/dist/client/components/fields/number-field.d.mts.map +1 -0
- package/dist/client/components/fields/number-field.mjs +40 -0
- package/dist/client/components/fields/number-field.mjs.map +1 -0
- package/dist/client/components/fields/object-array-field.d.mts +2 -0
- package/dist/client/components/fields/object-array-field.mjs +313 -0
- package/dist/client/components/fields/object-array-field.mjs.map +1 -0
- package/dist/client/components/fields/object-field.d.mts +32 -0
- package/dist/client/components/fields/object-field.d.mts.map +1 -0
- package/dist/client/components/fields/object-field.mjs +128 -0
- package/dist/client/components/fields/object-field.mjs.map +1 -0
- package/dist/client/components/fields/relation/displays/cards-display.d.mts +2 -0
- package/dist/client/components/fields/relation/displays/cards-display.mjs +140 -0
- package/dist/client/components/fields/relation/displays/cards-display.mjs.map +1 -0
- package/dist/client/components/fields/relation/displays/chips-display.d.mts +2 -0
- package/dist/client/components/fields/relation/displays/chips-display.mjs +100 -0
- package/dist/client/components/fields/relation/displays/chips-display.mjs.map +1 -0
- package/dist/client/components/fields/relation/displays/grid-display.d.mts +2 -0
- package/dist/client/components/fields/relation/displays/grid-display.mjs +114 -0
- package/dist/client/components/fields/relation/displays/grid-display.mjs.map +1 -0
- package/dist/client/components/fields/relation/displays/index.d.mts +6 -0
- package/dist/client/components/fields/relation/displays/list-display.d.mts +2 -0
- package/dist/client/components/fields/relation/displays/list-display.mjs +128 -0
- package/dist/client/components/fields/relation/displays/list-display.mjs.map +1 -0
- package/dist/client/components/fields/relation/displays/table-display.d.mts +2 -0
- package/dist/client/components/fields/relation/displays/table-display.mjs +134 -0
- package/dist/client/components/fields/relation/displays/table-display.mjs.map +1 -0
- package/dist/client/components/fields/relation/displays/types.d.mts +22 -0
- package/dist/client/components/fields/relation/displays/types.d.mts.map +1 -0
- package/dist/client/components/fields/relation/displays/types.mjs +73 -0
- package/dist/client/components/fields/relation/displays/types.mjs.map +1 -0
- package/dist/client/components/fields/relation/index.d.mts +3 -0
- package/dist/client/components/fields/relation/relation-items-display.d.mts +5 -0
- package/dist/client/components/fields/relation/relation-items-display.mjs +47 -0
- package/dist/client/components/fields/relation/relation-items-display.mjs.map +1 -0
- package/dist/client/components/fields/relation-field.d.mts +134 -0
- package/dist/client/components/fields/relation-field.d.mts.map +1 -0
- package/dist/client/components/fields/relation-field.mjs +106 -0
- package/dist/client/components/fields/relation-field.mjs.map +1 -0
- package/dist/client/components/fields/relation-picker.d.mts +4 -0
- package/dist/client/components/fields/relation-picker.mjs +301 -0
- package/dist/client/components/fields/relation-picker.mjs.map +1 -0
- package/dist/client/components/fields/relation-select.d.mts +3 -0
- package/dist/client/components/fields/relation-select.mjs +219 -0
- package/dist/client/components/fields/relation-select.mjs.map +1 -0
- package/dist/client/components/fields/reverse-relation-field.d.mts +2 -0
- package/dist/client/components/fields/rich-text-editor/bubble-menu.mjs +56 -0
- package/dist/client/components/fields/rich-text-editor/bubble-menu.mjs.map +1 -0
- package/dist/client/components/fields/rich-text-editor/extensions.mjs +118 -0
- package/dist/client/components/fields/rich-text-editor/extensions.mjs.map +1 -0
- package/dist/client/components/fields/rich-text-editor/image-popover.mjs +196 -0
- package/dist/client/components/fields/rich-text-editor/image-popover.mjs.map +1 -0
- package/dist/client/components/fields/rich-text-editor/index.d.mts +4 -0
- package/dist/client/components/fields/rich-text-editor/index.mjs +187 -0
- package/dist/client/components/fields/rich-text-editor/index.mjs.map +1 -0
- package/dist/client/components/fields/rich-text-editor/link-popover.mjs +86 -0
- package/dist/client/components/fields/rich-text-editor/link-popover.mjs.map +1 -0
- package/dist/client/components/fields/rich-text-editor/presets.d.mts +11 -0
- package/dist/client/components/fields/rich-text-editor/presets.d.mts.map +1 -0
- package/dist/client/components/fields/rich-text-editor/presets.mjs +124 -0
- package/dist/client/components/fields/rich-text-editor/presets.mjs.map +1 -0
- package/dist/client/components/fields/rich-text-editor/slash-commands.mjs +145 -0
- package/dist/client/components/fields/rich-text-editor/slash-commands.mjs.map +1 -0
- package/dist/client/components/fields/rich-text-editor/table-controls.mjs +124 -0
- package/dist/client/components/fields/rich-text-editor/table-controls.mjs.map +1 -0
- package/dist/client/components/fields/rich-text-editor/toolbar.mjs +280 -0
- package/dist/client/components/fields/rich-text-editor/toolbar.mjs.map +1 -0
- package/dist/client/components/fields/rich-text-editor/types.d.mts +78 -0
- package/dist/client/components/fields/rich-text-editor/types.d.mts.map +1 -0
- package/dist/client/components/fields/rich-text-editor/types.mjs +31 -0
- package/dist/client/components/fields/rich-text-editor/types.mjs.map +1 -0
- package/dist/client/components/fields/rich-text-editor/utils.mjs +51 -0
- package/dist/client/components/fields/rich-text-editor/utils.mjs.map +1 -0
- package/dist/client/components/fields/rich-text-editor/variants.d.mts +2 -0
- package/dist/client/components/fields/rich-text-field.d.mts +14 -0
- package/dist/client/components/fields/rich-text-field.d.mts.map +1 -0
- package/dist/client/components/fields/rich-text-field.mjs +26 -0
- package/dist/client/components/fields/rich-text-field.mjs.map +1 -0
- package/dist/client/components/fields/select-field.d.mts +25 -0
- package/dist/client/components/fields/select-field.d.mts.map +1 -0
- package/dist/client/components/fields/select-field.mjs +53 -0
- package/dist/client/components/fields/select-field.mjs.map +1 -0
- package/dist/client/components/fields/status-field.d.mts +2 -0
- package/dist/client/components/fields/text-field.d.mts +22 -0
- package/dist/client/components/fields/text-field.d.mts.map +1 -0
- package/dist/client/components/fields/text-field.mjs +39 -0
- package/dist/client/components/fields/text-field.mjs.map +1 -0
- package/dist/client/components/fields/textarea-field.d.mts +22 -0
- package/dist/client/components/fields/textarea-field.d.mts.map +1 -0
- package/dist/client/components/fields/textarea-field.mjs +39 -0
- package/dist/client/components/fields/textarea-field.mjs.map +1 -0
- package/dist/client/components/fields/time-field.d.mts +20 -0
- package/dist/client/components/fields/time-field.d.mts.map +1 -0
- package/dist/client/components/fields/time-field.mjs +39 -0
- package/dist/client/components/fields/time-field.mjs.map +1 -0
- package/dist/client/components/fields/upload-field.d.mts +97 -0
- package/dist/client/components/fields/upload-field.d.mts.map +1 -0
- package/dist/client/components/fields/upload-field.mjs +497 -0
- package/dist/client/components/fields/upload-field.mjs.map +1 -0
- package/dist/client/components/filter-builder/columns-tab.d.mts +1 -0
- package/dist/client/components/filter-builder/columns-tab.mjs +131 -0
- package/dist/client/components/filter-builder/columns-tab.mjs.map +1 -0
- package/dist/client/components/filter-builder/filter-builder-sheet.d.mts +1 -0
- package/dist/client/components/filter-builder/filter-builder-sheet.mjs +157 -0
- package/dist/client/components/filter-builder/filter-builder-sheet.mjs.map +1 -0
- package/dist/client/components/filter-builder/filters-tab.d.mts +1 -0
- package/dist/client/components/filter-builder/filters-tab.mjs +380 -0
- package/dist/client/components/filter-builder/filters-tab.mjs.map +1 -0
- package/dist/client/components/filter-builder/index.d.mts +5 -0
- package/dist/client/components/filter-builder/saved-views-tab.d.mts +1 -0
- package/dist/client/components/filter-builder/saved-views-tab.mjs +125 -0
- package/dist/client/components/filter-builder/saved-views-tab.mjs.map +1 -0
- package/dist/client/components/index.d.mts +80 -0
- package/dist/client/components/locale-switcher.d.mts +2 -0
- package/dist/client/components/locale-switcher.mjs +128 -0
- package/dist/client/components/locale-switcher.mjs.map +1 -0
- package/dist/client/components/media/media-grid.mjs +139 -0
- package/dist/client/components/media/media-grid.mjs.map +1 -0
- package/dist/client/components/media/media-picker-dialog.mjs +255 -0
- package/dist/client/components/media/media-picker-dialog.mjs.map +1 -0
- package/dist/client/components/preview/live-preview-mode.mjs +211 -0
- package/dist/client/components/preview/live-preview-mode.mjs.map +1 -0
- package/dist/client/components/preview/preview-pane.mjs +179 -0
- package/dist/client/components/preview/preview-pane.mjs.map +1 -0
- package/dist/client/components/primitives/asset-preview.mjs +363 -0
- package/dist/client/components/primitives/asset-preview.mjs.map +1 -0
- package/dist/client/components/primitives/checkbox-input.mjs +33 -0
- package/dist/client/components/primitives/checkbox-input.mjs.map +1 -0
- package/dist/client/components/primitives/date-input.mjs +218 -0
- package/dist/client/components/primitives/date-input.mjs.map +1 -0
- package/dist/client/components/primitives/dropzone.mjs +239 -0
- package/dist/client/components/primitives/dropzone.mjs.map +1 -0
- package/dist/client/components/primitives/number-input.mjs +113 -0
- package/dist/client/components/primitives/number-input.mjs.map +1 -0
- package/dist/client/components/primitives/select-multi.mjs +256 -0
- package/dist/client/components/primitives/select-multi.mjs.map +1 -0
- package/dist/client/components/primitives/select-single.mjs +183 -0
- package/dist/client/components/primitives/select-single.mjs.map +1 -0
- package/dist/client/components/primitives/text-input.mjs +40 -0
- package/dist/client/components/primitives/text-input.mjs.map +1 -0
- package/dist/client/components/primitives/textarea-input.mjs +38 -0
- package/dist/client/components/primitives/textarea-input.mjs.map +1 -0
- package/dist/client/components/primitives/time-input.mjs +72 -0
- package/dist/client/components/primitives/time-input.mjs.map +1 -0
- package/dist/client/components/primitives/toggle-input.mjs +31 -0
- package/dist/client/components/primitives/toggle-input.mjs.map +1 -0
- package/dist/client/components/primitives/types.d.mts +14 -0
- package/dist/client/components/primitives/types.d.mts.map +1 -0
- package/dist/client/components/primitives/types.mjs +13 -0
- package/dist/client/components/primitives/types.mjs.map +1 -0
- package/dist/client/components/sheets/index.d.mts +1 -0
- package/dist/client/components/sheets/resource-sheet.d.mts +1 -0
- package/dist/client/components/sheets/resource-sheet.mjs +78 -0
- package/dist/client/components/sheets/resource-sheet.mjs.map +1 -0
- package/dist/client/components/ui/accordion.d.mts +2 -0
- package/dist/client/components/ui/accordion.mjs +50 -0
- package/dist/client/components/ui/accordion.mjs.map +1 -0
- package/dist/client/components/ui/alert.mjs +32 -0
- package/dist/client/components/ui/alert.mjs.map +1 -0
- package/dist/client/components/ui/avatar.d.mts +3 -0
- package/dist/client/components/ui/badge.d.mts +3 -0
- package/dist/client/components/ui/badge.mjs +35 -0
- package/dist/client/components/ui/badge.mjs.map +1 -0
- package/dist/client/components/ui/button.d.mts +3 -0
- package/dist/client/components/ui/button.mjs +49 -0
- package/dist/client/components/ui/button.mjs.map +1 -0
- package/dist/client/components/ui/card.d.mts +2 -0
- package/dist/{card-BKHjBQfw.mjs → client/components/ui/card.mjs} +3 -10
- package/dist/{card-BKHjBQfw.mjs.map → client/components/ui/card.mjs.map} +1 -1
- package/dist/client/components/ui/checkbox.d.mts +2 -0
- package/dist/client/components/ui/checkbox.mjs +27 -0
- package/dist/client/components/ui/checkbox.mjs.map +1 -0
- package/dist/client/components/ui/combobox.d.mts +3 -0
- package/dist/client/components/ui/command.mjs +69 -0
- package/dist/client/components/ui/command.mjs.map +1 -0
- package/dist/client/components/ui/dialog.d.mts +3 -0
- package/dist/client/components/ui/dialog.mjs +83 -0
- package/dist/client/components/ui/dialog.mjs.map +1 -0
- package/dist/client/components/ui/drawer.mjs +75 -0
- package/dist/client/components/ui/drawer.mjs.map +1 -0
- package/dist/client/components/ui/dropdown-menu.d.mts +3 -0
- package/dist/client/components/ui/dropdown-menu.mjs +89 -0
- package/dist/client/components/ui/dropdown-menu.mjs.map +1 -0
- package/dist/client/components/ui/empty-state.mjs +53 -0
- package/dist/client/components/ui/empty-state.mjs.map +1 -0
- package/dist/client/components/ui/field.d.mts +3 -0
- package/dist/client/components/ui/field.mjs +78 -0
- package/dist/client/components/ui/field.mjs.map +1 -0
- package/dist/client/components/ui/input-group.d.mts +4 -0
- package/dist/client/components/ui/input-group.mjs +68 -0
- package/dist/client/components/ui/input-group.mjs.map +1 -0
- package/dist/client/components/ui/input.d.mts +2 -0
- package/dist/client/components/ui/input.mjs +17 -0
- package/dist/client/components/ui/input.mjs.map +1 -0
- package/dist/client/components/ui/kbd.mjs +24 -0
- package/dist/client/components/ui/kbd.mjs.map +1 -0
- package/dist/client/components/ui/label.d.mts +2 -0
- package/dist/client/components/ui/label.mjs +15 -0
- package/dist/client/components/ui/label.mjs.map +1 -0
- package/dist/client/components/ui/popover.d.mts +3 -0
- package/dist/client/components/ui/popover.mjs +49 -0
- package/dist/client/components/ui/popover.mjs.map +1 -0
- package/dist/client/components/ui/responsive-dialog.mjs +102 -0
- package/dist/client/components/ui/responsive-dialog.mjs.map +1 -0
- package/dist/client/components/ui/scroll-area.d.mts +2 -0
- package/dist/client/components/ui/search-input.mjs +74 -0
- package/dist/client/components/ui/search-input.mjs.map +1 -0
- package/dist/client/components/ui/select.d.mts +3 -0
- package/dist/client/components/ui/select.mjs +85 -0
- package/dist/client/components/ui/select.mjs.map +1 -0
- package/dist/client/components/ui/separator.d.mts +2 -0
- package/dist/client/components/ui/separator.mjs +17 -0
- package/dist/client/components/ui/separator.mjs.map +1 -0
- package/dist/client/components/ui/sheet.d.mts +3 -0
- package/dist/client/components/ui/sheet.mjs +78 -0
- package/dist/client/components/ui/sheet.mjs.map +1 -0
- package/dist/client/components/ui/sidebar.d.mts +8 -0
- package/dist/client/components/ui/sidebar.mjs +256 -0
- package/dist/client/components/ui/sidebar.mjs.map +1 -0
- package/dist/client/components/ui/skeleton.d.mts +1 -0
- package/dist/client/components/ui/skeleton.mjs +15 -0
- package/dist/client/components/ui/skeleton.mjs.map +1 -0
- package/dist/client/components/ui/sonner.d.mts +14 -0
- package/dist/client/components/ui/sonner.d.mts.map +1 -0
- package/dist/client/components/ui/sonner.mjs +55 -0
- package/dist/client/components/ui/sonner.mjs.map +1 -0
- package/dist/client/components/ui/spinner.d.mts +1 -0
- package/dist/client/components/ui/spinner.mjs +18 -0
- package/dist/client/components/ui/spinner.mjs.map +1 -0
- package/dist/client/components/ui/switch.d.mts +2 -0
- package/dist/client/components/ui/switch.mjs +23 -0
- package/dist/client/components/ui/switch.mjs.map +1 -0
- package/dist/client/components/ui/table.d.mts +2 -0
- package/dist/client/components/ui/table.mjs +66 -0
- package/dist/client/components/ui/table.mjs.map +1 -0
- package/dist/client/components/ui/tabs.d.mts +3 -0
- package/dist/client/components/ui/tabs.mjs +49 -0
- package/dist/client/components/ui/tabs.mjs.map +1 -0
- package/dist/client/components/ui/textarea.d.mts +2 -0
- package/dist/client/components/ui/textarea.mjs +15 -0
- package/dist/client/components/ui/textarea.mjs.map +1 -0
- package/dist/client/components/ui/toolbar.mjs +54 -0
- package/dist/client/components/ui/toolbar.mjs.map +1 -0
- package/dist/client/components/ui/tooltip.d.mts +2 -0
- package/dist/client/components/ui/tooltip.mjs +45 -0
- package/dist/client/components/ui/tooltip.mjs.map +1 -0
- package/dist/client/components/widgets/chart-widget.d.mts +57 -0
- package/dist/client/components/widgets/chart-widget.d.mts.map +1 -0
- package/dist/client/components/widgets/chart-widget.mjs +282 -0
- package/dist/client/components/widgets/chart-widget.mjs.map +1 -0
- package/dist/client/components/widgets/progress-widget.d.mts +41 -0
- package/dist/client/components/widgets/progress-widget.d.mts.map +1 -0
- package/dist/client/components/widgets/progress-widget.mjs +110 -0
- package/dist/client/components/widgets/progress-widget.mjs.map +1 -0
- package/dist/client/components/widgets/quick-actions-widget.d.mts +29 -0
- package/dist/client/components/widgets/quick-actions-widget.d.mts.map +1 -0
- package/dist/client/components/widgets/quick-actions-widget.mjs +121 -0
- package/dist/client/components/widgets/quick-actions-widget.mjs.map +1 -0
- package/dist/client/components/widgets/recent-items-widget.d.mts +51 -0
- package/dist/client/components/widgets/recent-items-widget.d.mts.map +1 -0
- package/dist/client/components/widgets/recent-items-widget.mjs +101 -0
- package/dist/client/components/widgets/recent-items-widget.mjs.map +1 -0
- package/dist/client/components/widgets/stats-widget.d.mts +55 -0
- package/dist/client/components/widgets/stats-widget.d.mts.map +1 -0
- package/dist/client/components/widgets/stats-widget.mjs +150 -0
- package/dist/client/components/widgets/stats-widget.mjs.map +1 -0
- package/dist/client/components/widgets/table-widget.d.mts +31 -0
- package/dist/client/components/widgets/table-widget.d.mts.map +1 -0
- package/dist/client/components/widgets/table-widget.mjs +139 -0
- package/dist/client/components/widgets/table-widget.mjs.map +1 -0
- package/dist/client/components/widgets/timeline-widget.d.mts +51 -0
- package/dist/client/components/widgets/timeline-widget.d.mts.map +1 -0
- package/dist/client/components/widgets/timeline-widget.mjs +168 -0
- package/dist/client/components/widgets/timeline-widget.mjs.map +1 -0
- package/dist/client/components/widgets/value-widget.d.mts +39 -0
- package/dist/client/components/widgets/value-widget.d.mts.map +1 -0
- package/dist/client/components/widgets/value-widget.mjs +111 -0
- package/dist/client/components/widgets/value-widget.mjs.map +1 -0
- package/dist/client/components/widgets/widget-skeletons.mjs +145 -0
- package/dist/client/components/widgets/widget-skeletons.mjs.map +1 -0
- package/dist/client/context/focus-context.d.mts +88 -0
- package/dist/client/context/focus-context.d.mts.map +1 -0
- package/dist/client/context/focus-context.mjs +178 -0
- package/dist/client/context/focus-context.mjs.map +1 -0
- package/dist/client/contexts/breadcrumb-context.mjs +32 -0
- package/dist/client/contexts/breadcrumb-context.mjs.map +1 -0
- package/dist/client/hooks/typed-hooks.d.mts +84 -0
- package/dist/client/hooks/typed-hooks.d.mts.map +1 -0
- package/dist/client/hooks/typed-hooks.mjs +272 -0
- package/dist/client/hooks/typed-hooks.mjs.map +1 -0
- package/dist/client/hooks/use-action.mjs +201 -0
- package/dist/client/hooks/use-action.mjs.map +1 -0
- package/dist/client/hooks/use-admin-config.mjs +40 -0
- package/dist/client/hooks/use-admin-config.mjs.map +1 -0
- package/dist/client/hooks/use-admin-preferences.mjs +68 -0
- package/dist/client/hooks/use-admin-preferences.mjs.map +1 -0
- package/dist/client/hooks/use-admin-routes.mjs +97 -0
- package/dist/client/hooks/use-admin-routes.mjs.map +1 -0
- package/dist/client/hooks/use-auth.d.mts +98 -0
- package/dist/client/hooks/use-auth.d.mts.map +1 -0
- package/dist/{use-auth-BoLmWtmU.mjs → client/hooks/use-auth.mjs} +3 -3
- package/dist/client/hooks/use-auth.mjs.map +1 -0
- package/dist/client/hooks/use-collection-fields.mjs +32 -0
- package/dist/client/hooks/use-collection-fields.mjs.map +1 -0
- package/dist/client/hooks/use-collection-meta.mjs +121 -0
- package/dist/client/hooks/use-collection-meta.mjs.map +1 -0
- package/dist/client/hooks/use-collection-schema.mjs +67 -0
- package/dist/client/hooks/use-collection-schema.mjs.map +1 -0
- package/dist/client/hooks/use-collection-validation.mjs +74 -0
- package/dist/client/hooks/use-collection-validation.mjs.map +1 -0
- package/dist/client/hooks/use-collection.d.mts +86 -0
- package/dist/client/hooks/use-collection.d.mts.map +1 -0
- package/dist/client/hooks/use-collection.mjs +214 -0
- package/dist/client/hooks/use-collection.mjs.map +1 -0
- package/dist/client/hooks/use-current-user.d.mts +57 -0
- package/dist/client/hooks/use-current-user.d.mts.map +1 -0
- package/dist/client/hooks/use-current-user.mjs +79 -0
- package/dist/client/hooks/use-current-user.mjs.map +1 -0
- package/dist/client/hooks/use-field-hooks.mjs +191 -0
- package/dist/client/hooks/use-field-hooks.mjs.map +1 -0
- package/dist/client/hooks/use-field-options.d.mts +90 -0
- package/dist/client/hooks/use-field-options.d.mts.map +1 -0
- package/dist/client/hooks/use-field-options.mjs +184 -0
- package/dist/client/hooks/use-field-options.mjs.map +1 -0
- package/dist/client/hooks/use-global-fields.mjs +27 -0
- package/dist/client/hooks/use-global-fields.mjs.map +1 -0
- package/dist/client/hooks/use-global-meta.mjs +59 -0
- package/dist/client/hooks/use-global-meta.mjs.map +1 -0
- package/dist/client/hooks/use-global-schema.mjs +33 -0
- package/dist/client/hooks/use-global-schema.mjs.map +1 -0
- package/dist/client/hooks/use-global.d.mts +40 -0
- package/dist/client/hooks/use-global.d.mts.map +1 -0
- package/dist/client/hooks/use-global.mjs +74 -0
- package/dist/client/hooks/use-global.mjs.map +1 -0
- package/dist/client/hooks/use-locks.mjs +245 -0
- package/dist/client/hooks/use-locks.mjs.map +1 -0
- package/dist/client/hooks/use-media-query.d.mts +23 -0
- package/dist/client/hooks/use-media-query.d.mts.map +1 -0
- package/dist/client/hooks/use-media-query.mjs +62 -0
- package/dist/client/hooks/use-media-query.mjs.map +1 -0
- package/dist/client/hooks/use-prefill-params.mjs +47 -0
- package/dist/client/hooks/use-prefill-params.mjs.map +1 -0
- package/dist/client/hooks/use-questpie-query-options.mjs +28 -0
- package/dist/client/hooks/use-questpie-query-options.mjs.map +1 -0
- package/dist/client/hooks/use-reactive-fields.d.mts +75 -0
- package/dist/client/hooks/use-reactive-fields.d.mts.map +1 -0
- package/dist/client/hooks/use-reactive-fields.mjs +164 -0
- package/dist/client/hooks/use-reactive-fields.mjs.map +1 -0
- package/dist/client/hooks/use-realtime-highlight.mjs +96 -0
- package/dist/client/hooks/use-realtime-highlight.mjs.map +1 -0
- package/dist/client/hooks/use-saved-views.mjs +65 -0
- package/dist/client/hooks/use-saved-views.mjs.map +1 -0
- package/dist/client/hooks/use-search.mjs +147 -0
- package/dist/client/hooks/use-search.mjs.map +1 -0
- package/dist/client/hooks/use-server-validation.mjs +199 -0
- package/dist/client/hooks/use-server-validation.mjs.map +1 -0
- package/dist/client/hooks/use-server-widget-data.d.mts +26 -0
- package/dist/client/hooks/use-server-widget-data.d.mts.map +1 -0
- package/dist/client/hooks/use-server-widget-data.mjs +40 -0
- package/dist/client/hooks/use-server-widget-data.mjs.map +1 -0
- package/dist/client/hooks/use-setup-status.d.mts +39 -0
- package/dist/client/hooks/use-setup-status.d.mts.map +1 -0
- package/dist/client/hooks/use-setup-status.mjs +50 -0
- package/dist/client/hooks/use-setup-status.mjs.map +1 -0
- package/dist/client/hooks/use-upload-collection.mjs +32 -0
- package/dist/client/hooks/use-upload-collection.mjs.map +1 -0
- package/dist/client/hooks/use-upload.d.mts +23 -0
- package/dist/client/hooks/use-upload.d.mts.map +1 -0
- package/dist/client/hooks/use-upload.mjs +145 -0
- package/dist/client/hooks/use-upload.mjs.map +1 -0
- package/dist/client/hooks/use-validation-error-map.mjs +53 -0
- package/dist/client/hooks/use-validation-error-map.mjs.map +1 -0
- package/dist/client/hooks/use-view-state.mjs +261 -0
- package/dist/client/hooks/use-view-state.mjs.map +1 -0
- package/dist/client/i18n/hooks.mjs +160 -0
- package/dist/client/i18n/hooks.mjs.map +1 -0
- package/dist/client/i18n/intl-cache.mjs +65 -0
- package/dist/client/i18n/intl-cache.mjs.map +1 -0
- package/dist/client/i18n/messages.mjs +7 -0
- package/dist/client/i18n/messages.mjs.map +1 -0
- package/dist/client/i18n/simple.d.mts +22 -0
- package/dist/client/i18n/simple.d.mts.map +1 -0
- package/dist/client/i18n/simple.mjs +157 -0
- package/dist/client/i18n/simple.mjs.map +1 -0
- package/dist/client/i18n/types.d.mts +110 -0
- package/dist/client/i18n/types.d.mts.map +1 -0
- package/dist/client/lib/utils.d.mts +1 -0
- package/dist/client/lib/utils.mjs +28 -0
- package/dist/client/lib/utils.mjs.map +1 -0
- package/dist/client/preview/block-scope-context.d.mts +74 -0
- package/dist/client/preview/block-scope-context.d.mts.map +1 -0
- package/dist/client/preview/block-scope-context.mjs +93 -0
- package/dist/client/preview/block-scope-context.mjs.map +1 -0
- package/dist/client/preview/index.d.mts +5 -0
- package/dist/client/preview/preview-banner.d.mts +46 -0
- package/dist/client/preview/preview-banner.d.mts.map +1 -0
- package/dist/client/preview/preview-banner.mjs +95 -0
- package/dist/client/preview/preview-banner.mjs.map +1 -0
- package/dist/client/preview/preview-field.d.mts +108 -0
- package/dist/client/preview/preview-field.d.mts.map +1 -0
- package/dist/client/preview/preview-field.mjs +125 -0
- package/dist/client/preview/preview-field.mjs.map +1 -0
- package/dist/client/preview/types.d.mts +115 -0
- package/dist/client/preview/types.d.mts.map +1 -0
- package/dist/client/preview/types.mjs +21 -0
- package/dist/client/preview/types.mjs.map +1 -0
- package/dist/client/preview/use-collection-preview.d.mts +71 -0
- package/dist/client/preview/use-collection-preview.d.mts.map +1 -0
- package/dist/client/preview/use-collection-preview.mjs +114 -0
- package/dist/client/preview/use-collection-preview.mjs.map +1 -0
- package/dist/client/runtime/content-locales-provider.d.mts +1 -0
- package/dist/client/runtime/content-locales-provider.mjs +85 -0
- package/dist/client/runtime/content-locales-provider.mjs.map +1 -0
- package/dist/client/runtime/index.d.mts +7 -0
- package/dist/client/runtime/index.mjs +8 -0
- package/dist/client/runtime/locale-scope.d.mts +2 -0
- package/dist/{runtime-6VZM878K.mjs → client/runtime/locale-scope.mjs} +3 -4
- package/dist/client/runtime/locale-scope.mjs.map +1 -0
- package/dist/client/runtime/provider.d.mts +10107 -0
- package/dist/client/runtime/provider.d.mts.map +1 -0
- package/dist/client/runtime/provider.mjs +229 -0
- package/dist/client/runtime/provider.mjs.map +1 -0
- package/dist/client/runtime/routes.d.mts +49 -0
- package/dist/client/runtime/routes.d.mts.map +1 -0
- package/dist/client/runtime/routes.mjs +107 -0
- package/dist/client/runtime/routes.mjs.map +1 -0
- package/dist/client/runtime/translations-provider.d.mts +2 -0
- package/dist/client/runtime/translations-provider.mjs +181 -0
- package/dist/client/runtime/translations-provider.mjs.map +1 -0
- package/dist/client/scope/index.d.mts +3 -0
- package/dist/client/scope/picker.d.mts +54 -0
- package/dist/client/scope/picker.d.mts.map +1 -0
- package/dist/client/scope/picker.mjs +161 -0
- package/dist/client/scope/picker.mjs.map +1 -0
- package/dist/client/scope/provider.d.mts +104 -0
- package/dist/client/scope/provider.d.mts.map +1 -0
- package/dist/client/scope/provider.mjs +159 -0
- package/dist/client/scope/provider.mjs.map +1 -0
- package/dist/client/scope/types.d.mts +112 -0
- package/dist/client/scope/types.d.mts.map +1 -0
- package/dist/client/styles/index.css +80 -0
- package/dist/client/utils/auto-expand-fields.mjs +65 -0
- package/dist/client/utils/auto-expand-fields.mjs.map +1 -0
- package/dist/client/utils/build-field-definitions-from-schema.mjs +256 -0
- package/dist/client/utils/build-field-definitions-from-schema.mjs.map +1 -0
- package/dist/client/utils/detect-relations.mjs +46 -0
- package/dist/client/utils/detect-relations.mjs.map +1 -0
- package/dist/client/utils/locale-to-flag.d.mts +118 -0
- package/dist/client/utils/locale-to-flag.d.mts.map +1 -0
- package/dist/client/utils/locale-to-flag.mjs +130 -0
- package/dist/client/utils/locale-to-flag.mjs.map +1 -0
- package/dist/client/utils/routes.mjs +196 -0
- package/dist/client/utils/routes.mjs.map +1 -0
- package/dist/client/views/auth/accept-invite-form.d.mts +73 -0
- package/dist/client/views/auth/accept-invite-form.d.mts.map +1 -0
- package/dist/client/views/auth/accept-invite-form.mjs +180 -0
- package/dist/client/views/auth/accept-invite-form.mjs.map +1 -0
- package/dist/client/views/auth/auth-layout.d.mts +44 -0
- package/dist/client/views/auth/auth-layout.d.mts.map +1 -0
- package/dist/client/views/auth/auth-layout.mjs +53 -0
- package/dist/client/views/auth/auth-layout.mjs.map +1 -0
- package/dist/client/views/auth/forgot-password-form.d.mts +59 -0
- package/dist/client/views/auth/forgot-password-form.d.mts.map +1 -0
- package/dist/{forgot-password-page-Bcp-An4Y.mjs → client/views/auth/forgot-password-form.mjs} +22 -89
- package/dist/client/views/auth/forgot-password-form.mjs.map +1 -0
- package/dist/client/views/auth/index.d.mts +7 -0
- package/dist/client/views/auth/invite-form.d.mts +1 -0
- package/dist/client/views/auth/invite-form.mjs +155 -0
- package/dist/client/views/auth/invite-form.mjs.map +1 -0
- package/dist/client/views/auth/login-form.d.mts +76 -0
- package/dist/client/views/auth/login-form.d.mts.map +1 -0
- package/dist/client/views/auth/login-form.mjs +167 -0
- package/dist/client/views/auth/login-form.mjs.map +1 -0
- package/dist/client/views/auth/reset-password-form.d.mts +66 -0
- package/dist/client/views/auth/reset-password-form.d.mts.map +1 -0
- package/dist/client/views/auth/reset-password-form.mjs +188 -0
- package/dist/client/views/auth/reset-password-form.mjs.map +1 -0
- package/dist/client/views/auth/setup-form.d.mts +61 -0
- package/dist/client/views/auth/setup-form.d.mts.map +1 -0
- package/dist/{setup-page-YAP_fzqh.mjs → client/views/auth/setup-form.mjs} +46 -124
- package/dist/client/views/auth/setup-form.mjs.map +1 -0
- package/dist/client/views/collection/auto-form-fields.d.mts +4 -0
- package/dist/client/views/collection/auto-form-fields.mjs +453 -0
- package/dist/client/views/collection/auto-form-fields.mjs.map +1 -0
- package/dist/client/views/collection/bulk-action-toolbar.mjs +291 -0
- package/dist/client/views/collection/bulk-action-toolbar.mjs.map +1 -0
- package/dist/client/views/collection/cells/complex-cells.d.mts +46 -0
- package/dist/client/views/collection/cells/complex-cells.d.mts.map +1 -0
- package/dist/client/views/collection/cells/complex-cells.mjs +327 -0
- package/dist/client/views/collection/cells/complex-cells.mjs.map +1 -0
- package/dist/client/views/collection/cells/index.d.mts +7 -0
- package/dist/client/views/collection/cells/primitive-cells.d.mts +76 -0
- package/dist/client/views/collection/cells/primitive-cells.d.mts.map +1 -0
- package/dist/client/views/collection/cells/primitive-cells.mjs +165 -0
- package/dist/client/views/collection/cells/primitive-cells.mjs.map +1 -0
- package/dist/client/views/collection/cells/relation-cells.d.mts +21 -0
- package/dist/client/views/collection/cells/relation-cells.d.mts.map +1 -0
- package/dist/client/views/collection/cells/relation-cells.mjs +105 -0
- package/dist/client/views/collection/cells/relation-cells.mjs.map +1 -0
- package/dist/client/views/collection/cells/shared/asset-thumbnail.d.mts +1 -0
- package/dist/client/views/collection/cells/shared/asset-thumbnail.mjs +189 -0
- package/dist/client/views/collection/cells/shared/asset-thumbnail.mjs.map +1 -0
- package/dist/client/views/collection/cells/shared/cell-helpers.d.mts +2 -0
- package/dist/client/views/collection/cells/shared/cell-helpers.mjs +78 -0
- package/dist/client/views/collection/cells/shared/cell-helpers.mjs.map +1 -0
- package/dist/client/views/collection/cells/shared/relation-chip.d.mts +1 -0
- package/dist/client/views/collection/cells/shared/relation-chip.mjs +37 -0
- package/dist/client/views/collection/cells/shared/relation-chip.mjs.map +1 -0
- package/dist/client/views/collection/cells/upload-cells.d.mts +25 -0
- package/dist/client/views/collection/cells/upload-cells.d.mts.map +1 -0
- package/dist/client/views/collection/cells/upload-cells.mjs +20 -0
- package/dist/client/views/collection/cells/upload-cells.mjs.map +1 -0
- package/dist/client/views/collection/columns/build-columns.d.mts +2 -0
- package/dist/client/views/collection/columns/build-columns.mjs +156 -0
- package/dist/client/views/collection/columns/build-columns.mjs.map +1 -0
- package/dist/client/views/collection/columns/column-defaults.d.mts +2 -0
- package/dist/client/views/collection/columns/column-defaults.mjs +108 -0
- package/dist/client/views/collection/columns/column-defaults.mjs.map +1 -0
- package/dist/client/views/collection/columns/index.d.mts +3 -0
- package/dist/client/views/collection/columns/types.d.mts +2 -0
- package/dist/client/views/collection/field-context.mjs +127 -0
- package/dist/client/views/collection/field-context.mjs.map +1 -0
- package/dist/client/views/collection/field-renderer.mjs +171 -0
- package/dist/client/views/collection/field-renderer.mjs.map +1 -0
- package/dist/client/views/collection/form-view.d.mts +112 -0
- package/dist/client/views/collection/form-view.d.mts.map +1 -0
- package/dist/client/views/collection/form-view.mjs +903 -0
- package/dist/client/views/collection/form-view.mjs.map +1 -0
- package/dist/client/views/collection/index.d.mts +9 -0
- package/dist/client/views/collection/table-view.d.mts +102 -0
- package/dist/client/views/collection/table-view.d.mts.map +1 -0
- package/dist/client/views/collection/table-view.mjs +695 -0
- package/dist/client/views/collection/table-view.mjs.map +1 -0
- package/dist/client/views/collection/view-skeletons.mjs +121 -0
- package/dist/client/views/collection/view-skeletons.mjs.map +1 -0
- package/dist/client/views/common/global-search.d.mts +1 -0
- package/dist/client/views/common/global-search.mjs +376 -0
- package/dist/client/views/common/global-search.mjs.map +1 -0
- package/dist/client/views/common/index.d.mts +1 -0
- package/dist/client/views/dashboard/dashboard-grid.mjs +385 -0
- package/dist/client/views/dashboard/dashboard-grid.mjs.map +1 -0
- package/dist/client/views/dashboard/dashboard-widget.mjs +178 -0
- package/dist/client/views/dashboard/dashboard-widget.mjs.map +1 -0
- package/dist/client/views/dashboard/widget-card.mjs +159 -0
- package/dist/client/views/dashboard/widget-card.mjs.map +1 -0
- package/dist/client/views/globals/global-form-view.d.mts +74 -0
- package/dist/client/views/globals/global-form-view.d.mts.map +1 -0
- package/dist/client/views/globals/global-form-view.mjs +181 -0
- package/dist/client/views/globals/global-form-view.mjs.map +1 -0
- package/dist/client/views/index.d.mts +28 -0
- package/dist/client/views/layout/admin-layout-provider.d.mts +140 -0
- package/dist/client/views/layout/admin-layout-provider.d.mts.map +1 -0
- package/dist/client/views/layout/admin-layout-provider.mjs +90 -0
- package/dist/client/views/layout/admin-layout-provider.mjs.map +1 -0
- package/dist/client/views/layout/admin-layout.d.mts +151 -0
- package/dist/client/views/layout/admin-layout.d.mts.map +1 -0
- package/dist/client/views/layout/admin-layout.mjs +144 -0
- package/dist/client/views/layout/admin-layout.mjs.map +1 -0
- package/dist/client/views/layout/admin-root.d.mts +7 -0
- package/dist/client/views/layout/admin-router.d.mts +125 -0
- package/dist/client/views/layout/admin-router.d.mts.map +1 -0
- package/dist/client/views/layout/admin-router.mjs +594 -0
- package/dist/client/views/layout/admin-router.mjs.map +1 -0
- package/dist/client/views/layout/admin-sidebar.d.mts +105 -0
- package/dist/client/views/layout/admin-sidebar.d.mts.map +1 -0
- package/dist/client/views/layout/admin-sidebar.mjs +550 -0
- package/dist/client/views/layout/admin-sidebar.mjs.map +1 -0
- package/dist/client/views/layout/admin-topbar.mjs +128 -0
- package/dist/client/views/layout/admin-topbar.mjs.map +1 -0
- package/dist/client/views/layout/index.d.mts +5 -0
- package/dist/client/views/pages/accept-invite-page.d.mts +67 -0
- package/dist/client/views/pages/accept-invite-page.d.mts.map +1 -0
- package/dist/client/views/pages/accept-invite-page.mjs +143 -0
- package/dist/client/views/pages/accept-invite-page.mjs.map +1 -0
- package/dist/client/views/pages/dashboard-page.d.mts +52 -0
- package/dist/client/views/pages/dashboard-page.d.mts.map +1 -0
- package/dist/client/views/pages/dashboard-page.mjs +45 -0
- package/dist/client/views/pages/dashboard-page.mjs.map +1 -0
- package/dist/client/views/pages/forgot-password-page.d.mts +59 -0
- package/dist/client/views/pages/forgot-password-page.d.mts.map +1 -0
- package/dist/client/views/pages/forgot-password-page.mjs +80 -0
- package/dist/client/views/pages/forgot-password-page.mjs.map +1 -0
- package/dist/client/views/pages/index.d.mts +7 -0
- package/dist/client/views/pages/invite-page.d.mts +71 -0
- package/dist/client/views/pages/invite-page.d.mts.map +1 -0
- package/dist/client/views/pages/invite-page.mjs +86 -0
- package/dist/client/views/pages/invite-page.mjs.map +1 -0
- package/dist/client/views/pages/login-page.d.mts +76 -0
- package/dist/client/views/pages/login-page.d.mts.map +1 -0
- package/dist/client/views/pages/login-page.mjs +98 -0
- package/dist/client/views/pages/login-page.mjs.map +1 -0
- package/dist/client/views/pages/reset-password-page.d.mts +66 -0
- package/dist/client/views/pages/reset-password-page.d.mts.map +1 -0
- package/dist/client/views/pages/reset-password-page.mjs +105 -0
- package/dist/client/views/pages/reset-password-page.mjs.map +1 -0
- package/dist/client/views/pages/setup-page.d.mts +64 -0
- package/dist/client/views/pages/setup-page.d.mts.map +1 -0
- package/dist/client/views/pages/setup-page.mjs +91 -0
- package/dist/client/views/pages/setup-page.mjs.map +1 -0
- package/dist/client.d.mts +92 -3
- package/dist/client.d.mts.map +1 -0
- package/dist/client.mjs +54 -12
- package/dist/components/rich-text/index.d.mts +1 -0
- package/dist/components/rich-text/rich-text-renderer.d.mts +104 -0
- package/dist/components/rich-text/rich-text-renderer.d.mts.map +1 -0
- package/dist/components/rich-text/rich-text-renderer.mjs +210 -0
- package/dist/components/rich-text/rich-text-renderer.mjs.map +1 -0
- package/dist/index.d.mts +62 -3
- package/dist/index.mjs +54 -12
- package/dist/server/adapters/nextjs.d.mts +121 -0
- package/dist/server/adapters/nextjs.d.mts.map +1 -0
- package/dist/server/adapters/nextjs.mjs +111 -0
- package/dist/server/adapters/nextjs.mjs.map +1 -0
- package/dist/server/adapters/tanstack.d.mts +133 -0
- package/dist/server/adapters/tanstack.d.mts.map +1 -0
- package/dist/server/adapters/tanstack.mjs +90 -0
- package/dist/server/adapters/tanstack.mjs.map +1 -0
- package/dist/server/augmentation.d.mts +1523 -0
- package/dist/server/augmentation.d.mts.map +1 -0
- package/dist/server/auth-helpers.d.mts +143 -0
- package/dist/server/auth-helpers.d.mts.map +1 -0
- package/dist/server/auth-helpers.mjs +108 -0
- package/dist/server/auth-helpers.mjs.map +1 -0
- package/dist/server/block/block-builder.d.mts +319 -0
- package/dist/server/block/block-builder.d.mts.map +1 -0
- package/dist/server/block/block-builder.mjs +217 -0
- package/dist/server/block/block-builder.mjs.map +1 -0
- package/dist/server/block/index.d.mts +3 -0
- package/dist/server/block/introspection.d.mts +84 -0
- package/dist/server/block/introspection.d.mts.map +1 -0
- package/dist/server/block/introspection.mjs +89 -0
- package/dist/server/block/introspection.mjs.map +1 -0
- package/dist/server/block/prefetch.d.mts +78 -0
- package/dist/server/block/prefetch.d.mts.map +1 -0
- package/dist/server/block/prefetch.mjs +240 -0
- package/dist/server/block/prefetch.mjs.map +1 -0
- package/dist/server/fields/blocks.d.mts +139 -0
- package/dist/server/fields/blocks.d.mts.map +1 -0
- package/dist/server/fields/blocks.mjs +192 -0
- package/dist/server/fields/blocks.mjs.map +1 -0
- package/dist/server/fields/index.d.mts +48 -0
- package/dist/server/fields/index.d.mts.map +1 -0
- package/dist/server/fields/index.mjs +16 -0
- package/dist/server/fields/index.mjs.map +1 -0
- package/dist/server/fields/rich-text.d.mts +135 -0
- package/dist/server/fields/rich-text.d.mts.map +1 -0
- package/dist/server/fields/rich-text.mjs +188 -0
- package/dist/server/fields/rich-text.mjs.map +1 -0
- package/dist/server/i18n/index.d.mts +16 -0
- package/dist/server/i18n/index.d.mts.map +1 -0
- package/dist/server/i18n/index.mjs +44 -0
- package/dist/server/i18n/index.mjs.map +1 -0
- package/dist/server/i18n/messages/cs.mjs +461 -0
- package/dist/server/i18n/messages/cs.mjs.map +1 -0
- package/dist/server/i18n/messages/de.mjs +461 -0
- package/dist/server/i18n/messages/de.mjs.map +1 -0
- package/dist/server/i18n/messages/en.mjs +493 -0
- package/dist/server/i18n/messages/en.mjs.map +1 -0
- package/dist/server/i18n/messages/es.mjs +461 -0
- package/dist/server/i18n/messages/es.mjs.map +1 -0
- package/dist/server/i18n/messages/fr.mjs +461 -0
- package/dist/server/i18n/messages/fr.mjs.map +1 -0
- package/dist/server/i18n/messages/index.mjs +24 -0
- package/dist/server/i18n/messages/index.mjs.map +1 -0
- package/dist/server/i18n/messages/pl.mjs +461 -0
- package/dist/server/i18n/messages/pl.mjs.map +1 -0
- package/dist/server/i18n/messages/pt.mjs +464 -0
- package/dist/server/i18n/messages/pt.mjs.map +1 -0
- package/dist/server/i18n/messages/sk.mjs +490 -0
- package/dist/server/i18n/messages/sk.mjs.map +1 -0
- package/dist/server/index.d.mts +20 -0
- package/dist/server/modules/admin/functions/admin-config.mjs +348 -0
- package/dist/server/modules/admin/functions/admin-config.mjs.map +1 -0
- package/dist/server/modules/admin/functions/execute-action.d.mts +107 -0
- package/dist/server/modules/admin/functions/execute-action.d.mts.map +1 -0
- package/dist/server/modules/admin/functions/execute-action.mjs +331 -0
- package/dist/server/modules/admin/functions/execute-action.mjs.map +1 -0
- package/dist/server/modules/admin/functions/locales.mjs +80 -0
- package/dist/server/modules/admin/functions/locales.mjs.map +1 -0
- package/dist/server/modules/admin/functions/preview.d.mts +70 -0
- package/dist/server/modules/admin/functions/preview.d.mts.map +1 -0
- package/dist/server/modules/admin/functions/preview.mjs +243 -0
- package/dist/server/modules/admin/functions/preview.mjs.map +1 -0
- package/dist/server/modules/admin/functions/reactive.d.mts +99 -0
- package/dist/server/modules/admin/functions/reactive.d.mts.map +1 -0
- package/dist/server/modules/admin/functions/reactive.mjs +378 -0
- package/dist/server/modules/admin/functions/reactive.mjs.map +1 -0
- package/dist/server/modules/admin/functions/setup.d.mts +84 -0
- package/dist/server/modules/admin/functions/setup.d.mts.map +1 -0
- package/dist/server/modules/admin/functions/setup.mjs +131 -0
- package/dist/server/modules/admin/functions/setup.mjs.map +1 -0
- package/dist/server/modules/admin/functions/translations.mjs +125 -0
- package/dist/server/modules/admin/functions/translations.mjs.map +1 -0
- package/dist/server/modules/admin/functions/widget-data.d.mts +33 -0
- package/dist/server/modules/admin/functions/widget-data.d.mts.map +1 -0
- package/dist/server/modules/admin/functions/widget-data.mjs +70 -0
- package/dist/server/modules/admin/functions/widget-data.mjs.map +1 -0
- package/dist/server/modules/admin/index.d.mts +16879 -0
- package/dist/server/modules/admin/index.d.mts.map +1 -0
- package/dist/server/modules/admin/index.mjs +249 -0
- package/dist/server/modules/admin/index.mjs.map +1 -0
- package/dist/server/modules/admin-preferences/collections/admin-preferences.collection.d.mts +3 -0
- package/dist/server/modules/admin-preferences/collections/admin-preferences.collection.mjs +48 -0
- package/dist/server/modules/admin-preferences/collections/admin-preferences.collection.mjs.map +1 -0
- package/dist/server/modules/admin-preferences/collections/locks.collection.d.mts +3 -0
- package/dist/server/modules/admin-preferences/collections/locks.collection.mjs +79 -0
- package/dist/server/modules/admin-preferences/collections/locks.collection.mjs.map +1 -0
- package/dist/server/modules/admin-preferences/collections/saved-views.collection.d.mts +1490 -0
- package/dist/server/modules/admin-preferences/collections/saved-views.collection.d.mts.map +1 -0
- package/dist/server/modules/admin-preferences/collections/saved-views.collection.mjs +57 -0
- package/dist/server/modules/admin-preferences/collections/saved-views.collection.mjs.map +1 -0
- package/dist/server/patch.d.mts +100 -0
- package/dist/server/patch.d.mts.map +1 -0
- package/dist/server/patch.mjs +1062 -0
- package/dist/server/patch.mjs.map +1 -0
- package/dist/server.d.mts +21 -250
- package/dist/server.mjs +19 -832
- package/dist/shared/preview-utils.d.mts +54 -0
- package/dist/shared/preview-utils.d.mts.map +1 -0
- package/dist/{preview-utils-BKQ9-TMa.mjs → shared/preview-utils.mjs} +2 -2
- package/dist/shared/preview-utils.mjs.map +1 -0
- package/dist/{saved-views.types-BMsz5mCy.d.mts → shared/types/saved-views.types.d.mts} +7 -2
- package/dist/shared/types/saved-views.types.d.mts.map +1 -0
- package/dist/shared.d.mts +3 -57
- package/dist/shared.mjs +1 -1
- package/package.json +12 -17
- package/dist/auth-layout-M8K8_q5R.mjs +0 -181
- package/dist/auth-layout-M8K8_q5R.mjs.map +0 -1
- package/dist/bulk-upload-dialog-D7w7W1Hl.mjs +0 -273
- package/dist/bulk-upload-dialog-D7w7W1Hl.mjs.map +0 -1
- package/dist/client-B7r47hEd.d.mts +0 -13403
- package/dist/client-B7r47hEd.d.mts.map +0 -1
- package/dist/client-njX1rZmi.mjs +0 -22612
- package/dist/client-njX1rZmi.mjs.map +0 -1
- package/dist/content-locales-provider-BXvuIgfg.mjs +0 -1650
- package/dist/content-locales-provider-BXvuIgfg.mjs.map +0 -1
- package/dist/dashboard-page-B4PGEdc2.mjs +0 -2500
- package/dist/dashboard-page-B4PGEdc2.mjs.map +0 -1
- package/dist/dashboard-page-mCY0pgZv.mjs +0 -3
- package/dist/dropzone-Do3awXKd.mjs +0 -634
- package/dist/dropzone-Do3awXKd.mjs.map +0 -1
- package/dist/forgot-password-page-Bcp-An4Y.mjs.map +0 -1
- package/dist/forgot-password-page-CEwsdLwn.mjs +0 -3
- package/dist/index-BYyqkWtn.d.mts +0 -2753
- package/dist/index-BYyqkWtn.d.mts.map +0 -1
- package/dist/login-page-BUnpCbCa.mjs +0 -3
- package/dist/login-page-CP4gA-dl.mjs +0 -298
- package/dist/login-page-CP4gA-dl.mjs.map +0 -1
- package/dist/preview-utils-BKQ9-TMa.mjs.map +0 -1
- package/dist/reset-password-page-BqfDmLxA.mjs +0 -281
- package/dist/reset-password-page-BqfDmLxA.mjs.map +0 -1
- package/dist/reset-password-page-CufHz3h3.mjs +0 -3
- package/dist/runtime-6VZM878K.mjs.map +0 -1
- package/dist/saved-views.types-BMsz5mCy.d.mts.map +0 -1
- package/dist/server.d.mts.map +0 -1
- package/dist/server.mjs.map +0 -1
- package/dist/setup-page-BNNzt_Z6.mjs +0 -3
- package/dist/setup-page-YAP_fzqh.mjs.map +0 -1
- package/dist/shared.d.mts.map +0 -1
- package/dist/use-auth-BoLmWtmU.mjs.map +0 -1
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useResolveText } from "../../i18n/hooks.mjs";
|
|
4
|
+
import { cn } from "../../lib/utils.mjs";
|
|
5
|
+
import { useIsMobile } from "../../hooks/use-media-query.mjs";
|
|
6
|
+
import { Drawer, DrawerContent, DrawerHeader, DrawerTitle, DrawerTrigger } from "../ui/drawer.mjs";
|
|
7
|
+
import { Badge } from "../ui/badge.mjs";
|
|
8
|
+
import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from "../ui/command.mjs";
|
|
9
|
+
import { Popover, PopoverContent, PopoverTrigger } from "../ui/popover.mjs";
|
|
10
|
+
import { flattenOptions } from "./types.mjs";
|
|
11
|
+
import { Icon } from "@iconify/react";
|
|
12
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
13
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
14
|
+
|
|
15
|
+
//#region src/client/components/primitives/select-multi.tsx
|
|
16
|
+
/**
|
|
17
|
+
* SelectMulti - Multi-select component with chips
|
|
18
|
+
*
|
|
19
|
+
* Features:
|
|
20
|
+
* - Always searchable
|
|
21
|
+
* - Responsive: Popover on desktop, Drawer on mobile
|
|
22
|
+
* - Chip display with remove buttons
|
|
23
|
+
* - Supports static and async options
|
|
24
|
+
* - Keyboard navigation
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```tsx
|
|
28
|
+
* <SelectMulti
|
|
29
|
+
* value={selectedTags}
|
|
30
|
+
* onChange={setSelectedTags}
|
|
31
|
+
* options={[
|
|
32
|
+
* { value: "react", label: "React" },
|
|
33
|
+
* { value: "vue", label: "Vue" },
|
|
34
|
+
* { value: "angular", label: "Angular" },
|
|
35
|
+
* ]}
|
|
36
|
+
* />
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
function SelectMulti({ value = [], onChange, options: staticOptions = [], loadOptions, maxSelections, debounceMs = 300, loading: externalLoading = false, emptyMessage = "No options found", placeholder = "Select...", disabled, className, id, "aria-invalid": ariaInvalid, drawerTitle = "Select options", maxVisibleChips = 3 }) {
|
|
40
|
+
const resolveText = useResolveText();
|
|
41
|
+
const resolvedPlaceholder = resolveText(placeholder);
|
|
42
|
+
const resolvedEmptyMessage = resolveText(emptyMessage);
|
|
43
|
+
const resolvedDrawerTitle = resolveText(drawerTitle);
|
|
44
|
+
const [open, setOpen] = useState(false);
|
|
45
|
+
const [search, setSearch] = useState("");
|
|
46
|
+
const [dynamicOptions, setDynamicOptions] = useState([]);
|
|
47
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
48
|
+
const debounceRef = useRef(null);
|
|
49
|
+
const isMobile = useIsMobile();
|
|
50
|
+
const flatStaticOptions = useMemo(() => flattenOptions(staticOptions), [staticOptions]);
|
|
51
|
+
const allOptions = useMemo(() => {
|
|
52
|
+
if (loadOptions) return dynamicOptions;
|
|
53
|
+
return flatStaticOptions;
|
|
54
|
+
}, [
|
|
55
|
+
loadOptions,
|
|
56
|
+
dynamicOptions,
|
|
57
|
+
flatStaticOptions
|
|
58
|
+
]);
|
|
59
|
+
const filteredOptions = useMemo(() => {
|
|
60
|
+
if (loadOptions) return allOptions;
|
|
61
|
+
if (!search) return allOptions;
|
|
62
|
+
return allOptions.filter((opt) => resolveText(opt.label).toLowerCase().includes(search.toLowerCase()));
|
|
63
|
+
}, [
|
|
64
|
+
allOptions,
|
|
65
|
+
search,
|
|
66
|
+
loadOptions,
|
|
67
|
+
resolveText
|
|
68
|
+
]);
|
|
69
|
+
useEffect(() => {
|
|
70
|
+
if (!loadOptions) return;
|
|
71
|
+
if (debounceRef.current) clearTimeout(debounceRef.current);
|
|
72
|
+
debounceRef.current = setTimeout(async () => {
|
|
73
|
+
setIsLoading(true);
|
|
74
|
+
try {
|
|
75
|
+
setDynamicOptions(await loadOptions(search));
|
|
76
|
+
} catch (error) {
|
|
77
|
+
console.error("Failed to load options:", error);
|
|
78
|
+
setDynamicOptions([]);
|
|
79
|
+
} finally {
|
|
80
|
+
setIsLoading(false);
|
|
81
|
+
}
|
|
82
|
+
}, debounceMs);
|
|
83
|
+
return () => {
|
|
84
|
+
if (debounceRef.current) clearTimeout(debounceRef.current);
|
|
85
|
+
};
|
|
86
|
+
}, [
|
|
87
|
+
search,
|
|
88
|
+
loadOptions,
|
|
89
|
+
debounceMs
|
|
90
|
+
]);
|
|
91
|
+
const getLabel = useCallback((val) => {
|
|
92
|
+
const option = allOptions.find((opt) => opt.value === val);
|
|
93
|
+
return option?.label ? resolveText(option.label) : String(val);
|
|
94
|
+
}, [allOptions, resolveText]);
|
|
95
|
+
const handleToggle = useCallback((selectedValue) => {
|
|
96
|
+
const typedValue = selectedValue;
|
|
97
|
+
if (value.includes(typedValue)) onChange(value.filter((v) => v !== typedValue));
|
|
98
|
+
else {
|
|
99
|
+
if (maxSelections && value.length >= maxSelections) return;
|
|
100
|
+
onChange([...value, typedValue]);
|
|
101
|
+
}
|
|
102
|
+
}, [
|
|
103
|
+
value,
|
|
104
|
+
onChange,
|
|
105
|
+
maxSelections
|
|
106
|
+
]);
|
|
107
|
+
const handleRemove = useCallback((removedValue, e) => {
|
|
108
|
+
e?.stopPropagation();
|
|
109
|
+
onChange(value.filter((v) => v !== removedValue));
|
|
110
|
+
}, [value, onChange]);
|
|
111
|
+
const handleClearAll = useCallback((e) => {
|
|
112
|
+
e.stopPropagation();
|
|
113
|
+
onChange([]);
|
|
114
|
+
}, [onChange]);
|
|
115
|
+
const showLoading = isLoading || externalLoading;
|
|
116
|
+
const canAddMore = !maxSelections || value.length < maxSelections;
|
|
117
|
+
const visibleChips = value.slice(0, maxVisibleChips);
|
|
118
|
+
const hiddenCount = value.length - maxVisibleChips;
|
|
119
|
+
const TriggerContent = /* @__PURE__ */ jsxs("div", {
|
|
120
|
+
id,
|
|
121
|
+
role: "combobox",
|
|
122
|
+
"aria-controls": "select-multi-list",
|
|
123
|
+
"aria-haspopup": "listbox",
|
|
124
|
+
"aria-expanded": open,
|
|
125
|
+
"aria-invalid": ariaInvalid,
|
|
126
|
+
tabIndex: 0,
|
|
127
|
+
className: cn("flex min-h-9 w-full flex-wrap items-center gap-1 rounded-md border border-input/80 bg-input/20 backdrop-blur-sm px-3 py-1.5 text-sm transition-colors", "focus-within:ring-2 focus-within:ring-ring focus-within:border-ring", disabled && "cursor-not-allowed opacity-50", ariaInvalid && "border-destructive ring-destructive/20", className),
|
|
128
|
+
children: [value.length === 0 ? /* @__PURE__ */ jsx("span", {
|
|
129
|
+
className: "text-muted-foreground text-xs",
|
|
130
|
+
children: resolvedPlaceholder
|
|
131
|
+
}) : /* @__PURE__ */ jsxs(Fragment, { children: [visibleChips.map((val) => /* @__PURE__ */ jsxs(Badge, {
|
|
132
|
+
variant: "secondary",
|
|
133
|
+
className: "gap-1 pr-1",
|
|
134
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
135
|
+
className: "truncate max-w-24",
|
|
136
|
+
children: getLabel(val)
|
|
137
|
+
}), !disabled && /* @__PURE__ */ jsx("button", {
|
|
138
|
+
type: "button",
|
|
139
|
+
onClick: (e) => handleRemove(val, e),
|
|
140
|
+
className: "rounded-full hover:bg-muted-foreground/20 p-0.5",
|
|
141
|
+
children: /* @__PURE__ */ jsx(Icon, {
|
|
142
|
+
icon: "ph:x",
|
|
143
|
+
className: "size-2.5"
|
|
144
|
+
})
|
|
145
|
+
})]
|
|
146
|
+
}, String(val))), hiddenCount > 0 && /* @__PURE__ */ jsxs(Badge, {
|
|
147
|
+
variant: "outline",
|
|
148
|
+
className: "text-muted-foreground",
|
|
149
|
+
children: [
|
|
150
|
+
"+",
|
|
151
|
+
hiddenCount,
|
|
152
|
+
" more"
|
|
153
|
+
]
|
|
154
|
+
})] }), /* @__PURE__ */ jsxs("div", {
|
|
155
|
+
className: "ml-auto flex items-center gap-1 shrink-0",
|
|
156
|
+
children: [value.length > 0 && !disabled && /* @__PURE__ */ jsx("button", {
|
|
157
|
+
type: "button",
|
|
158
|
+
onClick: handleClearAll,
|
|
159
|
+
className: "rounded-sm opacity-50 hover:opacity-100 hover:bg-muted p-0.5",
|
|
160
|
+
children: /* @__PURE__ */ jsx(Icon, {
|
|
161
|
+
icon: "ph:x",
|
|
162
|
+
className: "size-3"
|
|
163
|
+
})
|
|
164
|
+
}), /* @__PURE__ */ jsx(Icon, {
|
|
165
|
+
icon: "ph:plus",
|
|
166
|
+
className: "size-3.5 opacity-50"
|
|
167
|
+
})]
|
|
168
|
+
})]
|
|
169
|
+
});
|
|
170
|
+
const CommandContent = /* @__PURE__ */ jsxs(Command, {
|
|
171
|
+
shouldFilter: !loadOptions,
|
|
172
|
+
children: [
|
|
173
|
+
/* @__PURE__ */ jsx(CommandInput, {
|
|
174
|
+
placeholder: "Search...",
|
|
175
|
+
value: search,
|
|
176
|
+
onValueChange: setSearch
|
|
177
|
+
}),
|
|
178
|
+
/* @__PURE__ */ jsxs(CommandList, { children: [
|
|
179
|
+
showLoading && /* @__PURE__ */ jsx("div", {
|
|
180
|
+
className: "flex items-center justify-center py-6",
|
|
181
|
+
children: /* @__PURE__ */ jsx(Icon, {
|
|
182
|
+
icon: "ph:circle-notch",
|
|
183
|
+
className: "size-4 animate-spin text-muted-foreground"
|
|
184
|
+
})
|
|
185
|
+
}),
|
|
186
|
+
/* @__PURE__ */ jsx(CommandEmpty, { children: resolvedEmptyMessage }),
|
|
187
|
+
/* @__PURE__ */ jsx(CommandGroup, { children: filteredOptions.map((option) => {
|
|
188
|
+
const isSelected = value.includes(option.value);
|
|
189
|
+
const isDisabled = option.disabled || !isSelected && !canAddMore;
|
|
190
|
+
return /* @__PURE__ */ jsxs(CommandItem, {
|
|
191
|
+
value: String(option.value),
|
|
192
|
+
onSelect: handleToggle,
|
|
193
|
+
disabled: isDisabled,
|
|
194
|
+
children: [
|
|
195
|
+
/* @__PURE__ */ jsx("div", {
|
|
196
|
+
className: cn("flex size-4 items-center justify-center rounded-sm border", isSelected ? "bg-primary border-primary text-primary-foreground" : "border-muted-foreground/30"),
|
|
197
|
+
children: isSelected && /* @__PURE__ */ jsx(Icon, {
|
|
198
|
+
icon: "ph:check",
|
|
199
|
+
className: "size-3"
|
|
200
|
+
})
|
|
201
|
+
}),
|
|
202
|
+
option.icon,
|
|
203
|
+
/* @__PURE__ */ jsx("span", {
|
|
204
|
+
className: "truncate",
|
|
205
|
+
children: resolveText(option.label)
|
|
206
|
+
})
|
|
207
|
+
]
|
|
208
|
+
}, String(option.value));
|
|
209
|
+
}) })
|
|
210
|
+
] }),
|
|
211
|
+
maxSelections && /* @__PURE__ */ jsxs("div", {
|
|
212
|
+
className: "border-t p-2 text-center text-xs text-muted-foreground",
|
|
213
|
+
children: [
|
|
214
|
+
value.length,
|
|
215
|
+
" / ",
|
|
216
|
+
maxSelections,
|
|
217
|
+
" selected"
|
|
218
|
+
]
|
|
219
|
+
})
|
|
220
|
+
]
|
|
221
|
+
});
|
|
222
|
+
if (isMobile) return /* @__PURE__ */ jsxs(Drawer, {
|
|
223
|
+
open,
|
|
224
|
+
onOpenChange: setOpen,
|
|
225
|
+
children: [/* @__PURE__ */ jsx(DrawerTrigger, {
|
|
226
|
+
asChild: true,
|
|
227
|
+
children: /* @__PURE__ */ jsx("button", {
|
|
228
|
+
type: "button",
|
|
229
|
+
disabled,
|
|
230
|
+
className: "w-full text-left",
|
|
231
|
+
children: TriggerContent
|
|
232
|
+
})
|
|
233
|
+
}), /* @__PURE__ */ jsxs(DrawerContent, { children: [/* @__PURE__ */ jsx(DrawerHeader, { children: /* @__PURE__ */ jsx(DrawerTitle, { children: resolvedDrawerTitle }) }), /* @__PURE__ */ jsx("div", {
|
|
234
|
+
className: "px-4 pb-6",
|
|
235
|
+
children: CommandContent
|
|
236
|
+
})] })]
|
|
237
|
+
});
|
|
238
|
+
return /* @__PURE__ */ jsxs(Popover, {
|
|
239
|
+
open,
|
|
240
|
+
onOpenChange: setOpen,
|
|
241
|
+
children: [/* @__PURE__ */ jsx(PopoverTrigger, { render: /* @__PURE__ */ jsx("button", {
|
|
242
|
+
type: "button",
|
|
243
|
+
disabled,
|
|
244
|
+
className: "w-full text-left",
|
|
245
|
+
children: TriggerContent
|
|
246
|
+
}) }), /* @__PURE__ */ jsx(PopoverContent, {
|
|
247
|
+
className: "w-(--anchor-width) p-0",
|
|
248
|
+
align: "start",
|
|
249
|
+
children: CommandContent
|
|
250
|
+
})]
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
//#endregion
|
|
255
|
+
export { SelectMulti };
|
|
256
|
+
//# sourceMappingURL=select-multi.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select-multi.mjs","names":[],"sources":["../../../../src/client/components/primitives/select-multi.tsx"],"sourcesContent":["\"use client\";\n\nimport { Icon } from \"@iconify/react\";\nimport type * as React from \"react\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useIsMobile } from \"../../hooks/use-media-query\";\nimport { useResolveText } from \"../../i18n/hooks\";\nimport { cn } from \"../../lib/utils\";\nimport { Badge } from \"../ui/badge\";\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from \"../ui/command\";\nimport {\n Drawer,\n DrawerContent,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from \"../ui/drawer\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../ui/popover\";\nimport type { BasePrimitiveProps, SelectOption, SelectOptions } from \"./types\";\nimport { flattenOptions } from \"./types\";\n\nexport interface SelectMultiProps<\n TValue extends string = string,\n> extends BasePrimitiveProps {\n /** Selected values */\n value: TValue[];\n /** Change handler */\n onChange: (value: TValue[]) => void;\n /** Static options */\n options?: SelectOptions<TValue>;\n /** Dynamic options loader */\n loadOptions?: (search: string) => Promise<SelectOption<TValue>[]>;\n /** Max selections */\n maxSelections?: number;\n /** Debounce delay for loadOptions (ms) */\n debounceMs?: number;\n /** External loading state */\n loading?: boolean;\n /** Empty state message */\n emptyMessage?: string;\n /** Title for mobile drawer */\n drawerTitle?: string;\n /** Max visible chips before collapsing */\n maxVisibleChips?: number;\n}\n\n/**\n * SelectMulti - Multi-select component with chips\n *\n * Features:\n * - Always searchable\n * - Responsive: Popover on desktop, Drawer on mobile\n * - Chip display with remove buttons\n * - Supports static and async options\n * - Keyboard navigation\n *\n * @example\n * ```tsx\n * <SelectMulti\n * value={selectedTags}\n * onChange={setSelectedTags}\n * options={[\n * { value: \"react\", label: \"React\" },\n * { value: \"vue\", label: \"Vue\" },\n * { value: \"angular\", label: \"Angular\" },\n * ]}\n * />\n * ```\n */\nexport function SelectMulti<TValue extends string = string>({\n value = [],\n onChange,\n options: staticOptions = [],\n loadOptions,\n maxSelections,\n debounceMs = 300,\n loading: externalLoading = false,\n emptyMessage = \"No options found\",\n placeholder = \"Select...\",\n disabled,\n className,\n id,\n \"aria-invalid\": ariaInvalid,\n drawerTitle = \"Select options\",\n maxVisibleChips = 3,\n}: SelectMultiProps<TValue>) {\n const resolveText = useResolveText();\n const resolvedPlaceholder = resolveText(placeholder);\n const resolvedEmptyMessage = resolveText(emptyMessage);\n const resolvedDrawerTitle = resolveText(drawerTitle);\n const [open, setOpen] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [dynamicOptions, setDynamicOptions] = useState<SelectOption<TValue>[]>(\n [],\n );\n const [isLoading, setIsLoading] = useState(false);\n const debounceRef = useRef<ReturnType<typeof setTimeout>>(null);\n const isMobile = useIsMobile();\n\n // Flatten static options\n const flatStaticOptions = useMemo(\n () => flattenOptions(staticOptions),\n [staticOptions],\n );\n\n // Merge static and dynamic options\n const allOptions = useMemo(() => {\n if (loadOptions) {\n return dynamicOptions;\n }\n return flatStaticOptions;\n }, [loadOptions, dynamicOptions, flatStaticOptions]);\n\n // Filter options by search (for static options)\n const filteredOptions = useMemo(() => {\n if (loadOptions) {\n return allOptions;\n }\n if (!search) {\n return allOptions;\n }\n return allOptions.filter((opt) =>\n resolveText(opt.label).toLowerCase().includes(search.toLowerCase()),\n );\n }, [allOptions, search, loadOptions, resolveText]);\n\n // Load dynamic options\n useEffect(() => {\n if (!loadOptions) return;\n\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n\n debounceRef.current = setTimeout(async () => {\n setIsLoading(true);\n try {\n const results = await loadOptions(search);\n setDynamicOptions(results);\n } catch (error) {\n console.error(\"Failed to load options:\", error);\n setDynamicOptions([]);\n } finally {\n setIsLoading(false);\n }\n }, debounceMs);\n\n return () => {\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n };\n }, [search, loadOptions, debounceMs]);\n\n // Get label for a value\n const getLabel = useCallback(\n (val: TValue): string => {\n const option = allOptions.find((opt) => opt.value === val);\n return option?.label ? resolveText(option.label) : String(val);\n },\n [allOptions, resolveText],\n );\n\n const handleToggle = useCallback(\n (selectedValue: string) => {\n const typedValue = selectedValue as TValue;\n const isSelected = value.includes(typedValue);\n\n if (isSelected) {\n onChange(value.filter((v) => v !== typedValue));\n } else {\n if (maxSelections && value.length >= maxSelections) return;\n onChange([...value, typedValue]);\n }\n },\n [value, onChange, maxSelections],\n );\n\n const handleRemove = useCallback(\n (removedValue: TValue, e?: React.MouseEvent) => {\n e?.stopPropagation();\n onChange(value.filter((v) => v !== removedValue));\n },\n [value, onChange],\n );\n\n const handleClearAll = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onChange([]);\n },\n [onChange],\n );\n\n const showLoading = isLoading || externalLoading;\n const canAddMore = !maxSelections || value.length < maxSelections;\n\n // Visible and hidden chips\n const visibleChips = value.slice(0, maxVisibleChips);\n const hiddenCount = value.length - maxVisibleChips;\n\n const TriggerContent = (\n <div\n id={id}\n role=\"combobox\"\n aria-controls=\"select-multi-list\"\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-invalid={ariaInvalid}\n tabIndex={0}\n className={cn(\n \"flex min-h-9 w-full flex-wrap items-center gap-1 rounded-md border border-input/80 bg-input/20 backdrop-blur-sm px-3 py-1.5 text-sm transition-colors\",\n \"focus-within:ring-2 focus-within:ring-ring focus-within:border-ring\",\n disabled && \"cursor-not-allowed opacity-50\",\n ariaInvalid && \"border-destructive ring-destructive/20\",\n className,\n )}\n >\n {value.length === 0 ? (\n <span className=\"text-muted-foreground text-xs\">\n {resolvedPlaceholder}\n </span>\n ) : (\n <>\n {visibleChips.map((val) => (\n <Badge key={String(val)} variant=\"secondary\" className=\"gap-1 pr-1\">\n <span className=\"truncate max-w-24\">{getLabel(val)}</span>\n {!disabled && (\n <button\n type=\"button\"\n onClick={(e) => handleRemove(val, e)}\n className=\"rounded-full hover:bg-muted-foreground/20 p-0.5\"\n >\n <Icon icon=\"ph:x\" className=\"size-2.5\" />\n </button>\n )}\n </Badge>\n ))}\n {hiddenCount > 0 && (\n <Badge variant=\"outline\" className=\"text-muted-foreground\">\n +{hiddenCount} more\n </Badge>\n )}\n </>\n )}\n <div className=\"ml-auto flex items-center gap-1 shrink-0\">\n {value.length > 0 && !disabled && (\n <button\n type=\"button\"\n onClick={handleClearAll}\n className=\"rounded-sm opacity-50 hover:opacity-100 hover:bg-muted p-0.5\"\n >\n <Icon icon=\"ph:x\" className=\"size-3\" />\n </button>\n )}\n <Icon icon=\"ph:plus\" className=\"size-3.5 opacity-50\" />\n </div>\n </div>\n );\n\n const CommandContent = (\n <Command shouldFilter={!loadOptions}>\n <CommandInput\n placeholder=\"Search...\"\n value={search}\n onValueChange={setSearch}\n />\n <CommandList>\n {showLoading && (\n <div className=\"flex items-center justify-center py-6\">\n <Icon\n icon=\"ph:circle-notch\"\n className=\"size-4 animate-spin text-muted-foreground\"\n />\n </div>\n )}\n <CommandEmpty>{resolvedEmptyMessage}</CommandEmpty>\n <CommandGroup>\n {filteredOptions.map((option) => {\n const isSelected = value.includes(option.value);\n const isDisabled = option.disabled || (!isSelected && !canAddMore);\n\n return (\n <CommandItem\n key={String(option.value)}\n value={String(option.value)}\n onSelect={handleToggle}\n disabled={isDisabled}\n >\n <div\n className={cn(\n \"flex size-4 items-center justify-center rounded-sm border\",\n isSelected\n ? \"bg-primary border-primary text-primary-foreground\"\n : \"border-muted-foreground/30\",\n )}\n >\n {isSelected && <Icon icon=\"ph:check\" className=\"size-3\" />}\n </div>\n {option.icon}\n <span className=\"truncate\">{resolveText(option.label)}</span>\n </CommandItem>\n );\n })}\n </CommandGroup>\n </CommandList>\n {maxSelections && (\n <div className=\"border-t p-2 text-center text-xs text-muted-foreground\">\n {value.length} / {maxSelections} selected\n </div>\n )}\n </Command>\n );\n\n // Mobile: Drawer\n if (isMobile) {\n return (\n <Drawer open={open} onOpenChange={setOpen}>\n <DrawerTrigger asChild>\n <button\n type=\"button\"\n disabled={disabled}\n className=\"w-full text-left\"\n >\n {TriggerContent}\n </button>\n </DrawerTrigger>\n <DrawerContent>\n <DrawerHeader>\n <DrawerTitle>{resolvedDrawerTitle}</DrawerTitle>\n </DrawerHeader>\n <div className=\"px-4 pb-6\">{CommandContent}</div>\n </DrawerContent>\n </Drawer>\n );\n }\n\n // Desktop: Popover\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger\n render={\n <button\n type=\"button\"\n disabled={disabled}\n className=\"w-full text-left\"\n >\n {TriggerContent}\n </button>\n }\n />\n <PopoverContent className=\"w-(--anchor-width) p-0\" align=\"start\">\n {CommandContent}\n </PopoverContent>\n </Popover>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useResolveText } from "../../i18n/hooks.mjs";
|
|
4
|
+
import { cn } from "../../lib/utils.mjs";
|
|
5
|
+
import { Button } from "../ui/button.mjs";
|
|
6
|
+
import { useIsMobile } from "../../hooks/use-media-query.mjs";
|
|
7
|
+
import { Drawer, DrawerContent, DrawerHeader, DrawerTitle, DrawerTrigger } from "../ui/drawer.mjs";
|
|
8
|
+
import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from "../ui/command.mjs";
|
|
9
|
+
import { Popover, PopoverContent, PopoverTrigger } from "../ui/popover.mjs";
|
|
10
|
+
import { flattenOptions } from "./types.mjs";
|
|
11
|
+
import { Icon } from "@iconify/react";
|
|
12
|
+
import { useQuery } from "@tanstack/react-query";
|
|
13
|
+
import { useCallback, useDeferredValue, useId, useMemo, useState } from "react";
|
|
14
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
15
|
+
|
|
16
|
+
//#region src/client/components/primitives/select-single.tsx
|
|
17
|
+
/**
|
|
18
|
+
* SelectSingle - Single select component with search
|
|
19
|
+
*
|
|
20
|
+
* Features:
|
|
21
|
+
* - Always searchable
|
|
22
|
+
* - Responsive: Popover on desktop, Drawer on mobile
|
|
23
|
+
* - Supports static and async options
|
|
24
|
+
* - Keyboard navigation
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```tsx
|
|
28
|
+
* <SelectSingle
|
|
29
|
+
* value={status}
|
|
30
|
+
* onChange={setStatus}
|
|
31
|
+
* options={[
|
|
32
|
+
* { value: "active", label: "Active" },
|
|
33
|
+
* { value: "inactive", label: "Inactive" },
|
|
34
|
+
* ]}
|
|
35
|
+
* />
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
function SelectSingle({ value, onChange, options: staticOptions = [], loadOptions, queryKey, prefetchOnMount = false, clearable = true, loading: externalLoading = false, emptyMessage = "No options found", placeholder = "Select...", disabled, className, id, "aria-invalid": ariaInvalid, drawerTitle = "Select option" }) {
|
|
39
|
+
const resolveText = useResolveText();
|
|
40
|
+
const resolvedPlaceholder = resolveText(placeholder);
|
|
41
|
+
const resolvedEmptyMessage = resolveText(emptyMessage);
|
|
42
|
+
const resolvedDrawerTitle = resolveText(drawerTitle);
|
|
43
|
+
const [open, setOpen] = useState(false);
|
|
44
|
+
const [search, setSearch] = useState("");
|
|
45
|
+
const instanceId = useId();
|
|
46
|
+
const deferredSearch = useDeferredValue(search);
|
|
47
|
+
const isMobile = useIsMobile();
|
|
48
|
+
const flatStaticOptions = useMemo(() => flattenOptions(staticOptions), [staticOptions]);
|
|
49
|
+
const { data: dynamicOptions = [], isFetching } = useQuery({
|
|
50
|
+
queryKey: useMemo(() => queryKey ? queryKey(deferredSearch) : [
|
|
51
|
+
"select-single",
|
|
52
|
+
instanceId,
|
|
53
|
+
deferredSearch
|
|
54
|
+
], [
|
|
55
|
+
queryKey,
|
|
56
|
+
deferredSearch,
|
|
57
|
+
instanceId
|
|
58
|
+
]),
|
|
59
|
+
queryFn: () => loadOptions?.(deferredSearch) ?? Promise.resolve([]),
|
|
60
|
+
enabled: !!loadOptions && (open || prefetchOnMount),
|
|
61
|
+
staleTime: 3e4,
|
|
62
|
+
gcTime: 5 * 6e4
|
|
63
|
+
});
|
|
64
|
+
const allOptions = useMemo(() => {
|
|
65
|
+
if (!loadOptions) return flatStaticOptions;
|
|
66
|
+
if (flatStaticOptions.length === 0) return dynamicOptions;
|
|
67
|
+
const mergedMap = [...flatStaticOptions, ...dynamicOptions].reduce((map, opt) => new Map(map).set(opt.value, opt), /* @__PURE__ */ new Map());
|
|
68
|
+
return Array.from(mergedMap.values());
|
|
69
|
+
}, [
|
|
70
|
+
loadOptions,
|
|
71
|
+
dynamicOptions,
|
|
72
|
+
flatStaticOptions
|
|
73
|
+
]);
|
|
74
|
+
const filteredOptions = useMemo(() => {
|
|
75
|
+
if (loadOptions) return allOptions;
|
|
76
|
+
if (!search) return allOptions;
|
|
77
|
+
return allOptions.filter((opt) => resolveText(opt.label).toLowerCase().includes(search.toLowerCase()));
|
|
78
|
+
}, [
|
|
79
|
+
allOptions,
|
|
80
|
+
search,
|
|
81
|
+
loadOptions,
|
|
82
|
+
resolveText
|
|
83
|
+
]);
|
|
84
|
+
const getLabel = useCallback((val) => {
|
|
85
|
+
const option = allOptions.find((opt) => opt.value === val);
|
|
86
|
+
return option?.label ? resolveText(option.label) : String(val);
|
|
87
|
+
}, [allOptions, resolveText]);
|
|
88
|
+
const handleSelect = useCallback((selectedValue) => {
|
|
89
|
+
onChange(selectedValue);
|
|
90
|
+
setOpen(false);
|
|
91
|
+
setSearch("");
|
|
92
|
+
}, [onChange]);
|
|
93
|
+
const handleClear = useCallback((e) => {
|
|
94
|
+
e.stopPropagation();
|
|
95
|
+
onChange(null);
|
|
96
|
+
}, [onChange]);
|
|
97
|
+
const showLoading = isFetching || externalLoading;
|
|
98
|
+
const TriggerButton = /* @__PURE__ */ jsxs(Button, {
|
|
99
|
+
id,
|
|
100
|
+
variant: "outline",
|
|
101
|
+
role: "combobox",
|
|
102
|
+
"aria-expanded": open,
|
|
103
|
+
"aria-invalid": ariaInvalid,
|
|
104
|
+
disabled,
|
|
105
|
+
className: cn("w-full justify-between font-normal", !value && "text-muted-foreground", className),
|
|
106
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
107
|
+
className: "truncate",
|
|
108
|
+
children: value ? getLabel(value) : resolvedPlaceholder
|
|
109
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
110
|
+
className: "flex items-center gap-1 shrink-0",
|
|
111
|
+
children: [clearable && value && !disabled && /* @__PURE__ */ jsx("span", {
|
|
112
|
+
role: "button",
|
|
113
|
+
tabIndex: -1,
|
|
114
|
+
onClick: handleClear,
|
|
115
|
+
onKeyDown: (event) => {
|
|
116
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
117
|
+
event.preventDefault();
|
|
118
|
+
handleClear(event);
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
className: "rounded-sm opacity-50 hover:opacity-100 hover:bg-muted p-0.5 -mr-1",
|
|
122
|
+
children: /* @__PURE__ */ jsx(Icon, {
|
|
123
|
+
icon: "ph:x",
|
|
124
|
+
className: "size-3"
|
|
125
|
+
})
|
|
126
|
+
}), /* @__PURE__ */ jsx(Icon, {
|
|
127
|
+
icon: "ph:caret-up-down",
|
|
128
|
+
className: "size-3.5 opacity-50"
|
|
129
|
+
})]
|
|
130
|
+
})]
|
|
131
|
+
});
|
|
132
|
+
const CommandContent = /* @__PURE__ */ jsxs(Command, {
|
|
133
|
+
shouldFilter: !loadOptions,
|
|
134
|
+
children: [/* @__PURE__ */ jsx(CommandInput, {
|
|
135
|
+
placeholder: "Search...",
|
|
136
|
+
value: search,
|
|
137
|
+
onValueChange: setSearch
|
|
138
|
+
}), /* @__PURE__ */ jsxs(CommandList, { children: [
|
|
139
|
+
showLoading && /* @__PURE__ */ jsx("div", {
|
|
140
|
+
className: "flex items-center justify-center py-6",
|
|
141
|
+
children: /* @__PURE__ */ jsx(Icon, {
|
|
142
|
+
icon: "ph:circle-notch",
|
|
143
|
+
className: "size-4 animate-spin text-muted-foreground"
|
|
144
|
+
})
|
|
145
|
+
}),
|
|
146
|
+
/* @__PURE__ */ jsx(CommandEmpty, { children: resolvedEmptyMessage }),
|
|
147
|
+
/* @__PURE__ */ jsx(CommandGroup, { children: filteredOptions.map((option) => /* @__PURE__ */ jsxs(CommandItem, {
|
|
148
|
+
value: String(option.value),
|
|
149
|
+
onSelect: handleSelect,
|
|
150
|
+
disabled: option.disabled,
|
|
151
|
+
"data-checked": value === option.value,
|
|
152
|
+
children: [option.icon, /* @__PURE__ */ jsx("span", {
|
|
153
|
+
className: "truncate",
|
|
154
|
+
children: resolveText(option.label)
|
|
155
|
+
})]
|
|
156
|
+
}, String(option.value))) })
|
|
157
|
+
] })]
|
|
158
|
+
});
|
|
159
|
+
if (isMobile) return /* @__PURE__ */ jsxs(Drawer, {
|
|
160
|
+
open,
|
|
161
|
+
onOpenChange: setOpen,
|
|
162
|
+
children: [/* @__PURE__ */ jsx(DrawerTrigger, {
|
|
163
|
+
asChild: true,
|
|
164
|
+
children: TriggerButton
|
|
165
|
+
}), /* @__PURE__ */ jsxs(DrawerContent, { children: [/* @__PURE__ */ jsx(DrawerHeader, { children: /* @__PURE__ */ jsx(DrawerTitle, { children: resolvedDrawerTitle }) }), /* @__PURE__ */ jsx("div", {
|
|
166
|
+
className: "px-4 pb-6",
|
|
167
|
+
children: CommandContent
|
|
168
|
+
})] })]
|
|
169
|
+
});
|
|
170
|
+
return /* @__PURE__ */ jsxs(Popover, {
|
|
171
|
+
open,
|
|
172
|
+
onOpenChange: setOpen,
|
|
173
|
+
children: [/* @__PURE__ */ jsx(PopoverTrigger, { render: TriggerButton }), /* @__PURE__ */ jsx(PopoverContent, {
|
|
174
|
+
className: "w-(--anchor-width) p-0",
|
|
175
|
+
align: "start",
|
|
176
|
+
children: CommandContent
|
|
177
|
+
})]
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
//#endregion
|
|
182
|
+
export { SelectSingle };
|
|
183
|
+
//# sourceMappingURL=select-single.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select-single.mjs","names":[],"sources":["../../../../src/client/components/primitives/select-single.tsx"],"sourcesContent":["\"use client\";\n\nimport { Icon } from \"@iconify/react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport type * as React from \"react\";\nimport { useCallback, useDeferredValue, useId, useMemo, useState } from \"react\";\nimport { useIsMobile } from \"../../hooks/use-media-query\";\nimport { useResolveText } from \"../../i18n/hooks\";\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"../ui/button\";\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from \"../ui/command\";\nimport {\n Drawer,\n DrawerContent,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from \"../ui/drawer\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../ui/popover\";\nimport type { BasePrimitiveProps, SelectOption, SelectOptions } from \"./types\";\nimport { flattenOptions } from \"./types\";\n\nexport interface SelectSingleProps<\n TValue extends string = string,\n> extends BasePrimitiveProps {\n /** Selected value */\n value: TValue | null;\n /** Change handler */\n onChange: (value: TValue | null) => void;\n /** Static options */\n options?: SelectOptions<TValue>;\n /** Dynamic options loader */\n loadOptions?: (search: string) => Promise<SelectOption<TValue>[]>;\n /** Query key builder for loadOptions */\n queryKey?: (search: string) => readonly unknown[];\n /** Prefetch options on mount */\n prefetchOnMount?: boolean;\n\n /** Allow clearing selection */\n clearable?: boolean;\n /** Debounce delay for loadOptions (ms) */\n debounceMs?: number;\n /** External loading state */\n loading?: boolean;\n /** Empty state message */\n emptyMessage?: string;\n /** Title for mobile drawer */\n drawerTitle?: string;\n}\n\n/**\n * SelectSingle - Single select component with search\n *\n * Features:\n * - Always searchable\n * - Responsive: Popover on desktop, Drawer on mobile\n * - Supports static and async options\n * - Keyboard navigation\n *\n * @example\n * ```tsx\n * <SelectSingle\n * value={status}\n * onChange={setStatus}\n * options={[\n * { value: \"active\", label: \"Active\" },\n * { value: \"inactive\", label: \"Inactive\" },\n * ]}\n * />\n * ```\n */\nexport function SelectSingle<TValue extends string = string>({\n value,\n onChange,\n options: staticOptions = [],\n loadOptions,\n queryKey,\n prefetchOnMount = false,\n clearable = true,\n loading: externalLoading = false,\n emptyMessage = \"No options found\",\n placeholder = \"Select...\",\n disabled,\n className,\n id,\n \"aria-invalid\": ariaInvalid,\n drawerTitle = \"Select option\",\n}: SelectSingleProps<TValue>) {\n const resolveText = useResolveText();\n const resolvedPlaceholder = resolveText(placeholder);\n const resolvedEmptyMessage = resolveText(emptyMessage);\n const resolvedDrawerTitle = resolveText(drawerTitle);\n const [open, setOpen] = useState(false);\n const [search, setSearch] = useState(\"\");\n const instanceId = useId();\n const deferredSearch = useDeferredValue(search);\n const isMobile = useIsMobile();\n\n // Flatten static options\n const flatStaticOptions = useMemo(\n () => flattenOptions(staticOptions),\n [staticOptions],\n );\n\n const loadOptionsKey = useMemo(\n () =>\n queryKey\n ? queryKey(deferredSearch)\n : [\"select-single\", instanceId, deferredSearch],\n [queryKey, deferredSearch, instanceId],\n );\n\n const { data: dynamicOptions = [], isFetching } = useQuery({\n queryKey: loadOptionsKey,\n queryFn: () => loadOptions?.(deferredSearch) ?? Promise.resolve([]),\n enabled: !!loadOptions && (open || prefetchOnMount),\n staleTime: 30_000,\n gcTime: 5 * 60_000,\n });\n\n // Merge static and dynamic options (immutable pattern for React Compiler)\n const allOptions = useMemo(() => {\n if (!loadOptions) {\n return flatStaticOptions;\n }\n if (flatStaticOptions.length === 0) {\n return dynamicOptions;\n }\n // Use reduce to build Map immutably - dynamic options override static\n const mergedMap = [...flatStaticOptions, ...dynamicOptions].reduce(\n (map, opt) => new Map(map).set(opt.value, opt),\n new Map<TValue, SelectOption<TValue>>(),\n );\n return Array.from(mergedMap.values());\n }, [loadOptions, dynamicOptions, flatStaticOptions]);\n\n // Filter options by search (for static options)\n const filteredOptions = useMemo(() => {\n if (loadOptions) {\n return allOptions; // Dynamic options are already filtered by server\n }\n if (!search) {\n return allOptions;\n }\n return allOptions.filter((opt: SelectOption<TValue>) =>\n resolveText(opt.label).toLowerCase().includes(search.toLowerCase()),\n );\n }, [allOptions, search, loadOptions, resolveText]);\n\n // Get label for a value\n const getLabel = useCallback(\n (val: TValue): string => {\n const option = allOptions.find(\n (opt: SelectOption<TValue>) => opt.value === val,\n );\n return option?.label ? resolveText(option.label) : String(val);\n },\n [allOptions, resolveText],\n );\n\n const handleSelect = useCallback(\n (selectedValue: string) => {\n onChange(selectedValue as TValue);\n setOpen(false);\n setSearch(\"\");\n },\n [onChange],\n );\n\n const handleClear = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onChange(null);\n },\n [onChange],\n );\n\n const showLoading = isFetching || externalLoading;\n\n const TriggerButton = (\n <Button\n id={id}\n variant=\"outline\"\n role=\"combobox\"\n aria-expanded={open}\n aria-invalid={ariaInvalid}\n disabled={disabled}\n className={cn(\n \"w-full justify-between font-normal\",\n !value && \"text-muted-foreground\",\n className,\n )}\n >\n <span className=\"truncate\">\n {value ? getLabel(value) : resolvedPlaceholder}\n </span>\n <div className=\"flex items-center gap-1 shrink-0\">\n {clearable && value && !disabled && (\n <span\n role=\"button\"\n tabIndex={-1}\n onClick={handleClear}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n handleClear(event as unknown as React.MouseEvent);\n }\n }}\n className=\"rounded-sm opacity-50 hover:opacity-100 hover:bg-muted p-0.5 -mr-1\"\n >\n <Icon icon=\"ph:x\" className=\"size-3\" />\n </span>\n )}\n <Icon icon=\"ph:caret-up-down\" className=\"size-3.5 opacity-50\" />\n </div>\n </Button>\n );\n\n const CommandContent = (\n <Command shouldFilter={!loadOptions}>\n <CommandInput\n placeholder=\"Search...\"\n value={search}\n onValueChange={setSearch}\n />\n <CommandList>\n {showLoading && (\n <div className=\"flex items-center justify-center py-6\">\n <Icon\n icon=\"ph:circle-notch\"\n className=\"size-4 animate-spin text-muted-foreground\"\n />\n </div>\n )}\n <CommandEmpty>{resolvedEmptyMessage}</CommandEmpty>\n <CommandGroup>\n {filteredOptions.map((option) => (\n <CommandItem\n key={String(option.value)}\n value={String(option.value)}\n onSelect={handleSelect}\n disabled={option.disabled}\n data-checked={value === option.value}\n >\n {option.icon}\n <span className=\"truncate\">{resolveText(option.label)}</span>\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n );\n\n // Mobile: Drawer\n if (isMobile) {\n return (\n <Drawer open={open} onOpenChange={setOpen}>\n <DrawerTrigger asChild>{TriggerButton}</DrawerTrigger>\n <DrawerContent>\n <DrawerHeader>\n <DrawerTitle>{resolvedDrawerTitle}</DrawerTitle>\n </DrawerHeader>\n <div className=\"px-4 pb-6\">{CommandContent}</div>\n </DrawerContent>\n </Drawer>\n );\n }\n\n // Desktop: Popover\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger render={TriggerButton} />\n <PopoverContent className=\"w-(--anchor-width) p-0\" align=\"start\">\n {CommandContent}\n </PopoverContent>\n </Popover>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { useResolveText } from "../../i18n/hooks.mjs";
|
|
2
|
+
import { Input } from "../ui/input.mjs";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
|
|
5
|
+
//#region src/client/components/primitives/text-input.tsx
|
|
6
|
+
/**
|
|
7
|
+
* Text Input Primitive
|
|
8
|
+
*
|
|
9
|
+
* A basic text input with value/onChange pattern.
|
|
10
|
+
* Supports different input types: text, email, password, url, tel, search.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```tsx
|
|
14
|
+
* <TextInput
|
|
15
|
+
* value={email}
|
|
16
|
+
* onChange={setEmail}
|
|
17
|
+
* type="email"
|
|
18
|
+
* placeholder="Enter email"
|
|
19
|
+
* />
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
function TextInput({ value, onChange, type = "text", placeholder, disabled, readOnly, maxLength, autoComplete, className, id, "aria-invalid": ariaInvalid }) {
|
|
23
|
+
return /* @__PURE__ */ jsx(Input, {
|
|
24
|
+
id,
|
|
25
|
+
type,
|
|
26
|
+
value,
|
|
27
|
+
onChange: (e) => onChange(e.target.value),
|
|
28
|
+
placeholder: useResolveText()(placeholder),
|
|
29
|
+
disabled,
|
|
30
|
+
readOnly,
|
|
31
|
+
maxLength,
|
|
32
|
+
autoComplete,
|
|
33
|
+
"aria-invalid": ariaInvalid,
|
|
34
|
+
className
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
//#endregion
|
|
39
|
+
export { TextInput };
|
|
40
|
+
//# sourceMappingURL=text-input.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-input.mjs","names":[],"sources":["../../../../src/client/components/primitives/text-input.tsx"],"sourcesContent":["import { useResolveText } from \"../../i18n/hooks\";\nimport { Input } from \"../ui/input\";\nimport type { TextInputProps } from \"./types\";\n\n/**\n * Text Input Primitive\n *\n * A basic text input with value/onChange pattern.\n * Supports different input types: text, email, password, url, tel, search.\n *\n * @example\n * ```tsx\n * <TextInput\n * value={email}\n * onChange={setEmail}\n * type=\"email\"\n * placeholder=\"Enter email\"\n * />\n * ```\n */\nexport function TextInput({\n value,\n onChange,\n type = \"text\",\n placeholder,\n disabled,\n readOnly,\n maxLength,\n autoComplete,\n className,\n id,\n \"aria-invalid\": ariaInvalid,\n}: TextInputProps) {\n const resolveText = useResolveText();\n\n return (\n <Input\n id={id}\n type={type}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={resolveText(placeholder)}\n disabled={disabled}\n readOnly={readOnly}\n maxLength={maxLength}\n autoComplete={autoComplete}\n aria-invalid={ariaInvalid}\n className={className}\n />\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAoBA,SAAgB,UAAU,EACxB,OACA,UACA,OAAO,QACP,aACA,UACA,UACA,WACA,cACA,WACA,IACA,gBAAgB,eACC;AAGjB,QACE,oBAAC;EACK;EACE;EACC;EACP,WAAW,MAAM,SAAS,EAAE,OAAO,MAAM;EACzC,aARgB,gBAAgB,CAQP,YAAY;EAC3B;EACA;EACC;EACG;EACd,gBAAc;EACH;GACX"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { useResolveText } from "../../i18n/hooks.mjs";
|
|
2
|
+
import { Textarea } from "../ui/textarea.mjs";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
|
|
5
|
+
//#region src/client/components/primitives/textarea-input.tsx
|
|
6
|
+
/**
|
|
7
|
+
* Textarea Input Primitive
|
|
8
|
+
*
|
|
9
|
+
* A multi-line text input.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```tsx
|
|
13
|
+
* <TextareaInput
|
|
14
|
+
* value={description}
|
|
15
|
+
* onChange={setDescription}
|
|
16
|
+
* rows={4}
|
|
17
|
+
* placeholder="Enter description..."
|
|
18
|
+
* />
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
function TextareaInput({ value, onChange, rows = 3, maxLength, placeholder, disabled, readOnly, className, id, "aria-invalid": ariaInvalid }) {
|
|
22
|
+
return /* @__PURE__ */ jsx(Textarea, {
|
|
23
|
+
id,
|
|
24
|
+
value,
|
|
25
|
+
onChange: (e) => onChange(e.target.value),
|
|
26
|
+
rows,
|
|
27
|
+
maxLength,
|
|
28
|
+
placeholder: useResolveText()(placeholder),
|
|
29
|
+
disabled,
|
|
30
|
+
readOnly,
|
|
31
|
+
"aria-invalid": ariaInvalid,
|
|
32
|
+
className
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
//#endregion
|
|
37
|
+
export { TextareaInput };
|
|
38
|
+
//# sourceMappingURL=textarea-input.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textarea-input.mjs","names":[],"sources":["../../../../src/client/components/primitives/textarea-input.tsx"],"sourcesContent":["import { useResolveText } from \"../../i18n/hooks\";\nimport { Textarea } from \"../ui/textarea\";\nimport type { TextareaInputProps } from \"./types\";\n\n/**\n * Textarea Input Primitive\n *\n * A multi-line text input.\n *\n * @example\n * ```tsx\n * <TextareaInput\n * value={description}\n * onChange={setDescription}\n * rows={4}\n * placeholder=\"Enter description...\"\n * />\n * ```\n */\nexport function TextareaInput({\n value,\n onChange,\n rows = 3,\n maxLength,\n placeholder,\n disabled,\n readOnly,\n className,\n id,\n \"aria-invalid\": ariaInvalid,\n}: TextareaInputProps) {\n const resolveText = useResolveText();\n\n return (\n <Textarea\n id={id}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n rows={rows}\n maxLength={maxLength}\n placeholder={resolveText(placeholder)}\n disabled={disabled}\n readOnly={readOnly}\n aria-invalid={ariaInvalid}\n className={className}\n />\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAmBA,SAAgB,cAAc,EAC5B,OACA,UACA,OAAO,GACP,WACA,aACA,UACA,UACA,WACA,IACA,gBAAgB,eACK;AAGrB,QACE,oBAAC;EACK;EACG;EACP,WAAW,MAAM,SAAS,EAAE,OAAO,MAAM;EACnC;EACK;EACX,aATgB,gBAAgB,CASP,YAAY;EAC3B;EACA;EACV,gBAAc;EACH;GACX"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useResolveText } from "../../i18n/hooks.mjs";
|
|
4
|
+
import { cn } from "../../lib/utils.mjs";
|
|
5
|
+
import { Icon } from "@iconify/react";
|
|
6
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
|
|
8
|
+
//#region src/client/components/primitives/time-input.tsx
|
|
9
|
+
/**
|
|
10
|
+
* Time Input Primitive
|
|
11
|
+
*
|
|
12
|
+
* A time-only input using the native HTML time picker.
|
|
13
|
+
* Returns time as string in "HH:mm" or "HH:mm:ss" format.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```tsx
|
|
17
|
+
* <TimeInput
|
|
18
|
+
* value={selectedTime}
|
|
19
|
+
* onChange={setSelectedTime}
|
|
20
|
+
* placeholder="Select time"
|
|
21
|
+
* />
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
function TimeInput({ value, onChange, precision = "minute", placeholder = "Select time", disabled, className, id, "aria-invalid": ariaInvalid }) {
|
|
25
|
+
const resolveText = useResolveText();
|
|
26
|
+
const handleChange = (e) => {
|
|
27
|
+
const timeValue = e.target.value;
|
|
28
|
+
onChange(timeValue || null);
|
|
29
|
+
};
|
|
30
|
+
const handleClear = (e) => {
|
|
31
|
+
e.preventDefault();
|
|
32
|
+
e.stopPropagation();
|
|
33
|
+
onChange(null);
|
|
34
|
+
};
|
|
35
|
+
return /* @__PURE__ */ jsx("div", {
|
|
36
|
+
className: "relative",
|
|
37
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
38
|
+
className: cn("flex h-9 w-full items-center gap-2 border border-input/80 bg-input/20 backdrop-blur-sm px-3 py-2 text-sm", "focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2", disabled && "cursor-not-allowed opacity-50", ariaInvalid && "border-destructive", className),
|
|
39
|
+
children: [
|
|
40
|
+
/* @__PURE__ */ jsx(Icon, {
|
|
41
|
+
icon: "ph:clock",
|
|
42
|
+
className: "size-4 text-muted-foreground"
|
|
43
|
+
}),
|
|
44
|
+
/* @__PURE__ */ jsx("input", {
|
|
45
|
+
type: "time",
|
|
46
|
+
id,
|
|
47
|
+
value: value ?? "",
|
|
48
|
+
onChange: handleChange,
|
|
49
|
+
step: precision === "second" ? 1 : 60,
|
|
50
|
+
disabled,
|
|
51
|
+
"aria-invalid": ariaInvalid,
|
|
52
|
+
placeholder: resolveText(placeholder),
|
|
53
|
+
className: cn("flex-1 bg-transparent outline-none", "placeholder:text-muted-foreground", "disabled:cursor-not-allowed", "[&::-webkit-calendar-picker-indicator]:hidden")
|
|
54
|
+
}),
|
|
55
|
+
value && !disabled && /* @__PURE__ */ jsx("button", {
|
|
56
|
+
type: "button",
|
|
57
|
+
onClick: handleClear,
|
|
58
|
+
className: "text-muted-foreground hover:text-foreground",
|
|
59
|
+
tabIndex: -1,
|
|
60
|
+
children: /* @__PURE__ */ jsx(Icon, {
|
|
61
|
+
icon: "ph:x",
|
|
62
|
+
className: "size-4"
|
|
63
|
+
})
|
|
64
|
+
})
|
|
65
|
+
]
|
|
66
|
+
})
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
//#endregion
|
|
71
|
+
export { TimeInput };
|
|
72
|
+
//# sourceMappingURL=time-input.mjs.map
|