@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
package/README.md
CHANGED
|
@@ -6,9 +6,15 @@ JSON token sets), and a composable block-layout canvas.
|
|
|
6
6
|
|
|
7
7
|
## Install
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
Published to the public npm registry:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install @leavepulse/ui
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Peer dependencies to install alongside: `vue` 3.5+, `reka-ui` 2.9+, `tailwindcss` 4,
|
|
16
|
+
`tailwind-variants` 3, `motion-v` 2, `@iconify/vue` 5, `@iconify-json/lucide` and
|
|
17
|
+
`@internationalized/date`. `@nuxt/kit` is only needed for the Nuxt module.
|
|
12
18
|
|
|
13
19
|
## Usage
|
|
14
20
|
|
|
@@ -32,6 +38,111 @@ import { LpButton, LpModal } from "@leavepulse/ui"
|
|
|
32
38
|
The kit does **not** ship a precompiled stylesheet — your Tailwind build emits the
|
|
33
39
|
utilities its components use, scoped via the `@source` globs in the CSS entry.
|
|
34
40
|
|
|
41
|
+
Apps using the topology canvas (`LpTopologyCanvas`) also import its stylesheet:
|
|
42
|
+
|
|
43
|
+
```css
|
|
44
|
+
@import "@leavepulse/ui/canvas.css";
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Theme before mount (plain Vue)
|
|
48
|
+
|
|
49
|
+
Themes are JSON token sets applied at runtime. Paint the saved one before the
|
|
50
|
+
app mounts, so the first frame already has the right colours:
|
|
51
|
+
|
|
52
|
+
```ts
|
|
53
|
+
import { bootstrapTheme, dark, light, nord, useTheme } from "@leavepulse/ui"
|
|
54
|
+
|
|
55
|
+
bootstrapTheme(dark)
|
|
56
|
+
createApp(App).mount("#app")
|
|
57
|
+
|
|
58
|
+
// later, from a switcher or settings page
|
|
59
|
+
useTheme().setTheme(nord)
|
|
60
|
+
useTheme().setSystem({ light, dark }) // follow the OS colour scheme
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
`LpThemeProvider` applies a theme to one subtree only (a dark sidebar in a light
|
|
64
|
+
app, a live preview).
|
|
65
|
+
|
|
66
|
+
### App-wide configuration
|
|
67
|
+
|
|
68
|
+
`provideLpConfig` (or `app.use(lpConfig({...}))`) sets the link component that
|
|
69
|
+
internal links render (`LpLink`, `LpButton` with `to`/`href`, `LpBreadcrumbs`,
|
|
70
|
+
`LpSidebar` items) and overrides the English text the kit renders, per scope:
|
|
71
|
+
|
|
72
|
+
```ts
|
|
73
|
+
import { RouterLink } from "vue-router"
|
|
74
|
+
import { lpConfig } from "@leavepulse/ui"
|
|
75
|
+
|
|
76
|
+
app.use(lpConfig({
|
|
77
|
+
linkComponent: RouterLink,
|
|
78
|
+
labels: { sidebar: { search: "Suche" }, appShell: { openMenu: "Menü öffnen" } },
|
|
79
|
+
}))
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
A component's own `labels` prop wins over the configuration.
|
|
83
|
+
|
|
84
|
+
### Nuxt
|
|
85
|
+
|
|
86
|
+
```ts
|
|
87
|
+
export default defineNuxtConfig({
|
|
88
|
+
modules: ["@leavepulse/ui/nuxt"],
|
|
89
|
+
leavepulseUi: {
|
|
90
|
+
defaultTheme: "Nord", // fallback when nothing is saved
|
|
91
|
+
themes: "~/themes", // optional: module whose default export is your TokenSet[]
|
|
92
|
+
},
|
|
93
|
+
})
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
The module registers every exported component, paints the saved theme during
|
|
97
|
+
SSR (from the `lp-theme` cookie, no flash), and provides `NuxtLink` as the link
|
|
98
|
+
component. `theme: false`, `link: false` and `exclude: ["Name"]` opt out.
|
|
99
|
+
|
|
100
|
+
### Icons
|
|
101
|
+
|
|
102
|
+
`<LpIcon name="lucide:check">` renders offline, never through the iconify API.
|
|
103
|
+
The kit registers only the icons its own components use (about 20 KB instead of
|
|
104
|
+
the whole ~540 KB lucide set). Any other lucide name still renders: the full
|
|
105
|
+
collection loads as a separate chunk of your bundle the first time one is
|
|
106
|
+
needed, and an empty box of the same size holds the place until then.
|
|
107
|
+
|
|
108
|
+
Register icons up front when they must be in the server render or must not wait
|
|
109
|
+
for a chunk:
|
|
110
|
+
|
|
111
|
+
```ts
|
|
112
|
+
import { registerIcons, registerIconCollection } from "@leavepulse/ui"
|
|
113
|
+
|
|
114
|
+
await registerIcons(["lucide:rocket", "lucide:server"]) // from the bundled lucide set
|
|
115
|
+
registerIconCollection(myIconsJson) // any iconify collection
|
|
116
|
+
import "@leavepulse/ui/icons-all" // the whole lucide set, as before
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
In Nuxt the module does it for you: `icons: "scan"` (default) registers every
|
|
120
|
+
`lucide:*` literal found in the app's source, so they are in the SSR markup;
|
|
121
|
+
`"all"` registers the whole set, `"kit"` only the kit's own, or pass a list.
|
|
122
|
+
|
|
123
|
+
### Glass on WebKitGTK (Tauri on Linux)
|
|
124
|
+
|
|
125
|
+
WebKitGTK reports `backdrop-filter` as supported and then draws nothing, and on
|
|
126
|
+
some GPUs (NVIDIA with the proprietary driver) it runs without hardware
|
|
127
|
+
acceleration at all. Call `detectBackdropFilter()` once at startup: glass
|
|
128
|
+
panels then turn solid instead of showing the page unblurred.
|
|
129
|
+
|
|
130
|
+
An app that paints its own wallpaper can keep the frosted look there: hand the
|
|
131
|
+
kit the same `background` value and glass panels draw a blurred copy of it,
|
|
132
|
+
aligned to the screen, under their tint.
|
|
133
|
+
|
|
134
|
+
```ts
|
|
135
|
+
import { detectBackdropFilter, setGlassBackdrop } from "@leavepulse/ui"
|
|
136
|
+
|
|
137
|
+
detectBackdropFilter()
|
|
138
|
+
setGlassBackdrop("url(/wallpaper.jpg) center / cover no-repeat, #0b0f14")
|
|
139
|
+
// A wallpaper blurred ahead of time is cheaper on an engine that blurs on the CPU:
|
|
140
|
+
// setGlassBackdrop("url(/wallpaper-blurred.jpg) center / cover", { filter: "none" })
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Only the wallpaper is softened; live content under a panel stays sharp behind
|
|
144
|
+
its tint. Nothing changes in engines where the real blur works.
|
|
145
|
+
|
|
35
146
|
### Native scrollbar skin (opt-in)
|
|
36
147
|
|
|
37
148
|
`LpScrollArea` skins the scroll it owns. For everything it can't — the page
|
|
@@ -51,11 +162,14 @@ Hide a specific scrollbar with the `lp-scrollbar-none` class.
|
|
|
51
162
|
## Develop
|
|
52
163
|
|
|
53
164
|
```bash
|
|
54
|
-
bun install
|
|
165
|
+
bun install
|
|
55
166
|
bun run dev # live preview/playground on http://127.0.0.1:4500
|
|
56
|
-
bun
|
|
167
|
+
bun test # unit tests
|
|
168
|
+
bun run build # type-check + build the library and declarations to dist/
|
|
169
|
+
npm run check:pack # the tarball has its declarations and every export target
|
|
57
170
|
bun run dev:dist # rebuild dist on change (for a linked consumer)
|
|
58
171
|
```
|
|
59
172
|
|
|
60
|
-
`dist/` is generated, not committed
|
|
61
|
-
|
|
173
|
+
`dist/` is generated, not committed. Releases: `npm run release` (or
|
|
174
|
+
`release:minor`) bumps the version and pushes the tag; CI tests, builds and
|
|
175
|
+
publishes it.
|
|
@@ -5,81 +5,81 @@
|
|
|
5
5
|
* pane from its right edge as it grows. Animating the columns themselves made
|
|
6
6
|
* every line of the list and the pane re-wrap on every frame.
|
|
7
7
|
*/
|
|
8
|
-
.lp-cmd-dialog[data-v-
|
|
8
|
+
.lp-cmd-dialog[data-v-2da506c1] {
|
|
9
9
|
--lp-cmd-list: min(92vw, 40rem);
|
|
10
10
|
--lp-cmd-pane: max(0px, min(26rem, 96vw - var(--lp-cmd-list)));
|
|
11
11
|
width: var(--lp-cmd-list);
|
|
12
12
|
}
|
|
13
|
-
.lp-cmd-split[data-v-
|
|
13
|
+
.lp-cmd-split[data-v-2da506c1] {
|
|
14
14
|
transition:
|
|
15
15
|
width 300ms var(--ease-emphasized, ease),
|
|
16
16
|
min-height 300ms var(--ease-emphasized, ease);
|
|
17
17
|
}
|
|
18
18
|
@media (min-width: 768px) {
|
|
19
|
-
.lp-cmd-split .lp-cmd-list[data-v-
|
|
19
|
+
.lp-cmd-split .lp-cmd-list[data-v-2da506c1] {
|
|
20
20
|
flex: 0 0 auto;
|
|
21
21
|
/* the dialog's 1px border on each side */
|
|
22
22
|
width: calc(var(--lp-cmd-list) - 2px);
|
|
23
23
|
}
|
|
24
|
-
.lp-cmd-dialog[data-pane="open"][data-v-
|
|
24
|
+
.lp-cmd-dialog[data-pane="open"][data-v-2da506c1] {
|
|
25
25
|
width: calc(var(--lp-cmd-list) + var(--lp-cmd-pane));
|
|
26
26
|
min-height: min(76vh, 36rem);
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
|
-
.lp-cmd-pane[data-v-
|
|
29
|
+
.lp-cmd-pane[data-v-2da506c1] {
|
|
30
30
|
width: var(--lp-cmd-pane);
|
|
31
31
|
}
|
|
32
32
|
/*
|
|
33
33
|
* The pane rides in from the right edge while the dialog opens up to it, and
|
|
34
34
|
* leaves the same way, for as long as the dialog takes to close over it.
|
|
35
35
|
*/
|
|
36
|
-
.lp-cmd-pane-enter-active[data-v-
|
|
37
|
-
.lp-cmd-pane-leave-active[data-v-
|
|
36
|
+
.lp-cmd-pane-enter-active[data-v-2da506c1],
|
|
37
|
+
.lp-cmd-pane-leave-active[data-v-2da506c1] {
|
|
38
38
|
transition:
|
|
39
39
|
transform 300ms var(--ease-emphasized, ease),
|
|
40
40
|
opacity 300ms ease;
|
|
41
41
|
}
|
|
42
|
-
.lp-cmd-pane-enter-from[data-v-
|
|
43
|
-
.lp-cmd-pane-leave-to[data-v-
|
|
42
|
+
.lp-cmd-pane-enter-from[data-v-2da506c1],
|
|
43
|
+
.lp-cmd-pane-leave-to[data-v-2da506c1] {
|
|
44
44
|
opacity: 0;
|
|
45
45
|
transform: translateX(40%);
|
|
46
46
|
}
|
|
47
|
-
.lp-cmd-para[data-v-
|
|
48
|
-
animation: lp-cmd-para-in-
|
|
47
|
+
.lp-cmd-para[data-v-2da506c1] {
|
|
48
|
+
animation: lp-cmd-para-in-2da506c1 260ms ease-out both;
|
|
49
49
|
}
|
|
50
|
-
@keyframes lp-cmd-para-in-
|
|
50
|
+
@keyframes lp-cmd-para-in-2da506c1 {
|
|
51
51
|
from {
|
|
52
52
|
opacity: 0;
|
|
53
53
|
transform: translateY(4px);
|
|
54
54
|
}
|
|
55
55
|
}
|
|
56
56
|
@media (prefers-reduced-motion: reduce) {
|
|
57
|
-
.lp-cmd-split[data-v-
|
|
58
|
-
.lp-cmd-pane-enter-active[data-v-
|
|
59
|
-
.lp-cmd-pane-leave-active[data-v-
|
|
57
|
+
.lp-cmd-split[data-v-2da506c1],
|
|
58
|
+
.lp-cmd-pane-enter-active[data-v-2da506c1],
|
|
59
|
+
.lp-cmd-pane-leave-active[data-v-2da506c1] {
|
|
60
60
|
transition: none;
|
|
61
61
|
}
|
|
62
|
-
.lp-cmd-para[data-v-
|
|
62
|
+
.lp-cmd-para[data-v-2da506c1] {
|
|
63
63
|
animation: none;
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
|
-
.lp-cmd-excerpt[data-v-
|
|
66
|
+
.lp-cmd-excerpt[data-v-2da506c1] {
|
|
67
67
|
display: -webkit-box;
|
|
68
68
|
-webkit-box-orient: vertical;
|
|
69
69
|
overflow: hidden;
|
|
70
70
|
}
|
|
71
71
|
/* Each result eases in; honours reduced motion. */
|
|
72
|
-
.lp-cmd-item[data-v-
|
|
73
|
-
animation: lp-cmd-in-
|
|
72
|
+
.lp-cmd-item[data-v-2da506c1] {
|
|
73
|
+
animation: lp-cmd-in-2da506c1 140ms ease-out both;
|
|
74
74
|
}
|
|
75
|
-
@keyframes lp-cmd-in-
|
|
75
|
+
@keyframes lp-cmd-in-2da506c1 {
|
|
76
76
|
from {
|
|
77
77
|
opacity: 0;
|
|
78
78
|
transform: translateY(3px);
|
|
79
79
|
}
|
|
80
80
|
}
|
|
81
81
|
@media (prefers-reduced-motion: reduce) {
|
|
82
|
-
.lp-cmd-item[data-v-
|
|
82
|
+
.lp-cmd-item[data-v-2da506c1] {
|
|
83
83
|
animation: none;
|
|
84
84
|
}
|
|
85
85
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
|
|
2
|
-
.lp-dropzone__frame rect[data-v-
|
|
2
|
+
.lp-dropzone__frame rect[data-v-6f6d375e] {
|
|
3
3
|
stroke: var(--color-line);
|
|
4
4
|
transition: stroke var(--duration-fast) linear;
|
|
5
5
|
}
|
|
6
|
-
.lp-dropzone:hover .lp-dropzone__frame rect[data-v-
|
|
6
|
+
.lp-dropzone:hover .lp-dropzone__frame rect[data-v-6f6d375e] {
|
|
7
7
|
stroke: var(--color-line-strong);
|
|
8
8
|
}
|
|
9
9
|
|
|
@@ -12,33 +12,33 @@
|
|
|
12
12
|
with every other thing on it; under a drag it is the answer to "can I let go
|
|
13
13
|
here". One dash period per cycle, so the travel is continuous rather than
|
|
14
14
|
jumping back at the seam. */
|
|
15
|
-
.lp-dropzone--over .lp-dropzone__frame rect[data-v-
|
|
15
|
+
.lp-dropzone--over .lp-dropzone__frame rect[data-v-6f6d375e] {
|
|
16
16
|
stroke: var(--color-brand);
|
|
17
|
-
animation: lp-dropzone-ants-
|
|
17
|
+
animation: lp-dropzone-ants-6f6d375e 500ms linear infinite;
|
|
18
18
|
}
|
|
19
|
-
@keyframes lp-dropzone-ants-
|
|
19
|
+
@keyframes lp-dropzone-ants-6f6d375e {
|
|
20
20
|
to {
|
|
21
21
|
stroke-dashoffset: -11;
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
/* The dashes fade in and the block settles up a few pixels. */
|
|
26
|
-
.lp-dropzone[data-v-
|
|
27
|
-
animation: lp-dropzone-in-
|
|
26
|
+
.lp-dropzone[data-v-6f6d375e] {
|
|
27
|
+
animation: lp-dropzone-in-6f6d375e var(--duration-slow) var(--ease-settle) both;
|
|
28
28
|
}
|
|
29
|
-
.lp-dropzone--waiting[data-v-
|
|
29
|
+
.lp-dropzone--waiting[data-v-6f6d375e] {
|
|
30
30
|
opacity: 0;
|
|
31
31
|
animation: none;
|
|
32
32
|
}
|
|
33
|
-
@keyframes lp-dropzone-in-
|
|
33
|
+
@keyframes lp-dropzone-in-6f6d375e {
|
|
34
34
|
from {
|
|
35
35
|
opacity: 0;
|
|
36
36
|
transform: translateY(6px);
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
39
|
@media (prefers-reduced-motion: reduce) {
|
|
40
|
-
.lp-dropzone[data-v-
|
|
41
|
-
.lp-dropzone--waiting[data-v-
|
|
40
|
+
.lp-dropzone[data-v-6f6d375e],
|
|
41
|
+
.lp-dropzone--waiting[data-v-6f6d375e] {
|
|
42
42
|
opacity: 1;
|
|
43
43
|
transform: none;
|
|
44
44
|
animation: none;
|
|
@@ -46,7 +46,7 @@ from {
|
|
|
46
46
|
|
|
47
47
|
/* The ants stop, the colour stays: the brand stroke is what says "drop
|
|
48
48
|
here", and it says it standing still. */
|
|
49
|
-
.lp-dropzone--over .lp-dropzone__frame rect[data-v-
|
|
49
|
+
.lp-dropzone--over .lp-dropzone__frame rect[data-v-6f6d375e] {
|
|
50
50
|
animation: none;
|
|
51
51
|
}
|
|
52
52
|
}
|
|
@@ -2,22 +2,22 @@
|
|
|
2
2
|
/* The picture settles into the frame instead of appearing in it. Scale rather
|
|
3
3
|
than a slide: the frame is the fixed thing here and the image lives inside
|
|
4
4
|
it, so anything that moved would read as a crop that had shifted. */
|
|
5
|
-
.lp-editor__image[data-v-
|
|
6
|
-
animation: lp-editor-in-
|
|
5
|
+
.lp-editor__image[data-v-b510205a] {
|
|
6
|
+
animation: lp-editor-in-b510205a var(--duration-slow) var(--ease-settle) both;
|
|
7
7
|
}
|
|
8
|
-
.lp-editor__image--waiting[data-v-
|
|
8
|
+
.lp-editor__image--waiting[data-v-b510205a] {
|
|
9
9
|
opacity: 0;
|
|
10
10
|
animation: none;
|
|
11
11
|
}
|
|
12
|
-
@keyframes lp-editor-in-
|
|
12
|
+
@keyframes lp-editor-in-b510205a {
|
|
13
13
|
from {
|
|
14
14
|
opacity: 0;
|
|
15
15
|
scale: 1.04;
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
18
|
@media (prefers-reduced-motion: reduce) {
|
|
19
|
-
.lp-editor__image[data-v-
|
|
20
|
-
.lp-editor__image--waiting[data-v-
|
|
19
|
+
.lp-editor__image[data-v-b510205a],
|
|
20
|
+
.lp-editor__image--waiting[data-v-b510205a] {
|
|
21
21
|
opacity: 1;
|
|
22
22
|
scale: 1;
|
|
23
23
|
animation: none;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
|
|
2
2
|
/* Two columns where there is room: the list is long enough that one column
|
|
3
3
|
pushes the last group off a laptop screen. */
|
|
4
|
-
.shortcut-groups[data-v-
|
|
4
|
+
.shortcut-groups[data-v-1c4cf3fa] {
|
|
5
5
|
display: grid;
|
|
6
6
|
gap: 18px;
|
|
7
7
|
grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
|
|
8
8
|
}
|
|
9
|
-
.shortcut-group h3[data-v-
|
|
9
|
+
.shortcut-group h3[data-v-1c4cf3fa] {
|
|
10
10
|
margin: 0 0 6px;
|
|
11
11
|
color: var(--color-muted);
|
|
12
12
|
font-size: 0.7rem;
|
|
@@ -14,31 +14,52 @@
|
|
|
14
14
|
letter-spacing: 0.06em;
|
|
15
15
|
text-transform: uppercase;
|
|
16
16
|
}
|
|
17
|
-
.shortcut-group dl[data-v-
|
|
17
|
+
.shortcut-group dl[data-v-1c4cf3fa] {
|
|
18
18
|
display: flex;
|
|
19
19
|
flex-direction: column;
|
|
20
20
|
gap: 1px;
|
|
21
21
|
margin: 0;
|
|
22
22
|
}
|
|
23
|
-
.shortcut-row[data-v-
|
|
23
|
+
.shortcut-row[data-v-1c4cf3fa] {
|
|
24
24
|
display: flex;
|
|
25
25
|
align-items: center;
|
|
26
26
|
justify-content: space-between;
|
|
27
27
|
gap: 12px;
|
|
28
28
|
padding: 5px 0;
|
|
29
29
|
}
|
|
30
|
-
.shortcut-row dt[data-v-
|
|
30
|
+
.shortcut-row dt[data-v-1c4cf3fa] {
|
|
31
31
|
color: var(--color-ink);
|
|
32
32
|
font-size: 0.82rem;
|
|
33
33
|
min-width: 0;
|
|
34
34
|
}
|
|
35
|
-
.shortcut-
|
|
35
|
+
.shortcut-conflict[data-v-1c4cf3fa] {
|
|
36
|
+
display: inline-flex;
|
|
37
|
+
width: 14px;
|
|
38
|
+
height: 14px;
|
|
39
|
+
margin-left: 6px;
|
|
40
|
+
align-items: center;
|
|
41
|
+
justify-content: center;
|
|
42
|
+
border-radius: 999px;
|
|
43
|
+
background: var(--color-danger-soft);
|
|
44
|
+
color: var(--color-danger);
|
|
45
|
+
font-size: 0.6rem;
|
|
46
|
+
font-weight: 700;
|
|
47
|
+
vertical-align: middle;
|
|
48
|
+
cursor: help;
|
|
49
|
+
}
|
|
50
|
+
.shortcut-then[data-v-1c4cf3fa] {
|
|
51
|
+
align-self: center;
|
|
52
|
+
padding: 0 2px;
|
|
53
|
+
color: var(--color-muted);
|
|
54
|
+
font-size: 0.68rem;
|
|
55
|
+
}
|
|
56
|
+
.shortcut-row dd[data-v-1c4cf3fa] {
|
|
36
57
|
display: flex;
|
|
37
58
|
flex-shrink: 0;
|
|
38
59
|
gap: 3px;
|
|
39
60
|
margin: 0;
|
|
40
61
|
}
|
|
41
|
-
kbd[data-v-
|
|
62
|
+
kbd[data-v-1c4cf3fa] {
|
|
42
63
|
display: inline-flex;
|
|
43
64
|
min-width: 20px;
|
|
44
65
|
align-items: center;
|
|
@@ -22,7 +22,10 @@
|
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
@media (prefers-reduced-motion: reduce) {
|
|
25
|
-
|
|
25
|
+
/* Repeats the descendant form: it outranks a bare class, and grouped items
|
|
26
|
+
kept pulsing under reduced motion. */
|
|
27
|
+
.lp-skeleton-item,
|
|
28
|
+
.lp-skeleton .lp-skeleton-item {
|
|
26
29
|
animation: none;
|
|
27
30
|
opacity: 0.75;
|
|
28
31
|
}
|
|
@@ -11,17 +11,17 @@
|
|
|
11
11
|
* fade before closing the gap and the whole list lurches at the end instead of
|
|
12
12
|
* gliding.
|
|
13
13
|
*/
|
|
14
|
-
.lp-row-enter-active[data-v-
|
|
15
|
-
.lp-row-leave-active[data-v-
|
|
14
|
+
.lp-row-enter-active[data-v-fff7ed10],
|
|
15
|
+
.lp-row-leave-active[data-v-fff7ed10] {
|
|
16
16
|
transition:
|
|
17
17
|
opacity var(--duration-fast) var(--ease-emphasized),
|
|
18
18
|
transform var(--duration-fast) var(--ease-emphasized);
|
|
19
19
|
}
|
|
20
|
-
.lp-row-move[data-v-
|
|
20
|
+
.lp-row-move[data-v-fff7ed10] {
|
|
21
21
|
transition: transform var(--duration-medium) var(--ease-emphasized);
|
|
22
22
|
}
|
|
23
|
-
.lp-row-enter-from[data-v-
|
|
24
|
-
.lp-row-leave-to[data-v-
|
|
23
|
+
.lp-row-enter-from[data-v-fff7ed10],
|
|
24
|
+
.lp-row-leave-to[data-v-fff7ed10] {
|
|
25
25
|
opacity: 0;
|
|
26
26
|
transform: translateX(-0.5rem);
|
|
27
27
|
}
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
* drops out of the table layout entirely. Nothing sits below this row to be
|
|
36
36
|
* dragged around, so simply not animating its exit costs nothing.
|
|
37
37
|
*/
|
|
38
|
-
.lp-row-empty.lp-row-leave-active[data-v-
|
|
38
|
+
.lp-row-empty.lp-row-leave-active[data-v-fff7ed10] {
|
|
39
39
|
display: none;
|
|
40
40
|
}
|
|
41
41
|
|
|
@@ -47,12 +47,52 @@
|
|
|
47
47
|
* which is a moment slower and stays a table the whole time.
|
|
48
48
|
*/
|
|
49
49
|
|
|
50
|
+
/*
|
|
51
|
+
* The tick column of a hold-to-select table keeps its width and only hides its
|
|
52
|
+
* boxes until they mean something, which is the desktop pattern Material
|
|
53
|
+
* describes: a row's box shows while the row is hovered, and every box shows
|
|
54
|
+
* once anything is selected. An earlier version collapsed the column to nothing
|
|
55
|
+
* and floated the hover box over the first cell, where it sat on the text.
|
|
56
|
+
*/
|
|
57
|
+
.lp-tick[data-v-fff7ed10] {
|
|
58
|
+
display: flex;
|
|
59
|
+
align-items: center;
|
|
60
|
+
max-width: 0;
|
|
61
|
+
padding-inline: 0;
|
|
62
|
+
overflow: hidden;
|
|
63
|
+
opacity: 0;
|
|
64
|
+
transition:
|
|
65
|
+
max-width var(--duration-medium) var(--ease-emphasized),
|
|
66
|
+
padding var(--duration-medium) var(--ease-emphasized),
|
|
67
|
+
opacity var(--duration-fast) ease;
|
|
68
|
+
}
|
|
69
|
+
.lp-tick-open[data-v-fff7ed10] {
|
|
70
|
+
max-width: 3.25rem;
|
|
71
|
+
padding-inline: 1rem;
|
|
72
|
+
opacity: 1;
|
|
73
|
+
}
|
|
74
|
+
.lp-tick-hidden[data-v-fff7ed10],
|
|
75
|
+
.lp-tick-cue[data-v-fff7ed10] {
|
|
76
|
+
opacity: 0;
|
|
77
|
+
}
|
|
78
|
+
tr:hover .lp-tick-cue[data-v-fff7ed10],
|
|
79
|
+
.lp-tick-cue[data-v-fff7ed10]:focus-within {
|
|
80
|
+
opacity: 1;
|
|
81
|
+
}
|
|
82
|
+
|
|
50
83
|
/* A filter that redraws the list is information, not decoration: with motion
|
|
51
84
|
turned down the rows change without animating rather than not changing. */
|
|
85
|
+
/* Only where there is a hover to reveal it; a finger long-presses instead. */
|
|
86
|
+
@media (hover: none) {
|
|
87
|
+
tr:hover .lp-tick-cue[data-v-fff7ed10] {
|
|
88
|
+
opacity: 0;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
52
91
|
@media (prefers-reduced-motion: reduce) {
|
|
53
|
-
.lp-row-enter-active[data-v-
|
|
54
|
-
.lp-row-leave-active[data-v-
|
|
55
|
-
.lp-row-move[data-v-
|
|
92
|
+
.lp-row-enter-active[data-v-fff7ed10],
|
|
93
|
+
.lp-row-leave-active[data-v-fff7ed10],
|
|
94
|
+
.lp-row-move[data-v-fff7ed10],
|
|
95
|
+
.lp-tick[data-v-fff7ed10] {
|
|
56
96
|
transition: none;
|
|
57
97
|
}
|
|
58
98
|
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { defineComponent, resolveComponent, openBlock, createElementBlock, Fragment, renderList, createBlock, unref, createCommentVNode, withCtx, createVNode, normalizeClass, createElementVNode, createTextVNode, toDisplayString, withModifiers } from "vue";
|
|
2
|
+
import { ContextMenuSeparator, ContextMenuSub, ContextMenuSubTrigger, ContextMenuPortal, ContextMenuSubContent, ContextMenuCheckboxItem, ContextMenuItem } from "reka-ui";
|
|
3
|
+
import { _ as _sfc_main$1 } from "./LpIcon-DYtaid0K.js";
|
|
4
|
+
const _hoisted_1 = { class: "flex items-center gap-2" };
|
|
5
|
+
const _hoisted_2 = { class: "flex items-center gap-2" };
|
|
6
|
+
const _hoisted_3 = {
|
|
7
|
+
key: 0,
|
|
8
|
+
class: "text-xs text-muted"
|
|
9
|
+
};
|
|
10
|
+
const _hoisted_4 = { class: "flex items-center gap-2" };
|
|
11
|
+
const _hoisted_5 = {
|
|
12
|
+
key: 0,
|
|
13
|
+
class: "text-xs text-muted"
|
|
14
|
+
};
|
|
15
|
+
const ITEM = "group/item flex cursor-pointer select-none items-center gap-2 rounded-md px-2.5 py-1.5 text-sm outline-none transition-[background-color,color] duration-[var(--duration-fast)] data-[disabled]:pointer-events-none data-[disabled]:opacity-45 data-[highlighted]:bg-brand-soft";
|
|
16
|
+
const ICON = "transition-transform duration-[var(--duration-fast)] ease-[var(--ease-emphasized)] group-data-[highlighted]/item:translate-x-0.5";
|
|
17
|
+
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
18
|
+
...{ name: "ContextMenuItems" },
|
|
19
|
+
__name: "ContextMenuItems",
|
|
20
|
+
props: {
|
|
21
|
+
items: {},
|
|
22
|
+
panel: {}
|
|
23
|
+
},
|
|
24
|
+
setup(__props) {
|
|
25
|
+
return (_ctx, _cache) => {
|
|
26
|
+
const _component_ContextMenuItems = resolveComponent("ContextMenuItems", true);
|
|
27
|
+
return openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (item, i) => {
|
|
28
|
+
return openBlock(), createElementBlock(Fragment, { key: i }, [
|
|
29
|
+
item.separatorBefore ? (openBlock(), createBlock(unref(ContextMenuSeparator), {
|
|
30
|
+
key: 0,
|
|
31
|
+
class: "my-1 h-px bg-line"
|
|
32
|
+
})) : createCommentVNode("", true),
|
|
33
|
+
item.children?.length ? (openBlock(), createBlock(unref(ContextMenuSub), { key: 1 }, {
|
|
34
|
+
default: withCtx(() => [
|
|
35
|
+
createVNode(unref(ContextMenuSubTrigger), {
|
|
36
|
+
class: normalizeClass([ITEM, "justify-between text-ink data-[highlighted]:text-brand data-[state=open]:bg-brand-soft data-[state=open]:text-brand"]),
|
|
37
|
+
disabled: item.disabled
|
|
38
|
+
}, {
|
|
39
|
+
default: withCtx(() => [
|
|
40
|
+
createElementVNode("span", _hoisted_1, [
|
|
41
|
+
item.icon ? (openBlock(), createBlock(_sfc_main$1, {
|
|
42
|
+
key: 0,
|
|
43
|
+
name: item.icon,
|
|
44
|
+
size: 15,
|
|
45
|
+
class: normalizeClass(ICON)
|
|
46
|
+
}, null, 8, ["name"])) : createCommentVNode("", true),
|
|
47
|
+
createTextVNode(" " + toDisplayString(item.label), 1)
|
|
48
|
+
]),
|
|
49
|
+
createVNode(_sfc_main$1, {
|
|
50
|
+
name: "lucide:chevron-right",
|
|
51
|
+
size: 14,
|
|
52
|
+
class: "text-muted"
|
|
53
|
+
})
|
|
54
|
+
]),
|
|
55
|
+
_: 2
|
|
56
|
+
}, 1032, ["class", "disabled"]),
|
|
57
|
+
createVNode(unref(ContextMenuPortal), null, {
|
|
58
|
+
default: withCtx(() => [
|
|
59
|
+
createVNode(unref(ContextMenuSubContent), {
|
|
60
|
+
"collision-padding": 8,
|
|
61
|
+
class: normalizeClass(__props.panel),
|
|
62
|
+
"side-offset": 2,
|
|
63
|
+
"align-offset": -4
|
|
64
|
+
}, {
|
|
65
|
+
default: withCtx(() => [
|
|
66
|
+
createVNode(_component_ContextMenuItems, {
|
|
67
|
+
items: item.children,
|
|
68
|
+
panel: __props.panel
|
|
69
|
+
}, null, 8, ["items", "panel"])
|
|
70
|
+
]),
|
|
71
|
+
_: 2
|
|
72
|
+
}, 1032, ["class"])
|
|
73
|
+
]),
|
|
74
|
+
_: 2
|
|
75
|
+
}, 1024)
|
|
76
|
+
]),
|
|
77
|
+
_: 2
|
|
78
|
+
}, 1024)) : item.checked !== void 0 ? (openBlock(), createBlock(unref(ContextMenuCheckboxItem), {
|
|
79
|
+
key: 2,
|
|
80
|
+
"model-value": item.checked,
|
|
81
|
+
class: normalizeClass([ITEM, "justify-between text-ink data-[highlighted]:text-brand"]),
|
|
82
|
+
disabled: item.disabled,
|
|
83
|
+
onSelect: withModifiers(($event) => item.onSelect?.(), ["prevent"])
|
|
84
|
+
}, {
|
|
85
|
+
default: withCtx(() => [
|
|
86
|
+
createElementVNode("span", _hoisted_2, [
|
|
87
|
+
createVNode(_sfc_main$1, {
|
|
88
|
+
name: item.checked ? "lucide:check" : "lucide:minus",
|
|
89
|
+
size: 15,
|
|
90
|
+
class: normalizeClass([ICON, item.checked ? "" : "opacity-25"])
|
|
91
|
+
}, null, 8, ["name", "class"]),
|
|
92
|
+
createTextVNode(" " + toDisplayString(item.label), 1)
|
|
93
|
+
]),
|
|
94
|
+
item.shortcut ? (openBlock(), createElementBlock("kbd", _hoisted_3, toDisplayString(item.shortcut), 1)) : createCommentVNode("", true)
|
|
95
|
+
]),
|
|
96
|
+
_: 2
|
|
97
|
+
}, 1032, ["model-value", "class", "disabled", "onSelect"])) : (openBlock(), createBlock(unref(ContextMenuItem), {
|
|
98
|
+
key: 3,
|
|
99
|
+
class: normalizeClass([ITEM, "justify-between", item.danger ? "text-danger data-[highlighted]:bg-danger-soft data-[highlighted]:text-danger" : "text-ink data-[highlighted]:text-brand"]),
|
|
100
|
+
disabled: item.disabled,
|
|
101
|
+
onSelect: ($event) => item.onSelect?.()
|
|
102
|
+
}, {
|
|
103
|
+
default: withCtx(() => [
|
|
104
|
+
createElementVNode("span", _hoisted_4, [
|
|
105
|
+
item.icon ? (openBlock(), createBlock(_sfc_main$1, {
|
|
106
|
+
key: 0,
|
|
107
|
+
name: item.icon,
|
|
108
|
+
size: 15,
|
|
109
|
+
class: normalizeClass(ICON)
|
|
110
|
+
}, null, 8, ["name"])) : createCommentVNode("", true),
|
|
111
|
+
createTextVNode(" " + toDisplayString(item.label), 1)
|
|
112
|
+
]),
|
|
113
|
+
item.shortcut ? (openBlock(), createElementBlock("kbd", _hoisted_5, toDisplayString(item.shortcut), 1)) : createCommentVNode("", true)
|
|
114
|
+
]),
|
|
115
|
+
_: 2
|
|
116
|
+
}, 1032, ["class", "disabled", "onSelect"]))
|
|
117
|
+
], 64);
|
|
118
|
+
}), 128);
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
export {
|
|
123
|
+
_sfc_main as _
|
|
124
|
+
};
|