@leavepulse/ui 0.43.4 → 0.45.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +121 -7
- package/dist/assets/{LpCommandPalette-B-0Est4Z.css → LpCommandPalette-nGNnzXqQ.css} +21 -21
- package/dist/assets/{LpDropzone-BBoWvi-J.css → LpDropzone-i4BdMi1H.css} +12 -12
- package/dist/assets/{LpImageEditor-Ct7Y3aNu.css → LpImageEditor-CbMA82g8.css} +6 -6
- package/dist/assets/{LpRollingText-CR1mb0Vt.css → LpRollingText-BGnE6q9j.css} +3 -0
- package/dist/assets/{LpShortcutsDialog-C6YoQ8_M.css → LpShortcutsDialog-CqYX3yy6.css} +28 -7
- package/dist/assets/{LpSkeleton-D7xU8IPV.css → LpSkeleton-H3Z5dEIk.css} +4 -1
- package/dist/assets/{LpTable-BgPLJOXa.css → LpTable-CPwWxTJS.css} +49 -9
- package/dist/chunks/ContextMenuItems-BtKU7074.js +124 -0
- package/dist/chunks/{LayoutCanvas-Dd20boUG.js → LayoutCanvas-BkaGXTjx.js} +26 -9
- package/dist/chunks/{LayoutNode-DGpZA9LX.js → LayoutNode-B3_9E1Xa.js} +28 -12
- package/dist/chunks/{LpActionBar-BlvtGB2P.js → LpActionBar-CnfFVIwC.js} +26 -12
- package/dist/chunks/{LpAddressInput-B-Zvxsn7.js → LpAddressInput-BwX8uo4_.js} +54 -49
- package/dist/chunks/{LpAlert-BAYHDSS1.js → LpAlert-B6ilrM7T.js} +16 -9
- package/dist/chunks/{LpAppShell-BGQVIY-3.js → LpAppShell-C53_RaGF.js} +53 -26
- package/dist/chunks/{LpAutocomplete-DExlIZe_.js → LpAutocomplete-C8IgSMsi.js} +52 -24
- package/dist/chunks/{LpAvatar-B3-xAOH3.js → LpAvatar-C1XStdOo.js} +19 -10
- package/dist/chunks/LpBreadcrumbs-CQJd73Gm.js +95 -0
- package/dist/chunks/{LpButton-5VXXCjwF.js → LpButton-CKSwC6Mu.js} +45 -15
- package/dist/chunks/{LpCalendar-B7Ko5RdR.js → LpCalendar-DrA2McTU.js} +1 -1
- package/dist/chunks/{LpCard-BhI1N_vL.js → LpCard-C2IvucmX.js} +1 -1
- package/dist/chunks/{LpCheckbox-CVccKYaH.js → LpCheckbox-Bkj13CbW.js} +8 -4
- package/dist/chunks/{LpCodeBlock-Bo0B4TFR.js → LpCodeBlock-ca7ANFyW.js} +49 -17
- package/dist/chunks/{LpColorPicker-BlXea7LM.js → LpColorPicker-zz4VGkG4.js} +75 -26
- package/dist/chunks/{LpConfirmDialog-Q-bxff8z.js → LpConfirmDialog-DCw5jR1t.js} +59 -17
- package/dist/chunks/LpConfirmHost-CbywMpMP.js +49 -0
- package/dist/chunks/LpContextMenu-BqkAYa9X.js +69 -0
- package/dist/chunks/LpDatePicker-DuusgT69.js +195 -0
- package/dist/chunks/LpDateRangePicker-DHeuznfC.js +208 -0
- package/dist/chunks/{LpDisclosure-ChQYmjlR.js → LpDisclosure-Cc23-JOT.js} +1 -1
- package/dist/chunks/{LpDrawer-BZ6k3hvo.js → LpDrawer-Dt4aB4Fr.js} +65 -28
- package/dist/chunks/{LpDropdownMenu-DJpoqRCb.js → LpDropdownMenu-DdJGQzPn.js} +2 -1
- package/dist/chunks/{LpEmptyState-Dsdqz1Wj.js → LpEmptyState-BJbZXC8D.js} +1 -1
- package/dist/chunks/LpFieldNotice-wtieLUTj.js +64 -0
- package/dist/chunks/{LpFileTree-_5vFBgaK.js → LpFileTree-CNurOvkV.js} +25 -10
- package/dist/chunks/{LpFileTreeNode-BdcIYKIE.js → LpFileTreeNode-D_qRRdsH.js} +3 -3
- package/dist/chunks/LpFormField-CtVYj6tO.js +101 -0
- package/dist/chunks/{LpIcon-CCnX5_2j.js → LpIcon-DYtaid0K.js} +20 -6
- package/dist/chunks/{LpInput-9EXWUM9B.js → LpInput-D-YGQbEv.js} +58 -20
- package/dist/chunks/{LpLightbox-2sYVMY-S.js → LpLightbox-DSDahF23.js} +148 -61
- package/dist/chunks/{LpLink-DCND-zyu.js → LpLink-Krkjhe_y.js} +15 -6
- package/dist/chunks/{LpLogViewer-CaRy5MeS.js → LpLogViewer-KypbgOyo.js} +300 -72
- package/dist/chunks/{LpMapPicker-ul4oYno6.js → LpMapPicker-Cc84LaM3.js} +39 -14
- package/dist/chunks/{LpMediaGallery-FF-NquIo.js → LpMediaGallery-YKr-cQPN.js} +7 -4
- package/dist/chunks/{LpModal-Bt0pQCI_.js → LpModal-DMMDQHAu.js} +52 -29
- package/dist/chunks/{LpModalNav-YaifHrXC.js → LpModalNav-BVPDyIup.js} +10 -7
- package/dist/chunks/{LpNotificationBell-DyGGsMAM.js → LpNotificationBell-CCwyJP5C.js} +79 -33
- package/dist/chunks/{LpNumberField-CWuX08iX.js → LpNumberField-B77O-z28.js} +21 -8
- package/dist/chunks/{LpNumberFlow-amWYaeuA.js → LpNumberFlow-z4WPZcZu.js} +22 -12
- package/dist/chunks/{LpOtpInput-y2v-pmiN.js → LpOtpInput-CziPF3Oq.js} +37 -8
- package/dist/chunks/{LpPagination-5FxjmmB5.js → LpPagination-BcDlo3r_.js} +31 -20
- package/dist/chunks/{LpPasswordInput--sjYCkLS.js → LpPasswordInput-eKzQhbQP.js} +11 -8
- package/dist/chunks/LpPhoneInput-BCbrrhgE.js +336 -0
- package/dist/chunks/{LpPie-D6OnzwlJ.js → LpPie-BEJ2SfI6.js} +84 -28
- package/dist/chunks/{LpPopover-8268UmlC.js → LpPopover-DCKeqiVn.js} +5 -2
- package/dist/chunks/{LpProgress-Btq5W4Ut.js → LpProgress-CBU1iI69.js} +5 -4
- package/dist/chunks/{LpRadioGroup-xPIuVDO_.js → LpRadioGroup-DmEW0l78.js} +9 -2
- package/dist/chunks/LpRangeCalendar-DZuaRV0W.js +331 -0
- package/dist/chunks/{LpRollingText-CM5gkSeF.js → LpRollingText-DB7upf-5.js} +1 -1
- package/dist/chunks/{LpScrollArea-D8xyKXcF.js → LpScrollArea-Bry1fdOM.js} +14 -2
- package/dist/chunks/{LpSection-aM6J_u51.js → LpSection-tKEH0jYf.js} +1 -1
- package/dist/chunks/{LpSegmented-fV0Sk92p.js → LpSegmented-C09EEam2.js} +8 -4
- package/dist/chunks/{LpSelect-ANIVtrpM.js → LpSelect-DNIL6MB9.js} +50 -31
- package/dist/chunks/{LpSidebar-ClBUwoEz.js → LpSidebar-CQNB0-yU.js} +30 -22
- package/dist/chunks/{LpSidebarNav-llOcs_Fn.js → LpSidebarNav-kx-LdqNU.js} +16 -11
- package/dist/chunks/{LpSkeleton-CTI-vBgW.js → LpSkeleton-BB6XIV-w.js} +1 -1
- package/dist/chunks/{LpSlider-BwNIBkAK.js → LpSlider-Cuzmrd7p.js} +7 -2
- package/dist/chunks/{LpSparkline-C6xQ2dwv.js → LpSparkline-CB80N8SJ.js} +11 -4
- package/dist/chunks/{LpStat-CQaW8R--.js → LpStat-B-7udBRP.js} +2 -2
- package/dist/chunks/{LpStepper-Bk-XaQYU.js → LpStepper-C7XiVKZj.js} +34 -19
- package/dist/chunks/{LpSwitch-Blizvqyt.js → LpSwitch-OrcOJX9m.js} +41 -27
- package/dist/chunks/LpTableFilter-BV8PpLM9.js +158 -0
- package/dist/chunks/{LpTableOfContents-CjvxPMpU.js → LpTableOfContents-BUcAfGPQ.js} +36 -41
- package/dist/chunks/{LpTabs-Cefe_lys.js → LpTabs-29iW1XOx.js} +20 -6
- package/dist/chunks/LpTagsInput-D1SuqbhB.js +300 -0
- package/dist/chunks/LpTextarea-uuScWo6-.js +77 -0
- package/dist/chunks/LpThemeProvider-Be4r2TQX.js +35 -0
- package/dist/chunks/LpThemeSwitcher-B4aVPbNC.js +166 -0
- package/dist/chunks/{LpTilt-DuyKbpkA.js → LpTilt-B7KHX1zH.js} +2 -2
- package/dist/chunks/{LpTimeField-K6nAGboX.js → LpTimeField-Cqe7fXnh.js} +14 -8
- package/dist/chunks/{LpToaster-gDB1EaU3.js → LpToaster-DpJvoCOh.js} +94 -31
- package/dist/chunks/{LpTooltip-hCLPAqMG.js → LpTooltip-CXVKcOXT.js} +14 -6
- package/dist/chunks/LpTooltipProvider-CftjV7Xc.js +25 -0
- package/dist/chunks/{LpTopologyCanvas-Cm1L39uL.js → LpTopologyCanvas-6ozNrQKh.js} +8 -2
- package/dist/chunks/{LpUptimeBar-DvAMno0S.js → LpUptimeBar-ugcv25xj.js} +44 -15
- package/dist/chunks/icons-CkA0njzm.js +43 -0
- package/dist/chunks/{LpThemeSwitcher-Cue-myST.js → useTheme-DJm1JSsY.js} +215 -260
- package/dist/component-names.d.ts +1 -1
- package/dist/components/ContextMenuItems.vue.d.ts +8 -0
- package/dist/components/ContextMenuItems.vue.js +4 -0
- package/dist/components/LayoutCanvas.vue.js +1 -1
- package/dist/components/LayoutNode.vue.d.ts +4 -0
- package/dist/components/LayoutNode.vue.js +1 -1
- package/dist/components/LpActionBar.vue.d.ts +3 -0
- package/dist/components/LpActionBar.vue.js +1 -1
- package/dist/components/LpAddressInput.vue.d.ts +1 -1
- package/dist/components/LpAddressInput.vue.js +1 -1
- package/dist/components/LpAlert.vue.d.ts +9 -0
- package/dist/components/LpAlert.vue.js +1 -1
- package/dist/components/LpAppShell.vue.d.ts +10 -0
- package/dist/components/LpAppShell.vue.js +1 -1
- package/dist/components/LpAutocomplete.vue.d.ts +31 -6
- package/dist/components/LpAutocomplete.vue.js +1 -1
- package/dist/components/LpAvatar.vue.d.ts +3 -3
- package/dist/components/LpAvatar.vue.js +1 -1
- package/dist/components/LpBadge.vue.d.ts +2 -2
- package/dist/components/LpBreadcrumbs.vue.d.ts +13 -9
- package/dist/components/LpBreadcrumbs.vue.js +1 -1
- package/dist/components/LpButton.vue.d.ts +35 -98
- package/dist/components/LpButton.vue.js +1 -1
- package/dist/components/LpCalendar.vue.js +1 -1
- package/dist/components/LpCard.vue.js +1 -1
- package/dist/components/LpChart.vue.d.ts +47 -3
- package/dist/components/LpChart.vue.js +377 -97
- package/dist/components/LpCheckbox.vue.js +1 -1
- package/dist/components/LpCodeBlock.vue.d.ts +2 -0
- package/dist/components/LpCodeBlock.vue.js +1 -1
- package/dist/components/LpColorPicker.vue.d.ts +2 -2
- package/dist/components/LpColorPicker.vue.js +1 -1
- package/dist/components/LpCommandPalette.vue.d.ts +14 -3
- package/dist/components/LpCommandPalette.vue.js +142 -77
- package/dist/components/LpConfirmDialog.vue.d.ts +15 -3
- package/dist/components/LpConfirmDialog.vue.js +1 -1
- package/dist/components/LpConfirmHost.vue.d.ts +9 -0
- package/dist/components/LpConfirmHost.vue.js +4 -0
- package/dist/components/LpContextMenu.vue.d.ts +3 -5
- package/dist/components/LpContextMenu.vue.js +1 -1
- package/dist/components/LpDatePicker.vue.d.ts +24 -6
- package/dist/components/LpDatePicker.vue.js +1 -1
- package/dist/components/LpDateRangePicker.vue.d.ts +60 -0
- package/dist/components/LpDateRangePicker.vue.js +4 -0
- package/dist/components/LpDisclosure.vue.js +1 -1
- package/dist/components/LpDrawer.vue.d.ts +10 -0
- package/dist/components/LpDrawer.vue.js +1 -1
- package/dist/components/LpDropdownMenu.vue.js +1 -1
- package/dist/components/LpDropzone.vue.js +23 -7
- package/dist/components/LpEmptyState.vue.js +1 -1
- package/dist/components/LpFieldNotice.vue.d.ts +8 -0
- package/dist/components/LpFieldNotice.vue.js +4 -0
- package/dist/components/LpFileTree.vue.d.ts +11 -2
- package/dist/components/LpFileTree.vue.js +1 -1
- package/dist/components/LpFileTreeNode.vue.js +1 -1
- package/dist/components/LpFormField.vue.d.ts +13 -1
- package/dist/components/LpFormField.vue.js +1 -1
- package/dist/components/LpIcon.vue.d.ts +0 -1
- package/dist/components/LpIcon.vue.js +1 -1
- package/dist/components/LpImageEditor.vue.js +93 -58
- package/dist/components/LpInput.vue.d.ts +22 -3
- package/dist/components/LpInput.vue.js +1 -1
- package/dist/components/LpLightbox.vue.d.ts +17 -0
- package/dist/components/LpLightbox.vue.js +1 -1
- package/dist/components/LpLink.vue.d.ts +11 -11
- package/dist/components/LpLink.vue.js +1 -1
- package/dist/components/LpLogViewer.vue.d.ts +72 -3
- package/dist/components/LpLogViewer.vue.js +1 -1
- package/dist/components/LpMapPicker.vue.d.ts +4 -4
- package/dist/components/LpMapPicker.vue.js +1 -1
- package/dist/components/LpMediaGallery.vue.js +1 -1
- package/dist/components/LpModal.vue.d.ts +16 -6
- package/dist/components/LpModal.vue.js +1 -1
- package/dist/components/LpModalNav.vue.d.ts +0 -1
- package/dist/components/LpModalNav.vue.js +1 -1
- package/dist/components/LpNotificationBell.vue.d.ts +11 -2
- package/dist/components/LpNotificationBell.vue.js +1 -1
- package/dist/components/LpNumberField.vue.d.ts +2 -0
- package/dist/components/LpNumberField.vue.js +1 -1
- package/dist/components/LpNumberFlow.vue.js +1 -1
- package/dist/components/LpOtpInput.vue.js +1 -1
- package/dist/components/LpPagination.vue.d.ts +2 -0
- package/dist/components/LpPagination.vue.js +1 -1
- package/dist/components/LpPasswordInput.vue.js +1 -1
- package/dist/components/LpPhoneInput.vue.d.ts +13 -0
- package/dist/components/LpPhoneInput.vue.js +1 -1
- package/dist/components/LpPie.vue.d.ts +21 -2
- package/dist/components/LpPie.vue.js +1 -1
- package/dist/components/LpPopover.vue.d.ts +2 -0
- package/dist/components/LpPopover.vue.js +1 -1
- package/dist/components/LpProgress.vue.d.ts +1 -1
- package/dist/components/LpProgress.vue.js +1 -1
- package/dist/components/LpRadioGroup.vue.js +1 -1
- package/dist/components/LpRangeCalendar.vue.d.ts +51 -0
- package/dist/components/LpRangeCalendar.vue.js +4 -0
- package/dist/components/LpRollingText.vue.d.ts +1 -1
- package/dist/components/LpRollingText.vue.js +1 -1
- package/dist/components/LpScrollArea.vue.d.ts +2 -2
- package/dist/components/LpScrollArea.vue.js +1 -1
- package/dist/components/LpSection.vue.d.ts +1 -1
- package/dist/components/LpSection.vue.js +1 -1
- package/dist/components/LpSegmented.vue.d.ts +5 -0
- package/dist/components/LpSegmented.vue.js +1 -1
- package/dist/components/LpSelect.vue.d.ts +1 -0
- package/dist/components/LpSelect.vue.js +1 -1
- package/dist/components/LpShortcutsDialog.vue.d.ts +7 -1
- package/dist/components/LpShortcutsDialog.vue.js +60 -15
- package/dist/components/LpSidebar.vue.d.ts +6 -2
- package/dist/components/LpSidebar.vue.js +1 -1
- package/dist/components/LpSidebarNav.vue.js +1 -1
- package/dist/components/LpSkeleton.vue.js +1 -1
- package/dist/components/LpSlider.vue.js +1 -1
- package/dist/components/LpSparkline.vue.d.ts +1 -0
- package/dist/components/LpSparkline.vue.js +1 -1
- package/dist/components/LpStat.vue.js +1 -1
- package/dist/components/LpStepper.vue.js +1 -1
- package/dist/components/LpSwitch.vue.js +1 -1
- package/dist/components/LpTable.vue.d.ts +107 -3
- package/dist/components/LpTable.vue.js +540 -128
- package/dist/components/LpTableFilter.vue.d.ts +31 -0
- package/dist/components/LpTableFilter.vue.js +4 -0
- package/dist/components/LpTableOfContents.vue.d.ts +4 -2
- package/dist/components/LpTableOfContents.vue.js +1 -1
- package/dist/components/LpTabs.vue.d.ts +2 -0
- package/dist/components/LpTabs.vue.js +1 -1
- package/dist/components/LpTagsInput.vue.d.ts +77 -0
- package/dist/components/LpTagsInput.vue.js +4 -0
- package/dist/components/LpTextarea.vue.d.ts +19 -6
- package/dist/components/LpTextarea.vue.js +1 -1
- package/dist/components/LpThemeProvider.vue.d.ts +22 -0
- package/dist/components/LpThemeProvider.vue.js +4 -0
- package/dist/components/LpThemeSwitcher.vue.d.ts +15 -2
- package/dist/components/LpThemeSwitcher.vue.js +1 -1
- package/dist/components/LpTilt.vue.js +1 -1
- package/dist/components/LpTimeField.vue.js +1 -1
- package/dist/components/LpToaster.vue.d.ts +6 -1
- package/dist/components/LpToaster.vue.js +1 -1
- package/dist/components/LpTooltip.vue.d.ts +1 -2
- package/dist/components/LpTooltip.vue.js +1 -1
- package/dist/components/LpTooltipProvider.vue.d.ts +22 -0
- package/dist/components/LpTooltipProvider.vue.js +4 -0
- package/dist/components/LpTopologyCanvas.vue.js +1 -1
- package/dist/components/LpUptimeBar.vue.d.ts +4 -0
- package/dist/components/LpUptimeBar.vue.js +1 -1
- package/dist/components/chart.d.ts +32 -1
- package/dist/components/chart.js +42 -6
- package/dist/components/codeHighlight.d.ts +6 -0
- package/dist/components/codeHighlight.js +92 -20
- package/dist/components/color.d.ts +1 -1
- package/dist/components/color.js +20 -9
- package/dist/components/commandSearch.js +3 -0
- package/dist/components/confirm.d.ts +25 -0
- package/dist/components/confirm.js +26 -0
- package/dist/components/countries.d.ts +6 -0
- package/dist/components/countries.js +7 -0
- package/dist/components/dateRange.d.ts +43 -0
- package/dist/components/dateRange.js +76 -0
- package/dist/components/exportData.d.ts +58 -0
- package/dist/components/exportData.js +165 -0
- package/dist/components/fileTree.js +16 -7
- package/dist/components/imageCrop.d.ts +42 -0
- package/dist/components/imageCrop.js +47 -0
- package/dist/components/link.d.ts +12 -0
- package/dist/components/link.js +19 -0
- package/dist/components/logSearch.d.ts +18 -0
- package/dist/components/logSearch.js +36 -0
- package/dist/components/modalDepth.d.ts +18 -2
- package/dist/components/modalDepth.js +17 -5
- package/dist/components/otp.d.ts +5 -0
- package/dist/components/otp.js +10 -0
- package/dist/components/phone.d.ts +41 -0
- package/dist/components/phone.js +80 -0
- package/dist/components/sidebar.d.ts +7 -1
- package/dist/components/tableFilter.d.ts +36 -0
- package/dist/components/tableFilter.js +84 -0
- package/dist/components/tableSort.d.ts +8 -0
- package/dist/components/tableSort.js +31 -0
- package/dist/components/tags.d.ts +20 -0
- package/dist/components/tags.js +37 -0
- package/dist/composables/useField.d.ts +38 -0
- package/dist/composables/useField.js +45 -0
- package/dist/composables/useFieldNotice.d.ts +17 -0
- package/dist/composables/useFieldNotice.js +28 -0
- package/dist/composables/useForm.d.ts +53 -0
- package/dist/composables/useForm.js +207 -0
- package/dist/composables/useFormDraft.d.ts +10 -3
- package/dist/composables/useFormDraft.js +9 -14
- package/dist/composables/useHotkeys.d.ts +81 -5
- package/dist/composables/useHotkeys.js +223 -25
- package/dist/composables/useInputFilter.d.ts +17 -0
- package/dist/composables/useInputFilter.js +47 -10
- package/dist/composables/useInputMask.d.ts +59 -0
- package/dist/composables/useInputMask.js +170 -0
- package/dist/composables/useLpConfig.d.ts +24 -0
- package/dist/composables/useLpConfig.js +44 -0
- package/dist/composables/usePaintSelect.d.ts +22 -0
- package/dist/composables/usePaintSelect.js +169 -0
- package/dist/composables/useRovingFocus.js +7 -0
- package/dist/composables/useShift.js +7 -2
- package/dist/composables/useTilt.d.ts +2 -2
- package/dist/composables/useTilt.js +5 -6
- package/dist/composables/useToast.d.ts +20 -0
- package/dist/composables/useToast.js +28 -4
- package/dist/composables/useZoomPan.d.ts +3 -3
- package/dist/composables/useZoomPan.js +4 -4
- package/dist/icons-all.d.ts +1 -0
- package/dist/icons-all.js +3 -0
- package/dist/icons.d.ts +14 -1
- package/dist/index.d.ts +60 -4
- package/dist/index.js +245 -141
- package/dist/kit-icons.d.ts +2 -0
- package/dist/layout/tree.d.ts +2 -0
- package/dist/layout/tree.js +16 -1
- package/dist/layout/useLayout.d.ts +15 -0
- package/dist/layout/useLayout.js +41 -14
- package/dist/theme/backdrop.d.ts +12 -0
- package/dist/theme/presets.d.ts +0 -2
- package/dist/theme/useTheme.d.ts +32 -9
- package/package.json +18 -8
- package/src/component-names.ts +9 -7
- package/src/components/ContextMenuItems.vue +88 -0
- package/src/components/LayoutCanvas.vue +26 -6
- package/src/components/LayoutNode.vue +30 -4
- package/src/components/LpActionBar.vue +31 -8
- package/src/components/LpAddressInput.vue +57 -41
- package/src/components/LpAlert.vue +16 -3
- package/src/components/LpAppShell.vue +45 -12
- package/src/components/LpAutocomplete.vue +47 -10
- package/src/components/LpAvatar.vue +20 -6
- package/src/components/LpBreadcrumbs.vue +65 -41
- package/src/components/LpButton.vue +60 -14
- package/src/components/LpChart.vue +351 -28
- package/src/components/LpCheckbox.vue +7 -3
- package/src/components/LpCodeBlock.vue +50 -14
- package/src/components/LpColorPicker.vue +73 -10
- package/src/components/LpCommandPalette.vue +115 -20
- package/src/components/LpConfirmDialog.vue +68 -17
- package/src/components/LpConfirmHost.vue +59 -0
- package/src/components/LpContextMenu.vue +15 -116
- package/src/components/LpDatePicker.vue +104 -68
- package/src/components/LpDateRangePicker.vue +224 -0
- package/src/components/LpDrawer.vue +56 -19
- package/src/components/LpDropdownMenu.vue +1 -0
- package/src/components/LpDropzone.vue +21 -4
- package/src/components/LpFieldNotice.vue +65 -0
- package/src/components/LpFileTree.vue +33 -7
- package/src/components/LpFormField.vue +59 -7
- package/src/components/LpIcon.vue +22 -4
- package/src/components/LpImageEditor.vue +96 -57
- package/src/components/LpInput.vue +62 -11
- package/src/components/LpLightbox.vue +140 -29
- package/src/components/LpLink.vue +24 -13
- package/src/components/LpLogViewer.vue +311 -39
- package/src/components/LpMapPicker.vue +36 -13
- package/src/components/LpMediaGallery.vue +8 -2
- package/src/components/LpModal.vue +54 -28
- package/src/components/LpModalNav.vue +5 -2
- package/src/components/LpNotificationBell.vue +77 -23
- package/src/components/LpNumberField.vue +21 -6
- package/src/components/LpNumberFlow.vue +26 -10
- package/src/components/LpOtpInput.vue +43 -8
- package/src/components/LpPagination.vue +23 -7
- package/src/components/LpPasswordInput.vue +4 -1
- package/src/components/LpPhoneInput.vue +224 -39
- package/src/components/LpPie.vue +102 -20
- package/src/components/LpPopover.vue +4 -0
- package/src/components/LpProgress.vue +5 -3
- package/src/components/LpRadioGroup.vue +9 -2
- package/src/components/LpRangeCalendar.vue +365 -0
- package/src/components/LpRollingText.vue +3 -0
- package/src/components/LpScrollArea.vue +22 -2
- package/src/components/LpSegmented.vue +12 -2
- package/src/components/LpSelect.vue +0 -0
- package/src/components/LpShortcutsDialog.vue +83 -9
- package/src/components/LpSidebar.vue +14 -9
- package/src/components/LpSidebarNav.vue +17 -5
- package/src/components/LpSkeleton.vue +4 -1
- package/src/components/LpSlider.vue +7 -1
- package/src/components/LpSparkline.vue +11 -3
- package/src/components/LpStepper.vue +23 -10
- package/src/components/LpSwitch.vue +31 -8
- package/src/components/LpTable.vue +668 -90
- package/src/components/LpTableFilter.vue +175 -0
- package/src/components/LpTableOfContents.vue +50 -32
- package/src/components/LpTabs.vue +23 -6
- package/src/components/LpTagsInput.vue +364 -0
- package/src/components/LpTextarea.vue +44 -6
- package/src/components/LpThemeProvider.vue +41 -0
- package/src/components/LpThemeSwitcher.vue +76 -33
- package/src/components/LpTilt.vue +2 -2
- package/src/components/LpTimeField.vue +14 -3
- package/src/components/LpToaster.vue +115 -27
- package/src/components/LpTooltip.vue +29 -5
- package/src/components/LpTooltipProvider.vue +24 -0
- package/src/components/LpTopologyCanvas.vue +19 -2
- package/src/components/LpUptimeBar.vue +46 -8
- package/src/components/chart.ts +82 -8
- package/src/components/codeHighlight.ts +111 -15
- package/src/components/color.ts +30 -9
- package/src/components/commandSearch.ts +6 -0
- package/src/components/confirm.ts +58 -0
- package/src/components/countries.ts +12 -0
- package/src/components/dateRange.ts +134 -0
- package/src/components/exportData.ts +228 -0
- package/src/components/fileTree.ts +19 -7
- package/src/components/imageCrop.ts +107 -0
- package/src/components/link.ts +34 -0
- package/src/components/logSearch.ts +46 -0
- package/src/components/modalDepth.ts +48 -6
- package/src/components/otp.ts +16 -0
- package/src/components/phone.ts +140 -0
- package/src/components/sidebar.ts +7 -1
- package/src/components/tableFilter.ts +122 -0
- package/src/components/tableSort.ts +37 -0
- package/src/components/tags.ts +62 -0
- package/src/composables/useField.ts +83 -0
- package/src/composables/useFieldNotice.ts +59 -0
- package/src/composables/useForm.ts +314 -0
- package/src/composables/useFormDraft.ts +25 -20
- package/src/composables/useHotkeys.ts +355 -28
- package/src/composables/useInputFilter.ts +77 -14
- package/src/composables/useInputMask.ts +254 -0
- package/src/composables/useLpConfig.ts +87 -0
- package/src/composables/usePaintSelect.ts +243 -0
- package/src/composables/useRovingFocus.ts +11 -0
- package/src/composables/useShift.ts +13 -2
- package/src/composables/useTilt.ts +5 -6
- package/src/composables/useToast.ts +56 -4
- package/src/composables/useZoomPan.ts +6 -6
- package/src/iconSubset.d.mts +10 -0
- package/src/iconSubset.mjs +51 -0
- package/src/icons-all.ts +10 -0
- package/src/icons.ts +59 -8
- package/src/index.ts +73 -4
- package/src/kit-icons.ts +5 -0
- package/src/layout/tree.ts +30 -0
- package/src/layout/useLayout.ts +68 -18
- package/src/nuxt.ts +87 -17
- package/src/runtime/config.plugin.ts +14 -0
- package/src/runtime/theme.plugin.ts +43 -23
- package/src/theme/backdrop.ts +69 -0
- package/src/theme/presets.ts +6 -64
- package/src/theme/useTheme.ts +206 -100
- package/src/tokens/tokens.css +46 -0
- package/dist/chunks/LpBreadcrumbs-p4jHe_V-.js +0 -62
- package/dist/chunks/LpContextMenu-CwW1QXe_.js +0 -217
- package/dist/chunks/LpDatePicker-CwOToxGq.js +0 -164
- package/dist/chunks/LpFormField-CazBc2-a.js +0 -62
- package/dist/chunks/LpPhoneInput-BDSKVl_z.js +0 -209
- package/dist/chunks/LpTextarea-t7F6gv8E.js +0 -47
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { computed, inject, provide, toValue } from "vue";
|
|
2
|
+
const LP_CONFIG = /* @__PURE__ */ Symbol.for("lp-config");
|
|
3
|
+
function provideLpConfig(config) {
|
|
4
|
+
provide(LP_CONFIG, layered(inject(LP_CONFIG, {}), config));
|
|
5
|
+
}
|
|
6
|
+
function lpConfig(config) {
|
|
7
|
+
return {
|
|
8
|
+
install: (app) => {
|
|
9
|
+
const outer = app.runWithContext(() => inject(LP_CONFIG, {}));
|
|
10
|
+
app.provide(LP_CONFIG, layered(outer, config));
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function layered(outer, inner) {
|
|
15
|
+
return () => mergeConfig(toValue(outer), toValue(inner));
|
|
16
|
+
}
|
|
17
|
+
function mergeConfig(outer, inner) {
|
|
18
|
+
const labels = { ...outer.labels };
|
|
19
|
+
for (const [scope, values] of Object.entries(inner.labels ?? {})) {
|
|
20
|
+
labels[scope] = { ...labels[scope], ...values };
|
|
21
|
+
}
|
|
22
|
+
return { ...outer, ...inner, linkComponent: inner.linkComponent ?? outer.linkComponent, labels };
|
|
23
|
+
}
|
|
24
|
+
function useLpConfig() {
|
|
25
|
+
const config = inject(LP_CONFIG, {});
|
|
26
|
+
return computed(() => toValue(config));
|
|
27
|
+
}
|
|
28
|
+
function useLabels(scope, defaults, own) {
|
|
29
|
+
const config = useLpConfig();
|
|
30
|
+
return computed(() => ({ ...defaults, ...config.value.labels?.[scope], ...own?.() }));
|
|
31
|
+
}
|
|
32
|
+
function useLinkComponent() {
|
|
33
|
+
const config = useLpConfig();
|
|
34
|
+
return computed(() => config.value.linkComponent ?? "a");
|
|
35
|
+
}
|
|
36
|
+
export {
|
|
37
|
+
LP_CONFIG,
|
|
38
|
+
lpConfig,
|
|
39
|
+
mergeConfig,
|
|
40
|
+
provideLpConfig,
|
|
41
|
+
useLabels,
|
|
42
|
+
useLinkComponent,
|
|
43
|
+
useLpConfig
|
|
44
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type MaybeRefOrGetter, type Ref } from "vue";
|
|
2
|
+
import { type HotkeyHelp } from "./useHotkeys";
|
|
3
|
+
export interface UsePaintSelectOptions<K> {
|
|
4
|
+
/** The element that holds the items. */
|
|
5
|
+
root: Ref<HTMLElement | null>;
|
|
6
|
+
selection: () => readonly K[];
|
|
7
|
+
set: (keys: K[]) => void;
|
|
8
|
+
/** Turn painting off without unmounting (e.g. selection mode is off). */
|
|
9
|
+
enabled?: MaybeRefOrGetter<boolean>;
|
|
10
|
+
/** Map an item's `data-paint-key` back to its key. Defaults to the string itself. */
|
|
11
|
+
resolve?: (raw: string) => K | undefined;
|
|
12
|
+
/** Every key, for Ctrl+A while the focus is inside `root`. Omit to leave Ctrl+A alone. */
|
|
13
|
+
selectAll?: () => K[];
|
|
14
|
+
/** How Ctrl+A is listed in the shortcuts reference. */
|
|
15
|
+
help?: MaybeRefOrGetter<HotkeyHelp | undefined>;
|
|
16
|
+
}
|
|
17
|
+
export declare function usePaintSelect<K = string>(options: UsePaintSelectOptions<K>): {
|
|
18
|
+
onPointerDown: (event: PointerEvent, key: K, behaviour?: {
|
|
19
|
+
hold?: number;
|
|
20
|
+
}) => void;
|
|
21
|
+
painting: Readonly<Ref<boolean, boolean>>;
|
|
22
|
+
};
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { ref, toValue, onMounted, onBeforeUnmount, readonly } from "vue";
|
|
2
|
+
import { useHotkeys } from "./useHotkeys.js";
|
|
3
|
+
const HOLD_MS = 320;
|
|
4
|
+
const SLOP_PX = 8;
|
|
5
|
+
const EDGE_PX = 40;
|
|
6
|
+
const SCROLL_STEP = 14;
|
|
7
|
+
function scrollParent(el) {
|
|
8
|
+
for (let node = el?.parentElement; node; node = node.parentElement) {
|
|
9
|
+
const { overflowY } = getComputedStyle(node);
|
|
10
|
+
if ((overflowY === "auto" || overflowY === "scroll") && node.scrollHeight > node.clientHeight) return node;
|
|
11
|
+
}
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
function usePaintSelect(options) {
|
|
15
|
+
const resolve = options.resolve ?? ((raw) => raw);
|
|
16
|
+
let stroke = null;
|
|
17
|
+
let pending = null;
|
|
18
|
+
let swallowClick = false;
|
|
19
|
+
let frame = 0;
|
|
20
|
+
const painting = ref(false);
|
|
21
|
+
const enabled = () => toValue(options.enabled) ?? true;
|
|
22
|
+
function keysInView() {
|
|
23
|
+
const items = options.root.value?.querySelectorAll("[data-paint-key]") ?? [];
|
|
24
|
+
const out = [];
|
|
25
|
+
for (const item of items) {
|
|
26
|
+
if (item.offsetParent === null) continue;
|
|
27
|
+
const key = resolve(item.dataset.paintKey ?? "");
|
|
28
|
+
if (key !== void 0) out.push(key);
|
|
29
|
+
}
|
|
30
|
+
return out;
|
|
31
|
+
}
|
|
32
|
+
function keyAt(x, y) {
|
|
33
|
+
const item = document.elementFromPoint(x, y)?.closest("[data-paint-key]");
|
|
34
|
+
if (!item || !options.root.value?.contains(item)) return void 0;
|
|
35
|
+
return resolve(item.dataset.paintKey ?? "");
|
|
36
|
+
}
|
|
37
|
+
function extend() {
|
|
38
|
+
if (!stroke) return;
|
|
39
|
+
const key = keyAt(stroke.x, stroke.y);
|
|
40
|
+
const at = key === void 0 ? -1 : stroke.keys.indexOf(key);
|
|
41
|
+
if (at < 0) return;
|
|
42
|
+
const [lo, hi] = at < stroke.anchor ? [at, stroke.anchor] : [stroke.anchor, at];
|
|
43
|
+
const next = new Set(stroke.before);
|
|
44
|
+
for (let i = lo; i <= hi; i++) {
|
|
45
|
+
const k = stroke.keys[i];
|
|
46
|
+
if (stroke.paint) next.add(k);
|
|
47
|
+
else next.delete(k);
|
|
48
|
+
}
|
|
49
|
+
options.set([...next]);
|
|
50
|
+
}
|
|
51
|
+
function tick() {
|
|
52
|
+
frame = 0;
|
|
53
|
+
if (!stroke) return;
|
|
54
|
+
const box = stroke.scroller?.getBoundingClientRect() ?? { top: 0, bottom: window.innerHeight };
|
|
55
|
+
const delta = stroke.y > box.bottom - EDGE_PX ? SCROLL_STEP : stroke.y < box.top + EDGE_PX ? -SCROLL_STEP : 0;
|
|
56
|
+
if (delta) {
|
|
57
|
+
if (stroke.scroller) stroke.scroller.scrollTop += delta;
|
|
58
|
+
else window.scrollBy(0, delta);
|
|
59
|
+
extend();
|
|
60
|
+
}
|
|
61
|
+
frame = requestAnimationFrame(tick);
|
|
62
|
+
}
|
|
63
|
+
function begin(key, x, y) {
|
|
64
|
+
const keys = keysInView();
|
|
65
|
+
const anchor = keys.indexOf(key);
|
|
66
|
+
if (anchor < 0) return;
|
|
67
|
+
const before = new Set(options.selection());
|
|
68
|
+
stroke = { keys, anchor, paint: !before.has(key), before, x, y, scroller: scrollParent(options.root.value) };
|
|
69
|
+
painting.value = true;
|
|
70
|
+
window.getSelection()?.removeAllRanges();
|
|
71
|
+
if (options.root.value) options.root.value.style.userSelect = "none";
|
|
72
|
+
extend();
|
|
73
|
+
if (!frame) frame = requestAnimationFrame(tick);
|
|
74
|
+
}
|
|
75
|
+
function cancelPending() {
|
|
76
|
+
if (pending) clearTimeout(pending.timer);
|
|
77
|
+
pending = null;
|
|
78
|
+
}
|
|
79
|
+
function onPointerDown(event, key, behaviour = {}) {
|
|
80
|
+
if (!enabled() || event.button !== 0) return;
|
|
81
|
+
cancelPending();
|
|
82
|
+
if (behaviour.hold === void 0 && event.pointerType !== "touch") {
|
|
83
|
+
event.preventDefault();
|
|
84
|
+
begin(key, event.clientX, event.clientY);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const { pointerId, clientX: x, clientY: y } = event;
|
|
88
|
+
pending = {
|
|
89
|
+
key,
|
|
90
|
+
pointerId,
|
|
91
|
+
x,
|
|
92
|
+
y,
|
|
93
|
+
timer: setTimeout(() => {
|
|
94
|
+
pending = null;
|
|
95
|
+
begin(key, x, y);
|
|
96
|
+
navigator.vibrate?.(8);
|
|
97
|
+
}, behaviour.hold ?? HOLD_MS)
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
function onMove(event) {
|
|
101
|
+
if (pending && event.pointerId === pending.pointerId) {
|
|
102
|
+
if (Math.hypot(event.clientX - pending.x, event.clientY - pending.y) > SLOP_PX) cancelPending();
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
if (!stroke) return;
|
|
106
|
+
stroke.x = event.clientX;
|
|
107
|
+
stroke.y = event.clientY;
|
|
108
|
+
extend();
|
|
109
|
+
}
|
|
110
|
+
function onUp() {
|
|
111
|
+
cancelPending();
|
|
112
|
+
if (!stroke) return;
|
|
113
|
+
stroke = null;
|
|
114
|
+
painting.value = false;
|
|
115
|
+
if (options.root.value) options.root.value.style.userSelect = "";
|
|
116
|
+
if (frame) cancelAnimationFrame(frame);
|
|
117
|
+
frame = 0;
|
|
118
|
+
swallowClick = true;
|
|
119
|
+
setTimeout(() => swallowClick = false, 0);
|
|
120
|
+
}
|
|
121
|
+
function onClickCapture(event) {
|
|
122
|
+
if (!swallowClick) return;
|
|
123
|
+
swallowClick = false;
|
|
124
|
+
event.stopPropagation();
|
|
125
|
+
event.preventDefault();
|
|
126
|
+
}
|
|
127
|
+
function onContextMenu(event) {
|
|
128
|
+
if (!stroke && !swallowClick) return;
|
|
129
|
+
event.preventDefault();
|
|
130
|
+
event.stopPropagation();
|
|
131
|
+
}
|
|
132
|
+
function onTouchMove(event) {
|
|
133
|
+
if (stroke) event.preventDefault();
|
|
134
|
+
}
|
|
135
|
+
useHotkeys(
|
|
136
|
+
() => options.selectAll && enabled() ? [
|
|
137
|
+
{
|
|
138
|
+
key: "a",
|
|
139
|
+
code: "KeyA",
|
|
140
|
+
ctrl: true,
|
|
141
|
+
help: toValue(options.help),
|
|
142
|
+
handler: () => options.set(options.selectAll())
|
|
143
|
+
}
|
|
144
|
+
] : [],
|
|
145
|
+
{ scope: options.root }
|
|
146
|
+
);
|
|
147
|
+
onMounted(() => {
|
|
148
|
+
window.addEventListener("pointermove", onMove);
|
|
149
|
+
window.addEventListener("pointerup", onUp);
|
|
150
|
+
window.addEventListener("pointercancel", onUp);
|
|
151
|
+
window.addEventListener("click", onClickCapture, true);
|
|
152
|
+
window.addEventListener("contextmenu", onContextMenu, true);
|
|
153
|
+
options.root.value?.addEventListener("touchmove", onTouchMove, { passive: false });
|
|
154
|
+
});
|
|
155
|
+
onBeforeUnmount(() => {
|
|
156
|
+
onUp();
|
|
157
|
+
swallowClick = false;
|
|
158
|
+
window.removeEventListener("pointermove", onMove);
|
|
159
|
+
window.removeEventListener("pointerup", onUp);
|
|
160
|
+
window.removeEventListener("pointercancel", onUp);
|
|
161
|
+
window.removeEventListener("click", onClickCapture, true);
|
|
162
|
+
window.removeEventListener("contextmenu", onContextMenu, true);
|
|
163
|
+
options.root.value?.removeEventListener("touchmove", onTouchMove);
|
|
164
|
+
});
|
|
165
|
+
return { onPointerDown, painting: readonly(painting) };
|
|
166
|
+
}
|
|
167
|
+
export {
|
|
168
|
+
usePaintSelect
|
|
169
|
+
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ref, computed, toValue, watch } from "vue";
|
|
2
|
+
const NON_TEXT_INPUTS = /* @__PURE__ */ new Set(["checkbox", "radio", "button", "submit", "reset", "range", "color", "file", "image"]);
|
|
2
3
|
const TYPEAHEAD_RESET_MS = 700;
|
|
3
4
|
function useRovingFocus(items, options = {}) {
|
|
4
5
|
const {
|
|
@@ -69,7 +70,13 @@ function useRovingFocus(items, options = {}) {
|
|
|
69
70
|
}
|
|
70
71
|
}
|
|
71
72
|
}
|
|
73
|
+
function isTextEntry(target) {
|
|
74
|
+
if (!(target instanceof HTMLElement)) return false;
|
|
75
|
+
if (target.isContentEditable || target instanceof HTMLTextAreaElement || target instanceof HTMLSelectElement) return true;
|
|
76
|
+
return target instanceof HTMLInputElement && !NON_TEXT_INPUTS.has(target.type);
|
|
77
|
+
}
|
|
72
78
|
function onKeydown(event) {
|
|
79
|
+
if (event.isComposing || isTextEntry(event.target)) return;
|
|
73
80
|
const vertical = orientation === "vertical" || orientation === "both";
|
|
74
81
|
const horizontal = orientation === "horizontal" || orientation === "both";
|
|
75
82
|
switch (event.key) {
|
|
@@ -12,6 +12,7 @@ function useShift(options = {}) {
|
|
|
12
12
|
let settleTimer;
|
|
13
13
|
let lastHeight = 0;
|
|
14
14
|
let lastWidth = 0;
|
|
15
|
+
let laidOut = false;
|
|
15
16
|
let inFlight = false;
|
|
16
17
|
let tweenStart = 0;
|
|
17
18
|
const scrolled = /* @__PURE__ */ new Set();
|
|
@@ -64,8 +65,10 @@ function useShift(options = {}) {
|
|
|
64
65
|
restoreScroll(tops);
|
|
65
66
|
lastHeight = toHeight;
|
|
66
67
|
lastWidth = toWidth;
|
|
67
|
-
const
|
|
68
|
-
|
|
68
|
+
const wasLaidOut = laidOut;
|
|
69
|
+
laidOut = node.getClientRects().length > 0;
|
|
70
|
+
const movesHeight = wantsHeight() && (fromHeight !== 0 || wasLaidOut) && toHeight !== fromHeight;
|
|
71
|
+
const movesWidth = wantsWidth() && (fromWidth !== 0 || wasLaidOut) && toWidth !== fromWidth;
|
|
69
72
|
if (!movesHeight && !movesWidth) return;
|
|
70
73
|
if (movesHeight) node.style.height = `${fromHeight}px`;
|
|
71
74
|
if (movesWidth) node.style.width = `${fromWidth}px`;
|
|
@@ -102,6 +105,7 @@ function useShift(options = {}) {
|
|
|
102
105
|
resizing.value = false;
|
|
103
106
|
lastHeight = 0;
|
|
104
107
|
lastWidth = 0;
|
|
108
|
+
laidOut = false;
|
|
105
109
|
inFlight = false;
|
|
106
110
|
}
|
|
107
111
|
watch(
|
|
@@ -111,6 +115,7 @@ function useShift(options = {}) {
|
|
|
111
115
|
if (!enabled || !node) return;
|
|
112
116
|
lastHeight = node.offsetHeight;
|
|
113
117
|
lastWidth = node.offsetWidth;
|
|
118
|
+
laidOut = node.getClientRects().length > 0;
|
|
114
119
|
scrollHost = node;
|
|
115
120
|
node.addEventListener("scroll", rememberScroll, { capture: true, passive: true });
|
|
116
121
|
if (wantsHeight()) node.style.height = `${lastHeight}px`;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type ComputedRef, type CSSProperties, type Ref } from "vue";
|
|
1
|
+
import { type ComputedRef, type CSSProperties, type MaybeRefOrGetter, type Ref } from "vue";
|
|
2
2
|
export interface UseTiltOptions {
|
|
3
3
|
/** Max rotation toward the pointer, in degrees (per axis). Default 10. */
|
|
4
4
|
max?: number;
|
|
@@ -20,4 +20,4 @@ export interface UseTilt {
|
|
|
20
20
|
/** True while the pointer is over the element (drives lift/scale). */
|
|
21
21
|
active: Ref<boolean>;
|
|
22
22
|
}
|
|
23
|
-
export declare function useTilt(
|
|
23
|
+
export declare function useTilt(source?: MaybeRefOrGetter<UseTiltOptions>): UseTilt;
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { useReducedMotion } from "motion-v";
|
|
2
|
-
import {
|
|
3
|
-
function useTilt(
|
|
4
|
-
const
|
|
5
|
-
const lift = options.lift ?? 8;
|
|
6
|
-
const scale = options.scale ?? 1.03;
|
|
2
|
+
import { computed, toValue, ref } from "vue";
|
|
3
|
+
function useTilt(source = {}) {
|
|
4
|
+
const options = computed(() => toValue(source));
|
|
7
5
|
const reduceMotion = useReducedMotion();
|
|
8
6
|
const active = ref(false);
|
|
9
7
|
const nx = ref(0);
|
|
@@ -28,6 +26,7 @@ function useTilt(options = {}) {
|
|
|
28
26
|
if (reduceMotion.value) {
|
|
29
27
|
return { transition: "transform 0.2s ease" };
|
|
30
28
|
}
|
|
29
|
+
const { max = 10, lift = 8, scale = 1.03 } = options.value;
|
|
31
30
|
const rx = active.value ? -ny.value * max : 0;
|
|
32
31
|
const ry = active.value ? nx.value * max : 0;
|
|
33
32
|
const z = active.value ? lift : 0;
|
|
@@ -39,7 +38,7 @@ function useTilt(options = {}) {
|
|
|
39
38
|
};
|
|
40
39
|
});
|
|
41
40
|
const glareStyle = computed(() => {
|
|
42
|
-
if (!options.glare || reduceMotion.value || !active.value) {
|
|
41
|
+
if (!options.value.glare || reduceMotion.value || !active.value) {
|
|
43
42
|
return { opacity: 0 };
|
|
44
43
|
}
|
|
45
44
|
const px = (nx.value + 1) * 50;
|
|
@@ -7,6 +7,9 @@ export interface ToastAction {
|
|
|
7
7
|
}
|
|
8
8
|
export interface ToastItem {
|
|
9
9
|
id: number;
|
|
10
|
+
/** Bumped when a toast with the same `key` replaces this one in place. */
|
|
11
|
+
rev: number;
|
|
12
|
+
key?: string;
|
|
10
13
|
title?: string;
|
|
11
14
|
message: string;
|
|
12
15
|
variant: ToastVariant;
|
|
@@ -18,12 +21,28 @@ export interface ToastItem {
|
|
|
18
21
|
onClick?: () => void | Promise<void>;
|
|
19
22
|
}
|
|
20
23
|
export interface ToastOptions {
|
|
24
|
+
/**
|
|
25
|
+
* A toast with the same key replaces the one on screen instead of stacking
|
|
26
|
+
* beside it: "Saved" ten times is one toast, and a progress toast can turn
|
|
27
|
+
* into its result.
|
|
28
|
+
*/
|
|
29
|
+
key?: string;
|
|
21
30
|
title?: string;
|
|
22
31
|
duration?: number;
|
|
23
32
|
actions?: ToastAction[];
|
|
24
33
|
onClick?: () => void | Promise<void>;
|
|
25
34
|
}
|
|
26
35
|
declare function push(variant: ToastVariant, message: string, options?: ToastOptions): number;
|
|
36
|
+
export interface ToastPromiseMessages<T> {
|
|
37
|
+
loading: string;
|
|
38
|
+
success: string | ((value: T) => string);
|
|
39
|
+
error: string | ((error: unknown) => string);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* One toast that follows a promise: a persistent "loading" toast that turns
|
|
43
|
+
* into the success or error toast when it settles. Returns the promise itself.
|
|
44
|
+
*/
|
|
45
|
+
declare function promise<T>(task: Promise<T>, messages: ToastPromiseMessages<T>, options?: ToastOptions): Promise<T>;
|
|
27
46
|
declare function dismiss(id: number): void;
|
|
28
47
|
declare function clear(): void;
|
|
29
48
|
export declare function useToast(): {
|
|
@@ -33,6 +52,7 @@ export declare function useToast(): {
|
|
|
33
52
|
success: (message: string, o?: ToastOptions) => number;
|
|
34
53
|
warning: (message: string, o?: ToastOptions) => number;
|
|
35
54
|
error: (message: string, o?: ToastOptions) => number;
|
|
55
|
+
promise: typeof promise;
|
|
36
56
|
/** Low-level push for bridges (e.g. @leavepulse/ui-sdk apiError). */
|
|
37
57
|
push: typeof push;
|
|
38
58
|
dismiss: typeof dismiss;
|
|
@@ -6,10 +6,10 @@ const g = globalThis;
|
|
|
6
6
|
const state = g[STATE_KEY] ??= { queue: reactive([]), nextId: 0 };
|
|
7
7
|
const queue = state.queue;
|
|
8
8
|
function push(variant, message, options = {}) {
|
|
9
|
-
|
|
9
|
+
if (typeof window === "undefined") return -1;
|
|
10
10
|
const duration = options.duration ?? DEFAULT_DURATION;
|
|
11
|
-
const
|
|
12
|
-
|
|
11
|
+
const fields = {
|
|
12
|
+
key: options.key,
|
|
13
13
|
title: options.title,
|
|
14
14
|
message,
|
|
15
15
|
variant,
|
|
@@ -18,11 +18,34 @@ function push(variant, message, options = {}) {
|
|
|
18
18
|
actions: options.actions,
|
|
19
19
|
onClick: options.onClick
|
|
20
20
|
};
|
|
21
|
+
const same = options.key === void 0 ? -1 : queue.findIndex((t) => t.key === options.key);
|
|
22
|
+
const existing = queue[same];
|
|
23
|
+
if (existing) {
|
|
24
|
+
queue.splice(same, 1, { ...fields, id: existing.id, rev: existing.rev + 1 });
|
|
25
|
+
return existing.id;
|
|
26
|
+
}
|
|
27
|
+
const id = state.nextId++;
|
|
21
28
|
const overflow = queue.length - (MAX_ACTIVE - 1);
|
|
22
29
|
if (overflow > 0) queue.splice(0, overflow);
|
|
23
|
-
queue.push(
|
|
30
|
+
queue.push({ ...fields, id, rev: 0 });
|
|
24
31
|
return id;
|
|
25
32
|
}
|
|
33
|
+
let promiseKey = 0;
|
|
34
|
+
function promise(task, messages, options = {}) {
|
|
35
|
+
const key = options.key ?? `@leavepulse/ui:promise-${promiseKey++}`;
|
|
36
|
+
push("info", messages.loading, { ...options, key, duration: 0, actions: void 0 });
|
|
37
|
+
task.then(
|
|
38
|
+
(value) => {
|
|
39
|
+
const text = typeof messages.success === "function" ? messages.success(value) : messages.success;
|
|
40
|
+
push("success", text, { ...options, key });
|
|
41
|
+
},
|
|
42
|
+
(error) => {
|
|
43
|
+
const text = typeof messages.error === "function" ? messages.error(error) : messages.error;
|
|
44
|
+
push("error", text, { ...options, key });
|
|
45
|
+
}
|
|
46
|
+
);
|
|
47
|
+
return task;
|
|
48
|
+
}
|
|
26
49
|
function dismiss(id) {
|
|
27
50
|
const i = queue.findIndex((t) => t.id === id);
|
|
28
51
|
if (i !== -1) queue.splice(i, 1);
|
|
@@ -38,6 +61,7 @@ function useToast() {
|
|
|
38
61
|
success: (message, o) => push("success", message, o),
|
|
39
62
|
warning: (message, o) => push("warning", message, o),
|
|
40
63
|
error: (message, o) => push("error", message, o),
|
|
64
|
+
promise,
|
|
41
65
|
/** Low-level push for bridges (e.g. @leavepulse/ui-sdk apiError). */
|
|
42
66
|
push,
|
|
43
67
|
dismiss,
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { type ComputedRef, type CSSProperties, type Ref } from "vue";
|
|
1
|
+
import { type ComputedRef, type CSSProperties, type MaybeRefOrGetter, type Ref } from "vue";
|
|
2
2
|
export interface UseZoomPanOptions {
|
|
3
3
|
/** Smallest allowed scale. Default 1 (fit — never shrink past the viewport). */
|
|
4
4
|
min?: number;
|
|
5
|
-
/** Largest allowed scale. Default 8. */
|
|
6
|
-
max?: number
|
|
5
|
+
/** Largest allowed scale. Default 8. Read on every change, so it may be a getter. */
|
|
6
|
+
max?: MaybeRefOrGetter<number | undefined>;
|
|
7
7
|
/** Multiplier per wheel notch. Default 1.15. */
|
|
8
8
|
step?: number;
|
|
9
9
|
/** Scale that a double-click/tap toggles to, from `min`. Default 2. */
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { ref, computed } from "vue";
|
|
1
|
+
import { ref, computed, toValue } from "vue";
|
|
2
2
|
function useZoomPan(options = {}) {
|
|
3
3
|
const min = options.min ?? 1;
|
|
4
|
-
const
|
|
4
|
+
const maxOf = () => toValue(options.max) ?? 8;
|
|
5
5
|
const step = options.step ?? 1.15;
|
|
6
6
|
const zoomedScale = options.zoomedScale ?? 2;
|
|
7
7
|
const scale = ref(min);
|
|
@@ -29,7 +29,7 @@ function useZoomPan(options = {}) {
|
|
|
29
29
|
y.value = clamp(y.value, -slackY, slackY);
|
|
30
30
|
}
|
|
31
31
|
function zoomAbout(next, px, py) {
|
|
32
|
-
const clamped = clamp(next, min,
|
|
32
|
+
const clamped = clamp(next, min, maxOf());
|
|
33
33
|
if (clamped === scale.value) return;
|
|
34
34
|
const contentX = px / scale.value - x.value;
|
|
35
35
|
const contentY = py / scale.value - y.value;
|
|
@@ -116,7 +116,7 @@ function useZoomPan(options = {}) {
|
|
|
116
116
|
const offset = computed(() => ({ x: x.value, y: y.value }));
|
|
117
117
|
function setView(view) {
|
|
118
118
|
if (view.scale !== void 0) {
|
|
119
|
-
scale.value = Math.min(
|
|
119
|
+
scale.value = Math.min(maxOf(), Math.max(min, view.scale));
|
|
120
120
|
}
|
|
121
121
|
x.value = view.x;
|
|
122
122
|
y.value = view.y;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/icons.d.ts
CHANGED
|
@@ -1 +1,14 @@
|
|
|
1
|
-
|
|
1
|
+
import { type IconifyJSON } from "@iconify/vue";
|
|
2
|
+
/** Bumped whenever icons are registered, so rendered icons re-resolve. */
|
|
3
|
+
export declare const iconsVersion: import("vue").Ref<number, number>;
|
|
4
|
+
/** Register a whole iconify collection (any prefix) for offline use. */
|
|
5
|
+
export declare function registerIconCollection(collection: IconifyJSON): void;
|
|
6
|
+
/**
|
|
7
|
+
* Register lucide icons by name ("check" or "lucide:check") from the bundled
|
|
8
|
+
* collection. Resolves once they render offline.
|
|
9
|
+
*/
|
|
10
|
+
export declare function registerIcons(names: readonly string[]): Promise<void>;
|
|
11
|
+
/** Register the full lucide collection. */
|
|
12
|
+
export declare function registerAllIcons(): Promise<void>;
|
|
13
|
+
/** A lucide name that isn't registered yet: load it from the bundled set. */
|
|
14
|
+
export declare function requestIcon(name: string): void;
|