diff --git a/packages/ui/package.json b/packages/ui/package.json index d5bdb3d987..ff36069fd9 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -45,7 +45,7 @@ "dependencies": { "@floating-ui/vue": "^1.0.1", "@types/lodash": "^4.14.161", - "cleave.js": "^1.6.0", + "cleave-zen": "^0.0.17", "colortranslator": "^1.9.2", "lodash": "^4.17.21" }, @@ -167,4 +167,4 @@ ] } } -} \ No newline at end of file +} diff --git a/packages/ui/src/components/va-input/VaInput.demo.vue b/packages/ui/src/components/va-input/VaInput.demo.vue index 556a0e0d3a..1d9aae0420 100644 --- a/packages/ui/src/components/va-input/VaInput.demo.vue +++ b/packages/ui/src/components/va-input/VaInput.demo.vue @@ -645,7 +645,6 @@ import { VaButton } from './../va-button' import { VaIcon } from './../va-icon' import VaInputValidation from './VaInput-validation.vue' import { VaCheckbox } from '../va-checkbox' -import 'cleave.js/dist/addons/cleave-phone.us' export default defineComponent({ components: { diff --git a/packages/ui/src/components/va-input/VaInput.stories.ts b/packages/ui/src/components/va-input/VaInput.stories.ts index a2009a3b07..c2c2f4e1dd 100644 --- a/packages/ui/src/components/va-input/VaInput.stories.ts +++ b/packages/ui/src/components/va-input/VaInput.stories.ts @@ -144,39 +144,108 @@ export const Mask = () => ({ components: { VaInput }, data () { return { - dateValue: '', creditCardValue: '', + dateValue: '', + timeValue: '', + numeralValue: '', + generalValue: '', } }, template: ` - [dateValue]: {{ dateValue }} - - [creditCardValue]: {{ creditCardValue }} +
+
+
+ + [dateValue]: {{ dateValue }} +
+ +
+
+ + [timeValue]: {{ timeValue }} +
+ +
+
+ + [numeralValue]: {{ numeralValue }} +
+ +
+
+ + [generalValue]: {{ generalValue }} +
+ `, }) -export const MaskFormattedValue = () => ({ +export const MaskRawValue = () => ({ components: { VaInput }, data () { return { - dateValue: '', creditCardValue: '', + creditCardValueRaw: '', + dateValue: '', + dateValueRaw: '', + timeValue: '', + timeValueRaw: '', + numeralValue: '', + numeralValueRaw: '', + generalValue: '', + generalValueRaw: '', + phoneValue: '', + phoneValueRaw: '', } }, template: ` + [creditCardValue]: {{ creditCardValue }} +
+ [creditCardValueRaw]: {{ creditCardValueRaw }} +
+ +
+
+ [dateValue]: {{ dateValue }} - +
+ [dateValueRaw]: {{ dateValueRaw }} +
+ +
+
- [creditCardValue]: {{ creditCardValue }} - + [timeValue]: {{ timeValue }} +
+ [timeValueRaw]: {{ timeValueRaw }} +
+ +
+
+ + [numeralValue]: {{ numeralValue }} +
+ [numeralValueRaw]: {{ numeralValueRaw }} +
+ +
+
+ + [generalValue]: {{ generalValue }} +
+ [generalValueRaw]: {{ generalValueRaw }} +
+ +
+
+ + [phoneValue]: {{ phoneValue }} +
+ [phoneValueRaw]: {{ phoneValueRaw }} +
+ `, }) diff --git a/packages/ui/src/components/va-input/VaInput.vue b/packages/ui/src/components/va-input/VaInput.vue index af84ae56c5..afa0ecba2f 100644 --- a/packages/ui/src/components/va-input/VaInput.vue +++ b/packages/ui/src/components/va-input/VaInput.vue @@ -64,7 +64,7 @@ import { useFocusable, useFocusableProps, useEvent, } from '../../composables' import type { ValidationProps } from '../../composables/useValidation' -import { useCleave, useCleaveProps } from './hooks/useCleave' +import { useCleaveProps, useCleave } from './hooks/useCleave' import type { AnyStringPropType } from '../../utils/types/prop-type' @@ -123,6 +123,7 @@ const props = defineProps({ const emit = defineEmits([ 'update:modelValue', + 'update:rawValue', ...useValidationEmits, ...useClearableEmits, ...createInputEmits(), @@ -174,7 +175,7 @@ const { clearIconProps, } = useClearable(props, modelValue, input, computedError) -const { computedValue, onInput } = useCleave(input, props, valueComputed) +const { computedValue, onInput } = useCleave(input, props, valueComputed, emit) const inputListeners = createInputListeners(emit) diff --git a/packages/ui/src/components/va-input/hooks/useCleave.ts b/packages/ui/src/components/va-input/hooks/useCleave.ts index f861cdfa52..1fc12d13ca 100644 --- a/packages/ui/src/components/va-input/hooks/useCleave.ts +++ b/packages/ui/src/components/va-input/hooks/useCleave.ts @@ -1,97 +1,150 @@ -import { computed, onBeforeUnmount, PropType, ref, Ref, watchEffect, type ExtractPropTypes, type WritableComputedRef } from 'vue' -import Cleave from 'cleave.js' -import { type CleaveOptions } from 'cleave.js/options' +import { + computed, + PropType, + Ref, + type ExtractPropTypes, + type WritableComputedRef, +} from 'vue' +import { + formatDate, + formatTime, + formatGeneral, + formatNumeral, + formatCreditCard, + unformatGeneral, + unformatNumeral, + unformatCreditCard, + type FormatGeneralOptions, + type FormatTimeOptions, + type FormatNumeralOptions, + type FormatCreditCardOptions, + type FormatDateOptions, +} from 'cleave-zen' + +interface MaskOptions extends FormatGeneralOptions, FormatDateOptions, FormatNumeralOptions, FormatCreditCardOptions, FormatTimeOptions {} +interface MaskProp { + type: 'date' | 'time' | 'creditCard' | 'numeral' | 'general' | 'phone' + options: MaskOptions +} -const DEFAULT_MASK_TOKENS: Record> = { +const DEFAULT_MASK_TOKENS: Record> = { creditCard: { - creditCard: true, + formatter: formatCreditCard, + transcriber: unformatCreditCard, + options: {} as FormatCreditCardOptions, }, date: { - date: true, - datePattern: ['d', 'm', 'Y'], + formatter: formatDate, + transcriber: (value: string, options?: FormatDateOptions): string => { + if (options!.delimiter) { + return value.replaceAll(options!.delimiter, '') + } + return value + }, + options: { + delimiter: '/', + } as FormatDateOptions, }, time: { - time: true, - timePattern: ['h', 'm'], - timeFormat: '24', + formatter: formatTime, + transcriber: (value: string, options?: FormatTimeOptions): string => { + if (options!.delimiter) { + return value.replaceAll(options!.delimiter, '') + } + return value + }, + options: { + timePattern: ['h', 'm'], + timeFormat: '24', + delimiter: ':', + } as FormatTimeOptions, }, numeral: { - numeral: true, - numeralThousandsGroupStyle: 'thousand', + formatter: formatNumeral, + transcriber: unformatNumeral, + options: {} as FormatNumeralOptions, + }, + general: { + formatter: formatGeneral, + transcriber: unformatGeneral, + options: {} as FormatGeneralOptions, + }, + phone: { + formatter: (value: string, options: any) => { + // TODO: dynamic delimiter & prefix from options + const maxLength = options.blocks.reduce((acc: number, cv: number) => acc + cv, 0) + let newValue = value.replaceAll('+', '').replaceAll(' ', '').replaceAll(/[^0-9]/g, '').slice(0, maxLength) + if (!newValue) { + return newValue + } + + const blockIndexes = options.blocks.reduce((acc: number[], cv: number) => [...acc, +acc.slice(-1) + cv], []) + const valuesArray: string[] = [] + blockIndexes.forEach((blockIndex: number, idx: number) => { + const startIndex = idx ? blockIndexes[idx - 1] : 0 + const endIndex = idx === (blockIndexes.length - 1) ? newValue.length : blockIndex + valuesArray.push(newValue.slice(startIndex, endIndex)) + }) + + newValue = valuesArray.filter(v => !!v).join(' ') + + if (newValue.charAt(0) !== '+') { + newValue = `+${newValue}` + } + return newValue + }, + transcriber: (value: string) => { + return value.replaceAll('+', '').replaceAll(' ', '') + }, + options: { + prefix: '+', + blocks: [3, 2, 4], + delimiter: '-', + }, }, } export const useCleaveProps = { - mask: { type: [String, Object] as PropType | CleaveOptions>, default: '' }, + mask: { type: [String, Object] as PropType, default: '' }, returnRaw: { type: Boolean, default: true }, } +const useMask = (mask: string | MaskProp) => { + const maskType = typeof mask === 'string' ? mask : mask.type + const maskOptions = typeof mask === 'string' ? null : mask.options + const { formatter = (v: string) => v, transcriber = (v: string) => v, options = {} } = DEFAULT_MASK_TOKENS[maskType] || {} + return { + formatter: (value: string) => formatter(value, { ...options, ...maskOptions }), + transcriber: (value: string) => transcriber(value, { ...options, ...maskOptions }), + } +} + export const useCleave = ( element: Ref, props: ExtractPropTypes, syncValue: WritableComputedRef, + emit: (event: any, ...args: any[]) => void, ) => { - const cleave = ref() - - const getMask = (mask: CleaveOptions | string) => { - if (typeof mask === 'string') { - return DEFAULT_MASK_TOKENS[mask] ? { ...DEFAULT_MASK_TOKENS[mask] } : null - } - return { ...mask } - } - - const destroyCleave = () => { - if (cleave.value) { cleave.value.destroy() } - } - - const mask = computed(() => getMask(props.mask)) - - const cleaveEnabled = computed(() => { - return mask.value && Object.keys(mask.value).length - }) - - watchEffect(() => { - destroyCleave() - - if (!element.value) { return } - - // Do not create cleave instance if mask is not defined - if (!cleaveEnabled.value || !mask.value) { return } - - cleave.value = new Cleave(element.value, mask.value) - - cleave.value!.properties.onValueChanged = ({ target: { rawValue, value } }) => { - if (props.returnRaw) { - syncValue.value = rawValue - } else { - syncValue.value = value - } - } - }) - - onBeforeUnmount(() => { destroyCleave() }) + const { formatter, transcriber } = useMask(props.mask) const computedValue = computed(() => { - if (cleave.value) { - if (props.returnRaw && syncValue.value === cleave.value.getRawValue()) { - return cleave.value.getFormattedValue() - } - } - return syncValue.value }) const onInput = (event: Event) => { const value = (event.target as HTMLInputElement).value - - if (!cleaveEnabled.value) { + if (!props.mask) { syncValue.value = value + emit('update:rawValue', value) + } else { + const formattedValue = formatter(value) + syncValue.value = formattedValue + element.value!.value = formattedValue + emit('update:rawValue', transcriber(formattedValue)) } } return { - cleave, - cleaveEnabled, computedValue, onInput, } diff --git a/yarn.lock b/yarn.lock index ff79913d95..9091318867 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5630,16 +5630,6 @@ "@babel/parser" "^7.23.9" "@vue/compiler-sfc" "^3.4.15" -"@vue/compiler-core@3.3.11": - version "3.3.11" - resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.3.11.tgz#9fa26f8c81b9b34365f94ce1ed4d0e6e6f94a2ac" - integrity sha512-h97/TGWBilnLuRaj58sxNrsUU66fwdRKLOLQ9N/5iNDfp+DZhYH9Obhe0bXxhedl8fjAgpRANpiZfbgWyruQ0w== - dependencies: - "@babel/parser" "^7.23.5" - "@vue/shared" "3.3.11" - estree-walker "^2.0.2" - source-map-js "^1.0.2" - "@vue/compiler-core@3.4.21", "@vue/compiler-core@^3.0.0": version "3.4.21" resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.4.21.tgz#868b7085378fc24e58c9aed14c8d62110a62be1a" @@ -5651,26 +5641,7 @@ estree-walker "^2.0.2" source-map-js "^1.0.2" -"@vue/compiler-core@3.4.8": - version "3.4.8" - resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.4.8.tgz#c6d96030692724f257751068e2997c9665244f0f" - integrity sha512-GjAwOydZV6UyVBi1lYW5v4jjfU6wOeyi3vBATKJOwV7muYF0/nZi4kfdJc0pwdT5lXwbbx57lyA2Y356rFpw1A== - dependencies: - "@babel/parser" "^7.23.6" - "@vue/shared" "3.4.8" - entities "^4.5.0" - estree-walker "^2.0.2" - source-map-js "^1.0.2" - -"@vue/compiler-dom@3.3.11": - version "3.3.11" - resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.3.11.tgz#36a76ea3a296d41bad133a6912cb0a847d969e4f" - integrity sha512-zoAiUIqSKqAJ81WhfPXYmFGwDRuO+loqLxvXmfUdR5fOitPoUiIeFI9cTTyv9MU5O1+ZZglJVTusWzy+wfk5hw== - dependencies: - "@vue/compiler-core" "3.3.11" - "@vue/shared" "3.3.11" - -"@vue/compiler-dom@3.4.21", "@vue/compiler-dom@^3.2.0", "@vue/compiler-dom@^3.3.4", "@vue/compiler-dom@^3.4.0": +"@vue/compiler-dom@3.4.21", "@vue/compiler-dom@^3.2.0", "@vue/compiler-dom@^3.3.4", "@vue/compiler-dom@^3.4.0", "@vue/compiler-dom@^3.4.21": version "3.4.21" resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz#0077c355e2008207283a5a87d510330d22546803" integrity sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA== @@ -5678,31 +5649,7 @@ "@vue/compiler-core" "3.4.21" "@vue/shared" "3.4.21" -"@vue/compiler-dom@3.4.8": - version "3.4.8" - resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.4.8.tgz#5acd8de409d3f623c80e81fbf22f2ce53eee6562" - integrity sha512-GsPyji42zmkSJlaDFKXvwB97ukTlHzlFH/iVzPFYz/APnSzuhu/CMFQbsYmrtsnc2yscF39eC4rKzvKR27aBug== - dependencies: - "@vue/compiler-core" "3.4.8" - "@vue/shared" "3.4.8" - -"@vue/compiler-sfc@3.3.11": - version "3.3.11" - resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.3.11.tgz#acfae240c875d067e0e2c9a4e2d910074408c73b" - integrity sha512-U4iqPlHO0KQeK1mrsxCN0vZzw43/lL8POxgpzcJweopmqtoYy9nljJzWDIQS3EfjiYhfdtdk9Gtgz7MRXnz3GA== - dependencies: - "@babel/parser" "^7.23.5" - "@vue/compiler-core" "3.3.11" - "@vue/compiler-dom" "3.3.11" - "@vue/compiler-ssr" "3.3.11" - "@vue/reactivity-transform" "3.3.11" - "@vue/shared" "3.3.11" - estree-walker "^2.0.2" - magic-string "^0.30.5" - postcss "^8.4.32" - source-map-js "^1.0.2" - -"@vue/compiler-sfc@3.4.21", "@vue/compiler-sfc@^3.2.0", "@vue/compiler-sfc@^3.3.11", "@vue/compiler-sfc@^3.4.13", "@vue/compiler-sfc@^3.4.15": +"@vue/compiler-sfc@3.4.21", "@vue/compiler-sfc@^3.2.0", "@vue/compiler-sfc@^3.3.11", "@vue/compiler-sfc@^3.4.13", "@vue/compiler-sfc@^3.4.15", "@vue/compiler-sfc@^3.4.21": version "3.4.21" resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz#4af920dc31ab99e1ff5d152b5fe0ad12181145b2" integrity sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ== @@ -5717,29 +5664,6 @@ postcss "^8.4.35" source-map-js "^1.0.2" -"@vue/compiler-sfc@3.4.8": - version "3.4.8" - resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.4.8.tgz#1e4b1d8786abcbb3da205e1c996b01f281a64d1b" - integrity sha512-3ZcurOa6bQdZ6VZLtMqYSUZqpsMqfX0MC3oCxQG0VIJFCqouZAgRYJN1c8QvGs7HW5wW8aXVvUOQU0ILVlYHKA== - dependencies: - "@babel/parser" "^7.23.6" - "@vue/compiler-core" "3.4.8" - "@vue/compiler-dom" "3.4.8" - "@vue/compiler-ssr" "3.4.8" - "@vue/shared" "3.4.8" - estree-walker "^2.0.2" - magic-string "^0.30.5" - postcss "^8.4.32" - source-map-js "^1.0.2" - -"@vue/compiler-ssr@3.3.11": - version "3.3.11" - resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.3.11.tgz#598942a73b64f2bd3f95908b104a7fbb55fc41a2" - integrity sha512-Zd66ZwMvndxRTgVPdo+muV4Rv9n9DwQ4SSgWWKWkPFebHQfVYRrVjeygmmDmPewsHyznCNvJ2P2d6iOOhdv8Qg== - dependencies: - "@vue/compiler-dom" "3.3.11" - "@vue/shared" "3.3.11" - "@vue/compiler-ssr@3.4.21": version "3.4.21" resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz#b84ae64fb9c265df21fc67f7624587673d324fef" @@ -5748,14 +5672,6 @@ "@vue/compiler-dom" "3.4.21" "@vue/shared" "3.4.21" -"@vue/compiler-ssr@3.4.8": - version "3.4.8" - resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.4.8.tgz#36a5611883672d451d4f2050db7c26ed1bb36071" - integrity sha512-nxN79LHeAemhBpIa2PQ6rz57cW7W4C/XIJCOMSn2g49u6q2ekirmJI0osAOTErQPApOR0KwP2QyeTexX4zQCrw== - dependencies: - "@vue/compiler-dom" "3.4.8" - "@vue/shared" "3.4.8" - "@vue/devtools-api@^6.5.1": version "6.6.1" resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.6.1.tgz#7c14346383751d9f6ad4bea0963245b30220ef83" @@ -5846,52 +5762,19 @@ path-browserify "^1.0.1" vue-template-compiler "^2.7.14" -"@vue/reactivity-transform@3.3.11": - version "3.3.11" - resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.3.11.tgz#2bd486f4eff60c8724309925618891e722fcfadc" - integrity sha512-fPGjH0wqJo68A0wQ1k158utDq/cRyZNlFoxGwNScE28aUFOKFEnCBsvyD8jHn+0kd0UKVpuGuaZEQ6r9FJRqCg== - dependencies: - "@babel/parser" "^7.23.5" - "@vue/compiler-core" "3.3.11" - "@vue/shared" "3.3.11" - estree-walker "^2.0.2" - magic-string "^0.30.5" - -"@vue/reactivity@3.3.11": - version "3.3.11" - resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.3.11.tgz#91f8e6c9ac60a595a5278c836b197628fd947a0d" - integrity sha512-D5tcw091f0nuu+hXq5XANofD0OXnBmaRqMYl5B3fCR+mX+cXJIGNw/VNawBqkjLNWETrFW0i+xH9NvDbTPVh7g== - dependencies: - "@vue/shared" "3.3.11" - -"@vue/reactivity@3.4.21": +"@vue/reactivity@3.4.21", "@vue/reactivity@^3.4.21": version "3.4.21" resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.4.21.tgz#affd3415115b8ebf4927c8d2a0d6a24bccfa9f02" integrity sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw== dependencies: "@vue/shared" "3.4.21" -"@vue/reactivity@3.4.8": - version "3.4.8" - resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.4.8.tgz#a4b9cd9e258d1d00bdd3ac381ca67a8120ae4cfb" - integrity sha512-UJYMQ3S2rqIGw9IvKomD4Xw2uS5VlcKEEmwcfboGOdrI79oqebxnCgTvXWLMClvg3M5SF0Cyn+9eDQoyGMLu9Q== - dependencies: - "@vue/shared" "3.4.8" - "@vue/repl@^2.8.0": version "2.9.0" resolved "https://registry.yarnpkg.com/@vue/repl/-/repl-2.9.0.tgz#bc87593357784669e1201bf4bff813e74730f90b" integrity sha512-6gfklmJoQel9hNG2zdoyz/6WxgSJqhIx76vUUkXxegriTgkdKjBkRcm3khsW8FTkwMLkY6+NHaQPQRY6l7ovaA== -"@vue/runtime-core@3.3.11": - version "3.3.11" - resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.3.11.tgz#63defba57bc54c1dac68a95b56c2633b1419193d" - integrity sha512-g9ztHGwEbS5RyWaOpXuyIVFTschclnwhqEbdy5AwGhYOgc7m/q3NFwr50MirZwTTzX55JY8pSkeib9BX04NIpw== - dependencies: - "@vue/reactivity" "3.3.11" - "@vue/shared" "3.3.11" - -"@vue/runtime-core@3.4.21": +"@vue/runtime-core@3.4.21", "@vue/runtime-core@^3.4.21": version "3.4.21" resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.4.21.tgz#3749c3f024a64c4c27ecd75aea4ca35634db0062" integrity sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA== @@ -5899,24 +5782,7 @@ "@vue/reactivity" "3.4.21" "@vue/shared" "3.4.21" -"@vue/runtime-core@3.4.8": - version "3.4.8" - resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.4.8.tgz#1df5001ee821b955be939c569e3f5528637b0dc9" - integrity sha512-sMRXOy89KnwY6fWG5epgPOsCWzpo/64FrA0QkjIeNeGnoA2YyZ6bBUxpFUyqhJ8VbrDhXEFH+6LHMOYrpzX/ZQ== - dependencies: - "@vue/reactivity" "3.4.8" - "@vue/shared" "3.4.8" - -"@vue/runtime-dom@3.3.11": - version "3.3.11" - resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.3.11.tgz#1146d8d280b0fec4d2e18c4a4c8f8121d0cecc09" - integrity sha512-OlhtV1PVpbgk+I2zl+Y5rQtDNcCDs12rsRg71XwaA2/Rbllw6mBLMi57VOn8G0AjOJ4Mdb4k56V37+g8ukShpQ== - dependencies: - "@vue/runtime-core" "3.3.11" - "@vue/shared" "3.3.11" - csstype "^3.1.2" - -"@vue/runtime-dom@3.4.21": +"@vue/runtime-dom@3.4.21", "@vue/runtime-dom@^3.4.21": version "3.4.21" resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz#91f867ef64eff232cac45095ab28ebc93ac74588" integrity sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw== @@ -5925,24 +5791,7 @@ "@vue/shared" "3.4.21" csstype "^3.1.3" -"@vue/runtime-dom@3.4.8": - version "3.4.8" - resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.4.8.tgz#4bc0a226df9311ea3b38f029941c6ef90ad0e71f" - integrity sha512-L4gZcYo8f3d7rQqQIHkPvyczkjjQ55cJqz2G0v6Ptmqa1mO2zkqN9F8lBT6aGPYy3hd0RDiINbs4jxhSvvy10Q== - dependencies: - "@vue/runtime-core" "3.4.8" - "@vue/shared" "3.4.8" - csstype "^3.1.3" - -"@vue/server-renderer@3.3.11": - version "3.3.11" - resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.3.11.tgz#409aed8031a125791e2143552975ecd1958ad601" - integrity sha512-AIWk0VwwxCAm4wqtJyxBylRTXSy1wCLOKbWxHaHiu14wjsNYtiRCSgVuqEPVuDpErOlRdNnuRgipQfXRLjLN5A== - dependencies: - "@vue/compiler-ssr" "3.3.11" - "@vue/shared" "3.3.11" - -"@vue/server-renderer@3.4.21": +"@vue/server-renderer@3.4.21", "@vue/server-renderer@^3.4.21": version "3.4.21" resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.4.21.tgz#150751579d26661ee3ed26a28604667fa4222a97" integrity sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg== @@ -5950,29 +5799,11 @@ "@vue/compiler-ssr" "3.4.21" "@vue/shared" "3.4.21" -"@vue/server-renderer@3.4.8": - version "3.4.8" - resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.4.8.tgz#5e6eb84a045dc4bfba74db3110e633083612fc4a" - integrity sha512-pBeHM59Owevr3P0Fl1XOjBmq4DTy5JDcjMG4NuzJEVDlZYzY8fHybx0wdjkY5lK5mCtUyBtw6Mz4d87aosc1Sw== - dependencies: - "@vue/compiler-ssr" "3.4.8" - "@vue/shared" "3.4.8" - -"@vue/shared@3.3.11": - version "3.3.11" - resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.3.11.tgz#f6a038e15237edefcc90dbfe7edb806dd355c7bd" - integrity sha512-u2G8ZQ9IhMWTMXaWqZycnK4UthG1fA238CD+DP4Dm4WJi5hdUKKLg0RMRaRpDPNMdkTwIDkp7WtD0Rd9BH9fLw== - "@vue/shared@3.4.21", "@vue/shared@^3.4.0", "@vue/shared@^3.4.21": version "3.4.21" resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.4.21.tgz#de526a9059d0a599f0b429af7037cd0c3ed7d5a1" integrity sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g== -"@vue/shared@3.4.8": - version "3.4.8" - resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.4.8.tgz#160687109233a1e4ad1b8fe1c4762f9019599fa8" - integrity sha512-ChLCWzXiJboQ009oVkemhEoUdrxHme7v3ip+Kh+/kDDeF1WtHWGt0knRLGm1Y4YqCRTSs9QxsZIY8paJj5Szrw== - "@vue/test-utils@^2.4.1": version "2.4.5" resolved "https://registry.yarnpkg.com/@vue/test-utils/-/test-utils-2.4.5.tgz#010aa4debe6602d83dc75f233b397092742105a2" @@ -7799,10 +7630,10 @@ clear@^0.1.0: resolved "https://registry.yarnpkg.com/clear/-/clear-0.1.0.tgz#b81b1e03437a716984fd7ac97c87d73bdfe7048a" integrity sha512-qMjRnoL+JDPJHeLePZJuao6+8orzHMGP04A8CdwCNsKhRbOnKRjefxONR7bwILT3MHecxKBjHkKL/tkZ8r4Uzw== -cleave.js@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/cleave.js/-/cleave.js-1.6.0.tgz#0e4e011943bdd70c67c9dcf4ff800ce710529171" - integrity sha512-ivqesy3j5hQVG3gywPfwKPbi/7ZSftY/UNp5uphnqjr25yI2CP8FS2ODQPzuLXXnNLi29e2+PgPkkiKUXLs/Nw== +cleave-zen@^0.0.17: + version "0.0.17" + resolved "https://registry.yarnpkg.com/cleave-zen/-/cleave-zen-0.0.17.tgz#c9ba1739531e24cb7cb522328a90c8e9f7b785d0" + integrity sha512-SLuad6RaACsONu3Fr4F3sE9YXxMlMv6AiaZ8qkwfdV9Ex+TJ+ip3rLFsdrqvnp0YGlslfzAfw8q8MwQJW3yHdg== cli-boxes@^1.0.0: version "1.0.0" @@ -8713,7 +8544,7 @@ cssstyle@^2.3.0: dependencies: cssom "~0.3.6" -csstype@^3.0.2, csstype@^3.1.2, csstype@^3.1.3: +csstype@^3.0.2, csstype@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== @@ -16690,7 +16521,7 @@ postcss@^7.0.14, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0. picocolors "^0.2.1" source-map "^0.6.1" -postcss@^8.2.1, postcss@^8.4.18, postcss@^8.4.23, postcss@^8.4.26, postcss@^8.4.27, postcss@^8.4.32, postcss@^8.4.33, postcss@^8.4.35, postcss@^8.4.36: +postcss@^8.2.1, postcss@^8.4.18, postcss@^8.4.23, postcss@^8.4.26, postcss@^8.4.27, postcss@^8.4.33, postcss@^8.4.35, postcss@^8.4.36: version "8.4.38" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== @@ -18828,7 +18659,7 @@ string-hash@^1.1.1: resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" integrity sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A== -"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -18846,6 +18677,15 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" @@ -18923,7 +18763,7 @@ stringify-object@3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -18951,6 +18791,13 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -20918,7 +20765,7 @@ vue-virtual-scroller@2.0.0-beta.8: vue-observe-visibility "^2.0.0-alpha.1" vue-resize "^2.0.0-alpha.1" -vue@*, vue@^3.0.0, vue@^3.4.21: +vue@*, vue@3.3.11, vue@3.4.8, vue@^3.0.0, vue@^3.4.21: version "3.4.21" resolved "https://registry.yarnpkg.com/vue/-/vue-3.4.21.tgz#69ec30e267d358ee3a0ce16612ba89e00aaeb731" integrity sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA== @@ -20929,28 +20776,6 @@ vue@*, vue@^3.0.0, vue@^3.4.21: "@vue/server-renderer" "3.4.21" "@vue/shared" "3.4.21" -vue@3.3.11: - version "3.3.11" - resolved "https://registry.yarnpkg.com/vue/-/vue-3.3.11.tgz#898d97025f73cdb5fc4e3ae3fd07a54615232140" - integrity sha512-d4oBctG92CRO1cQfVBZp6WJAs0n8AK4Xf5fNjQCBeKCvMI1efGQ5E3Alt1slFJS9fZuPcFoiAiqFvQlv1X7t/w== - dependencies: - "@vue/compiler-dom" "3.3.11" - "@vue/compiler-sfc" "3.3.11" - "@vue/runtime-dom" "3.3.11" - "@vue/server-renderer" "3.3.11" - "@vue/shared" "3.3.11" - -vue@3.4.8: - version "3.4.8" - resolved "https://registry.yarnpkg.com/vue/-/vue-3.4.8.tgz#a7a5b4692fe19deb211fdfe30509d9b68c8d909b" - integrity sha512-vJffFOe6DqWsAI10v3tDhb1nJrj7CF3CbdQwOznywAsFNoyvrQ1AWQdcIWJpmRpRnw7NFzstzh6fh4w7n1PNdg== - dependencies: - "@vue/compiler-dom" "3.4.8" - "@vue/compiler-sfc" "3.4.8" - "@vue/runtime-dom" "3.4.8" - "@vue/server-renderer" "3.4.8" - "@vue/shared" "3.4.8" - w3c-hr-time@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" @@ -21241,7 +21066,7 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -21268,6 +21093,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"