@evance/evance-ui 1.0.0 → 1.0.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/components.d.ts +76 -0
- package/dist/cjs/ArrowContinueIcon-zWloRHK-.cjs +42 -0
- package/dist/cjs/ArrowContinueIcon-zWloRHK-.cjs.map +1 -0
- package/dist/cjs/CalendarIcon-WYldF7mh.cjs +28 -0
- package/dist/cjs/CalendarIcon-WYldF7mh.cjs.map +1 -0
- package/dist/cjs/CancelIcon-DJYwBqe4.cjs +23 -0
- package/dist/cjs/CancelIcon-DJYwBqe4.cjs.map +1 -0
- package/dist/cjs/CheckIcon-DHOitmE0.cjs +23 -0
- package/dist/cjs/CheckIcon-DHOitmE0.cjs.map +1 -0
- package/dist/cjs/ChevronDownIcon-C-ZvTf19.cjs +23 -0
- package/dist/cjs/ChevronDownIcon-C-ZvTf19.cjs.map +1 -0
- package/dist/cjs/ChevronRightIcon-1h_2Q6ph.cjs +42 -0
- package/dist/cjs/ChevronRightIcon-1h_2Q6ph.cjs.map +1 -0
- package/dist/cjs/ChevronUpIcon-CQo2gto2.cjs +23 -0
- package/dist/cjs/ChevronUpIcon-CQo2gto2.cjs.map +1 -0
- package/dist/cjs/EvAvatar.cjs +7 -0
- package/dist/cjs/EvAvatar.cjs.map +1 -0
- package/dist/cjs/EvAvatar.vue_vue_type_script_setup_true_lang-BHUyB71E.cjs +125 -0
- package/dist/cjs/EvAvatar.vue_vue_type_script_setup_true_lang-BHUyB71E.cjs.map +1 -0
- package/dist/cjs/EvBadge.cjs +7 -0
- package/dist/cjs/EvBadge.cjs.map +1 -0
- package/dist/cjs/EvBadge.vue_vue_type_script_setup_true_lang-DGlAwC2i.cjs +184 -0
- package/dist/cjs/EvBadge.vue_vue_type_script_setup_true_lang-DGlAwC2i.cjs.map +1 -0
- package/dist/cjs/EvBlock.cjs +7 -0
- package/dist/cjs/EvBlock.cjs.map +1 -0
- package/dist/cjs/EvBlock.vue_vue_type_script_setup_true_lang-Hu0uKSqg.cjs +80 -0
- package/dist/cjs/EvBlock.vue_vue_type_script_setup_true_lang-Hu0uKSqg.cjs.map +1 -0
- package/dist/cjs/EvButton.cjs +7 -0
- package/dist/cjs/EvButton.cjs.map +1 -0
- package/dist/cjs/EvButton.vue_vue_type_script_setup_true_lang-BF7zKdvs.cjs +234 -0
- package/dist/cjs/EvButton.vue_vue_type_script_setup_true_lang-BF7zKdvs.cjs.map +1 -0
- package/dist/cjs/EvButtonGroup-DweDNG85.cjs +25 -0
- package/dist/cjs/EvButtonGroup-DweDNG85.cjs.map +1 -0
- package/dist/cjs/EvButtonGroup.cjs +8 -0
- package/dist/cjs/EvButtonGroup.cjs.map +1 -0
- package/dist/cjs/EvButtonGroup.vue_vue_type_script_setup_true_lang-B8lkgJ12.cjs +48 -0
- package/dist/cjs/EvButtonGroup.vue_vue_type_script_setup_true_lang-B8lkgJ12.cjs.map +1 -0
- package/dist/cjs/EvButtonToggle-CCS6t63v.cjs +19 -0
- package/dist/cjs/EvButtonToggle-CCS6t63v.cjs.map +1 -0
- package/dist/cjs/EvButtonToggle.cjs +9 -0
- package/dist/cjs/EvButtonToggle.cjs.map +1 -0
- package/dist/cjs/EvButtonToggle.vue_vue_type_script_setup_true_lang-CDzBBqYO.cjs +41 -0
- package/dist/cjs/EvButtonToggle.vue_vue_type_script_setup_true_lang-CDzBBqYO.cjs.map +1 -0
- package/dist/cjs/EvCheckbox-C5uICUw6.cjs +54 -0
- package/dist/cjs/EvCheckbox-C5uICUw6.cjs.map +1 -0
- package/dist/cjs/EvCheckbox.cjs +9 -0
- package/dist/cjs/EvCheckbox.cjs.map +1 -0
- package/dist/cjs/EvCheckbox.vue_vue_type_script_setup_true_lang-DIj49cJq.cjs +115 -0
- package/dist/cjs/EvCheckbox.vue_vue_type_script_setup_true_lang-DIj49cJq.cjs.map +1 -0
- package/dist/cjs/EvContainer.cjs +7 -0
- package/dist/cjs/EvContainer.cjs.map +1 -0
- package/dist/cjs/EvContainer.vue_vue_type_script_setup_true_lang-BRE5ksHe.cjs +73 -0
- package/dist/cjs/EvContainer.vue_vue_type_script_setup_true_lang-BRE5ksHe.cjs.map +1 -0
- package/dist/cjs/EvDateField.cjs +7 -0
- package/dist/cjs/EvDateField.cjs.map +1 -0
- package/dist/cjs/EvDateField.vue_vue_type_script_setup_true_lang-B0jlPCAq.cjs +173 -0
- package/dist/cjs/EvDateField.vue_vue_type_script_setup_true_lang-B0jlPCAq.cjs.map +1 -0
- package/dist/cjs/EvDatePicker.cjs +7 -0
- package/dist/cjs/EvDatePicker.cjs.map +1 -0
- package/dist/cjs/EvDatePicker.vue_vue_type_script_setup_true_lang-2hKSnkxB.cjs +193 -0
- package/dist/cjs/EvDatePicker.vue_vue_type_script_setup_true_lang-2hKSnkxB.cjs.map +1 -0
- package/dist/cjs/EvDatePickerMonth.cjs +7 -0
- package/dist/cjs/EvDatePickerMonth.cjs.map +1 -0
- package/dist/cjs/EvDatePickerMonth.vue_vue_type_script_setup_true_lang-SGRnCkKo.cjs +243 -0
- package/dist/cjs/EvDatePickerMonth.vue_vue_type_script_setup_true_lang-SGRnCkKo.cjs.map +1 -0
- package/dist/cjs/EvDatePickerMonths.cjs +7 -0
- package/dist/cjs/EvDatePickerMonths.cjs.map +1 -0
- package/dist/cjs/EvDatePickerMonths.vue_vue_type_script_setup_true_lang-BHRDyv_O.cjs +66 -0
- package/dist/cjs/EvDatePickerMonths.vue_vue_type_script_setup_true_lang-BHRDyv_O.cjs.map +1 -0
- package/dist/cjs/EvDatePickerYears.cjs +7 -0
- package/dist/cjs/EvDatePickerYears.cjs.map +1 -0
- package/dist/cjs/EvDatePickerYears.vue_vue_type_script_setup_true_lang-hG58UtqO.cjs +92 -0
- package/dist/cjs/EvDatePickerYears.vue_vue_type_script_setup_true_lang-hG58UtqO.cjs.map +1 -0
- package/dist/cjs/EvDefaultsProvider.cjs +7 -0
- package/dist/cjs/EvDefaultsProvider.cjs.map +1 -0
- package/dist/cjs/EvDefaultsProvider.vue_vue_type_script_setup_true_lang-BPni3BPL.cjs +37 -0
- package/dist/cjs/EvDefaultsProvider.vue_vue_type_script_setup_true_lang-BPni3BPL.cjs.map +1 -0
- package/dist/cjs/EvDialog.cjs +9 -0
- package/dist/cjs/EvDialog.cjs.map +1 -0
- package/dist/cjs/EvDialog.vue_vue_type_script_setup_true_lang-En-sXlEX.cjs +406 -0
- package/dist/cjs/EvDialog.vue_vue_type_script_setup_true_lang-En-sXlEX.cjs.map +1 -0
- package/dist/cjs/EvDivider.cjs +6 -0
- package/dist/cjs/EvDivider.cjs.map +1 -0
- package/dist/cjs/EvDivider.vue_vue_type_script_setup_true_lang-BjFOZFjF.cjs +81 -0
- package/dist/cjs/EvDivider.vue_vue_type_script_setup_true_lang-BjFOZFjF.cjs.map +1 -0
- package/dist/cjs/EvDrawer.cjs +7 -0
- package/dist/cjs/EvDrawer.cjs.map +1 -0
- package/dist/cjs/EvDrawer.vue_vue_type_script_setup_true_lang-C7Dj_zOe.cjs +93 -0
- package/dist/cjs/EvDrawer.vue_vue_type_script_setup_true_lang-C7Dj_zOe.cjs.map +1 -0
- package/dist/cjs/EvErrors.cjs +7 -0
- package/dist/cjs/EvErrors.cjs.map +1 -0
- package/dist/cjs/EvErrors.vue_vue_type_script_setup_true_lang-6IxF_zZa.cjs +54 -0
- package/dist/cjs/EvErrors.vue_vue_type_script_setup_true_lang-6IxF_zZa.cjs.map +1 -0
- package/dist/cjs/EvForm.cjs +7 -0
- package/dist/cjs/EvForm.cjs.map +1 -0
- package/dist/cjs/EvForm.vue_vue_type_script_setup_true_lang-km75GsAz.cjs +65 -0
- package/dist/cjs/EvForm.vue_vue_type_script_setup_true_lang-km75GsAz.cjs.map +1 -0
- package/dist/cjs/EvIcon.cjs +9 -0
- package/dist/cjs/EvIcon.cjs.map +1 -0
- package/dist/cjs/EvIcon.vue_vue_type_script_setup_true_lang-vVb5SXZv.cjs +69 -0
- package/dist/cjs/EvIcon.vue_vue_type_script_setup_true_lang-vVb5SXZv.cjs.map +1 -0
- package/dist/cjs/EvIcon.vue_vue_type_style_index_0_lang-Cfd3eQsh.cjs +3 -0
- package/dist/cjs/EvIcon.vue_vue_type_style_index_0_lang-Cfd3eQsh.cjs.map +1 -0
- package/dist/cjs/EvImg.cjs +7 -0
- package/dist/cjs/EvImg.cjs.map +1 -0
- package/dist/cjs/EvImg.vue_vue_type_script_setup_true_lang-Dm_X-G8H.cjs +372 -0
- package/dist/cjs/EvImg.vue_vue_type_script_setup_true_lang-Dm_X-G8H.cjs.map +1 -0
- package/dist/cjs/EvKbd.cjs +7 -0
- package/dist/cjs/EvKbd.cjs.map +1 -0
- package/dist/cjs/EvKbd.vue_vue_type_script_setup_true_lang-CxPr7C8d.cjs +41 -0
- package/dist/cjs/EvKbd.vue_vue_type_script_setup_true_lang-CxPr7C8d.cjs.map +1 -0
- package/dist/cjs/EvLabel.cjs +7 -0
- package/dist/cjs/EvLabel.cjs.map +1 -0
- package/dist/cjs/EvLabel.vue_vue_type_script_setup_true_lang-BZ-aMwju.cjs +41 -0
- package/dist/cjs/EvLabel.vue_vue_type_script_setup_true_lang-BZ-aMwju.cjs.map +1 -0
- package/dist/cjs/EvLayout.cjs +7 -0
- package/dist/cjs/EvLayout.cjs.map +1 -0
- package/dist/cjs/EvLayout.vue_vue_type_script_setup_true_lang-DU06N43s.cjs +86 -0
- package/dist/cjs/EvLayout.vue_vue_type_script_setup_true_lang-DU06N43s.cjs.map +1 -0
- package/dist/cjs/EvList.cjs +8 -0
- package/dist/cjs/EvList.cjs.map +1 -0
- package/dist/cjs/EvList.vue_vue_type_script_setup_true_lang-Mn9JLN4n.cjs +232 -0
- package/dist/cjs/EvList.vue_vue_type_script_setup_true_lang-Mn9JLN4n.cjs.map +1 -0
- package/dist/cjs/EvListItem.cjs +7 -0
- package/dist/cjs/EvListItem.cjs.map +1 -0
- package/dist/cjs/EvListItem.vue_vue_type_script_setup_true_lang-Bu3wTF8S.cjs +647 -0
- package/dist/cjs/EvListItem.vue_vue_type_script_setup_true_lang-Bu3wTF8S.cjs.map +1 -0
- package/dist/cjs/EvLozenge.cjs +7 -0
- package/dist/cjs/EvLozenge.cjs.map +1 -0
- package/dist/cjs/EvLozenge.vue_vue_type_script_setup_true_lang-B5Lex93H.cjs +70 -0
- package/dist/cjs/EvLozenge.vue_vue_type_script_setup_true_lang-B5Lex93H.cjs.map +1 -0
- package/dist/cjs/EvMenu.cjs +8 -0
- package/dist/cjs/EvMenu.cjs.map +1 -0
- package/dist/cjs/EvMenu.vue_vue_type_script_setup_true_lang-u-7KNwrH.cjs +287 -0
- package/dist/cjs/EvMenu.vue_vue_type_script_setup_true_lang-u-7KNwrH.cjs.map +1 -0
- package/dist/cjs/EvMenuTransition.cjs +8 -0
- package/dist/cjs/EvMenuTransition.cjs.map +1 -0
- package/dist/cjs/EvMessage.cjs +7 -0
- package/dist/cjs/EvMessage.cjs.map +1 -0
- package/dist/cjs/EvMessage.vue_vue_type_script_setup_true_lang-BO-3bupM.cjs +232 -0
- package/dist/cjs/EvMessage.vue_vue_type_script_setup_true_lang-BO-3bupM.cjs.map +1 -0
- package/dist/cjs/EvNotification.cjs +7 -0
- package/dist/cjs/EvNotification.cjs.map +1 -0
- package/dist/cjs/EvNotification.vue_vue_type_script_setup_true_lang-DLObGAfM.cjs +96 -0
- package/dist/cjs/EvNotification.vue_vue_type_script_setup_true_lang-DLObGAfM.cjs.map +1 -0
- package/dist/cjs/EvNotifications.cjs +7 -0
- package/dist/cjs/EvNotifications.cjs.map +1 -0
- package/dist/cjs/EvNotifications.vue_vue_type_script_setup_true_lang-DZctQaSF.cjs +157 -0
- package/dist/cjs/EvNotifications.vue_vue_type_script_setup_true_lang-DZctQaSF.cjs.map +1 -0
- package/dist/cjs/EvNumberField.cjs +8 -0
- package/dist/cjs/EvNumberField.cjs.map +1 -0
- package/dist/cjs/EvNumberField.vue_vue_type_script_setup_true_lang-CUTIo6YZ.cjs +613 -0
- package/dist/cjs/EvNumberField.vue_vue_type_script_setup_true_lang-CUTIo6YZ.cjs.map +1 -0
- package/dist/cjs/EvOverlay.cjs +13 -0
- package/dist/cjs/EvOverlay.cjs.map +1 -0
- package/dist/cjs/EvOverlay.vue_vue_type_script_setup_true_lang-C24LC22k.cjs +1678 -0
- package/dist/cjs/EvOverlay.vue_vue_type_script_setup_true_lang-C24LC22k.cjs.map +1 -0
- package/dist/cjs/EvProgress.cjs +6 -0
- package/dist/cjs/EvProgress.cjs.map +1 -0
- package/dist/cjs/EvProgress.vue_vue_type_script_setup_true_lang-D_OL7GNN.cjs +69 -0
- package/dist/cjs/EvProgress.vue_vue_type_script_setup_true_lang-D_OL7GNN.cjs.map +1 -0
- package/dist/cjs/EvProgressCircular.cjs +6 -0
- package/dist/cjs/EvProgressCircular.cjs.map +1 -0
- package/dist/cjs/EvProgressCircular.vue_vue_type_script_setup_true_lang-CpsikJPE.cjs +109 -0
- package/dist/cjs/EvProgressCircular.vue_vue_type_script_setup_true_lang-CpsikJPE.cjs.map +1 -0
- package/dist/cjs/EvQuickfind.cjs +6 -0
- package/dist/cjs/EvQuickfind.cjs.map +1 -0
- package/dist/cjs/EvQuickfind.vue_vue_type_script_setup_true_lang-BmhlwsxO.cjs +49 -0
- package/dist/cjs/EvQuickfind.vue_vue_type_script_setup_true_lang-BmhlwsxO.cjs.map +1 -0
- package/dist/cjs/EvRadio.cjs +7 -0
- package/dist/cjs/EvRadio.cjs.map +1 -0
- package/dist/cjs/EvRadio.vue_vue_type_script_setup_true_lang-BinLQazm.cjs +141 -0
- package/dist/cjs/EvRadio.vue_vue_type_script_setup_true_lang-BinLQazm.cjs.map +1 -0
- package/dist/cjs/EvRadioGroup-BnQsU_-d.cjs +18 -0
- package/dist/cjs/EvRadioGroup-BnQsU_-d.cjs.map +1 -0
- package/dist/cjs/EvRadioGroup.cjs +9 -0
- package/dist/cjs/EvRadioGroup.cjs.map +1 -0
- package/dist/cjs/EvRadioGroup.vue_vue_type_script_setup_true_lang-BnPPpmT4.cjs +72 -0
- package/dist/cjs/EvRadioGroup.vue_vue_type_script_setup_true_lang-BnPPpmT4.cjs.map +1 -0
- package/dist/cjs/EvResponsive.cjs +8 -0
- package/dist/cjs/EvResponsive.cjs.map +1 -0
- package/dist/cjs/EvResponsive.vue_vue_type_script_setup_true_lang-Cc0SmIyP.cjs +69 -0
- package/dist/cjs/EvResponsive.vue_vue_type_script_setup_true_lang-Cc0SmIyP.cjs.map +1 -0
- package/dist/cjs/EvSelect.cjs +7 -0
- package/dist/cjs/EvSelect.cjs.map +1 -0
- package/dist/cjs/EvSelect.vue_vue_type_script_setup_true_lang-CoqoFwNc.cjs +830 -0
- package/dist/cjs/EvSelect.vue_vue_type_script_setup_true_lang-CoqoFwNc.cjs.map +1 -0
- package/dist/cjs/EvSlideGroup-WdRmTjwK.cjs +37 -0
- package/dist/cjs/EvSlideGroup-WdRmTjwK.cjs.map +1 -0
- package/dist/cjs/EvSlideGroup.cjs +11 -0
- package/dist/cjs/EvSlideGroup.cjs.map +1 -0
- package/dist/cjs/EvSlideGroup.vue_vue_type_script_setup_true_lang-ScyYeEpr.cjs +393 -0
- package/dist/cjs/EvSlideGroup.vue_vue_type_script_setup_true_lang-ScyYeEpr.cjs.map +1 -0
- package/dist/cjs/EvSlideGroupItem.cjs +11 -0
- package/dist/cjs/EvSlideGroupItem.cjs.map +1 -0
- package/dist/cjs/EvSlideGroupItem.vue_vue_type_script_setup_true_lang-x2UZ0IO4.cjs +32 -0
- package/dist/cjs/EvSlideGroupItem.vue_vue_type_script_setup_true_lang-x2UZ0IO4.cjs.map +1 -0
- package/dist/cjs/EvSpacer.cjs +7 -0
- package/dist/cjs/EvSpacer.cjs.map +1 -0
- package/dist/cjs/EvSpacer.vue_vue_type_script_setup_true_lang-P9tmG8Y6.cjs +31 -0
- package/dist/cjs/EvSpacer.vue_vue_type_script_setup_true_lang-P9tmG8Y6.cjs.map +1 -0
- package/dist/cjs/EvSurface.cjs +8 -0
- package/dist/cjs/EvSurface.cjs.map +1 -0
- package/dist/cjs/EvSurface.vue_vue_type_script_setup_true_lang-pn4dW5J4.cjs +84 -0
- package/dist/cjs/EvSurface.vue_vue_type_script_setup_true_lang-pn4dW5J4.cjs.map +1 -0
- package/dist/cjs/EvSwatch.cjs +19 -0
- package/dist/cjs/EvSwatch.cjs.map +1 -0
- package/dist/cjs/EvSwitch.cjs +7 -0
- package/dist/cjs/EvSwitch.cjs.map +1 -0
- package/dist/cjs/EvSwitch.vue_vue_type_script_setup_true_lang-BZP1URN1.cjs +122 -0
- package/dist/cjs/EvSwitch.vue_vue_type_script_setup_true_lang-BZP1URN1.cjs.map +1 -0
- package/dist/cjs/EvTab.cjs +7 -0
- package/dist/cjs/EvTab.cjs.map +1 -0
- package/dist/cjs/EvTab.vue_vue_type_script_setup_true_lang-Cow1s-Q5.cjs +142 -0
- package/dist/cjs/EvTab.vue_vue_type_script_setup_true_lang-Cow1s-Q5.cjs.map +1 -0
- package/dist/cjs/EvTabs.cjs +11 -0
- package/dist/cjs/EvTabs.cjs.map +1 -0
- package/dist/cjs/EvTabs.vue_vue_type_script_setup_true_lang-BcRcV9AA.cjs +70 -0
- package/dist/cjs/EvTabs.vue_vue_type_script_setup_true_lang-BcRcV9AA.cjs.map +1 -0
- package/dist/cjs/EvTag.cjs +7 -0
- package/dist/cjs/EvTag.cjs.map +1 -0
- package/dist/cjs/EvTag.vue_vue_type_script_setup_true_lang-GcVSpvQ4.cjs +287 -0
- package/dist/cjs/EvTag.vue_vue_type_script_setup_true_lang-GcVSpvQ4.cjs.map +1 -0
- package/dist/cjs/EvTagGroup-8_xBcCdw.cjs +31 -0
- package/dist/cjs/EvTagGroup-8_xBcCdw.cjs.map +1 -0
- package/dist/cjs/EvTagGroup.cjs +9 -0
- package/dist/cjs/EvTagGroup.cjs.map +1 -0
- package/dist/cjs/EvTagGroup.vue_vue_type_script_setup_true_lang-B2gXc4Jm.cjs +58 -0
- package/dist/cjs/EvTagGroup.vue_vue_type_script_setup_true_lang-B2gXc4Jm.cjs.map +1 -0
- package/dist/cjs/EvTextarea.cjs +7 -0
- package/dist/cjs/EvTextarea.cjs.map +1 -0
- package/dist/cjs/EvTextarea.vue_vue_type_script_setup_true_lang-DviSXJ2N.cjs +242 -0
- package/dist/cjs/EvTextarea.vue_vue_type_script_setup_true_lang-DviSXJ2N.cjs.map +1 -0
- package/dist/cjs/EvTextfield.cjs +7 -0
- package/dist/cjs/EvTextfield.cjs.map +1 -0
- package/dist/cjs/EvTextfield.vue_vue_type_script_setup_true_lang-BFBXp-Fj.cjs +291 -0
- package/dist/cjs/EvTextfield.vue_vue_type_script_setup_true_lang-BFBXp-Fj.cjs.map +1 -0
- package/dist/cjs/EvTooltip.cjs +7 -0
- package/dist/cjs/EvTooltip.cjs.map +1 -0
- package/dist/cjs/EvTooltip.vue_vue_type_script_setup_true_lang-BO0i3-9I.cjs +96 -0
- package/dist/cjs/EvTooltip.vue_vue_type_script_setup_true_lang-BO0i3-9I.cjs.map +1 -0
- package/dist/cjs/EvTransition-CAQqUplu.cjs +43 -0
- package/dist/cjs/EvTransition-CAQqUplu.cjs.map +1 -0
- package/dist/cjs/EvTransitionExpand.cjs +103 -0
- package/dist/cjs/EvTransitionExpand.cjs.map +1 -0
- package/dist/cjs/EvTransitionExpandX.cjs +7 -0
- package/dist/cjs/EvTransitionExpandX.cjs.map +1 -0
- package/dist/cjs/EvVirtualScroll.cjs +8 -0
- package/dist/cjs/EvVirtualScroll.cjs.map +1 -0
- package/dist/cjs/EvVirtualScroll.vue_vue_type_script_setup_true_lang-DbsaObui.cjs +294 -0
- package/dist/cjs/EvVirtualScroll.vue_vue_type_script_setup_true_lang-DbsaObui.cjs.map +1 -0
- package/dist/cjs/EvWindow.cjs +12 -0
- package/dist/cjs/EvWindow.cjs.map +1 -0
- package/dist/cjs/EvWindow.vue_vue_type_script_setup_true_lang-DvbsL9WL.cjs +249 -0
- package/dist/cjs/EvWindow.vue_vue_type_script_setup_true_lang-DvbsL9WL.cjs.map +1 -0
- package/dist/cjs/EvWindowItem.cjs +7 -0
- package/dist/cjs/EvWindowItem.cjs.map +1 -0
- package/dist/cjs/EvWindowItem.vue_vue_type_script_setup_true_lang-D2lnBQ5x.cjs +202 -0
- package/dist/cjs/EvWindowItem.vue_vue_type_script_setup_true_lang-D2lnBQ5x.cjs.map +1 -0
- package/dist/cjs/LocaleCode-DQEnAYU-.cjs +63 -0
- package/dist/cjs/LocaleCode-DQEnAYU-.cjs.map +1 -0
- package/dist/cjs/PlusIcon-D_DMZt6E.cjs +42 -0
- package/dist/cjs/PlusIcon-D_DMZt6E.cjs.map +1 -0
- package/dist/cjs/QuickfindIcon-CvDNNPF8.cjs +25 -0
- package/dist/cjs/QuickfindIcon-CvDNNPF8.cjs.map +1 -0
- package/dist/cjs/WarningIcon-D5Yww_80.cjs +124 -0
- package/dist/cjs/WarningIcon-D5Yww_80.cjs.map +1 -0
- package/dist/cjs/anchor-DZSjbyIj.cjs +97 -0
- package/dist/cjs/anchor-DZSjbyIj.cjs.map +1 -0
- package/dist/cjs/animate-Cl0XS1TO.cjs +86 -0
- package/dist/cjs/animate-Cl0XS1TO.cjs.map +1 -0
- package/dist/cjs/appearance-BUdBnEii.cjs +120 -0
- package/dist/cjs/appearance-BUdBnEii.cjs.map +1 -0
- package/dist/cjs/component-BP9_V6Yp.cjs +15 -0
- package/dist/cjs/component-BP9_V6Yp.cjs.map +1 -0
- package/dist/cjs/components-D8al01ti.cjs +12 -0
- package/dist/cjs/components-D8al01ti.cjs.map +1 -0
- package/dist/cjs/console-DqtZvZLk.cjs +7 -0
- package/dist/cjs/console-DqtZvZLk.cjs.map +1 -0
- package/dist/cjs/date-DXa0KjQw.cjs +550 -0
- package/dist/cjs/date-DXa0KjQw.cjs.map +1 -0
- package/dist/cjs/defaults-CiiX_Cqf.cjs +133 -0
- package/dist/cjs/defaults-CiiX_Cqf.cjs.map +1 -0
- package/dist/cjs/dimensions-XIPHhrWz.cjs +29 -0
- package/dist/cjs/dimensions-XIPHhrWz.cjs.map +1 -0
- package/dist/cjs/display-CEfQojrZ.cjs +270 -0
- package/dist/cjs/display-CEfQojrZ.cjs.map +1 -0
- package/dist/cjs/form-DfW4igCu.cjs +144 -0
- package/dist/cjs/form-DfW4igCu.cjs.map +1 -0
- package/dist/cjs/group-CQ4i1N2n.cjs +215 -0
- package/dist/cjs/group-CQ4i1N2n.cjs.map +1 -0
- package/dist/cjs/groupItem-CGVI8NTl.cjs +80 -0
- package/dist/cjs/groupItem-CGVI8NTl.cjs.map +1 -0
- package/dist/cjs/hasSlotWithContent-CBY0YfhO.cjs +20 -0
- package/dist/cjs/hasSlotWithContent-CBY0YfhO.cjs.map +1 -0
- package/dist/cjs/helpers-kEoXV5Dy.cjs +192 -0
- package/dist/cjs/helpers-kEoXV5Dy.cjs.map +1 -0
- package/dist/cjs/icons/brand.cjs +337 -0
- package/dist/cjs/icons/brand.cjs.map +1 -0
- package/dist/cjs/icons/editor.cjs +2711 -0
- package/dist/cjs/icons/editor.cjs.map +1 -0
- package/dist/cjs/icons-CmCKH6kF.cjs +28 -0
- package/dist/cjs/icons-CmCKH6kF.cjs.map +1 -0
- package/dist/cjs/icons.cjs +5029 -0
- package/dist/cjs/icons.cjs.map +1 -0
- package/dist/cjs/index.cjs +869 -0
- package/dist/cjs/index.cjs.map +1 -0
- package/dist/cjs/is-functions-C47LnllD.cjs +97 -0
- package/dist/cjs/is-functions-C47LnllD.cjs.map +1 -0
- package/dist/cjs/locale-JzsQHC4U.cjs +384 -0
- package/dist/cjs/locale-JzsQHC4U.cjs.map +1 -0
- package/dist/cjs/modelProxy-uCEe0w-S.cjs +60 -0
- package/dist/cjs/modelProxy-uCEe0w-S.cjs.map +1 -0
- package/dist/cjs/modifiers-B6u3j3R5.cjs +33 -0
- package/dist/cjs/modifiers-B6u3j3R5.cjs.map +1 -0
- package/dist/cjs/numbers-C3HRf3rz.cjs +9 -0
- package/dist/cjs/numbers-C3HRf3rz.cjs.map +1 -0
- package/dist/cjs/props-NPw_hoii.cjs +24 -0
- package/dist/cjs/props-NPw_hoii.cjs.map +1 -0
- package/dist/cjs/resizeObserver-CQ2McnGM.cjs +46 -0
- package/dist/cjs/resizeObserver-CQ2McnGM.cjs.map +1 -0
- package/dist/cjs/router-DxN82lhZ.cjs +169 -0
- package/dist/cjs/router-DxN82lhZ.cjs.map +1 -0
- package/dist/cjs/scroll-CR9L2L0A.cjs +48 -0
- package/dist/cjs/scroll-CR9L2L0A.cjs.map +1 -0
- package/dist/cjs/stack-CU_oJm4Z.cjs +63 -0
- package/dist/cjs/stack-CU_oJm4Z.cjs.map +1 -0
- package/dist/cjs/strings-DwUTkTBF.cjs +60 -0
- package/dist/cjs/strings-DwUTkTBF.cjs.map +1 -0
- package/dist/cjs/style.css +18071 -0
- package/dist/cjs/tag-Bql7Eyfp.cjs +14 -0
- package/dist/cjs/tag-Bql7Eyfp.cjs.map +1 -0
- package/dist/cjs/teleport-Bl828RE4.cjs +37 -0
- package/dist/cjs/teleport-Bl828RE4.cjs.map +1 -0
- package/dist/cjs/toggleScope-vQM_STmo.cjs +32 -0
- package/dist/cjs/toggleScope-vQM_STmo.cjs.map +1 -0
- package/dist/cjs/units-CtZImGlc.cjs +25 -0
- package/dist/cjs/units-CtZImGlc.cjs.map +1 -0
- package/dist/cjs/validation-BoH2Qy0i.cjs +304 -0
- package/dist/cjs/validation-BoH2Qy0i.cjs.map +1 -0
- package/dist/esm/ArrowContinueIcon-Qawpz3VA.mjs +43 -0
- package/dist/esm/ArrowContinueIcon-Qawpz3VA.mjs.map +1 -0
- package/dist/esm/CalendarIcon-CPv4R255.mjs +29 -0
- package/dist/esm/CalendarIcon-CPv4R255.mjs.map +1 -0
- package/dist/esm/CancelIcon-CDwcCSM_.mjs +24 -0
- package/dist/esm/CancelIcon-CDwcCSM_.mjs.map +1 -0
- package/dist/esm/CheckIcon-CEd_Z4_W.mjs +24 -0
- package/dist/esm/CheckIcon-CEd_Z4_W.mjs.map +1 -0
- package/dist/esm/ChevronDownIcon-CoLiOB0_.mjs +24 -0
- package/dist/esm/ChevronDownIcon-CoLiOB0_.mjs.map +1 -0
- package/dist/esm/ChevronRightIcon-C2hbLAB5.mjs +43 -0
- package/dist/esm/ChevronRightIcon-C2hbLAB5.mjs.map +1 -0
- package/dist/esm/ChevronUpIcon-BhYTiyMF.mjs +24 -0
- package/dist/esm/ChevronUpIcon-BhYTiyMF.mjs.map +1 -0
- package/dist/esm/EvAvatar.mjs +7 -0
- package/dist/esm/EvAvatar.mjs.map +1 -0
- package/dist/esm/EvAvatar.vue_vue_type_script_setup_true_lang-Dc4wrqw6.mjs +126 -0
- package/dist/esm/EvAvatar.vue_vue_type_script_setup_true_lang-Dc4wrqw6.mjs.map +1 -0
- package/dist/esm/EvBadge.mjs +7 -0
- package/dist/esm/EvBadge.mjs.map +1 -0
- package/dist/esm/EvBadge.vue_vue_type_script_setup_true_lang-ZpR4cKoI.mjs +185 -0
- package/dist/esm/EvBadge.vue_vue_type_script_setup_true_lang-ZpR4cKoI.mjs.map +1 -0
- package/dist/esm/EvBlock.mjs +7 -0
- package/dist/esm/EvBlock.mjs.map +1 -0
- package/dist/esm/EvBlock.vue_vue_type_script_setup_true_lang-CFD2Fb2F.mjs +81 -0
- package/dist/esm/EvBlock.vue_vue_type_script_setup_true_lang-CFD2Fb2F.mjs.map +1 -0
- package/dist/esm/EvButton.mjs +7 -0
- package/dist/esm/EvButton.mjs.map +1 -0
- package/dist/esm/EvButton.vue_vue_type_script_setup_true_lang-BeUM0Yc7.mjs +235 -0
- package/dist/esm/EvButton.vue_vue_type_script_setup_true_lang-BeUM0Yc7.mjs.map +1 -0
- package/dist/esm/EvButtonGroup-D2iMt46Z.mjs +26 -0
- package/dist/esm/EvButtonGroup-D2iMt46Z.mjs.map +1 -0
- package/dist/esm/EvButtonGroup.mjs +8 -0
- package/dist/esm/EvButtonGroup.mjs.map +1 -0
- package/dist/esm/EvButtonGroup.vue_vue_type_script_setup_true_lang-Ceb1CtSF.mjs +49 -0
- package/dist/esm/EvButtonGroup.vue_vue_type_script_setup_true_lang-Ceb1CtSF.mjs.map +1 -0
- package/dist/esm/EvButtonToggle-BS2p7ZVN.mjs +20 -0
- package/dist/esm/EvButtonToggle-BS2p7ZVN.mjs.map +1 -0
- package/dist/esm/EvButtonToggle.mjs +9 -0
- package/dist/esm/EvButtonToggle.mjs.map +1 -0
- package/dist/esm/EvButtonToggle.vue_vue_type_script_setup_true_lang-BIgv0FBi.mjs +42 -0
- package/dist/esm/EvButtonToggle.vue_vue_type_script_setup_true_lang-BIgv0FBi.mjs.map +1 -0
- package/dist/esm/EvCheckbox-Dkepsd6q.mjs +55 -0
- package/dist/esm/EvCheckbox-Dkepsd6q.mjs.map +1 -0
- package/dist/esm/EvCheckbox.mjs +9 -0
- package/dist/esm/EvCheckbox.mjs.map +1 -0
- package/dist/esm/EvCheckbox.vue_vue_type_script_setup_true_lang-D0GL3qxg.mjs +116 -0
- package/dist/esm/EvCheckbox.vue_vue_type_script_setup_true_lang-D0GL3qxg.mjs.map +1 -0
- package/dist/esm/EvContainer.mjs +7 -0
- package/dist/esm/EvContainer.mjs.map +1 -0
- package/dist/esm/EvContainer.vue_vue_type_script_setup_true_lang-BpWOEzgA.mjs +74 -0
- package/dist/esm/EvContainer.vue_vue_type_script_setup_true_lang-BpWOEzgA.mjs.map +1 -0
- package/dist/esm/EvDateField.mjs +7 -0
- package/dist/esm/EvDateField.mjs.map +1 -0
- package/dist/esm/EvDateField.vue_vue_type_script_setup_true_lang-BVusDP9Q.mjs +174 -0
- package/dist/esm/EvDateField.vue_vue_type_script_setup_true_lang-BVusDP9Q.mjs.map +1 -0
- package/dist/esm/EvDatePicker.mjs +7 -0
- package/dist/esm/EvDatePicker.mjs.map +1 -0
- package/dist/esm/EvDatePicker.vue_vue_type_script_setup_true_lang-CrQSRaia.mjs +194 -0
- package/dist/esm/EvDatePicker.vue_vue_type_script_setup_true_lang-CrQSRaia.mjs.map +1 -0
- package/dist/esm/EvDatePickerMonth.mjs +7 -0
- package/dist/esm/EvDatePickerMonth.mjs.map +1 -0
- package/dist/esm/EvDatePickerMonth.vue_vue_type_script_setup_true_lang-6aLlfATT.mjs +244 -0
- package/dist/esm/EvDatePickerMonth.vue_vue_type_script_setup_true_lang-6aLlfATT.mjs.map +1 -0
- package/dist/esm/EvDatePickerMonths.mjs +7 -0
- package/dist/esm/EvDatePickerMonths.mjs.map +1 -0
- package/dist/esm/EvDatePickerMonths.vue_vue_type_script_setup_true_lang-unQNaHyg.mjs +67 -0
- package/dist/esm/EvDatePickerMonths.vue_vue_type_script_setup_true_lang-unQNaHyg.mjs.map +1 -0
- package/dist/esm/EvDatePickerYears.mjs +7 -0
- package/dist/esm/EvDatePickerYears.mjs.map +1 -0
- package/dist/esm/EvDatePickerYears.vue_vue_type_script_setup_true_lang-57fw3I5E.mjs +93 -0
- package/dist/esm/EvDatePickerYears.vue_vue_type_script_setup_true_lang-57fw3I5E.mjs.map +1 -0
- package/dist/esm/EvDefaultsProvider.mjs +7 -0
- package/dist/esm/EvDefaultsProvider.mjs.map +1 -0
- package/dist/esm/EvDefaultsProvider.vue_vue_type_script_setup_true_lang-Bmvlcl9p.mjs +38 -0
- package/dist/esm/EvDefaultsProvider.vue_vue_type_script_setup_true_lang-Bmvlcl9p.mjs.map +1 -0
- package/dist/esm/EvDialog.mjs +9 -0
- package/dist/esm/EvDialog.mjs.map +1 -0
- package/dist/esm/EvDialog.vue_vue_type_script_setup_true_lang-B7NRZyJZ.mjs +407 -0
- package/dist/esm/EvDialog.vue_vue_type_script_setup_true_lang-B7NRZyJZ.mjs.map +1 -0
- package/dist/esm/EvDivider.mjs +6 -0
- package/dist/esm/EvDivider.mjs.map +1 -0
- package/dist/esm/EvDivider.vue_vue_type_script_setup_true_lang-NaauO5S0.mjs +82 -0
- package/dist/esm/EvDivider.vue_vue_type_script_setup_true_lang-NaauO5S0.mjs.map +1 -0
- package/dist/esm/EvDrawer.mjs +7 -0
- package/dist/esm/EvDrawer.mjs.map +1 -0
- package/dist/esm/EvDrawer.vue_vue_type_script_setup_true_lang-qggGrZpM.mjs +94 -0
- package/dist/esm/EvDrawer.vue_vue_type_script_setup_true_lang-qggGrZpM.mjs.map +1 -0
- package/dist/esm/EvErrors.mjs +7 -0
- package/dist/esm/EvErrors.mjs.map +1 -0
- package/dist/esm/EvErrors.vue_vue_type_script_setup_true_lang-CZv0xVta.mjs +55 -0
- package/dist/esm/EvErrors.vue_vue_type_script_setup_true_lang-CZv0xVta.mjs.map +1 -0
- package/dist/esm/EvForm.mjs +7 -0
- package/dist/esm/EvForm.mjs.map +1 -0
- package/dist/esm/EvForm.vue_vue_type_script_setup_true_lang-TekPpEmT.mjs +66 -0
- package/dist/esm/EvForm.vue_vue_type_script_setup_true_lang-TekPpEmT.mjs.map +1 -0
- package/dist/esm/EvIcon.mjs +9 -0
- package/dist/esm/EvIcon.mjs.map +1 -0
- package/dist/esm/EvIcon.vue_vue_type_script_setup_true_lang-0IKaAW-i.mjs +70 -0
- package/dist/esm/EvIcon.vue_vue_type_script_setup_true_lang-0IKaAW-i.mjs.map +1 -0
- package/dist/esm/EvIcon.vue_vue_type_style_index_0_lang-CkL2az6r.mjs +2 -0
- package/dist/esm/EvIcon.vue_vue_type_style_index_0_lang-CkL2az6r.mjs.map +1 -0
- package/dist/esm/EvImg.mjs +7 -0
- package/dist/esm/EvImg.mjs.map +1 -0
- package/dist/esm/EvImg.vue_vue_type_script_setup_true_lang-DJLc9gQC.mjs +373 -0
- package/dist/esm/EvImg.vue_vue_type_script_setup_true_lang-DJLc9gQC.mjs.map +1 -0
- package/dist/esm/EvKbd.mjs +7 -0
- package/dist/esm/EvKbd.mjs.map +1 -0
- package/dist/esm/EvKbd.vue_vue_type_script_setup_true_lang-DwYCbTN1.mjs +42 -0
- package/dist/esm/EvKbd.vue_vue_type_script_setup_true_lang-DwYCbTN1.mjs.map +1 -0
- package/dist/esm/EvLabel.mjs +7 -0
- package/dist/esm/EvLabel.mjs.map +1 -0
- package/dist/esm/EvLabel.vue_vue_type_script_setup_true_lang-BonVvMTI.mjs +42 -0
- package/dist/esm/EvLabel.vue_vue_type_script_setup_true_lang-BonVvMTI.mjs.map +1 -0
- package/dist/esm/EvLayout.mjs +7 -0
- package/dist/esm/EvLayout.mjs.map +1 -0
- package/dist/esm/EvLayout.vue_vue_type_script_setup_true_lang-DmebdHMW.mjs +87 -0
- package/dist/esm/EvLayout.vue_vue_type_script_setup_true_lang-DmebdHMW.mjs.map +1 -0
- package/dist/esm/EvList.mjs +8 -0
- package/dist/esm/EvList.mjs.map +1 -0
- package/dist/esm/EvList.vue_vue_type_script_setup_true_lang-Dmo2pOJY.mjs +233 -0
- package/dist/esm/EvList.vue_vue_type_script_setup_true_lang-Dmo2pOJY.mjs.map +1 -0
- package/dist/esm/EvListItem.mjs +7 -0
- package/dist/esm/EvListItem.mjs.map +1 -0
- package/dist/esm/EvListItem.vue_vue_type_script_setup_true_lang-CN2NN8CF.mjs +648 -0
- package/dist/esm/EvListItem.vue_vue_type_script_setup_true_lang-CN2NN8CF.mjs.map +1 -0
- package/dist/esm/EvLozenge.mjs +7 -0
- package/dist/esm/EvLozenge.mjs.map +1 -0
- package/dist/esm/EvLozenge.vue_vue_type_script_setup_true_lang-CGTpPoQz.mjs +71 -0
- package/dist/esm/EvLozenge.vue_vue_type_script_setup_true_lang-CGTpPoQz.mjs.map +1 -0
- package/dist/esm/EvMenu.mjs +8 -0
- package/dist/esm/EvMenu.mjs.map +1 -0
- package/dist/esm/EvMenu.vue_vue_type_script_setup_true_lang-DTZkeI63.mjs +288 -0
- package/dist/esm/EvMenu.vue_vue_type_script_setup_true_lang-DTZkeI63.mjs.map +1 -0
- package/dist/esm/EvMenuTransition.mjs +8 -0
- package/dist/esm/EvMenuTransition.mjs.map +1 -0
- package/dist/esm/EvMessage.mjs +7 -0
- package/dist/esm/EvMessage.mjs.map +1 -0
- package/dist/esm/EvMessage.vue_vue_type_script_setup_true_lang-CiDZ4Krb.mjs +233 -0
- package/dist/esm/EvMessage.vue_vue_type_script_setup_true_lang-CiDZ4Krb.mjs.map +1 -0
- package/dist/esm/EvNotification.mjs +7 -0
- package/dist/esm/EvNotification.mjs.map +1 -0
- package/dist/esm/EvNotification.vue_vue_type_script_setup_true_lang-DPjSc4ds.mjs +97 -0
- package/dist/esm/EvNotification.vue_vue_type_script_setup_true_lang-DPjSc4ds.mjs.map +1 -0
- package/dist/esm/EvNotifications.mjs +7 -0
- package/dist/esm/EvNotifications.mjs.map +1 -0
- package/dist/esm/EvNotifications.vue_vue_type_script_setup_true_lang-CbNdzJf9.mjs +158 -0
- package/dist/esm/EvNotifications.vue_vue_type_script_setup_true_lang-CbNdzJf9.mjs.map +1 -0
- package/dist/esm/EvNumberField.mjs +8 -0
- package/dist/esm/EvNumberField.mjs.map +1 -0
- package/dist/esm/EvNumberField.vue_vue_type_script_setup_true_lang-Yy9vfcJl.mjs +614 -0
- package/dist/esm/EvNumberField.vue_vue_type_script_setup_true_lang-Yy9vfcJl.mjs.map +1 -0
- package/dist/esm/EvOverlay.mjs +13 -0
- package/dist/esm/EvOverlay.mjs.map +1 -0
- package/dist/esm/EvOverlay.vue_vue_type_script_setup_true_lang-B7vUOqtk.mjs +1679 -0
- package/dist/esm/EvOverlay.vue_vue_type_script_setup_true_lang-B7vUOqtk.mjs.map +1 -0
- package/dist/esm/EvProgress.mjs +6 -0
- package/dist/esm/EvProgress.mjs.map +1 -0
- package/dist/esm/EvProgress.vue_vue_type_script_setup_true_lang-Dl7P0yRq.mjs +70 -0
- package/dist/esm/EvProgress.vue_vue_type_script_setup_true_lang-Dl7P0yRq.mjs.map +1 -0
- package/dist/esm/EvProgressCircular.mjs +6 -0
- package/dist/esm/EvProgressCircular.mjs.map +1 -0
- package/dist/esm/EvProgressCircular.vue_vue_type_script_setup_true_lang-CAqxypUT.mjs +110 -0
- package/dist/esm/EvProgressCircular.vue_vue_type_script_setup_true_lang-CAqxypUT.mjs.map +1 -0
- package/dist/esm/EvQuickfind.mjs +6 -0
- package/dist/esm/EvQuickfind.mjs.map +1 -0
- package/dist/esm/EvQuickfind.vue_vue_type_script_setup_true_lang-Cuuo8XV6.mjs +50 -0
- package/dist/esm/EvQuickfind.vue_vue_type_script_setup_true_lang-Cuuo8XV6.mjs.map +1 -0
- package/dist/esm/EvRadio.mjs +7 -0
- package/dist/esm/EvRadio.mjs.map +1 -0
- package/dist/esm/EvRadio.vue_vue_type_script_setup_true_lang-DlV-MbpO.mjs +142 -0
- package/dist/esm/EvRadio.vue_vue_type_script_setup_true_lang-DlV-MbpO.mjs.map +1 -0
- package/dist/esm/EvRadioGroup-CaprPrA6.mjs +19 -0
- package/dist/esm/EvRadioGroup-CaprPrA6.mjs.map +1 -0
- package/dist/esm/EvRadioGroup.mjs +9 -0
- package/dist/esm/EvRadioGroup.mjs.map +1 -0
- package/dist/esm/EvRadioGroup.vue_vue_type_script_setup_true_lang-DYRrUUBe.mjs +73 -0
- package/dist/esm/EvRadioGroup.vue_vue_type_script_setup_true_lang-DYRrUUBe.mjs.map +1 -0
- package/dist/esm/EvResponsive.mjs +8 -0
- package/dist/esm/EvResponsive.mjs.map +1 -0
- package/dist/esm/EvResponsive.vue_vue_type_script_setup_true_lang-CIlcD7Bm.mjs +70 -0
- package/dist/esm/EvResponsive.vue_vue_type_script_setup_true_lang-CIlcD7Bm.mjs.map +1 -0
- package/dist/esm/EvSelect.mjs +7 -0
- package/dist/esm/EvSelect.mjs.map +1 -0
- package/dist/esm/EvSelect.vue_vue_type_script_setup_true_lang-7w3Yuk21.mjs +831 -0
- package/dist/esm/EvSelect.vue_vue_type_script_setup_true_lang-7w3Yuk21.mjs.map +1 -0
- package/dist/esm/EvSlideGroup-Bb9K_O_l.mjs +38 -0
- package/dist/esm/EvSlideGroup-Bb9K_O_l.mjs.map +1 -0
- package/dist/esm/EvSlideGroup.mjs +11 -0
- package/dist/esm/EvSlideGroup.mjs.map +1 -0
- package/dist/esm/EvSlideGroup.vue_vue_type_script_setup_true_lang-DjFHk8cB.mjs +394 -0
- package/dist/esm/EvSlideGroup.vue_vue_type_script_setup_true_lang-DjFHk8cB.mjs.map +1 -0
- package/dist/esm/EvSlideGroupItem.mjs +11 -0
- package/dist/esm/EvSlideGroupItem.mjs.map +1 -0
- package/dist/esm/EvSlideGroupItem.vue_vue_type_script_setup_true_lang-C4cL9_b3.mjs +33 -0
- package/dist/esm/EvSlideGroupItem.vue_vue_type_script_setup_true_lang-C4cL9_b3.mjs.map +1 -0
- package/dist/esm/EvSpacer.mjs +7 -0
- package/dist/esm/EvSpacer.mjs.map +1 -0
- package/dist/esm/EvSpacer.vue_vue_type_script_setup_true_lang-o6T8p1_p.mjs +32 -0
- package/dist/esm/EvSpacer.vue_vue_type_script_setup_true_lang-o6T8p1_p.mjs.map +1 -0
- package/dist/esm/EvSurface.mjs +8 -0
- package/dist/esm/EvSurface.mjs.map +1 -0
- package/dist/esm/EvSurface.vue_vue_type_script_setup_true_lang-DS0eZ8OO.mjs +85 -0
- package/dist/esm/EvSurface.vue_vue_type_script_setup_true_lang-DS0eZ8OO.mjs.map +1 -0
- package/dist/esm/EvSwatch.mjs +19 -0
- package/dist/esm/EvSwatch.mjs.map +1 -0
- package/dist/esm/EvSwitch.mjs +7 -0
- package/dist/esm/EvSwitch.mjs.map +1 -0
- package/dist/esm/EvSwitch.vue_vue_type_script_setup_true_lang-BBAYA6nW.mjs +123 -0
- package/dist/esm/EvSwitch.vue_vue_type_script_setup_true_lang-BBAYA6nW.mjs.map +1 -0
- package/dist/esm/EvTab.mjs +7 -0
- package/dist/esm/EvTab.mjs.map +1 -0
- package/dist/esm/EvTab.vue_vue_type_script_setup_true_lang-Lamuf-tH.mjs +143 -0
- package/dist/esm/EvTab.vue_vue_type_script_setup_true_lang-Lamuf-tH.mjs.map +1 -0
- package/dist/esm/EvTabs.mjs +11 -0
- package/dist/esm/EvTabs.mjs.map +1 -0
- package/dist/esm/EvTabs.vue_vue_type_script_setup_true_lang-Cr1R_PfQ.mjs +71 -0
- package/dist/esm/EvTabs.vue_vue_type_script_setup_true_lang-Cr1R_PfQ.mjs.map +1 -0
- package/dist/esm/EvTag.mjs +7 -0
- package/dist/esm/EvTag.mjs.map +1 -0
- package/dist/esm/EvTag.vue_vue_type_script_setup_true_lang-BXbRdKQe.mjs +288 -0
- package/dist/esm/EvTag.vue_vue_type_script_setup_true_lang-BXbRdKQe.mjs.map +1 -0
- package/dist/esm/EvTagGroup-uirDpAwn.mjs +32 -0
- package/dist/esm/EvTagGroup-uirDpAwn.mjs.map +1 -0
- package/dist/esm/EvTagGroup.mjs +9 -0
- package/dist/esm/EvTagGroup.mjs.map +1 -0
- package/dist/esm/EvTagGroup.vue_vue_type_script_setup_true_lang-Ch4l-EKZ.mjs +59 -0
- package/dist/esm/EvTagGroup.vue_vue_type_script_setup_true_lang-Ch4l-EKZ.mjs.map +1 -0
- package/dist/esm/EvTextarea.mjs +7 -0
- package/dist/esm/EvTextarea.mjs.map +1 -0
- package/dist/esm/EvTextarea.vue_vue_type_script_setup_true_lang-DZ7h0lou.mjs +243 -0
- package/dist/esm/EvTextarea.vue_vue_type_script_setup_true_lang-DZ7h0lou.mjs.map +1 -0
- package/dist/esm/EvTextfield.mjs +7 -0
- package/dist/esm/EvTextfield.mjs.map +1 -0
- package/dist/esm/EvTextfield.vue_vue_type_script_setup_true_lang-IG-fq9hc.mjs +292 -0
- package/dist/esm/EvTextfield.vue_vue_type_script_setup_true_lang-IG-fq9hc.mjs.map +1 -0
- package/dist/esm/EvTooltip.mjs +7 -0
- package/dist/esm/EvTooltip.mjs.map +1 -0
- package/dist/esm/EvTooltip.vue_vue_type_script_setup_true_lang-S8a2zg9a.mjs +97 -0
- package/dist/esm/EvTooltip.vue_vue_type_script_setup_true_lang-S8a2zg9a.mjs.map +1 -0
- package/dist/esm/EvTransition-C4EeIQFQ.mjs +44 -0
- package/dist/esm/EvTransition-C4EeIQFQ.mjs.map +1 -0
- package/dist/esm/EvTransitionExpand.mjs +103 -0
- package/dist/esm/EvTransitionExpand.mjs.map +1 -0
- package/dist/esm/EvTransitionExpandX.mjs +7 -0
- package/dist/esm/EvTransitionExpandX.mjs.map +1 -0
- package/dist/esm/EvVirtualScroll.mjs +8 -0
- package/dist/esm/EvVirtualScroll.mjs.map +1 -0
- package/dist/esm/EvVirtualScroll.vue_vue_type_script_setup_true_lang-C-Lh9jKB.mjs +295 -0
- package/dist/esm/EvVirtualScroll.vue_vue_type_script_setup_true_lang-C-Lh9jKB.mjs.map +1 -0
- package/dist/esm/EvWindow.mjs +12 -0
- package/dist/esm/EvWindow.mjs.map +1 -0
- package/dist/esm/EvWindow.vue_vue_type_script_setup_true_lang-CQvoGhvc.mjs +250 -0
- package/dist/esm/EvWindow.vue_vue_type_script_setup_true_lang-CQvoGhvc.mjs.map +1 -0
- package/dist/esm/EvWindowItem.mjs +7 -0
- package/dist/esm/EvWindowItem.mjs.map +1 -0
- package/dist/esm/EvWindowItem.vue_vue_type_script_setup_true_lang-5YNAUykh.mjs +203 -0
- package/dist/esm/EvWindowItem.vue_vue_type_script_setup_true_lang-5YNAUykh.mjs.map +1 -0
- package/dist/esm/LocaleCode-BhvbOnjD.mjs +64 -0
- package/dist/esm/LocaleCode-BhvbOnjD.mjs.map +1 -0
- package/dist/esm/PlusIcon-C7JbM3_a.mjs +43 -0
- package/dist/esm/PlusIcon-C7JbM3_a.mjs.map +1 -0
- package/dist/esm/QuickfindIcon-BMf3kelb.mjs +26 -0
- package/dist/esm/QuickfindIcon-BMf3kelb.mjs.map +1 -0
- package/dist/esm/WarningIcon-BytgMyV0.mjs +125 -0
- package/dist/esm/WarningIcon-BytgMyV0.mjs.map +1 -0
- package/dist/esm/anchor-Bs2ZD5bJ.mjs +98 -0
- package/dist/esm/anchor-Bs2ZD5bJ.mjs.map +1 -0
- package/dist/esm/animate-8ikgrnlI.mjs +87 -0
- package/dist/esm/animate-8ikgrnlI.mjs.map +1 -0
- package/dist/esm/appearance-ZesIGtFm.mjs +121 -0
- package/dist/esm/appearance-ZesIGtFm.mjs.map +1 -0
- package/dist/esm/component-B1Vu4b6F.mjs +16 -0
- package/dist/esm/component-B1Vu4b6F.mjs.map +1 -0
- package/dist/esm/components-BXotvhfC.mjs +13 -0
- package/dist/esm/components-BXotvhfC.mjs.map +1 -0
- package/dist/esm/console-D-JUdute.mjs +8 -0
- package/dist/esm/console-D-JUdute.mjs.map +1 -0
- package/dist/esm/date-CkVwkgaG.mjs +551 -0
- package/dist/esm/date-CkVwkgaG.mjs.map +1 -0
- package/dist/esm/defaults-85ybjluN.mjs +134 -0
- package/dist/esm/defaults-85ybjluN.mjs.map +1 -0
- package/dist/esm/dimensions-Boi8XxS9.mjs +30 -0
- package/dist/esm/dimensions-Boi8XxS9.mjs.map +1 -0
- package/dist/esm/display-DC1F6kUc.mjs +271 -0
- package/dist/esm/display-DC1F6kUc.mjs.map +1 -0
- package/dist/esm/form-CWR7C9h1.mjs +145 -0
- package/dist/esm/form-CWR7C9h1.mjs.map +1 -0
- package/dist/esm/group-D27wToOK.mjs +216 -0
- package/dist/esm/group-D27wToOK.mjs.map +1 -0
- package/dist/esm/groupItem-DSjrmzq0.mjs +81 -0
- package/dist/esm/groupItem-DSjrmzq0.mjs.map +1 -0
- package/dist/esm/hasSlotWithContent-Kg4XNNJc.mjs +21 -0
- package/dist/esm/hasSlotWithContent-Kg4XNNJc.mjs.map +1 -0
- package/dist/esm/helpers-pCeamm7z.mjs +193 -0
- package/dist/esm/helpers-pCeamm7z.mjs.map +1 -0
- package/dist/esm/icons/brand.mjs +337 -0
- package/dist/esm/icons/brand.mjs.map +1 -0
- package/dist/esm/icons/editor.mjs +2711 -0
- package/dist/esm/icons/editor.mjs.map +1 -0
- package/dist/esm/icons-DfxSkG9-.mjs +29 -0
- package/dist/esm/icons-DfxSkG9-.mjs.map +1 -0
- package/dist/esm/icons.mjs +5029 -0
- package/dist/esm/icons.mjs.map +1 -0
- package/dist/esm/index.mjs +876 -0
- package/dist/esm/index.mjs.map +1 -0
- package/dist/esm/is-functions-DDx5Oqi8.mjs +98 -0
- package/dist/esm/is-functions-DDx5Oqi8.mjs.map +1 -0
- package/dist/esm/locale-DweIso7z.mjs +385 -0
- package/dist/esm/locale-DweIso7z.mjs.map +1 -0
- package/dist/esm/modelProxy-B-YOpPOA.mjs +61 -0
- package/dist/esm/modelProxy-B-YOpPOA.mjs.map +1 -0
- package/dist/esm/modifiers-CxxlSc0X.mjs +34 -0
- package/dist/esm/modifiers-CxxlSc0X.mjs.map +1 -0
- package/dist/esm/numbers-BH699wFZ.mjs +10 -0
- package/dist/esm/numbers-BH699wFZ.mjs.map +1 -0
- package/dist/esm/props-DiPGFtXP.mjs +25 -0
- package/dist/esm/props-DiPGFtXP.mjs.map +1 -0
- package/dist/esm/resizeObserver-D9WlfHuI.mjs +47 -0
- package/dist/esm/resizeObserver-D9WlfHuI.mjs.map +1 -0
- package/dist/esm/router-BLIhuWjm.mjs +170 -0
- package/dist/esm/router-BLIhuWjm.mjs.map +1 -0
- package/dist/esm/scroll-DhwBrsLZ.mjs +49 -0
- package/dist/esm/scroll-DhwBrsLZ.mjs.map +1 -0
- package/dist/esm/stack-D6IUUBTM.mjs +64 -0
- package/dist/esm/stack-D6IUUBTM.mjs.map +1 -0
- package/dist/esm/strings-BCIXK-n6.mjs +61 -0
- package/dist/esm/strings-BCIXK-n6.mjs.map +1 -0
- package/dist/esm/style.css +18071 -0
- package/dist/esm/tag-BExK_t_Z.mjs +15 -0
- package/dist/esm/tag-BExK_t_Z.mjs.map +1 -0
- package/dist/esm/teleport-Bgyu2Zu9.mjs +38 -0
- package/dist/esm/teleport-Bgyu2Zu9.mjs.map +1 -0
- package/dist/esm/toggleScope-DZjyN4D1.mjs +33 -0
- package/dist/esm/toggleScope-DZjyN4D1.mjs.map +1 -0
- package/dist/esm/units-CIdrAzJr.mjs +26 -0
- package/dist/esm/units-CIdrAzJr.mjs.map +1 -0
- package/dist/esm/validation-jCNfq7fU.mjs +305 -0
- package/dist/esm/validation-jCNfq7fU.mjs.map +1 -0
- package/dist/evance-ui.js +6 -0
- package/dist/evance-ui.js.map +1 -0
- package/dist/evance-ui.mjs +11471 -0
- package/dist/evance-ui.mjs.map +1 -0
- package/dist/style.css +1 -0
- package/dist/types/components/EvAvatar/EvAvatar.d.ts +84 -0
- package/dist/types/components/EvAvatar/EvAvatar.d.ts.map +1 -0
- package/dist/types/components/EvAvatar/EvAvatar.vue.d.ts +70 -0
- package/dist/types/components/EvAvatar/EvAvatar.vue.d.ts.map +1 -0
- package/dist/types/components/EvAvatar/index.d.ts +3 -0
- package/dist/types/components/EvAvatar/index.d.ts.map +1 -0
- package/dist/types/components/EvBadge/EvBadge.d.ts +136 -0
- package/dist/types/components/EvBadge/EvBadge.d.ts.map +1 -0
- package/dist/types/components/EvBadge/EvBadge.vue.d.ts +105 -0
- package/dist/types/components/EvBadge/EvBadge.vue.d.ts.map +1 -0
- package/dist/types/components/EvBadge/index.d.ts +3 -0
- package/dist/types/components/EvBadge/index.d.ts.map +1 -0
- package/dist/types/components/EvButton/EvButton.d.ts +182 -0
- package/dist/types/components/EvButton/EvButton.d.ts.map +1 -0
- package/dist/types/components/EvButton/EvButton.vue.d.ts +113 -0
- package/dist/types/components/EvButton/EvButton.vue.d.ts.map +1 -0
- package/dist/types/components/EvButton/index.d.ts +3 -0
- package/dist/types/components/EvButton/index.d.ts.map +1 -0
- package/dist/types/components/EvButtonGroup/EvButtonGroup.d.ts +67 -0
- package/dist/types/components/EvButtonGroup/EvButtonGroup.d.ts.map +1 -0
- package/dist/types/components/EvButtonGroup/EvButtonGroup.vue.d.ts +57 -0
- package/dist/types/components/EvButtonGroup/EvButtonGroup.vue.d.ts.map +1 -0
- package/dist/types/components/EvButtonGroup/index.d.ts +3 -0
- package/dist/types/components/EvButtonGroup/index.d.ts.map +1 -0
- package/dist/types/components/EvButtonToggle/EvButtonToggle.d.ts +134 -0
- package/dist/types/components/EvButtonToggle/EvButtonToggle.d.ts.map +1 -0
- package/dist/types/components/EvButtonToggle/EvButtonToggle.vue.d.ts +103 -0
- package/dist/types/components/EvButtonToggle/EvButtonToggle.vue.d.ts.map +1 -0
- package/dist/types/components/EvButtonToggle/index.d.ts +3 -0
- package/dist/types/components/EvButtonToggle/index.d.ts.map +1 -0
- package/dist/types/components/EvCheckbox/EvCheckbox.d.ts +139 -0
- package/dist/types/components/EvCheckbox/EvCheckbox.d.ts.map +1 -0
- package/dist/types/components/EvCheckbox/EvCheckbox.vue.d.ts +90 -0
- package/dist/types/components/EvCheckbox/EvCheckbox.vue.d.ts.map +1 -0
- package/dist/types/components/EvCheckbox/index.d.ts +3 -0
- package/dist/types/components/EvCheckbox/index.d.ts.map +1 -0
- package/dist/types/components/EvDateField/EvDateField.d.ts +241 -0
- package/dist/types/components/EvDateField/EvDateField.d.ts.map +1 -0
- package/dist/types/components/EvDateField/EvDateField.vue.d.ts +160 -0
- package/dist/types/components/EvDateField/EvDateField.vue.d.ts.map +1 -0
- package/dist/types/components/EvDateField/index.d.ts +3 -0
- package/dist/types/components/EvDateField/index.d.ts.map +1 -0
- package/dist/types/components/EvDatePicker/EvDatePicker.d.ts +69 -0
- package/dist/types/components/EvDatePicker/EvDatePicker.d.ts.map +1 -0
- package/dist/types/components/EvDatePicker/EvDatePicker.vue.d.ts +56 -0
- package/dist/types/components/EvDatePicker/EvDatePicker.vue.d.ts.map +1 -0
- package/dist/types/components/EvDatePicker/EvDatePickerMonth/EvDatePickerMonth.d.ts +82 -0
- package/dist/types/components/EvDatePicker/EvDatePickerMonth/EvDatePickerMonth.d.ts.map +1 -0
- package/dist/types/components/EvDatePicker/EvDatePickerMonth/EvDatePickerMonth.vue.d.ts +45 -0
- package/dist/types/components/EvDatePicker/EvDatePickerMonth/EvDatePickerMonth.vue.d.ts.map +1 -0
- package/dist/types/components/EvDatePicker/EvDatePickerMonth/index.d.ts +3 -0
- package/dist/types/components/EvDatePicker/EvDatePickerMonth/index.d.ts.map +1 -0
- package/dist/types/components/EvDatePicker/EvDatePickerMonths/EvDatePickerMonths.d.ts +9 -0
- package/dist/types/components/EvDatePicker/EvDatePickerMonths/EvDatePickerMonths.d.ts.map +1 -0
- package/dist/types/components/EvDatePicker/EvDatePickerMonths/EvDatePickerMonths.vue.d.ts +12 -0
- package/dist/types/components/EvDatePicker/EvDatePickerMonths/EvDatePickerMonths.vue.d.ts.map +1 -0
- package/dist/types/components/EvDatePicker/EvDatePickerMonths/index.d.ts +3 -0
- package/dist/types/components/EvDatePicker/EvDatePickerMonths/index.d.ts.map +1 -0
- package/dist/types/components/EvDatePicker/EvDatePickerYears/EvDatePickerYears.d.ts +21 -0
- package/dist/types/components/EvDatePicker/EvDatePickerYears/EvDatePickerYears.d.ts.map +1 -0
- package/dist/types/components/EvDatePicker/EvDatePickerYears/EvDatePickerYears.vue.d.ts +16 -0
- package/dist/types/components/EvDatePicker/EvDatePickerYears/EvDatePickerYears.vue.d.ts.map +1 -0
- package/dist/types/components/EvDatePicker/EvDatePickerYears/index.d.ts +3 -0
- package/dist/types/components/EvDatePicker/EvDatePickerYears/index.d.ts.map +1 -0
- package/dist/types/components/EvDatePicker/index.d.ts +3 -0
- package/dist/types/components/EvDatePicker/index.d.ts.map +1 -0
- package/dist/types/components/EvDefaultsProvider/EvDefaultsProvider.d.ts +46 -0
- package/dist/types/components/EvDefaultsProvider/EvDefaultsProvider.d.ts.map +1 -0
- package/dist/types/components/EvDefaultsProvider/EvDefaultsProvider.vue.d.ts +31 -0
- package/dist/types/components/EvDefaultsProvider/EvDefaultsProvider.vue.d.ts.map +1 -0
- package/dist/types/components/EvDefaultsProvider/index.d.ts +3 -0
- package/dist/types/components/EvDefaultsProvider/index.d.ts.map +1 -0
- package/dist/types/components/EvDialog/EvDialog.d.ts +1153 -0
- package/dist/types/components/EvDialog/EvDialog.d.ts.map +1 -0
- package/dist/types/components/EvDialog/EvDialog.vue.d.ts +758 -0
- package/dist/types/components/EvDialog/EvDialog.vue.d.ts.map +1 -0
- package/dist/types/components/EvDialog/EvDialogBody.vue.d.ts +10 -0
- package/dist/types/components/EvDialog/EvDialogBody.vue.d.ts.map +1 -0
- package/dist/types/components/EvDialog/EvDialogFooter.vue.d.ts +10 -0
- package/dist/types/components/EvDialog/EvDialogFooter.vue.d.ts.map +1 -0
- package/dist/types/components/EvDialog/EvDialogHeader.vue.d.ts +24 -0
- package/dist/types/components/EvDialog/EvDialogHeader.vue.d.ts.map +1 -0
- package/dist/types/components/EvDialog/EvDialogInstance.d.ts +13 -0
- package/dist/types/components/EvDialog/EvDialogInstance.d.ts.map +1 -0
- package/dist/types/components/EvDialog/EvDialogRenderer.d.ts +62 -0
- package/dist/types/components/EvDialog/EvDialogRenderer.d.ts.map +1 -0
- package/dist/types/components/EvDialog/EvDialogServiceOpener.d.ts +37 -0
- package/dist/types/components/EvDialog/EvDialogServiceOpener.d.ts.map +1 -0
- package/dist/types/components/EvDialog/EvDialogTransition.vue.d.ts +28 -0
- package/dist/types/components/EvDialog/EvDialogTransition.vue.d.ts.map +1 -0
- package/dist/types/components/EvDialog/index.d.ts +3 -0
- package/dist/types/components/EvDialog/index.d.ts.map +1 -0
- package/dist/types/components/EvDivider/EvDivider.vue.d.ts +61 -0
- package/dist/types/components/EvDivider/EvDivider.vue.d.ts.map +1 -0
- package/dist/types/components/EvDivider/index.d.ts +2 -0
- package/dist/types/components/EvDivider/index.d.ts.map +1 -0
- package/dist/types/components/EvDrawer/EvDrawer.d.ts +1144 -0
- package/dist/types/components/EvDrawer/EvDrawer.d.ts.map +1 -0
- package/dist/types/components/EvDrawer/EvDrawer.vue.d.ts +746 -0
- package/dist/types/components/EvDrawer/EvDrawer.vue.d.ts.map +1 -0
- package/dist/types/components/EvDrawer/EvDrawerInstance.d.ts +13 -0
- package/dist/types/components/EvDrawer/EvDrawerInstance.d.ts.map +1 -0
- package/dist/types/components/EvDrawer/EvDrawerRenderer.d.ts +62 -0
- package/dist/types/components/EvDrawer/EvDrawerRenderer.d.ts.map +1 -0
- package/dist/types/components/EvDrawer/EvDrawerServiceOpener.d.ts +23 -0
- package/dist/types/components/EvDrawer/EvDrawerServiceOpener.d.ts.map +1 -0
- package/dist/types/components/EvDrawer/index.d.ts +3 -0
- package/dist/types/components/EvDrawer/index.d.ts.map +1 -0
- package/dist/types/components/EvErrors/EvErrors.d.ts +38 -0
- package/dist/types/components/EvErrors/EvErrors.d.ts.map +1 -0
- package/dist/types/components/EvErrors/EvErrors.vue.d.ts +30 -0
- package/dist/types/components/EvErrors/EvErrors.vue.d.ts.map +1 -0
- package/dist/types/components/EvErrors/index.d.ts +3 -0
- package/dist/types/components/EvErrors/index.d.ts.map +1 -0
- package/dist/types/components/EvForm/EvForm.d.ts +52 -0
- package/dist/types/components/EvForm/EvForm.d.ts.map +1 -0
- package/dist/types/components/EvForm/EvForm.vue.d.ts +61 -0
- package/dist/types/components/EvForm/EvForm.vue.d.ts.map +1 -0
- package/dist/types/components/EvForm/index.d.ts +3 -0
- package/dist/types/components/EvForm/index.d.ts.map +1 -0
- package/dist/types/components/EvGrid/EvBlock/EvBlock.d.ts +102 -0
- package/dist/types/components/EvGrid/EvBlock/EvBlock.d.ts.map +1 -0
- package/dist/types/components/EvGrid/EvBlock/EvBlock.vue.d.ts +51 -0
- package/dist/types/components/EvGrid/EvBlock/EvBlock.vue.d.ts.map +1 -0
- package/dist/types/components/EvGrid/EvBlock/index.d.ts +3 -0
- package/dist/types/components/EvGrid/EvBlock/index.d.ts.map +1 -0
- package/dist/types/components/EvGrid/EvContainer/EvContainer.d.ts +68 -0
- package/dist/types/components/EvGrid/EvContainer/EvContainer.d.ts.map +1 -0
- package/dist/types/components/EvGrid/EvContainer/EvContainer.vue.d.ts +52 -0
- package/dist/types/components/EvGrid/EvContainer/EvContainer.vue.d.ts.map +1 -0
- package/dist/types/components/EvGrid/EvContainer/index.d.ts +3 -0
- package/dist/types/components/EvGrid/EvContainer/index.d.ts.map +1 -0
- package/dist/types/components/EvGrid/EvLayout/EvLayout.d.ts +106 -0
- package/dist/types/components/EvGrid/EvLayout/EvLayout.d.ts.map +1 -0
- package/dist/types/components/EvGrid/EvLayout/EvLayout.vue.d.ts +54 -0
- package/dist/types/components/EvGrid/EvLayout/EvLayout.vue.d.ts.map +1 -0
- package/dist/types/components/EvGrid/EvLayout/index.d.ts +3 -0
- package/dist/types/components/EvGrid/EvLayout/index.d.ts.map +1 -0
- package/dist/types/components/EvGrid/EvSpacer/EvSpacer.d.ts +23 -0
- package/dist/types/components/EvGrid/EvSpacer/EvSpacer.d.ts.map +1 -0
- package/dist/types/components/EvGrid/EvSpacer/EvSpacer.vue.d.ts +25 -0
- package/dist/types/components/EvGrid/EvSpacer/EvSpacer.vue.d.ts.map +1 -0
- package/dist/types/components/EvGrid/EvSpacer/index.d.ts +3 -0
- package/dist/types/components/EvGrid/EvSpacer/index.d.ts.map +1 -0
- package/dist/types/components/EvGrid/index.d.ts +5 -0
- package/dist/types/components/EvGrid/index.d.ts.map +1 -0
- package/dist/types/components/EvIcon/EvIcon.d.ts +51 -0
- package/dist/types/components/EvIcon/EvIcon.d.ts.map +1 -0
- package/dist/types/components/EvIcon/EvIcon.vue.d.ts +20 -0
- package/dist/types/components/EvIcon/EvIcon.vue.d.ts.map +1 -0
- package/dist/types/components/EvIcon/index.d.ts +3 -0
- package/dist/types/components/EvIcon/index.d.ts.map +1 -0
- package/dist/types/components/EvImg/EvImg.d.ts +197 -0
- package/dist/types/components/EvImg/EvImg.d.ts.map +1 -0
- package/dist/types/components/EvImg/EvImg.vue.d.ts +126 -0
- package/dist/types/components/EvImg/EvImg.vue.d.ts.map +1 -0
- package/dist/types/components/EvImg/index.d.ts +3 -0
- package/dist/types/components/EvImg/index.d.ts.map +1 -0
- package/dist/types/components/EvKbd/EvKbd.d.ts +33 -0
- package/dist/types/components/EvKbd/EvKbd.d.ts.map +1 -0
- package/dist/types/components/EvKbd/EvKbd.vue.d.ts +29 -0
- package/dist/types/components/EvKbd/EvKbd.vue.d.ts.map +1 -0
- package/dist/types/components/EvKbd/index.d.ts +3 -0
- package/dist/types/components/EvKbd/index.d.ts.map +1 -0
- package/dist/types/components/EvLabel/EvLabel.d.ts +30 -0
- package/dist/types/components/EvLabel/EvLabel.d.ts.map +1 -0
- package/dist/types/components/EvLabel/EvLabel.vue.d.ts +30 -0
- package/dist/types/components/EvLabel/EvLabel.vue.d.ts.map +1 -0
- package/dist/types/components/EvLabel/index.d.ts +3 -0
- package/dist/types/components/EvLabel/index.d.ts.map +1 -0
- package/dist/types/components/EvList/EvList.d.ts +212 -0
- package/dist/types/components/EvList/EvList.d.ts.map +1 -0
- package/dist/types/components/EvList/EvList.vue.d.ts +148 -0
- package/dist/types/components/EvList/EvList.vue.d.ts.map +1 -0
- package/dist/types/components/EvList/EvListChildren.vue.d.ts +20 -0
- package/dist/types/components/EvList/EvListChildren.vue.d.ts.map +1 -0
- package/dist/types/components/EvList/index.d.ts +3 -0
- package/dist/types/components/EvList/index.d.ts.map +1 -0
- package/dist/types/components/EvListItem/EvListItem.d.ts +112 -0
- package/dist/types/components/EvListItem/EvListItem.d.ts.map +1 -0
- package/dist/types/components/EvListItem/EvListItem.vue.d.ts +89 -0
- package/dist/types/components/EvListItem/EvListItem.vue.d.ts.map +1 -0
- package/dist/types/components/EvListItem/index.d.ts +3 -0
- package/dist/types/components/EvListItem/index.d.ts.map +1 -0
- package/dist/types/components/EvLozenge/EvLozenge.d.ts +80 -0
- package/dist/types/components/EvLozenge/EvLozenge.d.ts.map +1 -0
- package/dist/types/components/EvLozenge/EvLozenge.vue.d.ts +71 -0
- package/dist/types/components/EvLozenge/EvLozenge.vue.d.ts.map +1 -0
- package/dist/types/components/EvLozenge/index.d.ts +3 -0
- package/dist/types/components/EvLozenge/index.d.ts.map +1 -0
- package/dist/types/components/EvMenu/EvMenu.d.ts +1126 -0
- package/dist/types/components/EvMenu/EvMenu.d.ts.map +1 -0
- package/dist/types/components/EvMenu/EvMenu.vue.d.ts +759 -0
- package/dist/types/components/EvMenu/EvMenu.vue.d.ts.map +1 -0
- package/dist/types/components/EvMenu/EvMenuTransition.vue.d.ts +16 -0
- package/dist/types/components/EvMenu/EvMenuTransition.vue.d.ts.map +1 -0
- package/dist/types/components/EvMenu/index.d.ts +4 -0
- package/dist/types/components/EvMenu/index.d.ts.map +1 -0
- package/dist/types/components/EvMenu/shared.d.ts +10 -0
- package/dist/types/components/EvMenu/shared.d.ts.map +1 -0
- package/dist/types/components/EvMessage/EvMessage.d.ts +148 -0
- package/dist/types/components/EvMessage/EvMessage.d.ts.map +1 -0
- package/dist/types/components/EvMessage/EvMessage.vue.d.ts +108 -0
- package/dist/types/components/EvMessage/EvMessage.vue.d.ts.map +1 -0
- package/dist/types/components/EvMessage/index.d.ts +3 -0
- package/dist/types/components/EvMessage/index.d.ts.map +1 -0
- package/dist/types/components/EvNotification/EvNotification.d.ts +170 -0
- package/dist/types/components/EvNotification/EvNotification.d.ts.map +1 -0
- package/dist/types/components/EvNotification/EvNotification.vue.d.ts +139 -0
- package/dist/types/components/EvNotification/EvNotification.vue.d.ts.map +1 -0
- package/dist/types/components/EvNotification/index.d.ts +3 -0
- package/dist/types/components/EvNotification/index.d.ts.map +1 -0
- package/dist/types/components/EvNotifications/EvNotifications.d.ts +15 -0
- package/dist/types/components/EvNotifications/EvNotifications.d.ts.map +1 -0
- package/dist/types/components/EvNotifications/EvNotifications.vue.d.ts +4 -0
- package/dist/types/components/EvNotifications/EvNotifications.vue.d.ts.map +1 -0
- package/dist/types/components/EvNotifications/EvNotificationsManager.d.ts +93 -0
- package/dist/types/components/EvNotifications/EvNotificationsManager.d.ts.map +1 -0
- package/dist/types/components/EvNotifications/index.d.ts +4 -0
- package/dist/types/components/EvNotifications/index.d.ts.map +1 -0
- package/dist/types/components/EvNumberField/EvNumberField.d.ts +396 -0
- package/dist/types/components/EvNumberField/EvNumberField.d.ts.map +1 -0
- package/dist/types/components/EvNumberField/EvNumberField.vue.d.ts +180 -0
- package/dist/types/components/EvNumberField/EvNumberField.vue.d.ts.map +1 -0
- package/dist/types/components/EvNumberField/index.d.ts +3 -0
- package/dist/types/components/EvNumberField/index.d.ts.map +1 -0
- package/dist/types/components/EvOverlay/EvOverlay.d.ts +271 -0
- package/dist/types/components/EvOverlay/EvOverlay.d.ts.map +1 -0
- package/dist/types/components/EvOverlay/EvOverlay.vue.d.ts +203 -0
- package/dist/types/components/EvOverlay/EvOverlay.vue.d.ts.map +1 -0
- package/dist/types/components/EvOverlay/activator.d.ts +228 -0
- package/dist/types/components/EvOverlay/activator.d.ts.map +1 -0
- package/dist/types/components/EvOverlay/index.d.ts +6 -0
- package/dist/types/components/EvOverlay/index.d.ts.map +1 -0
- package/dist/types/components/EvOverlay/position-strategy/connected-position.d.ts +16 -0
- package/dist/types/components/EvOverlay/position-strategy/connected-position.d.ts.map +1 -0
- package/dist/types/components/EvOverlay/position-strategy/index.d.ts +3 -0
- package/dist/types/components/EvOverlay/position-strategy/index.d.ts.map +1 -0
- package/dist/types/components/EvOverlay/position-strategy/static-position.d.ts +11 -0
- package/dist/types/components/EvOverlay/position-strategy/static-position.d.ts.map +1 -0
- package/dist/types/components/EvOverlay/position.d.ts +82 -0
- package/dist/types/components/EvOverlay/position.d.ts.map +1 -0
- package/dist/types/components/EvOverlay/scroll-strategy/block-scroll.d.ts +9 -0
- package/dist/types/components/EvOverlay/scroll-strategy/block-scroll.d.ts.map +1 -0
- package/dist/types/components/EvOverlay/scroll-strategy/close-scroll.d.ts +8 -0
- package/dist/types/components/EvOverlay/scroll-strategy/close-scroll.d.ts.map +1 -0
- package/dist/types/components/EvOverlay/scroll-strategy/index.d.ts +4 -0
- package/dist/types/components/EvOverlay/scroll-strategy/index.d.ts.map +1 -0
- package/dist/types/components/EvOverlay/scroll-strategy/reposition-scroll.d.ts +11 -0
- package/dist/types/components/EvOverlay/scroll-strategy/reposition-scroll.d.ts.map +1 -0
- package/dist/types/components/EvOverlay/scroll.d.ts +48 -0
- package/dist/types/components/EvOverlay/scroll.d.ts.map +1 -0
- package/dist/types/components/EvProgress/EvProgress.vue.d.ts +43 -0
- package/dist/types/components/EvProgress/EvProgress.vue.d.ts.map +1 -0
- package/dist/types/components/EvProgress/index.d.ts +2 -0
- package/dist/types/components/EvProgress/index.d.ts.map +1 -0
- package/dist/types/components/EvProgressCircular/EvProgressCircular.vue.d.ts +59 -0
- package/dist/types/components/EvProgressCircular/EvProgressCircular.vue.d.ts.map +1 -0
- package/dist/types/components/EvProgressCircular/index.d.ts +2 -0
- package/dist/types/components/EvProgressCircular/index.d.ts.map +1 -0
- package/dist/types/components/EvQuickfind/EvQuickfind.vue.d.ts +36 -0
- package/dist/types/components/EvQuickfind/EvQuickfind.vue.d.ts.map +1 -0
- package/dist/types/components/EvQuickfind/index.d.ts +2 -0
- package/dist/types/components/EvQuickfind/index.d.ts.map +1 -0
- package/dist/types/components/EvRadio/EvRadio.d.ts +100 -0
- package/dist/types/components/EvRadio/EvRadio.d.ts.map +1 -0
- package/dist/types/components/EvRadio/EvRadio.vue.d.ts +78 -0
- package/dist/types/components/EvRadio/EvRadio.vue.d.ts.map +1 -0
- package/dist/types/components/EvRadio/index.d.ts +3 -0
- package/dist/types/components/EvRadio/index.d.ts.map +1 -0
- package/dist/types/components/EvRadioGroup/EvRadioGroup.d.ts +98 -0
- package/dist/types/components/EvRadioGroup/EvRadioGroup.d.ts.map +1 -0
- package/dist/types/components/EvRadioGroup/EvRadioGroup.vue.d.ts +68 -0
- package/dist/types/components/EvRadioGroup/EvRadioGroup.vue.d.ts.map +1 -0
- package/dist/types/components/EvRadioGroup/index.d.ts +3 -0
- package/dist/types/components/EvRadioGroup/index.d.ts.map +1 -0
- package/dist/types/components/EvResponsive/EvResponsive.d.ts +104 -0
- package/dist/types/components/EvResponsive/EvResponsive.d.ts.map +1 -0
- package/dist/types/components/EvResponsive/EvResponsive.vue.d.ts +45 -0
- package/dist/types/components/EvResponsive/EvResponsive.vue.d.ts.map +1 -0
- package/dist/types/components/EvResponsive/index.d.ts +3 -0
- package/dist/types/components/EvResponsive/index.d.ts.map +1 -0
- package/dist/types/components/EvSelect/EvSelect.d.ts +379 -0
- package/dist/types/components/EvSelect/EvSelect.d.ts.map +1 -0
- package/dist/types/components/EvSelect/EvSelect.vue.d.ts +284 -0
- package/dist/types/components/EvSelect/EvSelect.vue.d.ts.map +1 -0
- package/dist/types/components/EvSelect/index.d.ts +3 -0
- package/dist/types/components/EvSelect/index.d.ts.map +1 -0
- package/dist/types/components/EvSelect/useScrolling.d.ts +15 -0
- package/dist/types/components/EvSelect/useScrolling.d.ts.map +1 -0
- package/dist/types/components/EvSlideGroup/EvSlideGroup.d.ts +152 -0
- package/dist/types/components/EvSlideGroup/EvSlideGroup.d.ts.map +1 -0
- package/dist/types/components/EvSlideGroup/EvSlideGroup.vue.d.ts +101 -0
- package/dist/types/components/EvSlideGroup/EvSlideGroup.vue.d.ts.map +1 -0
- package/dist/types/components/EvSlideGroup/EvSlideGroupItem.vue.d.ts +38 -0
- package/dist/types/components/EvSlideGroup/EvSlideGroupItem.vue.d.ts.map +1 -0
- package/dist/types/components/EvSlideGroup/helpers.d.ts +41 -0
- package/dist/types/components/EvSlideGroup/helpers.d.ts.map +1 -0
- package/dist/types/components/EvSlideGroup/index.d.ts +4 -0
- package/dist/types/components/EvSlideGroup/index.d.ts.map +1 -0
- package/dist/types/components/EvSurface/EvSurface.d.ts +85 -0
- package/dist/types/components/EvSurface/EvSurface.d.ts.map +1 -0
- package/dist/types/components/EvSurface/EvSurface.vue.d.ts +53 -0
- package/dist/types/components/EvSurface/EvSurface.vue.d.ts.map +1 -0
- package/dist/types/components/EvSurface/index.d.ts +3 -0
- package/dist/types/components/EvSurface/index.d.ts.map +1 -0
- package/dist/types/components/EvSwatch/EvSwatch.d.ts +1 -0
- package/dist/types/components/EvSwatch/EvSwatch.d.ts.map +1 -0
- package/dist/types/components/EvSwatch/EvSwatch.vue.d.ts +4 -0
- package/dist/types/components/EvSwatch/EvSwatch.vue.d.ts.map +1 -0
- package/dist/types/components/EvSwatch/index.d.ts +3 -0
- package/dist/types/components/EvSwatch/index.d.ts.map +1 -0
- package/dist/types/components/EvSwitch/EvSwitch.d.ts +122 -0
- package/dist/types/components/EvSwitch/EvSwitch.d.ts.map +1 -0
- package/dist/types/components/EvSwitch/EvSwitch.vue.d.ts +90 -0
- package/dist/types/components/EvSwitch/EvSwitch.vue.d.ts.map +1 -0
- package/dist/types/components/EvSwitch/index.d.ts +3 -0
- package/dist/types/components/EvSwitch/index.d.ts.map +1 -0
- package/dist/types/components/EvTabs/EvTab/EvTab.d.ts +170 -0
- package/dist/types/components/EvTabs/EvTab/EvTab.d.ts.map +1 -0
- package/dist/types/components/EvTabs/EvTab/EvTab.vue.d.ts +120 -0
- package/dist/types/components/EvTabs/EvTab/EvTab.vue.d.ts.map +1 -0
- package/dist/types/components/EvTabs/EvTab/index.d.ts +3 -0
- package/dist/types/components/EvTabs/EvTab/index.d.ts.map +1 -0
- package/dist/types/components/EvTabs/EvTabs.d.ts +180 -0
- package/dist/types/components/EvTabs/EvTabs.d.ts.map +1 -0
- package/dist/types/components/EvTabs/EvTabs.vue.d.ts +133 -0
- package/dist/types/components/EvTabs/EvTabs.vue.d.ts.map +1 -0
- package/dist/types/components/EvTabs/index.d.ts +4 -0
- package/dist/types/components/EvTabs/index.d.ts.map +1 -0
- package/dist/types/components/EvTag/EvTag.d.ts +203 -0
- package/dist/types/components/EvTag/EvTag.d.ts.map +1 -0
- package/dist/types/components/EvTag/EvTag.vue.d.ts +140 -0
- package/dist/types/components/EvTag/EvTag.vue.d.ts.map +1 -0
- package/dist/types/components/EvTag/index.d.ts +3 -0
- package/dist/types/components/EvTag/index.d.ts.map +1 -0
- package/dist/types/components/EvTagGroup/EvTagGroup.d.ts +185 -0
- package/dist/types/components/EvTagGroup/EvTagGroup.d.ts.map +1 -0
- package/dist/types/components/EvTagGroup/EvTagGroup.vue.d.ts +130 -0
- package/dist/types/components/EvTagGroup/EvTagGroup.vue.d.ts.map +1 -0
- package/dist/types/components/EvTagGroup/index.d.ts +3 -0
- package/dist/types/components/EvTagGroup/index.d.ts.map +1 -0
- package/dist/types/components/EvTextarea/EvTextarea.d.ts +139 -0
- package/dist/types/components/EvTextarea/EvTextarea.d.ts.map +1 -0
- package/dist/types/components/EvTextarea/EvTextarea.vue.d.ts +112 -0
- package/dist/types/components/EvTextarea/EvTextarea.vue.d.ts.map +1 -0
- package/dist/types/components/EvTextarea/index.d.ts +3 -0
- package/dist/types/components/EvTextarea/index.d.ts.map +1 -0
- package/dist/types/components/EvTextfield/EvTextfield.d.ts +194 -0
- package/dist/types/components/EvTextfield/EvTextfield.d.ts.map +1 -0
- package/dist/types/components/EvTextfield/EvTextfield.vue.d.ts +149 -0
- package/dist/types/components/EvTextfield/EvTextfield.vue.d.ts.map +1 -0
- package/dist/types/components/EvTextfield/index.d.ts +3 -0
- package/dist/types/components/EvTextfield/index.d.ts.map +1 -0
- package/dist/types/components/EvTooltip/EvTooltip.d.ts +343 -0
- package/dist/types/components/EvTooltip/EvTooltip.d.ts.map +1 -0
- package/dist/types/components/EvTooltip/EvTooltip.vue.d.ts +264 -0
- package/dist/types/components/EvTooltip/EvTooltip.vue.d.ts.map +1 -0
- package/dist/types/components/EvTooltip/index.d.ts +3 -0
- package/dist/types/components/EvTooltip/index.d.ts.map +1 -0
- package/dist/types/components/EvTransition/EvTransition.d.ts +51 -0
- package/dist/types/components/EvTransition/EvTransition.d.ts.map +1 -0
- package/dist/types/components/EvTransition/index.d.ts +2 -0
- package/dist/types/components/EvTransition/index.d.ts.map +1 -0
- package/dist/types/components/EvTransition/transitions/createTransition.d.ts +12 -0
- package/dist/types/components/EvTransition/transitions/createTransition.d.ts.map +1 -0
- package/dist/types/components/EvTransition/transitions/expandTransition.d.ts +48 -0
- package/dist/types/components/EvTransition/transitions/expandTransition.d.ts.map +1 -0
- package/dist/types/components/EvTransition/transitions/index.d.ts +7 -0
- package/dist/types/components/EvTransition/transitions/index.d.ts.map +1 -0
- package/dist/types/components/EvVirtualScroll/EvVirtualScroll.d.ts +113 -0
- package/dist/types/components/EvVirtualScroll/EvVirtualScroll.d.ts.map +1 -0
- package/dist/types/components/EvVirtualScroll/EvVirtualScroll.vue.d.ts +65 -0
- package/dist/types/components/EvVirtualScroll/EvVirtualScroll.vue.d.ts.map +1 -0
- package/dist/types/components/EvVirtualScroll/EvVirtualScrollItem.vue.d.ts +35 -0
- package/dist/types/components/EvVirtualScroll/EvVirtualScrollItem.vue.d.ts.map +1 -0
- package/dist/types/components/EvVirtualScroll/index.d.ts +3 -0
- package/dist/types/components/EvVirtualScroll/index.d.ts.map +1 -0
- package/dist/types/components/EvWindow/EvWindow.d.ts +150 -0
- package/dist/types/components/EvWindow/EvWindow.d.ts.map +1 -0
- package/dist/types/components/EvWindow/EvWindow.vue.d.ts +126 -0
- package/dist/types/components/EvWindow/EvWindow.vue.d.ts.map +1 -0
- package/dist/types/components/EvWindow/EvWindowItem/EvWindowItem.d.ts +75 -0
- package/dist/types/components/EvWindow/EvWindowItem/EvWindowItem.d.ts.map +1 -0
- package/dist/types/components/EvWindow/EvWindowItem/EvWindowItem.vue.d.ts +57 -0
- package/dist/types/components/EvWindow/EvWindowItem/EvWindowItem.vue.d.ts.map +1 -0
- package/dist/types/components/EvWindow/EvWindowItem/index.d.ts +3 -0
- package/dist/types/components/EvWindow/EvWindowItem/index.d.ts.map +1 -0
- package/dist/types/components/EvWindow/index.d.ts +4 -0
- package/dist/types/components/EvWindow/index.d.ts.map +1 -0
- package/dist/types/components/index.d.ts +48 -0
- package/dist/types/components/index.d.ts.map +1 -0
- package/dist/types/composables/component.d.ts +27 -0
- package/dist/types/composables/component.d.ts.map +1 -0
- package/dist/types/composables/date/DateAdapter.d.ts +34 -0
- package/dist/types/composables/date/DateAdapter.d.ts.map +1 -0
- package/dist/types/composables/date/DefaultDateAdapter.d.ts +195 -0
- package/dist/types/composables/date/DefaultDateAdapter.d.ts.map +1 -0
- package/dist/types/composables/date/date.d.ts +69 -0
- package/dist/types/composables/date/date.d.ts.map +1 -0
- package/dist/types/composables/date/index.d.ts +4 -0
- package/dist/types/composables/date/index.d.ts.map +1 -0
- package/dist/types/composables/defaults.d.ts +56 -0
- package/dist/types/composables/defaults.d.ts.map +1 -0
- package/dist/types/composables/delay.d.ts +29 -0
- package/dist/types/composables/delay.d.ts.map +1 -0
- package/dist/types/composables/dialog.d.ts +22 -0
- package/dist/types/composables/dialog.d.ts.map +1 -0
- package/dist/types/composables/dimensions.d.ts +60 -0
- package/dist/types/composables/dimensions.d.ts.map +1 -0
- package/dist/types/composables/display.d.ts +158 -0
- package/dist/types/composables/display.d.ts.map +1 -0
- package/dist/types/composables/drawer.d.ts +22 -0
- package/dist/types/composables/drawer.d.ts.map +1 -0
- package/dist/types/composables/filter.d.ts +106 -0
- package/dist/types/composables/filter.d.ts.map +1 -0
- package/dist/types/composables/focus.d.ts +47 -0
- package/dist/types/composables/focus.d.ts.map +1 -0
- package/dist/types/composables/form.d.ts +79 -0
- package/dist/types/composables/form.d.ts.map +1 -0
- package/dist/types/composables/group.d.ts +100 -0
- package/dist/types/composables/group.d.ts.map +1 -0
- package/dist/types/composables/groupItem.d.ts +74 -0
- package/dist/types/composables/groupItem.d.ts.map +1 -0
- package/dist/types/composables/hasSlotWithContent.d.ts +13 -0
- package/dist/types/composables/hasSlotWithContent.d.ts.map +1 -0
- package/dist/types/composables/icons.d.ts +13 -0
- package/dist/types/composables/icons.d.ts.map +1 -0
- package/dist/types/composables/index.d.ts +11 -0
- package/dist/types/composables/index.d.ts.map +1 -0
- package/dist/types/composables/lazy.d.ts +24 -0
- package/dist/types/composables/lazy.d.ts.map +1 -0
- package/dist/types/composables/lists/index.d.ts +7 -0
- package/dist/types/composables/lists/index.d.ts.map +1 -0
- package/dist/types/composables/lists/list-items.d.ts +160 -0
- package/dist/types/composables/lists/list-items.d.ts.map +1 -0
- package/dist/types/composables/lists/list.d.ts +27 -0
- package/dist/types/composables/lists/list.d.ts.map +1 -0
- package/dist/types/composables/lists/move-strategies.d.ts +1 -0
- package/dist/types/composables/lists/move-strategies.d.ts.map +1 -0
- package/dist/types/composables/lists/nested.d.ts +115 -0
- package/dist/types/composables/lists/nested.d.ts.map +1 -0
- package/dist/types/composables/lists/open-strategies.d.ts +73 -0
- package/dist/types/composables/lists/open-strategies.d.ts.map +1 -0
- package/dist/types/composables/lists/open-strategy/index.d.ts +4 -0
- package/dist/types/composables/lists/open-strategy/index.d.ts.map +1 -0
- package/dist/types/composables/lists/open-strategy/list.d.ts +7 -0
- package/dist/types/composables/lists/open-strategy/list.d.ts.map +1 -0
- package/dist/types/composables/lists/open-strategy/multiple.d.ts +7 -0
- package/dist/types/composables/lists/open-strategy/multiple.d.ts.map +1 -0
- package/dist/types/composables/lists/open-strategy/single.d.ts +7 -0
- package/dist/types/composables/lists/open-strategy/single.d.ts.map +1 -0
- package/dist/types/composables/lists/select-strategies.d.ts +84 -0
- package/dist/types/composables/lists/select-strategies.d.ts.map +1 -0
- package/dist/types/composables/lists/select-strategy/cascade-leaf.d.ts +15 -0
- package/dist/types/composables/lists/select-strategy/cascade-leaf.d.ts.map +1 -0
- package/dist/types/composables/lists/select-strategy/index.d.ts +6 -0
- package/dist/types/composables/lists/select-strategy/index.d.ts.map +1 -0
- package/dist/types/composables/lists/select-strategy/multi-any.d.ts +11 -0
- package/dist/types/composables/lists/select-strategy/multi-any.d.ts.map +1 -0
- package/dist/types/composables/lists/select-strategy/multi-leaf.d.ts +11 -0
- package/dist/types/composables/lists/select-strategy/multi-leaf.d.ts.map +1 -0
- package/dist/types/composables/lists/select-strategy/single-any.d.ts +11 -0
- package/dist/types/composables/lists/select-strategy/single-any.d.ts.map +1 -0
- package/dist/types/composables/lists/select-strategy/single-leaf.d.ts +11 -0
- package/dist/types/composables/lists/select-strategy/single-leaf.d.ts.map +1 -0
- package/dist/types/composables/lists/sequenced.d.ts +12 -0
- package/dist/types/composables/lists/sequenced.d.ts.map +1 -0
- package/dist/types/composables/locale.d.ts +32 -0
- package/dist/types/composables/locale.d.ts.map +1 -0
- package/dist/types/composables/modelProxy.d.ts +12 -0
- package/dist/types/composables/modelProxy.d.ts.map +1 -0
- package/dist/types/composables/notification.d.ts +20 -0
- package/dist/types/composables/notification.d.ts.map +1 -0
- package/dist/types/composables/position.d.ts +20 -0
- package/dist/types/composables/position.d.ts.map +1 -0
- package/dist/types/composables/resizeObserver.d.ts +14 -0
- package/dist/types/composables/resizeObserver.d.ts.map +1 -0
- package/dist/types/composables/rounded.d.ts +27 -0
- package/dist/types/composables/rounded.d.ts.map +1 -0
- package/dist/types/composables/router.d.ts +76 -0
- package/dist/types/composables/router.d.ts.map +1 -0
- package/dist/types/composables/scopeId.d.ts +6 -0
- package/dist/types/composables/scopeId.d.ts.map +1 -0
- package/dist/types/composables/selectLink.d.ts +10 -0
- package/dist/types/composables/selectLink.d.ts.map +1 -0
- package/dist/types/composables/size.d.ts +36 -0
- package/dist/types/composables/size.d.ts.map +1 -0
- package/dist/types/composables/ssrBoot.d.ts +10 -0
- package/dist/types/composables/ssrBoot.d.ts.map +1 -0
- package/dist/types/composables/stack.d.ts +20 -0
- package/dist/types/composables/stack.d.ts.map +1 -0
- package/dist/types/composables/tag.d.ts +18 -0
- package/dist/types/composables/tag.d.ts.map +1 -0
- package/dist/types/composables/teleport.d.ts +14 -0
- package/dist/types/composables/teleport.d.ts.map +1 -0
- package/dist/types/composables/toggleScope.d.ts +4 -0
- package/dist/types/composables/toggleScope.d.ts.map +1 -0
- package/dist/types/composables/validation.d.ts +114 -0
- package/dist/types/composables/validation.d.ts.map +1 -0
- package/dist/types/composables/virtual.d.ts +44 -0
- package/dist/types/composables/virtual.d.ts.map +1 -0
- package/dist/types/directives/click-outside.d.ts +51 -0
- package/dist/types/directives/click-outside.d.ts.map +1 -0
- package/dist/types/directives/index.d.ts +5 -0
- package/dist/types/directives/index.d.ts.map +1 -0
- package/dist/types/directives/intersect.d.ts +33 -0
- package/dist/types/directives/intersect.d.ts.map +1 -0
- package/dist/types/directives/slots.d.ts +8 -0
- package/dist/types/directives/slots.d.ts.map +1 -0
- package/dist/types/directives/touch.d.ts +53 -0
- package/dist/types/directives/touch.d.ts.map +1 -0
- package/dist/types/framework.d.ts +66 -0
- package/dist/types/framework.d.ts.map +1 -0
- package/dist/types/icons/brand/index.d.ts +27 -0
- package/dist/types/icons/brand/index.d.ts.map +1 -0
- package/dist/types/icons/editor/index.d.ts +143 -0
- package/dist/types/icons/editor/index.d.ts.map +1 -0
- package/dist/types/icons/index.d.ts +270 -0
- package/dist/types/icons/index.d.ts.map +1 -0
- package/dist/types/index.d.ts +51 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/locale/en.d.ts +26 -0
- package/dist/types/locale/en.d.ts.map +1 -0
- package/dist/types/modules/Form/Form.d.ts +68 -0
- package/dist/types/modules/Form/Form.d.ts.map +1 -0
- package/dist/types/modules/Form/FormField.d.ts +97 -0
- package/dist/types/modules/Form/FormField.d.ts.map +1 -0
- package/dist/types/modules/Locale/LocaleCode.d.ts +19 -0
- package/dist/types/modules/Locale/LocaleCode.d.ts.map +1 -0
- package/dist/types/modules/Locale/LocaleManager.d.ts +29 -0
- package/dist/types/modules/Locale/LocaleManager.d.ts.map +1 -0
- package/dist/types/modules/Locale/Localized.d.ts +41 -0
- package/dist/types/modules/Locale/Localized.d.ts.map +1 -0
- package/dist/types/modules/NumberFormatter.d.ts +10 -0
- package/dist/types/modules/NumberFormatter.d.ts.map +1 -0
- package/dist/types/modules/Translation/LanguagePack.d.ts +27 -0
- package/dist/types/modules/Translation/LanguagePack.d.ts.map +1 -0
- package/dist/types/modules/Translation/Pluralization.d.ts +31 -0
- package/dist/types/modules/Translation/Pluralization.d.ts.map +1 -0
- package/dist/types/modules/Translation/Translatable.d.ts +22 -0
- package/dist/types/modules/Translation/Translatable.d.ts.map +1 -0
- package/dist/types/modules/Translation/TranslationCode.d.ts +29 -0
- package/dist/types/modules/Translation/TranslationCode.d.ts.map +1 -0
- package/dist/types/modules/Translation/Translator.d.ts +78 -0
- package/dist/types/modules/Translation/Translator.d.ts.map +1 -0
- package/dist/types/services/dialog.d.ts +10 -0
- package/dist/types/services/dialog.d.ts.map +1 -0
- package/dist/types/services/drawer.d.ts +10 -0
- package/dist/types/services/drawer.d.ts.map +1 -0
- package/dist/types/services/index.d.ts +4 -0
- package/dist/types/services/index.d.ts.map +1 -0
- package/dist/types/services/notification.d.ts +10 -0
- package/dist/types/services/notification.d.ts.map +1 -0
- package/dist/types/util/anchor.d.ts +63 -0
- package/dist/types/util/anchor.d.ts.map +1 -0
- package/dist/types/util/animate.d.ts +39 -0
- package/dist/types/util/animate.d.ts.map +1 -0
- package/dist/types/util/appearance.d.ts +145 -0
- package/dist/types/util/appearance.d.ts.map +1 -0
- package/dist/types/util/array.d.ts +12 -0
- package/dist/types/util/array.d.ts.map +1 -0
- package/dist/types/util/bindProps.d.ts +13 -0
- package/dist/types/util/bindProps.d.ts.map +1 -0
- package/dist/types/util/browser.d.ts +14 -0
- package/dist/types/util/browser.d.ts.map +1 -0
- package/dist/types/util/children.d.ts +25 -0
- package/dist/types/util/children.d.ts.map +1 -0
- package/dist/types/util/components.d.ts +11 -0
- package/dist/types/util/components.d.ts.map +1 -0
- package/dist/types/util/console.d.ts +11 -0
- package/dist/types/util/console.d.ts.map +1 -0
- package/dist/types/util/dimensions.d.ts +93 -0
- package/dist/types/util/dimensions.d.ts.map +1 -0
- package/dist/types/util/events.d.ts +69 -0
- package/dist/types/util/events.d.ts.map +1 -0
- package/dist/types/util/helpers.d.ts +162 -0
- package/dist/types/util/helpers.d.ts.map +1 -0
- package/dist/types/util/index.d.ts +25 -0
- package/dist/types/util/index.d.ts.map +1 -0
- package/dist/types/util/injectSelf.d.ts +4 -0
- package/dist/types/util/injectSelf.d.ts.map +1 -0
- package/dist/types/util/is-functions.d.ts +101 -0
- package/dist/types/util/is-functions.d.ts.map +1 -0
- package/dist/types/util/isFixedPosition.d.ts +2 -0
- package/dist/types/util/isFixedPosition.d.ts.map +1 -0
- package/dist/types/util/keyboard.d.ts +25 -0
- package/dist/types/util/keyboard.d.ts.map +1 -0
- package/dist/types/util/modifiers.d.ts +28 -0
- package/dist/types/util/modifiers.d.ts.map +1 -0
- package/dist/types/util/numbers.d.ts +10 -0
- package/dist/types/util/numbers.d.ts.map +1 -0
- package/dist/types/util/plugins.d.ts +30 -0
- package/dist/types/util/plugins.d.ts.map +1 -0
- package/dist/types/util/props.d.ts +63 -0
- package/dist/types/util/props.d.ts.map +1 -0
- package/dist/types/util/scroll.d.ts +52 -0
- package/dist/types/util/scroll.d.ts.map +1 -0
- package/dist/types/util/strings.d.ts +92 -0
- package/dist/types/util/strings.d.ts.map +1 -0
- package/dist/types/util/style.d.ts +8 -0
- package/dist/types/util/style.d.ts.map +1 -0
- package/dist/types/util/units.d.ts +25 -0
- package/dist/types/util/units.d.ts.map +1 -0
- package/package.json +101 -43
- package/dist/components/EvAvatar/EvAvatar.d.ts +0 -83
- package/dist/components/EvAvatar/EvAvatar.vue.d.ts +0 -69
- package/dist/components/EvAvatar/index.d.ts +0 -2
- package/dist/components/EvBadge/EvBadge.d.ts +0 -135
- package/dist/components/EvBadge/EvBadge.vue.d.ts +0 -104
- package/dist/components/EvBadge/index.d.ts +0 -2
- package/dist/components/EvButton/EvButton.d.ts +0 -178
- package/dist/components/EvButton/EvButton.vue.d.ts +0 -111
- package/dist/components/EvButton/index.d.ts +0 -2
- package/dist/components/EvButtonGroup/EvButtonGroup.d.ts +0 -66
- package/dist/components/EvButtonGroup/EvButtonGroup.vue.d.ts +0 -56
- package/dist/components/EvButtonGroup/index.d.ts +0 -2
- package/dist/components/EvButtonToggle/EvButtonToggle.d.ts +0 -133
- package/dist/components/EvButtonToggle/EvButtonToggle.vue.d.ts +0 -102
- package/dist/components/EvButtonToggle/index.d.ts +0 -2
- package/dist/components/EvCheckbox/EvCheckbox.d.ts +0 -123
- package/dist/components/EvCheckbox/EvCheckbox.vue.d.ts +0 -84
- package/dist/components/EvCheckbox/index.d.ts +0 -2
- package/dist/components/EvDateField/EvDateField.d.ts +0 -237
- package/dist/components/EvDateField/EvDateField.vue.d.ts +0 -158
- package/dist/components/EvDateField/index.d.ts +0 -2
- package/dist/components/EvDatePicker/EvDatePicker.d.ts +0 -68
- package/dist/components/EvDatePicker/EvDatePicker.vue.d.ts +0 -55
- package/dist/components/EvDatePicker/EvDatePickerMonth/EvDatePickerMonth.d.ts +0 -81
- package/dist/components/EvDatePicker/EvDatePickerMonth/EvDatePickerMonth.vue.d.ts +0 -44
- package/dist/components/EvDatePicker/EvDatePickerMonth/index.d.ts +0 -2
- package/dist/components/EvDatePicker/EvDatePickerMonths/EvDatePickerMonths.d.ts +0 -8
- package/dist/components/EvDatePicker/EvDatePickerMonths/EvDatePickerMonths.vue.d.ts +0 -11
- package/dist/components/EvDatePicker/EvDatePickerMonths/index.d.ts +0 -2
- package/dist/components/EvDatePicker/EvDatePickerYears/EvDatePickerYears.d.ts +0 -20
- package/dist/components/EvDatePicker/EvDatePickerYears/EvDatePickerYears.vue.d.ts +0 -15
- package/dist/components/EvDatePicker/EvDatePickerYears/index.d.ts +0 -2
- package/dist/components/EvDatePicker/index.d.ts +0 -2
- package/dist/components/EvDefaultsProvider/EvDefaultsProvider.d.ts +0 -37
- package/dist/components/EvDefaultsProvider/EvDefaultsProvider.vue.d.ts +0 -24
- package/dist/components/EvDefaultsProvider/index.d.ts +0 -2
- package/dist/components/EvDialog/EvDialog.d.ts +0 -362
- package/dist/components/EvDialog/EvDialog.vue.d.ts +0 -266
- package/dist/components/EvDialog/EvDialogBody.vue.d.ts +0 -9
- package/dist/components/EvDialog/EvDialogFooter.vue.d.ts +0 -9
- package/dist/components/EvDialog/EvDialogHeader.vue.d.ts +0 -23
- package/dist/components/EvDialog/EvDialogInstance.d.ts +0 -12
- package/dist/components/EvDialog/EvDialogRenderer.d.ts +0 -61
- package/dist/components/EvDialog/EvDialogServiceOpener.d.ts +0 -36
- package/dist/components/EvDialog/EvDialogTransition.vue.d.ts +0 -27
- package/dist/components/EvDialog/index.d.ts +0 -2
- package/dist/components/EvDivider/EvDivider.vue.d.ts +0 -60
- package/dist/components/EvDivider/index.d.ts +0 -1
- package/dist/components/EvDrawer/EvDrawer.d.ts +0 -317
- package/dist/components/EvDrawer/EvDrawer.vue.d.ts +0 -227
- package/dist/components/EvDrawer/EvDrawerInstance.d.ts +0 -12
- package/dist/components/EvDrawer/EvDrawerRenderer.d.ts +0 -61
- package/dist/components/EvDrawer/EvDrawerServiceOpener.d.ts +0 -22
- package/dist/components/EvDrawer/index.d.ts +0 -2
- package/dist/components/EvErrors/EvErrors.d.ts +0 -37
- package/dist/components/EvErrors/EvErrors.vue.d.ts +0 -29
- package/dist/components/EvErrors/index.d.ts +0 -2
- package/dist/components/EvForm/EvForm.d.ts +0 -51
- package/dist/components/EvForm/EvForm.vue.d.ts +0 -60
- package/dist/components/EvForm/index.d.ts +0 -2
- package/dist/components/EvGrid/EvBlock/EvBlock.d.ts +0 -101
- package/dist/components/EvGrid/EvBlock/EvBlock.vue.d.ts +0 -50
- package/dist/components/EvGrid/EvBlock/index.d.ts +0 -2
- package/dist/components/EvGrid/EvContainer/EvContainer.d.ts +0 -67
- package/dist/components/EvGrid/EvContainer/EvContainer.vue.d.ts +0 -51
- package/dist/components/EvGrid/EvContainer/index.d.ts +0 -2
- package/dist/components/EvGrid/EvLayout/EvLayout.d.ts +0 -105
- package/dist/components/EvGrid/EvLayout/EvLayout.vue.d.ts +0 -53
- package/dist/components/EvGrid/EvLayout/index.d.ts +0 -2
- package/dist/components/EvGrid/EvSpacer/EvSpacer.d.ts +0 -22
- package/dist/components/EvGrid/EvSpacer/EvSpacer.vue.d.ts +0 -24
- package/dist/components/EvGrid/EvSpacer/index.d.ts +0 -2
- package/dist/components/EvGrid/index.d.ts +0 -4
- package/dist/components/EvIcon/EvIcon.d.ts +0 -47
- package/dist/components/EvIcon/EvIcon.vue.d.ts +0 -29
- package/dist/components/EvIcon/index.d.ts +0 -2
- package/dist/components/EvImg/EvImg.d.ts +0 -180
- package/dist/components/EvImg/EvImg.vue.d.ts +0 -121
- package/dist/components/EvImg/index.d.ts +0 -2
- package/dist/components/EvKbd/EvKbd.d.ts +0 -32
- package/dist/components/EvKbd/EvKbd.vue.d.ts +0 -28
- package/dist/components/EvKbd/index.d.ts +0 -2
- package/dist/components/EvLabel/EvLabel.d.ts +0 -29
- package/dist/components/EvLabel/EvLabel.vue.d.ts +0 -29
- package/dist/components/EvLabel/index.d.ts +0 -2
- package/dist/components/EvList/EvList.d.ts +0 -211
- package/dist/components/EvList/EvList.vue.d.ts +0 -147
- package/dist/components/EvList/EvListChildren.vue.d.ts +0 -21
- package/dist/components/EvList/index.d.ts +0 -2
- package/dist/components/EvListItem/EvListItem.d.ts +0 -108
- package/dist/components/EvListItem/EvListItem.vue.d.ts +0 -87
- package/dist/components/EvListItem/index.d.ts +0 -2
- package/dist/components/EvLozenge/EvLozenge.vue.d.ts +0 -48
- package/dist/components/EvLozenge/index.d.ts +0 -1
- package/dist/components/EvMenu/EvMenu.d.ts +0 -336
- package/dist/components/EvMenu/EvMenu.vue.d.ts +0 -256
- package/dist/components/EvMenu/EvMenuTransition.vue.d.ts +0 -15
- package/dist/components/EvMenu/index.d.ts +0 -3
- package/dist/components/EvMenu/shared.d.ts +0 -9
- package/dist/components/EvMessage/EvMessage.d.ts +0 -147
- package/dist/components/EvMessage/EvMessage.vue.d.ts +0 -107
- package/dist/components/EvMessage/index.d.ts +0 -2
- package/dist/components/EvNotification/EvNotification.d.ts +0 -169
- package/dist/components/EvNotification/EvNotification.vue.d.ts +0 -138
- package/dist/components/EvNotification/index.d.ts +0 -2
- package/dist/components/EvNotifications/EvNotifications.d.ts +0 -14
- package/dist/components/EvNotifications/EvNotifications.vue.d.ts +0 -3
- package/dist/components/EvNotifications/EvNotificationsManager.d.ts +0 -92
- package/dist/components/EvNotifications/index.d.ts +0 -3
- package/dist/components/EvNumberField/EvNumberField.d.ts +0 -389
- package/dist/components/EvNumberField/EvNumberField.vue.d.ts +0 -177
- package/dist/components/EvNumberField/index.d.ts +0 -2
- package/dist/components/EvOverlay/EvOverlay.d.ts +0 -264
- package/dist/components/EvOverlay/EvOverlay.vue.d.ts +0 -196
- package/dist/components/EvOverlay/activator.d.ts +0 -227
- package/dist/components/EvOverlay/index.d.ts +0 -5
- package/dist/components/EvOverlay/position-strategy/connected-position.d.ts +0 -15
- package/dist/components/EvOverlay/position-strategy/index.d.ts +0 -2
- package/dist/components/EvOverlay/position-strategy/static-position.d.ts +0 -10
- package/dist/components/EvOverlay/position.d.ts +0 -81
- package/dist/components/EvOverlay/scroll-strategy/block-scroll.d.ts +0 -8
- package/dist/components/EvOverlay/scroll-strategy/close-scroll.d.ts +0 -7
- package/dist/components/EvOverlay/scroll-strategy/index.d.ts +0 -3
- package/dist/components/EvOverlay/scroll-strategy/reposition-scroll.d.ts +0 -10
- package/dist/components/EvOverlay/scroll.d.ts +0 -47
- package/dist/components/EvProgress/EvProgress.vue.d.ts +0 -42
- package/dist/components/EvProgress/index.d.ts +0 -1
- package/dist/components/EvProgressCircular/EvProgressCircular.vue.d.ts +0 -58
- package/dist/components/EvProgressCircular/index.d.ts +0 -1
- package/dist/components/EvQuickfind/EvQuickfind.vue.d.ts +0 -35
- package/dist/components/EvQuickfind/index.d.ts +0 -1
- package/dist/components/EvRadio/EvRadio.d.ts +0 -90
- package/dist/components/EvRadio/EvRadio.vue.d.ts +0 -74
- package/dist/components/EvRadio/index.d.ts +0 -2
- package/dist/components/EvRadioGroup/EvRadioGroup.d.ts +0 -91
- package/dist/components/EvRadioGroup/EvRadioGroup.vue.d.ts +0 -65
- package/dist/components/EvRadioGroup/index.d.ts +0 -2
- package/dist/components/EvResponsive/EvResponsive.d.ts +0 -85
- package/dist/components/EvResponsive/EvResponsive.vue.d.ts +0 -44
- package/dist/components/EvResponsive/index.d.ts +0 -2
- package/dist/components/EvSelect/EvSelect.d.ts +0 -378
- package/dist/components/EvSelect/EvSelect.vue.d.ts +0 -288
- package/dist/components/EvSelect/index.d.ts +0 -2
- package/dist/components/EvSelect/useScrolling.d.ts +0 -14
- package/dist/components/EvSlideGroup/EvSlideGroup.d.ts +0 -151
- package/dist/components/EvSlideGroup/EvSlideGroup.vue.d.ts +0 -100
- package/dist/components/EvSlideGroup/EvSlideGroupItem.vue.d.ts +0 -36
- package/dist/components/EvSlideGroup/helpers.d.ts +0 -40
- package/dist/components/EvSlideGroup/index.d.ts +0 -3
- package/dist/components/EvSurface/EvSurface.d.ts +0 -84
- package/dist/components/EvSurface/EvSurface.vue.d.ts +0 -52
- package/dist/components/EvSurface/index.d.ts +0 -2
- package/dist/components/EvSwitch/EvSwitch.d.ts +0 -106
- package/dist/components/EvSwitch/EvSwitch.vue.d.ts +0 -84
- package/dist/components/EvSwitch/index.d.ts +0 -2
- package/dist/components/EvTabs/EvTab/EvTab.d.ts +0 -166
- package/dist/components/EvTabs/EvTab/EvTab.vue.d.ts +0 -118
- package/dist/components/EvTabs/EvTab/index.d.ts +0 -2
- package/dist/components/EvTabs/EvTabs.d.ts +0 -179
- package/dist/components/EvTabs/EvTabs.vue.d.ts +0 -132
- package/dist/components/EvTabs/index.d.ts +0 -3
- package/dist/components/EvTag/EvTag.d.ts +0 -199
- package/dist/components/EvTag/EvTag.vue.d.ts +0 -138
- package/dist/components/EvTag/index.d.ts +0 -2
- package/dist/components/EvTagGroup/EvTagGroup.d.ts +0 -184
- package/dist/components/EvTagGroup/EvTagGroup.vue.d.ts +0 -129
- package/dist/components/EvTagGroup/index.d.ts +0 -2
- package/dist/components/EvTextarea/EvTextarea.d.ts +0 -132
- package/dist/components/EvTextarea/EvTextarea.vue.d.ts +0 -110
- package/dist/components/EvTextarea/index.d.ts +0 -2
- package/dist/components/EvTextfield/EvTextfield.d.ts +0 -187
- package/dist/components/EvTextfield/EvTextfield.vue.d.ts +0 -147
- package/dist/components/EvTextfield/index.d.ts +0 -2
- package/dist/components/EvTooltip/EvTooltip.d.ts +0 -336
- package/dist/components/EvTooltip/EvTooltip.vue.d.ts +0 -261
- package/dist/components/EvTooltip/index.d.ts +0 -2
- package/dist/components/EvTransition/EvTransition.d.ts +0 -50
- package/dist/components/EvTransition/index.d.ts +0 -1
- package/dist/components/EvTransition/transitions/createTransition.d.ts +0 -11
- package/dist/components/EvTransition/transitions/expandTransition.d.ts +0 -47
- package/dist/components/EvTransition/transitions/index.d.ts +0 -6
- package/dist/components/EvVirtualScroll/EvVirtualScroll.d.ts +0 -112
- package/dist/components/EvVirtualScroll/EvVirtualScroll.vue.d.ts +0 -64
- package/dist/components/EvVirtualScroll/EvVirtualScrollItem.vue.d.ts +0 -34
- package/dist/components/EvVirtualScroll/index.d.ts +0 -2
- package/dist/components/EvWindow/EvWindow.d.ts +0 -146
- package/dist/components/EvWindow/EvWindow.vue.d.ts +0 -125
- package/dist/components/EvWindow/EvWindowItem/EvWindowItem.d.ts +0 -71
- package/dist/components/EvWindow/EvWindowItem/EvWindowItem.vue.d.ts +0 -55
- package/dist/components/EvWindow/EvWindowItem/index.d.ts +0 -2
- package/dist/components/EvWindow/index.d.ts +0 -3
- package/dist/components/index.d.ts +0 -47
- package/dist/composables/component.d.ts +0 -26
- package/dist/composables/date/DateAdapter.d.ts +0 -33
- package/dist/composables/date/DefaultDateAdapter.d.ts +0 -194
- package/dist/composables/date/date.d.ts +0 -68
- package/dist/composables/date/index.d.ts +0 -3
- package/dist/composables/defaults.d.ts +0 -46
- package/dist/composables/delay.d.ts +0 -28
- package/dist/composables/dialog.d.ts +0 -21
- package/dist/composables/dimensions.d.ts +0 -59
- package/dist/composables/display.d.ts +0 -157
- package/dist/composables/drawer.d.ts +0 -21
- package/dist/composables/filter.d.ts +0 -105
- package/dist/composables/focus.d.ts +0 -46
- package/dist/composables/form.d.ts +0 -78
- package/dist/composables/group.d.ts +0 -99
- package/dist/composables/groupItem.d.ts +0 -70
- package/dist/composables/hasSlotWithContent.d.ts +0 -13
- package/dist/composables/icons.d.ts +0 -12
- package/dist/composables/index.d.ts +0 -7
- package/dist/composables/lazy.d.ts +0 -23
- package/dist/composables/lists/index.d.ts +0 -6
- package/dist/composables/lists/list-items.d.ts +0 -159
- package/dist/composables/lists/list.d.ts +0 -26
- package/dist/composables/lists/move-strategies.d.ts +0 -0
- package/dist/composables/lists/nested.d.ts +0 -134
- package/dist/composables/lists/open-strategies.d.ts +0 -72
- package/dist/composables/lists/open-strategy/index.d.ts +0 -3
- package/dist/composables/lists/open-strategy/list.d.ts +0 -6
- package/dist/composables/lists/open-strategy/multiple.d.ts +0 -6
- package/dist/composables/lists/open-strategy/single.d.ts +0 -6
- package/dist/composables/lists/select-strategies.d.ts +0 -83
- package/dist/composables/lists/select-strategy/cascade-leaf.d.ts +0 -14
- package/dist/composables/lists/select-strategy/index.d.ts +0 -5
- package/dist/composables/lists/select-strategy/multi-any.d.ts +0 -10
- package/dist/composables/lists/select-strategy/multi-leaf.d.ts +0 -10
- package/dist/composables/lists/select-strategy/single-any.d.ts +0 -10
- package/dist/composables/lists/select-strategy/single-leaf.d.ts +0 -10
- package/dist/composables/lists/sequenced.d.ts +0 -11
- package/dist/composables/locale.d.ts +0 -31
- package/dist/composables/modelProxy.d.ts +0 -11
- package/dist/composables/notification.d.ts +0 -19
- package/dist/composables/position.d.ts +0 -19
- package/dist/composables/resizeObserver.d.ts +0 -13
- package/dist/composables/rounded.d.ts +0 -26
- package/dist/composables/router.d.ts +0 -75
- package/dist/composables/scopeId.d.ts +0 -5
- package/dist/composables/selectLink.d.ts +0 -9
- package/dist/composables/size.d.ts +0 -30
- package/dist/composables/ssrBoot.d.ts +0 -9
- package/dist/composables/stack.d.ts +0 -19
- package/dist/composables/tag.d.ts +0 -17
- package/dist/composables/teleport.d.ts +0 -13
- package/dist/composables/toggleScope.d.ts +0 -3
- package/dist/composables/validation.d.ts +0 -107
- package/dist/composables/virtual.d.ts +0 -43
- package/dist/directives/click-outside.d.ts +0 -50
- package/dist/directives/index.d.ts +0 -4
- package/dist/directives/intersect.d.ts +0 -32
- package/dist/directives/slots.d.ts +0 -7
- package/dist/directives/touch.d.ts +0 -52
- package/dist/entry-bundler.d.ts +0 -11
- package/dist/evance-ui.cjs.js +0 -5
- package/dist/evance-ui.css +0 -1
- package/dist/evance-ui.es.d.ts +0 -1
- package/dist/evance-ui.es.js +0 -10460
- package/dist/evance-ui.umd.js +0 -5
- package/dist/framework.d.ts +0 -27
- package/dist/icons/brand/index.d.ts +0 -20
- package/dist/icons/editor/index.d.ts +0 -105
- package/dist/icons/index.d.ts +0 -244
- package/dist/locale/en.d.ts +0 -25
- package/dist/modules/Form/Form.d.ts +0 -67
- package/dist/modules/Form/FormField.d.ts +0 -96
- package/dist/modules/Locale/LocaleCode.d.ts +0 -18
- package/dist/modules/Locale/LocaleManager.d.ts +0 -28
- package/dist/modules/Locale/Localized.d.ts +0 -40
- package/dist/modules/NumberFormatter.d.ts +0 -9
- package/dist/modules/Translation/LanguagePack.d.ts +0 -26
- package/dist/modules/Translation/Pluralization.d.ts +0 -30
- package/dist/modules/Translation/Translatable.d.ts +0 -21
- package/dist/modules/Translation/TranslationCode.d.ts +0 -28
- package/dist/modules/Translation/Translator.d.ts +0 -77
- package/dist/services/dialog.d.ts +0 -9
- package/dist/services/drawer.d.ts +0 -9
- package/dist/services/index.d.ts +0 -3
- package/dist/services/notification.d.ts +0 -9
- package/dist/util/anchor.d.ts +0 -62
- package/dist/util/animate.d.ts +0 -38
- package/dist/util/appearance.d.ts +0 -148
- package/dist/util/array.d.ts +0 -11
- package/dist/util/bindProps.d.ts +0 -12
- package/dist/util/browser.d.ts +0 -13
- package/dist/util/children.d.ts +0 -24
- package/dist/util/components.d.ts +0 -10
- package/dist/util/console.d.ts +0 -10
- package/dist/util/dimensions.d.ts +0 -92
- package/dist/util/events.d.ts +0 -68
- package/dist/util/helpers.d.ts +0 -161
- package/dist/util/index.d.ts +0 -23
- package/dist/util/injectSelf.d.ts +0 -3
- package/dist/util/is-functions.d.ts +0 -100
- package/dist/util/isFixedPosition.d.ts +0 -1
- package/dist/util/keyboard.d.ts +0 -24
- package/dist/util/modifiers.d.ts +0 -27
- package/dist/util/numbers.d.ts +0 -9
- package/dist/util/props.d.ts +0 -62
- package/dist/util/scroll.d.ts +0 -51
- package/dist/util/strings.d.ts +0 -91
- package/dist/util/style.d.ts +0 -7
- package/dist/util/units.d.ts +0 -24
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evance-ui.js","sources":["../src/util/anchor.ts","../src/util/is-functions.ts","../src/util/animate.ts","../src/util/props.ts","../src/util/modifiers.ts","../src/util/appearance.ts","../src/util/scroll.ts","../src/util/events.ts","../src/util/bindProps.ts","../src/util/browser.ts","../src/util/children.ts","../src/util/components.ts","../src/util/console.ts","../src/util/dimensions.ts","../src/util/helpers.ts","../src/util/injectSelf.ts","../src/util/isFixedPosition.ts","../src/util/keyboard.ts","../src/util/numbers.ts","../src/util/strings.ts","../src/util/style.ts","../src/util/units.ts","../src/composables/component.ts","../src/icons/glyph/ArrowBackIcon.svg","../src/icons/glyph/ArrowContinueIcon.svg","../src/icons/glyph/CalendarIcon.svg","../src/icons/glyph/CancelIcon.svg","../src/icons/glyph/CheckCircleIcon.svg","../src/icons/glyph/CheckIcon.svg","../src/icons/glyph/ChevronDownIcon.svg","../src/icons/glyph/ChevronLeftIcon.svg","../src/icons/glyph/ChevronRightIcon.svg","../src/icons/glyph/ChevronUpIcon.svg","../src/icons/glyph/DangerIcon.svg","../src/icons/glyph/HelpIcon.svg","../src/icons/glyph/InfoIcon.svg","../src/icons/glyph/MinusIcon.svg","../src/icons/glyph/NoteIcon.svg","../src/icons/glyph/PlusIcon.svg","../src/icons/glyph/QuickfindIcon.svg","../src/icons/glyph/WarningIcon.svg","../src/composables/icons.ts","../src/composables/size.ts","../src/composables/rounded.ts","../src/components/EvAvatar/EvAvatar.ts","../src/components/EvIcon/EvIcon.ts","../src/modules/Translation/TranslationCode.ts","../src/modules/Locale/LocaleCode.ts","../src/composables/date/DefaultDateAdapter.ts","../src/composables/date/date.ts","../src/composables/defaults.ts","../src/composables/display.ts","../src/modules/Locale/Localized.ts","../src/modules/NumberFormatter.ts","../src/modules/Translation/Pluralization.ts","../src/modules/Translation/Translatable.ts","../src/modules/Translation/LanguagePack.ts","../src/modules/Translation/Translator.ts","../src/locale/en.ts","../src/modules/Locale/LocaleManager.ts","../src/composables/locale.ts","../src/composables/dialog.ts","../src/composables/drawer.ts","../src/composables/notification.ts","../src/components/EvIcon/EvIcon.vue","../src/composables/dimensions.ts","../src/components/EvResponsive/EvResponsive.ts","../src/components/EvTransition/EvTransition.ts","../src/components/EvImg/EvImg.ts","../src/components/EvResponsive/EvResponsive.vue","../src/components/EvImg/EvImg.vue","../src/components/EvAvatar/EvAvatar.vue","../src/composables/position.ts","../src/components/EvBadge/EvBadge.ts","../src/composables/toggleScope.ts","../src/composables/modelProxy.ts","../src/components/EvBadge/EvBadge.vue","../src/composables/router.ts","../src/composables/group.ts","../src/composables/tag.ts","../src/components/EvButtonGroup/EvButtonGroup.ts","../src/components/EvButtonToggle/EvButtonToggle.ts","../src/composables/groupItem.ts","../src/components/EvButton/EvButton.ts","../src/components/EvProgressCircular/EvProgressCircular.vue","../src/composables/hasSlotWithContent.ts","../src/composables/selectLink.ts","../src/components/EvButton/EvButton.vue","../src/components/EvButtonGroup/EvButtonGroup.vue","../src/components/EvButtonToggle/EvButtonToggle.vue","../src/composables/focus.ts","../src/modules/Form/Form.ts","../src/composables/form.ts","../src/modules/Form/FormField.ts","../src/composables/validation.ts","../src/components/EvCheckbox/EvCheckbox.ts","../src/components/EvErrors/EvErrors.ts","../src/components/EvErrors/EvErrors.vue","../src/components/EvLabel/EvLabel.ts","../src/components/EvCheckbox/EvCheckbox.vue","../src/components/EvDatePicker/EvDatePickerMonth/EvDatePickerMonth.ts","../src/components/EvDatePicker/EvDatePickerMonth/EvDatePickerMonth.vue","../src/components/EvDatePicker/EvDatePickerYears/EvDatePickerYears.ts","../src/composables/lists/list.ts","../src/composables/lists/list-items.ts","../src/composables/lists/select-strategy/cascade-leaf.ts","../src/composables/lists/select-strategy/multi-any.ts","../src/composables/lists/select-strategy/multi-leaf.ts","../src/composables/lists/select-strategy/single-any.ts","../src/composables/lists/select-strategy/single-leaf.ts","../src/composables/lists/select-strategies.ts","../src/composables/lists/open-strategy/single.ts","../src/composables/lists/open-strategy/multiple.ts","../src/composables/lists/open-strategy/list.ts","../src/composables/lists/open-strategies.ts","../src/composables/lists/nested.ts","../src/components/EvList/EvList.ts","../src/components/EvListItem/EvListItem.ts","../src/components/EvListItem/EvListItem.vue","../src/components/EvList/EvListChildren.vue","../src/components/EvList/EvList.vue","../src/components/EvDatePicker/EvDatePickerYears/EvDatePickerYears.vue","../src/components/EvDatePicker/EvDatePicker.ts","../src/components/EvDatePicker/EvDatePickerMonths/EvDatePickerMonths.ts","../src/components/EvDatePicker/EvDatePickerMonths/EvDatePickerMonths.vue","../src/components/EvGrid/EvContainer/EvContainer.ts","../src/components/EvGrid/EvContainer/EvContainer.vue","../src/components/EvGrid/EvLayout/EvLayout.ts","../src/components/EvGrid/EvLayout/EvLayout.vue","../src/components/EvGrid/EvBlock/EvBlock.ts","../src/components/EvGrid/EvBlock/EvBlock.vue","../src/components/EvGrid/EvSpacer/EvSpacer.ts","../src/components/EvDatePicker/EvDatePicker.vue","../src/components/EvTextfield/EvTextfield.ts","../src/components/EvProgress/EvProgress.vue","../src/components/EvTextfield/EvTextfield.vue","../src/components/EvDateField/EvDateField.ts","../src/composables/delay.ts","../src/components/EvMenu/shared.ts","../src/components/EvOverlay/activator.ts","../src/components/EvOverlay/position-strategy/connected-position.ts","../src/components/EvOverlay/position-strategy/static-position.ts","../src/components/EvOverlay/position.ts","../src/components/EvOverlay/scroll-strategy/block-scroll.ts","../src/components/EvOverlay/scroll-strategy/close-scroll.ts","../src/components/EvOverlay/scroll-strategy/reposition-scroll.ts","../src/components/EvOverlay/scroll.ts","../src/components/EvOverlay/EvOverlay.ts","../src/components/EvMenu/EvMenuTransition.vue","../src/components/EvMenu/EvMenu.ts","../src/composables/teleport.ts","../src/composables/stack.ts","../node_modules/vue-router/dist/vue-router.mjs","../src/composables/scopeId.ts","../src/components/EvOverlay/EvOverlay.vue","../src/components/EvMenu/EvMenu.vue","../src/components/EvSurface/EvSurface.ts","../src/components/EvSurface/EvSurface.vue","../src/components/EvDateField/EvDateField.vue","../src/components/EvDefaultsProvider/EvDefaultsProvider.ts","../src/components/EvDefaultsProvider/EvDefaultsProvider.vue","../src/components/EvDialog/EvDialogTransition.vue","../src/components/EvDialog/EvDialog.ts","../src/components/EvDialog/EvDialogBody.vue","../src/components/EvDialog/EvDialogFooter.vue","../src/components/EvDialog/EvDialogHeader.vue","../src/components/EvDialog/EvDialog.vue","../src/components/EvDivider/EvDivider.vue","../src/components/EvDrawer/EvDrawer.ts","../src/components/EvDrawer/EvDrawer.vue","../src/components/EvForm/EvForm.ts","../src/components/EvForm/EvForm.vue","../src/components/EvKbd/EvKbd.ts","../src/components/EvLozenge/EvLozenge.ts","../src/components/EvLozenge/EvLozenge.vue","../src/components/EvMessage/EvMessage.ts","../src/components/EvMessage/EvMessage.vue","../src/components/EvNotification/EvNotification.ts","../src/components/EvNotification/EvNotification.vue","../src/components/EvNotifications/EvNotificationsManager.ts","../src/components/EvNotifications/EvNotifications.vue","../src/components/EvNumberField/EvNumberField.ts","../src/components/EvNumberField/EvNumberField.vue","../src/components/EvQuickfind/EvQuickfind.vue","../src/components/EvRadio/EvRadio.ts","../src/components/EvRadioGroup/EvRadioGroup.ts","../src/components/EvRadioGroup/EvRadioGroup.vue","../src/components/EvRadio/EvRadio.vue","../src/composables/filter.ts","../src/components/EvSelect/EvSelect.ts","../src/components/EvSelect/useScrolling.ts","../src/composables/resizeObserver.ts","../src/composables/virtual.ts","../src/components/EvVirtualScroll/EvVirtualScroll.ts","../src/components/EvVirtualScroll/EvVirtualScrollItem.vue","../src/components/EvVirtualScroll/EvVirtualScroll.vue","../src/components/EvTag/EvTag.ts","../src/components/EvTransition/transitions/createTransition.ts","../src/components/EvTransition/transitions/expandTransition.ts","../src/components/EvTransition/transitions/index.ts","../src/components/EvTag/EvTag.vue","../src/components/EvSelect/EvSelect.vue","../src/components/EvSlideGroup/EvSlideGroup.ts","../src/components/EvSlideGroup/helpers.ts","../src/components/EvSlideGroup/EvSlideGroup.vue","../src/components/EvSlideGroup/EvSlideGroupItem.vue","../src/components/EvSwitch/EvSwitch.ts","../src/components/EvSwitch/EvSwitch.vue","../src/components/EvTabs/EvTab/EvTab.ts","../src/components/EvTabs/EvTabs.ts","../src/components/EvTabs/EvTab/EvTab.vue","../src/components/EvTabs/EvTabs.vue","../src/components/EvTagGroup/EvTagGroup.ts","../src/components/EvTagGroup/EvTagGroup.vue","../src/components/EvTextarea/EvTextarea.ts","../src/components/EvTextarea/EvTextarea.vue","../src/components/EvTooltip/EvTooltip.ts","../src/components/EvTooltip/EvTooltip.vue","../src/components/EvWindow/EvWindow.ts","../src/directives/click-outside.ts","../src/directives/intersect.ts","../src/directives/slots.ts","../src/directives/touch.ts","../src/components/EvWindow/EvWindow.vue","../src/composables/lazy.ts","../src/components/EvWindow/EvWindowItem/EvWindowItem.ts","../src/composables/ssrBoot.ts","../src/components/EvWindow/EvWindowItem/EvWindowItem.vue","../src/components/EvDialog/EvDialogInstance.ts","../src/components/EvDialog/EvDialogRenderer.ts","../src/components/EvDialog/EvDialogServiceOpener.ts","../src/services/dialog.ts","../src/components/EvDrawer/EvDrawerInstance.ts","../src/components/EvDrawer/EvDrawerRenderer.ts","../src/components/EvDrawer/EvDrawerServiceOpener.ts","../src/services/drawer.ts","../src/services/notification.ts","../src/framework.ts","../src/index.ts"],"sourcesContent":["import { Axis } from \"@/util/dimensions.ts\";\n\n/**\n * # Anchors\n *\n */\ntype VerticalSide = \"top\" | \"bottom\";\ntype EdgeAlignment = \"start\" | \"end\" | \"center\";\ntype HorizontalSide = \"left\" | \"right\";\ntype SelectorSeparator = \" \" | \"-\";\n\nexport type AnchorSelector =\n | VerticalSide\n | HorizontalSide\n | `${VerticalSide}${SelectorSeparator}${EdgeAlignment}`\n | `${HorizontalSide}${SelectorSeparator}${EdgeAlignment}`\n | \"auto\"\n | `auto${SelectorSeparator}${EdgeAlignment | \"auto\"}`\n | \"center\"\n | `center${SelectorSeparator}center`;\n\nexport type AnchorSide = VerticalSide | HorizontalSide | \"auto\" | \"center\";\nexport type AnchorAlignment = EdgeAlignment | \"auto\";\nexport type PhysicalAlignment = \"left\" | \"right\" | \"center\";\nexport type PhysicalSide = HorizontalSide | VerticalSide;\n\n/**\n * # Anchor\n *\n * - `alignment`: 'start', 'end', 'center', 'auto'\n * - `side`: 'top', 'bottom', 'left', 'right', 'center', 'auto'\n *\n */\nexport class Anchor {\n public constructor(\n public side: AnchorSide,\n public alignment: AnchorAlignment,\n ) {}\n\n /**\n * ## Get Axis\n * Returns either x or y axis.\n */\n public get axis(): Axis {\n return [\"left\", \"right\"].includes(this.side) ? \"x\" : \"y\";\n }\n\n /**\n * ## Physical Alignment\n */\n public get physicalAlignment(): PhysicalAlignment {\n if (this.alignment === \"auto\") {\n throw new Error(\n \"Evance UI: Cannot convert `auto` to a physical alignment\",\n );\n }\n return {\n center: \"center\",\n start: \"left\",\n end: \"right\",\n }[this.alignment] as PhysicalAlignment;\n }\n\n /**\n * ## Center Align\n */\n public centerAlign() {\n return new Anchor(this.side, \"center\");\n }\n\n /**\n * ## Flip Alignment\n */\n public flipAlignment() {\n const alignment = {\n auto: \"auto\",\n center: \"center\",\n end: \"start\",\n start: \"end\",\n }[this.alignment];\n return new Anchor(this.side, alignment as AnchorAlignment);\n }\n\n /**\n * ## Flip Corner\n */\n public flipCorner() {\n return this.flipAlignment().flipSide();\n }\n\n /**\n * ## Flip Side\n */\n public flipSide(): Anchor {\n const side = {\n auto: \"auto\",\n center: \"center\",\n top: \"bottom\",\n bottom: \"top\",\n left: \"right\",\n right: \"left\",\n }[this.side];\n return new Anchor(side as AnchorSide, this.alignment);\n }\n\n /**\n * ## Parse Selector\n * @param selector\n * @param isRtl\n * @private\n */\n public static fromSelector(\n selector: AnchorSelector,\n isRtl: boolean = false,\n ): Anchor {\n let [side, alignment] = selector.split(/[\\s\\-]/) as [\n AnchorSide,\n AnchorAlignment | undefined,\n ];\n if (!alignment) {\n alignment = side === \"auto\" ? \"auto\" : \"center\";\n }\n const anchor = new Anchor(side, alignment);\n if (isRtl) {\n if (anchor.side === \"left\") {\n anchor.side = \"right\";\n } else if (anchor.side === \"right\") {\n anchor.side = \"left\";\n }\n }\n return anchor;\n }\n\n public toCssValue(): string {\n return `${this.side} ${this.physicalAlignment}`;\n }\n\n public toString(): string {\n return `${this.side} ${this.alignment}`;\n }\n}\n","/**\n * # Is (equal)\n * I had written a polyfill for this, but since we're only interested in modern browsers\n * let's reduce code and simply return the result from Object.is();\n * @param a\n * @param b\n */\nexport function is(a?: any, b?: any): boolean {\n return Object.is(a, b);\n}\n\n/**\n * # Is Array?\n * @param value\n */\nexport function isArray(value: unknown): boolean {\n return Array.isArray(value);\n}\n\n/**\n * # Is Boolean?\n * @param value\n */\nexport function isBoolean(value: unknown): value is boolean {\n return typeof value === \"boolean\";\n}\n\n/**\n * # Is CSS Variable\n * @param value\n */\nexport function isCssVariable(value: unknown): boolean {\n if (!isString(value)) {\n return false;\n }\n return /^--[\\w-]+$/.test(value as string);\n}\n\n/**\n * # Is Date?\n * @param value\n */\nexport function isDate(value: unknown): value is Date {\n return value instanceof Date;\n}\n\n/**\n * # Is Date Equal\n *\n * Evaluates whether one date equals another date.\n *\n * @param a\n * @param b\n */\nexport function isDateEqual(a: Date, b: Date): boolean {\n return a.getTime() === b.getTime();\n}\n\n/**\n * # Is Deep Equal?\n *\n * I could have used the `deep-equal` npm package, but decided to keep things as light-weight\n * as possible and this suits our needs for now:\n *\n * @link https://www.npmjs.com/package/deep-equal\n *\n * @param a\n * @param b\n */\nexport function isDeepEqual(a: any, b: any): boolean {\n if (a === b) {\n return true;\n }\n // Check types\n if (typeof a !== typeof b) {\n return false;\n }\n if (a == null || b == null) {\n return false;\n }\n\n // Check dates\n if (isDate(a) && isDate(b) && !isDateEqual(a, b)) {\n return false;\n }\n // Check array\n if (isArray(a) !== isArray(b)) {\n return false;\n }\n\n if (a !== Object(a) || b !== Object(b)) {\n return false;\n }\n\n const keysInA = Object.keys(a);\n const keysInB = Object.keys(b);\n if (keysInA.length !== keysInB.length) {\n return false;\n }\n return keysInA.every((key) => isDeepEqual(a[key], b[key]));\n}\n\nexport function isElement(el: unknown): el is Element {\n return !!el && el instanceof Element && el.nodeType === Node.ELEMENT_NODE;\n}\n\n/**\n * # Is Empty\n * @param value\n */\nexport function isEmpty(value: any): boolean {\n return (\n value === null ||\n value === undefined ||\n (typeof value === \"string\" && value.trim() === \"\")\n );\n}\n\n/**\n * # Is Equal NaN\n *\n * Check if a value is NaN - the only value in JavaScript that is not equal to itself.\n *\n * @param value\n */\nexport function isEqualNaN(value: unknown): boolean {\n return value !== value;\n}\n\n/**\n * # Is Function?\n * @param value\n */\nexport function isFunction(value: unknown): value is Function {\n return typeof value === \"function\";\n}\n\n/**\n * # Is Number\n * @param value\n */\nexport function isNumber(value: unknown): value is number {\n return typeof value === \"number\";\n}\n\n/**\n * # Is Object?\n * @param value\n */\nexport function isObject(value: unknown): value is object {\n return typeof value === \"object\";\n}\n\n/**\n * # Is Object Not Array\n * @param value\n */\nexport function isObjectNotArray(value: any): boolean {\n return value !== null && isObject(value) && !isArray(value);\n}\n\nconst isOnPattern = /^on[^a-z]/;\nexport const isOn = (key: string) => isOnPattern.test(key);\n\n/**\n *\n * @param value\n */\nexport function isPrimitive(\n value: unknown,\n): value is string | number | boolean {\n return Object(value) !== value;\n}\n\n/**\n * # Is ShadowRoot\n * @param value\n */\nexport function isShadowRoot(value: unknown): value is ShadowRoot {\n return typeof ShadowRoot !== \"undefined\" && value instanceof ShadowRoot;\n}\n\n/**\n * # Is String?\n * @param value\n */\nexport function isString(value: unknown): value is string {\n if (typeof value === \"string\") {\n return true;\n }\n if (typeof value !== \"object\") {\n return false;\n }\n try {\n String.prototype.valueOf.call(value);\n return true;\n } catch (e) {\n return false;\n }\n}\n\nexport function isTypeOf(value: unknown, accept: string[]): boolean {\n return accept.includes(typeof value);\n}\n","import { isEmpty } from \"./is-functions.ts\";\n\n/**\n * # Animate\n *\n * We take advantage of the Element interface's animate() method.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/animate\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Web_Animations_API/Keyframe_Formats\n *\n * @param el The element we wish to animate\n * @param keyframes The keyframes to use during animation (see the Keyframes format)\n * @param options An integer duration (in milliseconds), OR an Object containing timing properties\n */\nexport function animate(\n el: Element,\n keyframes: Keyframe[] | PropertyIndexedKeyframes | null,\n options?: number | KeyframeAnimationOptions,\n) {\n if (typeof Animation === \"undefined\" || isEmpty(el.animate)) {\n return animateFinished;\n }\n let animation: Animation;\n try {\n animation = el.animate(keyframes, options);\n } catch (e) {\n return animateFinished;\n }\n // Polyfill if `finished` is unavailable\n if (!(\"finished\" in Animation.prototype) || isEmpty(animation.finished)) {\n (animation as any).finished = new Promise((resolve) => {\n animation.onfinish = () => {\n resolve(animation);\n };\n });\n }\n // Polyfill if `cancel` is unavailable\n if (!(\"cancel\" in Animation.prototype) || isEmpty(animation.cancel)) {\n (animation as any).cancel = new Promise((resolve, reject) => {\n animation.oncancel = () => {\n reject(animation);\n };\n });\n }\n return animation;\n}\n\n/**\n * ## Animate Finished\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Animation/finished\n */\nexport const animateFinished = {\n finished: Promise.resolve(),\n} as const;\n\n/**\n * # Click Blocked Animation\n * @param el\n */\nexport function clickBlockedAnimation(el: HTMLElement | null | undefined) {\n if (isEmpty(el)) {\n return null;\n }\n return animate(\n el!,\n [\n { transformOrigin: \"center\" },\n { transform: \"scale(1.05) translateY(-3px)\" },\n { transformOrigin: \"center\" },\n ],\n {\n duration: 250,\n easing: \"cubic-bezier(0.4, 0, 0.2, 1)\",\n },\n );\n}\n\nlet clean = true;\nconst frames = [] as any[];\n\n/**\n * Schedule a task to run in an animation frame on its own\n * This is useful for heavy tasks that may cause jank if all ran together\n */\nexport function requestNewFrame(callback: () => void) {\n if (!clean || frames.length) {\n frames.push(callback);\n run();\n } else {\n clean = false;\n callback();\n run();\n }\n}\n\nlet raf = -1;\nfunction run() {\n cancelAnimationFrame(raf);\n raf = requestAnimationFrame(() => {\n const frame = frames.shift();\n if (frame) {\n frame();\n }\n if (frames.length) {\n run();\n } else {\n clean = true;\n }\n });\n}\n\nexport const easingStandard = \"cubic-bezier(0.4, 0, 0.2, 1)\";\nexport const easingDecelerate = \"cubic-bezier(0.0, 0, 0.2, 1)\"; // Entering\nexport const easingAccelerate = \"cubic-bezier(0.4, 0, 1, 1)\"; // Leaving\n","import type { IfAny } from \"@vue/shared\"; // eslint-disable-line vue/prefer-import-from-vue\nimport type { ComponentObjectPropsOptions, Prop, PropType } from \"vue\";\n\n/**\n * # Props Factory\n *\n * Creates a factory function for props definitions.\n * This is used to define props in a composable then override\n * default values in an implementing component.\n *\n * @example Simplified signature\n * (props: Props) => (defaults?: Record<keyof props, any>) => Props\n *\n * @example Usage\n * const makeProps = propsFactory({\n * foo: String,\n * })\n *\n * defineComponent({\n * props: {\n * ...makeProps({\n * foo: 'a',\n * }),\n * },\n * setup (props) {\n * // would be \"string | undefined\", now \"string\" because a default has been provided\n * props.foo\n * },\n * }\n *\n * Copied from Vuetify\n * @see https://github.com/vuetifyjs/vuetify/blob/master/packages/vuetify/src/util/propsFactory.ts\n */\nexport function propsFactory<PropsOptions extends ComponentObjectPropsOptions>(\n props: PropsOptions,\n source: string,\n) {\n return <Defaults extends PartialKeys<PropsOptions> = {}>(\n defaults?: Defaults,\n ): AppendDefault<PropsOptions, Defaults> => {\n return Object.keys(props).reduce<any>((obj, prop) => {\n const isObjectDefinition =\n typeof props[prop] === \"object\" &&\n props[prop] != null &&\n !Array.isArray(props[prop]);\n const definition = isObjectDefinition\n ? props[prop]\n : { type: props[prop] };\n\n if (defaults && prop in defaults) {\n obj[prop] = {\n ...definition,\n default: defaults[prop],\n };\n } else {\n obj[prop] = definition;\n }\n\n if (source && !obj[prop].source) {\n obj[prop].source = source;\n }\n\n return obj;\n }, {});\n };\n}\n\ntype AppendDefault<\n T extends ComponentObjectPropsOptions,\n D extends PartialKeys<T>,\n> = {\n [P in keyof T]-?: unknown extends D[P]\n ? T[P]\n : T[P] extends Record<string, unknown>\n ? Omit<T[P], \"type\" | \"default\"> & {\n type: PropType<MergeDefault<T[P], D[P]>>;\n default: MergeDefault<T[P], D[P]>;\n }\n : {\n type: PropType<MergeDefault<T[P], D[P]>>;\n default: MergeDefault<T[P], D[P]>;\n };\n};\n\ntype MergeDefault<T, D> = unknown extends D\n ? InferPropType<T>\n : NonNullable<InferPropType<T>> | D;\n\n/**\n * Like `Partial<T>` but doesn't care what the value is\n */\ntype PartialKeys<T> = { [P in keyof T]?: unknown };\n\n// Copied from Vue\ntype InferPropType<T> = [T] extends [null]\n ? any // null & true would fail to infer\n : [T] extends [{ type: null | true }]\n ? // As TS issue https://github.com/Microsoft/TypeScript/issues/14829\n // somehow `ObjectConstructor` when inferred from { (): T } becomes `any`\n // `BooleanConstructor` when inferred from PropConstructor(with PropMethod) becomes `Boolean`\n any\n : [T] extends [ObjectConstructor | { type: ObjectConstructor }]\n ? Record<string, any>\n : [T] extends [BooleanConstructor | { type: BooleanConstructor }]\n ? boolean\n : [T] extends [DateConstructor | { type: DateConstructor }]\n ? Date\n : [T] extends [(infer U)[] | { type: (infer U)[] }]\n ? U extends DateConstructor\n ? Date | InferPropType<U>\n : InferPropType<U>\n : [T] extends [Prop<infer V, infer D>]\n ? unknown extends V\n ? IfAny<V, V, D>\n : V\n : T;\n","import { isString, toKebabCase } from \"../util\";\n\n/**\n * ## Make Class Name\n * Accepts a string `value` and a `prefix` to be combined and separated by a dash (\"-\").\n * The value will be converted into \"kebab-case\".\n * @param value\n * @param prefix\n * @param exclude\n */\nexport function makeClassName(\n value?: string,\n prefix: string = \"\",\n exclude: (string | RegExp)[] = [],\n): string | undefined {\n if (\n !value ||\n exclude.some((exclusion) => {\n if (exclusion instanceof RegExp) {\n return exclusion.test(value);\n }\n return value === exclusion;\n })\n ) {\n return undefined;\n }\n const kebabValue = toKebabCase(value);\n return `${prefix}-${kebabValue}`;\n}\n\n/**\n * ## Make a Size Modifier Class Name\n * @param value\n * @param exclude\n */\nexport function sizeModifier(\n value?: string | number,\n exclude: (string | RegExp)[] = [],\n): string | undefined {\n if (!isString(value)) {\n return undefined;\n }\n return makeClassName(value, \"is-size\", exclude);\n}\n\n/**\n * ## Make an Appearance Modifier Class Name\n * @param value\n * @param exclude\n */\nexport function appearanceModifier(\n value: string,\n exclude: (string | RegExp)[] = [],\n): string | undefined {\n return makeClassName(value, \"is-appearance\", exclude);\n}\n\n/**\n * ## Make a Variant Modifier Class Name\n * @param value\n * @param exclude\n */\nexport function variantModifier(\n value: string,\n exclude: (string | RegExp)[] = [],\n): string | undefined {\n return makeClassName(value, \"is-variant\", exclude);\n}\n","import { propsFactory } from \"./props.ts\";\nimport { computed, MaybeRef, PropType, Ref, unref } from \"vue\";\nimport { appearanceModifier, variantModifier } from \"@/util/modifiers.ts\";\nimport { GroupItemProvide } from \"@/composables/groupItem.ts\";\n\n/**\n * # Appearance\n *\n * Default appearance keys for\n *\n */\nexport const Appearance = {\n default: \"default\",\n danger: \"danger\",\n information: \"information\",\n notice: \"notice\",\n primary: \"primary\",\n success: \"success\",\n warning: \"warning\",\n} as const;\n\nexport type AppearanceProp = (typeof Appearance)[keyof typeof Appearance];\n\nexport const Variant = {\n default: \"default\",\n bold: \"bold\",\n outlined: \"outlined\",\n subtle: \"subtle\",\n tonal: \"tonal\",\n} as const;\n\nexport type VariantProp = (typeof Variant)[keyof typeof Variant];\n\nexport interface AppearanceProps {\n appearance: AppearanceProp;\n variant: VariantProp;\n}\n\nexport const makeAppearanceProps = propsFactory(\n {\n appearance: {\n type: String as PropType<AppearanceProp>,\n default: Appearance.default,\n },\n variant: {\n type: String as PropType<VariantProp>,\n default: Variant.default,\n },\n },\n \"Appearance\",\n);\n\n/**\n * # useAppearance\n *\n * @param props\n * @param group\n * @param isActive\n * @param defaultVariant\n */\nexport function useAppearance(\n props: MaybeRef<Partial<AppearanceProps>>,\n group: GroupItemProvide | null = null,\n isActive: Ref<boolean | undefined> | null = null,\n defaultVariant: string = Variant.default,\n) {\n const appearanceName = computed(() => {\n const { appearance } = unref(props);\n const value = isActive?.value\n ? group?.selectedAppearance.value ?? appearance\n : appearance;\n return value ?? Appearance.default;\n });\n\n // Appearance modifier classes\n const appearanceClass = computed(() => {\n return appearanceModifier(appearanceName.value);\n });\n\n const variantName = computed(() => {\n const { variant } = unref(props);\n let value = isActive?.value\n ? group?.selectedVariant.value ?? variant\n : variant;\n value = value ?? Variant.default;\n if (\n appearanceName.value !== Appearance.default &&\n value === Variant.default\n ) {\n value = defaultVariant;\n }\n return value;\n });\n\n const variantClass = computed(() => {\n return variantModifier(variantName.value);\n });\n\n return {\n appearance: appearanceName,\n appearanceClass,\n variant: variantName,\n variantClass,\n };\n}\n\n/**\n * # Input Appearance\n */\nexport const InputAppearance = {\n default: Appearance.default,\n button: \"button\",\n none: \"none\",\n subtle: \"subtle\",\n} as const;\n\nexport type InputAppearanceProp =\n (typeof InputAppearance)[keyof typeof InputAppearance];\n\nexport const makeInputAppearanceProps = propsFactory(\n {\n appearance: {\n type: String as PropType<InputAppearanceProp>,\n default: InputAppearance.default,\n },\n },\n \"InputAppearance\",\n);\n\n/**\n * # Input Sizes\n */\nexport const InputSize = {\n default: \"medium\",\n xSmall: \"x-small\",\n small: \"small\",\n medium: \"medium\",\n large: \"large\",\n xLarge: \"x-large\",\n} as const;\n\nexport type InputSizeProp = (typeof InputSize)[keyof typeof InputSize];\nexport const makeInputSizeProps = propsFactory(\n {\n size: {\n type: String as PropType<InputSizeProp>,\n default: InputSize.default,\n },\n },\n \"InputSize\",\n);\n\n/**\n * # Text Align\n */\nexport const TextAlign = {\n default: \"left\",\n left: \"left\",\n center: \"center\",\n right: \"right\",\n} as const;\nexport type TextAlignProp = (typeof TextAlign)[keyof typeof TextAlign];\nexport const makeTextAlignProps = propsFactory(\n {\n align: {\n type: String as PropType<TextAlignProp>,\n default: TextAlign.default,\n },\n },\n \"TextAlign\",\n);\n","import { isElement } from \"./is-functions.ts\";\nimport { Axis } from \"./dimensions.ts\";\n\n/**\n * # Get Scroll Parent\n *\n * Get the closest parent element which is scrollable.\n *\n * @param el\n * @param isIncludeHidden\n * @param axis\n */\nexport function getScrollParent(\n el?: Element,\n isIncludeHidden = false,\n axis: Axis | null = \"y\",\n): HTMLElement {\n while (el) {\n if (isIncludeHidden ? isScrollable(el, axis) : hasScrollbar(el, axis)) {\n return el as HTMLElement;\n }\n el = el.parentElement!;\n }\n return document.scrollingElement as HTMLElement;\n}\n\n/**\n * # Get Scroll Parents\n *\n * Get all parent elements with a scrollbar in either the x-axis, y-axis,\n * or either if `axis` is supplied as `null`.\n *\n * Defaults to y-axis, since that's the most common use-case.\n *\n * @param el\n * @param stopAt\n * @param axis\n */\nexport function getScrollParents(\n el: Element | undefined,\n stopAt?: Element | null,\n axis: Axis | null = \"y\",\n): HTMLElement[] {\n const elements: HTMLElement[] = [];\n if (isElement(el) && isElement(stopAt) && !stopAt!.contains(el)) {\n return elements;\n }\n while (el) {\n if (hasScrollbar(el, axis)) {\n elements.push(el as HTMLElement);\n }\n if (el === stopAt) {\n break;\n }\n el = el.parentElement!;\n }\n return elements;\n}\n\n/**\n * # Has Scrollbar?\n *\n * Determine whether an Element has a Scrollbar in either the x-axis, y-axis,\n * or either if `axis` is supplied as `null`.\n *\n * This does not necessarily mean it has a scroll amount.\n *\n * Defaults to y-axis, since that's the most common use-case.\n *\n * @param el\n * @param axis\n */\nexport function hasScrollbar(\n el?: Element | null,\n axis: Axis | null = \"y\",\n): boolean {\n if (!isElement(el)) {\n return false;\n }\n const style = window.getComputedStyle(el!);\n const hasScrollbarX =\n style.overflowX === \"scroll\" ||\n (style.overflowX === \"auto\" && el!.scrollWidth > el!.clientWidth);\n const hasScrollbarY =\n style.overflowY === \"scroll\" ||\n (style.overflowY === \"auto\" && el!.scrollHeight > el!.clientHeight);\n return (\n ((!axis || axis === \"x\") && hasScrollbarX) ||\n ((!axis || axis === \"y\") && hasScrollbarY)\n );\n}\n\n/**\n * # Is Scrollable?\n *\n * Determines whether an Element is scrollable in either the x-axis, y-axis,\n * or either if `axis` is supplied as `null`.\n *\n * Defaults to y-axis, since that's the most common use-case.\n *\n * @param el\n * @param axis\n */\nexport function isScrollable(\n el: Element | null,\n axis: Axis | null = \"y\",\n): boolean {\n if (!isElement(el)) {\n return false;\n }\n const style = window.getComputedStyle(el!);\n return (\n ((!axis || axis === \"x\") &&\n [\"scroll\", \"auto\"].includes(style.overflowX)) ||\n ((!axis || axis === \"y\") &&\n [\"scroll\", \"auto\"].includes(style.overflowY))\n );\n}\n","import { capitalize, onScopeDispose, PropType } from \"vue\";\nimport { getScrollParents } from \"./scroll.ts\";\n\n/**\n * # Click Event Listeners\n * Standard listeners for click events.\n */\nexport interface ClickEventListeners {\n onClick?: EventProp | undefined;\n onClickOnce?: EventProp | undefined;\n}\n\nexport type EventProp<T extends any[] = any[], F = (...args: T) => any> =\n | F\n | F[];\nexport const EventProp = <T extends any[] = any[]>() =>\n [Function, Array] as PropType<EventProp<T>>;\n\n/**\n * # Call Event\n * @param eventHandler\n * @param args\n */\nexport function callEvent<T extends any[]>(\n eventHandler: EventProp<T> | undefined,\n ...args: T\n) {\n if (Array.isArray(eventHandler)) {\n for (const handlerElement of eventHandler) {\n handlerElement(...args);\n }\n } else if (typeof eventHandler === \"function\") {\n eventHandler(...args);\n }\n}\n\n/**\n * # Event Name\n * @param propName\n */\nexport function eventName(propName: string) {\n return propName[2].toLowerCase() + propName.slice(3);\n}\n\n/**\n * # Focusable Elements\n * A list of elements we can focus on dynamically.\n */\nexport const focusableElements = [\n \"button\",\n \"[href]\",\n 'input:not([type=\"hidden\"])',\n \"select\",\n \"[tabindex]\",\n \"textarea\",\n];\n\n/**\n * # Focus Position\n */\nexport type FocusPosition = \"next\" | \"previous\" | \"first\" | \"last\";\n\n/**\n * # Focus Child\n * @param el\n * @param position\n */\nexport function focusChild(\n el?: Element,\n position?: FocusPosition,\n): HTMLElement | undefined {\n if (!el) {\n return undefined;\n }\n\n let focusedElement: HTMLElement | undefined;\n const focusableElements = getFocusableChildren(el);\n const index = focusableElements.indexOf(\n document.activeElement as HTMLElement,\n );\n\n if (!position) {\n if (\n el === document.activeElement ||\n !el.contains(document.activeElement)\n ) {\n focusedElement = focusableElements[0];\n }\n } else if (position === \"first\") {\n focusedElement = focusableElements[0];\n } else if (position === \"last\") {\n focusedElement = focusableElements.at(-1)!;\n } else {\n let lastElement;\n let lastIndex = index;\n const increment = position === \"next\" ? 1 : -1;\n do {\n lastIndex += increment;\n lastElement = focusableElements[lastIndex];\n } while (\n (!lastElement || lastElement.offsetParent == null) &&\n lastIndex < focusableElements.length &&\n lastIndex >= 0\n );\n if (lastElement) {\n focusedElement = lastElement;\n } else {\n return focusChild(el, position === \"next\" ? \"first\" : \"last\");\n }\n }\n if (focusedElement) {\n focusedElement.focus();\n return focusedElement;\n }\n return undefined;\n}\n\n/**\n * # Get Focusable Children\n *\n * Find and return any focusable elements within the supplied element,\n * unless they're disabled or have a negative `tabindex` of -1.\n *\n * @param el\n * @param filterByTabIndex\n */\nexport function getFocusableChildren(\n el: Element,\n filterByTabIndex = true,\n): HTMLElement[] {\n const selectors = focusableElements\n .map(\n (selector) =>\n `${selector}${filterByTabIndex ? ':not([tabindex=\"-1\"])' : \"\"}:not([disabled])`,\n )\n .join(\", \");\n return [...el.querySelectorAll(selectors)] as HTMLElement[];\n}\n\n/**\n * # Has Event Listener\n *\n * Determines whether the `props` supplied includes an event listener, or\n * any variations of the event listener. For example, 'click' events may have:\n * - 'onClick'\n * - 'onClickOnce'\n * - 'onClickOnceCapture'\n * - 'onClickCaptureOnce'\n *\n * @param props\n * @param name\n */\nexport function hasEventListener(\n props: Record<string, any>,\n name: string,\n): boolean {\n name = \"on\" + capitalize(name);\n return !!(\n props[name] ||\n props[`${name}Once`] ||\n props[`${name}Capture`] ||\n props[`${name}OnceCapture`] ||\n props[`${name}CaptureOnce`]\n );\n}\n\n/**\n * ## Add Scroll Event Listeners to Element (and its parents)\n * @param el\n * @param onScroll\n */\nexport function addScrollEventListener(\n el: HTMLElement | undefined,\n onScroll: (e: Event) => void,\n) {\n const scrollElements = [document, ...getScrollParents(el)];\n scrollElements.forEach((el) => {\n el.addEventListener(\"scroll\", onScroll, { passive: true });\n });\n onScopeDispose(() => {\n scrollElements.forEach((el) => {\n el.removeEventListener(\"scroll\", onScroll);\n });\n });\n}\n","import { isOn } from \"./is-functions.ts\";\nimport { eventName } from \"./events.ts\";\n\n/**\n * @todo: Move into events at some point\n */\n\nconst handlers = new WeakMap<HTMLElement, Set<[string, () => void]>>();\n\n/**\n * # Bind Props\n * @param el\n * @param props\n */\nexport function bindProps(el: HTMLElement, props: Record<string, any>) {\n Object.keys(props).forEach((k) => {\n if (isOn(k)) {\n const name = eventName(k);\n const handler = handlers.get(el);\n if (props[k] == null) {\n handler?.forEach((v) => {\n const [n, fn] = v;\n if (n === name) {\n el.removeEventListener(name, fn);\n handler.delete(v);\n }\n });\n } else if (\n !handler ||\n ![...handler]?.some((v) => v[0] === name && v[1] === props[k])\n ) {\n el.addEventListener(name, props[k]);\n const _handler = handler || new Set();\n _handler.add([name, props[k]]);\n if (!handlers.has(el)) {\n handlers.set(el, _handler);\n }\n }\n } else {\n if (props[k] == null) {\n el.removeAttribute(k);\n } else {\n el.setAttribute(k, props[k]);\n }\n }\n });\n}\n\n/**\n * # Unbind Props\n * @param el\n * @param props\n */\nexport function unbindProps(el: HTMLElement, props: Record<string, any>) {\n Object.keys(props).forEach((k) => {\n if (isOn(k)) {\n const name = eventName(k);\n const handler = handlers.get(el);\n handler?.forEach((v) => {\n const [n, fn] = v;\n if (n === name) {\n el.removeEventListener(name, fn);\n handler.delete(v);\n }\n });\n } else {\n el.removeAttribute(k);\n }\n });\n}\n","/**\n * # Browser\n */\nexport class Browser {\n public static readonly hasWindow: boolean = typeof window !== \"undefined\";\n\n public static readonly supportsIntersection: boolean =\n this.hasWindow && \"IntersectionObserver\" in window;\n\n /**\n * ## Supports Touch\n * Added into a static getter method to avoid issues during development when switching between emulators.\n */\n public static get supportsTouch(): boolean {\n return (\n this.hasWindow &&\n (\"ontouchstart\" in window || window.navigator.maxTouchPoints > 0)\n );\n }\n\n public static readonly supportsFocusVisible: boolean =\n this.hasWindow && window.CSS?.supports?.(\"selector(:focus-visible)\");\n}\n","import { ComponentInternalInstance, InjectionKey, VNodeChild } from \"vue\";\n\n/**\n * # findChildren\n *\n * @param vnode\n */\nexport function findChildren(vnode?: VNodeChild): ComponentInternalInstance[] {\n if (!vnode || typeof vnode !== \"object\") {\n return [];\n }\n if (Array.isArray(vnode)) {\n return vnode\n .map((child) => findChildren(child))\n .filter((v) => v)\n .flat(1);\n } else if (Array.isArray(vnode.children)) {\n return vnode.children\n .map((child) => findChildren(child))\n .filter((v) => v)\n .flat(1);\n } else if (vnode.component) {\n return [vnode.component, ...findChildren(vnode.component?.subTree)]\n .filter((v) => v)\n .flat(1);\n }\n return [];\n}\n\n/**\n * # findChildrenWithProvide\n *\n * @param key\n * @param vnode\n */\nexport function findChildrenWithProvide(\n key: InjectionKey<any> | symbol,\n vnode?: VNodeChild,\n): ComponentInternalInstance[] {\n if (!vnode || typeof vnode !== \"object\") {\n return [];\n }\n if (Array.isArray(vnode)) {\n return vnode\n .map((child) => findChildrenWithProvide(key, child))\n .flat(1);\n } else if (Array.isArray(vnode.children)) {\n return vnode.children\n .map((child) => findChildrenWithProvide(key, child))\n .flat(1);\n } else if (vnode.component) {\n if (\n Object.getOwnPropertySymbols(vnode.component.provides).includes(\n key as symbol,\n )\n ) {\n return [vnode.component];\n } else if (vnode.component.subTree) {\n return findChildrenWithProvide(key, vnode.component.subTree).flat(\n 1,\n );\n }\n }\n return [];\n}\n\n/**\n * # focusableChildren\n *\n * Find children within the supplied `el` we focus to.\n *\n * @param el\n * @param filterByTabIndex\n */\nexport function focusableChildren(el: Element, filterByTabIndex = true) {\n const targets = [\n \"button\",\n \"[href]\",\n 'input:not([type=\"hidden\"])',\n \"select\",\n \"textarea\",\n \"[tabindex]\",\n ]\n .map(\n (s) =>\n `${s}${filterByTabIndex ? ':not([tabindex=\"-1\"])' : \"\"}:not([disabled])`,\n )\n .join(\", \");\n return [...el.querySelectorAll(targets)] as HTMLElement[];\n}\n","import { ComponentInternalInstance, getCurrentInstance } from \"vue\";\n\n/**\n * # Get Current Component\n *\n * Gets the current instance of component from vue.\n *\n * @param callee\n */\nexport function getCurrentComponent(callee: string): ComponentInternalInstance {\n const component = getCurrentInstance();\n if (!component) {\n throw new Error(`Evance UI: ${callee} requires a component instance`);\n }\n return component;\n}\n","/**\n * # Console Warn\n * @param message\n */\nexport function consoleWarn(message: string): void {\n console.warn(`Evance UI: ${message}`);\n}\n\n/**\n * # Console Error\n * @param message\n */\nexport function consoleError(message: string): void {\n console.error(`Evance UI: ${message}`);\n}\n","export const axes = [\"x\", \"y\"] as const;\nexport type Axis = (typeof axes)[number];\n\n/**\n * # Coordinates\n * Two-dimensional coordinates (x,y).\n */\nexport interface Coordinates {\n x: number;\n y: number;\n}\n\n/**\n * # Dimensions\n */\nexport interface Dimensions {\n width: number;\n height: number;\n}\n\n/**\n * # Position\n * Representative of an element's position attributes describing the bounding area of a box.\n */\nexport interface Position {\n top: number;\n right: number;\n bottom: number;\n left: number;\n}\n\n/**\n * # Margins\n * Essentially the same as Position, but is intended to describe areas outside the box\n * (same as CSS `margin`).\n */\nexport type Margins = Position;\n\nexport interface RectProps extends Coordinates, Dimensions {}\n\n/**\n * # Rect\n *\n * Describes a bounding rectangle a bit like DOMRect, but not readonly.\n */\nexport class Rect implements Coordinates, Dimensions, Position {\n constructor(\n public x: number,\n public y: number,\n public width: number,\n public height: number,\n ) {}\n\n get top() {\n return this.y;\n }\n\n get bottom() {\n return this.y + this.height;\n }\n\n get left() {\n return this.x;\n }\n\n get right() {\n return this.x + this.width;\n }\n\n /**\n * ## Add Offset\n * @param offset\n */\n public addOffset(offset: Coordinates): Rect {\n const rect = Rect.fromRect(this);\n rect.x += offset.x;\n rect.y += offset.y;\n return rect;\n }\n\n /**\n * ## From Element\n * @param el\n * @param beforeTransforms\n */\n public static fromElement(\n el: HTMLElement,\n beforeTransforms: boolean = false,\n ): Rect {\n if (!beforeTransforms) {\n return Rect.fromRect(el.getBoundingClientRect());\n }\n return adjustedBoundingRect(el);\n }\n\n /**\n * ## From Rect\n * Kind of replicates DOMRect.fromRect()\n * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMRect/fromRect_static\n * @param rect\n */\n public static fromRect(rect: DOMRect | Rect | RectProps): Rect {\n return new Rect(rect.x, rect.y, rect.width, rect.height);\n }\n\n /**\n * ## Get Overflow\n * Returns the overflow margins based on a second Rect.\n * @param b\n */\n public getOverflow(b: Rect): Margins {\n return {\n top: Math.max(0, b.top - this.top),\n right: Math.max(0, this.right - b.right),\n bottom: Math.max(0, this.bottom - b.bottom),\n left: Math.max(0, b.left - this.left),\n };\n }\n}\n\n/**\n * # Adjust Bounding Rect\n *\n * Calculate Bounding Rect before being transformed.\n *\n * This doesn't account for skew or rotate translations, but at least it produces correct edge positions\n * when scale is used and does not impose much of a performance penalty when there is no transform.\n *\n * @see https://stackoverflow.com/a/57876601/2074736\n */\nexport function adjustedBoundingRect(el: HTMLElement): Rect {\n const rect = el.getBoundingClientRect();\n const style = getComputedStyle(el);\n const tx = style.transform;\n\n if (tx) {\n let ta, sx, sy, dx, dy;\n if (tx.startsWith(\"matrix3d(\")) {\n ta = tx.slice(9, -1).split(/, /);\n sx = +ta[0];\n sy = +ta[5];\n dx = +ta[12];\n dy = +ta[13];\n } else if (tx.startsWith(\"matrix(\")) {\n ta = tx.slice(7, -1).split(/, /);\n sx = +ta[0];\n sy = +ta[3];\n dx = +ta[4];\n dy = +ta[5];\n } else {\n return Rect.fromRect(rect);\n }\n\n const to = style.transformOrigin;\n const x = rect.x - dx - (1 - sx) * parseFloat(to);\n const y =\n rect.y - dy - (1 - sy) * parseFloat(to.slice(to.indexOf(\" \") + 1));\n const w = sx ? rect.width / sx : el.offsetWidth + 1;\n const h = sy ? rect.height / sy : el.offsetHeight + 1;\n\n return new Rect(x, y, w, h);\n } else {\n return Rect.fromRect(rect);\n }\n}\n\n/**\n * # getTargetRect\n *\n * @param target\n */\nexport function getTargetRect(target: HTMLElement | [x: number, y: number]) {\n if (Array.isArray(target)) {\n return new Rect(target[0], target[1], 0, 0);\n } else {\n return target.getBoundingClientRect();\n }\n}\n","import {\n ComponentInternalInstance,\n ComponentOptions,\n ComponentPublicInstance,\n computed,\n ComputedGetter,\n reactive,\n toRefs,\n ToRefs,\n watchEffect,\n} from \"vue\";\nimport {\n Browser,\n getCurrentComponent,\n isArray,\n isFunction,\n isObjectNotArray,\n} from \"../util\";\n\n/**\n * # Get Next ID\n */\nlet currentId: number = 0;\nlet assignedIds = new WeakMap<ComponentInternalInstance, number>();\nexport function getNextId(): number {\n const component = getCurrentComponent(\"getNextId()\");\n if (assignedIds.has(component)) {\n return assignedIds.get(component)!;\n }\n const id = ++currentId;\n assignedIds.set(component, id);\n return id;\n}\ngetNextId.reset = () => {\n currentId = 0;\n assignedIds = new WeakMap();\n};\n\n/**\n * # Getter Property Key\n *\n * Defines where to look for Property information within getter functions.\n *\n * For example: an object might have a `title` property.\n * So a property key may represent either an array index, or an object property.\n *\n * - `boolean` - Ignored\n * - `string` - Property name, or use Object path notation.\n * - `array` of strings or numbers represent nested lookup - each array element represents a key in the hierarchy\n */\nexport type GetterPropertyKey =\n | boolean\n | string\n | (string | number)[]\n | ((item: Record<string, any>, fallback?: any) => any);\n\n/**\n * # Get Property\n *\n * A getter function, which gets a property from the `subject`, which may be\n * any kind of object.\n *\n */\nexport function getPropertyValue(\n subject: any,\n property: GetterPropertyKey,\n fallback?: any,\n): any {\n if (property == null) {\n return subject === undefined ? fallback : subject;\n }\n if (subject !== Object(subject)) {\n if (typeof property !== \"function\") {\n return fallback;\n }\n const value = property(subject, fallback);\n return typeof value === \"undefined\" ? fallback : value;\n }\n if (typeof property === \"string\") {\n return getPropertyValueByPath(subject, property, fallback);\n }\n if (Array.isArray(property)) {\n return getNestedPropertyValue(subject, property, fallback);\n }\n if (!isFunction(property)) {\n return fallback;\n }\n const value = property(subject, fallback);\n return typeof value === \"undefined\" ? fallback : value;\n}\n\n/**\n * # Get Property from Path\n *\n * This is a rough copy of Evance's `EvObjectPathGetter` functionality.\n *\n * @param subject\n * @param objectPath\n * @param fallback\n */\nexport function getPropertyValueByPath(\n subject: any,\n objectPath: string,\n fallback?: any,\n) {\n if (subject == null || !objectPath) {\n return fallback;\n }\n const propertyKeys = objectPathToPropertyKeys(objectPath);\n return getNestedPropertyValue(subject, propertyKeys, fallback);\n}\n\n/**\n * # Get Nested Property Value\n *\n * @param subject\n * @param propertyKeys\n * @param fallback\n */\nexport function getNestedPropertyValue(\n subject: any,\n propertyKeys: PropertyKey[],\n fallback?: any,\n): any {\n let lastValue = subject;\n for (const property of propertyKeys) {\n if (lastValue === undefined) {\n break;\n }\n lastValue = lastValue[property];\n }\n return lastValue === undefined ? fallback : lastValue;\n}\n\n/**\n * # Object Path To Array\n *\n * This is a rough copy of Evance's `EvObjectPath` functionality.\n *\n * @param path\n */\nexport function objectPathToPropertyKeys(path: string): PropertyKey[] {\n const pattern = /^([\\da-z_-]+)(?:[\\/.]([\\da-z_-]+)|\\[(\\d+)\\])*$/i;\n const matches = path.match(pattern);\n if (!matches) {\n throw new Error(`Evance UI: Invalid Object Path '${path}'.`);\n }\n path = path.replace(\"]\", \"\").replace(\"[\", \".\").replace(\"/\", \".\");\n return path.split(\".\");\n}\n\n/**\n * # Ref Element\n * @param obj\n */\nexport function refElement<T extends object | undefined>(\n obj: T,\n): Exclude<T, ComponentPublicInstance> | HTMLElement {\n return obj && \"$el\" in obj\n ? (obj.$el as HTMLElement)\n : (obj as HTMLElement);\n}\n\n/**\n * # Split Object\n *\n * Split an object into two using an Array of keys or RegExp to test keys against.\n *\n * This results an array containing an object containing only matching keys,\n * and an object containing the remaining keys.\n *\n * @param subject\n * @param paths\n * @param exclude\n */\nexport function splitObject<\n Subject extends object,\n SubjectKey extends Extract<keyof Subject, string>,\n Exclusions extends Extract<keyof Subject, string>,\n>(\n subject: Subject,\n paths: (SubjectKey | RegExp)[],\n exclude?: Exclusions[],\n): [matched: Partial<Subject>, unmatched: Partial<Subject>] {\n const matching = Object.create(null);\n const remaining = Object.create(null);\n for (const key in subject) {\n if (\n paths.some((path) =>\n path instanceof RegExp ? path.test(key) : path === key,\n ) &&\n !exclude?.some((path) => path === key)\n ) {\n matching[key] = subject[key];\n } else {\n remaining[key] = subject[key];\n }\n }\n return [matching, remaining];\n}\n\n/**\n * ## Split Input Attrs\n *\n * Filter/split an attributes objects into two objects:\n * 1. Attributes not intended for an input field.\n * 2. Attributes for an input field.\n *\n * @param attrs\n */\nexport function splitInputAttrs(attrs: Record<string, unknown>) {\n return splitObject(attrs, [\"class\", \"style\", \"id\", /^data-/]);\n}\n\n/**\n * # Clamp\n *\n * @param value\n * @param min\n * @param max\n */\nexport function clamp(value: number, min = 0, max = 1) {\n return Math.max(min, Math.min(max, value));\n}\n\n// Only allow a single return type\ntype NotAUnion<T> = [T] extends [infer U] ? _NotAUnion<U, U> : never;\ntype _NotAUnion<T, U> = U extends any\n ? [T] extends [U]\n ? unknown\n : never\n : never;\n\n/**\n * # Destruct Computed\n *\n * Convert a computed ref to a record of refs.\n * The getter function must always return an object with the same keys.\n */\nexport function destructComputed<T extends object>(\n getter: ComputedGetter<T & NotAUnion<T>>,\n): ToRefs<T>;\nexport function destructComputed<T extends object>(getter: ComputedGetter<T>) {\n const refs = reactive({}) as T;\n const base = computed(getter);\n watchEffect(\n () => {\n for (const key in base.value) {\n refs[key] = base.value[key];\n }\n },\n { flush: \"sync\" },\n );\n return toRefs(refs);\n}\n\n/**\n * # Union To Intersection\n *\n * Intersection `I` of all types in the union `U` - transform a union of object types into an intersection of those types.\n * This can be helpful when you want to combine multiple types into a single type, where all properties from each type\n * become part of the resulting type.\n */\nexport type UnionToIntersection<U> = (\n U extends any ? (k: U) => void : never\n) extends (k: infer I) => void\n ? I\n : never;\n\n/**\n * # Get Descriptor\n *\n * Returns the closest property descriptor for an object.\n *\n * @param obj\n * @param key\n */\nexport function getPropertyDescriptor(obj: any, key: PropertyKey) {\n let currentObj = obj;\n while (currentObj) {\n const descriptor = Reflect.getOwnPropertyDescriptor(currentObj, key);\n if (descriptor) {\n return descriptor;\n }\n currentObj = Object.getPrototypeOf(currentObj);\n }\n return undefined;\n}\n\n/**\n * # Filter Component Props\n *\n * Extracts the component's props from a props record.\n *\n * Excludes `class` and `style`.\n *\n * @param component\n * @param props\n */\nexport function filterComponentProps(\n component: ComponentOptions<any>,\n props: Record<string, any>,\n) {\n return splitObject(props, Object.keys(component.props), [\n \"class\",\n \"style\",\n ])[0];\n}\n\n/**\n * # If Any\n */\ntype IfAny<T, Y, N> = 0 extends 1 & T ? Y : N;\n\n/**\n * # Wrap In Array\n * @param value\n */\nexport function wrapInArray<T>(\n value: T | null | undefined,\n): T extends readonly any[] ? IfAny<T, T[], T> : NonNullable<T>[] {\n return value == null ? [] : isArray(value) ? (value as any) : [value];\n}\n\nexport function mergeDeep(\n source: Record<string, any> = {},\n target: Record<string, any> = {},\n arrayFn?: (a: unknown[], b: unknown[]) => unknown[],\n) {\n const out: Record<string, any> = {};\n\n for (const key in source) {\n out[key] = source[key];\n }\n\n for (const key in target) {\n const sourceProperty = source[key];\n const targetProperty = target[key];\n\n // Only continue deep merging if\n // both properties are objects\n if (\n isObjectNotArray(sourceProperty) &&\n isObjectNotArray(targetProperty)\n ) {\n out[key] = mergeDeep(sourceProperty, targetProperty, arrayFn);\n continue;\n }\n\n if (isArray(sourceProperty) && isArray(targetProperty) && arrayFn) {\n out[key] = arrayFn(sourceProperty, targetProperty);\n continue;\n }\n\n out[key] = targetProperty;\n }\n\n return out;\n}\n\n/**\n * # Create Range\n *\n * @param length\n * @param start\n */\nexport function createRange(length: number, start = 0): number[] {\n return Array.from({ length }, (v, k) => start + k);\n}\n\n/**\n * # Omit\n *\n * Clones an object, whilst omitting excluded properties.\n *\n * @param obj\n * @param exclude\n */\nexport function omit<T extends object, U extends Extract<keyof T, string>>(\n obj: T,\n exclude: U[],\n): Omit<T, U> {\n const clone = { ...obj };\n\n exclude.forEach((prop) => delete clone[prop]);\n\n return clone;\n}\n\n/**\n * # matchesSelector\n * Returns `null` if the CSS selector is not supported, or can't be checked.\n * @param el\n * @param selector\n */\nexport function matchesSelector(\n el: Element | undefined,\n selector: string,\n): boolean | null {\n const supportsSelector =\n Browser.hasWindow &&\n typeof CSS !== \"undefined\" &&\n typeof CSS.supports !== \"undefined\" &&\n CSS.supports(`selector(${selector})`);\n\n if (!supportsSelector) {\n return null;\n }\n\n try {\n return !!el && el.matches(selector);\n } catch (err) {\n return null;\n }\n}\n\nexport function keys<O extends {}>(o: O) {\n return Object.keys(o) as (keyof O)[];\n}\n","// Utilities\n\n// Types\nimport type { ComponentInternalInstance, InjectionKey } from \"vue\";\nimport { getCurrentComponent } from \"@/util/components.ts\";\n\nexport function injectSelf<T>(\n key: InjectionKey<T> | string,\n vm?: ComponentInternalInstance,\n): T | undefined;\nexport function injectSelf(\n key: InjectionKey<any> | string,\n component = getCurrentComponent(\"injectSelf\"),\n) {\n const { provides } = component as { provides?: any };\n\n if (provides && (key as string | symbol) in provides) {\n // TS doesn't allow symbol as index type\n return provides[key as string];\n }\n return undefined;\n}\n","export function isFixedPosition(el?: HTMLElement) {\n while (el) {\n if (window.getComputedStyle(el).position === \"fixed\") {\n return true;\n }\n el = el.offsetParent as HTMLElement;\n }\n return false;\n}\n","/**\n * # Key Logger\n */\nexport class KeyLogger {\n public lastTime: number = 0;\n\n public timeToKeep: number = 1000;\n\n public value: string = \"\";\n\n /**\n * ## Log\n * @param e\n */\n public log(e: KeyboardEvent): boolean {\n if (!isKeyEventLoggable(e)) {\n return false;\n }\n const now = performance.now();\n if (now - this.lastTime > this.timeToKeep) {\n this.value = \"\";\n }\n this.value += e.key.toLowerCase();\n this.lastTime = now;\n return true;\n }\n}\n\n/**\n * # Is Key Event Loggable?\n * @param e\n */\nexport function isKeyEventLoggable(e: KeyboardEvent): boolean {\n const isPrintableChar = e.key.length === 1;\n const noModifier = !e.ctrlKey && !e.metaKey && !e.altKey;\n return isPrintableChar && noModifier;\n}\n\n/**\n * # compositionIgnoreKeys\n * Keys to ignore whilst the keyboard is in a composing sequence,\n * which is often used to input characters in languages that have complex character systems,\n * such as Chinese, Japanese, or Korean.\n */\nconst compositionIgnoreKeys = [\n \"ArrowUp\",\n \"ArrowDown\",\n \"ArrowRight\",\n \"ArrowLeft\",\n \"Enter\",\n \"Escape\",\n \"Tab\",\n \" \",\n];\n\n/**\n * # isComposingIgnoreKey\n * Returns `true` if the keyboard event is within a composing sequence,\n * and the key pressed is included within `compositionIgnoreKeys`.\n */\nexport function isComposingIgnoreKey(e: KeyboardEvent): boolean {\n return e.isComposing && compositionIgnoreKeys.includes(e.key);\n}\n","/**\n * # Integerish Pattern\n */\nexport const IntegerishPattern: RegExp = /^\\d+$/;\n\n/**\n * # Is Integerish\n * @param value\n */\nexport function isIntegerish(value: string | number): boolean {\n return IntegerishPattern.test(value.toString());\n}\n","/**\n * # spaceSeparatedValues\n *\n * Accepts a string and converts it into an array of values.\n *\n * @param values\n */\nexport function spaceSeparatedValues(values: string = \"\"): string[] {\n if (spaceSeparatedValues.cache.has(values)) {\n return spaceSeparatedValues.cache.get(values)!;\n }\n return values.split(\" \").map((value) => value.trim());\n}\nspaceSeparatedValues.cache = new Map<string, string[]>();\n\n/**\n * # To Kebab Case\n *\n * Converts a string to `kebab-case` by replacing each space or letter capitalization with a dash (-).\n *\n * @param value\n */\nexport function toKebabCase(value: string = \"\"): string {\n if (toKebabCase.cache.has(value)) {\n return toKebabCase.cache.get(value)!;\n }\n const kebabValue = value\n .replace(/[^a-z]/gi, \"-\")\n .replace(/\\B([A-Z])/g, \"-$1\")\n .toLowerCase();\n toKebabCase.cache.set(value, kebabValue);\n return kebabValue;\n}\ntoKebabCase.cache = new Map<string, string>();\n\n/**\n * # To Camel Case\n *\n * Converts a string from `kebab-case` to `camelCase`.\n *\n * @param value\n */\nexport function toCamelCase(value: string = \"\"): string {\n if (toCamelCase.cache.has(value)) {\n return toCamelCase.cache.get(value)!;\n }\n const camelValue = value.replace(/-([a-z])/g, (_, match) =>\n match.toUpperCase(),\n );\n toCamelCase.cache.set(value, camelValue);\n return camelValue;\n}\ntoCamelCase.cache = new Map<string, string>();\n\n/**\n * ## Template Variables\n *\n * May be supplied to `createStringTemplate()` either as default variable replacements\n * or during template execution for variable replacement.\n *\n * @see createStringTemplate\n */\nexport type TemplateVariables = {\n [variable: string]: number | string;\n};\n\n/**\n * # Template Function\n *\n * A template function is returned from `createStringTemplate`, which converts the template\n * into a string, replacing any variables with those contained within the variables supplied.\n *\n * @see createStringTemplate\n */\nexport type TemplateFunction = (variables?: TemplateVariables) => string;\n\n/**\n * # String Template\n *\n * An approximation of Evance's String Templates.\n *\n * Allows us to build strings as a template with replacement variables.\n *\n * This is inspired by the output tags of EVML and behaves similarly. However, unlike EVML\n * which is compiled this is a simple find and replace template format and variables are only\n * wrapped within single curly brackets e.g. 'Hello { name }'.\n *\n * @param template\n * @param defaultVariables\n */\nexport function createStringTemplate(\n template: string,\n defaultVariables: TemplateVariables = {},\n): TemplateFunction {\n /** Variable lookup pattern */\n const variablePattern = /{([\\s\\S]+?)}/g;\n\n return (variables: TemplateVariables = {}) => {\n const dictionary = { ...defaultVariables, ...variables };\n\n return template.replaceAll(variablePattern, (match, raw): string => {\n const variable = raw.trim();\n if (dictionary[variable] === undefined) {\n console.warn(`Unrecognized template variable '${variable}'.`);\n return `\"${variable}\"`;\n }\n return dictionary[variable] as string;\n });\n };\n}\n\n/**\n * # Pad End\n *\n * @param str\n * @param length\n * @param char\n */\nexport function padEnd(str: string, length: number, char = \"0\") {\n return str + char.repeat(Math.max(0, length - str.length));\n}\n\n/**\n * # Pad Start\n *\n * @param str\n * @param length\n * @param char\n */\nexport function padStart(str: string, length: number, char = \"0\") {\n return char.repeat(Math.max(0, length - str.length)) + str;\n}\n\n/**\n * # Trim End\n *\n * @param targetString\n * @param trimChars\n */\nexport function trimEnd(targetString: string, trimChars: string): string {\n if (!targetString.endsWith(trimChars)) {\n return targetString;\n }\n return targetString.substring(0, targetString.length - trimChars.length);\n}\n","export type StyleProp = Record<string, string>;\n\n/**\n * # Set Fixed Position\n * @param style\n * @param isRtl\n */\nexport function toFixedPosition(style: StyleProp, isRtl: boolean = false) {\n Object.assign(style, {\n position: \"fixed\",\n top: 0,\n [isRtl ? \"right\" : \"left\"]: 0,\n });\n}\n","import { isEmpty } from \"./is-functions.ts\";\n\n/**\n * # To Web Unit\n * @param value\n * @param unit\n */\nexport function toWebUnit(\n value?: string | number,\n unit: string = \"px\",\n): string | undefined {\n if (isEmpty(value)) {\n return undefined;\n }\n if (isNaN(+value!)) {\n return String(value);\n }\n if (!isFinite(+value!)) {\n return undefined;\n }\n return `${value}${unit}`;\n}\n\n/**\n * # Pixel Round\n * @param value\n */\nexport function pixelRound(value: number): number {\n return Math.round(value * devicePixelRatio) / devicePixelRatio;\n}\n\n/**\n * # Pixel Ceil\n * @param value\n */\nexport function pixelCeil(value: number): number {\n return Math.round(value * devicePixelRatio) / devicePixelRatio;\n}\n\n/**\n * # extractWebUnit\n * @param value\n */\nexport function extractWebUnit(value: string) {\n const regex = /^(-?\\d+(?:\\.\\d+)?)\\s*([a-zA-Z%]*)$/;\n const match = value.match(regex);\n if (!match) {\n return undefined;\n }\n return {\n value: parseFloat(match[1]),\n unit: match[2] ?? \"px\",\n };\n}\n","// Composables\nimport { propsFactory } from \"../util\";\nimport { PropType, StyleValue } from \"vue\";\n\nexport type ClassValue = any;\n\nexport interface ComponentProps {\n class?: ClassValue;\n style: StyleValue | undefined;\n}\n\nexport const makeComponentProps = propsFactory(\n {\n class: [String, Array] as PropType<ClassValue>,\n style: {\n type: [String, Array, Object] as PropType<StyleValue>,\n default: null,\n },\n },\n \"component\",\n);\n","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = {\n width: \"24\",\n height: \"24\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n}\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"path\", {\n d: \"M12 6L13.414 7.414L9.828 11H18V13H9.828L13.414 16.586L12 18L6 12L12 6Z\",\n fill: \"currentColor\"\n}, null, -1)\nconst _hoisted_3 = [\n _hoisted_2\n]\n\nexport function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, _hoisted_3))\n}\nexport default { render: render }","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = {\n width: \"24\",\n height: \"24\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n}\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"path\", {\n d: \"M12 6L10.586 7.414L14.172 11H6V13H14.172L10.586 16.586L12 18L18 12L12 6Z\",\n fill: \"currentColor\"\n}, null, -1)\nconst _hoisted_3 = [\n _hoisted_2\n]\n\nexport function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, _hoisted_3))\n}\nexport default { render: render }","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = {\n width: \"24\",\n height: \"24\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n}\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"path\", {\n d: \"M20 4H19V2H17V4H7V2H5V4H4C2.9 4 2 4.81818 2 5.81818V20.1818C2 21.1818 2.9 22 4 22H20C21.1 22 22 21.1818 22 20.1818V5.81818C22 4.81818 21.1 4 20 4ZM20 20H4V9H20V20Z\",\n fill: \"currentColor\"\n}, null, -1)\nconst _hoisted_3 = /*#__PURE__*/_createElementVNode(\"path\", {\n d: \"M14 12H17V15H14V12Z\",\n fill: \"currentColor\"\n}, null, -1)\nconst _hoisted_4 = [\n _hoisted_2,\n _hoisted_3\n]\n\nexport function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, _hoisted_4))\n}\nexport default { render: render }","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = {\n width: \"24\",\n height: \"24\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n}\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"path\", {\n d: \"M18.9844 6.42188L13.4062 12L18.9844 17.5781L17.5781 18.9844L12 13.4062L6.42188 18.9844L5.01562 17.5781L10.5938 12L5.01562 6.42188L6.42188 5.01562L12 10.5938L17.5781 5.01562L18.9844 6.42188Z\",\n fill: \"currentColor\"\n}, null, -1)\nconst _hoisted_3 = [\n _hoisted_2\n]\n\nexport function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, _hoisted_3))\n}\nexport default { render: render }","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = {\n width: \"24\",\n height: \"24\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n}\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n \"clip-rule\": \"evenodd\",\n d: \"M12 21C16.9706 21 21 16.9706 21 12C21 7.02944 16.9706 3 12 3C7.02944 3 3 7.02944 3 12C3 16.9706 7.02944 21 12 21ZM15.4852 8.68629L16.8994 10.1005L11 16L7.34326 12.3431L8.75748 10.9289L11 13.1715L15.4852 8.68629Z\",\n fill: \"currentColor\"\n}, null, -1)\nconst _hoisted_3 = [\n _hoisted_2\n]\n\nexport function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, _hoisted_3))\n}\nexport default { render: render }","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = {\n width: \"24\",\n height: \"24\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n}\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"path\", {\n d: \"M19.8996 7.60051L18.4854 6.18629L10.0002 14.6715L5.7576 10.4289L4.34338 11.8431L10.0001 17.5L19.8996 7.60051Z\",\n fill: \"currentColor\"\n}, null, -1)\nconst _hoisted_3 = [\n _hoisted_2\n]\n\nexport function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, _hoisted_3))\n}\nexport default { render: render }","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = {\n width: \"24\",\n height: \"24\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n}\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"path\", {\n d: \"M16 9L12 13L8 9L7 10L12 15L17 10L16 9Z\",\n fill: \"currentColor\"\n}, null, -1)\nconst _hoisted_3 = [\n _hoisted_2\n]\n\nexport function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, _hoisted_3))\n}\nexport default { render: render }","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = {\n width: \"24\",\n height: \"24\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n}\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"path\", {\n d: \"M15 16L11 12L15 8L14 7L9 12L14 17L15 16Z\",\n fill: \"currentColor\"\n}, null, -1)\nconst _hoisted_3 = [\n _hoisted_2\n]\n\nexport function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, _hoisted_3))\n}\nexport default { render: render }","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = {\n width: \"24\",\n height: \"24\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n}\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"path\", {\n d: \"M9 8L13 12L9 16L10 17L15 12L10 7L9 8Z\",\n fill: \"currentColor\"\n}, null, -1)\nconst _hoisted_3 = [\n _hoisted_2\n]\n\nexport function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, _hoisted_3))\n}\nexport default { render: render }","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = {\n width: \"24\",\n height: \"24\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n}\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"path\", {\n d: \"M8 15L12 11L16 15L17 14L12 9L7 14L8 15Z\",\n fill: \"currentColor\"\n}, null, -1)\nconst _hoisted_3 = [\n _hoisted_2\n]\n\nexport function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, _hoisted_3))\n}\nexport default { render: render }","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = {\n width: \"24\",\n height: \"24\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n}\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n \"clip-rule\": \"evenodd\",\n d: \"M2.41416 10.5858C1.63311 11.3668 1.63311 12.6332 2.41416 13.4142L10.5858 21.5858C11.3668 22.3669 12.6332 22.3669 13.4142 21.5858L21.5858 13.4142C22.3669 12.6332 22.3669 11.3668 21.5858 10.5858L13.4142 2.41416C12.6332 1.63311 11.3668 1.63311 10.5858 2.41416L2.41416 10.5858ZM11.0001 6.99999H13.0001V13H11.0001V6.99999ZM11.0001 15H13.0001V17H11.0001V15Z\",\n fill: \"currentColor\"\n}, null, -1)\nconst _hoisted_3 = [\n _hoisted_2\n]\n\nexport function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, _hoisted_3))\n}\nexport default { render: render }","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = {\n width: \"24\",\n height: \"24\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n}\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"path\", {\n d: \"M12 2C6.47708 2 2 6.47708 2 12C2 17.5229 6.47708 22 12 22C17.5219 22 22 17.5229 22 11.999C22 6.47708 17.5219 2 12 2ZM11.8427 17.8323H11.7896C10.975 17.8083 10.4 17.2073 10.424 16.4042C10.4469 15.6146 11.0354 15.0406 11.8229 15.0406L11.8708 15.0427C12.7083 15.0667 13.2771 15.6615 13.2531 16.4875C13.2292 17.2792 12.651 17.8323 11.8427 17.8323ZM15.2708 11.0292C15.0792 11.3 14.6583 11.6396 14.1271 12.0531L13.5417 12.4562C13.2208 12.7062 13.0271 12.9427 12.9552 13.1729C12.8969 13.3542 12.8698 13.4031 12.8646 13.7729V13.8667H10.6302L10.6365 13.6771C10.6646 12.9021 10.6833 12.4437 11.0052 12.0656C11.5104 11.474 12.625 10.7552 12.6719 10.725C12.8323 10.6052 12.9667 10.4687 13.0667 10.3219C13.301 9.99792 13.4042 9.74375 13.4042 9.49583C13.4042 9.14792 13.3021 8.82604 13.099 8.54167C12.9031 8.26458 12.5312 8.12708 11.9938 8.12708C11.4604 8.12708 11.0948 8.29583 10.8771 8.64375C10.6521 8.99896 10.5385 9.37292 10.5385 9.75521V9.85104H8.23542L8.23958 9.75104C8.29896 8.34167 8.80312 7.32604 9.73437 6.73333C10.3208 6.35729 11.051 6.16667 11.9021 6.16667C13.0146 6.16667 13.9563 6.4375 14.6958 6.97083C15.4469 7.51146 15.8271 8.32187 15.8271 9.37812C15.826 9.96875 15.6396 10.524 15.2708 11.0292Z\",\n fill: \"currentColor\"\n}, null, -1)\nconst _hoisted_3 = [\n _hoisted_2\n]\n\nexport function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, _hoisted_3))\n}\nexport default { render: render }","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = {\n width: \"24\",\n height: \"24\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n}\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"path\", {\n d: \"M11.8663 2.00091C6.34444 2.07484 1.92695 6.61185 2.00092 12.1348C2.07484 17.6545 6.61185 22.073 12.1337 21.9991C17.6555 21.9252 22.073 17.3881 21.9991 11.8652C21.9263 6.34444 17.3881 1.92699 11.8663 2.00091H11.8663ZM12.975 5.33355C13.9913 5.33355 14.2913 5.92269 14.2913 6.59771C14.2913 7.44012 13.6163 8.21947 12.4652 8.21947C11.5022 8.21947 11.0445 7.73471 11.0717 6.93468C11.0717 6.25965 11.6369 5.33355 12.975 5.33355ZM10.3685 18.2501C9.6739 18.2501 9.16518 17.8283 9.65105 15.974L10.4478 12.6869C10.5859 12.1598 10.6087 11.9489 10.4478 11.9489C10.2402 11.9489 9.33804 12.313 8.80432 12.6717L8.45759 12.1032C10.1478 10.6923 12.0914 9.86407 12.9239 9.86407C13.6185 9.86407 13.7337 10.6858 13.387 11.95L12.474 15.4065C12.3131 16.0174 12.3826 16.2283 12.5436 16.2283C12.7511 16.2283 13.4349 15.9761 14.1066 15.4478L14.499 15.975C12.8566 17.6174 11.0642 18.25 10.3685 18.25L10.3685 18.2501Z\",\n fill: \"currentColor\"\n}, null, -1)\nconst _hoisted_3 = [\n _hoisted_2\n]\n\nexport function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, _hoisted_3))\n}\nexport default { render: render }","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = {\n width: \"24\",\n height: \"24\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n}\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"path\", {\n d: \"M19 13H5V11H19V13Z\",\n fill: \"currentColor\"\n}, null, -1)\nconst _hoisted_3 = [\n _hoisted_2\n]\n\nexport function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, _hoisted_3))\n}\nexport default { render: render }","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = {\n width: \"24\",\n height: \"24\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n}\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"path\", {\n d: \"M19 3H5C3.9 3 3 3.9 3 5V19C3 20.1 3.9 21 5 21H19C20.1 21 21 20.1 21 19V5C21 3.9 20.1 3 19 3ZM14 17H7V15H14V17ZM17 13H7V11H17V13ZM17 9H7V7H17V9Z\",\n fill: \"currentColor\"\n}, null, -1)\nconst _hoisted_3 = [\n _hoisted_2\n]\n\nexport function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, _hoisted_3))\n}\nexport default { render: render }","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = {\n width: \"24\",\n height: \"24\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n}\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"path\", {\n d: \"M19 13H13V19H11V13H5C5.00005 12.3333 5.00005 11.6667 5 11H11V5H13V11H19V13Z\",\n fill: \"currentColor\"\n}, null, -1)\nconst _hoisted_3 = [\n _hoisted_2\n]\n\nexport function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, _hoisted_3))\n}\nexport default { render: render }","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = {\n width: \"24\",\n height: \"24\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n}\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n \"clip-rule\": \"evenodd\",\n d: \"M13.1253 14.4981C14.246 13.8497 15 12.6379 15 11.25C15 9.17893 13.3211 7.5 11.25 7.5C9.17893 7.5 7.5 9.17893 7.5 11.25C7.5 13.2507 9.06682 14.8855 11.0404 14.9942L12.6872 17.8467C12.2241 17.9471 11.7432 18 11.25 18C7.52208 18 4.5 14.9779 4.5 11.25C4.5 7.52208 7.52208 4.5 11.25 4.5C14.9779 4.5 18 7.52208 18 11.25C18 12.6321 17.5846 13.9172 16.8719 14.9872L19.4773 19.5H16.0132L14.6256 17.0966C14.6256 17.0966 14.6256 17.0966 14.6256 17.0966L13.1253 14.4981Z\",\n fill: \"currentColor\"\n}, null, -1)\nconst _hoisted_3 = [\n _hoisted_2\n]\n\nexport function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, _hoisted_3))\n}\nexport default { render: render }","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = {\n width: \"24\",\n height: \"24\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n}\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n \"clip-rule\": \"evenodd\",\n d: \"M12.8762 2.59316C12.4963 1.90238 11.5037 1.90238 11.1238 2.59315L1.81503 19.5181C1.44848 20.1846 1.93064 21 2.69124 21H21.3087C22.0693 21 22.5515 20.1846 22.1849 19.5181L12.8762 2.59316ZM11 8.00004H13V14H11V8.00004ZM11 16H13V18H11V16Z\",\n fill: \"currentColor\"\n}, null, -1)\nconst _hoisted_3 = [\n _hoisted_2\n]\n\nexport function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, _hoisted_3))\n}\nexport default { render: render }","import { PropType } from \"vue\";\nimport { Appearance } from \"@/util\";\nimport {\n CheckCircleIcon,\n DangerIcon,\n HelpIcon,\n InfoIcon,\n NoteIcon,\n WarningIcon,\n} from \"@/icons\";\n\nexport type IconValue = string | (string | [path: string, opacity: number])[];\n\nexport const IconProp = [\n String,\n Function,\n Object,\n Array,\n] as PropType<IconValue>;\n\n/**\n * # appearanceIcon\n *\n * Returns the default icon associated with an appearance value.\n *\n * @param appearance\n */\nexport function appearanceIcon(appearance?: string) {\n switch (appearance) {\n case Appearance.danger:\n return DangerIcon;\n case Appearance.information:\n return InfoIcon;\n case Appearance.success:\n return CheckCircleIcon;\n case Appearance.notice:\n return NoteIcon;\n case Appearance.warning:\n return WarningIcon;\n }\n return HelpIcon;\n}\n","import { destructComputed, propsFactory, toWebUnit } from \"@/util\";\nimport { PropType } from \"vue\";\n\nexport const Size = {\n default: \"medium\",\n xSmall: \"x-small\",\n small: \"small\",\n medium: \"medium\",\n large: \"large\",\n xLarge: \"x-large\",\n} as const;\n\ntype SizeValue = (typeof Size)[keyof typeof Size];\n\nexport const predefinedSizes = Array.from(new Set(Object.values(Size)));\n\nexport type SizeProp = SizeValue | number;\n\nexport interface SizeProps {\n size?: SizeProp;\n}\n\nexport const makeSizeProps = propsFactory(\n {\n size: {\n type: [String, Number] as PropType<SizeProp>,\n default: Size.default,\n },\n },\n \"size\",\n);\n\nexport function useSize(props: SizeProps) {\n return destructComputed(() => {\n let sizeClasses: string;\n let sizeStyles = {};\n\n if (predefinedSizes.includes(props.size as SizeValue)) {\n sizeClasses = `is-size-${props.size}`;\n } else if (props.size) {\n sizeStyles = {\n width: toWebUnit(props.size),\n height: toWebUnit(props.size),\n };\n }\n return { sizeClasses, sizeStyles };\n });\n}\n","import { computed, isRef, Ref } from \"vue\";\nimport { propsFactory } from \"@/util\";\n\ntype RoundedValue = boolean | string | number | null | undefined;\n\nexport interface RoundedProps {\n rounded?: RoundedValue;\n tile?: boolean;\n}\n\ntype RoundedData = {\n roundedClasses: Ref<string[]>;\n};\n\nexport const makeRoundedProps = propsFactory(\n {\n rounded: {\n type: [Boolean, Number, String],\n default: undefined,\n },\n },\n \"rounded\",\n);\n\nexport function useRounded(\n props: RoundedProps | Ref<RoundedValue>,\n): RoundedData {\n const roundedClasses = computed(() => {\n const rounded = isRef(props) ? props.value : props.rounded;\n const classes: string[] = [];\n\n if (rounded === true || rounded === \"\") {\n classes.push(\"is-rounded\");\n } else if (typeof rounded === \"string\" || rounded === 0) {\n for (const value of String(rounded).split(\" \")) {\n classes.push(`is-rounded-${value}`);\n }\n }\n\n return classes;\n });\n\n return { roundedClasses };\n}\n","import { makeAppearanceProps, propsFactory } from \"@/util\";\nimport { makeComponentProps } from \"@/composables/component.ts\";\nimport { IconProp } from \"@/composables/icons.ts\";\nimport { makeSizeProps } from \"@/composables/size.ts\";\nimport { makeRoundedProps } from \"@/composables/rounded.ts\";\n\nexport const makeEvAvatarProps = propsFactory(\n {\n icon: IconProp,\n image: String,\n text: String,\n bold: Boolean,\n\n ...makeComponentProps(),\n ...makeAppearanceProps(),\n ...makeSizeProps(),\n ...makeRoundedProps(),\n },\n \"EvAvatar\",\n);\n","import { computed, PropType, toRaw } from \"vue\";\nimport { Appearance, propsFactory } from \"@/util\";\nimport { IconProp } from \"@/composables/icons.ts\";\n\n/**\n * ## Icon Size\n */\nexport type IconSize = \"small\" | \"medium\" | \"large\";\n\nexport const IconAppearance = {\n ...Appearance,\n subtle: \"subtle\",\n} as const;\n\n/**\n * ## Icon Appearance\n */\nexport type IconAppearanceProp =\n (typeof IconAppearance)[keyof typeof IconAppearance];\n\n/**\n * # Use Icon\n * @param props\n * @param name\n */\nexport function useIcon(props: any, name: string) {\n return computed(() => {\n return toRaw(props[name]);\n });\n}\n\nexport const makeEvIconProps = propsFactory(\n {\n glyph: IconProp,\n size: String as PropType<IconSize>,\n appearance: {\n type: String as PropType<IconAppearanceProp>,\n default: Appearance.default,\n },\n },\n \"EvIcon\",\n);\n","/**\n * # Translation Code\n *\n * Language Code: ISO 639-1 codes (required)\n * Country Code: ISO 3166-1 Alpha-2 country code (optional)\n */\nexport class TranslationCode {\n /**\n * @param languageCode\n * @param countryCode\n */\n constructor(\n public languageCode: string,\n public countryCode: string | null = null,\n ) {}\n\n get isRegional(): boolean {\n return !(this.countryCode === null);\n }\n\n /**\n * ## From String\n *\n * Accepts an Evance Locale Code string e.g. 'en-gb'.\n * But will also accept 'en_GB'.\n * @param code\n */\n public static fromString(code: string) {\n const matches = code.match(/^([a-zA-Z]{2,3})(?:[_-]([a-zA-Z]{2,3}))?$/);\n if (!matches) {\n throw new Error(\n `Evance UI: The string '${code}' is not a valid Locale string`,\n );\n }\n const languageCode = matches[1].toLowerCase();\n const countryCode = matches[2]?.toUpperCase() || null;\n return new this(languageCode, countryCode);\n }\n\n /**\n * ## To String\n */\n public toString(): string {\n return (\n this.languageCode + (this.isRegional ? \"-\" + this.countryCode : \"\")\n );\n }\n}\n","import { TranslationCode } from \"@/modules/Translation/TranslationCode.ts\";\n\n/**\n * # Locale Code\n */\nexport class LocaleCode extends TranslationCode {\n /**\n * @param languageCode\n * @param countryCode\n */\n constructor(\n public languageCode: string,\n public countryCode: string,\n ) {\n super(languageCode, countryCode);\n }\n\n /**\n * ## To Translation Codes\n */\n public toTranslationCodes(): string[] {\n const codes = [this.toString()];\n if (this.isRegional) {\n codes.push(this.languageCode);\n }\n return codes;\n }\n}\n","import { DateAdapter } from \"@/composables/date/DateAdapter.ts\";\nimport { createRange, isFunction, isString, padStart } from \"@/util\";\nimport { LocaleCode } from \"@/modules/Locale/LocaleCode.ts\";\n\ntype CustomDateFormat =\n | Intl.DateTimeFormatOptions\n | ((date: Date, formatString: string, locale: string) => string);\n\n/**\n * # Default Date Adapter\n */\nexport class DefaultDateAdapter implements DateAdapter<Date> {\n protected static readonly PATTERN_ISO =\n /([12]\\d{3}-([1-9]|0[1-9]|1[0-2])-([1-9]|0[1-9]|[12]\\d|3[01]))/;\n protected static readonly firstDayOfWeek: Record<string, number> = {\n \"001\": 1,\n AD: 1,\n AE: 6,\n AF: 6,\n AG: 0,\n AI: 1,\n AL: 1,\n AM: 1,\n AN: 1,\n AR: 1,\n AS: 0,\n AT: 1,\n AU: 1,\n AX: 1,\n AZ: 1,\n BA: 1,\n BD: 0,\n BE: 1,\n BG: 1,\n BH: 6,\n BM: 1,\n BN: 1,\n BR: 0,\n BS: 0,\n BT: 0,\n BW: 0,\n BY: 1,\n BZ: 0,\n CA: 0,\n CH: 1,\n CL: 1,\n CM: 1,\n CN: 1,\n CO: 0,\n CR: 1,\n CY: 1,\n CZ: 1,\n DE: 1,\n DJ: 6,\n DK: 1,\n DM: 0,\n DO: 0,\n DZ: 6,\n EC: 1,\n EE: 1,\n EG: 6,\n ES: 1,\n ET: 0,\n FI: 1,\n FJ: 1,\n FO: 1,\n FR: 1,\n GB: 1,\n GE: 1,\n GF: 1,\n GP: 1,\n GR: 1,\n GT: 0,\n GU: 0,\n HK: 0,\n HN: 0,\n HR: 1,\n HU: 1,\n ID: 0,\n IE: 1,\n IL: 0,\n IN: 0,\n IQ: 6,\n IR: 6,\n IS: 1,\n IT: 1,\n JM: 0,\n JO: 6,\n JP: 0,\n KE: 0,\n KG: 1,\n KH: 0,\n KR: 0,\n KW: 6,\n KZ: 1,\n LA: 0,\n LB: 1,\n LI: 1,\n LK: 1,\n LT: 1,\n LU: 1,\n LV: 1,\n LY: 6,\n MC: 1,\n MD: 1,\n ME: 1,\n MH: 0,\n MK: 1,\n MM: 0,\n MN: 1,\n MO: 0,\n MQ: 1,\n MT: 0,\n MV: 5,\n MX: 0,\n MY: 1,\n MZ: 0,\n NI: 0,\n NL: 1,\n NO: 1,\n NP: 0,\n NZ: 1,\n OM: 6,\n PA: 0,\n PE: 0,\n PH: 0,\n PK: 0,\n PL: 1,\n PR: 0,\n PT: 0,\n PY: 0,\n QA: 6,\n RE: 1,\n RO: 1,\n RS: 1,\n RU: 1,\n SA: 0,\n SD: 6,\n SE: 1,\n SG: 0,\n SI: 1,\n SK: 1,\n SM: 1,\n SV: 0,\n SY: 6,\n TH: 0,\n TJ: 1,\n TM: 1,\n TR: 1,\n TT: 0,\n TW: 0,\n UA: 1,\n UM: 0,\n US: 0,\n UY: 1,\n UZ: 1,\n VA: 1,\n VE: 0,\n VI: 0,\n VN: 1,\n WS: 0,\n XK: 1,\n YE: 0,\n ZA: 0,\n ZW: 0,\n };\n protected static readonly formatOptions: Record<\n string,\n Intl.DateTimeFormatOptions\n > = {\n fullDateWithWeekday: {\n weekday: \"long\",\n day: \"numeric\",\n month: \"long\",\n year: \"numeric\",\n },\n normalDateWithWeekday: {\n weekday: \"short\",\n day: \"numeric\",\n month: \"short\",\n },\n keyboardDate: { day: \"2-digit\", month: \"2-digit\", year: \"numeric\" },\n monthAndDate: { month: \"long\", day: \"numeric\" },\n monthAndYear: { month: \"long\", year: \"numeric\" },\n month: { month: \"long\" },\n monthShort: { month: \"short\" },\n dayOfMonth: { day: \"numeric\" },\n shortDate: { year: \"2-digit\", month: \"numeric\", day: \"numeric\" },\n year: { year: \"numeric\" },\n displayDate: { day: \"2-digit\", month: \"short\", year: \"numeric\" },\n };\n\n public locale: string;\n public formats?: Record<string, CustomDateFormat>;\n\n /**\n * @param options\n */\n constructor(options: {\n locale: string;\n formats?: Record<string, CustomDateFormat>;\n }) {\n this.locale = options.locale;\n this.formats = options.formats;\n }\n\n /**\n * ## Add Days\n * @param date\n * @param amount\n */\n public addDays(date: Date, amount: number): Date {\n const d = new Date(date);\n d.setDate(d.getDate() + amount);\n return d;\n }\n\n /**\n * ## Add Months\n * @param date\n * @param amount\n */\n public addMonths(date: Date, amount: number): Date {\n const d = new Date(date);\n d.setMonth(d.getMonth() + amount);\n return d;\n }\n\n /**\n * ## Date\n * @param value\n */\n public date(value?: any) {\n if (value == null) {\n return new Date();\n }\n if (value instanceof Date) {\n return value;\n }\n if (isString(value)) {\n if (this.isISO(value)) {\n return this.parseISO(value);\n }\n const parsed = Date.parse(value);\n if (!isNaN(parsed)) {\n return new Date(parsed);\n }\n }\n return null;\n }\n\n /**\n * ## End of Day\n * @param date\n */\n public endOfDay(date: Date) {\n return new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate(),\n 23,\n 59,\n 59,\n 999,\n );\n }\n\n /**\n * ## End of Month\n * @param date\n */\n public endOfMonth(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth() + 1, 0);\n }\n\n /**\n * ## End of Year\n * @param date\n */\n public endOfYear(date: Date): Date {\n return new Date(date.getFullYear(), 11, 31);\n }\n\n /**\n * ## Format\n * @param date\n * @param formatString\n */\n public format(date: Date, formatString: string): string {\n const newDate = this.date(date) ?? new Date();\n const customFormat = this.formats?.[formatString];\n if (isFunction(customFormat)) {\n return customFormat(newDate, formatString, this.locale);\n }\n const options: Intl.DateTimeFormatOptions =\n DefaultDateAdapter.formatOptions[formatString] ||\n (customFormat ?? { timeZone: \"UTC\", timeZoneName: \"short\" });\n return new Intl.DateTimeFormat(this.locale, options).format(newDate);\n }\n\n /**\n * ## Get Country Code\n * Returns the country code portion of the locale code.\n * @private\n */\n private getCountryCode(): string {\n return LocaleCode.fromString(this.locale).countryCode!;\n }\n\n /**\n * ## Get Diff\n * @param date\n * @param comparing\n * @param unit\n */\n public getDiff(\n date: Date,\n comparing: string | Date,\n unit?: string,\n ): number {\n const d = new Date(date);\n const c = new Date(comparing);\n if (unit === \"month\") {\n return (\n d.getMonth() -\n c.getMonth() +\n (d.getFullYear() - c.getFullYear()) * 12\n );\n }\n return Math.floor((d.getTime() - c.getTime()) / (1000 * 60 * 60 * 24));\n }\n\n /**\n * ## Get First Day of Week\n * @private\n */\n private getFirstDayOfWeek(): number {\n return DefaultDateAdapter.firstDayOfWeek[this.getCountryCode()] ?? 1;\n }\n\n /**\n * ## Get Month\n * @param date\n */\n public getMonth(date: Date): number {\n return date.getMonth();\n }\n\n /**\n * ## Get Next Month\n * @param date\n */\n public getNextMonth(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth() + 1, 1);\n }\n\n /**\n * ## Get Week Array\n * @param date\n */\n public getWeekArray(date: Date): Date[][] {\n const weeks = [];\n let currentWeek = [];\n const firstDayOfMonth = this.startOfMonth(date);\n const lastDayOfMonth = this.endOfMonth(date);\n const firstDayWeekIndex =\n (firstDayOfMonth.getDay() - this.getFirstDayOfWeek() + 7) % 7;\n const lastDayWeekIndex =\n (lastDayOfMonth.getDay() - this.getFirstDayOfWeek() + 7) % 7;\n\n for (let i = 0; i < firstDayWeekIndex; i++) {\n const adjacentDay = new Date(firstDayOfMonth);\n adjacentDay.setDate(\n adjacentDay.getDate() - (firstDayWeekIndex - i),\n );\n currentWeek.push(adjacentDay);\n }\n\n for (let i = 1; i <= lastDayOfMonth.getDate(); i++) {\n const day = new Date(date.getFullYear(), date.getMonth(), i);\n\n // Add the day to the current week\n currentWeek.push(day);\n\n // If the current week has 7 days, add it to the weeks array and start a new week\n if (currentWeek.length === 7) {\n weeks.push(currentWeek);\n currentWeek = [];\n }\n }\n\n for (let i = 1; i < 7 - lastDayWeekIndex; i++) {\n const adjacentDay = new Date(lastDayOfMonth);\n adjacentDay.setDate(adjacentDay.getDate() + i);\n currentWeek.push(adjacentDay);\n }\n\n weeks.push(currentWeek);\n\n return weeks;\n }\n\n /**\n * ## Get Weekdays\n */\n public getWeekdays(): string[] {\n const firstSundayOf2023 = new Date(2023, 0, 1);\n const daysFromSunday = this.getFirstDayOfWeek();\n return createRange(7).map((index) => {\n // Start with a known Sunday (2023-01-01)\n const weekday = new Date(firstSundayOf2023);\n weekday.setDate(\n firstSundayOf2023.getDate() + daysFromSunday + index,\n );\n return new Intl.DateTimeFormat(this.locale, {\n weekday: \"narrow\",\n }).format(weekday);\n });\n }\n\n /**\n * ## Get Year\n * @param date\n */\n public getYear(date: Date): number {\n return date.getFullYear();\n }\n\n /**\n * ## Is After\n * @param date\n * @param comparing\n */\n public isAfter(date: Date, comparing: Date): boolean {\n return date.getTime() > comparing.getTime();\n }\n\n /**\n * ## Is Before\n * @param date\n * @param comparing\n */\n public isBefore(date: Date, comparing: Date): boolean {\n return date.getTime() < comparing.getTime();\n }\n\n /**\n * ## Is Equal\n * @param date\n * @param comparing\n */\n public isEqual(date: Date, comparing: Date): boolean {\n return date.getTime() === comparing.getTime();\n }\n\n /**\n * ## Is ISO?\n * @param value\n * @protected\n */\n protected isISO(value: string): boolean {\n return DefaultDateAdapter.PATTERN_ISO.test(value);\n }\n\n /**\n * ## Is Same Day\n * @param date\n * @param comparing\n */\n public isSameDay(date: Date, comparing: Date): boolean {\n return (\n date.getDate() === comparing.getDate() &&\n date.getMonth() === comparing.getMonth() &&\n date.getFullYear() === comparing.getFullYear()\n );\n }\n\n /**\n * ## Is Same Month\n * @param date\n * @param comparing\n */\n public isSameMonth(date: Date, comparing: Date): boolean {\n return (\n date.getMonth() === comparing.getMonth() &&\n date.getFullYear() === comparing.getFullYear()\n );\n }\n\n /**\n * ## Is Valid\n * @param date\n */\n public isValid(date: any): boolean {\n const d = new Date(date);\n return d instanceof Date && !isNaN(d.getTime());\n }\n\n /**\n * ## Is Within Range\n * @param date\n * @param range\n */\n public isWithinRange(date: Date, range: [Date, Date]): boolean {\n return this.isAfter(date, range[0]) && this.isBefore(date, range[1]);\n }\n\n /**\n * ## Parse YYYY-MM-DD strings\n *\n * Uses local time zone when passing individual date component values.\n *\n * @param value\n * @protected\n */\n public parseISO(value: string): Date {\n const [year, month, day] = value.split(\"-\").map(Number);\n return new Date(year, month - 1, day);\n }\n\n /**\n * ## Set Month\n * @param date\n * @param month\n */\n public setMonth(date: Date, month: number): Date {\n const d = new Date(date);\n d.setMonth(month);\n return d;\n }\n\n /**\n * ## Set Year\n * @param date\n * @param year\n */\n public setYear(date: Date, year: number) {\n const d = new Date(date);\n d.setFullYear(year);\n return d;\n }\n\n /**\n * ## Start of Day\n * @param date\n */\n public startOfDay(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate());\n }\n\n /**\n * ## Start of Month\n * @param date\n */\n public startOfMonth(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), 1);\n }\n\n /**\n * ## Start of Year\n * @param date\n */\n public startOfYear(date: Date): Date {\n return new Date(date.getFullYear(), 0, 1);\n }\n\n /**\n * ## To ISO\n * @param date\n */\n public toISO(date: Date): string {\n const year = date.getFullYear();\n const month = padStart(String(date.getMonth() + 1), 2, \"0\");\n const day = padStart(String(date.getDate()), 2, \"0\");\n return `${year}-${month}-${day}`;\n }\n\n /**\n * ## To JS Date\n * @param value\n */\n public toJsDate(value: Date): Date {\n return value;\n }\n}\n","import { inject, InjectionKey, reactive, watch } from \"vue\";\nimport { DateAdapter } from \"@/composables/date/DateAdapter.ts\";\nimport { LocaleManager } from \"@/modules/Locale/LocaleManager.ts\";\nimport { isFunction, mergeDeep } from \"@/util\";\nimport { DefaultDateAdapter } from \"@/composables/date/DefaultDateAdapter.ts\";\n\n/**\n * # Date Adapter Instance\n */\nexport interface DateAdapterInstance<\n T = DateAdapterInstanceType[\"instanceType\"],\n> extends DateAdapter<T> {\n locale?: any;\n}\n\n/**\n * # Date Adapter Instance Type\n * Supports module augmentation to specify date object types\n */\nexport interface DateAdapterInstanceType {\n instanceType: unknown;\n}\n\nexport const DateAdapterSymbol: InjectionKey<DateAdapterInstance> =\n Symbol.for(\"ev:date-adapter\");\n\nexport type InternalDateOptions<T = unknown> = {\n adapter:\n | (new (options: {\n locale: any;\n formats?: any;\n }) => DateAdapterInstance<T>)\n | DateAdapterInstance<T>;\n formats?: Record<string, any>;\n locale: Record<string, any>;\n};\n\nexport type DateOptions<T = any> = Partial<InternalDateOptions<T>>;\n\n/**\n * # Create Date\n *\n * @param options\n * @param locale\n */\nexport function createDate(\n options: DateOptions | undefined,\n locale: LocaleManager,\n) {\n const date = mergeDeep(\n {\n adapter: DefaultDateAdapter,\n },\n options,\n ) as InternalDateOptions;\n\n const instance = reactive(\n isFunction(date.adapter)\n ? new date.adapter({\n locale: locale.currentLocale.value,\n formats: date.formats,\n })\n : date.adapter,\n );\n\n watch(locale.currentLocale, (value) => {\n instance.locale = value;\n });\n\n return instance;\n}\n\n/**\n * # Use Date\n */\nexport function useDate() {\n const instance = inject(DateAdapterSymbol);\n if (!instance) {\n throw new Error(\"Evance UI: Unable to find injected date adapter.\");\n }\n return instance;\n}\n","import {\n computed,\n ComputedRef,\n inject,\n InjectionKey,\n MaybeRef,\n provide,\n ref,\n Ref,\n shallowRef,\n unref,\n VNode,\n watchEffect,\n} from \"vue\";\nimport {\n getCurrentComponent,\n injectSelf,\n mergeDeep,\n toKebabCase,\n} from \"@/util\";\n\nexport type DefaultsInstance =\n | undefined\n | {\n [key: string]: undefined | Record<string, unknown>;\n global?: Record<string, unknown>;\n };\n\nexport type DefaultsOptions = Partial<DefaultsInstance>;\n\nexport const DefaultsSymbol: InjectionKey<Ref<DefaultsInstance>> =\n Symbol.for(\"ev:defaults\");\n\n/**\n * # createDefaults\n * @param options\n */\nexport function createDefaults(\n options?: DefaultsInstance,\n): Ref<DefaultsInstance> {\n return ref(options);\n}\n\n/**\n * # injectDefaults\n */\nexport function injectDefaults() {\n const defaults = inject(DefaultsSymbol);\n if (!defaults) {\n throw new Error(\"Evance UI: Could not find defaults instance\");\n }\n return defaults;\n}\n\n/**\n * # provideDefaults\n * @param defaults\n * @param options\n */\nexport function provideDefaults(\n defaults?: MaybeRef<DefaultsInstance | undefined>,\n options?: {\n disabled?: MaybeRef<boolean | undefined>;\n reset?: MaybeRef<number | string | undefined>;\n root?: MaybeRef<boolean | string | undefined>;\n scoped?: MaybeRef<boolean | undefined>;\n },\n) {\n const injectedDefaults = injectDefaults();\n const providedDefaults = ref(defaults);\n\n const newDefaults = computed(() => {\n const disabled = unref(options?.disabled);\n if (disabled) {\n return injectedDefaults.value;\n }\n\n const scoped = unref(options?.scoped);\n const reset = unref(options?.reset);\n const root = unref(options?.root);\n\n if (providedDefaults.value == null && !(scoped || reset || root)) {\n return injectedDefaults.value;\n }\n\n let properties = mergeDeep(providedDefaults.value, {\n previous: injectedDefaults.value,\n });\n\n if (scoped) {\n return properties;\n }\n\n if (reset || root) {\n const len = Number(reset || Infinity);\n\n for (let i = 0; i <= len; i++) {\n if (!properties || !(\"previous\" in properties)) {\n break;\n }\n properties = properties.previous;\n }\n\n if (properties && typeof root === \"string\" && root in properties) {\n properties = mergeDeep(\n mergeDeep(properties, { previous: properties }),\n properties[root],\n );\n }\n\n return properties;\n }\n\n return properties.previous\n ? mergeDeep(properties.previous, properties)\n : properties;\n }) as ComputedRef<DefaultsInstance>;\n\n provide(DefaultsSymbol, newDefaults);\n return newDefaults;\n}\n\n/**\n * # propIsDefined\n * @param vnode\n * @param prop\n */\nfunction propIsDefined(vnode: VNode, prop: string) {\n return (\n typeof vnode.props?.[prop] !== \"undefined\" ||\n typeof vnode.props?.[toKebabCase(prop)] !== \"undefined\"\n );\n}\n\n/**\n * # internalUseDefaults\n * @param props\n * @param name\n * @param defaults\n */\nexport function internalUseDefaults(\n props: Record<string, any> = {},\n name?: string,\n defaults = injectDefaults(),\n) {\n const component = getCurrentComponent(\"useDefaults\");\n\n name = name ?? component.type.name ?? component.type.__name;\n if (!name) {\n throw new Error(\"Evance UI: Could not determine component name\");\n }\n\n const componentDefaults = computed(\n () => defaults.value?.[props._as ?? name],\n );\n const internalProps = new Proxy(props, {\n get(target, prop) {\n const propValue = Reflect.get(target, prop);\n if (prop === \"class\" || prop === \"style\") {\n return [componentDefaults.value?.[prop], propValue].filter(\n (v) => v != null,\n );\n } else if (\n typeof prop === \"string\" &&\n !propIsDefined(component.vnode, prop)\n ) {\n return (\n componentDefaults.value?.[prop] ??\n defaults.value?.global?.[prop] ??\n propValue\n );\n }\n return propValue;\n },\n });\n\n const subcomponentDefaults = shallowRef();\n watchEffect(() => {\n if (componentDefaults.value) {\n const subComponents = Object.entries(\n componentDefaults.value,\n ).filter(([key]) => key.startsWith(key[0].toUpperCase()));\n subcomponentDefaults.value = subComponents.length\n ? Object.fromEntries(subComponents)\n : undefined;\n } else {\n subcomponentDefaults.value = undefined;\n }\n });\n\n function provideSubDefaults() {\n const injected = injectSelf(DefaultsSymbol, component);\n provide(\n DefaultsSymbol,\n computed(() => {\n return subcomponentDefaults.value\n ? mergeDeep(\n injected?.value ?? {},\n subcomponentDefaults.value,\n )\n : injected?.value;\n }),\n );\n }\n\n return { props: internalProps, provideSubDefaults };\n}\n\n/**\n * # useDefaults\n *\n * @param props\n * @param name\n */\nexport function useDefaults<T extends Record<string, any>>(\n props: T,\n name?: string,\n): T;\nexport function useDefaults(\n props?: undefined,\n name?: string,\n): Record<string, any>;\nexport function useDefaults(props: Record<string, any> = {}, name?: string) {\n const { props: _props, provideSubDefaults } = internalUseDefaults(\n props,\n name,\n );\n provideSubDefaults();\n return _props;\n}\n","import {\n computed,\n inject,\n InjectionKey,\n isRef,\n reactive,\n Ref,\n shallowRef,\n toRefs,\n watchEffect,\n} from \"vue\";\nimport {\n Browser,\n consoleWarn,\n isBoolean,\n isObject,\n isString,\n mergeDeep,\n spaceSeparatedValues,\n toCamelCase,\n toKebabCase,\n toWebUnit,\n trimEnd,\n} from \"@/util\";\nimport { ResponsiveProp, ResponsivePropObject } from \"@/components\";\n\n/**\n * # Breakpoints\n * Excludes `xs` as this is the smallest size - not really a breakpoint.\n */\nexport const breakpoints = [\"sm\", \"md\", \"lg\", \"xl\", \"xxl\"] as const;\n\nexport type Breakpoint = (typeof breakpoints)[number];\n\nexport type DisplayBreakpoint = \"xs\" | Breakpoint;\n\nexport type DisplayThresholds = {\n [key in DisplayBreakpoint]: number;\n};\n\nexport interface DisplayOptions {\n mobileBreakpoint?: number | DisplayBreakpoint;\n thresholds?: Partial<DisplayThresholds>;\n}\n\nexport interface InternalDisplayOptions {\n mobileBreakpoint: number | DisplayBreakpoint;\n thresholds: DisplayThresholds;\n}\n\nexport type SSROptions =\n | boolean\n | {\n clientWidth: number;\n clientHeight?: number;\n };\n\nexport interface DisplayPlatform {\n android: boolean;\n ios: boolean;\n cordova: boolean;\n electron: boolean;\n chrome: boolean;\n edge: boolean;\n firefox: boolean;\n opera: boolean;\n win: boolean;\n mac: boolean;\n linux: boolean;\n touch: boolean;\n ssr: boolean;\n}\n\nexport interface DisplayInstance {\n xs: Ref<boolean>;\n sm: Ref<boolean>;\n md: Ref<boolean>;\n lg: Ref<boolean>;\n xl: Ref<boolean>;\n xxl: Ref<boolean>;\n xsUp: Ref<boolean>;\n smUp: Ref<boolean>;\n mdUp: Ref<boolean>;\n lgUp: Ref<boolean>;\n xlUp: Ref<boolean>;\n xxlUp: Ref<boolean>;\n smDown: Ref<boolean>;\n mdDown: Ref<boolean>;\n lgDown: Ref<boolean>;\n xlDown: Ref<boolean>;\n name: Ref<DisplayBreakpoint>;\n height: Ref<number>;\n width: Ref<number>;\n mobile: Ref<boolean>;\n mobileBreakpoint: Ref<number | DisplayBreakpoint>;\n platform: Ref<DisplayPlatform>;\n thresholds: Ref<DisplayThresholds>;\n\n /** @internal */\n ssr: boolean;\n\n update(): void;\n}\n\nconst parseDisplayOptions = (\n options: DisplayOptions = defaultDisplayOptions,\n) => {\n return mergeDeep(defaultDisplayOptions, options) as InternalDisplayOptions;\n};\n\nfunction getClientWidth(ssr?: SSROptions) {\n return Browser.hasWindow && !ssr\n ? window.innerWidth\n : (isObject(ssr) && ssr.clientWidth) || 0;\n}\n\nfunction getClientHeight(ssr?: SSROptions) {\n return Browser.hasWindow && !ssr\n ? window.innerHeight\n : (isObject(ssr) && ssr.clientHeight) || 0;\n}\n\nfunction getPlatform(ssr?: SSROptions): DisplayPlatform {\n const userAgent =\n Browser.hasWindow && !ssr ? window.navigator.userAgent : \"ssr\";\n\n function isUserAgent(regexp: RegExp) {\n return Boolean(userAgent.match(regexp));\n }\n\n return {\n android: isUserAgent(/android/i),\n ios: isUserAgent(/iphone|ipad|ipod/i),\n cordova: isUserAgent(/cordova/i),\n electron: isUserAgent(/electron/i),\n chrome: isUserAgent(/chrome/i),\n edge: isUserAgent(/edge/i),\n firefox: isUserAgent(/firefox/i),\n opera: isUserAgent(/opera/i),\n win: isUserAgent(/win/i),\n mac: isUserAgent(/mac/i),\n linux: isUserAgent(/linux/i),\n touch: Browser.supportsTouch,\n ssr: userAgent === \"ssr\",\n };\n}\n\nexport const DisplaySymbol: InjectionKey<DisplayInstance> =\n Symbol.for(\"ev:display\");\n\nexport const defaultDisplayOptions: DisplayOptions = {\n mobileBreakpoint: \"lg\",\n thresholds: {\n xs: 0,\n sm: 600,\n md: 960,\n lg: 1200,\n xl: 1600,\n xxl: 2400,\n },\n};\n\n/**\n * # Create Display\n * @param options\n * @param ssr\n */\nexport function createDisplay(\n options?: DisplayOptions,\n ssr?: SSROptions,\n): DisplayInstance {\n const { thresholds, mobileBreakpoint } = parseDisplayOptions(options);\n\n const height = shallowRef(getClientHeight(ssr));\n const platform = shallowRef(getPlatform(ssr));\n const state = reactive({} as DisplayInstance);\n const width = shallowRef(getClientWidth(ssr));\n\n function updateSize() {\n height.value = getClientHeight();\n width.value = getClientWidth();\n }\n\n function update() {\n updateSize();\n platform.value = getPlatform();\n }\n\n // eslint-disable-next-line max-statements\n watchEffect(() => {\n const xs = width.value < thresholds.sm;\n const sm = width.value < thresholds.md && !xs;\n const md = width.value < thresholds.lg && !(sm || xs);\n const lg = width.value < thresholds.xl && !(md || sm || xs);\n const xl = width.value < thresholds.xxl && !(lg || md || sm || xs);\n const xxl = width.value >= thresholds.xxl;\n const name = xs\n ? \"xs\"\n : sm\n ? \"sm\"\n : md\n ? \"md\"\n : lg\n ? \"lg\"\n : xl\n ? \"xl\"\n : \"xxl\";\n const breakpointValue =\n typeof mobileBreakpoint === \"number\"\n ? mobileBreakpoint\n : thresholds[mobileBreakpoint];\n const mobile = width.value < breakpointValue;\n\n state.xs = xs;\n state.sm = sm;\n state.md = md;\n state.lg = lg;\n state.xl = xl;\n state.xxl = xxl;\n state.xsUp = true;\n state.smUp = !xs;\n state.mdUp = !(xs || sm);\n state.lgUp = !(xs || sm || md);\n state.xlUp = !(xs || sm || md || lg);\n state.xxlUp = !(xs || sm || md || lg || xl);\n state.smDown = !(md || lg || xl || xxl);\n state.mdDown = !(lg || xl || xxl);\n state.lgDown = !(xl || xxl);\n state.xlDown = !xxl;\n state.name = name;\n state.height = height.value;\n state.width = width.value;\n state.mobile = mobile;\n state.mobileBreakpoint = mobileBreakpoint;\n state.platform = platform.value;\n state.thresholds = thresholds;\n });\n\n if (Browser.hasWindow) {\n window.addEventListener(\"resize\", updateSize, { passive: true });\n }\n\n return {\n ...toRefs(state),\n update,\n ssr: !!ssr,\n };\n}\n\n/**\n * # Use Display (from Symbol);\n */\nexport function useDisplay() {\n const display = inject(DisplaySymbol);\n if (!display) {\n throw new Error(\n \"Evance UI: Could not find `ev:display` injection symbol\",\n );\n }\n return display;\n}\n\n/**\n * # Display Point Options\n *\n * These are listed in order of calculation priority.\n */\nexport const displayRules = [\n \"xxl\",\n \"xl\",\n \"lg\",\n \"md\",\n \"sm\",\n \"xs\",\n \"xxlOnly\",\n \"xlOnly\",\n \"lgOnly\",\n \"mdOnly\",\n \"smOnly\",\n \"xsOnly\",\n \"xxlUp\",\n \"xlUp\",\n \"lgUp\",\n \"mdUp\",\n \"smUp\",\n \"xsUp\",\n \"smDown\",\n \"mdDown\",\n \"lgDown\",\n \"xlDown\",\n] as const;\nexport const displayRulesKebab = [\n \"xxl-only\",\n \"xl-only\",\n \"lg-only\",\n \"md-only\",\n \"sm-only\",\n \"xs-only\",\n \"xxl-up\",\n \"xl-up\",\n \"lg-up\",\n \"md-up\",\n \"sm-up\",\n \"xs-up\",\n \"sm-down\",\n \"md-down\",\n \"lg-down\",\n \"xl-down\",\n] as const;\n\nexport type DisplayRuleSuffix = \"only\" | \"up\" | \"down\";\nexport type DisplayRuleKey = (typeof displayRules)[number];\nexport type DisplayRuleKebab = (typeof displayRulesKebab)[number];\nexport type DisplayRuleValue = number | string;\nexport type DisplayRuleObject = {\n [key in DisplayRuleKey]?: DisplayRuleValue;\n};\nexport type DisplayRuleProp = DisplayRuleValue | DisplayRuleObject;\nexport type DisplayRuleListProp =\n | DisplayRuleKey\n | DisplayRuleKey[]\n | DisplayRuleKebab\n | DisplayRuleKebab[];\n\n/** Visibility props */\nexport type VisibilityRuleProp = DisplayRuleListProp | boolean;\n\n/**\n * # calculateDisplayRuleValue\n *\n * @param rules\n */\nexport function calculateDisplayRuleValue(\n rules?: DisplayRuleObject | DisplayRuleValue,\n) {\n const display = useDisplay();\n if (!isObject(rules)) {\n return toWebUnit(rules);\n }\n for (const ruleKey of displayRules) {\n const displayKey = toDisplayStateKey(ruleKey);\n const displayState = display[displayKey as keyof DisplayInstance];\n if (isRef(displayState) && displayState.value && !!rules[ruleKey]) {\n return toWebUnit(rules[ruleKey]);\n }\n }\n return undefined;\n}\n\n/**\n * # To Display Key\n *\n * @param displayRule\n */\nexport function toDisplayStateKey(displayRule: string): string {\n if (toDisplayStateKey.cache.has(displayRule)) {\n return toDisplayStateKey.cache.get(displayRule)!;\n }\n let value = toCamelCase(displayRule);\n if (isDisplayBreakpoint(value)) {\n value = `${value}Up`;\n }\n value = trimEnd(value, \"Only\");\n toKebabCase.cache.set(displayRule, value);\n return value;\n}\ntoDisplayStateKey.cache = new Map<string, string>();\n\n/**\n * # To Display Rule Kebab\n *\n * @param displayRule\n */\nexport function toDisplayRuleKebab(displayRule: string): string {\n if (toDisplayRuleKebab.cache.has(displayRule)) {\n return toDisplayRuleKebab.cache.get(displayRule)!;\n }\n let value = toKebabCase(displayRule);\n if (isDisplayBreakpoint(value)) {\n value = `${value}-up`;\n }\n toDisplayRuleKebab.cache.set(displayRule, value);\n return value;\n}\ntoDisplayRuleKebab.cache = new Map<string, string>();\n\n/**\n * # isDisplayRule\n *\n * @param value\n * @param acceptKebabs\n */\nexport function isDisplayRule(\n value: unknown,\n acceptKebabs: boolean = true,\n): value is DisplayRuleKey | DisplayRuleKebab {\n return (\n displayRules.includes(value as DisplayRuleKey) ||\n (acceptKebabs && displayRulesKebab.includes(value as DisplayRuleKebab))\n );\n}\n\n/**\n * # isDisplayBreakpoint\n *\n * @param value\n */\nexport function isDisplayBreakpoint(\n value: unknown,\n): value is DisplayBreakpoint {\n return [\"xs\", ...breakpoints].includes(value as DisplayBreakpoint);\n}\n\n/**\n * # createBreakpointClasses\n *\n * @param props\n * @param propName\n * @param prefix\n * @param useXs\n */\nexport function useBreakpointClasses<\n PropsObject extends object,\n PropName extends Extract<keyof PropsObject, string>,\n Prefix extends string | undefined,\n UseXs extends boolean,\n>(\n props: PropsObject,\n propName: PropName,\n prefix: Prefix = undefined as Prefix,\n useXs: UseXs = false as UseXs,\n) {\n return computed(() => {\n const prop = props[propName] as ResponsiveProp;\n if (!prop) {\n return [];\n }\n const classes = [];\n const values =\n typeof prop !== \"object\"\n ? ({ xs: prop } as ResponsivePropObject)\n : prop;\n for (const [breakpoint, value] of Object.entries(values)) {\n const className = [];\n if (prefix) {\n className.push(prefix);\n }\n if (useXs || breakpoint !== \"xs\") {\n className.push(breakpoint);\n }\n className.push(value);\n classes.push(className.join(\"-\"));\n }\n return classes;\n });\n}\n\n/**\n * # useDisplayRuleClasses\n *\n * @param props\n * @param propName\n * @param prefix\n */\nexport function useDisplayRuleClasses<\n PropsObject extends object,\n PropName extends Extract<keyof PropsObject, string>,\n Prefix extends string | undefined,\n>(\n props: PropsObject,\n propName: PropName,\n prefix: Prefix = undefined as Prefix,\n) {\n return computed(() => {\n const classes = [];\n const rules = toDisplayRuleArray(props[propName]);\n for (const rule of rules) {\n if (!isString(rule)) {\n // Gracefully ignore anything that is not a string.\n continue;\n }\n if (!isDisplayRule(rule)) {\n consoleWarn(\n `The display rule '${rule}' is not valid and will be ignored.`,\n );\n continue;\n }\n const suffix = toDisplayRuleKebab(rule);\n classes.push(`${prefix}-${suffix}`);\n }\n return classes;\n });\n}\n\n/**\n * # toDisplayRuleArray\n *\n * @param prop\n */\nexport function toDisplayRuleArray(prop: unknown): string[] {\n if (Array.isArray(prop)) {\n return prop;\n }\n if (isString(prop)) {\n return spaceSeparatedValues(prop as string);\n }\n if (isObject(prop)) {\n return <string[]>Object.entries(prop)\n .map(([key, value]) => {\n if (isBoolean(value)) {\n return value ? key : undefined;\n }\n return isString(value)\n ? `${key}-${value.toLowerCase()}`\n : undefined;\n })\n .filter((value) => value !== undefined);\n }\n return [];\n}\n","import { Ref } from \"vue/dist/vue\";\nimport { LocaleCode } from \"@/modules/Locale/LocaleCode.ts\";\n\n/**\n * # Localized\n */\nexport class Localized {\n /**\n * @param defaultLocale\n * @param currentLocale\n */\n constructor(\n public readonly defaultLocale: Ref<string>,\n public readonly currentLocale: Ref<string>,\n ) {}\n\n /**\n * ## Get Translation Codes\n *\n * Returns all the translation codes for the Locale we should use when getting a translatable.\n * This includes a fallback to our default TranslationCode.\n *\n * @param locale\n */\n public getTranslationCodes(locale: string): string[] {\n const localeCode = LocaleCode.fromString(locale) as LocaleCode;\n const translationCodes = localeCode.toTranslationCodes();\n // Add our default if it is not in the list\n if (\n !translationCodes.find(\n (code: string) => code === this.defaultLocale.value,\n )\n ) {\n translationCodes.push(this.defaultLocale.value);\n }\n return translationCodes;\n }\n\n /**\n * ## Set Current Locale\n *\n * Set the current locale so that we don't have to use it in each translate call,\n * unless we want to.\n *\n * @param locale\n */\n public setCurrentLocale(locale: string): void {\n this.currentLocale.value = locale;\n }\n\n /**\n * ## Set Default Locale\n *\n * The default locale to use if translations are unavailable for the current locale.\n *\n * @param locale\n */\n public setDefaultLocale(locale: string): void {\n this.defaultLocale.value = locale;\n }\n}\n","import { Localized } from \"@/modules/Locale/Localized.ts\";\n\n/**\n * # Number Formatter\n */\nexport class NumberFormatter extends Localized {\n public format(\n value: number,\n options?: Intl.NumberFormatOptions,\n locale?: string,\n ) {\n return this.formatter(options, locale).format(value);\n }\n\n public formatter(options?: Intl.NumberFormatOptions, locale?: string) {\n if (!locale) {\n locale = this.currentLocale.value ?? this.defaultLocale.value;\n }\n return new Intl.NumberFormat(this.getTranslationCodes(locale), options);\n }\n}\n","import { isBoolean, isObject, isString } from \"@/util\";\n\n/**\n * # Pluralization\n *\n * Pluralization supports cardinal and ordinal values.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/PluralRules\n */\nexport const pluralizationRuleKeys = [\n \"zero\",\n \"one\",\n \"two\",\n \"few\",\n \"many\",\n \"other\",\n] as const;\n\nexport type PluralizationRuleKey = (typeof pluralizationRuleKeys)[number];\n\nexport type PluralizationRules = {\n [K in PluralizationRuleKey]?: string;\n} & {\n ordinal?: boolean;\n};\n\n/**\n * ## Is Pluralization Key\n *\n * Determines whether the value supplied represents a valid pluralization rule key.\n *\n * @param key\n */\nexport function isPluralizationKey(key: any): key is PluralizationRuleKey {\n return pluralizationRuleKeys.includes(key);\n}\n\n/**\n * # Is Pluralization Rules\n *\n * Determines whether a value contains an object with pluralization rules within it.\n *\n * @param value\n */\nexport function isPluralizationRules(value: any): value is PluralizationRules {\n if (isObject(value)) {\n return Object.entries(value).every(([key, val]) => {\n return (\n (isPluralizationKey(key) && isString(val)) ||\n (key === \"ordinal\" && isBoolean(val))\n );\n });\n }\n return false;\n}\n","import {\n isPluralizationRules,\n PluralizationRuleKey,\n PluralizationRules,\n} from \"@/modules/Translation/Pluralization.ts\";\nimport { TranslationVariables } from \"@/modules/Translation/Translator.ts\";\nimport {\n createStringTemplate,\n isNumber,\n isString,\n TemplateVariables,\n} from \"@/util\";\n\n/**\n * # Translatable\n */\nexport class Translatable {\n constructor(\n public translationCode: string,\n public reference: string,\n public data: string | PluralizationRules,\n ) {}\n\n get defaultText(): string {\n if (typeof this.data === \"string\") {\n return this.data;\n }\n return this.getText(\"other\") ?? \"\";\n }\n\n get isString(): boolean {\n return isString(this.data);\n }\n\n get isPluralization() {\n return isPluralizationRules(this.data);\n }\n\n public getText(rule: PluralizationRuleKey): string | null {\n if (typeof this.data === \"string\") {\n return this.data;\n }\n const value = this.data[rule] ?? null;\n return value === null ? this.data[\"other\"] ?? null : value;\n }\n\n /**\n * ## Translate\n * @param variables\n */\n public translate(variables: TranslationVariables = {}): string | undefined {\n if (isString(this.data)) {\n return createStringTemplate(\n this.defaultText,\n variables as TemplateVariables,\n )();\n }\n // If the translatable is a set of pluralization rules then we expect at least one number value\n if (isPluralizationRules(this.data)) {\n // Find the first number in the options\n const keyToPluralize = Object.keys(variables).find((key) =>\n isNumber(variables[key]),\n );\n if (keyToPluralize === undefined) {\n console.error(\n `Could not find a number to pluralize in translation options for '${this.reference}'.`,\n );\n return undefined;\n }\n const rules = new Intl.PluralRules(this.translationCode, {\n type: this.data.ordinal || false ? \"ordinal\" : \"cardinal\",\n });\n const rule = rules.select(variables[keyToPluralize] as number);\n const text = this.getText(rule);\n if (text === null) {\n console.error(\n `Pluralization rule '${rule}' or 'other' unavailable for '${this.reference}'.`,\n );\n return undefined;\n }\n return createStringTemplate(text, variables as TemplateVariables)();\n }\n console.error(`Invalid translatable for '${this.reference}'.`);\n return undefined;\n }\n}\n","import { getPropertyValueByPath } from \"@/util\";\nimport { Translatable } from \"@/modules/Translation/Translatable.ts\";\nimport { PluralizationRules } from \"@/modules/Translation/Pluralization.ts\";\n\n/**\n * # Language Pack\n */\nexport class LanguagePack {\n /**\n * @param translationCode\n * @param data\n */\n constructor(\n public translationCode: string,\n public data: LanguagePackData = {},\n ) {}\n\n /**\n * ## Get Translatable\n * @param reference\n */\n public getTranslatable(reference: string): Translatable | null {\n try {\n const translationData = getPropertyValueByPath(\n this.data,\n reference,\n null,\n );\n if (!translationData) {\n return null;\n }\n return new Translatable(\n this.translationCode,\n reference,\n translationData,\n );\n } catch (e) {\n return null;\n }\n }\n}\n\n/**\n * # Language Pack Data\n */\nexport interface LanguagePackData {\n [key: string]: LanguagePackData | PluralizationRules | string;\n}\n","import {\n LanguagePack,\n LanguagePackData,\n} from \"@/modules/Translation/LanguagePack.ts\";\nimport { Translatable } from \"@/modules/Translation/Translatable.ts\";\nimport { Localized } from \"@/modules/Locale/Localized.ts\";\n\n/**\n * # Translation Options\n *\n * When requesting a translation you may supply an object with keys matching\n * the variable names of the string template within a Language Pack.\n *\n * The only reserved key term is `ordinal`, which is reserved for telling the\n * translator that we should expect an ordinal, not a cardinal translation\n * from a pluralization rule set.\n *\n */\nexport type TranslationVariables = {\n [key: string]: string | number | boolean;\n};\n\n/**\n * # Translator\n */\nexport class Translator extends Localized {\n private languagePacks: LanguagePack[] = [];\n\n private translatables: Map<string, Translatable> = new Map();\n\n /**\n * ## Add Language Pack\n *\n * The new language pack is added to the beginning of the array of available language packs.\n * This makes it possible for subsequent language packs to override references.\n *\n * @param locale\n * @param messages\n */\n public addLanguagePack(locale: string, messages: LanguagePackData): void {\n this.languagePacks.unshift(new LanguagePack(locale, messages));\n }\n\n /**\n * ## Get Closest Translatable\n *\n * Returns the closest available translatable object matching the reference supplied across all\n * language packs matching translation codes from the locale, or the default.\n *\n * For example if a locale was supplied of \"de-de\", and our default translations were in \"en\",\n * then we would search for language packs \"de-de\", \"de\" and \"en\" in sequence.\n *\n * @param locale\n * @param reference\n */\n private getClosestTranslatable(\n locale: string,\n reference: string,\n ): Translatable | undefined {\n const translatableKey = `${locale}:${reference}`;\n\n if (this.translatables.has(translatableKey)) {\n return this.translatables.get(translatableKey);\n }\n\n const translationCodes = this.getTranslationCodes(locale);\n for (const translationCode of translationCodes) {\n const translatable = this.getTranslatable(\n translationCode,\n reference,\n );\n if (translatable) {\n this.translatables.set(translatableKey, translatable);\n return translatable;\n }\n }\n return undefined;\n }\n\n /**\n * ## Get Language Packs\n */\n public getLanguagePacks(): LanguagePack[] {\n return this.languagePacks;\n }\n\n /**\n * # Get Language Packs for TranslationCode\n *\n * Returns the all available language pack matching the translation code.\n *\n * @param translationCode\n */\n private getLanguagePacksForTranslationCode(\n translationCode: string,\n ): LanguagePack[] {\n return this.languagePacks.filter((languagePack) => {\n return languagePack.translationCode === translationCode;\n });\n }\n\n /**\n * ## Get Translatable\n *\n * Returns a translatable item from a language pack matching the supplied translation code.\n * Returns `null` if either the language pack is unavailable, or if the\n *\n * @param translationCode\n * @param reference\n */\n private getTranslatable(\n translationCode: string,\n reference: string,\n ): Translatable | null {\n const packs = this.getLanguagePacksForTranslationCode(translationCode);\n for (const pack of packs) {\n const translatable = pack.getTranslatable(reference);\n if (translatable) {\n return translatable;\n }\n }\n return null;\n }\n\n /**\n * ## Translate\n *\n * @param locale\n * @param reference\n * @param variables\n */\n public translate(\n reference: string,\n variables: TranslationVariables = {},\n locale: string | undefined = undefined,\n ): string | undefined {\n if (!locale) {\n locale = this.currentLocale.value ?? this.defaultLocale.value;\n }\n const translatable = this.getClosestTranslatable(locale, reference);\n if (translatable) {\n return translatable.translate(variables);\n }\n const fallback = new Translatable(locale, reference, reference);\n return fallback.translate(variables);\n }\n}\n","export default {\n carousel: {\n next: \"Next\",\n previous: \"Previous\",\n },\n close: \"Close\",\n dismiss: \"Dismiss\",\n expand: \"Expand\",\n greeting: \"Hello { name }\",\n placement: {\n one: \"{ value }st\",\n two: \"{ value }nd\",\n few: \"{ value }rd\",\n other: \"{ value }th\",\n ordinal: true,\n },\n select: {\n noItemsText: \"No items available\",\n },\n months: {\n one: \"{ value } month\",\n other: \"{ value } months\",\n },\n};\n","import { Localized } from \"@/modules/Locale/Localized.ts\";\nimport { NumberFormatter } from \"@/modules/NumberFormatter.ts\";\nimport { Translator } from \"@/modules/Translation/Translator.ts\";\n\nimport en from \"@/locale/en\";\nimport { shallowRef } from \"vue\";\nimport { LanguagePackData } from \"@/modules/Translation/LanguagePack.ts\";\n\n/**\n * # Locale Manager\n *\n * Note: in Evance 'en' is always the default locale.\n */\nexport class LocaleManager extends Localized {\n public readonly numberFormatter: NumberFormatter;\n\n public readonly translator: Translator;\n\n constructor(localeOptions: LocaleOptions) {\n const currentLocale = shallowRef(localeOptions?.locale ?? \"en-GB\");\n const defaultLocale = shallowRef(\"en-GB\");\n super(defaultLocale, currentLocale);\n\n this.numberFormatter = new NumberFormatter(\n this.defaultLocale,\n this.currentLocale,\n );\n this.translator = new Translator(\n this.defaultLocale,\n this.currentLocale,\n );\n this.translator.addLanguagePack(this.defaultLocale.value, en);\n\n if (localeOptions?.languagePack) {\n this.translator.addLanguagePack(\n this.currentLocale.value,\n localeOptions.languagePack,\n );\n }\n }\n\n /**\n * # Add Language Pack\n * @param localeCode\n * @param messages\n */\n public addLanguagePack(localeCode: string, messages: LanguagePackData) {\n this.translator.addLanguagePack(localeCode, messages);\n }\n}\n\n/**\n * # Locale Options\n */\nexport interface LocaleOptions {\n locale?: string;\n languagePack?: LanguagePackData;\n}\n","import { inject, InjectionKey, shallowRef } from \"vue\";\nimport {\n LocaleManager,\n LocaleOptions,\n} from \"@/modules/Locale/LocaleManager.ts\";\nimport { TranslationVariables } from \"@/modules/Translation/Translator.ts\";\n\n/**\n * # Locale Symbol\n */\nexport const LocaleSymbol: InjectionKey<LocaleManager> =\n Symbol.for(\"ev:locale\");\n\n/**\n * # Create Locale Manager\n * @todo: we need a lot more settings and options.\n */\nexport function createLocaleManager(localeOptions: LocaleOptions) {\n return new LocaleManager(localeOptions);\n}\n\n/**\n * # Use Locale Manager\n */\nexport function useLocaleManager(): LocaleManager {\n const localeManager: LocaleManager | undefined = inject(LocaleSymbol);\n if (!localeManager) {\n throw new Error(\"Evance UI: Could not find injected locale instance.\");\n }\n return localeManager;\n}\n\n/**\n * # Use Locale Functions\n */\nexport function useLocaleFunctions() {\n const manager = useLocaleManager();\n return {\n t: (\n reference: string,\n variables?: TranslationVariables,\n locale?: string,\n ): string | undefined => {\n return manager.translator.translate(reference, variables, locale);\n },\n n: (\n value: number,\n options?: Intl.NumberFormatOptions,\n locale?: string,\n ) => {\n return manager.numberFormatter.format(value, options, locale);\n },\n };\n}\n\n/**\n *\n */\nexport function useRtl() {\n // @todo: Implement RTL in Locale Manager\n const isRtl = shallowRef(false);\n const rtlClasses = shallowRef([]);\n return {\n isRtl,\n rtlClasses,\n };\n}\n","import { inject, InjectionKey, provide } from \"vue\";\nimport { EvDialogInstance } from \"@/components/EvDialog/EvDialogInstance.ts\";\nimport { EvDialogServiceOpener } from \"@/components/EvDialog/EvDialogServiceOpener.ts\";\n\nexport const EvDialogServiceSymbol: InjectionKey<EvDialogServiceOpener> =\n Symbol.for(\"ev:dialog-service\");\nexport const EvDialogInstanceSymbol: InjectionKey<\n EvDialogInstance | undefined\n> = Symbol.for(\"ev:dialog-instance\");\n\n/**\n * # useDialog\n *\n * Requires that the App has provided `EvDialogService`.\n */\nexport function useDialog(): EvDialogServiceOpener {\n const dialogService = inject(EvDialogServiceSymbol);\n if (!dialogService) {\n throw new Error(\"Evance UI: Unable to find injected dialog service\");\n }\n return dialogService;\n}\n\n/**\n * # injectDialog\n */\nexport function injectDialog(): EvDialogInstance | undefined {\n return inject(EvDialogInstanceSymbol);\n}\n\n/**\n * # provideDialog\n * @param instance\n */\nexport function provideDialog(instance: EvDialogInstance | undefined) {\n provide(EvDialogInstanceSymbol, instance);\n}\n","import { inject, InjectionKey, provide } from \"vue\";\nimport { EvDrawerInstance } from \"@/components/EvDrawer/EvDrawerInstance.ts\";\nimport { EvDrawerServiceOpener } from \"@/components/EvDrawer/EvDrawerServiceOpener.ts\";\n\nexport const EvDrawerServiceSymbol: InjectionKey<EvDrawerServiceOpener> =\n Symbol.for(\"ev:drawer-service\");\nexport const EvDrawerInstanceSymbol: InjectionKey<\n EvDrawerInstance | undefined\n> = Symbol.for(\"ev:drawer-instance\");\n\n/**\n * # useDrawer\n *\n * Requires that the App has provided `EvDrawerService`.\n */\nexport function useDrawer(): EvDrawerServiceOpener {\n const service = inject(EvDrawerServiceSymbol);\n if (!service) {\n throw new Error(\"Evance UI: Unable to find injected drawer service\");\n }\n return service;\n}\n\n/**\n * # injectDrawer\n */\nexport function injectDrawer(): EvDrawerInstance | undefined {\n return inject(EvDrawerInstanceSymbol);\n}\n\n/**\n * # provideDrawer\n * @param instance\n */\nexport function provideDrawer(instance: EvDrawerInstance | undefined) {\n provide(EvDrawerInstanceSymbol, instance);\n}\n","import { inject, InjectionKey } from \"vue\";\nimport { EvNotificationsManager } from \"@/components/EvNotifications\";\nimport { EvNotificationProps, EvNotificationSlots } from \"@/components\";\n\nexport const EvNotificationServiceSymbol: InjectionKey<EvNotificationsManager> =\n Symbol.for(\"ev:notification-service\");\n\n/**\n * # injectNotifications\n */\nexport function injectNotifications() {\n const service = inject(EvNotificationServiceSymbol);\n if (!service) {\n throw new Error(\n \"Evance UI: Unable to find inject notification service.\",\n );\n }\n return service;\n}\n\n/**\n * # useNotification\n */\nexport function useNotification() {\n const service = injectNotifications();\n return {\n add: (props: EvNotificationProps, slots?: EvNotificationSlots) => {\n return service.add(props, slots);\n },\n dismiss: (id: number) => {\n return service.dismiss(id);\n },\n };\n}\n","<script setup lang=\"ts\">\n/**\n * # EvIcon\n *\n * Uses `glyph` to render an SVG-based icon.\n */\nimport \"./EvIcon.scss\";\nimport { makeEvIconProps } from \"./EvIcon.ts\";\nimport { computed, toRaw, useAttrs } from \"vue\";\nimport { Appearance, appearanceModifier, sizeModifier } from \"@/util\";\nimport { useDefaults } from \"@/composables\";\n\nconst definedProps = defineProps({\n ...makeEvIconProps(),\n});\nconst props = useDefaults(definedProps);\nconst attrs = useAttrs();\n\nconst iconColor = computed(() => {\n if (!props.appearance || props.appearance === \"default\") {\n return null;\n }\n return `var(--text-${props.appearance})`;\n});\n\nconst iconGlyph = computed(() => {\n return toRaw(props.glyph) as string;\n});\n</script>\n\n<template>\n <i\n class=\"ev-icon\"\n :class=\"[\n {\n 'is-clickable': !!attrs.onClick,\n },\n appearanceModifier(props.appearance, [Appearance.default]),\n sizeModifier(props.size, ['medium']),\n ]\">\n <component :is=\"iconGlyph\"></component>\n </i>\n</template>\n\n<style>\n.ev-icon {\n --icon-color: v-bind(iconColor);\n}\n</style>\n","import { propsFactory, toWebUnit } from \"../util\";\nimport { computed } from \"vue\";\n\n/**\n * # Dimensions Props\n */\nexport interface DimensionsProps {\n height?: number | string;\n maxHeight?: number | string;\n maxWidth?: number | string;\n minHeight?: number | string;\n minWidth?: number | string;\n width?: number | string;\n}\n\n/**\n * # Make Dimensions Props\n */\nexport const makeDimensionsProps = propsFactory(\n {\n height: [Number, String],\n maxHeight: [Number, String],\n maxWidth: [Number, String],\n minHeight: [Number, String],\n minWidth: [Number, String],\n width: [Number, String],\n },\n \"dimensions\",\n);\n\n/**\n * # Use Dimensions\n * @param props\n */\nexport function useDimensions(props: DimensionsProps) {\n return computed(() => ({\n height: toWebUnit(props.height),\n maxHeight: toWebUnit(props.maxHeight),\n maxWidth: toWebUnit(props.maxWidth),\n minHeight: toWebUnit(props.minHeight),\n minWidth: toWebUnit(props.minWidth),\n width: toWebUnit(props.width),\n }));\n}\n","import { computed } from \"vue\";\nimport { propsFactory } from \"@/util\";\nimport { makeComponentProps } from \"@/composables/component.ts\";\nimport { makeDimensionsProps } from \"@/composables/dimensions.ts\";\n\nexport type EvResponsiveSlots = {\n default: never;\n content: never;\n};\n\nexport type AspectRatioProps = {\n aspectRatio?: string | number;\n};\n\n/**\n * # useAspectStyles\n *\n * Aspect ratio notation is permitted as a number or a string where aspects such as '16:9' is\n * converted to a division '16/9'.\n *\n * @link https://developer.mozilla.org/en-US/docs/Web/CSS/aspect-ratio\n * @param props\n */\nexport function useAspectStyles(props: AspectRatioProps) {\n return {\n aspectStyles: computed(() => {\n if (!props.aspectRatio) {\n return undefined;\n }\n const ratio = String(props.aspectRatio);\n return {\n aspectRatio: ratio.replace(\":\", \"/\"),\n };\n }),\n };\n}\n\nexport const makeEvResponsiveProps = propsFactory(\n {\n aspectRatio: [String, Number],\n contentClass: String,\n inline: Boolean,\n\n ...makeComponentProps(),\n ...makeDimensionsProps(),\n },\n \"EvResponsive\",\n);\n","import {\n Component,\n computed,\n FunctionalComponent,\n mergeProps,\n PropType,\n Transition,\n TransitionProps,\n h,\n} from \"vue\";\nimport { isBoolean, isEmpty, isObject, isString, propsFactory } from \"@/util\";\n\nexport type EvTransitionProp =\n | string\n | boolean\n | (TransitionProps & { component?: Component });\n\nexport interface EvTransitionProps {\n appear?: boolean;\n transition?: EvTransitionProp;\n disabled?: boolean;\n}\n\n/**\n * # Make Transition Props\n */\nexport const makeEvTransitionProps = propsFactory(\n {\n transition: {\n type: [Boolean, String, Object] as PropType<EvTransitionProp>,\n default: true,\n },\n },\n \"EvTransition\",\n);\n\n/**\n * # Use Transition\n *\n * Prepares `transition` props for use\n *\n * @param props\n * @param defaultTransition\n */\nexport function useEvTransition(\n props: EvTransitionProps,\n defaultTransition: string = \"transition-fade\",\n) {\n return computed(() => {\n if (isEmpty(props.transition) || isBoolean(props.transition)) {\n return {\n name:\n !!props.transition && !props.disabled\n ? defaultTransition\n : \"\",\n };\n }\n if (isString(props.transition)) {\n return {\n name: props.disabled ? \"\" : props.transition,\n };\n }\n return props.transition;\n });\n}\n\n/**\n * # EvTransition\n *\n * A functional component for handling transitions, which can either be a name, object or component.\n *\n * There is no `.vue` component file for this component.\n *\n * @param props\n * @param slots\n * @constructor\n */\nexport const EvTransition: FunctionalComponent = (\n props: EvTransitionProps,\n { slots },\n) => {\n const { transition, disabled, ...remainingProps } = props;\n const { component: transitionComponent = Transition, ...customProps } =\n isObject(transition) ? transition : {};\n const transitionProps = isString(transition)\n ? { name: disabled ? \"\" : transition }\n : (customProps as any);\n\n return h(\n transitionComponent,\n mergeProps(transitionProps, remainingProps as any, { disabled }),\n slots,\n );\n};\n","import { propsFactory } from \"@/util\";\nimport { makeComponentProps } from \"@/composables/component.ts\";\nimport { makeEvResponsiveProps } from \"@/components/EvResponsive/EvResponsive.ts\";\nimport { makeEvTransitionProps } from \"@/components/EvTransition\";\nimport { PropType } from \"vue\";\n\nexport const makeEvImgProps = propsFactory(\n {\n alt: String,\n cover: Boolean,\n crossorigin: String as PropType<\"\" | \"anonymous\" | \"use-credentials\">,\n draggable: {\n type: [Boolean, String] as PropType<boolean | \"true\" | \"false\">,\n default: undefined,\n },\n eager: Boolean,\n gradient: String,\n lazySrc: String,\n options: {\n type: Object as PropType<IntersectionObserverInit>,\n // For more information on types, navigate to:\n // https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API\n default: () => ({\n root: undefined,\n rootMargin: undefined,\n threshold: undefined,\n }),\n },\n position: String,\n referrerpolicy: String as PropType<\n | \"no-referrer\"\n | \"no-referrer-when-downgrade\"\n | \"origin\"\n | \"origin-when-cross-origin\"\n | \"same-origin\"\n | \"strict-origin\"\n | \"strict-origin-when-cross-origin\"\n | \"unsafe-url\"\n >,\n sizes: String,\n src: {\n type: [String, Object] as PropType<string | EvImgSrcObject>,\n default: \"\",\n },\n srcset: String,\n\n ...makeEvResponsiveProps(),\n ...makeComponentProps(),\n ...makeEvTransitionProps(),\n },\n \"EvImg\",\n);\n\nexport interface EvImgSrcObject {\n src?: string;\n srcset?: string;\n lazySrc?: string;\n aspect?: string | number;\n}\n\nexport type EvImgSlots = {\n default: never;\n placeholder: never;\n error: never;\n sources: never;\n};\n","<script setup lang=\"ts\">\n/**\n * '<ev-responsive>`\n */\nimport \"./EvResponsive.scss\";\nimport { makeEvResponsiveProps, useAspectStyles } from \"./EvResponsive.ts\";\nimport { useDimensions } from \"@/composables/dimensions.ts\";\n\nconst props = defineProps({\n ...makeEvResponsiveProps(),\n});\nconst slots = defineSlots<{\n additional(): never;\n default(): never;\n}>();\n\nconst { aspectStyles } = useAspectStyles(props);\nconst dimensionStyles = useDimensions(props);\n</script>\n\n<template>\n <div\n :class=\"[\n 'ev-responsive',\n {\n 'is-inline': props.inline,\n },\n props.class,\n ]\"\n :style=\"[dimensionStyles, props.style]\">\n <div class=\"ev-responsive--sizer\" :style=\"aspectStyles\"></div>\n <slot name=\"additional\" />\n <div\n v-if=\"slots.default\"\n :class=\"['ev-responsive--content', props.contentClass]\">\n <slot name=\"default\" />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\r\n/**\r\n * `<ev-img>`\r\n */\r\nimport \"./EvImg.scss\";\r\nimport { makeEvImgProps, EvImgSrcObject } from \"./EvImg.ts\";\r\nimport { EvResponsive } from \"@/components/EvResponsive\";\r\nimport { EvTransition, useEvTransition } from \"@/components/EvTransition\";\r\nimport {\r\n computed,\r\n ComputedRef,\r\n nextTick,\r\n onBeforeMount,\r\n onBeforeUnmount,\r\n onMounted,\r\n ref,\r\n shallowRef,\r\n watch,\r\n} from \"vue\";\r\nimport { Browser, filterComponentProps, isObject, toWebUnit } from \"@/util\";\r\n\r\nconst props = defineProps({\r\n ...makeEvImgProps(),\r\n});\r\nconst slots = defineSlots<{\r\n default(): never;\r\n error(): never;\r\n placeholder(): never;\r\n sources(): never;\r\n}>();\r\nconst emit = defineEmits([\"loadstart\", \"load\", \"error\"]);\r\n\r\nconst currentSrc = shallowRef(\"\");\r\nconst image = ref<HTMLImageElement>();\r\nconst state = shallowRef<\"idle\" | \"loading\" | \"loaded\" | \"error\">(\r\n props.eager ? \"loading\" : \"idle\",\r\n);\r\nconst naturalWidth = shallowRef<number>();\r\nconst naturalHeight = shallowRef<number>();\r\nconst transition = useEvTransition(props);\r\n\r\nconst normalisedSrc: ComputedRef<EvImgSrcObject> = computed(() => {\r\n const imgSrc = props as EvImgSrcObject | { src: EvImgSrcObject };\r\n\r\n return isObject(imgSrc.src)\r\n ? {\r\n src: imgSrc.src.src,\r\n srcset: props.srcset || imgSrc.src.srcset,\r\n lazySrc: props.lazySrc || imgSrc.src.lazySrc,\r\n aspect: props.aspectRatio || imgSrc.src.aspect || 0,\r\n }\r\n : {\r\n src: props.src,\r\n srcset: props.srcset,\r\n lazySrc: props.lazySrc,\r\n aspect: props.aspectRatio || 0,\r\n };\r\n});\r\n\r\nconst aspectRatio = computed(() => {\r\n return (\r\n normalisedSrc.value.aspect ||\r\n naturalWidth.value! / naturalHeight.value! ||\r\n 0\r\n );\r\n});\r\n\r\nconst objectFitClasses = computed(() => {\r\n return {\r\n \"is-object-cover\": props.cover,\r\n \"is-object-contain\": !props.cover,\r\n };\r\n});\r\n\r\n/**\r\n * ## getSrc\r\n */\r\nfunction getSrc() {\r\n const img = image.value;\r\n if (img) {\r\n currentSrc.value = img.currentSrc || img.src;\r\n }\r\n}\r\n\r\n/**\r\n * ## init\r\n *\r\n * @param isIntersecting\r\n */\r\nfunction init(isIntersecting?: boolean) {\r\n if (props.eager && isIntersecting) {\r\n return;\r\n }\r\n if (Browser.supportsIntersection && !isIntersecting && !props.eager) {\r\n return;\r\n }\r\n state.value = \"loading\";\r\n\r\n if (normalisedSrc.value.lazySrc) {\r\n const lazyImg = new Image();\r\n lazyImg.src = normalisedSrc.value.lazySrc;\r\n pollForSize(lazyImg, null);\r\n }\r\n\r\n if (!normalisedSrc.value.src) {\r\n return;\r\n }\r\n\r\n nextTick(() => {\r\n emit(\"loadstart\", image.value?.currentSrc || normalisedSrc.value.src);\r\n setTimeout(() => {\r\n if (image.value?.complete) {\r\n if (!image.value.naturalWidth) {\r\n onError();\r\n }\r\n if (state.value === \"error\") {\r\n return;\r\n }\r\n if (!aspectRatio.value) {\r\n pollForSize(image.value, null);\r\n }\r\n if (state.value === \"loading\") {\r\n onLoad();\r\n }\r\n } else {\r\n if (!aspectRatio.value) {\r\n pollForSize(image.value!);\r\n }\r\n getSrc();\r\n }\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * ## onError\r\n */\r\nfunction onError() {\r\n state.value = \"error\";\r\n emit(\"error\", image.value?.currentSrc || normalisedSrc.value.src);\r\n}\r\n\r\n/**\r\n * ## onLoad\r\n */\r\nfunction onLoad() {\r\n getSrc();\r\n pollForSize(image.value!);\r\n state.value = \"loaded\";\r\n emit(\"load\", image.value?.currentSrc || normalisedSrc.value.src);\r\n}\r\n\r\nlet timer = -1;\r\nfunction pollForSize(img: HTMLImageElement, timeout: number | null = 100) {\r\n const poll = () => {\r\n clearTimeout(timer);\r\n if (!img) {\r\n return;\r\n }\r\n if (!img?.complete && state.value === \"loading\" && timeout != null) {\r\n timer = window.setTimeout(poll, timeout);\r\n return;\r\n }\r\n const { naturalHeight: imgHeight, naturalWidth: imgWidth } = img;\r\n if (imgHeight || imgWidth) {\r\n naturalWidth.value = imgWidth;\r\n naturalHeight.value = imgHeight;\r\n } else if (\r\n img.currentSrc.endsWith(\".svg\") ||\r\n img.currentSrc.startsWith(\"data:image/svg+xml\")\r\n ) {\r\n naturalWidth.value = 1;\r\n naturalHeight.value = 1;\r\n }\r\n };\r\n poll();\r\n}\r\n\r\nwatch(\r\n () => props.src,\r\n () => {\r\n if (state.value !== \"idle\") {\r\n state.value = \"idle\";\r\n nextTick(() => {\r\n init(true);\r\n });\r\n }\r\n },\r\n);\r\n\r\nwatch(aspectRatio, (val, oldVal) => {\r\n if (!val && oldVal && image.value) {\r\n pollForSize(image.value);\r\n }\r\n});\r\n\r\nonBeforeMount(() => init());\r\n\r\nif (Browser.hasWindow) {\r\n const windowWidth = ref(window.innerWidth);\r\n const onWindowResize = () => {\r\n windowWidth.value = window.innerWidth;\r\n };\r\n onMounted(() => {\r\n window.addEventListener(\"resize\", onWindowResize);\r\n onWindowResize();\r\n });\r\n\r\n onBeforeUnmount(() => {\r\n window.removeEventListener(\"resize\", onWindowResize);\r\n });\r\n\r\n watch(windowWidth, (newWidth, oldWidth) => {\r\n if (newWidth != oldWidth) {\r\n getSrc();\r\n }\r\n });\r\n}\r\n\r\nconst isBooted = shallowRef(false);\r\n{\r\n const stop = watch(aspectRatio, (val) => {\r\n if (val) {\r\n // Doesn't work with nextTick, idk why\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => {\r\n isBooted.value = true;\r\n });\r\n });\r\n stop();\r\n }\r\n });\r\n}\r\n\r\nconst isLoaded = computed(() => {\r\n return state.value === \"loaded\";\r\n});\r\n\r\nconst responsiveProps = computed(() =>\r\n filterComponentProps(EvResponsive, props),\r\n);\r\n\r\nconst imgProps = computed(() => ({\r\n src: normalisedSrc.value.src,\r\n srcset: normalisedSrc.value.srcset,\r\n alt: props.alt,\r\n crossorigin: props.crossorigin,\r\n referrerpolicy: props.referrerpolicy,\r\n draggable: props.draggable,\r\n sizes: props.sizes,\r\n}));\r\n</script>\r\n\r\n<template>\r\n <ev-responsive\r\n v-intersect.once=\"{\r\n handler: init,\r\n options: props.options,\r\n }\"\r\n :class=\"[\r\n 'ev-img',\r\n {\r\n 'is-booting': !isBooted,\r\n },\r\n props.class,\r\n ]\"\r\n :style=\"[\r\n {\r\n width: toWebUnit(\r\n props.width === 'auto' ? naturalWidth : props.width,\r\n ),\r\n },\r\n props.style,\r\n ]\"\r\n v-bind=\"responsiveProps\"\r\n :aria-label=\"props.alt\"\r\n :aspect-ratio=\"aspectRatio\"\r\n :role=\"props.alt ? 'img' : undefined\">\r\n <template #additional>\r\n <ev-transition\r\n v-if=\"normalisedSrc.src && state !== 'idle'\"\r\n :transition=\"transition\"\r\n appear>\r\n <picture\r\n v-if=\"slots.sources\"\r\n v-show=\"isLoaded\"\r\n class=\"ev-img--picture\">\r\n <slot name=\"sources\" />\r\n <img\r\n ref=\"image\"\r\n :class=\"['ev-img--img', objectFitClasses]\"\r\n :style=\"{ objectPosition: props.position }\"\r\n v-bind=\"imgProps\"\r\n @load=\"onLoad\"\r\n @error=\"onError\" />\r\n </picture>\r\n <img\r\n v-else\r\n v-show=\"isLoaded\"\r\n ref=\"image\"\r\n :class=\"['ev-img--img', objectFitClasses]\"\r\n :style=\"{ objectPosition: props.position }\"\r\n v-bind=\"imgProps\"\r\n @load=\"onLoad\"\r\n @error=\"onError\" />\r\n </ev-transition>\r\n\r\n <ev-transition :transition=\"transition\">\r\n <img\r\n v-if=\"normalisedSrc.lazySrc && state !== 'loaded'\"\r\n :class=\"[\r\n 'ev-img--img',\r\n 'ev-img--preload',\r\n objectFitClasses,\r\n ]\"\r\n :style=\"{ objectPosition: props.position }\"\r\n :src=\"normalisedSrc.lazySrc\"\r\n :alt=\"props.alt\"\r\n :crossorigin=\"props.crossorigin\"\r\n :referrerpolicy=\"props.referrerpolicy\"\r\n :draggable=\"props.draggable\" />\r\n </ev-transition>\r\n\r\n <div\r\n v-if=\"props.gradient\"\r\n class=\"ev-img--gradient\"\r\n :style=\"{\r\n backgroundImage: `linear-gradient(${props.gradient})`,\r\n }\"></div>\r\n\r\n <ev-transition\r\n v-if=\"slots.placeholder\"\r\n :transition=\"transition\"\r\n appear>\r\n <div\r\n v-if=\"\r\n state === 'loading' ||\r\n (state === 'error' && !slots.error)\r\n \"\r\n class=\"ev-img--placeholder\">\r\n <slot name=\"placeholder\" />\r\n </div>\r\n </ev-transition>\r\n\r\n <ev-transition v-if=\"slots.error\" :transition=\"transition\" appear>\r\n <div class=\"ev-img--error\">\r\n <slot name=\"error\" />\r\n </div>\r\n </ev-transition>\r\n </template>\r\n <template #default>\r\n <slot name=\"default\" />\r\n </template>\r\n </ev-responsive>\r\n</template>\r\n","<script setup lang=\"ts\">\n/**\n * `<ev-avatar>`\n */\nimport \"./EvAvatar.scss\";\nimport { makeEvAvatarProps } from \"./EvAvatar.ts\";\nimport { useAppearance } from \"@/util\";\nimport { EvIcon } from \"@/components/EvIcon\";\nimport { EvImg } from \"@/components/EvImg\";\nimport { useSize } from \"@/composables/size.ts\";\nimport { useRounded } from \"@/composables/rounded.ts\";\nimport { useDefaults } from \"@/composables\";\n\nconst definedProps = defineProps({\n ...makeEvAvatarProps(),\n});\nconst props = useDefaults(definedProps);\nconst { appearanceClass, variantClass } = useAppearance(props);\nconst { sizeClasses, sizeStyles } = useSize(props);\nconst { roundedClasses } = useRounded(props);\n\ndefineSlots<{\n default(): never;\n}>();\n\n// @todo: color styles\n</script>\n\n<template>\n <div\n :class=\"[\n 'ev-avatar',\n appearanceClass,\n variantClass,\n sizeClasses,\n roundedClasses,\n props.class,\n ]\"\n :style=\"[sizeStyles, props.style]\">\n <ev-img\n v-if=\"props.image\"\n key=\"image\"\n alt=\"\"\n cover\n :src=\"props.image\" />\n <ev-icon v-else-if=\"props.icon\" :glyph=\"props.icon\" />\n <slot v-else name=\"default\">{{ props.text }}</slot>\n </div>\n</template>\n","import { Anchor, AnchorSelector, propsFactory } from \"@/util\";\nimport { computed, CSSProperties, PropType } from \"vue\";\nimport { useRtl } from \"@/composables/locale.ts\";\n\nexport interface PositionProps {\n position?: AnchorSelector;\n}\n\nexport const makePositionProps = propsFactory(\n {\n position: String as PropType<AnchorSelector>,\n },\n \"position\",\n);\n\nconst oppositeMap = {\n center: \"center\",\n top: \"bottom\",\n bottom: \"top\",\n left: \"right\",\n right: \"left\",\n} as const;\n\nexport type Position = \"top\" | \"bottom\" | \"left\" | \"right\";\nexport type Alignment = \"left\" | \"right\" | \"center\";\n\nexport function usePosition(\n props: PositionProps,\n opposite = false,\n offset?: (side: string) => number,\n) {\n const { isRtl } = useRtl();\n\n const positionStyles = computed(() => {\n if (!props.position) {\n return {};\n }\n const anchor = Anchor.fromSelector(props.position, isRtl.value);\n\n function getOffset(side: string) {\n return offset ? offset(side) : 0;\n }\n\n const styles = {} as CSSProperties;\n\n if (anchor.side !== \"center\" && anchor.side !== \"auto\") {\n if (opposite) {\n styles[oppositeMap[anchor.side]] =\n `calc(100% - ${getOffset(anchor.side)}px)`;\n } else {\n styles[anchor.side] = 0;\n }\n }\n\n if (anchor.physicalAlignment !== \"center\") {\n if (opposite) {\n styles[oppositeMap[anchor.physicalAlignment]] =\n `calc(100% - ${getOffset(anchor.physicalAlignment)}px)`;\n } else {\n styles[anchor.physicalAlignment] = 0;\n }\n } else {\n if (anchor.side === \"center\") {\n styles.top = styles.left = \"50%\";\n } else {\n styles[\n (\n {\n top: \"left\",\n bottom: \"left\",\n left: \"top\",\n right: \"top\",\n } as const\n )[anchor.side as Position]\n ] = \"50%\";\n }\n if (anchor.side !== \"auto\") {\n styles.transform = {\n top: \"translateX(-50%)\",\n bottom: \"translateX(-50%)\",\n left: \"translateY(-50%)\",\n right: \"translateY(-50%)\",\n center: \"translate(-50%, -50%)\",\n }[anchor.side];\n }\n }\n\n return styles;\n });\n\n return { positionStyles };\n}\n","import { makeAppearanceProps, propsFactory } from \"@/util\";\nimport { IconProp } from \"@/composables/icons.ts\";\nimport { makeComponentProps } from \"@/composables/component.ts\";\nimport { makePositionProps } from \"@/composables/position.ts\";\nimport { makeEvTransitionProps } from \"@/components/EvTransition\";\n\nexport const makeEvBadgeProps = propsFactory(\n {\n icon: IconProp,\n bordered: Boolean,\n content: [Number, String],\n dot: Boolean,\n floating: Boolean,\n max: [Number, String],\n bold: Boolean,\n inline: Boolean,\n modelValue: {\n type: Boolean,\n default: true,\n },\n offsetX: [Number, String],\n offsetY: [Number, String],\n pulsate: Boolean,\n\n ...makeComponentProps(),\n ...makePositionProps({\n position: \"top end\",\n } as const),\n ...makeAppearanceProps(),\n ...makeEvTransitionProps({\n transition: \"scale-rotate-transition\",\n }),\n },\n \"EvBadge\",\n);\n","/**\n * # Toggle Scope Utility\n *\n * Manage an effect scope based on changes in a watched source.\n *\n * We use effectScope() to capture the reactive effects of reactive/computed property.\n * @see https://vuejs.org/api/reactivity-advanced.html#effectscope\n */\n// Utilities\nimport { effectScope, onScopeDispose, watch } from \"vue\";\n\n// Types\nimport type { EffectScope, WatchSource } from \"vue\";\n\nexport function useToggleScope(\n source: WatchSource<boolean>,\n fn: (reset: () => void) => void,\n): void {\n let scope: EffectScope | undefined;\n\n function start(): void {\n scope = effectScope();\n scope.run(() => {\n return fn.length\n ? fn(() => {\n scope?.stop();\n start();\n })\n : (fn as any)();\n });\n }\n\n function watchCallback(active: boolean): void {\n if (active && !scope) {\n start();\n } else if (!active) {\n scope?.stop();\n scope = undefined;\n }\n }\n\n const watchOptions = {\n immediate: true,\n };\n\n watch(source, watchCallback, watchOptions);\n\n onScopeDispose(() => {\n scope?.stop();\n });\n}\n","import { ComponentInternalInstance, computed, ref, toRaw, watch } from \"vue\";\nimport type { Ref } from \"vue\";\nimport { EventProp, getCurrentComponent, toKebabCase } from \"@/util\";\nimport { useToggleScope } from \"./toggleScope.ts\";\n\ntype InnerVal<T> = T extends any[] ? Readonly<T> : T;\n\n/**\n * ## Has Prop\n *\n * Returns `true` if the `vueInstance` supplied has the `propName` in its list of props.\n *\n * @param vueInstance\n * @param propName\n */\nfunction hasProp(\n vueInstance: ComponentInternalInstance,\n propName: string,\n): boolean {\n return !!vueInstance.props?.hasOwnProperty(propName);\n}\n\n/**\n * # Model Proxy\n */\nexport function useModelProxy<\n PropsObject extends object &\n Partial<{\n [key in ModelName as `onUpdate:${ModelName}`]:\n | EventProp\n | undefined;\n }>,\n ModelName extends Extract<keyof PropsObject, string>,\n Inner = PropsObject[ModelName],\n>(\n props: PropsObject,\n modelName: ModelName,\n defaultValue?: PropsObject[ModelName],\n transformIn: (modelValue?: PropsObject[ModelName]) => Inner = (\n value: any,\n ) => value,\n transformOut: (modelValue: Inner) => PropsObject[ModelName] = (\n value: any,\n ) => value,\n) {\n const component: ComponentInternalInstance =\n getCurrentComponent(\"useModelProxy\");\n const modelRef: Ref<PropsObject[ModelName]> = ref(\n props[modelName] !== undefined ? props[modelName] : defaultValue,\n ) as Ref<PropsObject[ModelName]>;\n const modelNameKebab: string = toKebabCase(modelName);\n const isCheckKebabName: boolean = modelName !== modelNameKebab;\n const isModelAvailable = computed(() => {\n // Ignore evaluation of props[modelName]\n void props[modelName];\n return (\n (hasProp(component, modelName) &&\n hasProp(component, `onUpdate:${modelName}`)) ||\n (isCheckKebabName &&\n hasProp(component, modelNameKebab) &&\n hasProp(component, `onUpdate:${modelNameKebab}`))\n );\n });\n\n // Watch changes on the original model\n useToggleScope(\n () => !isModelAvailable.value,\n () => {\n watch(\n () => props[modelName],\n (value) => {\n modelRef.value = value;\n },\n );\n },\n );\n\n // Define a computed model\n const model = computed({\n get(): any {\n const externalValue = props[modelName];\n return transformIn(\n isModelAvailable.value ? externalValue : modelRef.value,\n );\n },\n set(internalValue): void {\n const newValue = transformOut(internalValue);\n const value = toRaw(\n isModelAvailable.value ? props[modelName] : modelRef.value,\n );\n // Ignore if the value has not changed\n if (value === newValue || transformIn(value) === internalValue) {\n return;\n }\n modelRef.value = newValue;\n component.emit(`update:${modelName}`, newValue);\n },\n }) as any as Ref<InnerVal<any>> & {\n readonly externalValue: PropsObject[ModelName];\n };\n\n // Define an externalValue property to our model\n Object.defineProperty(model, \"externalValue\", {\n get: () => {\n return isModelAvailable.value ? props[modelName] : modelRef.value;\n },\n });\n\n return model;\n}\n","<script setup lang=\"ts\">\n/**\n * `<ev-badge>`\n */\nimport \"./EvBadge.scss\";\nimport { makeEvBadgeProps } from \"./EvBadge.ts\";\nimport { computed } from \"vue\";\nimport { appearanceModifier } from \"@/util\";\nimport { EvTransition } from \"@/components/EvTransition\";\nimport { EvIcon } from \"@/components/EvIcon\";\nimport { usePosition } from \"@/composables/position.ts\";\nimport { useModelProxy } from \"@/composables/modelProxy.ts\";\nimport { useDefaults } from \"@/composables\";\n\nconst definedProps = defineProps({\n ...makeEvBadgeProps(),\n});\nconst props = useDefaults(definedProps);\nconst slots = defineSlots<{\n default(): never;\n content(): never;\n}>();\n\nconst modelValue = useModelProxy(props, \"modelValue\");\n\nconst contentNumber = computed(() => {\n return Number(props.content);\n});\n\nconst content = computed(() => {\n return !props.max || isNaN(contentNumber.value)\n ? props.content\n : contentNumber.value <= +props.max\n ? contentNumber.value\n : `${props.max}+`;\n});\n\nconst { positionStyles } = usePosition(props, true, (side) => {\n const base = props.floating ? (props.dot ? 2 : 4) : props.dot ? 8 : 12;\n\n return (\n base +\n ([\"top\", \"bottom\"].includes(side)\n ? +(props.offsetY ?? 0)\n : [\"left\", \"right\"].includes(side)\n ? +(props.offsetX ?? 0)\n : 0)\n );\n});\n\nconst isInline = computed(() => {\n return props.inline ? true : !slots.default;\n});\n</script>\n\n<template>\n <div\n :class=\"[\n 'ev-badge',\n {\n 'is-inline': isInline,\n 'is-dot': props.dot,\n 'is-bordered': props.bordered,\n 'is-floating': props.floating,\n },\n props.class,\n ]\"\n :style=\"props.style\">\n <slot />\n\n <ev-transition appear :transition=\"props.transition\">\n <div\n v-show=\"modelValue\"\n :class=\"[\n 'ev-badge--content',\n appearanceModifier(props.appearance),\n {\n 'is-variant-bold': props.bold,\n 'is-pulsate': props.pulsate,\n },\n ]\"\n :style=\"[isInline ? {} : positionStyles]\"\n aria-atomic=\"true\"\n :aria-label=\"contentNumber.toString()\"\n aria-live=\"polite\"\n role=\"status\">\n <slot v-if=\"!props.dot && slots.content\" name=\"content\" />\n <ev-icon v-if=\"!props.dot && props.icon\" :glyph=\"props.icon\" />\n <template v-else-if=\"!props.dot\">{{ content }}</template>\n </div>\n </ev-transition>\n </div>\n</template>\n","import {\n NavigationGuardNext,\n RouteLocationRaw,\n Router,\n RouterLink,\n useLink,\n UseLinkOptions,\n} from \"vue-router\";\nimport {\n computed,\n ComputedRef,\n nextTick,\n onScopeDispose,\n PropType,\n Ref,\n resolveDynamicComponent,\n SetupContext,\n toRef,\n} from \"vue\";\nimport {\n Browser,\n ClickEventListeners,\n hasEventListener,\n isString,\n propsFactory,\n} from \"@/util\";\n\n/**\n * # RouterLink or Href Props\n *\n * We need to be able to accommodate `<a href=\"\">` links\n * as well as `<router-link to=\"...\">` links.\n *\n * This is an important distinction in Evance since we use both.\n *\n */\nexport interface RouterLinkOrHrefProps {\n href?: string;\n replace?: boolean;\n to?: RouteLocationRaw;\n exact?: boolean;\n}\n\n/**\n * # Use RouterLink or Href\n */\nexport interface UseRouterLinkOrHref\n extends Omit<Partial<ReturnType<typeof useLink>>, \"href\"> {\n isLink: ComputedRef<boolean>;\n isClickable: ComputedRef<boolean>;\n href: Ref<string | undefined>;\n}\n\n/**\n * # Is Clickable Link\n * @param props\n * @param attrs\n */\nexport function isClickableLink(\n props: RouterLinkOrHrefProps & ClickEventListeners,\n attrs: SetupContext[\"attrs\"],\n): ComputedRef<boolean> {\n return computed(() => {\n return (\n !!(props.href || props.to) ||\n hasEventListener(attrs, \"click\") ||\n hasEventListener(props, \"click\")\n );\n });\n}\n\n/**\n * # Is RouterLink or Href\n * @param props\n */\nexport function isRouterLinkOrHref(\n props: RouterLinkOrHrefProps,\n): ComputedRef<boolean> {\n return computed(() => {\n return !!(props.href || props.to);\n });\n}\n\n/**\n * # Make Router Props\n */\nexport const makeRouterLinkOrHrefProps = propsFactory(\n {\n href: String,\n replace: Boolean,\n to: [String, Object] as PropType<RouteLocationRaw>,\n exact: Boolean,\n },\n \"router\",\n);\n\n/**\n * # Use Router Link or Href\n *\n * This is heavily \"inspired\" by Vuetify.\n * https://github.com/vuetifyjs/vuetify/blob/master/packages/vuetify/src/composables/router.tsx\n *\n * @param props\n * @param attrs\n */\nexport function useRouterLinkOrHref(\n props: RouterLinkOrHrefProps,\n attrs: SetupContext[\"attrs\"],\n): UseRouterLinkOrHref {\n const routerLink = resolveDynamicComponent(\"RouterLink\") as\n | typeof RouterLink\n | string;\n const isLink = isRouterLinkOrHref(props);\n const isClickable = isClickableLink(props, attrs);\n if (isString(routerLink)) {\n return {\n isLink,\n isClickable,\n href: toRef(props, \"href\"),\n };\n }\n const link = props.to\n ? routerLink.useLink(props as UseLinkOptions)\n : undefined;\n return {\n isLink,\n isClickable,\n route: link?.route,\n navigate: link?.navigate,\n isActive:\n link &&\n computed(() =>\n props.exact ? link.isExactActive?.value : link.isActive?.value,\n ),\n isExactActive: link?.isExactActive,\n href: computed(() => (props.to ? link?.route.value.href : props.href)),\n };\n}\n\n/**\n * # Use Back Button\n *\n * Listen to PopStateEvents dispatched to the window every time the\n * active history entry changes between two history entries for the same document.\n *\n * We need this for navigation on single page apps.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PopStateEvent\n */\nlet isTransitioning = false;\nexport function useBackButton(\n router: Router | undefined,\n callback: (next: NavigationGuardNext) => void,\n) {\n let isPopped = false;\n let removeBefore: (() => void) | undefined;\n let removeAfter: (() => void) | undefined;\n\n function onPopState(e: PopStateEvent) {\n if (e.state?.replaced) {\n return;\n }\n isPopped = true;\n // Use setTimeout to be asynchronous\n setTimeout(() => (isPopped = false));\n }\n\n if (Browser.hasWindow) {\n nextTick(() => {\n window.addEventListener(\"popstate\", onPopState);\n removeBefore = router?.beforeEach((to, from, next) => {\n if (!isTransitioning) {\n // Use setTimeout to be asynchronous\n setTimeout(() => {\n return isPopped ? callback(next) : next();\n });\n } else {\n isPopped ? callback(next) : next();\n }\n isTransitioning = true;\n });\n removeAfter = router?.afterEach(() => {\n isTransitioning = false;\n });\n });\n\n onScopeDispose(() => {\n window.removeEventListener(\"popstate\", onPopState);\n removeBefore?.();\n removeAfter?.();\n });\n }\n}\n","import {\n consoleWarn,\n EventProp,\n findChildrenWithProvide,\n getCurrentComponent,\n isDeepEqual,\n propsFactory,\n wrapInArray,\n} from \"@/util\";\nimport {\n ComponentInternalInstance,\n computed,\n ComputedRef,\n InjectionKey,\n onBeforeUnmount,\n onMounted,\n PropType,\n provide,\n reactive,\n Ref,\n toRef,\n UnwrapRef,\n} from \"vue\";\nimport { GroupItem } from \"@/composables/groupItem.ts\";\nimport { useModelProxy } from \"@/composables/modelProxy.ts\";\n\n/**\n * # GroupProps\n */\nexport interface GroupProps {\n disabled: boolean;\n modelValue: unknown;\n multiple?: boolean;\n mandatory?: boolean | \"force\" | undefined;\n max?: number | undefined;\n selectedClass: string | undefined;\n selectedAppearance: string | undefined;\n selectedVariant: string | undefined;\n \"onUpdate:modelValue\": EventProp<[unknown]> | undefined;\n}\n\n/**\n * # GroupProvide\n */\nexport interface GroupProvide {\n register: (item: GroupItem, cmp: ComponentInternalInstance) => void;\n unregister: (id: number) => void;\n select: (id: number, value: boolean) => void;\n selected: Ref<Readonly<number[]>>;\n isSelected: (id: number) => boolean;\n previous: () => void;\n next: () => void;\n selectedClass: Ref<string | undefined>;\n selectedAppearance: Ref<string | undefined>;\n selectedVariant: Ref<string | undefined>;\n items: ComputedRef<\n {\n id: number;\n value: unknown;\n disabled: boolean | undefined;\n }[]\n >;\n disabled: Ref<boolean | undefined>;\n getItemIndex: (value: unknown) => number;\n}\n\n/**\n * # makeGroupProps\n */\nexport const makeGroupProps = propsFactory(\n {\n modelValue: {\n type: null,\n default: undefined,\n },\n multiple: Boolean,\n mandatory: [Boolean, String] as PropType<boolean | \"force\">,\n max: Number,\n selectedClass: String,\n selectedAppearance: String,\n selectedVariant: String,\n disabled: Boolean,\n },\n \"group\",\n);\n\n/**\n * # getItemIndex\n *\n * @param items\n * @param value\n */\nfunction getItemIndex(items: UnwrapRef<GroupItem[]>, value: unknown): number {\n const ids = getIds(items, [value]);\n if (!ids.length) {\n return -1;\n }\n return items.findIndex((item) => item.id === ids[0]);\n}\n\n/**\n * ## getIds\n *\n * @param items\n * @param modelValue\n */\nfunction getIds(items: UnwrapRef<GroupItem[]>, modelValue: any[]): number[] {\n const ids: number[] = [];\n modelValue.forEach((value) => {\n const item = items.find((item) => isDeepEqual(value, item.value));\n const itemByIndex = items[value];\n if (item?.value != null) {\n ids.push(item.id);\n } else if (itemByIndex != null) {\n ids.push(itemByIndex.id);\n }\n });\n return ids;\n}\n\n/**\n * ## getValues\n *\n * @param items\n * @param ids\n */\nfunction getValues(items: UnwrapRef<GroupItem[]>, ids: any[]): unknown[] {\n const values: unknown[] = [];\n ids.forEach((id) => {\n const itemIndex = items.findIndex((item) => item.id === id);\n if (~itemIndex) {\n const item = items[itemIndex];\n values.push(item.value != null ? item.value : itemIndex);\n }\n });\n return values;\n}\n\n/**\n * # useGroup\n *\n * @param props\n * @param injectKey\n */\nexport function useGroup(\n props: GroupProps,\n injectKey: InjectionKey<GroupProvide>,\n) {\n let isUnmounted = false;\n const items = reactive<GroupItem[]>([]);\n\n const selected = useModelProxy(\n props,\n \"modelValue\",\n [],\n (value) => {\n return value == null ? [] : getIds(items, wrapInArray(value));\n },\n (value) => {\n const values = getValues(items, value);\n return props.multiple ? values : values[0];\n },\n );\n\n const groupComponent = getCurrentComponent(\"useGroup\");\n\n function register(\n item: GroupItem,\n itemComponent: ComponentInternalInstance,\n ) {\n // Is there a better way to fix this typing?\n const unwrapped = item as unknown as UnwrapRef<GroupItem>;\n const key = Symbol.for(`${injectKey.description}:id`);\n const children = findChildrenWithProvide(key, groupComponent?.vnode);\n const index = children.indexOf(itemComponent);\n\n if (index > -1) {\n items.splice(index, 0, unwrapped);\n } else {\n items.push(unwrapped);\n }\n }\n\n function unregister(id: number) {\n if (isUnmounted) {\n return;\n }\n // TODO: re-evaluate this line's importance in the future\n // should we only modify the model if mandatory is set.\n // selected.value = selected.value.filter(v => v !== id)\n forceMandatoryValue();\n\n const index = items.findIndex((item) => item.id === id);\n items.splice(index, 1);\n }\n\n // If mandatory and nothing is selected, then select first non-disabled item\n function forceMandatoryValue() {\n const item = items.find((item) => !item.disabled);\n if (item && props.mandatory === \"force\" && !selected.value.length) {\n selected.value = [item.id];\n }\n }\n\n onMounted(() => {\n forceMandatoryValue();\n });\n\n onBeforeUnmount(() => {\n isUnmounted = true;\n });\n\n function select(id: number, value?: boolean) {\n const item = items.find((item) => item.id === id);\n if (value && item?.disabled) {\n return;\n }\n\n if (props.multiple) {\n const internalValue = selected.value.slice();\n const index = internalValue.findIndex((v: number) => v === id);\n const isSelected = ~index;\n value = value ?? !isSelected;\n\n // We can't remove value if group is mandatory, value already exists, and it is the only value\n if (isSelected && props.mandatory && internalValue.length <= 1) {\n return;\n }\n\n // We can't add value if it would cause max limit to be exceeded\n if (\n !isSelected &&\n props.max != null &&\n internalValue.length + 1 > props.max\n ) {\n return;\n }\n\n if (index < 0 && value) {\n internalValue.push(id);\n } else if (index >= 0 && !value) {\n internalValue.splice(index, 1);\n }\n\n selected.value = internalValue;\n } else {\n const isSelected = selected.value.includes(id);\n if (props.mandatory && isSelected) {\n return;\n }\n selected.value = value ?? !isSelected ? [id] : [];\n }\n }\n\n function step(offset: number) {\n // getting an offset from selected value obviously won't work with multiple values\n if (props.multiple) {\n consoleWarn(\n 'This method is not supported when using \"multiple\" prop',\n );\n }\n\n if (!selected.value.length) {\n const item = items.find((item) => !item.disabled);\n if (item) {\n selected.value = [item.id];\n }\n } else {\n const currentId = selected.value[0];\n const currentIndex = items.findIndex((i) => i.id === currentId);\n\n let newIndex = (currentIndex + offset) % items.length;\n let newItem = items[newIndex];\n\n while (newItem.disabled && newIndex !== currentIndex) {\n newIndex = (newIndex + offset) % items.length;\n newItem = items[newIndex];\n }\n\n if (newItem.disabled) {\n return;\n }\n selected.value = [items[newIndex].id];\n }\n }\n\n const state: GroupProvide = {\n register,\n unregister,\n selected,\n select,\n disabled: toRef(props, \"disabled\"),\n previous: () => step(items.length - 1),\n next: () => step(1),\n isSelected: (id: number) => selected.value.includes(id),\n selectedClass: computed(() => props.selectedClass),\n selectedAppearance: computed(() => props.selectedAppearance),\n selectedVariant: computed(() => props.selectedVariant),\n items: computed(() => items),\n getItemIndex: (value: unknown) => getItemIndex(items, value),\n };\n\n provide(injectKey, state);\n\n return state;\n}\n","// Utilities\nimport { propsFactory } from \"@/util\";\n\n// Types\nexport interface TagProps {\n tag: string;\n}\n\n// Tag Props\nexport const makeTagProps = propsFactory(\n {\n tag: {\n type: String,\n default: \"div\",\n },\n },\n \"tag\",\n);\n","import { Appearance, InputSizeProp, propsFactory } from \"@/util\";\nimport { makeComponentProps } from \"@/composables/component.ts\";\nimport { makeTagProps } from \"@/composables/tag.ts\";\nimport { PropType } from \"vue\";\nimport {\n ButtonAppearanceProp,\n ButtonVariantProp,\n} from \"@/components/EvButton/EvButton.ts\";\n\nexport const makeEvButtonGroupProps = propsFactory(\n {\n appearance: {\n type: String as PropType<ButtonAppearanceProp>,\n default: Appearance.default,\n },\n rounded: Boolean,\n size: String as PropType<InputSizeProp>,\n variant: {\n type: String as PropType<ButtonVariantProp>,\n default: \"outlined\",\n },\n\n ...makeComponentProps(),\n ...makeTagProps(),\n },\n \"EvButtonGroup\",\n);\n","import { GroupProvide, makeGroupProps } from \"@/composables/group.ts\";\nimport { InjectionKey } from \"vue\";\nimport { propsFactory } from \"@/util\";\nimport { makeEvButtonGroupProps } from \"@/components/EvButtonGroup/EvButtonGroup.ts\";\n\nexport type ButtonToggleSlotProps =\n | \"isSelected\"\n | \"select\"\n | \"selected\"\n | \"next\"\n | \"previous\";\nexport interface DefaultButtonToggleSlot\n extends Pick<GroupProvide, ButtonToggleSlotProps> {}\n\nexport const EvButtonToggleSymbol: InjectionKey<GroupProvide> =\n Symbol.for(\"ev:button-toggle\");\n\nexport type EvButtonToggleSlots = {\n default: DefaultButtonToggleSlot;\n};\n\n/**\n * # makeEvButtonToggleProps\n */\nexport const makeEvButtonToggleProps = propsFactory(\n {\n ...makeEvButtonGroupProps(),\n ...makeGroupProps({\n selectedAppearance: \"primary\",\n selectedVariant: \"tonal\",\n }),\n },\n \"EvButtonToggle\",\n);\n","import {\n EventProp,\n getCurrentComponent,\n getNextId,\n propsFactory,\n} from \"@/util\";\nimport {\n computed,\n ExtractPropTypes,\n inject,\n InjectionKey,\n onBeforeUnmount,\n provide,\n Ref,\n toRef,\n watch,\n} from \"vue\";\nimport { GroupProvide } from \"@/composables/group.ts\";\n\n/**\n * # GroupItem\n */\nexport interface GroupItem {\n id: number;\n value: Ref<unknown>;\n disabled: Ref<boolean | undefined>;\n}\n\n/**\n * # GroupItemProvide\n */\nexport interface GroupItemProvide {\n id: number;\n isSelected: Ref<boolean>;\n toggle: () => void;\n select: (value: boolean) => void;\n selectedClass: Ref<(string | undefined)[] | false>;\n selectedAppearance: Ref<string | undefined>;\n selectedVariant: Ref<string | undefined>;\n value: Ref<unknown>;\n disabled: Ref<boolean | undefined>;\n group: GroupProvide;\n}\n\n/**\n * # makeGroupItemProps\n */\nexport const makeGroupItemProps = propsFactory(\n {\n value: null,\n disabled: Boolean,\n selectedClass: String,\n selectedAppearance: String,\n selectedVariant: String,\n },\n \"group-item\",\n);\n\n/**\n * # GroupItemProps\n */\nexport interface GroupItemProps\n extends ExtractPropTypes<ReturnType<typeof makeGroupItemProps>> {\n \"onGroup:selected\"?: EventProp<[{ value: boolean }]> | undefined;\n}\n\n/**\n * # useGroupItem\n */\nexport function useGroupItem(\n props: GroupItemProps,\n injectKey: InjectionKey<GroupProvide>,\n required?: boolean,\n): GroupItemProvide | undefined {\n const component = getCurrentComponent(\"useGroupItem\");\n if (!component) {\n throw new Error(\n \"Evance UI: `useGroupItem()` composable must be used inside a component setup function\",\n );\n }\n const id = getNextId();\n provide(Symbol.for(`${injectKey.description}:id`), id);\n\n const group = inject(injectKey, null);\n if (!group) {\n if (!required) {\n return undefined;\n }\n throw new Error(\n `Evance UI: Could not find \\`useGroup()\\` injection with symbol '${injectKey.description}'.`,\n );\n }\n\n const value = toRef(props, \"value\");\n const disabled = computed(() => {\n return !!(group.disabled.value || props.disabled);\n });\n const isSelected = computed(() => {\n return group.isSelected(id);\n });\n const selectedClass = computed(() => {\n return (\n isSelected.value && [group.selectedClass.value, props.selectedClass]\n );\n });\n const selectedAppearance = computed(() => {\n return isSelected.value\n ? props.selectedAppearance ?? group?.selectedAppearance.value\n : undefined;\n });\n const selectedVariant = computed(() => {\n return isSelected.value\n ? props.selectedVariant ?? group?.selectedVariant.value\n : undefined;\n });\n\n group.register(\n {\n id,\n value,\n disabled,\n },\n component,\n );\n\n onBeforeUnmount(() => {\n group.unregister(id);\n });\n\n watch(isSelected, (value) => {\n component.emit(\"group:selected\", { value });\n });\n\n return {\n id,\n isSelected,\n toggle: () => group.select(id, !isSelected.value),\n select: (value: boolean) => group.select(id, value),\n selectedClass,\n selectedAppearance,\n selectedVariant,\n value,\n disabled,\n group,\n };\n}\n","import {\n Appearance,\n AppearanceProp,\n InputSizeProp,\n propsFactory,\n VariantProp,\n} from \"@/util\";\nimport { IconProp, IconValue } from \"@/composables/icons.ts\";\nimport {\n makeRouterLinkOrHrefProps,\n RouterLinkOrHrefProps,\n} from \"@/composables/router.ts\";\nimport { PropType } from \"vue\";\nimport { makeComponentProps } from \"@/composables/component.ts\";\nimport { EvButtonToggleSymbol } from \"@/components/EvButtonToggle/EvButtonToggle.ts\";\nimport { makeGroupItemProps } from \"@/composables/groupItem.ts\";\n\n/**\n * ## Button Appearance\n */\nexport type ButtonAppearanceProp = AppearanceProp | \"inverse\";\nexport type ButtonVariantProp = VariantProp | \"link\";\n\n/**\n * # EvButtonProps\n */\nexport interface EvButtonProps extends RouterLinkOrHrefProps {\n appearance?: ButtonAppearanceProp;\n disabled?: boolean;\n icon?: IconValue | boolean;\n iconStart?: IconValue;\n iconEnd?: IconValue;\n rounded?: boolean;\n size?: InputSizeProp;\n fullWidth?: boolean;\n text?: string;\n loading?: boolean;\n onClick?: () => void;\n variant?: ButtonVariantProp;\n}\n\n/**\n * # EvButton Props\n */\nexport const makeEvButtonProps = propsFactory(\n {\n active: {\n type: Boolean,\n default: undefined,\n },\n symbol: {\n type: null,\n default: EvButtonToggleSymbol,\n },\n appearance: {\n type: String as PropType<ButtonAppearanceProp>,\n default: Appearance.default,\n },\n icon: [Boolean, String, Function, Object] as PropType<\n boolean | IconValue\n >,\n iconStart: IconProp,\n iconEnd: IconProp,\n rounded: Boolean,\n size: String as PropType<InputSizeProp>,\n fullWidth: Boolean,\n text: String,\n loading: Boolean,\n variant: {\n type: String as PropType<ButtonVariantProp>,\n default: \"default\",\n },\n\n ...makeComponentProps(),\n ...makeRouterLinkOrHrefProps(),\n ...makeGroupItemProps(),\n },\n \"EvButton\",\n);\n","<script setup lang=\"ts\">\n/**\n * # EvProgressCircular\n */\nimport \"./EvProgressCircular.scss\";\nimport { appearanceModifier, AppearanceProp, toWebUnit } from \"@/util\";\nimport { ref } from \"vue\";\n\ntype Size = \"default\";\n\ninterface ProgressProps {\n appearance?: AppearanceProp;\n indeterminate?: boolean;\n percentage?: number;\n rotate?: number;\n size?: Size | number;\n thickness?: number;\n}\nconst props = withDefaults(defineProps<ProgressProps>(), {\n appearance: \"default\",\n size: \"default\",\n indeterminate: false,\n percentage: 0,\n rotate: 0,\n thickness: 2,\n});\n\nconst container = ref<HTMLElement | null>(null);\nconst defaultSize = 48;\nconst defaultRadius = defaultSize / 2;\nconst defaultRotation = -90;\n\n/**\n * ## Get Size with Units\n * The default units is `px` when only a number is supplied.\n */\nfunction getSizeWithUnits() {\n if (props.size === \"default\") {\n return undefined;\n }\n return toWebUnit(props.size);\n}\n\n/**\n * ## Get Circumference\n * Calculate the circumference of the inner circles.\n */\nfunction getCircumference() {\n return Math.PI * (getRadius() * 2);\n}\n\n/**\n * ## Get Width\n * Returns the width of the container.\n */\nfunction getContainerWidth() {\n return !container.value ? defaultSize : container.value.clientWidth;\n}\n\n/**\n * ## Get Progress Offset\n * Calculate progress offset based on the percentage of the circumference.\n */\nfunction getProgressOffset() {\n return props.indeterminate\n ? 0\n : getCircumference() * (1 - props.percentage / 100);\n}\n\n/**\n * ## Get Radius\n * Calculate the radius of the\n */\nfunction getRadius() {\n return defaultRadius - getThickness() / 2;\n}\n\n/**\n * ## Get Rotation\n * Returns the starting point rotation style.\n */\nfunction getRotation() {\n const rotation = defaultRotation + props.rotate;\n return `rotate(${rotation}deg)`;\n}\n\n/**\n * ## Get Thickness (Stroke Width)\n * Calculate the requested stroke width as this will be different from\n * the actual stroke-width attribute.\n */\nfunction getThickness() {\n const maxThickness = defaultSize / 2;\n const thickness = (props.thickness / getContainerWidth()) * defaultSize;\n return thickness > maxThickness ? maxThickness : thickness;\n}\n</script>\n\n<template>\n <span\n ref=\"container\"\n role=\"progressbar\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n :aria-valuenow=\"percentage\"\n class=\"ev-progress-circular\"\n :class=\"[\n {\n 'is-indeterminate': props.indeterminate,\n 'is-size-default': props.size === 'default',\n },\n appearanceModifier(props.appearance, ['default']),\n ]\"\n :style=\"{\n width: getSizeWithUnits(),\n height: getSizeWithUnits(),\n }\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 48 48\"\n :style=\"{\n transform: getRotation(),\n }\">\n <circle\n class=\"ev-progress-circular--track\"\n fill=\"transparent\"\n cx=\"50%\"\n cy=\"50%\"\n :r=\"getRadius()\"\n :stroke-width=\"getThickness()\"\n :stroke-dasharray=\"getCircumference()\"\n stroke-dashoffset=\"0\"></circle>\n <circle\n class=\"ev-progress-circular--bar\"\n fill=\"transparent\"\n cx=\"50%\"\n cy=\"50%\"\n :r=\"getRadius()\"\n :stroke-width=\"getThickness()\"\n :stroke-dasharray=\"getCircumference()\"\n :stroke-dashoffset=\"getProgressOffset()\"></circle>\n </svg>\n <span class=\"ev-progress-circular--content\">\n <slot />\n </span>\n </span>\n</template>\n","import { computed, ComputedRef } from \"vue\";\nimport { SetupContext } from \"vue\";\n\n/**\n * # Has slot with content\n *\n * Determines whether the `slotName` is present within the supplied list of `slots`\n * and whether it has content.\n *\n * @param slots\n * @param slotName\n */\nexport function hasSlotWithContent(\n slots: SetupContext[\"slots\"],\n slotName: string,\n): ComputedRef {\n return computed(() => {\n if (!slots[slotName]) {\n return false;\n }\n const slot = slots[slotName]!();\n if (!slot.length) {\n return false;\n }\n return slot.some((node) => {\n return !!node.children?.length;\n });\n });\n}\n","import { UseRouterLinkOrHref } from \"@/composables/router.ts\";\nimport { nextTick, watch } from \"vue\";\n\n/**\n * # useSelectLink\n *\n * @param link\n * @param select\n */\nexport function useSelectLink(\n link: UseRouterLinkOrHref,\n select?: (value: boolean, e?: Event) => void,\n) {\n watch(\n () => link.isActive?.value,\n (isActive) => {\n if (link.isLink.value && isActive && select) {\n nextTick(() => {\n select(true);\n });\n }\n },\n {\n immediate: true,\n },\n );\n}\n","<script setup lang=\"ts\">\n/**\n * # EvButton\n */\nimport \"./EvButton.scss\";\nimport { makeEvButtonProps } from \"./EvButton.ts\";\nimport { computed, useAttrs, useSlots } from \"vue\";\nimport { EvIcon } from \"@/components/EvIcon\";\nimport { EvProgressCircular } from \"@/components/EvProgressCircular\";\nimport {\n AppearanceProps,\n InputSize,\n isBoolean,\n sizeModifier,\n useAppearance,\n Variant,\n} from \"@/util\";\nimport { hasSlotWithContent } from \"@/composables/hasSlotWithContent.ts\";\nimport {\n RouterLinkOrHrefProps,\n useRouterLinkOrHref,\n} from \"@/composables/router.ts\";\nimport { useDefaults } from \"@/composables/defaults.ts\";\nimport { useGroupItem } from \"@/composables/groupItem.ts\";\nimport { useSelectLink } from \"@/composables/selectLink.ts\";\n\ndefineSlots<{\n default(): never;\n icon(): never;\n \"icon-end\"(): never;\n \"icon-start\"(): never;\n prefix(): never;\n suffix(): never;\n}>();\n\nconst definedProps = defineProps({\n ...makeEvButtonProps(),\n});\nconst props = useDefaults(definedProps);\n\ndefineEmits([\"group:selected\"]);\n\nconst attrs = useAttrs();\nconst slots = useSlots();\nconst hasDefaultSlot = hasSlotWithContent(slots, \"default\");\nconst group = useGroupItem(props, props.symbol, false);\nconst link = useRouterLinkOrHref(props as RouterLinkOrHrefProps, attrs);\n\nconst isActive = computed(() => {\n if (props.active !== undefined) {\n return props.active;\n }\n if (link.isLink.value) {\n return link.isActive?.value;\n }\n return group?.isSelected.value;\n});\n\nconst isDisabled = computed(() => {\n // we'll add groups later\n return group?.disabled.value || props.disabled;\n});\n\nconst isClickable = computed(() => {\n return !isDisabled.value && !props.loading;\n});\n\n/**\n * ## Is Icon Like?\n *\n * Used to determine whether to apply `is-icon` modifier class.\n *\n * Returns `true` if only one icon is applied, the button is not full-width\n * and no text has been supplied.\n *\n * OR, the `icon` prop is supplied as `true`.\n */\nconst isIconLike = computed(() => {\n const icons = [props.icon, props.iconStart, props.iconEnd].filter(\n (icon) => !!icon,\n );\n return (\n ((icons.length === 1 && !hasDefaultSlot.value && !props.text) ||\n props.icon === true) &&\n !props.fullWidth\n );\n});\n\n/**\n * ## Is Link?\n * Returns `true` if an `href` was supplied AND is NOT an empty string.\n */\nconst isLink = computed(() => {\n return link.isLink.value;\n});\n\n/**\n * ## Component Element\n *\n * An `<ev-button>` may render as:\n * - `<a>` when an `href` is supplied\n * - `<button>` when `href` is NOT supplied, or is an empty string\n */\nconst componentElement = computed(() => {\n return isLink.value ? \"a\" : \"button\";\n});\n\n/**\n * # On Click\n * @param e\n */\nfunction onClick(e: MouseEvent): void {\n if (\n isDisabled.value ||\n (isLink.value &&\n (e.metaKey ||\n e.ctrlKey ||\n e.shiftKey ||\n e.button !== 0 ||\n attrs.target === \"_blank\"))\n ) {\n return;\n }\n link.navigate?.(e);\n group?.toggle();\n}\n\nuseSelectLink(link, group?.select);\n\nconst { appearanceClass, variantClass } = useAppearance(\n props as AppearanceProps,\n group,\n isActive,\n Variant.bold,\n);\n\nconst valueAttr = computed(() => {\n if (props.value === undefined || typeof props.value === \"symbol\") {\n return undefined;\n }\n return Object(props.value) === props.value\n ? JSON.stringify(props.value, null, 0)\n : props.value;\n});\n\ndefineExpose({\n group,\n});\n</script>\n\n<template>\n <component\n :is=\"componentElement\"\n :href=\"link.href.value\"\n :class=\"[\n 'ev-button',\n group?.selectedClass.value,\n appearanceClass,\n variantClass,\n sizeModifier(props.size as string, [InputSize.default]),\n {\n 'is-active': isActive,\n 'is-disabled': isDisabled,\n 'is-icon': isIconLike,\n 'is-fullwidth': props.fullWidth,\n 'is-loading': props.loading,\n 'is-rounded': props.rounded,\n 'is-clickable': isClickable,\n },\n props.class,\n ]\"\n :style=\"props.style\"\n tabindex=\"0\"\n :disabled=\"isDisabled || undefined\"\n :value=\"valueAttr\"\n @click=\"onClick\">\n <span\n v-if=\"props.iconStart || slots['icon-start']\"\n class=\"ev-button--icon-start\">\n <slot name=\"icon-start\">\n <ev-icon :glyph=\"props.iconStart\" />\n </slot>\n </span>\n <span v-if=\"slots.prefix\" class=\"ev-button--prefix\">\n <slot name=\"prefix\" />\n </span>\n <span\n v-if=\"(props.icon || slots.icon) && !isBoolean(props.icon)\"\n class=\"ev-button--icon\">\n <slot name=\"icon\">\n <ev-icon :glyph=\"props.icon\" />\n </slot>\n </span>\n <span\n v-if=\"props.text || hasDefaultSlot\"\n class=\"ev-button--text\"\n data-no-activator>\n <slot>{{ props.text }}</slot>\n </span>\n <span v-if=\"slots.suffix\" class=\"ev-button--suffix\">\n <slot name=\"suffix\" />\n </span>\n <span\n v-if=\"props.iconEnd || slots['icon-end']\"\n class=\"ev-button--icon-end\">\n <slot name=\"icon-end\">\n <ev-icon :glyph=\"props.iconEnd\" />\n </slot>\n </span>\n <span v-if=\"props.loading\" class=\"ev-button--loading\">\n <ev-progress-circular indeterminate />\n </span>\n </component>\n</template>\n","<script setup lang=\"ts\">\n/**\n * # EvButtonGroup\n */\nimport \"./EvButtonGroup.scss\";\nimport { makeEvButtonGroupProps } from \"./EvButtonGroup.ts\";\nimport { provideDefaults } from \"@/composables/defaults.ts\";\nimport { computed, toRef } from \"vue\";\nimport { appearanceModifier, variantModifier } from \"@/util\";\n\nconst props = defineProps({\n ...makeEvButtonGroupProps(),\n});\n\ndefineSlots<{\n default(): never;\n}>();\n\nprovideDefaults({\n EvButton: {\n appearance: toRef(props, \"appearance\"),\n variant: toRef(props, \"variant\"),\n size: toRef(props, \"size\"),\n },\n});\n\nconst appearanceClass = computed(() => appearanceModifier(props.appearance));\nconst variantClass = computed(() => variantModifier(props.variant));\n</script>\n\n<template>\n <component\n :is=\"props.tag\"\n :class=\"[\n 'ev-button-group',\n appearanceClass,\n variantClass,\n {\n 'is-rounded': props.rounded,\n },\n props.class,\n ]\"\n :style=\"props.style\">\n <div class=\"ev-button-group--container\">\n <slot />\n </div>\n </component>\n</template>\n","<script setup lang=\"ts\">\r\n/**\r\n * # EvButtonToggle\r\n */\r\nimport \"./EvButtonToggle.scss\";\r\nimport {\r\n EvButtonToggleSlots,\r\n EvButtonToggleSymbol,\r\n makeEvButtonToggleProps,\r\n} from \"./EvButtonToggle.ts\";\r\nimport { EvButtonGroup } from \"../EvButtonGroup\";\r\nimport { GroupProps, useGroup } from \"@/composables/group.ts\";\r\nimport { filterComponentProps } from \"@/util\";\r\nimport { computed } from \"vue\";\r\n\r\nconst props = defineProps({\r\n ...makeEvButtonToggleProps(),\r\n});\r\n\r\ndefineEmits([\"update:modelValue\"]);\r\n\r\ndefineSlots<EvButtonToggleSlots>();\r\n\r\nconst { isSelected, next, previous, select, selected } = useGroup(\r\n props as any as GroupProps,\r\n EvButtonToggleSymbol,\r\n);\r\n\r\ndefineExpose({\r\n next,\r\n previous,\r\n select,\r\n});\r\n\r\nconst groupProps = computed(() => filterComponentProps(EvButtonGroup, props));\r\nconst slotProps = { isSelected, next, previous, select, selected };\r\n</script>\r\n\r\n<template>\r\n <ev-button-group\r\n :class=\"['ev-button-toggle', props.class]\"\r\n :style=\"props.style\"\r\n v-bind=\"groupProps\">\r\n <slot v-bind=\"slotProps\" />\r\n </ev-button-group>\r\n</template>\r\n","import { useModelProxy } from \"./modelProxy.ts\";\nimport { computed, ref } from \"vue\";\nimport { Browser, propsFactory } from \"../util\";\n\n/**\n * # Focus Props Type\n */\nexport interface FocusProps {\n focused?: boolean;\n \"onUpdate:focused\"?: ((focused: boolean) => any) | undefined;\n}\n\n/**\n * # Make Focus Props\n */\nexport const makeFocusProps = propsFactory(\n {\n focused: Boolean,\n },\n \"focus\",\n);\n\n/**\n * # Use Focus Composable\n */\nexport function useFocus(props: FocusProps) {\n const isFocused = useModelProxy(props, \"focused\");\n const isFocusedVisible = ref(false);\n const focusClasses = computed(() => {\n return {\n \"is-focused\": isFocused.value,\n \"is-focused-visible\": isFocusedVisible.value,\n };\n });\n\n function focus(e?: Event): void {\n isFocused.value = true;\n const el: HTMLElement | null = e?.target as HTMLElement;\n if (Browser.supportsFocusVisible && el?.matches(\":focus-visible\")) {\n isFocusedVisible.value = true;\n }\n }\n\n function blur(): void {\n isFocused.value = false;\n isFocusedVisible.value = false;\n }\n\n return { isFocused, isFocusedVisible, focusClasses, focus, blur };\n}\n\n/**\n * ## Auto Focus\n */\nexport interface AutofocusProps {\n autofocus: boolean;\n}\n\n/**\n * # Use Auto Focus\n * @param props\n */\nexport function useAutofocus(props: AutofocusProps) {\n return {\n mounted: (el: HTMLElement) => {\n if (!props.autofocus) {\n return;\n }\n el.focus();\n },\n };\n}\n","import { FormField } from \"@/modules/Form/FormField.ts\";\nimport { Ref, ref, shallowRef, toRaw } from \"vue\";\nimport { consoleWarn } from \"@/util\";\nimport { FormProps } from \"@/composables/form.ts\";\nimport { ValidationError } from \"@/composables/validation.ts\";\n\n/**\n * # Form\n */\nexport class Form {\n public readonly errors: Ref<ValidationError[]> = ref([]);\n private fields: FormField[] = [];\n public readonly isDisabled: Ref<boolean>;\n public readonly isReadonly: Ref<boolean>;\n public readonly isValid: Ref<boolean | null>;\n public readonly isValidating = shallowRef(false);\n public readonly validateOn: Ref<FormProps[\"validateOn\"]>;\n\n constructor(\n isValid: Ref<boolean | null> | undefined,\n isDisabled: Ref<boolean> | undefined,\n isReadonly: Ref<boolean> | undefined,\n validateOn: Ref<FormProps[\"validateOn\"]> | undefined,\n ) {\n this.isDisabled = isDisabled ?? shallowRef(false);\n this.isReadonly = isReadonly ?? shallowRef(false);\n this.isValid = isValid ?? shallowRef(null);\n this.validateOn = validateOn ?? shallowRef(\"input\");\n }\n\n /**\n * ## Add Field\n * @param field\n */\n public addField(field: FormField) {\n if (this.hasField(field.id)) {\n consoleWarn(`Duplicate form field with name \"${field.id}\"`);\n }\n this.fields.push(field);\n }\n\n /**\n * ## Expose\n */\n public expose() {\n return {\n reset: this.reset.bind(this),\n resetValidation: this.resetValidation.bind(this),\n validate: this.validate.bind(this),\n };\n }\n\n /**\n * ## Get Field\n * @param id\n */\n public getField(id: string): FormField | undefined {\n return this.fields.find((field) => {\n return field.id === id;\n });\n }\n\n /**\n * ## Has Field\n *\n * Returns `true` if the field `name` already exists in the form.\n *\n * @param id\n */\n public hasField(id: string): boolean {\n return this.fields.some((field) => field.id === id);\n }\n\n /**\n * ## Remove Field\n * @param id\n */\n public removeField(id: string) {\n this.fields = this.fields.filter((field) => {\n return field.id !== id;\n });\n }\n\n /**\n * ## Reset\n */\n public reset() {\n this.fields.forEach((field) => field.reset());\n }\n\n /**\n * ## Reset Validation\n */\n public resetValidation() {\n this.fields.forEach((field) => field.resetValidation());\n }\n\n /**\n * ## Validate\n */\n public async validate() {\n let valid = true;\n this.errors.value = [];\n this.isValidating.value = true;\n\n const results = [];\n for (const field of this.fields) {\n const fieldErrors = await field.validate();\n for (const fieldError of fieldErrors) {\n valid = false;\n results.push({\n name: field.name,\n message: fieldError,\n });\n }\n }\n\n this.errors.value = results;\n this.isValidating.value = false;\n return {\n valid,\n errors: toRaw(this.errors.value),\n };\n }\n}\n","import { computed, inject, InjectionKey, PropType, provide, toRef } from \"vue\";\nimport { ValidationError, FormFieldProps } from \"@/composables/validation.ts\";\nimport { propsFactory } from \"@/util\";\nimport { Form } from \"@/modules/Form/Form.ts\";\nimport { useModelProxy } from \"@/composables/modelProxy.ts\";\n\n/**\n * # Form Key\n * Used for provide/inject functions.\n */\nexport const FormKey: InjectionKey<any> = Symbol.for(\"ev:form\");\n\n/**\n * # Submit Event Promise\n */\nexport interface SubmitEventPromise\n extends SubmitEvent,\n Promise<FormValidationResult> {}\n\n/**\n * # Form Props\n */\nexport interface FormProps {\n disabled?: boolean;\n readonly?: boolean;\n modelValue?: boolean | null;\n \"onUpdate:modelValue\"?: ((val: boolean | null) => void) | undefined;\n validateOn?: FormFieldProps[\"validateOn\"];\n}\n\n/**\n * # Form Validation Result\n */\nexport interface FormValidationResult {\n valid: boolean;\n errors: ValidationError[];\n}\n\n/**\n * # Make Form Props\n */\nexport const makeFormProps = propsFactory(\n {\n disabled: Boolean,\n readonly: Boolean,\n modelValue: {\n type: Boolean as PropType<boolean | null>,\n default: null,\n },\n validateOn: {\n type: String as PropType<FormProps[\"validateOn\"]>,\n default: \"input\",\n },\n },\n \"form\",\n);\n\n/**\n * # Create Form\n * @param props\n */\nexport function createForm(props: FormProps) {\n const isValid = useModelProxy(props, \"modelValue\");\n const isDisabled = computed(() => props.disabled);\n const isReadonly = computed(() => props.readonly);\n const validateOn = toRef(props, \"validateOn\");\n\n const form = new Form(isValid, isDisabled, isReadonly, validateOn);\n\n provide(FormKey, form);\n\n return form;\n}\n\n/**\n * # Use Form\n */\nexport function useForm() {\n return inject(FormKey, null);\n}\n","import {\n computed,\n nextTick,\n onBeforeMount,\n onBeforeUnmount,\n onMounted,\n Ref,\n ref,\n shallowRef,\n watch,\n} from \"vue\";\nimport { FormFieldProps, Validator } from \"@/composables/validation.ts\";\nimport {\n Browser,\n consoleWarn,\n getNextId,\n isFunction,\n isString,\n wrapInArray,\n} from \"@/util\";\nimport { Form } from \"@/modules/Form/Form.ts\";\nimport { useToggleScope } from \"@/composables/toggleScope.ts\";\nimport { useModelProxy } from \"@/composables/modelProxy.ts\";\n\n/**\n * # Form Field\n */\nexport class FormField {\n public readonly focused: Ref<boolean>;\n\n public readonly focusedVisible: Ref<boolean>;\n\n private readonly messages: Ref<string[]> = ref([]);\n\n public readonly model: Ref<any>;\n\n public readonly pristine = shallowRef(true);\n\n public readonly uid = getNextId();\n\n public readonly validating = shallowRef(false);\n\n private readonly validationModel: Ref<any>;\n\n constructor(\n public readonly form: Form | null,\n private props: FormFieldProps,\n private group: FormField | undefined = undefined,\n ) {\n this.model = this.group\n ? this.group.model\n : useModelProxy(this.props, \"modelValue\");\n this.focused = useModelProxy(this.props, \"focused\");\n this.focusedVisible = ref(false);\n\n // We use a computed() Ref here for a valid watch()\n this.validationModel = computed(() => {\n return this.props.validationValue === undefined\n ? this.model.value\n : this.props.validationValue;\n });\n\n onBeforeMount(() => {\n this.form?.addField(this);\n });\n\n onBeforeUnmount(() => {\n this.form?.removeField(this.id);\n });\n\n onMounted(async () => {\n if (!this.validateOn.lazy) {\n await this.validate(true);\n }\n });\n\n useToggleScope(\n () => this.validateOn.input,\n () => {\n watch(this.validationModel, () => {\n if (this.validationModel.value != null) {\n this.validate();\n } else if (this.isFocused) {\n const unwatch = watch(\n () => this.focused.value,\n (value) => {\n if (!value) {\n this.validate();\n }\n unwatch();\n },\n );\n }\n });\n },\n );\n\n useToggleScope(\n () => this.validateOn.blur,\n () => {\n watch(\n () => this.focused.value,\n (value) => {\n if (!value) {\n this.validate();\n }\n },\n );\n },\n );\n }\n\n get classes() {\n return {\n \"is-error\": this.isValid === false,\n \"is-dirty\": this.isDirty,\n \"is-disabled\": this.isDisabled,\n \"is-readonly\": this.isReadonly,\n \"is-focused\": this.isFocused,\n \"is-focused-visible\": this.isFocusedVisible,\n };\n }\n\n get errorMessages() {\n return this.messages.value;\n }\n\n get id() {\n return this.props.id || `input-${this.uid}`;\n }\n\n get isDirty() {\n return !!(\n wrapInArray(this.model.value === \"\" ? null : this.model.value)\n .length ||\n wrapInArray(\n this.validationModel.value === \"\"\n ? null\n : this.validationModel.value,\n ).length\n );\n }\n\n get isDisabled(): boolean {\n return !!(\n this.props.disabled ??\n this.group?.isDisabled ??\n this.form?.isDisabled.value\n );\n }\n\n get isFocused(): boolean {\n return this.focused.value;\n }\n\n get isFocusedVisible(): boolean {\n return this.focusedVisible.value;\n }\n\n get isReadonly(): boolean {\n return !!(\n this.props.readonly ??\n this.group?.isReadonly ??\n this.form?.isReadonly.value\n );\n }\n\n get isPristine(): boolean {\n return this.pristine.value;\n }\n\n get isShowErrorMessages(): boolean {\n return !!this.errorMessages.length && !this.isPristine;\n }\n\n get isValid(): boolean | null {\n if (this.group && this.group.isValid === false) {\n return false;\n }\n if (this.props.error) {\n return false;\n }\n if (!this.props.validators.length) {\n return true;\n }\n if (this.isPristine) {\n return this.messages.value.length || this.validateOn.lazy\n ? null\n : true;\n } else {\n return !this.messages.value.length;\n }\n }\n\n get isValidating() {\n return this.validating.value;\n }\n\n get name(): string {\n return this.group?.name ?? this.props.name ?? this.id;\n }\n\n get validateOn() {\n let value =\n (this.props.validateOn ?? this.form?.validateOn.value) || \"input\";\n if (value === \"lazy\") {\n value = \"input lazy\";\n }\n const set = new Set(value?.split(\" \") ?? []);\n return {\n blur: set.has(\"blur\") || set.has(\"input\"),\n input: set.has(\"input\"),\n submit: set.has(\"submit\"),\n lazy: set.has(\"lazy\"),\n };\n }\n\n get value() {\n return this.model.value;\n }\n\n set value(value) {\n this.model.value = value;\n }\n\n /**\n * ## Add Error Message\n *\n * Add one or more validation messages to the field.\n *\n * @param message\n */\n public addErrorMessage(...message: string[]) {\n this.messages.value.push(...message);\n }\n\n /**\n * ## Add Validator\n *\n * Add one or more validation functions to the field.\n *\n * @param validator\n */\n public addValidator(...validator: Validator[]) {\n this.props.validators.push(...validator);\n }\n\n /**\n * ## Blur\n * @param e\n */\n public blur(): void {\n this.focused.value = false;\n this.focusedVisible.value = false;\n }\n\n /**\n * ## Expose\n */\n public expose() {\n return {\n reset: this.reset.bind(this),\n resetValidation: this.resetValidation.bind(this),\n validate: this.validate.bind(this),\n };\n }\n\n /**\n * ## Focus\n *\n * @param e\n */\n public focus(e?: Event): void {\n this.focused.value = true;\n const el = e?.target as HTMLElement;\n if (Browser.supportsFocusVisible && el?.matches(\":focus-visible\")) {\n this.focusedVisible.value = true;\n }\n }\n\n /**\n * ## Reset\n */\n public reset() {\n this.model.value = null;\n nextTick(() => {\n this.resetValidation();\n });\n }\n\n /**\n * ## Reset Validation\n */\n public resetValidation() {\n this.pristine.value = true;\n if (!this.validateOn.lazy) {\n this.validate(true);\n } else {\n this.messages.value = [];\n }\n }\n\n /**\n * ## Validate\n */\n public async validate(silent = false) {\n const results: string[] = [];\n this.validating.value = true;\n for (const validator of this.props.validators) {\n const validatorFn = isFunction(validator)\n ? validator\n : () => validator;\n const result = await validatorFn(this.validationModel.value);\n if (result === true) {\n continue;\n }\n if (!isString(result)) {\n consoleWarn(\n `${result} is not a valid value. Validator functions must return boolean true or a string.`,\n );\n continue;\n }\n results.push(result);\n }\n this.messages.value = results;\n this.validating.value = false;\n this.pristine.value = silent;\n return this.messages.value;\n }\n}\n","import { propsFactory } from \"@/util\";\nimport { PropType } from \"vue\";\nimport { makeFocusProps } from \"@/composables/focus.ts\";\nimport { useForm } from \"@/composables/form.ts\";\nimport { FormField } from \"@/modules/Form/FormField.ts\";\n\n/**\n * # Validation Error\n *\n * Represents a single error message with a name identifier.\n */\nexport interface ValidationError {\n name: number | string;\n message: string;\n}\n\n/**\n * # Validation Result\n */\nexport type ValidationResult = string | boolean;\n\n/**\n * # Validator\n */\nexport type Validator =\n | ValidationResult\n | PromiseLike<ValidationResult>\n | ((value: any) => ValidationResult)\n | ((value: any) => PromiseLike<ValidationResult>);\n\n/**\n * # Validate On Event\n */\nexport type ValidateOnEvent = \"blur\" | \"input\" | \"submit\";\n\n/**\n * # Form Field Props\n */\nexport interface FormFieldProps {\n id?: string;\n disabled?: boolean;\n error?: boolean;\n focused?: boolean;\n name?: string;\n readonly?: boolean;\n validators: Validator[];\n modelValue?: any;\n validateOn?:\n | ValidateOnEvent\n | `${ValidateOnEvent} lazy`\n | `lazy ${ValidateOnEvent}`\n | \"lazy\";\n validationValue?: any;\n}\n\n/**\n * # Make Form Field Props\n */\nexport const makeFormFieldProps = propsFactory(\n {\n id: String,\n disabled: Boolean,\n error: Boolean,\n name: String,\n readonly: Boolean,\n validators: {\n type: Array as PropType<FormFieldProps[\"validators\"]>,\n default: [],\n },\n modelValue: null,\n validateOn: String as PropType<FormFieldProps[\"validateOn\"]>,\n validationValue: null,\n\n ...makeFocusProps(),\n },\n \"validation\",\n);\n\n/**\n * # Use Form Field\n * @param props\n * @param group\n */\nexport function useFormField(\n props: FormFieldProps,\n group: FormField | undefined = undefined,\n) {\n const form = useForm();\n return new FormField(form, props, group);\n}\n","import { isDeepEqual, propsFactory } from \"@/util\";\nimport { makeFormFieldProps } from \"@/composables/validation.ts\";\nimport { makeComponentProps } from \"@/composables/component.ts\";\nimport { computed, ExtractPropTypes, PropType, Ref } from \"vue\";\n\n/**\n * # Make EvCheckbox Props\n */\nexport const makeEvCheckboxProps = propsFactory(\n {\n label: String,\n trueValue: null,\n falseValue: null,\n value: null,\n valueComparator: {\n type: Function as PropType<typeof isDeepEqual>,\n default: isDeepEqual,\n },\n\n ...makeFormFieldProps(),\n ...makeComponentProps(),\n },\n \"EvSwitch\",\n);\n\n/**\n * # Use Toggle Control\n *\n * @param modelProxy\n * @param props\n */\nexport function useToggleControl(\n modelProxy: Ref<any>,\n props: ExtractPropTypes<ReturnType<typeof makeEvCheckboxProps>>,\n) {\n /**\n * ## True Value\n */\n const trueValue = computed(() => {\n if (props.trueValue !== undefined) {\n return props.trueValue;\n }\n return props.value !== undefined ? props.value : true;\n });\n\n /**\n * ## False Value\n */\n const falseValue = computed(() => {\n return props.falseValue !== undefined ? props.falseValue : false;\n });\n\n /**\n * ## Is Checked\n */\n const isChecked = computed({\n get() {\n return props.valueComparator(modelProxy.value, trueValue.value);\n },\n set(value: boolean) {\n if (props.readonly) {\n return;\n }\n const currentValue = value ? trueValue.value : falseValue.value;\n const newValue = currentValue;\n // I might do some funky stuff here later for multi-selection and groups\n modelProxy.value = newValue;\n },\n });\n\n return {\n trueValue,\n falseValue,\n isChecked,\n };\n}\n","import { propsFactory } from \"@/util\";\nimport { makeComponentProps } from \"@/composables/component.ts\";\nimport { PropType } from \"vue\";\n\nexport const makeEvErrorsProps = propsFactory(\n {\n active: Boolean,\n messages: {\n type: [Array, String] as PropType<string | readonly string[]>,\n default: () => [],\n },\n\n ...makeComponentProps(),\n },\n \"EvErrors\",\n);\n","<script setup lang=\"ts\">\n/**\n * # EvErrors\n */\nimport \"./EvErrors.scss\";\nimport { makeEvErrorsProps } from \"./EvErrors.ts\";\nimport { computed } from \"vue\";\nimport { wrapInArray } from \"@/util\";\n\nconst props = defineProps({\n ...makeEvErrorsProps(),\n});\n\nconst messages = computed(() => {\n return wrapInArray(props.messages);\n});\n</script>\n\n<template>\n <TransitionGroup\n appear\n tag=\"div\"\n :class=\"['ev-errors', props.class]\"\n :style=\"props.style\"\n name=\"list\"\n role=\"alert\"\n aria-live=\"polite\">\n <div\n v-for=\"(message, index) in messages\"\n :key=\"message\"\n class=\"ev-errors--message\"\n :style=\"`--animation-order: ${index}`\">\n {{ message }}\n </div>\n </TransitionGroup>\n</template>\n","import { propsFactory } from \"@/util\";\nimport { makeComponentProps } from \"@/composables/component.ts\";\n\nexport const makeEvLabelProps = propsFactory(\n {\n text: String,\n clickable: Boolean,\n\n ...makeComponentProps(),\n },\n \"EvLabel\",\n);\n","<script setup lang=\"ts\">\n/**\n * # `<ev-checkbox>`\n */\nimport \"./EvCheckbox.scss\";\nimport { makeEvCheckboxProps, useToggleControl } from \"./EvCheckbox.ts\";\nimport { ref, useAttrs } from \"vue\";\nimport { splitInputAttrs } from \"@/util\";\nimport { EvErrors } from \"@/components/EvErrors\";\nimport { EvLabel } from \"@/components/EvLabel\";\nimport { useFormField } from \"@/composables/validation.ts\";\nimport { useDefaults } from \"@/composables\";\n\n/**\n * We want to pass attributes not defined as 'props'\n * to the `<input>` field, so we need to turn off `inheritAttrs`.\n */\ndefineOptions({\n inheritAttrs: false,\n});\n\n// Props & slots\nconst definedProps = defineProps({\n ...makeEvCheckboxProps(),\n});\nconst props = useDefaults(definedProps);\nconst slots = defineSlots<{\n label(): never;\n}>();\n\n// Emit\ndefineEmits([\"update:focused\", \"update:modelValue\"]);\n\nconst attrs = useAttrs();\nconst containerRef = ref<HTMLElement | null>(null);\nconst inputRef = ref<HTMLInputElement | null>(null);\nconst [containerAttrs, inputAttrs] = splitInputAttrs(attrs);\nconst formField = useFormField(props);\nconst { trueValue, isChecked } = useToggleControl(formField.model, props);\n\n/**\n * ## Get Input Element\n */\nfunction getInputElement(): HTMLInputElement | null {\n return inputRef.value;\n}\n\n/**\n * ## On Input\n * @param e\n */\nfunction onInput(e: Event) {\n isChecked.value = (e.target as HTMLInputElement).checked;\n}\n\n/**\n * ## Expose stuff\n */\ndefineExpose({\n input: inputRef,\n focus: () => {\n getInputElement()?.focus();\n },\n ...formField.expose(),\n});\n</script>\n\n<template>\n <div\n ref=\"containerRef\"\n :class=\"[\n 'ev-checkbox',\n {\n 'is-checked': isChecked,\n 'is-labelled': props.label || slots.label,\n },\n formField.classes,\n props.class,\n ]\"\n :style=\"props.style\"\n v-bind=\"containerAttrs\">\n <div class=\"ev-checkbox--control\">\n <div class=\"ev-checkbox--boxes\">\n <div class=\"ev-checkbox--outer-box\"></div>\n <div class=\"ev-checkbox--inner-box\">\n <svg\n class=\"ev-checkbox--checkmark\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n class=\"ev-checkbox--checkmark-path\"\n d=\"M3 7.5L6.5 11L13.5 4\"\n stroke=\"currentColor\"\n stroke-width=\"2\" />\n </svg>\n </div>\n </div>\n\n <input\n :id=\"formField.id\"\n ref=\"inputRef\"\n type=\"checkbox\"\n role=\"switch\"\n :name=\"formField.name\"\n :disabled=\"formField.isDisabled\"\n :readonly=\"formField.isReadonly\"\n :checked=\"isChecked\"\n :value=\"trueValue\"\n :aria-disabled=\"formField.isDisabled\"\n :aria-checked=\"isChecked\"\n v-bind=\"inputAttrs\"\n @input=\"onInput\"\n @focus=\"formField.focus\"\n @blur=\"formField.blur\" />\n </div>\n\n <div v-if=\"props.label || slots.label\" class=\"ev-checkbox--label\">\n <ev-label :for=\"formField.id\" clickable>\n <slot name=\"label\">{{ props.label }}</slot>\n </ev-label>\n\n <div\n v-if=\"formField.isShowErrorMessages\"\n class=\"ev-checkbox--errors\">\n <ev-errors :messages=\"formField.errorMessages\" />\n </div>\n </div>\n </div>\n</template>\n","import { propsFactory } from \"@/util\";\nimport { PropType } from \"vue\";\n\nexport type SelectionModeProp = \"single\" | \"multiple\" | \"range\";\n\n// type ModelValueProp = Array\n\nexport const makeEvDatePickerMonthProps = propsFactory(\n {\n allowedDates: [Array, Function],\n max: null as any as PropType<unknown>,\n min: null as any as PropType<unknown>,\n modelValue: [Array, String, Date],\n month: [Number, String],\n selectionMode: {\n type: String as PropType<SelectionModeProp>,\n default: \"single\",\n },\n showAdjacentMonths: {\n type: Boolean,\n default: true,\n },\n year: [Number, String],\n },\n \"EvDatePickerMonth\",\n);\n\n/**\n * # Day\n * Represents data used for rendering days in the month.\n */\nexport interface Day {\n date: Date;\n isoDate: string;\n formatted: string;\n year: number;\n month: number;\n isDisabled: boolean;\n isWeekStart: boolean;\n isWeekEnd: boolean;\n isSelected: boolean;\n isToday: boolean;\n isAdjacent: boolean;\n isInRange: boolean;\n isRangeStart: boolean;\n isRangeEnd: boolean;\n isHidden: boolean;\n isHovered: boolean;\n localized: string;\n}\n","<script setup lang=\"ts\">\n/**\n * # `<ev-date-picker-month>`\n */\nimport \"./EvDatePickerMonth.scss\";\nimport { Day, makeEvDatePickerMonthProps } from \"./EvDatePickerMonth.ts\";\nimport { useDate } from \"@/composables/date/date.ts\";\nimport { useModelProxy } from \"@/composables/modelProxy.ts\";\nimport { wrapInArray } from \"@/util\";\nimport { computed, watch } from \"vue\";\nimport { EvButton } from \"@/components/EvButton\";\n\nconst props = defineProps({\n ...makeEvDatePickerMonthProps(),\n});\nconst dateAdapter = useDate();\ndefineEmits([\"update:modelValue\", \"update:month\", \"update:year\"]);\n\n/**\n * The `modelValue` is always provided from the parent component as an array\n * and leaves as an array if `multiple` is `true`.\n */\nconst modelValue = useModelProxy(props, \"modelValue\", [], (value) =>\n wrapInArray(value),\n);\n\nconst displayValue = computed(() => {\n if (modelValue.value.length > 0) {\n return dateAdapter.date(modelValue.value[0]);\n }\n if (props.min) {\n return dateAdapter.date(props.min);\n }\n if (Array.isArray(props.allowedDates)) {\n return dateAdapter.date(props.allowedDates[0]);\n }\n return dateAdapter.date();\n});\n\n// YEAR\nconst year = useModelProxy(\n props,\n \"year\",\n undefined,\n (v) => {\n const value =\n v != null ? Number(v) : dateAdapter.getYear(displayValue.value);\n return dateAdapter.startOfYear(\n dateAdapter.setYear(dateAdapter.date(), value),\n );\n },\n (v) => dateAdapter.getYear(v),\n);\n\n// MONTH\nconst month = useModelProxy(\n props,\n \"month\",\n undefined,\n (v) => {\n const value =\n v != null ? Number(v) : dateAdapter.getMonth(displayValue.value);\n let date = dateAdapter.startOfMonth(dateAdapter.date());\n date = dateAdapter.setYear(date, dateAdapter.getYear(year.value));\n return dateAdapter.setMonth(date, value);\n },\n (v) => dateAdapter.getMonth(v),\n);\n\n/**\n * ## Weeks in Month\n */\nconst weeksInMonth = computed(() => {\n const weeks = dateAdapter.getWeekArray(month.value);\n const days = weeks.flat();\n const daysInMonth = 6 * 7;\n if (days.length < daysInMonth) {\n const lastDay = days[days.length - 1];\n let week = [];\n for (let day = 1; day <= daysInMonth - days.length; day++) {\n week.push(dateAdapter.addDays(lastDay, day));\n if (day % 7 === 0) {\n weeks.push(week);\n week = [];\n }\n }\n }\n return weeks;\n});\n\n/**\n * ## Days in Month\n */\nconst daysInMonth = computed(() => {\n const days = weeksInMonth.value.flat();\n const today = dateAdapter.date();\n return days.map((date, index) => {\n const isoDate = dateAdapter.toISO(date);\n const isAdjacent = !dateAdapter.isSameMonth(date, month.value);\n const isInRange =\n props.selectionMode === \"range\" &&\n modelValue.value[0] &&\n dateAdapter.isAfter(date, modelValue.value[0]) &&\n modelValue.value[1] &&\n dateAdapter.isBefore(date, modelValue.value[1]);\n const isRangeStart =\n props.selectionMode === \"range\" &&\n modelValue.value[0] &&\n dateAdapter.isSameDay(date, modelValue.value[0]);\n const isRangeEnd =\n props.selectionMode === \"range\" &&\n modelValue.value[1] &&\n dateAdapter.isSameDay(date, modelValue.value[1]);\n return {\n date,\n isoDate,\n formatted: dateAdapter.format(date, \"keyboardDate\"),\n year: dateAdapter.getYear(date),\n month: dateAdapter.getMonth(date),\n isDisabled: isDisabled(date),\n isWeekStart: index % 7 === 0,\n isWeekEnd: index % 7 === 6,\n isSelected: modelValue.value.some((value: any) =>\n dateAdapter.isSameDay(date, value),\n ),\n isToday: dateAdapter.isSameDay(date, today),\n isAdjacent,\n isInRange,\n isRangeStart,\n isRangeEnd,\n isHidden: isAdjacent && !props.showAdjacentMonths,\n isHovered: false,\n localized: dateAdapter.format(date, \"dayOfMonth\"),\n } as Day;\n });\n});\n\n/**\n * ## isDisabled\n */\nfunction isDisabled(value: unknown) {\n const date = dateAdapter.date(value);\n if (props.min && dateAdapter.isBefore(date, props.min)) {\n return true;\n }\n if (props.max && dateAdapter.isAfter(date, props.max)) {\n return true;\n }\n if (Array.isArray(props.allowedDates)) {\n return !props.allowedDates.some((allowedDate) => {\n return dateAdapter.isSameDay(dateAdapter.date(allowedDate), date);\n });\n }\n if (typeof props.allowedDates === \"function\") {\n return !props.allowedDates(date);\n }\n return false;\n}\n\n/**\n * ## Get Day Appearance\n * @param day\n */\nfunction getDayAppearance(day: Day) {\n return day.isSelected || day.isInRange || day.isToday\n ? \"primary\"\n : \"default\";\n}\n\n/**\n * ## Get Day Variant\n * @param day\n */\nfunction getDayVariant(day: Day) {\n if (day.isSelected || day.isInRange) {\n return \"bold\";\n }\n if (day.isToday) {\n return \"tonal\";\n }\n return \"subtle\";\n}\n\n/**\n * ## On Click Event\n * @param date\n */\nfunction onClick(date: Date) {\n if (props.selectionMode === \"range\") {\n const startDate = modelValue.value[0];\n const endDate = modelValue.value[1];\n if (startDate && !endDate && date.getTime() >= startDate.getTime()) {\n modelValue.value = [startDate, date];\n } else if (endDate && date.getTime() >= endDate.getTime()) {\n modelValue.value = [startDate, date];\n } else {\n modelValue.value = [date];\n }\n } else if (props.selectionMode === \"multiple\") {\n const index = modelValue.value.findIndex((selection: any) =>\n dateAdapter.isSameDay(selection, date),\n );\n if (index === -1) {\n modelValue.value = [...modelValue.value, date];\n } else {\n const value = [...modelValue.value];\n value.splice(index, 1);\n modelValue.value = value;\n }\n } else {\n modelValue.value = [date];\n }\n}\n\nwatch(displayValue, (value) => {\n month.value = value;\n year.value = value;\n});\n</script>\n\n<template>\n <div\n :class=\"[\n 'ev-date-picker-month',\n {\n 'is-select-single': props.selectionMode === 'single',\n 'is-select-multiple': props.selectionMode === 'multiple',\n 'is-select-range': props.selectionMode === 'range',\n },\n ]\">\n <div class=\"ev-date-picker-month--days\">\n <div\n v-for=\"weekDay in dateAdapter.getWeekdays()\"\n :key=\"weekDay\"\n class=\"ev-date-picker-month--weekday\">\n {{ weekDay }}\n </div>\n\n <div\n v-for=\"day in daysInMonth\"\n :key=\"day.isoDate\"\n :class=\"[\n 'ev-date-picker-month--day',\n {\n 'is-adjacent': day.isAdjacent,\n 'is-adjacent-hidden': day.isHidden,\n 'is-selected': day.isSelected,\n 'is-week-end': day.isWeekEnd,\n 'is-week-start': day.isWeekStart,\n 'is-range-start': day.isRangeStart,\n 'is-range-within': day.isInRange,\n 'is-range-end': day.isRangeEnd,\n },\n ]\">\n <ev-button\n v-if=\"!day.isHidden\"\n rounded\n :icon=\"true\"\n :disabled=\"day.isDisabled\"\n :appearance=\"getDayAppearance(day)\"\n :variant=\"getDayVariant(day)\"\n :text=\"day.localized\"\n @click=\"onClick(day.date)\" />\n </div>\n </div>\n </div>\n</template>\n","import { propsFactory } from \"@/util\";\nimport { PropType } from \"vue\";\n\nexport const makeEvDatePickerYearsProps = propsFactory(\n {\n min: null as any as PropType<unknown>,\n max: null as any as PropType<unknown>,\n modelValue: Number,\n },\n \"EvDatePickerYears\",\n);\n","import { inject, InjectionKey, provide, Ref, shallowRef } from \"vue\";\n\n/**\n * # List Key\n */\nexport const ListKey: InjectionKey<{\n hasPrepend: Ref<boolean>;\n updateHasPrepend: (value: boolean) => void;\n}> = Symbol.for(\"ev:list\");\n\n/**\n * # Create List\n * @see useList\n */\nexport function createList() {\n const defaultValue = {\n hasPrepend: shallowRef(false),\n updateHasPrepend: () => null,\n };\n const parent = inject(ListKey, defaultValue);\n const data = {\n hasPrepend: shallowRef(false),\n updateHasPrepend: (value: boolean) => {\n if (value) {\n data.hasPrepend.value = value;\n }\n },\n };\n provide(ListKey, data);\n return parent;\n}\n\n/**\n * # Use List\n *\n * @see createList\n */\nexport function useList() {\n return inject(ListKey, null);\n}\n","import {\n getPropertyValue,\n GetterPropertyKey,\n isArray,\n isDeepEqual,\n isObject,\n omit,\n propsFactory,\n} from \"@/util\";\nimport { computed, PropType } from \"vue\";\nimport { ListItemProps } from \"@/components/EvList\";\n\n/**\n * # List Item\n */\nexport interface ListItem<T = any> {\n key: number;\n title: string;\n value: any;\n props: {\n [key: string]: any;\n title: string;\n value: any;\n };\n children?: ListItem<T>[];\n raw: T;\n}\n\n/**\n * # List Item Key\n *\n * Defines where to look for item information.\n *\n * For example: each Item might have a `title` property.\n * So an Item key may represent either an array index, or an object property.\n *\n * - `boolean` - Ignored\n * - `string` - Property name, or use Object path notation.\n * - `array` of strings or numbers represent nested lookup - each array element represents a key in the hierarchy\n */\nexport type ListItemKey = GetterPropertyKey;\n\n/**\n * # List Items Props\n *\n * - `items` - the array of items to render within a list.\n * - `item-title` - the title property/key to use as the title in each list item.\n * - `item-value` - the value property/key to use for selection per list item.\n * - `item-props` - the props to assign to each list item.\n * - `return-object` - return the full item object on selection if `true`, or the `item-value` if `false`.\n */\nexport interface ListItemsProps {\n items: any[];\n itemTitle: ListItemKey;\n itemValue: ListItemKey;\n itemChildren: ListItemKey;\n itemProps: ListItemKey;\n returnObject: boolean;\n valueComparator: typeof isDeepEqual;\n}\n\n/**\n * # Make List Items Props\n *\n * Applies `ListItemProps` with the following defaults:\n *\n * - `items` - a blank array.\n * - `item-title` - 'title'\n * - `item-value` - 'value'\n * - `item-children` - 'children'\n * - `item-props` - 'props'\n * - `return-object` - `false`\n *\n * @see ListItemsProps\n */\nexport const makeListItemsProps = propsFactory(\n {\n items: {\n type: Array as PropType<ListItemsProps[\"items\"]>,\n default: () => [],\n },\n itemTitle: {\n type: [String, Array, Function] as PropType<ListItemKey>,\n default: \"title\",\n },\n itemValue: {\n type: [String, Array, Function] as PropType<ListItemKey>,\n default: \"value\",\n },\n itemChildren: {\n type: [Boolean, String, Array, Function] as PropType<ListItemKey>,\n default: \"children\",\n },\n itemProps: {\n type: [Boolean, String, Array, Function] as PropType<ListItemKey>,\n default: \"props\",\n },\n returnObject: Boolean,\n valueComparator: {\n type: Function as PropType<typeof isDeepEqual>,\n default: isDeepEqual,\n },\n },\n \"list-items\",\n);\n\n// Tracks unique item Ids\nlet lastItemKey = 0;\n\n/**\n * # Transform Item\n *\n * @param props\n * @param item\n */\nexport function transformItem(\n props: Omit<ListItemProps, \"items\">,\n item: any,\n): ListItem {\n const title = getPropertyValue(item, props.itemTitle, item);\n const value = getPropertyValue(item, props.itemValue, title);\n const children = getPropertyValue(item, props.itemChildren);\n const itemProps =\n props.itemProps === true\n ? isObject(item) && item != null && !isArray(item)\n ? \"children\" in item\n ? omit(item, [\"children\"])\n : item\n : undefined\n : getPropertyValue(item, props.itemProps);\n\n const transformedItemProps = {\n title,\n value,\n ...itemProps,\n };\n\n return {\n key: ++lastItemKey,\n title: String(transformedItemProps.title ?? \"\"),\n value: transformedItemProps.value,\n props: transformedItemProps,\n children: isArray(children)\n ? transformItems(props, children)\n : undefined,\n raw: item,\n };\n}\n\n/**\n * # Transform Items\n */\nexport function transformItems(\n props: Omit<ListItemProps, \"items\">,\n items: ListItemProps[\"items\"],\n) {\n const listItems: ListItem[] = [];\n for (const item of items) {\n listItems.push(transformItem(props, item));\n }\n return listItems;\n}\n\n/**\n * # Use Items\n *\n * @param props\n */\nexport function useItems(props: any) {\n const items = computed(() => {\n return transformItems(props, props.items);\n });\n\n const hasNullItem = computed(() => {\n return items.value.some((item) => item.value === null);\n });\n\n function transformIn(value: any[]): ListItem[] {\n if (!hasNullItem.value) {\n // When the model value is null, return an ListItem\n // based on null only if null is one of the items\n value = value.filter((v) => v !== null);\n }\n\n return value.map((v) => {\n if (props.returnObject && typeof v === \"string\") {\n // String model value means value is a custom input value\n // Don't look up existing items if the model value is a string\n return transformItem(props, v);\n }\n return (\n items.value.find((item) =>\n props.valueComparator(v, item.value),\n ) || transformItem(props, v)\n );\n });\n }\n\n function transformOut(value: ListItem[]): any[] {\n return props.returnObject\n ? value.map(({ raw }) => raw)\n : value.map(({ value }) => value);\n }\n\n return { items, transformIn, transformOut };\n}\n","import { SelectStrategy } from \"@/composables/lists\";\nimport { toRaw } from \"vue\";\n\n/**\n * # Cascade Leaf Select Strategy\n *\n * This is the equivalent of Vuetify's classic select strategy.\n *\n * Selecting a parent node will cause all children to be selected,\n * parent nodes will be displayed as selected if all their descendants\n * are selected. Only leaf nodes will be added to the model.\n *\n * @param isRequired\n */\nexport const cascadeLeaf = (isRequired?: boolean): SelectStrategy => {\n const strategy: SelectStrategy = {\n select: ({ id, value, selected, children, parents }) => {\n id = toRaw(id);\n const original = new Map(selected);\n\n const items = [id];\n\n while (items.length) {\n const item = items.shift()!;\n\n selected.set(item, value ? \"on\" : \"off\");\n\n if (children.has(item)) {\n items.push(...children.get(item)!);\n }\n }\n\n let parent = parents.get(id);\n\n while (parent) {\n const childrenIds = children.get(parent)!;\n const everySelected = childrenIds.every(\n (cid) => selected.get(cid) === \"on\",\n );\n const noneSelected = childrenIds.every(\n (cid) => !selected.has(cid) || selected.get(cid) === \"off\",\n );\n\n selected.set(\n parent,\n everySelected\n ? \"on\"\n : noneSelected\n ? \"off\"\n : \"indeterminate\",\n );\n\n parent = parents.get(parent);\n }\n\n // If mandatory and planned deselect results in no selected\n // items then we can't do it, so return original state\n if (isRequired && !value) {\n const on = Array.from(selected.entries()).reduce(\n (arr, [key, value]) =>\n value === \"on\" ? [...arr, key] : arr,\n [] as unknown[],\n );\n if (on.length === 0) {\n return original;\n }\n }\n\n return selected;\n },\n in: (values: any, children, parents) => {\n let map = new Map();\n for (const id of values || []) {\n map = strategy.select({\n id,\n value: true,\n selected: new Map(map),\n children,\n parents,\n });\n }\n return map;\n },\n out: (values, children) => {\n const arr = [];\n for (const [key, value] of values.entries()) {\n if (value === \"on\" && !children.has(key)) {\n arr.push(key);\n }\n }\n return arr;\n },\n };\n\n return strategy;\n};\n","import {\n Selected,\n SelectStrategy,\n SelectStrategyData,\n SelectStrategyFn,\n SelectTransformInFn,\n SelectTransformOutFn,\n} from \"@/composables/lists\";\nimport { toRaw } from \"vue\";\n\n/**\n * # Multi Any\n *\n * Any node may be selected regardless of whether it has children.\n *\n * @param isRequired\n */\nexport const multiAny = (isRequired?: boolean): SelectStrategy => {\n const selectFn: SelectStrategyFn = (data: SelectStrategyData) => {\n const id = toRaw(data.id);\n if (isRequired && !data.value) {\n const reducer = (arr: any, [key, value]: [unknown, Selected]) => {\n return value === \"on\" ? [...arr, key] : arr;\n };\n const on = Array.from(data.selected.entries()).reduce(reducer, []);\n if (on.length === 1 && on[0] === id) {\n return data.selected;\n }\n }\n data.selected.set(id, data.value ? \"on\" : \"off\");\n return data.selected;\n };\n\n const transformIn: SelectTransformInFn = (\n values: any,\n children,\n parents,\n ) => {\n let map = new Map();\n for (const id of values || []) {\n map = selectFn({\n id,\n value: true,\n selected: new Map(map),\n children,\n parents,\n });\n }\n return map;\n };\n\n const transformOut: SelectTransformOutFn = (values) => {\n const selections = [];\n for (const [key, value] of values.entries()) {\n if (value === \"on\") {\n selections.push(key);\n }\n }\n return selections;\n };\n\n return {\n select: selectFn,\n in: transformIn,\n out: transformOut,\n };\n};\n","import { SelectStrategy } from \"@/composables/lists\";\nimport { multiAny } from \"./multi-any.ts\";\nimport { toRaw } from \"vue\";\n\n/**\n * # Multi-Leaf Select Strategy\n *\n * Only leaf nodes (items without children) can be selected.\n *\n * @param isRequired\n */\nexport const multiLeaf = (isRequired?: boolean): SelectStrategy => {\n const parentStrategy = multiAny(isRequired);\n\n return {\n select: ({ id, selected, children, ...rest }) => {\n id = toRaw(id);\n if (children.has(id)) {\n return selected;\n }\n return parentStrategy.select({ id, selected, children, ...rest });\n },\n in: parentStrategy.in,\n out: parentStrategy.out,\n };\n};\n","import {\n SelectStrategy,\n SelectStrategyData,\n SelectStrategyFn,\n SelectTransformInFn,\n SelectTransformOutFn,\n} from \"@/composables/lists\";\nimport { multiAny } from \"./multi-any.ts\";\nimport { toRaw } from \"vue\";\n\n/**\n * # Single Any\n *\n * One node may be selected, regardless of whether the node has children.\n *\n * @param isRequired\n */\nexport const singleAny = (isRequired?: boolean): SelectStrategy => {\n const parentStrategy = multiAny(isRequired);\n\n const selectFn: SelectStrategyFn = (data: SelectStrategyData) => {\n const id = toRaw(data.id);\n const singleSelection =\n data.selected.has(id) || isRequired\n ? new Map([[id, data.selected.get(id)!]])\n : new Map();\n return parentStrategy.select({\n ...data,\n id: id,\n selected: singleSelection,\n });\n };\n\n const transformIn: SelectTransformInFn = (values, children, parents) => {\n let map = new Map();\n if (Array.isArray(values) && values.length) {\n map = parentStrategy.in(values.slice(0, 1), children, parents);\n }\n return map;\n };\n\n const transformOut: SelectTransformOutFn = (values, children, parents) => {\n return parentStrategy.out(values, children, parents);\n };\n\n return {\n select: selectFn,\n in: transformIn,\n out: transformOut,\n };\n};\n","import { SelectStrategy } from \"@/composables/lists\";\nimport { singleAny } from \"./single-any.ts\";\nimport { toRaw } from \"vue\";\n\n/**\n * # Single Leaf Select Strategy\n *\n * Only one leaf node (items without children) can be selected.\n *\n * @param isRequired\n */\nexport const singleLeaf = (isRequired?: boolean): SelectStrategy => {\n const parentStrategy = singleAny(isRequired);\n\n return {\n select: ({ id, selected, children, ...rest }) => {\n id = toRaw(id);\n if (children.has(id)) {\n return selected;\n }\n return parentStrategy.select({ id, selected, children, ...rest });\n },\n in: parentStrategy.in,\n out: parentStrategy.out,\n };\n};\n","import { computed, ComputedRef, PropType, Ref } from \"vue\";\nimport { isFunction, isObject, propsFactory } from \"@/util\";\nimport {\n cascadeLeaf,\n multiAny,\n multiLeaf,\n singleLeaf,\n} from \"./select-strategy\";\nimport { singleAny } from \"./select-strategy/single-any.ts\";\n\n/**\n * # Select Strategy\n */\nexport type SelectStrategy = {\n select: SelectStrategyFn;\n in: SelectTransformInFn;\n out: SelectTransformOutFn;\n};\n\n/**\n * # Selected\n */\nexport type Selected = \"on\" | \"off\" | \"indeterminate\";\n\n/**\n * # Select Strategy Data\n */\nexport interface SelectStrategyData {\n id: unknown;\n value: boolean;\n selected: Map<unknown, Selected>;\n children: Map<unknown, unknown[]>;\n parents: Map<unknown, unknown>;\n event?: Event;\n}\n\n/**\n * # Select Strategy Function\n */\nexport type SelectStrategyFn = (\n data: SelectStrategyData,\n) => Map<unknown, Selected>;\n\n/**\n * # Select Strategy Reference\n * Recognised selection strategy strings.\n */\nexport type SelectStrategyRef =\n | \"cascade-leaf\"\n | \"multi-any\"\n | \"multi-leaf\"\n | \"single-any\"\n | \"single-leaf\";\n\n/**\n * # Select Strategy Props\n * Defines the `props` required by components to be able to use `SelectStrategy`.\n */\nexport interface SelectStrategyProps {\n selectStrategy?: SelectStrategyRef | SelectStrategyFn;\n selected?: readonly unknown[];\n required?: boolean;\n \"onUpdate:selected\"?: ((values: unknown[]) => void) | undefined;\n}\n\n/**\n * # Select Transform In\n */\nexport type SelectTransformInFn = (\n values: readonly unknown[] | unknown,\n children: Map<unknown, unknown[]>,\n parents: Map<unknown, unknown>,\n) => Map<unknown, Selected>;\n\n/**\n * # Select Transform Out\n */\nexport type SelectTransformOutFn = (\n values: Map<unknown, Selected>,\n children: Map<unknown, unknown[]>,\n parents: Map<unknown, unknown>,\n) => unknown[];\n\n/**\n * # Make Selected Props\n */\nexport const makeSelectedProps = propsFactory(\n {\n selectStrategy: [String, Function] as PropType<\n SelectStrategyRef | SelectStrategyFn\n >,\n selected: Array as PropType<readonly unknown[]>,\n required: Boolean,\n },\n \"select-strategies\",\n);\n\n/**\n * # Use Select Strategy\n * @param props\n */\nexport function useSelectStrategy(\n props: SelectStrategyProps,\n): ComputedRef<SelectStrategy> {\n return computed(() => {\n if (\n isObject(props.selectStrategy) &&\n !isFunction(props.selectStrategy)\n ) {\n return props.selectStrategy as SelectStrategy;\n }\n switch (props.selectStrategy) {\n case \"single-leaf\":\n return singleLeaf(props.required);\n case \"single-any\":\n return singleAny(props.required);\n case \"multi-leaf\":\n return multiLeaf(props.required);\n case \"multi-any\":\n return multiAny(props.required);\n case \"cascade-leaf\":\n default:\n return cascadeLeaf(props.required);\n }\n });\n}\n\n/**\n * # Use Selected Values\n * @param selected\n */\nexport function useSelectedValues(selected: Ref<Map<unknown, Selected>>) {\n return computed(() => {\n const values = [];\n for (const [key, value] of selected.value.entries()) {\n if (value === \"on\") {\n values.push(key);\n }\n }\n return values;\n });\n}\n","import { OpenStrategy } from \"../open-strategies\";\n\n/**\n * # Single Open Strategy\n */\nexport const singleOpenStrategy: OpenStrategy = {\n open: ({ id, value, opened, parents }) => {\n if (value) {\n const newOpened = new Set<unknown>();\n newOpened.add(id);\n let parent = parents.get(id);\n while (parent != null) {\n newOpened.add(parent);\n parent = parents.get(parent);\n }\n return newOpened;\n }\n opened.delete(id);\n return opened;\n },\n select: () => null,\n};\n","import { OpenStrategy } from \"../open-strategies\";\n\n/**\n * # Multiple Open Strategy\n */\nexport const multipleOpenStrategy: OpenStrategy = {\n open: ({ id, value, opened, parents }) => {\n if (value) {\n let parent = parents.get(id);\n opened.add(id);\n while (parent != null && parent !== id) {\n opened.add(parent);\n parent = parents.get(parent);\n }\n return opened;\n }\n opened.delete(id);\n return opened;\n },\n select: () => null,\n};\n","import { OpenStrategy } from \"../open-strategies\";\nimport { multipleOpenStrategy } from \"./multiple\";\n\n/**\n * # List Open Strategy\n */\nexport const listOpenStrategy: OpenStrategy = {\n open: multipleOpenStrategy.open,\n select: ({ id, value, opened, parents }) => {\n if (!value) {\n return opened;\n }\n const path: unknown[] = [];\n let parent = parents.get(id);\n while (parent != null) {\n path.push(parent);\n parent = parents.get(parent);\n }\n return new Set(path);\n },\n};\n","import { Selected } from \"@/composables/lists/select-strategies.ts\";\nimport { EventProp, isObject, propsFactory } from \"@/util\";\nimport { computed, ComputedRef, PropType } from \"vue\";\nimport {\n listOpenStrategy,\n multipleOpenStrategy,\n singleOpenStrategy,\n} from \"@/composables/lists/open-strategy\";\n\n/**\n * # Open Strategy\n */\nexport type OpenStrategy = {\n open: OpenStrategyFn;\n select: OpenSelectStrategyFn;\n};\n\n/**\n * # Open Strategy Data\n */\nexport interface OpenStrategyData {\n id: unknown;\n value: boolean;\n opened: Set<unknown>;\n children: Map<unknown, unknown[]>;\n parents: Map<unknown, unknown>;\n event?: Event;\n}\n\n/**\n * # Open Strategy Function\n */\nexport type OpenStrategyFn = (data: OpenStrategyData) => Set<unknown>;\n\n/**\n * # Open Select Strategy Data\n */\nexport interface OpenSelectStrategyData extends OpenStrategyData {\n selected: Map<unknown, Selected>;\n}\n\n/**\n * # Open Select Strategy Function\n */\nexport type OpenSelectStrategyFn = (\n data: OpenSelectStrategyData,\n) => Set<unknown> | null;\n\n/**\n * # Open Strategy Reference\n * Recognised open strategy strings.\n */\nexport type OpenStrategyRef = \"single\" | \"multiple\" | \"list\";\nexport type OpenStrategyProp = OpenStrategyRef | OpenStrategy;\n\n/**\n * # Open Strategy Props\n * Defines the `props` required by components to be able to use `OpenStrategy`.\n */\nexport interface OpenStrategyProps {\n openStrategy?: OpenStrategyProp;\n opened?: readonly unknown[];\n \"onUpdate:opened\"?: EventProp<[unknown[]]>;\n}\n\n/**\n * # Make Open Strategy Props\n */\nexport const makeOpenStrategyProps = propsFactory(\n {\n openStrategy: [String, Object] as PropType<\n OpenStrategyRef | OpenStrategy\n >,\n opened: Array as PropType<readonly unknown[]>,\n },\n \"open-strategies\",\n);\n\n/**\n * # Use Open Strategy\n * @param props\n */\nexport function useOpenStrategy(\n props: OpenStrategyProps,\n): ComputedRef<OpenStrategy> {\n return computed(() => {\n if (isObject(props.openStrategy)) {\n return props.openStrategy as OpenStrategy;\n }\n switch (props.openStrategy) {\n case \"list\":\n return listOpenStrategy;\n case \"single\":\n return singleOpenStrategy;\n case \"multiple\":\n default:\n return multipleOpenStrategy;\n }\n });\n}\n","import { SequencedPosition } from \"./sequenced.ts\";\nimport {\n makeSelectedProps,\n Selected,\n SelectStrategyProps,\n useSelectedValues,\n useSelectStrategy,\n} from \"./select-strategies.ts\";\nimport {\n computed,\n inject,\n InjectionKey,\n onBeforeMount,\n onBeforeUnmount,\n provide,\n Ref,\n ref,\n shallowRef,\n toRaw,\n} from \"vue\";\nimport { getCurrentComponent, getNextId, propsFactory } from \"@/util\";\nimport { useModelProxy } from \"../modelProxy.ts\";\nimport {\n makeOpenStrategyProps,\n OpenStrategyProps,\n useOpenStrategy,\n} from \"@/composables/lists/open-strategies.ts\";\n\n/**\n * # Nested Position\n *\n * Typically applies to requests to move a node within the nested data set.\n *\n * 'inside' - Position a node as a child of another node\n */\nexport type NestedPosition = SequencedPosition & \"inside\";\n\nexport interface NestedProps extends SelectStrategyProps, OpenStrategyProps {}\n\ntype NestedProvide = {\n id: Ref<unknown>;\n isGroupActivator?: boolean;\n root: {\n children: Ref<Map<unknown, unknown[]>>;\n parents: Ref<Map<unknown, unknown>>;\n opened: Ref<Set<unknown>>;\n select: (id: unknown, value: boolean, event?: Event) => void;\n selected: Ref<Map<unknown, Selected>>;\n selectedValues: Ref<unknown[]>;\n register: (id: unknown, parentId: unknown, isGroup?: boolean) => void;\n unregister: (id: unknown) => void;\n open: (id: unknown, value: boolean, event?: Event) => void;\n openOnSelect: (id: unknown, value: boolean, event?: Event) => void;\n };\n};\n\nexport const EvNestedSymbol: InjectionKey<NestedProvide> =\n Symbol.for(\"ev:nested\");\n\n/**\n * # Empty Nested List\n */\nexport const emptyNestedList: NestedProvide = {\n id: shallowRef(),\n root: {\n children: ref(new Map()),\n parents: ref(new Map()),\n opened: ref(new Set()),\n select: () => null,\n selected: ref(new Map()),\n selectedValues: ref([]),\n register: () => null,\n unregister: () => null,\n open: () => null,\n openOnSelect: () => null,\n },\n};\n\n/**\n * # Make Nested Props\n */\nexport const makeNestedProps = propsFactory(\n {\n ...makeSelectedProps(),\n ...makeOpenStrategyProps(),\n },\n \"nested\",\n);\n\n/**\n * # Use Nested List\n * @param props\n */\nexport const useNestedList = (props: NestedProps) => {\n let isUnmounted = false;\n const component = getCurrentComponent(\"nested\");\n const children = ref(new Map<unknown, unknown[]>());\n const parents = ref(new Map<unknown, unknown>());\n const selectStrategy = useSelectStrategy(props);\n const selected: Ref<Map<unknown, Selected>> = useModelProxy(\n props,\n \"selected\",\n props.selected,\n (values) => {\n return selectStrategy.value.in(\n values,\n children.value,\n parents.value,\n );\n },\n (values) => {\n return selectStrategy.value.out(\n values,\n children.value,\n parents.value,\n );\n },\n );\n const openStrategy = useOpenStrategy(props);\n const opened = useModelProxy(\n props,\n \"opened\",\n props.opened,\n (values) => {\n return new Set(values);\n },\n (values) => {\n return [...values.values()];\n },\n );\n\n onBeforeMount(() => {\n isUnmounted = true;\n });\n\n function getPath(id: unknown) {\n const path: unknown[] = [];\n let parent: unknown = id;\n while (parent != null) {\n path.unshift(parent);\n parent = parents.value.get(parent);\n }\n return path;\n }\n\n const nested: NestedProvide = {\n id: shallowRef(),\n root: {\n children: children,\n parents: parents,\n selected: selected,\n selectedValues: useSelectedValues(selected),\n select: (id, value, event) => {\n component.emit(\"click:select\", {\n id,\n value,\n path: getPath(id),\n event,\n });\n const newSelected = selectStrategy.value.select({\n id,\n value,\n selected: new Map(selected.value),\n children: children.value,\n parents: parents.value,\n event,\n });\n newSelected && (selected.value = newSelected);\n\n nested.root.openOnSelect(id, value, event);\n },\n register: (id, parentId, isGroup) => {\n parentId && id !== parentId && parents.value.set(id, parentId);\n if (isGroup) {\n children.value.set(id, []);\n }\n if (parentId != null) {\n children.value.set(parentId, [\n ...(children.value.get(parentId) || []),\n id,\n ]);\n }\n },\n unregister: (id) => {\n if (isUnmounted) {\n return;\n }\n children.value.delete(id);\n const parent = parents.value.get(id);\n if (parent) {\n const list = children.value.get(parent) ?? [];\n children.value.set(\n parent,\n list.filter((child) => child !== id),\n );\n }\n parents.value.delete(id);\n },\n opened: opened,\n open: (id, value, event) => {\n component.emit(\"click:open\", {\n id,\n value,\n path: getPath(id),\n event,\n });\n const newOpened = openStrategy.value.open({\n id,\n value,\n opened: new Set(opened.value),\n children: children.value,\n parents: parents.value,\n event,\n });\n newOpened && (opened.value = newOpened);\n },\n openOnSelect: (id, value, event) => {\n const newOpened = openStrategy.value.select({\n id,\n value,\n selected: new Map(selected.value),\n opened: new Set(opened.value),\n children: children.value,\n parents: parents.value,\n event,\n });\n newOpened && (opened.value = newOpened);\n },\n },\n };\n\n provide(EvNestedSymbol, nested);\n return nested.root;\n};\n\n/**\n * # Use Nested List Item\n * @param id\n * @param isGroup\n */\nexport const useNestedListItem = (id: Ref<unknown>, isGroup: boolean) => {\n const parent = inject(EvNestedSymbol, emptyNestedList);\n const idSymbol = Symbol(getNextId());\n const idComputed = computed(() => {\n return id.value !== undefined ? id.value : idSymbol;\n });\n const item = {\n ...parent,\n id: idComputed,\n parent: computed(() => parent.root.parents.value.get(idComputed.value)),\n select: (selected: boolean, e?: Event) => {\n return parent.root.select(idComputed.value, selected, e);\n },\n isSelected: computed(() => {\n return (\n parent.root.selected.value.get(toRaw(idComputed.value)) === \"on\"\n );\n }),\n isIndeterminate: computed(() => {\n return (\n parent.root.selected.value.get(idComputed.value) ===\n \"indeterminate\"\n );\n }),\n isLeaf: computed(() => {\n return !parent.root.children.value.get(idComputed.value);\n }),\n isGroupActivator: parent.isGroupActivator,\n };\n !parent.isGroupActivator &&\n parent.root.register(idComputed.value, parent.id.value, isGroup);\n onBeforeUnmount(() => {\n !parent.isGroupActivator && parent.root.unregister(idComputed.value);\n });\n if (isGroup) {\n provide(EvNestedSymbol, item);\n }\n return item;\n};\n\n/**\n *\n */\nexport const useNestedGroupActivator = () => {\n const parent = inject(EvNestedSymbol, emptyNestedList);\n provide(EvNestedSymbol, { ...parent, isGroupActivator: true });\n};\n","import { propsFactory } from \"@/util\";\nimport {\n ListItem as DefaultListItem,\n ListItemsProps as DefaultListItemProps,\n makeListItemsProps,\n makeNestedProps,\n} from \"@/composables/lists\";\nimport { PropType } from \"vue\";\nimport { makeComponentProps } from \"@/composables/component.ts\";\nimport { makeDimensionsProps } from \"@/composables/dimensions.ts\";\n\n/**\n * # List Item Types\n */\nexport type ListItemType = \"item\" | \"subheader\" | \"divider\";\n\n/**\n * # List Item\n */\nexport interface ListItem extends DefaultListItem {\n type?: ListItemType;\n}\n\n/**\n * # List Item Props\n */\nexport interface ListItemProps extends DefaultListItemProps {\n itemType: string;\n}\n\n/**\n * # Make EvList Props\n */\nexport const makeEvListProps = propsFactory(\n {\n disabled: Boolean,\n tag: {\n type: String,\n default: \"div\",\n },\n itemType: {\n type: String,\n default: \"type\",\n },\n\n ...makeListItemsProps(),\n ...makeNestedProps({\n selectStrategy: \"multi-any\",\n }),\n ...makeComponentProps(),\n ...makeDimensionsProps(),\n },\n \"EvList\",\n);\n\n/**\n * # Make EvListChildren Props\n */\nexport const makeEvListChildrenProps = propsFactory(\n {\n items: Array as PropType<readonly ListItem[]>,\n },\n \"EvListChildren\",\n);\n","import { propsFactory } from \"@/util\";\nimport { makeRouterLinkOrHrefProps } from \"@/composables/router.ts\";\nimport { IconProp } from \"@/composables/icons.ts\";\nimport { makeComponentProps } from \"@/composables/component.ts\";\n\nexport const makeEvListItemProps = propsFactory(\n {\n active: {\n type: Boolean,\n default: undefined,\n },\n activeExact: {\n type: Boolean,\n default: undefined,\n },\n disabled: Boolean,\n iconEnd: IconProp,\n iconStart: IconProp,\n link: {\n type: Boolean,\n default: undefined,\n },\n tag: {\n type: String,\n default: \"div\",\n },\n title: [String, Number, Boolean],\n value: null,\n\n ...makeRouterLinkOrHrefProps(),\n ...makeComponentProps(),\n },\n \"EvListItem\",\n);\n","<script setup lang=\"ts\">\nimport \"./EvListItem.scss\";\nimport { makeEvListItemProps } from \"./EvListItem.ts\";\nimport { computed, useAttrs } from \"vue\";\nimport {\n RouterLinkOrHrefProps,\n useRouterLinkOrHref,\n} from \"@/composables/router.ts\";\nimport { hasSlotWithContent } from \"@/composables/hasSlotWithContent.ts\";\nimport { useList, useNestedListItem } from \"@/composables/lists\";\nimport { useIcon, EvIcon } from \"@/components/EvIcon\";\n\n// Emit\nconst emit = defineEmits([\"click\"]);\n\nconst props = defineProps({\n ...makeEvListItemProps(),\n});\nconst slots = defineSlots<{\n default(): never;\n prefix(): never;\n suffix(): never;\n}>();\n\nconst attrs = useAttrs();\nconst link = useRouterLinkOrHref(props as RouterLinkOrHrefProps, attrs);\nconst list = useList();\nconst id = computed(() =>\n props.value === undefined ? link.href.value : props.value,\n);\nconst { select, isSelected } = useNestedListItem(id, false);\nconst hasSuffixSlot = hasSlotWithContent(slots, \"suffix\");\nconst hasPrefixSlot = hasSlotWithContent(slots, \"prefix\");\nconst isLink = computed(() => props.link !== false && link.isLink.value);\nconst isClickable = computed(() => {\n return (\n !props.disabled &&\n props.link !== false &&\n (props.link ||\n link.isClickable.value ||\n (props.value != null && !!list))\n );\n});\nconst isActive = computed(() => {\n return (\n props.active !== false &&\n (props.active || link.isActive?.value || isSelected.value)\n );\n});\nconst isActiveExact = computed(() => {\n return props.exact !== false && (props.exact || link.isExactActive?.value);\n});\nconst iconStart = useIcon(props, \"iconStart\");\nconst iconEnd = useIcon(props, \"iconEnd\");\n\nfunction getComponentElement() {\n return isLink.value ? \"a\" : props.tag;\n}\n\nfunction getTabIndex() {\n return isClickable.value ? (list ? -2 : 0) : null;\n}\n\n/**\n * # onClick Handler\n * @param e\n */\nfunction onClick(e: MouseEvent): void {\n emit(\"click\", e);\n if (!isClickable.value) {\n return;\n }\n link.navigate?.(e);\n if (props.value != null) {\n select(!isSelected.value, e);\n }\n}\n\n/**\n * # onKeyDown Handler\n * @param e\n */\nfunction onKeyDown(e: KeyboardEvent): void {\n e.preventDefault();\n onClick(e as any as MouseEvent);\n}\n</script>\n\n<template>\n <component\n :is=\"getComponentElement()\"\n :class=\"[\n 'ev-list-item',\n {\n 'is-active': isActive,\n 'is-active--exact': isActiveExact,\n 'is-clickable': isClickable,\n 'is-disabled': props.disabled,\n },\n props.class,\n ]\"\n :style=\"props.style\"\n :href=\"link.href.value\"\n :tabindex=\"getTabIndex()\"\n @click=\"onClick\"\n @keydown.enter=\"onKeyDown\"\n @keydown.space=\"onKeyDown\">\n <div v-if=\"iconStart\" class=\"ev-list-item--icon-start\">\n <ev-icon :glyph=\"iconStart\" />\n </div>\n <div v-if=\"hasPrefixSlot\" class=\"ev-list-item--prefix\">\n <slot name=\"prefix\" />\n </div>\n <div class=\"ev-list-item--content\">\n <slot name=\"default\">{{ props.title }}</slot>\n </div>\n <div v-if=\"hasSuffixSlot\" class=\"ev-list-item--suffix\">\n <slot name=\"suffix\" />\n </div>\n <div v-if=\"iconEnd\" class=\"ev-list-item--icon-end\">\n <ev-icon :glyph=\"iconEnd\" />\n </div>\n <div class=\"ev-list-item--indicator\"></div>\n </component>\n</template>\n","<script setup lang=\"ts\">\n/**\n * # EvListChildren\n *\n * A management component for rendering child items recursively.\n *\n * @todo: nested children + groups\n * v-for=\"{ children, props: itemProps, type, raw: item } in props.items\"\n */\nimport EvListItem from \"../EvListItem/EvListItem.vue\";\nimport { ListItem, makeEvListChildrenProps } from \"./EvList.ts\";\nimport { createList } from \"@/composables/lists\";\n\nconst props = defineProps({\n ...makeEvListChildrenProps(),\n});\n\ndefineSlots<{\n default(): never;\n item(props: { item: ListItem; props: any }): never;\n}>();\n\ncreateList();\n</script>\n\n<template>\n <slot>\n <template v-for=\"item in props.items\" :key=\"item.key\">\n <slot name=\"item\" v-bind=\"{ item, props: item.props }\">\n <ev-list-item v-bind=\"item.props\" />\n </slot>\n </template>\n </slot>\n</template>\n","<script setup lang=\"ts\">\n/**\n * # EvList\n *\n * `<ev-list>`\n *\n * Uses:\n * - EvListItem - `<ev-list-item>`\n *\n * @todo: Nested items\n *\n * @see EvListItem\n */\nimport \"./EvList.scss\";\nimport { makeEvListProps } from \"./EvList.ts\";\nimport { computed, ref, shallowRef } from \"vue\";\nimport { focusChild, FocusPosition } from \"@/util\";\nimport {\n createList,\n NestedProps,\n useItems,\n useNestedList,\n} from \"@/composables/lists\";\nimport { useDimensions } from \"@/composables/dimensions.ts\";\nimport EvListChildren from \"./EvListChildren.vue\";\n\ndefineEmits([\"update:selected\", \"click:select\"]);\n\nconst props = defineProps({\n ...makeEvListProps(),\n});\nconst { items } = useItems(props);\nconst { select } = useNestedList(props as NestedProps);\nconst containerRef = ref<HTMLElement | undefined>(undefined);\nconst isFocused = shallowRef(false);\nconst lastFocus = shallowRef<HTMLElement | undefined>(undefined);\nconst tabindex = computed(() => {\n return props.disabled || isFocused.value ? -1 : 0;\n});\nconst dimensions = useDimensions(props);\n\n/**\n * Establish provide() and inject() functionality for list items.\n */\ncreateList();\n\n/**\n * # On Focus\n * Set or restore focus\n * @param e\n */\nfunction onFocus(e: FocusEvent): void {\n if (\n !isFocused.value &&\n !(\n e.relatedTarget &&\n containerRef.value?.contains(e.relatedTarget as Node)\n ) &&\n containerRef.value\n ) {\n if (lastFocus.value) {\n lastFocus.value.focus();\n } else {\n focus();\n }\n }\n}\n\n/**\n * # On Focus In\n * @param e\n */\nfunction onFocusIn(e: FocusEvent): void {\n isFocused.value = true;\n}\n\n/**\n * # On Focus Out\n * @param e\n */\nfunction onFocusOut(e: FocusEvent): void {\n isFocused.value = false;\n}\n\n/**\n * # On Key Down\n * @see https://developer.mozilla.org/en-US/docs/Web/API/UI_Events/Keyboard_event_key_values\n * @param e\n */\nfunction onKeyDown(e: KeyboardEvent): void {\n const keys: { [key: string]: string } = {\n ArrowDown: \"next\",\n ArrowUp: \"previous\",\n Home: \"first\",\n End: \"last\",\n };\n const position = keys[e.key];\n if (position && containerRef.value) {\n focus(position as FocusPosition);\n e.preventDefault();\n }\n}\n\n/**\n * # Set Focus\n * @param position\n */\nfunction focus(position?: FocusPosition): void {\n lastFocus.value = focusChild(containerRef?.value, position);\n}\n\ndefineExpose({\n focus,\n select,\n});\n</script>\n\n<template>\n <component\n :is=\"props.tag\"\n ref=\"containerRef\"\n role=\"listbox\"\n :class=\"[\n 'ev-list',\n {\n 'is-disabled': props.disabled,\n },\n props.class,\n ]\"\n :style=\"[props.style, dimensions]\"\n :tabindex=\"tabindex\"\n @keydown=\"onKeyDown\"\n @focus=\"onFocus\"\n @focusin=\"onFocusIn\"\n @focusout=\"onFocusOut\">\n <ev-list-children :items=\"items\">\n <slot />\n </ev-list-children>\n </component>\n</template>\n","<script setup lang=\"ts\">\n/**\n * `<ev-date-picker-years>`\n */\nimport \"./EvDatePickerYears.scss\";\nimport { makeEvDatePickerYearsProps } from \"./EvDatePickerYears.ts\";\nimport { EvList } from \"@/components/EvList\";\nimport { EvListItem } from \"@/components/EvListItem\";\nimport { computed, nextTick, onMounted, ref } from \"vue\";\nimport { useModelProxy } from \"@/composables/modelProxy.ts\";\nimport { useDate } from \"@/composables/date/date.ts\";\nimport { wrapInArray } from \"@/util\";\n\nconst dateAdapter = useDate();\nconst props = defineProps({\n ...makeEvDatePickerYearsProps(),\n});\ndefineEmits([\"update:modelValue\"]);\n\nconst modelValue = useModelProxy(\n props,\n \"modelValue\",\n undefined,\n (value) => wrapInArray(value),\n (value) => value[0] ?? null,\n);\n\nconst offsetMin = -120;\nconst offsetMax = 50;\nconst currentYear = dateAdapter.getYear(dateAdapter.date());\n\nconst items = computed(() => {\n const minYear = props.min\n ? dateAdapter.getYear(props.min)\n : currentYear + offsetMin;\n const maxYear = props.max\n ? dateAdapter.getYear(props.max)\n : currentYear + offsetMax;\n\n const years = [];\n for (let year = minYear; year <= maxYear; year++) {\n const date = dateAdapter.setYear(dateAdapter.date(), year);\n years.push({\n title: dateAdapter.format(date, \"year\"),\n value: year,\n });\n }\n return years.reverse();\n});\n\nconst listRef = ref();\nfunction scrollIntoView() {\n const selectedEl = listRef.value?.$el.querySelector(\".is-active\");\n if (selectedEl) {\n // Now I need to get the selected item from the list\n // this is a bit of a hack because I can't seem to get dynamic ref working.\n selectedEl.scrollIntoView({\n block: \"center\",\n });\n }\n}\n\nonMounted(async () => {\n await nextTick();\n scrollIntoView();\n});\n</script>\n\n<template>\n <div class=\"ev-date-picker-years\">\n <ev-list\n ref=\"listRef\"\n v-model:selected=\"modelValue\"\n required\n select-strategy=\"single-any\">\n <ev-list-item\n v-for=\"(item, i) in items\"\n :key=\"i\"\n :title=\"item.title\"\n :value=\"item.value\" />\n </ev-list>\n </div>\n</template>\n","import { omit, propsFactory } from \"@/util\";\nimport { makeEvDatePickerMonthProps } from \"@/components/EvDatePicker/EvDatePickerMonth\";\nimport { makeEvDatePickerYearsProps } from \"@/components/EvDatePicker/EvDatePickerYears\";\nimport { PropType } from \"vue\";\n\nexport const makeEvDatePickerProps = propsFactory(\n {\n viewMode: {\n type: String as PropType<\"month\" | \"months\" | \"years\">,\n default: \"month\",\n },\n\n ...makeEvDatePickerMonthProps(),\n ...omit(makeEvDatePickerYearsProps as any, [\"modelValue\"]),\n },\n \"EvDatePicker\",\n);\n","import { propsFactory } from \"@/util\";\n\nexport const makeEvDatePickerMonthsProps = propsFactory(\n {\n modelValue: Number,\n },\n \"EvDatePickerMonths\",\n);\n","<script setup lang=\"ts\">\n/**\n * `<ev-date-picker-months>`\n */\nimport \"./EvDatePickerMonths.scss\";\nimport { makeEvDatePickerMonthsProps } from \"./EvDatePickerMonths.ts\";\nimport { useModelProxy } from \"@/composables/modelProxy.ts\";\nimport { computed } from \"vue\";\nimport { useDate } from \"@/composables/date/date.ts\";\nimport { createRange } from \"@/util\";\nimport { EvButton } from \"@/components/EvButton\";\n\nconst dateAdapter = useDate();\nconst props = defineProps({\n ...makeEvDatePickerMonthsProps(),\n});\nconst modelValue = useModelProxy(props, \"modelValue\");\ndefineEmits([\"update:modelValue\"]);\n\nconst months = computed(() => {\n let date = dateAdapter.startOfYear(dateAdapter.date());\n return createRange(12).map((i) => {\n const text = dateAdapter.format(date, \"monthShort\");\n date = dateAdapter.getNextMonth(date);\n return {\n text,\n value: i,\n };\n });\n});\n\nconst internalValue = computed(() => {\n return modelValue.value ?? dateAdapter.getMonth(dateAdapter.date());\n});\n\nfunction onClick(i: number) {\n modelValue.value = i;\n}\n\nfunction getAppearance(value?: number) {\n return value === internalValue.value ? \"primary\" : \"default\";\n}\n\nfunction getVariant(value?: number) {\n return value === internalValue.value ? \"bold\" : \"subtle\";\n}\n</script>\n\n<template>\n <div class=\"ev-date-picker-months\">\n <ev-button\n v-for=\"(month, i) in months\"\n :key=\"i\"\n :text=\"month.text\"\n :appearance=\"getAppearance(month.value)\"\n :variant=\"getVariant(month.value)\"\n @click=\"onClick(month.value)\" />\n </div>\n</template>\n","import { propsFactory } from \"@/util\";\nimport { makeComponentProps } from \"@/composables/component.ts\";\nimport { makeTagProps } from \"@/composables/tag.ts\";\nimport { PropType } from \"vue\";\nimport { DisplayRuleProp, VisibilityRuleProp } from \"@/composables/display.ts\";\n\n/**\n * # makeEvContainerProps\n */\nexport const makeEvContainerProps = propsFactory(\n {\n fluid: {\n type: Boolean,\n default: false,\n },\n fill: Boolean,\n hidden: [Boolean, String, Array] as PropType<VisibilityRuleProp>,\n height: [String, Number, Object] as PropType<DisplayRuleProp>,\n width: [String, Number, Object] as PropType<DisplayRuleProp>,\n\n ...makeComponentProps(),\n ...makeTagProps(),\n },\n \"EvContainer\",\n);\n","<script setup lang=\"ts\">\nimport \"./EvContainer.scss\";\nimport { makeEvContainerProps } from \"./EvContainer.ts\";\nimport {\n calculateDisplayRuleValue,\n useDisplayRuleClasses,\n} from \"@/composables/display.ts\";\nimport { computed } from \"vue\";\nimport { isBoolean, isEmpty } from \"@/util\";\n\nconst props = defineProps({\n ...makeEvContainerProps(),\n});\n\n/**\n * Hidden\n */\nconst hiddenClasses = useDisplayRuleClasses(props, \"hidden\", \"hidden\");\nconst hiddenAttribute = computed(() => {\n return isBoolean(props.hidden) && props.hidden;\n});\n\n/**\n * Height\n */\nconst heightStyles = computed(() => {\n const value = calculateDisplayRuleValue(props.height);\n if (isEmpty(value)) {\n return undefined;\n }\n return { height: value + \" !important\" };\n});\n\n/**\n * Width\n */\nconst widthStyles = computed(() => {\n const value = calculateDisplayRuleValue(props.width);\n if (isEmpty(value)) {\n return undefined;\n }\n return value === \"grow\" ? { width: \"100%\" } : { width: value };\n});\n</script>\n\n<template>\n <component\n :is=\"props.tag\"\n :class=\"[\n 'ev-container',\n {\n 'is-fluid': props.fluid,\n 'fill-height': props.fill,\n },\n ...hiddenClasses,\n props.class,\n ]\"\n :style=\"[props.style, widthStyles, heightStyles]\"\n :hidden=\"hiddenAttribute\">\n <slot />\n </component>\n</template>\n","import { propsFactory } from \"@/util\";\nimport { makeComponentProps } from \"@/composables/component.ts\";\nimport { makeTagProps } from \"@/composables/tag.ts\";\nimport {\n DisplayBreakpoint,\n DisplayRuleProp,\n VisibilityRuleProp,\n} from \"@/composables/display.ts\";\nimport { PropType } from \"vue\";\n\n/** Align Items **/\nexport type AlignItemsValue =\n | \"start\"\n | \"end\"\n | \"center\"\n | \"baseline\"\n | \"stretch\";\nexport type AlignItemsObject = {\n [key in DisplayBreakpoint]: AlignItemsValue;\n};\nexport type AlignItemsProp = AlignItemsValue | AlignItemsObject | undefined;\n\n/** Align Content **/\nexport type AlignContentValue =\n | \"start\"\n | \"end\"\n | \"center\"\n | \"stretch\"\n | \"space-between\"\n | \"space-around\"\n | \"space-evenly\";\nexport type AlignContentObject = {\n [key in DisplayBreakpoint]: AlignContentValue;\n};\nexport type AlignContentProp =\n | AlignContentValue\n | AlignContentObject\n | undefined;\n\n/** Justify Content **/\nexport type JustifyContentValue =\n | \"start\"\n | \"end\"\n | \"center\"\n | \"space-between\"\n | \"space-around\"\n | \"space-evenly\";\nexport type JustifyContentObject = {\n [key in DisplayBreakpoint]: JustifyContentValue;\n};\nexport type JustifyContentProp =\n | JustifyContentValue\n | JustifyContentObject\n | undefined;\n\n/** Spacers **/\nexport type SpacerValue = number | string | undefined;\nexport type SpacerObject = {\n [key in DisplayBreakpoint]: SpacerValue;\n};\nexport type SpacerProp = SpacerValue | SpacerObject | undefined;\n\n/**\n * # makeEvLayoutProps\n */\nexport const makeEvLayoutProps = propsFactory(\n {\n align: [String, Object] as PropType<AlignItemsProp>,\n alignContent: [String, Object] as PropType<AlignContentProp>,\n column: Boolean,\n gutter: [String, Number, Object] as PropType<SpacerProp>,\n justify: [String, Object] as PropType<JustifyContentProp>,\n nowrap: Boolean,\n hidden: [Boolean, String, Array] as PropType<VisibilityRuleProp>,\n height: [String, Number, Object] as PropType<DisplayRuleProp>,\n width: [String, Number, Object] as PropType<DisplayRuleProp>,\n\n ...makeComponentProps(),\n ...makeTagProps(),\n },\n \"EvLayout\",\n);\n","<script setup lang=\"ts\">\nimport \"./EvLayout.scss\";\nimport { makeEvLayoutProps } from \"./EvLayout.ts\";\nimport {\n calculateDisplayRuleValue,\n useBreakpointClasses,\n useDisplayRuleClasses,\n} from \"@/composables/display.ts\";\nimport { computed } from \"vue\";\nimport { isBoolean, isEmpty } from \"@/util\";\n\nconst props = defineProps({\n ...makeEvLayoutProps(),\n});\n\nconst alignItemsClasses = useBreakpointClasses(props, \"align\", \"align\");\nconst alignContentClasses = useBreakpointClasses(\n props,\n \"alignContent\",\n \"align-content\",\n);\nconst justifyContentClasses = useBreakpointClasses(props, \"justify\", \"justify\");\nconst gutterClasses = useBreakpointClasses(props, \"gutter\", \"gutter\");\n\n/**\n * Hidden\n */\nconst hiddenClasses = useDisplayRuleClasses(props, \"hidden\", \"hidden\");\nconst hiddenAttribute = computed(() => {\n return isBoolean(props.hidden) && props.hidden;\n});\n\n/**\n * Height\n */\nconst heightStyles = computed(() => {\n const value = calculateDisplayRuleValue(props.height);\n if (isEmpty(value)) {\n return undefined;\n }\n return { height: value };\n});\n\n/**\n * Width\n */\nconst widthStyles = computed(() => {\n const value = calculateDisplayRuleValue(props.width);\n if (isEmpty(value)) {\n return undefined;\n }\n return value === \"grow\"\n ? { flex: \"1 0 auto\", maxWidth: \"100%\", width: \"100%\" }\n : { flex: `0 0 ${value}`, maxWidth: value, width: value };\n});\n</script>\n\n<template>\n <component\n :is=\"props.tag\"\n :class=\"[\n 'ev-layout',\n {\n 'is-column': props.column,\n 'is-nowrap': props.nowrap,\n },\n ...alignItemsClasses,\n ...alignContentClasses,\n ...justifyContentClasses,\n ...gutterClasses,\n ...hiddenClasses,\n props.class,\n ]\"\n :style=\"[props.style, widthStyles, heightStyles]\"\n :hidden=\"hiddenAttribute\">\n <slot />\n </component>\n</template>\n","import { propsFactory } from \"@/util\";\nimport { makeComponentProps } from \"@/composables/component.ts\";\nimport { makeTagProps } from \"@/composables/tag.ts\";\nimport {\n DisplayBreakpoint,\n DisplayRuleProp,\n VisibilityRuleProp,\n} from \"@/composables/display.ts\";\nimport { PropType } from \"vue\";\n\n/** Block Number Props */\nexport type BlockNumber = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12;\nexport type BlockNumberPropValue = BlockNumber | `${BlockNumber}`;\nexport type BlockNumberPropObject = {\n [key in DisplayBreakpoint]: BlockNumberPropValue;\n};\nexport type BlockNumberProp =\n | BlockNumberPropValue\n | BlockNumberPropObject\n | undefined;\n\n/** Block Size Props **/\nexport type BlockSizePropValue = \"auto\" | \"grow\" | BlockNumberPropValue;\nexport type BlockSizePropObject = {\n [key in DisplayBreakpoint]: BlockSizePropValue;\n};\nexport type BlockSizeProp = BlockSizePropValue | BlockSizePropObject;\n\n/** Responsive Props */\nexport type ResponsivePropValue = string | number | boolean;\nexport type ResponsivePropObject = {\n [key in DisplayBreakpoint]: ResponsivePropValue;\n};\nexport type ResponsiveProp =\n | ResponsivePropValue\n | ResponsivePropObject\n | undefined;\n\n/** Align Self Props */\nexport type AlignSelfPropValue =\n | \"auto\"\n | \"start\"\n | \"end\"\n | \"center\"\n | \"baseline\"\n | \"stretch\";\nexport type AlignSelfPropObject = {\n [key in DisplayBreakpoint]: AlignSelfPropValue;\n};\nexport type AlignSelfProp =\n | AlignSelfPropValue\n | AlignSelfPropObject\n | undefined;\n\n/**\n * # makeEvBlockProps\n */\nexport const makeEvBlockProps = propsFactory(\n {\n alignSelf: [String, Object] as PropType<AlignSelfProp>,\n offset: [String, Number, Object] as PropType<BlockNumberProp>,\n order: [String, Number, Object] as PropType<BlockNumberProp>,\n scrollable: Boolean,\n size: [String, Number, Object] as PropType<BlockSizeProp>,\n hidden: [Boolean, String, Array] as PropType<VisibilityRuleProp>,\n height: [String, Number, Object] as PropType<DisplayRuleProp>,\n width: [String, Number, Object] as PropType<DisplayRuleProp>,\n\n ...makeComponentProps(),\n ...makeTagProps(),\n },\n \"EvBlock\",\n);\n","<script setup lang=\"ts\">\nimport \"./EvBlock.scss\";\nimport { makeEvBlockProps } from \"./EvBlock.ts\";\nimport { computed } from \"vue\";\nimport {\n calculateDisplayRuleValue,\n useBreakpointClasses,\n useDisplayRuleClasses,\n} from \"@/composables/display.ts\";\nimport { isBoolean, isEmpty } from \"@/util\";\n\nconst props = defineProps({\n ...makeEvBlockProps(),\n});\n\n/**\n * # Size Classes\n */\nconst sizeClasses = useBreakpointClasses(props, \"size\", undefined, true);\nconst orderClasses = useBreakpointClasses(props, \"order\", \"order\");\nconst offsetClasses = useBreakpointClasses(props, \"offset\", \"offset\");\nconst alignSelfClasses = useBreakpointClasses(props, \"alignSelf\", \"align-self\");\n\n/**\n * Width\n */\nconst widthStyles = computed(() => {\n const value = calculateDisplayRuleValue(props.width);\n if (isEmpty(value)) {\n return undefined;\n }\n return value === \"grow\"\n ? { flex: \"1 0 auto\", maxWidth: \"100%\" }\n : { flex: `0 0 ${value}`, maxWidth: value };\n});\n\n/**\n * Hidden\n */\nconst hiddenClasses = useDisplayRuleClasses(props, \"hidden\", \"hidden\");\nconst hiddenAttribute = computed(() => {\n return isBoolean(props.hidden) && props.hidden;\n});\n\n/**\n * Height\n */\nconst heightStyles = computed(() => {\n const value = calculateDisplayRuleValue(props.height);\n if (isEmpty(value)) {\n return undefined;\n }\n return { height: value };\n});\n</script>\n\n<template>\n <component\n :is=\"props.tag\"\n :class=\"[\n 'ev-block',\n {\n 'is-scrollable': props.scrollable,\n },\n ...sizeClasses,\n ...orderClasses,\n ...offsetClasses,\n ...alignSelfClasses,\n ...hiddenClasses,\n props.class,\n ]\"\n :style=\"[props.style, widthStyles, heightStyles]\"\n :hidden=\"hiddenAttribute\">\n <slot />\n </component>\n</template>\n","import { propsFactory } from \"@/util\";\nimport { makeComponentProps } from \"@/composables/component.ts\";\n\n/**\n * # makeEvSpacerProps\n */\nexport const makeEvSpacerProps = propsFactory(\n {\n ...makeComponentProps(),\n },\n \"EvSpacer\",\n);\n","<script setup lang=\"ts\">\n/**\n * # Ev Date Picker\n * `<ev-date-picker>`\n */\nimport \"./EvDatePicker.scss\";\nimport { makeEvDatePickerProps } from \"./EvDatePicker.ts\";\nimport { useDate } from \"@/composables/date/date.ts\";\nimport { computed, ref, shallowRef, watch } from \"vue\";\nimport { useModelProxy } from \"@/composables/modelProxy.ts\";\nimport { filterComponentProps, omit, wrapInArray } from \"@/util\";\nimport { EvDatePickerMonth } from \"./EvDatePickerMonth\";\nimport { EvDatePickerMonths } from \"./EvDatePickerMonths\";\nimport { EvDatePickerYears } from \"./EvDatePickerYears\";\nimport { EvButton } from \"@/components/EvButton\";\nimport { EvSpacer } from \"@/components/EvGrid\";\nimport { ChevronLeftIcon, ChevronRightIcon } from \"@/icons\";\n\nconst props = defineProps({\n ...makeEvDatePickerProps(),\n});\nconst dateAdapter = useDate();\nconst isReversing = shallowRef(false);\n\n// Emit\nconst emit = defineEmits([\n \"update:modelValue\",\n \"update:month\",\n \"update:year\",\n \"update:viewMode\",\n]);\n\nconst modelValue = useModelProxy(props, \"modelValue\", undefined, (value) =>\n wrapInArray(value),\n);\n\nconst internalValue = computed(() => {\n const value = dateAdapter.date(modelValue.value?.[0]);\n return value && dateAdapter.isValid(value) ? value : dateAdapter.date();\n});\n\nwatch(modelValue, (newValue, oldValue) => {\n const before = dateAdapter.date(wrapInArray(newValue)[0]);\n const after = dateAdapter.date(wrapInArray(oldValue)[0]);\n isReversing.value = dateAdapter.isBefore(before, after);\n});\n\nconst viewMode = useModelProxy(props, \"viewMode\");\n\n/**\n * Month related definitions\n */\nconst month = ref(\n Number(\n props.month ??\n dateAdapter.getMonth(dateAdapter.startOfMonth(internalValue.value)),\n ),\n);\n\nconst monthProps = computed(() =>\n filterComponentProps(EvDatePickerMonth, props),\n);\n\nconst monthText = computed(() => {\n const date = dateAdapter.startOfMonth(dateAdapter.date());\n return dateAdapter.format(dateAdapter.setMonth(date, month.value), \"month\");\n});\n\nwatch(month, () => {\n if (viewMode.value === \"months\") {\n toggleViewMonth();\n }\n});\n\n/**\n * Year related definitions\n */\nconst year = ref(\n Number(\n props.year ??\n dateAdapter.getYear(\n dateAdapter.startOfYear(\n dateAdapter.setMonth(internalValue.value, month.value),\n ),\n ),\n ),\n);\n\nconst yearProps = computed(() =>\n omit(filterComponentProps(EvDatePickerYears, props), [\"modelValue\"]),\n);\n\nconst yearText = computed(() => {\n return dateAdapter.format(\n dateAdapter.setYear(dateAdapter.date(), year.value),\n \"year\",\n );\n});\n\nwatch(year, () => {\n if (viewMode.value === \"years\") {\n toggleViewYear();\n }\n});\n\n/**\n * Min & Max date definitions\n */\nconst minDate = computed(() => {\n const date = dateAdapter.date(props.min);\n return props.min && dateAdapter.isValid(date) ? date : null;\n});\n\nconst maxDate = computed(() => {\n const date = dateAdapter.date(props.max);\n return props.max && dateAdapter.isValid(date) ? date : null;\n});\n\n/**\n * ## Next Month\n */\nfunction onClickNext() {\n if (month.value < 11) {\n month.value++;\n } else {\n year.value++;\n month.value = 0;\n emit(\"update:year\", year.value);\n }\n emit(\"update:month\", month.value);\n}\n\n/**\n * ## Previous Month\n */\nfunction onClickPrevious() {\n if (month.value > 0) {\n month.value--;\n } else {\n year.value--;\n month.value = 11;\n emit(\"update:year\", year.value);\n }\n emit(\"update:month\", month.value);\n}\n\n/**\n * Toggle View Mode between Months and Month\n */\nfunction toggleViewMonth() {\n viewMode.value = viewMode.value === \"months\" ? \"month\" : \"months\";\n}\n\n/**\n * Toggle View Mode between Years and Month\n */\nfunction toggleViewYear() {\n viewMode.value = viewMode.value === \"years\" ? \"month\" : \"years\";\n}\n</script>\n\n<template>\n <div class=\"ev-date-picker\">\n <div class=\"ev-date-picker-controls\">\n <ev-button\n variant=\"subtle\"\n :text=\"monthText\"\n @click=\"toggleViewMonth()\" />\n\n <ev-button\n variant=\"subtle\"\n :text=\"yearText\"\n @click=\"toggleViewYear()\" />\n\n <ev-spacer />\n\n <div class=\"ev-date-picker-controls--previous\">\n <ev-button\n rounded\n variant=\"subtle\"\n :disabled=\"viewMode !== 'month'\"\n :icon=\"ChevronLeftIcon\"\n @click=\"onClickPrevious()\" />\n </div>\n\n <div class=\"ev-date-picker-controls--next\">\n <ev-button\n rounded\n variant=\"subtle\"\n :disabled=\"viewMode !== 'month'\"\n :icon=\"ChevronRightIcon\"\n @click=\"onClickNext()\" />\n </div>\n </div>\n\n <ev-date-picker-years\n v-if=\"viewMode === 'years'\"\n v-bind=\"yearProps\"\n v-model=\"year\"\n :min=\"minDate\"\n :max=\"maxDate\" />\n\n <ev-date-picker-months\n v-else-if=\"viewMode === 'months'\"\n v-model=\"month\" />\n\n <ev-date-picker-month\n v-else\n v-bind=\"monthProps\"\n v-model=\"modelValue\"\n v-model:month=\"month\"\n v-model:year=\"year\"\n :min=\"minDate\"\n :max=\"maxDate\" />\n </div>\n</template>\n","import {\n makeInputAppearanceProps,\n makeInputSizeProps,\n makeTextAlignProps,\n propsFactory,\n} from \"@/util\";\nimport { IconProp } from \"@/composables/icons.ts\";\nimport { makeFormFieldProps } from \"@/composables/validation.ts\";\nimport { makeComponentProps } from \"@/composables/component.ts\";\n\n/**\n * # Make EvTextfield Props\n */\nexport const makeEvTextfieldProps = propsFactory(\n {\n autofocus: Boolean,\n autoselect: Boolean,\n clearable: Boolean,\n iconStart: IconProp,\n iconEnd: IconProp,\n label: String,\n loading: Boolean,\n placeholder: String,\n prefix: String,\n role: String,\n rounded: Boolean,\n suffix: String,\n type: {\n type: String,\n default: \"text\",\n },\n monospace: Boolean,\n\n ...makeTextAlignProps(),\n ...makeFormFieldProps(),\n ...makeInputAppearanceProps(),\n ...makeInputSizeProps(),\n ...makeComponentProps(),\n },\n \"EvTextfield\",\n);\n","<script setup lang=\"ts\">\n/**\n * # EvProgress\n */\nimport \"./EvProgress.scss\";\nimport {\n appearanceModifier,\n sizeModifier,\n IntegerishPattern,\n isIntegerish,\n AppearanceProp,\n InputSizeProp,\n} from \"@/util\";\n\ninterface ProgressProps {\n appearance?: AppearanceProp;\n indeterminate?: boolean;\n percentage?: number;\n size?: InputSizeProp | number;\n}\nconst props = withDefaults(defineProps<ProgressProps>(), {\n appearance: \"default\",\n indeterminate: false,\n percentage: 0,\n size: \"medium\",\n});\n\nfunction getPercentageTranslation() {\n const percent = 0 - (100 - props.percentage);\n return `translateX(${percent}%)`;\n}\n\n/**\n * ## Get Size Class\n */\nfunction getSizeHeight() {\n return !isSizeNumeric() ? undefined : props.size + \"px\";\n}\n\nfunction isSizeNumeric(): boolean {\n return isIntegerish(props.size);\n}\n</script>\n\n<template>\n <div\n role=\"progressbar\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n :aria-valuenow=\"percentage\"\n class=\"ev-progress\"\n :class=\"[\n {\n 'is-indeterminate': props.indeterminate,\n },\n appearanceModifier(props.appearance, ['default']),\n sizeModifier(props.size, [IntegerishPattern]),\n ]\"\n :style=\"{\n height: getSizeHeight(),\n }\">\n <div class=\"ev-progress--track\"></div>\n <div\n v-if=\"!props.indeterminate\"\n class=\"ev-progress--bar\"\n :style=\"{\n transform: getPercentageTranslation(),\n }\"></div>\n <div v-if=\"props.indeterminate\" class=\"ev-progress--indeterminate\">\n <div\n class=\"ev-progress--bar ev-progress--indeterminate--primary\"></div>\n <div\n class=\"ev-progress--bar ev-progress--indeterminate--secondary\"></div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * # `<ev-textfield>`\n */\nimport \"./EvTextfield.scss\";\nimport { makeEvTextfieldProps } from \"./EvTextfield.ts\";\nimport { computed, nextTick, ref, useAttrs } from \"vue\";\nimport { EvIcon, useIcon } from \"@/components/EvIcon\";\nimport { CancelIcon } from \"@/icons\";\nimport {\n Appearance,\n appearanceModifier,\n InputAppearance,\n InputSize,\n makeClassName,\n sizeModifier,\n splitInputAttrs,\n TextAlign,\n} from \"@/util\";\nimport { useAutofocus } from \"@/composables/focus.ts\";\nimport { EvLabel } from \"@/components/EvLabel\";\nimport { EvErrors } from \"@/components/EvErrors\";\nimport { EvProgress } from \"@/components/EvProgress\";\nimport { EvProgressCircular } from \"@/components/EvProgressCircular\";\nimport { useFormField } from \"@/composables/validation.ts\";\n\n/**\n * We want to pass attributes not defined as 'props'\n * to the `<input>` field, so we need to turn off `inheritAttrs`.\n */\ndefineOptions({\n inheritAttrs: false,\n});\n\n// Props & slots\nconst props = defineProps({\n ...makeEvTextfieldProps(),\n});\nconst slots = defineSlots<{\n label(): never;\n prefix(): never;\n default(): never;\n suffix(): never;\n}>();\n\n// Emit\nconst emit = defineEmits([\n \"click:clear\",\n \"click:control\",\n \"click:outside\",\n \"mousedown:control\",\n \"update:focused\",\n \"update:modelValue\",\n]);\n\nconst attrs = useAttrs();\nconst containerRef = ref<HTMLElement | null>(null);\nconst inputRef = ref<HTMLInputElement | null>(null);\nconst [containerAttrs, inputAttrs] = splitInputAttrs(attrs);\nconst formField = useFormField(props);\nconst isClearable = computed(() => {\n return props.clearable && !!formField.value;\n});\nconst iconStart = useIcon(props, \"iconStart\");\nconst iconEnd = useIcon(props, \"iconEnd\");\n\n/**\n * ## Get Input Element\n */\nfunction getInputElement(): HTMLInputElement | null {\n return inputRef.value;\n}\n\n/**\n * ## On Clearable Click\n * @param $event\n */\nfunction onClearableClick($event: MouseEvent) {\n $event.stopPropagation();\n nextTick(() => {\n formField.value = null;\n emit(\"click:clear\", $event);\n });\n if (!props.readonly) {\n getInputElement()?.focus();\n }\n}\n\n/**\n * ## On Clearable Mousedown\n * @param e\n */\nfunction onClearableMousedown(e: MouseEvent) {\n e.preventDefault();\n e.stopPropagation();\n}\n\n/**\n * ## On Focus\n * @param e\n */\nfunction onFocus(e?: Event) {\n formField.focus(e);\n if (props.autoselect) {\n getInputElement()?.select();\n }\n}\n\n/**\n * ## On Control Click\n *\n * When the user clicks on the textfield.\n *\n * @param e\n */\nfunction onControlClick(e: MouseEvent) {\n inputRef.value?.focus(e as FocusOptions);\n emit(\"click:control\", e);\n}\n\n/**\n * ## On Control Mousedown\n *\n * When the mousedown is triggered on the textfield.\n *\n * @param e\n */\nfunction onControlMousedown(e: MouseEvent) {\n emit(\"mousedown:control\", e);\n if (e.target === inputRef.value) {\n return;\n }\n onFocus();\n e.preventDefault();\n}\n\n/**\n * ## Directive `v-autofocus`\n */\nconst vAutofocus = useAutofocus(props);\n\n/**\n * ## Expose stuff\n */\ndefineExpose({\n input: inputRef,\n focus: () => {\n getInputElement()?.focus();\n },\n ...formField.expose(),\n});\n\nfunction onClickOutside(e: MouseEvent) {\n emit(\"click:outside\");\n}\n</script>\n\n<template>\n <div\n ref=\"containerRef\"\n v-click-outside=\"onClickOutside\"\n :class=\"[\n 'ev-textfield',\n {\n 'is-loading': props.loading,\n },\n formField.classes,\n props.class,\n ]\"\n :style=\"props.style\"\n v-bind=\"containerAttrs\">\n <div v-if=\"props.label || slots.label\" class=\"ev-textfield--label\">\n <ev-label :for=\"formField.id\">\n <slot name=\"label\">{{ props.label }}</slot>\n </ev-label>\n </div>\n\n <div\n :class=\"[\n 'ev-textfield--control',\n {\n 'is-rounded': props.rounded,\n 'is-monospace': !!props.monospace,\n },\n appearanceModifier(props.appearance, [InputAppearance.default]),\n sizeModifier(props.size, [InputSize.default]),\n makeClassName(props.align, 'is-align', [TextAlign.default]),\n ]\"\n :role=\"props.role\"\n @click=\"onControlClick\"\n @mousedown=\"onControlMousedown\">\n <div v-if=\"iconStart\" class=\"ev-textfield--icon-start\">\n <transition name=\"fade-in-out\" mode=\"out-in\">\n <ev-icon v-if=\"!props.loading\" :glyph=\"iconStart\" />\n <ev-progress-circular\n v-else\n indeterminate\n :appearance=\"\n formField.isFocused\n ? Appearance.notice\n : Appearance.default\n \" />\n </transition>\n </div>\n <div\n v-if=\"props.prefix || slots.prefix\"\n class=\"ev-textfield--prefix\">\n <slot name=\"prefix\">{{ props.prefix }}</slot>\n </div>\n <div class=\"ev-textfield--input\" data-no-activator>\n <slot />\n <input\n :id=\"formField.id\"\n ref=\"inputRef\"\n v-model=\"formField.value\"\n v-autofocus\n class=\"ev-textfield--input-native\"\n :type=\"props.type\"\n :name=\"formField.name\"\n :disabled=\"formField.isDisabled\"\n :readonly=\"formField.isReadonly\"\n :autofocus=\"props.autofocus\"\n :placeholder=\"props.placeholder\"\n v-bind=\"inputAttrs\"\n @focus=\"onFocus\"\n @blur=\"formField.blur\" />\n </div>\n <transition name=\"slide-fade\">\n <div v-if=\"isClearable\" class=\"ev-textfield--clearable\">\n <ev-icon\n :glyph=\"CancelIcon\"\n @click=\"onClearableClick\"\n @mousedown=\"onClearableMousedown\" />\n </div>\n </transition>\n <div\n v-if=\"props.suffix || slots.suffix\"\n class=\"ev-textfield--suffix\">\n <slot name=\"suffix\">{{ props.suffix }}</slot>\n </div>\n <div v-if=\"iconEnd\" class=\"ev-textfield--icon-end\">\n <ev-icon :glyph=\"iconEnd\" />\n </div>\n <div\n v-if=\"props.loading && !props.iconStart\"\n class=\"ev-textfield--loader\">\n <ev-progress\n indeterminate\n :appearance=\"\n formField.isFocused\n ? Appearance.notice\n : Appearance.default\n \"\n :size=\"2\" />\n </div>\n </div>\n\n <div v-if=\"formField.isShowErrorMessages\" class=\"ev-textfield--errors\">\n <ev-errors :messages=\"formField.errorMessages\" />\n </div>\n </div>\n</template>\n","import { omit, propsFactory } from \"@/util\";\nimport { makeEvDatePickerProps } from \"@/components/EvDatePicker\";\nimport { makeEvTextfieldProps } from \"@/components/EvTextfield\";\nimport { CalendarIcon } from \"@/icons\";\n\nexport const makeEvDateFieldProps = propsFactory(\n {\n ...omit(\n makeEvTextfieldProps({\n iconStart: CalendarIcon,\n }),\n [\"type\"],\n ),\n ...makeEvDatePickerProps(),\n },\n \"EvDateField\",\n);\n","import { propsFactory } from \"../util\";\n\nexport interface DelayOpenCloseProps {\n closeDelay?: number | string;\n openDelay?: number | string;\n}\n\nexport const makeDelayOpenCloseProps = propsFactory(\n {\n closeDelay: [Number, String],\n openDelay: [Number, String],\n },\n \"delay\",\n);\n\nexport type DelayOpenCloseCallback = (value: boolean) => void;\n\n/**\n * # Use Delay Open Close\n *\n * @param props\n * @param callback\n */\nexport function useDelayOpenClose(\n props: DelayOpenCloseProps,\n callback?: DelayOpenCloseCallback,\n) {\n const delays: Partial<Record<keyof DelayOpenCloseProps, number>> = {};\n\n const createDelay = (prop: keyof DelayOpenCloseProps) => {\n return (): Promise<boolean> => {\n const isOpening = prop === \"openDelay\";\n\n if (delays.closeDelay) {\n window.clearTimeout(delays.closeDelay);\n }\n if (delays.openDelay) {\n window.clearTimeout(delays.openDelay);\n }\n\n return new Promise((resolve) => {\n const duration = parseInt((props[prop] ?? 0).toString(), 10);\n delays[prop] = window.setTimeout(() => {\n callback?.(isOpening);\n resolve(isOpening);\n }, duration);\n });\n };\n };\n\n return {\n delayClose: createDelay(\"closeDelay\"),\n delayOpen: createDelay(\"openDelay\"),\n };\n}\n","import { InjectionKey } from \"vue\";\n\ninterface MenuProvide {\n register(): void;\n unregister(): void;\n closeParents(): void;\n}\n\nexport const EvMenuSymbol: InjectionKey<MenuProvide> = Symbol.for(\"ev:menu\");\n","import {\r\n DelayOpenCloseProps,\r\n makeDelayOpenCloseProps,\r\n useDelayOpenClose,\r\n} from \"@/composables/delay.ts\";\r\nimport {\r\n ComponentInternalInstance,\r\n ComponentPublicInstance,\r\n computed,\r\n ComputedRef,\r\n effectScope,\r\n EffectScope,\r\n inject,\r\n mergeProps,\r\n nextTick,\r\n onScopeDispose,\r\n PropType,\r\n ref,\r\n Ref,\r\n watch,\r\n watchEffect,\r\n} from \"vue\";\r\nimport {\r\n bindProps,\r\n Browser,\r\n getCurrentComponent,\r\n propsFactory,\r\n refElement,\r\n unbindProps,\r\n} from \"@/util\";\r\nimport { EvMenuSymbol } from \"../EvMenu/shared.ts\";\r\n\r\ntype ActivatorSelector = \"parent\" | string | Element | ComponentPublicInstance;\r\n\r\nexport interface ActivatorProps extends DelayOpenCloseProps {\r\n activator?: ActivatorSelector;\r\n activatorProps: Record<string, any>;\r\n openOnClick: boolean | undefined;\r\n openOnHover: boolean;\r\n openOnFocus: boolean | undefined;\r\n closeOnContentClick: boolean;\r\n}\r\n\r\nexport const makeActivatorProps = propsFactory(\r\n {\r\n activator: [String, Object] as PropType<ActivatorProps[\"activator\"]>,\r\n activatorProps: {\r\n type: Object as PropType<ActivatorProps[\"activatorProps\"]>,\r\n default: () => ({}),\r\n },\r\n openOnClick: {\r\n type: Boolean,\r\n default: undefined,\r\n },\r\n openOnHover: Boolean,\r\n openOnFocus: {\r\n type: Boolean,\r\n default: undefined,\r\n },\r\n closeOnContentClick: Boolean,\r\n\r\n ...makeDelayOpenCloseProps(),\r\n },\r\n \"EvOverlay/activator\",\r\n);\r\n\r\ninterface ActivatorEvents {\r\n onBlur?: (e: FocusEvent) => void;\r\n onClick?: (e: MouseEvent) => void;\r\n onFocus?: (e: FocusEvent) => void;\r\n onMouseenter?: (e: MouseEvent) => void;\r\n onMouseleave?: (e: MouseEvent) => void;\r\n}\r\n\r\ninterface ContentEvents {\r\n onMouseenter?: () => void;\r\n onMouseleave?: () => void;\r\n onFocusin?: () => void;\r\n onFocusout?: () => void;\r\n onClick?: () => void;\r\n}\r\n\r\ninterface VeilEvents {\r\n onMouseenter?: () => void;\r\n onMouseleave?: () => void;\r\n}\r\n\r\n/**\r\n * # UI Mouse Event\r\n * `sourceCapabilities` is in labs according to MDN. So it is subject to change.\r\n * It is also not included in TypeScript's MouseEvent, so this is a little bit\r\n * of a hack to avoid issues with the build.\r\n */\r\ninterface UIMouseEvent extends MouseEvent {\r\n sourceCapabilities?: { firesTouchEvents: boolean };\r\n}\r\n\r\n/**\r\n * # Use Activator\r\n *\r\n * @param props\r\n * @param isActive\r\n * @param isTopOfStack\r\n */\r\nexport function useActivator(\r\n props: ActivatorProps,\r\n isActive: Ref<boolean>,\r\n isTopOfStack: Ref<boolean>,\r\n) {\r\n return new Activator(props, isActive, isTopOfStack);\r\n}\r\n\r\nclass Activator {\r\n public readonly activatorEl = ref<HTMLElement>();\r\n public readonly activatorEvents: ComputedRef<Partial<ActivatorEvents>>;\r\n public readonly activatorRef = ref();\r\n public readonly availableEvents: ActivatorEvents;\r\n public readonly component: ComponentInternalInstance;\r\n public readonly contentEvents: ComputedRef<Partial<ContentEvents>>;\r\n public readonly delayClose: () => Promise<boolean>;\r\n public readonly delayOpen: () => Promise<boolean>;\r\n public readonly openOnClick: ComputedRef<boolean>;\r\n public readonly openOnFocus: ComputedRef<boolean>;\r\n public readonly veilEvents: ComputedRef<Partial<VeilEvents>>;\r\n\r\n public isHovered = false;\r\n public isFocused = false;\r\n public firstEnter = true;\r\n\r\n private watcher?: ActivatorWatcher;\r\n private scope?: EffectScope;\r\n\r\n constructor(\r\n public props: ActivatorProps,\r\n public isActive: Ref<boolean>,\r\n public isTopOfStack: Ref<boolean>,\r\n ) {\r\n this.component = getCurrentComponent(\"Activator\");\r\n this.openOnFocus = computed(\r\n () =>\r\n props.openOnFocus ||\r\n (props.openOnFocus == null && props.openOnHover),\r\n );\r\n this.openOnClick = computed(\r\n () =>\r\n props.openOnClick ||\r\n (props.openOnClick == null &&\r\n !props.openOnHover &&\r\n !this.openOnFocus.value),\r\n );\r\n const { delayOpen, delayClose } = this.createDelayFunctions();\r\n this.delayOpen = delayOpen;\r\n this.delayClose = delayClose;\r\n this.availableEvents = this.getAvailableEvents();\r\n this.activatorEvents = this.createActivatorEvents();\r\n this.contentEvents = this.createContentEvents();\r\n this.veilEvents = this.createVeilEvents();\r\n this.watchIsTopOfStack();\r\n this.watchActivatorEl();\r\n this.watchActivatorProp();\r\n }\r\n\r\n /**\r\n * ## Create Activator Events\r\n * Returns a computed set of partially available events.\r\n * @private\r\n */\r\n private createActivatorEvents() {\r\n return computed(() => {\r\n const events: Partial<ActivatorEvents> = {};\r\n if (this.isOpenOnClick()) {\r\n events.onClick = this.availableEvents.onClick;\r\n }\r\n if (this.isOpenOnHover()) {\r\n events.onMouseenter = this.availableEvents.onMouseenter;\r\n events.onMouseleave = this.availableEvents.onMouseleave;\r\n }\r\n if (this.isOpenOnFocus()) {\r\n events.onFocus = this.availableEvents.onFocus;\r\n events.onBlur = this.availableEvents.onBlur;\r\n }\r\n return events;\r\n });\r\n }\r\n\r\n /**\r\n * ## Create Content Events\r\n * @private\r\n */\r\n private createContentEvents() {\r\n return computed(() => {\r\n const events: Partial<ContentEvents> = {};\r\n if (this.isOpenOnHover()) {\r\n events.onMouseenter = () => {\r\n this.isHovered = true;\r\n this.delayOpen();\r\n };\r\n events.onMouseleave = () => {\r\n this.isHovered = false;\r\n this.delayClose();\r\n };\r\n }\r\n if (this.isOpenOnFocus()) {\r\n events.onFocusin = () => {\r\n this.isFocused = true;\r\n this.delayOpen();\r\n };\r\n events.onFocusout = () => {\r\n this.isFocused = false;\r\n this.delayClose();\r\n };\r\n }\r\n if (this.isCloseOnContentClick()) {\r\n const menu = inject(EvMenuSymbol, null);\r\n events.onClick = () => {\r\n this.isActive.value = false;\r\n menu?.closeParents();\r\n };\r\n }\r\n return events;\r\n });\r\n }\r\n\r\n /**\r\n * ## Create Delay Functions\r\n * @private\r\n */\r\n private createDelayFunctions() {\r\n return useDelayOpenClose(this.props, (value) => {\r\n const canOpenHover = this.props.openOnHover && this.isHovered;\r\n const canOpenFocus = this.openOnFocus.value && this.isFocused;\r\n if (\r\n value === (canOpenHover || canOpenFocus) &&\r\n !(\r\n this.props.openOnHover &&\r\n this.isActive.value &&\r\n !this.isTopOfStack.value\r\n )\r\n ) {\r\n if (this.isActive.value !== value) {\r\n this.firstEnter = true;\r\n }\r\n this.isActive.value = value;\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * ## Create Veil Events\r\n * @private\r\n */\r\n private createVeilEvents() {\r\n return computed(() => {\r\n const events: Partial<VeilEvents> = {};\r\n if (this.isOpenOnHover()) {\r\n events.onMouseenter = () => {\r\n if (this.firstEnter) {\r\n this.isHovered = true;\r\n this.firstEnter = false;\r\n this.delayOpen();\r\n }\r\n };\r\n events.onMouseleave = () => {\r\n this.isHovered = false;\r\n this.delayClose();\r\n };\r\n }\r\n return events;\r\n });\r\n }\r\n\r\n /**\r\n *\r\n * @param selector\r\n * @private\r\n */\r\n public getActivatorEl(\r\n selector: ActivatorSelector | undefined = this.props.activator,\r\n ) {\r\n let activator;\r\n if (selector) {\r\n if (selector === \"parent\") {\r\n let el = this.component?.proxy?.$el?.parentNode;\r\n while (el.hasAttribute(\"data-no-activator\")) {\r\n el = el.parentNode;\r\n }\r\n activator = el;\r\n } else if (typeof selector === \"string\") {\r\n // Selector\r\n activator = document.querySelector(selector);\r\n } else if (\"$el\" in selector) {\r\n // Component (ref)\r\n activator = selector.$el;\r\n } else {\r\n // HTMLElement | Element\r\n activator = selector;\r\n }\r\n }\r\n return this.setActivatorEl(activator);\r\n }\r\n\r\n /**\r\n * ## Get Available Events\r\n */\r\n public getAvailableEvents(): ActivatorEvents {\r\n return {\r\n onBlur: this.onBlur.bind(this),\r\n onClick: this.onClick.bind(this),\r\n onFocus: this.onFocus.bind(this),\r\n onMouseenter: this.onMouseenter.bind(this),\r\n onMouseleave: this.onMouseleave.bind(this),\r\n };\r\n }\r\n\r\n /**\r\n * ## Is Close on Content Click?\r\n * Should we close overlays when the content of the overlay is clicked.\r\n * For example, when a menu item is clicked.\r\n */\r\n public isCloseOnContentClick(): boolean {\r\n return this.props.closeOnContentClick;\r\n }\r\n\r\n /**\r\n * ## Is Open On Click?\r\n */\r\n public isOpenOnClick(): boolean {\r\n return this.openOnClick.value;\r\n }\r\n\r\n /**\r\n * ## Is Open on Hover?\r\n */\r\n public isOpenOnHover(): boolean {\r\n return this.props.openOnHover;\r\n }\r\n\r\n /**\r\n * ## Is Open on Focus?\r\n */\r\n public isOpenOnFocus(): boolean {\r\n return this.openOnFocus.value;\r\n }\r\n\r\n /**\r\n * ## On Blur\r\n * @param e\r\n */\r\n public onBlur(e: FocusEvent) {\r\n e.stopPropagation();\r\n this.isFocused = false;\r\n this.delayClose();\r\n }\r\n\r\n /**\r\n * ## On Click\r\n * @param e\r\n */\r\n public onClick(e: MouseEvent) {\r\n e.stopPropagation();\r\n this.activatorEl.value = (e.currentTarget || e.target) as HTMLElement;\r\n this.isActive.value = !this.isActive.value;\r\n }\r\n\r\n /**\r\n * ## On Focus\r\n * @param e\r\n */\r\n public onFocus(e: FocusEvent) {\r\n if (\r\n Browser.supportsFocusVisible &&\r\n !(e.target as HTMLElement).matches(\":focus-visible\")\r\n ) {\r\n return;\r\n }\r\n e.stopPropagation();\r\n this.isFocused = true;\r\n this.activatorEl.value = (e.currentTarget || e.target) as HTMLElement;\r\n this.delayOpen();\r\n }\r\n\r\n /**\r\n * ## On Mouse Enter (Hover)\r\n * @param e\r\n */\r\n public onMouseenter(e: UIMouseEvent) {\r\n if (e.sourceCapabilities?.firesTouchEvents) {\r\n return;\r\n }\r\n this.isHovered = true;\r\n this.activatorEl.value = (e.currentTarget || e.target) as HTMLElement;\r\n this.delayOpen();\r\n }\r\n\r\n /**\r\n * ## On Mouse Leave\r\n * @param e\r\n */\r\n public onMouseleave(e: MouseEvent) {\r\n this.isHovered = false;\r\n this.delayClose();\r\n }\r\n\r\n /**\r\n * ## Set Activator Element\r\n * @param activator\r\n */\r\n public setActivatorEl(activator?: HTMLElement) {\r\n // The activator should only be a valid element (Ignore comments and text nodes)\r\n this.activatorEl.value =\r\n activator?.nodeType === Node.ELEMENT_NODE ? activator : undefined;\r\n return this.activatorEl.value;\r\n }\r\n\r\n /**\r\n * ## Watch Activator Prop\r\n * @private\r\n */\r\n private watchActivatorProp() {\r\n watch(\r\n () => !!this.props.activator,\r\n (value) => {\r\n if (value && Browser.hasWindow) {\r\n this.scope = effectScope();\r\n this.scope.run(() => {\r\n this.watcher = new ActivatorWatcher(this);\r\n });\r\n } else if (this.scope) {\r\n this.scope.stop();\r\n }\r\n },\r\n { flush: \"post\", immediate: true },\r\n );\r\n\r\n onScopeDispose(() => {\r\n this.scope?.stop();\r\n if (this.watcher) {\r\n this.watcher = undefined;\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * ## Watch for changes in `activatorEl`\r\n * @private\r\n */\r\n private watchActivatorEl() {\r\n watchEffect(() => {\r\n if (!this.activatorRef.value) {\r\n return;\r\n }\r\n nextTick(() => {\r\n this.activatorEl.value = refElement(this.activatorRef.value);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * ## Watch for changes in `isTopOfStack`.\r\n * @private\r\n */\r\n private watchIsTopOfStack() {\r\n watch(this.isTopOfStack, (value) => {\r\n if (\r\n value &&\r\n ((this.isOpenOnHover() &&\r\n !this.isHovered &&\r\n (!this.isOpenOnFocus() || !this.isFocused)) ||\r\n (this.isOpenOnFocus() &&\r\n !this.isFocused &&\r\n (!this.isOpenOnHover() || !this.isHovered)))\r\n ) {\r\n this.isActive.value = false;\r\n }\r\n });\r\n }\r\n}\r\n\r\nclass ActivatorWatcher {\r\n constructor(public readonly activator: Activator) {\r\n this.watchActivator();\r\n }\r\n\r\n private addActivatorPropsEventListeners(\r\n el = this.activator.getActivatorEl(),\r\n activatorProps = this.activator.props.activatorProps,\r\n ) {\r\n if (!el) {\r\n return;\r\n }\r\n bindProps(\r\n el,\r\n mergeProps(this.activator.activatorEvents.value, activatorProps),\r\n );\r\n }\r\n\r\n private removeActivatorPropsEventListeners(\r\n el = this.activator.getActivatorEl(),\r\n activatorProps = this.activator.props.activatorProps,\r\n ) {\r\n if (!el) {\r\n return;\r\n }\r\n unbindProps(\r\n el,\r\n mergeProps(this.activator.activatorEvents.value, activatorProps),\r\n );\r\n }\r\n\r\n private watchActivator() {\r\n watch(\r\n () => this.activator.props.activator,\r\n (value, oldValue) => {\r\n if (oldValue && value !== oldValue) {\r\n const activator = this.activator.getActivatorEl(oldValue);\r\n activator &&\r\n this.removeActivatorPropsEventListeners(activator);\r\n }\r\n if (value) {\r\n nextTick(() => this.addActivatorPropsEventListeners());\r\n }\r\n },\r\n { immediate: true },\r\n );\r\n\r\n watch(\r\n () => this.activator.props.activatorProps,\r\n () => {\r\n this.addActivatorPropsEventListeners();\r\n },\r\n );\r\n\r\n onScopeDispose(() => {\r\n this.removeActivatorPropsEventListeners();\r\n });\r\n }\r\n}\r\n","import { PositionStrategyData, PositionStrategyProps } from \"../position.ts\";\r\nimport {\r\n computed,\r\n ComputedRef,\r\n nextTick,\r\n onScopeDispose,\r\n Ref,\r\n watch,\r\n} from \"vue\";\r\nimport {\r\n isFixedPosition,\r\n toFixedPosition,\r\n StyleProp,\r\n isNumber,\r\n Rect,\r\n getScrollParents,\r\n destructComputed,\r\n Anchor,\r\n Dimensions,\r\n toWebUnit,\r\n pixelRound,\r\n pixelCeil,\r\n clamp,\r\n AnchorSide,\r\n AnchorAlignment,\r\n RectProps,\r\n} from \"@/util\";\r\n\r\n/**\r\n * # Connected Position Strategy\r\n *\r\n * Connected to a certain element\r\n */\r\nexport function connectedPositionStrategy(\r\n data: PositionStrategyData,\r\n props: PositionStrategyProps,\r\n contentStyles: Ref<StyleProp>,\r\n) {\r\n // When the position anchor contains auto information, we need to calculate the preferred anchor\r\n // If the origin anchor contains auto information, we need to calculate the preferred anchor\r\n // some combinations may cause issues.\r\n\r\n // If the `side` of the anchor is set to 'auto' then we need to choose the side with most space\r\n // for the content. We should have a preference stack which is calculated based on\r\n // rtl, and whether the content fits the side.\r\n const manager = new ConnectedPosition(data, props, contentStyles);\r\n return {\r\n updatePosition: manager.updatePosition.bind(manager),\r\n };\r\n}\r\n\r\nclass ConnectedPosition {\r\n public contentScrollParents?: HTMLElement[];\r\n public contentRect?: Rect;\r\n public maxHeight: ComputedRef<number>;\r\n public maxWidth: ComputedRef<number>;\r\n public minHeight: ComputedRef<number>;\r\n public minWidth: ComputedRef<number>;\r\n public observe: boolean = false;\r\n public observer?: ResizeObserver;\r\n public offset: ComputedRef<number[]>;\r\n public preferredPosition?: Ref<Anchor>;\r\n public preferredOrigin?: Ref<Anchor>;\r\n public targetRect?: Rect;\r\n public viewportRect?: Rect;\r\n public viewportMargin = 12;\r\n private zoneCalculator: ZoneCalculator;\r\n\r\n constructor(\r\n public data: PositionStrategyData,\r\n public props: PositionStrategyProps,\r\n public contentStyles: Ref<StyleProp>,\r\n ) {\r\n this.resolveFixedActivator();\r\n this.minWidth = this.computedNumericProp(\"minWidth\");\r\n this.maxWidth = this.computedNumericProp(\"maxWidth\");\r\n this.minHeight = this.computedNumericProp(\"minHeight\");\r\n this.maxHeight = this.computedNumericProp(\"maxHeight\");\r\n this.offset = this.computedOffset();\r\n this.zoneCalculator = new ZoneCalculator();\r\n this.calculatePreferences();\r\n this.addResizeObserver();\r\n this.watch();\r\n }\r\n\r\n /**\r\n * ## Add Resize Observer\r\n *\r\n * Watch for changes to the size and element of the activator as well as the overlay content.\r\n *\r\n * @private\r\n */\r\n private addResizeObserver() {\r\n this.observe = false;\r\n this.observer = new ResizeObserver(() => {\r\n if (this.observe) {\r\n this.updatePosition();\r\n }\r\n });\r\n\r\n watch(\r\n [this.data.activatorEl, this.data.contentEl],\r\n (\r\n [newActivatorEl, newContentEl],\r\n [oldActivatorEl, oldContentEl],\r\n ) => {\r\n if (oldActivatorEl) {\r\n this.observer?.unobserve(oldActivatorEl);\r\n }\r\n if (newActivatorEl) {\r\n this.observer?.observe(newActivatorEl);\r\n }\r\n if (oldContentEl) {\r\n this.observer?.unobserve(oldContentEl);\r\n }\r\n if (newContentEl) {\r\n this.observer?.observe(newContentEl);\r\n }\r\n },\r\n {\r\n immediate: true,\r\n },\r\n );\r\n\r\n onScopeDispose(() => {\r\n this.observer?.disconnect();\r\n });\r\n }\r\n\r\n /**\r\n * ## Calculate Preferences (for position and origin anchor points)\r\n * @private\r\n */\r\n private calculatePreferences() {\r\n const { preferredPosition, preferredOrigin } = destructComputed(() => {\r\n const position: Anchor = Anchor.fromSelector(\r\n this.props.position,\r\n this.data.isRtl.value,\r\n );\r\n let origin: Anchor;\r\n if (this.props.origin === \"overlap\") {\r\n origin = position;\r\n } else if (this.props.origin === \"auto\") {\r\n origin = position.flipSide();\r\n } else {\r\n origin = Anchor.fromSelector(\r\n this.props.origin,\r\n this.data.isRtl.value,\r\n );\r\n }\r\n // Some combinations of props may produce an invalid origin\r\n if (\r\n position.side === origin.side &&\r\n position.alignment === origin.flipAlignment().alignment\r\n ) {\r\n return {\r\n preferredPosition: position.flipCorner(),\r\n preferredOrigin: origin.flipCorner(),\r\n };\r\n } else {\r\n return {\r\n preferredPosition: position,\r\n preferredOrigin: origin,\r\n };\r\n }\r\n });\r\n this.preferredPosition = preferredPosition;\r\n this.preferredOrigin = preferredOrigin;\r\n }\r\n\r\n /**\r\n * ## Computed Numeric Prop\r\n * @param key\r\n * @private\r\n */\r\n private computedNumericProp(key: string) {\r\n return computed(() => {\r\n const value = parseFloat(\r\n this.props[key as keyof PositionStrategyProps]! as string,\r\n );\r\n return isNaN(value) ? Infinity : value;\r\n });\r\n }\r\n\r\n /**\r\n * ## Computed Offset\r\n *\r\n * Returns an array, with the following indexes:\r\n * - `0` - represents `side` offset.\r\n * - `1` - represents `alignment` offset.\r\n *\r\n * @private\r\n */\r\n private computedOffset() {\r\n return computed(() => {\r\n if (Array.isArray(this.props.offset)) {\r\n return this.props.offset;\r\n }\r\n if (typeof this.props.offset === \"string\") {\r\n const offset = this.props.offset.split(\" \").map(parseFloat);\r\n if (offset.length < 2) {\r\n offset.push(0);\r\n }\r\n return offset as [number, number];\r\n }\r\n return isNumber(this.props.offset)\r\n ? [this.props.offset, 0]\r\n : [0, 0];\r\n });\r\n }\r\n\r\n /**\r\n * # Get Content Rect\r\n *\r\n * Returns a Rect adjusted for the original elements position, whilst accommodating RTL direction.\r\n */\r\n private getContentRect(): Rect {\r\n const el = this.data.contentEl.value!;\r\n const isRtl = this.data.isRtl.value;\r\n const rect = Rect.fromElement(el, true);\r\n if (isRtl) {\r\n rect.x += parseFloat((el.style.right || 0) as string);\r\n } else {\r\n rect.x -= parseFloat((el.style.left || 0) as string);\r\n }\r\n rect.y -= parseFloat((el.style.top || 0) as string);\r\n return rect;\r\n }\r\n\r\n /**\r\n * ## Get Content Scroll Parents\r\n * @private\r\n */\r\n private getContentScrollParents(): HTMLElement[] {\r\n const scrollParents = getScrollParents(this.data.contentEl.value);\r\n const contentEl = this.data.contentEl.value!;\r\n if (!scrollParents.length) {\r\n scrollParents.push(document.documentElement);\r\n if (!(contentEl.style.top && contentEl.style.left)) {\r\n this.contentRect!.x -= parseFloat(\r\n document.documentElement.style.getPropertyValue(\r\n \"--ev-body-scroll-x\",\r\n ) || \"0\",\r\n );\r\n this.contentRect!.y -= parseFloat(\r\n document.documentElement.style.getPropertyValue(\r\n \"--ev-body-scroll-y\",\r\n ) || \"0\",\r\n );\r\n }\r\n }\r\n return scrollParents;\r\n }\r\n\r\n /**\r\n * ## Get Viewport Rect\r\n *\r\n * Calculates the viewport viewable area for the content taking into account the viewport margins.\r\n * i.e. how close are we allowed to place content to the edges of the viewport?\r\n *\r\n * @private\r\n */\r\n private getViewportRect(): Rect {\r\n const viewportRect = this.contentScrollParents!.reduce<Rect>(\r\n (currentRect: Rect | undefined, el: HTMLElement) => {\r\n const elRect = Rect.fromElement(el);\r\n const isDocEl = el === document.documentElement;\r\n const scrollRect = new Rect(\r\n isDocEl ? 0 : elRect.x,\r\n isDocEl ? 0 : elRect.y,\r\n el.clientWidth,\r\n el.clientHeight,\r\n );\r\n if (!currentRect) {\r\n return scrollRect;\r\n }\r\n return new Rect(\r\n Math.max(currentRect.left, scrollRect.left),\r\n Math.max(currentRect.top, scrollRect.top),\r\n Math.min(currentRect.right, scrollRect.right) -\r\n Math.max(currentRect.left, scrollRect.left),\r\n Math.min(currentRect.bottom, scrollRect.bottom) -\r\n Math.max(currentRect.top, scrollRect.top),\r\n );\r\n },\r\n undefined!,\r\n );\r\n // Adjust the allowable viewport dimensions\r\n viewportRect.x += this.viewportMargin;\r\n viewportRect.y += this.viewportMargin;\r\n viewportRect.width -= this.viewportMargin * 2;\r\n viewportRect.height -= this.viewportMargin * 2;\r\n return viewportRect;\r\n }\r\n\r\n /**\r\n * ## Resolve Fixed Activator\r\n * @private\r\n */\r\n private resolveFixedActivator() {\r\n const isActivatorFixed = isFixedPosition(this.data.activatorEl.value);\r\n if (isActivatorFixed) {\r\n toFixedPosition(this.contentStyles.value, this.data.isRtl.value);\r\n }\r\n }\r\n\r\n /**\r\n * ## Update Position\r\n */\r\n public updatePosition() {\r\n this.observe = false;\r\n\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => (this.observe = true));\r\n });\r\n\r\n if (!this.data.activatorEl.value || !this.data.contentEl.value) {\r\n return;\r\n }\r\n\r\n this.targetRect = Rect.fromElement(this.data.activatorEl.value);\r\n this.contentRect = this.getContentRect();\r\n this.contentScrollParents = this.getContentScrollParents();\r\n this.viewportRect = this.getViewportRect();\r\n\r\n const zones = this.zoneCalculator.getAvailable(\r\n this.targetRect,\r\n this.viewportRect,\r\n this.offset.value,\r\n this.contentRect,\r\n );\r\n\r\n const placement = {\r\n position: this.preferredPosition!.value,\r\n origin: this.preferredOrigin!.value,\r\n };\r\n\r\n // If side is auto, find the largest side that\r\n if (placement.position.side === \"auto\") {\r\n const autoZone = this.getAutoZone(placement.position, zones);\r\n placement.position = autoZone.position;\r\n placement.origin = placement.position.flipSide();\r\n }\r\n\r\n // Ok, now we need to calculate the new placement based on available width/height\r\n // will the content fit and what to do if not.\r\n const zone =\r\n placement.position.side === \"center\"\r\n ? this.getCenterZone(zones)\r\n : this.getBestZone(placement.position, zones);\r\n\r\n // Now we need to calculate the position of the content element within the zone.\r\n placement.position = zone.position;\r\n placement.origin = placement.position.flipSide();\r\n\r\n let { x, y } = zone.rect;\r\n\r\n if (placement.position.side === \"center\") {\r\n y = zone.rect.y + (zone.rect.height - this.contentRect.height) / 2;\r\n x = zone.rect.x + (zone.rect.width - this.contentRect.width) / 2;\r\n } else {\r\n if (placement.position.side === \"top\") {\r\n y = zone.rect.bottom - this.contentRect.height;\r\n } else if (placement.position.side === \"left\") {\r\n x = zone.rect.right - this.contentRect.width;\r\n }\r\n if (placement.position.alignment !== \"start\") {\r\n const divider =\r\n placement.position.alignment === \"center\" ? 2 : 1;\r\n if (placement.position.axis === \"x\") {\r\n y =\r\n this.targetRect.y +\r\n (this.targetRect.height - this.contentRect.height) /\r\n divider;\r\n } else {\r\n x =\r\n this.targetRect.x +\r\n (this.targetRect.width - this.contentRect.width) /\r\n divider;\r\n }\r\n }\r\n }\r\n\r\n // Should this be optional!?\r\n if (y < this.viewportRect.y) {\r\n y = this.viewportRect.y;\r\n }\r\n if (x < this.viewportRect.x) {\r\n x = this.viewportRect.x;\r\n }\r\n\r\n // @todo: RTL\r\n Object.assign(this.contentStyles.value, {\r\n \"--ev-overlay-position\": placement.position.toCssValue(),\r\n transformOrigin: placement.origin.toCssValue(),\r\n top: toWebUnit(pixelRound(y)),\r\n left: toWebUnit(pixelRound(x)),\r\n minWidth: toWebUnit(\r\n placement.position.axis === \"y\"\r\n ? Math.min(this.minWidth.value, this.targetRect.width)\r\n : this.minWidth.value,\r\n ),\r\n maxWidth: toWebUnit(\r\n pixelCeil(\r\n clamp(\r\n zone.rect.width,\r\n this.minWidth.value === Infinity\r\n ? 0\r\n : this.minWidth.value,\r\n this.maxWidth.value,\r\n ),\r\n ),\r\n ),\r\n maxHeight: toWebUnit(\r\n pixelCeil(\r\n clamp(\r\n zone.rect.height,\r\n this.minHeight.value === Infinity\r\n ? 0\r\n : this.minHeight.value,\r\n this.maxHeight.value,\r\n ),\r\n ),\r\n ),\r\n });\r\n\r\n this.data.contentEl.value?.setAttribute(\r\n \"data-position\",\r\n placement.position.toString(),\r\n );\r\n\r\n return {\r\n zoneRect: zone.rect,\r\n contentRect: this.contentRect,\r\n };\r\n }\r\n\r\n private getAutoZone(position: Anchor, zones: Zone[]): Zone {\r\n const matches = zones.filter((zone) => {\r\n // Ignore center position for now.\r\n if (zone.position.side === \"center\") {\r\n return false;\r\n }\r\n return (\r\n position.alignment === \"auto\" ||\r\n zone.position.alignment === position.alignment\r\n );\r\n });\r\n return matches[0];\r\n }\r\n\r\n /**\r\n * ## Get Best Zone\r\n * Returns the zone that fits the content, or the zone with the largest available area.\r\n * @param position\r\n * @param zones\r\n * @private\r\n */\r\n private getBestZone(position: Anchor, zones: Zone[]): Zone {\r\n // Priority\r\n const positions = [\r\n position,\r\n position.centerAlign(),\r\n position.flipSide(),\r\n position.flipSide().centerAlign(),\r\n position.flipCorner(),\r\n position.flipCorner().centerAlign(),\r\n position.flipCorner().flipSide(),\r\n position.flipCorner().flipSide().centerAlign(),\r\n ];\r\n\r\n // Exactly fits content\r\n for (const newPosition of positions) {\r\n // Find the zone that correlates to the position\r\n const zone = zones.find((zone) => {\r\n return zone.position.toString() === newPosition.toString();\r\n });\r\n if (zone?.isFitsContent) {\r\n return zone;\r\n }\r\n }\r\n\r\n // Or the preferred side fits\r\n for (const newPosition of positions) {\r\n const zone = zones.find((zone) => {\r\n return zone.position.toString() === newPosition.toString();\r\n });\r\n if (!zone) {\r\n continue;\r\n }\r\n const dimension = newPosition.axis === \"x\" ? \"width\" : \"height\";\r\n if (zone.available[dimension] >= 0) {\r\n return zone;\r\n }\r\n }\r\n\r\n // Fallback to auto because it finds the largest available zone\r\n return this.getAutoZone(position, zones);\r\n }\r\n\r\n /**\r\n * ## Get Center Zone\r\n * Returns the zone for centering content in the viewport, which is basically the whole viewport.\r\n * @param zones\r\n * @private\r\n */\r\n private getCenterZone(zones: Zone[]): Zone {\r\n return zones.find((zone) => {\r\n return (\r\n zone.position.side === \"center\" &&\r\n zone.position.alignment === \"center\"\r\n );\r\n })!;\r\n }\r\n\r\n /**\r\n * ## Watch\r\n *\r\n * Watch for changes that affect position calculations.\r\n *\r\n * @private\r\n */\r\n private watch() {\r\n watch(\r\n () => [\r\n this.preferredPosition?.value,\r\n this.preferredOrigin?.value,\r\n this.props.offset,\r\n this.props.minWidth,\r\n this.props.minHeight,\r\n this.props.maxWidth,\r\n this.props.maxHeight,\r\n ],\r\n () => this.updatePosition(),\r\n );\r\n\r\n nextTick(() => {\r\n const result = this.updatePosition();\r\n if (!result) {\r\n return;\r\n }\r\n // @todo: what else do we need to do?\r\n });\r\n }\r\n}\r\n\r\nclass Zone {\r\n public available: Dimensions;\r\n public isFitsContent: boolean;\r\n\r\n constructor(\r\n public position: Anchor,\r\n public rect: Rect,\r\n public content: Rect,\r\n ) {\r\n this.available = {\r\n width: this.rect.width - content.width,\r\n height: this.rect.height - content.height,\r\n };\r\n this.isFitsContent =\r\n this.rect.width >= content.width &&\r\n this.rect.height >= content.height;\r\n }\r\n\r\n get availableArea() {\r\n return this.available.width * this.available.height;\r\n }\r\n}\r\n\r\nclass ZoneCalculator {\r\n /**\r\n * ## Get Available\r\n *\r\n * Returns all available zones around the target.\r\n *\r\n * @param target\r\n * @param viewport\r\n * @param offset\r\n * @param content\r\n */\r\n public getAvailable(\r\n target: Rect,\r\n viewport: Rect,\r\n offset: number[],\r\n content: Rect,\r\n ): Zone[] {\r\n const [offsetSide, offsetAlign] = offset;\r\n\r\n // Sides\r\n const sides: ZoneSides = {\r\n top: {\r\n y: viewport.top,\r\n height: target.top - viewport.top - offsetSide,\r\n align: \"x\",\r\n },\r\n bottom: {\r\n y: target.bottom + offsetSide,\r\n height: viewport.bottom - target.bottom - offsetSide,\r\n align: \"x\",\r\n },\r\n left: {\r\n x: viewport.left,\r\n width: target.left - viewport.left - offsetSide,\r\n align: \"y\",\r\n },\r\n right: {\r\n x: target.right + offsetSide,\r\n width: viewport.right - target.right - offsetSide,\r\n align: \"y\",\r\n },\r\n center: { x: viewport.left, width: viewport.width, align: \"y\" },\r\n };\r\n\r\n // Align\r\n const alignments: ZoneAlignments = {\r\n x: {\r\n center: { x: viewport.left, width: viewport.width },\r\n start: {\r\n x: target.left + offsetAlign,\r\n width: viewport.width - target.left - offsetAlign,\r\n },\r\n end: {\r\n x: viewport.left,\r\n width: target.right - viewport.left - offsetAlign,\r\n },\r\n },\r\n y: {\r\n center: { y: viewport.top, height: viewport.height },\r\n start: {\r\n y: target.top + offsetAlign,\r\n height: viewport.bottom - target.top - offsetAlign,\r\n },\r\n end: {\r\n y: viewport.top,\r\n height: target.bottom - viewport.top - offsetAlign,\r\n },\r\n },\r\n };\r\n\r\n const zones: Zone[] = [];\r\n for (const [side, sideAttrs] of Object.entries(sides)) {\r\n for (const [align, alignAttrs] of Object.entries(\r\n alignments[sideAttrs.align],\r\n )) {\r\n const anchor = new Anchor(\r\n side as AnchorSide,\r\n align as AnchorAlignment,\r\n );\r\n const rectProps: RectProps = Object.assign(\r\n {\r\n width: 0,\r\n height: 0,\r\n x: 0,\r\n y: 0,\r\n },\r\n sideAttrs,\r\n alignAttrs,\r\n );\r\n const rect = Rect.fromRect(rectProps);\r\n zones.push(new Zone(anchor, rect, content));\r\n }\r\n }\r\n\r\n // Sort by area\r\n zones.sort((zoneA, zoneB) => {\r\n return zoneB.availableArea - zoneA.availableArea;\r\n });\r\n return zones;\r\n }\r\n}\r\n\r\ninterface ZoneSides {\r\n [key: string]: {\r\n x?: number;\r\n y?: number;\r\n width?: number;\r\n height?: number;\r\n align: string;\r\n };\r\n}\r\n\r\ninterface ZoneAlignments {\r\n [key: string]: {\r\n [key: string]: {\r\n x?: number;\r\n y?: number;\r\n width?: number;\r\n height?: number;\r\n };\r\n };\r\n}\r\n","import { PositionStrategyData, PositionStrategyProps } from \"../position.ts\";\nimport { Ref } from \"vue\";\nimport { StyleProp } from \"@/util\";\n\n/**\n * # Static Position Strategy\n *\n * Specific viewport position, usually centered.\n */\nexport function staticPositionStrategy(\n data: PositionStrategyData,\n props: PositionStrategyProps,\n contentStyles: Ref<StyleProp>,\n) {\n // todo\n}\n","import { onScopeDispose, PropType, ref, Ref, watch } from \"vue\";\nimport {\n connectedPositionStrategy,\n staticPositionStrategy,\n} from \"./position-strategy\";\nimport { AnchorSelector, Browser, isFunction, propsFactory } from \"@/util\";\nimport { useToggleScope } from \"@/composables/toggleScope.ts\";\n\nexport interface PositionStrategyData {\n contentEl: Ref<HTMLElement | undefined>;\n activatorEl: Ref<HTMLElement | undefined>;\n isActive: Ref<boolean>;\n isRtl: Ref<boolean>;\n}\n\ntype PositionStrategyFn = (\n data: PositionStrategyData,\n props: PositionStrategyProps,\n contentStyles: Ref<Record<string, string>>,\n) => undefined | { updatePosition: (e: Event) => void };\n\nconst positionStrategies = {\n static: staticPositionStrategy, // specific viewport position, usually centered\n connected: connectedPositionStrategy, // connected to a certain element\n};\n\nexport interface PositionStrategyProps {\n positionStrategy: keyof typeof positionStrategies | PositionStrategyFn;\n position: AnchorSelector;\n origin: AnchorSelector | \"overlap\";\n offset?: number | string | number[];\n maxHeight?: number | string;\n maxWidth?: number | string;\n minHeight?: number | string;\n minWidth?: number | string;\n}\n\n/**\n * # Make Position Strategy Props\n */\nexport const makePositionStrategyProps = propsFactory(\n {\n positionStrategy: {\n type: [String, Function] as PropType<\n PositionStrategyProps[\"positionStrategy\"]\n >,\n default: \"connected\",\n validator: (value: any) =>\n typeof value === \"function\" || value in positionStrategies,\n },\n position: {\n type: String as PropType<AnchorSelector>,\n default: \"auto\",\n },\n origin: {\n type: String as PropType<PositionStrategyProps[\"origin\"]>,\n default: \"auto\",\n },\n offset: [Number, String, Array] as PropType<\n PositionStrategyProps[\"offset\"]\n >,\n },\n \"EvOverlay/position\",\n);\n\n/**\n * # Use Position Strategies\n */\nexport function usePositionStrategies(\n props: PositionStrategyProps,\n data: PositionStrategyData,\n) {\n const contentStyles = ref({});\n const updatePosition = ref<(e: Event) => void>();\n\n /**\n * ## On Resize\n * Update the position when the window resizes.\n * @param e\n */\n function onResize(e: Event) {\n updatePosition.value?.(e);\n }\n\n if (Browser.hasWindow) {\n useToggleScope(\n () => {\n return !!(data.isActive.value && props.positionStrategy);\n },\n (reset) => {\n watch(() => props.positionStrategy, reset);\n onScopeDispose(() => {\n updatePosition.value = undefined;\n });\n let positionStrategyFn: PositionStrategyFn;\n if (isFunction(props.positionStrategy)) {\n positionStrategyFn = props.positionStrategy;\n } else {\n positionStrategyFn = positionStrategies[\n props.positionStrategy\n ] as PositionStrategyFn;\n }\n updatePosition.value = positionStrategyFn(\n data,\n props,\n contentStyles,\n )?.updatePosition;\n },\n );\n\n window.addEventListener(\"resize\", onResize, { passive: true });\n\n onScopeDispose(() => {\n window.removeEventListener(\"resize\", onResize);\n updatePosition.value = undefined;\n });\n }\n\n return {\n contentStyles,\n updatePosition,\n };\n}\n","import { ScrollStrategyData, ScrollStrategyProps } from \"../scroll.ts\";\nimport { getScrollParents, hasScrollbar, toWebUnit } from \"@/util\";\nimport { onScopeDispose } from \"vue\";\n\n/**\n * # Block Scroll Strategy\n * @param data\n * @param props\n */\nexport function blockScrollStrategy(\n data: ScrollStrategyData,\n props: ScrollStrategyProps,\n) {\n const offsetParent = data.containerEl.value?.offsetParent;\n const scrollElements = [\n ...new Set([\n ...getScrollParents(\n data.activatorEl.value,\n props.contained ? offsetParent : undefined,\n ),\n ...getScrollParents(\n data.contentEl.value,\n props.contained ? offsetParent : undefined,\n ),\n ]),\n ].filter((el) => !el.classList.contains(\"ev-overlay-scroll-blocked\"));\n const scrollbarWidth =\n window.innerWidth - document.documentElement.offsetWidth;\n const scrollableParent = ((el) => hasScrollbar(el) && el)(\n offsetParent || document.documentElement,\n );\n if (scrollableParent) {\n data.containerEl.value?.classList.add(\"ev-overlay--scroll-blocked\");\n }\n\n scrollElements.forEach((el, i) => {\n el.style.setProperty(\n \"--ev-body-scroll-x\",\n toWebUnit(-el.scrollLeft) ?? null,\n );\n el.style.setProperty(\n \"--ev-body-scroll-y\",\n toWebUnit(-el.scrollTop) ?? null,\n );\n if (el !== document.documentElement) {\n el.style.setProperty(\n \"--ev-scrollbar-offset\",\n toWebUnit(scrollbarWidth) ?? null,\n );\n }\n el.classList.add(\"ev-overlay-scroll-blocked\");\n });\n\n onScopeDispose(() => {\n scrollElements.forEach((el, i) => {\n const x = parseFloat(\n el.style.getPropertyValue(\"--ev-body-scroll-x\"),\n );\n const y = parseFloat(\n el.style.getPropertyValue(\"--ev-body-scroll-y\"),\n );\n\n el.style.removeProperty(\"--ev-body-scroll-x\");\n el.style.removeProperty(\"--ev-body-scroll-y\");\n el.style.removeProperty(\"--ev-scrollbar-offset\");\n el.classList.remove(\"ev-overlay-scroll-blocked\");\n el.scrollLeft = -x;\n el.scrollTop = -y;\n });\n if (scrollableParent) {\n data.containerEl.value?.classList.remove(\n \"ev-overlay--scroll-blocked\",\n );\n }\n });\n}\n","import { ScrollStrategyData } from \"../scroll.ts\";\nimport { addScrollEventListener } from \"../../../util\";\n\n/**\n * # Close Scroll Strategy\n * @param data\n */\nexport function closeScrollStrategy(data: ScrollStrategyData) {\n function onScroll(e: Event) {\n data.isActive.value = false;\n }\n addScrollEventListener(\n data.activatorEl.value ?? data.contentEl.value,\n onScroll,\n );\n}\n","import { ScrollStrategyData, ScrollStrategyProps } from \"../scroll.ts\";\nimport { EffectScope, onScopeDispose } from \"vue\";\nimport { addScrollEventListener, requestNewFrame } from \"../../../util\";\n\n/**\n * # Reposition Scroll Strategy\n * @param data\n * @param props\n * @param scope\n */\nexport function repositionScrollStrategy(\n data: ScrollStrategyData,\n props: ScrollStrategyProps,\n scope: EffectScope,\n) {\n let slow = false;\n let raf = -1;\n let ric = -1;\n\n function update(e: Event) {\n requestNewFrame(() => {\n const start = performance.now();\n data.updatePosition.value?.(e);\n const time = performance.now() - start;\n slow = time / (1000 / 60) > 2;\n });\n }\n\n ric = (\n typeof requestIdleCallback === \"undefined\"\n ? (cb: Function) => cb()\n : requestIdleCallback\n )(() => {\n scope.run(() => {\n addScrollEventListener(\n data.activatorEl.value ?? data.contentEl.value,\n (e) => {\n if (slow) {\n // If the position calculation is slow,\n // defer updates until scrolling is finished.\n // Browsers usually fire one scroll event per frame so\n // we just wait until we've got two frames without an event\n cancelAnimationFrame(raf);\n raf = requestAnimationFrame(() => {\n raf = requestAnimationFrame(() => {\n update(e);\n });\n });\n } else {\n update(e);\n }\n },\n );\n });\n });\n\n onScopeDispose(() => {\n typeof cancelIdleCallback !== \"undefined\" && cancelIdleCallback(ric);\n cancelAnimationFrame(raf);\n });\n}\n","import { Browser, propsFactory } from \"../../util\";\nimport {\n effectScope,\n EffectScope,\n nextTick,\n onScopeDispose,\n PropType,\n Ref,\n watchEffect,\n} from \"vue\";\nimport {\n blockScrollStrategy,\n closeScrollStrategy,\n repositionScrollStrategy,\n} from \"./scroll-strategy\";\n\nexport interface ScrollStrategyData {\n containerEl: Ref<HTMLElement | undefined>;\n contentEl: Ref<HTMLElement | undefined>;\n activatorEl: Ref<HTMLElement | undefined>;\n isActive: Ref<boolean>;\n updatePosition: Ref<((e: Event) => void) | undefined>;\n}\n\ntype ScrollStrategyFn = (\n data: ScrollStrategyData,\n props: ScrollStrategyProps,\n scope: EffectScope,\n) => void;\n\nconst scrollStrategies = {\n none: null,\n close: closeScrollStrategy,\n block: blockScrollStrategy,\n reposition: repositionScrollStrategy,\n};\n\nexport interface ScrollStrategyProps {\n scrollStrategy: keyof typeof scrollStrategies | ScrollStrategyFn;\n contained: boolean | undefined;\n}\n\n/**\n * # Make Scroll Strategy Props\n */\nexport const makeScrollStrategyProps = propsFactory(\n {\n scrollStrategy: {\n type: [String, Function] as PropType<\n ScrollStrategyProps[\"scrollStrategy\"]\n >,\n default: \"block\",\n validator: (val: any) =>\n typeof val === \"function\" || val in scrollStrategies,\n },\n },\n \"EvOverlay/scroll\",\n);\n\n/**\n * # Use Scroll Strategies\n * @param props\n * @param data\n */\nexport function useScrollStrategies(\n props: ScrollStrategyProps,\n data: ScrollStrategyData,\n) {\n if (!Browser.hasWindow) {\n return;\n }\n\n let scope: EffectScope | undefined;\n watchEffect(async () => {\n scope?.stop();\n\n if (!(data.isActive.value && props.scrollStrategy)) {\n return;\n }\n\n scope = effectScope();\n await nextTick();\n scope.active &&\n scope.run(() => {\n if (typeof props.scrollStrategy === \"function\") {\n props.scrollStrategy(data, props, scope!);\n } else {\n scrollStrategies[props.scrollStrategy]?.(\n data,\n props,\n scope!,\n );\n }\n });\n });\n\n onScopeDispose(() => {\n scope?.stop();\n });\n}\n","import { propsFactory } from \"@/util\";\nimport { PropType, Ref } from \"vue\";\nimport { TeleportTarget } from \"@/composables/teleport.ts\";\nimport { makeDimensionsProps } from \"@/composables/dimensions.ts\";\nimport { makeActivatorProps } from \"./activator.ts\";\nimport { makePositionStrategyProps } from \"./position.ts\";\nimport { makeScrollStrategyProps } from \"./scroll.ts\";\nimport { makeEvTransitionProps } from \"@/components/EvTransition\";\nimport { makeComponentProps } from \"@/composables/component.ts\";\n\n/**\n * # Make EvOverlay Props\n */\nexport const makeEvOverlayProps = propsFactory(\n {\n absolute: Boolean,\n attach: [Boolean, String, Object] as PropType<TeleportTarget>,\n closeOnBack: {\n type: Boolean,\n default: true,\n },\n contained: Boolean,\n contentClass: null,\n contentProps: null,\n disabled: Boolean,\n modelValue: [Boolean, Object] as PropType<ModelValueProp>,\n persistent: Boolean,\n veil: {\n type: Boolean,\n default: true,\n },\n zIndex: {\n type: [Number, String],\n default: 2000,\n },\n\n ...makeActivatorProps(),\n ...makeDimensionsProps(),\n ...makePositionStrategyProps(),\n ...makeScrollStrategyProps(),\n ...makeEvTransitionProps(),\n ...makeComponentProps(),\n },\n \"EvOverlay\",\n);\n\ntype ModelValueProp = boolean | Ref<boolean>;\n","<script setup lang=\"ts\">\n/**\n * # EvMenu Transition\n *\n * We use JavaScript hooks to animate the menu.\n *\n * @see https://vuejs.org/guide/built-ins/transition.html#javascript-hooks\n */\nimport { computed, PropType } from \"vue\";\nimport { animate, easingAccelerate, easingStandard, Rect } from \"@/util\";\n\nconst props = defineProps({\n target: Object as PropType<HTMLElement>,\n});\n\n/**\n * ## Get Children\n *\n * We're only interested in animating the following children:\n *\n * - `ev-surface`\n * - `ev-card`\n * - `ev-list`\n *\n * @param el\n */\nfunction getChildren(el: Element) {\n const els = el.querySelector(\n \":scope > .ev-card, :scope > .ev-surface, :scope > .ev-list\",\n )?.children;\n return els && [...els];\n}\n\n/**\n * ## Get Dimensions\n * @param target\n * @param el\n */\nfunction getDimensions(target: HTMLElement, el: HTMLElement) {\n const targetBox = Rect.fromElement(target);\n const elBox = Rect.fromElement(el, true);\n const elStyle = getComputedStyle(el);\n const [originX, originY] = elStyle.transformOrigin\n .split(\" \")\n .map((v) => parseFloat(v));\n const [anchorSide, anchorOffset] = elStyle\n .getPropertyValue(\"--ev-overlay-position\")\n .split(\" \");\n\n let offsetX = targetBox.left;\n if (anchorSide === \"center\" || anchorOffset === \"center\") {\n offsetX += targetBox.width / 2;\n } else if (anchorSide === \"right\" || anchorOffset === \"right\") {\n offsetX += targetBox.width;\n }\n\n let offsetY = targetBox.top;\n if (anchorSide === \"center\" || anchorOffset === \"center\") {\n offsetY += targetBox.height / 2;\n } else if (anchorSide === \"bottom\" || anchorOffset === \"bottom\") {\n offsetY += targetBox.height;\n }\n\n const targetScaleX = targetBox.width / elBox.width;\n const targetScaleY = targetBox.height / elBox.height;\n const maxScale = Math.max(1, targetScaleX, targetScaleY);\n const scaleX = targetScaleX / maxScale || 0;\n const scaleY = targetScaleY / maxScale || 0;\n\n // Animate elements larger than 12% of the screen area up to 1.5x slower\n const screenPercentage =\n (elBox.width * elBox.height) / (window.innerWidth * window.innerHeight);\n const speedFactor =\n screenPercentage > 0.12\n ? Math.min(1.5, (screenPercentage - 0.12) * 10 + 1)\n : 1;\n\n return {\n x: offsetX - (originX + elBox.left),\n y: offsetY - (originY + elBox.top),\n scaleX,\n scaleY,\n speedFactor,\n };\n}\n\n/**\n * ## On Before Enter\n *\n * Before the element is inserted into the DOM.\n *\n * @param el\n */\nfunction onBeforeEnter(el: Element) {\n (el as HTMLElement).style.pointerEvents = \"none\";\n (el as HTMLElement).style.visibility = \"hidden\";\n}\n\n/**\n * ## On Enter\n *\n * Called one frame after the element is inserted.\n *\n * @param el\n * @param done\n */\nasync function onEnter(el: Element, done: () => void) {\n await new Promise((resolve) => requestAnimationFrame(resolve));\n await new Promise((resolve) => requestAnimationFrame(resolve));\n (el as HTMLElement).style.visibility = \"\";\n const { x, y, scaleX, scaleY, speedFactor } = getDimensions(\n props.target!,\n el as HTMLElement,\n );\n const duration = 250;\n\n const animation = animate(\n el,\n [\n {\n transform: `translate(${x}px, ${y}px) scale(${scaleX}, ${scaleY})`,\n opacity: 0,\n },\n {},\n ],\n {\n duration: duration * speedFactor,\n easing: easingStandard,\n },\n );\n getChildren(el)?.forEach((el) => {\n animate(el, [{ opacity: 0 }, { opacity: 0, offset: 0.25 }, {}], {\n duration: duration * speedFactor,\n easing: easingStandard,\n });\n });\n animation.finished.then(() => done());\n}\n\n/**\n * ## On After Enter\n *\n * Called when the enter transition has finished.\n *\n * @param el\n */\nfunction onAfterEnter(el: Element) {\n (el as HTMLElement).style.removeProperty(\"pointer-events\");\n}\n\n/**\n * ## On Before Leave\n *\n * Called before the leave hook.\n *\n * @param el\n */\nfunction onBeforeLeave(el: Element) {\n (el as HTMLElement).style.pointerEvents = \"none\";\n}\n\n/**\n * ## On Leave\n *\n * Called when the leave transition starts.\n *\n * @param el\n * @param done\n */\nasync function onLeave(el: Element, done: () => void) {\n await new Promise((resolve) => requestAnimationFrame(resolve));\n const { x, y, scaleX, scaleY, speedFactor } = getDimensions(\n props.target!,\n el as HTMLElement,\n );\n\n const animation = animate(\n el,\n [\n {},\n {\n transform: `translate(${x}px, ${y}px) scale(${scaleX}, ${scaleY})`,\n opacity: 0,\n },\n ],\n {\n duration: 125 * speedFactor,\n easing: easingAccelerate,\n },\n );\n animation.finished.then(() => done());\n\n getChildren(el)?.forEach((el) => {\n animate(el, [{}, { opacity: 0, offset: 0.25 }, { opacity: 0 }], {\n duration: 250 * speedFactor,\n easing: easingStandard,\n });\n });\n}\n\n/**\n * ## On After Leave\n *\n * Called when the leave transition has finished and the element has been removed from the DOM.\n *\n * @param el\n */\nfunction onAfterLeave(el: Element) {\n (el as HTMLElement).style.removeProperty(\"pointer-events\");\n}\n\n/**\n * Calculate transition props so we can use v-bind.\n */\nconst transitionProps = computed(() => {\n return props.target\n ? {\n css: false,\n onBeforeEnter,\n onEnter,\n onAfterEnter,\n onBeforeLeave,\n onLeave,\n onAfterLeave,\n }\n : {};\n});\n</script>\n\n<template>\n <transition name=\"ev-menu-transition\" v-bind=\"transitionProps\">\n <slot />\n </transition>\n</template>\n","import { AnchorSelector, propsFactory } from \"@/util\";\r\nimport { makeEvOverlayProps } from \"@/components/EvOverlay/EvOverlay.ts\";\r\nimport EvMenuTransition from \"./EvMenuTransition.vue\";\r\n\r\nexport const makeEvMenuProps = propsFactory(\r\n {\r\n id: String,\r\n\r\n ...makeEvOverlayProps({\r\n closeDelay: 250,\r\n closeOnContentClick: true,\r\n position: \"bottom-start\" as AnchorSelector,\r\n positionStrategy: \"connected\" as const,\r\n openDelay: 250,\r\n veil: false,\r\n scrollStrategy: \"reposition\" as const,\r\n transition: { component: EvMenuTransition },\r\n }),\r\n },\r\n \"EvMenu\",\r\n);\r\n","import { computed, Ref } from \"vue\";\nimport { Browser, isString } from \"../util\";\n\nexport type TeleportTarget = boolean | string | Element;\n\n/**\n * # Use Teleport\n *\n * `target` where we want to teleport to.\n * `container` MUST be a CSS class selector (defaults to '.ev-teleport').\n *\n * @param target\n * @param container\n */\nexport function useTeleport(\n target: Ref<TeleportTarget>,\n container: string = \".ev-teleport\",\n) {\n return computed(() => {\n const targetValue = target.value;\n if (targetValue === true || !Browser.hasWindow) {\n return null;\n }\n\n let targetElement: HTMLElement | null;\n if (targetValue instanceof Element) {\n targetElement = targetValue as HTMLElement;\n } else if (isString(targetValue)) {\n targetElement = document.querySelector(targetValue);\n } else {\n targetElement = document.body;\n }\n if (!targetElement) {\n console.warn(\n `useTeleport() unable to resolve target \"${targetValue}\"`,\n );\n }\n\n let containerElement = targetElement?.querySelector(\n `:scope > ${container}`,\n );\n if (!containerElement) {\n containerElement = document.createElement(\"div\");\n containerElement.className = container.substring(1);\n targetElement!.appendChild(containerElement);\n }\n return containerElement;\n });\n}\n","import {\n ComponentInternalInstance,\n computed,\n inject,\n InjectionKey,\n onScopeDispose,\n provide,\n reactive,\n readonly,\n Ref,\n shallowRef,\n toRaw,\n watchEffect,\n} from \"vue\";\nimport { getCurrentComponent } from \"../util\";\nimport { useToggleScope } from \"./toggleScope.ts\";\n\ninterface StackProvide {\n activeChildren: Set<number>;\n}\n\nconst StackSymbol: InjectionKey<StackProvide> = Symbol.for(\"ev:stack\");\n\ntype StackEntry = [componentId: number, zIndex: number];\n\nconst globalStack = reactive<StackEntry[]>([]);\n\nexport function getComponentIndex(\n component: ComponentInternalInstance,\n): number {\n return toRaw(globalStack).findIndex((stackEntry) => {\n return stackEntry[0] === component.uid;\n });\n}\n\nexport function getLastZIndex(): number | undefined {\n return globalStack.at(-1)?.[1];\n}\n\nexport function getNextZIndex(fallback: number): number {\n const lastZIndex = getLastZIndex();\n return lastZIndex ? lastZIndex + 10 : fallback;\n}\n\nexport function isTopComponent(component: ComponentInternalInstance): boolean {\n return globalStack.at(-1)?.[0] === component.uid;\n}\n\n/**\n * # Use Stack\n * @param isActive\n * @param zIndex\n * @param isDisableGlobalStack\n */\nexport function useStack(\n isActive: Readonly<Ref<boolean>>,\n zIndex: Readonly<Ref<string | number>>,\n isDisableGlobalStack: boolean,\n) {\n const component = getCurrentComponent(\"useStack\");\n const isCreateStackEntry = !isDisableGlobalStack;\n const parentStack = inject(StackSymbol, undefined);\n const stack: StackProvide = reactive({\n activeChildren: new Set<number>(),\n });\n provide(StackSymbol, stack);\n\n const zIndexRef = shallowRef(+zIndex.value);\n useToggleScope(isActive, () => {\n zIndexRef.value = getNextZIndex(+zIndex.value);\n if (isCreateStackEntry) {\n globalStack.push([component.uid, zIndexRef.value]);\n }\n parentStack?.activeChildren.add(component.uid);\n onScopeDispose(() => {\n if (isCreateStackEntry) {\n globalStack.splice(getComponentIndex(component), 1);\n }\n parentStack?.activeChildren.delete(component.uid);\n });\n });\n\n const isTopGlobal = shallowRef(true);\n if (isCreateStackEntry) {\n watchEffect(() => {\n const isTop = isTopComponent(component);\n setTimeout(() => (isTopGlobal.value = isTop));\n });\n }\n\n const isTopLocal = computed(() => !stack.activeChildren.size);\n\n return {\n isTopGlobal: readonly(isTopGlobal),\n isTopLocal: isTopLocal,\n stackStyles: computed(() => ({ zIndex: zIndexRef.value })),\n };\n}\n","/*!\n * vue-router v4.2.4\n * (c) 2023 Eduardo San Martin Morote\n * @license MIT\n */\nimport { getCurrentInstance, inject, onUnmounted, onDeactivated, onActivated, computed, unref, watchEffect, defineComponent, reactive, h, provide, ref, watch, shallowRef, shallowReactive, nextTick } from 'vue';\nimport { setupDevtoolsPlugin } from '@vue/devtools-api';\n\nconst isBrowser = typeof window !== 'undefined';\n\nfunction isESModule(obj) {\n return obj.__esModule || obj[Symbol.toStringTag] === 'Module';\n}\nconst assign = Object.assign;\nfunction applyToParams(fn, params) {\n const newParams = {};\n for (const key in params) {\n const value = params[key];\n newParams[key] = isArray(value)\n ? value.map(fn)\n : fn(value);\n }\n return newParams;\n}\nconst noop = () => { };\n/**\n * Typesafe alternative to Array.isArray\n * https://github.com/microsoft/TypeScript/pull/48228\n */\nconst isArray = Array.isArray;\n\nfunction warn(msg) {\n // avoid using ...args as it breaks in older Edge builds\n const args = Array.from(arguments).slice(1);\n console.warn.apply(console, ['[Vue Router warn]: ' + msg].concat(args));\n}\n\nconst TRAILING_SLASH_RE = /\\/$/;\nconst removeTrailingSlash = (path) => path.replace(TRAILING_SLASH_RE, '');\n/**\n * Transforms a URI into a normalized history location\n *\n * @param parseQuery\n * @param location - URI to normalize\n * @param currentLocation - current absolute location. Allows resolving relative\n * paths. Must start with `/`. Defaults to `/`\n * @returns a normalized history location\n */\nfunction parseURL(parseQuery, location, currentLocation = '/') {\n let path, query = {}, searchString = '', hash = '';\n // Could use URL and URLSearchParams but IE 11 doesn't support it\n // TODO: move to new URL()\n const hashPos = location.indexOf('#');\n let searchPos = location.indexOf('?');\n // the hash appears before the search, so it's not part of the search string\n if (hashPos < searchPos && hashPos >= 0) {\n searchPos = -1;\n }\n if (searchPos > -1) {\n path = location.slice(0, searchPos);\n searchString = location.slice(searchPos + 1, hashPos > -1 ? hashPos : location.length);\n query = parseQuery(searchString);\n }\n if (hashPos > -1) {\n path = path || location.slice(0, hashPos);\n // keep the # character\n hash = location.slice(hashPos, location.length);\n }\n // no search and no query\n path = resolveRelativePath(path != null ? path : location, currentLocation);\n // empty path means a relative query or hash `?foo=f`, `#thing`\n return {\n fullPath: path + (searchString && '?') + searchString + hash,\n path,\n query,\n hash,\n };\n}\n/**\n * Stringifies a URL object\n *\n * @param stringifyQuery\n * @param location\n */\nfunction stringifyURL(stringifyQuery, location) {\n const query = location.query ? stringifyQuery(location.query) : '';\n return location.path + (query && '?') + query + (location.hash || '');\n}\n/**\n * Strips off the base from the beginning of a location.pathname in a non-case-sensitive way.\n *\n * @param pathname - location.pathname\n * @param base - base to strip off\n */\nfunction stripBase(pathname, base) {\n // no base or base is not found at the beginning\n if (!base || !pathname.toLowerCase().startsWith(base.toLowerCase()))\n return pathname;\n return pathname.slice(base.length) || '/';\n}\n/**\n * Checks if two RouteLocation are equal. This means that both locations are\n * pointing towards the same {@link RouteRecord} and that all `params`, `query`\n * parameters and `hash` are the same\n *\n * @param stringifyQuery - A function that takes a query object of type LocationQueryRaw and returns a string representation of it.\n * @param a - first {@link RouteLocation}\n * @param b - second {@link RouteLocation}\n */\nfunction isSameRouteLocation(stringifyQuery, a, b) {\n const aLastIndex = a.matched.length - 1;\n const bLastIndex = b.matched.length - 1;\n return (aLastIndex > -1 &&\n aLastIndex === bLastIndex &&\n isSameRouteRecord(a.matched[aLastIndex], b.matched[bLastIndex]) &&\n isSameRouteLocationParams(a.params, b.params) &&\n stringifyQuery(a.query) === stringifyQuery(b.query) &&\n a.hash === b.hash);\n}\n/**\n * Check if two `RouteRecords` are equal. Takes into account aliases: they are\n * considered equal to the `RouteRecord` they are aliasing.\n *\n * @param a - first {@link RouteRecord}\n * @param b - second {@link RouteRecord}\n */\nfunction isSameRouteRecord(a, b) {\n // since the original record has an undefined value for aliasOf\n // but all aliases point to the original record, this will always compare\n // the original record\n return (a.aliasOf || a) === (b.aliasOf || b);\n}\nfunction isSameRouteLocationParams(a, b) {\n if (Object.keys(a).length !== Object.keys(b).length)\n return false;\n for (const key in a) {\n if (!isSameRouteLocationParamsValue(a[key], b[key]))\n return false;\n }\n return true;\n}\nfunction isSameRouteLocationParamsValue(a, b) {\n return isArray(a)\n ? isEquivalentArray(a, b)\n : isArray(b)\n ? isEquivalentArray(b, a)\n : a === b;\n}\n/**\n * Check if two arrays are the same or if an array with one single entry is the\n * same as another primitive value. Used to check query and parameters\n *\n * @param a - array of values\n * @param b - array of values or a single value\n */\nfunction isEquivalentArray(a, b) {\n return isArray(b)\n ? a.length === b.length && a.every((value, i) => value === b[i])\n : a.length === 1 && a[0] === b;\n}\n/**\n * Resolves a relative path that starts with `.`.\n *\n * @param to - path location we are resolving\n * @param from - currentLocation.path, should start with `/`\n */\nfunction resolveRelativePath(to, from) {\n if (to.startsWith('/'))\n return to;\n if ((process.env.NODE_ENV !== 'production') && !from.startsWith('/')) {\n warn(`Cannot resolve a relative location without an absolute path. Trying to resolve \"${to}\" from \"${from}\". It should look like \"/${from}\".`);\n return to;\n }\n if (!to)\n return from;\n const fromSegments = from.split('/');\n const toSegments = to.split('/');\n const lastToSegment = toSegments[toSegments.length - 1];\n // make . and ./ the same (../ === .., ../../ === ../..)\n // this is the same behavior as new URL()\n if (lastToSegment === '..' || lastToSegment === '.') {\n toSegments.push('');\n }\n let position = fromSegments.length - 1;\n let toPosition;\n let segment;\n for (toPosition = 0; toPosition < toSegments.length; toPosition++) {\n segment = toSegments[toPosition];\n // we stay on the same position\n if (segment === '.')\n continue;\n // go up in the from array\n if (segment === '..') {\n // we can't go below zero, but we still need to increment toPosition\n if (position > 1)\n position--;\n // continue\n }\n // we reached a non-relative path, we stop here\n else\n break;\n }\n return (fromSegments.slice(0, position).join('/') +\n '/' +\n toSegments\n // ensure we use at least the last element in the toSegments\n .slice(toPosition - (toPosition === toSegments.length ? 1 : 0))\n .join('/'));\n}\n\nvar NavigationType;\n(function (NavigationType) {\n NavigationType[\"pop\"] = \"pop\";\n NavigationType[\"push\"] = \"push\";\n})(NavigationType || (NavigationType = {}));\nvar NavigationDirection;\n(function (NavigationDirection) {\n NavigationDirection[\"back\"] = \"back\";\n NavigationDirection[\"forward\"] = \"forward\";\n NavigationDirection[\"unknown\"] = \"\";\n})(NavigationDirection || (NavigationDirection = {}));\n/**\n * Starting location for Histories\n */\nconst START = '';\n// Generic utils\n/**\n * Normalizes a base by removing any trailing slash and reading the base tag if\n * present.\n *\n * @param base - base to normalize\n */\nfunction normalizeBase(base) {\n if (!base) {\n if (isBrowser) {\n // respect <base> tag\n const baseEl = document.querySelector('base');\n base = (baseEl && baseEl.getAttribute('href')) || '/';\n // strip full URL origin\n base = base.replace(/^\\w+:\\/\\/[^\\/]+/, '');\n }\n else {\n base = '/';\n }\n }\n // ensure leading slash when it was removed by the regex above avoid leading\n // slash with hash because the file could be read from the disk like file://\n // and the leading slash would cause problems\n if (base[0] !== '/' && base[0] !== '#')\n base = '/' + base;\n // remove the trailing slash so all other method can just do `base + fullPath`\n // to build an href\n return removeTrailingSlash(base);\n}\n// remove any character before the hash\nconst BEFORE_HASH_RE = /^[^#]+#/;\nfunction createHref(base, location) {\n return base.replace(BEFORE_HASH_RE, '#') + location;\n}\n\nfunction getElementPosition(el, offset) {\n const docRect = document.documentElement.getBoundingClientRect();\n const elRect = el.getBoundingClientRect();\n return {\n behavior: offset.behavior,\n left: elRect.left - docRect.left - (offset.left || 0),\n top: elRect.top - docRect.top - (offset.top || 0),\n };\n}\nconst computeScrollPosition = () => ({\n left: window.pageXOffset,\n top: window.pageYOffset,\n});\nfunction scrollToPosition(position) {\n let scrollToOptions;\n if ('el' in position) {\n const positionEl = position.el;\n const isIdSelector = typeof positionEl === 'string' && positionEl.startsWith('#');\n /**\n * `id`s can accept pretty much any characters, including CSS combinators\n * like `>` or `~`. It's still possible to retrieve elements using\n * `document.getElementById('~')` but it needs to be escaped when using\n * `document.querySelector('#\\\\~')` for it to be valid. The only\n * requirements for `id`s are them to be unique on the page and to not be\n * empty (`id=\"\"`). Because of that, when passing an id selector, it should\n * be properly escaped for it to work with `querySelector`. We could check\n * for the id selector to be simple (no CSS combinators `+ >~`) but that\n * would make things inconsistent since they are valid characters for an\n * `id` but would need to be escaped when using `querySelector`, breaking\n * their usage and ending up in no selector returned. Selectors need to be\n * escaped:\n *\n * - `#1-thing` becomes `#\\31 -thing`\n * - `#with~symbols` becomes `#with\\\\~symbols`\n *\n * - More information about the topic can be found at\n * https://mathiasbynens.be/notes/html5-id-class.\n * - Practical example: https://mathiasbynens.be/demo/html5-id\n */\n if ((process.env.NODE_ENV !== 'production') && typeof position.el === 'string') {\n if (!isIdSelector || !document.getElementById(position.el.slice(1))) {\n try {\n const foundEl = document.querySelector(position.el);\n if (isIdSelector && foundEl) {\n warn(`The selector \"${position.el}\" should be passed as \"el: document.querySelector('${position.el}')\" because it starts with \"#\".`);\n // return to avoid other warnings\n return;\n }\n }\n catch (err) {\n warn(`The selector \"${position.el}\" is invalid. If you are using an id selector, make sure to escape it. You can find more information about escaping characters in selectors at https://mathiasbynens.be/notes/css-escapes or use CSS.escape (https://developer.mozilla.org/en-US/docs/Web/API/CSS/escape).`);\n // return to avoid other warnings\n return;\n }\n }\n }\n const el = typeof positionEl === 'string'\n ? isIdSelector\n ? document.getElementById(positionEl.slice(1))\n : document.querySelector(positionEl)\n : positionEl;\n if (!el) {\n (process.env.NODE_ENV !== 'production') &&\n warn(`Couldn't find element using selector \"${position.el}\" returned by scrollBehavior.`);\n return;\n }\n scrollToOptions = getElementPosition(el, position);\n }\n else {\n scrollToOptions = position;\n }\n if ('scrollBehavior' in document.documentElement.style)\n window.scrollTo(scrollToOptions);\n else {\n window.scrollTo(scrollToOptions.left != null ? scrollToOptions.left : window.pageXOffset, scrollToOptions.top != null ? scrollToOptions.top : window.pageYOffset);\n }\n}\nfunction getScrollKey(path, delta) {\n const position = history.state ? history.state.position - delta : -1;\n return position + path;\n}\nconst scrollPositions = new Map();\nfunction saveScrollPosition(key, scrollPosition) {\n scrollPositions.set(key, scrollPosition);\n}\nfunction getSavedScrollPosition(key) {\n const scroll = scrollPositions.get(key);\n // consume it so it's not used again\n scrollPositions.delete(key);\n return scroll;\n}\n// TODO: RFC about how to save scroll position\n/**\n * ScrollBehavior instance used by the router to compute and restore the scroll\n * position when navigating.\n */\n// export interface ScrollHandler<ScrollPositionEntry extends HistoryStateValue, ScrollPosition extends ScrollPositionEntry> {\n// // returns a scroll position that can be saved in history\n// compute(): ScrollPositionEntry\n// // can take an extended ScrollPositionEntry\n// scroll(position: ScrollPosition): void\n// }\n// export const scrollHandler: ScrollHandler<ScrollPosition> = {\n// compute: computeScroll,\n// scroll: scrollToPosition,\n// }\n\nlet createBaseLocation = () => location.protocol + '//' + location.host;\n/**\n * Creates a normalized history location from a window.location object\n * @param base - The base path\n * @param location - The window.location object\n */\nfunction createCurrentLocation(base, location) {\n const { pathname, search, hash } = location;\n // allows hash bases like #, /#, #/, #!, #!/, /#!/, or even /folder#end\n const hashPos = base.indexOf('#');\n if (hashPos > -1) {\n let slicePos = hash.includes(base.slice(hashPos))\n ? base.slice(hashPos).length\n : 1;\n let pathFromHash = hash.slice(slicePos);\n // prepend the starting slash to hash so the url starts with /#\n if (pathFromHash[0] !== '/')\n pathFromHash = '/' + pathFromHash;\n return stripBase(pathFromHash, '');\n }\n const path = stripBase(pathname, base);\n return path + search + hash;\n}\nfunction useHistoryListeners(base, historyState, currentLocation, replace) {\n let listeners = [];\n let teardowns = [];\n // TODO: should it be a stack? a Dict. Check if the popstate listener\n // can trigger twice\n let pauseState = null;\n const popStateHandler = ({ state, }) => {\n const to = createCurrentLocation(base, location);\n const from = currentLocation.value;\n const fromState = historyState.value;\n let delta = 0;\n if (state) {\n currentLocation.value = to;\n historyState.value = state;\n // ignore the popstate and reset the pauseState\n if (pauseState && pauseState === from) {\n pauseState = null;\n return;\n }\n delta = fromState ? state.position - fromState.position : 0;\n }\n else {\n replace(to);\n }\n // console.log({ deltaFromCurrent })\n // Here we could also revert the navigation by calling history.go(-delta)\n // this listener will have to be adapted to not trigger again and to wait for the url\n // to be updated before triggering the listeners. Some kind of validation function would also\n // need to be passed to the listeners so the navigation can be accepted\n // call all listeners\n listeners.forEach(listener => {\n listener(currentLocation.value, from, {\n delta,\n type: NavigationType.pop,\n direction: delta\n ? delta > 0\n ? NavigationDirection.forward\n : NavigationDirection.back\n : NavigationDirection.unknown,\n });\n });\n };\n function pauseListeners() {\n pauseState = currentLocation.value;\n }\n function listen(callback) {\n // set up the listener and prepare teardown callbacks\n listeners.push(callback);\n const teardown = () => {\n const index = listeners.indexOf(callback);\n if (index > -1)\n listeners.splice(index, 1);\n };\n teardowns.push(teardown);\n return teardown;\n }\n function beforeUnloadListener() {\n const { history } = window;\n if (!history.state)\n return;\n history.replaceState(assign({}, history.state, { scroll: computeScrollPosition() }), '');\n }\n function destroy() {\n for (const teardown of teardowns)\n teardown();\n teardowns = [];\n window.removeEventListener('popstate', popStateHandler);\n window.removeEventListener('beforeunload', beforeUnloadListener);\n }\n // set up the listeners and prepare teardown callbacks\n window.addEventListener('popstate', popStateHandler);\n // TODO: could we use 'pagehide' or 'visibilitychange' instead?\n // https://developer.chrome.com/blog/page-lifecycle-api/\n window.addEventListener('beforeunload', beforeUnloadListener, {\n passive: true,\n });\n return {\n pauseListeners,\n listen,\n destroy,\n };\n}\n/**\n * Creates a state object\n */\nfunction buildState(back, current, forward, replaced = false, computeScroll = false) {\n return {\n back,\n current,\n forward,\n replaced,\n position: window.history.length,\n scroll: computeScroll ? computeScrollPosition() : null,\n };\n}\nfunction useHistoryStateNavigation(base) {\n const { history, location } = window;\n // private variables\n const currentLocation = {\n value: createCurrentLocation(base, location),\n };\n const historyState = { value: history.state };\n // build current history entry as this is a fresh navigation\n if (!historyState.value) {\n changeLocation(currentLocation.value, {\n back: null,\n current: currentLocation.value,\n forward: null,\n // the length is off by one, we need to decrease it\n position: history.length - 1,\n replaced: true,\n // don't add a scroll as the user may have an anchor, and we want\n // scrollBehavior to be triggered without a saved position\n scroll: null,\n }, true);\n }\n function changeLocation(to, state, replace) {\n /**\n * if a base tag is provided, and we are on a normal domain, we have to\n * respect the provided `base` attribute because pushState() will use it and\n * potentially erase anything before the `#` like at\n * https://github.com/vuejs/router/issues/685 where a base of\n * `/folder/#` but a base of `/` would erase the `/folder/` section. If\n * there is no host, the `<base>` tag makes no sense and if there isn't a\n * base tag we can just use everything after the `#`.\n */\n const hashIndex = base.indexOf('#');\n const url = hashIndex > -1\n ? (location.host && document.querySelector('base')\n ? base\n : base.slice(hashIndex)) + to\n : createBaseLocation() + base + to;\n try {\n // BROWSER QUIRK\n // NOTE: Safari throws a SecurityError when calling this function 100 times in 30 seconds\n history[replace ? 'replaceState' : 'pushState'](state, '', url);\n historyState.value = state;\n }\n catch (err) {\n if ((process.env.NODE_ENV !== 'production')) {\n warn('Error with push/replace State', err);\n }\n else {\n console.error(err);\n }\n // Force the navigation, this also resets the call count\n location[replace ? 'replace' : 'assign'](url);\n }\n }\n function replace(to, data) {\n const state = assign({}, history.state, buildState(historyState.value.back, \n // keep back and forward entries but override current position\n to, historyState.value.forward, true), data, { position: historyState.value.position });\n changeLocation(to, state, true);\n currentLocation.value = to;\n }\n function push(to, data) {\n // Add to current entry the information of where we are going\n // as well as saving the current position\n const currentState = assign({}, \n // use current history state to gracefully handle a wrong call to\n // history.replaceState\n // https://github.com/vuejs/router/issues/366\n historyState.value, history.state, {\n forward: to,\n scroll: computeScrollPosition(),\n });\n if ((process.env.NODE_ENV !== 'production') && !history.state) {\n warn(`history.state seems to have been manually replaced without preserving the necessary values. Make sure to preserve existing history state if you are manually calling history.replaceState:\\n\\n` +\n `history.replaceState(history.state, '', url)\\n\\n` +\n `You can find more information at https://next.router.vuejs.org/guide/migration/#usage-of-history-state.`);\n }\n changeLocation(currentState.current, currentState, true);\n const state = assign({}, buildState(currentLocation.value, to, null), { position: currentState.position + 1 }, data);\n changeLocation(to, state, false);\n currentLocation.value = to;\n }\n return {\n location: currentLocation,\n state: historyState,\n push,\n replace,\n };\n}\n/**\n * Creates an HTML5 history. Most common history for single page applications.\n *\n * @param base -\n */\nfunction createWebHistory(base) {\n base = normalizeBase(base);\n const historyNavigation = useHistoryStateNavigation(base);\n const historyListeners = useHistoryListeners(base, historyNavigation.state, historyNavigation.location, historyNavigation.replace);\n function go(delta, triggerListeners = true) {\n if (!triggerListeners)\n historyListeners.pauseListeners();\n history.go(delta);\n }\n const routerHistory = assign({\n // it's overridden right after\n location: '',\n base,\n go,\n createHref: createHref.bind(null, base),\n }, historyNavigation, historyListeners);\n Object.defineProperty(routerHistory, 'location', {\n enumerable: true,\n get: () => historyNavigation.location.value,\n });\n Object.defineProperty(routerHistory, 'state', {\n enumerable: true,\n get: () => historyNavigation.state.value,\n });\n return routerHistory;\n}\n\n/**\n * Creates an in-memory based history. The main purpose of this history is to handle SSR. It starts in a special location that is nowhere.\n * It's up to the user to replace that location with the starter location by either calling `router.push` or `router.replace`.\n *\n * @param base - Base applied to all urls, defaults to '/'\n * @returns a history object that can be passed to the router constructor\n */\nfunction createMemoryHistory(base = '') {\n let listeners = [];\n let queue = [START];\n let position = 0;\n base = normalizeBase(base);\n function setLocation(location) {\n position++;\n if (position === queue.length) {\n // we are at the end, we can simply append a new entry\n queue.push(location);\n }\n else {\n // we are in the middle, we remove everything from here in the queue\n queue.splice(position);\n queue.push(location);\n }\n }\n function triggerListeners(to, from, { direction, delta }) {\n const info = {\n direction,\n delta,\n type: NavigationType.pop,\n };\n for (const callback of listeners) {\n callback(to, from, info);\n }\n }\n const routerHistory = {\n // rewritten by Object.defineProperty\n location: START,\n // TODO: should be kept in queue\n state: {},\n base,\n createHref: createHref.bind(null, base),\n replace(to) {\n // remove current entry and decrement position\n queue.splice(position--, 1);\n setLocation(to);\n },\n push(to, data) {\n setLocation(to);\n },\n listen(callback) {\n listeners.push(callback);\n return () => {\n const index = listeners.indexOf(callback);\n if (index > -1)\n listeners.splice(index, 1);\n };\n },\n destroy() {\n listeners = [];\n queue = [START];\n position = 0;\n },\n go(delta, shouldTrigger = true) {\n const from = this.location;\n const direction = \n // we are considering delta === 0 going forward, but in abstract mode\n // using 0 for the delta doesn't make sense like it does in html5 where\n // it reloads the page\n delta < 0 ? NavigationDirection.back : NavigationDirection.forward;\n position = Math.max(0, Math.min(position + delta, queue.length - 1));\n if (shouldTrigger) {\n triggerListeners(this.location, from, {\n direction,\n delta,\n });\n }\n },\n };\n Object.defineProperty(routerHistory, 'location', {\n enumerable: true,\n get: () => queue[position],\n });\n return routerHistory;\n}\n\n/**\n * Creates a hash history. Useful for web applications with no host (e.g. `file://`) or when configuring a server to\n * handle any URL is not possible.\n *\n * @param base - optional base to provide. Defaults to `location.pathname + location.search` If there is a `<base>` tag\n * in the `head`, its value will be ignored in favor of this parameter **but note it affects all the history.pushState()\n * calls**, meaning that if you use a `<base>` tag, it's `href` value **has to match this parameter** (ignoring anything\n * after the `#`).\n *\n * @example\n * ```js\n * // at https://example.com/folder\n * createWebHashHistory() // gives a url of `https://example.com/folder#`\n * createWebHashHistory('/folder/') // gives a url of `https://example.com/folder/#`\n * // if the `#` is provided in the base, it won't be added by `createWebHashHistory`\n * createWebHashHistory('/folder/#/app/') // gives a url of `https://example.com/folder/#/app/`\n * // you should avoid doing this because it changes the original url and breaks copying urls\n * createWebHashHistory('/other-folder/') // gives a url of `https://example.com/other-folder/#`\n *\n * // at file:///usr/etc/folder/index.html\n * // for locations with no `host`, the base is ignored\n * createWebHashHistory('/iAmIgnored') // gives a url of `file:///usr/etc/folder/index.html#`\n * ```\n */\nfunction createWebHashHistory(base) {\n // Make sure this implementation is fine in terms of encoding, specially for IE11\n // for `file://`, directly use the pathname and ignore the base\n // location.pathname contains an initial `/` even at the root: `https://example.com`\n base = location.host ? base || location.pathname + location.search : '';\n // allow the user to provide a `#` in the middle: `/base/#/app`\n if (!base.includes('#'))\n base += '#';\n if ((process.env.NODE_ENV !== 'production') && !base.endsWith('#/') && !base.endsWith('#')) {\n warn(`A hash base must end with a \"#\":\\n\"${base}\" should be \"${base.replace(/#.*$/, '#')}\".`);\n }\n return createWebHistory(base);\n}\n\nfunction isRouteLocation(route) {\n return typeof route === 'string' || (route && typeof route === 'object');\n}\nfunction isRouteName(name) {\n return typeof name === 'string' || typeof name === 'symbol';\n}\n\n/**\n * Initial route location where the router is. Can be used in navigation guards\n * to differentiate the initial navigation.\n *\n * @example\n * ```js\n * import { START_LOCATION } from 'vue-router'\n *\n * router.beforeEach((to, from) => {\n * if (from === START_LOCATION) {\n * // initial navigation\n * }\n * })\n * ```\n */\nconst START_LOCATION_NORMALIZED = {\n path: '/',\n name: undefined,\n params: {},\n query: {},\n hash: '',\n fullPath: '/',\n matched: [],\n meta: {},\n redirectedFrom: undefined,\n};\n\nconst NavigationFailureSymbol = Symbol((process.env.NODE_ENV !== 'production') ? 'navigation failure' : '');\n/**\n * Enumeration with all possible types for navigation failures. Can be passed to\n * {@link isNavigationFailure} to check for specific failures.\n */\nvar NavigationFailureType;\n(function (NavigationFailureType) {\n /**\n * An aborted navigation is a navigation that failed because a navigation\n * guard returned `false` or called `next(false)`\n */\n NavigationFailureType[NavigationFailureType[\"aborted\"] = 4] = \"aborted\";\n /**\n * A cancelled navigation is a navigation that failed because a more recent\n * navigation finished started (not necessarily finished).\n */\n NavigationFailureType[NavigationFailureType[\"cancelled\"] = 8] = \"cancelled\";\n /**\n * A duplicated navigation is a navigation that failed because it was\n * initiated while already being at the exact same location.\n */\n NavigationFailureType[NavigationFailureType[\"duplicated\"] = 16] = \"duplicated\";\n})(NavigationFailureType || (NavigationFailureType = {}));\n// DEV only debug messages\nconst ErrorTypeMessages = {\n [1 /* ErrorTypes.MATCHER_NOT_FOUND */]({ location, currentLocation }) {\n return `No match for\\n ${JSON.stringify(location)}${currentLocation\n ? '\\nwhile being at\\n' + JSON.stringify(currentLocation)\n : ''}`;\n },\n [2 /* ErrorTypes.NAVIGATION_GUARD_REDIRECT */]({ from, to, }) {\n return `Redirected from \"${from.fullPath}\" to \"${stringifyRoute(to)}\" via a navigation guard.`;\n },\n [4 /* ErrorTypes.NAVIGATION_ABORTED */]({ from, to }) {\n return `Navigation aborted from \"${from.fullPath}\" to \"${to.fullPath}\" via a navigation guard.`;\n },\n [8 /* ErrorTypes.NAVIGATION_CANCELLED */]({ from, to }) {\n return `Navigation cancelled from \"${from.fullPath}\" to \"${to.fullPath}\" with a new navigation.`;\n },\n [16 /* ErrorTypes.NAVIGATION_DUPLICATED */]({ from, to }) {\n return `Avoided redundant navigation to current location: \"${from.fullPath}\".`;\n },\n};\nfunction createRouterError(type, params) {\n // keep full error messages in cjs versions\n if ((process.env.NODE_ENV !== 'production') || !true) {\n return assign(new Error(ErrorTypeMessages[type](params)), {\n type,\n [NavigationFailureSymbol]: true,\n }, params);\n }\n else {\n return assign(new Error(), {\n type,\n [NavigationFailureSymbol]: true,\n }, params);\n }\n}\nfunction isNavigationFailure(error, type) {\n return (error instanceof Error &&\n NavigationFailureSymbol in error &&\n (type == null || !!(error.type & type)));\n}\nconst propertiesToLog = ['params', 'query', 'hash'];\nfunction stringifyRoute(to) {\n if (typeof to === 'string')\n return to;\n if ('path' in to)\n return to.path;\n const location = {};\n for (const key of propertiesToLog) {\n if (key in to)\n location[key] = to[key];\n }\n return JSON.stringify(location, null, 2);\n}\n\n// default pattern for a param: non-greedy everything but /\nconst BASE_PARAM_PATTERN = '[^/]+?';\nconst BASE_PATH_PARSER_OPTIONS = {\n sensitive: false,\n strict: false,\n start: true,\n end: true,\n};\n// Special Regex characters that must be escaped in static tokens\nconst REGEX_CHARS_RE = /[.+*?^${}()[\\]/\\\\]/g;\n/**\n * Creates a path parser from an array of Segments (a segment is an array of Tokens)\n *\n * @param segments - array of segments returned by tokenizePath\n * @param extraOptions - optional options for the regexp\n * @returns a PathParser\n */\nfunction tokensToParser(segments, extraOptions) {\n const options = assign({}, BASE_PATH_PARSER_OPTIONS, extraOptions);\n // the amount of scores is the same as the length of segments except for the root segment \"/\"\n const score = [];\n // the regexp as a string\n let pattern = options.start ? '^' : '';\n // extracted keys\n const keys = [];\n for (const segment of segments) {\n // the root segment needs special treatment\n const segmentScores = segment.length ? [] : [90 /* PathScore.Root */];\n // allow trailing slash\n if (options.strict && !segment.length)\n pattern += '/';\n for (let tokenIndex = 0; tokenIndex < segment.length; tokenIndex++) {\n const token = segment[tokenIndex];\n // resets the score if we are inside a sub-segment /:a-other-:b\n let subSegmentScore = 40 /* PathScore.Segment */ +\n (options.sensitive ? 0.25 /* PathScore.BonusCaseSensitive */ : 0);\n if (token.type === 0 /* TokenType.Static */) {\n // prepend the slash if we are starting a new segment\n if (!tokenIndex)\n pattern += '/';\n pattern += token.value.replace(REGEX_CHARS_RE, '\\\\$&');\n subSegmentScore += 40 /* PathScore.Static */;\n }\n else if (token.type === 1 /* TokenType.Param */) {\n const { value, repeatable, optional, regexp } = token;\n keys.push({\n name: value,\n repeatable,\n optional,\n });\n const re = regexp ? regexp : BASE_PARAM_PATTERN;\n // the user provided a custom regexp /:id(\\\\d+)\n if (re !== BASE_PARAM_PATTERN) {\n subSegmentScore += 10 /* PathScore.BonusCustomRegExp */;\n // make sure the regexp is valid before using it\n try {\n new RegExp(`(${re})`);\n }\n catch (err) {\n throw new Error(`Invalid custom RegExp for param \"${value}\" (${re}): ` +\n err.message);\n }\n }\n // when we repeat we must take care of the repeating leading slash\n let subPattern = repeatable ? `((?:${re})(?:/(?:${re}))*)` : `(${re})`;\n // prepend the slash if we are starting a new segment\n if (!tokenIndex)\n subPattern =\n // avoid an optional / if there are more segments e.g. /:p?-static\n // or /:p?-:p2\n optional && segment.length < 2\n ? `(?:/${subPattern})`\n : '/' + subPattern;\n if (optional)\n subPattern += '?';\n pattern += subPattern;\n subSegmentScore += 20 /* PathScore.Dynamic */;\n if (optional)\n subSegmentScore += -8 /* PathScore.BonusOptional */;\n if (repeatable)\n subSegmentScore += -20 /* PathScore.BonusRepeatable */;\n if (re === '.*')\n subSegmentScore += -50 /* PathScore.BonusWildcard */;\n }\n segmentScores.push(subSegmentScore);\n }\n // an empty array like /home/ -> [[{home}], []]\n // if (!segment.length) pattern += '/'\n score.push(segmentScores);\n }\n // only apply the strict bonus to the last score\n if (options.strict && options.end) {\n const i = score.length - 1;\n score[i][score[i].length - 1] += 0.7000000000000001 /* PathScore.BonusStrict */;\n }\n // TODO: dev only warn double trailing slash\n if (!options.strict)\n pattern += '/?';\n if (options.end)\n pattern += '$';\n // allow paths like /dynamic to only match dynamic or dynamic/... but not dynamic_something_else\n else if (options.strict)\n pattern += '(?:/|$)';\n const re = new RegExp(pattern, options.sensitive ? '' : 'i');\n function parse(path) {\n const match = path.match(re);\n const params = {};\n if (!match)\n return null;\n for (let i = 1; i < match.length; i++) {\n const value = match[i] || '';\n const key = keys[i - 1];\n params[key.name] = value && key.repeatable ? value.split('/') : value;\n }\n return params;\n }\n function stringify(params) {\n let path = '';\n // for optional parameters to allow to be empty\n let avoidDuplicatedSlash = false;\n for (const segment of segments) {\n if (!avoidDuplicatedSlash || !path.endsWith('/'))\n path += '/';\n avoidDuplicatedSlash = false;\n for (const token of segment) {\n if (token.type === 0 /* TokenType.Static */) {\n path += token.value;\n }\n else if (token.type === 1 /* TokenType.Param */) {\n const { value, repeatable, optional } = token;\n const param = value in params ? params[value] : '';\n if (isArray(param) && !repeatable) {\n throw new Error(`Provided param \"${value}\" is an array but it is not repeatable (* or + modifiers)`);\n }\n const text = isArray(param)\n ? param.join('/')\n : param;\n if (!text) {\n if (optional) {\n // if we have more than one optional param like /:a?-static we don't need to care about the optional param\n if (segment.length < 2) {\n // remove the last slash as we could be at the end\n if (path.endsWith('/'))\n path = path.slice(0, -1);\n // do not append a slash on the next iteration\n else\n avoidDuplicatedSlash = true;\n }\n }\n else\n throw new Error(`Missing required param \"${value}\"`);\n }\n path += text;\n }\n }\n }\n // avoid empty path when we have multiple optional params\n return path || '/';\n }\n return {\n re,\n score,\n keys,\n parse,\n stringify,\n };\n}\n/**\n * Compares an array of numbers as used in PathParser.score and returns a\n * number. This function can be used to `sort` an array\n *\n * @param a - first array of numbers\n * @param b - second array of numbers\n * @returns 0 if both are equal, < 0 if a should be sorted first, > 0 if b\n * should be sorted first\n */\nfunction compareScoreArray(a, b) {\n let i = 0;\n while (i < a.length && i < b.length) {\n const diff = b[i] - a[i];\n // only keep going if diff === 0\n if (diff)\n return diff;\n i++;\n }\n // if the last subsegment was Static, the shorter segments should be sorted first\n // otherwise sort the longest segment first\n if (a.length < b.length) {\n return a.length === 1 && a[0] === 40 /* PathScore.Static */ + 40 /* PathScore.Segment */\n ? -1\n : 1;\n }\n else if (a.length > b.length) {\n return b.length === 1 && b[0] === 40 /* PathScore.Static */ + 40 /* PathScore.Segment */\n ? 1\n : -1;\n }\n return 0;\n}\n/**\n * Compare function that can be used with `sort` to sort an array of PathParser\n *\n * @param a - first PathParser\n * @param b - second PathParser\n * @returns 0 if both are equal, < 0 if a should be sorted first, > 0 if b\n */\nfunction comparePathParserScore(a, b) {\n let i = 0;\n const aScore = a.score;\n const bScore = b.score;\n while (i < aScore.length && i < bScore.length) {\n const comp = compareScoreArray(aScore[i], bScore[i]);\n // do not return if both are equal\n if (comp)\n return comp;\n i++;\n }\n if (Math.abs(bScore.length - aScore.length) === 1) {\n if (isLastScoreNegative(aScore))\n return 1;\n if (isLastScoreNegative(bScore))\n return -1;\n }\n // if a and b share the same score entries but b has more, sort b first\n return bScore.length - aScore.length;\n // this is the ternary version\n // return aScore.length < bScore.length\n // ? 1\n // : aScore.length > bScore.length\n // ? -1\n // : 0\n}\n/**\n * This allows detecting splats at the end of a path: /home/:id(.*)*\n *\n * @param score - score to check\n * @returns true if the last entry is negative\n */\nfunction isLastScoreNegative(score) {\n const last = score[score.length - 1];\n return score.length > 0 && last[last.length - 1] < 0;\n}\n\nconst ROOT_TOKEN = {\n type: 0 /* TokenType.Static */,\n value: '',\n};\nconst VALID_PARAM_RE = /[a-zA-Z0-9_]/;\n// After some profiling, the cache seems to be unnecessary because tokenizePath\n// (the slowest part of adding a route) is very fast\n// const tokenCache = new Map<string, Token[][]>()\nfunction tokenizePath(path) {\n if (!path)\n return [[]];\n if (path === '/')\n return [[ROOT_TOKEN]];\n if (!path.startsWith('/')) {\n throw new Error((process.env.NODE_ENV !== 'production')\n ? `Route paths should start with a \"/\": \"${path}\" should be \"/${path}\".`\n : `Invalid path \"${path}\"`);\n }\n // if (tokenCache.has(path)) return tokenCache.get(path)!\n function crash(message) {\n throw new Error(`ERR (${state})/\"${buffer}\": ${message}`);\n }\n let state = 0 /* TokenizerState.Static */;\n let previousState = state;\n const tokens = [];\n // the segment will always be valid because we get into the initial state\n // with the leading /\n let segment;\n function finalizeSegment() {\n if (segment)\n tokens.push(segment);\n segment = [];\n }\n // index on the path\n let i = 0;\n // char at index\n let char;\n // buffer of the value read\n let buffer = '';\n // custom regexp for a param\n let customRe = '';\n function consumeBuffer() {\n if (!buffer)\n return;\n if (state === 0 /* TokenizerState.Static */) {\n segment.push({\n type: 0 /* TokenType.Static */,\n value: buffer,\n });\n }\n else if (state === 1 /* TokenizerState.Param */ ||\n state === 2 /* TokenizerState.ParamRegExp */ ||\n state === 3 /* TokenizerState.ParamRegExpEnd */) {\n if (segment.length > 1 && (char === '*' || char === '+'))\n crash(`A repeatable param (${buffer}) must be alone in its segment. eg: '/:ids+.`);\n segment.push({\n type: 1 /* TokenType.Param */,\n value: buffer,\n regexp: customRe,\n repeatable: char === '*' || char === '+',\n optional: char === '*' || char === '?',\n });\n }\n else {\n crash('Invalid state to consume buffer');\n }\n buffer = '';\n }\n function addCharToBuffer() {\n buffer += char;\n }\n while (i < path.length) {\n char = path[i++];\n if (char === '\\\\' && state !== 2 /* TokenizerState.ParamRegExp */) {\n previousState = state;\n state = 4 /* TokenizerState.EscapeNext */;\n continue;\n }\n switch (state) {\n case 0 /* TokenizerState.Static */:\n if (char === '/') {\n if (buffer) {\n consumeBuffer();\n }\n finalizeSegment();\n }\n else if (char === ':') {\n consumeBuffer();\n state = 1 /* TokenizerState.Param */;\n }\n else {\n addCharToBuffer();\n }\n break;\n case 4 /* TokenizerState.EscapeNext */:\n addCharToBuffer();\n state = previousState;\n break;\n case 1 /* TokenizerState.Param */:\n if (char === '(') {\n state = 2 /* TokenizerState.ParamRegExp */;\n }\n else if (VALID_PARAM_RE.test(char)) {\n addCharToBuffer();\n }\n else {\n consumeBuffer();\n state = 0 /* TokenizerState.Static */;\n // go back one character if we were not modifying\n if (char !== '*' && char !== '?' && char !== '+')\n i--;\n }\n break;\n case 2 /* TokenizerState.ParamRegExp */:\n // TODO: is it worth handling nested regexp? like :p(?:prefix_([^/]+)_suffix)\n // it already works by escaping the closing )\n // https://paths.esm.dev/?p=AAMeJbiAwQEcDKbAoAAkP60PG2R6QAvgNaA6AFACM2ABuQBB#\n // is this really something people need since you can also write\n // /prefix_:p()_suffix\n if (char === ')') {\n // handle the escaped )\n if (customRe[customRe.length - 1] == '\\\\')\n customRe = customRe.slice(0, -1) + char;\n else\n state = 3 /* TokenizerState.ParamRegExpEnd */;\n }\n else {\n customRe += char;\n }\n break;\n case 3 /* TokenizerState.ParamRegExpEnd */:\n // same as finalizing a param\n consumeBuffer();\n state = 0 /* TokenizerState.Static */;\n // go back one character if we were not modifying\n if (char !== '*' && char !== '?' && char !== '+')\n i--;\n customRe = '';\n break;\n default:\n crash('Unknown state');\n break;\n }\n }\n if (state === 2 /* TokenizerState.ParamRegExp */)\n crash(`Unfinished custom RegExp for param \"${buffer}\"`);\n consumeBuffer();\n finalizeSegment();\n // tokenCache.set(path, tokens)\n return tokens;\n}\n\nfunction createRouteRecordMatcher(record, parent, options) {\n const parser = tokensToParser(tokenizePath(record.path), options);\n // warn against params with the same name\n if ((process.env.NODE_ENV !== 'production')) {\n const existingKeys = new Set();\n for (const key of parser.keys) {\n if (existingKeys.has(key.name))\n warn(`Found duplicated params with name \"${key.name}\" for path \"${record.path}\". Only the last one will be available on \"$route.params\".`);\n existingKeys.add(key.name);\n }\n }\n const matcher = assign(parser, {\n record,\n parent,\n // these needs to be populated by the parent\n children: [],\n alias: [],\n });\n if (parent) {\n // both are aliases or both are not aliases\n // we don't want to mix them because the order is used when\n // passing originalRecord in Matcher.addRoute\n if (!matcher.record.aliasOf === !parent.record.aliasOf)\n parent.children.push(matcher);\n }\n return matcher;\n}\n\n/**\n * Creates a Router Matcher.\n *\n * @internal\n * @param routes - array of initial routes\n * @param globalOptions - global route options\n */\nfunction createRouterMatcher(routes, globalOptions) {\n // normalized ordered array of matchers\n const matchers = [];\n const matcherMap = new Map();\n globalOptions = mergeOptions({ strict: false, end: true, sensitive: false }, globalOptions);\n function getRecordMatcher(name) {\n return matcherMap.get(name);\n }\n function addRoute(record, parent, originalRecord) {\n // used later on to remove by name\n const isRootAdd = !originalRecord;\n const mainNormalizedRecord = normalizeRouteRecord(record);\n if ((process.env.NODE_ENV !== 'production')) {\n checkChildMissingNameWithEmptyPath(mainNormalizedRecord, parent);\n }\n // we might be the child of an alias\n mainNormalizedRecord.aliasOf = originalRecord && originalRecord.record;\n const options = mergeOptions(globalOptions, record);\n // generate an array of records to correctly handle aliases\n const normalizedRecords = [\n mainNormalizedRecord,\n ];\n if ('alias' in record) {\n const aliases = typeof record.alias === 'string' ? [record.alias] : record.alias;\n for (const alias of aliases) {\n normalizedRecords.push(assign({}, mainNormalizedRecord, {\n // this allows us to hold a copy of the `components` option\n // so that async components cache is hold on the original record\n components: originalRecord\n ? originalRecord.record.components\n : mainNormalizedRecord.components,\n path: alias,\n // we might be the child of an alias\n aliasOf: originalRecord\n ? originalRecord.record\n : mainNormalizedRecord,\n // the aliases are always of the same kind as the original since they\n // are defined on the same record\n }));\n }\n }\n let matcher;\n let originalMatcher;\n for (const normalizedRecord of normalizedRecords) {\n const { path } = normalizedRecord;\n // Build up the path for nested routes if the child isn't an absolute\n // route. Only add the / delimiter if the child path isn't empty and if the\n // parent path doesn't have a trailing slash\n if (parent && path[0] !== '/') {\n const parentPath = parent.record.path;\n const connectingSlash = parentPath[parentPath.length - 1] === '/' ? '' : '/';\n normalizedRecord.path =\n parent.record.path + (path && connectingSlash + path);\n }\n if ((process.env.NODE_ENV !== 'production') && normalizedRecord.path === '*') {\n throw new Error('Catch all routes (\"*\") must now be defined using a param with a custom regexp.\\n' +\n 'See more at https://next.router.vuejs.org/guide/migration/#removed-star-or-catch-all-routes.');\n }\n // create the object beforehand, so it can be passed to children\n matcher = createRouteRecordMatcher(normalizedRecord, parent, options);\n if ((process.env.NODE_ENV !== 'production') && parent && path[0] === '/')\n checkMissingParamsInAbsolutePath(matcher, parent);\n // if we are an alias we must tell the original record that we exist,\n // so we can be removed\n if (originalRecord) {\n originalRecord.alias.push(matcher);\n if ((process.env.NODE_ENV !== 'production')) {\n checkSameParams(originalRecord, matcher);\n }\n }\n else {\n // otherwise, the first record is the original and others are aliases\n originalMatcher = originalMatcher || matcher;\n if (originalMatcher !== matcher)\n originalMatcher.alias.push(matcher);\n // remove the route if named and only for the top record (avoid in nested calls)\n // this works because the original record is the first one\n if (isRootAdd && record.name && !isAliasRecord(matcher))\n removeRoute(record.name);\n }\n if (mainNormalizedRecord.children) {\n const children = mainNormalizedRecord.children;\n for (let i = 0; i < children.length; i++) {\n addRoute(children[i], matcher, originalRecord && originalRecord.children[i]);\n }\n }\n // if there was no original record, then the first one was not an alias and all\n // other aliases (if any) need to reference this record when adding children\n originalRecord = originalRecord || matcher;\n // TODO: add normalized records for more flexibility\n // if (parent && isAliasRecord(originalRecord)) {\n // parent.children.push(originalRecord)\n // }\n // Avoid adding a record that doesn't display anything. This allows passing through records without a component to\n // not be reached and pass through the catch all route\n if ((matcher.record.components &&\n Object.keys(matcher.record.components).length) ||\n matcher.record.name ||\n matcher.record.redirect) {\n insertMatcher(matcher);\n }\n }\n return originalMatcher\n ? () => {\n // since other matchers are aliases, they should be removed by the original matcher\n removeRoute(originalMatcher);\n }\n : noop;\n }\n function removeRoute(matcherRef) {\n if (isRouteName(matcherRef)) {\n const matcher = matcherMap.get(matcherRef);\n if (matcher) {\n matcherMap.delete(matcherRef);\n matchers.splice(matchers.indexOf(matcher), 1);\n matcher.children.forEach(removeRoute);\n matcher.alias.forEach(removeRoute);\n }\n }\n else {\n const index = matchers.indexOf(matcherRef);\n if (index > -1) {\n matchers.splice(index, 1);\n if (matcherRef.record.name)\n matcherMap.delete(matcherRef.record.name);\n matcherRef.children.forEach(removeRoute);\n matcherRef.alias.forEach(removeRoute);\n }\n }\n }\n function getRoutes() {\n return matchers;\n }\n function insertMatcher(matcher) {\n let i = 0;\n while (i < matchers.length &&\n comparePathParserScore(matcher, matchers[i]) >= 0 &&\n // Adding children with empty path should still appear before the parent\n // https://github.com/vuejs/router/issues/1124\n (matcher.record.path !== matchers[i].record.path ||\n !isRecordChildOf(matcher, matchers[i])))\n i++;\n matchers.splice(i, 0, matcher);\n // only add the original record to the name map\n if (matcher.record.name && !isAliasRecord(matcher))\n matcherMap.set(matcher.record.name, matcher);\n }\n function resolve(location, currentLocation) {\n let matcher;\n let params = {};\n let path;\n let name;\n if ('name' in location && location.name) {\n matcher = matcherMap.get(location.name);\n if (!matcher)\n throw createRouterError(1 /* ErrorTypes.MATCHER_NOT_FOUND */, {\n location,\n });\n // warn if the user is passing invalid params so they can debug it better when they get removed\n if ((process.env.NODE_ENV !== 'production')) {\n const invalidParams = Object.keys(location.params || {}).filter(paramName => !matcher.keys.find(k => k.name === paramName));\n if (invalidParams.length) {\n warn(`Discarded invalid param(s) \"${invalidParams.join('\", \"')}\" when navigating. See https://github.com/vuejs/router/blob/main/packages/router/CHANGELOG.md#414-2022-08-22 for more details.`);\n }\n }\n name = matcher.record.name;\n params = assign(\n // paramsFromLocation is a new object\n paramsFromLocation(currentLocation.params, \n // only keep params that exist in the resolved location\n // TODO: only keep optional params coming from a parent record\n matcher.keys.filter(k => !k.optional).map(k => k.name)), \n // discard any existing params in the current location that do not exist here\n // #1497 this ensures better active/exact matching\n location.params &&\n paramsFromLocation(location.params, matcher.keys.map(k => k.name)));\n // throws if cannot be stringified\n path = matcher.stringify(params);\n }\n else if ('path' in location) {\n // no need to resolve the path with the matcher as it was provided\n // this also allows the user to control the encoding\n path = location.path;\n if ((process.env.NODE_ENV !== 'production') && !path.startsWith('/')) {\n warn(`The Matcher cannot resolve relative paths but received \"${path}\". Unless you directly called \\`matcher.resolve(\"${path}\")\\`, this is probably a bug in vue-router. Please open an issue at https://github.com/vuejs/router/issues/new/choose.`);\n }\n matcher = matchers.find(m => m.re.test(path));\n // matcher should have a value after the loop\n if (matcher) {\n // we know the matcher works because we tested the regexp\n params = matcher.parse(path);\n name = matcher.record.name;\n }\n // location is a relative path\n }\n else {\n // match by name or path of current route\n matcher = currentLocation.name\n ? matcherMap.get(currentLocation.name)\n : matchers.find(m => m.re.test(currentLocation.path));\n if (!matcher)\n throw createRouterError(1 /* ErrorTypes.MATCHER_NOT_FOUND */, {\n location,\n currentLocation,\n });\n name = matcher.record.name;\n // since we are navigating to the same location, we don't need to pick the\n // params like when `name` is provided\n params = assign({}, currentLocation.params, location.params);\n path = matcher.stringify(params);\n }\n const matched = [];\n let parentMatcher = matcher;\n while (parentMatcher) {\n // reversed order so parents are at the beginning\n matched.unshift(parentMatcher.record);\n parentMatcher = parentMatcher.parent;\n }\n return {\n name,\n path,\n params,\n matched,\n meta: mergeMetaFields(matched),\n };\n }\n // add initial routes\n routes.forEach(route => addRoute(route));\n return { addRoute, resolve, removeRoute, getRoutes, getRecordMatcher };\n}\nfunction paramsFromLocation(params, keys) {\n const newParams = {};\n for (const key of keys) {\n if (key in params)\n newParams[key] = params[key];\n }\n return newParams;\n}\n/**\n * Normalizes a RouteRecordRaw. Creates a copy\n *\n * @param record\n * @returns the normalized version\n */\nfunction normalizeRouteRecord(record) {\n return {\n path: record.path,\n redirect: record.redirect,\n name: record.name,\n meta: record.meta || {},\n aliasOf: undefined,\n beforeEnter: record.beforeEnter,\n props: normalizeRecordProps(record),\n children: record.children || [],\n instances: {},\n leaveGuards: new Set(),\n updateGuards: new Set(),\n enterCallbacks: {},\n components: 'components' in record\n ? record.components || null\n : record.component && { default: record.component },\n };\n}\n/**\n * Normalize the optional `props` in a record to always be an object similar to\n * components. Also accept a boolean for components.\n * @param record\n */\nfunction normalizeRecordProps(record) {\n const propsObject = {};\n // props does not exist on redirect records, but we can set false directly\n const props = record.props || false;\n if ('component' in record) {\n propsObject.default = props;\n }\n else {\n // NOTE: we could also allow a function to be applied to every component.\n // Would need user feedback for use cases\n for (const name in record.components)\n propsObject[name] = typeof props === 'object' ? props[name] : props;\n }\n return propsObject;\n}\n/**\n * Checks if a record or any of its parent is an alias\n * @param record\n */\nfunction isAliasRecord(record) {\n while (record) {\n if (record.record.aliasOf)\n return true;\n record = record.parent;\n }\n return false;\n}\n/**\n * Merge meta fields of an array of records\n *\n * @param matched - array of matched records\n */\nfunction mergeMetaFields(matched) {\n return matched.reduce((meta, record) => assign(meta, record.meta), {});\n}\nfunction mergeOptions(defaults, partialOptions) {\n const options = {};\n for (const key in defaults) {\n options[key] = key in partialOptions ? partialOptions[key] : defaults[key];\n }\n return options;\n}\nfunction isSameParam(a, b) {\n return (a.name === b.name &&\n a.optional === b.optional &&\n a.repeatable === b.repeatable);\n}\n/**\n * Check if a path and its alias have the same required params\n *\n * @param a - original record\n * @param b - alias record\n */\nfunction checkSameParams(a, b) {\n for (const key of a.keys) {\n if (!key.optional && !b.keys.find(isSameParam.bind(null, key)))\n return warn(`Alias \"${b.record.path}\" and the original record: \"${a.record.path}\" must have the exact same param named \"${key.name}\"`);\n }\n for (const key of b.keys) {\n if (!key.optional && !a.keys.find(isSameParam.bind(null, key)))\n return warn(`Alias \"${b.record.path}\" and the original record: \"${a.record.path}\" must have the exact same param named \"${key.name}\"`);\n }\n}\n/**\n * A route with a name and a child with an empty path without a name should warn when adding the route\n *\n * @param mainNormalizedRecord - RouteRecordNormalized\n * @param parent - RouteRecordMatcher\n */\nfunction checkChildMissingNameWithEmptyPath(mainNormalizedRecord, parent) {\n if (parent &&\n parent.record.name &&\n !mainNormalizedRecord.name &&\n !mainNormalizedRecord.path) {\n warn(`The route named \"${String(parent.record.name)}\" has a child without a name and an empty path. Using that name won't render the empty path child so you probably want to move the name to the child instead. If this is intentional, add a name to the child route to remove the warning.`);\n }\n}\nfunction checkMissingParamsInAbsolutePath(record, parent) {\n for (const key of parent.keys) {\n if (!record.keys.find(isSameParam.bind(null, key)))\n return warn(`Absolute path \"${record.record.path}\" must have the exact same param named \"${key.name}\" as its parent \"${parent.record.path}\".`);\n }\n}\nfunction isRecordChildOf(record, parent) {\n return parent.children.some(child => child === record || isRecordChildOf(record, child));\n}\n\n/**\n * Encoding Rules ␣ = Space Path: ␣ \" < > # ? { } Query: ␣ \" < > # & = Hash: ␣ \"\n * < > `\n *\n * On top of that, the RFC3986 (https://tools.ietf.org/html/rfc3986#section-2.2)\n * defines some extra characters to be encoded. Most browsers do not encode them\n * in encodeURI https://github.com/whatwg/url/issues/369, so it may be safer to\n * also encode `!'()*`. Leaving un-encoded only ASCII alphanumeric(`a-zA-Z0-9`)\n * plus `-._~`. This extra safety should be applied to query by patching the\n * string returned by encodeURIComponent encodeURI also encodes `[\\]^`. `\\`\n * should be encoded to avoid ambiguity. Browsers (IE, FF, C) transform a `\\`\n * into a `/` if directly typed in. The _backtick_ (`````) should also be\n * encoded everywhere because some browsers like FF encode it when directly\n * written while others don't. Safari and IE don't encode ``\"<>{}``` in hash.\n */\n// const EXTRA_RESERVED_RE = /[!'()*]/g\n// const encodeReservedReplacer = (c: string) => '%' + c.charCodeAt(0).toString(16)\nconst HASH_RE = /#/g; // %23\nconst AMPERSAND_RE = /&/g; // %26\nconst SLASH_RE = /\\//g; // %2F\nconst EQUAL_RE = /=/g; // %3D\nconst IM_RE = /\\?/g; // %3F\nconst PLUS_RE = /\\+/g; // %2B\n/**\n * NOTE: It's not clear to me if we should encode the + symbol in queries, it\n * seems to be less flexible than not doing so and I can't find out the legacy\n * systems requiring this for regular requests like text/html. In the standard,\n * the encoding of the plus character is only mentioned for\n * application/x-www-form-urlencoded\n * (https://url.spec.whatwg.org/#urlencoded-parsing) and most browsers seems lo\n * leave the plus character as is in queries. To be more flexible, we allow the\n * plus character on the query, but it can also be manually encoded by the user.\n *\n * Resources:\n * - https://url.spec.whatwg.org/#urlencoded-parsing\n * - https://stackoverflow.com/questions/1634271/url-encoding-the-space-character-or-20\n */\nconst ENC_BRACKET_OPEN_RE = /%5B/g; // [\nconst ENC_BRACKET_CLOSE_RE = /%5D/g; // ]\nconst ENC_CARET_RE = /%5E/g; // ^\nconst ENC_BACKTICK_RE = /%60/g; // `\nconst ENC_CURLY_OPEN_RE = /%7B/g; // {\nconst ENC_PIPE_RE = /%7C/g; // |\nconst ENC_CURLY_CLOSE_RE = /%7D/g; // }\nconst ENC_SPACE_RE = /%20/g; // }\n/**\n * Encode characters that need to be encoded on the path, search and hash\n * sections of the URL.\n *\n * @internal\n * @param text - string to encode\n * @returns encoded string\n */\nfunction commonEncode(text) {\n return encodeURI('' + text)\n .replace(ENC_PIPE_RE, '|')\n .replace(ENC_BRACKET_OPEN_RE, '[')\n .replace(ENC_BRACKET_CLOSE_RE, ']');\n}\n/**\n * Encode characters that need to be encoded on the hash section of the URL.\n *\n * @param text - string to encode\n * @returns encoded string\n */\nfunction encodeHash(text) {\n return commonEncode(text)\n .replace(ENC_CURLY_OPEN_RE, '{')\n .replace(ENC_CURLY_CLOSE_RE, '}')\n .replace(ENC_CARET_RE, '^');\n}\n/**\n * Encode characters that need to be encoded query values on the query\n * section of the URL.\n *\n * @param text - string to encode\n * @returns encoded string\n */\nfunction encodeQueryValue(text) {\n return (commonEncode(text)\n // Encode the space as +, encode the + to differentiate it from the space\n .replace(PLUS_RE, '%2B')\n .replace(ENC_SPACE_RE, '+')\n .replace(HASH_RE, '%23')\n .replace(AMPERSAND_RE, '%26')\n .replace(ENC_BACKTICK_RE, '`')\n .replace(ENC_CURLY_OPEN_RE, '{')\n .replace(ENC_CURLY_CLOSE_RE, '}')\n .replace(ENC_CARET_RE, '^'));\n}\n/**\n * Like `encodeQueryValue` but also encodes the `=` character.\n *\n * @param text - string to encode\n */\nfunction encodeQueryKey(text) {\n return encodeQueryValue(text).replace(EQUAL_RE, '%3D');\n}\n/**\n * Encode characters that need to be encoded on the path section of the URL.\n *\n * @param text - string to encode\n * @returns encoded string\n */\nfunction encodePath(text) {\n return commonEncode(text).replace(HASH_RE, '%23').replace(IM_RE, '%3F');\n}\n/**\n * Encode characters that need to be encoded on the path section of the URL as a\n * param. This function encodes everything {@link encodePath} does plus the\n * slash (`/`) character. If `text` is `null` or `undefined`, returns an empty\n * string instead.\n *\n * @param text - string to encode\n * @returns encoded string\n */\nfunction encodeParam(text) {\n return text == null ? '' : encodePath(text).replace(SLASH_RE, '%2F');\n}\n/**\n * Decode text using `decodeURIComponent`. Returns the original text if it\n * fails.\n *\n * @param text - string to decode\n * @returns decoded string\n */\nfunction decode(text) {\n try {\n return decodeURIComponent('' + text);\n }\n catch (err) {\n (process.env.NODE_ENV !== 'production') && warn(`Error decoding \"${text}\". Using original value`);\n }\n return '' + text;\n}\n\n/**\n * Transforms a queryString into a {@link LocationQuery} object. Accept both, a\n * version with the leading `?` and without Should work as URLSearchParams\n\n * @internal\n *\n * @param search - search string to parse\n * @returns a query object\n */\nfunction parseQuery(search) {\n const query = {};\n // avoid creating an object with an empty key and empty value\n // because of split('&')\n if (search === '' || search === '?')\n return query;\n const hasLeadingIM = search[0] === '?';\n const searchParams = (hasLeadingIM ? search.slice(1) : search).split('&');\n for (let i = 0; i < searchParams.length; ++i) {\n // pre decode the + into space\n const searchParam = searchParams[i].replace(PLUS_RE, ' ');\n // allow the = character\n const eqPos = searchParam.indexOf('=');\n const key = decode(eqPos < 0 ? searchParam : searchParam.slice(0, eqPos));\n const value = eqPos < 0 ? null : decode(searchParam.slice(eqPos + 1));\n if (key in query) {\n // an extra variable for ts types\n let currentValue = query[key];\n if (!isArray(currentValue)) {\n currentValue = query[key] = [currentValue];\n }\n currentValue.push(value);\n }\n else {\n query[key] = value;\n }\n }\n return query;\n}\n/**\n * Stringifies a {@link LocationQueryRaw} object. Like `URLSearchParams`, it\n * doesn't prepend a `?`\n *\n * @internal\n *\n * @param query - query object to stringify\n * @returns string version of the query without the leading `?`\n */\nfunction stringifyQuery(query) {\n let search = '';\n for (let key in query) {\n const value = query[key];\n key = encodeQueryKey(key);\n if (value == null) {\n // only null adds the value\n if (value !== undefined) {\n search += (search.length ? '&' : '') + key;\n }\n continue;\n }\n // keep null values\n const values = isArray(value)\n ? value.map(v => v && encodeQueryValue(v))\n : [value && encodeQueryValue(value)];\n values.forEach(value => {\n // skip undefined values in arrays as if they were not present\n // smaller code than using filter\n if (value !== undefined) {\n // only append & with non-empty search\n search += (search.length ? '&' : '') + key;\n if (value != null)\n search += '=' + value;\n }\n });\n }\n return search;\n}\n/**\n * Transforms a {@link LocationQueryRaw} into a {@link LocationQuery} by casting\n * numbers into strings, removing keys with an undefined value and replacing\n * undefined with null in arrays\n *\n * @param query - query object to normalize\n * @returns a normalized query object\n */\nfunction normalizeQuery(query) {\n const normalizedQuery = {};\n for (const key in query) {\n const value = query[key];\n if (value !== undefined) {\n normalizedQuery[key] = isArray(value)\n ? value.map(v => (v == null ? null : '' + v))\n : value == null\n ? value\n : '' + value;\n }\n }\n return normalizedQuery;\n}\n\n/**\n * RouteRecord being rendered by the closest ancestor Router View. Used for\n * `onBeforeRouteUpdate` and `onBeforeRouteLeave`. rvlm stands for Router View\n * Location Matched\n *\n * @internal\n */\nconst matchedRouteKey = Symbol((process.env.NODE_ENV !== 'production') ? 'router view location matched' : '');\n/**\n * Allows overriding the router view depth to control which component in\n * `matched` is rendered. rvd stands for Router View Depth\n *\n * @internal\n */\nconst viewDepthKey = Symbol((process.env.NODE_ENV !== 'production') ? 'router view depth' : '');\n/**\n * Allows overriding the router instance returned by `useRouter` in tests. r\n * stands for router\n *\n * @internal\n */\nconst routerKey = Symbol((process.env.NODE_ENV !== 'production') ? 'router' : '');\n/**\n * Allows overriding the current route returned by `useRoute` in tests. rl\n * stands for route location\n *\n * @internal\n */\nconst routeLocationKey = Symbol((process.env.NODE_ENV !== 'production') ? 'route location' : '');\n/**\n * Allows overriding the current route used by router-view. Internally this is\n * used when the `route` prop is passed.\n *\n * @internal\n */\nconst routerViewLocationKey = Symbol((process.env.NODE_ENV !== 'production') ? 'router view location' : '');\n\n/**\n * Create a list of callbacks that can be reset. Used to create before and after navigation guards list\n */\nfunction useCallbacks() {\n let handlers = [];\n function add(handler) {\n handlers.push(handler);\n return () => {\n const i = handlers.indexOf(handler);\n if (i > -1)\n handlers.splice(i, 1);\n };\n }\n function reset() {\n handlers = [];\n }\n return {\n add,\n list: () => handlers.slice(),\n reset,\n };\n}\n\nfunction registerGuard(record, name, guard) {\n const removeFromList = () => {\n record[name].delete(guard);\n };\n onUnmounted(removeFromList);\n onDeactivated(removeFromList);\n onActivated(() => {\n record[name].add(guard);\n });\n record[name].add(guard);\n}\n/**\n * Add a navigation guard that triggers whenever the component for the current\n * location is about to be left. Similar to {@link beforeRouteLeave} but can be\n * used in any component. The guard is removed when the component is unmounted.\n *\n * @param leaveGuard - {@link NavigationGuard}\n */\nfunction onBeforeRouteLeave(leaveGuard) {\n if ((process.env.NODE_ENV !== 'production') && !getCurrentInstance()) {\n warn('getCurrentInstance() returned null. onBeforeRouteLeave() must be called at the top of a setup function');\n return;\n }\n const activeRecord = inject(matchedRouteKey, \n // to avoid warning\n {}).value;\n if (!activeRecord) {\n (process.env.NODE_ENV !== 'production') &&\n warn('No active route record was found when calling `onBeforeRouteLeave()`. Make sure you call this function inside a component child of <router-view>. Maybe you called it inside of App.vue?');\n return;\n }\n registerGuard(activeRecord, 'leaveGuards', leaveGuard);\n}\n/**\n * Add a navigation guard that triggers whenever the current location is about\n * to be updated. Similar to {@link beforeRouteUpdate} but can be used in any\n * component. The guard is removed when the component is unmounted.\n *\n * @param updateGuard - {@link NavigationGuard}\n */\nfunction onBeforeRouteUpdate(updateGuard) {\n if ((process.env.NODE_ENV !== 'production') && !getCurrentInstance()) {\n warn('getCurrentInstance() returned null. onBeforeRouteUpdate() must be called at the top of a setup function');\n return;\n }\n const activeRecord = inject(matchedRouteKey, \n // to avoid warning\n {}).value;\n if (!activeRecord) {\n (process.env.NODE_ENV !== 'production') &&\n warn('No active route record was found when calling `onBeforeRouteUpdate()`. Make sure you call this function inside a component child of <router-view>. Maybe you called it inside of App.vue?');\n return;\n }\n registerGuard(activeRecord, 'updateGuards', updateGuard);\n}\nfunction guardToPromiseFn(guard, to, from, record, name) {\n // keep a reference to the enterCallbackArray to prevent pushing callbacks if a new navigation took place\n const enterCallbackArray = record &&\n // name is defined if record is because of the function overload\n (record.enterCallbacks[name] = record.enterCallbacks[name] || []);\n return () => new Promise((resolve, reject) => {\n const next = (valid) => {\n if (valid === false) {\n reject(createRouterError(4 /* ErrorTypes.NAVIGATION_ABORTED */, {\n from,\n to,\n }));\n }\n else if (valid instanceof Error) {\n reject(valid);\n }\n else if (isRouteLocation(valid)) {\n reject(createRouterError(2 /* ErrorTypes.NAVIGATION_GUARD_REDIRECT */, {\n from: to,\n to: valid,\n }));\n }\n else {\n if (enterCallbackArray &&\n // since enterCallbackArray is truthy, both record and name also are\n record.enterCallbacks[name] === enterCallbackArray &&\n typeof valid === 'function') {\n enterCallbackArray.push(valid);\n }\n resolve();\n }\n };\n // wrapping with Promise.resolve allows it to work with both async and sync guards\n const guardReturn = guard.call(record && record.instances[name], to, from, (process.env.NODE_ENV !== 'production') ? canOnlyBeCalledOnce(next, to, from) : next);\n let guardCall = Promise.resolve(guardReturn);\n if (guard.length < 3)\n guardCall = guardCall.then(next);\n if ((process.env.NODE_ENV !== 'production') && guard.length > 2) {\n const message = `The \"next\" callback was never called inside of ${guard.name ? '\"' + guard.name + '\"' : ''}:\\n${guard.toString()}\\n. If you are returning a value instead of calling \"next\", make sure to remove the \"next\" parameter from your function.`;\n if (typeof guardReturn === 'object' && 'then' in guardReturn) {\n guardCall = guardCall.then(resolvedValue => {\n // @ts-expect-error: _called is added at canOnlyBeCalledOnce\n if (!next._called) {\n warn(message);\n return Promise.reject(new Error('Invalid navigation guard'));\n }\n return resolvedValue;\n });\n }\n else if (guardReturn !== undefined) {\n // @ts-expect-error: _called is added at canOnlyBeCalledOnce\n if (!next._called) {\n warn(message);\n reject(new Error('Invalid navigation guard'));\n return;\n }\n }\n }\n guardCall.catch(err => reject(err));\n });\n}\nfunction canOnlyBeCalledOnce(next, to, from) {\n let called = 0;\n return function () {\n if (called++ === 1)\n warn(`The \"next\" callback was called more than once in one navigation guard when going from \"${from.fullPath}\" to \"${to.fullPath}\". It should be called exactly one time in each navigation guard. This will fail in production.`);\n // @ts-expect-error: we put it in the original one because it's easier to check\n next._called = true;\n if (called === 1)\n next.apply(null, arguments);\n };\n}\nfunction extractComponentsGuards(matched, guardType, to, from) {\n const guards = [];\n for (const record of matched) {\n if ((process.env.NODE_ENV !== 'production') && !record.components && !record.children.length) {\n warn(`Record with path \"${record.path}\" is either missing a \"component(s)\"` +\n ` or \"children\" property.`);\n }\n for (const name in record.components) {\n let rawComponent = record.components[name];\n if ((process.env.NODE_ENV !== 'production')) {\n if (!rawComponent ||\n (typeof rawComponent !== 'object' &&\n typeof rawComponent !== 'function')) {\n warn(`Component \"${name}\" in record with path \"${record.path}\" is not` +\n ` a valid component. Received \"${String(rawComponent)}\".`);\n // throw to ensure we stop here but warn to ensure the message isn't\n // missed by the user\n throw new Error('Invalid route component');\n }\n else if ('then' in rawComponent) {\n // warn if user wrote import('/component.vue') instead of () =>\n // import('./component.vue')\n warn(`Component \"${name}\" in record with path \"${record.path}\" is a ` +\n `Promise instead of a function that returns a Promise. Did you ` +\n `write \"import('./MyPage.vue')\" instead of ` +\n `\"() => import('./MyPage.vue')\" ? This will break in ` +\n `production if not fixed.`);\n const promise = rawComponent;\n rawComponent = () => promise;\n }\n else if (rawComponent.__asyncLoader &&\n // warn only once per component\n !rawComponent.__warnedDefineAsync) {\n rawComponent.__warnedDefineAsync = true;\n warn(`Component \"${name}\" in record with path \"${record.path}\" is defined ` +\n `using \"defineAsyncComponent()\". ` +\n `Write \"() => import('./MyPage.vue')\" instead of ` +\n `\"defineAsyncComponent(() => import('./MyPage.vue'))\".`);\n }\n }\n // skip update and leave guards if the route component is not mounted\n if (guardType !== 'beforeRouteEnter' && !record.instances[name])\n continue;\n if (isRouteComponent(rawComponent)) {\n // __vccOpts is added by vue-class-component and contain the regular options\n const options = rawComponent.__vccOpts || rawComponent;\n const guard = options[guardType];\n guard && guards.push(guardToPromiseFn(guard, to, from, record, name));\n }\n else {\n // start requesting the chunk already\n let componentPromise = rawComponent();\n if ((process.env.NODE_ENV !== 'production') && !('catch' in componentPromise)) {\n warn(`Component \"${name}\" in record with path \"${record.path}\" is a function that does not return a Promise. If you were passing a functional component, make sure to add a \"displayName\" to the component. This will break in production if not fixed.`);\n componentPromise = Promise.resolve(componentPromise);\n }\n guards.push(() => componentPromise.then(resolved => {\n if (!resolved)\n return Promise.reject(new Error(`Couldn't resolve component \"${name}\" at \"${record.path}\"`));\n const resolvedComponent = isESModule(resolved)\n ? resolved.default\n : resolved;\n // replace the function with the resolved component\n // cannot be null or undefined because we went into the for loop\n record.components[name] = resolvedComponent;\n // __vccOpts is added by vue-class-component and contain the regular options\n const options = resolvedComponent.__vccOpts || resolvedComponent;\n const guard = options[guardType];\n return guard && guardToPromiseFn(guard, to, from, record, name)();\n }));\n }\n }\n }\n return guards;\n}\n/**\n * Allows differentiating lazy components from functional components and vue-class-component\n * @internal\n *\n * @param component\n */\nfunction isRouteComponent(component) {\n return (typeof component === 'object' ||\n 'displayName' in component ||\n 'props' in component ||\n '__vccOpts' in component);\n}\n/**\n * Ensures a route is loaded, so it can be passed as o prop to `<RouterView>`.\n *\n * @param route - resolved route to load\n */\nfunction loadRouteLocation(route) {\n return route.matched.every(record => record.redirect)\n ? Promise.reject(new Error('Cannot load a route that redirects.'))\n : Promise.all(route.matched.map(record => record.components &&\n Promise.all(Object.keys(record.components).reduce((promises, name) => {\n const rawComponent = record.components[name];\n if (typeof rawComponent === 'function' &&\n !('displayName' in rawComponent)) {\n promises.push(rawComponent().then(resolved => {\n if (!resolved)\n return Promise.reject(new Error(`Couldn't resolve component \"${name}\" at \"${record.path}\". Ensure you passed a function that returns a promise.`));\n const resolvedComponent = isESModule(resolved)\n ? resolved.default\n : resolved;\n // replace the function with the resolved component\n // cannot be null or undefined because we went into the for loop\n record.components[name] = resolvedComponent;\n return;\n }));\n }\n return promises;\n }, [])))).then(() => route);\n}\n\n// TODO: we could allow currentRoute as a prop to expose `isActive` and\n// `isExactActive` behavior should go through an RFC\nfunction useLink(props) {\n const router = inject(routerKey);\n const currentRoute = inject(routeLocationKey);\n const route = computed(() => router.resolve(unref(props.to)));\n const activeRecordIndex = computed(() => {\n const { matched } = route.value;\n const { length } = matched;\n const routeMatched = matched[length - 1];\n const currentMatched = currentRoute.matched;\n if (!routeMatched || !currentMatched.length)\n return -1;\n const index = currentMatched.findIndex(isSameRouteRecord.bind(null, routeMatched));\n if (index > -1)\n return index;\n // possible parent record\n const parentRecordPath = getOriginalPath(matched[length - 2]);\n return (\n // we are dealing with nested routes\n length > 1 &&\n // if the parent and matched route have the same path, this link is\n // referring to the empty child. Or we currently are on a different\n // child of the same parent\n getOriginalPath(routeMatched) === parentRecordPath &&\n // avoid comparing the child with its parent\n currentMatched[currentMatched.length - 1].path !== parentRecordPath\n ? currentMatched.findIndex(isSameRouteRecord.bind(null, matched[length - 2]))\n : index);\n });\n const isActive = computed(() => activeRecordIndex.value > -1 &&\n includesParams(currentRoute.params, route.value.params));\n const isExactActive = computed(() => activeRecordIndex.value > -1 &&\n activeRecordIndex.value === currentRoute.matched.length - 1 &&\n isSameRouteLocationParams(currentRoute.params, route.value.params));\n function navigate(e = {}) {\n if (guardEvent(e)) {\n return router[unref(props.replace) ? 'replace' : 'push'](unref(props.to)\n // avoid uncaught errors are they are logged anyway\n ).catch(noop);\n }\n return Promise.resolve();\n }\n // devtools only\n if (((process.env.NODE_ENV !== 'production') || __VUE_PROD_DEVTOOLS__) && isBrowser) {\n const instance = getCurrentInstance();\n if (instance) {\n const linkContextDevtools = {\n route: route.value,\n isActive: isActive.value,\n isExactActive: isExactActive.value,\n };\n // @ts-expect-error: this is internal\n instance.__vrl_devtools = instance.__vrl_devtools || [];\n // @ts-expect-error: this is internal\n instance.__vrl_devtools.push(linkContextDevtools);\n watchEffect(() => {\n linkContextDevtools.route = route.value;\n linkContextDevtools.isActive = isActive.value;\n linkContextDevtools.isExactActive = isExactActive.value;\n }, { flush: 'post' });\n }\n }\n /**\n * NOTE: update {@link _RouterLinkI}'s `$slots` type when updating this\n */\n return {\n route,\n href: computed(() => route.value.href),\n isActive,\n isExactActive,\n navigate,\n };\n}\nconst RouterLinkImpl = /*#__PURE__*/ defineComponent({\n name: 'RouterLink',\n compatConfig: { MODE: 3 },\n props: {\n to: {\n type: [String, Object],\n required: true,\n },\n replace: Boolean,\n activeClass: String,\n // inactiveClass: String,\n exactActiveClass: String,\n custom: Boolean,\n ariaCurrentValue: {\n type: String,\n default: 'page',\n },\n },\n useLink,\n setup(props, { slots }) {\n const link = reactive(useLink(props));\n const { options } = inject(routerKey);\n const elClass = computed(() => ({\n [getLinkClass(props.activeClass, options.linkActiveClass, 'router-link-active')]: link.isActive,\n // [getLinkClass(\n // props.inactiveClass,\n // options.linkInactiveClass,\n // 'router-link-inactive'\n // )]: !link.isExactActive,\n [getLinkClass(props.exactActiveClass, options.linkExactActiveClass, 'router-link-exact-active')]: link.isExactActive,\n }));\n return () => {\n const children = slots.default && slots.default(link);\n return props.custom\n ? children\n : h('a', {\n 'aria-current': link.isExactActive\n ? props.ariaCurrentValue\n : null,\n href: link.href,\n // this would override user added attrs but Vue will still add\n // the listener, so we end up triggering both\n onClick: link.navigate,\n class: elClass.value,\n }, children);\n };\n },\n});\n// export the public type for h/tsx inference\n// also to avoid inline import() in generated d.ts files\n/**\n * Component to render a link that triggers a navigation on click.\n */\nconst RouterLink = RouterLinkImpl;\nfunction guardEvent(e) {\n // don't redirect with control keys\n if (e.metaKey || e.altKey || e.ctrlKey || e.shiftKey)\n return;\n // don't redirect when preventDefault called\n if (e.defaultPrevented)\n return;\n // don't redirect on right click\n if (e.button !== undefined && e.button !== 0)\n return;\n // don't redirect if `target=\"_blank\"`\n // @ts-expect-error getAttribute does exist\n if (e.currentTarget && e.currentTarget.getAttribute) {\n // @ts-expect-error getAttribute exists\n const target = e.currentTarget.getAttribute('target');\n if (/\\b_blank\\b/i.test(target))\n return;\n }\n // this may be a Weex event which doesn't have this method\n if (e.preventDefault)\n e.preventDefault();\n return true;\n}\nfunction includesParams(outer, inner) {\n for (const key in inner) {\n const innerValue = inner[key];\n const outerValue = outer[key];\n if (typeof innerValue === 'string') {\n if (innerValue !== outerValue)\n return false;\n }\n else {\n if (!isArray(outerValue) ||\n outerValue.length !== innerValue.length ||\n innerValue.some((value, i) => value !== outerValue[i]))\n return false;\n }\n }\n return true;\n}\n/**\n * Get the original path value of a record by following its aliasOf\n * @param record\n */\nfunction getOriginalPath(record) {\n return record ? (record.aliasOf ? record.aliasOf.path : record.path) : '';\n}\n/**\n * Utility class to get the active class based on defaults.\n * @param propClass\n * @param globalClass\n * @param defaultClass\n */\nconst getLinkClass = (propClass, globalClass, defaultClass) => propClass != null\n ? propClass\n : globalClass != null\n ? globalClass\n : defaultClass;\n\nconst RouterViewImpl = /*#__PURE__*/ defineComponent({\n name: 'RouterView',\n // #674 we manually inherit them\n inheritAttrs: false,\n props: {\n name: {\n type: String,\n default: 'default',\n },\n route: Object,\n },\n // Better compat for @vue/compat users\n // https://github.com/vuejs/router/issues/1315\n compatConfig: { MODE: 3 },\n setup(props, { attrs, slots }) {\n (process.env.NODE_ENV !== 'production') && warnDeprecatedUsage();\n const injectedRoute = inject(routerViewLocationKey);\n const routeToDisplay = computed(() => props.route || injectedRoute.value);\n const injectedDepth = inject(viewDepthKey, 0);\n // The depth changes based on empty components option, which allows passthrough routes e.g. routes with children\n // that are used to reuse the `path` property\n const depth = computed(() => {\n let initialDepth = unref(injectedDepth);\n const { matched } = routeToDisplay.value;\n let matchedRoute;\n while ((matchedRoute = matched[initialDepth]) &&\n !matchedRoute.components) {\n initialDepth++;\n }\n return initialDepth;\n });\n const matchedRouteRef = computed(() => routeToDisplay.value.matched[depth.value]);\n provide(viewDepthKey, computed(() => depth.value + 1));\n provide(matchedRouteKey, matchedRouteRef);\n provide(routerViewLocationKey, routeToDisplay);\n const viewRef = ref();\n // watch at the same time the component instance, the route record we are\n // rendering, and the name\n watch(() => [viewRef.value, matchedRouteRef.value, props.name], ([instance, to, name], [oldInstance, from, oldName]) => {\n // copy reused instances\n if (to) {\n // this will update the instance for new instances as well as reused\n // instances when navigating to a new route\n to.instances[name] = instance;\n // the component instance is reused for a different route or name, so\n // we copy any saved update or leave guards. With async setup, the\n // mounting component will mount before the matchedRoute changes,\n // making instance === oldInstance, so we check if guards have been\n // added before. This works because we remove guards when\n // unmounting/deactivating components\n if (from && from !== to && instance && instance === oldInstance) {\n if (!to.leaveGuards.size) {\n to.leaveGuards = from.leaveGuards;\n }\n if (!to.updateGuards.size) {\n to.updateGuards = from.updateGuards;\n }\n }\n }\n // trigger beforeRouteEnter next callbacks\n if (instance &&\n to &&\n // if there is no instance but to and from are the same this might be\n // the first visit\n (!from || !isSameRouteRecord(to, from) || !oldInstance)) {\n (to.enterCallbacks[name] || []).forEach(callback => callback(instance));\n }\n }, { flush: 'post' });\n return () => {\n const route = routeToDisplay.value;\n // we need the value at the time we render because when we unmount, we\n // navigated to a different location so the value is different\n const currentName = props.name;\n const matchedRoute = matchedRouteRef.value;\n const ViewComponent = matchedRoute && matchedRoute.components[currentName];\n if (!ViewComponent) {\n return normalizeSlot(slots.default, { Component: ViewComponent, route });\n }\n // props from route configuration\n const routePropsOption = matchedRoute.props[currentName];\n const routeProps = routePropsOption\n ? routePropsOption === true\n ? route.params\n : typeof routePropsOption === 'function'\n ? routePropsOption(route)\n : routePropsOption\n : null;\n const onVnodeUnmounted = vnode => {\n // remove the instance reference to prevent leak\n if (vnode.component.isUnmounted) {\n matchedRoute.instances[currentName] = null;\n }\n };\n const component = h(ViewComponent, assign({}, routeProps, attrs, {\n onVnodeUnmounted,\n ref: viewRef,\n }));\n if (((process.env.NODE_ENV !== 'production') || __VUE_PROD_DEVTOOLS__) &&\n isBrowser &&\n component.ref) {\n // TODO: can display if it's an alias, its props\n const info = {\n depth: depth.value,\n name: matchedRoute.name,\n path: matchedRoute.path,\n meta: matchedRoute.meta,\n };\n const internalInstances = isArray(component.ref)\n ? component.ref.map(r => r.i)\n : [component.ref.i];\n internalInstances.forEach(instance => {\n // @ts-expect-error\n instance.__vrv_devtools = info;\n });\n }\n return (\n // pass the vnode to the slot as a prop.\n // h and <component :is=\"...\"> both accept vnodes\n normalizeSlot(slots.default, { Component: component, route }) ||\n component);\n };\n },\n});\nfunction normalizeSlot(slot, data) {\n if (!slot)\n return null;\n const slotContent = slot(data);\n return slotContent.length === 1 ? slotContent[0] : slotContent;\n}\n// export the public type for h/tsx inference\n// also to avoid inline import() in generated d.ts files\n/**\n * Component to display the current route the user is at.\n */\nconst RouterView = RouterViewImpl;\n// warn against deprecated usage with <transition> & <keep-alive>\n// due to functional component being no longer eager in Vue 3\nfunction warnDeprecatedUsage() {\n const instance = getCurrentInstance();\n const parentName = instance.parent && instance.parent.type.name;\n const parentSubTreeType = instance.parent && instance.parent.subTree && instance.parent.subTree.type;\n if (parentName &&\n (parentName === 'KeepAlive' || parentName.includes('Transition')) &&\n typeof parentSubTreeType === 'object' &&\n parentSubTreeType.name === 'RouterView') {\n const comp = parentName === 'KeepAlive' ? 'keep-alive' : 'transition';\n warn(`<router-view> can no longer be used directly inside <transition> or <keep-alive>.\\n` +\n `Use slot props instead:\\n\\n` +\n `<router-view v-slot=\"{ Component }\">\\n` +\n ` <${comp}>\\n` +\n ` <component :is=\"Component\" />\\n` +\n ` </${comp}>\\n` +\n `</router-view>`);\n }\n}\n\n/**\n * Copies a route location and removes any problematic properties that cannot be shown in devtools (e.g. Vue instances).\n *\n * @param routeLocation - routeLocation to format\n * @param tooltip - optional tooltip\n * @returns a copy of the routeLocation\n */\nfunction formatRouteLocation(routeLocation, tooltip) {\n const copy = assign({}, routeLocation, {\n // remove variables that can contain vue instances\n matched: routeLocation.matched.map(matched => omit(matched, ['instances', 'children', 'aliasOf'])),\n });\n return {\n _custom: {\n type: null,\n readOnly: true,\n display: routeLocation.fullPath,\n tooltip,\n value: copy,\n },\n };\n}\nfunction formatDisplay(display) {\n return {\n _custom: {\n display,\n },\n };\n}\n// to support multiple router instances\nlet routerId = 0;\nfunction addDevtools(app, router, matcher) {\n // Take over router.beforeEach and afterEach\n // make sure we are not registering the devtool twice\n if (router.__hasDevtools)\n return;\n router.__hasDevtools = true;\n // increment to support multiple router instances\n const id = routerId++;\n setupDevtoolsPlugin({\n id: 'org.vuejs.router' + (id ? '.' + id : ''),\n label: 'Vue Router',\n packageName: 'vue-router',\n homepage: 'https://router.vuejs.org',\n logo: 'https://router.vuejs.org/logo.png',\n componentStateTypes: ['Routing'],\n app,\n }, api => {\n if (typeof api.now !== 'function') {\n console.warn('[Vue Router]: You seem to be using an outdated version of Vue Devtools. Are you still using the Beta release instead of the stable one? You can find the links at https://devtools.vuejs.org/guide/installation.html.');\n }\n // display state added by the router\n api.on.inspectComponent((payload, ctx) => {\n if (payload.instanceData) {\n payload.instanceData.state.push({\n type: 'Routing',\n key: '$route',\n editable: false,\n value: formatRouteLocation(router.currentRoute.value, 'Current Route'),\n });\n }\n });\n // mark router-link as active and display tags on router views\n api.on.visitComponentTree(({ treeNode: node, componentInstance }) => {\n if (componentInstance.__vrv_devtools) {\n const info = componentInstance.__vrv_devtools;\n node.tags.push({\n label: (info.name ? `${info.name.toString()}: ` : '') + info.path,\n textColor: 0,\n tooltip: 'This component is rendered by <router-view>',\n backgroundColor: PINK_500,\n });\n }\n // if multiple useLink are used\n if (isArray(componentInstance.__vrl_devtools)) {\n componentInstance.__devtoolsApi = api;\n componentInstance.__vrl_devtools.forEach(devtoolsData => {\n let backgroundColor = ORANGE_400;\n let tooltip = '';\n if (devtoolsData.isExactActive) {\n backgroundColor = LIME_500;\n tooltip = 'This is exactly active';\n }\n else if (devtoolsData.isActive) {\n backgroundColor = BLUE_600;\n tooltip = 'This link is active';\n }\n node.tags.push({\n label: devtoolsData.route.path,\n textColor: 0,\n tooltip,\n backgroundColor,\n });\n });\n }\n });\n watch(router.currentRoute, () => {\n // refresh active state\n refreshRoutesView();\n api.notifyComponentUpdate();\n api.sendInspectorTree(routerInspectorId);\n api.sendInspectorState(routerInspectorId);\n });\n const navigationsLayerId = 'router:navigations:' + id;\n api.addTimelineLayer({\n id: navigationsLayerId,\n label: `Router${id ? ' ' + id : ''} Navigations`,\n color: 0x40a8c4,\n });\n // const errorsLayerId = 'router:errors'\n // api.addTimelineLayer({\n // id: errorsLayerId,\n // label: 'Router Errors',\n // color: 0xea5455,\n // })\n router.onError((error, to) => {\n api.addTimelineEvent({\n layerId: navigationsLayerId,\n event: {\n title: 'Error during Navigation',\n subtitle: to.fullPath,\n logType: 'error',\n time: api.now(),\n data: { error },\n groupId: to.meta.__navigationId,\n },\n });\n });\n // attached to `meta` and used to group events\n let navigationId = 0;\n router.beforeEach((to, from) => {\n const data = {\n guard: formatDisplay('beforeEach'),\n from: formatRouteLocation(from, 'Current Location during this navigation'),\n to: formatRouteLocation(to, 'Target location'),\n };\n // Used to group navigations together, hide from devtools\n Object.defineProperty(to.meta, '__navigationId', {\n value: navigationId++,\n });\n api.addTimelineEvent({\n layerId: navigationsLayerId,\n event: {\n time: api.now(),\n title: 'Start of navigation',\n subtitle: to.fullPath,\n data,\n groupId: to.meta.__navigationId,\n },\n });\n });\n router.afterEach((to, from, failure) => {\n const data = {\n guard: formatDisplay('afterEach'),\n };\n if (failure) {\n data.failure = {\n _custom: {\n type: Error,\n readOnly: true,\n display: failure ? failure.message : '',\n tooltip: 'Navigation Failure',\n value: failure,\n },\n };\n data.status = formatDisplay('❌');\n }\n else {\n data.status = formatDisplay('✅');\n }\n // we set here to have the right order\n data.from = formatRouteLocation(from, 'Current Location during this navigation');\n data.to = formatRouteLocation(to, 'Target location');\n api.addTimelineEvent({\n layerId: navigationsLayerId,\n event: {\n title: 'End of navigation',\n subtitle: to.fullPath,\n time: api.now(),\n data,\n logType: failure ? 'warning' : 'default',\n groupId: to.meta.__navigationId,\n },\n });\n });\n /**\n * Inspector of Existing routes\n */\n const routerInspectorId = 'router-inspector:' + id;\n api.addInspector({\n id: routerInspectorId,\n label: 'Routes' + (id ? ' ' + id : ''),\n icon: 'book',\n treeFilterPlaceholder: 'Search routes',\n });\n function refreshRoutesView() {\n // the routes view isn't active\n if (!activeRoutesPayload)\n return;\n const payload = activeRoutesPayload;\n // children routes will appear as nested\n let routes = matcher.getRoutes().filter(route => !route.parent);\n // reset match state to false\n routes.forEach(resetMatchStateOnRouteRecord);\n // apply a match state if there is a payload\n if (payload.filter) {\n routes = routes.filter(route => \n // save matches state based on the payload\n isRouteMatching(route, payload.filter.toLowerCase()));\n }\n // mark active routes\n routes.forEach(route => markRouteRecordActive(route, router.currentRoute.value));\n payload.rootNodes = routes.map(formatRouteRecordForInspector);\n }\n let activeRoutesPayload;\n api.on.getInspectorTree(payload => {\n activeRoutesPayload = payload;\n if (payload.app === app && payload.inspectorId === routerInspectorId) {\n refreshRoutesView();\n }\n });\n /**\n * Display information about the currently selected route record\n */\n api.on.getInspectorState(payload => {\n if (payload.app === app && payload.inspectorId === routerInspectorId) {\n const routes = matcher.getRoutes();\n const route = routes.find(route => route.record.__vd_id === payload.nodeId);\n if (route) {\n payload.state = {\n options: formatRouteRecordMatcherForStateInspector(route),\n };\n }\n }\n });\n api.sendInspectorTree(routerInspectorId);\n api.sendInspectorState(routerInspectorId);\n });\n}\nfunction modifierForKey(key) {\n if (key.optional) {\n return key.repeatable ? '*' : '?';\n }\n else {\n return key.repeatable ? '+' : '';\n }\n}\nfunction formatRouteRecordMatcherForStateInspector(route) {\n const { record } = route;\n const fields = [\n { editable: false, key: 'path', value: record.path },\n ];\n if (record.name != null) {\n fields.push({\n editable: false,\n key: 'name',\n value: record.name,\n });\n }\n fields.push({ editable: false, key: 'regexp', value: route.re });\n if (route.keys.length) {\n fields.push({\n editable: false,\n key: 'keys',\n value: {\n _custom: {\n type: null,\n readOnly: true,\n display: route.keys\n .map(key => `${key.name}${modifierForKey(key)}`)\n .join(' '),\n tooltip: 'Param keys',\n value: route.keys,\n },\n },\n });\n }\n if (record.redirect != null) {\n fields.push({\n editable: false,\n key: 'redirect',\n value: record.redirect,\n });\n }\n if (route.alias.length) {\n fields.push({\n editable: false,\n key: 'aliases',\n value: route.alias.map(alias => alias.record.path),\n });\n }\n if (Object.keys(route.record.meta).length) {\n fields.push({\n editable: false,\n key: 'meta',\n value: route.record.meta,\n });\n }\n fields.push({\n key: 'score',\n editable: false,\n value: {\n _custom: {\n type: null,\n readOnly: true,\n display: route.score.map(score => score.join(', ')).join(' | '),\n tooltip: 'Score used to sort routes',\n value: route.score,\n },\n },\n });\n return fields;\n}\n/**\n * Extracted from tailwind palette\n */\nconst PINK_500 = 0xec4899;\nconst BLUE_600 = 0x2563eb;\nconst LIME_500 = 0x84cc16;\nconst CYAN_400 = 0x22d3ee;\nconst ORANGE_400 = 0xfb923c;\n// const GRAY_100 = 0xf4f4f5\nconst DARK = 0x666666;\nfunction formatRouteRecordForInspector(route) {\n const tags = [];\n const { record } = route;\n if (record.name != null) {\n tags.push({\n label: String(record.name),\n textColor: 0,\n backgroundColor: CYAN_400,\n });\n }\n if (record.aliasOf) {\n tags.push({\n label: 'alias',\n textColor: 0,\n backgroundColor: ORANGE_400,\n });\n }\n if (route.__vd_match) {\n tags.push({\n label: 'matches',\n textColor: 0,\n backgroundColor: PINK_500,\n });\n }\n if (route.__vd_exactActive) {\n tags.push({\n label: 'exact',\n textColor: 0,\n backgroundColor: LIME_500,\n });\n }\n if (route.__vd_active) {\n tags.push({\n label: 'active',\n textColor: 0,\n backgroundColor: BLUE_600,\n });\n }\n if (record.redirect) {\n tags.push({\n label: typeof record.redirect === 'string'\n ? `redirect: ${record.redirect}`\n : 'redirects',\n textColor: 0xffffff,\n backgroundColor: DARK,\n });\n }\n // add an id to be able to select it. Using the `path` is not possible because\n // empty path children would collide with their parents\n let id = record.__vd_id;\n if (id == null) {\n id = String(routeRecordId++);\n record.__vd_id = id;\n }\n return {\n id,\n label: record.path,\n tags,\n children: route.children.map(formatRouteRecordForInspector),\n };\n}\n// incremental id for route records and inspector state\nlet routeRecordId = 0;\nconst EXTRACT_REGEXP_RE = /^\\/(.*)\\/([a-z]*)$/;\nfunction markRouteRecordActive(route, currentRoute) {\n // no route will be active if matched is empty\n // reset the matching state\n const isExactActive = currentRoute.matched.length &&\n isSameRouteRecord(currentRoute.matched[currentRoute.matched.length - 1], route.record);\n route.__vd_exactActive = route.__vd_active = isExactActive;\n if (!isExactActive) {\n route.__vd_active = currentRoute.matched.some(match => isSameRouteRecord(match, route.record));\n }\n route.children.forEach(childRoute => markRouteRecordActive(childRoute, currentRoute));\n}\nfunction resetMatchStateOnRouteRecord(route) {\n route.__vd_match = false;\n route.children.forEach(resetMatchStateOnRouteRecord);\n}\nfunction isRouteMatching(route, filter) {\n const found = String(route.re).match(EXTRACT_REGEXP_RE);\n route.__vd_match = false;\n if (!found || found.length < 3) {\n return false;\n }\n // use a regexp without $ at the end to match nested routes better\n const nonEndingRE = new RegExp(found[1].replace(/\\$$/, ''), found[2]);\n if (nonEndingRE.test(filter)) {\n // mark children as matches\n route.children.forEach(child => isRouteMatching(child, filter));\n // exception case: `/`\n if (route.record.path !== '/' || filter === '/') {\n route.__vd_match = route.re.test(filter);\n return true;\n }\n // hide the / route\n return false;\n }\n const path = route.record.path.toLowerCase();\n const decodedPath = decode(path);\n // also allow partial matching on the path\n if (!filter.startsWith('/') &&\n (decodedPath.includes(filter) || path.includes(filter)))\n return true;\n if (decodedPath.startsWith(filter) || path.startsWith(filter))\n return true;\n if (route.record.name && String(route.record.name).includes(filter))\n return true;\n return route.children.some(child => isRouteMatching(child, filter));\n}\nfunction omit(obj, keys) {\n const ret = {};\n for (const key in obj) {\n if (!keys.includes(key)) {\n // @ts-expect-error\n ret[key] = obj[key];\n }\n }\n return ret;\n}\n\n/**\n * Creates a Router instance that can be used by a Vue app.\n *\n * @param options - {@link RouterOptions}\n */\nfunction createRouter(options) {\n const matcher = createRouterMatcher(options.routes, options);\n const parseQuery$1 = options.parseQuery || parseQuery;\n const stringifyQuery$1 = options.stringifyQuery || stringifyQuery;\n const routerHistory = options.history;\n if ((process.env.NODE_ENV !== 'production') && !routerHistory)\n throw new Error('Provide the \"history\" option when calling \"createRouter()\":' +\n ' https://next.router.vuejs.org/api/#history.');\n const beforeGuards = useCallbacks();\n const beforeResolveGuards = useCallbacks();\n const afterGuards = useCallbacks();\n const currentRoute = shallowRef(START_LOCATION_NORMALIZED);\n let pendingLocation = START_LOCATION_NORMALIZED;\n // leave the scrollRestoration if no scrollBehavior is provided\n if (isBrowser && options.scrollBehavior && 'scrollRestoration' in history) {\n history.scrollRestoration = 'manual';\n }\n const normalizeParams = applyToParams.bind(null, paramValue => '' + paramValue);\n const encodeParams = applyToParams.bind(null, encodeParam);\n const decodeParams = \n // @ts-expect-error: intentionally avoid the type check\n applyToParams.bind(null, decode);\n function addRoute(parentOrRoute, route) {\n let parent;\n let record;\n if (isRouteName(parentOrRoute)) {\n parent = matcher.getRecordMatcher(parentOrRoute);\n record = route;\n }\n else {\n record = parentOrRoute;\n }\n return matcher.addRoute(record, parent);\n }\n function removeRoute(name) {\n const recordMatcher = matcher.getRecordMatcher(name);\n if (recordMatcher) {\n matcher.removeRoute(recordMatcher);\n }\n else if ((process.env.NODE_ENV !== 'production')) {\n warn(`Cannot remove non-existent route \"${String(name)}\"`);\n }\n }\n function getRoutes() {\n return matcher.getRoutes().map(routeMatcher => routeMatcher.record);\n }\n function hasRoute(name) {\n return !!matcher.getRecordMatcher(name);\n }\n function resolve(rawLocation, currentLocation) {\n // const objectLocation = routerLocationAsObject(rawLocation)\n // we create a copy to modify it later\n currentLocation = assign({}, currentLocation || currentRoute.value);\n if (typeof rawLocation === 'string') {\n const locationNormalized = parseURL(parseQuery$1, rawLocation, currentLocation.path);\n const matchedRoute = matcher.resolve({ path: locationNormalized.path }, currentLocation);\n const href = routerHistory.createHref(locationNormalized.fullPath);\n if ((process.env.NODE_ENV !== 'production')) {\n if (href.startsWith('//'))\n warn(`Location \"${rawLocation}\" resolved to \"${href}\". A resolved location cannot start with multiple slashes.`);\n else if (!matchedRoute.matched.length) {\n warn(`No match found for location with path \"${rawLocation}\"`);\n }\n }\n // locationNormalized is always a new object\n return assign(locationNormalized, matchedRoute, {\n params: decodeParams(matchedRoute.params),\n hash: decode(locationNormalized.hash),\n redirectedFrom: undefined,\n href,\n });\n }\n let matcherLocation;\n // path could be relative in object as well\n if ('path' in rawLocation) {\n if ((process.env.NODE_ENV !== 'production') &&\n 'params' in rawLocation &&\n !('name' in rawLocation) &&\n // @ts-expect-error: the type is never\n Object.keys(rawLocation.params).length) {\n warn(`Path \"${rawLocation.path}\" was passed with params but they will be ignored. Use a named route alongside params instead.`);\n }\n matcherLocation = assign({}, rawLocation, {\n path: parseURL(parseQuery$1, rawLocation.path, currentLocation.path).path,\n });\n }\n else {\n // remove any nullish param\n const targetParams = assign({}, rawLocation.params);\n for (const key in targetParams) {\n if (targetParams[key] == null) {\n delete targetParams[key];\n }\n }\n // pass encoded values to the matcher, so it can produce encoded path and fullPath\n matcherLocation = assign({}, rawLocation, {\n params: encodeParams(targetParams),\n });\n // current location params are decoded, we need to encode them in case the\n // matcher merges the params\n currentLocation.params = encodeParams(currentLocation.params);\n }\n const matchedRoute = matcher.resolve(matcherLocation, currentLocation);\n const hash = rawLocation.hash || '';\n if ((process.env.NODE_ENV !== 'production') && hash && !hash.startsWith('#')) {\n warn(`A \\`hash\\` should always start with the character \"#\". Replace \"${hash}\" with \"#${hash}\".`);\n }\n // the matcher might have merged current location params, so\n // we need to run the decoding again\n matchedRoute.params = normalizeParams(decodeParams(matchedRoute.params));\n const fullPath = stringifyURL(stringifyQuery$1, assign({}, rawLocation, {\n hash: encodeHash(hash),\n path: matchedRoute.path,\n }));\n const href = routerHistory.createHref(fullPath);\n if ((process.env.NODE_ENV !== 'production')) {\n if (href.startsWith('//')) {\n warn(`Location \"${rawLocation}\" resolved to \"${href}\". A resolved location cannot start with multiple slashes.`);\n }\n else if (!matchedRoute.matched.length) {\n warn(`No match found for location with path \"${'path' in rawLocation ? rawLocation.path : rawLocation}\"`);\n }\n }\n return assign({\n fullPath,\n // keep the hash encoded so fullPath is effectively path + encodedQuery +\n // hash\n hash,\n query: \n // if the user is using a custom query lib like qs, we might have\n // nested objects, so we keep the query as is, meaning it can contain\n // numbers at `$route.query`, but at the point, the user will have to\n // use their own type anyway.\n // https://github.com/vuejs/router/issues/328#issuecomment-649481567\n stringifyQuery$1 === stringifyQuery\n ? normalizeQuery(rawLocation.query)\n : (rawLocation.query || {}),\n }, matchedRoute, {\n redirectedFrom: undefined,\n href,\n });\n }\n function locationAsObject(to) {\n return typeof to === 'string'\n ? parseURL(parseQuery$1, to, currentRoute.value.path)\n : assign({}, to);\n }\n function checkCanceledNavigation(to, from) {\n if (pendingLocation !== to) {\n return createRouterError(8 /* ErrorTypes.NAVIGATION_CANCELLED */, {\n from,\n to,\n });\n }\n }\n function push(to) {\n return pushWithRedirect(to);\n }\n function replace(to) {\n return push(assign(locationAsObject(to), { replace: true }));\n }\n function handleRedirectRecord(to) {\n const lastMatched = to.matched[to.matched.length - 1];\n if (lastMatched && lastMatched.redirect) {\n const { redirect } = lastMatched;\n let newTargetLocation = typeof redirect === 'function' ? redirect(to) : redirect;\n if (typeof newTargetLocation === 'string') {\n newTargetLocation =\n newTargetLocation.includes('?') || newTargetLocation.includes('#')\n ? (newTargetLocation = locationAsObject(newTargetLocation))\n : // force empty params\n { path: newTargetLocation };\n // @ts-expect-error: force empty params when a string is passed to let\n // the router parse them again\n newTargetLocation.params = {};\n }\n if ((process.env.NODE_ENV !== 'production') &&\n !('path' in newTargetLocation) &&\n !('name' in newTargetLocation)) {\n warn(`Invalid redirect found:\\n${JSON.stringify(newTargetLocation, null, 2)}\\n when navigating to \"${to.fullPath}\". A redirect must contain a name or path. This will break in production.`);\n throw new Error('Invalid redirect');\n }\n return assign({\n query: to.query,\n hash: to.hash,\n // avoid transferring params if the redirect has a path\n params: 'path' in newTargetLocation ? {} : to.params,\n }, newTargetLocation);\n }\n }\n function pushWithRedirect(to, redirectedFrom) {\n const targetLocation = (pendingLocation = resolve(to));\n const from = currentRoute.value;\n const data = to.state;\n const force = to.force;\n // to could be a string where `replace` is a function\n const replace = to.replace === true;\n const shouldRedirect = handleRedirectRecord(targetLocation);\n if (shouldRedirect)\n return pushWithRedirect(assign(locationAsObject(shouldRedirect), {\n state: typeof shouldRedirect === 'object'\n ? assign({}, data, shouldRedirect.state)\n : data,\n force,\n replace,\n }), \n // keep original redirectedFrom if it exists\n redirectedFrom || targetLocation);\n // if it was a redirect we already called `pushWithRedirect` above\n const toLocation = targetLocation;\n toLocation.redirectedFrom = redirectedFrom;\n let failure;\n if (!force && isSameRouteLocation(stringifyQuery$1, from, targetLocation)) {\n failure = createRouterError(16 /* ErrorTypes.NAVIGATION_DUPLICATED */, { to: toLocation, from });\n // trigger scroll to allow scrolling to the same anchor\n handleScroll(from, from, \n // this is a push, the only way for it to be triggered from a\n // history.listen is with a redirect, which makes it become a push\n true, \n // This cannot be the first navigation because the initial location\n // cannot be manually navigated to\n false);\n }\n return (failure ? Promise.resolve(failure) : navigate(toLocation, from))\n .catch((error) => isNavigationFailure(error)\n ? // navigation redirects still mark the router as ready\n isNavigationFailure(error, 2 /* ErrorTypes.NAVIGATION_GUARD_REDIRECT */)\n ? error\n : markAsReady(error) // also returns the error\n : // reject any unknown error\n triggerError(error, toLocation, from))\n .then((failure) => {\n if (failure) {\n if (isNavigationFailure(failure, 2 /* ErrorTypes.NAVIGATION_GUARD_REDIRECT */)) {\n if ((process.env.NODE_ENV !== 'production') &&\n // we are redirecting to the same location we were already at\n isSameRouteLocation(stringifyQuery$1, resolve(failure.to), toLocation) &&\n // and we have done it a couple of times\n redirectedFrom &&\n // @ts-expect-error: added only in dev\n (redirectedFrom._count = redirectedFrom._count\n ? // @ts-expect-error\n redirectedFrom._count + 1\n : 1) > 30) {\n warn(`Detected a possibly infinite redirection in a navigation guard when going from \"${from.fullPath}\" to \"${toLocation.fullPath}\". Aborting to avoid a Stack Overflow.\\n Are you always returning a new location within a navigation guard? That would lead to this error. Only return when redirecting or aborting, that should fix this. This might break in production if not fixed.`);\n return Promise.reject(new Error('Infinite redirect in navigation guard'));\n }\n return pushWithRedirect(\n // keep options\n assign({\n // preserve an existing replacement but allow the redirect to override it\n replace,\n }, locationAsObject(failure.to), {\n state: typeof failure.to === 'object'\n ? assign({}, data, failure.to.state)\n : data,\n force,\n }), \n // preserve the original redirectedFrom if any\n redirectedFrom || toLocation);\n }\n }\n else {\n // if we fail we don't finalize the navigation\n failure = finalizeNavigation(toLocation, from, true, replace, data);\n }\n triggerAfterEach(toLocation, from, failure);\n return failure;\n });\n }\n /**\n * Helper to reject and skip all navigation guards if a new navigation happened\n * @param to\n * @param from\n */\n function checkCanceledNavigationAndReject(to, from) {\n const error = checkCanceledNavigation(to, from);\n return error ? Promise.reject(error) : Promise.resolve();\n }\n function runWithContext(fn) {\n const app = installedApps.values().next().value;\n // support Vue < 3.3\n return app && typeof app.runWithContext === 'function'\n ? app.runWithContext(fn)\n : fn();\n }\n // TODO: refactor the whole before guards by internally using router.beforeEach\n function navigate(to, from) {\n let guards;\n const [leavingRecords, updatingRecords, enteringRecords] = extractChangingRecords(to, from);\n // all components here have been resolved once because we are leaving\n guards = extractComponentsGuards(leavingRecords.reverse(), 'beforeRouteLeave', to, from);\n // leavingRecords is already reversed\n for (const record of leavingRecords) {\n record.leaveGuards.forEach(guard => {\n guards.push(guardToPromiseFn(guard, to, from));\n });\n }\n const canceledNavigationCheck = checkCanceledNavigationAndReject.bind(null, to, from);\n guards.push(canceledNavigationCheck);\n // run the queue of per route beforeRouteLeave guards\n return (runGuardQueue(guards)\n .then(() => {\n // check global guards beforeEach\n guards = [];\n for (const guard of beforeGuards.list()) {\n guards.push(guardToPromiseFn(guard, to, from));\n }\n guards.push(canceledNavigationCheck);\n return runGuardQueue(guards);\n })\n .then(() => {\n // check in components beforeRouteUpdate\n guards = extractComponentsGuards(updatingRecords, 'beforeRouteUpdate', to, from);\n for (const record of updatingRecords) {\n record.updateGuards.forEach(guard => {\n guards.push(guardToPromiseFn(guard, to, from));\n });\n }\n guards.push(canceledNavigationCheck);\n // run the queue of per route beforeEnter guards\n return runGuardQueue(guards);\n })\n .then(() => {\n // check the route beforeEnter\n guards = [];\n for (const record of enteringRecords) {\n // do not trigger beforeEnter on reused views\n if (record.beforeEnter) {\n if (isArray(record.beforeEnter)) {\n for (const beforeEnter of record.beforeEnter)\n guards.push(guardToPromiseFn(beforeEnter, to, from));\n }\n else {\n guards.push(guardToPromiseFn(record.beforeEnter, to, from));\n }\n }\n }\n guards.push(canceledNavigationCheck);\n // run the queue of per route beforeEnter guards\n return runGuardQueue(guards);\n })\n .then(() => {\n // NOTE: at this point to.matched is normalized and does not contain any () => Promise<Component>\n // clear existing enterCallbacks, these are added by extractComponentsGuards\n to.matched.forEach(record => (record.enterCallbacks = {}));\n // check in-component beforeRouteEnter\n guards = extractComponentsGuards(enteringRecords, 'beforeRouteEnter', to, from);\n guards.push(canceledNavigationCheck);\n // run the queue of per route beforeEnter guards\n return runGuardQueue(guards);\n })\n .then(() => {\n // check global guards beforeResolve\n guards = [];\n for (const guard of beforeResolveGuards.list()) {\n guards.push(guardToPromiseFn(guard, to, from));\n }\n guards.push(canceledNavigationCheck);\n return runGuardQueue(guards);\n })\n // catch any navigation canceled\n .catch(err => isNavigationFailure(err, 8 /* ErrorTypes.NAVIGATION_CANCELLED */)\n ? err\n : Promise.reject(err)));\n }\n function triggerAfterEach(to, from, failure) {\n // navigation is confirmed, call afterGuards\n // TODO: wrap with error handlers\n afterGuards\n .list()\n .forEach(guard => runWithContext(() => guard(to, from, failure)));\n }\n /**\n * - Cleans up any navigation guards\n * - Changes the url if necessary\n * - Calls the scrollBehavior\n */\n function finalizeNavigation(toLocation, from, isPush, replace, data) {\n // a more recent navigation took place\n const error = checkCanceledNavigation(toLocation, from);\n if (error)\n return error;\n // only consider as push if it's not the first navigation\n const isFirstNavigation = from === START_LOCATION_NORMALIZED;\n const state = !isBrowser ? {} : history.state;\n // change URL only if the user did a push/replace and if it's not the initial navigation because\n // it's just reflecting the url\n if (isPush) {\n // on the initial navigation, we want to reuse the scroll position from\n // history state if it exists\n if (replace || isFirstNavigation)\n routerHistory.replace(toLocation.fullPath, assign({\n scroll: isFirstNavigation && state && state.scroll,\n }, data));\n else\n routerHistory.push(toLocation.fullPath, data);\n }\n // accept current navigation\n currentRoute.value = toLocation;\n handleScroll(toLocation, from, isPush, isFirstNavigation);\n markAsReady();\n }\n let removeHistoryListener;\n // attach listener to history to trigger navigations\n function setupListeners() {\n // avoid setting up listeners twice due to an invalid first navigation\n if (removeHistoryListener)\n return;\n removeHistoryListener = routerHistory.listen((to, _from, info) => {\n if (!router.listening)\n return;\n // cannot be a redirect route because it was in history\n const toLocation = resolve(to);\n // due to dynamic routing, and to hash history with manual navigation\n // (manually changing the url or calling history.hash = '#/somewhere'),\n // there could be a redirect record in history\n const shouldRedirect = handleRedirectRecord(toLocation);\n if (shouldRedirect) {\n pushWithRedirect(assign(shouldRedirect, { replace: true }), toLocation).catch(noop);\n return;\n }\n pendingLocation = toLocation;\n const from = currentRoute.value;\n // TODO: should be moved to web history?\n if (isBrowser) {\n saveScrollPosition(getScrollKey(from.fullPath, info.delta), computeScrollPosition());\n }\n navigate(toLocation, from)\n .catch((error) => {\n if (isNavigationFailure(error, 4 /* ErrorTypes.NAVIGATION_ABORTED */ | 8 /* ErrorTypes.NAVIGATION_CANCELLED */)) {\n return error;\n }\n if (isNavigationFailure(error, 2 /* ErrorTypes.NAVIGATION_GUARD_REDIRECT */)) {\n // Here we could call if (info.delta) routerHistory.go(-info.delta,\n // false) but this is bug prone as we have no way to wait the\n // navigation to be finished before calling pushWithRedirect. Using\n // a setTimeout of 16ms seems to work but there is no guarantee for\n // it to work on every browser. So instead we do not restore the\n // history entry and trigger a new navigation as requested by the\n // navigation guard.\n // the error is already handled by router.push we just want to avoid\n // logging the error\n pushWithRedirect(error.to, toLocation\n // avoid an uncaught rejection, let push call triggerError\n )\n .then(failure => {\n // manual change in hash history #916 ending up in the URL not\n // changing, but it was changed by the manual url change, so we\n // need to manually change it ourselves\n if (isNavigationFailure(failure, 4 /* ErrorTypes.NAVIGATION_ABORTED */ |\n 16 /* ErrorTypes.NAVIGATION_DUPLICATED */) &&\n !info.delta &&\n info.type === NavigationType.pop) {\n routerHistory.go(-1, false);\n }\n })\n .catch(noop);\n // avoid the then branch\n return Promise.reject();\n }\n // do not restore history on unknown direction\n if (info.delta) {\n routerHistory.go(-info.delta, false);\n }\n // unrecognized error, transfer to the global handler\n return triggerError(error, toLocation, from);\n })\n .then((failure) => {\n failure =\n failure ||\n finalizeNavigation(\n // after navigation, all matched components are resolved\n toLocation, from, false);\n // revert the navigation\n if (failure) {\n if (info.delta &&\n // a new navigation has been triggered, so we do not want to revert, that will change the current history\n // entry while a different route is displayed\n !isNavigationFailure(failure, 8 /* ErrorTypes.NAVIGATION_CANCELLED */)) {\n routerHistory.go(-info.delta, false);\n }\n else if (info.type === NavigationType.pop &&\n isNavigationFailure(failure, 4 /* ErrorTypes.NAVIGATION_ABORTED */ | 16 /* ErrorTypes.NAVIGATION_DUPLICATED */)) {\n // manual change in hash history #916\n // it's like a push but lacks the information of the direction\n routerHistory.go(-1, false);\n }\n }\n triggerAfterEach(toLocation, from, failure);\n })\n .catch(noop);\n });\n }\n // Initialization and Errors\n let readyHandlers = useCallbacks();\n let errorHandlers = useCallbacks();\n let ready;\n /**\n * Trigger errorHandlers added via onError and throws the error as well\n *\n * @param error - error to throw\n * @param to - location we were navigating to when the error happened\n * @param from - location we were navigating from when the error happened\n * @returns the error as a rejected promise\n */\n function triggerError(error, to, from) {\n markAsReady(error);\n const list = errorHandlers.list();\n if (list.length) {\n list.forEach(handler => handler(error, to, from));\n }\n else {\n if ((process.env.NODE_ENV !== 'production')) {\n warn('uncaught error during route navigation:');\n }\n console.error(error);\n }\n return Promise.reject(error);\n }\n function isReady() {\n if (ready && currentRoute.value !== START_LOCATION_NORMALIZED)\n return Promise.resolve();\n return new Promise((resolve, reject) => {\n readyHandlers.add([resolve, reject]);\n });\n }\n function markAsReady(err) {\n if (!ready) {\n // still not ready if an error happened\n ready = !err;\n setupListeners();\n readyHandlers\n .list()\n .forEach(([resolve, reject]) => (err ? reject(err) : resolve()));\n readyHandlers.reset();\n }\n return err;\n }\n // Scroll behavior\n function handleScroll(to, from, isPush, isFirstNavigation) {\n const { scrollBehavior } = options;\n if (!isBrowser || !scrollBehavior)\n return Promise.resolve();\n const scrollPosition = (!isPush && getSavedScrollPosition(getScrollKey(to.fullPath, 0))) ||\n ((isFirstNavigation || !isPush) &&\n history.state &&\n history.state.scroll) ||\n null;\n return nextTick()\n .then(() => scrollBehavior(to, from, scrollPosition))\n .then(position => position && scrollToPosition(position))\n .catch(err => triggerError(err, to, from));\n }\n const go = (delta) => routerHistory.go(delta);\n let started;\n const installedApps = new Set();\n const router = {\n currentRoute,\n listening: true,\n addRoute,\n removeRoute,\n hasRoute,\n getRoutes,\n resolve,\n options,\n push,\n replace,\n go,\n back: () => go(-1),\n forward: () => go(1),\n beforeEach: beforeGuards.add,\n beforeResolve: beforeResolveGuards.add,\n afterEach: afterGuards.add,\n onError: errorHandlers.add,\n isReady,\n install(app) {\n const router = this;\n app.component('RouterLink', RouterLink);\n app.component('RouterView', RouterView);\n app.config.globalProperties.$router = router;\n Object.defineProperty(app.config.globalProperties, '$route', {\n enumerable: true,\n get: () => unref(currentRoute),\n });\n // this initial navigation is only necessary on client, on server it doesn't\n // make sense because it will create an extra unnecessary navigation and could\n // lead to problems\n if (isBrowser &&\n // used for the initial navigation client side to avoid pushing\n // multiple times when the router is used in multiple apps\n !started &&\n currentRoute.value === START_LOCATION_NORMALIZED) {\n // see above\n started = true;\n push(routerHistory.location).catch(err => {\n if ((process.env.NODE_ENV !== 'production'))\n warn('Unexpected error when starting the router:', err);\n });\n }\n const reactiveRoute = {};\n for (const key in START_LOCATION_NORMALIZED) {\n Object.defineProperty(reactiveRoute, key, {\n get: () => currentRoute.value[key],\n enumerable: true,\n });\n }\n app.provide(routerKey, router);\n app.provide(routeLocationKey, shallowReactive(reactiveRoute));\n app.provide(routerViewLocationKey, currentRoute);\n const unmountApp = app.unmount;\n installedApps.add(app);\n app.unmount = function () {\n installedApps.delete(app);\n // the router is not attached to an app anymore\n if (installedApps.size < 1) {\n // invalidate the current navigation\n pendingLocation = START_LOCATION_NORMALIZED;\n removeHistoryListener && removeHistoryListener();\n removeHistoryListener = null;\n currentRoute.value = START_LOCATION_NORMALIZED;\n started = false;\n ready = false;\n }\n unmountApp();\n };\n // TODO: this probably needs to be updated so it can be used by vue-termui\n if (((process.env.NODE_ENV !== 'production') || __VUE_PROD_DEVTOOLS__) && isBrowser) {\n addDevtools(app, router, matcher);\n }\n },\n };\n // TODO: type this as NavigationGuardReturn or similar instead of any\n function runGuardQueue(guards) {\n return guards.reduce((promise, guard) => promise.then(() => runWithContext(guard)), Promise.resolve());\n }\n return router;\n}\nfunction extractChangingRecords(to, from) {\n const leavingRecords = [];\n const updatingRecords = [];\n const enteringRecords = [];\n const len = Math.max(from.matched.length, to.matched.length);\n for (let i = 0; i < len; i++) {\n const recordFrom = from.matched[i];\n if (recordFrom) {\n if (to.matched.find(record => isSameRouteRecord(record, recordFrom)))\n updatingRecords.push(recordFrom);\n else\n leavingRecords.push(recordFrom);\n }\n const recordTo = to.matched[i];\n if (recordTo) {\n // the type doesn't matter because we are comparing per reference\n if (!from.matched.find(record => isSameRouteRecord(record, recordTo))) {\n enteringRecords.push(recordTo);\n }\n }\n }\n return [leavingRecords, updatingRecords, enteringRecords];\n}\n\n/**\n * Returns the router instance. Equivalent to using `$router` inside\n * templates.\n */\nfunction useRouter() {\n return inject(routerKey);\n}\n/**\n * Returns the current route location. Equivalent to using `$route` inside\n * templates.\n */\nfunction useRoute() {\n return inject(routeLocationKey);\n}\n\nexport { NavigationFailureType, RouterLink, RouterView, START_LOCATION_NORMALIZED as START_LOCATION, createMemoryHistory, createRouter, createRouterMatcher, createWebHashHistory, createWebHistory, isNavigationFailure, loadRouteLocation, matchedRouteKey, onBeforeRouteLeave, onBeforeRouteUpdate, parseQuery, routeLocationKey, routerKey, routerViewLocationKey, stringifyQuery, useLink, useRoute, useRouter, viewDepthKey };\n","import { getCurrentComponent } from \"../util\";\n\nexport function useScopeId() {\n const component = getCurrentComponent(\"useScopeId\");\n const scopeId = component!.vnode.scopeId;\n return {\n scopeId: scopeId ? { [scopeId]: \"\" } : undefined,\n };\n}\n","<script setup lang=\"ts\">\n/**\n * # EvOverlay\n */\nimport \"./EvOverlay.scss\";\nimport { makeEvOverlayProps } from \"./EvOverlay.ts\";\nimport { useModelProxy } from \"@/composables/modelProxy.ts\";\nimport {\n computed,\n mergeProps,\n ref,\n shallowRef,\n toRef,\n useAttrs,\n watch,\n} from \"vue\";\nimport { useTeleport } from \"@/composables/teleport.ts\";\nimport { useEvTransition, EvTransition } from \"@/components/EvTransition\";\nimport { useDimensions } from \"@/composables/dimensions.ts\";\nimport { clickBlockedAnimation, getScrollParent, toWebUnit } from \"@/util\";\nimport { useStack } from \"@/composables/stack.ts\";\nimport { useRouter } from \"vue-router\";\nimport { useToggleScope } from \"@/composables/toggleScope.ts\";\nimport { useBackButton } from \"@/composables/router.ts\";\nimport { ActivatorProps, useActivator } from \"./activator.ts\";\nimport { useScopeId } from \"@/composables/scopeId.ts\";\nimport { usePositionStrategies } from \"./position.ts\";\nimport { useScrollStrategies } from \"./scroll.ts\";\nimport { useRtl } from \"@/composables/locale.ts\";\n\ndefineOptions({\n inheritAttrs: false,\n});\n\n// Emit\nconst emit = defineEmits([\"click:outside\", \"update:modelValue\", \"afterLeave\"]);\n\nconst props = defineProps({\n disableGlobalStack: Boolean,\n ...makeEvOverlayProps(),\n});\nconst attrs = useAttrs();\nconst slots = defineSlots<{\n activator(props: { isActive: boolean; props: any }): any;\n default(): never;\n}>();\nconst router = useRouter();\nconst model = useModelProxy(props, \"modelValue\");\nconst containerEl = ref<HTMLElement | undefined>(undefined);\nconst contentEl = ref<HTMLElement | undefined>(undefined);\nconst contentTransition = useEvTransition(props);\nconst dimensions = useDimensions(props);\nconst { scopeId } = useScopeId();\nconst isActiveContent = computed({\n get: () => model.value,\n set: (value) => {\n if (!(value && props.disabled)) {\n model.value = value;\n }\n },\n});\nconst { isTopGlobal, isTopLocal, stackStyles } = useStack(\n isActiveContent,\n toRef(props, \"zIndex\"),\n props.disableGlobalStack,\n);\nconst {\n activatorEl,\n activatorRef,\n activatorEvents,\n contentEvents,\n veilEvents,\n} = useActivator(props as ActivatorProps, isActiveContent, isTopLocal);\nconst teleportTarget = useTeleport(\n computed(() => {\n return props.attach || props.contained;\n }),\n);\nconst { rtlClasses, isRtl } = useRtl();\n\nconst { contentStyles, updatePosition } = usePositionStrategies(props, {\n isRtl,\n contentEl,\n activatorEl,\n isActive: isActiveContent,\n});\n\nuseScrollStrategies(props, {\n containerEl,\n contentEl,\n activatorEl,\n isActive: isActiveContent,\n updatePosition,\n});\n\n/**\n * What should parent components have access to?\n */\ndefineExpose({\n activatorEl,\n contentEl,\n isTopGlobal,\n isTopLocal,\n updatePosition,\n});\n\n/**\n * When disabled update the model value via the isActive computed prop\n */\nwatch(\n () => props.disabled,\n (value) => {\n if (value) {\n isActiveContent.value = false;\n }\n },\n);\n\n/**\n * The veil transitions into view at the same time as the content,\n * but only if it is enabled by `props.veil`.\n */\nconst isActiveVeil = computed(() => {\n return isActiveContent.value && !!props.veil;\n});\n\n/**\n * `isActive` relates to the content of the overlay.\n * To have nice transitions we need to track active containment.\n * `isActiveTeleport` follows `isActive`, which means it activates at the same time,\n * but only disables when the content is removed by the transition (@after-leave).\n * @see onAfterLeave\n */\nconst isActiveTeleport = shallowRef(false);\nwatch(isActiveContent, () => {\n isActiveTeleport.value = true;\n});\n\n/**\n * ## Click Outside Condition\n * Allows or denies the click outside event to trigger.\n */\nfunction clickOutsideCondition(): boolean {\n return isActiveContent.value && isTopGlobal.value;\n}\n\n/**\n * ## Dismiss\n * @param focusActivator\n */\nfunction dismiss(focusActivator: boolean = false) {\n if (props.persistent) {\n // Let's let the user know they can't dismiss the overlay this way\n // @todo: option to prevent shake\n clickBlockedAnimation(contentEl.value);\n return;\n }\n isActiveContent.value = false;\n if (focusActivator && contentEl.value?.contains(document.activeElement)) {\n activatorEl.value?.focus();\n }\n}\n\n/**\n * Event Listeners\n */\nfunction onAfterLeave() {\n isActiveTeleport.value = false;\n emit(\"afterLeave\");\n}\n\nconst clickOutsideDirectiveArgs = {\n handler: onClickOutside,\n condition: clickOutsideCondition,\n include: () => [activatorEl.value],\n};\n\nfunction onClickOutside(e: MouseEvent) {\n emit(\"click:outside\", e);\n dismiss(false);\n}\n\nfunction onKeydown(e: KeyboardEvent) {\n if (e.key === \"Escape\" && isTopGlobal.value) {\n dismiss(true);\n }\n}\n// Listen for keydown events only when the content is active\nwatch(\n isActiveContent,\n (active) => {\n if (active) {\n window.addEventListener(\"keydown\", onKeydown);\n } else {\n window.removeEventListener(\"keydown\", onKeydown);\n }\n },\n { immediate: true },\n);\n\n/**\n * Integrate with Back button for single page apps.\n */\nuseToggleScope(\n () => props.closeOnBack,\n () => {\n useBackButton(router, (next) => {\n if (isTopGlobal.value && isActiveContent.value) {\n next(false);\n dismiss(false);\n } else {\n next();\n }\n });\n },\n);\n\n/**\n * Calculate the `top` position\n */\nconst top = ref<number>();\nwatch(\n () =>\n isActiveContent.value &&\n (props.absolute || props.contained) &&\n teleportTarget.value == null,\n (value) => {\n if (value) {\n const scrollParent = getScrollParent(containerEl.value);\n if (scrollParent && scrollParent !== document.scrollingElement) {\n top.value = scrollParent.scrollTop;\n }\n }\n },\n);\n\n/**\n * Dynamically create a local component we can render using:\n * `<activator-slot>` or `<component :is=\"activatorSlot\" />`\n */\nconst activatorSlot = () => {\n return slots.activator?.({\n isActive: isActiveContent.value,\n props: mergeProps(\n { ref: activatorRef },\n activatorEvents.value,\n props.activatorProps,\n ),\n });\n};\n\nconst contentAttributes = mergeProps(contentEvents.value, props.contentProps);\nconst overlayAttributes = {\n ...scopeId,\n ...attrs,\n};\n</script>\n\n<template>\n <activator-slot />\n\n <teleport\n v-if=\"isActiveTeleport\"\n :disabled=\"!teleportTarget\"\n :to=\"teleportTarget\">\n <div\n ref=\"containerEl\"\n :class=\"[\n 'ev-overlay',\n {\n 'is-active': isActiveContent,\n },\n rtlClasses,\n props.class,\n ]\"\n :style=\"[\n stackStyles,\n {\n top: toWebUnit(top),\n },\n props.style,\n ]\"\n v-bind=\"overlayAttributes\">\n <transition appear name=\"transition-fade\">\n <div\n v-if=\"isActiveVeil\"\n class=\"ev-overlay--veil\"\n v-bind=\"veilEvents\"></div>\n </transition>\n\n <ev-transition\n appear\n :transition=\"contentTransition\"\n :target=\"activatorEl\"\n @after-leave=\"onAfterLeave\">\n <div\n v-show=\"isActiveContent\"\n ref=\"contentEl\"\n v-click-outside=\"clickOutsideDirectiveArgs\"\n class=\"ev-overlay--content\"\n :class=\"[props.contentClass]\"\n :style=\"[dimensions, contentStyles]\"\n v-bind=\"contentAttributes\">\n <slot />\n </div>\n </ev-transition>\n </div>\n </teleport>\n</template>\n","<script setup lang=\"ts\">\n/**\n * # EvMenu\n */\nimport \"./EvMenu.scss\";\nimport { makeEvMenuProps } from \"./EvMenu.ts\";\nimport { EvOverlay } from \"@/components/EvOverlay\";\nimport {\n computed,\n inject,\n mergeProps,\n provide,\n ref,\n shallowRef,\n watch,\n} from \"vue\";\nimport { useModelProxy } from \"@/composables/modelProxy.ts\";\nimport { filterComponentProps, focusChild, getNextId } from \"@/util\";\nimport { EvMenuSymbol } from \"./shared.ts\";\n\nconst props = defineProps({\n ...makeEvMenuProps(),\n});\nconst slots = defineSlots<{\n activator(props: { isActive: boolean; props: any }): never;\n default(): never;\n}>();\nconst isActive = useModelProxy(props, \"modelValue\");\nconst uid = getNextId();\nconst id = computed(() => {\n return props.id || `ev-menu-${uid}`;\n});\nconst overlay = ref<typeof EvOverlay>();\nconst parent = inject(EvMenuSymbol, null);\nconst openChildren = shallowRef(0);\n\nprovide(EvMenuSymbol, {\n register() {\n ++openChildren.value;\n },\n unregister() {\n --openChildren.value;\n },\n closeParents() {\n setTimeout(() => {\n if (!openChildren.value) {\n isActive.value = false;\n parent?.closeParents();\n }\n }, 40);\n },\n});\n\nwatch(isActive, (value) => {\n return value ? parent?.register() : parent?.unregister();\n});\n\nfunction onClickOutside() {\n parent?.closeParents();\n}\n\nfunction onKeydown(e: KeyboardEvent) {\n if (props.disabled) {\n return;\n }\n if (e.key === \"Tab\") {\n isActive.value = false;\n overlay.value?.activatorEl?.focus();\n }\n}\n\n/**\n * ## On Activator Keydown\n *\n * @param e\n */\nfunction onActivatorKeydown(e: KeyboardEvent) {\n if (props.disabled) {\n return;\n }\n const el = overlay.value?.contentEl;\n if (el && isActive.value) {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n focusChild(el, \"next\");\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n focusChild(el, \"previous\");\n }\n } else if ([\"ArrowDown\", \"ArrowUp\"].includes(e.key)) {\n isActive.value = true;\n e.preventDefault();\n setTimeout(() => setTimeout(() => onActivatorKeydown(e)));\n }\n}\n\n/**\n * ## Activator Props\n *\n * Manipulate the activator props to include the keydown event listener\n * and ARIA attributes for accessibility.\n */\nconst activatorProps = computed(() => {\n return mergeProps(\n {\n \"aria-haspopup\": \"menu\",\n \"aria-expanded\": String(isActive.value),\n \"aria-owns\": id.value,\n onKeydown: onActivatorKeydown,\n },\n props.activatorProps,\n );\n});\n\n/**\n * ## Expose aspects of EvMenu to parent components\n */\ndefineExpose({\n id,\n openChildren,\n});\n\nconst overlayProps = computed(() => filterComponentProps(EvOverlay, props));\n</script>\n\n<template>\n <ev-overlay\n ref=\"overlay\"\n v-model=\"isActive\"\n v-bind=\"overlayProps\"\n :class=\"['ev-menu', props.class]\"\n :style=\"props.style\"\n :activator-props=\"activatorProps\"\n @click:outside=\"onClickOutside\"\n @keydown=\"onKeydown\">\n <template v-if=\"slots.activator\" #activator=\"{ isActive, props }\">\n <slot name=\"activator\" :is-active=\"isActive\" :props=\"props\" />\n </template>\n <template #default>\n <slot name=\"default\" />\n </template>\n </ev-overlay>\n</template>\n","import { makeClassName, propsFactory } from \"@/util\";\nimport { makeDimensionsProps } from \"@/composables/dimensions.ts\";\nimport { PropType } from \"vue\";\n\n/**\n * # Surface Elevation\n *\n * Elevations are the layered surfaces that form the foundation of the UI.\n * They create a blank canvas containing other UI components.\n * Such as text, icons, backgrounds, and borders.\n *\n */\nexport type SurfaceElevation = \"default\" | \"panel\" | \"overlay\" | \"sunken\";\n\n/**\n * # Make Elevation Class\n */\nexport function makeElevationClass(elevation: string) {\n return makeClassName(elevation, \"elevation\");\n}\n\n/**\n * # Make Surface Props\n */\nexport const makeEvSurfaceProps = propsFactory(\n {\n elevation: {\n type: String as PropType<SurfaceElevation>,\n default: \"default\",\n },\n // Rounded\n rounded: {\n type: [String, Number, Boolean],\n default: undefined,\n },\n // Scrollable\n scrollable: {\n type: [String, Boolean],\n default: undefined,\n },\n ...makeDimensionsProps(),\n },\n \"EvSurface\",\n);\n","<script setup lang=\"ts\">\nimport \"./EvSurface.scss\";\nimport { makeElevationClass, makeEvSurfaceProps } from \"./EvSurface.ts\";\nimport { isEmpty, isString, makeClassName } from \"@/util\";\nimport { useDimensions } from \"@/composables/dimensions.ts\";\n\nconst props = defineProps({\n ...makeEvSurfaceProps(),\n});\nconst dimensions = useDimensions(props);\n\n/**\n * @todo: this probably belongs in its own composable, if we expand on it or make it generic.\n *\n * @param rounded\n */\nfunction makeRoundedClass(rounded?: string | number | boolean) {\n if (!rounded || isEmpty(rounded)) {\n return undefined;\n }\n if (rounded === true) {\n return \"is-rounded\";\n }\n if (!isString(rounded)) {\n return undefined;\n }\n return makeClassName(rounded, \"is-rounded\");\n}\n\n/**\n * # Make Scrollable Class\n * @param scrollable\n */\nfunction makeScrollableClass(scrollable?: string | boolean) {\n if (typeof scrollable === \"undefined\") {\n return undefined;\n }\n if (scrollable === false) {\n return \"is-overflow-hidden\";\n }\n switch (scrollable) {\n case \"x\":\n return \"is-scrollable-x\";\n case \"y\":\n return \"is-scrollable-y\";\n default:\n return \"is-scrollable\";\n }\n}\n</script>\n\n<template>\n <div\n class=\"ev-surface\"\n :class=\"[\n makeElevationClass(props.elevation),\n makeRoundedClass(props.rounded),\n makeScrollableClass(props.scrollable),\n ]\"\n :style=\"[dimensions]\">\n <slot />\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * `<ev-date-field>`\n */\nimport \"./EvDateField.scss\";\nimport { makeEvDateFieldProps } from \"./EvDateField.ts\";\nimport { EvTextfield } from \"@/components/EvTextfield\";\nimport { EvMenu } from \"@/components/EvMenu\";\nimport { EvDatePicker } from \"@/components/EvDatePicker\";\nimport { EvSurface } from \"@/components/EvSurface\";\nimport { computed, ref, shallowRef, watch } from \"vue\";\nimport { FocusEvent } from \"react\";\nimport { useModelProxy } from \"@/composables/modelProxy.ts\";\nimport { filterComponentProps, omit, wrapInArray } from \"@/util\";\nimport { useDate } from \"@/composables/date/date.ts\";\n\nconst dateAdapter = useDate();\nconst props = defineProps({\n ...makeEvDateFieldProps(),\n});\nconst slots = defineSlots<{\n label(): never;\n}>();\n\n// Text Field\nconst evMenuRef = ref<typeof EvMenu>();\nconst evTextfieldRef = ref<typeof EvTextfield>();\nconst evTextfieldProps = computed(() => {\n return omit(filterComponentProps(EvTextfield, props), [\"modelValue\"]);\n});\nconst isFocused = shallowRef(false);\n\n// Date Picker\nconst datePickerRef = ref<typeof EvDatePicker>();\nconst datePickerProps = computed(() => {\n return omit(filterComponentProps(EvDatePicker, props), [\"modelValue\"]);\n});\n\n// Menu\nconst isMenuOpen = shallowRef(false);\nconst modelValue = useModelProxy(\n props,\n \"modelValue\",\n undefined,\n (value) => wrapInArray(value),\n (value: any) => {\n return value[0] ?? null;\n },\n);\nconst displayValue = shallowRef<string | null>(null);\n\n/**\n * ## On Menu After Leave\n * Maintain focus on the EvSelect when leaving the menu - usually when tabbing out.\n */\nfunction onMenuAfterLeave() {\n if (isFocused.value && evTextfieldRef.value) {\n evTextfieldRef.value.focus();\n }\n}\n\nfunction onFieldFocus() {\n isFocused.value = true;\n isMenuOpen.value = true;\n}\n\n/**\n * ## On Field Blur\n * @param e\n */\nfunction onFieldBlur(e: FocusEvent) {\n if (!datePickerRef.value?.$el.contains(e.relatedTarget as HTMLElement)) {\n isMenuOpen.value = false;\n }\n}\n\n/**\n * ## On Date Picker Focus In\n * Maintain focus on the field when actions within the date picker occur.\n * @param e\n */\nfunction onDatePickerFocusIn(e: FocusEvent) {\n isFocused.value = true;\n}\n\nfunction onUpdateModelValue() {\n isMenuOpen.value = false;\n}\n\nfunction onClearInput() {\n setModelValue(null);\n}\n\nfunction setModelValue(value: any) {\n modelValue.value = wrapInArray(value);\n}\n\nfunction onInput(e: Event) {\n if (!displayValue.value?.length) {\n setModelValue(null);\n return;\n }\n const date = dateAdapter.date(displayValue.value);\n if (\n date &&\n dateAdapter.isValid(date) &&\n dateAdapter.getYear(date).toString().length === 4 &&\n dateAdapter.format(date, \"displayDate\") === displayValue.value\n ) {\n setModelValue(date);\n }\n}\n\nwatch(modelValue, () => {\n const date = modelValue.value[0] ?? null;\n if (!date || !dateAdapter.isValid(date)) {\n displayValue.value = null;\n } else {\n displayValue.value = dateAdapter.format(\n modelValue.value[0],\n \"displayDate\",\n );\n }\n});\n</script>\n\n<template>\n <ev-textfield\n ref=\"evTextfieldRef\"\n v-bind=\"evTextfieldProps\"\n v-model=\"displayValue\"\n v-model:focused=\"isFocused\"\n class=\"ev-date-field\"\n :validation-value=\"modelValue\"\n @click:control=\"onFieldFocus\"\n @blur=\"onFieldBlur\"\n @click:clear=\"onClearInput\"\n @input=\"onInput\">\n <template v-if=\"props.label || slots.label\" #label>\n <slot name=\"label\">{{ props.label }}</slot>\n </template>\n <template #default>\n <ev-menu\n ref=\"evMenuRef\"\n v-model=\"isMenuOpen\"\n activator=\"parent\"\n position=\"bottom-start\"\n :open-on-click=\"false\"\n :close-on-content-click=\"false\"\n @after-leave=\"onMenuAfterLeave\">\n <ev-surface elevation=\"overlay\" class=\"ev-date-field--surface\">\n <ev-date-picker\n ref=\"datePickerRef\"\n v-bind=\"datePickerProps\"\n v-model=\"modelValue\"\n @focusin=\"onDatePickerFocusIn\"\n @update:model-value=\"onUpdateModelValue()\" />\n </ev-surface>\n </ev-menu>\n </template>\n </ev-textfield>\n</template>\n","import { propsFactory } from \"@/util\";\nimport { DefaultsOptions } from \"@/composables/defaults.ts\";\nimport { PropType } from \"vue\";\n\nexport const makeEvDefaultsProviderProps = propsFactory(\n {\n defaults: Object as PropType<DefaultsOptions>,\n disabled: Boolean,\n reset: [Number, String],\n root: [Boolean, String],\n scoped: Boolean,\n },\n \"EvDefaultsProvider\",\n);\n","<script setup lang=\"ts\">\nimport { toRefs } from \"vue\";\nimport { provideDefaults } from \"@/composables/defaults.ts\";\nimport { makeEvDefaultsProviderProps } from \"./EvDefaultsProvider.ts\";\n\nconst props = defineProps({\n ...makeEvDefaultsProviderProps(),\n});\n\nconst { defaults, disabled, reset, root, scoped } = toRefs(props);\n\nprovideDefaults(defaults, {\n reset,\n root,\n scoped,\n disabled,\n});\n</script>\n\n<template>\n <slot />\n</template>\n","<script lang=\"ts\">\nimport { propsFactory } from \"@/util\";\nimport { PropType } from \"vue\";\n\n/**\n * # makeEvDialogTransitionProps\n * We could export these if we need to later, but I don't see a need for that yet.\n */\nexport const makeEvDialogTransitionProps = propsFactory(\n {\n target: [Object, Array] as PropType<\n HTMLElement | [x: number, y: number]\n >,\n },\n \"EvDialogTransition\",\n);\n</script>\n\n<script setup lang=\"ts\">\nimport {\n adjustedBoundingRect,\n animate,\n easingAccelerate,\n easingDecelerate,\n getTargetRect,\n} from \"@/util\";\n\nconst props = defineProps({\n ...makeEvDialogTransitionProps(),\n});\n\n/**\n * ## getDimensions\n *\n * @param target\n * @param el\n */\nfunction getDimensions(\n target: HTMLElement | [x: number, y: number],\n el: HTMLElement,\n) {\n const targetRect = getTargetRect(target);\n const elRect = adjustedBoundingRect(el);\n const [originX, originY] = getComputedStyle(el)\n .transformOrigin.split(\" \")\n .map((v) => parseFloat(v));\n const [anchorSide, anchorOffset] = getComputedStyle(el)\n .getPropertyValue(\"--ev-overlay-position\")\n .split(\" \");\n\n let offsetX = targetRect.left + targetRect.width / 2;\n if (anchorSide === \"left\" || anchorOffset === \"left\") {\n offsetX -= targetRect.width / 2;\n } else if (anchorSide === \"right\" || anchorOffset === \"right\") {\n offsetX += targetRect.width / 2;\n }\n\n let offsetY = targetRect.top + targetRect.height / 2;\n if (anchorSide === \"top\" || anchorOffset === \"top\") {\n offsetY -= targetRect.height / 2;\n } else if (anchorSide === \"bottom\" || anchorOffset === \"bottom\") {\n offsetY += targetRect.height / 2;\n }\n\n const tsx = targetRect.width / elRect.width;\n const tsy = targetRect.height / elRect.height;\n const maxs = Math.max(1, tsx, tsy);\n const sx = tsx / maxs || 0;\n const sy = tsy / maxs || 0;\n\n // Animate elements larger than 12% of the screen area up to 1.5x slower\n const asa =\n (elRect.width * elRect.height) /\n (window.innerWidth * window.innerHeight);\n const speed = asa > 0.12 ? Math.min(1.5, (asa - 0.12) * 10 + 1) : 1;\n\n return {\n x: offsetX - (originX + elRect.left),\n y: offsetY - (originY + elRect.top),\n sx,\n sy,\n speed,\n };\n}\n\n/**\n * ## onBeforeEnter\n *\n * @param el\n */\nfunction onBeforeEnter(el: Element) {\n (el as HTMLElement).style.pointerEvents = \"none\";\n (el as HTMLElement).style.visibility = \"hidden\";\n}\n\n/**\n * ## onEnter\n *\n * @param el\n * @param done\n */\nasync function onEnter(el: Element, done: () => void) {\n await new Promise((resolve) => requestAnimationFrame(resolve));\n await new Promise((resolve) => requestAnimationFrame(resolve));\n\n (el as HTMLElement).style.visibility = \"\";\n\n const { x, y, sx, sy, speed } = getDimensions(\n props.target!,\n el as HTMLElement,\n );\n\n const animation = animate(\n el,\n [\n {\n transform: `translate(${x}px, ${y}px) scale(${sx}, ${sy})`,\n opacity: 0,\n },\n {},\n ],\n {\n duration: 225 * speed,\n easing: easingDecelerate,\n },\n );\n animation.finished.then(() => done());\n}\n\n/**\n * ## onAfterEnter\n *\n * @param el\n */\nfunction onAfterEnter(el: Element) {\n (el as HTMLElement).style.removeProperty(\"pointer-events\");\n}\n\n/**\n * ## onBeforeLeave\n *\n * @param el\n */\nfunction onBeforeLeave(el: Element) {\n (el as HTMLElement).style.pointerEvents = \"none\";\n}\n\n/**\n * ## onLeave\n *\n * @param el\n * @param done\n */\nasync function onLeave(el: Element, done: () => void) {\n await new Promise((resolve) => requestAnimationFrame(resolve));\n const { x, y, sx, sy, speed } = getDimensions(\n props.target!,\n el as HTMLElement,\n );\n const animation = animate(\n el,\n [\n {},\n {\n transform: `translate(${x}px, ${y}px) scale(${sx}, ${sy})`,\n opacity: 0,\n },\n ],\n {\n duration: 125 * speed,\n easing: easingAccelerate,\n },\n );\n animation.finished.then(() => done());\n}\n\n/**\n * ## onAfterLeave\n *\n * @param el\n */\nfunction onAfterLeave(el: Element) {\n (el as HTMLElement).style.removeProperty(\"pointer-events\");\n}\n</script>\n\n<template>\n <transition\n v-if=\"props.target\"\n name=\"ev-dialog-transition\"\n :css=\"false\"\n @before-enter=\"onBeforeEnter\"\n @enter=\"onEnter\"\n @after-enter=\"onAfterEnter\"\n @before-leave=\"onBeforeLeave\"\n @leave=\"onLeave\"\n @after-leave=\"onAfterLeave\">\n <slot />\n </transition>\n <transition v-else name=\"ev-dialog-transition\">\n <slot />\n </transition>\n</template>\n","import { propsFactory } from \"@/util\";\nimport { makeEvOverlayProps } from \"@/components/EvOverlay\";\nimport EvDialogTransition from \"@/components/EvDialog/EvDialogTransition.vue\";\n\n/**\n * # makeEvDialogProps\n */\nexport const makeEvDialogProps = propsFactory(\n {\n fullscreen: Boolean,\n retainFocus: {\n type: Boolean,\n default: true,\n },\n scrollable: Boolean,\n showHeader: {\n type: Boolean,\n default: true,\n },\n\n ...makeEvOverlayProps({\n origin: \"center center\" as const,\n scrollStrategy: \"block\" as const,\n positionStrategy: \"static\" as const,\n transition: {\n component: EvDialogTransition,\n },\n zIndex: 2400,\n }),\n\n __instance: null,\n },\n \"EvDialog\",\n);\n\nexport const DialogSize = {\n default: \"medium\",\n small: \"small\",\n medium: \"medium\",\n large: \"large\",\n xLarge: \"x-large\",\n} as const;\nexport type DialogSizeProp = (typeof DialogSize)[keyof typeof DialogSize];\nexport const DialogSizeToWidth: Record<string, number> = {\n [DialogSize.small]: 400,\n [DialogSize.medium]: 600,\n [DialogSize.large]: 800,\n [DialogSize.xLarge]: 968,\n};\n","<script setup lang=\"ts\"></script>\n\n<template>\n <div class=\"ev-dialog--body is-scrollable\">\n <slot />\n </div>\n</template>\n","<script setup lang=\"ts\"></script>\n\n<template>\n <div class=\"ev-dialog--footer\">\n <slot />\n </div>\n</template>\n","<script lang=\"ts\">\nimport { propsFactory } from \"@/util\";\n\nexport const makeEvDialogHeaderProps = propsFactory(\n {\n modelValue: Boolean,\n },\n \"EvDialogHeader\",\n);\n</script>\n\n<script setup lang=\"ts\">\nimport { useModelProxy } from \"@/composables/modelProxy.ts\";\nimport { CancelIcon } from \"@/icons\";\nimport EvButton from \"../EvButton/EvButton.vue\";\n\nconst props = defineProps({\n ...makeEvDialogHeaderProps(),\n});\nconst isActive = useModelProxy(props, \"modelValue\");\n\n/**\n * ## Close\n */\nfunction close() {\n isActive.value = false;\n}\n</script>\n\n<template>\n <div class=\"ev-dialog---header\">\n <slot />\n\n <ev-button rounded variant=\"subtle\" :icon=\"CancelIcon\" @click=\"close()\" />\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * `<ev-dialog>`\n */\nimport \"./EvDialog.scss\";\nimport {\n DialogSize,\n DialogSizeToWidth,\n makeEvDialogProps,\n} from \"./EvDialog.ts\";\nimport { computed, mergeProps, nextTick, ref, watch } from \"vue\";\nimport { EvOverlay } from \"@/components/EvOverlay\";\nimport EvSurface from \"@/components/EvSurface/EvSurface.vue\";\nimport { Browser, filterComponentProps, getFocusableChildren } from \"@/util\";\nimport { useModelProxy } from \"@/composables/modelProxy.ts\";\nimport EvDialogBody from \"@/components/EvDialog/EvDialogBody.vue\";\nimport EvDialogFooter from \"@/components/EvDialog/EvDialogFooter.vue\";\nimport EvDialogHeader from \"@/components/EvDialog/EvDialogHeader.vue\";\nimport { provideDialog } from \"@/composables/dialog.ts\";\n\nconst props = defineProps({\n ...makeEvDialogProps(),\n});\nconst slots = defineSlots<{\n activator(): never;\n container(): never;\n default(): never;\n footer(): never;\n header(): never;\n}>();\nconst overlayRef = ref();\nconst isActive = useModelProxy(props, \"modelValue\");\nconst isFullscreen = useModelProxy(props, \"fullscreen\");\nconst overlayProps = computed(() => {\n return filterComponentProps(EvOverlay, props);\n});\n\nconst activatorProps = computed(() => {\n return mergeProps(\n {\n \"aria-haspopup\": \"dialog\",\n \"aria-expanded\": String(isActive.value),\n },\n props.activatorProps,\n );\n});\n\n/**\n * ## Width\n *\n * We want to standardise dialog sizes. So we can intercept the `width` prop.\n *\n * - 'small'\n * - 'medium'\n * - 'large'\n * - 'x-large'\n */\nconst width = computed(() => {\n const size = props.width ?? DialogSizeToWidth[DialogSize.medium];\n return DialogSizeToWidth[size] ?? size;\n});\n\n/**\n * ## onFocusin\n *\n * When the user opens the dialog and presses tab (for example)\n * we can apply focus to the first available and focusable element.\n *\n * 1. The dialog MUST be the top-most open dialog.\n * 2. The target element MUST be the document nor the content of the dialog.\n * 3. The target element isn't within the dialog content.\n *\n * If the conditions above are met then we can refocus the user into the\n * first/last available focusable element.\n *\n * @param e\n */\nfunction onFocusin(e: FocusEvent) {\n const previousEl = e.relatedTarget as HTMLElement | null;\n const targetEl = e.target as HTMLElement | null;\n\n if (\n previousEl !== targetEl &&\n overlayRef.value?.contentEl &&\n overlayRef.value?.isTopGlobal &&\n ![document, overlayRef.value.contentEl].includes(targetEl) &&\n !overlayRef.value.contentEl.contains(targetEl)\n ) {\n const focusable = getFocusableChildren(overlayRef.value.contentEl);\n if (!focusable.length) {\n return;\n }\n const firstEl = focusable[0];\n const lastEl = focusable[focusable.length - 1];\n if (previousEl === firstEl) {\n lastEl.focus();\n } else {\n firstEl.focus();\n }\n }\n}\n\n/**\n * If the browser window is available (not SSR)\n * then we need to add the focusin event listen when the dialog is open\n * and then remove the event listener when it is closed.\n */\nif (Browser.hasWindow) {\n watch(\n () => isActive.value && props.retainFocus,\n (value) => {\n if (value) {\n document.addEventListener(\"focusin\", onFocusin);\n } else {\n document.removeEventListener(\"focusin\", onFocusin);\n }\n },\n {\n immediate: true,\n },\n );\n}\n\n/**\n * Watch for changes to the `modelValue` when the dialog is opened\n * focus on the content element. When it is closed revert focus\n * to the activator element if it is available.\n */\nwatch(isActive, async (value) => {\n await nextTick();\n if (value) {\n overlayRef.value!.contentEl?.focus({ preventScroll: true });\n } else {\n overlayRef.value!.activatorEl?.focus({ preventScroll: true });\n }\n});\n\n/**\n * ## Close\n */\nfunction close() {\n isActive.value = false;\n}\n\nprovideDialog(props.__instance);\n\ndefineExpose({\n close,\n});\n</script>\n\n<template>\n <ev-overlay\n ref=\"overlayRef\"\n v-bind=\"overlayProps\"\n v-model=\"isActive\"\n aria-modal=\"true\"\n role=\"dialog\"\n :class=\"[\n 'ev-dialog',\n {\n 'is-fullscreen': isFullscreen,\n 'is-scrollable': props.scrollable,\n },\n props.class,\n ]\"\n :style=\"props.style\"\n :activator-props=\"activatorProps\"\n :width=\"width\">\n <template v-if=\"slots.activator\" #activator=\"{ isActive, props }\">\n <slot name=\"activator\" :is-active=\"isActive\" :props=\"props\" />\n </template>\n\n <slot v-if=\"slots.container\" name=\"container\" />\n <ev-surface\n v-else\n class=\"ev-dialog--surface\"\n elevation=\"overlay\"\n rounded=\"small\">\n <ev-dialog-header v-if=\"props.showHeader\" v-model=\"isActive\">\n <slot name=\"header\" />\n </ev-dialog-header>\n <ev-dialog-body>\n <slot />\n </ev-dialog-body>\n <ev-dialog-footer v-if=\"slots.footer\">\n <slot name=\"footer\" />\n </ev-dialog-footer>\n </ev-surface>\n </ev-overlay>\n</template>\n","<script setup lang=\"ts\">\n/**\n * # EvDivider\n *\n * `<ev-divider />`\n */\nimport \"./EvDivider.scss\";\nimport { computed, useSlots } from \"vue\";\nimport { hasSlotWithContent } from \"@/composables/hasSlotWithContent.ts\";\nimport {\n Appearance,\n appearanceModifier,\n AppearanceProp,\n isCssVariable,\n isIntegerish,\n} from \"@/util\";\n\n/**\n * ## Divider Border Style\n */\ntype BorderStyle = \"solid\" | \"dashed\" | \"dotted\";\n\n/**\n * ## Divider Props\n */\ninterface DividerProps {\n appearance?: AppearanceProp;\n borderStyle?: BorderStyle;\n thickness?: number;\n opacity?: number | string;\n vertical?: boolean;\n}\nconst props = withDefaults(defineProps<DividerProps>(), {\n appearance: \"default\",\n borderStyle: \"solid\",\n opacity: undefined,\n thickness: 1,\n vertical: false,\n});\n\nconst slots = useSlots();\nconst hasDefaultSlot = hasSlotWithContent(slots, \"default\");\n\nconst borderColor = computed(() => {\n return props.appearance !== \"default\"\n ? `var(--text-${props.appearance})`\n : null;\n});\n\nconst borderOpacity = computed(() => {\n if (!props.opacity) {\n return null;\n }\n if (isIntegerish(props.opacity)) {\n return +props.opacity / 100;\n }\n if (isCssVariable(props.opacity)) {\n return `var(${props.opacity})`;\n }\n return null;\n});\n\nconst borderStyle = computed(() => {\n return props.borderStyle !== \"solid\" ? props.borderStyle : null;\n});\n\nconst borderWidth = computed(() => {\n return props.thickness > 1 ? props.thickness + \"px\" : null;\n});\n\nconst classNames = computed(() => {\n return [\n {\n \"is-horizontal\": !props.vertical,\n \"is-vertical\": props.vertical,\n },\n appearanceModifier(props.appearance, [Appearance.default]),\n ];\n});\n</script>\n\n<template>\n <div\n v-if=\"hasDefaultSlot\"\n class=\"ev-divider\"\n role=\"separator\"\n :class=\"classNames\">\n <hr class=\"ev-divider--line\" />\n <div class=\"ev-divider--content\"><slot /></div>\n <hr class=\"ev-divider--line\" />\n </div>\n <hr v-else class=\"ev-divider\" role=\"separator\" :class=\"classNames\" />\n</template>\n\n<style>\n.ev-divider {\n --border-color: v-bind(borderColor);\n --border-opacity: v-bind(borderOpacity);\n --border-style: v-bind(borderStyle);\n --border-width: v-bind(borderWidth);\n}\n</style>\n","import { omit, PhysicalSide, propsFactory } from \"@/util\";\nimport { makeEvDialogProps } from \"@/components\";\nimport { PropType } from \"vue\";\n\nexport const makeEvDrawerProps = propsFactory(\n {\n position: {\n type: String as PropType<PhysicalSide>,\n default: \"left\",\n },\n\n ...omit(makeEvDialogProps(), [\"position\"]),\n },\n \"EvDrawer\",\n);\n","<script setup lang=\"ts\">\nimport \"./EvDrawer.scss\";\nimport { EvDialog } from \"@/components/EvDialog\";\nimport { makeEvDrawerProps } from \"@/components/EvDrawer/EvDrawer.ts\";\nimport { computed, ref } from \"vue\";\nimport { filterComponentProps, omit } from \"@/util\";\nimport { useModelProxy } from \"@/composables/modelProxy.ts\";\nimport { provideDrawer } from \"@/composables/drawer.ts\";\n\nconst props = defineProps({\n ...makeEvDrawerProps(),\n});\nconst dialogProps = computed(() => {\n return omit(filterComponentProps(EvDialog, props), [\"position\"]);\n});\nconst isActive = useModelProxy(props, \"modelValue\");\nconst dialogRef = ref<typeof EvDialog>();\n\nconst positionClass = computed(() => {\n return `is-position-${props.position}`;\n});\n\nconst transition = computed(() => {\n return `ev-drawer--transition-${props.position}`;\n});\n\nconst overlayWidth = computed(() => {\n if (props.position === \"top\" || props.position === \"bottom\") {\n return \"100%\";\n }\n return props.width ?? \"medium\";\n});\n\n/**\n * ## Close\n */\nfunction close() {\n isActive.value = false;\n}\n\nprovideDrawer(props.__instance);\n\ndefineExpose({\n close,\n});\n</script>\n\n<template>\n <ev-dialog\n ref=\"dialogRef\"\n v-bind=\"dialogProps\"\n v-model=\"isActive\"\n :class=\"['ev-drawer', positionClass, props.class]\"\n :style=\"props.style\"\n :transition=\"transition\"\n :width=\"overlayWidth\">\n <template\n v-for=\"(slot, name) in $slots\"\n :key=\"name\"\n #[name]=\"slotProps\">\n <component :is=\"slot\" v-bind=\"slotProps\" />\n </template>\n </ev-dialog>\n</template>\n","import { propsFactory } from \"@/util\";\nimport { makeComponentProps } from \"@/composables/component.ts\";\nimport { makeFormProps } from \"@/composables/form.ts\";\n\nexport const makeEvFormProps = propsFactory(\n {\n ...makeComponentProps(),\n ...makeFormProps(),\n },\n \"EvForm\",\n);\n","<script setup lang=\"ts\">\nimport { ref } from \"vue\";\nimport { makeEvFormProps } from \"./EvForm.ts\";\nimport { createForm, SubmitEventPromise } from \"@/composables/form.ts\";\n\nconst formRef = ref<HTMLFormElement>();\nconst props = defineProps({\n ...makeEvFormProps(),\n});\nconst form = createForm(props);\nconst emit = defineEmits([\"update:modelValue\", \"submit\"]);\n\n/**\n * ## On Reset\n * @param $event\n */\nfunction onReset($event: Event) {\n $event.preventDefault();\n form.reset();\n}\n\n/**\n * ## On Submit\n * @param $event\n */\nfunction onSubmit($event: Event) {\n const e = $event as SubmitEventPromise;\n\n const ready = form.validate();\n e.then = ready.then.bind(ready);\n e.catch = ready.catch.bind(ready);\n e.finally = ready.finally.bind(ready);\n\n emit(\"submit\", e);\n\n if (!e.defaultPrevented) {\n ready.then(({ valid }) => {\n if (valid) {\n formRef.value?.submit();\n }\n });\n }\n\n e.preventDefault();\n}\n\ndefineExpose({\n ...form.expose(),\n});\n</script>\n\n<template>\n <form\n ref=\"formRef\"\n novalidate\n :class=\"['ev-form', props.class]\"\n :style=\"[props.style]\"\n @reset=\"onReset\"\n @submit=\"onSubmit\">\n <slot />\n </form>\n</template>\n","import { InputSizeProp, propsFactory } from \"@/util\";\nimport { makeComponentProps } from \"@/composables/component.ts\";\nimport { PropType } from \"vue\";\n\nexport const makeEvKbdProps = propsFactory(\n {\n value: String,\n size: String as PropType<InputSizeProp>,\n\n ...makeComponentProps(),\n },\n \"EvKbd\",\n);\n","import { makeAppearanceProps, propsFactory } from \"@/util\";\nimport { IconProp } from \"@/composables/icons.ts\";\nimport { makeComponentProps } from \"@/composables/component.ts\";\nimport { makeTagProps } from \"@/composables/tag.ts\";\n\nexport const makeEvLozengeProps = propsFactory(\n {\n iconEnd: IconProp,\n iconStart: IconProp,\n maxWidth: {\n type: [String, Number],\n default: 200,\n },\n\n ...makeAppearanceProps(),\n ...makeComponentProps(),\n ...makeTagProps({\n tag: \"span\",\n }),\n },\n \"EvLozenge\",\n);\n","<script setup lang=\"ts\">\n/**\n * # EvLozenge\n *\n * `<ev-lozenge />`\n */\nimport \"./EvLozenge.scss\";\nimport { makeEvLozengeProps } from \"./EvLozenge.ts\";\nimport { isIntegerish, useAppearance } from \"@/util\";\nimport { computed } from \"vue\";\nimport { EvIcon } from \"../EvIcon\";\n\nconst props = defineProps({\n ...makeEvLozengeProps(),\n});\n\n/**\n * ## Is the `maxWidth` prop numeric?\n * i.e. it does not have any web units.\n */\nconst isMaxWidthNumeric = () => {\n return isIntegerish(props.maxWidth);\n};\n\n/**\n * ## Get Outer Max Width\n * Returns the `maxWidth` prop value if it was supplied as a percentage,\n * or simply returns '100%'.\n */\nconst maxWidthOuter = computed(() => {\n return isMaxWidthNumeric() ? `${props.maxWidth}px` : props.maxWidth;\n});\n\nconst { appearanceClass, variantClass } = useAppearance(props);\n</script>\n\n<template>\n <component\n :is=\"props.tag\"\n :class=\"['ev-lozenge', appearanceClass, variantClass, props.class]\"\n :style=\"[{ 'max-width': maxWidthOuter }, props.style]\">\n <ev-icon v-if=\"props.iconStart\" :glyph=\"props.iconStart\" size=\"small\" />\n <span class=\"ev-lozenge--label\">\n <slot />\n </span>\n <ev-icon v-if=\"props.iconEnd\" :glyph=\"props.iconEnd\" size=\"small\" />\n </component>\n</template>\n","import { AppearanceProp, makeAppearanceProps, propsFactory } from \"@/util\";\nimport { PropType, Ref } from \"vue\";\nimport { IconProp, IconValue } from \"@/composables/icons.ts\";\nimport { makeTagProps } from \"@/composables/tag.ts\";\nimport { makeComponentProps } from \"@/composables/component.ts\";\nimport { EvButtonProps } from \"@/components\";\n\ntype ModelValueProp = boolean | Ref<boolean>;\ntype EvMessageVariant = \"subtle\" | \"tonal\" | \"bold\";\n\n/**\n * # EvMessageProps\n */\nexport interface EvMessageProps {\n description?: string;\n dismissible?: boolean;\n expandable?: boolean;\n icon?: IconValue;\n modelValue?: Ref<boolean>;\n title?: string;\n variant?: EvMessageVariant;\n actions?: EvButtonProps[];\n appearance?: AppearanceProp;\n onDismiss?: () => void;\n}\n\nexport interface EvMessageSlots {\n icon?: any;\n default?: any;\n actions?: any;\n}\n\n/**\n * # makeEvMessageProps\n */\nexport const makeEvMessageProps = propsFactory(\n {\n description: String,\n dismissDelay: {\n type: [Boolean, Number],\n default: 0,\n },\n dismissible: [Boolean, Object] as PropType<ModelValueProp>,\n expandable: Boolean,\n icon: IconProp,\n modelValue: {\n type: [Boolean, Object] as PropType<ModelValueProp>,\n default: true,\n },\n title: String,\n actions: Array as PropType<EvButtonProps[]>,\n\n ...makeAppearanceProps({\n variant: \"tonal\",\n }),\n ...makeTagProps({\n tag: \"section\",\n }),\n ...makeComponentProps(),\n },\n \"EvMessage\",\n);\n","<script setup lang=\"ts\">\n/**\n * # EvMessage\n *\n * `<ev-message />`\n */\nimport \"./EvMessage.scss\";\nimport { appearanceModifier, isNumber, makeClassName } from \"@/util\";\nimport EvIcon from \"../EvIcon/EvIcon.vue\";\nimport { CancelIcon, ChevronDownIcon } from \"@/icons\";\nimport { computed, nextTick, shallowRef } from \"vue\";\nimport EvButton from \"@/components/EvButton/EvButton.vue\";\nimport { useModelProxy } from \"@/composables/modelProxy.ts\";\nimport { appearanceIcon } from \"@/composables/icons.ts\";\nimport { makeEvMessageProps } from \"./EvMessage.ts\";\nimport { useLocaleFunctions } from \"@/composables/locale.ts\";\nimport { EvButtonProps } from \"@/components/EvButton\";\nimport { hasSlotWithContent } from \"@/composables/hasSlotWithContent.ts\";\n\nconst props = defineProps({\n ...makeEvMessageProps(),\n});\nconst slots = defineSlots<{\n actions(): never;\n default(): never;\n icon(): never;\n}>();\nconst hasDefaultSlot = hasSlotWithContent(slots, \"default\");\nconst hasActionSlot = hasSlotWithContent(slots, \"action\");\nconst modelProxy = useModelProxy(props, \"modelValue\");\nconst isExpanded = shallowRef(false);\nconst { t } = useLocaleFunctions();\n\n// Emit\nconst emit = defineEmits([\n \"dismissed\",\n \"click:dismiss\",\n \"click:expand\",\n \"update:modelValue\",\n]);\n\n/**\n * ## Icon Glyph\n */\nconst iconGlyph = computed(() => {\n return props.icon ? props.icon : appearanceIcon(props.appearance);\n});\n\nconst showExpandable = computed(() => {\n return (\n (hasDefaultSlot.value ||\n !!props.description ||\n hasActionSlot.value ||\n !!actions.value.length) &&\n (!props.expandable || isExpanded.value)\n );\n});\n\nconst variantModifier = computed(() => {\n return makeClassName(props.variant, \"is-variant\");\n});\n\n/**\n * ## On Click Dismiss\n */\nfunction dismiss(): void {\n if (!props.dismissDelay) {\n modelProxy.value = false;\n } else if (isNumber(props.dismissDelay)) {\n const delay = props.dismissDelay;\n setTimeout(() => {\n modelProxy.value = false;\n emit(\"dismissed\");\n }, delay);\n }\n emit(\"click:dismiss\");\n}\n\n/**\n * ## On Click Expand\n */\nfunction expand(): void {\n isExpanded.value = !isExpanded.value;\n emit(\"click:expand\", isExpanded.value);\n}\n\n/**\n * # Actions\n */\nconst actions = computed(() => {\n if (!props.actions) {\n return [];\n }\n const values = [];\n for (const action of props.actions) {\n const actionDefaults: EvButtonProps = {\n appearance: props.variant === \"bold\" ? \"inverse\" : props.appearance,\n variant: \"link\",\n size: \"x-small\",\n };\n values.push(Object.assign(actionDefaults, action));\n }\n return values;\n});\n\n/**\n * # onEnter\n * @param el\n */\nfunction onEnter(el: Element) {\n nextTick(() => {\n const element = el as HTMLElement;\n element.style.height = \"auto\";\n const height = getComputedStyle(element).height;\n element.style.height = \"0px\";\n requestAnimationFrame(() => {\n element.style.height = height;\n });\n });\n}\n\n/**\n * # onAfterEnter\n * @param el\n */\nfunction onAfterEnter(el: Element) {\n const element = el as HTMLElement;\n element.style.height = \"auto\";\n}\n\n/**\n * # onLeave\n * @param el\n */\nfunction onLeave(el: Element) {\n nextTick(() => {\n const element = el as HTMLElement;\n element.style.height = getComputedStyle(element).height;\n requestAnimationFrame(() => {\n element.style.height = \"0px\";\n });\n });\n}\n</script>\n\n<template>\n <component\n :is=\"props.tag\"\n v-show=\"modelProxy\"\n :class=\"[\n 'ev-message',\n variantModifier,\n appearanceModifier(props.appearance),\n props.class,\n ]\">\n <div class=\"ev-message--icon\">\n <slot name=\"icon\">\n <ev-icon :glyph=\"iconGlyph\" />\n </slot>\n </div>\n <div class=\"ev-message--content\">\n <h2 class=\"ev-message--title\">{{ props.title }}</h2>\n <transition\n name=\"transition-message\"\n @before-enter=\"onEnter\"\n @after-enter=\"onAfterEnter\"\n @leave=\"onLeave\">\n <div v-if=\"showExpandable\" class=\"ev-message--expandable\">\n <div v-if=\"hasDefaultSlot\" class=\"ev-message--description\">\n <slot name=\"default\" />\n </div>\n <div\n v-else-if=\"!!props.description\"\n class=\"ev-message--description\"\n v-html=\"props.description\"></div>\n <div\n v-if=\"hasActionSlot || actions.length\"\n class=\"ev-message--actions\">\n <slot name=\"actions\">\n <ev-button\n v-for=\"(action, index) in actions\"\n :key=\"index\"\n v-bind=\"action\" />\n </slot>\n </div>\n </div>\n </transition>\n </div>\n <div v-if=\"props.expandable\" class=\"ev-message--expand\">\n <ev-button\n rounded\n :class=\"[{ 'is-expanded': isExpanded }]\"\n :aria-label=\"t('expand')\"\n :icon=\"ChevronDownIcon\"\n size=\"small\"\n variant=\"subtle\"\n @click=\"expand\" />\n </div>\n <transition name=\"transition-fade\">\n <div v-if=\"props.dismissible\" class=\"ev-message--dismiss\">\n <ev-button\n rounded\n :aria-label=\"t('dismiss')\"\n :icon=\"CancelIcon\"\n size=\"small\"\n variant=\"subtle\"\n @click=\"dismiss\" />\n </div>\n </transition>\n </component>\n</template>\n","import { propsFactory } from \"@/util\";\nimport {\n EvMessageProps,\n EvMessageSlots,\n makeEvMessageProps,\n} from \"../EvMessage\";\n\n/**\n * # EvNotificationProps\n */\nexport interface EvNotificationProps extends EvMessageProps {\n timeout?: number;\n}\n\nexport interface EvNotificationSlots extends EvMessageSlots {}\n\n/**\n * # makeEvNotificationProps\n */\nexport const makeEvNotificationProps = propsFactory(\n {\n timeout: Number,\n zIndex: {\n type: [Number, String],\n default: 2000,\n },\n\n ...makeEvMessageProps({\n tag: \"div\" as const,\n dismissible: true,\n dismissDelay: true as const,\n variant: \"subtle\",\n }),\n },\n \"EvNotification\",\n);\n","<script setup lang=\"ts\">\nimport \"./EvNotification.scss\";\nimport { makeEvNotificationProps } from \"./EvNotification\";\nimport { EvMessage } from \"../EvMessage\";\nimport { EvSurface } from \"../EvSurface\";\nimport { filterComponentProps, omit } from \"@/util\";\nimport { computed, onMounted, toRef, watch } from \"vue\";\nimport { useModelProxy } from \"@/composables/modelProxy.ts\";\nimport { useStack } from \"@/composables/stack.ts\";\n\nconst props = defineProps({\n ...makeEvNotificationProps(),\n});\nconst slots = defineSlots<{\n actions(): never;\n default(): never;\n icon(): never;\n}>();\nconst model = useModelProxy(props, \"modelValue\");\nconst timeout = useModelProxy(props, \"timeout\");\nconst messageProps = computed(() => {\n return omit(filterComponentProps(EvMessage, props), [\"modelValue\"]);\n});\n\n// Emit\nconst emit = defineEmits([\"dismiss\", \"update:modelValue\"]);\n\nfunction dismiss() {\n model.value = false;\n emit(\"dismiss\");\n}\n\nconst { stackStyles } = useStack(model, toRef(props, \"zIndex\"), false);\n\nwatch(timeout, () => {\n if (!timeout.value) {\n stopTimer();\n } else {\n startTimer();\n }\n});\n\nonMounted(() => {\n if (!timeout.value) {\n return;\n }\n startTimer();\n});\n\nlet timer: any = null;\nfunction startTimer() {\n timer = setTimeout(() => {\n dismiss();\n }, timeout.value);\n}\n\nfunction stopTimer() {\n clearTimeout(timer);\n}\n</script>\n\n<template>\n <ev-surface\n class=\"ev-notification\"\n role=\"alert\"\n rounded=\"small\"\n elevation=\"overlay\"\n :style=\"[stackStyles]\">\n <ev-message v-bind=\"messageProps\" @click:dismiss=\"dismiss\">\n <template #icon>\n <slot name=\"icon\" />\n </template>\n <template #default>\n <slot name=\"default\" />\n </template>\n <template #actions>\n <slot name=\"actions\" />\n </template>\n </ev-message>\n </ev-surface>\n</template>\n","import { h, isRef, ref, shallowRef, VNode, VNodeProps, watch } from \"vue\";\nimport { Notification } from \"./EvNotifications.ts\";\nimport { EvNotificationProps, EvNotificationSlots } from \"@/components\";\n\n/**\n * # EvNotificationsManager\n */\nexport class EvNotificationsManager {\n public readonly notifications = ref<Notification[]>([]);\n private num = 0;\n\n /**\n * ## add\n *\n * @param props\n * @param slots\n */\n public add(props: EvNotificationProps, slots?: EvNotificationSlots) {\n const id = ++this.num;\n const renderedProps = this.createProps(id, props);\n const renderedSlots = this.createSlots(slots);\n this.notifications.value.unshift({\n id,\n props: renderedProps as object,\n slots: renderedSlots as object,\n });\n return {\n id,\n dismiss: () => {\n this.dismiss(id);\n },\n };\n }\n\n /**\n * ## createProps\n *\n * @param id\n * @param props\n * @private\n */\n private createProps(id: number, props: EvNotificationProps) {\n const model = isRef(props.modelValue)\n ? props.modelValue\n : shallowRef(true);\n watch(model, () => {\n this.dismiss(id);\n });\n return Object.assign(props as VNodeProps, {\n modelValue: model,\n });\n }\n\n /**\n * ## createSlots\n *\n * @private\n * @param slots\n */\n private createSlots(slots?: EvNotificationSlots) {\n const internalSlots = slots ?? {};\n const renderedSlots: {\n [key: string]: (props: any, slots: any) => VNode;\n } = {};\n for (const key in internalSlots) {\n const component = internalSlots[key as keyof EvNotificationSlots];\n renderedSlots[key] = (props, slots) => {\n return h(component!, props, slots);\n };\n }\n return renderedSlots;\n }\n\n /**\n * # dismiss\n *\n * @param id\n */\n public dismiss(id: number) {\n const index = this.notifications.value.findIndex(\n (notification) => notification.id === id,\n );\n this.notifications.value.splice(index, 1);\n }\n}\n","<script setup lang=\"ts\">\nimport \"./EvNotifications.scss\";\nimport { EvNotification } from \"../EvNotification\";\nimport { computed, shallowRef } from \"vue\";\nimport { useTeleport } from \"@/composables/teleport.ts\";\nimport { injectNotifications } from \"@/composables/notification.ts\";\nimport { getLastZIndex } from \"@/composables/stack\";\n\nconst teleportTarget = useTeleport(shallowRef(false));\nconst service = injectNotifications();\nconst notifications = service.notifications;\n\nconst zIndex = computed(() => {\n return getLastZIndex() ?? 2000;\n});\n</script>\n\n<template>\n <teleport :to=\"teleportTarget\">\n <transition-group\n name=\"transition-notification\"\n class=\"ev-notifications\"\n tag=\"div\"\n :style=\"{\n zIndex,\n }\">\n <ev-notification\n v-for=\"(notification, index) in notifications\"\n :key=\"notification.id\"\n v-bind=\"notification.props as object\"\n :dismissible=\"\n index === 0 ? notification.props.dismissible : false\n \"\n :timeout=\"index === 0 ? notification.props.timeout : undefined\"\n @dismiss=\"service.dismiss(notification.id)\">\n <template #icon\n ><component :is=\"notification.slots.icon\"\n /></template>\n <template #default\n ><component :is=\"notification.slots.default\"\n /></template>\n <template #actions\n ><component :is=\"notification.slots.actions\"\n /></template>\n </ev-notification>\n </transition-group>\n </teleport>\n</template>\n","import { isEmpty, omit, propsFactory } from \"@/util\";\nimport { makeEvTextfieldProps } from \"@/components/EvTextfield/EvTextfield.ts\";\nimport { LocaleManager } from \"@/modules/Locale/LocaleManager.ts\";\nimport { PropType, watch } from \"vue\";\n\nexport type NumberFieldModeProp = \"decimal\" | \"currency\";\n\nexport const makeEvNumberFieldProps = propsFactory(\n {\n minFractionDigits: Number,\n maxFractionDigits: Number,\n currency: String,\n currencyDisplay: {\n type: String,\n default: \"narrowSymbol\",\n },\n locale: String,\n localeMatcher: String,\n min: {\n type: Number,\n default: undefined,\n },\n max: {\n type: Number,\n default: undefined,\n },\n mode: {\n type: String as PropType<NumberFieldModeProp>,\n default: \"decimal\",\n },\n showButtons: Boolean,\n step: {\n type: Number,\n default: 1,\n },\n useGrouping: Boolean,\n\n ...omit(makeEvTextfieldProps(), [\"type\"]),\n },\n \"EvNumberField\",\n);\n\nexport interface NumberParserProps {\n // Required props\n mode: string;\n\n // Optional props\n currency?: string;\n currencyDisplay?: string;\n minFractionDigits?: number;\n maxFractionDigits?: number;\n locale?: string;\n localeMatcher?: string;\n min?: number;\n max?: number;\n useGrouping?: boolean;\n}\n\n/**\n * # Number Parser\n */\nexport class NumberParser {\n private _currencyPattern!: RegExp;\n private _decimalPattern!: RegExp;\n private _groupPattern!: RegExp;\n private _minusSignPattern!: RegExp;\n private _numberFormat!: Intl.NumberFormat;\n private _numerals!: string[];\n private _numeralsIndex!: (d: string) => string;\n private _numeralPattern!: RegExp;\n private _prefixPattern!: RegExp;\n private _suffixPattern!: RegExp;\n\n constructor(\n public localeManager: LocaleManager,\n public props: NumberParserProps,\n ) {\n this.cachePatterns();\n this.watchProps();\n }\n\n private cachePatterns() {\n this._numberFormat = new Intl.NumberFormat(this.locale, this.options);\n this._numerals = this.createNumerals();\n this._numeralsIndex = this.createNumeralsIndex();\n this._numeralPattern = this.createNumeralPattern();\n this._groupPattern = this.createGroupPattern();\n this._minusSignPattern = this.createMinusSignPattern();\n this._currencyPattern = this.createCurrencyPattern();\n this._decimalPattern = this.createDecimalPattern();\n this._suffixPattern = this.createSuffixPattern();\n this._prefixPattern = this.createPrefixPattern();\n }\n\n get currencyPattern() {\n return this._currencyPattern;\n }\n\n get decimalPattern() {\n return this._decimalPattern;\n }\n\n get groupChar(): string {\n const formatter = new Intl.NumberFormat(this.locale, {\n useGrouping: true,\n });\n return formatter\n .format(1000000)\n .trim()\n .replace(this.numeralPattern, \"\")\n .charAt(0);\n }\n\n get groupPattern() {\n return this._groupPattern;\n }\n\n get locale(): string {\n return this.props.locale ?? this.localeManager.currentLocale.value;\n }\n\n get minusSignPattern() {\n return this._minusSignPattern;\n }\n\n get numberFormat() {\n return this._numberFormat;\n }\n\n get numerals() {\n return this._numerals;\n }\n\n get numeralsIndex() {\n return this._numeralsIndex;\n }\n\n get numeralPattern() {\n return this._numeralPattern;\n }\n\n get options(): Intl.NumberFormatOptions {\n return {\n localeMatcher: \"best fit\",\n style: this.props.mode,\n currency: this.props.currency,\n currencyDisplay: this.props.currencyDisplay,\n useGrouping: this.props.useGrouping,\n minimumFractionDigits: this.props.minFractionDigits,\n maximumFractionDigits: this.props.maxFractionDigits,\n };\n }\n\n get prefixChar() {\n const options = {\n style: this.props.mode,\n currency: this.props.currency,\n currencyDisplay: this.props.currencyDisplay,\n };\n const formatter = new Intl.NumberFormat(this.locale, options);\n return formatter.format(1).split(\"1\")[0];\n }\n\n get prefixPattern() {\n return this._prefixPattern;\n }\n\n get suffixChar() {\n const options = {\n style: this.props.mode,\n currency: this.props.currency,\n currencyDisplay: this.props.currencyDisplay,\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n };\n const formatter = new Intl.NumberFormat(this.locale, options);\n return formatter.format(1).split(\"1\")[1];\n }\n\n get suffixPattern() {\n return this._suffixPattern;\n }\n\n /**\n * ## Create Currency Pattern\n * @private\n */\n private createCurrencyPattern() {\n if (!this.props.currency) {\n return new RegExp(`[]`, \"g\");\n }\n const options = {\n style: \"currency\",\n currency: this.props.currency,\n currencyDisplay: this.props.currencyDisplay,\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n };\n const formatter = new Intl.NumberFormat(this.locale, options);\n return new RegExp(\n `[${formatter.format(1).replace(/\\s/g, \"\").replace(this.numeralPattern, \"\").replace(this.groupPattern, \"\")}]`,\n \"g\",\n );\n }\n\n /**\n * ## Create Decimal Pattern\n * @private\n */\n private createDecimalPattern() {\n const formatter = new Intl.NumberFormat(this.locale, {\n ...this.options,\n useGrouping: false,\n });\n return new RegExp(\n `[${formatter.format(1.1).replace(this.currencyPattern, \"\").trim().replace(this.numeralPattern, \"\")}]`,\n \"g\",\n );\n }\n\n /**\n * ## Create Group Pattern\n * @private\n */\n private createGroupPattern() {\n return new RegExp(`[${this.groupChar}]`, \"g\");\n }\n\n /**\n * ## Create Minus Sign Pattern\n * @private\n */\n private createMinusSignPattern(): RegExp {\n const formatter = new Intl.NumberFormat(this.locale, {\n useGrouping: false,\n });\n return new RegExp(\n `[${formatter.format(-1).trim().replace(this.numeralPattern, \"\")}]`,\n \"g\",\n );\n }\n\n /**\n * ## Create Numerals\n * @private\n */\n private createNumerals(): string[] {\n return [\n ...new Intl.NumberFormat(this.locale, {\n useGrouping: false,\n }).format(9876543210),\n ].reverse();\n }\n\n /**\n * ## Create Numerals Index\n * @private\n */\n private createNumeralsIndex() {\n const index = new Map(this.numerals.map((d, i) => [d, i]));\n return (d: string) => index.get(d)?.toString() ?? \"\";\n }\n\n /**\n * ## Create Numeral Pattern\n * @private\n */\n private createNumeralPattern(): RegExp {\n return new RegExp(`[${this.numerals.join(\"\")}]`, \"g\");\n }\n\n /**\n * ## Create Prefix Pattern\n * @private\n */\n private createPrefixPattern() {\n return new RegExp(`${this.escapeRegExp(this.prefixChar || \"\")}`, \"g\");\n }\n\n /**\n * ## Create Suffix Pattern\n * @private\n */\n private createSuffixPattern() {\n return new RegExp(`${this.escapeRegExp(this.suffixChar || \"\")}`, \"g\");\n }\n\n /**\n * ## Escape RegExp\n * @param text\n */\n public escapeRegExp(text: string) {\n return text.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, \"\\\\$&\");\n }\n\n /**\n * ## Format Value\n *\n * Converts a number into formatted string.\n *\n * @param value\n */\n public formatValue(value: unknown): string {\n if (isEmpty(value)) {\n return \"\";\n }\n // Minus sign\n if (value === \"-\") {\n return value;\n }\n const formatter = new Intl.NumberFormat(this.locale, this.options);\n const formattedValue = formatter.format(value as number);\n // Remove currency symbol - we'll use this in the prefix instead\n return formattedValue;\n }\n\n /**\n * ## Parse Value\n *\n * Convert a text value into a number.\n *\n * Returns a string when an incomplete value is supplied,\n * or a number when a valid number is parsed successfully\n * from the text supplied, or a `null` value when the number\n * is not valid (can't be parsed).\n *\n * @param text\n */\n public parseValue(text: string | null | undefined): number | string | null {\n if (text === null || text === undefined) {\n text = \"\";\n }\n const filteredText = text\n .replace(this.suffixPattern, \"\")\n .replace(this.prefixPattern, \"\")\n .trim()\n .replace(this.currencyPattern, \"\")\n .replace(this.groupPattern, \"\")\n .replace(this.minusSignPattern, \"-\")\n .replace(this.decimalPattern, \".\")\n .replace(this.numeralPattern, this.numeralsIndex);\n\n if (!filteredText) {\n return null;\n }\n if (filteredText === \"-\") {\n return filteredText;\n }\n\n let parsedValue;\n const pattern = /^[-+*/.\\d\\s()]+$/;\n if (pattern.test(filteredText)) {\n try {\n parsedValue = eval(`(${filteredText})`);\n } catch (error) {\n parsedValue = +filteredText;\n }\n } else {\n parsedValue = +filteredText;\n }\n\n return isNaN(parsedValue) ? null : parsedValue;\n }\n\n /**\n * ## Watch Props\n * @private\n */\n private watchProps() {\n watch(\n [\n this.localeManager.currentLocale,\n () => this.props.locale,\n () => this.props.localeMatcher,\n () => this.props.mode,\n () => this.props.currency,\n () => this.props.currencyDisplay,\n () => this.props.useGrouping,\n () => this.props.minFractionDigits,\n () => this.props.maxFractionDigits,\n ],\n (value, oldValue) => {\n if (value !== oldValue) {\n this.cachePatterns();\n }\n },\n );\n }\n}\n","<script setup lang=\"ts\">\n/**\n * `<ev-number-field>`\n */\nimport \"./EvNumberField.scss\";\nimport { makeEvNumberFieldProps, NumberParser } from \"./EvNumberField.ts\";\nimport { EvTextfield } from \"@/components/EvTextfield\";\nimport { computed, nextTick, Ref, ref, shallowRef, watch } from \"vue\";\nimport { filterComponentProps, isEmpty, omit } from \"@/util\";\nimport { useModelProxy } from \"@/composables/modelProxy.ts\";\nimport { EvButton } from \"@/components/EvButton\";\nimport { MinusIcon, PlusIcon } from \"@/icons\";\nimport { useLocaleManager } from \"@/composables/locale.ts\";\nimport { KeyboardEvent } from \"react\";\n\nconst localeManager = useLocaleManager();\nconst props = defineProps({\n ...makeEvNumberFieldProps(),\n});\nconst slots = defineSlots<{\n label(): never;\n prefix(): never;\n suffix(): never;\n}>();\n\n// EvTextfield\nconst evTextfieldRef = ref<typeof EvTextfield>();\nconst evTextfieldProps = computed(() => {\n return omit(filterComponentProps(EvTextfield, props), [\"modelValue\"]);\n});\n\nconst numberParser = new NumberParser(localeManager, props);\n\n/**\n * We separate the `modelValue` and the `inputValue` (the value displayed)\n * because this allows us some efficiency improvements when holding down +/- buttons\n * as well as permitting formatting.\n *\n * Whenever the `modelValue` changes we need to ensure the `inputValue` is updated.\n */\nconst modelValue = useModelProxy(props, \"modelValue\");\n\nconst inputValue: Ref<string | null | undefined> = shallowRef();\ninputValue.value = numberParser.formatValue(modelValue.value);\nwatch(modelValue, () => {\n inputValue.value = numberParser.formatValue(modelValue.value);\n});\n\nwatch(\n [\n localeManager.currentLocale,\n () => props.locale,\n () => props.localeMatcher,\n () => props.mode,\n () => props.currency,\n () => props.currencyDisplay,\n () => props.useGrouping,\n () => props.minFractionDigits,\n () => props.maxFractionDigits,\n ],\n (value, oldValue) => {\n if (value !== oldValue) {\n inputValue.value = numberParser.formatValue(modelValue.value);\n }\n },\n);\n\n/**\n * Minimum Boundary\n * The computed value is now only a number or null (undefined will be converted to null).\n */\nconst minimum = computed(() => {\n return props.min ?? null;\n});\n\n/**\n * Maximum Boundary\n * The computed value is now only a number or null (undefined will be converted to null).\n */\nconst maximum = computed(() => {\n return props.max ?? null;\n});\n\n/*\nconst currencySymbol = computed(() => {\n return numberParser.prefixChar;\n});\n\n */\n\n/**\n * Incremental Values\n */\nconst incrementAmount = computed(() => {\n return props.step ?? 1;\n});\nlet incrementInterval: ReturnType<typeof setInterval> | null = null;\nconst incrementRate: number = 100;\nconst incrementDelay = 0.25;\nlet isIncrementing = false;\n\n/**\n * ## Get Decimal Places\n * Returns the number of decimal places of the `value` supplied.\n * @param value\n */\nfunction getDecimalPlaces(value: number): number {\n const options = {\n useGrouping: false,\n minimumFractionDigits: 0,\n maximumFractionDigits: 20,\n };\n const fraction = localeManager.numberFormatter\n .formatter(options)\n .formatToParts(value)\n .find((part) => part.type === \"fraction\");\n return fraction ? fraction.value.length : 0;\n}\n\n/**\n * ## Set Value\n * Can be used to set the value of either the 'modelValue' or the 'inputValue'.\n * @param value\n */\nfunction getValue(value?: string | number | null) {\n if (isEmpty(value)) {\n return value ?? null;\n }\n if (typeof value === \"string\") {\n value = parseFloat(value);\n }\n if (isMinBoundary(value!)) {\n value = minimum.value;\n } else if (isMaxBoundary(value!)) {\n value = maximum.value;\n }\n\n // We always want to constrain the value to the minimum\n // and maximum decimal places\n const decimalPlaces = getDecimalPlaces(value!);\n if (\n !isEmpty(props.minFractionDigits) &&\n decimalPlaces < props.minFractionDigits!\n ) {\n value = parseFloat(value!.toFixed(props.minFractionDigits));\n }\n if (\n !isEmpty(props.maxFractionDigits) &&\n decimalPlaces > props.maxFractionDigits!\n ) {\n value = parseFloat(value!.toFixed(props.maxFractionDigits));\n }\n return value;\n}\n\n/**\n * ## Is Max Boundary\n * @param value\n */\nfunction isMaxBoundary(value: number): boolean {\n return maximum.value !== null && maximum.value < value;\n}\n\n/**\n * ## Is Min Boundary\n * @param value\n */\nfunction isMinBoundary(value: number): boolean {\n return minimum.value !== null && minimum.value > value;\n}\n\n/**\n * # On Blur\n *\n * If the user has typed something we can't be sure that it is accurate\n * based upon the min/max boundaries so we reset the `inputValue` first.\n * Then, we can update the `modelValue` based on the input.\n */\nfunction onBlur(e: Event) {\n if (inputValue.value === \"-\") {\n inputValue.value = \"\";\n }\n const parsedValue = numberParser.parseValue(inputValue.value as string);\n const currentValue = getValue(parsedValue);\n inputValue.value = numberParser.formatValue(currentValue);\n modelValue.value = numberParser.parseValue(inputValue.value);\n}\n\n/**\n * ## On Focus\n *\n * @param e\n */\nfunction onFocus(e: Event) {\n if (props.readonly) {\n return;\n }\n inputValue.value = isEmpty(modelValue.value)\n ? \"\"\n : modelValue.value.toString();\n}\n\n/**\n * ## On Input Keydown\n * @param e\n */\nfunction onInputKeydown(e: KeyboardEvent) {\n const passThrough = [\n \"Backspace\",\n \"Delete\",\n \"Home\",\n \"End\",\n \"ArrowLeft\",\n \"ArrowRight\",\n \"Tab\",\n ];\n if (passThrough.includes(e.key)) {\n return;\n }\n\n // Listen to ArrowUp\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n startIncrementing(1);\n return;\n }\n // Listen to ArrowDown\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n startIncrementing(-1);\n return;\n }\n\n if (e.key === \"Enter\") {\n e.preventDefault();\n const parsedValue = numberParser.parseValue(inputValue.value);\n const currentValue = getValue(parsedValue);\n modelValue.value = currentValue;\n nextTick(() => {\n inputValue.value = isEmpty(currentValue)\n ? \"\"\n : currentValue!.toString();\n });\n return;\n }\n\n const isPaste = e.key === \"v\" && e.ctrlKey;\n\n // Block anything not in the whitelist\n const whitelist = new RegExp(\"[0-9 +\\-\\/\\(\\)*]\");\n if (!whitelist.test(e.key) && !isPaste) {\n e.preventDefault();\n }\n}\n\n/**\n * ## On Input Keyup\n * @param e\n */\nfunction onInputKeyup(e: KeyboardEvent) {\n if (e.code === \"ArrowUp\" || e.code === \"ArrowDown\") {\n e.preventDefault();\n }\n stopIncrementing();\n}\n\n/**\n * ## On Paste\n */\nfunction onPaste(e: ClipboardEvent) {\n e.preventDefault();\n const data = e.clipboardData?.getData(\"Text\");\n if (data) {\n const parsedValue = numberParser.parseValue(data);\n const currentValue = getValue(parsedValue);\n inputValue.value = isEmpty(currentValue)\n ? \"\"\n : currentValue!.toString();\n modelValue.value = currentValue;\n }\n}\n\n/**\n * ## Start Incrementing\n *\n * If the user holds the plus/minus button down for longer than the `incrementDelay`\n * we increase/decrease the `inputValue` by the `incrementAmount` at an increasing\n * rate for every second the user holds the button.\n *\n * @param direction\n */\nfunction startIncrementing(direction: number) {\n if (isIncrementing || props.readonly) {\n return;\n }\n isIncrementing = true;\n let currentValue: number;\n if (isEmpty(modelValue.value)) {\n currentValue = minimum.value ?? 0;\n } else {\n currentValue = getValue(\n modelValue.value! + direction * incrementAmount.value,\n )! as number;\n }\n inputValue.value = numberParser.formatValue(currentValue);\n\n // Then we rely on the delay to do more increments on a timer\n const startTime = Date.now();\n let internalIncrementAmount = incrementAmount.value;\n incrementInterval = setInterval(() => {\n const currentTime = Date.now();\n const elapsedTime = (currentTime - startTime) / 1000;\n if (elapsedTime < incrementDelay) {\n return;\n }\n const multiplier = Math.floor(Math.pow(2, elapsedTime - 1));\n internalIncrementAmount = incrementAmount.value * multiplier;\n currentValue = getValue(\n currentValue + direction * internalIncrementAmount,\n )! as number;\n inputValue.value = numberParser.formatValue(currentValue);\n }, incrementRate);\n}\n\n/**\n * ## Stop Incrementing\n *\n * When the user releases the plus/minus button stop the increment interval\n * and set the resulting value onto the `modelValue` - this is more efficient\n * than setting the `modelValue` with every increment.\n */\nfunction stopIncrementing() {\n if (isIncrementing) {\n clearInterval(incrementInterval!);\n const parsedValue = numberParser.parseValue(inputValue.value);\n modelValue.value = getValue(parsedValue);\n isIncrementing = false;\n }\n}\n\nconst hasPrefix = computed(() => {\n return props.showButtons || slots.prefix || props.prefix;\n});\n\nconst hasSuffix = computed(() => {\n return props.showButtons || slots.suffix || props.suffix;\n});\n</script>\n\n<template>\n <ev-textfield\n ref=\"evTextfieldRef\"\n v-bind=\"evTextfieldProps\"\n v-model=\"inputValue\"\n class=\"ev-number-field\"\n type=\"text\"\n @paste=\"onPaste\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @keydown=\"onInputKeydown\"\n @keyup=\"onInputKeyup\">\n <template v-if=\"props.label || slots.label\" #label>\n <slot name=\"label\">{{ props.label }}</slot>\n </template>\n <template v-if=\"hasPrefix\" #prefix>\n <ev-button\n v-if=\"props.showButtons\"\n rounded\n size=\"x-small\"\n class=\"ev-number-field--minus\"\n variant=\"subtle\"\n :icon=\"MinusIcon\"\n :disabled=\"props.readonly || props.disabled\"\n @keydown.space.enter=\"startIncrementing(-1)\"\n @keyup=\"stopIncrementing()\"\n @mousedown=\"startIncrementing(-1)\"\n @mouseup=\"stopIncrementing()\"\n @mouseleave=\"stopIncrementing()\" />\n <slot name=\"prefix\">{{ props.prefix }}</slot>\n </template>\n <template v-if=\"hasSuffix\" #suffix>\n <slot name=\"suffix\">{{ props.suffix }}</slot>\n <ev-button\n v-if=\"props.showButtons\"\n rounded\n size=\"x-small\"\n class=\"ev-number-field--plus\"\n variant=\"subtle\"\n :icon=\"PlusIcon\"\n :disabled=\"props.readonly || props.disabled\"\n @keydown.space.enter=\"startIncrementing(1)\"\n @keyup=\"stopIncrementing()\"\n @mousedown=\"startIncrementing(1)\"\n @mouseup=\"stopIncrementing()\"\n @mouseleave=\"stopIncrementing()\" />\n </template>\n </ev-textfield>\n</template>\n","<script setup lang=\"ts\">\nimport \"./EvQuickfind.scss\";\nimport EvIcon from \"../EvIcon/EvIcon.vue\";\nimport { QuickfindIcon } from \"@/icons\";\nimport { useModelProxy } from \"@/composables/modelProxy.ts\";\nimport { sizeModifier } from \"@/util\";\nimport { computed } from \"vue\";\n\ntype QuickfindSize = \"small\" | \"medium\" | \"large\";\n\ninterface QuickfindProps {\n modelValue?: string | number;\n bold?: boolean;\n size?: QuickfindSize;\n}\nconst props = withDefaults(defineProps<QuickfindProps>(), {\n bold: false,\n size: \"medium\",\n});\nconst modelProxy = useModelProxy(props, \"modelValue\");\n\nconst iconSize = computed(() => {\n switch (props.size) {\n case \"small\":\n case \"medium\":\n return \"small\";\n default:\n return \"medium\";\n }\n});\n</script>\n\n<template>\n <span\n :class=\"[\n 'ev-quickfind',\n {\n 'is-variant-bold': bold,\n },\n sizeModifier(size, ['medium']),\n ]\">\n <ev-icon :glyph=\"QuickfindIcon\" :size=\"iconSize\" />\n <span class=\"ev-quickfind--code\">{{ modelProxy }}</span>\n </span>\n</template>\n","import { propsFactory } from \"@/util\";\nimport { makeFormFieldProps } from \"@/composables/validation.ts\";\nimport { makeComponentProps } from \"@/composables/component.ts\";\n\nexport const makeEvRadioProps = propsFactory(\n {\n label: String,\n clearable: Boolean,\n value: null,\n\n ...makeFormFieldProps(),\n ...makeComponentProps(),\n },\n \"EvRadio\",\n);\n","import { propsFactory } from \"@/util\";\nimport { makeComponentProps } from \"@/composables/component.ts\";\nimport { makeFormFieldProps } from \"@/composables/validation.ts\";\nimport { InjectionKey } from \"vue\";\nimport { FormField } from \"@/modules/Form/FormField.ts\";\n\nexport interface EvRadioGroupContext extends FormField {}\n\nexport const EvRadioGroupSymbol: InjectionKey<EvRadioGroupContext> =\n Symbol.for(\"ev:radio-group\");\n\nexport const makeEvRadioGroupProps = propsFactory(\n {\n label: String,\n inline: Boolean,\n\n ...makeFormFieldProps(),\n ...makeComponentProps(),\n },\n \"EvRadioGroup\",\n);\n","<script setup lang=\"ts\">\nimport \"./EvRadioGroup.scss\";\nimport EvLabel from \"@/components/EvLabel/EvLabel.vue\";\nimport { EvRadioGroupSymbol, makeEvRadioGroupProps } from \"./EvRadioGroup.ts\";\nimport { computed, provide } from \"vue\";\nimport { getNextId } from \"@/util\";\nimport { useFormField } from \"@/composables/validation.ts\";\nimport EvErrors from \"@/components/EvErrors/EvErrors.vue\";\n\ndefineOptions({\n inheritAttrs: false,\n});\n\n// Props & slots\nconst props = defineProps({\n ...makeEvRadioGroupProps(),\n});\nconst slots = defineSlots<{\n default(): never;\n label(): never;\n}>();\n\n// Emit\ndefineEmits([\"update:modelValue\"]);\n\nconst uid = getNextId();\nconst id = computed(() => {\n return props.id || `radio-group-${uid}`;\n});\n\nconst formField = useFormField(props);\nprovide(EvRadioGroupSymbol, formField);\n</script>\n\n<template>\n <div\n :id=\"id\"\n :class=\"[\n 'ev-radio-group',\n props.class,\n {\n 'is-inline': props.inline,\n },\n ]\"\n :style=\"props.style\">\n <div v-if=\"props.label || slots.label\" class=\"ev-radio-group--label\">\n <ev-label>\n <slot name=\"label\">{{ props.label }}</slot>\n </ev-label>\n\n <div\n v-if=\"formField.isShowErrorMessages\"\n class=\"ev-radio-group-errors\">\n <ev-errors :messages=\"formField.errorMessages\" />\n </div>\n </div>\n\n <div class=\"ev-radio-group--control\">\n <slot />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * # `<ev-radio>`\n */\nimport \"./EvRadio.scss\";\nimport { computed, inject, ref, useAttrs } from \"vue\";\nimport { isDeepEqual, splitInputAttrs } from \"@/util\";\nimport EvLabel from \"@/components/EvLabel/EvLabel.vue\";\nimport { EvRadioGroupSymbol } from \"@/components/EvRadioGroup\";\nimport { makeEvRadioProps } from \"./EvRadio.ts\";\nimport { useFormField } from \"@/composables/validation.ts\";\n\n/**\n * We want to pass attributes not defined as 'props'\n * to the `<input>` field, so we need to turn off `inheritAttrs`.\n */\ndefineOptions({\n inheritAttrs: false,\n});\n\n// Props & slots\nconst props = defineProps({\n ...makeEvRadioProps(),\n});\nconst slots = defineSlots<{\n label(): never;\n}>();\nconst group = inject(EvRadioGroupSymbol, undefined);\n\n// Emit\ndefineEmits([\"update:focused\", \"update:modelValue\"]);\n\nconst attrs = useAttrs();\nconst containerRef = ref<HTMLElement | null>(null);\nconst inputRef = ref<HTMLInputElement | null>(null);\nconst [containerAttrs, inputAttrs] = splitInputAttrs(attrs);\nconst formField = useFormField(props, group);\nconst valueComparator = isDeepEqual;\n\n// Computed\nconst isChecked = computed({\n get() {\n return valueComparator(formField.value, props.value);\n },\n set(value: boolean) {\n if (props.readonly) {\n return;\n }\n formField.value = value ? props.value : \"\";\n },\n});\n\n/**\n * # On Click\n *\n * Handle clearable radio buttons when the input is checked and is then clicked again.\n *\n * @param e\n */\nfunction onClick(e: Event): void {\n if (isChecked.value && props.clearable) {\n isChecked.value = false;\n }\n}\n\n/**\n * ## On Input\n *\n * Handle changes to the checked state.\n *\n * @param e\n */\nfunction onInput(e: Event): void {\n isChecked.value = (e.target as HTMLInputElement).checked;\n}\n\n/**\n * # On Space\n *\n * We need this event handler to handle clearable radio, because\n * the `click` event is not triggered when the input is checked.\n *\n * @param e\n */\nfunction onSpace(e: Event): void {\n if (isChecked.value && props.clearable) {\n isChecked.value = false;\n // Prevent default to avoid the click event being triggered.\n e.preventDefault();\n }\n}\n\n/**\n * ## Get Input Element\n */\nfunction getInputElement(): HTMLInputElement | null {\n return inputRef.value;\n}\n\n/**\n * ## Expose stuff\n */\ndefineExpose({\n input: inputRef,\n focus: () => {\n getInputElement()?.focus();\n },\n ...formField.expose(),\n});\n</script>\n\n<template>\n <div\n ref=\"containerRef\"\n :class=\"[\n 'ev-radio',\n {\n 'is-checked': isChecked,\n 'is-labelled': props.label || slots.label,\n },\n formField.classes,\n props.class,\n ]\"\n :style=\"props.style\"\n v-bind=\"containerAttrs\">\n <div class=\"ev-radio--control\">\n <div class=\"ev-radio--circles\">\n <div class=\"ev-radio--outer-circle\"></div>\n <div class=\"ev-radio--inner-circle\"></div>\n </div>\n <input\n :id=\"formField.id\"\n ref=\"inputRef\"\n type=\"radio\"\n :name=\"formField.name\"\n :disabled=\"formField.isDisabled || formField.isReadonly\"\n :value=\"props.value\"\n :checked=\"isChecked\"\n v-bind=\"inputAttrs\"\n @blur=\"formField.blur\"\n @click=\"onClick\"\n @focus=\"formField.focus\"\n @input=\"onInput\"\n @keyup.space=\"onSpace\" />\n </div>\n <div v-if=\"props.label || slots.label\" class=\"ev-radio--label\">\n <ev-label :for=\"formField.id\" clickable>\n <slot name=\"label\">{{ props.label }}</slot>\n </ev-label>\n </div>\n </div>\n</template>\n","import { getPropertyValue, propsFactory, wrapInArray } from \"@/util\";\nimport {\n computed,\n MaybeRef,\n PropType,\n ref,\n Ref,\n unref,\n watchEffect,\n} from \"vue\";\n\n/**\n * - match without highlight\n * - single match (index), length already known\n * - single match (start, end)\n * - multiple matches (start, end), probably shouldn't overlap\n */\nexport type FilterMatch =\n | boolean\n | number\n | [number, number]\n | [number, number][];\nexport type FilterFunction = (\n value: string,\n query: string,\n item?: InternalItem,\n) => FilterMatch;\nexport type FilterKeyFunctions = Record<string, FilterFunction>;\nexport type FilterKeys = string | string[];\nexport type FilterMode = \"some\" | \"every\" | \"union\" | \"intersection\";\n\n/**\n * # FilterProps\n */\nexport interface FilterProps {\n filterFunction?: FilterFunction;\n filterKeyFunctions?: FilterKeyFunctions;\n filterKeys?: FilterKeys;\n filterMode?: FilterMode;\n noFilter?: boolean;\n}\n\n/**\n * # InternalItem\n */\nexport interface InternalItem<T = any> {\n value: any;\n raw: T;\n}\n\n/**\n * # defaultFilter\n * @param value\n * @param query\n * @param item\n */\nexport const defaultFilter: FilterFunction = (value, query, item) => {\n if (value == null || query == null) {\n return -1;\n }\n return value\n .toString()\n .toLocaleLowerCase()\n .indexOf(query.toString().toLocaleLowerCase());\n};\n\n/**\n * # makeFilterProps\n */\nexport const makeFilterProps = propsFactory(\n {\n filterFunction: Function as PropType<FilterFunction>,\n filterKeyFunctions: Object as PropType<FilterKeyFunctions>,\n filterKeys: [Array, String] as PropType<FilterKeys>,\n filterMode: {\n type: String as PropType<FilterMode>,\n default: \"intersection\",\n },\n noFilter: Boolean,\n },\n \"filter\",\n);\n\n/**\n * # filterItems\n * @param items\n * @param query\n * @param options\n */\nexport function filterItems(\n items:\n | readonly (readonly [item: InternalItem, transformed: {}])[]\n | readonly InternalItem[],\n query: string,\n options?: {\n filterKeyFunctions?: FilterKeyFunctions;\n default?: FilterFunction;\n filterKeys?: FilterKeys;\n filterMode?: FilterMode;\n noFilter?: boolean;\n },\n) {\n const array: { index: number; matches: Record<string, FilterMatch> }[] = [];\n // always ensure we fall back to a functioning filter\n const filter = options?.default ?? defaultFilter;\n const keys = options?.filterKeys ? wrapInArray(options.filterKeys) : false;\n const customFiltersLength = Object.keys(\n options?.filterKeyFunctions ?? {},\n ).length;\n\n if (!items?.length) {\n return array;\n }\n\n loop: for (let i = 0; i < items.length; i++) {\n const [item, transformed = item] = wrapInArray(items[i]) as readonly [\n InternalItem,\n {},\n ];\n const customMatches: Record<string, FilterMatch> = {};\n const defaultMatches: Record<string, FilterMatch> = {};\n let match: FilterMatch = -1;\n\n if (query && !options?.noFilter) {\n if (typeof item === \"object\") {\n const filterKeys = keys || Object.keys(transformed);\n\n for (const key of filterKeys) {\n const value = getPropertyValue(\n transformed,\n key,\n transformed,\n );\n const keyFilter = options?.filterKeyFunctions?.[key];\n\n match = keyFilter\n ? keyFilter(value, query, item)\n : filter(value, query, item);\n\n if (match !== -1 && match !== false) {\n if (keyFilter) {\n customMatches[key] = match;\n } else {\n defaultMatches[key] = match;\n }\n } else if (options?.filterMode === \"every\") {\n continue loop;\n }\n }\n } else {\n match = filter(item, query, item);\n if (match !== -1 && match !== false) {\n defaultMatches.title = match;\n }\n }\n\n const defaultMatchesLength = Object.keys(defaultMatches).length;\n const customMatchesLength = Object.keys(customMatches).length;\n\n if (!defaultMatchesLength && !customMatchesLength) {\n continue;\n }\n\n if (\n options?.filterMode === \"union\" &&\n customMatchesLength !== customFiltersLength &&\n !defaultMatchesLength\n ) {\n continue;\n }\n\n if (\n options?.filterMode === \"intersection\" &&\n (customMatchesLength !== customFiltersLength ||\n !defaultMatchesLength)\n ) {\n continue;\n }\n }\n\n array.push({\n index: i,\n matches: { ...defaultMatches, ...customMatches },\n });\n }\n\n return array;\n}\n\n/**\n * # useFilter\n * @param props\n * @param items\n * @param query\n * @param options\n */\nexport function useFilter<T extends InternalItem>(\n props: FilterProps,\n items: MaybeRef<T[]>,\n query: Ref<string | undefined> | (() => string | undefined),\n options?: {\n transform?: (item: T) => {};\n filterKeyFunctions?: MaybeRef<FilterKeyFunctions | undefined>;\n },\n) {\n const filteredItems: Ref<T[]> = ref([]);\n const filteredMatches: Ref<Map<unknown, Record<string, FilterMatch>>> = ref(\n new Map(),\n );\n const transformedItems = computed(() =>\n options?.transform\n ? unref(items).map(\n (item) => [item, options.transform!(item)] as const,\n )\n : unref(items),\n );\n\n watchEffect(() => {\n const _query = typeof query === \"function\" ? query() : unref(query);\n const strQuery = typeof _query !== \"string\" ? \"\" : String(_query);\n\n const results = filterItems(transformedItems.value, strQuery, {\n filterKeyFunctions: {\n ...props.filterKeyFunctions,\n ...unref(options?.filterKeyFunctions),\n },\n default: props.filterFunction,\n filterKeys: props.filterKeys,\n filterMode: props.filterMode,\n noFilter: props.noFilter,\n });\n\n const originalItems = unref(items);\n const _filteredItems: (typeof filteredItems)[\"value\"] = [];\n const _filteredMatches: (typeof filteredMatches)[\"value\"] = new Map();\n results.forEach(({ index, matches }) => {\n const item = originalItems[index];\n _filteredItems.push(item);\n _filteredMatches.set(item.value, matches);\n });\n filteredItems.value = _filteredItems;\n filteredMatches.value = _filteredMatches;\n });\n\n function getMatches(item: T) {\n return filteredMatches.value.get(item.value);\n }\n\n return { filteredItems, filteredMatches, getMatches };\n}\n","import { omit, propsFactory } from \"@/util\";\nimport { makeListItemsProps } from \"@/composables/lists\";\nimport { makeEvTextfieldProps } from \"@/components/EvTextfield\";\nimport { ChevronDownIcon } from \"@/icons\";\nimport { PropType } from \"vue\";\nimport { makeFilterProps } from \"@/composables/filter.ts\";\n\n/**\n * # Selectable Behavior\n * - 'select' simple selection (HTML select replacement)\n * - 'autocomplete' only permits selection of items\n * - 'combobox' allows selection or new values as strings\n */\nexport type SelectableBehavior = \"select\" | \"autocomplete\" | \"combobox\";\n\n/**\n * # Make EvSelect Props\n */\nexport const makeEvSelectProps = propsFactory(\n {\n autoSelectFirst: {\n type: [Boolean, String] as PropType<boolean | \"exact\">,\n },\n behavior: {\n type: String as PropType<SelectableBehavior>,\n default: \"select\",\n },\n delimiters: {\n type: Array as PropType<string[]>,\n default: [\",\"],\n },\n hideItemsEmpty: Boolean,\n hideSelected: Boolean,\n itemsEmptyText: {\n type: String,\n default: \"select.noItemsText\",\n },\n menuOpen: Boolean,\n multiple: Boolean,\n openOnClear: Boolean,\n search: String,\n tags: Boolean,\n\n ...makeFilterProps({ filterKeys: [\"title\"] }),\n\n ...makeListItemsProps({\n itemChildren: false,\n }),\n\n ...omit(\n makeEvTextfieldProps({\n modelValue: null,\n iconEnd: ChevronDownIcon,\n role: \"select\",\n }),\n [\"align\", \"monospace\", \"type\"],\n ),\n },\n \"EvSelect\",\n);\n","// Utilities\nimport { shallowRef, watch } from \"vue\";\n\n// Types\nimport type { Ref } from \"vue\";\nimport { EvList } from \"../EvList\";\nimport { EvTextfield } from \"../EvTextfield\";\n\n/**\n * # Use Scrolling\n *\n * @param listRef\n * @param textFieldRef\n */\nexport function useScrolling(\n listRef: Ref<typeof EvList | undefined>,\n textFieldRef: Ref<typeof EvTextfield | undefined>,\n) {\n const isScrolling = shallowRef(false);\n let scrollTimeout: number;\n\n function onListScroll(e: Event) {\n cancelAnimationFrame(scrollTimeout);\n isScrolling.value = true;\n scrollTimeout = requestAnimationFrame(() => {\n scrollTimeout = requestAnimationFrame(() => {\n isScrolling.value = false;\n });\n });\n }\n\n async function finishScrolling() {\n await new Promise((resolve) => requestAnimationFrame(resolve));\n await new Promise((resolve) => requestAnimationFrame(resolve));\n await new Promise((resolve) => requestAnimationFrame(resolve));\n await new Promise<void>((resolve) => {\n if (isScrolling.value) {\n const stop = watch(isScrolling, () => {\n stop();\n resolve();\n });\n } else {\n resolve();\n }\n });\n }\n\n async function onListKeydown(e: KeyboardEvent) {\n if (e.key === \"Tab\") {\n textFieldRef.value?.focus();\n return;\n }\n\n if (![\"PageDown\", \"PageUp\", \"Home\", \"End\"].includes(e.key)) {\n return;\n }\n const el: HTMLElement = listRef.value?.$el;\n if (!el) {\n return;\n }\n\n if (e.key === \"Home\" || e.key === \"End\") {\n el.scrollTo({\n top: e.key === \"Home\" ? 0 : el.scrollHeight,\n behavior: \"smooth\",\n });\n }\n\n await finishScrolling();\n\n const children = el.querySelectorAll(\n \":scope > :not(.ev-virtual-scroll--spacer)\",\n );\n\n if (e.key === \"PageDown\" || e.key === \"Home\") {\n const top = el.getBoundingClientRect().top;\n for (const child of children) {\n if (child.getBoundingClientRect().top >= top) {\n (child as HTMLElement).focus();\n break;\n }\n }\n } else {\n const bottom = el.getBoundingClientRect().bottom;\n for (const child of [...children].reverse()) {\n if (child.getBoundingClientRect().bottom <= bottom) {\n (child as HTMLElement).focus();\n break;\n }\n }\n }\n }\n\n return {\n onListScroll,\n onListKeydown,\n };\n}\n","import { onBeforeUnmount, readonly, ref, watch } from \"vue\";\nimport type { DeepReadonly, Ref } from \"vue\";\nimport { Browser, refElement } from \"../util\";\n\ninterface ResizeState {\n resizeRef: Ref<HTMLElement | undefined>;\n contentRect: DeepReadonly<Ref<DOMRectReadOnly | undefined>>;\n}\n\n/**\n * # Resize Observer\n * @param callback\n * @param box\n */\nexport function useResizeObserver(\n callback?: ResizeObserverCallback,\n box: \"content\" | \"border\" = \"content\",\n): ResizeState {\n const resizeRef = ref<HTMLElement>();\n const contentRect = ref<DOMRectReadOnly>();\n\n if (Browser.hasWindow) {\n const observer = new ResizeObserver(\n (entries: ResizeObserverEntry[]) => {\n callback?.(entries, observer);\n if (!entries.length) {\n return;\n }\n if (box === \"content\") {\n contentRect.value = entries[0].contentRect;\n } else {\n contentRect.value =\n entries[0].target.getBoundingClientRect();\n }\n },\n );\n\n onBeforeUnmount(() => {\n observer.disconnect();\n });\n\n watch(\n resizeRef,\n (newValue, oldValue) => {\n if (oldValue) {\n observer.unobserve(refElement(oldValue));\n contentRect.value = undefined;\n }\n\n if (newValue) {\n observer.observe(refElement(newValue));\n }\n },\n {\n flush: \"post\",\n },\n );\n }\n\n return {\n resizeRef,\n contentRect: readonly(contentRect),\n };\n}\n","import { clamp, createRange, propsFactory } from \"../util\";\nimport {\n computed,\n ComputedRef,\n ref,\n Ref,\n shallowRef,\n watch,\n watchEffect,\n} from \"vue\";\nimport { useResizeObserver } from \"./resizeObserver.ts\";\nimport { useDisplay } from \"./display.ts\";\n\nconst UP = -1;\nconst DOWN = 1;\n\ntype VirtualProps = {\n itemHeight?: number | string;\n};\n\nexport interface VirtualItem {\n raw: any;\n index: number;\n}\n\n/**\n * # Make Virtual Props\n */\nexport const makeVirtualProps = propsFactory(\n {\n itemHeight: {\n type: [Number, String],\n default: 48,\n },\n },\n \"virtual\",\n);\n\n/**\n * # Use Virtual\n * @param props\n * @param items\n * @param offset\n */\nexport function useVirtual<T>(\n props: VirtualProps,\n items: Ref<readonly T[]>,\n offset?: Ref<number>,\n) {\n const first = shallowRef(0);\n const baseItemHeight = shallowRef(props.itemHeight);\n const itemHeight = computed({\n get: () => parseInt((baseItemHeight.value ?? 0) as string, 10),\n set(val) {\n baseItemHeight.value = val;\n },\n });\n const containerRef = ref<HTMLElement>();\n const { resizeRef, contentRect } = useResizeObserver();\n watchEffect(() => {\n resizeRef.value = containerRef.value;\n });\n const display = useDisplay();\n\n const sizeMap = new Map<any, number>();\n let sizes = Array.from<number | null>({ length: items.value.length });\n const visibleItems = computed(() => {\n const availableHeight =\n !contentRect.value ||\n containerRef.value === document.documentElement\n ? display.height.value\n : contentRect.value.height;\n const height = availableHeight - (offset?.value ?? 0);\n return Math.ceil((height / itemHeight.value) * 1.7 + 1);\n });\n\n function handleItemResize(index: number, height: number) {\n itemHeight.value = Math.max(itemHeight.value, height);\n sizes[index] = height;\n sizeMap.set(items.value[index], height);\n }\n\n function calculateOffset(index: number) {\n return sizes.slice(0, index).reduce((acc, val) => {\n return acc! + (val || itemHeight.value);\n }, 0)!;\n }\n\n function calculateMidPointIndex(scrollTop: number) {\n const end = items.value.length;\n let middle = 0;\n let middleOffset = 0;\n while (middleOffset < scrollTop && middle < end) {\n middleOffset += sizes[middle++] || itemHeight.value;\n }\n return middle - 1;\n }\n\n let lastScrollTop = 0;\n function handleScroll() {\n if (!containerRef.value || !contentRect.value) {\n return;\n }\n\n const height = contentRect.value.height - 56;\n const scrollTop = containerRef.value.scrollTop;\n const direction = scrollTop < lastScrollTop ? UP : DOWN;\n\n const midPointIndex = calculateMidPointIndex(scrollTop + height / 2);\n const buffer = Math.round(visibleItems.value / 3);\n const firstIndex = midPointIndex - buffer;\n const lastIndex = first.value + buffer * 2 - 1;\n if (direction === UP && midPointIndex <= lastIndex) {\n first.value = clamp(firstIndex, 0, items.value.length);\n } else if (direction === DOWN && midPointIndex >= lastIndex) {\n first.value = clamp(\n firstIndex,\n 0,\n items.value.length - visibleItems.value,\n );\n }\n\n lastScrollTop = scrollTop;\n }\n\n function scrollToIndex(index: number) {\n if (!containerRef.value) {\n return;\n }\n containerRef.value.scrollTop = calculateOffset(index);\n }\n\n const last = computed(() => {\n return Math.min(items.value.length, first.value + visibleItems.value);\n });\n\n const computedItems: ComputedRef<VirtualItem[]> = computed(() => {\n return items.value\n .slice(first.value, last.value)\n .map((item, index) => ({\n raw: item,\n index: index + first.value,\n }));\n });\n\n const paddingTop = computed(() => {\n return calculateOffset(first.value);\n });\n\n const paddingBottom = computed(() => {\n return (\n calculateOffset(items.value.length) - calculateOffset(last.value)\n );\n });\n\n watch(\n () => items.value.length,\n () => {\n sizes = createRange(items.value.length).map(() => itemHeight.value);\n sizeMap.forEach((height, item) => {\n const index = items.value.indexOf(item);\n if (index === -1) {\n sizeMap.delete(item);\n } else {\n sizes[index] = height;\n }\n });\n },\n );\n\n return {\n containerRef,\n computedItems,\n itemHeight,\n paddingTop,\n paddingBottom,\n scrollToIndex,\n handleScroll,\n handleItemResize,\n };\n}\n","import { propsFactory } from \"@/util\";\nimport { PropType } from \"vue\";\nimport { makeDimensionsProps } from \"@/composables/dimensions.ts\";\nimport { makeComponentProps } from \"@/composables/component.ts\";\nimport { makeVirtualProps } from \"@/composables/virtual.ts\";\n\nexport interface EvVirtualScrollSlot<T> {\n item: T;\n index: number;\n}\n\n/**\n * # Make EvVirtualScroll Props\n */\nexport const makeEvVirtualScrollProps = propsFactory(\n {\n items: {\n type: Array as PropType<readonly unknown[]>,\n default: () => [],\n },\n renderless: Boolean,\n\n ...makeVirtualProps(),\n ...makeComponentProps(),\n ...makeDimensionsProps(),\n },\n \"EvVirtualScroll\",\n);\n\n/**\n * # Make EvVirtualScrollItem Props\n */\nexport const makeEvVirtualScrollItemProps = propsFactory(\n {\n renderless: Boolean,\n ...makeComponentProps(),\n },\n \"EvVirtualScrollItem\",\n);\n","<script setup lang=\"ts\">\nimport { Ref, toRef, useAttrs, watch } from \"vue\";\nimport { useResizeObserver } from \"../../composables/resizeObserver.ts\";\nimport { makeEvVirtualScrollItemProps } from \"./EvVirtualScroll.ts\";\n\ndefineOptions({\n inheritAttrs: false,\n});\n\ndefineSlots<{\n default(props: { itemRef: Ref<HTMLElement | undefined> }): any;\n}>();\n\nconst props = defineProps({\n ...makeEvVirtualScrollItemProps(),\n});\n\nconst emit = defineEmits([\"update:height\"]);\nconst attrs = useAttrs();\n\nconst { resizeRef, contentRect } = useResizeObserver(undefined, \"border\");\n\nwatch(\n () => contentRect.value?.height,\n (height) => {\n if (height != null) {\n emit(\"update:height\", height);\n }\n },\n);\n</script>\n\n<template>\n <template v-if=\"props.renderless\">\n <slot name=\"default\" v-bind=\"{ itemRef: toRef(resizeRef) }\" />\n </template>\n <div\n v-else\n ref=\"resizeRef\"\n :class=\"['ev-virtual-scroll--item', props.class]\"\n :style=\"props.style\"\n v-bind=\"attrs\">\n <slot name=\"default\" v-bind=\"{ itemRef: toRef(resizeRef) }\" />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { makeEvVirtualScrollProps } from \"./EvVirtualScroll.ts\";\nimport { getCurrentComponent, getScrollParent, toWebUnit } from \"@/util\";\nimport { useDimensions } from \"@/composables/dimensions.ts\";\nimport { onMounted, onScopeDispose, Ref, toRef } from \"vue\";\nimport { useVirtual } from \"@/composables/virtual.ts\";\nimport { useToggleScope } from \"@/composables/toggleScope.ts\";\nimport EvVirtualScrollItem from \"./EvVirtualScrollItem.vue\";\n\nconst props = defineProps({\n ...makeEvVirtualScrollProps(),\n});\nconst component = getCurrentComponent(\"EvVirtualScroll\");\nconst dimensionStyles = useDimensions(props);\nconst {\n containerRef,\n handleScroll,\n handleItemResize,\n scrollToIndex,\n paddingTop,\n paddingBottom,\n computedItems,\n} = useVirtual(props, toRef(props, \"items\"));\n\nuseToggleScope(\n () => props.renderless,\n () => {\n onMounted(() => {\n containerRef.value = getScrollParent(\n component.vnode.el as HTMLElement,\n true,\n );\n containerRef.value?.addEventListener(\"scroll\", handleScroll);\n });\n\n onScopeDispose(() => {\n containerRef.value?.removeEventListener(\"scroll\", handleScroll);\n });\n },\n);\n\ndefineExpose({\n scrollToIndex,\n});\n\ndefineSlots<{\n default(props: {\n item: any;\n index: number;\n itemRef: Ref<HTMLElement | undefined>;\n }): any;\n}>();\n</script>\n\n<template>\n <template v-if=\"props.renderless\">\n <div\n class=\"ev-virtual-scroll--spacer\"\n :style=\"{ paddingTop: toWebUnit(paddingTop) }\"></div>\n <ev-virtual-scroll-item\n v-for=\"item in computedItems\"\n :key=\"item.index\"\n :renderless=\"props.renderless\"\n @update:height=\"(height) => handleItemResize(item.index, height)\">\n <template #default=\"{ itemRef }\">\n <slot v-bind=\"{ item: item.raw, index: item.index, itemRef }\" />\n </template>\n </ev-virtual-scroll-item>\n <div\n class=\"ev-virtual-scroll--spacer\"\n :style=\"{ paddingBottom: toWebUnit(paddingBottom) }\"></div>\n </template>\n\n <div\n v-else\n ref=\"containerRef\"\n :class=\"['ev-virtual-scroll', props.class]\"\n :style=\"[dimensionStyles, props.style]\"\n @scroll=\"handleScroll\">\n <div\n class=\"ev-virtual-scroll--container\"\n :style=\"[\n {\n paddingTop: toWebUnit(paddingTop),\n paddingBottom: toWebUnit(paddingBottom),\n },\n ]\">\n <ev-virtual-scroll-item\n v-for=\"item in computedItems\"\n :key=\"item.index\"\n :renderless=\"props.renderless\"\n @update:height=\"\n (height) => handleItemResize(item.index, height)\n \">\n <template #default=\"{ itemRef }\">\n <slot\n name=\"default\"\n v-bind=\"{\n item: item.raw,\n index: item.index,\n itemRef,\n }\" />\n </template>\n </ev-virtual-scroll-item>\n </div>\n </div>\n</template>\n","import { Appearance, EventProp, propsFactory } from \"@/util\";\nimport { makeTagProps } from \"@/composables/tag.ts\";\nimport { makeComponentProps } from \"@/composables/component.ts\";\nimport { makeGroupItemProps } from \"@/composables/groupItem.ts\";\nimport { makeRoundedProps } from \"@/composables/rounded.ts\";\nimport { IconProp } from \"@/composables/icons.ts\";\nimport { CheckIcon } from \"@/icons\";\nimport { PropType } from \"vue\";\nimport { ButtonAppearanceProp, ButtonVariantProp } from \"@/components\";\n\nexport type EvTagSlots = {\n default: {\n isSelected: boolean | undefined;\n selectedClass: boolean | (string | undefined)[] | undefined;\n select: ((value: boolean) => void) | undefined;\n toggle: (() => void) | undefined;\n value: unknown;\n disabled: boolean;\n };\n prefix: never;\n suffix: never;\n filter: never;\n};\n\nexport const makeEvTagProps = propsFactory(\n {\n activeClass: String,\n appearance: {\n type: String as PropType<ButtonAppearanceProp>,\n default: Appearance.default,\n },\n avatarEnd: String,\n avatarStart: String,\n closable: Boolean,\n draggable: Boolean,\n filter: Boolean,\n iconEnd: IconProp,\n iconFilter: {\n type: IconProp,\n default: CheckIcon,\n },\n iconStart: IconProp,\n link: {\n type: Boolean,\n default: undefined,\n },\n modelValue: {\n type: Boolean,\n default: true,\n },\n text: String,\n\n variant: {\n type: String as PropType<ButtonVariantProp>,\n default: \"default\",\n },\n\n onClick: EventProp<[MouseEvent]>(),\n onClickOnce: EventProp<[MouseEvent]>(),\n\n ...makeGroupItemProps(),\n ...makeComponentProps(),\n ...makeRoundedProps(),\n ...makeTagProps({ tag: \"span\" }),\n },\n \"EvTag\",\n);\n","import {FunctionalComponent, h, Transition} from \"vue\";\n\n\n/**\n * # createJavaScriptTransition\n *\n * @param name\n * @param functions\n * @param mode\n *\n */\nexport function createJavaScriptTransition(\n name: string,\n functions: Record<string, any>,\n mode = 'in-out'\n): FunctionalComponent {\n\n return (props: any, {slots}) => {\n return h(\n Transition,\n {\n name: props.disabled ? '' : name,\n css: !props.disabled,\n ...(props.disabled ? {} : functions)\n },\n slots.default\n );\n };\n}","// Utilities\nimport { camelize } from 'vue'\n\ninterface HTMLExpandElement extends HTMLElement {\n _parent?: (Node & ParentNode & HTMLElement) | null;\n _initialStyle?: {\n transition: string,\n overflow: string,\n height?: string | null,\n width?: string | null\n };\n}\n\n/**\n * @param expandedParentClass\n * @param x\n */\nexport default function (expandedParentClass = '', x = false) {\n const sizeProperty = x ? 'width' : 'height' as 'width' | 'height';\n const offsetProperty = camelize(`offset-${sizeProperty}`) as 'offsetHeight' | 'offsetWidth';\n\n /**\n * ## onAfterLeave\n * @param el\n */\n function onAfterLeave(el: HTMLExpandElement) {\n if (expandedParentClass && el._parent) {\n el._parent.classList.remove(expandedParentClass);\n }\n resetStyles(el);\n }\n\n /**\n * ## resetStyles\n * @param el\n */\n function resetStyles(el: HTMLExpandElement) {\n const size = el._initialStyle![sizeProperty];\n el.style.overflow = el._initialStyle!.overflow;\n if (size != null) el.style[sizeProperty] = size;\n delete el._initialStyle;\n }\n\n return {\n\n /**\n * ## onBeforeEnter\n * @param el\n */\n onBeforeEnter(el: HTMLExpandElement) {\n el._parent = el.parentNode as (Node & ParentNode & HTMLElement) | null;\n el._initialStyle = {\n transition: el.style.transition,\n overflow: el.style.overflow,\n [sizeProperty]: el.style[sizeProperty]\n };\n },\n\n /**\n * ## onEnter\n * @param el\n */\n onEnter(el: HTMLExpandElement) {\n const initialStyle = el._initialStyle!;\n\n el.style.setProperty('transition', 'none', 'important');\n // Hide overflow to account for collapsed margins in the calculated height\n el.style.overflow = 'hidden';\n const offset = `${el[offsetProperty]}px`;\n\n el.style[sizeProperty] = '0';\n\n void el.offsetHeight; // force reflow\n el.style.transition = initialStyle.transition;\n\n if (expandedParentClass && el._parent) {\n el._parent.classList.add(expandedParentClass);\n }\n\n requestAnimationFrame(() => {\n el.style[sizeProperty] = offset;\n })\n },\n\n /**\n * ## onAfterEnter\n */\n onAfterEnter: resetStyles,\n\n /**\n * ## onEnterCancelled\n */\n onEnterCancelled: resetStyles,\n\n /**\n * ## onLeave\n * @param el\n */\n onLeave(el: HTMLExpandElement) {\n el._initialStyle = {\n transition: '',\n overflow: el.style.overflow,\n [sizeProperty]: el.style[sizeProperty]\n };\n\n el.style.overflow = 'hidden';\n el.style[sizeProperty] = `${el[offsetProperty]}px`;\n void el.offsetHeight; // force reflow\n\n requestAnimationFrame(() => (el.style[sizeProperty] = '0'));\n },\n\n /**\n * ## onAfterLeave\n */\n onAfterLeave,\n\n /**\n * ## onAfterLeave\n */\n onLeaveCancelled: onAfterLeave\n }\n}\n","// Javascript transitions\nimport {createJavaScriptTransition} from \"@/components/EvTransition/transitions/createTransition.ts\";\nimport ExpandTransitionGenerator from './expandTransition'\nimport {FunctionalComponent} from \"vue\";\n\nexport const EvTransitionExpand = createJavaScriptTransition('expand-transition', ExpandTransitionGenerator());\nexport const EvTransitionExpandX = createJavaScriptTransition('expand-x-transition', ExpandTransitionGenerator('', true));\n\n\nexport type EvTransitionExpand = FunctionalComponent<typeof EvTransitionExpand>;\nexport type EvTransitionExpandX = FunctionalComponent<typeof EvTransitionExpandX>;","<script setup lang=\"ts\">\nimport \"./EvTag.scss\";\nimport { EvTagSlots, makeEvTagProps } from \"./EvTag.ts\";\nimport { EvIcon } from \"@/components/EvIcon\";\nimport { EvDefaultsProvider } from \"@/components/EvDefaultsProvider\";\nimport { CancelIcon } from \"@/icons\";\nimport { useLocaleFunctions } from \"@/composables/locale.ts\";\nimport { useModelProxy } from \"@/composables/modelProxy.ts\";\nimport { computed, useAttrs } from \"vue\";\nimport { KeyboardEvent } from \"react\";\nimport {\n RouterLinkOrHrefProps,\n useRouterLinkOrHref,\n} from \"@/composables/router.ts\";\nimport { GroupItemProps, useGroupItem } from \"@/composables/groupItem.ts\";\nimport { EvAvatar, EvTagGroupSymbol } from \"@/components\";\nimport { EvTransitionExpandX } from \"@/components/EvTransition/transitions\";\nimport { useDefaults } from \"@/composables\";\nimport { AppearanceProps, useAppearance } from \"@/util\";\n\nconst definedProps = defineProps({\n ...makeEvTagProps(),\n});\nconst props = useDefaults(definedProps);\nconst slots = defineSlots<EvTagSlots>();\nconst attrs = useAttrs();\nconst link = useRouterLinkOrHref(props as RouterLinkOrHrefProps, attrs);\nconst { t } = useLocaleFunctions();\nconst emit = defineEmits([\n \"click\",\n \"click:close\",\n \"group:selected\",\n \"update:modelValue\",\n]);\nconst isActive = useModelProxy(props, \"modelValue\");\nconst group = useGroupItem(\n props as any as GroupItemProps,\n EvTagGroupSymbol,\n false,\n);\nconst isLink = computed(() => {\n return props.link !== false && link.isLink.value;\n});\nconst isClickable = computed(() => {\n return (\n !props.disabled &&\n props.link !== false &&\n (!!group || props.link || link.isClickable.value)\n );\n});\n\nconst closeLabel = computed(() => {\n return t(\"close\");\n});\n\nconst tag = computed(() => {\n return link.isLink.value ? \"a\" : props.tag;\n});\n\n/**\n * ## onClick\n * @param e\n */\nfunction onClick(e: MouseEvent) {\n emit(\"click\", e);\n if (!isClickable.value) {\n return;\n }\n link.navigate?.(e);\n group?.toggle();\n}\n\n/**\n * ## onClickClose\n * @param e\n */\nfunction onClickClose(e: MouseEvent) {\n e.stopPropagation();\n isActive.value = false;\n emit(\"click:close\", e);\n}\n\n/**\n * ## onKeyDown\n * @param e\n */\nfunction onKeyDown(e: KeyboardEvent) {\n if (isLink.value || !isClickable.value) {\n return;\n }\n e.preventDefault();\n onClick(e as any as MouseEvent);\n}\n\nconst hasFilter = computed(() => {\n return (slots.filter || props.filter) && group;\n});\n\nconst defaultSlotProps = computed(() => {\n return {\n isSelected: group?.isSelected.value,\n selectedClass: group?.selectedClass.value,\n selectedAppearance: group?.selectedAppearance.value,\n selectedVariant: group?.selectedVariant.value,\n select: group?.select,\n toggle: group?.toggle,\n value: group?.value.value,\n disabled: props.disabled,\n };\n});\n\nconst hasPrefixMedia = computed(() => !!(props.avatarStart || props.iconStart));\nconst hasSuffixMedia = computed(() => !!(props.avatarEnd || props.iconEnd));\nconst hasPrefix = computed(() => !!(hasPrefixMedia.value || slots.prefix));\nconst hasSuffix = computed(() => !!(hasSuffixMedia.value || slots.suffix));\n\nconst { appearanceClass, variantClass } = useAppearance(\n props as AppearanceProps,\n group,\n isActive,\n);\n</script>\n\n<template>\n <component\n :is=\"tag\"\n v-if=\"isActive\"\n :class=\"[\n 'ev-tag',\n {\n 'is-active': group?.isSelected.value,\n 'is-clickable': isClickable,\n 'is-disabled': props.disabled,\n 'is-filter': hasFilter,\n 'is-rounded': props.rounded,\n },\n group?.selectedClass.value,\n appearanceClass,\n variantClass,\n props.class,\n ]\"\n :style=\"[props.style]\"\n :disabled=\"props.disabled || undefined\"\n :draggable=\"props.draggable\"\n :href=\"link.href.value\"\n :tabindex=\"isClickable ? 0 : undefined\"\n @click=\"onClick\"\n @keydown.enter=\"onKeyDown\"\n @keydown.space=\"onKeyDown\">\n <template v-if=\"hasFilter\">\n <ev-transition-expand-x key=\"filter\">\n <div\n v-show=\"group?.isSelected.value\"\n key=\"filter\"\n class=\"ev-tag--filter\">\n <template v-if=\"!slots.filter\">\n <ev-icon key=\"filter-icon\" :glyph=\"props.iconFilter\" />\n </template>\n <template v-else>\n <ev-defaults-provider\n key=\"filter-defaults\"\n :disabled=\"!props.iconFilter\"\n :defaults=\"{ EvIcon: { glyph: props.iconFilter } }\">\n <slot name=\"filter\" />\n </ev-defaults-provider>\n </template>\n </div>\n </ev-transition-expand-x>\n </template>\n\n <div v-if=\"hasPrefix\" key=\"prefix\" class=\"ev-tag--prefix\">\n <template v-if=\"!slots.prefix\">\n <ev-icon\n v-if=\"props.iconStart\"\n key=\"prefix-icon\"\n :glyph=\"props.iconStart\" />\n <ev-avatar\n v-if=\"props.avatarStart\"\n key=\"prefix-avatar\"\n :image=\"props.avatarStart\" />\n </template>\n <template v-else>\n <ev-defaults-provider\n key=\"prefix-defaults\"\n :disabled=\"!hasPrefixMedia\"\n :defaults=\"{\n EvAvatar: { image: props.avatarStart },\n EvIcon: { glyph: props.iconStart },\n }\">\n <slot name=\"prefix\" />\n </ev-defaults-provider>\n </template>\n </div>\n\n <div class=\"ev-tag--content\" data-no-activator=\"\">\n <slot name=\"default\" v-bind=\"defaultSlotProps\">{{\n props.text\n }}</slot>\n </div>\n\n <div v-if=\"hasSuffix\" key=\"suffix\" class=\"ev-tag--suffix\">\n <template v-if=\"!slots.suffix\">\n <ev-icon\n v-if=\"props.iconEnd\"\n key=\"prefix-icon\"\n :glyph=\"props.iconEnd\" />\n <ev-avatar\n v-if=\"props.avatarEnd\"\n key=\"suffix-avatar\"\n :image=\"props.avatarEnd\" />\n </template>\n <template v-else>\n <ev-defaults-provider\n key=\"suffix-defaults\"\n :disabled=\"!hasSuffixMedia\"\n :defaults=\"{\n EvAvatar: { image: props.avatarEnd },\n EvIcon: { glyph: props.iconEnd },\n }\">\n <slot name=\"suffix\" />\n </ev-defaults-provider>\n </template>\n </div>\n\n <button\n v-if=\"props.closable\"\n key=\"close\"\n class=\"ev-tag--close\"\n :aria-label=\"closeLabel\"\n @click=\"onClickClose\">\n <ev-icon :glyph=\"CancelIcon\" size=\"small\" />\n </button>\n </component>\n</template>\n","<script setup lang=\"ts\">\n/**\n * # EvSelect\n *\n */\nimport \"./EvSelect.scss\";\nimport { makeEvSelectProps } from \"./EvSelect.ts\";\nimport { useScrolling } from \"./useScrolling.ts\";\nimport { EvTextfield } from \"@/components/EvTextfield\";\nimport { EvMenu } from \"@/components/EvMenu\";\nimport { EvList, ListItem } from \"@/components/EvList\";\nimport { EvListItem } from \"@/components/EvListItem\";\nimport { EvVirtualScroll } from \"@/components/EvVirtualScroll\";\nimport { EvSurface } from \"@/components/EvSurface\";\nimport { EvTag } from \"@/components/EvTag\";\nimport { transformItem, useItems } from \"@/composables/lists\";\nimport { useModelProxy } from \"@/composables/modelProxy.ts\";\nimport { useLocaleFunctions } from \"@/composables/locale.ts\";\nimport { useForm } from \"@/composables/form.ts\";\nimport {\n computed,\n mergeProps,\n nextTick,\n Ref,\n ref,\n shallowRef,\n useSlots,\n watch,\n} from \"vue\";\nimport {\n Browser,\n filterComponentProps,\n isComposingIgnoreKey,\n KeyLogger,\n matchesSelector,\n wrapInArray,\n} from \"@/util\";\nimport { FocusEvent, MouseEvent } from \"react\";\nimport { useFilter } from \"@/composables/filter.ts\";\n\n// Props\nconst props = defineProps({\n ...makeEvSelectProps(),\n});\n\ndefineSlots<{\n label(): any;\n \"list-prefix\"(): any;\n \"list-suffix\"(): any;\n item(props: { item: any; index: number; props: any }): any;\n \"items-empty\"(): any;\n \"items-prefix\"(): any;\n \"items-suffix\"(): any;\n placeholder(): any;\n prefix(): any;\n selection(item: any, index: number): any;\n suffix(): any;\n}>();\n\nconst emit = defineEmits([\n \"update:focused\",\n \"update:menuOpen\",\n \"update:modelValue\",\n \"update:search\",\n]);\n\nconst slots = useSlots();\n\n// TextField\nconst evTextfieldRef = ref();\nconst evTextfieldProps = computed(() => {\n return filterComponentProps(EvTextfield, props);\n});\nconst isFocused = shallowRef(false);\nconst isPristine = shallowRef(true);\nconst isSearchable = computed(() => props.behavior !== \"select\");\nconst listHasFocus = shallowRef(false);\nconst isSelecting = shallowRef(false);\n\n// Menu\nconst evMenuRef = ref<typeof EvMenu>();\nconst menuOpenProxy = useModelProxy(props, \"menuOpen\");\nconst isMenuOpen = computed({\n get: () => menuOpenProxy.value,\n set: (value) => {\n if (menuOpenProxy.value && !value && evMenuRef.value?.openChildren) {\n return;\n }\n menuOpenProxy.value = value;\n },\n});\nconst isMenuDisabled = computed(() => {\n return (props.hideItemsEmpty && !items.value.length) || !!props.readonly;\n});\n\n// List\nconst evListRef = ref<typeof EvList>();\nconst evVirtualScrollRef = ref<typeof EvVirtualScroll>();\nconst { items, transformIn, transformOut } = useItems(props);\nconst search = useModelProxy(props, \"search\", \"\");\n// @todo: implement getMatches\nconst { filteredItems } = useFilter(props, items, () =>\n isPristine.value || !isSearchable.value ? \"\" : search.value,\n);\nconst displayItems = computed(() => {\n if (props.hideSelected) {\n return filteredItems.value.filter(\n (filteredItem) =>\n !model.value.some(\n (s: ListItem) => s.value === filteredItem.value,\n ),\n );\n }\n return filteredItems.value;\n});\n\nconst model = useModelProxy(\n props,\n \"modelValue\",\n [],\n (value) => transformIn(value === null ? [null] : wrapInArray(value)),\n (value) => {\n const transformed = transformOut(value);\n return props.multiple ? transformed : transformed[0] ?? null;\n },\n);\nconst selections = computed(() => {\n return model.value.map((value: any) => {\n return (\n items.value.find((item) => {\n return props.valueComparator(item.value, value.value);\n }) || value\n );\n });\n});\nconst selectionIndex = shallowRef(-1);\nconst selected = computed(() => {\n return selections.value.map((selection: any) => selection.props.value);\n});\nconst keyLogger = new KeyLogger();\n\nconst highlightFirst = computed(() => {\n const selectFirst =\n props.autoSelectFirst === true ||\n (props.autoSelectFirst === \"exact\" &&\n search.value === displayItems.value[0]?.title);\n return (\n selectFirst &&\n displayItems.value.length > 0 &&\n !isPristine.value &&\n !listHasFocus.value\n );\n});\n\nconst form = useForm();\nconst { t } = useLocaleFunctions();\n\n/**\n * ## On Menu After Leave\n * Maintain focus on the EvSelect when leaving the menu - usually when tabbing out.\n */\nfunction onMenuAfterLeave() {\n if (isFocused.value) {\n isPristine.value = true;\n evTextfieldRef.value?.focus();\n }\n}\n\n/**\n * ## On List Focus In\n * Maintain focus on the select when a menu item is selected.\n * @param e\n */\nfunction onListFocusIn(e: FocusEvent) {\n setTimeout(() => {\n isFocused.value = true;\n listHasFocus.value = true;\n });\n}\n\n/**\n * ## onListFocusOut\n *\n * @param e\n */\nfunction onListFocusOut(e: FocusEvent) {\n listHasFocus.value = false;\n}\n\n/**\n * ## One List Mousedown\n * @param e\n */\nfunction onListMouseDown(e: MouseEvent) {\n e.preventDefault();\n}\n\nconst { onListScroll, onListKeydown } = useScrolling(evListRef, evTextfieldRef);\n\n/**\n * ## On Field Blur\n * @param e\n */\nfunction onFieldBlur(e: FocusEvent) {\n if (!evListRef.value?.$el.contains(e.relatedTarget as HTMLElement)) {\n isMenuOpen.value = false;\n }\n selectionIndex.value = -1;\n}\n\n/**\n * ## onFieldChange\n * If the field changed due to an autofill utility attempt to select an item.\n * @param e\n */\nfunction onFieldChange(e: Event) {\n if (\n matchesSelector(evTextfieldRef.value, \":autofill\") ||\n matchesSelector(evTextfieldRef.value, \":-webkit-autofill\")\n ) {\n const item = items.value.find(\n (item) => item.title === (e.target as HTMLInputElement).value,\n );\n if (item) {\n select(item);\n }\n }\n}\n\n/**\n * ## On Field Clear\n * When the user clicks on the `clearable` icon.\n * @param e\n */\nfunction onFieldClear(e: MouseEvent) {\n if (props.openOnClear) {\n isMenuOpen.value = true;\n }\n search.value = \"\";\n}\n\n/**\n * ## On Field Input\n * @param e\n */\nfunction onFieldInput(e: InputEvent) {\n search.value = (e.target as HTMLInputElement).value;\n}\n\n/**\n * ## On Field Keydown\n * @param e\n */\nfunction onFieldKeydown(e: KeyboardEvent) {\n if (\n !e.key ||\n isComposingIgnoreKey(e) ||\n props.readonly ||\n form?.isReadonly.value\n ) {\n return;\n }\n\n const preventKeys = [\"Enter\", \"ArrowDown\", \"ArrowUp\"];\n const openerKeys = [\"Enter\", \"ArrowDown\"];\n const escapeKeys = [\"Escape\"];\n if (!isSearchable.value) {\n preventKeys.push(\" \", \"Home\", \"End\");\n openerKeys.push(\" \");\n escapeKeys.push(\"Tab\");\n }\n\n if (selectionIndex.value > -1 || preventKeys.includes(e.key)) {\n e.preventDefault();\n }\n\n if (openerKeys.includes(e.key)) {\n isMenuOpen.value = true;\n }\n\n if (escapeKeys.includes(e.key)) {\n isMenuOpen.value = false;\n }\n\n if (!isSearchable.value) {\n // Use `keyLogger`\n keydownBehaviorSelect(e);\n return;\n }\n\n if ([\"Enter\", \"Tab\"].includes(e.key)) {\n if (highlightFirst.value) {\n select(displayItems.value[0]);\n } else if (!props.multiple && props.behavior === \"combobox\") {\n select(transformItem(props as any, search.value));\n }\n }\n\n if (e.key === \"ArrowDown\" && highlightFirst.value) {\n evListRef.value?.focus(\"next\");\n }\n\n if (!props.multiple) {\n return;\n }\n\n const selectionStart = evTextfieldRef.value.selectionStart;\n const length = model.value.length;\n\n // Backspacing\n if ([\"Backspace\", \"Delete\"].includes(e.key)) {\n if (selectionIndex.value < 0) {\n if (e.key === \"Backspace\" && !search.value) {\n selectionIndex.value = length - 1;\n }\n return;\n }\n const originalSelectionIndex = selectionIndex.value;\n const selectedItem = model.value[selectionIndex.value];\n if (selectedItem && !selectedItem.props.disabled) {\n select(selectedItem, false);\n }\n selectionIndex.value =\n originalSelectionIndex >= length - 1\n ? length - 2\n : originalSelectionIndex;\n }\n\n // Left\n if (e.key === \"ArrowLeft\") {\n if (selectionIndex.value < 0 && selectionStart > 0) {\n return;\n }\n const previous =\n selectionIndex.value > -1 ? selectionIndex.value - 1 : length - 1;\n if (model.value[previous]) {\n selectionIndex.value = previous;\n } else {\n selectionIndex.value = -1;\n evTextfieldRef.value?.input.setSelectionRange(\n search.value?.length,\n search.value?.length,\n );\n }\n }\n\n // Right\n if (e.key === \"ArrowRight\") {\n if (selectionIndex.value < 0) {\n return;\n }\n const next = selectionIndex.value + 1;\n if (model.value[next]) {\n selectionIndex.value = next;\n } else {\n selectionIndex.value = -1;\n evTextfieldRef.value?.input.setSelectionRange(0, 0);\n }\n }\n\n if (props.behavior !== \"combobox\") {\n return;\n }\n\n // Enter or delimiters\n if (\n (props.delimiters.includes(e.key) || e.key === \"Enter\") &&\n search.value\n ) {\n e.preventDefault();\n select(transformItem(props as any, search.value));\n search.value = \"\";\n }\n}\n\n/**\n * ## keydownBehaviorSelect\n * Handles keydown events for the select control when the input field\n * cannot be entered. Instead, we use `keyLogger` to track key events\n * and then select the first available item in the list.\n * @param e\n */\nfunction keydownBehaviorSelect(e: KeyboardEvent) {\n if (e.key === \"Home\") {\n evListRef.value?.focus(\"first\");\n } else if (e.key === \"End\") {\n evListRef.value?.focus(\"last\");\n }\n\n if (props.multiple || !keyLogger.log(e)) {\n return;\n }\n\n const itemIndex = items.value.findIndex((item) =>\n item.title.toLowerCase().startsWith(keyLogger.value),\n );\n if (itemIndex >= 0) {\n model.value = [items.value[itemIndex]];\n if (isMenuOpen.value) {\n const scrollIndex = itemIndex > 0 ? itemIndex - 1 : 0;\n evVirtualScrollRef.value?.scrollToIndex(scrollIndex);\n }\n }\n}\n\n/**\n * On Field Mousedown\n */\nfunction onFieldMousedown() {\n if (isMenuDisabled.value) {\n return;\n }\n isMenuOpen.value = !isMenuOpen.value;\n}\n\n/**\n * ## Select\n * @param item\n * @param set `null` means toggle\n */\nfunction select(item: ListItem, set: boolean | null = true) {\n if (item.props.disabled) {\n return;\n }\n\n if (props.multiple) {\n const index = model.value.findIndex((selection: any) => {\n return props.valueComparator(selection.value, item.value);\n });\n const add = set == null ? !~index : set;\n\n if (~index) {\n const value = add ? [...model.value, item] : [...model.value];\n value.splice(index, 1);\n model.value = value;\n } else if (add) {\n model.value = [...model.value, item];\n }\n search.value = \"\";\n } else {\n const add = set !== false;\n model.value = add ? [item] : [];\n search.value = item.title;\n\n nextTick(() => {\n isMenuOpen.value = false;\n isPristine.value = true;\n isSelecting.value = false;\n evTextfieldRef.value.input.blur();\n isFocused.value = false;\n });\n }\n\n selectionIndex.value = -1;\n}\n\n/**\n *\n */\nconst fieldValue = computed(() => {\n if (isSearchable.value) {\n return search.value;\n }\n return model.value.map((value: any) => value.props.value).join(\", \");\n});\n\n/**\n * ## onModelValueUpdate\n * When the model value is updated from the textfield.\n * @param value\n */\nfunction onModelValueUpdate(value: any) {\n if (value === null || (value === \"\" && !props.multiple)) {\n model.value = [];\n }\n}\n\n/**\n * @param item\n * @param index\n * @param itemRef\n */\nfunction itemProps(\n item: ListItem,\n index: number,\n itemRef: Ref<HTMLElement | undefined>,\n) {\n return mergeProps(item.props, {\n ref: itemRef,\n key: index,\n onClick: () => select(item),\n });\n}\n\n/**\n * ## createTagProps\n * @param item\n */\nfunction createTagProps(item: ListItem) {\n return {\n \"onClick:close\"(e: Event) {\n e.stopPropagation();\n e.preventDefault();\n select(item, false);\n },\n onKeydown(e: KeyboardEvent) {\n if (e.key !== \"Enter\" && e.key !== \" \") {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n select(item, false);\n },\n onMousedown(e: MouseEvent) {\n e.preventDefault();\n e.stopPropagation();\n },\n };\n}\n\n/**\n * Watch Search\n */\nwatch(search, (value, oldValue) => {\n if (!isFocused.value || isSelecting.value) {\n return;\n }\n if (value) {\n isMenuOpen.value = true;\n }\n isPristine.value = !value;\n});\n\n/**\n * Watch Focused\n */\nwatch(isFocused, (value, oldValue) => {\n if (value === oldValue) {\n return;\n }\n emit(\"update:focused\", value);\n});\n\n/**\n * Scroll to the last selected item when the menu opens.\n */\nwatch(isMenuOpen, () => {\n if (\n props.hideSelected ||\n !isMenuOpen.value ||\n !model.value.length ||\n !Browser.hasWindow\n ) {\n return;\n }\n const lastSelectedItem = model.value[model.value.length - 1];\n const index = displayItems.value.findIndex(\n (item) => item.value === lastSelectedItem.value,\n );\n window.requestAnimationFrame(() => {\n index >= 0 && evVirtualScrollRef.value?.scrollToIndex(index);\n });\n});\n\nconst validationValue = computed(() => model.externalValue);\nconst isPlaceholder = computed(\n () => !selections.value.length && !!slots.placeholder,\n);\n</script>\n\n<template>\n <ev-textfield\n ref=\"evTextfieldRef\"\n v-bind=\"evTextfieldProps\"\n v-model:focused=\"isFocused\"\n :class=\"[\n 'ev-select',\n {\n 'is-single': !props.multiple,\n 'is-multiple': props.multiple,\n 'is-searchable': isSearchable,\n 'is-selecting': selectionIndex > -1,\n 'is-placeholder': isPlaceholder,\n },\n ]\"\n :model-value=\"fieldValue\"\n :readonly=\"!isSearchable || props.readonly\"\n :placeholder=\"model.length ? undefined : props.placeholder\"\n :validation-value=\"validationValue\"\n @blur=\"onFieldBlur\"\n @change=\"onFieldChange\"\n @click:clear=\"onFieldClear\"\n @input=\"onFieldInput\"\n @keydown=\"onFieldKeydown\"\n @mousedown:control=\"onFieldMousedown\"\n @update:model-value=\"onModelValueUpdate\">\n <template v-if=\"props.label || slots.label\" #label>\n <slot name=\"label\">{{ props.label }}</slot>\n </template>\n <template v-if=\"slots.prefix\" #prefix>\n <slot name=\"prefix\" />\n </template>\n <template #default>\n <div\n v-for=\"(item, index) in selections\"\n :key=\"item.key\"\n :class=\"[\n 'ev-select--selected',\n {\n 'is-selected': index === selectionIndex,\n },\n ]\">\n <slot name=\"selection\" v-bind=\"{ item, index }\">\n <ev-tag\n v-if=\"props.tags\"\n :closable=\"props.multiple\"\n v-bind=\"createTagProps(item)\"\n :text=\"item.title\" />\n <span v-else class=\"ev-select--selected-text\">\n {{ item.title }}\n <span\n v-if=\"props.multiple && index < selections.length - 1\"\n class=\"ev-select--selected-comma\">,</span>\n </span>\n </slot>\n </div>\n\n <div v-if=\"isPlaceholder\" class=\"ev-select--placeholder\">\n <slot name=\"placeholder\" />\n </div>\n\n <ev-menu\n ref=\"evMenuRef\"\n v-model=\"isMenuOpen\"\n class=\"ev-select--menu\"\n max-height=\"310\"\n :disabled=\"isMenuDisabled\"\n activator=\"parent\"\n :close-on-content-click=\"false\"\n :open-on-click=\"false\"\n @after-leave=\"onMenuAfterLeave\">\n <ev-surface elevation=\"overlay\" scrollable>\n <div\n v-if=\"slots['list-prefix']\"\n class=\"ev-select--list-prefix\">\n <slot name=\"list-prefix\" />\n </div>\n\n <ev-list\n ref=\"evListRef\"\n class=\"ev-select--list\"\n :selected=\"selected\"\n :select-strategy=\"\n props.multiple ? 'multi-any' : 'single-any'\n \"\n tabindex=\"-1\"\n @focusin=\"onListFocusIn\"\n @focusout=\"onListFocusOut\"\n @keydown=\"onListKeydown\"\n @mousedown=\"onListMouseDown\"\n @scroll.passive=\"onListScroll\">\n <slot name=\"items-prefix\" />\n\n <slot\n v-if=\"!displayItems.length && !props.hideItemsEmpty\"\n name=\"items-empty\">\n <ev-list-item\n :title=\"t(props.itemsEmptyText)\"></ev-list-item>\n </slot>\n\n <ev-virtual-scroll\n ref=\"evVirtualScrollRef\"\n renderless\n :items=\"displayItems\">\n <template #default=\"{ item, index, itemRef }\">\n <slot\n name=\"item\"\n v-bind=\"{\n item,\n index,\n props: itemProps(item, index, itemRef),\n }\">\n <ev-list-item\n :ref=\"itemRef\"\n v-bind=\"item.props\"\n :key=\"index\"\n @click=\"\n select(item as ListItem, null)\n \" />\n </slot>\n </template>\n </ev-virtual-scroll>\n\n <slot name=\"items-suffix\" />\n </ev-list>\n\n <div\n v-if=\"slots['list-suffix']\"\n class=\"ev-select--list-suffix\">\n <slot name=\"list-suffix\" />\n </div>\n </ev-surface>\n </ev-menu>\n </template>\n\n <template v-if=\"slots.suffix\" #suffix>\n <slot name=\"suffix\" />\n </template>\n </ev-textfield>\n</template>\n","import { InjectionKey, PropType } from \"vue\";\nimport { GroupProvide, makeGroupProps } from \"@/composables/group.ts\";\nimport { propsFactory } from \"@/util\";\nimport { makeComponentProps } from \"@/composables/component.ts\";\nimport { makeTagProps } from \"@/composables/tag.ts\";\nimport { IconProp } from \"@/composables/icons.ts\";\nimport { VisibilityRuleProp } from \"@/composables/display.ts\";\n\nexport const EvSlideGroupSymbol: InjectionKey<GroupProvide> =\n Symbol.for(\"ev:slide-group\");\n\nexport interface SlideGroupSlot {\n next: GroupProvide[\"next\"];\n previous: GroupProvide[\"previous\"];\n select: GroupProvide[\"select\"];\n isSelected: GroupProvide[\"isSelected\"];\n}\n\nexport type EvSlideGroupSlot = {\n default: SlideGroupSlot;\n previous: SlideGroupSlot;\n next: SlideGroupSlot;\n};\n\nexport const makeEvSlideGroupProps = propsFactory(\n {\n arrowsAlign: {\n type: String as PropType<\"start\" | \"end\" | \"around\">,\n default: \"around\",\n },\n arrowsHidden: [Boolean, String, Array] as PropType<VisibilityRuleProp>,\n centerActive: Boolean,\n direction: {\n type: String as PropType<\"horizontal\" | \"vertical\">,\n default: \"horizontal\",\n },\n iconNext: IconProp,\n iconPrevious: IconProp,\n symbol: {\n type: null,\n default: EvSlideGroupSymbol,\n },\n\n ...makeComponentProps(),\n ...makeTagProps(),\n ...makeGroupProps({\n selectedClass: \"is-active\",\n }),\n },\n \"EvSlideGroup\",\n);\n","/**\n * # bias\n *\n * @param val\n */\nexport function bias(val: number) {\n const c = 0.501;\n const x = Math.abs(val);\n return Math.sign(val) * (x / ((1 / c - 2) * (1 - x) + 1));\n}\n\n/**\n * # calculateUpdatedOffset\n *\n * @param selectedElement\n * @param containerSize\n * @param contentSize\n * @param isRtl\n * @param currentScrollOffset\n * @param isHorizontal\n */\nexport function calculateUpdatedOffset({\n selectedElement,\n containerSize,\n contentSize,\n isRtl,\n currentScrollOffset,\n isHorizontal,\n}: {\n selectedElement: HTMLElement;\n containerSize: number;\n contentSize: number;\n isRtl: boolean;\n currentScrollOffset: number;\n isHorizontal: boolean;\n}): number {\n const clientSize = isHorizontal\n ? selectedElement.clientWidth\n : selectedElement.clientHeight;\n const offsetStart = isHorizontal\n ? selectedElement.offsetLeft\n : selectedElement.offsetTop;\n const adjustedOffsetStart =\n isRtl && isHorizontal\n ? contentSize - offsetStart - clientSize\n : offsetStart;\n\n const totalSize = containerSize + currentScrollOffset;\n const itemOffset = clientSize + adjustedOffsetStart;\n const additionalOffset = clientSize * 0.4; // @todo: why 0.4?\n\n if (adjustedOffsetStart <= currentScrollOffset) {\n currentScrollOffset = Math.max(\n adjustedOffsetStart - additionalOffset,\n 0,\n );\n } else if (totalSize <= itemOffset) {\n currentScrollOffset = Math.min(\n currentScrollOffset - (totalSize - itemOffset - additionalOffset),\n contentSize - containerSize,\n );\n }\n\n return currentScrollOffset;\n}\n\n/**\n * # calculateCenteredOffset\n *\n * @param selectedElement\n * @param containerSize\n * @param contentSize\n * @param isRtl\n * @param isHorizontal\n */\nexport function calculateCenteredOffset({\n selectedElement,\n containerSize,\n contentSize,\n isRtl,\n isHorizontal,\n}: {\n selectedElement: HTMLElement;\n containerSize: number;\n contentSize: number;\n isRtl: boolean;\n isHorizontal: boolean;\n}): number {\n const clientSize = isHorizontal\n ? selectedElement.clientWidth\n : selectedElement.clientHeight;\n const offsetStart = isHorizontal\n ? selectedElement.offsetLeft\n : selectedElement.offsetTop;\n\n const offsetCentered =\n isRtl && isHorizontal\n ? contentSize - offsetStart - clientSize / 2 - containerSize / 2\n : offsetStart + clientSize / 2 - containerSize / 2;\n\n return Math.min(contentSize - containerSize, Math.max(0, offsetCentered));\n}\n","<script setup lang=\"ts\">\n/**\n * # EvSlideGroup\n */\nimport \"./EvSlideGroup.scss\";\nimport {\n EvButton,\n EvSlideGroupSlot,\n makeEvSlideGroupProps,\n} from \"@/components\";\nimport { useDisplayRuleClasses } from \"@/composables/display.ts\";\nimport { computed, shallowRef, watch } from \"vue\";\nimport { Browser, clamp, focusableChildren, isBoolean } from \"@/util\";\nimport { GroupProps, useGroup } from \"@/composables/group.ts\";\nimport { useResizeObserver } from \"@/composables/resizeObserver.ts\";\nimport {\n bias,\n calculateCenteredOffset,\n calculateUpdatedOffset,\n} from \"@/components/EvSlideGroup/helpers.ts\";\nimport {\n ChevronDownIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n ChevronUpIcon,\n} from \"@/icons\";\nimport { useRtl } from \"@/composables/locale.ts\";\n\ndefineSlots<EvSlideGroupSlot>();\n\nconst props = defineProps({\n ...makeEvSlideGroupProps(),\n});\nconst group = useGroup(props as any as GroupProps, props.symbol);\nconst { isRtl } = useRtl();\nconst isFocused = shallowRef(false);\nconst isOverflowing = shallowRef(false);\nconst scrollOffset = shallowRef(0);\nconst containerSize = shallowRef(0);\nconst contentSize = shallowRef(0);\nconst isHorizontal = computed(() => props.direction === \"horizontal\");\nconst disableTransition = shallowRef(false);\n\nconst { resizeRef: containerRef, contentRect: containerRect } =\n useResizeObserver();\nconst { resizeRef: contentRef, contentRect } = useResizeObserver();\n\nconst firstSelectedIndex = computed(() => {\n if (!group.selected.value.length) {\n return -1;\n }\n return group.items.value.findIndex(\n (item) => item.id === group.selected.value[0],\n );\n});\n\nconst lastSelectedIndex = computed(() => {\n if (!group.selected.value.length) {\n return -1;\n }\n return group.items.value.findIndex(\n (item) =>\n item.id === group.selected.value[group.selected.value.length - 1],\n );\n});\n\nif (Browser.hasWindow) {\n let frame = -1;\n watch(\n () => [\n group.selected.value,\n containerRect.value,\n contentRect.value,\n isHorizontal.value,\n ],\n () => {\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(() => {\n if (containerRect.value && contentRect.value) {\n const sizeProperty = isHorizontal.value\n ? \"width\"\n : \"height\";\n containerSize.value = containerRect.value[sizeProperty];\n contentSize.value = contentRect.value[sizeProperty];\n isOverflowing.value =\n containerSize.value + 1 < contentSize.value;\n }\n\n if (firstSelectedIndex.value >= 0 && contentRef.value) {\n // @todo: Is this too naive? Should we store element references in group composable?\n const selectedElement = contentRef.value.children[\n lastSelectedIndex.value\n ] as HTMLElement;\n\n if (\n firstSelectedIndex.value === 0 ||\n !isOverflowing.value\n ) {\n scrollOffset.value = 0;\n } else if (props.centerActive) {\n scrollOffset.value = calculateCenteredOffset({\n selectedElement,\n containerSize: containerSize.value,\n contentSize: contentSize.value,\n isRtl: isRtl.value,\n isHorizontal: isHorizontal.value,\n });\n } else if (isOverflowing.value) {\n scrollOffset.value = calculateUpdatedOffset({\n selectedElement,\n containerSize: containerSize.value,\n contentSize: contentSize.value,\n isRtl: isRtl.value,\n currentScrollOffset: scrollOffset.value,\n isHorizontal: isHorizontal.value,\n });\n }\n }\n });\n },\n );\n}\n\n/**\n * ## focus\n * @param location\n */\nfunction focus(location?: \"next\" | \"previous\" | \"first\" | \"last\") {\n if (!contentRef.value) {\n return;\n }\n if (!location) {\n const focusable = focusableChildren(contentRef.value);\n focusable[0]?.focus();\n } else if (location === \"next\") {\n const el = contentRef.value.querySelector(\":focus\")\n ?.nextElementSibling as HTMLElement | undefined;\n if (el) {\n el.focus();\n } else {\n focus(\"first\");\n }\n } else if (location === \"previous\") {\n const el = contentRef.value.querySelector(\":focus\")\n ?.previousElementSibling as HTMLElement | undefined;\n if (el) {\n el.focus();\n } else {\n focus(\"last\");\n }\n } else if (location === \"first\") {\n (contentRef.value.firstElementChild as HTMLElement)?.focus();\n } else if (location === \"last\") {\n (contentRef.value.lastElementChild as HTMLElement)?.focus();\n }\n}\n\n/**\n * ## onFocus\n * @param e\n */\nfunction onFocus(e: FocusEvent) {\n if (\n !isFocused.value &&\n !(\n e.relatedTarget &&\n contentRef.value?.contains(e.relatedTarget as Node)\n )\n ) {\n focus();\n }\n}\n\n/**\n * ## onFocusin\n * @param e\n */\nfunction onFocusin(e: FocusEvent) {\n isFocused.value = true;\n\n if (!isOverflowing.value || !contentRef.value) {\n return;\n }\n\n // Focused element is likely to be the root of an item, so a\n // breadth-first search will probably find it in the first iteration\n for (const el of e.composedPath()) {\n for (const item of contentRef.value.children) {\n if (item === el) {\n scrollOffset.value = calculateUpdatedOffset({\n selectedElement: item as HTMLElement,\n containerSize: containerSize.value,\n contentSize: contentSize.value,\n isRtl: isRtl.value,\n currentScrollOffset: scrollOffset.value,\n isHorizontal: isHorizontal.value,\n });\n return;\n }\n }\n }\n}\n\n/**\n * ## onFocusout\n * @param e\n */\nfunction onFocusout(e: FocusEvent) {\n isFocused.value = false;\n}\n\n/**\n * ## onKeydown\n * @param e\n */\nfunction onKeydown(e: KeyboardEvent) {\n if (!contentRef.value) {\n return;\n }\n if (isHorizontal.value) {\n if (e.key === \"ArrowRight\") {\n focus(isRtl.value ? \"previous\" : \"next\");\n } else if (e.key === \"ArrowLeft\") {\n focus(isRtl.value ? \"next\" : \"previous\");\n }\n } else {\n if (e.key === \"ArrowDown\") {\n focus(\"next\");\n } else if (e.key === \"ArrowUp\") {\n focus(\"previous\");\n }\n }\n if (e.key === \"Home\") {\n focus(\"first\");\n } else if (e.key === \"End\") {\n focus(\"last\");\n }\n}\n\n/**\n * ## onScroll\n */\nfunction onScroll() {\n if (!containerRef.value) {\n return;\n }\n containerRef.value[isHorizontal.value ? \"scrollLeft\" : \"scrollTop\"] = 0;\n}\n\nlet startTouch = 0;\nlet startOffset = 0;\n\n/**\n * ## onTouchstart\n * @param e\n */\nfunction onTouchstart(e: TouchEvent) {\n const sizeProperty = isHorizontal.value ? \"clientX\" : \"clientY\";\n const sign = isRtl.value && isHorizontal.value ? -1 : 1;\n startOffset = sign * scrollOffset.value;\n startTouch = e.touches[0][sizeProperty];\n disableTransition.value = true;\n}\n\n/**\n * ## onTouchmove\n * @param e\n */\nfunction onTouchmove(e: TouchEvent) {\n if (!isOverflowing.value) {\n return;\n }\n const sizeProperty = isHorizontal.value ? \"clientX\" : \"clientY\";\n const sign = isRtl.value && isHorizontal.value ? -1 : 1;\n scrollOffset.value =\n sign * (startOffset + startTouch - e.touches[0][sizeProperty]);\n}\n\n/**\n * # onTouchend\n * @param e\n */\nfunction onTouchend(e: TouchEvent) {\n const maxScrollOffset = contentSize.value - containerSize.value;\n if (scrollOffset.value < 0 || !isOverflowing.value) {\n scrollOffset.value = 0;\n } else if (scrollOffset.value >= maxScrollOffset) {\n scrollOffset.value = maxScrollOffset;\n }\n disableTransition.value = false;\n}\n\n/**\n * ## scrollTo\n * @param location\n */\nfunction scrollTo(location: \"previous\" | \"next\") {\n const newAbsoluteOffset =\n scrollOffset.value +\n (location === \"previous\" ? -1 : 1) * containerSize.value;\n scrollOffset.value = clamp(\n newAbsoluteOffset,\n 0,\n contentSize.value - containerSize.value,\n );\n}\n\n/**\n * Arrows Hidden\n */\nconst arrowsHiddenClasses = useDisplayRuleClasses(\n props,\n \"arrowsHidden\",\n \"hidden\",\n);\nconst arrowsHiddenAttribute = computed(() => {\n return isBoolean(props.arrowsHidden) && props.arrowsHidden;\n});\n\nconst contentStyles = computed(() => {\n // This adds friction when scrolling the 'wrong' way when at max offset\n let scrollAmount =\n scrollOffset.value > contentSize.value - containerSize.value\n ? -(contentSize.value - containerSize.value) +\n bias(contentSize.value - containerSize.value - scrollOffset.value)\n : -scrollOffset.value;\n\n // This adds friction when scrolling the 'wrong' way when at min offset\n if (scrollOffset.value <= 0) {\n scrollAmount = bias(-scrollOffset.value);\n }\n\n const sign = isRtl.value && isHorizontal.value ? -1 : 1;\n return {\n transform: `translate${isHorizontal.value ? \"X\" : \"Y\"}(${sign * scrollAmount}px)`,\n transition: disableTransition.value ? \"none\" : \"\",\n willChange: disableTransition.value ? \"transform\" : \"\",\n };\n});\n\nconst slotProps = computed(() => ({\n next: group.next,\n previous: group.previous,\n select: group.select,\n isSelected: group.isSelected,\n}));\n\nconst hasPrevious = computed(() => {\n return Math.abs(scrollOffset.value) > 0;\n});\n\nconst hasNext = computed(() => {\n // Check one scroll ahead to know the width of right-most item\n return (\n contentSize.value > Math.abs(scrollOffset.value) + containerSize.value\n );\n});\n\nconst hasAffix = computed(() => {\n if (isBoolean(props.arrowsHidden) && props.arrowsHidden) {\n return false;\n }\n return isOverflowing.value || Math.abs(scrollOffset.value) > 0;\n});\n\nconst arrowsAlignClass = computed(() => {\n return `is-arrows-${props.arrowsAlign}`;\n});\n\nconst iconNext = computed(() => {\n if (props.iconNext) {\n return props.iconNext;\n }\n return isHorizontal.value ? ChevronRightIcon : ChevronDownIcon;\n});\n\nconst iconPrevious = computed(() => {\n if (props.iconPrevious) {\n return props.iconPrevious;\n }\n return isHorizontal.value ? ChevronLeftIcon : ChevronUpIcon;\n});\n</script>\n\n<template>\n <component\n :is=\"props.tag\"\n :class=\"[\n 'ev-slide-group',\n {\n 'is-overflowing': isOverflowing,\n 'is-vertical': !isHorizontal,\n },\n arrowsAlignClass,\n props.class,\n ]\"\n :style=\"props.style\"\n :tabindex=\"isFocused || group.selected.value.length ? -1 : 0\"\n @focus=\"onFocus\">\n <div\n key=\"container\"\n ref=\"containerRef\"\n class=\"ev-slide-group--container\"\n @scroll=\"onScroll\">\n <div\n ref=\"contentRef\"\n class=\"ev-slide-group--content\"\n :style=\"contentStyles\"\n @touchstart.passive=\"onTouchstart\"\n @touchmove.passive=\"onTouchmove\"\n @touchend.passive=\"onTouchend\"\n @focusin=\"onFocusin\"\n @focusout=\"onFocusout\"\n @keydown=\"onKeydown\">\n <slot name=\"default\" v-bind=\"slotProps\" />\n </div>\n </div>\n\n <div\n v-if=\"hasAffix\"\n key=\"previous\"\n :class=\"[\n 'ev-slide-group--previous',\n { 'is-disabled': !hasPrevious },\n ...arrowsHiddenClasses,\n ]\"\n :hidden=\"arrowsHiddenAttribute\"\n @click=\"() => scrollTo('previous')\">\n <slot name=\"previous\">\n <ev-button\n :icon=\"isRtl && isHorizontal ? iconNext : iconPrevious\"\n variant=\"subtle\" />\n </slot>\n </div>\n\n <div\n v-if=\"hasAffix\"\n key=\"next\"\n :class=\"[\n 'ev-slide-group--next',\n { 'is-disabled': !hasNext },\n ...arrowsHiddenClasses,\n ]\"\n :hidden=\"arrowsHiddenAttribute\"\n @click=\"() => scrollTo('next')\">\n <slot name=\"next\">\n <ev-button\n :icon=\"isRtl && isHorizontal ? iconPrevious : iconNext\"\n variant=\"subtle\" />\n </slot>\n </div>\n </component>\n</template>\n","<script setup lang=\"ts\">\nimport {\n GroupItemProps,\n GroupItemProvide,\n makeGroupItemProps,\n useGroupItem,\n} from \"@/composables/groupItem.ts\";\nimport { computed, UnwrapRef } from \"vue\";\nimport { EvSlideGroupSymbol } from \"@/components\";\n\ntype EvSlideGroupItemSlots = {\n default: {\n isSelected: UnwrapRef<GroupItemProvide[\"isSelected\"]>;\n select: GroupItemProvide[\"select\"];\n toggle: GroupItemProvide[\"toggle\"];\n selectedClass: UnwrapRef<GroupItemProvide[\"selectedClass\"]>;\n };\n};\n\ndefineEmits([\"group:selected\"]);\n\ndefineSlots<EvSlideGroupItemSlots>();\n\nconst props = defineProps({\n ...makeGroupItemProps(),\n});\nconst slideGroupItem = useGroupItem(\n props as any as GroupItemProps,\n EvSlideGroupSymbol,\n);\nconst slotProps = computed(() => {\n return {\n isSelected: slideGroupItem!.isSelected.value,\n select: slideGroupItem!.select,\n toggle: slideGroupItem!.toggle,\n selectedClass: slideGroupItem!.selectedClass.value,\n };\n});\n</script>\n\n<template>\n <slot v-bind=\"slotProps\" />\n</template>\n","import { propsFactory } from \"@/util\";\nimport { makeEvCheckboxProps } from \"@/components/EvCheckbox\";\n\nexport const makeEvSwitchProps = propsFactory(\n {\n ...makeEvCheckboxProps(),\n },\n \"EvSwitch\",\n);\n","<script setup lang=\"ts\">\n/**\n * # `<ev-switch>`\n */\nimport \"./EvSwitch.scss\";\nimport { ref, useAttrs } from \"vue\";\nimport { splitInputAttrs } from \"@/util\";\nimport { EvErrors } from \"@/components/EvErrors\";\nimport { EvLabel } from \"@/components/EvLabel\";\nimport { useToggleControl } from \"@/components/EvCheckbox\";\nimport { makeEvSwitchProps } from \"./EvSwitch.ts\";\nimport { useFormField } from \"@/composables/validation.ts\";\n\n/**\n * We want to pass attributes not defined as 'props'\n * to the `<input>` field, so we need to turn off `inheritAttrs`.\n */\ndefineOptions({\n inheritAttrs: false,\n});\n\n// Props & slots\nconst props = defineProps({\n ...makeEvSwitchProps(),\n});\nconst slots = defineSlots<{\n label(): never;\n}>();\n\n// Emit\ndefineEmits([\"update:focused\", \"update:modelValue\"]);\n\nconst attrs = useAttrs();\nconst containerRef = ref<HTMLElement | null>(null);\nconst inputRef = ref<HTMLInputElement | null>(null);\nconst [containerAttrs, inputAttrs] = splitInputAttrs(attrs);\nconst formField = useFormField(props);\nconst { trueValue, isChecked } = useToggleControl(formField.model, props);\n\n/**\n * ## Get Input Element\n */\nfunction getInputElement(): HTMLInputElement | null {\n return inputRef.value;\n}\n\n/**\n * ## On Input\n * @param e\n */\nfunction onInput(e: Event) {\n isChecked.value = (e.target as HTMLInputElement).checked;\n}\n\n/**\n * ## Expose stuff\n */\ndefineExpose({\n input: inputRef,\n focus: () => {\n getInputElement()?.focus();\n },\n ...formField.expose(),\n});\n</script>\n\n<template>\n <div\n ref=\"containerRef\"\n class=\"ev-switch\"\n :class=\"[\n {\n 'is-checked': isChecked,\n 'is-labelled': props.label || slots.label,\n },\n formField.classes,\n props.class,\n ]\"\n :style=\"props.style\"\n v-bind=\"containerAttrs\">\n <div class=\"ev-switch--control\">\n <div class=\"ev-switch--track\"></div>\n <div class=\"ev-switch--thumb\"></div>\n <input\n :id=\"formField.id\"\n ref=\"inputRef\"\n type=\"checkbox\"\n role=\"switch\"\n :name=\"formField.name\"\n :disabled=\"formField.isDisabled\"\n :readonly=\"formField.isReadonly\"\n :checked=\"isChecked\"\n :value=\"trueValue\"\n :aria-disabled=\"formField.isDisabled\"\n :aria-checked=\"isChecked\"\n v-bind=\"inputAttrs\"\n @input=\"onInput\"\n @focus=\"formField.focus\"\n @blur=\"formField.blur\" />\n </div>\n\n <div v-if=\"props.label || slots.label\" class=\"ev-switch--label\">\n <ev-label :for=\"formField.id\" clickable>\n <slot name=\"label\">{{ props.label }}</slot>\n </ev-label>\n\n <div v-if=\"formField.isShowErrorMessages\" class=\"ev-switch--errors\">\n <ev-errors :messages=\"formField.errorMessages\" />\n </div>\n </div>\n </div>\n</template>\n","import { omit, propsFactory } from \"@/util\";\nimport { makeEvButtonProps } from \"@/components\";\nimport { PropType } from \"vue\";\n\n/**\n * # makeEvTabProps()\n */\nexport const makeEvTabProps = propsFactory(\n {\n direction: {\n type: String as PropType<\"horizontal\" | \"vertical\">,\n default: \"horizontal\",\n },\n\n ...omit(\n makeEvButtonProps({\n variant: \"subtle\" as const,\n selectedClass: \"is-selected\",\n selectedAppearance: \"primary\",\n selectedVariant: \"subtle\",\n }),\n [\"active\", \"symbol\"],\n ),\n },\n \"EvTab\",\n);\n","import { InjectionKey, PropType } from \"vue\";\nimport { GroupProvide } from \"@/composables/group.ts\";\nimport { InputSizeProp, propsFactory } from \"@/util\";\nimport { makeEvSlideGroupProps } from \"@/components\";\nimport { makeTagProps } from \"@/composables/tag.ts\";\n\nexport const EvTabsSymbol: InjectionKey<GroupProvide> = Symbol.for(\"ev:tabs\");\n\nexport type TabItem = string | number | Record<string, any>;\n\nexport const makeEvTabsProps = propsFactory(\n {\n alignTabs: {\n type: String as PropType<\"start\" | \"center\" | \"end\">,\n default: \"start\",\n },\n grow: Boolean,\n items: {\n type: Array as PropType<readonly TabItem[]>,\n default: () => [],\n },\n size: String as PropType<InputSizeProp>,\n\n ...makeEvSlideGroupProps({ mandatory: \"force\" as const }),\n ...makeTagProps(),\n },\n \"EvTabs\",\n);\n","<script setup lang=\"ts\">\r\n/**\r\n * # EvTab\r\n */\r\nimport \"./EvTab.scss\";\r\nimport { makeEvTabProps } from \"./EvTab.ts\";\r\nimport { EvButton } from \"@/components/EvButton\";\r\nimport { EvTabsSymbol } from \"@/components/EvTabs/EvTabs.ts\";\r\nimport { computed, ref } from \"vue\";\r\nimport { animate, easingStandard, filterComponentProps } from \"@/util\";\r\nimport { useDefaults } from \"@/composables\";\r\n\r\nconst definedProps = defineProps({\r\n ...makeEvTabProps(),\r\n});\r\ndefineSlots<{\r\n default(): never;\r\n}>();\r\nconst props = useDefaults(definedProps);\r\nconst isSelected = computed(\r\n () => rootEl.value?.group?.isSelected.value ?? false,\r\n);\r\nconst isHorizontal = computed(() => props.direction === \"horizontal\");\r\nconst buttonProps = computed(() => {\r\n return filterComponentProps(EvButton, props);\r\n});\r\nconst rootEl = ref<typeof EvButton>();\r\nconst sliderEl = ref<HTMLElement>();\r\n\r\nfunction updateSlider({ value }: { value: boolean }) {\r\n if (!value) {\r\n return;\r\n }\r\n\r\n const prevEl: HTMLElement | undefined =\r\n rootEl.value?.$el.parentElement?.querySelector(\r\n \".ev-tab.is-active .ev-tab--slider\",\r\n );\r\n const nextEl = sliderEl.value;\r\n if (!prevEl || !nextEl) {\r\n return;\r\n }\r\n\r\n const color = getComputedStyle(prevEl).color;\r\n const prevBox = prevEl.getBoundingClientRect();\r\n const nextBox = nextEl.getBoundingClientRect();\r\n\r\n const xy = isHorizontal.value ? \"x\" : \"y\";\r\n const XY = isHorizontal.value ? \"X\" : \"Y\";\r\n const rightBottom = isHorizontal.value ? \"right\" : \"bottom\";\r\n const widthHeight = isHorizontal.value ? \"width\" : \"height\";\r\n\r\n const prevPos = prevBox[xy];\r\n const nextPos = nextBox[xy];\r\n const delta =\r\n prevPos > nextPos\r\n ? prevBox[rightBottom] - nextBox[rightBottom]\r\n : prevBox[xy] - nextBox[xy];\r\n\r\n const origin =\r\n Math.sign(delta) > 0\r\n ? isHorizontal.value\r\n ? \"right\"\r\n : \"bottom\"\r\n : Math.sign(delta) < 0\r\n ? isHorizontal.value\r\n ? \"left\"\r\n : \"top\"\r\n : \"center\";\r\n\r\n const size =\r\n Math.abs(delta) +\r\n (Math.sign(delta) < 0 ? prevBox[widthHeight] : nextBox[widthHeight]);\r\n const scale =\r\n size / Math.max(prevBox[widthHeight], nextBox[widthHeight]) || 0;\r\n const initialScale = prevBox[widthHeight] / nextBox[widthHeight] || 0;\r\n\r\n const sigma = 1.5;\r\n animate(\r\n nextEl,\r\n {\r\n backgroundColor: [color, \"currentcolor\"],\r\n transform: [\r\n `translate${XY}(${delta}px) scale${XY}(${initialScale})`,\r\n `translate${XY}(${delta / sigma}px) scale${XY}(${(scale - 1) / sigma + 1})`,\r\n \"none\",\r\n ],\r\n transformOrigin: Array(3).fill(origin),\r\n },\r\n {\r\n duration: 225,\r\n easing: easingStandard,\r\n },\r\n );\r\n}\r\n</script>\r\n\r\n<template>\r\n <ev-button\r\n ref=\"rootEl\"\r\n role=\"tab\"\r\n :class=\"['ev-tab', props.class]\"\r\n :active=\"undefined\"\r\n :aria-selected=\"String(isSelected)\"\r\n :symbol=\"EvTabsSymbol\"\r\n :tabindex=\"isSelected ? 0 : -1\"\r\n :style=\"props.style\"\r\n v-bind=\"buttonProps\"\r\n @group:selected=\"updateSlider\">\r\n <slot name=\"default\">{{ props.text }}</slot>\r\n\r\n <div ref=\"sliderEl\" :class=\"['ev-tab--slider']\"></div>\r\n </ev-button>\r\n</template>\r\n","<script setup lang=\"ts\">\n/**\n * EvTabs\n * ---\n */\nimport \"./EvTabs.scss\";\nimport { EvTabsSymbol, makeEvTabsProps, TabItem } from \"./EvTabs.ts\";\nimport { EvSlideGroup } from \"@/components/EvSlideGroup\";\nimport { useModelProxy } from \"@/composables/modelProxy.ts\";\nimport { computed, toRef } from \"vue\";\nimport { filterComponentProps, isObject } from \"@/util\";\nimport { provideDefaults } from \"@/composables/defaults.ts\";\nimport { EvTab } from \"@/components\";\n\n/**\n * ## parseItems\n * @param items\n */\nfunction parseItems(items: readonly TabItem[] | undefined) {\n if (!items) {\n return [];\n }\n return items.map((item) => {\n return !isObject(item) ? { text: item, value: item } : item;\n });\n}\n\nconst props = defineProps({\n ...makeEvTabsProps(),\n});\nconst model = useModelProxy(props, \"modelValue\");\nconst parsedItems = computed(() => parseItems(props.items));\n\nprovideDefaults({\n EvTab: {\n direction: toRef(props, \"direction\"),\n size: toRef(props, \"size\"),\n selectedAppearance: toRef(props, \"selectedAppearance\"),\n selectedVariant: toRef(props, \"selectedVariant\"),\n },\n});\n\nconst slideGroupProps = computed(() =>\n filterComponentProps(EvSlideGroup, props),\n);\nconst alignTabsClass = computed(() => `is-align-tabs-${props.alignTabs}`);\n</script>\n\n<template>\n <ev-slide-group\n v-bind=\"slideGroupProps\"\n v-model=\"model\"\n role=\"tablist\"\n :class=\"[\n 'ev-tabs',\n alignTabsClass,\n {\n 'is-grow': props.grow,\n },\n props.class,\n ]\"\n :style=\"props.style\"\n :symbol=\"EvTabsSymbol\">\n <slot>\n <ev-tab\n v-for=\"item in parsedItems\"\n :key=\"item.text\"\n v-bind=\"item\"></ev-tab>\n </slot>\n </ev-slide-group>\n</template>\n","import { isDeepEqual, propsFactory } from \"@/util\";\nimport { makeTagProps } from \"@/composables/tag.ts\";\nimport { makeComponentProps } from \"@/composables/component.ts\";\nimport { PropType } from \"vue\";\nimport { makeGroupProps } from \"@/composables/group.ts\";\nimport { makeEvSlideGroupProps } from \"@/components/EvSlideGroup/EvSlideGroup.ts\";\n\nexport const EvTagGroupSymbol = Symbol.for(\"ev:tag-group\");\n\nexport type EvTagGroupSlots = {\n default: {\n isSelected: (id: number) => boolean;\n select: (id: number, value: boolean) => void;\n next: () => void;\n prev: () => void;\n selected: readonly number[];\n };\n};\n\n/**\n * # makeEvTagGroupProps\n */\nexport const makeEvTagGroupProps = propsFactory(\n {\n column: Boolean,\n filter: Boolean,\n valueComparator: {\n type: Function as PropType<typeof isDeepEqual>,\n default: isDeepEqual,\n },\n\n ...makeEvSlideGroupProps(),\n ...makeComponentProps(),\n ...makeGroupProps({\n selectedClass: \"is-selected\",\n selectedAppearance: \"primary\",\n selectedVariant: \"outlined\",\n }),\n ...makeTagProps(),\n },\n \"EvTagGroup\",\n);\n","<script setup lang=\"ts\">\nimport \"./EvTagGroup.scss\";\nimport {\n EvTagGroupSlots,\n EvTagGroupSymbol,\n makeEvTagGroupProps,\n} from \"./EvTagGroup.ts\";\nimport { GroupProps, useGroup } from \"@/composables/group.ts\";\nimport { computed, toRef } from \"vue\";\nimport { provideDefaults } from \"@/composables/defaults.ts\";\nimport { filterComponentProps } from \"@/util\";\nimport { EvSlideGroup } from \"@/components/EvSlideGroup\";\n\nconst props = defineProps({\n ...makeEvTagGroupProps(),\n});\n\nconst { isSelected, select, next, previous, selected } = useGroup(\n props as any as GroupProps,\n EvTagGroupSymbol,\n);\n\ndefineSlots<EvTagGroupSlots>();\n\nconst slotProps = computed(() => {\n return {\n isSelected,\n select,\n next,\n previous,\n selected: selected.value,\n };\n});\n\nprovideDefaults({\n EvTag: {\n disabled: toRef(props, \"disabled\"),\n filter: toRef(props, \"filter\"),\n },\n});\n\nconst slideGroupProps = computed(() =>\n filterComponentProps(EvSlideGroup, props),\n);\n</script>\n\n<template>\n <ev-slide-group\n v-bind=\"slideGroupProps\"\n :class=\"[\n 'ev-tag-group',\n {\n 'is-column': props.column,\n },\n props.class,\n ]\"\n :style=\"props.style\">\n <slot v-bind=\"slotProps\" />\n </ev-slide-group>\n</template>\n","import { makeInputAppearanceProps, propsFactory } from \"@/util\";\nimport { makeComponentProps } from \"@/composables/component.ts\";\nimport { makeFormFieldProps } from \"@/composables/validation.ts\";\n\nexport const makeEvTextareaProps = propsFactory(\n {\n autofocus: Boolean,\n autoselect: Boolean,\n autogrow: {\n type: Boolean,\n default: true,\n },\n autosubmit: Function,\n clearable: Boolean,\n label: String,\n loading: Boolean,\n placeholder: String,\n\n ...makeFormFieldProps(),\n ...makeInputAppearanceProps(),\n ...makeComponentProps(),\n },\n \"EvTextarea\",\n);\n","<script setup lang=\"ts\">\n/**\n * # `<ev-textarea>`\n */\nimport \"./EvTextarea.scss\";\nimport { makeEvTextareaProps } from \"./EvTextarea.ts\";\nimport { computed, nextTick, ref, useAttrs, onUpdated, onMounted } from \"vue\";\nimport {\n Appearance,\n appearanceModifier,\n InputAppearance,\n splitInputAttrs,\n} from \"@/util\";\nimport { useAutofocus } from \"@/composables/focus.ts\";\nimport { CancelIcon } from \"@/icons\";\nimport { EvProgress } from \"@/components/EvProgress\";\nimport { EvIcon } from \"@/components/EvIcon\";\nimport { EvErrors } from \"@/components/EvErrors\";\nimport { EvLabel } from \"@/components/EvLabel\";\nimport { useFormField } from \"@/composables/validation.ts\";\n\n/**\n * We want to pass attributes not defined as 'props'\n * to the `<input>` field, so we need to turn off `inheritAttrs`.\n */\ndefineOptions({\n inheritAttrs: false,\n});\n\nconst props = defineProps({\n ...makeEvTextareaProps(),\n});\nconst slots = defineSlots<{\n label(): never;\n}>();\n\n// Emit\nconst emit = defineEmits([\n \"click:clear\",\n \"click:control\",\n \"mousedown:control\",\n \"update:focused\",\n \"update:modelValue\",\n]);\n\nconst attrs = useAttrs();\nconst containerRef = ref<HTMLElement | null>(null);\nconst inputRef = ref<HTMLInputElement | null>(null);\nconst [containerAttrs, inputAttrs] = splitInputAttrs(attrs);\nconst formField = useFormField(props);\nconst isClearable = computed(() => {\n return props.clearable && !!formField.value;\n});\n\n/**\n * ## Get Input Element\n */\nfunction getInputElement(): HTMLInputElement | null {\n return inputRef.value;\n}\n\n/**\n * ## On Clearable Click\n * @param $event\n */\nfunction onClearableClick($event: MouseEvent) {\n $event.stopPropagation();\n nextTick(() => {\n formField.value = null;\n emit(\"click:clear\", $event);\n });\n getInputElement()?.focus();\n}\n\n/**\n * ## On Clearable Mousedown\n * @param e\n */\nfunction onClearableMousedown(e: MouseEvent) {\n e.preventDefault();\n e.stopPropagation();\n}\n\n/**\n * ## On Focus\n * @param e\n */\nfunction onFocus(e?: Event) {\n formField.focus(e);\n if (props.autoselect) {\n getInputElement()?.select();\n }\n}\n\n/**\n * ## On Control Click\n *\n * When the user clicks on the textarea.\n *\n * @param e\n */\nfunction onControlClick(e: MouseEvent) {\n onFocus();\n emit(\"click:control\", e);\n}\n\n/**\n * ## On Control Mousedown\n *\n * When the mousedown is triggered on the textarea.\n *\n * @param e\n */\nfunction onControlMousedown(e: MouseEvent) {\n emit(\"mousedown:control\", e);\n if (e.target === inputRef.value) {\n return;\n }\n onFocus();\n e.preventDefault();\n}\n\n/**\n * ## On Keydown\n * Attempt to resize the textarea on key down.\n * @param e\n */\nfunction onKeydown(e: Event) {\n resize();\n}\n\n/**\n * ## On Keyup\n * Attempt to resize the textarea on key up.\n * @param e\n */\nfunction onKeyup(e: Event) {\n resize();\n}\n\n/**\n * ## On Enter\n * When the user presses the Enter key, we can call an `autosubmit` function (if supplied).\n * @param e\n */\nfunction onKeyupEnter(e: Event) {\n // Use the autosubmit callback if present\n if (props.autosubmit) {\n props.autosubmit();\n }\n}\n\n/**\n * ## Resize\n * If the component is set to `autogrow` then we resize the textarea appropriately\n * so that all the text is visible.\n */\nfunction resize() {\n if (!props.autogrow) {\n return;\n }\n const field = getInputElement();\n if (!field) {\n return;\n }\n field.style.height = \"auto\";\n field.style.height = field.scrollHeight + 1 + \"px\";\n}\n\n/**\n * ## On Update\n * Ensures the textarea is resized when the component updates.\n */\nonUpdated(() => {\n resize();\n});\n\n/**\n * ## On Mounted\n * Ensures the textarea is resized when the component loads.\n */\nonMounted(() => {\n resize();\n});\n\n/**\n * ## Directive `v-autofocus`\n */\nconst vAutofocus = useAutofocus(props);\n\n/**\n * ## Expose stuff\n */\ndefineExpose({\n input: inputRef,\n focus: () => {\n getInputElement()?.focus();\n },\n ...formField.expose(),\n});\n</script>\n\n<template>\n <div\n ref=\"containerRef\"\n class=\"ev-textarea\"\n :class=\"[\n {\n 'is-loading': loading,\n 'is-autogrow': autogrow,\n },\n formField.classes,\n props.class,\n ]\"\n :style=\"props.style\"\n role=\"textbox\"\n v-bind=\"containerAttrs\">\n <div v-if=\"props.label || slots.label\" class=\"ev-textarea--label\">\n <ev-label :for=\"formField.id\">\n <slot name=\"label\">{{ props.label }}</slot>\n </ev-label>\n </div>\n\n <div\n :class=\"[\n 'ev-textarea--control',\n appearanceModifier(props.appearance, [InputAppearance.default]),\n ]\"\n @click=\"onControlClick\"\n @mousedown=\"onControlMousedown\">\n <div class=\"ev-textarea--input\">\n <textarea\n :id=\"formField.id\"\n ref=\"inputRef\"\n v-model=\"formField.value\"\n v-autofocus\n :name=\"formField.name\"\n :disabled=\"formField.isDisabled\"\n :readonly=\"formField.isReadonly\"\n :placeholder=\"placeholder\"\n :autofocus=\"autofocus\"\n v-bind=\"inputAttrs\"\n @focus=\"onFocus\"\n @blur=\"formField.blur\"\n @keydown=\"onKeydown\"\n @keyup=\"onKeyup\"\n @keyup.enter=\"onKeyupEnter\"></textarea>\n </div>\n <transition name=\"slide-fade\">\n <div v-if=\"isClearable\" class=\"ev-textarea--clearable\">\n <ev-icon\n :glyph=\"CancelIcon\"\n @click=\"onClearableClick\"\n @mousedown=\"onClearableMousedown\" />\n </div>\n </transition>\n <div v-if=\"loading\" class=\"ev-textarea--loader\">\n <ev-progress\n indeterminate\n :appearance=\"\n formField.isFocused\n ? Appearance.notice\n : Appearance.default\n \"\n :size=\"2\" />\n </div>\n </div>\n\n <div v-if=\"formField.isShowErrorMessages\" class=\"ev-textarea--errors\">\n <ev-errors :messages=\"formField.errorMessages\" />\n </div>\n </div>\n</template>\n","import { omit, propsFactory } from \"@/util\";\nimport { makeEvOverlayProps } from \"@/components/EvOverlay\";\n\nexport const makeEvTooltipProps = propsFactory(\n {\n id: String,\n text: String,\n\n ...omit(\n makeEvOverlayProps({\n closeOnBack: false,\n position: \"top\" as const,\n positionStrategy: \"connected\" as const,\n minWidth: 0,\n offset: 8,\n openDelay: 250,\n openOnClick: false,\n openOnHover: true,\n origin: \"auto\" as const,\n veil: false,\n scrollStrategy: \"reposition\" as const,\n transition: false,\n }),\n [\"absolute\", \"persistent\"],\n ),\n },\n \"EvTooltip\",\n);\n","<script setup lang=\"ts\">\nimport \"./EvTooltip.scss\";\nimport { makeEvTooltipProps } from \"./EvTooltip.ts\";\nimport { useModelProxy } from \"@/composables/modelProxy.ts\";\nimport { filterComponentProps, getNextId } from \"@/util\";\nimport { EvOverlay, PositionStrategyProps } from \"@/components/EvOverlay\";\nimport { computed, mergeProps, ref } from \"vue\";\n\nconst props = defineProps({\n ...makeEvTooltipProps(),\n});\n\nconst isActive = useModelProxy(props, \"modelValue\");\nconst uid = getNextId();\n\nconst id = computed(() => {\n return props.id || `ev-tooltip-${uid}`;\n});\n\nconst overlayRef = ref<typeof EvOverlay>();\nconst overlayProps = filterComponentProps(EvOverlay, props);\n\nconst position = computed(() => {\n return props.position.split(\" \").length > 1\n ? props.position\n : ((props.position + \" center\") as PositionStrategyProps[\"position\"]);\n});\n\nconst origin = computed(() => {\n return props.origin === \"auto\" ||\n props.origin === \"overlap\" ||\n props.origin.split(\" \").length > 1 ||\n props.position.split(\" \").length > 1\n ? props.origin\n : ((props.origin + \" center\") as PositionStrategyProps[\"origin\"]);\n});\n\nconst transition = computed(() => {\n if (props.transition) {\n return props.transition;\n }\n return isActive.value ? \"transition-scale\" : \"transition-fade\";\n});\n\nconst activatorProps = computed(() => {\n return mergeProps(\n {\n \"aria-describedby\": id.value,\n },\n props.activatorProps,\n );\n});\n</script>\n\n<template>\n <ev-overlay\n :id=\"id\"\n ref=\"overlayRef\"\n v-bind=\"overlayProps\"\n v-model=\"isActive\"\n role=\"tooltip\"\n :class=\"['ev-tooltip', props.class]\"\n :style=\"props.style\"\n :transition=\"transition\"\n :position=\"position\"\n :origin=\"origin\"\n :activator-props=\"activatorProps\"\n absolute\n disable-global-stack>\n <slot>{{ props.text }}</slot>\n </ev-overlay>\n</template>\n","import { GroupProvide } from \"@/composables/group.ts\";\nimport { ComputedRef, Ref, InjectionKey, PropType } from \"vue\";\nimport { GroupItemProvide } from \"@/composables/groupItem.ts\";\nimport { propsFactory } from \"@/util\";\nimport { makeComponentProps } from \"@/composables/component.ts\";\nimport { makeTagProps } from \"@/composables/tag.ts\";\nimport { IconProp } from \"@/composables/icons.ts\";\nimport { ArrowBackIcon, ArrowContinueIcon } from \"@/icons\";\nimport { TouchHandlers } from \"@/directives\";\n\nexport type EvWindowSlots = {\n default: {\n group: GroupProvide;\n };\n};\n\nexport type WindowProvide = {\n transition: ComputedRef<undefined | string>;\n transitionCount: Ref<number>;\n transitionHeight: Ref<undefined | string>;\n isReversed: Ref<boolean>;\n rootRef: Ref<HTMLElement | undefined>;\n};\n\nexport const EvWindowSymbol: InjectionKey<WindowProvide> =\n Symbol.for(\"ev:window\");\nexport const EvWindowGroupSymbol: InjectionKey<GroupItemProvide> =\n Symbol.for(\"ev:window-group\");\n\nexport const makeEvWindowProps = propsFactory(\n {\n continuous: Boolean,\n direction: {\n type: String as PropType<\"horizontal\" | \"vertical\">,\n default: \"horizontal\",\n },\n disabled: Boolean,\n iconNext: {\n type: IconProp,\n default: ArrowContinueIcon,\n },\n iconPrevious: {\n type: IconProp,\n default: ArrowBackIcon,\n },\n // TODO: mandatory should probably not be exposed but do this for now\n mandatory: {\n type: [Boolean, String] as PropType<boolean | \"force\">,\n default: \"force\" as const,\n },\n modelValue: null,\n reverse: Boolean,\n selectedClass: {\n type: String,\n default: \"is-active\",\n },\n showArrows: {\n type: [Boolean, String],\n validator: (v: any) => typeof v === \"boolean\" || v === \"hover\",\n },\n touch: {\n type: [Object, Boolean] as PropType<boolean | TouchHandlers>,\n default: undefined,\n },\n\n ...makeComponentProps(),\n ...makeTagProps(),\n },\n \"EvWindow\",\n);\n","import { DirectiveBinding } from \"vue\";\nimport { isFunction, isObject, isShadowRoot } from \"@/util\";\n\n/**\n * ## Click Outside Args\n *\n * Allows us to accept custom arguments from v-click-outside attributes.\n * - `handler` the function to execute\n * - `condition` an optional function which determines whether the `handler` should be called.\n * Effectively, this allows us to pause the event.\n * - `include` an optional array of elements to include when evaluating the click outside event.\n */\ninterface ClickOutsideArgs {\n handler: (e: MouseEvent) => void;\n condition?: (e: Event) => boolean;\n include?: () => HTMLElement[];\n}\n\n/**\n * ## Click Outside Binding\n */\ninterface ClickOutsideBinding extends DirectiveBinding {\n value: ((e: MouseEvent) => void) | ClickOutsideArgs;\n}\n\ninterface ClickOutsideHTMLElement extends HTMLElement {\n __clickOutside?: any;\n}\n\n/**\n * # Get the actual or shadow root of an element.\n * @param el\n */\nfunction getRoot(el: HTMLElement): null | Document | ShadowRoot {\n const root = el.getRootNode();\n if (\n root !== document &&\n root.getRootNode({ composed: true }) !== document\n ) {\n return null;\n }\n return root as Document | ShadowRoot;\n}\n\n/**\n * ## Is Active?\n * Determine if the callback should be called.\n * @param e\n * @param binding\n */\nfunction isActive(e: MouseEvent, binding: ClickOutsideBinding): boolean {\n const isActiveCallback =\n (isObject(binding.value) &&\n (binding.value as ClickOutsideArgs).condition) ||\n (() => true);\n return isActiveCallback(e);\n}\n\n/**\n * ## Is Event Outside?\n *\n * 1. Check that the event listener still wants us to trigger events (`isActive`).\n * This helps\n *\n *\n * @param e\n * @param el\n * @param binding\n */\nfunction isEventOutside(\n e: MouseEvent,\n el: HTMLElement,\n binding: ClickOutsideBinding,\n): boolean {\n // 1 Check isActive callback\n if (!e || !isActive(e, binding)) {\n return false;\n }\n const root = getRoot(el);\n if (isShadowRoot(root) && root.host === e.target) {\n return false;\n }\n const elements = (\n (isObject(binding.value) &&\n (binding.value as ClickOutsideArgs).include) ||\n (() => [])\n )();\n elements.push(el);\n return !elements.some((el) => {\n return el?.contains(e.target as Node);\n });\n}\n\n/**\n * # On Click Handler\n *\n * @param e\n * @param el\n * @param binding\n */\nfunction onClickHandler(\n e: MouseEvent,\n el: ClickOutsideHTMLElement,\n binding: ClickOutsideBinding,\n) {\n const handler = isFunction(binding.value)\n ? binding.value\n : binding.value.handler;\n if (\n !el.__clickOutside!.wasMousedownOutside ||\n !isEventOutside(e, el, binding)\n ) {\n return;\n }\n // setTimeout so the callback function is executed asynchronously\n setTimeout(() => {\n isActive(e, binding) && handler && handler(e);\n }, 0);\n}\n\n/**\n * ## Handle Callback\n * @param el\n * @param callback\n */\nfunction handleCallback(el: HTMLElement, callback: Function): void {\n callback(document);\n const root = getRoot(el);\n if (isShadowRoot(root)) {\n callback(root);\n }\n}\n\n/**\n * # Click Outside Directive\n *\n * There are two handlers:\n * 1. onClick - handles click events, which are triggered after...\n * 2. onMouseDown - determines if the mouse was outside before the click event finished.\n *\n * This helps us get over an issue we had previously, where mouse dragging during a click\n * caused dialogs to close unwantedly.\n */\nexport const clickOutside = {\n /**\n * Add event listeners when the component is mounted.\n * @param el\n * @param binding\n */\n mounted(el: ClickOutsideHTMLElement, binding: ClickOutsideBinding) {\n const onClick = (e: Event) => {\n onClickHandler(e as MouseEvent, el, binding);\n };\n const onMousedown = (e: Event) => {\n el.__clickOutside!.wasMousedownOutside = isEventOutside(\n e as MouseEvent,\n el,\n binding,\n );\n };\n handleCallback(el, (app: HTMLElement) => {\n app.addEventListener(\"click\", onClick, true);\n app.addEventListener(\"mousedown\", onMousedown, true);\n });\n if (!el.__clickOutside) {\n el.__clickOutside = {\n wasMousedownOutside: false,\n };\n }\n el.__clickOutside[binding.instance!.$.uid] = { onClick, onMousedown };\n },\n\n /**\n * Remove event listeners when the component is unmounted.\n * @param el\n * @param binding\n */\n unmounted(el: ClickOutsideHTMLElement, binding: ClickOutsideBinding) {\n if (!el.__clickOutside) {\n return;\n }\n handleCallback(el, (app: HTMLElement) => {\n if (!app || !el.__clickOutside?.[binding.instance!.$.uid]) {\n return;\n }\n const { onClick, onMousedown } =\n el.__clickOutside[binding.instance!.$.uid]!;\n app.removeEventListener(\"click\", onClick, true);\n app.removeEventListener(\"mousedown\", onMousedown, true);\n });\n delete el.__clickOutside[binding.instance!.$.uid];\n },\n};\n\nexport default clickOutside;\n","import { DirectiveBinding } from \"vue/dist/vue\";\nimport { Browser } from \"@/util\";\n\ntype ObserverHandler = (\n isIntersecting: boolean,\n entries: IntersectionObserverEntry[],\n observer: IntersectionObserver,\n) => void;\n\ninterface ObserveHTMLElement extends HTMLElement {\n _observe?: { init: boolean; observer: IntersectionObserver }[];\n}\n\nexport interface ObserverDirectiveBinding\n extends Omit<DirectiveBinding, \"modifiers\" | \"value\"> {\n value?:\n | ObserverHandler\n | { handler: ObserverHandler; options?: IntersectionObserverInit };\n modifiers: {\n once?: boolean;\n quiet?: boolean;\n };\n}\n\n/**\n * # Mounted\n */\nfunction mounted(el: ObserveHTMLElement, binding: ObserverDirectiveBinding) {\n if (!Browser.supportsIntersection) {\n return;\n }\n const modifiers = binding.modifiers || {};\n const value = binding.value;\n const { handler, options } =\n typeof value === \"object\" ? value : { handler: value, options: {} };\n\n const observer = new IntersectionObserver(\n (\n entries: IntersectionObserverEntry[] = [],\n observer: IntersectionObserver,\n ) => {\n const _observe = el._observe?.[binding.instance!.$.uid];\n // Just in case, should never fire\n if (!_observe) {\n return;\n }\n const isIntersecting = entries.some(\n (entry) => entry.isIntersecting,\n );\n\n // If is not quiet or has already been initialized, invoke the user callback\n if (\n handler &&\n (!modifiers.quiet || _observe.init) &&\n (!modifiers.once || isIntersecting || _observe.init)\n ) {\n handler(isIntersecting, entries, observer);\n }\n\n if (isIntersecting && modifiers.once) {\n unmounted(el, binding);\n } else {\n _observe.init = true;\n }\n },\n options,\n );\n\n el._observe = Object(el._observe);\n el._observe![binding.instance!.$.uid] = { init: false, observer };\n\n observer.observe(el);\n}\n\n/**\n * # Unmounted\n */\nfunction unmounted(el: ObserveHTMLElement, binding: ObserverDirectiveBinding) {\n const observe = el._observe?.[binding.instance!.$.uid];\n if (!observe) {\n return;\n }\n observe.observer.unobserve(el);\n delete el._observe![binding.instance!.$.uid];\n}\n\nexport const Intersect = {\n mounted,\n unmounted,\n};\n\nexport default Intersect;\n","import { DirectiveBinding } from \"vue/dist/vue\";\nimport { VNode } from \"vue\";\n\nexport const SlotsDirective = {\n beforeMount(el: HTMLElement, binding: DirectiveBinding, vnode: VNode) {\n const slots = binding.value || {};\n\n const subComponentVNode = vnode.component;\n if (!subComponentVNode) {\n return;\n }\n\n Object.keys(slots).forEach((slotName) => {\n subComponentVNode.slots[slotName] = slots[slotName];\n });\n },\n};\n\nexport default SlotsDirective;\n","// Utilities\nimport { keys } from \"@/util\";\n\n// Types\nimport type { DirectiveBinding } from \"vue\";\n\nexport interface TouchHandlers {\n start?: (wrapperEvent: { originalEvent: TouchEvent } & TouchData) => void;\n end?: (wrapperEvent: { originalEvent: TouchEvent } & TouchData) => void;\n move?: (wrapperEvent: { originalEvent: TouchEvent } & TouchData) => void;\n left?: (wrapper: TouchData) => void;\n right?: (wrapper: TouchData) => void;\n up?: (wrapper: TouchData) => void;\n down?: (wrapper: TouchData) => void;\n}\n\nexport interface TouchData {\n touchstartX: number;\n touchstartY: number;\n touchmoveX: number;\n touchmoveY: number;\n touchendX: number;\n touchendY: number;\n offsetX: number;\n offsetY: number;\n}\n\nexport type TouchWrapper = TouchHandlers & TouchData;\n\nexport interface TouchValue extends TouchHandlers {\n parent?: boolean;\n options?: AddEventListenerOptions;\n}\n\nexport interface TouchStoredHandlers {\n touchstart: (e: TouchEvent) => void;\n touchend: (e: TouchEvent) => void;\n touchmove: (e: TouchEvent) => void;\n}\n\nexport interface TouchDirectiveBinding extends Omit<DirectiveBinding, \"value\"> {\n value?: TouchValue;\n}\n\nconst handleGesture = (wrapper: TouchWrapper) => {\n const { touchstartX, touchendX, touchstartY, touchendY } = wrapper;\n const dirRatio = 0.5;\n const minDistance = 16;\n wrapper.offsetX = touchendX - touchstartX;\n wrapper.offsetY = touchendY - touchstartY;\n\n if (Math.abs(wrapper.offsetY) < dirRatio * Math.abs(wrapper.offsetX)) {\n wrapper.left &&\n touchendX < touchstartX - minDistance &&\n wrapper.left(wrapper);\n wrapper.right &&\n touchendX > touchstartX + minDistance &&\n wrapper.right(wrapper);\n }\n\n if (Math.abs(wrapper.offsetX) < dirRatio * Math.abs(wrapper.offsetY)) {\n wrapper.up &&\n touchendY < touchstartY - minDistance &&\n wrapper.up(wrapper);\n wrapper.down &&\n touchendY > touchstartY + minDistance &&\n wrapper.down(wrapper);\n }\n};\n\n/**\n * # touchstart\n * @param event\n * @param wrapper\n */\nfunction touchstart(event: TouchEvent, wrapper: TouchWrapper) {\n const touch = event.changedTouches[0];\n wrapper.touchstartX = touch.clientX;\n wrapper.touchstartY = touch.clientY;\n\n wrapper.start?.({ originalEvent: event, ...wrapper });\n}\n\n/**\n * # touchend\n * @param event\n * @param wrapper\n */\nfunction touchend(event: TouchEvent, wrapper: TouchWrapper) {\n const touch = event.changedTouches[0];\n wrapper.touchendX = touch.clientX;\n wrapper.touchendY = touch.clientY;\n\n wrapper.end?.({ originalEvent: event, ...wrapper });\n\n handleGesture(wrapper);\n}\n\n/**\n * # touchmove\n * @param event\n * @param wrapper\n */\nfunction touchmove(event: TouchEvent, wrapper: TouchWrapper) {\n const touch = event.changedTouches[0];\n wrapper.touchmoveX = touch.clientX;\n wrapper.touchmoveY = touch.clientY;\n\n wrapper.move?.({ originalEvent: event, ...wrapper });\n}\n\n/**\n * # createHandlers\n * @param value\n */\nfunction createHandlers(value: TouchHandlers = {}): TouchStoredHandlers {\n const wrapper = {\n touchstartX: 0,\n touchstartY: 0,\n touchendX: 0,\n touchendY: 0,\n touchmoveX: 0,\n touchmoveY: 0,\n offsetX: 0,\n offsetY: 0,\n left: value.left,\n right: value.right,\n up: value.up,\n down: value.down,\n start: value.start,\n move: value.move,\n end: value.end,\n };\n\n return {\n touchstart: (e: TouchEvent) => touchstart(e, wrapper),\n touchend: (e: TouchEvent) => touchend(e, wrapper),\n touchmove: (e: TouchEvent) => touchmove(e, wrapper),\n };\n}\n\ntype TouchableElement = HTMLElement & {\n _touchHandlers?: { [key: string | number]: TouchStoredHandlers };\n};\n\nfunction mounted(el: TouchableElement, binding: TouchDirectiveBinding) {\n const value = binding.value;\n const target = (value?.parent ? el.parentElement : el) as TouchableElement;\n const options = value?.options ?? { passive: true };\n const uid = binding.instance?.$.uid; // TODO: use custom uid generator\n\n if (!target || !uid) {\n return;\n }\n\n const handlers = createHandlers(binding.value);\n\n target._touchHandlers = target._touchHandlers ?? Object.create(null);\n target._touchHandlers![uid] = handlers;\n\n keys(handlers).forEach((eventName) => {\n target.addEventListener(eventName, handlers[eventName], options);\n });\n}\n\nfunction unmounted(el: HTMLElement, binding: TouchDirectiveBinding) {\n const target = (\n binding.value?.parent ? el.parentElement : el\n ) as TouchableElement;\n const uid = binding.instance?.$.uid;\n\n if (!target?._touchHandlers || !uid) {\n return;\n }\n\n const handlers = target._touchHandlers[uid];\n\n keys(handlers).forEach((eventName) => {\n target.removeEventListener(eventName, handlers[eventName]);\n });\n\n delete target._touchHandlers[uid];\n}\n\nexport const Touch = {\n mounted,\n unmounted,\n};\n\nexport default Touch;\n","<script setup lang=\"ts\">\n/**\n * EvWindow\n * ---\n */\nimport \"./EvWindow.scss\";\nimport {\n EvWindowGroupSymbol,\n EvWindowSymbol,\n makeEvWindowProps,\n} from \"./EvWindow.ts\";\nimport { useLocaleFunctions, useRtl } from \"@/composables/locale.ts\";\nimport { GroupProps, useGroup } from \"@/composables/group.ts\";\nimport { computed, provide, ref, shallowRef, watch } from \"vue\";\nimport { TouchHandlers, Touch } from \"@/directives\";\nimport { EvButton } from \"@/components\";\nimport { IconValue } from \"@/composables/icons.ts\";\n\nconst props = defineProps({\n ...makeEvWindowProps(),\n});\ndefineSlots<{\n default(): never;\n next(props: {\n props: {\n icon: IconValue;\n class: string;\n onClick: () => void;\n ariaLabel: string;\n };\n }): never;\n previous(props: {\n props: {\n icon: IconValue;\n class: string;\n onClick: () => void;\n ariaLabel: string;\n };\n }): never;\n}>();\n\nconst { isRtl } = useRtl();\nconst { t } = useLocaleFunctions();\nconst group = useGroup(props as any as GroupProps, EvWindowGroupSymbol);\nconst rootRef = ref();\nconst isRtlReverse = computed(() =>\n isRtl.value ? !props.reverse : props.reverse,\n);\nconst isReversed = shallowRef(false);\n\nconst transition = computed(() => {\n const axis = props.direction === \"vertical\" ? \"y\" : \"x\";\n const reverse = isRtlReverse.value ? !isReversed.value : isReversed.value;\n const direction = reverse ? \"-reverse\" : \"\";\n return `ev-window-${axis}${direction}-transition`;\n});\nconst transitionCount = shallowRef(0);\nconst transitionHeight = ref<undefined | string>(undefined);\n\nconst activeIndex = computed(() => {\n return group.items.value.findIndex((item) =>\n group.selected.value.includes(item.id),\n );\n});\n\nwatch(activeIndex, (newVal, oldVal) => {\n const itemsLength = group.items.value.length;\n const lastIndex = itemsLength - 1;\n if (itemsLength <= 2) {\n isReversed.value = newVal < oldVal;\n } else if (newVal === lastIndex && oldVal === 0) {\n isReversed.value = true;\n } else if (newVal === 0 && oldVal === lastIndex) {\n isReversed.value = false;\n } else {\n isReversed.value = newVal < oldVal;\n }\n});\n\nprovide(EvWindowSymbol, {\n transition,\n isReversed,\n transitionCount,\n transitionHeight,\n rootRef,\n});\n\nconst canMoveBack = computed(() => props.continuous || activeIndex.value !== 0);\nconst canMoveForward = computed(\n () =>\n props.continuous || activeIndex.value !== group.items.value.length - 1,\n);\n\nfunction previous() {\n canMoveBack.value && group.previous();\n}\n\nfunction next() {\n canMoveForward.value && group.next();\n}\n\nconst touchOptions = computed(() => {\n if (props.touch === false) return props.touch;\n\n const options: TouchHandlers = {\n left: () => {\n isRtlReverse.value ? previous() : next();\n },\n right: () => {\n isRtlReverse.value ? next() : previous();\n },\n start: ({ originalEvent }) => {\n originalEvent.stopPropagation();\n },\n };\n\n return {\n ...options,\n ...(props.touch === true ? {} : props.touch),\n };\n});\n\nconst previousProps = computed(() => {\n return {\n icon: isRtl.value ? props.iconNext : props.iconPrevious,\n class: `ev-window--${isRtlReverse.value ? \"right\" : \"left\"}`,\n onClick: group.previous,\n ariaLabel: t(\"carousel.previous\"),\n };\n});\n\nconst nextProps = computed(() => {\n return {\n icon: isRtl.value ? props.iconPrevious : props.iconNext,\n class: `ev-window--${isRtlReverse.value ? \"left\" : \"right\"}`,\n onClick: group.next,\n ariaLabel: t(\"carousel.next\"),\n };\n});\n\n// explicit directive declaration\nconst vTouch = Touch;\n</script>\n\n<template>\n <component\n :is=\"props.tag\"\n ref=\"rootRef\"\n v-touch=\"touchOptions\"\n :class=\"[\n 'ev-window',\n {\n 'is-show-arrows-on-hover': props.showArrows === 'hover',\n },\n props.class,\n ]\"\n :style=\"props.style\">\n <div\n class=\"ev-window--container\"\n :style=\"{\n height: transitionHeight,\n }\">\n <slot name=\"default\" v-bind=\"{ group }\"></slot>\n\n <div v-if=\"props.showArrows !== false\" class=\"ev-window--controls\">\n <slot\n v-if=\"canMoveBack\"\n name=\"previous\"\n v-bind=\"{ props: previousProps }\">\n <ev-button v-bind=\"previousProps\" />\n </slot>\n <div v-else class=\"ev-window--control-placeholder\"></div>\n\n <slot\n v-if=\"canMoveForward\"\n name=\"next\"\n v-bind=\"{ props: nextProps }\">\n <ev-button v-bind=\"nextProps\" />\n </slot>\n <div v-else class=\"ev-window--control-placeholder\"></div>\n </div>\n </div>\n </component>\n</template>\n","import { propsFactory } from \"@/util\";\nimport { computed, Ref, shallowRef, watch } from \"vue\";\n\nexport const makeLazyProps = propsFactory(\n {\n eager: Boolean,\n },\n \"lazy\",\n);\n\n/**\n * # useLazy\n *\n * @param props\n * @param active\n */\nexport function useLazy(props: { eager: boolean }, active: Ref<boolean>) {\n const isBooted = shallowRef(false);\n const hasContent = computed(\n () => isBooted.value || props.eager || active.value,\n );\n\n watch(active, () => (isBooted.value = true));\n\n function onAfterLeave() {\n if (!props.eager) {\n isBooted.value = false;\n }\n }\n\n return { isBooted, hasContent, onAfterLeave };\n}\n","import { propsFactory } from \"@/util\";\nimport { makeComponentProps } from \"@/composables/component.ts\";\nimport { makeGroupItemProps } from \"@/composables/groupItem.ts\";\nimport { makeLazyProps } from \"@/composables/lazy.ts\";\n\nexport const makeEvWindowItemProps = propsFactory(\n {\n reverseTransition: {\n type: [Boolean, String],\n default: undefined,\n },\n transition: {\n type: [Boolean, String],\n default: undefined,\n },\n\n ...makeComponentProps(),\n ...makeGroupItemProps(),\n ...makeLazyProps(),\n },\n \"EvWindowItem\",\n);\n","import { computed, onMounted, readonly, shallowRef } from \"vue\";\n\n/**\n * # useSsrBoot\n */\nexport function useSsrBoot() {\n const isBooted = shallowRef(false);\n\n onMounted(() => {\n window.requestAnimationFrame(() => {\n isBooted.value = true;\n });\n });\n\n const ssrBootStyles = computed(() =>\n !isBooted.value\n ? {\n transition: \"none !important\",\n }\n : undefined,\n );\n\n return { ssrBootStyles, isBooted: readonly(isBooted) };\n}\n","<script setup lang=\"ts\">\n/**\n * EvWindowItem\n */\nimport { computed, inject, nextTick, shallowRef } from \"vue\";\nimport { makeEvWindowItemProps } from \"./EvWindowItem.ts\";\nimport { EvWindowGroupSymbol, EvWindowSymbol } from \"../EvWindow.ts\";\nimport { EvTransition } from \"@/components/EvTransition\";\nimport { GroupItemProps, useGroupItem } from \"@/composables/groupItem.ts\";\nimport { useSsrBoot } from \"@/composables/ssrBoot.ts\";\nimport { isString, toWebUnit } from \"@/util\";\nimport { useLazy } from \"@/composables/lazy.ts\";\n\nconst props = defineProps({\n ...makeEvWindowItemProps(),\n});\nconst window = inject(EvWindowSymbol);\nconst groupItem = useGroupItem(\n props as any as GroupItemProps,\n EvWindowGroupSymbol,\n);\nconst { isBooted } = useSsrBoot();\n\nif (!window || !groupItem) {\n throw new Error(\"Evance UI: EvWindowItem must be used inside EvWindow\");\n}\n\nconst isTransitioning = shallowRef(false);\nconst hasTransition = computed(\n () =>\n isBooted.value &&\n (window.isReversed.value\n ? props.reverseTransition !== false\n : props.transition !== false),\n);\n\n/**\n * ## onAfterTransition\n */\nfunction onAfterTransition() {\n if (!isTransitioning.value || !window) {\n return;\n }\n // Finalize transition state.\n isTransitioning.value = false;\n if (window.transitionCount.value > 0) {\n window.transitionCount.value -= 1;\n\n // Remove container height if we are out of transition.\n if (window.transitionCount.value === 0) {\n window.transitionHeight.value = undefined;\n }\n }\n}\n\n/**\n * ## onBeforeTransition\n */\nfunction onBeforeTransition() {\n if (isTransitioning.value || !window) {\n return;\n }\n // Initialize transition state here.\n isTransitioning.value = true;\n if (window.transitionCount.value === 0) {\n // Set initial height for height transition.\n window.transitionHeight.value = toWebUnit(\n window.rootRef.value?.clientHeight,\n );\n }\n window.transitionCount.value += 1;\n}\n\n/**\n * ## onTransitionCancelled\n */\nfunction onTransitionCancelled() {\n onAfterTransition(); // This should have the same path as normal transition end.\n}\n\n/**\n * ## onEnterTransition\n * @param el\n */\nfunction onEnterTransition(el: Element) {\n if (!isTransitioning.value) {\n return;\n }\n\n nextTick(() => {\n // Do not set height if no transition or cancelled.\n if (!hasTransition.value || !isTransitioning.value || !window) {\n return;\n }\n // Set transition target height.\n window.transitionHeight.value = toWebUnit(el.clientHeight);\n });\n}\n\nconst transition = computed(() => {\n const name = window.isReversed.value\n ? props.reverseTransition\n : props.transition;\n\n return !hasTransition.value\n ? false\n : {\n name: !isString(name) ? window.transition.value : name,\n onBeforeEnter: onBeforeTransition,\n onAfterEnter: onAfterTransition,\n onEnterCancelled: onTransitionCancelled,\n onBeforeLeave: onBeforeTransition,\n onAfterLeave: onAfterTransition,\n onLeaveCancelled: onTransitionCancelled,\n onEnter: onEnterTransition,\n };\n});\n\nconst { hasContent } = useLazy(props, groupItem.isSelected);\n</script>\n\n<template>\n <ev-transition :transition=\"transition\" :disabled=\"!isBooted\">\n <div\n v-show=\"groupItem.isSelected.value\"\n :class=\"['ev-window-item', props.class]\"\n :style=\"props.style\">\n <slot v-if=\"hasContent\" />\n </div>\n </ev-transition>\n</template>\n","import { EvDialogRenderer } from \"@/components/EvDialog/EvDialogRenderer.ts\";\n\n/**\n * # EvDialogInstance\n */\nexport class EvDialogInstance {\n public constructor(private renderer: EvDialogRenderer) {}\n\n get data() {\n return this.renderer.data;\n }\n\n get id(): number {\n return this.renderer.id;\n }\n\n public close(response: any): void {\n this.renderer.close(response);\n }\n}\n","import {\n App,\n ComponentPublicInstance,\n h,\n mergeProps,\n render,\n shallowRef,\n VNode,\n VNodeProps,\n} from \"vue\";\nimport EvDialog from \"@/components/EvDialog/EvDialog.vue\";\nimport { EvDialogInstance } from \"@/components/EvDialog/EvDialogInstance.ts\";\nimport {\n EvDialogServiceOptions,\n EvDialogServiceSlots,\n} from \"@/components/EvDialog/EvDialogServiceOpener.ts\";\n\n/**\n * # EvDialogInstance\n */\nexport class EvDialogRenderer {\n private app: App;\n public readonly id: number;\n private instance?: ComponentPublicInstance | null;\n private container?: HTMLDivElement;\n private modelValue = shallowRef(false);\n private options: EvDialogServiceOptions;\n private promiseResolver?: (value: unknown) => void;\n private isRendered = false;\n\n /**\n * @param app\n * @param id\n * @param options\n */\n public constructor(app: App, id: number, options: EvDialogServiceOptions) {\n this.app = app;\n this.id = id;\n this.options = options;\n }\n\n get data() {\n return this.options.data;\n }\n\n /**\n * ## close\n * @param response\n */\n public close(response: any) {\n this.promiseResolver?.(response);\n this.modelValue.value = false;\n }\n\n /**\n * ## createContainer\n * @private\n */\n private createContainer() {\n this.container = document.createElement(\"div\");\n this.container.id = `ev-dialog-instance-${this.id}`;\n document.querySelector(\"body\")!.appendChild(this.container);\n }\n\n /**\n * ## createProps\n * @private\n */\n private createProps() {\n const props = this.options.props ?? {};\n return mergeProps(props as VNodeProps, {\n modelValue: this.modelValue,\n onAfterLeave: () => this.onAfterLeave(),\n __instance: new EvDialogInstance(this),\n });\n }\n\n /**\n * ## createSlots\n *\n * Convert the slots provided in the instance options\n * into render functions.\n *\n * @private\n */\n private createSlots() {\n const internalSlots = this.options.slots ?? {};\n const renderedSlots: {\n [key: string]: (props: any, slots: any) => VNode;\n } = {};\n for (const key in internalSlots) {\n const component = internalSlots[key as keyof EvDialogServiceSlots];\n renderedSlots[key] = (props, slots) => {\n return h(component!, props, slots);\n };\n }\n return renderedSlots;\n }\n\n /**\n * ## onAfterLeave\n * @private\n */\n private onAfterLeave() {\n const el = this.instance!.$el.parentNode;\n render(null, el);\n el.parentNode.removeChild(el);\n this.isRendered = false;\n }\n\n /**\n * ## open\n */\n public open() {\n this.modelValue.value = true;\n return new Promise((resolve) => {\n this.promiseResolver = resolve;\n });\n }\n\n /**\n * ## renderDialog\n * @private\n */\n public render() {\n if (this.isRendered) {\n return;\n }\n this.createContainer();\n const renderedDialog = h(\n EvDialog,\n this.createProps(),\n this.createSlots(),\n );\n renderedDialog.appContext = this.app._context;\n render(renderedDialog, this.container!);\n this.instance = renderedDialog.component!.proxy!;\n this.isRendered = true;\n }\n}\n","import { App } from \"vue\";\nimport { EvDialogRenderer } from \"@/components/EvDialog/EvDialogRenderer.ts\";\n\nexport interface EvDialogServiceOptions {\n props?: EvDialogServiceProps;\n slots?: EvDialogServiceSlots;\n data?: any;\n}\n\n/**\n * # EvDialogProps\n */\nexport interface EvDialogServiceProps {\n width?: number | string;\n veil?: boolean;\n showHeader?: boolean;\n retainFocus?: boolean;\n persistent?: boolean;\n}\n\nexport interface EvDialogServiceSlots {\n container?: object;\n default?: object;\n header?: object;\n footer?: object;\n}\n\n/**\n * # EvDialogService\n */\nexport class EvDialogServiceOpener {\n private instanceId: number = 0;\n\n public constructor(private app: App) {}\n\n /**\n * ## open\n * @param options\n */\n public open(options: EvDialogServiceOptions) {\n const renderer = new EvDialogRenderer(\n this.app,\n ++this.instanceId,\n options,\n );\n renderer.render();\n return renderer.open();\n }\n}\n","import { App } from \"vue\";\nimport { EvDialogServiceSymbol } from \"@/composables/dialog.ts\";\nimport { EvDialogServiceOpener } from \"@/components/EvDialog/EvDialogServiceOpener.ts\";\n\n/**\n * # EvDialogService\n */\nexport default {\n install: (app: App) => {\n const service = new EvDialogServiceOpener(app);\n\n // For options API - use with `this.$dialog`\n app.config.globalProperties.$dialog = service;\n\n // For composition API - use with `useDialog()`\n app.provide(EvDialogServiceSymbol, service);\n },\n};\n","import { EvDrawerRenderer } from \"@/components/EvDrawer/EvDrawerRenderer.ts\";\n\n/**\n * # EvDrawerInstance\n */\nexport class EvDrawerInstance {\n public constructor(private renderer: EvDrawerRenderer) {}\n\n get data() {\n return this.renderer.data;\n }\n\n get id(): number {\n return this.renderer.id;\n }\n\n public close(response: any): void {\n this.renderer.close(response);\n }\n}\n","import {\n App,\n ComponentPublicInstance,\n h,\n mergeProps,\n render,\n shallowRef,\n VNode,\n VNodeProps,\n} from \"vue\";\nimport EvDrawer from \"@/components/EvDrawer/EvDrawer.vue\";\nimport { EvDrawerInstance } from \"@/components/EvDrawer/EvDrawerInstance.ts\";\nimport {\n EvDrawerServiceOptions,\n EvDrawerServiceSlots,\n} from \"@/components/EvDrawer/EvDrawerServiceOpener.ts\";\n\n/**\n * # EvDrawerInstance\n */\nexport class EvDrawerRenderer {\n private app: App;\n public readonly id: number;\n private instance?: ComponentPublicInstance | null;\n private container?: HTMLDivElement;\n private modelValue = shallowRef(false);\n private options: EvDrawerServiceOptions;\n private promiseResolver?: (value: unknown) => void;\n private isRendered = false;\n\n /**\n * @param app\n * @param id\n * @param options\n */\n public constructor(app: App, id: number, options: EvDrawerServiceOptions) {\n this.app = app;\n this.id = id;\n this.options = options;\n }\n\n get data() {\n return this.options.data;\n }\n\n /**\n * ## close\n * @param response\n */\n public close(response: any) {\n this.promiseResolver?.(response);\n this.modelValue.value = false;\n }\n\n /**\n * ## createContainer\n * @private\n */\n private createContainer() {\n this.container = document.createElement(\"div\");\n this.container.id = `ev-drawer-instance-${this.id}`;\n document.querySelector(\"body\")!.appendChild(this.container);\n }\n\n /**\n * ## createProps\n * @private\n */\n private createProps() {\n const props = this.options.props ?? {};\n return mergeProps(props as VNodeProps, {\n modelValue: this.modelValue,\n onAfterLeave: () => this.onAfterLeave(),\n __instance: new EvDrawerInstance(this),\n });\n }\n\n /**\n * ## createSlots\n *\n * Convert the slots provided in the instance options\n * into render functions.\n *\n * @private\n */\n private createSlots() {\n const internalSlots = this.options.slots ?? {};\n const renderedSlots: {\n [key: string]: (props: any, slots: any) => VNode;\n } = {};\n for (const key in internalSlots) {\n const component = internalSlots[key as keyof EvDrawerServiceSlots];\n renderedSlots[key] = (props, slots) => {\n return h(component!, props, slots);\n };\n }\n return renderedSlots;\n }\n\n /**\n * ## onAfterLeave\n * @private\n */\n private onAfterLeave() {\n const el = this.instance!.$el.parentNode;\n render(null, el);\n el.parentNode.removeChild(el);\n this.isRendered = false;\n }\n\n /**\n * ## open\n */\n public open() {\n this.modelValue.value = true;\n return new Promise((resolve) => {\n this.promiseResolver = resolve;\n });\n }\n\n /**\n * ## render\n * @private\n */\n public render() {\n if (this.isRendered) {\n return;\n }\n this.createContainer();\n const renderedComponent = h(\n EvDrawer,\n this.createProps(),\n this.createSlots(),\n );\n renderedComponent.appContext = this.app._context;\n render(renderedComponent, this.container!);\n this.instance = renderedComponent.component!.proxy!;\n this.isRendered = true;\n }\n}\n","import { App } from \"vue\";\nimport { EvDrawerRenderer } from \"@/components/EvDrawer/EvDrawerRenderer.ts\";\nimport {\n EvDialogServiceOptions,\n EvDialogServiceProps,\n EvDialogServiceSlots,\n} from \"@/components/EvDialog/EvDialogServiceOpener.ts\";\n\nexport interface EvDrawerServiceOptions extends EvDialogServiceOptions {}\nexport interface EvDrawerServiceProps extends EvDialogServiceProps {}\nexport interface EvDrawerServiceSlots extends EvDialogServiceSlots {}\n\n/**\n * # EvDrawerServiceOpener\n */\nexport class EvDrawerServiceOpener {\n private instanceId: number = 0;\n\n public constructor(private app: App) {}\n\n /**\n * ## open\n * @param options\n */\n public open(options: EvDrawerServiceOptions) {\n const renderer = new EvDrawerRenderer(\n this.app,\n ++this.instanceId,\n options,\n );\n renderer.render();\n return renderer.open();\n }\n}\n","import { App } from \"vue\";\nimport { EvDrawerServiceSymbol } from \"@/composables/drawer.ts\";\nimport { EvDrawerServiceOpener } from \"@/components/EvDrawer/EvDrawerServiceOpener.ts\";\n\n/**\n * # EvDialogService\n */\nexport default {\n install: (app: App) => {\n const service = new EvDrawerServiceOpener(app);\n\n // For options API - use with `this.$drawer`\n app.config.globalProperties.$drawer = service;\n\n // For composition API - use with `useDrawer()`\n app.provide(EvDrawerServiceSymbol, service);\n },\n};\n","import { App } from \"vue\";\nimport { EvNotificationsManager } from \"@/components/EvNotifications/EvNotificationsManager.ts\";\nimport { EvNotificationServiceSymbol } from \"@/composables/notification.ts\";\n\n/**\n * # EvNotificationService\n */\nexport default {\n install: (app: App) => {\n const service = new EvNotificationsManager();\n\n // For options API - use with `this.$dialog`\n app.config.globalProperties.$notification = service;\n\n // For composition API - use with `useDialog()`\n app.provide(EvNotificationServiceSymbol, service);\n },\n};\n","import {\r\n createDisplay,\r\n DisplayOptions,\r\n DisplaySymbol,\r\n SSROptions,\r\n} from \"./composables/display.ts\";\r\nimport { Browser, getNextId, mergeDeep } from \"./util\";\r\nimport { App, nextTick } from \"vue\";\r\nimport { createLocaleManager, LocaleSymbol } from \"@/composables/locale.ts\";\r\nimport { LocaleOptions } from \"@/modules/Locale/LocaleManager.ts\";\r\nimport {\r\n createDate,\r\n DateAdapterSymbol,\r\n DateOptions,\r\n} from \"@/composables/date/date.ts\";\r\nimport {\r\n createDefaults,\r\n DefaultsOptions,\r\n DefaultsSymbol,\r\n} from \"@/composables/defaults.ts\";\r\n\r\nexport * from \"./composables\";\r\nexport type { DateOptions, DateAdapterInstance } from \"@/composables/date\";\r\n\r\nexport interface EvanceUiOptions {\r\n blueprint?: Blueprint;\r\n components?: Record<string, any>;\r\n date?: DateOptions;\r\n defaults?: DefaultsOptions;\r\n directives?: Record<string, any>;\r\n display?: DisplayOptions;\r\n locale?: LocaleOptions; // & RtlOptions, // @todo: <--- YOU ARE HERE\r\n ssr?: SSROptions;\r\n services?: Record<string, any>;\r\n}\r\n\r\nexport interface Blueprint extends Omit<EvanceUiOptions, \"blueprint\"> {}\r\n\r\n// Added to prevent strict errors\r\ninterface NuxtApp {\r\n hook: (hook: string, callback: () => void) => void;\r\n}\r\n\r\n/**\r\n * # Create Evance UI\r\n * @param evanceUi\r\n */\r\nexport function createEvanceUi(evanceUi: EvanceUiOptions = {}) {\r\n const { blueprint, ...rest } = evanceUi;\r\n const options: EvanceUiOptions = mergeDeep(blueprint, rest);\r\n\r\n const { components = {}, directives = {}, services = {} } = options;\r\n\r\n const defaults = createDefaults(options.defaults);\r\n const display = createDisplay(options.display, options.ssr);\r\n const locale = createLocaleManager(options.locale ?? {}); // @todo: <--- YOU ARE HERE!\r\n const date = createDate(options.date, locale);\r\n\r\n const install = (app: App) => {\r\n // Install Directives\r\n for (const key in directives) {\r\n app.directive(key, directives[key]);\r\n }\r\n\r\n // Install Components\r\n for (const key in components) {\r\n app.component(key, components[key]);\r\n }\r\n\r\n // Install Services\r\n for (const key in services) {\r\n app.use(services[key]);\r\n }\r\n\r\n // Add default `provide` symbols\r\n app.provide(DefaultsSymbol, defaults);\r\n app.provide(DisplaySymbol, display);\r\n app.provide(LocaleSymbol, locale);\r\n app.provide(DateAdapterSymbol, date);\r\n\r\n if (Browser.hasWindow && options.ssr) {\r\n if (\"$nuxt\" in app) {\r\n (app.$nuxt as NuxtApp).hook(\"app:suspense:resolve\", () => {\r\n display.update();\r\n });\r\n } else {\r\n const { mount } = app;\r\n app.mount = (...args) => {\r\n const vm = mount(...args);\r\n nextTick(() => display.update());\r\n app.mount = mount;\r\n return vm;\r\n };\r\n }\r\n }\r\n\r\n getNextId.reset();\r\n };\r\n\r\n return {\r\n install,\r\n defaults,\r\n display,\r\n locale,\r\n date,\r\n };\r\n}\r\n","import \"./css/core.scss\";\r\n\r\nimport * as components from \"./components\";\r\nimport * as directives from \"./directives\";\r\nimport * as services from \"./services\";\r\nimport { createEvanceUi as _createEvanceUi } from \"./framework\";\r\n\r\nimport type { EvanceUiOptions } from \"./framework\";\r\n\r\nexport const createEvanceUi = (options: EvanceUiOptions = {}) => {\r\n return _createEvanceUi({ components, directives, services, ...options });\r\n};\r\n\r\nexport { components, directives, services };\r\n\r\nexport * from \"./composables\";\r\n\r\nexport * from \"./components\";\r\nexport * from \"./directives\";\r\nexport * from \"./services\";\r\n"],"names":["side","alignment","selector","isRtl","anchor","value","a","b","keysInA","keysInB","key","el","keyframes","options","animation","resolve","reject","callback","frame","props","source","defaults","obj","prop","definition","prefix","exclude","exclusion","kebabValue","group","isActive","defaultVariant","appearanceName","computed","appearance","unref","appearanceClass","variantName","variant","variantClass","isIncludeHidden","axis","stopAt","elements","style","hasScrollbarX","hasScrollbarY","propName","position","focusedElement","focusableElements","index","lastElement","lastIndex","increment","filterByTabIndex","selectors","name","capitalize","onScroll","scrollElements","onScopeDispose","k","handler","v","n","fn","_handler","_Browser","__publicField","_b","_a","vnode","child","targets","s","callee","component","getCurrentInstance","message","x","y","width","height","offset","rect","beforeTransforms","tx","ta","sx","sy","dx","dy","to","w","h","target","id","subject","property","fallback","objectPath","propertyKeys","lastValue","path","pattern","paths","matching","remaining","attrs","min","max","getter","refs","reactive","base","watchEffect","toRefs","arrayFn","out","sourceProperty","targetProperty","length","start","clone","o","provides","now","e","isPrintableChar","noModifier","values","camelValue","_","match","template","defaultVariables","variablePattern","variables","dictionary","raw","variable","str","char","targetString","trimChars","unit","_hoisted_1","_hoisted_2","_createElementVNode","_hoisted_3","render","_ctx","_cache","_openBlock","_createElementBlock","_hoisted_4","sizeClasses","sizeStyles","rounded","isRef","classes","toRaw","languageCode","countryCode","code","matches","codes","_DefaultDateAdapter","date","amount","d","parsed","formatString","newDate","customFormat","comparing","c","weeks","currentWeek","firstDayOfMonth","lastDayOfMonth","firstDayWeekIndex","lastDayWeekIndex","i","adjacentDay","day","firstSundayOf2023","daysFromSunday","weekday","range","year","month","locale","instance","watch","inject","ref","injectedDefaults","providedDefaults","newDefaults","scoped","reset","root","properties","len","provide","componentDefaults","internalProps","propValue","_d","_c","subcomponentDefaults","shallowRef","subComponents","provideSubDefaults","injected","_props","ssr","userAgent","isUserAgent","regexp","thresholds","mobileBreakpoint","platform","state","updateSize","update","xs","sm","md","lg","xl","xxl","breakpointValue","mobile","display","rules","ruleKey","displayKey","displayState","displayRule","acceptKebabs","useXs","breakpoint","className","rule","suffix","defaultLocale","currentLocale","translationCodes","val","translationCode","reference","data","keyToPluralize","text","translationData","messages","translatableKey","translatable","languagePack","packs","pack","localeOptions","localeCode","localeManager","manager","rtlClasses","dialogService","service","slots","definedProps","useAttrs","iconColor","iconGlyph","defaultTransition","transition","disabled","remainingProps","transitionComponent","Transition","customProps","transitionProps","mergeProps","_useSlots","aspectStyles","dimensionStyles","currentSrc","image","naturalWidth","naturalHeight","normalisedSrc","imgSrc","aspectRatio","objectFitClasses","getSrc","img","init","isIntersecting","lazyImg","pollForSize","nextTick","emit","onError","onLoad","timer","timeout","poll","imgHeight","imgWidth","oldVal","onBeforeMount","windowWidth","onWindowResize","onMounted","onBeforeUnmount","newWidth","oldWidth","isBooted","stop","isLoaded","responsiveProps","EvResponsive","imgProps","roundedClasses","opposite","getOffset","styles","scope","effectScope","watchCallback","active","watchOptions","vueInstance","modelName","defaultValue","transformIn","transformOut","modelRef","modelNameKebab","isCheckKebabName","isModelAvailable","model","externalValue","internalValue","newValue","modelValue","contentNumber","content","positionStyles","isInline","routerLink","resolveDynamicComponent","isLink","isClickable","toRef","link","router","isPopped","removeBefore","removeAfter","onPopState","from","next","items","ids","item","itemByIndex","itemIndex","injectKey","isUnmounted","selected","groupComponent","register","itemComponent","unwrapped","unregister","forceMandatoryValue","select","isSelected","step","currentId","currentIndex","newIndex","newItem","required","selectedClass","selectedAppearance","selectedVariant","container","defaultRadius","getSizeWithUnits","getCircumference","getRadius","getContainerWidth","getProgressOffset","getThickness","getRotation","maxThickness","thickness","slotName","slot","node","useSlots","hasDefaultSlot","isDisabled","isIconLike","icon","componentElement","onClick","valueAttr","__expose","previous","groupProps","EvButtonGroup","slotProps","isValid","isReadonly","validateOn","field","valid","results","fieldErrors","fieldError","form","unwatch","set","validator","silent","result","modelProxy","trueValue","falseValue","isChecked","containerRef","inputRef","containerAttrs","inputAttrs","formField","getInputElement","onInput","dateAdapter","displayValue","weeksInMonth","days","daysInMonth","lastDay","week","today","isoDate","isAdjacent","isInRange","isRangeStart","isRangeEnd","allowedDate","getDayAppearance","getDayVariant","startDate","endDate","selection","parent","title","children","itemProps","transformedItemProps","listItems","hasNullItem","isRequired","strategy","parents","original","childrenIds","everySelected","cid","noneSelected","arr","map","selectFn","reducer","on","selections","parentStrategy","rest","singleSelection","opened","newOpened","selectStrategy","openStrategy","getPath","nested","event","newSelected","parentId","isGroup","list","idSymbol","idComputed","hasSuffixSlot","hasPrefixSlot","isActiveExact","iconStart","iconEnd","getComponentElement","getTabIndex","onKeyDown","isFocused","lastFocus","tabindex","dimensions","onFocus","focus","onFocusIn","onFocusOut","currentYear","minYear","maxYear","years","listRef","scrollIntoView","selectedEl","months","getAppearance","getVariant","hiddenClasses","hiddenAttribute","heightStyles","widthStyles","alignItemsClasses","alignContentClasses","justifyContentClasses","gutterClasses","orderClasses","offsetClasses","alignSelfClasses","isReversing","oldValue","before","after","viewMode","monthProps","EvDatePickerMonth","monthText","toggleViewMonth","yearProps","EvDatePickerYears","yearText","toggleViewYear","minDate","maxDate","onClickNext","onClickPrevious","getPercentageTranslation","getSizeHeight","isSizeNumeric","isClearable","onClearableClick","$event","onClearableMousedown","onControlClick","onControlMousedown","vAutofocus","onClickOutside","delays","createDelay","isOpening","duration","isTopOfStack","delayOpen","delayClose","events","menu","canOpenHover","canOpenFocus","activator","activatorProps","contentStyles","newActivatorEl","newContentEl","oldActivatorEl","oldContentEl","preferredPosition","preferredOrigin","origin","scrollParents","contentEl","viewportRect","currentRect","elRect","isDocEl","scrollRect","zones","placement","autoZone","zone","divider","positions","newPosition","dimension","viewport","offsetSide","offsetAlign","sides","alignments","sideAttrs","align","alignAttrs","rectProps","zoneA","zoneB","updatePosition","onResize","positionStrategyFn","offsetParent","scrollbarWidth","scrollableParent","slow","raf","ric","cb","getChildren","els","getDimensions","targetBox","elBox","elStyle","originX","originY","anchorSide","anchorOffset","offsetX","offsetY","targetScaleX","targetScaleY","maxScale","scaleX","scaleY","screenPercentage","speedFactor","onBeforeEnter","onEnter","done","onAfterEnter","onBeforeLeave","onLeave","onAfterLeave","EvMenuTransition","targetValue","targetElement","containerElement","stackEntry","lastZIndex","zIndex","isDisableGlobalStack","isCreateStackEntry","parentStack","stack","zIndexRef","isTopGlobal","isTop","isTopLocal","readonly","NavigationType","NavigationDirection","Symbol","process","env","NODE_ENV","NavigationFailureType","routerKey","useRouter","scopeId","containerEl","contentTransition","isActiveContent","stackStyles","activatorEl","activatorRef","activatorEvents","contentEvents","veilEvents","teleportTarget","isActiveVeil","isActiveTeleport","clickOutsideCondition","dismiss","focusActivator","clickOutsideDirectiveArgs","onKeydown","top","scrollParent","activatorSlot","contentAttributes","overlayAttributes","uid","overlay","openChildren","onActivatorKeydown","overlayProps","EvOverlay","elevation","makeRoundedClass","makeScrollableClass","scrollable","evMenuRef","evTextfieldRef","evTextfieldProps","EvTextfield","datePickerRef","datePickerProps","EvDatePicker","isMenuOpen","onMenuAfterLeave","onFieldFocus","onFieldBlur","onDatePickerFocusIn","onUpdateModelValue","onClearInput","setModelValue","targetRect","tsx","tsy","maxs","asa","speed","EvDialogTransition","_sfc_render","close","overlayRef","isFullscreen","size","onFocusin","previousEl","targetEl","focusable","firstEl","lastEl","borderColor","borderOpacity","borderStyle","borderWidth","classNames","dialogProps","EvDialog","dialogRef","positionClass","overlayWidth","formRef","onReset","onSubmit","ready","isMaxWidthNumeric","maxWidthOuter","hasActionSlot","isExpanded","t","showExpandable","actions","variantModifier","delay","expand","action","actionDefaults","element","messageProps","EvMessage","startTimer","stopTimer","renderedProps","renderedSlots","internalSlots","notification","notifications","formatter","error","numberParser","inputValue","minimum","maximum","incrementAmount","incrementInterval","isIncrementing","getDecimalPlaces","fraction","part","getValue","isMinBoundary","isMaxBoundary","decimalPlaces","onBlur","parsedValue","currentValue","onInputKeydown","startIncrementing","isPaste","onInputKeyup","stopIncrementing","onPaste","direction","startTime","internalIncrementAmount","elapsedTime","multiplier","hasPrefix","hasSuffix","iconSize","valueComparator","onSpace","query","array","filter","keys","customFiltersLength","loop","transformed","customMatches","defaultMatches","filterKeys","keyFilter","defaultMatchesLength","customMatchesLength","filteredItems","filteredMatches","transformedItems","_query","strQuery","originalItems","_filteredItems","_filteredMatches","getMatches","textFieldRef","isScrolling","scrollTimeout","onListScroll","finishScrolling","onListKeydown","bottom","box","resizeRef","contentRect","observer","entries","first","baseItemHeight","itemHeight","sizeMap","sizes","visibleItems","handleItemResize","calculateOffset","acc","calculateMidPointIndex","scrollTop","end","middle","middleOffset","lastScrollTop","handleScroll","midPointIndex","buffer","firstIndex","scrollToIndex","last","computedItems","paddingTop","paddingBottom","functions","mode","expandedParentClass","sizeProperty","offsetProperty","camelize","resetStyles","initialStyle","closeLabel","tag","onClickClose","hasFilter","defaultSlotProps","hasPrefixMedia","hasSuffixMedia","isPristine","isSearchable","listHasFocus","isSelecting","menuOpenProxy","isMenuDisabled","evListRef","evVirtualScrollRef","search","displayItems","filteredItem","selectionIndex","keyLogger","highlightFirst","onListFocusIn","onListFocusOut","onListMouseDown","onFieldChange","onFieldClear","onFieldInput","onFieldKeydown","preventKeys","openerKeys","escapeKeys","keydownBehaviorSelect","selectionStart","originalSelectionIndex","selectedItem","_e","scrollIndex","onFieldMousedown","add","fieldValue","onModelValueUpdate","itemRef","createTagProps","lastSelectedItem","validationValue","isPlaceholder","selectedElement","containerSize","contentSize","currentScrollOffset","isHorizontal","clientSize","offsetStart","adjustedOffsetStart","totalSize","itemOffset","additionalOffset","offsetCentered","isOverflowing","scrollOffset","disableTransition","containerRect","contentRef","firstSelectedIndex","lastSelectedIndex","location","onFocusout","startTouch","startOffset","onTouchstart","onTouchmove","sign","onTouchend","maxScrollOffset","scrollTo","newAbsoluteOffset","arrowsHiddenClasses","arrowsHiddenAttribute","scrollAmount","hasPrevious","hasNext","hasAffix","arrowsAlignClass","iconNext","iconPrevious","slideGroupItem","rootEl","buttonProps","EvButton","sliderEl","updateSlider","prevEl","nextEl","color","prevBox","nextBox","xy","XY","rightBottom","widthHeight","prevPos","nextPos","delta","scale","initialScale","sigma","parseItems","parsedItems","slideGroupProps","EvSlideGroup","alignTabsClass","resize","onKeyup","onKeyupEnter","onUpdated","binding","onMousedown","app","mounted","modifiers","_observe","entry","unmounted","observe","subComponentVNode","wrapper","touchstartX","touchendX","touchstartY","touchendY","dirRatio","minDistance","touch","handlers","eventName","rootRef","isRtlReverse","isReversed","transitionCount","transitionHeight","activeIndex","newVal","itemsLength","canMoveBack","canMoveForward","touchOptions","originalEvent","previousProps","nextProps","vTouch","hasContent","window","groupItem","isTransitioning","hasTransition","onAfterTransition","onBeforeTransition","onTransitionCancelled","onEnterTransition","renderer","response","renderedDialog","renderedComponent","EvDrawer","createEvanceUi","evanceUi","blueprint","components","directives","services","mount","args","vm","_createEvanceUi"],"mappings":"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EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,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","x_google_ignoreList":[152]}
|