@leavepulse/ui 0.77.3 → 0.78.1
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-CLLhd3WB.js} +2 -2
- package/dist/chunks/FieldLeading-mr81aEAP.js +27 -0
- 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-BSS49jpm.js} +12 -11
- package/dist/chunks/{LpAlert-n5XPAZfv.js → LpAlert-CjvTZIKF.js} +3 -3
- package/dist/chunks/LpAppShell-BKbYCHkx.js +601 -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-DBqy4RLd.js} +19 -41
- package/dist/chunks/{LpCodeDisplay-CE9TxCA4.js → LpCodeDisplay-D3BUAhV1.js} +5 -5
- package/dist/chunks/{LpCollapse-CWS9M_lm.js → LpCollapse-DrAw5DBZ.js} +5 -4
- package/dist/chunks/{LpColorPicker-1y1QJHZR.js → LpColorPicker-COHzV68R.js} +11 -12
- package/dist/chunks/{LpCommandScope-CtUhJe8T.js → LpCommandScope-DRUvHiX7.js} +1 -1
- package/dist/chunks/{LpConfirmDialog-DlD45Bi_.js → LpConfirmDialog-CnrmzkuN.js} +3 -3
- package/dist/chunks/{LpConfirmHost-BIWjBLmI.js → LpConfirmHost-CwbObVGH.js} +1 -1
- package/dist/chunks/{LpContextMenu-rx2tCjwk.js → LpContextMenu-Bx_IhQDS.js} +17 -19
- package/dist/chunks/{LpContextSwitcher-Dwh6dyID.js → LpContextSwitcher-1C1tExdl.js} +2 -2
- package/dist/chunks/{LpCopyButton-xF7wFVoU.js → LpCopyButton-sAMvWeLP.js} +3 -3
- package/dist/chunks/{LpCountdown-DgeY3cLG.js → LpCountdown-DVl7vXI1.js} +4 -3
- package/dist/chunks/{LpDataList-Jxyl9H5w.js → LpDataList-CaVfsozH.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-DXNQFpAA.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-C-rJKzEQ.js +735 -0
- package/dist/chunks/{LpFileTreeNode-cT6BIWvz.js → LpFileTreeNode-BgYn4U1J.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-CHE9jAJG.js} +29 -11
- 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-Bb5nbuFY.js} +19 -2
- package/dist/chunks/{LpInput-Tw-yxT4I.js → LpInput-D0O6dpuA.js} +32 -47
- package/dist/chunks/LpInspector-DO3fTCQ1.js +209 -0
- package/dist/chunks/{LpLaneNode-HtnQf2FF.js → LpLaneNode-Bqcdm8Rf.js} +19 -1
- package/dist/chunks/{LpLightbox-B95yu22B.js → LpLightbox-CtDTQV01.js} +57 -32
- package/dist/chunks/{LpLoader-DVwkOmt9.js → LpLoader-Bf1yZwaU.js} +1 -1
- package/dist/chunks/LpLogInspector-BdQlX6S-.js +119 -0
- package/dist/chunks/{LpLogViewer-ngqkns4m.js → LpLogViewer-umCZBapN.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-BYEwySoF.js} +3 -3
- package/dist/chunks/{LpModal-CoGhLTyH.js → LpModal-DDvrSAnf.js} +11 -13
- package/dist/chunks/{LpModalNav-BGvs2y5Q.js → LpModalNav-gOi1Giz1.js} +11 -37
- package/dist/chunks/{LpNotificationBell-B0034Lk-.js → LpNotificationBell-DUbVyK6R.js} +9 -9
- package/dist/chunks/{LpNumberField-e0IBkWU1.js → LpNumberField-Csg-1Zh_.js} +25 -20
- package/dist/chunks/{LpOtpInput-CeBPsM7D.js → LpOtpInput-BRpLBbOD.js} +2 -2
- package/dist/chunks/LpPageScrollbar-D2O0xhJw.js +164 -0
- package/dist/chunks/{LpPagination-BIIiYHXR.js → LpPagination-snQ020xQ.js} +6 -4
- package/dist/chunks/{LpPaletteTheme-DiLYKQiZ.js → LpPaletteTheme-BIXpZLGe.js} +4 -4
- package/dist/chunks/{LpPasswordInput-BkHKQDhM.js → LpPasswordInput-D4HPhqfV.js} +2 -2
- package/dist/chunks/{LpPhoneInput-CETEp5W7.js → LpPhoneInput-BSL7NX4z.js} +15 -26
- package/dist/chunks/{LpPie-DrZepi0p.js → LpPie-oVNHjsKD.js} +22 -21
- package/dist/chunks/{LpPipeline-B3aOVOkV.js → LpPipeline-BSXT6oUJ.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-0zI-44ve.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-CqvwfZs2.js} +31 -22
- package/dist/chunks/{LpSecretField-BbmqM9ye.js → LpSecretField-B2roc4Iz.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/{LpServiceNode-D8uJ8sGk.js → LpServiceNode-Cln2ntdw.js} +17 -0
- 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-DDNJzb69.js} +74 -87
- package/dist/chunks/{LpSidebarNav-DE3PhXVP.js → LpSidebarNav-CE0jQS8i.js} +8 -6
- package/dist/chunks/{LpSidebarRow-BRYhNDSo.js → LpSidebarRow-DOTg1txp.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-DPjc6_fX.js} +19 -6
- 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-B_XMOeAh.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-ChU0_Ga8.js} +12 -195
- package/dist/chunks/{LpThemeSwitcher-BnEn_mvf.js → LpThemeSwitcher-DmCZ21P_.js} +8 -6
- package/dist/chunks/{LpTimeField-BawSVsmt.js → LpTimeField-DeOcKWJq.js} +6 -9
- package/dist/chunks/{LpToaster-IwTXjbbU.js → LpToaster-Ct_ZOhCh.js} +10 -8
- package/dist/chunks/{LpTooltip-BcBvIx4z.js → LpTooltip-Bz_rrq5S.js} +56 -24
- package/dist/chunks/LpTopologyCanvas-jqz1KCq2.js +678 -0
- package/dist/chunks/{LpTour-BZq-mUMv.js → LpTour-ClKYhx4h.js} +7 -5
- package/dist/chunks/{LpTruncate-CflAIwiJ.js → LpTruncate-ellq9RYM.js} +6 -5
- package/dist/chunks/{LpTypewriter-BCL_a6wE.js → LpTypewriter-CZIzpdbe.js} +2 -1
- package/dist/chunks/{LpUptimeBar-DqNvvMBK.js → LpUptimeBar-BoxcCDVY.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-BeNHCLd5.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-D_iyrB8d.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/FieldLeading.vue.d.ts +16 -0
- package/dist/components/FieldLeading.vue.js +4 -0
- 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 +125 -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.d.ts +11 -2
- 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/LpLaneNode.vue.d.ts +2 -3
- package/dist/components/LpLaneNode.vue.js +1 -1
- 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.d.ts +13 -2
- package/dist/components/LpNumberField.vue.js +1 -1
- package/dist/components/LpOtpInput.vue.js +1 -1
- package/dist/components/LpPageScrollbar.vue.d.ts +10 -0
- package/dist/components/LpPageScrollbar.vue.js +4 -0
- 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/LpServiceNode.vue.d.ts +8 -2
- package/dist/components/LpServiceNode.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.d.ts +16 -0
- 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/scrollbar.d.ts +34 -0
- package/dist/components/scrollbar.js +47 -0
- 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 +89 -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 +16 -3
- 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 +31 -5
- package/dist/index.js +312 -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 +6 -1
- package/src/components/AppShellContextNav.vue +44 -0
- package/src/components/ChartRangeSelector.vue +120 -0
- package/src/components/FieldLeading.vue +17 -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 +385 -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 +22 -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 +37 -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/LpInfraNode.vue +4 -3
- package/src/components/LpInput.vue +19 -26
- package/src/components/LpInspector.vue +197 -0
- package/src/components/LpLaneNode.vue +5 -1
- 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 +13 -16
- package/src/components/LpOtpInput.vue +2 -2
- package/src/components/LpPageScrollbar.vue +195 -0
- 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 +55 -34
- package/src/components/LpSecretField.vue +2 -1
- package/src/components/LpSegmented.vue +6 -8
- package/src/components/LpSelect.vue +54 -24
- package/src/components/LpServiceNode.vue +4 -2
- 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/LpStat.vue +25 -5
- 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 +69 -18
- package/src/components/LpTopologyCanvas.vue +569 -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/scrollbar.ts +71 -0
- 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 +105 -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 +18 -2
- 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 +42 -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,11 +158,19 @@ 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
|
|
|
142
167
|
onBeforeUnmount(cancelHold)
|
|
168
|
+
|
|
169
|
+
// Several roots (trigger and portal), so Vue cannot hand attributes on by
|
|
170
|
+
// itself and dropped them: a trigger wrapped around this one from outside (an
|
|
171
|
+
// LpPopover's, as-child) lost its id, ARIA state and click, and its popover
|
|
172
|
+
// never opened. They go to the trigger, which merges them onto the slot's element.
|
|
173
|
+
defineOptions({ inheritAttrs: false })
|
|
143
174
|
</script>
|
|
144
175
|
|
|
145
176
|
<template>
|
|
@@ -147,11 +178,12 @@ onBeforeUnmount(cancelHold)
|
|
|
147
178
|
<HoverCardRoot v-else v-model:open="open" :open-delay="openDelay" :close-delay="closeDelay">
|
|
148
179
|
<HoverCardTrigger
|
|
149
180
|
as-child
|
|
181
|
+
v-bind="$attrs"
|
|
150
182
|
:class="touch === 'hold' ? '[-webkit-touch-callout:none]' : undefined"
|
|
151
183
|
@pointerdown="onPointerDown"
|
|
152
184
|
@pointermove="onPointerMove"
|
|
153
|
-
@pointerup="
|
|
154
|
-
@pointercancel="
|
|
185
|
+
@pointerup="onPointerUp"
|
|
186
|
+
@pointercancel="onPointerCancel"
|
|
155
187
|
@click.capture="onClickCapture"
|
|
156
188
|
@contextmenu="onContextMenu"
|
|
157
189
|
>
|
|
@@ -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
|
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* `@source` over the kit emits these classes — scoped CSS in a published
|
|
9
9
|
* component doesn't reach apps that only import the kit's token css.
|
|
10
10
|
*/
|
|
11
|
-
import { Handle, Position } from "@vue-flow/core"
|
|
11
|
+
import { Handle, Position, type NodeProps } from "@vue-flow/core"
|
|
12
12
|
import { computed } from "vue"
|
|
13
13
|
import LpBadge from "./LpBadge.vue"
|
|
14
14
|
import LpStatus from "./LpStatus.vue"
|
|
@@ -66,8 +66,9 @@ export interface InfraNodeLabels {
|
|
|
66
66
|
old?: string
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
-
|
|
70
|
-
|
|
69
|
+
// Vue Flow hands a custom node all of NodeProps. Declared, they stop falling
|
|
70
|
+
// through onto the node's root as attributes (position="[object Object]").
|
|
71
|
+
const props = defineProps<Omit<NodeProps<InfraNodeData>, "selected"> & {
|
|
71
72
|
selected?: boolean
|
|
72
73
|
/** Extra/overriding role styles, merged over the defaults below. */
|
|
73
74
|
roles?: Record<string, InfraRoleStyle>
|
|
@@ -3,15 +3,17 @@ 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"
|
|
13
14
|
import { mergeClass } from "../composables/useMergedClass"
|
|
14
15
|
import FieldWrapper from "./FieldWrapper.vue"
|
|
16
|
+
import FieldLeading from "./FieldLeading.vue"
|
|
15
17
|
import LpIcon from "./LpIcon.vue"
|
|
16
18
|
|
|
17
19
|
// Single source of truth for the field shell — bare input and adorned input
|
|
@@ -29,11 +31,7 @@ const shell = tv({
|
|
|
29
31
|
"has-[:disabled]:cursor-not-allowed has-[:disabled]:opacity-55",
|
|
30
32
|
],
|
|
31
33
|
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
|
-
},
|
|
34
|
+
size: CONTROL_SIZE,
|
|
37
35
|
invalid: {
|
|
38
36
|
true: "border-danger focus-within:border-danger focus-within:ring-danger-soft",
|
|
39
37
|
},
|
|
@@ -113,22 +111,24 @@ const shown = computed(() => (masking.active.value ? masking.format(props.modelV
|
|
|
113
111
|
function onBefore(event: InputEvent): void {
|
|
114
112
|
onBeforeInput(event)
|
|
115
113
|
if (!event.defaultPrevented) masking.onBeforeInput(event)
|
|
116
|
-
if (event.defaultPrevented && masking.active.value
|
|
117
|
-
emit("update:modelValue", event.target.value)
|
|
114
|
+
if (event.defaultPrevented && masking.active.value) {
|
|
115
|
+
emit("update:modelValue", (event.target as HTMLInputElement).value)
|
|
118
116
|
}
|
|
119
117
|
}
|
|
120
118
|
|
|
121
119
|
function onInputEvent(event: Event): void {
|
|
120
|
+
// `restrict` first: it sees what was typed, and the mask then lays out what
|
|
121
|
+
// is left, putting back any literal the clean-up took along.
|
|
122
|
+
filterInput(event)
|
|
122
123
|
if (masking.active.value) masking.onInput(event)
|
|
123
|
-
else filterInput(event)
|
|
124
124
|
emit("update:modelValue", (event.target as HTMLInputElement).value)
|
|
125
125
|
}
|
|
126
126
|
|
|
127
127
|
function onComposed(event: CompositionEvent): void {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
128
|
+
onCompositionEnd(event)
|
|
129
|
+
if (!masking.active.value) return
|
|
130
|
+
masking.onCompositionEnd(event)
|
|
131
|
+
emit("update:modelValue", (event.target as HTMLInputElement).value)
|
|
132
132
|
}
|
|
133
133
|
|
|
134
134
|
// Pattern failure folds into the same invalid state as the explicit prop/error.
|
|
@@ -150,7 +150,7 @@ const field = useFieldControl(() => ({
|
|
|
150
150
|
disabled: props.disabled,
|
|
151
151
|
}))
|
|
152
152
|
const text = useLabels("input", { clear: "Clear" }, () => props.labels)
|
|
153
|
-
const showClear = computed(() => props.clearable && !!props.modelValue && !field.value.disabled && (attrs.readonly
|
|
153
|
+
const showClear = computed(() => props.clearable && !!props.modelValue && !field.value.disabled && !isAttrOn(attrs.readonly) && !isAttrOn(attrs.readOnly))
|
|
154
154
|
const isInvalidState = computed(() => field.value.invalid)
|
|
155
155
|
const shellClass = computed(() =>
|
|
156
156
|
shell({ size: props.size, invalid: isInvalidState.value }),
|
|
@@ -183,23 +183,16 @@ usePaletteControl({ label: () => props.label, disabled: () => field.value.disabl
|
|
|
183
183
|
|
|
184
184
|
<template>
|
|
185
185
|
<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"
|
|
186
|
+
v-bind="fieldWrapperBinds(hasField, field, $props, attrs)"
|
|
194
187
|
>
|
|
195
188
|
<div
|
|
196
189
|
data-lp-ring-owner
|
|
197
190
|
:class="mergeClass(shellClass, hasLeading ? 'pl-2.5' : '', hasTrailing ? 'pr-1.5' : '', hasField ? '' : (attrs.class as string))"
|
|
198
191
|
:style="hasField ? undefined : attrs.style"
|
|
199
192
|
>
|
|
200
|
-
<
|
|
201
|
-
<
|
|
202
|
-
</
|
|
193
|
+
<FieldLeading :icon="icon">
|
|
194
|
+
<template v-if="$slots.leading" #default><slot name="leading" /></template>
|
|
195
|
+
</FieldLeading>
|
|
203
196
|
<input
|
|
204
197
|
ref="inputEl"
|
|
205
198
|
v-bind="inputAttrs"
|
|
@@ -210,7 +203,7 @@ usePaletteControl({ label: () => props.label, disabled: () => field.value.disabl
|
|
|
210
203
|
:disabled="field.disabled"
|
|
211
204
|
:required="field.required || undefined"
|
|
212
205
|
:aria-invalid="isInvalidState || undefined"
|
|
213
|
-
:aria-describedby="field.describedBy"
|
|
206
|
+
:aria-describedby="mergeDescribedBy(attrs['aria-describedby'], field.describedBy)"
|
|
214
207
|
:class="[
|
|
215
208
|
'lp-autofill min-w-0 flex-1 self-stretch bg-transparent outline-none placeholder:text-muted',
|
|
216
209
|
clearable && '[&::-webkit-search-cancel-button]:hidden',
|