@skbkontur/react-ui 6.1.4-4e59f.0 → 6.1.4-d7626.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/components/FxInput/FxInput.d.ts +1 -1
- package/components/FxInput/FxInput.js.map +1 -1
- package/components/Group/Group.js +2 -3
- package/components/Group/Group.js.map +1 -1
- package/components/Input/Input.d.ts +1 -1
- package/components/Input/Input.js.map +1 -1
- package/components/MaskedInput/MaskedInput.d.ts +3 -2
- package/components/MaskedInput/MaskedInput.js +10 -126
- package/components/MaskedInput/MaskedInput.js.map +1 -1
- package/components/MaskedInput/MaskedInputLegacy.d.ts +3 -0
- package/components/MaskedInput/MaskedInputLegacy.js +142 -0
- package/components/MaskedInput/MaskedInputLegacy.js.map +1 -0
- package/components/MaskedInputV2/MaskedInputV2.d.ts +58 -0
- package/components/MaskedInputV2/MaskedInputV2.helpers.d.ts +9 -0
- package/components/MaskedInputV2/MaskedInputV2.helpers.js +17 -0
- package/components/MaskedInputV2/MaskedInputV2.helpers.js.map +1 -0
- package/components/MaskedInputV2/MaskedInputV2.js +286 -0
- package/components/MaskedInputV2/MaskedInputV2.js.map +1 -0
- package/{internal/TimeInput/TimeInput.styles.d.ts → components/MaskedInputV2/MaskedInputV2.styles.d.ts} +4 -3
- package/components/MaskedInputV2/MaskedInputV2.styles.js +19 -0
- package/components/MaskedInputV2/MaskedInputV2.styles.js.map +1 -0
- package/components/MaskedInputV2/index.d.ts +1 -0
- package/components/MaskedInputV2/index.js +2 -0
- package/components/MaskedInputV2/index.js.map +1 -0
- package/components/MaskedInputV2/internal/MaskOverlay.d.ts +19 -0
- package/components/MaskedInputV2/internal/MaskOverlay.js +54 -0
- package/components/MaskedInputV2/internal/MaskOverlay.js.map +1 -0
- package/components/MaskedInputV2/internal/MaskedCore.d.ts +8 -0
- package/components/MaskedInputV2/internal/MaskedCore.js +126 -0
- package/components/MaskedInputV2/internal/MaskedCore.js.map +1 -0
- package/components/MaskedInputV2/internal/MaskedCore.types.d.ts +32 -0
- package/components/MaskedInputV2/internal/MaskedCore.types.js +2 -0
- package/components/MaskedInputV2/internal/MaskedCore.types.js.map +1 -0
- package/components/MaskedInputV2/internal/MaskedInternal.styles.d.ts +15 -0
- package/components/MaskedInputV2/internal/MaskedInternal.styles.js +34 -0
- package/components/MaskedInputV2/internal/MaskedInternal.styles.js.map +1 -0
- package/components/MaskedInputV2/internal/buildSlotMap.d.ts +11 -0
- package/components/MaskedInputV2/internal/buildSlotMap.js +37 -0
- package/components/MaskedInputV2/internal/buildSlotMap.js.map +1 -0
- package/components/MaskedInputV2/internal/computeMaskAlignPadding.d.ts +6 -0
- package/components/MaskedInputV2/internal/computeMaskAlignPadding.js +47 -0
- package/components/MaskedInputV2/internal/computeMaskAlignPadding.js.map +1 -0
- package/components/MaskedInputV2/internal/computePasteMaskedCursor.d.ts +3 -0
- package/components/MaskedInputV2/internal/computePasteMaskedCursor.js +11 -0
- package/components/MaskedInputV2/internal/computePasteMaskedCursor.js.map +1 -0
- package/components/MaskedInputV2/internal/extractRaw.d.ts +10 -0
- package/components/MaskedInputV2/internal/extractRaw.js +16 -0
- package/components/MaskedInputV2/internal/extractRaw.js.map +1 -0
- package/components/MaskedInputV2/internal/findNearestRawLeft.d.ts +10 -0
- package/components/MaskedInputV2/internal/findNearestRawLeft.js +18 -0
- package/components/MaskedInputV2/internal/findNearestRawLeft.js.map +1 -0
- package/components/MaskedInputV2/internal/helpers.d.ts +8 -0
- package/components/MaskedInputV2/internal/helpers.js +9 -0
- package/components/MaskedInputV2/internal/helpers.js.map +1 -0
- package/components/MaskedInputV2/internal/maskedCoreClipboard.d.ts +25 -0
- package/components/MaskedInputV2/internal/maskedCoreClipboard.js +30 -0
- package/components/MaskedInputV2/internal/maskedCoreClipboard.js.map +1 -0
- package/components/MaskedInputV2/internal/maskedCoreDeletion.d.ts +28 -0
- package/components/MaskedInputV2/internal/maskedCoreDeletion.js +70 -0
- package/components/MaskedInputV2/internal/maskedCoreDeletion.js.map +1 -0
- package/components/MaskedInputV2/internal/maskedCoreInputChange.d.ts +35 -0
- package/components/MaskedInputV2/internal/maskedCoreInputChange.js +31 -0
- package/components/MaskedInputV2/internal/maskedCoreInputChange.js.map +1 -0
- package/components/MaskedInputV2/internal/maskedCoreNavigation.d.ts +13 -0
- package/components/MaskedInputV2/internal/maskedCoreNavigation.js +79 -0
- package/components/MaskedInputV2/internal/maskedCoreNavigation.js.map +1 -0
- package/components/MaskedInputV2/internal/measureInputTextWidth.d.ts +2 -0
- package/components/MaskedInputV2/internal/measureInputTextWidth.js +30 -0
- package/components/MaskedInputV2/internal/measureInputTextWidth.js.map +1 -0
- package/components/MaskedInputV2/internal/setMaskInputSelectionRange.d.ts +2 -0
- package/components/MaskedInputV2/internal/setMaskInputSelectionRange.js +25 -0
- package/components/MaskedInputV2/internal/setMaskInputSelectionRange.js.map +1 -0
- package/components/MaskedInputV2/internal/showOverlay.d.ts +3 -0
- package/components/MaskedInputV2/internal/showOverlay.js +16 -0
- package/components/MaskedInputV2/internal/showOverlay.js.map +1 -0
- package/components/MaskedInputV2/internal/stripMaskChars.d.ts +11 -0
- package/components/MaskedInputV2/internal/stripMaskChars.js +20 -0
- package/components/MaskedInputV2/internal/stripMaskChars.js.map +1 -0
- package/components/MaskedInputV2/internal/types.d.ts +74 -0
- package/components/MaskedInputV2/internal/types.js.map +1 -0
- package/components/MaskedInputV2/internal/useInputOverflow.d.ts +4 -0
- package/components/MaskedInputV2/internal/useInputOverflow.js +34 -0
- package/components/MaskedInputV2/internal/useInputOverflow.js.map +1 -0
- package/components/MaskedInputV2/internal/useMaskAlignPadding.d.ts +2 -0
- package/components/MaskedInputV2/internal/useMaskAlignPadding.js +33 -0
- package/components/MaskedInputV2/internal/useMaskAlignPadding.js.map +1 -0
- package/components/MaskedInputV2/internal/useMaskEngine.d.ts +42 -0
- package/components/MaskedInputV2/internal/useMaskEngine.js +82 -0
- package/components/MaskedInputV2/internal/useMaskEngine.js.map +1 -0
- package/components/MaskedInputV2/internal/useMaskedCoreHandlers.d.ts +33 -0
- package/components/MaskedInputV2/internal/useMaskedCoreHandlers.js +244 -0
- package/components/MaskedInputV2/internal/useMaskedCoreHandlers.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/controls/html-input-mask-element.d.ts +16 -0
- package/components/MaskedInputV2/react-imask/imask/controls/html-input-mask-element.js +59 -0
- package/components/MaskedInputV2/react-imask/imask/controls/html-input-mask-element.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/controls/html-mask-element.d.ts +20 -0
- package/components/MaskedInputV2/react-imask/imask/controls/html-mask-element.js +106 -0
- package/components/MaskedInputV2/react-imask/imask/controls/html-mask-element.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/controls/input-history.d.ts +17 -0
- package/components/MaskedInputV2/react-imask/imask/controls/input-history.js +49 -0
- package/components/MaskedInputV2/react-imask/imask/controls/input-history.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/controls/input.d.ts +95 -0
- package/components/MaskedInputV2/react-imask/imask/controls/input.js +420 -0
- package/components/MaskedInputV2/react-imask/imask/controls/input.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/controls/mask-element.d.ts +30 -0
- package/components/MaskedInputV2/react-imask/imask/controls/mask-element.js +59 -0
- package/components/MaskedInputV2/react-imask/imask/controls/mask-element.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/core/action-details.d.ts +30 -0
- package/components/MaskedInputV2/react-imask/imask/core/action-details.js +100 -0
- package/components/MaskedInputV2/react-imask/imask/core/action-details.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/core/change-details.d.ts +20 -0
- package/components/MaskedInputV2/react-imask/imask/core/change-details.js +46 -0
- package/components/MaskedInputV2/react-imask/imask/core/change-details.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/core/continuous-tail-details.d.ts +21 -0
- package/components/MaskedInputV2/react-imask/imask/core/continuous-tail-details.js +52 -0
- package/components/MaskedInputV2/react-imask/imask/core/continuous-tail-details.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/core/holder.d.ts +34 -0
- package/components/MaskedInputV2/react-imask/imask/core/holder.js +38 -0
- package/components/MaskedInputV2/react-imask/imask/core/holder.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/core/tail-details.d.ts +20 -0
- package/components/MaskedInputV2/react-imask/imask/core/tail-details.js +2 -0
- package/components/MaskedInputV2/react-imask/imask/core/tail-details.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/core/utils.d.ts +24 -0
- package/components/MaskedInputV2/react-imask/imask/core/utils.js +100 -0
- package/components/MaskedInputV2/react-imask/imask/core/utils.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/imask.d.ts +5 -0
- package/components/MaskedInputV2/react-imask/imask/imask.js +7 -0
- package/components/MaskedInputV2/react-imask/imask/imask.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/index.d.ts +17 -0
- package/components/MaskedInputV2/react-imask/imask/index.js +16 -0
- package/components/MaskedInputV2/react-imask/imask/index.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/masked/base.d.ts +114 -0
- package/components/MaskedInputV2/react-imask/imask/masked/base.js +411 -0
- package/components/MaskedInputV2/react-imask/imask/masked/base.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/masked/factory.d.ts +62 -0
- package/components/MaskedInputV2/react-imask/imask/masked/factory.js +96 -0
- package/components/MaskedInputV2/react-imask/imask/masked/factory.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/masked/pattern.d.ts +101 -0
- package/components/MaskedInputV2/react-imask/imask/masked/pattern.js +543 -0
- package/components/MaskedInputV2/react-imask/imask/masked/pattern.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/masked/patterns/block.d.ts +30 -0
- package/components/MaskedInputV2/react-imask/imask/masked/patterns/block.js +2 -0
- package/components/MaskedInputV2/react-imask/imask/masked/patterns/block.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/masked/patterns/chunk-tail-details.d.ts +21 -0
- package/components/MaskedInputV2/react-imask/imask/masked/patterns/chunk-tail-details.js +180 -0
- package/components/MaskedInputV2/react-imask/imask/masked/patterns/chunk-tail-details.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/masked/patterns/cursor.d.ts +31 -0
- package/components/MaskedInputV2/react-imask/imask/masked/patterns/cursor.js +163 -0
- package/components/MaskedInputV2/react-imask/imask/masked/patterns/cursor.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/masked/patterns/fixed-definition.d.ts +42 -0
- package/components/MaskedInputV2/react-imask/imask/masked/patterns/fixed-definition.js +158 -0
- package/components/MaskedInputV2/react-imask/imask/masked/patterns/fixed-definition.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/masked/patterns/input-definition.d.ts +56 -0
- package/components/MaskedInputV2/react-imask/imask/masked/patterns/input-definition.js +185 -0
- package/components/MaskedInputV2/react-imask/imask/masked/patterns/input-definition.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/masked/regexp.d.ts +17 -0
- package/components/MaskedInputV2/react-imask/imask/masked/regexp.js +36 -0
- package/components/MaskedInputV2/react-imask/imask/masked/regexp.js.map +1 -0
- package/components/MaskedInputV2/react-imask/index.d.ts +3 -0
- package/components/MaskedInputV2/react-imask/index.js +4 -0
- package/components/MaskedInputV2/react-imask/index.js.map +1 -0
- package/components/MaskedInputV2/react-imask/input.d.ts +8 -0
- package/components/MaskedInputV2/react-imask/input.js +35 -0
- package/components/MaskedInputV2/react-imask/input.js.map +1 -0
- package/components/MaskedInputV2/react-imask/mixin.d.ts +31 -0
- package/components/MaskedInputV2/react-imask/mixin.js +246 -0
- package/components/MaskedInputV2/react-imask/mixin.js.map +1 -0
- package/components/TokenInput/TokenInput.d.ts +7 -3
- package/components/TokenInput/TokenInput.js +0 -1
- package/components/TokenInput/TokenInput.js.map +1 -1
- package/index.d.ts +0 -1
- package/index.js +0 -1
- package/index.js.map +1 -1
- package/internal/themes/BasicTheme.d.ts +0 -34
- package/internal/themes/BasicTheme.js +0 -96
- package/internal/themes/BasicTheme.js.map +1 -1
- package/lib/events/keyboard/KeyboardEventCodes.d.ts +2 -0
- package/lib/events/keyboard/KeyboardEventCodes.js +2 -0
- package/lib/events/keyboard/KeyboardEventCodes.js.map +1 -1
- package/lib/events/keyboard/KeyboardMapKeys.js +2 -0
- package/lib/events/keyboard/KeyboardMapKeys.js.map +1 -1
- package/lib/events/keyboard/identifiers.d.ts +2 -0
- package/lib/events/keyboard/identifiers.js +6 -0
- package/lib/events/keyboard/identifiers.js.map +1 -1
- package/lib/featureFlagsContext/ReactUIFeatureFlagsContext.d.ts +2 -0
- package/lib/featureFlagsContext/ReactUIFeatureFlagsContext.js +1 -0
- package/lib/featureFlagsContext/ReactUIFeatureFlagsContext.js.map +1 -1
- package/lib/locale/types.d.ts +0 -2
- package/lib/locale/types.js.map +1 -1
- package/lib/utils.d.ts +0 -2
- package/lib/utils.js +0 -1
- package/lib/utils.js.map +1 -1
- package/package.json +4 -9
- package/components/TimePicker/TimeClockIcon.d.ts +0 -3
- package/components/TimePicker/TimeClockIcon.js +0 -11
- package/components/TimePicker/TimeClockIcon.js.map +0 -1
- package/components/TimePicker/TimePicker.d.ts +0 -79
- package/components/TimePicker/TimePicker.js +0 -513
- package/components/TimePicker/TimePicker.js.map +0 -1
- package/components/TimePicker/TimePicker.styles.d.ts +0 -11
- package/components/TimePicker/TimePicker.styles.js +0 -36
- package/components/TimePicker/TimePicker.styles.js.map +0 -1
- package/components/TimePicker/TimePickerItems.d.ts +0 -17
- package/components/TimePicker/TimePickerItems.js +0 -80
- package/components/TimePicker/TimePickerItems.js.map +0 -1
- package/components/TimePicker/TimePickerMobilePopup.d.ts +0 -38
- package/components/TimePicker/TimePickerMobilePopup.js +0 -21
- package/components/TimePicker/TimePickerMobilePopup.js.map +0 -1
- package/components/TimePicker/TimePickerPopup.d.ts +0 -20
- package/components/TimePicker/TimePickerPopup.js +0 -18
- package/components/TimePicker/TimePickerPopup.js.map +0 -1
- package/components/TimePicker/helpers/TimePicker.constants.d.ts +0 -22
- package/components/TimePicker/helpers/TimePicker.constants.js +0 -31
- package/components/TimePicker/helpers/TimePicker.constants.js.map +0 -1
- package/components/TimePicker/helpers/TimePicker.editing.d.ts +0 -23
- package/components/TimePicker/helpers/TimePicker.editing.js +0 -101
- package/components/TimePicker/helpers/TimePicker.editing.js.map +0 -1
- package/components/TimePicker/helpers/TimePicker.layout.d.ts +0 -6
- package/components/TimePicker/helpers/TimePicker.layout.js +0 -49
- package/components/TimePicker/helpers/TimePicker.layout.js.map +0 -1
- package/components/TimePicker/helpers/TimePicker.selection.d.ts +0 -5
- package/components/TimePicker/helpers/TimePicker.selection.js +0 -23
- package/components/TimePicker/helpers/TimePicker.selection.js.map +0 -1
- package/components/TimePicker/helpers/TimePicker.shared.d.ts +0 -47
- package/components/TimePicker/helpers/TimePicker.shared.js +0 -70
- package/components/TimePicker/helpers/TimePicker.shared.js.map +0 -1
- package/components/TimePicker/helpers/TimePicker.value.d.ts +0 -30
- package/components/TimePicker/helpers/TimePicker.value.js +0 -96
- package/components/TimePicker/helpers/TimePicker.value.js.map +0 -1
- package/components/TimePicker/helpers/scrollSelectedItemIntoView.d.ts +0 -4
- package/components/TimePicker/helpers/scrollSelectedItemIntoView.js +0 -24
- package/components/TimePicker/helpers/scrollSelectedItemIntoView.js.map +0 -1
- package/components/TimePicker/helpers/validateTimePicker.d.ts +0 -8
- package/components/TimePicker/helpers/validateTimePicker.js +0 -16
- package/components/TimePicker/helpers/validateTimePicker.js.map +0 -1
- package/components/TimePicker/hooks/useTimePickerDropdown.d.ts +0 -17
- package/components/TimePicker/hooks/useTimePickerDropdown.js +0 -62
- package/components/TimePicker/hooks/useTimePickerDropdown.js.map +0 -1
- package/components/TimePicker/hooks/useTimePickerSelection.d.ts +0 -18
- package/components/TimePicker/hooks/useTimePickerSelection.js +0 -66
- package/components/TimePicker/hooks/useTimePickerSelection.js.map +0 -1
- package/components/TimePicker/hooks/useTimePickerValue.d.ts +0 -18
- package/components/TimePicker/hooks/useTimePickerValue.js +0 -59
- package/components/TimePicker/hooks/useTimePickerValue.js.map +0 -1
- package/components/TimePicker/index.d.ts +0 -2
- package/components/TimePicker/index.js +0 -2
- package/components/TimePicker/index.js.map +0 -1
- package/components/TimePicker/locale/index.d.ts +0 -4
- package/components/TimePicker/locale/index.js +0 -9
- package/components/TimePicker/locale/index.js.map +0 -1
- package/components/TimePicker/locale/locales/en.d.ts +0 -2
- package/components/TimePicker/locale/locales/en.js +0 -5
- package/components/TimePicker/locale/locales/en.js.map +0 -1
- package/components/TimePicker/locale/locales/ru.d.ts +0 -2
- package/components/TimePicker/locale/locales/ru.js +0 -5
- package/components/TimePicker/locale/locales/ru.js.map +0 -1
- package/components/TimePicker/locale/types.d.ts +0 -4
- package/components/TimePicker/locale/types.js.map +0 -1
- package/internal/NativeTimeInput/NativeTimeInput.d.ts +0 -16
- package/internal/NativeTimeInput/NativeTimeInput.js +0 -25
- package/internal/NativeTimeInput/NativeTimeInput.js.map +0 -1
- package/internal/NativeTimeInput/NativeTimeInput.styles.d.ts +0 -3
- package/internal/NativeTimeInput/NativeTimeInput.styles.js +0 -15
- package/internal/NativeTimeInput/NativeTimeInput.styles.js.map +0 -1
- package/internal/NativeTimeInput/NativeTimeInput.utils.d.ts +0 -7
- package/internal/NativeTimeInput/NativeTimeInput.utils.js +0 -28
- package/internal/NativeTimeInput/NativeTimeInput.utils.js.map +0 -1
- package/internal/NativeTimeInput/index.d.ts +0 -1
- package/internal/NativeTimeInput/index.js +0 -2
- package/internal/NativeTimeInput/index.js.map +0 -1
- package/internal/TimeInput/TimeFragments.d.ts +0 -15
- package/internal/TimeInput/TimeFragments.js +0 -72
- package/internal/TimeInput/TimeFragments.js.map +0 -1
- package/internal/TimeInput/TimeFragments.styles.d.ts +0 -12
- package/internal/TimeInput/TimeFragments.styles.js +0 -43
- package/internal/TimeInput/TimeFragments.styles.js.map +0 -1
- package/internal/TimeInput/TimeInput.d.ts +0 -22
- package/internal/TimeInput/TimeInput.js +0 -103
- package/internal/TimeInput/TimeInput.js.map +0 -1
- package/internal/TimeInput/TimeInput.styles.js +0 -21
- package/internal/TimeInput/TimeInput.styles.js.map +0 -1
- package/internal/TimeInput/index.d.ts +0 -1
- package/internal/TimeInput/index.js +0 -2
- package/internal/TimeInput/index.js.map +0 -1
- package/internal/icons2022/TimeClockIcon/TimeClockIcon16Light.d.ts +0 -2
- package/internal/icons2022/TimeClockIcon/TimeClockIcon16Light.js +0 -20
- package/internal/icons2022/TimeClockIcon/TimeClockIcon16Light.js.map +0 -1
- package/internal/icons2022/TimeClockIcon/TimeClockIcon20Light.d.ts +0 -2
- package/internal/icons2022/TimeClockIcon/TimeClockIcon20Light.js +0 -20
- package/internal/icons2022/TimeClockIcon/TimeClockIcon20Light.js.map +0 -1
- package/internal/icons2022/TimeClockIcon/TimeClockIcon24Regular.d.ts +0 -2
- package/internal/icons2022/TimeClockIcon/TimeClockIcon24Regular.js +0 -20
- package/internal/icons2022/TimeClockIcon/TimeClockIcon24Regular.js.map +0 -1
- /package/components/{TimePicker/locale → MaskedInputV2/internal}/types.js +0 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { SlotMap } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Для позиции курсора на фиксированном символе маски ищет позицию вставки
|
|
4
|
+
* после ближайшего пользовательского слота слева.
|
|
5
|
+
*
|
|
6
|
+
* @param maskedPos — позиция курсора в displayValue.
|
|
7
|
+
* @param slotMap — карта соответствия позиций маски и raw-слотов.
|
|
8
|
+
* @returns индекс в raw для вставки; `0`, если слева нет пользовательских слотов.
|
|
9
|
+
*/
|
|
10
|
+
export declare function findNearestRawLeft(maskedPos: number, slotMap: SlotMap): number;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Для позиции курсора на фиксированном символе маски ищет позицию вставки
|
|
3
|
+
* после ближайшего пользовательского слота слева.
|
|
4
|
+
*
|
|
5
|
+
* @param maskedPos — позиция курсора в displayValue.
|
|
6
|
+
* @param slotMap — карта соответствия позиций маски и raw-слотов.
|
|
7
|
+
* @returns индекс в raw для вставки; `0`, если слева нет пользовательских слотов.
|
|
8
|
+
*/
|
|
9
|
+
export function findNearestRawLeft(maskedPos, slotMap) {
|
|
10
|
+
for (var i = maskedPos - 1; i >= 0; i--) {
|
|
11
|
+
var raw = slotMap.maskedToRaw[i];
|
|
12
|
+
if (raw !== null && raw !== undefined) {
|
|
13
|
+
return raw + 1;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return 0;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=findNearestRawLeft.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findNearestRawLeft.js","sourceRoot":"","sources":["findNearestRawLeft.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAiB,EAAE,OAAgB;IACpE,KAAK,IAAI,CAAC,GAAG,SAAS,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,IAAM,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtC,OAAO,GAAG,GAAG,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC","sourcesContent":["import type { SlotMap } from './types.js';\n\n/**\n * Для позиции курсора на фиксированном символе маски ищет позицию вставки\n * после ближайшего пользовательского слота слева.\n *\n * @param maskedPos — позиция курсора в displayValue.\n * @param slotMap — карта соответствия позиций маски и raw-слотов.\n * @returns индекс в raw для вставки; `0`, если слева нет пользовательских слотов.\n */\nexport function findNearestRawLeft(maskedPos: number, slotMap: SlotMap): number {\n for (let i = maskedPos - 1; i >= 0; i--) {\n const raw = slotMap.maskedToRaw[i];\n if (raw !== null && raw !== undefined) {\n return raw + 1;\n }\n }\n return 0;\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Re-export утилит работы с маской из отдельных модулей. */
|
|
2
|
+
export { buildSlotMap } from './buildSlotMap.js';
|
|
3
|
+
export { computeMaskAlignPadding, needsMaskAlignPadding } from './computeMaskAlignPadding.js';
|
|
4
|
+
export { computePasteMaskedCursor } from './computePasteMaskedCursor.js';
|
|
5
|
+
export { extractRaw } from './extractRaw.js';
|
|
6
|
+
export { findNearestRawLeft } from './findNearestRawLeft.js';
|
|
7
|
+
export { getShowOverlay } from './showOverlay.js';
|
|
8
|
+
export { stripMaskChars } from './stripMaskChars.js';
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Re-export утилит работы с маской из отдельных модулей. */
|
|
2
|
+
export { buildSlotMap } from './buildSlotMap.js';
|
|
3
|
+
export { computeMaskAlignPadding, needsMaskAlignPadding } from './computeMaskAlignPadding.js';
|
|
4
|
+
export { computePasteMaskedCursor } from './computePasteMaskedCursor.js';
|
|
5
|
+
export { extractRaw } from './extractRaw.js';
|
|
6
|
+
export { findNearestRawLeft } from './findNearestRawLeft.js';
|
|
7
|
+
export { getShowOverlay } from './showOverlay.js';
|
|
8
|
+
export { stripMaskChars } from './stripMaskChars.js';
|
|
9
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["helpers.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAC9F,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC","sourcesContent":["/** Re-export утилит работы с маской из отдельных модулей. */\nexport { buildSlotMap } from './buildSlotMap.js';\nexport { computeMaskAlignPadding, needsMaskAlignPadding } from './computeMaskAlignPadding.js';\nexport { computePasteMaskedCursor } from './computePasteMaskedCursor.js';\nexport { extractRaw } from './extractRaw.js';\nexport { findNearestRawLeft } from './findNearestRawLeft.js';\nexport { getShowOverlay } from './showOverlay.js';\nexport { stripMaskChars } from './stripMaskChars.js';\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { SlotMap } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Возвращает текст для буфера обмена при copy/cut.
|
|
4
|
+
* В отличие от raw, включает литералы маски из displayValue.
|
|
5
|
+
*
|
|
6
|
+
* @param displayValue — полное отображаемое значение маски.
|
|
7
|
+
* @param start — начало выделения в displayValue.
|
|
8
|
+
* @param end — конец выделения в displayValue.
|
|
9
|
+
*/
|
|
10
|
+
export declare function getMaskedCopyText(displayValue: string, start: number, end: number): string;
|
|
11
|
+
/** Результат cut: новое raw и позиция курсора. */
|
|
12
|
+
export interface MaskedCutResult {
|
|
13
|
+
newRaw: string;
|
|
14
|
+
cursorPos: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Удаляет из raw пользовательские символы, попавшие в выделение displayValue.
|
|
18
|
+
*
|
|
19
|
+
* @param start — начало выделения в displayValue.
|
|
20
|
+
* @param end — конец выделения в displayValue.
|
|
21
|
+
* @param currentRaw — текущее raw-значение.
|
|
22
|
+
* @param slotMap — карта слотов маски.
|
|
23
|
+
* @returns новое raw и позицию курсора после cut.
|
|
24
|
+
*/
|
|
25
|
+
export declare function computeMaskedCut(start: number, end: number, currentRaw: string, slotMap: SlotMap): MaskedCutResult;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Возвращает текст для буфера обмена при copy/cut.
|
|
3
|
+
* В отличие от raw, включает литералы маски из displayValue.
|
|
4
|
+
*
|
|
5
|
+
* @param displayValue — полное отображаемое значение маски.
|
|
6
|
+
* @param start — начало выделения в displayValue.
|
|
7
|
+
* @param end — конец выделения в displayValue.
|
|
8
|
+
*/
|
|
9
|
+
export function getMaskedCopyText(displayValue, start, end) {
|
|
10
|
+
return displayValue.slice(start, end);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Удаляет из raw пользовательские символы, попавшие в выделение displayValue.
|
|
14
|
+
*
|
|
15
|
+
* @param start — начало выделения в displayValue.
|
|
16
|
+
* @param end — конец выделения в displayValue.
|
|
17
|
+
* @param currentRaw — текущее raw-значение.
|
|
18
|
+
* @param slotMap — карта слотов маски.
|
|
19
|
+
* @returns новое raw и позицию курсора после cut.
|
|
20
|
+
*/
|
|
21
|
+
export function computeMaskedCut(start, end, currentRaw, slotMap) {
|
|
22
|
+
var _a, _b;
|
|
23
|
+
var rawStart = (_a = slotMap.maskedToRaw[start]) !== null && _a !== void 0 ? _a : 0;
|
|
24
|
+
var rawEndEntry = slotMap.maskedToRaw[end - 1];
|
|
25
|
+
var rawEnd = rawEndEntry !== null && rawEndEntry !== undefined ? rawEndEntry + 1 : rawStart;
|
|
26
|
+
var newRaw = currentRaw.slice(0, rawStart) + currentRaw.slice(rawEnd);
|
|
27
|
+
var cursorPos = (_b = slotMap.rawToMasked[rawStart]) !== null && _b !== void 0 ? _b : 0;
|
|
28
|
+
return { newRaw: newRaw, cursorPos: cursorPos };
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=maskedCoreClipboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maskedCoreClipboard.js","sourceRoot":"","sources":["maskedCoreClipboard.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,YAAoB,EAAE,KAAa,EAAE,GAAW;IAChF,OAAO,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACxC,CAAC;AAQD;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,GAAW,EAAE,UAAkB,EAAE,OAAgB;;IAC/F,IAAM,QAAQ,GAAG,MAAA,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,mCAAI,CAAC,CAAC;IACjD,IAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IACjD,IAAM,MAAM,GAAG,WAAW,KAAK,IAAI,IAAI,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC9F,IAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACxE,IAAM,SAAS,GAAG,MAAA,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,mCAAI,CAAC,CAAC;IAErD,OAAO,EAAE,MAAM,QAAA,EAAE,SAAS,WAAA,EAAE,CAAC;AAC/B,CAAC","sourcesContent":["import type { SlotMap } from './types.js';\n\n/**\n * Возвращает текст для буфера обмена при copy/cut.\n * В отличие от raw, включает литералы маски из displayValue.\n *\n * @param displayValue — полное отображаемое значение маски.\n * @param start — начало выделения в displayValue.\n * @param end — конец выделения в displayValue.\n */\nexport function getMaskedCopyText(displayValue: string, start: number, end: number): string {\n return displayValue.slice(start, end);\n}\n\n/** Результат cut: новое raw и позиция курсора. */\nexport interface MaskedCutResult {\n newRaw: string;\n cursorPos: number;\n}\n\n/**\n * Удаляет из raw пользовательские символы, попавшие в выделение displayValue.\n *\n * @param start — начало выделения в displayValue.\n * @param end — конец выделения в displayValue.\n * @param currentRaw — текущее raw-значение.\n * @param slotMap — карта слотов маски.\n * @returns новое raw и позицию курсора после cut.\n */\nexport function computeMaskedCut(start: number, end: number, currentRaw: string, slotMap: SlotMap): MaskedCutResult {\n const rawStart = slotMap.maskedToRaw[start] ?? 0;\n const rawEndEntry = slotMap.maskedToRaw[end - 1];\n const rawEnd = rawEndEntry !== null && rawEndEntry !== undefined ? rawEndEntry + 1 : rawStart;\n const newRaw = currentRaw.slice(0, rawStart) + currentRaw.slice(rawEnd);\n const cursorPos = slotMap.rawToMasked[rawStart] ?? 0;\n\n return { newRaw, cursorPos };\n}\n"]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { SlotMap } from './types.js';
|
|
2
|
+
/** Параметры удаления через Backspace/Delete. */
|
|
3
|
+
export interface MaskedDeletionParams {
|
|
4
|
+
/** `true` для Backspace, `false` для Delete. */
|
|
5
|
+
isBackspace: boolean;
|
|
6
|
+
/** Начало выделения в displayValue. */
|
|
7
|
+
selStart: number;
|
|
8
|
+
/** Конец выделения в displayValue. */
|
|
9
|
+
selEnd: number;
|
|
10
|
+
/** Текущее raw-значение. */
|
|
11
|
+
currentRaw: string;
|
|
12
|
+
/** Карта слотов маски. */
|
|
13
|
+
slotMap: SlotMap;
|
|
14
|
+
}
|
|
15
|
+
/** Успешный результат удаления символов маски. */
|
|
16
|
+
export interface MaskedDeletionResult {
|
|
17
|
+
/** Raw после удаления. */
|
|
18
|
+
newRaw: string;
|
|
19
|
+
/** Позиция курсора в displayValue после удаления. */
|
|
20
|
+
cursorPos: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Вычисляет raw и позицию курсора после Backspace/Delete с учётом фиксированных символов маски.
|
|
24
|
+
*
|
|
25
|
+
* @param params — текущее выделение и состояние маски.
|
|
26
|
+
* @returns новое raw и cursorPos или `null`, если удалять нечего.
|
|
27
|
+
*/
|
|
28
|
+
export declare function computeMaskedDeletion(params: MaskedDeletionParams): MaskedDeletionResult | null;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Вычисляет raw и позицию курсора после Backspace/Delete с учётом фиксированных символов маски.
|
|
3
|
+
*
|
|
4
|
+
* @param params — текущее выделение и состояние маски.
|
|
5
|
+
* @returns новое raw и cursorPos или `null`, если удалять нечего.
|
|
6
|
+
*/
|
|
7
|
+
export function computeMaskedDeletion(params) {
|
|
8
|
+
var _a, _b, _c;
|
|
9
|
+
var isBackspace = params.isBackspace, selStart = params.selStart, selEnd = params.selEnd, currentRaw = params.currentRaw, slotMap = params.slotMap;
|
|
10
|
+
var rawStart;
|
|
11
|
+
var rawEnd;
|
|
12
|
+
var cursorPos;
|
|
13
|
+
if (selStart === selEnd) {
|
|
14
|
+
if (isBackspace) {
|
|
15
|
+
var rawPos = -1;
|
|
16
|
+
for (var i = selStart - 1; i >= 0; i--) {
|
|
17
|
+
var r = slotMap.maskedToRaw[i];
|
|
18
|
+
if (r !== null && r !== undefined) {
|
|
19
|
+
rawPos = r;
|
|
20
|
+
break;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
if (rawPos === -1 || rawPos >= currentRaw.length) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
rawStart = rawPos;
|
|
27
|
+
rawEnd = rawPos + 1;
|
|
28
|
+
cursorPos = (_a = slotMap.rawToMasked[rawPos]) !== null && _a !== void 0 ? _a : 0;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
var rawPos = -1;
|
|
32
|
+
for (var i = selStart; i < slotMap.maskedToRaw.length; i++) {
|
|
33
|
+
var r = slotMap.maskedToRaw[i];
|
|
34
|
+
if (r !== null && r !== undefined) {
|
|
35
|
+
rawPos = r;
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (rawPos === -1 || rawPos >= currentRaw.length) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
rawStart = rawPos;
|
|
43
|
+
rawEnd = rawPos + 1;
|
|
44
|
+
cursorPos = (_b = slotMap.rawToMasked[rawPos]) !== null && _b !== void 0 ? _b : 0;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
var rStart = Infinity;
|
|
49
|
+
var rEnd = -1;
|
|
50
|
+
for (var i = selStart; i < selEnd; i++) {
|
|
51
|
+
var r = slotMap.maskedToRaw[i];
|
|
52
|
+
if (r !== null && r !== undefined) {
|
|
53
|
+
rStart = Math.min(rStart, r);
|
|
54
|
+
rEnd = Math.max(rEnd, r + 1);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (rEnd === -1) {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
rawStart = rStart;
|
|
61
|
+
rawEnd = rEnd;
|
|
62
|
+
cursorPos = (_c = slotMap.rawToMasked[rawStart]) !== null && _c !== void 0 ? _c : selStart;
|
|
63
|
+
}
|
|
64
|
+
var newRaw = currentRaw.slice(0, rawStart) + currentRaw.slice(rawEnd);
|
|
65
|
+
if (newRaw === currentRaw) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
return { newRaw: newRaw, cursorPos: cursorPos };
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=maskedCoreDeletion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maskedCoreDeletion.js","sourceRoot":"","sources":["maskedCoreDeletion.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SlotMap } from './types.js';\n\n/** Параметры удаления через Backspace/Delete. */\nexport interface MaskedDeletionParams {\n /** `true` для Backspace, `false` для Delete. */\n isBackspace: boolean;\n /** Начало выделения в displayValue. */\n selStart: number;\n /** Конец выделения в displayValue. */\n selEnd: number;\n /** Текущее raw-значение. */\n currentRaw: string;\n /** Карта слотов маски. */\n slotMap: SlotMap;\n}\n\n/** Успешный результат удаления символов маски. */\nexport interface MaskedDeletionResult {\n /** Raw после удаления. */\n newRaw: string;\n /** Позиция курсора в displayValue после удаления. */\n cursorPos: number;\n}\n\n/**\n * Вычисляет raw и позицию курсора после Backspace/Delete с учётом фиксированных символов маски.\n *\n * @param params — текущее выделение и состояние маски.\n * @returns новое raw и cursorPos или `null`, если удалять нечего.\n */\nexport function computeMaskedDeletion(params: MaskedDeletionParams): MaskedDeletionResult | null {\n const { isBackspace, selStart, selEnd, currentRaw, slotMap } = params;\n\n let rawStart: number;\n let rawEnd: number;\n let cursorPos: number;\n\n if (selStart === selEnd) {\n if (isBackspace) {\n let rawPos = -1;\n for (let i = selStart - 1; i >= 0; i--) {\n const r = slotMap.maskedToRaw[i];\n if (r !== null && r !== undefined) {\n rawPos = r;\n break;\n }\n }\n if (rawPos === -1 || rawPos >= currentRaw.length) {\n return null;\n }\n rawStart = rawPos;\n rawEnd = rawPos + 1;\n cursorPos = slotMap.rawToMasked[rawPos] ?? 0;\n } else {\n let rawPos = -1;\n for (let i = selStart; i < slotMap.maskedToRaw.length; i++) {\n const r = slotMap.maskedToRaw[i];\n if (r !== null && r !== undefined) {\n rawPos = r;\n break;\n }\n }\n if (rawPos === -1 || rawPos >= currentRaw.length) {\n return null;\n }\n rawStart = rawPos;\n rawEnd = rawPos + 1;\n cursorPos = slotMap.rawToMasked[rawPos] ?? 0;\n }\n } else {\n let rStart = Infinity;\n let rEnd = -1;\n for (let i = selStart; i < selEnd; i++) {\n const r = slotMap.maskedToRaw[i];\n if (r !== null && r !== undefined) {\n rStart = Math.min(rStart, r);\n rEnd = Math.max(rEnd, r + 1);\n }\n }\n if (rEnd === -1) {\n return null;\n }\n rawStart = rStart;\n rawEnd = rEnd;\n cursorPos = slotMap.rawToMasked[rawStart] ?? selStart;\n }\n\n const newRaw = currentRaw.slice(0, rawStart) + currentRaw.slice(rawEnd);\n if (newRaw === currentRaw) {\n return null;\n }\n\n return { newRaw, cursorPos };\n}\n"]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { MaskEngine } from './types.js';
|
|
2
|
+
/** Параметры обработки нативного `change` от `<input>`. */
|
|
3
|
+
export interface MaskedInputChangeParams {
|
|
4
|
+
/** Черновик value, который браузер записал в input. */
|
|
5
|
+
browserDraft: string;
|
|
6
|
+
/** Позиция курсора после изменения. */
|
|
7
|
+
cursorPos: number;
|
|
8
|
+
/** Текущее typedValue из MaskState. */
|
|
9
|
+
typedValue: string;
|
|
10
|
+
/** Текущее raw-значение (источник истины). */
|
|
11
|
+
currentRaw: string;
|
|
12
|
+
/** Предыдущее выделение до изменения. */
|
|
13
|
+
oldSelection: {
|
|
14
|
+
start: number;
|
|
15
|
+
end: number;
|
|
16
|
+
};
|
|
17
|
+
/** IMask-движок. */
|
|
18
|
+
engine: Pick<MaskEngine, 'imask'>;
|
|
19
|
+
}
|
|
20
|
+
/** Результат применения пользовательского ввода через IMask. */
|
|
21
|
+
export interface MaskedInputChangeResult {
|
|
22
|
+
/** Новое raw после splice. */
|
|
23
|
+
newRaw: string;
|
|
24
|
+
/** Позиция курсора, которую нужно установить. */
|
|
25
|
+
cursorPos: number;
|
|
26
|
+
/** `true`, если символ не был принят (raw не изменился). */
|
|
27
|
+
rejected: boolean;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Применяет пользовательский ввод к IMask через `splice` и вычисляет новый raw с позицией курсора.
|
|
31
|
+
*
|
|
32
|
+
* @param params — состояние input до/после изменения.
|
|
33
|
+
* @returns новое raw, позицию курсора и флаг отклонённого ввода.
|
|
34
|
+
*/
|
|
35
|
+
export declare function applyMaskedInputChange(params: MaskedInputChangeParams): MaskedInputChangeResult;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { ActionDetails } from '../react-imask/imask/core/action-details.js';
|
|
2
|
+
import { DIRECTION } from '../react-imask/imask/core/utils.js';
|
|
3
|
+
/**
|
|
4
|
+
* Применяет пользовательский ввод к IMask через `splice` и вычисляет новый raw с позицией курсора.
|
|
5
|
+
*
|
|
6
|
+
* @param params — состояние input до/после изменения.
|
|
7
|
+
* @returns новое raw, позицию курсора и флаг отклонённого ввода.
|
|
8
|
+
*/
|
|
9
|
+
export function applyMaskedInputChange(params) {
|
|
10
|
+
var browserDraft = params.browserDraft, cursorPos = params.cursorPos, typedValue = params.typedValue, currentRaw = params.currentRaw, oldSelection = params.oldSelection, engine = params.engine;
|
|
11
|
+
var details = new ActionDetails({
|
|
12
|
+
value: browserDraft,
|
|
13
|
+
cursorPos: cursorPos,
|
|
14
|
+
oldValue: typedValue,
|
|
15
|
+
oldSelection: oldSelection,
|
|
16
|
+
});
|
|
17
|
+
var oldRawValue = engine.imask.unmaskedValue;
|
|
18
|
+
var spliceResult = engine.imask.splice(details.startChangePos, details.removed.length, details.inserted, details.removeDirection, { input: true, raw: true });
|
|
19
|
+
var removeDirection = oldRawValue === engine.imask.unmaskedValue ? details.removeDirection : DIRECTION.NONE;
|
|
20
|
+
var newCursorPos = engine.imask.nearestInputPos(details.startChangePos + spliceResult.offset, removeDirection);
|
|
21
|
+
if (removeDirection !== DIRECTION.NONE) {
|
|
22
|
+
newCursorPos = engine.imask.nearestInputPos(newCursorPos, DIRECTION.NONE);
|
|
23
|
+
}
|
|
24
|
+
var newRaw = engine.imask.rawInputValue;
|
|
25
|
+
return {
|
|
26
|
+
newRaw: newRaw,
|
|
27
|
+
cursorPos: newCursorPos,
|
|
28
|
+
rejected: newRaw === currentRaw,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=maskedCoreInputChange.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maskedCoreInputChange.js","sourceRoot":"","sources":["maskedCoreInputChange.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AA6B/D;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAA+B;IAC5D,IAAA,YAAY,GAA8D,MAAM,aAApE,EAAE,SAAS,GAAmD,MAAM,UAAzD,EAAE,UAAU,GAAuC,MAAM,WAA7C,EAAE,UAAU,GAA2B,MAAM,WAAjC,EAAE,YAAY,GAAa,MAAM,aAAnB,EAAE,MAAM,GAAK,MAAM,OAAX,CAAY;IAEzF,IAAM,OAAO,GAAG,IAAI,aAAa,CAAC;QAChC,KAAK,EAAE,YAAY;QACnB,SAAS,WAAA;QACT,QAAQ,EAAE,UAAU;QACpB,YAAY,cAAA;KACb,CAAC,CAAC;IAEH,IAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC;IAE/C,IAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CACtC,OAAO,CAAC,cAAc,EACtB,OAAO,CAAC,OAAO,CAAC,MAAM,EACtB,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,eAAe,EACvB,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAC3B,CAAC;IAEF,IAAM,eAAe,GAAG,WAAW,KAAK,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC;IAE9G,IAAI,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,cAAc,GAAG,YAAY,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC/G,IAAI,eAAe,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;QACvC,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,YAAY,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IAC5E,CAAC;IAED,IAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC;IAE1C,OAAO;QACL,MAAM,QAAA;QACN,SAAS,EAAE,YAAY;QACvB,QAAQ,EAAE,MAAM,KAAK,UAAU;KAChC,CAAC;AACJ,CAAC","sourcesContent":["import { ActionDetails } from '../react-imask/imask/core/action-details.js';\nimport { DIRECTION } from '../react-imask/imask/core/utils.js';\nimport type { MaskEngine } from './types.js';\n\n/** Параметры обработки нативного `change` от `<input>`. */\nexport interface MaskedInputChangeParams {\n /** Черновик value, который браузер записал в input. */\n browserDraft: string;\n /** Позиция курсора после изменения. */\n cursorPos: number;\n /** Текущее typedValue из MaskState. */\n typedValue: string;\n /** Текущее raw-значение (источник истины). */\n currentRaw: string;\n /** Предыдущее выделение до изменения. */\n oldSelection: { start: number; end: number };\n /** IMask-движок. */\n engine: Pick<MaskEngine, 'imask'>;\n}\n\n/** Результат применения пользовательского ввода через IMask. */\nexport interface MaskedInputChangeResult {\n /** Новое raw после splice. */\n newRaw: string;\n /** Позиция курсора, которую нужно установить. */\n cursorPos: number;\n /** `true`, если символ не был принят (raw не изменился). */\n rejected: boolean;\n}\n\n/**\n * Применяет пользовательский ввод к IMask через `splice` и вычисляет новый raw с позицией курсора.\n *\n * @param params — состояние input до/после изменения.\n * @returns новое raw, позицию курсора и флаг отклонённого ввода.\n */\nexport function applyMaskedInputChange(params: MaskedInputChangeParams): MaskedInputChangeResult {\n const { browserDraft, cursorPos, typedValue, currentRaw, oldSelection, engine } = params;\n\n const details = new ActionDetails({\n value: browserDraft,\n cursorPos,\n oldValue: typedValue,\n oldSelection,\n });\n\n const oldRawValue = engine.imask.unmaskedValue;\n\n const spliceResult = engine.imask.splice(\n details.startChangePos,\n details.removed.length,\n details.inserted,\n details.removeDirection,\n { input: true, raw: true },\n );\n\n const removeDirection = oldRawValue === engine.imask.unmaskedValue ? details.removeDirection : DIRECTION.NONE;\n\n let newCursorPos = engine.imask.nearestInputPos(details.startChangePos + spliceResult.offset, removeDirection);\n if (removeDirection !== DIRECTION.NONE) {\n newCursorPos = engine.imask.nearestInputPos(newCursorPos, DIRECTION.NONE);\n }\n\n const newRaw = engine.imask.rawInputValue;\n\n return {\n newRaw,\n cursorPos: newCursorPos,\n rejected: newRaw === currentRaw,\n };\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type React from 'react';
|
|
2
|
+
type SelectionDirection = 'forward' | 'backward' | 'none';
|
|
3
|
+
/**
|
|
4
|
+
* Вычисляет новое выделение при навигации стрелками, Home/End и Ctrl/Alt+стрелками.
|
|
5
|
+
* Логика перенесена из FixedIMaskInput v1.
|
|
6
|
+
*
|
|
7
|
+
* @param e — keyboard event.
|
|
8
|
+
* @param maxPos — максимальная позиция курсора (typedLength).
|
|
9
|
+
* @param el — DOM input с текущим selection.
|
|
10
|
+
* @returns кортеж `[start, end, direction]` для `setSelectionRange`.
|
|
11
|
+
*/
|
|
12
|
+
export declare function calcNavigationSelection(e: React.KeyboardEvent<HTMLInputElement>, maxPos: number, el: HTMLInputElement | null): [number, number, SelectionDirection];
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
2
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
3
|
+
if (ar || !(i in from)) {
|
|
4
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
5
|
+
ar[i] = from[i];
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
9
|
+
};
|
|
10
|
+
import { isKeyArrowHorizontal, isKeyArrowLeft, isKeyArrowUp, isKeyHome, isModShift, isShortcutJumpCaret, someKeys, } from '../../../lib/events/keyboard/identifiers.js';
|
|
11
|
+
/**
|
|
12
|
+
* Вычисляет новое выделение при навигации стрелками, Home/End и Ctrl/Alt+стрелками.
|
|
13
|
+
* Логика перенесена из FixedIMaskInput v1.
|
|
14
|
+
*
|
|
15
|
+
* @param e — keyboard event.
|
|
16
|
+
* @param maxPos — максимальная позиция курсора (typedLength).
|
|
17
|
+
* @param el — DOM input с текущим selection.
|
|
18
|
+
* @returns кортеж `[start, end, direction]` для `setSelectionRange`.
|
|
19
|
+
*/
|
|
20
|
+
export function calcNavigationSelection(e, maxPos, el) {
|
|
21
|
+
var _a, _b, _c;
|
|
22
|
+
if (!el) {
|
|
23
|
+
return [0, 0, 'none'];
|
|
24
|
+
}
|
|
25
|
+
var start = (_a = el.selectionStart) !== null && _a !== void 0 ? _a : 0;
|
|
26
|
+
var end = (_b = el.selectionEnd) !== null && _b !== void 0 ? _b : 0;
|
|
27
|
+
var direction = ((_c = el.selectionDirection) !== null && _c !== void 0 ? _c : 'none');
|
|
28
|
+
var isSelectionMode = isModShift()(e);
|
|
29
|
+
var tail = start !== end && direction === 'backward' ? end : start;
|
|
30
|
+
var head = start !== end && direction === 'backward' ? start : end;
|
|
31
|
+
var headDirection = someKeys(isKeyArrowLeft, isKeyArrowUp, isKeyHome)(e) ? 'left' : 'right';
|
|
32
|
+
var step = isKeyArrowHorizontal(e) ? 1 : Infinity;
|
|
33
|
+
var increment = headDirection === 'left' ? -step : step;
|
|
34
|
+
var normalized = function (v) { return Math.min(maxPos, Math.max(0, v)); };
|
|
35
|
+
if (isShortcutJumpCaret(e)) {
|
|
36
|
+
head = jumpCaret(head, headDirection, el.value, maxPos);
|
|
37
|
+
}
|
|
38
|
+
else if (head !== tail && !isSelectionMode && isKeyArrowHorizontal(e)) {
|
|
39
|
+
head = headDirection === 'right' ? Math.max(tail, head) : Math.min(tail, head);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
head = head + increment;
|
|
43
|
+
}
|
|
44
|
+
if (isSelectionMode) {
|
|
45
|
+
var s = Math.min(tail, head);
|
|
46
|
+
var e2 = Math.max(tail, head);
|
|
47
|
+
return [normalized(s), normalized(e2), e2 === head ? 'forward' : 'backward'];
|
|
48
|
+
}
|
|
49
|
+
tail = head;
|
|
50
|
+
return [normalized(tail), normalized(head), 'none'];
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Перемещает курсор к началу/концу следующего «слова» при Ctrl/Alt+стрелка.
|
|
54
|
+
*
|
|
55
|
+
* @param prev — текущая позиция курсора.
|
|
56
|
+
* @param headDirection — направление прыжка.
|
|
57
|
+
* @param value — текущее value input.
|
|
58
|
+
* @param maxPos — верхняя граница позиции курсора.
|
|
59
|
+
*/
|
|
60
|
+
function jumpCaret(prev, headDirection, value, maxPos) {
|
|
61
|
+
var _a;
|
|
62
|
+
// CODE-1 fix: используем .source вместо .valueOf() — иначе "/" попадает в символы слова
|
|
63
|
+
var word = /а-яa-z0-9_/.source;
|
|
64
|
+
var wordRegExp = new RegExp("([".concat(word, "])+[\\s]*|([^").concat(word, "])+"), 'gi');
|
|
65
|
+
var normalized = function (v) { return Math.min(maxPos, Math.max(0, v)); };
|
|
66
|
+
var next = headDirection === 'right' ? prev : 0;
|
|
67
|
+
(_a = value.match(wordRegExp)) === null || _a === void 0 ? void 0 : _a.reduce(function (s, a) {
|
|
68
|
+
var pos = a.length + (s.slice(-1)[0] || 0);
|
|
69
|
+
if (headDirection === 'right' && next === prev && next < pos) {
|
|
70
|
+
next = normalized(pos);
|
|
71
|
+
}
|
|
72
|
+
else if (headDirection === 'left' && prev > pos) {
|
|
73
|
+
next = normalized(pos);
|
|
74
|
+
}
|
|
75
|
+
return __spreadArray(__spreadArray([], s, true), [pos], false);
|
|
76
|
+
}, []);
|
|
77
|
+
return next;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=maskedCoreNavigation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maskedCoreNavigation.js","sourceRoot":"","sources":["maskedCoreNavigation.ts"],"names":[],"mappings":"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","sourcesContent":["import type React from 'react';\n\nimport {\n isKeyArrowHorizontal,\n isKeyArrowLeft,\n isKeyArrowUp,\n isKeyHome,\n isModShift,\n isShortcutJumpCaret,\n someKeys,\n} from '../../../lib/events/keyboard/identifiers.js';\n\ntype HeadDirection = 'left' | 'right';\ntype SelectionDirection = 'forward' | 'backward' | 'none';\n\n/**\n * Вычисляет новое выделение при навигации стрелками, Home/End и Ctrl/Alt+стрелками.\n * Логика перенесена из FixedIMaskInput v1.\n *\n * @param e — keyboard event.\n * @param maxPos — максимальная позиция курсора (typedLength).\n * @param el — DOM input с текущим selection.\n * @returns кортеж `[start, end, direction]` для `setSelectionRange`.\n */\nexport function calcNavigationSelection(\n e: React.KeyboardEvent<HTMLInputElement>,\n maxPos: number,\n el: HTMLInputElement | null,\n): [number, number, SelectionDirection] {\n if (!el) {\n return [0, 0, 'none'];\n }\n\n const start = el.selectionStart ?? 0;\n const end = el.selectionEnd ?? 0;\n const direction = (el.selectionDirection ?? 'none') as SelectionDirection;\n\n const isSelectionMode = isModShift()(e);\n let tail = start !== end && direction === 'backward' ? end : start;\n let head = start !== end && direction === 'backward' ? start : end;\n\n const headDirection: HeadDirection = someKeys(isKeyArrowLeft, isKeyArrowUp, isKeyHome)(e) ? 'left' : 'right';\n const step = isKeyArrowHorizontal(e) ? 1 : Infinity;\n const increment = headDirection === 'left' ? -step : step;\n\n const normalized = (v: number) => Math.min(maxPos, Math.max(0, v));\n\n if (isShortcutJumpCaret(e)) {\n head = jumpCaret(head, headDirection, el.value, maxPos);\n } else if (head !== tail && !isSelectionMode && isKeyArrowHorizontal(e)) {\n head = headDirection === 'right' ? Math.max(tail, head) : Math.min(tail, head);\n } else {\n head = head + increment;\n }\n\n if (isSelectionMode) {\n const s = Math.min(tail, head);\n const e2 = Math.max(tail, head);\n return [normalized(s), normalized(e2), e2 === head ? 'forward' : 'backward'];\n }\n\n tail = head;\n return [normalized(tail), normalized(head), 'none'];\n}\n\n/**\n * Перемещает курсор к началу/концу следующего «слова» при Ctrl/Alt+стрелка.\n *\n * @param prev — текущая позиция курсора.\n * @param headDirection — направление прыжка.\n * @param value — текущее value input.\n * @param maxPos — верхняя граница позиции курсора.\n */\nfunction jumpCaret(prev: number, headDirection: HeadDirection, value: string, maxPos: number): number {\n // CODE-1 fix: используем .source вместо .valueOf() — иначе \"/\" попадает в символы слова\n const word = /а-яa-z0-9_/.source;\n const wordRegExp = new RegExp(`([${word}])+[\\\\s]*|([^${word}])+`, 'gi');\n const normalized = (v: number) => Math.min(maxPos, Math.max(0, v));\n\n let next = headDirection === 'right' ? prev : 0;\n value.match(wordRegExp)?.reduce<number[]>((s, a) => {\n const pos = a.length + (s.slice(-1)[0] || 0);\n if (headDirection === 'right' && next === prev && next < pos) {\n next = normalized(pos);\n } else if (headDirection === 'left' && prev > pos) {\n next = normalized(pos);\n }\n return [...s, pos];\n }, []);\n\n return next;\n}\n"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { getOwnerGlobalObject, isBrowser } from '../../../lib/globalObject.js';
|
|
2
|
+
/** Ширина текста в стиле input (для overflow и center/right align). */
|
|
3
|
+
export function measureInputTextWidth(input, text) {
|
|
4
|
+
if (!text) {
|
|
5
|
+
return 0;
|
|
6
|
+
}
|
|
7
|
+
var globalObject = getOwnerGlobalObject(input);
|
|
8
|
+
if (!isBrowser(globalObject)) {
|
|
9
|
+
return 0;
|
|
10
|
+
}
|
|
11
|
+
var style = globalObject.getComputedStyle(input);
|
|
12
|
+
var probe = globalObject.document.createElement('span');
|
|
13
|
+
probe.textContent = text;
|
|
14
|
+
probe.style.cssText = [
|
|
15
|
+
'position:absolute',
|
|
16
|
+
'visibility:hidden',
|
|
17
|
+
'white-space:pre',
|
|
18
|
+
'pointer-events:none',
|
|
19
|
+
"font:".concat(style.font),
|
|
20
|
+
"letter-spacing:".concat(style.letterSpacing),
|
|
21
|
+
"text-transform:".concat(style.textTransform),
|
|
22
|
+
"font-variant-numeric:".concat(style.fontVariantNumeric),
|
|
23
|
+
"font-feature-settings:".concat(style.fontFeatureSettings),
|
|
24
|
+
].join(';');
|
|
25
|
+
globalObject.document.body.appendChild(probe);
|
|
26
|
+
var width = probe.getBoundingClientRect().width;
|
|
27
|
+
probe.remove();
|
|
28
|
+
return width;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=measureInputTextWidth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"measureInputTextWidth.js","sourceRoot":"","sources":["measureInputTextWidth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAE/E,uEAAuE;AACvE,MAAM,UAAU,qBAAqB,CAAC,KAAuB,EAAE,IAAY;IACzE,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAM,YAAY,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACjD,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAM,KAAK,GAAG,YAAY,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACnD,IAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC1D,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG;QACpB,mBAAmB;QACnB,mBAAmB;QACnB,iBAAiB;QACjB,qBAAqB;QACrB,eAAQ,KAAK,CAAC,IAAI,CAAE;QACpB,yBAAkB,KAAK,CAAC,aAAa,CAAE;QACvC,yBAAkB,KAAK,CAAC,aAAa,CAAE;QACvC,+BAAwB,KAAK,CAAC,kBAAkB,CAAE;QAClD,gCAAyB,KAAK,CAAC,mBAAmB,CAAE;KACrD,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACZ,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAE9C,IAAM,KAAK,GAAG,KAAK,CAAC,qBAAqB,EAAE,CAAC,KAAK,CAAC;IAClD,KAAK,CAAC,MAAM,EAAE,CAAC;IAEf,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import { getOwnerGlobalObject, isBrowser } from '../../../lib/globalObject.js';\n\n/** Ширина текста в стиле input (для overflow и center/right align). */\nexport function measureInputTextWidth(input: HTMLInputElement, text: string): number {\n if (!text) {\n return 0;\n }\n\n const globalObject = getOwnerGlobalObject(input);\n if (!isBrowser(globalObject)) {\n return 0;\n }\n\n const style = globalObject.getComputedStyle(input);\n const probe = globalObject.document.createElement('span');\n probe.textContent = text;\n probe.style.cssText = [\n 'position:absolute',\n 'visibility:hidden',\n 'white-space:pre',\n 'pointer-events:none',\n `font:${style.font}`,\n `letter-spacing:${style.letterSpacing}`,\n `text-transform:${style.textTransform}`,\n `font-variant-numeric:${style.fontVariantNumeric}`,\n `font-feature-settings:${style.fontFeatureSettings}`,\n ].join(';');\n globalObject.document.body.appendChild(probe);\n\n const width = probe.getBoundingClientRect().width;\n probe.remove();\n\n return width;\n}\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { selectionAllowedTypes } from '../../Input/Input.js';
|
|
2
|
+
function normalizeInputType(type) {
|
|
3
|
+
return type.trim();
|
|
4
|
+
}
|
|
5
|
+
export function isMaskInputSelectionAllowed(input) {
|
|
6
|
+
return selectionAllowedTypes.includes(normalizeInputType(input.type || 'text'));
|
|
7
|
+
}
|
|
8
|
+
export function setMaskInputSelectionRange(input, start, end, direction) {
|
|
9
|
+
if (end === void 0) { end = start; }
|
|
10
|
+
if (!input || !isMaskInputSelectionAllowed(input)) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
try {
|
|
14
|
+
if (direction) {
|
|
15
|
+
input.setSelectionRange(start, end, direction);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
input.setSelectionRange(start, end);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
catch (_a) {
|
|
22
|
+
// InvalidStateError для input-типов без selection API
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=setMaskInputSelectionRange.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setMaskInputSelectionRange.js","sourceRoot":"","sources":["setMaskInputSelectionRange.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAkB,MAAM,sBAAsB,CAAC;AAE7E,SAAS,kBAAkB,CAAC,IAAY;IACtC,OAAO,IAAI,CAAC,IAAI,EAAe,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,KAAuB;IACjE,OAAO,qBAAqB,CAAC,QAAQ,CAAC,kBAAkB,CAAC,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,KAA0C,EAC1C,KAAa,EACb,GAAmB,EACnB,SAA2C;IAD3C,oBAAA,EAAA,WAAmB;IAGnB,IAAI,CAAC,KAAK,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,IAAI,SAAS,EAAE,CAAC;YACd,KAAK,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QACjD,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAAC,WAAM,CAAC;QACP,sDAAsD;IACxD,CAAC;AACH,CAAC","sourcesContent":["import { selectionAllowedTypes, type InputType } from '../../Input/Input.js';\n\nfunction normalizeInputType(type: string): InputType {\n return type.trim() as InputType;\n}\n\nexport function isMaskInputSelectionAllowed(input: HTMLInputElement): boolean {\n return selectionAllowedTypes.includes(normalizeInputType(input.type || 'text'));\n}\n\nexport function setMaskInputSelectionRange(\n input: HTMLInputElement | null | undefined,\n start: number,\n end: number = start,\n direction?: 'forward' | 'backward' | 'none',\n): void {\n if (!input || !isMaskInputSelectionAllowed(input)) {\n return;\n }\n\n try {\n if (direction) {\n input.setSelectionRange(start, end, direction);\n } else {\n input.setSelectionRange(start, end);\n }\n } catch {\n // InvalidStateError для input-типов без selection API\n }\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export function hasMaskPart(maskState) {
|
|
2
|
+
return maskState.displayValue.length > maskState.typedValue.length;
|
|
3
|
+
}
|
|
4
|
+
export function getShowOverlay(maskState, focused, overflows) {
|
|
5
|
+
if (overflows === void 0) { overflows = false; }
|
|
6
|
+
if (overflows) {
|
|
7
|
+
// При переполнении скрываем overlay только для полностью введённого значения:
|
|
8
|
+
// иначе overlay не совпадает с прокруткой input. Декоративная часть маски
|
|
9
|
+
// (плейсхолдеры) всегда рисуется через overlay, а не через value input.
|
|
10
|
+
return hasMaskPart(maskState);
|
|
11
|
+
}
|
|
12
|
+
// Полностью введённое значение (без декоративной части маски) рисуем нативным
|
|
13
|
+
// текстом input — иначе overlay с overflow:hidden обрезает конец при горизонтальном скролле.
|
|
14
|
+
return hasMaskPart(maskState);
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=showOverlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"showOverlay.js","sourceRoot":"","sources":["showOverlay.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,WAAW,CAAC,SAAoB;IAC9C,OAAO,SAAS,CAAC,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAoB,EAAE,OAAgB,EAAE,SAAiB;IAAjB,0BAAA,EAAA,iBAAiB;IACtF,IAAI,SAAS,EAAE,CAAC;QACd,8EAA8E;QAC9E,0EAA0E;QAC1E,wEAAwE;QACxE,OAAO,WAAW,CAAC,SAAS,CAAC,CAAC;IAChC,CAAC;IAED,8EAA8E;IAC9E,6FAA6F;IAC7F,OAAO,WAAW,CAAC,SAAS,CAAC,CAAC;AAChC,CAAC","sourcesContent":["import type { MaskState } from './types.js';\n\nexport function hasMaskPart(maskState: MaskState): boolean {\n return maskState.displayValue.length > maskState.typedValue.length;\n}\n\nexport function getShowOverlay(maskState: MaskState, focused: boolean, overflows = false): boolean {\n if (overflows) {\n // При переполнении скрываем overlay только для полностью введённого значения:\n // иначе overlay не совпадает с прокруткой input. Декоративная часть маски\n // (плейсхолдеры) всегда рисуется через overlay, а не через value input.\n return hasMaskPart(maskState);\n }\n\n // Полностью введённое значение (без декоративной части маски) рисуем нативным\n // текстом input — иначе overlay с overflow:hidden обрезает конец при горизонтальном скролле.\n return hasMaskPart(maskState);\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { SlotMap } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Из выделенного диапазона displayValue убирает фиксированные символы маски,
|
|
4
|
+
* оставляя только пользовательские символы.
|
|
5
|
+
*
|
|
6
|
+
* @param selected — подстрока displayValue.
|
|
7
|
+
* @param slotMap — карта соответствия позиций маски и raw-слотов.
|
|
8
|
+
* @param startOffset — позиция начала выделения в displayValue.
|
|
9
|
+
* @returns строка без литералов маски.
|
|
10
|
+
*/
|
|
11
|
+
export declare function stripMaskChars(selected: string, slotMap: SlotMap, startOffset: number): string;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Из выделенного диапазона displayValue убирает фиксированные символы маски,
|
|
3
|
+
* оставляя только пользовательские символы.
|
|
4
|
+
*
|
|
5
|
+
* @param selected — подстрока displayValue.
|
|
6
|
+
* @param slotMap — карта соответствия позиций маски и raw-слотов.
|
|
7
|
+
* @param startOffset — позиция начала выделения в displayValue.
|
|
8
|
+
* @returns строка без литералов маски.
|
|
9
|
+
*/
|
|
10
|
+
export function stripMaskChars(selected, slotMap, startOffset) {
|
|
11
|
+
var result = '';
|
|
12
|
+
for (var i = 0; i < selected.length; i++) {
|
|
13
|
+
var maskedPos = startOffset + i;
|
|
14
|
+
if (slotMap.maskedToRaw[maskedPos] !== null && slotMap.maskedToRaw[maskedPos] !== undefined) {
|
|
15
|
+
result += selected[i];
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return result;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=stripMaskChars.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stripMaskChars.js","sourceRoot":"","sources":["stripMaskChars.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,OAAgB,EAAE,WAAmB;IACpF,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,IAAM,SAAS,GAAG,WAAW,GAAG,CAAC,CAAC;QAClC,IAAI,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,SAAS,EAAE,CAAC;YAC5F,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import type { SlotMap } from './types.js';\n\n/**\n * Из выделенного диапазона displayValue убирает фиксированные символы маски,\n * оставляя только пользовательские символы.\n *\n * @param selected — подстрока displayValue.\n * @param slotMap — карта соответствия позиций маски и raw-слотов.\n * @param startOffset — позиция начала выделения в displayValue.\n * @returns строка без литералов маски.\n */\nexport function stripMaskChars(selected: string, slotMap: SlotMap, startOffset: number): string {\n let result = '';\n for (let i = 0; i < selected.length; i++) {\n const maskedPos = startOffset + i;\n if (slotMap.maskedToRaw[maskedPos] !== null && slotMap.maskedToRaw[maskedPos] !== undefined) {\n result += selected[i];\n }\n }\n return result;\n}\n"]}
|