@leavepulse/ui 0.77.3 → 0.78.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 +68 -0
- package/dist/assets/{LpCommandPalette-DOIZHw-g.css → LpCommandPalette-DDJKICKh.css} +19 -19
- package/dist/assets/{LpDock-Cbh0wQUv.css → LpDock-Dw82tWVD.css} +3 -3
- package/dist/assets/{LpDropzone-B_qRq1-R.css → LpDropzone-DNbh_NFJ.css} +10 -10
- package/dist/assets/{LpImageEditor-XM5bAziW.css → LpImageEditor-Bgu20XLs.css} +6 -6
- package/dist/assets/{LpTable-Bv-EcQs7.css → LpTable-CCk0ZHo7.css} +19 -19
- package/dist/assets/LpTabs-Bh7a-Bdl.css +18 -0
- package/dist/chunks/AppShellContextNav-C6Ho2mof.js +49 -0
- package/dist/chunks/ChartRangeSelector-HO0sMMz6.js +129 -0
- package/dist/chunks/{ContextMenuItems-BXumicbh.js → ContextMenuItems-DmaKSJVv.js} +1 -1
- package/dist/chunks/{DropzoneLinkField-C-9BCGJn.js → DropzoneLinkField-DXIr0eFz.js} +2 -2
- package/dist/chunks/{FieldWrapper-CORPzo9s.js → FieldWrapper-DnuMTrqW.js} +1 -1
- package/dist/chunks/IconCloseButton-COZEsa9u.js +29 -0
- package/dist/chunks/{LayoutCanvas-CNOAUk7D.js → LayoutCanvas-CZKOltfA.js} +1 -1
- package/dist/chunks/{LayoutNode-DF5BMN0J.js → LayoutNode-D2f7v683.js} +45 -45
- package/dist/chunks/{LpActionBar-BP1ld7-S.js → LpActionBar-BGMk5KoG.js} +3 -3
- package/dist/chunks/{LpActivityLine-CJvzrNpj.js → LpActivityLine-Ea-t5Vza.js} +4 -2
- package/dist/chunks/{LpAddressInput-E8KtwU7-.js → LpAddressInput-ZqoZ-N2Y.js} +12 -11
- package/dist/chunks/{LpAlert-n5XPAZfv.js → LpAlert-CjvTZIKF.js} +3 -3
- package/dist/chunks/LpAppShell-BNAVTQsY.js +582 -0
- package/dist/chunks/{LpAutocomplete-C-SpPfBG.js → LpAutocomplete-DkY6CSyD.js} +24 -42
- package/dist/chunks/{LpAvatar-Cg6Az3wz.js → LpAvatar-cQVsNk6F.js} +2 -2
- package/dist/chunks/{LpBadge-wUYLN4U9.js → LpBadge-D5QQdDQ_.js} +2 -2
- package/dist/chunks/{LpBottomNav-CbNQQPuL.js → LpBottomNav-zxLGGbjm.js} +9 -2
- package/dist/chunks/{LpBreadcrumbs-DPdbth-c.js → LpBreadcrumbs-CIIBsygI.js} +4 -3
- package/dist/chunks/{LpButton-CFb44IjC.js → LpButton-DSHioIfD.js} +5 -4
- package/dist/chunks/{LpCalendar-CuoWks-0.js → LpCalendar-D4-LVjfF.js} +1 -1
- package/dist/chunks/{LpCard-r13WRqox.js → LpCard-BPtYXwnT.js} +1 -1
- package/dist/chunks/{LpCheckbox-Cs4SHaHX.js → LpCheckbox-D6RuDW4X.js} +38 -16
- package/dist/chunks/{LpCodeBlock-DRC8VbXW.js → LpCodeBlock-DuzmnIHl.js} +19 -41
- package/dist/chunks/{LpCodeDisplay-CE9TxCA4.js → LpCodeDisplay-CO8fngxa.js} +5 -5
- package/dist/chunks/{LpCollapse-CWS9M_lm.js → LpCollapse-DrAw5DBZ.js} +5 -4
- package/dist/chunks/{LpColorPicker-1y1QJHZR.js → LpColorPicker-BxAHEnR5.js} +11 -12
- package/dist/chunks/{LpCommandScope-CtUhJe8T.js → LpCommandScope-DRUvHiX7.js} +1 -1
- package/dist/chunks/{LpConfirmDialog-DlD45Bi_.js → LpConfirmDialog-6oCIJTDa.js} +3 -3
- package/dist/chunks/{LpConfirmHost-BIWjBLmI.js → LpConfirmHost-DgHvfT6s.js} +1 -1
- package/dist/chunks/{LpContextMenu-rx2tCjwk.js → LpContextMenu--eMGIql6.js} +13 -15
- package/dist/chunks/{LpContextSwitcher-Dwh6dyID.js → LpContextSwitcher-1C1tExdl.js} +2 -2
- package/dist/chunks/{LpCopyButton-xF7wFVoU.js → LpCopyButton-7EOSIuwa.js} +3 -3
- package/dist/chunks/{LpCountdown-DgeY3cLG.js → LpCountdown-DVl7vXI1.js} +4 -3
- package/dist/chunks/{LpDataList-Jxyl9H5w.js → LpDataList-DgBeM01y.js} +13 -4
- package/dist/chunks/{LpDatePicker-CA0QTfBC.js → LpDatePicker-DwSDY0mt.js} +12 -18
- package/dist/chunks/{LpDateRangePicker-u3J51xXk.js → LpDateRangePicker-CNQXdTVv.js} +10 -16
- package/dist/chunks/{LpDisclosure-Cpa7Hc5T.js → LpDisclosure-DG7JCo-d.js} +2 -2
- package/dist/chunks/{LpDrawer-CrG8t_KP.js → LpDrawer-Bt9UUqt_.js} +61 -61
- package/dist/chunks/{LpDropdownMenu-Dl7Z4ZhS.js → LpDropdownMenu-CLzxIOgM.js} +9 -17
- package/dist/chunks/{LpEditable-Cy6GLbFx.js → LpEditable-DVT0Rh8F.js} +9 -6
- package/dist/chunks/{LpEmptyState-EQHiRYhG.js → LpEmptyState-DurPF001.js} +1 -1
- package/dist/chunks/{LpFieldNotice-CzQ2_5rQ.js → LpFieldNotice-DJ10cYIo.js} +1 -1
- package/dist/chunks/LpFileTree-BSx1kBoV.js +735 -0
- package/dist/chunks/{LpFileTreeNode-cT6BIWvz.js → LpFileTreeNode-4dVmFHb3.js} +116 -34
- package/dist/chunks/{LpFormField-Ch69Jd-X.js → LpFormField-BKYn9dyP.js} +3 -3
- package/dist/chunks/{LpFrame-BVQCQLDI.js → LpFrame-Bv5Fphte.js} +25 -11
- package/dist/chunks/{LpHintExample-9Py0wc-L.js → LpHintExample-YzCXiSUp.js} +1 -1
- package/dist/chunks/{LpHintLayer-CgObdUsM.js → LpHintLayer-BeKRsRon.js} +2 -2
- package/dist/chunks/{LpHints-Bz-BlaSl.js → LpHints-qf3xYsza.js} +3 -3
- package/dist/chunks/{LpHoverCard-spGxyw7T.js → LpHoverCard-DanH3Nz1.js} +23 -5
- package/dist/chunks/{LpIcon--5WSb3jJ.js → LpIcon-C6JpQ5td.js} +6 -3
- package/dist/chunks/{LpIdenticon-BzdC_qz9.js → LpIdenticon-Dbbr4fvt.js} +2 -1
- package/dist/chunks/{LpInfraNode-46XOCkfq.js → LpInfraNode-BAU40Km2.js} +2 -2
- package/dist/chunks/{LpInput-Tw-yxT4I.js → LpInput-DL6HEJdi.js} +16 -28
- package/dist/chunks/LpInspector-CuoMAhiw.js +209 -0
- package/dist/chunks/{LpLightbox-B95yu22B.js → LpLightbox-xvpQ64MM.js} +57 -32
- package/dist/chunks/{LpLoader-DVwkOmt9.js → LpLoader-Bf1yZwaU.js} +1 -1
- package/dist/chunks/LpLogInspector-6cNnXqp4.js +119 -0
- package/dist/chunks/{LpLogViewer-ngqkns4m.js → LpLogViewer-Dvb1E9_G.js} +234 -53
- package/dist/chunks/{LpMapPicker-DRGgh89B.js → LpMapPicker-D5_YLLBC.js} +4 -3
- package/dist/chunks/{LpMasonry--k0571qG.js → LpMasonry-DPYekFxs.js} +8 -5
- package/dist/chunks/{LpMediaGallery-Bkram-MO.js → LpMediaGallery-Df-tiWeq.js} +3 -3
- package/dist/chunks/{LpModal-CoGhLTyH.js → LpModal-DrtQ_1A2.js} +11 -13
- package/dist/chunks/{LpModalNav-BGvs2y5Q.js → LpModalNav-DkmGCnZE.js} +11 -37
- package/dist/chunks/{LpNotificationBell-B0034Lk-.js → LpNotificationBell-D_wklO1m.js} +9 -9
- package/dist/chunks/{LpNumberField-e0IBkWU1.js → LpNumberField-CNHsmSDZ.js} +7 -16
- package/dist/chunks/{LpOtpInput-CeBPsM7D.js → LpOtpInput-BRpLBbOD.js} +2 -2
- package/dist/chunks/{LpPagination-BIIiYHXR.js → LpPagination-snQ020xQ.js} +6 -4
- package/dist/chunks/{LpPaletteTheme-DiLYKQiZ.js → LpPaletteTheme-dVtxHx-F.js} +4 -4
- package/dist/chunks/{LpPasswordInput-BkHKQDhM.js → LpPasswordInput-B-zD6tUS.js} +2 -2
- package/dist/chunks/{LpPhoneInput-CETEp5W7.js → LpPhoneInput-BSL7NX4z.js} +15 -26
- package/dist/chunks/{LpPie-DrZepi0p.js → LpPie-9t_guO49.js} +22 -21
- package/dist/chunks/{LpPipeline-B3aOVOkV.js → LpPipeline-rjXvEDRJ.js} +16 -7
- package/dist/chunks/{LpPopover-DmZ3wUtP.js → LpPopover-BQSuxtai.js} +10 -1
- package/dist/chunks/{LpProgress-Yr6ONG5t.js → LpProgress-D_MSjowb.js} +2 -1
- package/dist/chunks/{LpQuota-Dk2MyI2Z.js → LpQuota-CgWPgdVt.js} +1 -1
- package/dist/chunks/{LpRadioGroup-ggaPL92T.js → LpRadioGroup-BrazjLY_.js} +4 -4
- package/dist/chunks/{LpRangeCalendar-CYYUYqJ7.js → LpRangeCalendar-BrqlGZzE.js} +1 -1
- package/dist/chunks/{LpRangeSlider-CM-0ZITZ.js → LpRangeSlider-fz61tzc-.js} +5 -9
- package/dist/chunks/{LpRelativeTime-DwgCb5-8.js → LpRelativeTime-BovUk8MP.js} +1 -1
- package/dist/chunks/{LpRepeater-D7ZmnIYd.js → LpRepeater-BkJHSPI1.js} +3 -3
- package/dist/chunks/{LpRevealOnScroll-DcQjexLy.js → LpRevealOnScroll-CPwyiQAr.js} +1 -1
- package/dist/chunks/{LpScramble-Bn9OoOtC.js → LpScramble-DsE77iVp.js} +1 -1
- package/dist/chunks/{LpScrollArea-MyEnVB_5.js → LpScrollArea-ay4Xo_hg.js} +22 -10
- package/dist/chunks/{LpSecretField-BbmqM9ye.js → LpSecretField-DBvU6iAw.js} +10 -9
- package/dist/chunks/{LpSection-DFK_uoJE.js → LpSection-BfteipxU.js} +1 -1
- package/dist/chunks/{LpSegmented-CeACsMMA.js → LpSegmented-DbEJhbv-.js} +8 -10
- package/dist/chunks/{LpSelect-Cxq4yBGd.js → LpSelect-Y-iuSymW.js} +47 -30
- package/dist/chunks/{LpShaderBackdrop-Bote0iuy.js → LpShaderBackdrop-wQygYb5h.js} +13 -10
- package/dist/chunks/{LpShift-CCq7dofl.js → LpShift-DAgS_d2x.js} +18 -15
- package/dist/chunks/{LpSidebar-DzE1783C.js → LpSidebar-kSkpPh3-.js} +74 -87
- package/dist/chunks/{LpSidebarNav-DE3PhXVP.js → LpSidebarNav-C2mvqrY2.js} +8 -6
- package/dist/chunks/{LpSidebarRow-BRYhNDSo.js → LpSidebarRow-eRP4Q31q.js} +6 -5
- package/dist/chunks/{LpSlider-DxYoCJJO.js → LpSlider-A4ixovgS.js} +5 -9
- package/dist/chunks/{LpSpotlight-4F3NeUMY.js → LpSpotlight-DwxkhFgR.js} +2 -1
- package/dist/chunks/{LpStat-f2LfDCJ4.js → LpStat-pMNZgFcq.js} +2 -2
- package/dist/chunks/{LpStatus-DglxttQ7.js → LpStatus-DGJFwk5F.js} +2 -2
- package/dist/chunks/{LpStepMark-DpzKVyh8.js → LpStepMark-Dw2MRTrt.js} +2 -2
- package/dist/chunks/{LpStepper-DpsocBNJ.js → LpStepper-DNnh7lCu.js} +1 -1
- package/dist/chunks/{LpSwap-C96c0LWh.js → LpSwap-M7nFeW3C.js} +1 -1
- package/dist/chunks/{LpSwitch-BnXd1llc.js → LpSwitch-DnC2-0aV.js} +3 -3
- package/dist/chunks/{LpTabFace-DPCwKkH2.js → LpTabFace-DQoV8mQG.js} +2 -2
- package/dist/chunks/{LpTableFilter-CiVBpaq0.js → LpTableFilter-DgARTsA1.js} +4 -4
- package/dist/chunks/{LpTableOfContents-BN5zvpnx.js → LpTableOfContents-CKkWEK6R.js} +14 -9
- package/dist/chunks/{LpTagsInput-C-mDG648.js → LpTagsInput-Dt0mteSj.js} +19 -27
- package/dist/chunks/{LpTextarea-TE-yZv2U.js → LpTextarea-Co0b9PVx.js} +8 -16
- package/dist/chunks/LpThemeProvider-XK6ZeWAE.js +81 -0
- package/dist/chunks/{LpThemeStudio-BpORDvH6.js → LpThemeStudio-DzYfE-5k.js} +12 -195
- package/dist/chunks/{LpThemeSwitcher-BnEn_mvf.js → LpThemeSwitcher-CFLkdbBL.js} +8 -6
- package/dist/chunks/{LpTimeField-BawSVsmt.js → LpTimeField-DeOcKWJq.js} +6 -9
- package/dist/chunks/{LpToaster-IwTXjbbU.js → LpToaster-QFj0P-5m.js} +10 -8
- package/dist/chunks/{LpTooltip-BcBvIx4z.js → LpTooltip-BJf3lZMq.js} +51 -19
- package/dist/chunks/LpTopologyCanvas-BOHHHZ_6.js +673 -0
- package/dist/chunks/{LpTour-BZq-mUMv.js → LpTour-ClKYhx4h.js} +7 -5
- package/dist/chunks/{LpTruncate-CflAIwiJ.js → LpTruncate-C6u3gjc6.js} +6 -5
- package/dist/chunks/{LpTypewriter-BCL_a6wE.js → LpTypewriter-CZIzpdbe.js} +2 -1
- package/dist/chunks/{LpUptimeBar-DqNvvMBK.js → LpUptimeBar-BnYmR2rj.js} +3 -3
- package/dist/chunks/{LpVideoBackdrop-DS1wGv-X.js → LpVideoBackdrop-Ct4St4ZL.js} +10 -13
- package/dist/chunks/LpWindow-B8YSRVTH.js +297 -0
- package/dist/chunks/LpWorkspaceSwitcher-D0e9upAy.js +139 -0
- package/dist/chunks/{MenuTitle-BmCNNTKH.js → MenuTitle-Bh5dAdV1.js} +1 -1
- package/dist/chunks/{OptionContent-22UT8zLn.js → OptionContent-CGb8QlHA.js} +1 -1
- package/dist/chunks/{PickerField-Bfh8id3d.js → PickerField-BM1dyafh.js} +4 -4
- package/dist/chunks/{RevealToggle-BEit1n6Z.js → RevealToggle-CCPDE8Mv.js} +3 -3
- package/dist/chunks/SliderRail-DhPREa_R.js +18 -0
- package/dist/chunks/{TourCard-DNclH3u_.js → TourCard-DAzTYfav.js} +4 -4
- package/dist/chunks/{icons-DMITlfw5.js → icons-CYfcpSDS.js} +26 -10
- package/dist/component-names.d.ts +1 -1
- package/dist/components/AppShellContextNav.vue.d.ts +13 -0
- package/dist/components/AppShellContextNav.vue.js +4 -0
- package/dist/components/ChartRangeSelector.vue.d.ts +21 -0
- package/dist/components/ChartRangeSelector.vue.js +4 -0
- package/dist/components/ContextMenuItems.vue.js +1 -1
- package/dist/components/DropzoneLinkField.vue.d.ts +2 -2
- package/dist/components/DropzoneLinkField.vue.js +1 -1
- package/dist/components/FieldWrapper.vue.js +1 -1
- package/dist/components/IconCloseButton.vue.d.ts +7 -0
- package/dist/components/IconCloseButton.vue.js +4 -0
- package/dist/components/LayoutCanvas.vue.js +1 -1
- package/dist/components/LayoutNode.vue.js +1 -1
- package/dist/components/LpActionBar.vue.js +1 -1
- package/dist/components/LpActivityLine.vue.js +1 -1
- package/dist/components/LpAddressInput.vue.js +1 -1
- package/dist/components/LpAlert.vue.js +1 -1
- package/dist/components/LpAppShell.vue.d.ts +110 -2
- package/dist/components/LpAppShell.vue.js +1 -1
- package/dist/components/LpAutocomplete.vue.js +1 -1
- package/dist/components/LpAvatar.vue.js +1 -1
- package/dist/components/LpBadge.vue.js +1 -1
- package/dist/components/LpBottomNav.vue.d.ts +5 -0
- package/dist/components/LpBottomNav.vue.js +1 -1
- package/dist/components/LpBreadcrumbs.vue.js +1 -1
- package/dist/components/LpButton.vue.d.ts +14 -2
- 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 +74 -2
- package/dist/components/LpChart.vue.js +326 -85
- package/dist/components/LpCheckbox.vue.d.ts +6 -2
- package/dist/components/LpCheckbox.vue.js +1 -1
- package/dist/components/LpCodeBlock.vue.js +1 -1
- package/dist/components/LpCodeDisplay.vue.js +1 -1
- package/dist/components/LpCollapse.vue.js +1 -1
- package/dist/components/LpColorPicker.vue.js +1 -1
- package/dist/components/LpCommandPalette.vue.d.ts +8 -0
- package/dist/components/LpCommandPalette.vue.js +107 -56
- package/dist/components/LpCommandScope.vue.js +1 -1
- package/dist/components/LpConfirmDialog.vue.js +1 -1
- package/dist/components/LpConfirmHost.vue.js +1 -1
- package/dist/components/LpContextMenu.vue.js +1 -1
- package/dist/components/LpContextSwitcher.vue.js +1 -1
- package/dist/components/LpCopyButton.vue.js +1 -1
- package/dist/components/LpCountdown.vue.js +1 -1
- package/dist/components/LpDataList.vue.d.ts +1 -1
- package/dist/components/LpDataList.vue.js +1 -1
- package/dist/components/LpDatePicker.vue.d.ts +3 -15
- package/dist/components/LpDatePicker.vue.js +1 -1
- package/dist/components/LpDateRangePicker.vue.d.ts +3 -13
- package/dist/components/LpDateRangePicker.vue.js +1 -1
- package/dist/components/LpDisclosure.vue.js +1 -1
- package/dist/components/LpDock.vue.js +21 -18
- package/dist/components/LpDrawer.vue.d.ts +1 -1
- package/dist/components/LpDrawer.vue.js +1 -1
- package/dist/components/LpDropdownMenu.vue.js +1 -1
- package/dist/components/LpDropzone.vue.js +14 -11
- package/dist/components/LpEditable.vue.js +1 -1
- package/dist/components/LpEmptyState.vue.js +1 -1
- package/dist/components/LpFieldNotice.vue.js +1 -1
- package/dist/components/LpFileTree.vue.d.ts +96 -6
- package/dist/components/LpFileTree.vue.js +1 -1
- package/dist/components/LpFileTreeNode.vue.d.ts +48 -0
- package/dist/components/LpFileTreeNode.vue.js +1 -1
- package/dist/components/LpFormField.vue.js +1 -1
- package/dist/components/LpFrame.vue.js +1 -1
- package/dist/components/LpGauge.vue.d.ts +1 -1
- package/dist/components/LpHintExample.vue.js +1 -1
- package/dist/components/LpHintLayer.vue.js +1 -1
- package/dist/components/LpHints.vue.js +1 -1
- package/dist/components/LpHoverCard.vue.js +1 -1
- package/dist/components/LpIcon.vue.d.ts +2 -0
- package/dist/components/LpIcon.vue.js +1 -1
- package/dist/components/LpIdenticon.vue.js +1 -1
- package/dist/components/LpImageEditor.vue.js +7 -6
- package/dist/components/LpInfraNode.vue.js +1 -1
- package/dist/components/LpInput.vue.d.ts +1 -1
- package/dist/components/LpInput.vue.js +1 -1
- package/dist/components/LpInspector.vue.d.ts +87 -0
- package/dist/components/LpInspector.vue.js +4 -0
- package/dist/components/LpLightbox.vue.d.ts +8 -0
- package/dist/components/LpLightbox.vue.js +1 -1
- package/dist/components/LpLoader.vue.d.ts +1 -1
- package/dist/components/LpLoader.vue.js +1 -1
- package/dist/components/LpLogInspector.vue.d.ts +18 -0
- package/dist/components/LpLogInspector.vue.js +4 -0
- package/dist/components/LpLogViewer.vue.d.ts +93 -0
- package/dist/components/LpLogViewer.vue.js +1 -1
- package/dist/components/LpMapPicker.vue.js +1 -1
- package/dist/components/LpMasonry.vue.js +1 -1
- package/dist/components/LpMediaGallery.vue.js +1 -1
- package/dist/components/LpModal.vue.d.ts +4 -2
- package/dist/components/LpModal.vue.js +1 -1
- package/dist/components/LpModalNav.vue.d.ts +5 -5
- package/dist/components/LpModalNav.vue.js +1 -1
- package/dist/components/LpNotificationBell.vue.d.ts +2 -2
- package/dist/components/LpNotificationBell.vue.js +1 -1
- package/dist/components/LpNumberField.vue.js +1 -1
- package/dist/components/LpOtpInput.vue.js +1 -1
- package/dist/components/LpPagination.vue.js +1 -1
- package/dist/components/LpPaletteFacts.vue.js +1 -1
- package/dist/components/LpPaletteHeader.vue.js +2 -2
- package/dist/components/LpPaletteTheme.vue.js +1 -1
- package/dist/components/LpPasswordInput.vue.js +1 -1
- package/dist/components/LpPhoneInput.vue.js +1 -1
- package/dist/components/LpPie.vue.d.ts +2 -2
- package/dist/components/LpPie.vue.js +1 -1
- package/dist/components/LpPipeline.vue.d.ts +4 -0
- package/dist/components/LpPipeline.vue.js +1 -1
- package/dist/components/LpPopover.vue.d.ts +7 -3
- 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/LpQuota.vue.js +1 -1
- package/dist/components/LpRadioGroup.vue.js +1 -1
- package/dist/components/LpRangeCalendar.vue.js +1 -1
- package/dist/components/LpRangeSlider.vue.js +1 -1
- package/dist/components/LpRelativeTime.vue.js +1 -1
- package/dist/components/LpRepeater.vue.js +1 -1
- package/dist/components/LpRevealOnScroll.vue.js +1 -1
- package/dist/components/LpScramble.vue.js +1 -1
- package/dist/components/LpScrollArea.vue.js +1 -1
- package/dist/components/LpSecretField.vue.js +1 -1
- package/dist/components/LpSection.vue.js +1 -1
- package/dist/components/LpSegmented.vue.js +1 -1
- package/dist/components/LpSelect.vue.js +1 -1
- package/dist/components/LpShaderBackdrop.vue.js +1 -1
- package/dist/components/LpShift.vue.js +1 -1
- package/dist/components/LpShortcutsDialog.vue.js +1 -1
- package/dist/components/LpSidebar.vue.d.ts +1 -1
- package/dist/components/LpSidebar.vue.js +1 -1
- package/dist/components/LpSidebarNav.vue.js +1 -1
- package/dist/components/LpSidebarRow.vue.js +1 -1
- package/dist/components/LpSlider.vue.js +1 -1
- package/dist/components/LpSparkline.vue.d.ts +1 -1
- package/dist/components/LpSpotlight.vue.js +1 -1
- package/dist/components/LpStat.vue.js +1 -1
- package/dist/components/LpStatus.vue.js +1 -1
- package/dist/components/LpStepMark.vue.js +1 -1
- package/dist/components/LpStepper.vue.js +1 -1
- package/dist/components/LpSwap.vue.js +1 -1
- package/dist/components/LpSwitch.vue.js +1 -1
- package/dist/components/LpTabFace.vue.js +1 -1
- package/dist/components/LpTable.vue.d.ts +132 -0
- package/dist/components/LpTable.vue.js +547 -135
- package/dist/components/LpTableFilter.vue.js +1 -1
- package/dist/components/LpTableOfContents.vue.js +1 -1
- package/dist/components/LpTabs.vue.js +6 -5
- package/dist/components/LpTagsInput.vue.js +1 -1
- package/dist/components/LpTextarea.vue.js +1 -1
- package/dist/components/LpThemeProvider.vue.d.ts +2 -0
- package/dist/components/LpThemeProvider.vue.js +1 -1
- package/dist/components/LpThemeStudio.vue.js +1 -1
- package/dist/components/LpThemeSwitcher.vue.js +1 -1
- package/dist/components/LpTimeField.vue.js +1 -1
- package/dist/components/LpToaster.vue.js +1 -1
- package/dist/components/LpTooltip.vue.js +1 -1
- package/dist/components/LpTopologyCanvas.vue.d.ts +131 -5
- package/dist/components/LpTopologyCanvas.vue.js +1 -1
- package/dist/components/LpTour.vue.js +1 -1
- package/dist/components/LpTruncate.vue.js +1 -1
- package/dist/components/LpTypewriter.vue.js +1 -1
- package/dist/components/LpUptimeBar.vue.js +1 -1
- package/dist/components/LpVideoBackdrop.vue.js +1 -1
- package/dist/components/LpWindow.vue.d.ts +99 -0
- package/dist/components/LpWindow.vue.js +4 -0
- package/dist/components/LpWorkspaceSwitcher.vue.d.ts +18 -0
- package/dist/components/LpWorkspaceSwitcher.vue.js +4 -0
- package/dist/components/MenuTitle.vue.js +1 -1
- package/dist/components/OptionContent.vue.js +1 -1
- package/dist/components/PickerField.vue.d.ts +2 -2
- package/dist/components/PickerField.vue.js +1 -1
- package/dist/components/RevealToggle.vue.js +1 -1
- package/dist/components/SliderRail.vue.d.ts +3 -0
- package/dist/components/SliderRail.vue.js +4 -0
- package/dist/components/TourCard.vue.js +1 -1
- package/dist/components/address.js +2 -1
- package/dist/components/appShell.d.ts +36 -0
- package/dist/components/appShell.js +30 -0
- package/dist/components/calendar.d.ts +12 -3
- package/dist/components/calendar.js +2 -5
- package/dist/components/chart.d.ts +21 -0
- package/dist/components/chart.js +4 -3
- package/dist/components/chartWindow.d.ts +57 -0
- package/dist/components/chartWindow.js +136 -0
- package/dist/components/color.js +1 -1
- package/dist/components/commandPalette.d.ts +16 -2
- package/dist/components/commandPalette.js +39 -4
- package/dist/components/controlSize.d.ts +5 -0
- package/dist/components/controlSize.js +8 -0
- package/dist/components/dropdown.d.ts +5 -0
- package/dist/components/dropdown.js +2 -0
- package/dist/components/exportData.d.ts +6 -1
- package/dist/components/exportData.js +25 -18
- package/dist/components/fileTree.d.ts +67 -0
- package/dist/components/fileTree.js +141 -1
- package/dist/components/identicon.js +3 -2
- package/dist/components/logTools.d.ts +93 -0
- package/dist/components/logTools.js +210 -0
- package/dist/components/menuWhen.js +1 -1
- package/dist/components/meter.js +2 -1
- package/dist/components/pipeline.d.ts +2 -0
- package/dist/components/pipeline.js +5 -0
- package/dist/components/relativeTime.js +2 -1
- package/dist/components/reveal.js +2 -1
- package/dist/components/select.d.ts +5 -0
- package/dist/components/select.js +10 -0
- package/dist/components/sidebar.d.ts +1 -0
- package/dist/components/tableFeatures.d.ts +58 -0
- package/dist/components/tableFeatures.js +87 -0
- package/dist/components/topologyGraph.d.ts +164 -0
- package/dist/components/topologyGraph.js +416 -0
- package/dist/components/tour.js +5 -3
- package/dist/components/videoBackdrop.js +7 -6
- package/dist/composables/clamp.d.ts +2 -0
- package/dist/composables/clamp.js +4 -0
- package/dist/composables/devWarn.d.ts +3 -0
- package/dist/composables/devWarn.js +14 -0
- package/dist/composables/easing.d.ts +13 -4
- package/dist/composables/easing.js +16 -10
- package/dist/composables/overlayHistory.js +14 -1
- package/dist/composables/pointerDrag.d.ts +15 -0
- package/dist/composables/pointerDrag.js +40 -0
- package/dist/composables/propCheck.d.ts +10 -0
- package/dist/composables/propCheck.js +78 -0
- package/dist/composables/realm.d.ts +6 -0
- package/dist/composables/realm.js +23 -0
- package/dist/composables/scroll.js +4 -2
- package/dist/composables/scrollMemory.d.ts +12 -1
- package/dist/composables/scrollMemory.js +36 -12
- package/dist/composables/spatialNav.js +2 -1
- package/dist/composables/textEntry.d.ts +17 -0
- package/dist/composables/textEntry.js +19 -0
- package/dist/composables/useAsyncTask.d.ts +6 -0
- package/dist/composables/useChartSync.d.ts +5 -0
- package/dist/composables/useChartSync.js +33 -0
- package/dist/composables/useCloseGuard.d.ts +3 -1
- package/dist/composables/useCloseGuard.js +6 -3
- package/dist/composables/useCommands.d.ts +50 -0
- package/dist/composables/useCommands.js +66 -0
- package/dist/composables/useField.d.ts +37 -0
- package/dist/composables/useField.js +27 -2
- package/dist/composables/useFitScale.js +4 -1
- package/dist/composables/useFormDraft.d.ts +13 -2
- package/dist/composables/useFormDraft.js +17 -9
- package/dist/composables/useHintSystem.js +2 -2
- package/dist/composables/useHotkeys.js +11 -32
- package/dist/composables/useInView.js +2 -1
- package/dist/composables/useInputFilter.js +7 -5
- package/dist/composables/useInputMask.js +5 -3
- package/dist/composables/useLinkedView.d.ts +97 -0
- package/dist/composables/useLinkedView.js +139 -0
- package/dist/composables/useOptimisticToggle.d.ts +3 -1
- package/dist/composables/useOptimisticToggle.js +2 -1
- package/dist/composables/useOverlayHistory.d.ts +7 -0
- package/dist/composables/useOverlayHistory.js +16 -2
- package/dist/composables/usePaintSelect.js +18 -14
- package/dist/composables/usePaletteCommands.d.ts +7 -0
- package/dist/composables/usePaletteCommands.js +12 -1
- package/dist/composables/usePersisted.d.ts +10 -0
- package/dist/composables/usePersisted.js +1 -1
- package/dist/composables/usePillTransition.d.ts +2 -2
- package/dist/composables/usePillTransition.js +5 -5
- package/dist/composables/useResizeObserver.js +2 -1
- package/dist/composables/useReveal.js +2 -1
- package/dist/composables/useRovingFocus.d.ts +2 -2
- package/dist/composables/useRovingFocus.js +9 -11
- package/dist/composables/useScramble.js +7 -1
- package/dist/composables/useShift.js +8 -6
- package/dist/composables/useTilt.js +2 -1
- package/dist/composables/useTween.js +9 -5
- package/dist/composables/useView.d.ts +1 -0
- package/dist/composables/useView.js +14 -2
- package/dist/composables/useZoomPan.js +2 -4
- package/dist/composables/windowing.d.ts +40 -0
- package/dist/composables/windowing.js +118 -0
- package/dist/icons-all.js +1 -1
- package/dist/icons.d.ts +4 -0
- package/dist/index.d.ts +30 -5
- package/dist/index.js +310 -264
- package/dist/layout/tree.js +19 -15
- package/dist/layout/useLayout.d.ts +2 -0
- package/dist/layout/useLayout.js +5 -1
- package/dist/layout/useWorkspaces.d.ts +52 -0
- package/dist/layout/useWorkspaces.js +140 -0
- package/dist/{chunks/backdrop-Dkf2vM81.js → theme/backdrop.js} +5 -5
- package/dist/theme/config.js +25 -0
- package/dist/theme/define.js +61 -0
- package/dist/{chunks/palette-Co8tSASo.js → theme/palette.js} +2 -2
- package/dist/theme/presets.js +239 -0
- package/dist/theme/studio.js +134 -0
- package/dist/theme/tokens.js +63 -0
- package/dist/theme/useTheme.d.ts +3 -2
- package/dist/theme/useTheme.js +325 -0
- package/package.json +8 -1
- package/src/component-names.ts +5 -1
- package/src/components/AppShellContextNav.vue +44 -0
- package/src/components/ChartRangeSelector.vue +120 -0
- package/src/components/IconCloseButton.vue +21 -0
- package/src/components/LayoutCanvas.vue +3 -0
- package/src/components/LayoutNode.vue +37 -38
- package/src/components/LpActivityLine.vue +4 -2
- package/src/components/LpAddressInput.vue +3 -3
- package/src/components/LpAppShell.vue +362 -24
- package/src/components/LpAutocomplete.vue +13 -30
- package/src/components/LpBottomNav.vue +9 -1
- package/src/components/LpBreadcrumbs.vue +2 -1
- package/src/components/LpButton.vue +11 -4
- package/src/components/LpChart.vue +336 -37
- package/src/components/LpCheckbox.vue +43 -9
- package/src/components/LpCodeBlock.vue +17 -23
- package/src/components/LpCollapse.vue +5 -4
- package/src/components/LpColorPicker.vue +8 -9
- package/src/components/LpCommandPalette.vue +133 -50
- package/src/components/LpContextMenu.vue +15 -13
- package/src/components/LpCountdown.vue +2 -1
- package/src/components/LpDataList.vue +13 -1
- package/src/components/LpDatePicker.vue +5 -17
- package/src/components/LpDateRangePicker.vue +5 -16
- package/src/components/LpDock.vue +25 -16
- package/src/components/LpDrawer.vue +70 -61
- package/src/components/LpDropdownMenu.vue +6 -10
- package/src/components/LpDropzone.vue +12 -7
- package/src/components/LpEditable.vue +6 -2
- package/src/components/LpFileTree.vue +507 -66
- package/src/components/LpFileTreeNode.vue +106 -5
- package/src/components/LpFormField.vue +1 -1
- package/src/components/LpFrame.vue +33 -13
- package/src/components/LpHoverCard.vue +30 -5
- package/src/components/LpIcon.vue +6 -2
- package/src/components/LpIdenticon.vue +2 -1
- package/src/components/LpImageEditor.vue +5 -2
- package/src/components/LpInput.vue +15 -23
- package/src/components/LpInspector.vue +197 -0
- package/src/components/LpLightbox.vue +74 -29
- package/src/components/LpLogInspector.vue +85 -0
- package/src/components/LpLogViewer.vue +239 -29
- package/src/components/LpMapPicker.vue +2 -1
- package/src/components/LpMasonry.vue +8 -5
- package/src/components/LpModal.vue +12 -12
- package/src/components/LpModalNav.vue +2 -21
- package/src/components/LpNumberField.vue +6 -15
- package/src/components/LpOtpInput.vue +2 -2
- package/src/components/LpPagination.vue +5 -3
- package/src/components/LpPhoneInput.vue +8 -19
- package/src/components/LpPie.vue +25 -23
- package/src/components/LpPipeline.vue +14 -1
- package/src/components/LpPopover.vue +23 -2
- package/src/components/LpProgress.vue +2 -1
- package/src/components/LpRadioGroup.vue +2 -2
- package/src/components/LpRangeSlider.vue +5 -6
- package/src/components/LpRevealOnScroll.vue +1 -1
- package/src/components/LpScrollArea.vue +28 -11
- package/src/components/LpSecretField.vue +2 -1
- package/src/components/LpSegmented.vue +6 -8
- package/src/components/LpSelect.vue +54 -24
- package/src/components/LpShaderBackdrop.vue +12 -9
- package/src/components/LpShift.vue +18 -15
- package/src/components/LpSidebar.vue +77 -74
- package/src/components/LpSidebarNav.vue +3 -2
- package/src/components/LpSidebarRow.vue +2 -1
- package/src/components/LpSlider.vue +5 -6
- package/src/components/LpSpotlight.vue +2 -1
- package/src/components/LpSwitch.vue +5 -3
- package/src/components/LpTable.vue +609 -93
- package/src/components/LpTableFilter.vue +1 -1
- package/src/components/LpTableOfContents.vue +16 -9
- package/src/components/LpTabs.vue +2 -1
- package/src/components/LpTagsInput.vue +12 -19
- package/src/components/LpTextarea.vue +5 -11
- package/src/components/LpThemeProvider.vue +29 -13
- package/src/components/LpTimeField.vue +4 -7
- package/src/components/LpToaster.vue +7 -6
- package/src/components/LpTooltip.vue +62 -18
- package/src/components/LpTopologyCanvas.vue +567 -42
- package/src/components/LpTour.vue +7 -5
- package/src/components/LpTruncate.vue +4 -3
- package/src/components/LpTypewriter.vue +2 -1
- package/src/components/LpVideoBackdrop.vue +11 -13
- package/src/components/LpWindow.vue +373 -0
- package/src/components/LpWorkspaceSwitcher.vue +116 -0
- package/src/components/PickerField.vue +2 -2
- package/src/components/SliderRail.vue +10 -0
- package/src/components/address.ts +3 -1
- package/src/components/appShell.ts +74 -0
- package/src/components/calendar.ts +12 -5
- package/src/components/chart.ts +27 -3
- package/src/components/chartWindow.ts +198 -0
- package/src/components/color.ts +2 -1
- package/src/components/commandPalette.ts +66 -5
- package/src/components/controlSize.ts +6 -0
- package/src/components/dropdown.ts +3 -0
- package/src/components/exportData.ts +33 -18
- package/src/components/fileTree.ts +215 -0
- package/src/components/identicon.ts +4 -2
- package/src/components/logTools.ts +298 -0
- package/src/components/meter.ts +2 -1
- package/src/components/pipeline.ts +6 -0
- package/src/components/relativeTime.ts +2 -1
- package/src/components/reveal.ts +3 -1
- package/src/components/select.ts +14 -0
- package/src/components/sidebar.ts +1 -0
- package/src/components/tableFeatures.ts +149 -0
- package/src/components/topologyGraph.ts +655 -0
- package/src/components/tour.ts +5 -3
- package/src/components/videoBackdrop.ts +7 -6
- package/src/composables/clamp.ts +2 -0
- package/src/composables/devWarn.ts +19 -0
- package/src/composables/easing.ts +37 -12
- package/src/composables/overlayHistory.ts +24 -0
- package/src/composables/pointerDrag.ts +54 -0
- package/src/composables/propCheck.ts +90 -0
- package/src/composables/realm.ts +25 -0
- package/src/composables/scroll.ts +4 -2
- package/src/composables/scrollMemory.ts +56 -14
- package/src/composables/spatialNav.ts +2 -1
- package/src/composables/textEntry.ts +33 -0
- package/src/composables/useAsyncTask.ts +6 -0
- package/src/composables/useChartSync.ts +52 -0
- package/src/composables/useCloseGuard.ts +22 -10
- package/src/composables/useCommands.ts +123 -0
- package/src/composables/useField.ts +41 -2
- package/src/composables/useFitScale.ts +4 -1
- package/src/composables/useFormDraft.ts +38 -14
- package/src/composables/useHintSystem.ts +2 -2
- package/src/composables/useHotkeys.ts +19 -48
- package/src/composables/useInView.ts +2 -1
- package/src/composables/useInputFilter.ts +8 -5
- package/src/composables/useInputMask.ts +8 -3
- package/src/composables/useLinkedView.ts +222 -0
- package/src/composables/useOptimisticToggle.ts +7 -1
- package/src/composables/useOverlayHistory.ts +20 -0
- package/src/composables/usePaintSelect.ts +20 -14
- package/src/composables/usePaletteCommands.ts +13 -0
- package/src/composables/usePersisted.ts +10 -0
- package/src/composables/usePillTransition.ts +9 -6
- package/src/composables/useResizeObserver.ts +2 -1
- package/src/composables/useReveal.ts +2 -1
- package/src/composables/useRovingFocus.ts +11 -14
- package/src/composables/useScramble.ts +12 -1
- package/src/composables/useShift.ts +8 -6
- package/src/composables/useTilt.ts +2 -1
- package/src/composables/useTween.ts +10 -5
- package/src/composables/useView.ts +17 -3
- package/src/composables/useZoomPan.ts +2 -5
- package/src/composables/windowing.ts +190 -0
- package/src/icons.ts +27 -6
- package/src/index.ts +41 -4
- package/src/kit-icons.ts +1 -1
- package/src/layout/tree.ts +31 -16
- package/src/layout/useLayout.ts +6 -0
- package/src/layout/useWorkspaces.ts +234 -0
- package/src/nuxt.ts +9 -1
- package/src/runtime/propCheck.plugin.ts +10 -0
- package/src/theme/studio.ts +7 -5
- package/src/theme/useTheme.ts +89 -15
- package/src/tokens/tokens.css +8 -1
- package/dist/assets/LpTabs-CJ0rYQbx.css +0 -18
- package/dist/chunks/LpAppShell-Dgejipzz.js +0 -319
- package/dist/chunks/LpFileTree-CooHinsC.js +0 -425
- package/dist/chunks/LpThemeProvider-8MG6yqU9.js +0 -640
- package/dist/chunks/LpTopologyCanvas-B1gIbS0n.js +0 -298
|
@@ -16,11 +16,12 @@ export default { inheritAttrs: false }
|
|
|
16
16
|
* (the one matching `focusedId`), which is what a11y expects of role="tree" —
|
|
17
17
|
* Tab enters the tree once, arrows move within it. The parent owns that state.
|
|
18
18
|
*/
|
|
19
|
-
import { computed } from "vue"
|
|
19
|
+
import { computed, nextTick, ref, watch } from "vue"
|
|
20
20
|
import {
|
|
21
21
|
fileIcon,
|
|
22
22
|
formatModified,
|
|
23
23
|
formatSize,
|
|
24
|
+
renameSelectionEnd,
|
|
24
25
|
sortNodes,
|
|
25
26
|
type FileNode,
|
|
26
27
|
type NodeStats,
|
|
@@ -53,6 +54,21 @@ const props = defineProps<{
|
|
|
53
54
|
stats: Map<string, NodeStats>
|
|
54
55
|
showSize: boolean
|
|
55
56
|
showModified: boolean
|
|
57
|
+
/** Rows picked with Ctrl and Shift, in `multiple` mode. */
|
|
58
|
+
selectedIds?: ReadonlySet<string>
|
|
59
|
+
multiple?: boolean
|
|
60
|
+
/** The root flattens the tree to window it: this row renders alone, with its place stated. */
|
|
61
|
+
flat?: boolean
|
|
62
|
+
setSize?: number
|
|
63
|
+
posInSet?: number
|
|
64
|
+
/** Rows can be dragged; the root decides where they land. */
|
|
65
|
+
movable?: boolean
|
|
66
|
+
dropTargetId?: string
|
|
67
|
+
/** The row being renamed, the text in its field and whether that text can stand. */
|
|
68
|
+
renamingId?: string
|
|
69
|
+
renameValue?: string
|
|
70
|
+
renameInvalid?: boolean
|
|
71
|
+
renameLabel?: string
|
|
56
72
|
}>()
|
|
57
73
|
|
|
58
74
|
const emit = defineEmits<{
|
|
@@ -60,6 +76,15 @@ const emit = defineEmits<{
|
|
|
60
76
|
(e: "toggle", node: FileNode): void
|
|
61
77
|
(e: "focus", node: FileNode): void
|
|
62
78
|
(e: "check", node: FileNode, value: boolean): void
|
|
79
|
+
(e: "pick", node: FileNode, mode: "toggle" | "range"): void
|
|
80
|
+
(e: "move-start", node: FileNode, event: DragEvent): void
|
|
81
|
+
(e: "move-over", node: FileNode, event: DragEvent): void
|
|
82
|
+
(e: "move-leave", node: FileNode): void
|
|
83
|
+
(e: "move-drop", node: FileNode): void
|
|
84
|
+
(e: "move-end"): void
|
|
85
|
+
(e: "rename-input", value: string): void
|
|
86
|
+
(e: "rename-commit", blurred?: boolean): void
|
|
87
|
+
(e: "rename-cancel"): void
|
|
63
88
|
}>()
|
|
64
89
|
|
|
65
90
|
// Declared explicitly: the component renders itself, so an inferred slot type
|
|
@@ -71,7 +96,8 @@ defineSlots<{
|
|
|
71
96
|
const isDir = computed(() => props.node.kind === "dir")
|
|
72
97
|
const isOpen = computed(() => isDir.value && props.expanded.has(props.node.id))
|
|
73
98
|
const isLoading = computed(() => props.loading.has(props.node.id))
|
|
74
|
-
const isSelected = computed(() => props.selectedId === props.node.id)
|
|
99
|
+
const isSelected = computed(() => props.selectedId === props.node.id || !!props.selectedIds?.has(props.node.id))
|
|
100
|
+
const isRenaming = computed(() => props.renamingId === props.node.id)
|
|
75
101
|
const isFocused = computed(() => props.focusedId === props.node.id)
|
|
76
102
|
|
|
77
103
|
// A directory with no `children` array hasn't been loaded yet — we can't know if
|
|
@@ -127,15 +153,50 @@ function rowDelay(index: number): string {
|
|
|
127
153
|
return `${staggerDelay(index, 0, 18, 10)}ms`
|
|
128
154
|
}
|
|
129
155
|
|
|
130
|
-
function onActivate() {
|
|
156
|
+
function onActivate(event: MouseEvent) {
|
|
131
157
|
if (props.node.disabled) return
|
|
132
158
|
emit("focus", props.node)
|
|
159
|
+
if (props.multiple && (event.shiftKey || event.ctrlKey || event.metaKey)) {
|
|
160
|
+
emit("pick", props.node, event.shiftKey ? "range" : "toggle")
|
|
161
|
+
return
|
|
162
|
+
}
|
|
133
163
|
// A directory row toggles; a file row selects. Directories still emit select
|
|
134
164
|
// so callers can drive a details panel off the highlighted entry.
|
|
135
165
|
emit("select", props.node)
|
|
136
166
|
if (isDir.value) emit("toggle", props.node)
|
|
137
167
|
}
|
|
138
168
|
|
|
169
|
+
const renameField = ref<HTMLInputElement | null>(null)
|
|
170
|
+
|
|
171
|
+
// Opens on the name without its extension, so typing replaces only that.
|
|
172
|
+
watch(
|
|
173
|
+
isRenaming,
|
|
174
|
+
async (renaming) => {
|
|
175
|
+
if (!renaming) return
|
|
176
|
+
await nextTick()
|
|
177
|
+
renameField.value?.focus()
|
|
178
|
+
renameField.value?.setSelectionRange(0, renameSelectionEnd(props.node))
|
|
179
|
+
},
|
|
180
|
+
{ immediate: true },
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
// The field keeps every key to itself: the tree would take the arrows and Home,
|
|
184
|
+
// and a dialog around it would close on the Escape that cancels the rename.
|
|
185
|
+
function onRenameKey(event: KeyboardEvent) {
|
|
186
|
+
event.stopPropagation()
|
|
187
|
+
if (event.key === "Enter") emit("rename-commit", false)
|
|
188
|
+
else if (event.key === "Escape") emit("rename-cancel")
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
function onMoveStart(event: DragEvent) {
|
|
192
|
+
if (event.dataTransfer) {
|
|
193
|
+
event.dataTransfer.effectAllowed = "move"
|
|
194
|
+
// Firefox starts no drag without data.
|
|
195
|
+
event.dataTransfer.setData("text/plain", props.node.name)
|
|
196
|
+
}
|
|
197
|
+
emit("move-start", props.node, event)
|
|
198
|
+
}
|
|
199
|
+
|
|
139
200
|
// A node is a list row whose min-width the consumer may need to release when the tree scrolls horizontally.
|
|
140
201
|
const { class: rootClass, attrs: rest } = useMergedAttrs(
|
|
141
202
|
"min-w-0",
|
|
@@ -151,6 +212,8 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
|
|
|
151
212
|
:aria-selected="isSelected"
|
|
152
213
|
:aria-expanded="canExpand ? isOpen : undefined"
|
|
153
214
|
:aria-disabled="node.disabled || undefined"
|
|
215
|
+
:aria-setsize="flat ? setSize : undefined"
|
|
216
|
+
:aria-posinset="flat ? posInSet : undefined"
|
|
154
217
|
>
|
|
155
218
|
<!-- Passthrough when the node has no menu, so the row keeps the native one.
|
|
156
219
|
Headed by the entry's own name and icon: in a column of look-alike
|
|
@@ -166,6 +229,8 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
|
|
|
166
229
|
<div
|
|
167
230
|
:data-node-id="node.id"
|
|
168
231
|
:tabindex="isFocused ? 0 : -1"
|
|
232
|
+
:draggable="movable && !node.disabled && !isRenaming ? 'true' : undefined"
|
|
233
|
+
:data-drop-target="dropTargetId === node.id ? '' : undefined"
|
|
169
234
|
class="group/row relative flex min-w-0 cursor-pointer select-none items-center gap-1.5 rounded-control py-1 pr-2 text-sm outline-none transition-colors duration-[var(--duration-fast)] focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring"
|
|
170
235
|
:class="[
|
|
171
236
|
node.disabled
|
|
@@ -173,9 +238,15 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
|
|
|
173
238
|
: isSelected
|
|
174
239
|
? 'bg-brand-soft text-ink'
|
|
175
240
|
: 'text-muted hover:bg-surface-soft hover:text-ink',
|
|
241
|
+
dropTargetId === node.id ? 'ring-2 ring-inset ring-brand' : '',
|
|
176
242
|
]"
|
|
177
243
|
:style="{ paddingLeft: `${depth * 14 + 6}px` }"
|
|
178
244
|
@click.stop="onActivate"
|
|
245
|
+
@dragstart="onMoveStart"
|
|
246
|
+
@dragover="emit('move-over', node, $event)"
|
|
247
|
+
@dragleave="emit('move-leave', node)"
|
|
248
|
+
@drop.prevent="emit('move-drop', node)"
|
|
249
|
+
@dragend="emit('move-end')"
|
|
179
250
|
>
|
|
180
251
|
<!-- Chevron sits in a fixed-width slot so names line up whether or not
|
|
181
252
|
the row can expand. Leaves get the same gutter, left empty.
|
|
@@ -228,7 +299,20 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
|
|
|
228
299
|
/>
|
|
229
300
|
|
|
230
301
|
<span class="min-w-0 flex-1 shrink-[2] truncate">
|
|
231
|
-
<
|
|
302
|
+
<input
|
|
303
|
+
v-if="isRenaming"
|
|
304
|
+
ref="renameField"
|
|
305
|
+
class="w-full min-w-0 rounded-sm border bg-surface-soft px-1 text-sm text-ink outline-none"
|
|
306
|
+
:class="renameInvalid ? 'border-danger' : 'border-line-strong'"
|
|
307
|
+
:value="renameValue"
|
|
308
|
+
:aria-label="renameLabel"
|
|
309
|
+
:aria-invalid="renameInvalid || undefined"
|
|
310
|
+
@click.stop
|
|
311
|
+
@keydown="onRenameKey"
|
|
312
|
+
@input="emit('rename-input', ($event.target as HTMLInputElement).value)"
|
|
313
|
+
@blur="emit('rename-commit', true)"
|
|
314
|
+
>
|
|
315
|
+
<slot v-else name="row" :node="node" :depth="depth" :expanded="isOpen" :selected="isSelected">
|
|
232
316
|
{{ node.name }}
|
|
233
317
|
</slot>
|
|
234
318
|
</span>
|
|
@@ -260,7 +344,7 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
|
|
|
260
344
|
|
|
261
345
|
<!-- The branch folds open and shut (LpCollapse); a toggle mid-way reverses
|
|
262
346
|
from where it is. Rows inside stagger themselves in. -->
|
|
263
|
-
<LpCollapse :open="isOpen && hasChildren">
|
|
347
|
+
<LpCollapse v-if="!flat" :open="isOpen && hasChildren">
|
|
264
348
|
<ul role="group" class="flex min-w-0 flex-col overflow-hidden">
|
|
265
349
|
<LpFileTreeNode
|
|
266
350
|
v-for="(child, i) in children"
|
|
@@ -280,10 +364,27 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
|
|
|
280
364
|
:stats="stats"
|
|
281
365
|
:show-size="showSize"
|
|
282
366
|
:show-modified="showModified"
|
|
367
|
+
:selected-ids="selectedIds"
|
|
368
|
+
:multiple="multiple"
|
|
369
|
+
:movable="movable"
|
|
370
|
+
:drop-target-id="dropTargetId"
|
|
371
|
+
:renaming-id="renamingId"
|
|
372
|
+
:rename-value="renameValue"
|
|
373
|
+
:rename-invalid="renameInvalid"
|
|
374
|
+
:rename-label="renameLabel"
|
|
283
375
|
@select="emit('select', $event)"
|
|
284
376
|
@toggle="emit('toggle', $event)"
|
|
285
377
|
@focus="emit('focus', $event)"
|
|
286
378
|
@check="(n, v) => emit('check', n, v)"
|
|
379
|
+
@pick="(n, mode) => emit('pick', n, mode)"
|
|
380
|
+
@move-start="(n, e) => emit('move-start', n, e)"
|
|
381
|
+
@move-over="(n, e) => emit('move-over', n, e)"
|
|
382
|
+
@move-leave="emit('move-leave', $event)"
|
|
383
|
+
@move-drop="emit('move-drop', $event)"
|
|
384
|
+
@move-end="emit('move-end')"
|
|
385
|
+
@rename-input="emit('rename-input', $event)"
|
|
386
|
+
@rename-commit="emit('rename-commit', $event)"
|
|
387
|
+
@rename-cancel="emit('rename-cancel')"
|
|
287
388
|
>
|
|
288
389
|
<template #row="slotProps">
|
|
289
390
|
<slot name="row" v-bind="slotProps" />
|
|
@@ -81,7 +81,7 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
|
|
|
81
81
|
const control = ref<HTMLElement | null>(null)
|
|
82
82
|
const LABELABLE = "input, button, select, textarea, meter, output, progress"
|
|
83
83
|
function focusControl() {
|
|
84
|
-
const target =
|
|
84
|
+
const target = control.value?.ownerDocument.getElementById(id.value)
|
|
85
85
|
if (target?.matches(LABELABLE)) return
|
|
86
86
|
const first = control.value?.querySelector<HTMLElement>(
|
|
87
87
|
'input:not([type="hidden"]):not([disabled]), button:not([disabled]), select, textarea, [tabindex]:not([tabindex="-1"]), [contenteditable="true"]',
|
|
@@ -59,24 +59,41 @@ const { class: frameClass, attrs: rest } = useMergedAttrs(
|
|
|
59
59
|
)
|
|
60
60
|
|
|
61
61
|
const cleanups: (() => void)[] = []
|
|
62
|
+
const LAYERS = "[data-dismissable-layer], [role=dialog], [role=menu], [role=listbox]"
|
|
63
|
+
|
|
64
|
+
/* What can change on a stylesheet that is already in the page: a theme swapped by `href`, one turned off. */
|
|
65
|
+
const SHEET_ATTRIBUTES = ["href", "rel", "media", "disabled", "crossorigin", "integrity", "title", "type"]
|
|
62
66
|
|
|
63
67
|
function mirrorHead(doc: Document) {
|
|
64
|
-
const copies = new Map<Node,
|
|
68
|
+
const copies = new Map<Node, Element>()
|
|
69
|
+
const isSheet = (node: Node) => node instanceof HTMLStyleElement || (node instanceof HTMLLinkElement && node.rel === "stylesheet")
|
|
65
70
|
const copy = (node: Node) => {
|
|
66
|
-
if (!(node
|
|
67
|
-
const clone = doc.importNode(node, true)
|
|
71
|
+
if (!isSheet(node) || copies.has(node)) return
|
|
72
|
+
const clone = doc.importNode(node as Element, true)
|
|
68
73
|
copies.set(node, clone)
|
|
69
74
|
doc.head.appendChild(clone)
|
|
70
75
|
}
|
|
76
|
+
const drop = (node: Node) => {
|
|
77
|
+
copies.get(node)?.remove()
|
|
78
|
+
copies.delete(node)
|
|
79
|
+
}
|
|
80
|
+
const syncAttribute = (node: Element, name: string) => {
|
|
81
|
+
if (!isSheet(node)) return drop(node)
|
|
82
|
+
if (!copies.has(node)) return copy(node)
|
|
83
|
+
const value = node.getAttribute(name)
|
|
84
|
+
if (value === null) copies.get(node)!.removeAttribute(name)
|
|
85
|
+
else copies.get(node)!.setAttribute(name, value)
|
|
86
|
+
}
|
|
71
87
|
for (const node of document.head.childNodes) copy(node)
|
|
72
88
|
const observer = new MutationObserver((records) => {
|
|
73
89
|
for (const record of records) {
|
|
74
90
|
if (record.type === "childList") {
|
|
75
91
|
for (const node of record.addedNodes) copy(node)
|
|
76
|
-
for (const node of record.removedNodes)
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
92
|
+
for (const node of record.removedNodes) drop(node)
|
|
93
|
+
continue
|
|
94
|
+
}
|
|
95
|
+
if (record.type === "attributes") {
|
|
96
|
+
syncAttribute(record.target as Element, record.attributeName!)
|
|
80
97
|
continue
|
|
81
98
|
}
|
|
82
99
|
// A style rewritten in place (a hot reload) is copied again.
|
|
@@ -84,7 +101,7 @@ function mirrorHead(doc: Document) {
|
|
|
84
101
|
if (style instanceof HTMLStyleElement && copies.has(style)) copies.get(style)!.textContent = style.textContent
|
|
85
102
|
}
|
|
86
103
|
})
|
|
87
|
-
observer.observe(document.head, { childList: true, subtree: true, characterData: true })
|
|
104
|
+
observer.observe(document.head, { childList: true, subtree: true, characterData: true, attributes: true, attributeFilter: SHEET_ATTRIBUTES })
|
|
88
105
|
cleanups.push(() => observer.disconnect())
|
|
89
106
|
}
|
|
90
107
|
|
|
@@ -118,7 +135,9 @@ function liftForeignLocks(doc: Document) {
|
|
|
118
135
|
}
|
|
119
136
|
}
|
|
120
137
|
const observer = new MutationObserver(lift)
|
|
121
|
-
|
|
138
|
+
// The child list too: when the page's own layer goes while the frame's stays,
|
|
139
|
+
// reka keeps the lock and the style never changes to say so.
|
|
140
|
+
observer.observe(document.body, { attributes: true, attributeFilter: ["style"], childList: true, subtree: true })
|
|
122
141
|
cleanups.push(() => observer.disconnect())
|
|
123
142
|
}
|
|
124
143
|
|
|
@@ -143,12 +162,13 @@ function setup() {
|
|
|
143
162
|
let pending = 0
|
|
144
163
|
const measure = () => {
|
|
145
164
|
pending = 0
|
|
146
|
-
|
|
165
|
+
// scrollHeight as well: what is positioned inside overflows the box without growing it.
|
|
166
|
+
let bottom = Math.max(content.offsetHeight, content.scrollHeight)
|
|
147
167
|
for (const child of doc.body.children) {
|
|
148
168
|
if (child === content) continue
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
169
|
+
// The portal's root can be the layer itself, which querySelectorAll skips.
|
|
170
|
+
const layers = [...(child.matches(LAYERS) ? [child] : []), ...child.querySelectorAll(LAYERS)]
|
|
171
|
+
for (const layer of layers) bottom = Math.max(bottom, Math.ceil(layer.getBoundingClientRect().bottom + 8))
|
|
152
172
|
}
|
|
153
173
|
contentHeight.value = bottom
|
|
154
174
|
}
|
|
@@ -94,7 +94,11 @@ const guardOutside = useOutsideGuard()
|
|
|
94
94
|
* the link under it.
|
|
95
95
|
*/
|
|
96
96
|
const SLOP = 8
|
|
97
|
+
/* A long press may produce no click at all; past this the next click is the user's own. */
|
|
98
|
+
const CLICK_AFTER_RELEASE_MS = 350
|
|
97
99
|
let holdTimer = 0
|
|
100
|
+
/* The finger the hold belongs to: a second one must not move or end it. */
|
|
101
|
+
let holdPointer: number | null = null
|
|
98
102
|
let start = { x: 0, y: 0 }
|
|
99
103
|
let held = false
|
|
100
104
|
|
|
@@ -103,9 +107,28 @@ function cancelHold() {
|
|
|
103
107
|
holdTimer = 0
|
|
104
108
|
}
|
|
105
109
|
|
|
110
|
+
function onPointerUp(event: PointerEvent) {
|
|
111
|
+
if (holdPointer !== null && event.pointerId !== holdPointer) return
|
|
112
|
+
holdPointer = null
|
|
113
|
+
cancelHold()
|
|
114
|
+
if (held) window.setTimeout(() => (held = false), CLICK_AFTER_RELEASE_MS)
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// A cancelled press produces no click, so there is nothing left to swallow.
|
|
118
|
+
function onPointerCancel(event?: PointerEvent) {
|
|
119
|
+
if (event && holdPointer !== null && event.pointerId !== holdPointer) return
|
|
120
|
+
holdPointer = null
|
|
121
|
+
cancelHold()
|
|
122
|
+
held = false
|
|
123
|
+
}
|
|
124
|
+
|
|
106
125
|
function onPointerDown(event: PointerEvent) {
|
|
107
|
-
|
|
126
|
+
// Any new press starts over: on a hybrid laptop the mouse click after a hold
|
|
127
|
+
// must not be taken for that hold's own click.
|
|
128
|
+
if (holdTimer && event.pointerId !== holdPointer) return
|
|
108
129
|
held = false
|
|
130
|
+
if (event.pointerType !== "touch" || props.touch !== "hold" || props.disabled) return
|
|
131
|
+
holdPointer = event.pointerId
|
|
109
132
|
start = { x: event.clientX, y: event.clientY }
|
|
110
133
|
cancelHold()
|
|
111
134
|
holdTimer = window.setTimeout(() => {
|
|
@@ -116,7 +139,7 @@ function onPointerDown(event: PointerEvent) {
|
|
|
116
139
|
}
|
|
117
140
|
|
|
118
141
|
function onPointerMove(event: PointerEvent) {
|
|
119
|
-
if (!holdTimer) return
|
|
142
|
+
if (!holdTimer || event.pointerId !== holdPointer) return
|
|
120
143
|
if (Math.hypot(event.clientX - start.x, event.clientY - start.y) > SLOP) cancelHold()
|
|
121
144
|
}
|
|
122
145
|
|
|
@@ -135,7 +158,9 @@ function onContextMenu(event: Event) {
|
|
|
135
158
|
watch(
|
|
136
159
|
() => props.disabled,
|
|
137
160
|
(off) => {
|
|
138
|
-
if (off)
|
|
161
|
+
if (!off) return
|
|
162
|
+
onPointerCancel()
|
|
163
|
+
open.value = false
|
|
139
164
|
},
|
|
140
165
|
)
|
|
141
166
|
|
|
@@ -150,8 +175,8 @@ onBeforeUnmount(cancelHold)
|
|
|
150
175
|
:class="touch === 'hold' ? '[-webkit-touch-callout:none]' : undefined"
|
|
151
176
|
@pointerdown="onPointerDown"
|
|
152
177
|
@pointermove="onPointerMove"
|
|
153
|
-
@pointerup="
|
|
154
|
-
@pointercancel="
|
|
178
|
+
@pointerup="onPointerUp"
|
|
179
|
+
@pointercancel="onPointerCancel"
|
|
155
180
|
@click.capture="onClickCapture"
|
|
156
181
|
@contextmenu="onContextMenu"
|
|
157
182
|
>
|
|
@@ -14,12 +14,14 @@
|
|
|
14
14
|
*/
|
|
15
15
|
import { computed, watchEffect } from "vue"
|
|
16
16
|
import { Icon, getIcon } from "@iconify/vue"
|
|
17
|
-
import { iconsVersion, requestIcon } from "../icons"
|
|
17
|
+
import { failedIcons, iconsVersion, requestIcon } from "../icons"
|
|
18
18
|
|
|
19
19
|
const props = defineProps<{
|
|
20
20
|
/** iconify name, e.g. "lucide:check". Bare names assume the lucide set. */
|
|
21
21
|
name: string
|
|
22
22
|
size?: number | string
|
|
23
|
+
/** An icon to show if `name` is unknown or its chunk fails to load; it must already be registered. */
|
|
24
|
+
fallback?: string
|
|
23
25
|
}>()
|
|
24
26
|
|
|
25
27
|
function resolve(name: string): string {
|
|
@@ -29,7 +31,9 @@ function resolve(name: string): string {
|
|
|
29
31
|
const fullName = computed(() => resolve(props.name))
|
|
30
32
|
const data = computed(() => {
|
|
31
33
|
void iconsVersion.value
|
|
32
|
-
|
|
34
|
+
const icon = getIcon(fullName.value)
|
|
35
|
+
if (icon || !props.fallback || !failedIcons.has(fullName.value)) return icon
|
|
36
|
+
return getIcon(resolve(props.fallback))
|
|
33
37
|
})
|
|
34
38
|
const lucide = computed(() => fullName.value.startsWith("lucide:"))
|
|
35
39
|
|
|
@@ -17,6 +17,7 @@ export default { inheritAttrs: false }
|
|
|
17
17
|
* `identicon()` in identicon.ts, which a canvas, a favicon or a notification
|
|
18
18
|
* icon can call directly.
|
|
19
19
|
*/
|
|
20
|
+
import { clamp } from "../composables/clamp"
|
|
20
21
|
import { computed } from "vue"
|
|
21
22
|
import { identicon, identiconRects } from "./identicon"
|
|
22
23
|
import { useMergedAttrs } from "../composables/useMergedClass"
|
|
@@ -43,7 +44,7 @@ const props = withDefaults(
|
|
|
43
44
|
|
|
44
45
|
const icon = computed(() => identicon(props.seed, { grid: props.grid }))
|
|
45
46
|
const rects = computed(() => identiconRects(icon.value.cells))
|
|
46
|
-
const pad = computed(() => props.grid *
|
|
47
|
+
const pad = computed(() => props.grid * clamp(props.padding, 0, 0.4))
|
|
47
48
|
const view = computed(() => props.grid + pad.value * 2)
|
|
48
49
|
const wash = computed(() => `color-mix(in oklab, ${icon.value.color} 16%, var(--color-surface-soft))`)
|
|
49
50
|
|
|
@@ -175,6 +175,8 @@ watch(
|
|
|
175
175
|
() => props.file,
|
|
176
176
|
async (file) => {
|
|
177
177
|
revoke()
|
|
178
|
+
// Decoding needs the browser; on the server the editor renders empty.
|
|
179
|
+
if (typeof document === "undefined") return
|
|
178
180
|
rotation.value = 0
|
|
179
181
|
zoom.reset()
|
|
180
182
|
failed.value = false
|
|
@@ -278,7 +280,7 @@ async function decode(
|
|
|
278
280
|
const sourceSize = computed(() => {
|
|
279
281
|
const s = source.value
|
|
280
282
|
if (!s) return null
|
|
281
|
-
return
|
|
283
|
+
return "naturalWidth" in s
|
|
282
284
|
? { width: s.naturalWidth, height: s.naturalHeight }
|
|
283
285
|
: { width: s.width, height: s.height }
|
|
284
286
|
})
|
|
@@ -287,7 +289,8 @@ function revoke() {
|
|
|
287
289
|
if (ownedUrl) URL.revokeObjectURL(ownedUrl)
|
|
288
290
|
ownedUrl = ""
|
|
289
291
|
objectUrl.value = ""
|
|
290
|
-
|
|
292
|
+
// By what it can do: the class is absent on the server and differs per window.
|
|
293
|
+
if (source.value && "close" in source.value) source.value.close()
|
|
291
294
|
source.value = null
|
|
292
295
|
}
|
|
293
296
|
|
|
@@ -3,10 +3,11 @@ export default { inheritAttrs: false }
|
|
|
3
3
|
</script>
|
|
4
4
|
|
|
5
5
|
<script setup lang="ts">
|
|
6
|
+
import { CONTROL_SIZE } from "./controlSize"
|
|
6
7
|
import { usePaletteControl, type PaletteControlOptions } from "../composables/usePaletteCommands"
|
|
7
8
|
import { tv, type VariantProps } from "tailwind-variants"
|
|
8
9
|
import { computed, ref, useAttrs, useSlots } from "vue"
|
|
9
|
-
import { useFieldControl } from "../composables/useField"
|
|
10
|
+
import { fieldWrapperBinds, isAttrOn, mergeDescribedBy, useFieldControl } from "../composables/useField"
|
|
10
11
|
import { useLabels } from "../composables/useLpConfig"
|
|
11
12
|
import { useInputFilter } from "../composables/useInputFilter"
|
|
12
13
|
import { DEFAULT_MASK_TOKENS, useInputMask, type MaskSpec, type MaskTokens } from "../composables/useInputMask"
|
|
@@ -29,11 +30,7 @@ const shell = tv({
|
|
|
29
30
|
"has-[:disabled]:cursor-not-allowed has-[:disabled]:opacity-55",
|
|
30
31
|
],
|
|
31
32
|
variants: {
|
|
32
|
-
size:
|
|
33
|
-
sm: "h-(--size-control-sm) text-xs",
|
|
34
|
-
md: "h-(--size-control-md) text-sm",
|
|
35
|
-
lg: "h-(--size-control-lg) text-sm",
|
|
36
|
-
},
|
|
33
|
+
size: CONTROL_SIZE,
|
|
37
34
|
invalid: {
|
|
38
35
|
true: "border-danger focus-within:border-danger focus-within:ring-danger-soft",
|
|
39
36
|
},
|
|
@@ -113,22 +110,24 @@ const shown = computed(() => (masking.active.value ? masking.format(props.modelV
|
|
|
113
110
|
function onBefore(event: InputEvent): void {
|
|
114
111
|
onBeforeInput(event)
|
|
115
112
|
if (!event.defaultPrevented) masking.onBeforeInput(event)
|
|
116
|
-
if (event.defaultPrevented && masking.active.value
|
|
117
|
-
emit("update:modelValue", event.target.value)
|
|
113
|
+
if (event.defaultPrevented && masking.active.value) {
|
|
114
|
+
emit("update:modelValue", (event.target as HTMLInputElement).value)
|
|
118
115
|
}
|
|
119
116
|
}
|
|
120
117
|
|
|
121
118
|
function onInputEvent(event: Event): void {
|
|
119
|
+
// `restrict` first: it sees what was typed, and the mask then lays out what
|
|
120
|
+
// is left, putting back any literal the clean-up took along.
|
|
121
|
+
filterInput(event)
|
|
122
122
|
if (masking.active.value) masking.onInput(event)
|
|
123
|
-
else filterInput(event)
|
|
124
123
|
emit("update:modelValue", (event.target as HTMLInputElement).value)
|
|
125
124
|
}
|
|
126
125
|
|
|
127
126
|
function onComposed(event: CompositionEvent): void {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
127
|
+
onCompositionEnd(event)
|
|
128
|
+
if (!masking.active.value) return
|
|
129
|
+
masking.onCompositionEnd(event)
|
|
130
|
+
emit("update:modelValue", (event.target as HTMLInputElement).value)
|
|
132
131
|
}
|
|
133
132
|
|
|
134
133
|
// Pattern failure folds into the same invalid state as the explicit prop/error.
|
|
@@ -150,7 +149,7 @@ const field = useFieldControl(() => ({
|
|
|
150
149
|
disabled: props.disabled,
|
|
151
150
|
}))
|
|
152
151
|
const text = useLabels("input", { clear: "Clear" }, () => props.labels)
|
|
153
|
-
const showClear = computed(() => props.clearable && !!props.modelValue && !field.value.disabled && (attrs.readonly
|
|
152
|
+
const showClear = computed(() => props.clearable && !!props.modelValue && !field.value.disabled && !isAttrOn(attrs.readonly) && !isAttrOn(attrs.readOnly))
|
|
154
153
|
const isInvalidState = computed(() => field.value.invalid)
|
|
155
154
|
const shellClass = computed(() =>
|
|
156
155
|
shell({ size: props.size, invalid: isInvalidState.value }),
|
|
@@ -183,14 +182,7 @@ usePaletteControl({ label: () => props.label, disabled: () => field.value.disabl
|
|
|
183
182
|
|
|
184
183
|
<template>
|
|
185
184
|
<FieldWrapper
|
|
186
|
-
|
|
187
|
-
:id="field.id"
|
|
188
|
-
:label="label"
|
|
189
|
-
:hint="hint"
|
|
190
|
-
:error="error"
|
|
191
|
-
:required="required"
|
|
192
|
-
:class="attrs.class"
|
|
193
|
-
:style="attrs.style"
|
|
185
|
+
v-bind="fieldWrapperBinds(hasField, field, $props, attrs)"
|
|
194
186
|
>
|
|
195
187
|
<div
|
|
196
188
|
data-lp-ring-owner
|
|
@@ -210,7 +202,7 @@ usePaletteControl({ label: () => props.label, disabled: () => field.value.disabl
|
|
|
210
202
|
:disabled="field.disabled"
|
|
211
203
|
:required="field.required || undefined"
|
|
212
204
|
:aria-invalid="isInvalidState || undefined"
|
|
213
|
-
:aria-describedby="field.describedBy"
|
|
205
|
+
:aria-describedby="mergeDescribedBy(attrs['aria-describedby'], field.describedBy)"
|
|
214
206
|
:class="[
|
|
215
207
|
'lp-autofill min-w-0 flex-1 self-stretch bg-transparent outline-none placeholder:text-muted',
|
|
216
208
|
clearable && '[&::-webkit-search-cancel-button]:hidden',
|