@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
|
@@ -6,6 +6,7 @@ export default { inheritAttrs: false }
|
|
|
6
6
|
</script>
|
|
7
7
|
|
|
8
8
|
<script setup lang="ts">
|
|
9
|
+
import { CONTROL_SIZE } from "./controlSize"
|
|
9
10
|
import { usePaletteControl, type PaletteControlOptions } from "../composables/usePaletteCommands"
|
|
10
11
|
// Numeric input with stepper buttons (reka NumberField). Themed via tokens.
|
|
11
12
|
import {
|
|
@@ -14,9 +15,10 @@ import {
|
|
|
14
15
|
NumberFieldInput,
|
|
15
16
|
NumberFieldRoot,
|
|
16
17
|
} from "reka-ui"
|
|
17
|
-
import { computed,
|
|
18
|
+
import { computed, useId } from "vue"
|
|
19
|
+
import FieldLeading from "./FieldLeading.vue"
|
|
18
20
|
import LpIcon from "./LpIcon.vue"
|
|
19
|
-
import { focusLeft,
|
|
21
|
+
import { focusLeft, useAttrsField, mergeDescribedBy } from "../composables/useField"
|
|
20
22
|
import { useLabels } from "../composables/useLpConfig"
|
|
21
23
|
import { useMergedClass } from "../composables/useMergedClass"
|
|
22
24
|
|
|
@@ -66,6 +68,8 @@ const props = withDefaults(defineProps<{
|
|
|
66
68
|
// "Depth", "Weight" tells the reader nothing about which one wants grams.
|
|
67
69
|
// Not part of the value: it is never typed, selected, or submitted.
|
|
68
70
|
unit?: string
|
|
71
|
+
/** A leading icon, as on LpInput; the `leading` slot replaces it. */
|
|
72
|
+
icon?: string
|
|
69
73
|
invalid?: boolean
|
|
70
74
|
/** Control height, matching LpInput. */
|
|
71
75
|
size?: "sm" | "md" | "lg"
|
|
@@ -93,21 +97,11 @@ const text = useLabels<NumberFieldLabels>(
|
|
|
93
97
|
() => props.labels,
|
|
94
98
|
)
|
|
95
99
|
|
|
96
|
-
const SIZE =
|
|
97
|
-
sm: "h-(--size-control-sm) text-xs",
|
|
98
|
-
md: "h-(--size-control-md) text-sm",
|
|
99
|
-
lg: "h-(--size-control-lg) text-sm",
|
|
100
|
-
}
|
|
100
|
+
const SIZE = CONTROL_SIZE
|
|
101
101
|
|
|
102
|
-
const attrs =
|
|
103
|
-
const field = useFieldControl(() => ({
|
|
104
|
-
wrapped: false,
|
|
105
|
-
id: typeof attrs.id === "string" ? attrs.id : undefined,
|
|
106
|
-
invalid: props.invalid,
|
|
107
|
-
disabled: props.disabled,
|
|
108
|
-
}))
|
|
102
|
+
const { attrs, field } = useAttrsField(() => ({ invalid: props.invalid, disabled: props.disabled }))
|
|
109
103
|
const describedBy = computed(
|
|
110
|
-
() => [field.value.describedBy, props.unit ? unitId : undefined
|
|
104
|
+
() => mergeDescribedBy(attrs["aria-describedby"], field.value.describedBy, props.unit ? unitId : undefined),
|
|
111
105
|
)
|
|
112
106
|
|
|
113
107
|
// The frame takes the consumer's class and style, and `name` goes to reka's
|
|
@@ -160,6 +154,9 @@ usePaletteControl({ disabled: () => field.value.disabled, invalid: () => field.v
|
|
|
160
154
|
@update:model-value="(v) => emit('update:modelValue', Number.isNaN(v) ? null : (v ?? null))"
|
|
161
155
|
@focusout="onFocusOut"
|
|
162
156
|
>
|
|
157
|
+
<FieldLeading :icon="icon" class="pl-2.5">
|
|
158
|
+
<template v-if="$slots.leading" #default><slot name="leading" /></template>
|
|
159
|
+
</FieldLeading>
|
|
163
160
|
<NumberFieldDecrement
|
|
164
161
|
v-if="steppers"
|
|
165
162
|
:aria-label="text.decrease"
|
|
@@ -177,7 +174,7 @@ usePaletteControl({ disabled: () => field.value.disabled, invalid: () => field.v
|
|
|
177
174
|
:aria-describedby="describedBy"
|
|
178
175
|
:aria-invalid="field.invalid || undefined"
|
|
179
176
|
class="min-w-0 flex-1 bg-transparent text-ink outline-none placeholder:text-muted [appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none"
|
|
180
|
-
:class="steppers ? 'text-center @max-[8.5rem]:px-3 @max-[8.5rem]:text-left' : 'px-3'"
|
|
177
|
+
:class="steppers ? 'text-center @max-[8.5rem]:px-3 @max-[8.5rem]:text-left' : icon || $slots.leading ? 'pl-2 pr-3' : 'px-3'"
|
|
181
178
|
/>
|
|
182
179
|
<!-- The unit sits between the value and the increment button, so a long one
|
|
183
180
|
narrows the field rather than covering the digits. Not focusable and
|
|
@@ -21,7 +21,7 @@ export default { inheritAttrs: false }
|
|
|
21
21
|
*/
|
|
22
22
|
import { PinInputInput, PinInputRoot } from "reka-ui"
|
|
23
23
|
import { computed, ref, watch } from "vue"
|
|
24
|
-
import { useFieldControl } from "../composables/useField"
|
|
24
|
+
import { useFieldControl, mergeDescribedBy } from "../composables/useField"
|
|
25
25
|
import { useMergedAttrs } from "../composables/useMergedClass"
|
|
26
26
|
import { groupBreaks, joinCells, splitCode, upperCells, type OtpCells } from "./otp"
|
|
27
27
|
|
|
@@ -166,7 +166,7 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
|
|
|
166
166
|
:index="i - 1"
|
|
167
167
|
:id="i === 1 ? field.id : undefined"
|
|
168
168
|
:aria-invalid="field.invalid || undefined"
|
|
169
|
-
:aria-describedby="field.describedBy"
|
|
169
|
+
:aria-describedby="mergeDescribedBy(rest['aria-describedby'], field.describedBy)"
|
|
170
170
|
:autocapitalize="upper ? 'characters' : 'none'"
|
|
171
171
|
autocorrect="off"
|
|
172
172
|
:spellcheck="false"
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
/*
|
|
3
|
+
* The kit's overlay scrollbar for the document itself, for a page that scrolls
|
|
4
|
+
* the window (LpAppShell's default): the same bar as LpScrollArea's, drawn by
|
|
5
|
+
* the kit over the content instead of the browser's beside it.
|
|
6
|
+
*
|
|
7
|
+
* <LpPageScrollbar top="4rem" />
|
|
8
|
+
*
|
|
9
|
+
* The browser's own bar is hidden while this is mounted, so the page no longer
|
|
10
|
+
* loses its width to a gutter, nor changes width when it starts to scroll. The
|
|
11
|
+
* scrolling stays the browser's: wheel, keyboard, touch, find-in-page, anchors,
|
|
12
|
+
* scroll restoration, sticky, a full-page screenshot and printing are untouched
|
|
13
|
+
* (the bar is not printed, and at rest it is not drawn). What the kit adds is
|
|
14
|
+
* the drawing, a thumb that drags, and a press beside it that pages.
|
|
15
|
+
*
|
|
16
|
+
* Where the browser's bars already float over the content (phones, macOS set
|
|
17
|
+
* to show them while scrolling) it draws nothing and leaves the browser's.
|
|
18
|
+
*
|
|
19
|
+
* `top` and `bottom` keep the bar clear of what covers the window's edges: a
|
|
20
|
+
* sticky header, a bottom bar. Any CSS length, a variable included, and a
|
|
21
|
+
* change eases.
|
|
22
|
+
*/
|
|
23
|
+
import { computed, onBeforeUnmount, onMounted, ref } from "vue"
|
|
24
|
+
import { mergeClass } from "../composables/useMergedClass"
|
|
25
|
+
import { nodeWindow } from "../composables/useView"
|
|
26
|
+
import { BAR_FADE, BAR_Y, BAR_Y_SIZE, hideNativeBar, pageToward, SCROLL_HIDE_DELAY_MS, THUMB_Y, THUMB_Y_ROUND } from "./scrollbar"
|
|
27
|
+
|
|
28
|
+
const props = withDefaults(defineProps<{ top?: string; bottom?: string }>(), { top: "0px", bottom: "0px" })
|
|
29
|
+
|
|
30
|
+
/* Shorter than this the thumb is hard to catch; reka's bar holds the same floor. */
|
|
31
|
+
const MIN_THUMB_PX = 18
|
|
32
|
+
|
|
33
|
+
const barEl = ref<HTMLElement | null>(null)
|
|
34
|
+
const active = ref(false)
|
|
35
|
+
const thumb = ref({ top: 0, height: 0 })
|
|
36
|
+
const scrollable = ref(false)
|
|
37
|
+
const scrolling = ref(false)
|
|
38
|
+
const hovered = ref(false)
|
|
39
|
+
const dragging = ref(false)
|
|
40
|
+
// Unset until the bar first shows: a bar mounting "hidden" would play its fade-out.
|
|
41
|
+
const state = computed(() => (scrolling.value || hovered.value || dragging.value ? "visible" : shownOnce.value ? "hidden" : undefined))
|
|
42
|
+
const shownOnce = ref(false)
|
|
43
|
+
|
|
44
|
+
let releaseNative: (() => void) | undefined
|
|
45
|
+
let doc: Document | undefined
|
|
46
|
+
let hideTimer: ReturnType<typeof setTimeout> | undefined
|
|
47
|
+
let frame = 0
|
|
48
|
+
let sizes: ResizeObserver | undefined
|
|
49
|
+
|
|
50
|
+
function scroller(): HTMLElement | null {
|
|
51
|
+
return (doc?.scrollingElement as HTMLElement | null) ?? null
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/* The width the browser's bar takes from the layout: 0 where it floats over the content. */
|
|
55
|
+
function nativeBarWidth(d: Document): number {
|
|
56
|
+
const probe = d.createElement("div")
|
|
57
|
+
probe.style.cssText = "position:absolute;top:-9999px;width:100px;height:100px;overflow:scroll"
|
|
58
|
+
d.body.append(probe)
|
|
59
|
+
const width = probe.offsetWidth - probe.clientWidth
|
|
60
|
+
probe.remove()
|
|
61
|
+
return width
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function measure() {
|
|
65
|
+
frame = 0
|
|
66
|
+
const view = scroller()
|
|
67
|
+
const bar = barEl.value
|
|
68
|
+
if (!view || !bar) return
|
|
69
|
+
const range = view.scrollHeight - view.clientHeight
|
|
70
|
+
scrollable.value = range > 1
|
|
71
|
+
if (!scrollable.value) return
|
|
72
|
+
const track = bar.clientHeight
|
|
73
|
+
const height = Math.max(MIN_THUMB_PX, Math.round((track * view.clientHeight) / view.scrollHeight))
|
|
74
|
+
thumb.value = { height, top: Math.round(((track - height) * view.scrollTop) / range) }
|
|
75
|
+
}
|
|
76
|
+
function measureSoon() {
|
|
77
|
+
if (!frame && doc) frame = nodeWindow(doc).requestAnimationFrame(measure)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function onScroll() {
|
|
81
|
+
measureSoon()
|
|
82
|
+
scrolling.value = true
|
|
83
|
+
shownOnce.value = true
|
|
84
|
+
clearTimeout(hideTimer)
|
|
85
|
+
hideTimer = setTimeout(() => (scrolling.value = false), SCROLL_HIDE_DELAY_MS)
|
|
86
|
+
}
|
|
87
|
+
function onEnter() {
|
|
88
|
+
hovered.value = true
|
|
89
|
+
shownOnce.value = true
|
|
90
|
+
}
|
|
91
|
+
function onLeave() {
|
|
92
|
+
hideTimer && clearTimeout(hideTimer)
|
|
93
|
+
hideTimer = setTimeout(() => {
|
|
94
|
+
hovered.value = false
|
|
95
|
+
scrolling.value = false
|
|
96
|
+
}, SCROLL_HIDE_DELAY_MS)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/* A dialog that locks the page locks the bar with it. */
|
|
100
|
+
function locked(): boolean {
|
|
101
|
+
return !!doc && nodeWindow(doc).getComputedStyle(doc.body).overflow === "hidden"
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function onTrackPointerDown(event: PointerEvent) {
|
|
105
|
+
const view = scroller()
|
|
106
|
+
const thumbEl = barEl.value?.querySelector<HTMLElement>("[data-lp-thumb]")
|
|
107
|
+
if (!view || !thumbEl || event.button !== 0 || thumbEl.contains(event.target as Node) || locked()) return
|
|
108
|
+
event.preventDefault()
|
|
109
|
+
pageToward(view, "y", event.clientY < thumbEl.getBoundingClientRect().top)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function onThumbPointerDown(event: PointerEvent) {
|
|
113
|
+
const view = scroller()
|
|
114
|
+
const bar = barEl.value
|
|
115
|
+
if (!view || !bar || event.button !== 0 || locked()) return
|
|
116
|
+
// Not a text selection across the page, and the release is heard wherever it lands.
|
|
117
|
+
event.preventDefault()
|
|
118
|
+
const handle = event.currentTarget as HTMLElement
|
|
119
|
+
handle.setPointerCapture(event.pointerId)
|
|
120
|
+
dragging.value = true
|
|
121
|
+
const startY = event.clientY
|
|
122
|
+
const startTop = view.scrollTop
|
|
123
|
+
const perPixel = (view.scrollHeight - view.clientHeight) / Math.max(1, bar.clientHeight - thumb.value.height)
|
|
124
|
+
const move = (e: PointerEvent) => view.scrollTo({ top: startTop + (e.clientY - startY) * perPixel, behavior: "instant" })
|
|
125
|
+
const stop = () => {
|
|
126
|
+
dragging.value = false
|
|
127
|
+
handle.removeEventListener("pointermove", move)
|
|
128
|
+
handle.removeEventListener("pointerup", stop)
|
|
129
|
+
handle.removeEventListener("pointercancel", stop)
|
|
130
|
+
handle.removeEventListener("lostpointercapture", stop)
|
|
131
|
+
}
|
|
132
|
+
handle.addEventListener("pointermove", move)
|
|
133
|
+
handle.addEventListener("pointerup", stop)
|
|
134
|
+
handle.addEventListener("pointercancel", stop)
|
|
135
|
+
handle.addEventListener("lostpointercapture", stop)
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
onMounted(() => {
|
|
139
|
+
const host = barEl.value ?? undefined
|
|
140
|
+
doc = host?.ownerDocument
|
|
141
|
+
if (!doc || nativeBarWidth(doc) === 0) return
|
|
142
|
+
active.value = true
|
|
143
|
+
releaseNative = hideNativeBar(doc)
|
|
144
|
+
const win = nodeWindow(doc)
|
|
145
|
+
win.addEventListener("scroll", onScroll, { passive: true })
|
|
146
|
+
win.addEventListener("resize", measureSoon)
|
|
147
|
+
sizes = new win.ResizeObserver(measureSoon)
|
|
148
|
+
sizes.observe(doc.body)
|
|
149
|
+
if (host) sizes.observe(host)
|
|
150
|
+
measure()
|
|
151
|
+
})
|
|
152
|
+
|
|
153
|
+
onBeforeUnmount(() => {
|
|
154
|
+
clearTimeout(hideTimer)
|
|
155
|
+
sizes?.disconnect()
|
|
156
|
+
if (!doc || !active.value) return
|
|
157
|
+
const win = nodeWindow(doc)
|
|
158
|
+
if (frame) win.cancelAnimationFrame(frame)
|
|
159
|
+
win.removeEventListener("scroll", onScroll)
|
|
160
|
+
win.removeEventListener("resize", measureSoon)
|
|
161
|
+
releaseNative?.()
|
|
162
|
+
})
|
|
163
|
+
|
|
164
|
+
const barClass = computed(() =>
|
|
165
|
+
mergeClass(
|
|
166
|
+
BAR_Y,
|
|
167
|
+
BAR_Y_SIZE.wall,
|
|
168
|
+
BAR_FADE,
|
|
169
|
+
"fixed right-0 z-(--z-sticky) transition-[top,bottom] duration-[var(--duration-medium)] ease-[var(--ease-settle)] print:hidden",
|
|
170
|
+
),
|
|
171
|
+
)
|
|
172
|
+
</script>
|
|
173
|
+
|
|
174
|
+
<template>
|
|
175
|
+
<!-- Always in the DOM, so it can be measured; drawn only where the kit owns the bar. -->
|
|
176
|
+
<div
|
|
177
|
+
ref="barEl"
|
|
178
|
+
aria-hidden="true"
|
|
179
|
+
data-lp-page-scrollbar
|
|
180
|
+
:class="barClass"
|
|
181
|
+
:data-state="active && scrollable ? state : undefined"
|
|
182
|
+
:style="{ top: props.top, bottom: props.bottom, visibility: active && scrollable ? undefined : 'hidden' }"
|
|
183
|
+
@pointerenter="onEnter"
|
|
184
|
+
@pointerleave="onLeave"
|
|
185
|
+
@pointerdown="onTrackPointerDown"
|
|
186
|
+
>
|
|
187
|
+
<div
|
|
188
|
+
data-lp-thumb
|
|
189
|
+
class="absolute right-px"
|
|
190
|
+
:class="[THUMB_Y, THUMB_Y_ROUND.wall]"
|
|
191
|
+
:style="{ top: `${thumb.top}px`, height: `${thumb.height}px` }"
|
|
192
|
+
@pointerdown.stop="onThumbPointerDown"
|
|
193
|
+
/>
|
|
194
|
+
</div>
|
|
195
|
+
</template>
|
|
@@ -6,6 +6,7 @@ export default { inheritAttrs: false }
|
|
|
6
6
|
</script>
|
|
7
7
|
|
|
8
8
|
<script setup lang="ts">
|
|
9
|
+
import { nodeWindow } from "../composables/realm"
|
|
9
10
|
/*
|
|
10
11
|
* Page navigator. Pairs with LpTable but stands alone.
|
|
11
12
|
*
|
|
@@ -17,6 +18,7 @@ export default { inheritAttrs: false }
|
|
|
17
18
|
* and just swaps its number — which lets the brand pill glide between slots via
|
|
18
19
|
* motion-v's shared layoutId with zero list-animation conflicts.
|
|
19
20
|
*/
|
|
21
|
+
import { clamp } from "../composables/clamp"
|
|
20
22
|
import { Motion } from "motion-v"
|
|
21
23
|
import { computed, ref, useId } from "vue"
|
|
22
24
|
import { usePillTransition } from "../composables/usePillTransition"
|
|
@@ -66,7 +68,7 @@ const count = computed(() => {
|
|
|
66
68
|
})
|
|
67
69
|
|
|
68
70
|
const current = computed(() =>
|
|
69
|
-
Number.isFinite(props.page) ?
|
|
71
|
+
Number.isFinite(props.page) ? clamp(Math.floor(props.page), 1, count.value) : 1,
|
|
70
72
|
)
|
|
71
73
|
|
|
72
74
|
// A fixed run of page slots. Each slot is either a real page or a gap ("…").
|
|
@@ -85,7 +87,7 @@ const gap = ref(6)
|
|
|
85
87
|
function measure() {
|
|
86
88
|
const nav = root.value
|
|
87
89
|
if (!nav || !nav.children.length) return
|
|
88
|
-
gap.value = parseFloat(getComputedStyle(nav).columnGap) || 0
|
|
90
|
+
gap.value = parseFloat(nodeWindow(nav).getComputedStyle(nav).columnGap) || 0
|
|
89
91
|
const items = nav.children.length
|
|
90
92
|
const used = [...nav.children].reduce((sum, el) => sum + (el as HTMLElement).offsetWidth, 0)
|
|
91
93
|
slotWidth.value = used / items
|
|
@@ -144,7 +146,7 @@ const slots = computed<Slot[]>(() => {
|
|
|
144
146
|
|
|
145
147
|
function go(p: number) {
|
|
146
148
|
if (props.disabled) return
|
|
147
|
-
const next =
|
|
149
|
+
const next = clamp(p, 1, count.value)
|
|
148
150
|
if (next === current.value) return
|
|
149
151
|
emit("update:page", next)
|
|
150
152
|
emit("change", next)
|
|
@@ -36,6 +36,7 @@ export type PhoneInputLabels = {
|
|
|
36
36
|
* is what a form should store. Until the library arrives the field takes digits
|
|
37
37
|
* as before, unformatted.
|
|
38
38
|
*/
|
|
39
|
+
import { CONTROL_SIZE } from "./controlSize"
|
|
39
40
|
import {
|
|
40
41
|
ComboboxAnchor,
|
|
41
42
|
ComboboxContent,
|
|
@@ -47,13 +48,13 @@ import {
|
|
|
47
48
|
ComboboxTrigger,
|
|
48
49
|
ComboboxViewport,
|
|
49
50
|
} from "reka-ui"
|
|
50
|
-
import { computed, onMounted, ref, shallowRef
|
|
51
|
-
import { useField,
|
|
51
|
+
import { computed, onMounted, ref, shallowRef } from "vue"
|
|
52
|
+
import { useField, useAttrsField, mergeDescribedBy } from "../composables/useField"
|
|
52
53
|
import { useFieldNotice, type FieldNoticeOptions } from "../composables/useFieldNotice"
|
|
53
54
|
import { useInputFilter } from "../composables/useInputFilter"
|
|
54
55
|
import { useLabels } from "../composables/useLpConfig"
|
|
55
56
|
import { type Country, filterCountries, flagEmoji, loadCountries, matchCountryByValue } from "./countries"
|
|
56
|
-
import { OPTION_ITEM, optionStagger, POPOVER_PANEL } from "./dropdown"
|
|
57
|
+
import { OPTION_ITEM, optionStagger, COMBOBOX_PANEL, POPOVER_PANEL } from "./dropdown"
|
|
57
58
|
import LpFieldNotice from "./LpFieldNotice.vue"
|
|
58
59
|
import LpIcon from "./LpIcon.vue"
|
|
59
60
|
import {
|
|
@@ -315,23 +316,13 @@ function onBlur() {
|
|
|
315
316
|
say(reason.replace("{country}", name), { tone: "danger", duration: 0 })
|
|
316
317
|
}
|
|
317
318
|
|
|
318
|
-
const sizeClass =
|
|
319
|
-
sm: "h-(--size-control-sm) text-xs",
|
|
320
|
-
md: "h-(--size-control-md) text-sm",
|
|
321
|
-
lg: "h-(--size-control-lg) text-sm",
|
|
322
|
-
}
|
|
319
|
+
const sizeClass = CONTROL_SIZE
|
|
323
320
|
|
|
324
321
|
// The control is full-width with its own frame — the two things a consumer
|
|
325
322
|
// placing it in a narrow column has to change, so `class="w-48"` must win.
|
|
326
323
|
// style lays out the frame; every other attr (name, autocomplete, @blur…)
|
|
327
324
|
// belongs to the number <input>.
|
|
328
|
-
const attrs =
|
|
329
|
-
const field = useFieldControl(() => ({
|
|
330
|
-
wrapped: false,
|
|
331
|
-
id: typeof attrs.id === "string" ? attrs.id : undefined,
|
|
332
|
-
invalid: props.invalid || flagged.value,
|
|
333
|
-
disabled: props.disabled,
|
|
334
|
-
}))
|
|
325
|
+
const { attrs, field } = useAttrsField(() => ({ invalid: props.invalid || flagged.value, disabled: props.disabled }))
|
|
335
326
|
const text = useLabels<PhoneInputLabels>("phoneInput", {
|
|
336
327
|
selectCountry: "Select country",
|
|
337
328
|
placeholder: "Phone number",
|
|
@@ -406,10 +397,8 @@ const guardOutside = useOutsideGuard()
|
|
|
406
397
|
<ComboboxContent
|
|
407
398
|
@interact-outside="guardOutside"
|
|
408
399
|
@escape-key-down="guardOutside"
|
|
409
|
-
|
|
410
|
-
position="popper"
|
|
400
|
+
v-bind="COMBOBOX_PANEL"
|
|
411
401
|
align="start"
|
|
412
|
-
:side-offset="6"
|
|
413
402
|
:class="[POPOVER_PANEL, 'z-(--z-popover) max-h-72 w-72 overflow-hidden']"
|
|
414
403
|
>
|
|
415
404
|
<div class="border-b border-line p-2">
|
|
@@ -460,7 +449,7 @@ const guardOutside = useOutsideGuard()
|
|
|
460
449
|
:disabled="field.disabled"
|
|
461
450
|
:required="field.required || undefined"
|
|
462
451
|
:aria-invalid="field.invalid || undefined"
|
|
463
|
-
:aria-describedby="[field.describedBy, notice.message.value ? noticeId :
|
|
452
|
+
:aria-describedby="mergeDescribedBy(rest['aria-describedby'], field.describedBy, notice.message.value ? noticeId : undefined)"
|
|
464
453
|
class="lp-autofill min-w-0 flex-1 self-stretch bg-transparent px-3 outline-none placeholder:text-muted"
|
|
465
454
|
@beforeinput="onBeforeEdit"
|
|
466
455
|
@paste="onPaste"
|
package/src/components/LpPie.vue
CHANGED
|
@@ -20,7 +20,10 @@ export default { inheritAttrs: false }
|
|
|
20
20
|
* A donut's hole is the natural place for the headline the chart is about — the
|
|
21
21
|
* total, or whatever the caller puts in the `center` slot.
|
|
22
22
|
*/
|
|
23
|
+
import { clamp } from "../composables/clamp"
|
|
24
|
+
import { isElement, useView, viewWindow } from "../composables/useView"
|
|
23
25
|
import { computed, onBeforeUnmount, ref, watch } from "vue"
|
|
26
|
+
import { useHotkeys } from "../composables/useHotkeys"
|
|
24
27
|
import { easeTravel, prefersReducedMotion } from "../composables/easing"
|
|
25
28
|
import { useReveal } from "../composables/useReveal"
|
|
26
29
|
import { lerp, mixColor, useTween } from "../composables/useTween"
|
|
@@ -272,7 +275,7 @@ const skeletonRing = computed(() => {
|
|
|
272
275
|
return { inset: `${inset}px`, borderWidth: `${Math.max(1, band)}px` }
|
|
273
276
|
})
|
|
274
277
|
const inner = computed(() =>
|
|
275
|
-
props.type === "donut" ? outer.value *
|
|
278
|
+
props.type === "donut" ? outer.value * clamp(props.innerRatio, 0, 0.95) : 0,
|
|
276
279
|
)
|
|
277
280
|
|
|
278
281
|
/*
|
|
@@ -682,7 +685,7 @@ const leaveChart = (e: PointerEvent) => {
|
|
|
682
685
|
// it, so look both up and down from wherever the pointer was reported to go.
|
|
683
686
|
const to = e.relatedTarget
|
|
684
687
|
if (
|
|
685
|
-
to
|
|
688
|
+
isElement(to) &&
|
|
686
689
|
(to.closest("[data-lp-follow]") || to.querySelector("[data-lp-follow]"))
|
|
687
690
|
)
|
|
688
691
|
return
|
|
@@ -691,22 +694,28 @@ const leaveChart = (e: PointerEvent) => {
|
|
|
691
694
|
endDrag()
|
|
692
695
|
}
|
|
693
696
|
|
|
697
|
+
const view = useView()
|
|
698
|
+
|
|
699
|
+
// Where the pointer is held: inside an LpFrame its release stays in the frame's window.
|
|
700
|
+
let dragWindow: Window | null = null
|
|
701
|
+
|
|
694
702
|
const endDrag = () => {
|
|
695
703
|
dragging.value = false
|
|
696
|
-
|
|
697
|
-
|
|
704
|
+
dragWindow?.removeEventListener("pointerup", endDrag)
|
|
705
|
+
dragWindow?.removeEventListener("pointercancel", endDrag)
|
|
706
|
+
dragWindow = null
|
|
698
707
|
}
|
|
699
708
|
|
|
700
709
|
const beginDrag = () => {
|
|
701
710
|
dragging.value = true
|
|
702
|
-
|
|
703
|
-
|
|
711
|
+
dragWindow = viewWindow(view.value)
|
|
712
|
+
dragWindow.addEventListener("pointerup", endDrag)
|
|
713
|
+
dragWindow.addEventListener("pointercancel", endDrag)
|
|
704
714
|
}
|
|
705
715
|
|
|
706
716
|
onBeforeUnmount(() => {
|
|
707
717
|
endDrag()
|
|
708
718
|
clearTimeout(leaveTimer)
|
|
709
|
-
window.removeEventListener("keydown", onKeydown)
|
|
710
719
|
})
|
|
711
720
|
|
|
712
721
|
const clearSelection = () => {
|
|
@@ -717,23 +726,16 @@ const clearSelection = () => {
|
|
|
717
726
|
}
|
|
718
727
|
|
|
719
728
|
/*
|
|
720
|
-
* Escape drops the selection, the way it dismisses any transient state.
|
|
721
|
-
*
|
|
722
|
-
*
|
|
723
|
-
*
|
|
724
|
-
*
|
|
725
|
-
*
|
|
729
|
+
* Escape drops the selection, the way it dismisses any transient state. Global
|
|
730
|
+
* rather than on the chart because a selection made with the mouse leaves focus
|
|
731
|
+
* nowhere in particular — requiring the user to focus the chart first would
|
|
732
|
+
* make the key useless exactly when they reach for it. Only armed while
|
|
733
|
+
* something is selected, so the chart never swallows an Escape meant for a
|
|
734
|
+
* dialog or a menu above it.
|
|
726
735
|
*/
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
}
|
|
730
|
-
|
|
731
|
-
watch(
|
|
732
|
-
() => selected.value.size > 0,
|
|
733
|
-
(hasSelection) => {
|
|
734
|
-
if (hasSelection) window.addEventListener("keydown", onKeydown)
|
|
735
|
-
else window.removeEventListener("keydown", onKeydown)
|
|
736
|
-
},
|
|
736
|
+
useHotkeys(
|
|
737
|
+
() => [{ key: "escape", allowInInput: true, handler: clearSelection }],
|
|
738
|
+
{ enabled: () => selected.value.size > 0 },
|
|
737
739
|
)
|
|
738
740
|
|
|
739
741
|
const menuPoint = ref<{ index: number; label: string; value: number; isOther: boolean } | null>(
|
|
@@ -27,6 +27,8 @@ export default { inheritAttrs: false }
|
|
|
27
27
|
*/
|
|
28
28
|
import { computed, nextTick, ref, useId, useSlots, watch } from "vue"
|
|
29
29
|
import { prefersReducedMotion } from "../composables/easing"
|
|
30
|
+
import { isElement } from "../composables/useView"
|
|
31
|
+
import { devWarn } from "../composables/devWarn"
|
|
30
32
|
import { useLabels } from "../composables/useLpConfig"
|
|
31
33
|
import { useMergedAttrs } from "../composables/useMergedClass"
|
|
32
34
|
import { useNow } from "../composables/useNow"
|
|
@@ -42,6 +44,7 @@ import {
|
|
|
42
44
|
connectorFilled,
|
|
43
45
|
currentStepIndex,
|
|
44
46
|
stepElapsed,
|
|
47
|
+
duplicateStepKeys,
|
|
45
48
|
stepKey,
|
|
46
49
|
type PipelineStep,
|
|
47
50
|
type StepStatus,
|
|
@@ -73,6 +76,8 @@ const props = withDefaults(
|
|
|
73
76
|
/**
|
|
74
77
|
* Keep the current step (see `currentStepIndex`) scrolled into view as the
|
|
75
78
|
* run advances: a long job list, or a horizontal strip wider than its box.
|
|
79
|
+
* It moves only when the current step changes, so a status update inside a
|
|
80
|
+
* step leaves the reader's scroll alone.
|
|
76
81
|
*/
|
|
77
82
|
follow?: boolean
|
|
78
83
|
/**
|
|
@@ -164,11 +169,17 @@ const announcement = ref("")
|
|
|
164
169
|
let seen = new Map<string, StepStatus>()
|
|
165
170
|
/* Steps the pipeline opened itself — the only ones it may close again. */
|
|
166
171
|
const autoOpened = new Set<string>()
|
|
172
|
+
const warnedKeys = new Set<string>()
|
|
167
173
|
|
|
168
174
|
watch(
|
|
169
175
|
() => props.steps.map((s, i) => [stepKey(s, i), s.status] as const),
|
|
170
176
|
(pairs, old) => {
|
|
171
177
|
const next = new Map(pairs)
|
|
178
|
+
const repeated = duplicateStepKeys(props.steps).filter((key) => !warnedKeys.has(key))
|
|
179
|
+
if (repeated.length) {
|
|
180
|
+
repeated.forEach((key) => warnedKeys.add(key))
|
|
181
|
+
devWarn(`LpPipeline: step keys must be unique, repeated: ${repeated.join(", ")}`)
|
|
182
|
+
}
|
|
172
183
|
if (old) {
|
|
173
184
|
const opened: string[] = []
|
|
174
185
|
const closed: string[] = []
|
|
@@ -191,6 +202,8 @@ watch(
|
|
|
191
202
|
}
|
|
192
203
|
}
|
|
193
204
|
seen = next
|
|
205
|
+
// A step that left the run will never pass to be folded again.
|
|
206
|
+
for (const key of autoOpened) if (!next.has(key)) autoOpened.delete(key)
|
|
194
207
|
},
|
|
195
208
|
{ immediate: true },
|
|
196
209
|
)
|
|
@@ -198,7 +211,7 @@ watch(
|
|
|
198
211
|
/* ── Following the current step. */
|
|
199
212
|
const uid = useId()
|
|
200
213
|
const items: Array<Element | null> = []
|
|
201
|
-
const bindItem = (i: number) => (el: unknown) => { items[i] = el
|
|
214
|
+
const bindItem = (i: number) => (el: unknown) => { items[i] = isElement(el) ? el : null }
|
|
202
215
|
const current = computed(() => currentStepIndex(props.steps))
|
|
203
216
|
|
|
204
217
|
watch(current, async (i) => {
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
PopoverRoot,
|
|
6
6
|
PopoverTrigger,
|
|
7
7
|
} from "reka-ui"
|
|
8
|
-
import { computed } from "vue"
|
|
8
|
+
import { computed, useAttrs } from "vue"
|
|
9
9
|
import { mergeClass } from "../composables/useMergedClass"
|
|
10
10
|
import { POPOVER_PANEL } from "./dropdown"
|
|
11
11
|
import { useOutsideGuard, usePortalTarget } from "../composables/useView"
|
|
@@ -20,7 +20,11 @@ const props = withDefaults(
|
|
|
20
20
|
sideOffset?: number
|
|
21
21
|
/** Extra classes for the floating panel (width, padding, overflow). */
|
|
22
22
|
panelClass?: string
|
|
23
|
-
/**
|
|
23
|
+
/**
|
|
24
|
+
* Accessible name of the panel, which reka exposes as a dialog. Without
|
|
25
|
+
* one the trigger names it. A heading inside the panel names it better:
|
|
26
|
+
* pass `aria-labelledby` with its id.
|
|
27
|
+
*/
|
|
24
28
|
ariaLabel?: string
|
|
25
29
|
}>(),
|
|
26
30
|
{ side: "bottom", align: "center", sideOffset: 6 },
|
|
@@ -36,6 +40,22 @@ const panel = computed(() =>
|
|
|
36
40
|
mergeClass(POPOVER_PANEL, "z-(--z-popover) w-64 rounded-card p-3 text-sm text-ink outline-none", props.panelClass),
|
|
37
41
|
)
|
|
38
42
|
|
|
43
|
+
/*
|
|
44
|
+
* reka writes the trigger's id into `aria-labelledby` after the attributes it
|
|
45
|
+
* was given, and that outranks `aria-label`: a name passed here never reached
|
|
46
|
+
* a reader. It renders that value once per open, so the panel can be put right
|
|
47
|
+
* as it opens without being overwritten.
|
|
48
|
+
*/
|
|
49
|
+
const attrs = useAttrs()
|
|
50
|
+
function namePanel(event: Event) {
|
|
51
|
+
// The event comes from the positioning wrapper around the panel.
|
|
52
|
+
const panel = (event.currentTarget as HTMLElement).querySelector('[role="dialog"]')
|
|
53
|
+
if (!panel) return
|
|
54
|
+
const labelledBy = attrs["aria-labelledby"]
|
|
55
|
+
if (typeof labelledBy === "string") panel.setAttribute("aria-labelledby", labelledBy)
|
|
56
|
+
else if (props.ariaLabel) panel.removeAttribute("aria-labelledby")
|
|
57
|
+
}
|
|
58
|
+
|
|
39
59
|
// Overlays open in the window this component renders in (an LpFrame's, inside one).
|
|
40
60
|
const portalTo = usePortalTarget()
|
|
41
61
|
// What happens in another document (the page around a frame, or a frame in
|
|
@@ -51,6 +71,7 @@ const guardOutside = useOutsideGuard()
|
|
|
51
71
|
<PopoverPortal :to="portalTo">
|
|
52
72
|
<PopoverContent
|
|
53
73
|
v-bind="$attrs"
|
|
74
|
+
@open-auto-focus="namePanel"
|
|
54
75
|
@interact-outside="guardOutside"
|
|
55
76
|
@escape-key-down="guardOutside"
|
|
56
77
|
:collision-padding="8"
|
|
@@ -16,6 +16,7 @@ export default { inheritAttrs: false }
|
|
|
16
16
|
* reka ProgressRoot underneath (so assistive tech reads a progressbar with a
|
|
17
17
|
* value either way).
|
|
18
18
|
*/
|
|
19
|
+
import { clamp } from "../composables/clamp"
|
|
19
20
|
import { ProgressIndicator, ProgressRoot } from "reka-ui"
|
|
20
21
|
import { computed } from "vue"
|
|
21
22
|
import { useMergedAttrs } from "../composables/useMergedClass"
|
|
@@ -130,7 +131,7 @@ const bindReveal = (instance: unknown) => {
|
|
|
130
131
|
// A zero or missing max (no quota known yet) reads as empty, not as NaN%.
|
|
131
132
|
const pct = computed(() => {
|
|
132
133
|
const ratio = props.max > 0 ? (shown.value / props.max) * 100 : 0
|
|
133
|
-
return Number.isFinite(ratio) ?
|
|
134
|
+
return Number.isFinite(ratio) ? clamp(ratio, 0, 100) : 0
|
|
134
135
|
})
|
|
135
136
|
|
|
136
137
|
/*
|
|
@@ -9,7 +9,7 @@ export default { inheritAttrs: false }
|
|
|
9
9
|
import { usePaletteControl, type PaletteControlOptions } from "../composables/usePaletteCommands"
|
|
10
10
|
import { RadioGroupIndicator, RadioGroupItem, RadioGroupRoot } from "reka-ui"
|
|
11
11
|
import { useId } from "vue"
|
|
12
|
-
import { useFieldControl } from "../composables/useField"
|
|
12
|
+
import { useFieldControl, mergeDescribedBy } from "../composables/useField"
|
|
13
13
|
import { useMergedAttrs } from "../composables/useMergedClass"
|
|
14
14
|
import LpIcon from "./LpIcon.vue"
|
|
15
15
|
import type { LpOptionBase } from "./options"
|
|
@@ -42,10 +42,10 @@ usePaletteControl({ disabled: () => field.value.disabled })
|
|
|
42
42
|
:disabled="field.disabled"
|
|
43
43
|
:required="field.required"
|
|
44
44
|
:aria-labelledby="field.labelId"
|
|
45
|
-
:aria-describedby="field.describedBy"
|
|
46
45
|
:aria-invalid="field.invalid || undefined"
|
|
47
46
|
:class="rootClass"
|
|
48
47
|
v-bind="rest"
|
|
48
|
+
:aria-describedby="mergeDescribedBy(rest['aria-describedby'], field.describedBy)"
|
|
49
49
|
@update:model-value="(v) => $emit('update:modelValue', v as string)"
|
|
50
50
|
>
|
|
51
51
|
<slot>
|