@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 SliderRail from "./SliderRail.vue"
|
|
9
10
|
import { usePaletteControl, type PaletteControlOptions } from "../composables/usePaletteCommands"
|
|
10
11
|
/*
|
|
11
12
|
* Two thumbs on one track: a range rather than a value. A price "from – to",
|
|
@@ -14,8 +15,8 @@ import { usePaletteControl, type PaletteControlOptions } from "../composables/us
|
|
|
14
15
|
* Each thumb can carry a label above it (`format`), shown while it is hovered,
|
|
15
16
|
* focused or dragged, so the numbers are readable without a second readout.
|
|
16
17
|
*/
|
|
17
|
-
import {
|
|
18
|
-
import { useFieldControl } from "../composables/useField"
|
|
18
|
+
import { SliderRoot, SliderThumb } from "reka-ui"
|
|
19
|
+
import { useFieldControl, mergeDescribedBy } from "../composables/useField"
|
|
19
20
|
import { useMergedAttrs } from "../composables/useMergedClass"
|
|
20
21
|
import { SLIDER_GLIDE, useSliderDrag } from "./slider"
|
|
21
22
|
|
|
@@ -87,16 +88,14 @@ usePaletteControl({ disabled: () => field.value.disabled })
|
|
|
87
88
|
@update:model-value="onUpdate"
|
|
88
89
|
@value-commit="onCommit"
|
|
89
90
|
>
|
|
90
|
-
<
|
|
91
|
-
<SliderRange class="absolute h-full rounded-pill bg-brand" />
|
|
92
|
-
</SliderTrack>
|
|
91
|
+
<SliderRail />
|
|
93
92
|
<SliderThumb
|
|
94
93
|
v-for="index in [0, 1] as const"
|
|
95
94
|
:key="index"
|
|
96
95
|
:id="index === 0 ? field.id : undefined"
|
|
97
96
|
:aria-label="ariaLabels?.[index]"
|
|
98
97
|
:aria-labelledby="ariaLabels ? undefined : field.labelId"
|
|
99
|
-
:aria-describedby="field.describedBy"
|
|
98
|
+
:aria-describedby="mergeDescribedBy(rest['aria-describedby'], field.describedBy)"
|
|
100
99
|
:class="thumbClass"
|
|
101
100
|
>
|
|
102
101
|
<span v-if="format" :class="labelClass">{{ format(props.modelValue[index]) }}</span>
|
|
@@ -85,7 +85,7 @@ function play(node: HTMLElement) {
|
|
|
85
85
|
if (props.immediate || prefersReducedMotion() || typeof node.animate !== "function") return
|
|
86
86
|
const from = revealFrom(props.preset, props.direction, props.distance)
|
|
87
87
|
const frames = [from, revealTo(from)]
|
|
88
|
-
const easing = easingToken("ease-emphasized")
|
|
88
|
+
const easing = easingToken("ease-emphasized", undefined, node)
|
|
89
89
|
// `backwards` holds each target in its hidden state through its delay, so a
|
|
90
90
|
// staggered child does not flash in before its turn.
|
|
91
91
|
const targets = props.stagger > 0 ? Array.from(node.children) : [node]
|
|
@@ -13,7 +13,20 @@ import {
|
|
|
13
13
|
ScrollAreaThumb,
|
|
14
14
|
ScrollAreaViewport,
|
|
15
15
|
} from "reka-ui"
|
|
16
|
-
import {
|
|
16
|
+
import { nodeWindow } from "../composables/useView"
|
|
17
|
+
import {
|
|
18
|
+
BAR_FADE,
|
|
19
|
+
BAR_X,
|
|
20
|
+
BAR_X_SIZE,
|
|
21
|
+
BAR_Y,
|
|
22
|
+
BAR_Y_SIZE,
|
|
23
|
+
pageToward,
|
|
24
|
+
SCROLL_HIDE_DELAY_MS,
|
|
25
|
+
THUMB_X,
|
|
26
|
+
THUMB_X_ROUND,
|
|
27
|
+
THUMB_Y,
|
|
28
|
+
THUMB_Y_ROUND,
|
|
29
|
+
} from "./scrollbar"
|
|
17
30
|
|
|
18
31
|
// `fade` softens whichever of the top/bottom edges currently has content beyond
|
|
19
32
|
// it, so a clipped list reads as continuing rather than as cut off. On by
|
|
@@ -79,8 +92,7 @@ function onViewportBlur() {
|
|
|
79
92
|
// `opacity-0` + the hidden-state fade is what keeps the bar invisible at rest:
|
|
80
93
|
// with force-mount the element stays in the DOM, so a one-shot fade-out alone
|
|
81
94
|
// would snap back to visible once the animation finished.
|
|
82
|
-
const
|
|
83
|
-
"opacity-0 data-[state=visible]:animate-[fade-in_180ms_ease] data-[state=visible]:opacity-100 data-[state=hidden]:animate-[fade-out_240ms_ease]"
|
|
95
|
+
const edge = computed(() => (props.floating ? "floating" : "wall"))
|
|
84
96
|
|
|
85
97
|
// Dragging the thumb pulls the pointer off the bar and across the content, and
|
|
86
98
|
// the browser reads that as a text selection — the rows highlight blue while
|
|
@@ -122,7 +134,9 @@ function measureEdges(el: HTMLElement) {
|
|
|
122
134
|
* it has to come off the element.
|
|
123
135
|
*
|
|
124
136
|
* Kept in sync with content size rather than set once: a list that fills in
|
|
125
|
-
* later becomes scrollable without anything else changing.
|
|
137
|
+
* later becomes scrollable without anything else changing. The viewport's
|
|
138
|
+
* tabindex is therefore this component's alone; `tabindex` on LpScrollArea
|
|
139
|
+
* lands on its root and does not reach it.
|
|
126
140
|
*/
|
|
127
141
|
function syncViewportFocusable(el: HTMLElement) {
|
|
128
142
|
const scrollable = el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth
|
|
@@ -161,8 +175,10 @@ watch(
|
|
|
161
175
|
}
|
|
162
176
|
remeasure()
|
|
163
177
|
|
|
164
|
-
|
|
165
|
-
|
|
178
|
+
// The element's own window: the observers belong to the realm they watch.
|
|
179
|
+
const win = nodeWindow(el)
|
|
180
|
+
if (win.ResizeObserver) {
|
|
181
|
+
edgeResize = new win.ResizeObserver(remeasure)
|
|
166
182
|
edgeResize.observe(el)
|
|
167
183
|
// Watching the children too, since a grid that reflows into more rows
|
|
168
184
|
// grows the content box without the viewport's own size moving.
|
|
@@ -171,8 +187,8 @@ watch(
|
|
|
171
187
|
// Rows arriving after the first paint are the common case — a list waiting
|
|
172
188
|
// on a query renders empty, and observing only the boxes that existed then
|
|
173
189
|
// left the fade off until something else happened to trigger a measure.
|
|
174
|
-
if (
|
|
175
|
-
edgeMutation = new MutationObserver(() => {
|
|
190
|
+
if (win.MutationObserver) {
|
|
191
|
+
edgeMutation = new win.MutationObserver(() => {
|
|
176
192
|
if (edgeResize) {
|
|
177
193
|
edgeResize.disconnect()
|
|
178
194
|
edgeResize.observe(el)
|
|
@@ -186,16 +202,15 @@ watch(
|
|
|
186
202
|
{ immediate: true, flush: "post" },
|
|
187
203
|
)
|
|
188
204
|
|
|
189
|
-
onBeforeUnmount(
|
|
205
|
+
onBeforeUnmount(() => {
|
|
206
|
+
stopEdgeWatch()
|
|
207
|
+
stopThumbDrag?.()
|
|
208
|
+
})
|
|
190
209
|
|
|
191
210
|
/*
|
|
192
|
-
* A press on the bar beside the thumb
|
|
193
|
-
*
|
|
194
|
-
* so a press that
|
|
195
|
-
* thumb, and a press further away teleported it. Like a native bar, a press
|
|
196
|
-
* off the thumb now pages one viewport towards the pointer, smoothly; the
|
|
197
|
-
* thumb itself has a hit area as wide as the bar (see its `before:`), so a
|
|
198
|
-
* press that meant to grab it does.
|
|
211
|
+
* A press on the bar beside the thumb pages towards the pointer (pageToward)
|
|
212
|
+
* instead of reka's jump; the thumb's hit area is as wide as the bar (its
|
|
213
|
+
* `before:`), so a press that meant to grab it does.
|
|
199
214
|
*/
|
|
200
215
|
function onTrackPointerDown(event: PointerEvent, axis: "x" | "y") {
|
|
201
216
|
const el = viewportEl.value
|
|
@@ -205,23 +220,29 @@ function onTrackPointerDown(event: PointerEvent, axis: "x" | "y") {
|
|
|
205
220
|
event.preventDefault()
|
|
206
221
|
event.stopImmediatePropagation()
|
|
207
222
|
const rect = thumb.getBoundingClientRect()
|
|
208
|
-
|
|
209
|
-
const step = (axis === "y" ? el.clientHeight : el.clientWidth) * 0.85 * (before ? -1 : 1)
|
|
210
|
-
const behavior = prefersReducedMotion() ? "auto" : "smooth"
|
|
211
|
-
el.scrollBy(axis === "y" ? { top: step, behavior } : { left: step, behavior })
|
|
223
|
+
pageToward(el, axis, axis === "y" ? event.clientY < rect.top : event.clientX < rect.left)
|
|
212
224
|
}
|
|
213
225
|
|
|
214
|
-
|
|
226
|
+
let stopThumbDrag: (() => void) | null = null
|
|
227
|
+
|
|
228
|
+
function onThumbPointerDown(event: PointerEvent) {
|
|
215
229
|
dragging.value = true
|
|
230
|
+
stopThumbDrag?.()
|
|
231
|
+
// The thumb's own window: inside an LpFrame the page's never hears the release.
|
|
232
|
+
const win = nodeWindow(event.currentTarget as Node)
|
|
216
233
|
const stop = () => {
|
|
217
234
|
dragging.value = false
|
|
218
|
-
|
|
219
|
-
|
|
235
|
+
win.removeEventListener("pointerup", stop)
|
|
236
|
+
win.removeEventListener("pointercancel", stop)
|
|
237
|
+
win.removeEventListener("lostpointercapture", stop)
|
|
238
|
+
stopThumbDrag = null
|
|
220
239
|
}
|
|
240
|
+
stopThumbDrag = stop
|
|
221
241
|
// Bound on the window: the pointer is captured by the thumb, and the release
|
|
222
242
|
// routinely happens far outside the scroll area.
|
|
223
|
-
|
|
224
|
-
|
|
243
|
+
win.addEventListener("pointerup", stop)
|
|
244
|
+
win.addEventListener("pointercancel", stop)
|
|
245
|
+
win.addEventListener("lostpointercapture", stop)
|
|
225
246
|
}
|
|
226
247
|
</script>
|
|
227
248
|
|
|
@@ -236,7 +257,7 @@ function onThumbPointerDown() {
|
|
|
236
257
|
class="relative flex flex-col overflow-hidden"
|
|
237
258
|
:class="dragging ? 'select-none' : undefined"
|
|
238
259
|
type="hover"
|
|
239
|
-
:scroll-hide-delay="
|
|
260
|
+
:scroll-hide-delay="SCROLL_HIDE_DELAY_MS"
|
|
240
261
|
>
|
|
241
262
|
<!-- The bar itself is a pointer target far wider than it looks: the visible
|
|
242
263
|
rail is the thumb, sized below, while the track pads it out to a
|
|
@@ -256,8 +277,8 @@ function onThumbPointerDown() {
|
|
|
256
277
|
<ScrollAreaScrollbar
|
|
257
278
|
orientation="vertical"
|
|
258
279
|
force-mount
|
|
259
|
-
class="
|
|
260
|
-
:class="[
|
|
280
|
+
class="z-1"
|
|
281
|
+
:class="[BAR_Y, BAR_FADE, BAR_Y_SIZE[edge]]"
|
|
261
282
|
:style="barInsetTop ? { marginTop: barInsetTop } : undefined"
|
|
262
283
|
@pointerdown.capture="onTrackPointerDown($event, 'y')"
|
|
263
284
|
>
|
|
@@ -269,22 +290,22 @@ function onThumbPointerDown() {
|
|
|
269
290
|
the positioning reka owns. -->
|
|
270
291
|
<ScrollAreaThumb
|
|
271
292
|
data-lp-thumb
|
|
272
|
-
class="relative
|
|
273
|
-
:class="
|
|
293
|
+
class="relative"
|
|
294
|
+
:class="[THUMB_Y, THUMB_Y_ROUND[edge]]"
|
|
274
295
|
@pointerdown="onThumbPointerDown"
|
|
275
296
|
/>
|
|
276
297
|
</ScrollAreaScrollbar>
|
|
277
298
|
|
|
278
299
|
<ScrollAreaScrollbar
|
|
279
300
|
orientation="horizontal"
|
|
280
|
-
class="
|
|
281
|
-
:class="[
|
|
301
|
+
class="z-1"
|
|
302
|
+
:class="[BAR_X, BAR_FADE, BAR_X_SIZE[edge]]"
|
|
282
303
|
@pointerdown.capture="onTrackPointerDown($event, 'x')"
|
|
283
304
|
>
|
|
284
305
|
<ScrollAreaThumb
|
|
285
306
|
data-lp-thumb
|
|
286
|
-
class="relative
|
|
287
|
-
:class="
|
|
307
|
+
class="relative"
|
|
308
|
+
:class="[THUMB_X, THUMB_X_ROUND[edge]]"
|
|
288
309
|
@pointerdown="onThumbPointerDown"
|
|
289
310
|
/>
|
|
290
311
|
</ScrollAreaScrollbar>
|
|
@@ -12,6 +12,7 @@ export interface SecretFieldLabels extends Record<string, string> {
|
|
|
12
12
|
</script>
|
|
13
13
|
|
|
14
14
|
<script setup lang="ts">
|
|
15
|
+
import { isElement } from "../composables/useView"
|
|
15
16
|
import { suppressPaletteDiscovery } from "../composables/usePaletteCommands"
|
|
16
17
|
/*
|
|
17
18
|
* A value someone must be able to read and copy but should not have on screen
|
|
@@ -159,7 +160,7 @@ const field = ref<{ $el?: Element } | null>(null)
|
|
|
159
160
|
watch(revealed, () => {
|
|
160
161
|
if (!props.input || prefersReducedMotion()) return
|
|
161
162
|
const el = field.value?.$el
|
|
162
|
-
const input = el
|
|
163
|
+
const input = isElement(el) ? el.querySelector("input") : null
|
|
163
164
|
input?.animate([{ filter: "blur(4px)", opacity: 0.35 }, { filter: "blur(0)", opacity: 1 }], {
|
|
164
165
|
duration: 260,
|
|
165
166
|
easing: "cubic-bezier(0.2, 0, 0, 1)",
|
|
@@ -6,6 +6,8 @@ export default { inheritAttrs: false }
|
|
|
6
6
|
</script>
|
|
7
7
|
|
|
8
8
|
<script setup lang="ts">
|
|
9
|
+
import { CONTROL_SIZE } from "./controlSize"
|
|
10
|
+
import { isHTMLElement } from "../composables/useView"
|
|
9
11
|
import { usePaletteControl, type PaletteControlOptions } from "../composables/usePaletteCommands"
|
|
10
12
|
/*
|
|
11
13
|
* Segmented control — a compact bar of mutually-exclusive options with a sliding
|
|
@@ -17,7 +19,7 @@ import { usePaletteControl, type PaletteControlOptions } from "../composables/us
|
|
|
17
19
|
import { Motion } from "motion-v"
|
|
18
20
|
import { ToggleGroupItem, ToggleGroupRoot } from "reka-ui"
|
|
19
21
|
import { ref, useId } from "vue"
|
|
20
|
-
import { useFieldControl } from "../composables/useField"
|
|
22
|
+
import { useFieldControl, mergeDescribedBy } from "../composables/useField"
|
|
21
23
|
import { useMergedAttrs } from "../composables/useMergedClass"
|
|
22
24
|
import { usePillTransition } from "../composables/usePillTransition"
|
|
23
25
|
import AttentionDot from "./AttentionDot.vue"
|
|
@@ -66,11 +68,7 @@ function onChange(v: unknown) {
|
|
|
66
68
|
if (typeof v === "string" && v) emit("update:modelValue", v)
|
|
67
69
|
}
|
|
68
70
|
|
|
69
|
-
const sizeCls =
|
|
70
|
-
sm: "h-(--size-control-sm) text-xs",
|
|
71
|
-
md: "h-(--size-control-md) text-sm",
|
|
72
|
-
lg: "h-(--size-control-lg) text-sm",
|
|
73
|
-
}
|
|
71
|
+
const sizeCls = CONTROL_SIZE
|
|
74
72
|
|
|
75
73
|
// The bar sizes itself from `size` and `block`, which is right until a consumer
|
|
76
74
|
// needs it flush against something — `class="p-0"` and `class="rounded-none"`
|
|
@@ -109,7 +107,7 @@ function pillUnder(value: string): boolean {
|
|
|
109
107
|
*/
|
|
110
108
|
function releaseFocusAfterPointer(event: PointerEvent) {
|
|
111
109
|
const target = event.currentTarget
|
|
112
|
-
if (target
|
|
110
|
+
if (isHTMLElement(target)) target.blur()
|
|
113
111
|
}
|
|
114
112
|
|
|
115
113
|
usePaletteControl({ disabled: () => field.value.disabled })
|
|
@@ -121,10 +119,10 @@ usePaletteControl({ disabled: () => field.value.disabled })
|
|
|
121
119
|
type="single"
|
|
122
120
|
:disabled="field.disabled"
|
|
123
121
|
:aria-labelledby="field.labelId"
|
|
124
|
-
:aria-describedby="field.describedBy"
|
|
125
122
|
:rovingFocus="true"
|
|
126
123
|
:class="rootClass"
|
|
127
124
|
v-bind="rest"
|
|
125
|
+
:aria-describedby="mergeDescribedBy(rest['aria-describedby'], field.describedBy)"
|
|
128
126
|
@update:model-value="onChange"
|
|
129
127
|
@pointerleave="hovered = null"
|
|
130
128
|
>
|
|
@@ -16,6 +16,8 @@ export type SelectLabels = {
|
|
|
16
16
|
</script>
|
|
17
17
|
|
|
18
18
|
<script setup lang="ts" generic="V extends SelectValue = string">
|
|
19
|
+
import IconCloseButton from "./IconCloseButton.vue"
|
|
20
|
+
import { CONTROL_SIZE } from "./controlSize"
|
|
19
21
|
import { usePaletteControl, type PaletteControlOptions } from "../composables/usePaletteCommands"
|
|
20
22
|
/*
|
|
21
23
|
* One select to rule them all — built on reka-ui Combobox.
|
|
@@ -37,7 +39,7 @@ import {
|
|
|
37
39
|
ComboboxViewport,
|
|
38
40
|
} from "reka-ui"
|
|
39
41
|
import { computed, nextTick, reactive, ref, useAttrs, useId, watch } from "vue"
|
|
40
|
-
import { useFieldBlur, useFieldControl } from "../composables/useField"
|
|
42
|
+
import { useFieldBlur, useFieldControl, mergeDescribedBy } from "../composables/useField"
|
|
41
43
|
import { useLabels } from "../composables/useLpConfig"
|
|
42
44
|
import { useMergedAttrs } from "../composables/useMergedClass"
|
|
43
45
|
import { OPTION_ITEM, optionStagger, POPOVER_PANEL } from "./dropdown"
|
|
@@ -45,8 +47,8 @@ import LpIcon from "./LpIcon.vue"
|
|
|
45
47
|
import OptionContent from "./OptionContent.vue"
|
|
46
48
|
import LpRollingText from "./LpRollingText.vue"
|
|
47
49
|
import type { LpOptionBase, OptionSelection } from "./options"
|
|
48
|
-
import { fitChips, toggledValues } from "./select"
|
|
49
|
-
import { useOutsideGuard, usePortalTarget } from "../composables/useView"
|
|
50
|
+
import { evictOldest, fitChips, toggledValues } from "./select"
|
|
51
|
+
import { nodeWindow, useOutsideGuard, usePortalTarget } from "../composables/useView"
|
|
50
52
|
import { useResizeObserver } from "../composables/useResizeObserver"
|
|
51
53
|
|
|
52
54
|
export type SelectValue = string | number
|
|
@@ -105,11 +107,7 @@ const props = withDefaults(
|
|
|
105
107
|
)
|
|
106
108
|
|
|
107
109
|
/* The text steps with the height, as in every other kit field: a small select beside a small input read a size larger. */
|
|
108
|
-
const SIZE_HEIGHT =
|
|
109
|
-
sm: "h-(--size-control-sm) text-xs",
|
|
110
|
-
md: "h-(--size-control-md) text-sm",
|
|
111
|
-
lg: "h-(--size-control-lg) text-sm",
|
|
112
|
-
} as const
|
|
110
|
+
const SIZE_HEIGHT = CONTROL_SIZE
|
|
113
111
|
const anchorHeight = computed(() => SIZE_HEIGHT[props.size])
|
|
114
112
|
|
|
115
113
|
const field = useFieldControl(() => ({
|
|
@@ -189,7 +187,38 @@ async function openFromKeyboard(event: KeyboardEvent) {
|
|
|
189
187
|
const items = panel?.querySelectorAll<HTMLElement>('[role="option"]:not([data-disabled])')
|
|
190
188
|
const selected = panel?.querySelector<HTMLElement>('[role="option"][aria-selected="true"]:not([data-disabled])')
|
|
191
189
|
const target = search ?? selected ?? (event.key === "ArrowUp" ? items?.[items.length - 1] : items?.[0])
|
|
192
|
-
|
|
190
|
+
// Something else may have kept the list shut: nothing to move into then.
|
|
191
|
+
if (isOpen.value) target?.focus()
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/*
|
|
195
|
+
* reka reads the arrow keys from the search box. A list without one takes focus
|
|
196
|
+
* on an option, where its own handling put focus straight back on the option
|
|
197
|
+
* the list opened on, so that was all a keyboard could ever pick. Taken here,
|
|
198
|
+
* ahead of it.
|
|
199
|
+
*/
|
|
200
|
+
const LIST_KEYS = ["ArrowDown", "ArrowUp", "Home", "End", "Enter"]
|
|
201
|
+
|
|
202
|
+
function moveInList(event: KeyboardEvent) {
|
|
203
|
+
if (props.searchable || serverSide.value || !LIST_KEYS.includes(event.key)) return
|
|
204
|
+
const list = event.currentTarget as HTMLElement
|
|
205
|
+
const items = Array.from(list.querySelectorAll<HTMLElement>('[role="option"]:not([data-disabled])'))
|
|
206
|
+
if (!items.length) return
|
|
207
|
+
event.preventDefault()
|
|
208
|
+
event.stopPropagation()
|
|
209
|
+
const at = items.indexOf(list.ownerDocument.activeElement as HTMLElement)
|
|
210
|
+
if (event.key === "Enter") {
|
|
211
|
+
items[at]?.click()
|
|
212
|
+
return
|
|
213
|
+
}
|
|
214
|
+
const last = items.length - 1
|
|
215
|
+
const next = {
|
|
216
|
+
ArrowDown: at === last ? 0 : at + 1,
|
|
217
|
+
ArrowUp: at <= 0 ? last : at - 1,
|
|
218
|
+
Home: 0,
|
|
219
|
+
End: last,
|
|
220
|
+
}[event.key]
|
|
221
|
+
items[next ?? 0]?.focus()
|
|
193
222
|
}
|
|
194
223
|
|
|
195
224
|
// Leaving the field, not moving between its parts: the trigger and the list
|
|
@@ -219,7 +248,9 @@ function onListFocusOut(event: FocusEvent) {
|
|
|
219
248
|
* The trigger's name. reka hard-codes aria-label="Show popup" on it, which hid
|
|
220
249
|
* the field's label and the chosen value; aria-labelledby outranks aria-label,
|
|
221
250
|
* so inside a labelled field the name is the label plus the value. On its own,
|
|
222
|
-
* the consumer's aria-label, else the value or placeholder
|
|
251
|
+
* the consumer's aria-label plus the value, else the value or placeholder: the
|
|
252
|
+
* name has to hold the text the button shows, or a voice user who says what
|
|
253
|
+
* they see ("click Alpha") cannot reach it (WCAG 2.5.3).
|
|
223
254
|
*/
|
|
224
255
|
const attrs = useAttrs()
|
|
225
256
|
const valueId = `lp-select-${useId()}-value`
|
|
@@ -227,7 +258,7 @@ const valueText = computed(() => (chips.value.length ? chipNames.value : display
|
|
|
227
258
|
const triggerName = computed(() =>
|
|
228
259
|
field.value.labelId
|
|
229
260
|
? { "aria-labelledby": `${field.value.labelId} ${valueId}`, "aria-label": undefined }
|
|
230
|
-
: { "aria-label":
|
|
261
|
+
: { "aria-label": [attrs["aria-label"] as string | undefined, valueText.value].filter(Boolean).join(", ") },
|
|
231
262
|
)
|
|
232
263
|
|
|
233
264
|
// reka's Combobox forbids an empty-string item value (it reserves "" for
|
|
@@ -281,6 +312,7 @@ const filtered = computed(() => {
|
|
|
281
312
|
type Shown = { label: string; hint?: string; image?: string; icon?: string }
|
|
282
313
|
|
|
283
314
|
const remembered = reactive(new Map<SelectValue, Shown>())
|
|
315
|
+
const REMEMBERED_LIMIT = 500
|
|
284
316
|
|
|
285
317
|
function fromOption(o: SelectOption<V>): Shown {
|
|
286
318
|
return { label: o.label, hint: o.description, image: o.image, icon: o.icon }
|
|
@@ -291,6 +323,7 @@ function remember(values: readonly SelectValue[]) {
|
|
|
291
323
|
const o = props.options.find((x) => x.value === v)
|
|
292
324
|
if (o) remembered.set(v, fromOption(o))
|
|
293
325
|
}
|
|
326
|
+
evictOldest(remembered, new Set(values), REMEMBERED_LIMIT)
|
|
294
327
|
}
|
|
295
328
|
|
|
296
329
|
const modelList = computed<V[]>(() => {
|
|
@@ -355,7 +388,7 @@ function measure() {
|
|
|
355
388
|
if (!row || !probe) return
|
|
356
389
|
const kids = Array.from(probe.children) as HTMLElement[]
|
|
357
390
|
const more = kids.pop()
|
|
358
|
-
const gap = Number.parseFloat(getComputedStyle(probe).columnGap) || 0
|
|
391
|
+
const gap = Number.parseFloat(nodeWindow(probe).getComputedStyle(probe).columnGap) || 0
|
|
359
392
|
fit.value = fitChips(
|
|
360
393
|
kids.map((k) => k.offsetWidth),
|
|
361
394
|
row.clientWidth,
|
|
@@ -365,6 +398,9 @@ function measure() {
|
|
|
365
398
|
}
|
|
366
399
|
|
|
367
400
|
useResizeObserver(chipRow, () => measure())
|
|
401
|
+
// The chips can change width while the row keeps its own: a web font arriving,
|
|
402
|
+
// a theme. The probe is as wide as they are, so it notices.
|
|
403
|
+
useResizeObserver(probeRow, () => measure())
|
|
368
404
|
watch(chips, () => void nextTick(measure), { flush: "post", deep: true })
|
|
369
405
|
|
|
370
406
|
const shownChips = computed(() => chips.value.slice(0, fit.value))
|
|
@@ -451,7 +487,7 @@ usePaletteControl({ disabled: () => field.value.disabled, invalid: () => field.v
|
|
|
451
487
|
@keydown="openFromKeyboard"
|
|
452
488
|
v-bind="triggerName"
|
|
453
489
|
:aria-invalid="field.invalid || undefined"
|
|
454
|
-
:aria-describedby="field.describedBy"
|
|
490
|
+
:aria-describedby="mergeDescribedBy(rootAttrs['aria-describedby'], field.describedBy)"
|
|
455
491
|
class="flex min-w-0 flex-1 items-center gap-2 outline-none"
|
|
456
492
|
>
|
|
457
493
|
<!-- Several picks read as chips (picture + name) that collapse into
|
|
@@ -527,20 +563,13 @@ usePaletteControl({ disabled: () => field.value.disabled, invalid: () => field.v
|
|
|
527
563
|
</LpRollingText>
|
|
528
564
|
</template>
|
|
529
565
|
</ComboboxTrigger>
|
|
530
|
-
<
|
|
566
|
+
<IconCloseButton
|
|
531
567
|
v-if="clearable && hasValue && !field.disabled"
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
:aria-label="labels.clear"
|
|
568
|
+
inline
|
|
569
|
+
:label="labels.clear"
|
|
535
570
|
@pointerdown.prevent
|
|
536
571
|
@click="clear"
|
|
537
|
-
|
|
538
|
-
<LpIcon
|
|
539
|
-
name="lucide:x"
|
|
540
|
-
:size="16"
|
|
541
|
-
class="transition-transform duration-200 ease-[var(--ease-emphasized)] group-hover:rotate-90 group-active:scale-90 motion-reduce:group-hover:rotate-0"
|
|
542
|
-
/>
|
|
543
|
-
</button>
|
|
572
|
+
/>
|
|
544
573
|
<!-- A second way in for the pointer only: the main trigger already owns
|
|
545
574
|
focus and the accessible name, so this one stays out of the tab order
|
|
546
575
|
and the accessibility tree. -->
|
|
@@ -565,6 +594,7 @@ usePaletteControl({ disabled: () => field.value.disabled, invalid: () => field.v
|
|
|
565
594
|
<ComboboxContent
|
|
566
595
|
:data-lp-field-part="partId"
|
|
567
596
|
@focusout="onListFocusOut"
|
|
597
|
+
@keydown.capture="moveInList"
|
|
568
598
|
@interact-outside="guardOutside"
|
|
569
599
|
@escape-key-down="guardOutside"
|
|
570
600
|
position="popper"
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* depends_on edges connect these across host frames. Tailwind utilities only
|
|
6
6
|
* (no scoped CSS) so styles reach consumer apps via @source.
|
|
7
7
|
*/
|
|
8
|
-
import { Handle, Position } from "@vue-flow/core"
|
|
8
|
+
import { Handle, Position, type NodeProps } from "@vue-flow/core"
|
|
9
9
|
import { computed } from "vue"
|
|
10
10
|
|
|
11
11
|
export interface ServiceNodeData {
|
|
@@ -16,7 +16,9 @@ export interface ServiceNodeData {
|
|
|
16
16
|
dimmed?: boolean
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
// Vue Flow hands a custom node all of NodeProps. Declared, they stop falling
|
|
20
|
+
// through onto the node's root as attributes (position="[object Object]").
|
|
21
|
+
const props = defineProps<Omit<NodeProps<ServiceNodeData>, "selected"> & { selected?: boolean }>()
|
|
20
22
|
|
|
21
23
|
const kindVar: Record<string, string> = {
|
|
22
24
|
service: "var(--color-brand)",
|
|
@@ -35,6 +35,8 @@ export default { inheritAttrs: false }
|
|
|
35
35
|
* - Unmounting releases the GL context, so a page that mounts and unmounts
|
|
36
36
|
* backdrops does not run into the browser's limit on live contexts.
|
|
37
37
|
*/
|
|
38
|
+
import { clamp } from "../composables/clamp"
|
|
39
|
+
import { nodeWindow } from "../composables/useView"
|
|
38
40
|
import { computed, onBeforeUnmount, onMounted, ref, watch } from "vue"
|
|
39
41
|
import { parseColor } from "./color"
|
|
40
42
|
import { approach, frameDue, FRAGMENT_HEADER, PRESETS, tooSlow, VERTEX_SHADER, type ShaderPreset, type Vec3 } from "./shaderBackdrop"
|
|
@@ -95,7 +97,7 @@ const weakEngine = typeof navigator !== "undefined" && isBrokenBackdropEngine()
|
|
|
95
97
|
const fallbackStyle = computed(() => ({ background: PRESETS[props.preset].fallback, opacity: Math.min(1, clamp01(props.intensity) * 1.15) }))
|
|
96
98
|
|
|
97
99
|
function clamp01(n: number) {
|
|
98
|
-
return
|
|
100
|
+
return clamp(n, 0, 1)
|
|
99
101
|
}
|
|
100
102
|
|
|
101
103
|
// ── Theme colours ───────────────────────────────────────────────────────────
|
|
@@ -115,10 +117,10 @@ let paint: CanvasRenderingContext2D | null = null
|
|
|
115
117
|
function tokenColor(name: string): Vec3 {
|
|
116
118
|
if (!probe || !root.value) return [0, 0, 0]
|
|
117
119
|
probe.style.color = `var(--color-${name})`
|
|
118
|
-
const css = getComputedStyle(probe).color
|
|
120
|
+
const css = nodeWindow(probe).getComputedStyle(probe).color
|
|
119
121
|
const rgb = parseColor(css)
|
|
120
122
|
if (rgb) return [rgb.r / 255, rgb.g / 255, rgb.b / 255]
|
|
121
|
-
paint ??=
|
|
123
|
+
paint ??= probe.ownerDocument.createElement("canvas").getContext("2d", { willReadFrequently: true })
|
|
122
124
|
if (!paint) return [0, 0, 0]
|
|
123
125
|
paint.clearRect(0, 0, 1, 1)
|
|
124
126
|
paint.fillStyle = "#000"
|
|
@@ -204,7 +206,7 @@ let pixelRatio = 1
|
|
|
204
206
|
function sizeCanvas() {
|
|
205
207
|
const el = canvas.value
|
|
206
208
|
if (!el) return
|
|
207
|
-
const dpr = Math.min(weakEngine ? 1 : 2,
|
|
209
|
+
const dpr = Math.min(weakEngine ? 1 : 2, nodeWindow(el).devicePixelRatio || 1)
|
|
208
210
|
pixelRatio = dpr * PRESETS[props.preset].scale
|
|
209
211
|
const w = Math.max(1, Math.round(el.clientWidth * pixelRatio))
|
|
210
212
|
const h = Math.max(1, Math.round(el.clientHeight * pixelRatio))
|
|
@@ -351,16 +353,17 @@ useResizeObserver(root, () => {
|
|
|
351
353
|
})
|
|
352
354
|
|
|
353
355
|
onMounted(() => {
|
|
354
|
-
|
|
356
|
+
const page = root.value?.ownerDocument ?? document
|
|
357
|
+
probe = page.createElement("span")
|
|
355
358
|
probe.style.display = "none"
|
|
356
359
|
root.value?.appendChild(probe)
|
|
357
360
|
|
|
358
361
|
// Themes are applied as variables and attributes on <html>; a scheme switch can also come from the OS.
|
|
359
|
-
themeObserver = new MutationObserver(() => {
|
|
362
|
+
themeObserver = new (nodeWindow(page).MutationObserver)(() => {
|
|
360
363
|
if (gl) refreshPalette()
|
|
361
364
|
})
|
|
362
|
-
themeObserver.observe(
|
|
363
|
-
schemeQuery =
|
|
365
|
+
themeObserver.observe(page.documentElement, { attributes: true, attributeFilter: ["style", "class", "data-theme", "data-theme-mode"] })
|
|
366
|
+
schemeQuery = nodeWindow(page).matchMedia?.("(prefers-color-scheme: dark)")
|
|
364
367
|
schemeQuery?.addEventListener("change", refreshPalette)
|
|
365
368
|
|
|
366
369
|
if (wantGl.value) start()
|
|
@@ -391,7 +394,7 @@ watch(
|
|
|
391
394
|
}
|
|
392
395
|
drawFrame()
|
|
393
396
|
shown.value = true
|
|
394
|
-
}, durationToken("duration-medium"))
|
|
397
|
+
}, durationToken("duration-medium", undefined, root.value ?? undefined))
|
|
395
398
|
},
|
|
396
399
|
)
|
|
397
400
|
watch(
|