@thewrong/ui 0.1.0 → 0.3.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 +25 -4
- package/dist/_virtual/_rolldown/runtime.cjs +1 -0
- package/dist/components/_shared/form-size-tokens.cjs +1 -0
- package/dist/{src/components → components}/_shared/form-size-tokens.d.ts +3 -1
- package/dist/components/_shared/form-size-tokens.esm.js +34 -0
- package/dist/components/action-toast/ActionToast.cjs +1 -0
- package/dist/{src/components → components}/action-toast/ActionToast.d.ts +17 -3
- package/dist/components/action-toast/ActionToast.esm.js +238 -0
- package/dist/{src/components → components}/action-toast/index.d.ts +2 -2
- package/dist/components/animated-height/AnimatedHeight.cjs +1 -0
- package/dist/components/animated-height/AnimatedHeight.esm.js +36 -0
- package/dist/components/animated-height/index.d.ts +2 -0
- package/dist/components/badge/Badge.cjs +1 -0
- package/dist/{src/components → components}/badge/Badge.d.ts +1 -1
- package/dist/components/badge/Badge.esm.js +26 -0
- package/dist/components/badge/index.d.ts +2 -0
- package/dist/components/badge/utils.cjs +1 -0
- package/dist/{src/components → components}/badge/utils.d.ts +1 -1
- package/dist/components/badge/utils.esm.js +38 -0
- package/dist/components/button/Button.cjs +1 -0
- package/dist/components/button/Button.d.ts +19 -0
- package/dist/components/button/Button.esm.js +77 -0
- package/dist/{src/components → components}/button/index.d.ts +2 -2
- package/dist/components/button/utils.cjs +1 -0
- package/dist/{src/components → components}/button/utils.d.ts +1 -1
- package/dist/components/button/utils.esm.js +38 -0
- package/dist/components/checkbox/Checkbox.cjs +1 -0
- package/dist/{src/components → components}/checkbox/Checkbox.d.ts +1 -1
- package/dist/components/checkbox/Checkbox.esm.js +69 -0
- package/dist/components/checkbox/index.d.ts +2 -0
- package/dist/components/checkbox/utils.cjs +1 -0
- package/dist/{src/components → components}/checkbox/utils.d.ts +1 -1
- package/dist/components/checkbox/utils.esm.js +44 -0
- package/dist/components/collapsible/Collapsible.cjs +1 -0
- package/dist/components/collapsible/Collapsible.esm.js +20 -0
- package/dist/components/collapsible/index.d.ts +2 -0
- package/dist/components/copyable-text/CopyableText.cjs +1 -0
- package/dist/components/copyable-text/CopyableText.d.ts +22 -0
- package/dist/components/copyable-text/CopyableText.esm.js +50 -0
- package/dist/components/copyable-text/index.d.ts +2 -0
- package/dist/components/date-input/DateInput.cjs +1 -0
- package/dist/{src/components → components}/date-input/DateInput.d.ts +1 -0
- package/dist/components/date-input/DateInput.esm.js +40 -0
- package/dist/components/date-input/index.d.ts +1 -0
- package/dist/components/date-picker/PickerSheet.cjs +1 -0
- package/dist/components/date-picker/PickerSheet.d.ts +22 -0
- package/dist/components/date-picker/PickerSheet.esm.js +77 -0
- package/dist/components/date-picker/date-picker.cjs +1 -0
- package/dist/{src/components → components}/date-picker/date-picker.d.ts +1 -0
- package/dist/components/date-picker/date-picker.esm.js +183 -0
- package/dist/components/date-picker/date-range-picker.cjs +1 -0
- package/dist/{src/components → components}/date-picker/date-range-picker.d.ts +3 -1
- package/dist/components/date-picker/date-range-picker.esm.js +238 -0
- package/dist/components/date-picker/index.d.ts +5 -0
- package/dist/components/date-picker/month-picker.cjs +1 -0
- package/dist/{src/components → components}/date-picker/month-picker.d.ts +1 -0
- package/dist/components/date-picker/month-picker.esm.js +103 -0
- package/dist/components/drawer/Drawer.cjs +1 -0
- package/dist/components/drawer/Drawer.d.ts +45 -0
- package/dist/components/drawer/Drawer.esm.js +143 -0
- package/dist/components/drawer/index.d.ts +2 -0
- package/dist/components/error-boundary/ErrorBoundary.cjs +1 -0
- package/dist/components/error-boundary/ErrorBoundary.d.ts +23 -0
- package/dist/components/error-boundary/ErrorBoundary.esm.js +46 -0
- package/dist/components/error-boundary/chunk-reload.cjs +1 -0
- package/dist/components/error-boundary/chunk-reload.d.ts +77 -0
- package/dist/components/error-boundary/chunk-reload.esm.js +73 -0
- package/dist/components/error-boundary/index.d.ts +4 -0
- package/dist/components/error-boundary/types.d.ts +23 -0
- package/dist/components/field/Field.cjs +1 -0
- package/dist/components/field/Field.d.ts +16 -0
- package/dist/components/field/Field.esm.js +34 -0
- package/dist/components/field/FieldMessage.cjs +1 -0
- package/dist/components/field/FieldMessage.d.ts +19 -0
- package/dist/components/field/FieldMessage.esm.js +12 -0
- package/dist/components/field/index.d.ts +3 -0
- package/dist/components/field/types.d.ts +24 -0
- package/dist/components/info-tooltip/InfoTooltip.cjs +1 -0
- package/dist/{src/components → components}/info-tooltip/InfoTooltip.d.ts +7 -0
- package/dist/components/info-tooltip/InfoTooltip.esm.js +25 -0
- package/dist/components/info-tooltip/index.d.ts +2 -0
- package/dist/components/input/DecimalInput.cjs +1 -0
- package/dist/components/input/DecimalInput.d.ts +18 -0
- package/dist/components/input/DecimalInput.esm.js +40 -0
- package/dist/components/input/Input.cjs +1 -0
- package/dist/{src/components → components}/input/Input.d.ts +1 -1
- package/dist/components/input/Input.esm.js +89 -0
- package/dist/components/input/PasswordInput.cjs +1 -0
- package/dist/{src/components → components}/input/PasswordInput.d.ts +1 -1
- package/dist/components/input/PasswordInput.esm.js +29 -0
- package/dist/components/input/decimal-validation.cjs +1 -0
- package/dist/components/input/decimal-validation.d.ts +7 -0
- package/dist/components/input/decimal-validation.esm.js +66 -0
- package/dist/components/input/format.cjs +1 -0
- package/dist/{src/components → components}/input/format.d.ts +17 -1
- package/dist/components/input/format.esm.js +44 -0
- package/dist/components/input/index.d.ts +7 -0
- package/dist/{src/components → components}/input/types.d.ts +2 -2
- package/dist/components/input/use-input-format.cjs +1 -0
- package/dist/components/input/use-input-format.d.ts +43 -0
- package/dist/components/input/use-input-format.esm.js +75 -0
- package/dist/components/input/utils.cjs +1 -0
- package/dist/{src/components → components}/input/utils.d.ts +1 -1
- package/dist/components/input/utils.esm.js +24 -0
- package/dist/components/loading-spinner/LoadingSpinner.cjs +1 -0
- package/dist/{src/components → components}/loading-spinner/LoadingSpinner.d.ts +7 -0
- package/dist/components/loading-spinner/LoadingSpinner.esm.js +48 -0
- package/dist/components/loading-spinner/index.d.ts +2 -0
- package/dist/components/modal/Modal.cjs +1 -0
- package/dist/{src/components → components}/modal/Modal.d.ts +34 -2
- package/dist/components/modal/Modal.esm.js +167 -0
- package/dist/components/modal/ModalFocusTrapContext.cjs +1 -0
- package/dist/components/modal/ModalFocusTrapContext.d.ts +18 -0
- package/dist/components/modal/ModalFocusTrapContext.esm.js +36 -0
- package/dist/components/modal/ModalSubView.cjs +1 -0
- package/dist/{src/components → components}/modal/ModalSubView.d.ts +6 -1
- package/dist/components/modal/ModalSubView.esm.js +111 -0
- package/dist/components/modal/StandardModal.cjs +1 -0
- package/dist/{src/components → components}/modal/StandardModal.d.ts +8 -2
- package/dist/components/modal/StandardModal.esm.js +57 -0
- package/dist/components/modal/index.d.ts +6 -0
- package/dist/components/month-range-picker/index.d.ts +2 -0
- package/dist/components/month-range-picker/month-range-picker.cjs +1 -0
- package/dist/components/month-range-picker/month-range-picker.d.ts +16 -0
- package/dist/components/month-range-picker/month-range-picker.esm.js +227 -0
- package/dist/components/month-range-picker/month-range-utils.cjs +1 -0
- package/dist/components/month-range-picker/month-range-utils.d.ts +9 -0
- package/dist/components/month-range-picker/month-range-utils.esm.js +28 -0
- package/dist/components/page-title/PageTitle.cjs +1 -0
- package/dist/components/page-title/PageTitle.esm.js +17 -0
- package/dist/components/page-title/index.d.ts +1 -0
- package/dist/components/popover/Popover.cjs +1 -0
- package/dist/{src/components → components}/popover/Popover.d.ts +19 -1
- package/dist/components/popover/Popover.esm.js +57 -0
- package/dist/components/popover/index.d.ts +2 -0
- package/dist/components/progress/Progress.cjs +1 -0
- package/dist/components/progress/Progress.d.ts +13 -0
- package/dist/components/progress/Progress.esm.js +24 -0
- package/dist/components/progress/index.d.ts +2 -0
- package/dist/components/progress/types.d.ts +13 -0
- package/dist/components/radio/Radio.cjs +1 -0
- package/dist/components/radio/Radio.d.ts +31 -0
- package/dist/components/radio/Radio.esm.js +118 -0
- package/dist/components/radio/index.d.ts +2 -0
- package/dist/components/radio/types.d.ts +24 -0
- package/dist/components/search-box/ExactMatchToggle.cjs +1 -0
- package/dist/components/search-box/ExactMatchToggle.esm.js +28 -0
- package/dist/components/search-box/SearchBox.cjs +1 -0
- package/dist/{src/components → components}/search-box/SearchBox.d.ts +1 -1
- package/dist/components/search-box/SearchBox.esm.js +155 -0
- package/dist/components/search-box/SearchBoxChips.cjs +1 -0
- package/dist/components/search-box/SearchBoxChips.esm.js +36 -0
- package/dist/components/search-box/SearchBoxDateRange.cjs +1 -0
- package/dist/{src/components → components}/search-box/SearchBoxDateRange.d.ts +1 -1
- package/dist/components/search-box/SearchBoxDateRange.esm.js +60 -0
- package/dist/components/search-box/SearchBoxDateSingle.cjs +1 -0
- package/dist/{src/components → components}/search-box/SearchBoxDateSingle.d.ts +1 -1
- package/dist/components/search-box/SearchBoxDateSingle.esm.js +39 -0
- package/dist/components/search-box/SearchBoxField.cjs +1 -0
- package/dist/{src/components → components}/search-box/SearchBoxField.d.ts +1 -1
- package/dist/components/search-box/SearchBoxField.esm.js +48 -0
- package/dist/components/search-box/SearchBoxFloatingInput.cjs +1 -0
- package/dist/components/search-box/SearchBoxFloatingInput.esm.js +43 -0
- package/dist/components/search-box/SearchBoxFloatingSelect.cjs +1 -0
- package/dist/{src/components → components}/search-box/SearchBoxFloatingSelect.d.ts +1 -1
- package/dist/components/search-box/SearchBoxFloatingSelect.esm.js +79 -0
- package/dist/components/search-box/SearchBoxMonth.cjs +1 -0
- package/dist/components/search-box/SearchBoxMonth.esm.js +36 -0
- package/dist/components/search-box/SearchBoxMultiSelect.cjs +1 -0
- package/dist/{src/components → components}/search-box/SearchBoxMultiSelect.d.ts +2 -2
- package/dist/components/search-box/SearchBoxMultiSelect.esm.js +83 -0
- package/dist/components/search-box/SearchBoxSheetContext.cjs +1 -0
- package/dist/components/search-box/SearchBoxSheetContext.esm.js +5 -0
- package/dist/components/search-box/dateRangePresets.cjs +1 -0
- package/dist/{src/components → components}/search-box/dateRangePresets.d.ts +1 -1
- package/dist/components/search-box/dateRangePresets.esm.js +59 -0
- package/dist/{src/components → components}/search-box/index.d.ts +5 -5
- package/dist/components/search-box/parseDateRange.cjs +1 -0
- package/dist/components/search-box/parseDateRange.esm.js +21 -0
- package/dist/components/search-box/parseSearchValues.cjs +1 -0
- package/dist/{src/components → components}/search-box/parseSearchValues.d.ts +2 -2
- package/dist/components/search-box/parseSearchValues.esm.js +15 -0
- package/dist/{src/components → components}/search-box/types.d.ts +1 -1
- package/dist/components/search-box/useSearchBoxState.cjs +1 -0
- package/dist/{src/components → components}/search-box/useSearchBoxState.d.ts +1 -1
- package/dist/components/search-box/useSearchBoxState.esm.js +87 -0
- package/dist/components/segmented-code-input/SegmentedCodeInput.cjs +1 -0
- package/dist/components/segmented-code-input/SegmentedCodeInput.d.ts +49 -0
- package/dist/components/segmented-code-input/SegmentedCodeInput.esm.js +87 -0
- package/dist/components/segmented-code-input/code-utils.cjs +1 -0
- package/dist/components/segmented-code-input/code-utils.d.ts +4 -0
- package/dist/components/segmented-code-input/code-utils.esm.js +9 -0
- package/dist/components/segmented-code-input/index.d.ts +2 -0
- package/dist/components/segmented-control/SegmentedControl.cjs +1 -0
- package/dist/components/segmented-control/SegmentedControl.d.ts +27 -0
- package/dist/components/segmented-control/SegmentedControl.esm.js +84 -0
- package/dist/components/segmented-control/index.d.ts +2 -0
- package/dist/components/segmented-control/types.d.ts +30 -0
- package/dist/components/select/MultiSelect.cjs +1 -0
- package/dist/{src/components → components}/select/MultiSelect.d.ts +11 -3
- package/dist/components/select/MultiSelect.esm.js +279 -0
- package/dist/components/select/Select.cjs +1 -0
- package/dist/{src/components → components}/select/Select.d.ts +16 -2
- package/dist/components/select/Select.esm.js +320 -0
- package/dist/components/select/index.d.ts +4 -0
- package/dist/components/select/loading-dots.cjs +1 -0
- package/dist/components/select/loading-dots.d.ts +3 -0
- package/dist/components/select/loading-dots.esm.js +24 -0
- package/dist/components/select/panel-width.cjs +1 -0
- package/dist/components/select/panel-width.d.ts +2 -0
- package/dist/components/select/panel-width.esm.js +7 -0
- package/dist/{src/components → components}/select/utils.d.ts +1 -1
- package/dist/components/skeleton/Skeleton.cjs +1 -0
- package/dist/components/skeleton/Skeleton.d.ts +6 -0
- package/dist/components/skeleton/Skeleton.esm.js +12 -0
- package/dist/components/skeleton/index.d.ts +2 -0
- package/dist/components/skeleton/types.d.ts +2 -0
- package/dist/components/stepper/Stepper.cjs +1 -0
- package/dist/components/stepper/Stepper.d.ts +51 -0
- package/dist/components/stepper/Stepper.esm.js +142 -0
- package/dist/components/stepper/index.d.ts +4 -0
- package/dist/components/stepper/use-stepper.cjs +1 -0
- package/dist/components/stepper/use-stepper.d.ts +43 -0
- package/dist/components/stepper/use-stepper.esm.js +57 -0
- package/dist/components/switch/Switch.cjs +1 -0
- package/dist/{src/components → components}/switch/Switch.d.ts +1 -1
- package/dist/components/switch/Switch.esm.js +37 -0
- package/dist/components/switch/index.d.ts +2 -0
- package/dist/components/switch/utils.cjs +1 -0
- package/dist/{src/components → components}/switch/utils.d.ts +2 -2
- package/dist/components/switch/utils.esm.js +40 -0
- package/dist/components/table/accordion-table.cjs +1 -0
- package/dist/{src/components → components}/table/accordion-table.d.ts +1 -1
- package/dist/components/table/accordion-table.esm.js +418 -0
- package/dist/components/table/column-group-utils.cjs +1 -0
- package/dist/{src/components → components}/table/column-group-utils.d.ts +1 -1
- package/dist/components/table/column-group-utils.esm.js +53 -0
- package/dist/components/table/components/ColumnPresetSelector.cjs +1 -0
- package/dist/{src/components → components}/table/components/ColumnPresetSelector.d.ts +2 -2
- package/dist/components/table/components/ColumnPresetSelector.esm.js +166 -0
- package/dist/components/table/components/ColumnSettingsTable.cjs +1 -0
- package/dist/{src/components → components}/table/components/ColumnSettingsTable.d.ts +1 -1
- package/dist/components/table/components/ColumnSettingsTable.esm.js +194 -0
- package/dist/components/table/components/KeyboardNavButton.cjs +1 -0
- package/dist/components/table/components/KeyboardNavButton.esm.js +24 -0
- package/dist/components/table/components/PageJumpInput.cjs +1 -0
- package/dist/components/table/components/PageJumpInput.esm.js +54 -0
- package/dist/components/table/components/Pagination.cjs +1 -0
- package/dist/components/table/components/Pagination.esm.js +163 -0
- package/dist/components/table/components/PaginationFooter.cjs +1 -0
- package/dist/components/table/components/PaginationFooter.esm.js +80 -0
- package/dist/components/table/components/SortableHeaderCell.cjs +1 -0
- package/dist/components/table/components/SortableHeaderCell.esm.js +30 -0
- package/dist/components/table/hooks/useColumnPresets.cjs +1 -0
- package/dist/{src/components → components}/table/hooks/useColumnPresets.d.ts +2 -2
- package/dist/components/table/hooks/useColumnPresets.esm.js +165 -0
- package/dist/components/table/hooks/useColumnResize.cjs +1 -0
- package/dist/{src/components → components}/table/hooks/useColumnResize.d.ts +12 -0
- package/dist/components/table/hooks/useColumnResize.esm.js +118 -0
- package/dist/components/table/hooks/useFillEmptyRows.d.ts +2 -0
- package/dist/components/table/hooks/useInfiniteScroll.d.ts +2 -0
- package/dist/components/table/hooks/useTableColumnState.cjs +1 -0
- package/dist/{src/components → components}/table/hooks/useTableColumnState.d.ts +1 -1
- package/dist/components/table/hooks/useTableColumnState.esm.js +46 -0
- package/dist/components/table/hooks/useTableDragSelection.d.ts +2 -0
- package/dist/components/table/hooks/useTableSort.cjs +1 -0
- package/dist/{src/components → components}/table/hooks/useTableSort.d.ts +1 -1
- package/dist/components/table/hooks/useTableSort.esm.js +30 -0
- package/dist/components/table/hooks/useVirtualTable.cjs +1 -0
- package/dist/components/table/hooks/useVirtualTable.esm.js +18 -0
- package/dist/components/table/index.d.ts +27 -0
- package/dist/components/table/mini-table.cjs +1 -0
- package/dist/{src/components → components}/table/mini-table.d.ts +1 -1
- package/dist/components/table/mini-table.esm.js +127 -0
- package/dist/components/table/paginated-mini-table.cjs +1 -0
- package/dist/{src/components → components}/table/paginated-mini-table.d.ts +1 -1
- package/dist/components/table/paginated-mini-table.esm.js +31 -0
- package/dist/components/table/paginated-table.cjs +1 -0
- package/dist/{src/components → components}/table/paginated-table.d.ts +1 -1
- package/dist/components/table/paginated-table.esm.js +31 -0
- package/dist/components/table/table.cjs +1 -0
- package/dist/{src/components → components}/table/table.d.ts +2 -1
- package/dist/components/table/table.esm.js +343 -0
- package/dist/components/table/utils.cjs +35 -0
- package/dist/{src/components → components}/table/utils.d.ts +2 -2
- package/dist/components/table/utils.esm.js +16 -0
- package/dist/components/table-checkbox/TableCheckbox.cjs +1 -0
- package/dist/components/table-checkbox/TableCheckbox.esm.js +40 -0
- package/dist/components/table-checkbox/index.d.ts +1 -0
- package/dist/components/table-page-layout/TablePageLayout.cjs +1 -0
- package/dist/components/table-page-layout/TablePageLayout.esm.js +37 -0
- package/dist/{src/components → components}/table-page-layout/index.d.ts +1 -1
- package/dist/components/textarea/Textarea.cjs +1 -0
- package/dist/{src/components → components}/textarea/Textarea.d.ts +1 -1
- package/dist/components/textarea/Textarea.esm.js +64 -0
- package/dist/components/textarea/index.d.ts +2 -0
- package/dist/components/time-picker/index.d.ts +2 -0
- package/dist/components/time-picker/time-picker.cjs +1 -0
- package/dist/components/time-picker/time-picker.d.ts +35 -0
- package/dist/components/time-picker/time-picker.esm.js +193 -0
- package/dist/components/time-picker/time-utils.cjs +1 -0
- package/dist/components/time-picker/time-utils.d.ts +12 -0
- package/dist/components/time-picker/time-utils.esm.js +56 -0
- package/dist/components/toast/ToastProvider.cjs +1 -0
- package/dist/{src/components → components}/toast/ToastProvider.d.ts +3 -0
- package/dist/components/toast/ToastProvider.esm.js +86 -0
- package/dist/components/toast/index.d.ts +3 -0
- package/dist/components/toast/index.esm.js +3 -0
- package/dist/components/toolbar/Toolbar.cjs +1 -0
- package/dist/{src/components → components}/toolbar/Toolbar.d.ts +1 -1
- package/dist/components/toolbar/Toolbar.esm.js +149 -0
- package/dist/components/toolbar/index.d.ts +2 -0
- package/dist/components/tooltip/Tooltip.cjs +1 -0
- package/dist/{src/components → components}/tooltip/Tooltip.d.ts +10 -0
- package/dist/components/tooltip/Tooltip.esm.js +39 -0
- package/dist/components/tooltip/index.d.ts +2 -0
- package/dist/components/typewriter-text/TypewriterText.cjs +1 -0
- package/dist/components/typewriter-text/TypewriterText.d.ts +7 -0
- package/dist/components/typewriter-text/TypewriterText.esm.js +58 -0
- package/dist/components/typewriter-text/index.d.ts +2 -0
- package/dist/components/typewriter-text/types.d.ts +12 -0
- package/dist/components/typing-dots/TypingDots.cjs +1 -0
- package/dist/components/typing-dots/TypingDots.d.ts +10 -0
- package/dist/components/typing-dots/TypingDots.esm.js +37 -0
- package/dist/components/typing-dots/index.d.ts +2 -0
- package/dist/components/typing-dots/types.d.ts +4 -0
- package/dist/hooks/awaitableOverlayController.cjs +1 -0
- package/dist/hooks/awaitableOverlayController.d.ts +6 -0
- package/dist/hooks/awaitableOverlayController.esm.js +18 -0
- package/dist/hooks/index.d.ts +17 -0
- package/dist/hooks/useAwaitableOverlay.cjs +1 -0
- package/dist/hooks/useAwaitableOverlay.d.ts +16 -0
- package/dist/hooks/useAwaitableOverlay.esm.js +22 -0
- package/dist/hooks/useBottomSheetDrag.cjs +1 -0
- package/dist/hooks/useBottomSheetDrag.esm.js +17 -0
- package/dist/hooks/useClickOutside.cjs +1 -0
- package/dist/hooks/useClickOutside.esm.js +20 -0
- package/dist/hooks/useFillEmptyRows.cjs +1 -0
- package/dist/{src/components/table/hooks → hooks}/useFillEmptyRows.d.ts +10 -1
- package/dist/hooks/useFillEmptyRows.esm.js +60 -0
- package/dist/hooks/useFocusTrap.cjs +1 -0
- package/dist/hooks/useFocusTrap.d.ts +47 -0
- package/dist/hooks/useFocusTrap.esm.js +210 -0
- package/dist/hooks/useInfiniteScroll.cjs +1 -0
- package/dist/hooks/useInfiniteScroll.d.ts +36 -0
- package/dist/hooks/useInfiniteScroll.esm.js +31 -0
- package/dist/hooks/useMediaQuery.cjs +1 -0
- package/dist/hooks/useMediaQuery.esm.js +15 -0
- package/dist/hooks/useScrollLock.cjs +1 -0
- package/dist/hooks/useScrollLock.esm.js +16 -0
- package/dist/hooks/useTableDragSelection.cjs +1 -0
- package/dist/{src/components/table/hooks → hooks}/useTableDragSelection.d.ts +3 -4
- package/dist/hooks/useTableDragSelection.esm.js +79 -0
- package/dist/hooks/useVirtualRows.cjs +1 -0
- package/dist/hooks/useVirtualRows.d.ts +56 -0
- package/dist/hooks/useVirtualRows.esm.js +20 -0
- package/dist/hooks.cjs +1 -0
- package/dist/hooks.esm.js +12 -0
- package/dist/index.cjs +1 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.esm.js +81 -0
- package/dist/lib/Portal.cjs +1 -0
- package/dist/lib/Portal.esm.js +11 -0
- package/dist/lib/column-preset-storage.cjs +1 -0
- package/dist/lib/column-preset-storage.esm.js +123 -0
- package/dist/lib/index.d.ts +6 -0
- package/dist/lib/overlay-stack.cjs +1 -0
- package/dist/lib/overlay-stack.esm.js +28 -0
- package/dist/lib/utils.cjs +1 -0
- package/dist/{src/lib → lib}/utils.d.ts +2 -1
- package/dist/lib/utils.esm.js +114 -0
- package/dist/node_modules/clsx/dist/clsx.cjs +1 -0
- package/dist/node_modules/clsx/dist/clsx.esm.js +16 -0
- package/dist/node_modules/lucide-react/dist/esm/Icon.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/Icon.esm.js +23 -0
- package/dist/node_modules/lucide-react/dist/esm/context.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/context.esm.js +6 -0
- package/dist/node_modules/lucide-react/dist/esm/createLucideIcon.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/createLucideIcon.esm.js +17 -0
- package/dist/node_modules/lucide-react/dist/esm/defaultAttributes.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/defaultAttributes.esm.js +14 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/arrow-left.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/arrow-left.esm.js +10 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/calendar.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/calendar.esm.js +25 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/check.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/check.esm.js +7 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/chevron-down.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/chevron-down.esm.js +7 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/chevron-left.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/chevron-left.esm.js +7 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/chevron-right.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/chevron-right.esm.js +7 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/chevrons-left.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/chevrons-left.esm.js +10 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/chevrons-right.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/chevrons-right.esm.js +10 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/circle-check.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/circle-check.esm.js +12 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/circle-x.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/circle-x.esm.js +19 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/clock.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/clock.esm.js +12 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/copy.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/copy.esm.js +15 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/eye-off.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/eye-off.esm.js +21 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/eye.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/eye.esm.js +12 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/grip-vertical.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/grip-vertical.esm.js +41 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/info.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/info.esm.js +19 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/keyboard.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/keyboard.esm.js +45 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/list-filter.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/list-filter.esm.js +17 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/loader-circle.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/loader-circle.esm.js +7 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/minus.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/minus.esm.js +7 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/rotate-ccw.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/rotate-ccw.esm.js +10 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/save.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/save.esm.js +17 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/search.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/search.esm.js +12 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/settings.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/settings.esm.js +12 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/triangle-alert.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/triangle-alert.esm.js +17 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/wrench.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/wrench.esm.js +7 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/x.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/x.esm.js +10 -0
- package/dist/node_modules/lucide-react/dist/esm/shared/src/utils/hasA11yProp.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/shared/src/utils/hasA11yProp.esm.js +7 -0
- package/dist/node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.esm.js +4 -0
- package/dist/node_modules/lucide-react/dist/esm/shared/src/utils/toCamelCase.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/shared/src/utils/toCamelCase.esm.js +4 -0
- package/dist/node_modules/lucide-react/dist/esm/shared/src/utils/toKebabCase.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/shared/src/utils/toKebabCase.esm.js +4 -0
- package/dist/node_modules/lucide-react/dist/esm/shared/src/utils/toPascalCase.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/shared/src/utils/toPascalCase.esm.js +8 -0
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.cjs +1 -0
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.esm.js +1723 -0
- package/dist/node_modules/use-debounce/dist/index.module.cjs +1 -0
- package/dist/node_modules/use-debounce/dist/index.module.esm.js +70 -0
- package/dist/tokens.css +1085 -0
- package/dist/ui.css +1 -1
- package/llms.txt +117 -0
- package/package.json +18 -9
- package/dist/index.cjs.js +0 -40
- package/dist/index.es.js +0 -8066
- package/dist/src/components/animated-height/index.d.ts +0 -2
- package/dist/src/components/badge/index.d.ts +0 -2
- package/dist/src/components/button/Button.d.ts +0 -2
- package/dist/src/components/checkbox/index.d.ts +0 -2
- package/dist/src/components/collapsible/index.d.ts +0 -2
- package/dist/src/components/date-input/index.d.ts +0 -1
- package/dist/src/components/date-picker/index.d.ts +0 -5
- package/dist/src/components/drawer/Drawer.d.ts +0 -18
- package/dist/src/components/drawer/index.d.ts +0 -2
- package/dist/src/components/info-tooltip/index.d.ts +0 -2
- package/dist/src/components/input/index.d.ts +0 -4
- package/dist/src/components/loading-spinner/index.d.ts +0 -2
- package/dist/src/components/modal/index.d.ts +0 -6
- package/dist/src/components/page-title/index.d.ts +0 -1
- package/dist/src/components/popover/index.d.ts +0 -2
- package/dist/src/components/select/index.d.ts +0 -4
- package/dist/src/components/select/loading-dots.d.ts +0 -9
- package/dist/src/components/switch/index.d.ts +0 -2
- package/dist/src/components/table/hooks/useInfiniteScroll.d.ts +0 -58
- package/dist/src/components/table/index.d.ts +0 -27
- package/dist/src/components/table-checkbox/index.d.ts +0 -1
- package/dist/src/components/textarea/index.d.ts +0 -2
- package/dist/src/components/toast/index.d.ts +0 -3
- package/dist/src/components/toolbar/index.d.ts +0 -2
- package/dist/src/components/tooltip/index.d.ts +0 -2
- package/dist/src/hooks/index.d.ts +0 -4
- package/dist/src/index.d.ts +0 -27
- package/dist/src/lib/index.d.ts +0 -6
- /package/dist/{src/components → components}/animated-height/AnimatedHeight.d.ts +0 -0
- /package/dist/{src/components → components}/badge/types.d.ts +0 -0
- /package/dist/{src/components → components}/button/types.d.ts +0 -0
- /package/dist/{src/components → components}/checkbox/types.d.ts +0 -0
- /package/dist/{src/components → components}/collapsible/Collapsible.d.ts +0 -0
- /package/dist/{src/components → components}/page-title/PageTitle.d.ts +0 -0
- /package/dist/{src/components → components}/search-box/ExactMatchToggle.d.ts +0 -0
- /package/dist/{src/components → components}/search-box/SearchBoxChips.d.ts +0 -0
- /package/dist/{src/components → components}/search-box/SearchBoxFloatingInput.d.ts +0 -0
- /package/dist/{src/components → components}/search-box/SearchBoxMonth.d.ts +0 -0
- /package/dist/{src/components → components}/search-box/SearchBoxSheetContext.d.ts +0 -0
- /package/dist/{src/components → components}/search-box/parseDateRange.d.ts +0 -0
- /package/dist/{src/components → components}/select/types.d.ts +0 -0
- /package/dist/{src/components → components}/switch/types.d.ts +0 -0
- /package/dist/{src/components → components}/table/components/KeyboardNavButton.d.ts +0 -0
- /package/dist/{src/components → components}/table/components/PageJumpInput.d.ts +0 -0
- /package/dist/{src/components → components}/table/components/Pagination.d.ts +0 -0
- /package/dist/{src/components → components}/table/components/PaginationFooter.d.ts +0 -0
- /package/dist/{src/components → components}/table/components/SortableHeaderCell.d.ts +0 -0
- /package/dist/{src/components → components}/table/hooks/useVirtualTable.d.ts +0 -0
- /package/dist/{src/components → components}/table/types.d.ts +0 -0
- /package/dist/{src/components → components}/table-checkbox/TableCheckbox.d.ts +0 -0
- /package/dist/{src/components → components}/table-page-layout/TablePageLayout.d.ts +0 -0
- /package/dist/{src/components → components}/textarea/types.d.ts +0 -0
- /package/dist/{src/hooks → hooks}/useBottomSheetDrag.d.ts +0 -0
- /package/dist/{src/hooks → hooks}/useClickOutside.d.ts +0 -0
- /package/dist/{src/hooks → hooks}/useMediaQuery.d.ts +0 -0
- /package/dist/{src/hooks → hooks}/useScrollLock.d.ts +0 -0
- /package/dist/{src/lib → lib}/Portal.d.ts +0 -0
- /package/dist/{src/lib → lib}/column-preset-storage.d.ts +0 -0
- /package/dist/{src/lib → lib}/overlay-stack.d.ts +0 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { useEffect as e, useRef as t, useState as n } from "react";
|
|
2
|
+
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
3
|
+
import { motion as a, useReducedMotion as o } from "motion/react";
|
|
4
|
+
//#region src/components/typewriter-text/TypewriterText.tsx
|
|
5
|
+
var s = 32, c = 90;
|
|
6
|
+
function l(e) {
|
|
7
|
+
let t = [], n = /\S+\s*/g, r = n.exec(e);
|
|
8
|
+
for (; r !== null;) t.push(r.index + r[0].length), r = n.exec(e);
|
|
9
|
+
return t.length === 0 && e.length > 0 && t.push(e.length), t;
|
|
10
|
+
}
|
|
11
|
+
function u({ text: u, delay: d = 0, animate: f = !0, onComplete: p, unit: m = "character" }) {
|
|
12
|
+
let h = o() ?? !1, g = f && !h, [_, v] = n(() => g ? 0 : u.length), y = t(p), b = t(null);
|
|
13
|
+
y.current = p, e(() => {
|
|
14
|
+
if (!g || u.length === 0) {
|
|
15
|
+
v(u.length), b.current !== u && (b.current = u, y.current?.());
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
b.current = null, v(0);
|
|
19
|
+
let e, t = m === "word" ? l(u) : Array.from({ length: u.length }, (e, t) => t + 1), n = m === "word" ? c : s, r = 0, i = window.setTimeout(() => {
|
|
20
|
+
e = window.setInterval(() => {
|
|
21
|
+
let n = t[r] ?? u.length;
|
|
22
|
+
r += 1, v(n), r >= t.length && (e !== void 0 && window.clearInterval(e), y.current?.());
|
|
23
|
+
}, n);
|
|
24
|
+
}, d);
|
|
25
|
+
return () => {
|
|
26
|
+
window.clearTimeout(i), e !== void 0 && window.clearInterval(e);
|
|
27
|
+
};
|
|
28
|
+
}, [
|
|
29
|
+
d,
|
|
30
|
+
g,
|
|
31
|
+
u,
|
|
32
|
+
m
|
|
33
|
+
]);
|
|
34
|
+
let x = g && _ < u.length;
|
|
35
|
+
return /* @__PURE__ */ i("span", {
|
|
36
|
+
"aria-label": u,
|
|
37
|
+
children: [/* @__PURE__ */ r("span", {
|
|
38
|
+
"aria-hidden": "true",
|
|
39
|
+
children: u.slice(0, _)
|
|
40
|
+
}), x ? /* @__PURE__ */ r(a.span, {
|
|
41
|
+
"aria-hidden": "true",
|
|
42
|
+
animate: { opacity: [
|
|
43
|
+
0,
|
|
44
|
+
1,
|
|
45
|
+
1,
|
|
46
|
+
0
|
|
47
|
+
] },
|
|
48
|
+
transition: {
|
|
49
|
+
duration: .8,
|
|
50
|
+
ease: "linear",
|
|
51
|
+
repeat: Infinity
|
|
52
|
+
},
|
|
53
|
+
children: "|"
|
|
54
|
+
}) : null]
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
//#endregion
|
|
58
|
+
export { u as TypewriterText };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface TypewriterTextProps {
|
|
2
|
+
/** 표시할 전체 문자열. */
|
|
3
|
+
text: string;
|
|
4
|
+
/** 시작 전 대기 시간(ms). 기본 0. */
|
|
5
|
+
delay?: number;
|
|
6
|
+
/** false면 즉시 표시한다. 재방문 시 효과를 생략하려면 상위에서 이 값을 관리한다. */
|
|
7
|
+
animate?: boolean;
|
|
8
|
+
/** 타이핑 또는 즉시 표시가 끝나면 호출된다. */
|
|
9
|
+
onComplete?: () => void;
|
|
10
|
+
/** 글자 또는 공백을 포함한 단어 단위로 표시한다. 기본 character. */
|
|
11
|
+
unit?: "character" | "word";
|
|
12
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
let e=require("react/jsx-runtime"),t=require("motion/react");var n=3,r=1.2,i=r/n;function a({label:a}){let o=(0,t.useReducedMotion)()??!1;return(0,e.jsx)(`span`,{role:`status`,"aria-label":a,className:`inline-flex items-center gap-[0.2em] align-baseline`,children:Array.from({length:n},(n,a)=>(0,e.jsx)(t.motion.span,{"aria-hidden":`true`,className:`inline-block size-[0.35em] rounded-full bg-current`,style:{opacity:o?.4:void 0},animate:o?void 0:{opacity:[.3,1,.3],y:[`0em`,`-0.22em`,`0em`]},transition:o?void 0:{duration:r,ease:`easeInOut`,repeat:1/0,delay:a*i}},a))})}exports.TypingDots=a;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { TypingDotsProps } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* 값이 아직 없는 자리에 놓는 점 3개 인디케이터입니다. 채팅의 "입력 중"과
|
|
4
|
+
* 값 로딩("잔고를 불러오는 중")에 모두 씁니다.
|
|
5
|
+
*
|
|
6
|
+
* **색과 크기를 스스로 정하지 않습니다.** 점은 `currentColor`를 쓰고 지름은
|
|
7
|
+
* `em`이라 놓인 자리의 글자색·글자크기를 그대로 따릅니다.
|
|
8
|
+
* 색을 바꾸려면 부모의 text 색을 바꿉니다.
|
|
9
|
+
*/
|
|
10
|
+
export declare function TypingDots({ label }: TypingDotsProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { jsx as e } from "react/jsx-runtime";
|
|
2
|
+
import { motion as t, useReducedMotion as n } from "motion/react";
|
|
3
|
+
//#region src/components/typing-dots/TypingDots.tsx
|
|
4
|
+
var r = 3, i = 1.2, a = i / r;
|
|
5
|
+
function o({ label: o }) {
|
|
6
|
+
let s = n() ?? !1;
|
|
7
|
+
return /* @__PURE__ */ e("span", {
|
|
8
|
+
role: "status",
|
|
9
|
+
"aria-label": o,
|
|
10
|
+
className: "inline-flex items-center gap-[0.2em] align-baseline",
|
|
11
|
+
children: Array.from({ length: r }, (n, r) => /* @__PURE__ */ e(t.span, {
|
|
12
|
+
"aria-hidden": "true",
|
|
13
|
+
className: "inline-block size-[0.35em] rounded-full bg-current",
|
|
14
|
+
style: { opacity: s ? .4 : void 0 },
|
|
15
|
+
animate: s ? void 0 : {
|
|
16
|
+
opacity: [
|
|
17
|
+
.3,
|
|
18
|
+
1,
|
|
19
|
+
.3
|
|
20
|
+
],
|
|
21
|
+
y: [
|
|
22
|
+
"0em",
|
|
23
|
+
"-0.22em",
|
|
24
|
+
"0em"
|
|
25
|
+
]
|
|
26
|
+
},
|
|
27
|
+
transition: s ? void 0 : {
|
|
28
|
+
duration: i,
|
|
29
|
+
ease: "easeInOut",
|
|
30
|
+
repeat: Infinity,
|
|
31
|
+
delay: r * a
|
|
32
|
+
}
|
|
33
|
+
}, r))
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
export { o as TypingDots };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function e(){let e=null,t=t=>{if(!e)return!1;let n=e;return e=null,n(t),!0};return{open(){return t({type:`cancel`}),new Promise(t=>{e=t})},settle:t}}exports.createAwaitableOverlayController=e;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { AwaitableOverlayResult } from './useAwaitableOverlay.js';
|
|
2
|
+
/** 한 번에 하나의 응답만 기다리고 이전 요청은 취소로 끝낸다. */
|
|
3
|
+
export declare function createAwaitableOverlayController<TResult>(): {
|
|
4
|
+
open(): Promise<AwaitableOverlayResult<TResult>>;
|
|
5
|
+
settle: (result: AwaitableOverlayResult<TResult>) => boolean;
|
|
6
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
//#region src/hooks/awaitableOverlayController.ts
|
|
2
|
+
function e() {
|
|
3
|
+
let e = null, t = (t) => {
|
|
4
|
+
if (!e) return !1;
|
|
5
|
+
let n = e;
|
|
6
|
+
return e = null, n(t), !0;
|
|
7
|
+
};
|
|
8
|
+
return {
|
|
9
|
+
open() {
|
|
10
|
+
return t({ type: "cancel" }), new Promise((t) => {
|
|
11
|
+
e = t;
|
|
12
|
+
});
|
|
13
|
+
},
|
|
14
|
+
settle: t
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
//#endregion
|
|
18
|
+
export { e as createAwaitableOverlayController };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export { useClickOutside } from './useClickOutside.js';
|
|
2
|
+
export { useMediaQuery, useIsMobile, MOBILE_MEDIA_QUERY, } from './useMediaQuery.js';
|
|
3
|
+
export { useBottomSheetDrag } from './useBottomSheetDrag.js';
|
|
4
|
+
export { useScrollLock } from './useScrollLock.js';
|
|
5
|
+
export { useFocusTrap, type UseFocusTrapOptions } from './useFocusTrap.js';
|
|
6
|
+
export { useInfiniteScroll } from './useInfiniteScroll.js';
|
|
7
|
+
export type { UseInfiniteScrollOptions, UseInfiniteScrollReturn, InfiniteScrollOptions, LegacyInfiniteScrollOptions, } from './useInfiniteScroll.js';
|
|
8
|
+
export { useFillEmptyRows } from './useFillEmptyRows.js';
|
|
9
|
+
export type { FillEmptyRowsRemainingMode, UseFillEmptyRowsOptions, UseFillEmptyRowsReturn, } from './useFillEmptyRows.js';
|
|
10
|
+
export { useTableDragSelection } from './useTableDragSelection.js';
|
|
11
|
+
export type { UseTableDragSelectionOptions } from './useTableDragSelection.js';
|
|
12
|
+
export { useVirtualRows } from './useVirtualRows.js';
|
|
13
|
+
export type { UseVirtualRowsOptions, UseVirtualRowsReturn, } from './useVirtualRows.js';
|
|
14
|
+
export { useAwaitableOverlay } from './useAwaitableOverlay.js';
|
|
15
|
+
export type { AwaitableOverlayResult } from './useAwaitableOverlay.js';
|
|
16
|
+
export { useStepper } from '../components/stepper/use-stepper.js';
|
|
17
|
+
export type { UseStepperOptions, StepperState, } from '../components/stepper/use-stepper.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("./awaitableOverlayController.cjs");let t=require("react");function n(){let[n,r]=(0,t.useState)(!1),i=(0,t.useRef)(null);i.current||=e.createAwaitableOverlayController();let a=i.current;return(0,t.useEffect)(()=>()=>{a.settle({type:`cancel`})},[a]),{isOpen:n,open:(0,t.useCallback)(()=>{let e=a.open();return r(!0),e},[a]),settle:(0,t.useCallback)(e=>{a.settle(e)&&r(!1)},[a])}}exports.useAwaitableOverlay=n;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type AwaitableOverlayResult<TResult = void> = {
|
|
2
|
+
type: "confirm";
|
|
3
|
+
value: TResult;
|
|
4
|
+
} | {
|
|
5
|
+
type: "cancel";
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* 오버레이 응답을 Promise로 기다린다. 내용과 표시 방식은 호출부가 관리한다.
|
|
9
|
+
* 중복 open과 언마운트는 이전 요청을 cancel로 완료한다. ESC·백드롭 등 모든 닫기 경로에서
|
|
10
|
+
* settle({ type: "cancel" })을 호출해야 열린 Promise가 남지 않는다.
|
|
11
|
+
*/
|
|
12
|
+
export declare function useAwaitableOverlay<TResult = void>(): {
|
|
13
|
+
isOpen: boolean;
|
|
14
|
+
open: () => Promise<AwaitableOverlayResult<TResult>>;
|
|
15
|
+
settle: (result: AwaitableOverlayResult<TResult>) => void;
|
|
16
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { createAwaitableOverlayController as e } from "./awaitableOverlayController.esm.js";
|
|
2
|
+
import { useCallback as t, useEffect as n, useRef as r, useState as i } from "react";
|
|
3
|
+
//#region src/hooks/useAwaitableOverlay.ts
|
|
4
|
+
function a() {
|
|
5
|
+
let [a, o] = i(!1), s = r(null);
|
|
6
|
+
s.current ||= e();
|
|
7
|
+
let c = s.current;
|
|
8
|
+
return n(() => () => {
|
|
9
|
+
c.settle({ type: "cancel" });
|
|
10
|
+
}, [c]), {
|
|
11
|
+
isOpen: a,
|
|
12
|
+
open: t(() => {
|
|
13
|
+
let e = c.open();
|
|
14
|
+
return o(!0), e;
|
|
15
|
+
}, [c]),
|
|
16
|
+
settle: t((e) => {
|
|
17
|
+
c.settle(e) && o(!1);
|
|
18
|
+
}, [c])
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//#endregion
|
|
22
|
+
export { a as useAwaitableOverlay };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
let e=require("motion/react");var t=100,n=500;function r({onDismiss:r}){let i=(0,e.useDragControls)();return{dragControls:i,handleDragEnd:(e,i)=>{(i.offset.y>t||i.velocity.y>n)&&r()},startDrag:e=>{i.start(e)}}}exports.useBottomSheetDrag=r;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { useDragControls as e } from "motion/react";
|
|
2
|
+
//#region src/hooks/useBottomSheetDrag.ts
|
|
3
|
+
var t = 100, n = 500;
|
|
4
|
+
function r({ onDismiss: r }) {
|
|
5
|
+
let i = e();
|
|
6
|
+
return {
|
|
7
|
+
dragControls: i,
|
|
8
|
+
handleDragEnd: (e, i) => {
|
|
9
|
+
(i.offset.y > t || i.velocity.y > n) && r();
|
|
10
|
+
},
|
|
11
|
+
startDrag: (e) => {
|
|
12
|
+
i.start(e);
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
//#endregion
|
|
17
|
+
export { r as useBottomSheetDrag };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
let e=require("react");function t(t,n,r=!0){(0,e.useEffect)(()=>{if(!r)return;let e=e=>{let r=e.target;!t.current||t.current.contains(r)||n(e)};return document.addEventListener(`mousedown`,e),document.addEventListener(`touchstart`,e),()=>{document.removeEventListener(`mousedown`,e),document.removeEventListener(`touchstart`,e)}},[t,n,r])}exports.useClickOutside=t;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { useEffect as e } from "react";
|
|
2
|
+
//#region src/hooks/useClickOutside.ts
|
|
3
|
+
function t(t, n, r = !0) {
|
|
4
|
+
e(() => {
|
|
5
|
+
if (!r) return;
|
|
6
|
+
let e = (e) => {
|
|
7
|
+
let r = e.target;
|
|
8
|
+
!t.current || t.current.contains(r) || n(e);
|
|
9
|
+
};
|
|
10
|
+
return document.addEventListener("mousedown", e), document.addEventListener("touchstart", e), () => {
|
|
11
|
+
document.removeEventListener("mousedown", e), document.removeEventListener("touchstart", e);
|
|
12
|
+
};
|
|
13
|
+
}, [
|
|
14
|
+
t,
|
|
15
|
+
n,
|
|
16
|
+
r
|
|
17
|
+
]);
|
|
18
|
+
}
|
|
19
|
+
//#endregion
|
|
20
|
+
export { t as useClickOutside };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
let e=require("react");function t({containerHeight:e,headerHeight:t,rowHeights:n,remainingMode:r,tbodyHeight:i,emptyRowsHeight:a}){if(n.length===0)return{emptyRowCount:0,measuredRowHeight:null};let o=n.reduce((e,t)=>e+t,0),s=o/n.length;if(s<=0)return null;let c=r===`tbody-height`?Math.max(0,i-a):o,l=e-t-c;return{emptyRowCount:l>0?Math.floor(l/s):0,measuredRowHeight:s}}function n({enabled:n,containerRef:r,theadRef:i,tbodyRef:a,excludeRowsSelector:o,remainingMode:s,observeTbody:c=!1,deps:l=[]}){let[u,d]=(0,e.useState)(0),[f,p]=(0,e.useState)(null),[m,h]=(0,e.useState)(()=>[...l]);return(m.length!==l.length||l.some((e,t)=>!Object.is(e,m[t])))&&h([...l]),(0,e.useLayoutEffect)(()=>{if(!n){d(e=>e===0?e:0);return}let e=r.current,l=i.current,u=a.current;if(!e||!l||!u)return;let f=()=>{let n=Array.from(u.querySelectorAll(o)).map(e=>e.offsetHeight),r=s===`tbody-height`?Array.from(u.querySelectorAll(`tr[data-empty-row]`)).reduce((e,t)=>e+t.offsetHeight,0):0,i=t({containerHeight:e.clientHeight,headerHeight:l.offsetHeight,rowHeights:n,remainingMode:s,tbodyHeight:u.offsetHeight,emptyRowsHeight:r});i&&(p(e=>e===i.measuredRowHeight?e:i.measuredRowHeight),d(e=>e===i.emptyRowCount?e:i.emptyRowCount))};f();let m=null,h=new ResizeObserver(()=>{m===null&&(m=requestAnimationFrame(()=>{m=null,f()}))});return h.observe(e),c&&h.observe(u),()=>{h.disconnect(),m!==null&&cancelAnimationFrame(m)}},[n,r,i,a,o,s,c,m]),{emptyRowCount:u,measuredRowHeight:f}}exports.useFillEmptyRows=n;
|
|
@@ -17,7 +17,7 @@ export interface UseFillEmptyRowsOptions {
|
|
|
17
17
|
/**
|
|
18
18
|
* 잔여 공간 계산 방식.
|
|
19
19
|
* - `sum-real-rows`: 측정 대상 행들의 높이 합을 뺀다 (펼침 없는 단순 테이블).
|
|
20
|
-
* - `tbody-height`: tbody
|
|
20
|
+
* - `tbody-height`: 빈 행을 뺀 tbody 높이를 뺀다 (펼침 행이 있는 경우).
|
|
21
21
|
*/
|
|
22
22
|
remainingMode: FillEmptyRowsRemainingMode;
|
|
23
23
|
/**
|
|
@@ -42,6 +42,15 @@ export interface UseFillEmptyRowsReturn {
|
|
|
42
42
|
/** 측정된 평균 행 높이(px). 빈 행의 height에 그대로 적용 가능. */
|
|
43
43
|
measuredRowHeight: number | null;
|
|
44
44
|
}
|
|
45
|
+
/** 빈 행을 제외한 높이로 남은 행 수를 계산한다. */
|
|
46
|
+
export declare function calculateFillEmptyRows({ containerHeight, headerHeight, rowHeights, remainingMode, tbodyHeight, emptyRowsHeight, }: {
|
|
47
|
+
containerHeight: number;
|
|
48
|
+
headerHeight: number;
|
|
49
|
+
rowHeights: number[];
|
|
50
|
+
remainingMode: FillEmptyRowsRemainingMode;
|
|
51
|
+
tbodyHeight: number;
|
|
52
|
+
emptyRowsHeight: number;
|
|
53
|
+
}): UseFillEmptyRowsReturn | null;
|
|
45
54
|
/**
|
|
46
55
|
* 컨테이너 잔여 공간만큼 빈 행을 채우기 위한 개수/높이를 계산한다.
|
|
47
56
|
*
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { useLayoutEffect as e, useState as t } from "react";
|
|
2
|
+
//#region src/hooks/useFillEmptyRows.ts
|
|
3
|
+
function n({ containerHeight: e, headerHeight: t, rowHeights: n, remainingMode: r, tbodyHeight: i, emptyRowsHeight: a }) {
|
|
4
|
+
if (n.length === 0) return {
|
|
5
|
+
emptyRowCount: 0,
|
|
6
|
+
measuredRowHeight: null
|
|
7
|
+
};
|
|
8
|
+
let o = n.reduce((e, t) => e + t, 0), s = o / n.length;
|
|
9
|
+
if (s <= 0) return null;
|
|
10
|
+
let c = r === "tbody-height" ? Math.max(0, i - a) : o, l = e - t - c;
|
|
11
|
+
return {
|
|
12
|
+
emptyRowCount: l > 0 ? Math.floor(l / s) : 0,
|
|
13
|
+
measuredRowHeight: s
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function r({ enabled: r, containerRef: i, theadRef: a, tbodyRef: o, excludeRowsSelector: s, remainingMode: c, observeTbody: l = !1, deps: u = [] }) {
|
|
17
|
+
let [d, f] = t(0), [p, m] = t(null), [h, g] = t(() => [...u]);
|
|
18
|
+
return (h.length !== u.length || u.some((e, t) => !Object.is(e, h[t]))) && g([...u]), e(() => {
|
|
19
|
+
if (!r) {
|
|
20
|
+
f((e) => e === 0 ? e : 0);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
let e = i.current, t = a.current, u = o.current;
|
|
24
|
+
if (!e || !t || !u) return;
|
|
25
|
+
let d = () => {
|
|
26
|
+
let r = Array.from(u.querySelectorAll(s)).map((e) => e.offsetHeight), i = c === "tbody-height" ? Array.from(u.querySelectorAll("tr[data-empty-row]")).reduce((e, t) => e + t.offsetHeight, 0) : 0, a = n({
|
|
27
|
+
containerHeight: e.clientHeight,
|
|
28
|
+
headerHeight: t.offsetHeight,
|
|
29
|
+
rowHeights: r,
|
|
30
|
+
remainingMode: c,
|
|
31
|
+
tbodyHeight: u.offsetHeight,
|
|
32
|
+
emptyRowsHeight: i
|
|
33
|
+
});
|
|
34
|
+
a && (m((e) => e === a.measuredRowHeight ? e : a.measuredRowHeight), f((e) => e === a.emptyRowCount ? e : a.emptyRowCount));
|
|
35
|
+
};
|
|
36
|
+
d();
|
|
37
|
+
let p = null, h = new ResizeObserver(() => {
|
|
38
|
+
p === null && (p = requestAnimationFrame(() => {
|
|
39
|
+
p = null, d();
|
|
40
|
+
}));
|
|
41
|
+
});
|
|
42
|
+
return h.observe(e), l && h.observe(u), () => {
|
|
43
|
+
h.disconnect(), p !== null && cancelAnimationFrame(p);
|
|
44
|
+
};
|
|
45
|
+
}, [
|
|
46
|
+
r,
|
|
47
|
+
i,
|
|
48
|
+
a,
|
|
49
|
+
o,
|
|
50
|
+
s,
|
|
51
|
+
c,
|
|
52
|
+
l,
|
|
53
|
+
h
|
|
54
|
+
]), {
|
|
55
|
+
emptyRowCount: d,
|
|
56
|
+
measuredRowHeight: p
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
//#endregion
|
|
60
|
+
export { r as useFillEmptyRows };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
let e=require("react");var t=[`a[href]`,`area[href]`,`button`,`input`,`select`,`textarea`,`iframe`,`summary`,`audio[controls]`,`video[controls]`,`[contenteditable]:not([contenteditable='false'])`,`[tabindex]`].join(`,`);function n(e,n=!1){let r=Array.from(e.querySelectorAll(t));n&&e.matches(t)&&r.unshift(e);let i=e=>{let t=n?e.getAttribute(`data-tabindex`):null;return t===null?e.tabIndex:t===``?0:Number(t)},a=e=>{if(!(e instanceof HTMLInputElement)||e.type!==`radio`||!e.name||e.checked)return!0;let t=(e.form??document).querySelectorAll(`input[type="radio"][name="${CSS.escape(e.name)}"]`);return!Array.from(t).some(t=>t.checked&&t.form===e.form)};return r.filter(e=>{let t=window.getComputedStyle(e);return i(e)>=0&&a(e)&&!e.matches(`:disabled`)&&!e.hasAttribute(`data-floating-ui-focus-guard`)&&!e.closest(`[hidden], [inert], [aria-hidden='true']`)&&t.visibility!==`hidden`&&t.visibility!==`collapse`&&e.getClientRects().length>0}).sort((e,t)=>{let n=i(e)>0?i(e):1/0,r=i(t)>0?i(t):1/0;return n===r?0:n-r})}var r=`[data-floating-ui-portal]`,i=`[data-focus-trap-layer]`,a=`[data-floating-ui-focus-guard]`,o=`[data-picker-panel]`,s=`[role="dialog"][aria-modal="true"]`,c=[`Shift`,`Alt`,`Control`,`Meta`];function l(e,t=()=>!0){let n=[],a=[e];for(let e of document.querySelectorAll(i))!e.closest(s)&&!e.querySelector(s)&&(n.push(e),a.push(e));for(let i of a)for(let o of i.querySelectorAll(`[aria-controls]`))if(!(i===e&&!t(o)))for(let e of(o.getAttribute(`aria-controls`)??``).split(/\s+/)){let t=document.getElementById(e)?.closest(r);t&&!n.includes(t)&&!t.closest(s)&&!t.querySelector(s)&&(n.push(t),a.push(t))}return n.sort((e,t)=>e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING?-1:1)}function u(e,t,i){let a=[e,...l(e,i)];for(let o of a)for(let a of o.querySelectorAll(`[aria-controls]`))if(!(o===e&&!i(a))&&(a.getAttribute(`aria-controls`)??``).split(/\s+/).some(e=>document.getElementById(e)?.closest(r)===t))return a.tabIndex>=0?a:n(a)[0]??null;return null}function d(e){let t=e.closest(`${r}, ${i}`);return!!(e.closest(`[data-ui-action-toast]`)||t&&!e.closest(s))}function f(e,t,n){let r=n?Node.DOCUMENT_POSITION_PRECEDING:Node.DOCUMENT_POSITION_FOLLOWING,i=e=>e!==t&&!!(t.compareDocumentPosition(e)&r);if(!n)return e.find(i)??e[0];for(let t=e.length-1;t>=0;t--)if(i(e[t]))return e[t];return e[e.length-1]}function p(t,{enabled:r,canTrap:i,trapFocus:p=!0,cover:m}){let h=(0,e.useRef)(null),g=(0,e.useRef)(null),_=(0,e.useRef)(null),v=(0,e.useRef)(!1),y=(0,e.useRef)(i);y.current=i,r&&!v.current&&typeof document<`u`&&(h.current=document.activeElement instanceof HTMLElement?document.activeElement:null),v.current=r,(0,e.useEffect)(()=>{g.current=t,_.current=t?.parentElement?.closest(s)??null,!t&&!r&&(h.current=null)},[t,r]),(0,e.useEffect)(()=>{if(r)return()=>{let e=h.current,t=document.activeElement,r=g.current;if(t&&t!==document.body&&t.isConnected&&!r?.contains(t)&&!d(t))return;let i=_.current;i?.isConnected&&(!e?.isConnected||!i.contains(e))?(n(i).find(e=>!r?.contains(e))??i).focus({preventScroll:!0}):e?.isConnected&&e.focus({preventScroll:!0})}},[r]),(0,e.useEffect)(()=>{if(!(!r||!t)&&!t.contains(document.activeElement)){let e=n(t)[0];e?e.focus({preventScroll:!0}):(t.hasAttribute(`tabindex`)||(t.tabIndex=-1),t.focus({preventScroll:!0}))}},[t,r]),(0,e.useEffect)(()=>{if(!r||!t||!p)return;let e=t.parentElement?.closest(s)??null,i=()=>{if(!m||!e?.isConnected||!e.contains(m))return null;let t=m.offsetParent,n=t instanceof HTMLElement&&e.contains(t)?t:m.parentElement;return n?{parent:e,covered:n}:null},d=e=>n=>t.contains(n)||!!e&&e.parent.contains(n)&&!e.covered.contains(n),h=(e,r)=>{let i=e?.parent??t,o=e?n(i).filter(r):n(t),s=l(i,r),c=[o],u=new Set(o);for(let e of s){if(e.querySelector(a))continue;let t=n(e,!0).filter(e=>u.has(e)?!1:(u.add(e),!0));t.length&&c.push(t)}return{tabbables:o,layers:s,groups:c,ring:c.flat()}},g=null,_=!1,v=!1,b,x,S=()=>t.isConnected&&!(y.current&&!y.current()),C=e=>{v=!0;try{e.focus({preventScroll:!0})}finally{v=!1}},w=document.activeElement instanceof HTMLElement&&d(i())(document.activeElement)?document.activeElement:null,T=null,E,D=e=>!!e&&e.isConnected&&!e.matches(`:disabled`)&&e.getClientRects().length>0,O=new MutationObserver(()=>{if(!T||T.element.isConnected)return;let e=T.restore;T=null,O.disconnect(),clearTimeout(E),E=setTimeout(()=>{let r=document.activeElement;!t.isConnected||r&&r!==document.body&&r.isConnected||y.current&&!y.current()||([e,w&&d(i())(w)?w:null].find(D)??n(t)[0]??t).focus({preventScroll:!0})})}),k=e=>{let n=e.target;if(!(n instanceof HTMLElement)||n!==document.activeElement)return;let r=i(),a=d(r);if(a(n))w=n,T=null,document.hasFocus()&&(_=!1);else if(n.closest(`[data-ui-action-toast]`))T={element:n,restore:w};else{let e=r?.parent??t,i=l(e,a).find(e=>e.contains(n));if(T=i?{element:n,restore:u(e,i,a)}:null,!i&&(g||_)&&!v&&S()){let e=g?g.backward:!!(t.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_FOLLOWING);_=!1;let{ring:i}=h(r,a);C(f(i,n,e)??w??t);return}}T?O.observe(document.body,{childList:!0,subtree:!0}):O.disconnect()};document.addEventListener(`focusin`,k);let A=e=>{if(!g||e.relatedTarget!==null||!(e.target instanceof Node)||!e.target.isConnected)return;let n=g.backward;_=!0,clearTimeout(x),x=setTimeout(()=>{let e=document.activeElement;if(!_||e&&e!==document.body||!S())return;let r=i(),{ring:a}=h(r,d(r));C((n?a[a.length-1]:a[0])??t)})};document.addEventListener(`focusout`,A);let j=e=>{c.includes(e.key)||(_=!1,g=e.key===`Tab`&&!e.ctrlKey&&!e.metaKey?{backward:e.shiftKey}:null,clearTimeout(b),g&&(b=setTimeout(()=>{g=null})))},M=()=>{g=null,_=!1};document.addEventListener(`keydown`,j,!0),document.addEventListener(`pointerdown`,M,!0);let N=e=>{if(e.key!==`Tab`||e.defaultPrevented||e.ctrlKey||e.metaKey||y.current&&!y.current())return;let r=document.activeElement,s=i(),c=d(s),{tabbables:l,layers:p,groups:m,ring:g}=h(s,c),_=p.find(e=>r&&e.contains(r)),v=g[0],b=g[g.length-1];if(_?.querySelector(a)){let i=s?.parent??t,l=n(_,!0),d=(r instanceof Element?r.closest(o):null)?.nextElementSibling;!e.shiftKey&&v&&d instanceof HTMLElement&&d.matches(a)&&r===l[l.length-1]&&u(i,_,c)===b&&(e.preventDefault(),d.focus({preventScroll:!0}),v.focus({preventScroll:!0}));return}if(v&&b&&(!e.shiftKey&&r===b||e.shiftKey&&r===v)){let n=s?.parent??t,r=p.find(e=>e.querySelector(a)&&u(n,e,c)===b),i=r?.id?n.querySelector(`[aria-owns="${CSS.escape(r.id)}"]`):null,o=e.shiftKey?i?.nextElementSibling:i?.previousElementSibling;if(o instanceof HTMLElement&&o.matches(a)){e.preventDefault(),o.focus({preventScroll:!0});return}}if(s&&r instanceof HTMLElement){let t=e.shiftKey?-1:1,i=n(s.parent),a=i[i.indexOf(r)+t],o=l.indexOf(r),u=o>=0?l[o+t]:void 0;if(u&&a&&!c(a)){e.preventDefault(),u.focus({preventScroll:!0});return}}if(!v||!b)e.preventDefault(),t.focus({preventScroll:!0});else if(!(r&&c(r))&&!_)e.preventDefault(),(e.shiftKey?b:v).focus({preventScroll:!0});else if(r instanceof HTMLElement&&!r.shadowRoot&&!g.includes(r))e.preventDefault(),f(g,r,e.shiftKey)?.focus({preventScroll:!0});else{let t=m.findIndex(e=>e.some(e=>e===r)),n=m[t];if(e.shiftKey&&r===n?.[0]){e.preventDefault();let n=m[(t<=0?m.length:t)-1];(n[n.length-1]??b).focus({preventScroll:!0})}else !e.shiftKey&&r===n?.[n.length-1]&&(e.preventDefault(),(m[(t+1)%m.length][0]??v).focus({preventScroll:!0}))}};return document.addEventListener(`keydown`,N),()=>{document.removeEventListener(`keydown`,N),document.removeEventListener(`focusin`,k),document.removeEventListener(`focusout`,A),document.removeEventListener(`keydown`,j,!0),document.removeEventListener(`pointerdown`,M,!0),O.disconnect(),clearTimeout(E),clearTimeout(x),clearTimeout(b)}},[t,r,p,m])}exports.useFocusTrap=p;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export interface UseFocusTrapOptions {
|
|
2
|
+
enabled: boolean;
|
|
3
|
+
canTrap?: () => boolean;
|
|
4
|
+
trapFocus?: boolean;
|
|
5
|
+
cover?: HTMLElement | null;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* 열린 컨테이너 안에서 Tab 포커스를 순환하고 닫힐 때 이전 포커스를 복원한다.
|
|
9
|
+
* Portal처럼 노드가 늦게 연결되면 `container`에 연결된 노드를 전달한다.
|
|
10
|
+
* 열리면 첫 tabbable에 포커스한다. 이미 내부에 포커스가 있으면 유지하고, 대상이 없으면 컨테이너 자체에 포커스한다.
|
|
11
|
+
* `canTrap`은 중첩 오버레이에서 현재 트랩이 Tab을 처리할 수 있는지 판정한다.
|
|
12
|
+
* 닫힐 때 포커스가 컨테이너·부유 레이어 안이거나 body이면 열기 직전 요소로 복원하고,
|
|
13
|
+
* 소비자가 배경의 다른 요소로 옮겨 둔 포커스는 그대로 둔다. 컨테이너가 부모 dialog 안에 있고
|
|
14
|
+
* 열기 직전 요소가 그 부모 밖이면(부모와 함께 열린 서브뷰 등) 부모의 첫 tabbable로 복원한다.
|
|
15
|
+
* `trapFocus`가 false여도 초기 포커스와 이 복원 규칙은 유지한다.
|
|
16
|
+
* `cover`는 부모 dialog 시트의 일부만 덮는 서브뷰용이다. 덮는 요소를 전달하면 Tab 고리는
|
|
17
|
+
* 부모 시트에서 덮인 영역을 뺀 나머지(헤더·footer 등)와 컨테이너를 DOM 순서로 잇는다.
|
|
18
|
+
* 덮인 영역은 `cover`의 offsetParent(없으면 부모 요소)로 판정한다 — 절대 위치로 덮는 범위가
|
|
19
|
+
* 곧 그 기준 요소이기 때문이다.
|
|
20
|
+
* 부유 레이어는 `aria-controls`로 연결된 Floating UI 포털 또는 `data-focus-trap-layer`가
|
|
21
|
+
* 붙은 포털만 인정한다. 연결을 알 수 없는 포털의 Tab은 컨테이너로 돌아오므로 해당 포털에
|
|
22
|
+
* 표식을 붙이거나 `trapFocus: false`를 사용한다. 표식은 문서 전체에서 찾으므로 현재 트랩에
|
|
23
|
+
* 편입할 포털에만 붙인다. `role="dialog"` + `aria-modal="true"`인 포털(서드파티 다이얼로그 등)은
|
|
24
|
+
* 자기 트랩을 가진 별도 모달로 보고 표식이 있어도 편입하지 않는다 — 그 위에서 조작해야 하면
|
|
25
|
+
* `trapFocus: false`를 사용한다.
|
|
26
|
+
* 가드 없는 부유 레이어(Popover·표식 포털)는 트리거 바로 뒤가 아닌 컨테이너의
|
|
27
|
+
* 모든 tabbable 뒤에 붙는다. 포털 DOM 위치와 무관하게 순환을 일정하게 하기 위해 트리거에서
|
|
28
|
+
* Tab을 누르면 다음 필드로 가고, 패널은 한 바퀴의 마지막에 지난다. 열자마자 패널을 조작하려면
|
|
29
|
+
* 패널 안으로 바로 포커스를 옮기는 컴포넌트나 Select·DatePicker처럼 floating-ui 포커스 관리가 있는 패널을 쓴다.
|
|
30
|
+
* 액션 토스트가 top이면 트랩은 양보한다. 그동안에는 Tab이 컨테이너 밖으로 나갈 수 있다
|
|
31
|
+
* (`backdrop: false` 알림성 토스트 포함).
|
|
32
|
+
* Tab 이동으로 범위·편입 레이어·토스트 밖(배경, 서브뷰에 덮인 본문 등)에 떨어진 포커스는
|
|
33
|
+
* 진행 방향의 다음 고리 요소로 되돌린다 — 라디오 그룹·스크롤 컨테이너처럼 브라우저의 Tab 순서를
|
|
34
|
+
* 미리 알 수 없는 경로도 고리를 벗어나지 않게 하기 위해서다. Tab 키가 일으킨 이동(브라우저 UI로
|
|
35
|
+
* 나갔다 키보드로 돌아오는 경우 포함)에만 반응하고, 클릭·터치, 다른 키, 프로그램 `focus()`로 옮긴
|
|
36
|
+
* 포커스(Enter로 연 포털, 닫는 핸들러의 `focus()` 등)는 건드리지 않는다 — 연결·표식 없는 포털도
|
|
37
|
+
* 클릭하면 조작할 수 있다. 그 포털을 Tab으로도 오가야 하면 표식을 붙인다.
|
|
38
|
+
* 포커스가 있던 레이어나 토스트가 사라져 포커스가 body로 유실되면 연결 트리거, 컨테이너에서
|
|
39
|
+
* 마지막으로 포커스됐던 요소, 컨테이너 첫 tabbable 순으로 되돌린다. 포커스 이동 도중에는
|
|
40
|
+
* 잠시 body가 활성 요소가 되므로, 복구는 다음 태스크에서도 body일 때만 한다.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* const [sheet, setSheet] = useState<HTMLDivElement | null>(null);
|
|
44
|
+
* useFocusTrap(sheet, { enabled: open });
|
|
45
|
+
* return <div ref={setSheet} tabIndex={-1}>...</div>;
|
|
46
|
+
*/
|
|
47
|
+
export declare function useFocusTrap(container: HTMLElement | null, { enabled, canTrap, trapFocus, cover }: UseFocusTrapOptions): void;
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { useEffect as e, useRef as t } from "react";
|
|
2
|
+
//#region src/hooks/useFocusTrap.ts
|
|
3
|
+
var n = [
|
|
4
|
+
"a[href]",
|
|
5
|
+
"area[href]",
|
|
6
|
+
"button",
|
|
7
|
+
"input",
|
|
8
|
+
"select",
|
|
9
|
+
"textarea",
|
|
10
|
+
"iframe",
|
|
11
|
+
"summary",
|
|
12
|
+
"audio[controls]",
|
|
13
|
+
"video[controls]",
|
|
14
|
+
"[contenteditable]:not([contenteditable='false'])",
|
|
15
|
+
"[tabindex]"
|
|
16
|
+
].join(",");
|
|
17
|
+
function r(e, t = !1) {
|
|
18
|
+
let r = Array.from(e.querySelectorAll(n));
|
|
19
|
+
t && e.matches(n) && r.unshift(e);
|
|
20
|
+
let i = (e) => {
|
|
21
|
+
let n = t ? e.getAttribute("data-tabindex") : null;
|
|
22
|
+
return n === null ? e.tabIndex : n === "" ? 0 : Number(n);
|
|
23
|
+
}, a = (e) => {
|
|
24
|
+
if (!(e instanceof HTMLInputElement) || e.type !== "radio" || !e.name || e.checked) return !0;
|
|
25
|
+
let t = (e.form ?? document).querySelectorAll(`input[type="radio"][name="${CSS.escape(e.name)}"]`);
|
|
26
|
+
return !Array.from(t).some((t) => t.checked && t.form === e.form);
|
|
27
|
+
};
|
|
28
|
+
return r.filter((e) => {
|
|
29
|
+
let t = window.getComputedStyle(e);
|
|
30
|
+
return i(e) >= 0 && a(e) && !e.matches(":disabled") && !e.hasAttribute("data-floating-ui-focus-guard") && !e.closest("[hidden], [inert], [aria-hidden='true']") && t.visibility !== "hidden" && t.visibility !== "collapse" && e.getClientRects().length > 0;
|
|
31
|
+
}).sort((e, t) => {
|
|
32
|
+
let n = i(e) > 0 ? i(e) : Infinity, r = i(t) > 0 ? i(t) : Infinity;
|
|
33
|
+
return n === r ? 0 : n - r;
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
var i = "[data-floating-ui-portal]", a = "[data-focus-trap-layer]", o = "[data-floating-ui-focus-guard]", s = "[data-picker-panel]", c = "[role=\"dialog\"][aria-modal=\"true\"]", l = [
|
|
37
|
+
"Shift",
|
|
38
|
+
"Alt",
|
|
39
|
+
"Control",
|
|
40
|
+
"Meta"
|
|
41
|
+
];
|
|
42
|
+
function u(e, t = () => !0) {
|
|
43
|
+
let n = [], r = [e];
|
|
44
|
+
for (let e of document.querySelectorAll(a)) !e.closest(c) && !e.querySelector(c) && (n.push(e), r.push(e));
|
|
45
|
+
for (let a of r) for (let o of a.querySelectorAll("[aria-controls]")) if (!(a === e && !t(o))) for (let e of (o.getAttribute("aria-controls") ?? "").split(/\s+/)) {
|
|
46
|
+
let t = document.getElementById(e)?.closest(i);
|
|
47
|
+
t && !n.includes(t) && !t.closest(c) && !t.querySelector(c) && (n.push(t), r.push(t));
|
|
48
|
+
}
|
|
49
|
+
return n.sort((e, t) => e.compareDocumentPosition(t) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1);
|
|
50
|
+
}
|
|
51
|
+
function d(e, t, n) {
|
|
52
|
+
let a = [e, ...u(e, n)];
|
|
53
|
+
for (let o of a) for (let a of o.querySelectorAll("[aria-controls]")) if (!(o === e && !n(a)) && (a.getAttribute("aria-controls") ?? "").split(/\s+/).some((e) => document.getElementById(e)?.closest(i) === t)) return a.tabIndex >= 0 ? a : r(a)[0] ?? null;
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
function f(e) {
|
|
57
|
+
let t = e.closest(`${i}, ${a}`);
|
|
58
|
+
return !!(e.closest("[data-ui-action-toast]") || t && !e.closest(c));
|
|
59
|
+
}
|
|
60
|
+
function p(e, t, n) {
|
|
61
|
+
let r = n ? Node.DOCUMENT_POSITION_PRECEDING : Node.DOCUMENT_POSITION_FOLLOWING, i = (e) => e !== t && !!(t.compareDocumentPosition(e) & r);
|
|
62
|
+
if (!n) return e.find(i) ?? e[0];
|
|
63
|
+
for (let t = e.length - 1; t >= 0; t--) if (i(e[t])) return e[t];
|
|
64
|
+
return e[e.length - 1];
|
|
65
|
+
}
|
|
66
|
+
function m(n, { enabled: i, canTrap: a, trapFocus: m = !0, cover: h }) {
|
|
67
|
+
let g = t(null), _ = t(null), v = t(null), y = t(!1), b = t(a);
|
|
68
|
+
b.current = a, i && !y.current && typeof document < "u" && (g.current = document.activeElement instanceof HTMLElement ? document.activeElement : null), y.current = i, e(() => {
|
|
69
|
+
_.current = n, v.current = n?.parentElement?.closest(c) ?? null, !n && !i && (g.current = null);
|
|
70
|
+
}, [n, i]), e(() => {
|
|
71
|
+
if (i) return () => {
|
|
72
|
+
let e = g.current, t = document.activeElement, n = _.current;
|
|
73
|
+
if (t && t !== document.body && t.isConnected && !n?.contains(t) && !f(t)) return;
|
|
74
|
+
let i = v.current;
|
|
75
|
+
i?.isConnected && (!e?.isConnected || !i.contains(e)) ? (r(i).find((e) => !n?.contains(e)) ?? i).focus({ preventScroll: !0 }) : e?.isConnected && e.focus({ preventScroll: !0 });
|
|
76
|
+
};
|
|
77
|
+
}, [i]), e(() => {
|
|
78
|
+
if (!(!i || !n) && !n.contains(document.activeElement)) {
|
|
79
|
+
let e = r(n)[0];
|
|
80
|
+
e ? e.focus({ preventScroll: !0 }) : (n.hasAttribute("tabindex") || (n.tabIndex = -1), n.focus({ preventScroll: !0 }));
|
|
81
|
+
}
|
|
82
|
+
}, [n, i]), e(() => {
|
|
83
|
+
if (!i || !n || !m) return;
|
|
84
|
+
let e = n.parentElement?.closest(c) ?? null, t = () => {
|
|
85
|
+
if (!h || !e?.isConnected || !e.contains(h)) return null;
|
|
86
|
+
let t = h.offsetParent, n = t instanceof HTMLElement && e.contains(t) ? t : h.parentElement;
|
|
87
|
+
return n ? {
|
|
88
|
+
parent: e,
|
|
89
|
+
covered: n
|
|
90
|
+
} : null;
|
|
91
|
+
}, a = (e) => (t) => n.contains(t) || !!e && e.parent.contains(t) && !e.covered.contains(t), f = (e, t) => {
|
|
92
|
+
let i = e?.parent ?? n, a = e ? r(i).filter(t) : r(n), s = u(i, t), c = [a], l = new Set(a);
|
|
93
|
+
for (let e of s) {
|
|
94
|
+
if (e.querySelector(o)) continue;
|
|
95
|
+
let t = r(e, !0).filter((e) => l.has(e) ? !1 : (l.add(e), !0));
|
|
96
|
+
t.length && c.push(t);
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
tabbables: a,
|
|
100
|
+
layers: s,
|
|
101
|
+
groups: c,
|
|
102
|
+
ring: c.flat()
|
|
103
|
+
};
|
|
104
|
+
}, g = null, _ = !1, v = !1, y, x, S = () => n.isConnected && !(b.current && !b.current()), C = (e) => {
|
|
105
|
+
v = !0;
|
|
106
|
+
try {
|
|
107
|
+
e.focus({ preventScroll: !0 });
|
|
108
|
+
} finally {
|
|
109
|
+
v = !1;
|
|
110
|
+
}
|
|
111
|
+
}, w = document.activeElement instanceof HTMLElement && a(t())(document.activeElement) ? document.activeElement : null, T = null, E, D = (e) => !!e && e.isConnected && !e.matches(":disabled") && e.getClientRects().length > 0, O = new MutationObserver(() => {
|
|
112
|
+
if (!T || T.element.isConnected) return;
|
|
113
|
+
let e = T.restore;
|
|
114
|
+
T = null, O.disconnect(), clearTimeout(E), E = setTimeout(() => {
|
|
115
|
+
let i = document.activeElement;
|
|
116
|
+
!n.isConnected || i && i !== document.body && i.isConnected || b.current && !b.current() || ([e, w && a(t())(w) ? w : null].find(D) ?? r(n)[0] ?? n).focus({ preventScroll: !0 });
|
|
117
|
+
});
|
|
118
|
+
}), k = (e) => {
|
|
119
|
+
let r = e.target;
|
|
120
|
+
if (!(r instanceof HTMLElement) || r !== document.activeElement) return;
|
|
121
|
+
let i = t(), o = a(i);
|
|
122
|
+
if (o(r)) w = r, T = null, document.hasFocus() && (_ = !1);
|
|
123
|
+
else if (r.closest("[data-ui-action-toast]")) T = {
|
|
124
|
+
element: r,
|
|
125
|
+
restore: w
|
|
126
|
+
};
|
|
127
|
+
else {
|
|
128
|
+
let e = i?.parent ?? n, t = u(e, o).find((e) => e.contains(r));
|
|
129
|
+
if (T = t ? {
|
|
130
|
+
element: r,
|
|
131
|
+
restore: d(e, t, o)
|
|
132
|
+
} : null, !t && (g || _) && !v && S()) {
|
|
133
|
+
let e = g ? g.backward : !!(n.compareDocumentPosition(r) & Node.DOCUMENT_POSITION_FOLLOWING);
|
|
134
|
+
_ = !1;
|
|
135
|
+
let { ring: t } = f(i, o);
|
|
136
|
+
C(p(t, r, e) ?? w ?? n);
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
T ? O.observe(document.body, {
|
|
141
|
+
childList: !0,
|
|
142
|
+
subtree: !0
|
|
143
|
+
}) : O.disconnect();
|
|
144
|
+
};
|
|
145
|
+
document.addEventListener("focusin", k);
|
|
146
|
+
let A = (e) => {
|
|
147
|
+
if (!g || e.relatedTarget !== null || !(e.target instanceof Node) || !e.target.isConnected) return;
|
|
148
|
+
let r = g.backward;
|
|
149
|
+
_ = !0, clearTimeout(x), x = setTimeout(() => {
|
|
150
|
+
let e = document.activeElement;
|
|
151
|
+
if (!_ || e && e !== document.body || !S()) return;
|
|
152
|
+
let i = t(), { ring: o } = f(i, a(i));
|
|
153
|
+
C((r ? o[o.length - 1] : o[0]) ?? n);
|
|
154
|
+
});
|
|
155
|
+
};
|
|
156
|
+
document.addEventListener("focusout", A);
|
|
157
|
+
let j = (e) => {
|
|
158
|
+
l.includes(e.key) || (_ = !1, g = e.key === "Tab" && !e.ctrlKey && !e.metaKey ? { backward: e.shiftKey } : null, clearTimeout(y), g && (y = setTimeout(() => {
|
|
159
|
+
g = null;
|
|
160
|
+
})));
|
|
161
|
+
}, M = () => {
|
|
162
|
+
g = null, _ = !1;
|
|
163
|
+
};
|
|
164
|
+
document.addEventListener("keydown", j, !0), document.addEventListener("pointerdown", M, !0);
|
|
165
|
+
let N = (e) => {
|
|
166
|
+
if (e.key !== "Tab" || e.defaultPrevented || e.ctrlKey || e.metaKey || b.current && !b.current()) return;
|
|
167
|
+
let i = document.activeElement, c = t(), l = a(c), { tabbables: u, layers: m, groups: h, ring: g } = f(c, l), _ = m.find((e) => i && e.contains(i)), v = g[0], y = g[g.length - 1];
|
|
168
|
+
if (_?.querySelector(o)) {
|
|
169
|
+
let t = c?.parent ?? n, a = r(_, !0), u = (i instanceof Element ? i.closest(s) : null)?.nextElementSibling;
|
|
170
|
+
!e.shiftKey && v && u instanceof HTMLElement && u.matches(o) && i === a[a.length - 1] && d(t, _, l) === y && (e.preventDefault(), u.focus({ preventScroll: !0 }), v.focus({ preventScroll: !0 }));
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
if (v && y && (!e.shiftKey && i === y || e.shiftKey && i === v)) {
|
|
174
|
+
let t = c?.parent ?? n, r = m.find((e) => e.querySelector(o) && d(t, e, l) === y), i = r?.id ? t.querySelector(`[aria-owns="${CSS.escape(r.id)}"]`) : null, a = e.shiftKey ? i?.nextElementSibling : i?.previousElementSibling;
|
|
175
|
+
if (a instanceof HTMLElement && a.matches(o)) {
|
|
176
|
+
e.preventDefault(), a.focus({ preventScroll: !0 });
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
if (c && i instanceof HTMLElement) {
|
|
181
|
+
let t = e.shiftKey ? -1 : 1, n = r(c.parent), a = n[n.indexOf(i) + t], o = u.indexOf(i), s = o >= 0 ? u[o + t] : void 0;
|
|
182
|
+
if (s && a && !l(a)) {
|
|
183
|
+
e.preventDefault(), s.focus({ preventScroll: !0 });
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
if (!v || !y) e.preventDefault(), n.focus({ preventScroll: !0 });
|
|
188
|
+
else if (!(i && l(i)) && !_) e.preventDefault(), (e.shiftKey ? y : v).focus({ preventScroll: !0 });
|
|
189
|
+
else if (i instanceof HTMLElement && !i.shadowRoot && !g.includes(i)) e.preventDefault(), p(g, i, e.shiftKey)?.focus({ preventScroll: !0 });
|
|
190
|
+
else {
|
|
191
|
+
let t = h.findIndex((e) => e.some((e) => e === i)), n = h[t];
|
|
192
|
+
if (e.shiftKey && i === n?.[0]) {
|
|
193
|
+
e.preventDefault();
|
|
194
|
+
let n = h[(t <= 0 ? h.length : t) - 1];
|
|
195
|
+
(n[n.length - 1] ?? y).focus({ preventScroll: !0 });
|
|
196
|
+
} else !e.shiftKey && i === n?.[n.length - 1] && (e.preventDefault(), (h[(t + 1) % h.length][0] ?? v).focus({ preventScroll: !0 }));
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
return document.addEventListener("keydown", N), () => {
|
|
200
|
+
document.removeEventListener("keydown", N), document.removeEventListener("focusin", k), document.removeEventListener("focusout", A), document.removeEventListener("keydown", j, !0), document.removeEventListener("pointerdown", M, !0), O.disconnect(), clearTimeout(E), clearTimeout(x), clearTimeout(y);
|
|
201
|
+
};
|
|
202
|
+
}, [
|
|
203
|
+
n,
|
|
204
|
+
i,
|
|
205
|
+
m,
|
|
206
|
+
h
|
|
207
|
+
]);
|
|
208
|
+
}
|
|
209
|
+
//#endregion
|
|
210
|
+
export { m as useFocusTrap };
|