@leaflink/stash 53.4.0 → 53.4.2
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/dist/Accordion.js +1 -1
- package/dist/Accordion.js.map +1 -1
- package/dist/ActionsDropdown.js +2 -2
- package/dist/ActionsDropdown.js.map +1 -1
- package/dist/AddressSelect.js.map +1 -1
- package/dist/AddressSelect.vue.d.ts +1 -1
- package/dist/Alert.js.map +1 -1
- package/dist/AppNavigationItem.js +1 -1
- package/dist/AppNavigationItem.js.map +1 -1
- package/dist/AppSidebar.js.map +1 -1
- package/dist/AppTopbar.js +1 -1
- package/dist/AppTopbar.js.map +1 -1
- package/dist/Avatar.js.map +1 -1
- package/dist/Badge.js.map +1 -1
- package/dist/Box.vue_vue_type_script_setup_true_lang-dFFZN40_.js.map +1 -1
- package/dist/Button.js.map +1 -1
- package/dist/ButtonGroup.js.map +1 -1
- package/dist/Card.js.map +1 -1
- package/dist/CardHeader.js.map +1 -1
- package/dist/CardMedia.js.map +1 -1
- package/dist/Carousel.js +169 -169
- package/dist/Carousel.js.map +1 -1
- package/dist/Checkbox.js +31 -31
- package/dist/Checkbox.js.map +1 -1
- package/dist/ChevronToggle.vue_vue_type_script_setup_true_lang-Ce_qOXfR.js.map +1 -1
- package/dist/Chip.js +21 -21
- package/dist/Chip.js.map +1 -1
- package/dist/Chip.vue.d.ts +1 -1
- package/dist/ConfirmationCodeInput.js +1 -1
- package/dist/ConfirmationCodeInput.js.map +1 -1
- package/dist/ContextSwitcher.js +28 -28
- package/dist/ContextSwitcher.js.map +1 -1
- package/dist/Copy.js +1 -1
- package/dist/Copy.js.map +1 -1
- package/dist/CurrencyInput.js +1 -1
- package/dist/CurrencyInput.js.map +1 -1
- package/dist/DataView.js +51 -51
- package/dist/DataView.js.map +1 -1
- package/dist/DataViewFilters.js.map +1 -1
- package/dist/DataViewSortButton.js +2 -2
- package/dist/DataViewSortButton.js.map +1 -1
- package/dist/DataViewToolbar.js +5 -5
- package/dist/DataViewToolbar.js.map +1 -1
- package/dist/DatePicker.js +237 -237
- package/dist/DatePicker.js.map +1 -1
- package/dist/DatePicker.vue.d.ts +1 -1
- package/dist/DescriptionList.js.map +1 -1
- package/dist/DescriptionListDetail.js.map +1 -1
- package/dist/DescriptionListGroup.js.map +1 -1
- package/dist/DescriptionListTerm.js.map +1 -1
- package/dist/Dialog.js.map +1 -1
- package/dist/Divider.js.map +1 -1
- package/dist/Dropdown.js +45 -45
- package/dist/Dropdown.js.map +1 -1
- package/dist/EmptyState.js.map +1 -1
- package/dist/Expand.js +1 -1
- package/dist/Expand.vue_vue_type_script_setup_true_lang-BmNJA0Xy.js +74 -0
- package/dist/{Expand.vue_vue_type_script_setup_true_lang-CiONJfAp.js.map → Expand.vue_vue_type_script_setup_true_lang-BmNJA0Xy.js.map} +1 -1
- package/dist/Field.js +1 -1
- package/dist/{Field.vue_vue_type_script_setup_true_lang-dAGKfjf5.js → Field.vue_vue_type_script_setup_true_lang-D2I8xDEW.js} +29 -29
- package/dist/{Field.vue_vue_type_script_setup_true_lang-dAGKfjf5.js.map → Field.vue_vue_type_script_setup_true_lang-D2I8xDEW.js.map} +1 -1
- package/dist/FileUpload.js +54 -54
- package/dist/FileUpload.js.map +1 -1
- package/dist/FilterChip.js.map +1 -1
- package/dist/FilterChip.vue.d.ts +1 -1
- package/dist/FilterDrawerItem.js.map +1 -1
- package/dist/FilterDropdown.js.map +1 -1
- package/dist/FilterSelect.js +1 -1
- package/dist/FilterSelect.js.map +1 -1
- package/dist/Filters.js +4 -6
- package/dist/Filters.js.map +1 -1
- package/dist/Filters.vue.d.ts +57 -57
- package/dist/HttpError.js +6 -6
- package/dist/HttpError.js.map +1 -1
- package/dist/Icon.js.map +1 -1
- package/dist/IconLabel.js +13 -13
- package/dist/IconLabel.js.map +1 -1
- package/dist/Illustration.vue_vue_type_script_setup_true_lang-C1bPkWZZ.js.map +1 -1
- package/dist/Image.vue_vue_type_script_setup_true_lang-CAj0FH9h.js.map +1 -1
- package/dist/InlineEdit.js.map +1 -1
- package/dist/InlineEdit.vue.d.ts +1 -1
- package/dist/Input.js +35 -35
- package/dist/Input.js.map +1 -1
- package/dist/InputOptions.js +35 -35
- package/dist/InputOptions.js.map +1 -1
- package/dist/InputOptions.vue.d.ts +1 -1
- package/dist/IntegrationIcon.js.map +1 -1
- package/dist/Label.vue_vue_type_script_setup_true_lang-xwY3X-iV.js.map +1 -1
- package/dist/LicenseChip.js +9 -9
- package/dist/LicenseChip.js.map +1 -1
- package/dist/ListItem.js.map +1 -1
- package/dist/ListItemCell.js.map +1 -1
- package/dist/ListView.js +1 -1
- package/dist/ListView.js.map +1 -1
- package/dist/ListView.vue.d.ts +69 -69
- package/dist/Loading.js +2 -2
- package/dist/Loading.js.map +1 -1
- package/dist/Logo.js +1 -1
- package/dist/{Logo.vue_vue_type_script_setup_true_lang-DghNC_k6.js → Logo.vue_vue_type_script_setup_true_lang-qiNaaWWV.js} +17 -17
- package/dist/Logo.vue_vue_type_script_setup_true_lang-qiNaaWWV.js.map +1 -0
- package/dist/MenuItem.js.map +1 -1
- package/dist/Metric.js +12 -12
- package/dist/Metric.js.map +1 -1
- package/dist/Modal.js.map +1 -1
- package/dist/Modals.js.map +1 -1
- package/dist/Module.js.map +1 -1
- package/dist/ModuleContent.js.map +1 -1
- package/dist/ModuleFooter.js.map +1 -1
- package/dist/ModuleHeader.js.map +1 -1
- package/dist/MoreActions.js +2 -2
- package/dist/MoreActions.js.map +1 -1
- package/dist/ObfuscateText.js.map +1 -1
- package/dist/PageContent.js.map +1 -1
- package/dist/PageHeader.js.map +1 -1
- package/dist/PageNavigation.js +1 -1
- package/dist/PageNavigation.js.map +1 -1
- package/dist/Paginate.js.map +1 -1
- package/dist/PlaidLink.js.map +1 -1
- package/dist/QuickAction.js.map +1 -1
- package/dist/Radio.js.map +1 -1
- package/dist/RadioGroup.js +1 -1
- package/dist/RadioGroup.js.map +1 -1
- package/dist/RadioNew.js.map +1 -1
- package/dist/RangeInput.js.map +1 -1
- package/dist/SearchBar.js.map +1 -1
- package/dist/SearchBar.vue.d.ts +1 -1
- package/dist/SectionHeader.js.map +1 -1
- package/dist/Select.js +2 -2
- package/dist/Select.js.map +1 -1
- package/dist/Select.vue.d.ts +1 -1
- package/dist/SelectStatus.js.map +1 -1
- package/dist/SelectStatus.vue.d.ts +1 -1
- package/dist/Skeleton.js.map +1 -1
- package/dist/Step.js +8 -8
- package/dist/Step.js.map +1 -1
- package/dist/Stepper.js.map +1 -1
- package/dist/Switch.js +15 -15
- package/dist/Switch.js.map +1 -1
- package/dist/Tab.js +1 -1
- package/dist/Tab.js.map +1 -1
- package/dist/TabPanel.js.map +1 -1
- package/dist/Table.js.map +1 -1
- package/dist/TableCell.js.map +1 -1
- package/dist/TableHeaderCell.js.map +1 -1
- package/dist/TableHeaderRow.js.map +1 -1
- package/dist/TableRow.js +18 -18
- package/dist/TableRow.js.map +1 -1
- package/dist/Tabs.js +2 -2
- package/dist/{Tabs.vue_vue_type_script_setup_true_lang-BFURXY_-.js → Tabs.vue_vue_type_script_setup_true_lang-B3FBaVP5.js} +48 -48
- package/dist/{Tabs.vue_vue_type_script_setup_true_lang-BFURXY_-.js.map → Tabs.vue_vue_type_script_setup_true_lang-B3FBaVP5.js.map} +1 -1
- package/dist/TextEditor.js +1 -1
- package/dist/TextEditor.js.map +1 -1
- package/dist/TextEditor.vue.d.ts +1 -1
- package/dist/Textarea.js +1 -1
- package/dist/Textarea.js.map +1 -1
- package/dist/Thumbnail.js +33 -33
- package/dist/Thumbnail.js.map +1 -1
- package/dist/Thumbnail.vue.d.ts +3 -3
- package/dist/ThumbnailEmpty.js.map +1 -1
- package/dist/ThumbnailGroup.js.map +1 -1
- package/dist/Timeline.js.map +1 -1
- package/dist/TimelineItem.js.map +1 -1
- package/dist/Toast.js +27 -27
- package/dist/Toast.js.map +1 -1
- package/dist/Toasts.js.map +1 -1
- package/dist/Tooltip.js +1 -1
- package/dist/{Tooltip.vue_vue_type_script_setup_true_lang-CF6sw2VC.js → Tooltip.vue_vue_type_script_setup_true_lang-WMPMxzO-.js} +13 -16
- package/dist/Tooltip.vue_vue_type_script_setup_true_lang-WMPMxzO-.js.map +1 -0
- package/dist/components.css +1 -1
- package/dist/directives/tooltip.js.map +1 -1
- package/dist/floating-ui.vue-CuGrC-z8.js.map +1 -1
- package/dist/index-B1Gkwuxd.js.map +1 -1
- package/dist/index-D6bxWkZ1.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +4 -3
- package/dist/Expand.vue_vue_type_script_setup_true_lang-CiONJfAp.js +0 -74
- package/dist/Logo.vue_vue_type_script_setup_true_lang-DghNC_k6.js.map +0 -1
- package/dist/Tooltip.vue_vue_type_script_setup_true_lang-CF6sw2VC.js.map +0 -1
|
@@ -24,7 +24,7 @@ const S = { class: "mb-3 flex gap-6" }, U = ["value", "onInput"], j = {
|
|
|
24
24
|
emits: ["update:model-value", "change", "focus", "blur"],
|
|
25
25
|
setup(b, { emit: k }) {
|
|
26
26
|
v((e) => ({
|
|
27
|
-
|
|
27
|
+
v18a4a680: e.digitCount
|
|
28
28
|
}));
|
|
29
29
|
const c = E(), o = b, i = k, s = V([]);
|
|
30
30
|
B(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfirmationCodeInput.js","sources":["../src/components/ConfirmationCodeInput/ConfirmationCodeInput.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { onMounted, Ref, ref, useCssModule, watch } from 'vue';\n\n const classes = useCssModule();\n\n export interface VerificationCodeInputProps {\n digitCount?: number;\n /**\n * Error text to display.\n */\n errorText?: string;\n /**\n * Success text to display.\n */\n successText?: string;\n /**\n * Hint text to display.\n */\n hintText?: string;\n /**\n * One time password/code\n */\n modelValue?: string;\n }\n\n const props = withDefaults(defineProps<VerificationCodeInputProps>(), {\n digitCount: 6,\n errorText: undefined,\n successText: undefined,\n hintText: undefined,\n modelValue: undefined,\n });\n\n const emit = defineEmits<{\n (e: 'update:model-value', value: string | null): void;\n (e: 'change', params: { originalEvent: Event; value: string | null }): void;\n (e: 'focus', params: Event): void;\n (e: 'blur', params: Event): void;\n }>();\n\n const data: Ref<Array<string>> = ref([]);\n\n onMounted(() => {\n if (props.modelValue) {\n data.value = props.modelValue?.split('');\n }\n });\n\n function handleInput(event: InputEvent, index) {\n data.value[index] = event.target?.['value'];\n updateModel(event);\n\n if (event.inputType === 'deleteContentBackward') {\n moveToPrev(event);\n } else if (event.inputType === 'insertText' || event.inputType === 'deleteContentForward') {\n moveToNext(event);\n }\n }\n\n function updateModel(event: Event) {\n const newValue = data.value.join('');\n emit('update:model-value', newValue);\n emit('change', { originalEvent: event, value: newValue });\n }\n\n function moveToPrev(event: InputEvent | KeyboardEvent) {\n const prevInput: HTMLInputElement = findPrevInput(event.target as HTMLInputElement);\n\n if (prevInput) {\n prevInput.focus();\n prevInput.select();\n }\n }\n\n function moveToNext(event: InputEvent | KeyboardEvent) {\n const nextInput: HTMLInputElement = findNextInput(event.target as HTMLInputElement);\n\n if (nextInput) {\n nextInput.focus();\n nextInput.select();\n }\n }\n\n function findPrevInput(element: HTMLInputElement) {\n const prevElement = element.previousElementSibling;\n\n if (!prevElement) return;\n\n return prevElement.nodeName === 'INPUT' ? prevElement : findPrevInput(prevElement as HTMLInputElement);\n }\n\n function findNextInput(element: HTMLInputElement) {\n const nextElement = element.nextElementSibling;\n\n if (!nextElement) return;\n\n return nextElement.nodeName === 'INPUT' ? nextElement : findNextInput(nextElement as HTMLInputElement);\n }\n\n function handleFocus(event) {\n event.target.select();\n emit('focus', event);\n }\n\n function handleBlur(event: Event) {\n emit('blur', event);\n }\n\n function handleKeyDown(event: KeyboardEvent) {\n if (event.ctrlKey || event.metaKey) {\n return;\n }\n\n switch (event.code) {\n case 'ArrowLeft':\n moveToPrev(event);\n event.preventDefault();\n break;\n\n case 'ArrowUp':\n case 'ArrowDown':\n event.preventDefault();\n break;\n\n case 'Backspace':\n if (event.target?.['value'].length === 0) {\n moveToPrev(event);\n event.preventDefault();\n }\n break;\n\n case 'ArrowRight':\n moveToNext(event);\n event.preventDefault();\n\n break;\n\n case 'Enter':\n case 'NumpadEnter':\n case 'Tab':\n break;\n\n default:\n if (\n !(event.code !== 'Space' && Number(event.key) >= 0 && Number(event.key) <= 9) ||\n (data.value.join('').length >= props.digitCount && event.code !== 'Delete')\n ) {\n event.preventDefault();\n }\n\n break;\n }\n }\n\n function handlePaste(event: ClipboardEvent) {\n const paste = event.clipboardData?.getData('text');\n\n if (paste?.length) {\n const pastedCode = paste?.substring(0, props.digitCount);\n\n const parsed = parseInt(pastedCode);\n\n if (!isNaN(parsed)) {\n data.value = pastedCode.split('');\n updateModel(event);\n }\n }\n\n event.preventDefault();\n }\n\n watch(\n () => props.modelValue,\n (newValue) => {\n data.value = newValue ? newValue.split('') : new Array(props.digitCount);\n },\n );\n</script>\n\n<template>\n <div\n class=\"stash-confirmation-code-input inline-block\"\n data-test=\"stash-confirmation-code-input\"\n :class=\"[classes['stash-confirmation-code-input-container']]\"\n >\n <div class=\"mb-3 flex gap-6\">\n <template v-for=\"field in props.digitCount\" :key=\"field\">\n <input\n data-test=\"stash-confirmation-code-input__otp\"\n class=\"border bg-white p-2 text-center text-base font-medium text-ice-900 focus:border-blue-500\"\n :class=\"[\n classes['otp-code-input'],\n { [classes['has-error']]: !!props.errorText },\n { [classes['has-success']]: !!props.successText },\n ]\"\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"1\"\n :value=\"data[field - 1]\"\n pattern=\"[0-9]\"\n autocomplete=\"one-time-code\"\n @input=\"handleInput($event as InputEvent, field - 1)\"\n @keydown=\"handleKeyDown\"\n @paste=\"handlePaste\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n />\n </template>\n </div>\n <small\n v-if=\"props.errorText\"\n class=\"mt-1 block whitespace-pre-line pr-6 text-center text-red-500\"\n data-test=\"field-error\"\n >\n {{ props.errorText }}\n </small>\n <small\n v-if=\"props.successText\"\n class=\"mt-1 block whitespace-pre-line pr-6 text-center text-green-500\"\n data-test=\"field-success\"\n >\n {{ props.successText }}\n </small>\n <small\n v-if=\"props.hintText\"\n class=\"mt-1 block whitespace-pre-line pr-6 text-center text-ice-700\"\n data-test=\"field-hint\"\n >\n {{ props.hintText }}\n </small>\n </div>\n</template>\n\n<style module>\n @layer utilities {\n .stash-confirmation-code-input-container {\n --otp-digits: v-bind(digitCount);\n --otp-container-width: calc(var(--otp-digits) * 60px);\n\n width: var(--otp-container-width);\n }\n\n .otp-code-input {\n border-radius: 4px;\n caret-color: transparent;\n height: 36px;\n width: 36px;\n }\n\n .otp-code-input.has-error:not(:focus) {\n border-color: var(--color-red-500);\n }\n\n .otp-code-input.has-success:not(:focus) {\n border-color: var(--color-green-500);\n }\n\n .otp-code-input:focus {\n box-shadow: 0 0 0 3px rgb(0 114 240 / 15%);\n outline: none;\n }\n }\n</style>\n"],"names":["classes","useCssModule","props","__props","emit","__emit","data","ref","onMounted","_a","handleInput","event","index","updateModel","moveToPrev","moveToNext","newValue","prevInput","findPrevInput","nextInput","findNextInput","element","prevElement","nextElement","handleFocus","handleBlur","handleKeyDown","handlePaste","paste","pastedCode","parsed","watch"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ConfirmationCodeInput.js","sources":["../src/components/ConfirmationCodeInput/ConfirmationCodeInput.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { onMounted, Ref, ref, useCssModule, watch } from 'vue';\n\n const classes = useCssModule();\n\n export interface VerificationCodeInputProps {\n digitCount?: number;\n /**\n * Error text to display.\n */\n errorText?: string;\n /**\n * Success text to display.\n */\n successText?: string;\n /**\n * Hint text to display.\n */\n hintText?: string;\n /**\n * One time password/code\n */\n modelValue?: string;\n }\n\n const props = withDefaults(defineProps<VerificationCodeInputProps>(), {\n digitCount: 6,\n errorText: undefined,\n successText: undefined,\n hintText: undefined,\n modelValue: undefined,\n });\n\n const emit = defineEmits<{\n (e: 'update:model-value', value: string | null): void;\n (e: 'change', params: { originalEvent: Event; value: string | null }): void;\n (e: 'focus', params: Event): void;\n (e: 'blur', params: Event): void;\n }>();\n\n const data: Ref<Array<string>> = ref([]);\n\n onMounted(() => {\n if (props.modelValue) {\n data.value = props.modelValue?.split('');\n }\n });\n\n function handleInput(event: InputEvent, index) {\n data.value[index] = event.target?.['value'];\n updateModel(event);\n\n if (event.inputType === 'deleteContentBackward') {\n moveToPrev(event);\n } else if (event.inputType === 'insertText' || event.inputType === 'deleteContentForward') {\n moveToNext(event);\n }\n }\n\n function updateModel(event: Event) {\n const newValue = data.value.join('');\n emit('update:model-value', newValue);\n emit('change', { originalEvent: event, value: newValue });\n }\n\n function moveToPrev(event: InputEvent | KeyboardEvent) {\n const prevInput: HTMLInputElement = findPrevInput(event.target as HTMLInputElement);\n\n if (prevInput) {\n prevInput.focus();\n prevInput.select();\n }\n }\n\n function moveToNext(event: InputEvent | KeyboardEvent) {\n const nextInput: HTMLInputElement = findNextInput(event.target as HTMLInputElement);\n\n if (nextInput) {\n nextInput.focus();\n nextInput.select();\n }\n }\n\n function findPrevInput(element: HTMLInputElement) {\n const prevElement = element.previousElementSibling;\n\n if (!prevElement) return;\n\n return prevElement.nodeName === 'INPUT' ? prevElement : findPrevInput(prevElement as HTMLInputElement);\n }\n\n function findNextInput(element: HTMLInputElement) {\n const nextElement = element.nextElementSibling;\n\n if (!nextElement) return;\n\n return nextElement.nodeName === 'INPUT' ? nextElement : findNextInput(nextElement as HTMLInputElement);\n }\n\n function handleFocus(event) {\n event.target.select();\n emit('focus', event);\n }\n\n function handleBlur(event: Event) {\n emit('blur', event);\n }\n\n function handleKeyDown(event: KeyboardEvent) {\n if (event.ctrlKey || event.metaKey) {\n return;\n }\n\n switch (event.code) {\n case 'ArrowLeft':\n moveToPrev(event);\n event.preventDefault();\n break;\n\n case 'ArrowUp':\n case 'ArrowDown':\n event.preventDefault();\n break;\n\n case 'Backspace':\n if (event.target?.['value'].length === 0) {\n moveToPrev(event);\n event.preventDefault();\n }\n break;\n\n case 'ArrowRight':\n moveToNext(event);\n event.preventDefault();\n\n break;\n\n case 'Enter':\n case 'NumpadEnter':\n case 'Tab':\n break;\n\n default:\n if (\n !(event.code !== 'Space' && Number(event.key) >= 0 && Number(event.key) <= 9) ||\n (data.value.join('').length >= props.digitCount && event.code !== 'Delete')\n ) {\n event.preventDefault();\n }\n\n break;\n }\n }\n\n function handlePaste(event: ClipboardEvent) {\n const paste = event.clipboardData?.getData('text');\n\n if (paste?.length) {\n const pastedCode = paste?.substring(0, props.digitCount);\n\n const parsed = parseInt(pastedCode);\n\n if (!isNaN(parsed)) {\n data.value = pastedCode.split('');\n updateModel(event);\n }\n }\n\n event.preventDefault();\n }\n\n watch(\n () => props.modelValue,\n (newValue) => {\n data.value = newValue ? newValue.split('') : new Array(props.digitCount);\n },\n );\n</script>\n\n<template>\n <div\n class=\"stash-confirmation-code-input inline-block\"\n data-test=\"stash-confirmation-code-input\"\n :class=\"[classes['stash-confirmation-code-input-container']]\"\n >\n <div class=\"mb-3 flex gap-6\">\n <template v-for=\"field in props.digitCount\" :key=\"field\">\n <input\n data-test=\"stash-confirmation-code-input__otp\"\n class=\"border bg-white p-2 text-center text-base font-medium text-ice-900 focus:border-blue-500\"\n :class=\"[\n classes['otp-code-input'],\n { [classes['has-error']]: !!props.errorText },\n { [classes['has-success']]: !!props.successText },\n ]\"\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"1\"\n :value=\"data[field - 1]\"\n pattern=\"[0-9]\"\n autocomplete=\"one-time-code\"\n @input=\"handleInput($event as InputEvent, field - 1)\"\n @keydown=\"handleKeyDown\"\n @paste=\"handlePaste\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n />\n </template>\n </div>\n <small\n v-if=\"props.errorText\"\n class=\"mt-1 block whitespace-pre-line pr-6 text-center text-red-500\"\n data-test=\"field-error\"\n >\n {{ props.errorText }}\n </small>\n <small\n v-if=\"props.successText\"\n class=\"mt-1 block whitespace-pre-line pr-6 text-center text-green-500\"\n data-test=\"field-success\"\n >\n {{ props.successText }}\n </small>\n <small\n v-if=\"props.hintText\"\n class=\"mt-1 block whitespace-pre-line pr-6 text-center text-ice-700\"\n data-test=\"field-hint\"\n >\n {{ props.hintText }}\n </small>\n </div>\n</template>\n\n<style module>\n @layer utilities {\n .stash-confirmation-code-input-container {\n --otp-digits: v-bind(digitCount);\n --otp-container-width: calc(var(--otp-digits) * 60px);\n\n width: var(--otp-container-width);\n }\n\n .otp-code-input {\n border-radius: 4px;\n caret-color: transparent;\n height: 36px;\n width: 36px;\n }\n\n .otp-code-input.has-error:not(:focus) {\n border-color: var(--color-red-500);\n }\n\n .otp-code-input.has-success:not(:focus) {\n border-color: var(--color-green-500);\n }\n\n .otp-code-input:focus {\n box-shadow: 0 0 0 3px rgb(0 114 240 / 15%);\n outline: none;\n }\n }\n</style>\n"],"names":["classes","useCssModule","props","__props","emit","__emit","data","ref","onMounted","_a","handleInput","event","index","updateModel","moveToPrev","moveToNext","newValue","prevInput","findPrevInput","nextInput","findNextInput","element","prevElement","nextElement","handleFocus","handleBlur","handleKeyDown","handlePaste","paste","pastedCode","parsed","watch","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_hoisted_1","_openBlock","_Fragment","_renderList","field","$event","_hoisted_3","_toDisplayString","_hoisted_4","_hoisted_5"],"mappings":"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"}
|
package/dist/ContextSwitcher.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { defineComponent as
|
|
2
|
-
import { APPS as
|
|
1
|
+
import { defineComponent as x, computed as C, resolveComponent as g, createElementBlock as l, openBlock as a, Fragment as f, renderList as _, createBlock as E, normalizeClass as h, toDisplayString as A, withCtx as S, createTextVNode as b } from "vue";
|
|
2
|
+
import { APPS as r } from "./constants.js";
|
|
3
3
|
import { setPersistentItem as T, getPersistentItem as v, removePersistentItem as R } from "./utils/storage.js";
|
|
4
4
|
const N = {
|
|
5
5
|
class: "stash-context-switcher mx-auto flex w-64 rounded-full border border-white/10 bg-purple-700 p-1.5 text-center",
|
|
6
6
|
"data-test": "stash-context-switcher"
|
|
7
|
-
}, B = ["href", "onClick"],
|
|
7
|
+
}, B = ["href", "onClick"], y = "-last-session", L = /* @__PURE__ */ x({
|
|
8
8
|
name: "ll-context-switcher",
|
|
9
9
|
__name: "ContextSwitcher",
|
|
10
10
|
props: {
|
|
@@ -17,52 +17,52 @@ const N = {
|
|
|
17
17
|
routeQuery: { default: () => ({}) }
|
|
18
18
|
},
|
|
19
19
|
emits: ["click", "switch"],
|
|
20
|
-
setup(
|
|
21
|
-
const t =
|
|
20
|
+
setup(i, { emit: w }) {
|
|
21
|
+
const t = i, m = w, P = C(() => [
|
|
22
22
|
{
|
|
23
|
-
app:
|
|
23
|
+
app: r.MARKETPLACE,
|
|
24
24
|
name: t.portalAccess.commercePortal ? "dashboard" : t.limitedAccessUrl,
|
|
25
25
|
hasBaseRoute: t.portalAccess.commercePortal
|
|
26
26
|
},
|
|
27
27
|
{
|
|
28
|
-
app:
|
|
28
|
+
app: r.PAYMENTS,
|
|
29
29
|
name: t.portalAccess.paymentsPortal ? "payments" : t.limitedAccessUrl,
|
|
30
30
|
hasBaseRoute: !1
|
|
31
31
|
}
|
|
32
32
|
]);
|
|
33
|
-
function
|
|
33
|
+
function u(s, n) {
|
|
34
34
|
if (n === t.activeApp)
|
|
35
35
|
return;
|
|
36
|
-
const
|
|
37
|
-
let e =
|
|
36
|
+
const o = window.location.href;
|
|
37
|
+
let e = s.target.href;
|
|
38
38
|
if (t.portalAccess.paymentsPortal && t.portalAccess.commercePortal) {
|
|
39
|
-
const k = `${n ===
|
|
40
|
-
T(k,
|
|
41
|
-
const
|
|
42
|
-
|
|
39
|
+
const k = `${n === r.PAYMENTS ? r.MARKETPLACE : r.PAYMENTS}${y}`, d = `${n}${y}`;
|
|
40
|
+
T(k, o, { global: !0 });
|
|
41
|
+
const p = v(d, { global: !0 });
|
|
42
|
+
p && (s.preventDefault(), e = p, window.location.href = p, R(d, { global: !0 }));
|
|
43
43
|
}
|
|
44
|
-
|
|
44
|
+
m("click", { from: o, to: e }), m("switch", s, { from: o, to: e });
|
|
45
45
|
}
|
|
46
|
-
return (
|
|
47
|
-
const
|
|
48
|
-
return
|
|
49
|
-
(
|
|
46
|
+
return (s, n) => {
|
|
47
|
+
const o = g("router-link");
|
|
48
|
+
return a(), l("div", N, [
|
|
49
|
+
(a(!0), l(f, null, _(P.value, (e) => (a(), l(f, {
|
|
50
50
|
key: e.app
|
|
51
51
|
}, [
|
|
52
|
-
e.hasBaseRoute ? (
|
|
52
|
+
e.hasBaseRoute ? (a(), l("a", {
|
|
53
53
|
key: 0,
|
|
54
|
-
class:
|
|
54
|
+
class: h(["w-1/2 cursor-pointer rounded-full py-2.5 font-semibold !capitalize leading-none !no-underline", t.activeApp === e.app ? "text-white bg-royal-500" : "text-ice-500"]),
|
|
55
55
|
href: `/${e.name}`,
|
|
56
|
-
onClick: (c) =>
|
|
57
|
-
},
|
|
56
|
+
onClick: (c) => u(c, e.app)
|
|
57
|
+
}, A(e.app), 11, B)) : (a(), E(o, {
|
|
58
58
|
key: 1,
|
|
59
|
-
class:
|
|
60
|
-
to: { name: e.name, query:
|
|
61
|
-
"data-test-route": JSON.stringify({ name: e.name, query:
|
|
62
|
-
onClick: (c) =>
|
|
59
|
+
class: h(["w-1/2 cursor-pointer rounded-full py-2.5 font-semibold !capitalize leading-none !no-underline", t.activeApp === e.app ? "text-white bg-royal-500" : "text-ice-500"]),
|
|
60
|
+
to: { name: e.name, query: i.routeQuery },
|
|
61
|
+
"data-test-route": JSON.stringify({ name: e.name, query: i.routeQuery }),
|
|
62
|
+
onClick: (c) => u(c, e.app)
|
|
63
63
|
}, {
|
|
64
64
|
default: S(() => [
|
|
65
|
-
b(
|
|
65
|
+
b(A(e.app), 1)
|
|
66
66
|
]),
|
|
67
67
|
_: 2
|
|
68
68
|
}, 1032, ["class", "to", "data-test-route", "onClick"]))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextSwitcher.js","sources":["../src/components/ContextSwitcher/ContextSwitcher.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { computed } from 'vue';\n import type { LocationQuery } from 'vue-router';\n\n import { APPS } from '../../constants';\n import { getPersistentItem, removePersistentItem, setPersistentItem } from '../../utils/storage';\n\n defineOptions({\n name: 'll-context-switcher',\n });\n\n type AppValues = (typeof APPS)[keyof typeof APPS];\n\n export interface ContextSwitcherProps {\n /**\n * The current app that is active. Choices are 'marketplace' | 'payments'.\n */\n activeApp: AppValues;\n\n /**\n * Portal access to both marketplace and payments.\n */\n portalAccess?: {\n commercePortal: boolean;\n paymentsPortal: boolean;\n };\n\n /**\n * Url to replace the other app if current user does not have portal access.\n */\n limitedAccessUrl: string;\n\n routeQuery?: LocationQuery;\n }\n\n const props = withDefaults(defineProps<ContextSwitcherProps>(), {\n portalAccess: () => ({\n commercePortal: false,\n paymentsPortal: false,\n }),\n routeQuery: () => ({}),\n });\n\n const emit = defineEmits<{\n /**\n * Fires on click of the context switcher.\n * @deprecated Use `switch` instead.\n */\n (e: 'click', urlInfo: { from: string; to: string }): void;\n /**\n * Fires on click of the context switcher.\n */\n (e: 'switch', evt: MouseEvent, urlInfo: { from: string; to: string }): void;\n }>();\n\n interface ContextItem {\n app: AppValues;\n name: string;\n hasBaseRoute: boolean;\n }\n\n const CONTEXT_SWITCHER_STORAGE_KEY = '-last-session';\n\n const routes = computed<ContextItem[]>(() => {\n return [\n {\n app: APPS.MARKETPLACE,\n name: props.portalAccess.commercePortal ? 'dashboard' : props.limitedAccessUrl,\n hasBaseRoute: props.portalAccess.commercePortal,\n },\n {\n app: APPS.PAYMENTS,\n name: props.portalAccess.paymentsPortal ? 'payments' : props.limitedAccessUrl,\n hasBaseRoute: false,\n },\n ];\n });\n\n /**\n * Saves the current url in local storage before leaving the current app, if user has access to both apps\n * If a previous session url exists, redirect users there instead then remove the local storage item afterward.\n *\n * @param event - Event from user click.\n * @param app - App name of the clicked link, is a key of `APPS`.\n */\n function handleClick(event: MouseEvent, app: AppValues) {\n if (app === props.activeApp) {\n return;\n }\n\n const currentLocation = window.location.href;\n let destination = (event.target as HTMLAnchorElement).href;\n\n if (props.portalAccess.paymentsPortal && props.portalAccess.commercePortal) {\n const appRoute = app === APPS.PAYMENTS ? APPS.MARKETPLACE : APPS.PAYMENTS;\n const currentSessionName = `${appRoute}${CONTEXT_SWITCHER_STORAGE_KEY}`;\n const prevSessionName = `${app}${CONTEXT_SWITCHER_STORAGE_KEY}`;\n\n // save the current url in local storage\n setPersistentItem(currentSessionName, currentLocation, { global: true });\n\n // get the other app's url from local storage\n const prevSessionUrl = getPersistentItem(prevSessionName, { global: true });\n\n // if it exists, redirect users to such location and remove the item from local storage\n if (prevSessionUrl) {\n event.preventDefault();\n destination = prevSessionUrl;\n window.location.href = prevSessionUrl;\n removePersistentItem(prevSessionName, { global: true });\n }\n }\n\n emit('click', { from: currentLocation, to: destination });\n emit('switch', event, { from: currentLocation, to: destination });\n }\n</script>\n\n<template>\n <div\n class=\"stash-context-switcher mx-auto flex w-64 rounded-full border border-white/10 bg-purple-700 p-1.5 text-center\"\n data-test=\"stash-context-switcher\"\n >\n <template v-for=\"route in routes\" :key=\"route.app\">\n <!-- render anchor tag to override base route in Payments -->\n <a\n v-if=\"route.hasBaseRoute\"\n class=\"w-1/2 cursor-pointer rounded-full py-2.5 font-semibold !capitalize leading-none !no-underline\"\n :class=\"props.activeApp === route.app ? 'text-white bg-royal-500' : 'text-ice-500'\"\n :href=\"`/${route.name}`\"\n @click=\"(evt) => handleClick(evt, route.app)\"\n >\n {{ route.app }}\n </a>\n\n <router-link\n v-else\n class=\"w-1/2 cursor-pointer rounded-full py-2.5 font-semibold !capitalize leading-none !no-underline\"\n :class=\"props.activeApp === route.app ? 'text-white bg-royal-500' : 'text-ice-500'\"\n :to=\"{ name: route.name, query: routeQuery }\"\n :data-test-route=\"JSON.stringify({ name: route.name, query: routeQuery })\"\n @click=\"(evt) => handleClick(evt, route.app)\"\n >\n {{ route.app }}\n </router-link>\n </template>\n </div>\n</template>\n"],"names":["CONTEXT_SWITCHER_STORAGE_KEY","props","__props","emit","__emit","routes","computed","APPS","handleClick","event","app","currentLocation","destination","currentSessionName","prevSessionName","setPersistentItem","prevSessionUrl","getPersistentItem","removePersistentItem"],"mappings":";;;;;;4BA6DQA,IAA+B;;;;;;;;;;;;;;AA1BrC,UAAMC,IAAQC,GAQRC,IAAOC,GAoBPC,IAASC,EAAwB,MAC9B;AAAA,MACL;AAAA,QACE,KAAKC,EAAK;AAAA,QACV,MAAMN,EAAM,aAAa,iBAAiB,cAAcA,EAAM;AAAA,QAC9D,cAAcA,EAAM,aAAa;AAAA,MAAA;AAAA,MAEnC;AAAA,QACE,KAAKM,EAAK;AAAA,QACV,MAAMN,EAAM,aAAa,iBAAiB,aAAaA,EAAM;AAAA,QAC7D,cAAc;AAAA,MAAA;AAAA,IAChB,CAEH;AASD,aAASO,EAAYC,GAAmBC,GAAgB;AACtD,UAAIA,MAAQT,EAAM;AAChB;AAGF,YAAMU,IAAkB,OAAO,SAAS;AACxC,UAAIC,IAAeH,EAAM,OAA6B;AAEtD,UAAIR,EAAM,aAAa,kBAAkBA,EAAM,aAAa,gBAAgB;AAE1E,cAAMY,IAAqB,GADVH,MAAQH,EAAK,WAAWA,EAAK,cAAcA,EAAK,QAC3B,GAAGP,CAA4B,IAC/Dc,IAAkB,GAAGJ,CAAG,GAAGV,CAA4B;AAG7D,QAAAe,EAAkBF,GAAoBF,GAAiB,EAAE,QAAQ,IAAM;AAGvE,cAAMK,IAAiBC,EAAkBH,GAAiB,EAAE,QAAQ,IAAM;AAG1E,QAAIE,MACFP,EAAM,eAAA,GACNG,IAAcI,GACd,OAAO,SAAS,OAAOA,GACvBE,EAAqBJ,GAAiB,EAAE,QAAQ,GAAA,CAAM;AAAA,MAE1D;AAEA,MAAAX,EAAK,SAAS,EAAE,MAAMQ,GAAiB,IAAIC,GAAa,GACxDT,EAAK,UAAUM,GAAO,EAAE,MAAME,GAAiB,IAAIC,GAAa;AAAA,IAClE
|
|
1
|
+
{"version":3,"file":"ContextSwitcher.js","sources":["../src/components/ContextSwitcher/ContextSwitcher.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { computed } from 'vue';\n import type { LocationQuery } from 'vue-router';\n\n import { APPS } from '../../constants';\n import { getPersistentItem, removePersistentItem, setPersistentItem } from '../../utils/storage';\n\n defineOptions({\n name: 'll-context-switcher',\n });\n\n type AppValues = (typeof APPS)[keyof typeof APPS];\n\n export interface ContextSwitcherProps {\n /**\n * The current app that is active. Choices are 'marketplace' | 'payments'.\n */\n activeApp: AppValues;\n\n /**\n * Portal access to both marketplace and payments.\n */\n portalAccess?: {\n commercePortal: boolean;\n paymentsPortal: boolean;\n };\n\n /**\n * Url to replace the other app if current user does not have portal access.\n */\n limitedAccessUrl: string;\n\n routeQuery?: LocationQuery;\n }\n\n const props = withDefaults(defineProps<ContextSwitcherProps>(), {\n portalAccess: () => ({\n commercePortal: false,\n paymentsPortal: false,\n }),\n routeQuery: () => ({}),\n });\n\n const emit = defineEmits<{\n /**\n * Fires on click of the context switcher.\n * @deprecated Use `switch` instead.\n */\n (e: 'click', urlInfo: { from: string; to: string }): void;\n /**\n * Fires on click of the context switcher.\n */\n (e: 'switch', evt: MouseEvent, urlInfo: { from: string; to: string }): void;\n }>();\n\n interface ContextItem {\n app: AppValues;\n name: string;\n hasBaseRoute: boolean;\n }\n\n const CONTEXT_SWITCHER_STORAGE_KEY = '-last-session';\n\n const routes = computed<ContextItem[]>(() => {\n return [\n {\n app: APPS.MARKETPLACE,\n name: props.portalAccess.commercePortal ? 'dashboard' : props.limitedAccessUrl,\n hasBaseRoute: props.portalAccess.commercePortal,\n },\n {\n app: APPS.PAYMENTS,\n name: props.portalAccess.paymentsPortal ? 'payments' : props.limitedAccessUrl,\n hasBaseRoute: false,\n },\n ];\n });\n\n /**\n * Saves the current url in local storage before leaving the current app, if user has access to both apps\n * If a previous session url exists, redirect users there instead then remove the local storage item afterward.\n *\n * @param event - Event from user click.\n * @param app - App name of the clicked link, is a key of `APPS`.\n */\n function handleClick(event: MouseEvent, app: AppValues) {\n if (app === props.activeApp) {\n return;\n }\n\n const currentLocation = window.location.href;\n let destination = (event.target as HTMLAnchorElement).href;\n\n if (props.portalAccess.paymentsPortal && props.portalAccess.commercePortal) {\n const appRoute = app === APPS.PAYMENTS ? APPS.MARKETPLACE : APPS.PAYMENTS;\n const currentSessionName = `${appRoute}${CONTEXT_SWITCHER_STORAGE_KEY}`;\n const prevSessionName = `${app}${CONTEXT_SWITCHER_STORAGE_KEY}`;\n\n // save the current url in local storage\n setPersistentItem(currentSessionName, currentLocation, { global: true });\n\n // get the other app's url from local storage\n const prevSessionUrl = getPersistentItem(prevSessionName, { global: true });\n\n // if it exists, redirect users to such location and remove the item from local storage\n if (prevSessionUrl) {\n event.preventDefault();\n destination = prevSessionUrl;\n window.location.href = prevSessionUrl;\n removePersistentItem(prevSessionName, { global: true });\n }\n }\n\n emit('click', { from: currentLocation, to: destination });\n emit('switch', event, { from: currentLocation, to: destination });\n }\n</script>\n\n<template>\n <div\n class=\"stash-context-switcher mx-auto flex w-64 rounded-full border border-white/10 bg-purple-700 p-1.5 text-center\"\n data-test=\"stash-context-switcher\"\n >\n <template v-for=\"route in routes\" :key=\"route.app\">\n <!-- render anchor tag to override base route in Payments -->\n <a\n v-if=\"route.hasBaseRoute\"\n class=\"w-1/2 cursor-pointer rounded-full py-2.5 font-semibold !capitalize leading-none !no-underline\"\n :class=\"props.activeApp === route.app ? 'text-white bg-royal-500' : 'text-ice-500'\"\n :href=\"`/${route.name}`\"\n @click=\"(evt) => handleClick(evt, route.app)\"\n >\n {{ route.app }}\n </a>\n\n <router-link\n v-else\n class=\"w-1/2 cursor-pointer rounded-full py-2.5 font-semibold !capitalize leading-none !no-underline\"\n :class=\"props.activeApp === route.app ? 'text-white bg-royal-500' : 'text-ice-500'\"\n :to=\"{ name: route.name, query: routeQuery }\"\n :data-test-route=\"JSON.stringify({ name: route.name, query: routeQuery })\"\n @click=\"(evt) => handleClick(evt, route.app)\"\n >\n {{ route.app }}\n </router-link>\n </template>\n </div>\n</template>\n"],"names":["CONTEXT_SWITCHER_STORAGE_KEY","props","__props","emit","__emit","routes","computed","APPS","handleClick","event","app","currentLocation","destination","currentSessionName","prevSessionName","setPersistentItem","prevSessionUrl","getPersistentItem","removePersistentItem","_openBlock","_createElementBlock","_hoisted_1","_Fragment","_renderList","route","_normalizeClass","evt","_toDisplayString","_hoisted_2","_createBlock","_component_router_link","_createTextVNode"],"mappings":";;;;;;4BA6DQA,IAA+B;;;;;;;;;;;;;;AA1BrC,UAAMC,IAAQC,GAQRC,IAAOC,GAoBPC,IAASC,EAAwB,MAC9B;AAAA,MACL;AAAA,QACE,KAAKC,EAAK;AAAA,QACV,MAAMN,EAAM,aAAa,iBAAiB,cAAcA,EAAM;AAAA,QAC9D,cAAcA,EAAM,aAAa;AAAA,MAAA;AAAA,MAEnC;AAAA,QACE,KAAKM,EAAK;AAAA,QACV,MAAMN,EAAM,aAAa,iBAAiB,aAAaA,EAAM;AAAA,QAC7D,cAAc;AAAA,MAAA;AAAA,IAChB,CAEH;AASD,aAASO,EAAYC,GAAmBC,GAAgB;AACtD,UAAIA,MAAQT,EAAM;AAChB;AAGF,YAAMU,IAAkB,OAAO,SAAS;AACxC,UAAIC,IAAeH,EAAM,OAA6B;AAEtD,UAAIR,EAAM,aAAa,kBAAkBA,EAAM,aAAa,gBAAgB;AAE1E,cAAMY,IAAqB,GADVH,MAAQH,EAAK,WAAWA,EAAK,cAAcA,EAAK,QAC3B,GAAGP,CAA4B,IAC/Dc,IAAkB,GAAGJ,CAAG,GAAGV,CAA4B;AAG7D,QAAAe,EAAkBF,GAAoBF,GAAiB,EAAE,QAAQ,IAAM;AAGvE,cAAMK,IAAiBC,EAAkBH,GAAiB,EAAE,QAAQ,IAAM;AAG1E,QAAIE,MACFP,EAAM,eAAA,GACNG,IAAcI,GACd,OAAO,SAAS,OAAOA,GACvBE,EAAqBJ,GAAiB,EAAE,QAAQ,GAAA,CAAM;AAAA,MAE1D;AAEA,MAAAX,EAAK,SAAS,EAAE,MAAMQ,GAAiB,IAAIC,GAAa,GACxDT,EAAK,UAAUM,GAAO,EAAE,MAAME,GAAiB,IAAIC,GAAa;AAAA,IAClE;;;AAIA,aAAAO,EAAA,GAAAC,EA2BM,OA3BNC,GA2BM;AAAA,gBAvBJD,EAsBWE,GAAA,MAAAC,EAtBelB,EAAA,OAAM,CAAfmB;UAAuB,KAAAA,EAAM;AAAA,QAAA;UAGpCA,EAAM,qBADdJ,EAQI,KAAA;AAAA;YANF,OAAKK,EAAA,CAAC,iGACExB,EAAM,cAAcuB,EAAM,MAAG,4BAAA,cAAA,CAAA;AAAA,YACpC,MAAI,IAAMA,EAAM,IAAI;AAAA,YACpB,SAAK,CAAGE,MAAQlB,EAAYkB,GAAKF,EAAM,GAAG;AAAA,UAAA,GAExCG,EAAAH,EAAM,GAAG,GAAA,IAAAI,CAAA,WAGdC,EAScC,GAAA;AAAA;YAPZ,OAAKL,EAAA,CAAC,iGACExB,EAAM,cAAcuB,EAAM,MAAG,4BAAA,cAAA,CAAA;AAAA,YACpC,IAAE,EAAA,MAAUA,EAAM,aAAatB,EAAA,WAAA;AAAA,YAC/B,mBAAiB,KAAK,kBAAkBsB,EAAM,MAAI,OAAStB,EAAA,YAAU;AAAA,YACrE,SAAK,CAAGwB,MAAQlB,EAAYkB,GAAKF,EAAM,GAAG;AAAA,UAAA;uBAE3C,MAAe;AAAA,cAAZO,EAAAJ,EAAAH,EAAM,GAAG,GAAA,CAAA;AAAA,YAAA;;;;;;;;"}
|
package/dist/Copy.js
CHANGED
|
@@ -5,7 +5,7 @@ import { t as f } from "./locale.js";
|
|
|
5
5
|
import _ from "./Button.js";
|
|
6
6
|
import x from "./Icon.js";
|
|
7
7
|
import $ from "./IconLabel.js";
|
|
8
|
-
import { _ as N } from "./Tooltip.vue_vue_type_script_setup_true_lang-
|
|
8
|
+
import { _ as N } from "./Tooltip.vue_vue_type_script_setup_true_lang-WMPMxzO-.js";
|
|
9
9
|
import { _ as S } from "./_plugin-vue_export-helper-CHgC5LLL.js";
|
|
10
10
|
const U = /* @__PURE__ */ w({
|
|
11
11
|
__name: "Copy",
|
package/dist/Copy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Copy.js","sources":["../src/components/Copy/Copy.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import logger from '@leaflink/snitch';\n import { computed, ref, useCssModule, watch } from 'vue';\n\n import { UI_TIMEOUT } from '../../constants';\n import { t } from '../../locale';\n import Button from '../Button/Button.vue';\n import Icon from '../Icon/Icon.vue';\n import IconLabel from '../IconLabel/IconLabel.vue';\n import Tooltip from '../Tooltip/Tooltip.vue';\n\n export interface CopyProps {\n /**\n * Optional text to display instead of icon.\n */\n text?: string;\n\n /**\n * The value to copy to clipboard.\n */\n value: string;\n\n /**\n * Sets the copy icon or text to always be visible. By default, icon/text only appears when hovering over slot content.\n */\n visible?: boolean;\n\n /**\n * Sets the mode of the copy component.\n */\n // TODO: remove unset mode eventually but it will cause a breaking change\n mode?: 'icon' | 'text' | 'icon-button' | 'unset';\n }\n\n const props = withDefaults(defineProps<CopyProps>(), {\n text: undefined,\n visible: false,\n mode: 'unset',\n });\n\n /**\n * Compute the mode based on the props for backwards compatibility. Previously the checks were done\n * in the template based on text being present. Have to calculate it here after the text prop is set.\n */\n const computedMode = computed(() => {\n // If the mode is set, use it (new behavior)\n if (props.mode !== 'unset') return props.mode;\n\n // Otherwise, determine it based on the text prop (old behavior)\n return props.text ? 'text' : 'icon';\n });\n\n // Watch the props individually to ensure we run validation when props change.\n watch(\n [computedMode, () => props.text, () => props.visible],\n () => {\n // Validate the mode based on the text prop. This will still pass if the mode is unset but the text prop is present.\n if (!props.text && ['text', 'icon-button'].includes(computedMode.value)) {\n throw new Error('Copy: text prop is required when mode is text or icon-button');\n } else if (props.text && computedMode.value === 'icon') {\n throw new Error('Copy: text prop is not allowed when mode is icon');\n }\n\n // If the mode is icon-button and the visible prop is false,\n // warn the user that the visible prop is ignored when mode is icon-button\n // Because we have to show the whole control\n if (computedMode.value === 'icon-button' && props.visible === false) {\n logger.warn('Copy: visible prop is ignored when mode is icon-button');\n }\n },\n { immediate: true },\n );\n\n const emit = defineEmits<{\n /**\n * Emitted when the copy action is completed.\n */\n (e: 'copy'): void;\n }>();\n\n const classes = useCssModule();\n\n // Flag to indicate whether a user successfully copied the text to their clipboard.\n // Note: We reset this flag after a timeout to allow the user to copy the text multiple times.\n const isCopied = ref(false);\n\n const tooltip = computed(() => {\n return isCopied.value ? t('ll.copy.copied') : !props.text ? t('ll.copy.copyToClipboard') : null;\n });\n\n function handleCopy() {\n navigator.clipboard.writeText(props.value);\n isCopied.value = true;\n\n // Reset the copied state after the timeout to flip the icon back\n setTimeout(() => {\n isCopied.value = false;\n }, UI_TIMEOUT);\n\n emit('copy');\n }\n</script>\n\n<template>\n <div class=\"stash-copy flex items-center\" :class=\"{ [classes.hidden]: !props.visible }\" data-test=\"stash-copy\">\n <!-- If the mode is not icon-button, render the appropriate content based on the mode -->\n <template v-if=\"computedMode !== 'icon-button'\">\n <!-- @slot Anything you want to render. This is not what will be copied to the clipboard. -->\n <slot></slot>\n <Tooltip\n side=\"top\"\n :text=\"tooltip\"\n :is-disabled=\"!!props.text\"\n class=\"stash-copy__copy-zone ml-3 cursor-pointer\"\n :class=\"classes.copy\"\n data-test=\"stash-copy|copy-zone\"\n >\n <!-- Regardless of the mode, we always render ONLY the success icon if the text has been copied \n Which is why this is the first in the `v-if` block-->\n <Icon\n v-if=\"isCopied\"\n class=\"stash-copy__success-icon text-green-500\"\n name=\"circle-check\"\n data-test=\"stash-copy|success-icon\"\n />\n <!-- If the mode is text, we render a button with the text -->\n <Button\n v-else-if=\"computedMode === 'text'\"\n class=\"stash-copy__copy-text\"\n inline\n data-test=\"stash-copy|copy-target\"\n @click=\"handleCopy\"\n >\n {{ props.text }}\n </Button>\n <!-- If the mode is icon, we render just the icon -->\n <Icon\n v-else\n class=\"stash-copy__copy-icon\"\n name=\"copy\"\n title=\"Copy to clipboard\"\n data-test=\"stash-copy|copy-target\"\n @click=\"handleCopy\"\n />\n </Tooltip>\n </template>\n <template v-else>\n <!-- If the mode is icon-button, we render an icon button with the icon and text -->\n <Button\n icon-label\n :data-test=\"isCopied ? 'stash-copy|success-icon-button' : 'stash-copy|copy-target'\"\n :title=\"props.text\"\n :class=\"isCopied ? 'text-green-500' : ''\"\n @click=\"handleCopy\"\n >\n <IconLabel :icon=\"isCopied ? 'circle-check' : 'copy'\" :title=\"props.text\" stacked>\n {{ props.text }}\n </IconLabel>\n </Button>\n </template>\n </div>\n</template>\n\n<style module>\n @layer utilities {\n .hidden {\n .copy {\n visibility: hidden;\n }\n\n &:hover {\n .copy {\n visibility: visible;\n }\n }\n }\n }\n</style>\n"],"names":["props","__props","computedMode","computed","watch","logger","emit","__emit","classes","useCssModule","isCopied","ref","tooltip","t","handleCopy","UI_TIMEOUT"],"mappings":";;;;;;;;;;;;;;;;;;;AAkCE,UAAMA,IAAQC,GAURC,IAAeC,EAAS,MAExBH,EAAM,SAAS,UAAgBA,EAAM,OAGlCA,EAAM,OAAO,SAAS,MAC9B;AAGD,IAAAI;AAAA,MACE,CAACF,GAAc,MAAMF,EAAM,MAAM,MAAMA,EAAM,OAAO;AAAA,MACpD,MAAM;AAEJ,YAAI,CAACA,EAAM,QAAQ,CAAC,QAAQ,aAAa,EAAE,SAASE,EAAa,KAAK;AACpE,gBAAM,IAAI,MAAM,8DAA8D;AAChF,YAAWF,EAAM,QAAQE,EAAa,UAAU;AAC9C,gBAAM,IAAI,MAAM,kDAAkD;AAMpE,QAAIA,EAAa,UAAU,iBAAiBF,EAAM,YAAY,MAC5DK,EAAO,KAAK,wDAAwD;AAAA,MAExE;AAAA,MACA,EAAE,WAAW,GAAA;AAAA,IAAK;AAGpB,UAAMC,IAAOC,GAOPC,IAAUC,EAAA,GAIVC,IAAWC,EAAI,EAAK,GAEpBC,IAAUT,EAAS,MAChBO,EAAS,QAAQG,EAAE,gBAAgB,IAAKb,EAAM,OAAsC,OAA/Ba,EAAE,yBAAyB,CACxF;AAED,aAASC,IAAa;AACpB,gBAAU,UAAU,UAAUd,EAAM,KAAK,GACzCU,EAAS,QAAQ,IAGjB,WAAW,MAAM;AACf,QAAAA,EAAS,QAAQ;AAAA,MACnB,GAAGK,CAAU,GAEbT,EAAK,MAAM;AAAA,IACb
|
|
1
|
+
{"version":3,"file":"Copy.js","sources":["../src/components/Copy/Copy.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import logger from '@leaflink/snitch';\n import { computed, ref, useCssModule, watch } from 'vue';\n\n import { UI_TIMEOUT } from '../../constants';\n import { t } from '../../locale';\n import Button from '../Button/Button.vue';\n import Icon from '../Icon/Icon.vue';\n import IconLabel from '../IconLabel/IconLabel.vue';\n import Tooltip from '../Tooltip/Tooltip.vue';\n\n export interface CopyProps {\n /**\n * Optional text to display instead of icon.\n */\n text?: string;\n\n /**\n * The value to copy to clipboard.\n */\n value: string;\n\n /**\n * Sets the copy icon or text to always be visible. By default, icon/text only appears when hovering over slot content.\n */\n visible?: boolean;\n\n /**\n * Sets the mode of the copy component.\n */\n // TODO: remove unset mode eventually but it will cause a breaking change\n mode?: 'icon' | 'text' | 'icon-button' | 'unset';\n }\n\n const props = withDefaults(defineProps<CopyProps>(), {\n text: undefined,\n visible: false,\n mode: 'unset',\n });\n\n /**\n * Compute the mode based on the props for backwards compatibility. Previously the checks were done\n * in the template based on text being present. Have to calculate it here after the text prop is set.\n */\n const computedMode = computed(() => {\n // If the mode is set, use it (new behavior)\n if (props.mode !== 'unset') return props.mode;\n\n // Otherwise, determine it based on the text prop (old behavior)\n return props.text ? 'text' : 'icon';\n });\n\n // Watch the props individually to ensure we run validation when props change.\n watch(\n [computedMode, () => props.text, () => props.visible],\n () => {\n // Validate the mode based on the text prop. This will still pass if the mode is unset but the text prop is present.\n if (!props.text && ['text', 'icon-button'].includes(computedMode.value)) {\n throw new Error('Copy: text prop is required when mode is text or icon-button');\n } else if (props.text && computedMode.value === 'icon') {\n throw new Error('Copy: text prop is not allowed when mode is icon');\n }\n\n // If the mode is icon-button and the visible prop is false,\n // warn the user that the visible prop is ignored when mode is icon-button\n // Because we have to show the whole control\n if (computedMode.value === 'icon-button' && props.visible === false) {\n logger.warn('Copy: visible prop is ignored when mode is icon-button');\n }\n },\n { immediate: true },\n );\n\n const emit = defineEmits<{\n /**\n * Emitted when the copy action is completed.\n */\n (e: 'copy'): void;\n }>();\n\n const classes = useCssModule();\n\n // Flag to indicate whether a user successfully copied the text to their clipboard.\n // Note: We reset this flag after a timeout to allow the user to copy the text multiple times.\n const isCopied = ref(false);\n\n const tooltip = computed(() => {\n return isCopied.value ? t('ll.copy.copied') : !props.text ? t('ll.copy.copyToClipboard') : null;\n });\n\n function handleCopy() {\n navigator.clipboard.writeText(props.value);\n isCopied.value = true;\n\n // Reset the copied state after the timeout to flip the icon back\n setTimeout(() => {\n isCopied.value = false;\n }, UI_TIMEOUT);\n\n emit('copy');\n }\n</script>\n\n<template>\n <div class=\"stash-copy flex items-center\" :class=\"{ [classes.hidden]: !props.visible }\" data-test=\"stash-copy\">\n <!-- If the mode is not icon-button, render the appropriate content based on the mode -->\n <template v-if=\"computedMode !== 'icon-button'\">\n <!-- @slot Anything you want to render. This is not what will be copied to the clipboard. -->\n <slot></slot>\n <Tooltip\n side=\"top\"\n :text=\"tooltip\"\n :is-disabled=\"!!props.text\"\n class=\"stash-copy__copy-zone ml-3 cursor-pointer\"\n :class=\"classes.copy\"\n data-test=\"stash-copy|copy-zone\"\n >\n <!-- Regardless of the mode, we always render ONLY the success icon if the text has been copied \n Which is why this is the first in the `v-if` block-->\n <Icon\n v-if=\"isCopied\"\n class=\"stash-copy__success-icon text-green-500\"\n name=\"circle-check\"\n data-test=\"stash-copy|success-icon\"\n />\n <!-- If the mode is text, we render a button with the text -->\n <Button\n v-else-if=\"computedMode === 'text'\"\n class=\"stash-copy__copy-text\"\n inline\n data-test=\"stash-copy|copy-target\"\n @click=\"handleCopy\"\n >\n {{ props.text }}\n </Button>\n <!-- If the mode is icon, we render just the icon -->\n <Icon\n v-else\n class=\"stash-copy__copy-icon\"\n name=\"copy\"\n title=\"Copy to clipboard\"\n data-test=\"stash-copy|copy-target\"\n @click=\"handleCopy\"\n />\n </Tooltip>\n </template>\n <template v-else>\n <!-- If the mode is icon-button, we render an icon button with the icon and text -->\n <Button\n icon-label\n :data-test=\"isCopied ? 'stash-copy|success-icon-button' : 'stash-copy|copy-target'\"\n :title=\"props.text\"\n :class=\"isCopied ? 'text-green-500' : ''\"\n @click=\"handleCopy\"\n >\n <IconLabel :icon=\"isCopied ? 'circle-check' : 'copy'\" :title=\"props.text\" stacked>\n {{ props.text }}\n </IconLabel>\n </Button>\n </template>\n </div>\n</template>\n\n<style module>\n @layer utilities {\n .hidden {\n .copy {\n visibility: hidden;\n }\n\n &:hover {\n .copy {\n visibility: visible;\n }\n }\n }\n }\n</style>\n"],"names":["props","__props","computedMode","computed","watch","logger","emit","__emit","classes","useCssModule","isCopied","ref","tooltip","t","handleCopy","UI_TIMEOUT","_createElementBlock","_normalizeClass","_unref","_Fragment","_renderSlot","_ctx","_createVNode","Tooltip","_createBlock","Icon","Button","_createTextVNode","_toDisplayString","IconLabel"],"mappings":";;;;;;;;;;;;;;;;;;;AAkCE,UAAMA,IAAQC,GAURC,IAAeC,EAAS,MAExBH,EAAM,SAAS,UAAgBA,EAAM,OAGlCA,EAAM,OAAO,SAAS,MAC9B;AAGD,IAAAI;AAAA,MACE,CAACF,GAAc,MAAMF,EAAM,MAAM,MAAMA,EAAM,OAAO;AAAA,MACpD,MAAM;AAEJ,YAAI,CAACA,EAAM,QAAQ,CAAC,QAAQ,aAAa,EAAE,SAASE,EAAa,KAAK;AACpE,gBAAM,IAAI,MAAM,8DAA8D;AAChF,YAAWF,EAAM,QAAQE,EAAa,UAAU;AAC9C,gBAAM,IAAI,MAAM,kDAAkD;AAMpE,QAAIA,EAAa,UAAU,iBAAiBF,EAAM,YAAY,MAC5DK,EAAO,KAAK,wDAAwD;AAAA,MAExE;AAAA,MACA,EAAE,WAAW,GAAA;AAAA,IAAK;AAGpB,UAAMC,IAAOC,GAOPC,IAAUC,EAAA,GAIVC,IAAWC,EAAI,EAAK,GAEpBC,IAAUT,EAAS,MAChBO,EAAS,QAAQG,EAAE,gBAAgB,IAAKb,EAAM,OAAsC,OAA/Ba,EAAE,yBAAyB,CACxF;AAED,aAASC,IAAa;AACpB,gBAAU,UAAU,UAAUd,EAAM,KAAK,GACzCU,EAAS,QAAQ,IAGjB,WAAW,MAAM;AACf,QAAAA,EAAS,QAAQ;AAAA,MACnB,GAAGK,CAAU,GAEbT,EAAK,MAAM;AAAA,IACb;2BAIAU,EAwDM,OAAA;AAAA,MAxDD,OAAKC,EAAA,CAAC,gCAA8B,EAAA,CAAYC,EAAAV,CAAA,EAAQ,MAAM,GAAA,CAAIR,EAAM,QAAA,CAAO,CAAA;AAAA,MAAI,aAAU;AAAA,IAAA;MAEhFE,EAAA,UAAY,sBAA5Bc,EAuCWG,GAAA,EAAA,KAAA,KAAA;AAAA,QArCTC,EAAaC,EAAA,QAAA,SAAA;AAAA,QACbC,EAmCUC,GAAA;AAAA,UAlCR,MAAK;AAAA,UACJ,MAAMX,EAAA;AAAA,UACN,eAAW,CAAA,CAAIZ,EAAM;AAAA,UACtB,OAAKiB,EAAA,CAAC,6CACEC,EAAAV,CAAA,EAAQ,IAAI,CAAA;AAAA,UACpB,aAAU;AAAA,QAAA;qBAIV,MAKE;AAAA,YAJME,EAAA,cADRc,EAKEC,GAAA;AAAA;cAHA,OAAM;AAAA,cACN,MAAK;AAAA,cACL,aAAU;AAAA,YAAA,MAICvB,EAAA,UAAY,eADzBsB,EAQSE,GAAA;AAAA;cANP,OAAM;AAAA,cACN,QAAA;AAAA,cACA,aAAU;AAAA,cACT,SAAOZ;AAAA,YAAA;yBAER,MAAgB;AAAA,gBAAba,EAAAC,EAAA5B,EAAM,IAAI,GAAA,CAAA;AAAA,cAAA;;wBAGfwB,EAOEC,GAAA;AAAA;cALA,OAAM;AAAA,cACN,MAAK;AAAA,cACL,OAAM;AAAA,cACN,aAAU;AAAA,cACT,SAAOX;AAAA,YAAA;;;;sBAMZU,EAUSE,GAAA;AAAA;QATP,cAAA;AAAA,QACC,aAAWhB,EAAA,QAAQ,mCAAA;AAAA,QACnB,OAAOV,EAAM;AAAA,QACb,SAAOU,EAAA,QAAQ,mBAAA,EAAA;AAAA,QACf,SAAOI;AAAA,MAAA;mBAER,MAEY;AAAA,UAFZQ,EAEYO,GAAA;AAAA,YAFA,MAAMnB,EAAA,QAAQ,iBAAA;AAAA,YAA6B,OAAOV,EAAM;AAAA,YAAM,SAAA;AAAA,UAAA;uBACxE,MAAgB;AAAA,cAAb2B,EAAAC,EAAA5B,EAAM,IAAI,GAAA,CAAA;AAAA,YAAA;;;;;;;;;;;;;;"}
|
package/dist/CurrencyInput.js
CHANGED
|
@@ -383,7 +383,7 @@ const ti = /* @__PURE__ */ C({
|
|
|
383
383
|
"data-test": "stash-currency-input",
|
|
384
384
|
inputmode: "decimal"
|
|
385
385
|
}), T({ _: 2 }, [
|
|
386
|
-
|
|
386
|
+
r.hidePrepend ? void 0 : {
|
|
387
387
|
name: "prepend",
|
|
388
388
|
fn: G(() => [
|
|
389
389
|
w(B, { name: "sign-dollar" })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CurrencyInput.js","sources":["../../../node_modules/.pnpm/vue-currency-input@3.1.0_vue@3.5.13_typescript@5.4.2_/node_modules/vue-currency-input/dist/index.mjs","../src/components/CurrencyInput/CurrencyInput.vue"],"sourcesContent":["/**\n * Vue Currency Input 3.1.0\n * (c) 2018-2024 Matthias Stiller\n * @license MIT\n */\nimport { ref, getCurrentInstance, version, computed, watch } from 'vue';\n\nvar CurrencyDisplay;\n(function (CurrencyDisplay) {\n CurrencyDisplay[\"symbol\"] = \"symbol\";\n CurrencyDisplay[\"narrowSymbol\"] = \"narrowSymbol\";\n CurrencyDisplay[\"code\"] = \"code\";\n CurrencyDisplay[\"name\"] = \"name\";\n CurrencyDisplay[\"hidden\"] = \"hidden\";\n})(CurrencyDisplay || (CurrencyDisplay = {}));\nvar ValueScaling;\n(function (ValueScaling) {\n ValueScaling[\"precision\"] = \"precision\";\n ValueScaling[\"thousands\"] = \"thousands\";\n ValueScaling[\"millions\"] = \"millions\";\n ValueScaling[\"billions\"] = \"billions\";\n})(ValueScaling || (ValueScaling = {}));\n\nconst escapeRegExp = (str) => {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n};\nconst removeLeadingZeros = (str) => {\n return str.replace(/^0+(0$|[^0])/, '$1');\n};\nconst count = (str, search) => {\n return (str.match(new RegExp(escapeRegExp(search), 'g')) || []).length;\n};\nconst substringBefore = (str, search) => {\n return str.substring(0, str.indexOf(search));\n};\n\nconst DECIMAL_SEPARATORS = [\n ',',\n '.',\n '٫',\n '。'\n];\nconst INTEGER_PATTERN = '(0|[1-9]\\\\d*)';\nclass CurrencyFormat {\n constructor(options) {\n var _a, _b, _c, _d, _e, _f;\n const { currency, currencyDisplay, locale, precision, accountingSign, useGrouping } = options;\n this.locale = locale;\n this.options = {\n currency,\n useGrouping,\n style: 'currency',\n currencySign: accountingSign ? 'accounting' : undefined,\n currencyDisplay: currencyDisplay !== CurrencyDisplay.hidden ? currencyDisplay : undefined\n };\n const numberFormat = new Intl.NumberFormat(locale, this.options);\n const formatParts = numberFormat.formatToParts(123456);\n this.currency = (_a = formatParts.find(({ type }) => type === 'currency')) === null || _a === void 0 ? void 0 : _a.value;\n this.digits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map((i) => i.toLocaleString(locale));\n this.decimalSymbol = (_b = formatParts.find(({ type }) => type === 'decimal')) === null || _b === void 0 ? void 0 : _b.value;\n this.groupingSymbol = (_c = formatParts.find(({ type }) => type === 'group')) === null || _c === void 0 ? void 0 : _c.value;\n this.minusSign = (_d = numberFormat.formatToParts(-1).find(({ type }) => type === 'minusSign')) === null || _d === void 0 ? void 0 : _d.value;\n if (this.decimalSymbol === undefined) {\n this.minimumFractionDigits = this.maximumFractionDigits = 0;\n }\n else if (typeof precision === 'number') {\n this.minimumFractionDigits = this.maximumFractionDigits = precision;\n }\n else {\n this.minimumFractionDigits = (_e = precision === null || precision === void 0 ? void 0 : precision.min) !== null && _e !== void 0 ? _e : numberFormat.resolvedOptions().minimumFractionDigits;\n this.maximumFractionDigits = (_f = precision === null || precision === void 0 ? void 0 : precision.max) !== null && _f !== void 0 ? _f : numberFormat.resolvedOptions().maximumFractionDigits;\n }\n const getPrefix = (str) => {\n return substringBefore(str, this.digits[1]);\n };\n const getSuffix = (str) => {\n return str.substring(str.lastIndexOf(this.decimalSymbol ? this.digits[0] : this.digits[1]) + 1);\n };\n this.prefix = getPrefix(numberFormat.format(1));\n this.suffix = getSuffix(numberFormat.format(1));\n this.negativePrefix = getPrefix(numberFormat.format(-1));\n this.negativeSuffix = getSuffix(numberFormat.format(-1));\n }\n parse(str) {\n if (str) {\n const negative = this.isNegative(str);\n str = this.normalizeDigits(str);\n str = this.stripCurrency(str, negative);\n str = this.stripSignLiterals(str);\n const fraction = this.decimalSymbol ? `(?:${escapeRegExp(this.decimalSymbol)}(\\\\d*))?` : '';\n const match = this.stripGroupingSeparator(str).match(new RegExp(`^${INTEGER_PATTERN}${fraction}$`));\n if (match && this.isValidIntegerFormat(this.decimalSymbol ? str.split(this.decimalSymbol)[0] : str, Number(match[1]))) {\n return Number(`${negative ? '-' : ''}${this.onlyDigits(match[1])}.${this.onlyDigits(match[2] || '')}`);\n }\n }\n return null;\n }\n isValidIntegerFormat(formattedNumber, integerNumber) {\n const options = { ...this.options, minimumFractionDigits: 0 };\n return [\n this.stripCurrency(this.normalizeDigits(integerNumber.toLocaleString(this.locale, { ...options, useGrouping: true })), false),\n this.stripCurrency(this.normalizeDigits(integerNumber.toLocaleString(this.locale, { ...options, useGrouping: false })), false)\n ].includes(formattedNumber);\n }\n format(value, options = {\n minimumFractionDigits: this.minimumFractionDigits,\n maximumFractionDigits: this.maximumFractionDigits\n }) {\n return value != null ? value.toLocaleString(this.locale, { ...this.options, ...options }) : '';\n }\n toFraction(str) {\n return `${this.digits[0]}${this.decimalSymbol}${this.onlyLocaleDigits(str.substring(1)).substring(0, this.maximumFractionDigits)}`;\n }\n isFractionIncomplete(str) {\n return !!this.normalizeDigits(this.stripGroupingSeparator(str)).match(new RegExp(`^${INTEGER_PATTERN}${escapeRegExp(this.decimalSymbol)}$`));\n }\n isNegative(str) {\n return (str.startsWith(this.negativePrefix) ||\n (this.minusSign === undefined && (str.startsWith('(') || str.startsWith('-'))) ||\n (this.minusSign !== undefined && str.replace('-', this.minusSign).startsWith(this.minusSign)));\n }\n insertCurrency(str, negative) {\n return `${negative ? this.negativePrefix : this.prefix}${str}${negative ? this.negativeSuffix : this.suffix}`;\n }\n stripGroupingSeparator(str) {\n return this.groupingSymbol !== undefined ? str.replace(new RegExp(escapeRegExp(this.groupingSymbol), 'g'), '') : str;\n }\n stripSignLiterals(str) {\n if (this.minusSign !== undefined) {\n return str.replace('-', this.minusSign).replace(this.minusSign, '');\n }\n else {\n return str.replace(/[-()]/g, '');\n }\n }\n stripCurrency(str, negative) {\n return str.replace(negative ? this.negativePrefix : this.prefix, '').replace(negative ? this.negativeSuffix : this.suffix, '');\n }\n normalizeDecimalSeparator(str, from) {\n DECIMAL_SEPARATORS.forEach((s) => {\n str = str.substring(0, from) + str.substring(from).replace(s, this.decimalSymbol);\n });\n return str;\n }\n normalizeDigits(str) {\n if (this.digits[0] !== '0') {\n this.digits.forEach((digit, index) => {\n str = str.replace(new RegExp(digit, 'g'), String(index));\n });\n }\n return str;\n }\n onlyDigits(str) {\n return this.normalizeDigits(str).replace(/\\D+/g, '');\n }\n onlyLocaleDigits(str) {\n return str.replace(new RegExp(`[^${this.digits.join('')}]*`, 'g'), '');\n }\n}\n\nclass AbstractInputMask {\n constructor(currencyFormat) {\n this.currencyFormat = currencyFormat;\n }\n}\nclass DefaultInputMask extends AbstractInputMask {\n conformToMask(str, previousConformedValue = '') {\n const negative = this.currencyFormat.isNegative(str);\n const isEmptyNegativeValue = (str) => str === '' &&\n negative &&\n !(this.currencyFormat.minusSign === undefined\n ? previousConformedValue === this.currencyFormat.negativePrefix + this.currencyFormat.negativeSuffix\n : previousConformedValue === this.currencyFormat.negativePrefix);\n const checkIncompleteValue = (str) => {\n if (isEmptyNegativeValue(str)) {\n return '';\n }\n else if (this.currencyFormat.maximumFractionDigits > 0) {\n if (this.currencyFormat.isFractionIncomplete(str)) {\n return str;\n }\n else if (str.startsWith(this.currencyFormat.decimalSymbol)) {\n return this.currencyFormat.toFraction(str);\n }\n }\n return null;\n };\n let value = str;\n value = this.currencyFormat.stripCurrency(value, negative);\n value = this.currencyFormat.stripSignLiterals(value);\n const incompleteValue = checkIncompleteValue(value);\n if (incompleteValue != null) {\n return this.currencyFormat.insertCurrency(incompleteValue, negative);\n }\n const [integer, ...fraction] = value.split(this.currencyFormat.decimalSymbol);\n const integerDigits = removeLeadingZeros(this.currencyFormat.onlyDigits(integer));\n const fractionDigits = this.currencyFormat.onlyDigits(fraction.join('')).substring(0, this.currencyFormat.maximumFractionDigits);\n const invalidFraction = fraction.length > 0 && fractionDigits.length === 0;\n const invalidNegativeValue = integerDigits === '' &&\n negative &&\n (this.currencyFormat.minusSign === undefined\n ? previousConformedValue === str.slice(0, -2) + this.currencyFormat.negativeSuffix\n : previousConformedValue === str.slice(0, -1));\n if (invalidFraction || invalidNegativeValue || isEmptyNegativeValue(integerDigits)) {\n return previousConformedValue;\n }\n else if (integerDigits.match(/\\d+/)) {\n return {\n numberValue: Number(`${negative ? '-' : ''}${integerDigits}.${fractionDigits}`),\n fractionDigits\n };\n }\n else {\n return '';\n }\n }\n}\nclass AutoDecimalDigitsInputMask extends AbstractInputMask {\n conformToMask(str, previousConformedValue = '') {\n if (str === '' ||\n (this.currencyFormat.parse(previousConformedValue) === 0 &&\n this.currencyFormat.stripCurrency(previousConformedValue, true).slice(0, -1) === this.currencyFormat.stripCurrency(str, true))) {\n return '';\n }\n const negative = this.currencyFormat.isNegative(str);\n const numberValue = this.currencyFormat.stripSignLiterals(str) === ''\n ? -0\n : Number(`${negative ? '-' : ''}${removeLeadingZeros(this.currencyFormat.onlyDigits(str))}`) / Math.pow(10, this.currencyFormat.maximumFractionDigits);\n return {\n numberValue,\n fractionDigits: numberValue.toFixed(this.currencyFormat.maximumFractionDigits).slice(-this.currencyFormat.maximumFractionDigits)\n };\n }\n}\n\nconst DEFAULT_OPTIONS = {\n locale: undefined,\n currency: undefined,\n currencyDisplay: undefined,\n hideGroupingSeparatorOnFocus: true,\n hideCurrencySymbolOnFocus: true,\n hideNegligibleDecimalDigitsOnFocus: true,\n precision: undefined,\n autoDecimalDigits: false,\n valueRange: undefined,\n useGrouping: undefined,\n valueScaling: undefined\n};\nclass CurrencyInput {\n constructor(args) {\n this.el = args.el;\n this.onInput = args.onInput;\n this.onChange = args.onChange;\n this.addEventListener();\n this.init(args.options);\n }\n setOptions(options) {\n this.init(options);\n this.format(this.currencyFormat.format(this.validateValueRange(this.numberValue)));\n this.onChange(this.getValue());\n }\n getValue() {\n const numberValue = this.valueScaling && this.numberValue != null ? this.toInteger(this.numberValue, this.valueScaling) : this.numberValue;\n return { number: numberValue, formatted: this.formattedValue };\n }\n setValue(value) {\n const newValue = this.valueScaling !== undefined && value != null ? this.toFloat(value, this.valueScaling) : value;\n if (newValue !== this.numberValue) {\n this.format(this.currencyFormat.format(this.validateValueRange(newValue)));\n this.onChange(this.getValue());\n }\n }\n init(options) {\n this.options = {\n ...DEFAULT_OPTIONS,\n ...options\n };\n if (this.options.autoDecimalDigits) {\n this.options.hideNegligibleDecimalDigitsOnFocus = false;\n }\n if (!this.el.getAttribute('inputmode')) {\n this.el.setAttribute('inputmode', this.options.autoDecimalDigits ? 'numeric' : 'decimal');\n }\n this.currencyFormat = new CurrencyFormat(this.options);\n this.numberMask = this.options.autoDecimalDigits ? new AutoDecimalDigitsInputMask(this.currencyFormat) : new DefaultInputMask(this.currencyFormat);\n const valueScalingOptions = {\n [ValueScaling.precision]: this.currencyFormat.maximumFractionDigits,\n [ValueScaling.thousands]: 3,\n [ValueScaling.millions]: 6,\n [ValueScaling.billions]: 9\n };\n this.valueScaling = this.options.valueScaling ? valueScalingOptions[this.options.valueScaling] : undefined;\n this.valueScalingFractionDigits =\n this.valueScaling !== undefined && this.options.valueScaling !== ValueScaling.precision\n ? this.valueScaling + this.currencyFormat.maximumFractionDigits\n : this.currencyFormat.maximumFractionDigits;\n this.minValue = this.getMinValue();\n this.maxValue = this.getMaxValue();\n }\n getMinValue() {\n var _a, _b;\n let min = this.toFloat(-Number.MAX_SAFE_INTEGER);\n if (((_a = this.options.valueRange) === null || _a === void 0 ? void 0 : _a.min) !== undefined) {\n min = Math.max((_b = this.options.valueRange) === null || _b === void 0 ? void 0 : _b.min, this.toFloat(-Number.MAX_SAFE_INTEGER));\n }\n return min;\n }\n getMaxValue() {\n var _a, _b;\n let max = this.toFloat(Number.MAX_SAFE_INTEGER);\n if (((_a = this.options.valueRange) === null || _a === void 0 ? void 0 : _a.max) !== undefined) {\n max = Math.min((_b = this.options.valueRange) === null || _b === void 0 ? void 0 : _b.max, this.toFloat(Number.MAX_SAFE_INTEGER));\n }\n return max;\n }\n toFloat(value, maxFractionDigits) {\n return value / Math.pow(10, maxFractionDigits !== null && maxFractionDigits !== void 0 ? maxFractionDigits : this.valueScalingFractionDigits);\n }\n toInteger(value, maxFractionDigits) {\n return Number(value\n .toFixed(maxFractionDigits !== null && maxFractionDigits !== void 0 ? maxFractionDigits : this.valueScalingFractionDigits)\n .split('.')\n .join(''));\n }\n validateValueRange(value) {\n return value != null ? Math.min(Math.max(value, this.minValue), this.maxValue) : value;\n }\n format(value, hideNegligibleDecimalDigits = false) {\n if (value != null) {\n if (this.decimalSymbolInsertedAt !== undefined) {\n value = this.currencyFormat.normalizeDecimalSeparator(value, this.decimalSymbolInsertedAt);\n this.decimalSymbolInsertedAt = undefined;\n }\n const conformedValue = this.numberMask.conformToMask(value, this.formattedValue);\n let formattedValue;\n if (typeof conformedValue === 'object') {\n const { numberValue, fractionDigits } = conformedValue;\n let { maximumFractionDigits, minimumFractionDigits } = this.currencyFormat;\n if (this.focus) {\n minimumFractionDigits = hideNegligibleDecimalDigits\n ? fractionDigits.replace(/0+$/, '').length\n : Math.min(maximumFractionDigits, fractionDigits.length);\n }\n else if (Number.isInteger(numberValue) && !this.options.autoDecimalDigits && (this.options.precision === undefined || minimumFractionDigits === 0)) {\n minimumFractionDigits = maximumFractionDigits = 0;\n }\n formattedValue =\n this.toInteger(Math.abs(numberValue)) > Number.MAX_SAFE_INTEGER\n ? this.formattedValue\n : this.currencyFormat.format(numberValue, {\n useGrouping: this.options.useGrouping !== false && !(this.focus && this.options.hideGroupingSeparatorOnFocus),\n minimumFractionDigits,\n maximumFractionDigits\n });\n }\n else {\n formattedValue = conformedValue;\n }\n if (this.maxValue <= 0 && !this.currencyFormat.isNegative(formattedValue) && this.currencyFormat.parse(formattedValue) !== 0) {\n formattedValue = formattedValue.replace(this.currencyFormat.prefix, this.currencyFormat.negativePrefix);\n }\n if (this.minValue >= 0) {\n formattedValue = formattedValue.replace(this.currencyFormat.negativePrefix, this.currencyFormat.prefix);\n }\n if (this.options.currencyDisplay === CurrencyDisplay.hidden || (this.focus && this.options.hideCurrencySymbolOnFocus)) {\n formattedValue = formattedValue\n .replace(this.currencyFormat.negativePrefix, this.currencyFormat.minusSign !== undefined ? this.currencyFormat.minusSign : '(')\n .replace(this.currencyFormat.negativeSuffix, this.currencyFormat.minusSign !== undefined ? '' : ')')\n .replace(this.currencyFormat.prefix, '')\n .replace(this.currencyFormat.suffix, '');\n }\n this.el.value = formattedValue;\n this.numberValue = this.currencyFormat.parse(formattedValue);\n }\n else {\n this.el.value = '';\n this.numberValue = null;\n }\n this.formattedValue = this.el.value;\n this.onInput(this.getValue());\n }\n addEventListener() {\n this.el.addEventListener('input', (e) => {\n const { value, selectionStart } = this.el;\n const inputEvent = e;\n if (selectionStart && inputEvent.data && DECIMAL_SEPARATORS.includes(inputEvent.data)) {\n this.decimalSymbolInsertedAt = selectionStart - 1;\n }\n this.format(value);\n if (this.focus && selectionStart != null) {\n const getCaretPositionAfterFormat = () => {\n const { prefix, suffix, decimalSymbol, maximumFractionDigits, groupingSymbol } = this.currencyFormat;\n let caretPositionFromLeft = value.length - selectionStart;\n const newValueLength = this.formattedValue.length;\n if (this.currencyFormat.minusSign === undefined && (value.startsWith('(') || value.startsWith('-')) && !value.endsWith(')')) {\n return newValueLength - this.currencyFormat.negativeSuffix.length > 1 ? this.formattedValue.substring(selectionStart).length : 1;\n }\n if (this.formattedValue.substring(selectionStart, 1) === groupingSymbol &&\n count(this.formattedValue, groupingSymbol) === count(value, groupingSymbol) + 1) {\n return newValueLength - caretPositionFromLeft - 1;\n }\n if (newValueLength < caretPositionFromLeft) {\n return selectionStart;\n }\n if (decimalSymbol !== undefined && value.indexOf(decimalSymbol) !== -1) {\n const decimalSymbolPosition = value.indexOf(decimalSymbol) + 1;\n if (Math.abs(newValueLength - value.length) > 1 && selectionStart <= decimalSymbolPosition) {\n return this.formattedValue.indexOf(decimalSymbol) + 1;\n }\n else {\n if (!this.options.autoDecimalDigits && selectionStart > decimalSymbolPosition) {\n if (this.currencyFormat.onlyDigits(value.substring(decimalSymbolPosition)).length - 1 === maximumFractionDigits) {\n caretPositionFromLeft -= 1;\n }\n }\n }\n }\n return this.options.hideCurrencySymbolOnFocus || this.options.currencyDisplay === CurrencyDisplay.hidden\n ? newValueLength - caretPositionFromLeft\n : Math.max(newValueLength - Math.max(caretPositionFromLeft, suffix.length), prefix.length);\n };\n this.setCaretPosition(getCaretPositionAfterFormat());\n }\n });\n this.el.addEventListener('focus', () => {\n this.focus = true;\n this.numberValueOnFocus = this.numberValue;\n setTimeout(() => {\n const { value, selectionStart, selectionEnd } = this.el;\n this.format(value, this.options.hideNegligibleDecimalDigitsOnFocus);\n if (selectionStart != null && selectionEnd != null && Math.abs(selectionStart - selectionEnd) > 0) {\n this.setCaretPosition(0, this.el.value.length);\n }\n else if (selectionStart != null) {\n const caretPositionOnFocus = this.getCaretPositionOnFocus(value, selectionStart);\n this.setCaretPosition(caretPositionOnFocus);\n }\n });\n });\n this.el.addEventListener('blur', () => {\n this.focus = false;\n this.format(this.currencyFormat.format(this.validateValueRange(this.numberValue)));\n if (this.numberValueOnFocus !== this.numberValue) {\n this.onChange(this.getValue());\n }\n });\n }\n getCaretPositionOnFocus(value, selectionStart) {\n if (this.numberValue == null) {\n return selectionStart;\n }\n const { prefix, negativePrefix, suffix, negativeSuffix, groupingSymbol, currency } = this.currencyFormat;\n const isNegative = this.numberValue < 0;\n const currentPrefix = isNegative ? negativePrefix : prefix;\n const prefixLength = currentPrefix.length;\n if (this.options.hideCurrencySymbolOnFocus || this.options.currencyDisplay === CurrencyDisplay.hidden) {\n if (isNegative) {\n if (selectionStart <= 1) {\n return 1;\n }\n else if (value.endsWith(')') && selectionStart > value.indexOf(')')) {\n return this.formattedValue.length - 1;\n }\n }\n }\n else {\n const suffixLength = isNegative ? negativeSuffix.length : suffix.length;\n if (selectionStart >= value.length - suffixLength) {\n return this.formattedValue.length - suffixLength;\n }\n else if (selectionStart < prefixLength) {\n return prefixLength;\n }\n }\n let result = selectionStart;\n if (this.options.hideCurrencySymbolOnFocus &&\n this.options.currencyDisplay !== CurrencyDisplay.hidden &&\n selectionStart >= prefixLength &&\n currency !== undefined &&\n currentPrefix.includes(currency)) {\n result -= prefixLength;\n if (isNegative) {\n result += 1;\n }\n }\n if (this.options.hideGroupingSeparatorOnFocus && groupingSymbol !== undefined) {\n result -= count(value.substring(0, selectionStart), groupingSymbol);\n }\n return result;\n }\n setCaretPosition(start, end = start) {\n this.el.setSelectionRange(start, end);\n }\n}\n\nconst findInput = (el) => ((el === null || el === void 0 ? void 0 : el.matches('input')) ? el : el === null || el === void 0 ? void 0 : el.querySelector('input'));\nfunction useCurrencyInput(options, autoEmit) {\n var _a, _b, _c, _d;\n let currencyInput;\n const inputRef = ref(null);\n const formattedValue = ref(null);\n const numberValue = ref(null);\n const vm = getCurrentInstance();\n const emit = (vm === null || vm === void 0 ? void 0 : vm.emit) || ((_b = (_a = vm === null || vm === void 0 ? void 0 : vm.proxy) === null || _a === void 0 ? void 0 : _a.$emit) === null || _b === void 0 ? void 0 : _b.bind(vm === null || vm === void 0 ? void 0 : vm.proxy));\n const props = ((vm === null || vm === void 0 ? void 0 : vm.props) || ((_c = vm === null || vm === void 0 ? void 0 : vm.proxy) === null || _c === void 0 ? void 0 : _c.$props));\n const isVue3 = version.startsWith('3');\n const lazyModel = isVue3 && ((_d = vm === null || vm === void 0 ? void 0 : vm.attrs.modelModifiers) === null || _d === void 0 ? void 0 : _d.lazy);\n const modelValue = computed(() => props === null || props === void 0 ? void 0 : props[isVue3 ? 'modelValue' : 'value']);\n const inputEvent = isVue3 ? 'update:modelValue' : 'input';\n const changeEvent = lazyModel ? 'update:modelValue' : 'change';\n watch(inputRef, (value) => {\n var _a;\n if (value) {\n const el = findInput((_a = value === null || value === void 0 ? void 0 : value.$el) !== null && _a !== void 0 ? _a : value);\n if (el) {\n currencyInput = new CurrencyInput({\n el,\n options,\n onInput: (value) => {\n if (!lazyModel && autoEmit !== false && modelValue.value !== value.number) {\n emit === null || emit === void 0 ? void 0 : emit(inputEvent, value.number);\n }\n numberValue.value = value.number;\n formattedValue.value = value.formatted;\n },\n onChange: (value) => {\n if (autoEmit !== false) {\n emit === null || emit === void 0 ? void 0 : emit(changeEvent, value.number);\n }\n }\n });\n currencyInput.setValue(modelValue.value);\n }\n else {\n console.error('No input element found. Please make sure that the \"inputRef\" template ref is properly assigned.');\n }\n }\n else {\n currencyInput = null;\n }\n });\n return {\n inputRef,\n numberValue,\n formattedValue,\n setValue: (value) => currencyInput === null || currencyInput === void 0 ? void 0 : currencyInput.setValue(value),\n setOptions: (options) => currencyInput === null || currencyInput === void 0 ? void 0 : currencyInput.setOptions(options)\n };\n}\n\nexport { CurrencyDisplay, ValueScaling, useCurrencyInput };\n","<script lang=\"ts\" setup>\n import isEmpty from 'lodash-es/isEmpty';\n import { computed, useAttrs, watch } from 'vue';\n import { CurrencyDisplay, CurrencyInputOptions, useCurrencyInput } from 'vue-currency-input';\n\n import Icon from '../Icon/Icon.vue';\n import Input, { InputProps } from '../Input/Input.vue';\n\n const CURRENCY_INPUT_BASE_OPTIONS: CurrencyInputOptions = {\n currency: 'USD',\n currencyDisplay: CurrencyDisplay.hidden,\n precision: 2,\n hideCurrencySymbolOnFocus: true,\n hideGroupingSeparatorOnFocus: true,\n hideNegligibleDecimalDigitsOnFocus: false,\n autoDecimalDigits: true,\n useGrouping: true,\n accountingSign: false,\n };\n\n export interface CurrencyInputProps extends Omit<InputProps, 'modelValue' | 'type'> {\n inputOptions?: Partial<CurrencyInputOptions>;\n modelValue?: string | null;\n hidePrepend?: boolean;\n }\n\n const props = withDefaults(defineProps<CurrencyInputProps>(), {\n modelValue: null,\n errorText: undefined,\n hintText: undefined,\n label: undefined,\n id: undefined,\n inputOptions: undefined,\n hidePrepend: false,\n });\n\n const emit = defineEmits<{\n /**\n * Emitted when the input value changes.\n */\n (e: 'update:model-value', v: CurrencyInputProps['modelValue']): void;\n }>();\n\n const attrs = useAttrs();\n\n const currencyInputOptions = computed(() => {\n return {\n ...CURRENCY_INPUT_BASE_OPTIONS,\n ...(!isEmpty(props.inputOptions) ? props.inputOptions : {}),\n };\n });\n\n const { inputRef: inputEl, setOptions, setValue, numberValue } = useCurrencyInput(currencyInputOptions.value, false);\n\n defineExpose({ inputEl });\n\n watch(\n () => numberValue.value,\n (newValue: number | null | string) => {\n let stringValue: string | null;\n\n if (Object.is(newValue, -0)) {\n if (typeof currencyInputOptions.value.precision === 'number') {\n stringValue = '-0.' + '0'.repeat(currencyInputOptions.value.precision);\n } else {\n stringValue = '-0.' + '0'.repeat(currencyInputOptions.value.precision?.min || 0);\n }\n } else {\n stringValue = typeof newValue === 'number' ? newValue.toFixed(2) : newValue;\n }\n\n emit('update:model-value', stringValue);\n },\n );\n\n watch(\n () => props.modelValue,\n (newValue: number | null | string) => {\n let numberValue: number | null;\n\n if (typeof newValue === 'string') {\n numberValue = parseFloat(newValue || '0');\n } else {\n numberValue = newValue;\n }\n\n setValue(numberValue);\n },\n );\n\n watch(\n () => props.inputOptions,\n () => {\n setOptions(currencyInputOptions.value);\n },\n );\n\n const inputAttrs = computed(() => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { inputOptions: _, ...propsWithoutCurrencyInputOptions } = props;\n\n return { ...propsWithoutCurrencyInputOptions, ...attrs } as typeof attrs & InputProps;\n });\n</script>\n\n<template>\n <Input\n v-bind=\"inputAttrs\"\n ref=\"inputEl\"\n class=\"stash-currency-input\"\n type=\"text\"\n data-test=\"stash-currency-input\"\n inputmode=\"decimal\"\n >\n <template v-if=\"!hidePrepend\" #prepend>\n <Icon name=\"sign-dollar\" />\n </template>\n </Input>\n</template>\n"],"names":["CurrencyDisplay","ValueScaling","escapeRegExp","str","removeLeadingZeros","count","search","substringBefore","DECIMAL_SEPARATORS","INTEGER_PATTERN","CurrencyFormat","options","_a","_b","_c","_d","_e","_f","currency","currencyDisplay","locale","precision","accountingSign","useGrouping","numberFormat","formatParts","type","i","getPrefix","getSuffix","negative","fraction","match","formattedNumber","integerNumber","value","from","s","digit","index","AbstractInputMask","currencyFormat","DefaultInputMask","previousConformedValue","isEmptyNegativeValue","checkIncompleteValue","incompleteValue","integer","integerDigits","fractionDigits","invalidFraction","invalidNegativeValue","AutoDecimalDigitsInputMask","numberValue","DEFAULT_OPTIONS","CurrencyInput","args","newValue","valueScalingOptions","min","max","maxFractionDigits","hideNegligibleDecimalDigits","conformedValue","formattedValue","maximumFractionDigits","minimumFractionDigits","e","selectionStart","inputEvent","getCaretPositionAfterFormat","prefix","suffix","decimalSymbol","groupingSymbol","caretPositionFromLeft","newValueLength","decimalSymbolPosition","selectionEnd","caretPositionOnFocus","negativePrefix","negativeSuffix","isNegative","currentPrefix","prefixLength","suffixLength","result","start","end","findInput","el","useCurrencyInput","autoEmit","currencyInput","inputRef","ref","vm","getCurrentInstance","props","isVue3","version","modelValue","computed","watch","CURRENCY_INPUT_BASE_OPTIONS","__props","emit","__emit","attrs","useAttrs","currencyInputOptions","isEmpty","inputEl","setOptions","setValue","__expose","stringValue","inputAttrs","_","propsWithoutCurrencyInputOptions"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"CurrencyInput.js","sources":["../../../node_modules/.pnpm/vue-currency-input@3.1.0_vue@3.5.28_typescript@5.4.2_/node_modules/vue-currency-input/dist/index.mjs","../src/components/CurrencyInput/CurrencyInput.vue"],"sourcesContent":["/**\n * Vue Currency Input 3.1.0\n * (c) 2018-2024 Matthias Stiller\n * @license MIT\n */\nimport { ref, getCurrentInstance, version, computed, watch } from 'vue';\n\nvar CurrencyDisplay;\n(function (CurrencyDisplay) {\n CurrencyDisplay[\"symbol\"] = \"symbol\";\n CurrencyDisplay[\"narrowSymbol\"] = \"narrowSymbol\";\n CurrencyDisplay[\"code\"] = \"code\";\n CurrencyDisplay[\"name\"] = \"name\";\n CurrencyDisplay[\"hidden\"] = \"hidden\";\n})(CurrencyDisplay || (CurrencyDisplay = {}));\nvar ValueScaling;\n(function (ValueScaling) {\n ValueScaling[\"precision\"] = \"precision\";\n ValueScaling[\"thousands\"] = \"thousands\";\n ValueScaling[\"millions\"] = \"millions\";\n ValueScaling[\"billions\"] = \"billions\";\n})(ValueScaling || (ValueScaling = {}));\n\nconst escapeRegExp = (str) => {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n};\nconst removeLeadingZeros = (str) => {\n return str.replace(/^0+(0$|[^0])/, '$1');\n};\nconst count = (str, search) => {\n return (str.match(new RegExp(escapeRegExp(search), 'g')) || []).length;\n};\nconst substringBefore = (str, search) => {\n return str.substring(0, str.indexOf(search));\n};\n\nconst DECIMAL_SEPARATORS = [\n ',',\n '.',\n '٫',\n '。'\n];\nconst INTEGER_PATTERN = '(0|[1-9]\\\\d*)';\nclass CurrencyFormat {\n constructor(options) {\n var _a, _b, _c, _d, _e, _f;\n const { currency, currencyDisplay, locale, precision, accountingSign, useGrouping } = options;\n this.locale = locale;\n this.options = {\n currency,\n useGrouping,\n style: 'currency',\n currencySign: accountingSign ? 'accounting' : undefined,\n currencyDisplay: currencyDisplay !== CurrencyDisplay.hidden ? currencyDisplay : undefined\n };\n const numberFormat = new Intl.NumberFormat(locale, this.options);\n const formatParts = numberFormat.formatToParts(123456);\n this.currency = (_a = formatParts.find(({ type }) => type === 'currency')) === null || _a === void 0 ? void 0 : _a.value;\n this.digits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map((i) => i.toLocaleString(locale));\n this.decimalSymbol = (_b = formatParts.find(({ type }) => type === 'decimal')) === null || _b === void 0 ? void 0 : _b.value;\n this.groupingSymbol = (_c = formatParts.find(({ type }) => type === 'group')) === null || _c === void 0 ? void 0 : _c.value;\n this.minusSign = (_d = numberFormat.formatToParts(-1).find(({ type }) => type === 'minusSign')) === null || _d === void 0 ? void 0 : _d.value;\n if (this.decimalSymbol === undefined) {\n this.minimumFractionDigits = this.maximumFractionDigits = 0;\n }\n else if (typeof precision === 'number') {\n this.minimumFractionDigits = this.maximumFractionDigits = precision;\n }\n else {\n this.minimumFractionDigits = (_e = precision === null || precision === void 0 ? void 0 : precision.min) !== null && _e !== void 0 ? _e : numberFormat.resolvedOptions().minimumFractionDigits;\n this.maximumFractionDigits = (_f = precision === null || precision === void 0 ? void 0 : precision.max) !== null && _f !== void 0 ? _f : numberFormat.resolvedOptions().maximumFractionDigits;\n }\n const getPrefix = (str) => {\n return substringBefore(str, this.digits[1]);\n };\n const getSuffix = (str) => {\n return str.substring(str.lastIndexOf(this.decimalSymbol ? this.digits[0] : this.digits[1]) + 1);\n };\n this.prefix = getPrefix(numberFormat.format(1));\n this.suffix = getSuffix(numberFormat.format(1));\n this.negativePrefix = getPrefix(numberFormat.format(-1));\n this.negativeSuffix = getSuffix(numberFormat.format(-1));\n }\n parse(str) {\n if (str) {\n const negative = this.isNegative(str);\n str = this.normalizeDigits(str);\n str = this.stripCurrency(str, negative);\n str = this.stripSignLiterals(str);\n const fraction = this.decimalSymbol ? `(?:${escapeRegExp(this.decimalSymbol)}(\\\\d*))?` : '';\n const match = this.stripGroupingSeparator(str).match(new RegExp(`^${INTEGER_PATTERN}${fraction}$`));\n if (match && this.isValidIntegerFormat(this.decimalSymbol ? str.split(this.decimalSymbol)[0] : str, Number(match[1]))) {\n return Number(`${negative ? '-' : ''}${this.onlyDigits(match[1])}.${this.onlyDigits(match[2] || '')}`);\n }\n }\n return null;\n }\n isValidIntegerFormat(formattedNumber, integerNumber) {\n const options = { ...this.options, minimumFractionDigits: 0 };\n return [\n this.stripCurrency(this.normalizeDigits(integerNumber.toLocaleString(this.locale, { ...options, useGrouping: true })), false),\n this.stripCurrency(this.normalizeDigits(integerNumber.toLocaleString(this.locale, { ...options, useGrouping: false })), false)\n ].includes(formattedNumber);\n }\n format(value, options = {\n minimumFractionDigits: this.minimumFractionDigits,\n maximumFractionDigits: this.maximumFractionDigits\n }) {\n return value != null ? value.toLocaleString(this.locale, { ...this.options, ...options }) : '';\n }\n toFraction(str) {\n return `${this.digits[0]}${this.decimalSymbol}${this.onlyLocaleDigits(str.substring(1)).substring(0, this.maximumFractionDigits)}`;\n }\n isFractionIncomplete(str) {\n return !!this.normalizeDigits(this.stripGroupingSeparator(str)).match(new RegExp(`^${INTEGER_PATTERN}${escapeRegExp(this.decimalSymbol)}$`));\n }\n isNegative(str) {\n return (str.startsWith(this.negativePrefix) ||\n (this.minusSign === undefined && (str.startsWith('(') || str.startsWith('-'))) ||\n (this.minusSign !== undefined && str.replace('-', this.minusSign).startsWith(this.minusSign)));\n }\n insertCurrency(str, negative) {\n return `${negative ? this.negativePrefix : this.prefix}${str}${negative ? this.negativeSuffix : this.suffix}`;\n }\n stripGroupingSeparator(str) {\n return this.groupingSymbol !== undefined ? str.replace(new RegExp(escapeRegExp(this.groupingSymbol), 'g'), '') : str;\n }\n stripSignLiterals(str) {\n if (this.minusSign !== undefined) {\n return str.replace('-', this.minusSign).replace(this.minusSign, '');\n }\n else {\n return str.replace(/[-()]/g, '');\n }\n }\n stripCurrency(str, negative) {\n return str.replace(negative ? this.negativePrefix : this.prefix, '').replace(negative ? this.negativeSuffix : this.suffix, '');\n }\n normalizeDecimalSeparator(str, from) {\n DECIMAL_SEPARATORS.forEach((s) => {\n str = str.substring(0, from) + str.substring(from).replace(s, this.decimalSymbol);\n });\n return str;\n }\n normalizeDigits(str) {\n if (this.digits[0] !== '0') {\n this.digits.forEach((digit, index) => {\n str = str.replace(new RegExp(digit, 'g'), String(index));\n });\n }\n return str;\n }\n onlyDigits(str) {\n return this.normalizeDigits(str).replace(/\\D+/g, '');\n }\n onlyLocaleDigits(str) {\n return str.replace(new RegExp(`[^${this.digits.join('')}]*`, 'g'), '');\n }\n}\n\nclass AbstractInputMask {\n constructor(currencyFormat) {\n this.currencyFormat = currencyFormat;\n }\n}\nclass DefaultInputMask extends AbstractInputMask {\n conformToMask(str, previousConformedValue = '') {\n const negative = this.currencyFormat.isNegative(str);\n const isEmptyNegativeValue = (str) => str === '' &&\n negative &&\n !(this.currencyFormat.minusSign === undefined\n ? previousConformedValue === this.currencyFormat.negativePrefix + this.currencyFormat.negativeSuffix\n : previousConformedValue === this.currencyFormat.negativePrefix);\n const checkIncompleteValue = (str) => {\n if (isEmptyNegativeValue(str)) {\n return '';\n }\n else if (this.currencyFormat.maximumFractionDigits > 0) {\n if (this.currencyFormat.isFractionIncomplete(str)) {\n return str;\n }\n else if (str.startsWith(this.currencyFormat.decimalSymbol)) {\n return this.currencyFormat.toFraction(str);\n }\n }\n return null;\n };\n let value = str;\n value = this.currencyFormat.stripCurrency(value, negative);\n value = this.currencyFormat.stripSignLiterals(value);\n const incompleteValue = checkIncompleteValue(value);\n if (incompleteValue != null) {\n return this.currencyFormat.insertCurrency(incompleteValue, negative);\n }\n const [integer, ...fraction] = value.split(this.currencyFormat.decimalSymbol);\n const integerDigits = removeLeadingZeros(this.currencyFormat.onlyDigits(integer));\n const fractionDigits = this.currencyFormat.onlyDigits(fraction.join('')).substring(0, this.currencyFormat.maximumFractionDigits);\n const invalidFraction = fraction.length > 0 && fractionDigits.length === 0;\n const invalidNegativeValue = integerDigits === '' &&\n negative &&\n (this.currencyFormat.minusSign === undefined\n ? previousConformedValue === str.slice(0, -2) + this.currencyFormat.negativeSuffix\n : previousConformedValue === str.slice(0, -1));\n if (invalidFraction || invalidNegativeValue || isEmptyNegativeValue(integerDigits)) {\n return previousConformedValue;\n }\n else if (integerDigits.match(/\\d+/)) {\n return {\n numberValue: Number(`${negative ? '-' : ''}${integerDigits}.${fractionDigits}`),\n fractionDigits\n };\n }\n else {\n return '';\n }\n }\n}\nclass AutoDecimalDigitsInputMask extends AbstractInputMask {\n conformToMask(str, previousConformedValue = '') {\n if (str === '' ||\n (this.currencyFormat.parse(previousConformedValue) === 0 &&\n this.currencyFormat.stripCurrency(previousConformedValue, true).slice(0, -1) === this.currencyFormat.stripCurrency(str, true))) {\n return '';\n }\n const negative = this.currencyFormat.isNegative(str);\n const numberValue = this.currencyFormat.stripSignLiterals(str) === ''\n ? -0\n : Number(`${negative ? '-' : ''}${removeLeadingZeros(this.currencyFormat.onlyDigits(str))}`) / Math.pow(10, this.currencyFormat.maximumFractionDigits);\n return {\n numberValue,\n fractionDigits: numberValue.toFixed(this.currencyFormat.maximumFractionDigits).slice(-this.currencyFormat.maximumFractionDigits)\n };\n }\n}\n\nconst DEFAULT_OPTIONS = {\n locale: undefined,\n currency: undefined,\n currencyDisplay: undefined,\n hideGroupingSeparatorOnFocus: true,\n hideCurrencySymbolOnFocus: true,\n hideNegligibleDecimalDigitsOnFocus: true,\n precision: undefined,\n autoDecimalDigits: false,\n valueRange: undefined,\n useGrouping: undefined,\n valueScaling: undefined\n};\nclass CurrencyInput {\n constructor(args) {\n this.el = args.el;\n this.onInput = args.onInput;\n this.onChange = args.onChange;\n this.addEventListener();\n this.init(args.options);\n }\n setOptions(options) {\n this.init(options);\n this.format(this.currencyFormat.format(this.validateValueRange(this.numberValue)));\n this.onChange(this.getValue());\n }\n getValue() {\n const numberValue = this.valueScaling && this.numberValue != null ? this.toInteger(this.numberValue, this.valueScaling) : this.numberValue;\n return { number: numberValue, formatted: this.formattedValue };\n }\n setValue(value) {\n const newValue = this.valueScaling !== undefined && value != null ? this.toFloat(value, this.valueScaling) : value;\n if (newValue !== this.numberValue) {\n this.format(this.currencyFormat.format(this.validateValueRange(newValue)));\n this.onChange(this.getValue());\n }\n }\n init(options) {\n this.options = {\n ...DEFAULT_OPTIONS,\n ...options\n };\n if (this.options.autoDecimalDigits) {\n this.options.hideNegligibleDecimalDigitsOnFocus = false;\n }\n if (!this.el.getAttribute('inputmode')) {\n this.el.setAttribute('inputmode', this.options.autoDecimalDigits ? 'numeric' : 'decimal');\n }\n this.currencyFormat = new CurrencyFormat(this.options);\n this.numberMask = this.options.autoDecimalDigits ? new AutoDecimalDigitsInputMask(this.currencyFormat) : new DefaultInputMask(this.currencyFormat);\n const valueScalingOptions = {\n [ValueScaling.precision]: this.currencyFormat.maximumFractionDigits,\n [ValueScaling.thousands]: 3,\n [ValueScaling.millions]: 6,\n [ValueScaling.billions]: 9\n };\n this.valueScaling = this.options.valueScaling ? valueScalingOptions[this.options.valueScaling] : undefined;\n this.valueScalingFractionDigits =\n this.valueScaling !== undefined && this.options.valueScaling !== ValueScaling.precision\n ? this.valueScaling + this.currencyFormat.maximumFractionDigits\n : this.currencyFormat.maximumFractionDigits;\n this.minValue = this.getMinValue();\n this.maxValue = this.getMaxValue();\n }\n getMinValue() {\n var _a, _b;\n let min = this.toFloat(-Number.MAX_SAFE_INTEGER);\n if (((_a = this.options.valueRange) === null || _a === void 0 ? void 0 : _a.min) !== undefined) {\n min = Math.max((_b = this.options.valueRange) === null || _b === void 0 ? void 0 : _b.min, this.toFloat(-Number.MAX_SAFE_INTEGER));\n }\n return min;\n }\n getMaxValue() {\n var _a, _b;\n let max = this.toFloat(Number.MAX_SAFE_INTEGER);\n if (((_a = this.options.valueRange) === null || _a === void 0 ? void 0 : _a.max) !== undefined) {\n max = Math.min((_b = this.options.valueRange) === null || _b === void 0 ? void 0 : _b.max, this.toFloat(Number.MAX_SAFE_INTEGER));\n }\n return max;\n }\n toFloat(value, maxFractionDigits) {\n return value / Math.pow(10, maxFractionDigits !== null && maxFractionDigits !== void 0 ? maxFractionDigits : this.valueScalingFractionDigits);\n }\n toInteger(value, maxFractionDigits) {\n return Number(value\n .toFixed(maxFractionDigits !== null && maxFractionDigits !== void 0 ? maxFractionDigits : this.valueScalingFractionDigits)\n .split('.')\n .join(''));\n }\n validateValueRange(value) {\n return value != null ? Math.min(Math.max(value, this.minValue), this.maxValue) : value;\n }\n format(value, hideNegligibleDecimalDigits = false) {\n if (value != null) {\n if (this.decimalSymbolInsertedAt !== undefined) {\n value = this.currencyFormat.normalizeDecimalSeparator(value, this.decimalSymbolInsertedAt);\n this.decimalSymbolInsertedAt = undefined;\n }\n const conformedValue = this.numberMask.conformToMask(value, this.formattedValue);\n let formattedValue;\n if (typeof conformedValue === 'object') {\n const { numberValue, fractionDigits } = conformedValue;\n let { maximumFractionDigits, minimumFractionDigits } = this.currencyFormat;\n if (this.focus) {\n minimumFractionDigits = hideNegligibleDecimalDigits\n ? fractionDigits.replace(/0+$/, '').length\n : Math.min(maximumFractionDigits, fractionDigits.length);\n }\n else if (Number.isInteger(numberValue) && !this.options.autoDecimalDigits && (this.options.precision === undefined || minimumFractionDigits === 0)) {\n minimumFractionDigits = maximumFractionDigits = 0;\n }\n formattedValue =\n this.toInteger(Math.abs(numberValue)) > Number.MAX_SAFE_INTEGER\n ? this.formattedValue\n : this.currencyFormat.format(numberValue, {\n useGrouping: this.options.useGrouping !== false && !(this.focus && this.options.hideGroupingSeparatorOnFocus),\n minimumFractionDigits,\n maximumFractionDigits\n });\n }\n else {\n formattedValue = conformedValue;\n }\n if (this.maxValue <= 0 && !this.currencyFormat.isNegative(formattedValue) && this.currencyFormat.parse(formattedValue) !== 0) {\n formattedValue = formattedValue.replace(this.currencyFormat.prefix, this.currencyFormat.negativePrefix);\n }\n if (this.minValue >= 0) {\n formattedValue = formattedValue.replace(this.currencyFormat.negativePrefix, this.currencyFormat.prefix);\n }\n if (this.options.currencyDisplay === CurrencyDisplay.hidden || (this.focus && this.options.hideCurrencySymbolOnFocus)) {\n formattedValue = formattedValue\n .replace(this.currencyFormat.negativePrefix, this.currencyFormat.minusSign !== undefined ? this.currencyFormat.minusSign : '(')\n .replace(this.currencyFormat.negativeSuffix, this.currencyFormat.minusSign !== undefined ? '' : ')')\n .replace(this.currencyFormat.prefix, '')\n .replace(this.currencyFormat.suffix, '');\n }\n this.el.value = formattedValue;\n this.numberValue = this.currencyFormat.parse(formattedValue);\n }\n else {\n this.el.value = '';\n this.numberValue = null;\n }\n this.formattedValue = this.el.value;\n this.onInput(this.getValue());\n }\n addEventListener() {\n this.el.addEventListener('input', (e) => {\n const { value, selectionStart } = this.el;\n const inputEvent = e;\n if (selectionStart && inputEvent.data && DECIMAL_SEPARATORS.includes(inputEvent.data)) {\n this.decimalSymbolInsertedAt = selectionStart - 1;\n }\n this.format(value);\n if (this.focus && selectionStart != null) {\n const getCaretPositionAfterFormat = () => {\n const { prefix, suffix, decimalSymbol, maximumFractionDigits, groupingSymbol } = this.currencyFormat;\n let caretPositionFromLeft = value.length - selectionStart;\n const newValueLength = this.formattedValue.length;\n if (this.currencyFormat.minusSign === undefined && (value.startsWith('(') || value.startsWith('-')) && !value.endsWith(')')) {\n return newValueLength - this.currencyFormat.negativeSuffix.length > 1 ? this.formattedValue.substring(selectionStart).length : 1;\n }\n if (this.formattedValue.substring(selectionStart, 1) === groupingSymbol &&\n count(this.formattedValue, groupingSymbol) === count(value, groupingSymbol) + 1) {\n return newValueLength - caretPositionFromLeft - 1;\n }\n if (newValueLength < caretPositionFromLeft) {\n return selectionStart;\n }\n if (decimalSymbol !== undefined && value.indexOf(decimalSymbol) !== -1) {\n const decimalSymbolPosition = value.indexOf(decimalSymbol) + 1;\n if (Math.abs(newValueLength - value.length) > 1 && selectionStart <= decimalSymbolPosition) {\n return this.formattedValue.indexOf(decimalSymbol) + 1;\n }\n else {\n if (!this.options.autoDecimalDigits && selectionStart > decimalSymbolPosition) {\n if (this.currencyFormat.onlyDigits(value.substring(decimalSymbolPosition)).length - 1 === maximumFractionDigits) {\n caretPositionFromLeft -= 1;\n }\n }\n }\n }\n return this.options.hideCurrencySymbolOnFocus || this.options.currencyDisplay === CurrencyDisplay.hidden\n ? newValueLength - caretPositionFromLeft\n : Math.max(newValueLength - Math.max(caretPositionFromLeft, suffix.length), prefix.length);\n };\n this.setCaretPosition(getCaretPositionAfterFormat());\n }\n });\n this.el.addEventListener('focus', () => {\n this.focus = true;\n this.numberValueOnFocus = this.numberValue;\n setTimeout(() => {\n const { value, selectionStart, selectionEnd } = this.el;\n this.format(value, this.options.hideNegligibleDecimalDigitsOnFocus);\n if (selectionStart != null && selectionEnd != null && Math.abs(selectionStart - selectionEnd) > 0) {\n this.setCaretPosition(0, this.el.value.length);\n }\n else if (selectionStart != null) {\n const caretPositionOnFocus = this.getCaretPositionOnFocus(value, selectionStart);\n this.setCaretPosition(caretPositionOnFocus);\n }\n });\n });\n this.el.addEventListener('blur', () => {\n this.focus = false;\n this.format(this.currencyFormat.format(this.validateValueRange(this.numberValue)));\n if (this.numberValueOnFocus !== this.numberValue) {\n this.onChange(this.getValue());\n }\n });\n }\n getCaretPositionOnFocus(value, selectionStart) {\n if (this.numberValue == null) {\n return selectionStart;\n }\n const { prefix, negativePrefix, suffix, negativeSuffix, groupingSymbol, currency } = this.currencyFormat;\n const isNegative = this.numberValue < 0;\n const currentPrefix = isNegative ? negativePrefix : prefix;\n const prefixLength = currentPrefix.length;\n if (this.options.hideCurrencySymbolOnFocus || this.options.currencyDisplay === CurrencyDisplay.hidden) {\n if (isNegative) {\n if (selectionStart <= 1) {\n return 1;\n }\n else if (value.endsWith(')') && selectionStart > value.indexOf(')')) {\n return this.formattedValue.length - 1;\n }\n }\n }\n else {\n const suffixLength = isNegative ? negativeSuffix.length : suffix.length;\n if (selectionStart >= value.length - suffixLength) {\n return this.formattedValue.length - suffixLength;\n }\n else if (selectionStart < prefixLength) {\n return prefixLength;\n }\n }\n let result = selectionStart;\n if (this.options.hideCurrencySymbolOnFocus &&\n this.options.currencyDisplay !== CurrencyDisplay.hidden &&\n selectionStart >= prefixLength &&\n currency !== undefined &&\n currentPrefix.includes(currency)) {\n result -= prefixLength;\n if (isNegative) {\n result += 1;\n }\n }\n if (this.options.hideGroupingSeparatorOnFocus && groupingSymbol !== undefined) {\n result -= count(value.substring(0, selectionStart), groupingSymbol);\n }\n return result;\n }\n setCaretPosition(start, end = start) {\n this.el.setSelectionRange(start, end);\n }\n}\n\nconst findInput = (el) => ((el === null || el === void 0 ? void 0 : el.matches('input')) ? el : el === null || el === void 0 ? void 0 : el.querySelector('input'));\nfunction useCurrencyInput(options, autoEmit) {\n var _a, _b, _c, _d;\n let currencyInput;\n const inputRef = ref(null);\n const formattedValue = ref(null);\n const numberValue = ref(null);\n const vm = getCurrentInstance();\n const emit = (vm === null || vm === void 0 ? void 0 : vm.emit) || ((_b = (_a = vm === null || vm === void 0 ? void 0 : vm.proxy) === null || _a === void 0 ? void 0 : _a.$emit) === null || _b === void 0 ? void 0 : _b.bind(vm === null || vm === void 0 ? void 0 : vm.proxy));\n const props = ((vm === null || vm === void 0 ? void 0 : vm.props) || ((_c = vm === null || vm === void 0 ? void 0 : vm.proxy) === null || _c === void 0 ? void 0 : _c.$props));\n const isVue3 = version.startsWith('3');\n const lazyModel = isVue3 && ((_d = vm === null || vm === void 0 ? void 0 : vm.attrs.modelModifiers) === null || _d === void 0 ? void 0 : _d.lazy);\n const modelValue = computed(() => props === null || props === void 0 ? void 0 : props[isVue3 ? 'modelValue' : 'value']);\n const inputEvent = isVue3 ? 'update:modelValue' : 'input';\n const changeEvent = lazyModel ? 'update:modelValue' : 'change';\n watch(inputRef, (value) => {\n var _a;\n if (value) {\n const el = findInput((_a = value === null || value === void 0 ? void 0 : value.$el) !== null && _a !== void 0 ? _a : value);\n if (el) {\n currencyInput = new CurrencyInput({\n el,\n options,\n onInput: (value) => {\n if (!lazyModel && autoEmit !== false && modelValue.value !== value.number) {\n emit === null || emit === void 0 ? void 0 : emit(inputEvent, value.number);\n }\n numberValue.value = value.number;\n formattedValue.value = value.formatted;\n },\n onChange: (value) => {\n if (autoEmit !== false) {\n emit === null || emit === void 0 ? void 0 : emit(changeEvent, value.number);\n }\n }\n });\n currencyInput.setValue(modelValue.value);\n }\n else {\n console.error('No input element found. Please make sure that the \"inputRef\" template ref is properly assigned.');\n }\n }\n else {\n currencyInput = null;\n }\n });\n return {\n inputRef,\n numberValue,\n formattedValue,\n setValue: (value) => currencyInput === null || currencyInput === void 0 ? void 0 : currencyInput.setValue(value),\n setOptions: (options) => currencyInput === null || currencyInput === void 0 ? void 0 : currencyInput.setOptions(options)\n };\n}\n\nexport { CurrencyDisplay, ValueScaling, useCurrencyInput };\n","<script lang=\"ts\" setup>\n import isEmpty from 'lodash-es/isEmpty';\n import { computed, useAttrs, watch } from 'vue';\n import { CurrencyDisplay, CurrencyInputOptions, useCurrencyInput } from 'vue-currency-input';\n\n import Icon from '../Icon/Icon.vue';\n import Input, { InputProps } from '../Input/Input.vue';\n\n const CURRENCY_INPUT_BASE_OPTIONS: CurrencyInputOptions = {\n currency: 'USD',\n currencyDisplay: CurrencyDisplay.hidden,\n precision: 2,\n hideCurrencySymbolOnFocus: true,\n hideGroupingSeparatorOnFocus: true,\n hideNegligibleDecimalDigitsOnFocus: false,\n autoDecimalDigits: true,\n useGrouping: true,\n accountingSign: false,\n };\n\n export interface CurrencyInputProps extends Omit<InputProps, 'modelValue' | 'type'> {\n inputOptions?: Partial<CurrencyInputOptions>;\n modelValue?: string | null;\n hidePrepend?: boolean;\n }\n\n const props = withDefaults(defineProps<CurrencyInputProps>(), {\n modelValue: null,\n errorText: undefined,\n hintText: undefined,\n label: undefined,\n id: undefined,\n inputOptions: undefined,\n hidePrepend: false,\n });\n\n const emit = defineEmits<{\n /**\n * Emitted when the input value changes.\n */\n (e: 'update:model-value', v: CurrencyInputProps['modelValue']): void;\n }>();\n\n const attrs = useAttrs();\n\n const currencyInputOptions = computed(() => {\n return {\n ...CURRENCY_INPUT_BASE_OPTIONS,\n ...(!isEmpty(props.inputOptions) ? props.inputOptions : {}),\n };\n });\n\n const { inputRef: inputEl, setOptions, setValue, numberValue } = useCurrencyInput(currencyInputOptions.value, false);\n\n defineExpose({ inputEl });\n\n watch(\n () => numberValue.value,\n (newValue: number | null | string) => {\n let stringValue: string | null;\n\n if (Object.is(newValue, -0)) {\n if (typeof currencyInputOptions.value.precision === 'number') {\n stringValue = '-0.' + '0'.repeat(currencyInputOptions.value.precision);\n } else {\n stringValue = '-0.' + '0'.repeat(currencyInputOptions.value.precision?.min || 0);\n }\n } else {\n stringValue = typeof newValue === 'number' ? newValue.toFixed(2) : newValue;\n }\n\n emit('update:model-value', stringValue);\n },\n );\n\n watch(\n () => props.modelValue,\n (newValue: number | null | string) => {\n let numberValue: number | null;\n\n if (typeof newValue === 'string') {\n numberValue = parseFloat(newValue || '0');\n } else {\n numberValue = newValue;\n }\n\n setValue(numberValue);\n },\n );\n\n watch(\n () => props.inputOptions,\n () => {\n setOptions(currencyInputOptions.value);\n },\n );\n\n const inputAttrs = computed(() => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { inputOptions: _, ...propsWithoutCurrencyInputOptions } = props;\n\n return { ...propsWithoutCurrencyInputOptions, ...attrs } as typeof attrs & InputProps;\n });\n</script>\n\n<template>\n <Input\n v-bind=\"inputAttrs\"\n ref=\"inputEl\"\n class=\"stash-currency-input\"\n type=\"text\"\n data-test=\"stash-currency-input\"\n inputmode=\"decimal\"\n >\n <template v-if=\"!hidePrepend\" #prepend>\n <Icon name=\"sign-dollar\" />\n </template>\n </Input>\n</template>\n"],"names":["CurrencyDisplay","ValueScaling","escapeRegExp","str","removeLeadingZeros","count","search","substringBefore","DECIMAL_SEPARATORS","INTEGER_PATTERN","CurrencyFormat","options","_a","_b","_c","_d","_e","_f","currency","currencyDisplay","locale","precision","accountingSign","useGrouping","numberFormat","formatParts","type","i","getPrefix","getSuffix","negative","fraction","match","formattedNumber","integerNumber","value","from","s","digit","index","AbstractInputMask","currencyFormat","DefaultInputMask","previousConformedValue","isEmptyNegativeValue","checkIncompleteValue","incompleteValue","integer","integerDigits","fractionDigits","invalidFraction","invalidNegativeValue","AutoDecimalDigitsInputMask","numberValue","DEFAULT_OPTIONS","CurrencyInput","args","newValue","valueScalingOptions","min","max","maxFractionDigits","hideNegligibleDecimalDigits","conformedValue","formattedValue","maximumFractionDigits","minimumFractionDigits","e","selectionStart","inputEvent","getCaretPositionAfterFormat","prefix","suffix","decimalSymbol","groupingSymbol","caretPositionFromLeft","newValueLength","decimalSymbolPosition","selectionEnd","caretPositionOnFocus","negativePrefix","negativeSuffix","isNegative","currentPrefix","prefixLength","suffixLength","result","start","end","findInput","el","useCurrencyInput","autoEmit","currencyInput","inputRef","ref","vm","getCurrentInstance","props","isVue3","version","modelValue","computed","watch","CURRENCY_INPUT_BASE_OPTIONS","__props","emit","__emit","attrs","useAttrs","currencyInputOptions","isEmpty","inputEl","setOptions","setValue","__expose","stringValue","inputAttrs","_","propsWithoutCurrencyInputOptions","_createBlock","Input","_mergeProps","_createVNode","Icon"],"mappings":"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","x_google_ignoreList":[0]}
|