@leavepulse/ui 0.71.2 → 0.72.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/dist/assets/{LpKeys-BxRhfQda.css → LpKeys-C5VMcBOW.css} +10 -5
- package/dist/assets/LpTabs-CDchzoRL.css +18 -0
- package/dist/chunks/{ContextMenuItems-eS7qx9gD.js → ContextMenuItems-BXumicbh.js} +1 -1
- package/dist/chunks/{DropzoneLinkField-DkFhdfEJ.js → DropzoneLinkField-DpOB20Lx.js} +2 -2
- package/dist/chunks/{FieldWrapper-YzbvvC3M.js → FieldWrapper-DHhRxO5G.js} +1 -1
- package/dist/chunks/{LayoutCanvas-Ba4A9QC5.js → LayoutCanvas-CNOAUk7D.js} +1 -1
- package/dist/chunks/{LayoutNode-CTTTLMDM.js → LayoutNode-DF5BMN0J.js} +1 -1
- package/dist/chunks/{LpActionBar-B7anGlkI.js → LpActionBar-BqicINE_.js} +3 -3
- package/dist/chunks/{LpAddressInput-Bu6ws3Fp.js → LpAddressInput-CkbKLufb.js} +7 -7
- package/dist/chunks/{LpAlert-BHi7ARqu.js → LpAlert-BigMdAbu.js} +3 -3
- package/dist/chunks/{LpAppShell-C5YW5pI7.js → LpAppShell-DIMy-vjP.js} +68 -18
- package/dist/chunks/{LpAutocomplete-DDqe2M5g.js → LpAutocomplete-DOu7FN5P.js} +2 -2
- package/dist/chunks/{LpAvatar-DqfKCIdr.js → LpAvatar-Cg6Az3wz.js} +1 -1
- package/dist/chunks/{LpBadge-C8fKEmTF.js → LpBadge-Huo8EKew.js} +3 -3
- package/dist/chunks/LpBottomNav-BZIpahzA.js +89 -0
- package/dist/chunks/{LpBreadcrumbs-DhcoStFa.js → LpBreadcrumbs-DGtpBhWt.js} +3 -3
- package/dist/chunks/{LpButton-BQDAFXBd.js → LpButton-CW34A1e4.js} +1 -1
- package/dist/chunks/{LpCalendar-NmrA47J9.js → LpCalendar-CuoWks-0.js} +1 -1
- package/dist/chunks/{LpCard-CqKLnEhl.js → LpCard-B0sFXQzc.js} +1 -1
- package/dist/chunks/{LpCheckbox-BoOuLnGB.js → LpCheckbox-iaD63DEF.js} +2 -2
- package/dist/chunks/{LpCodeBlock-Czu-fq1M.js → LpCodeBlock-CFFa_pJb.js} +2 -2
- package/dist/chunks/{LpCodeDisplay-C9pIMF2R.js → LpCodeDisplay-CFmGMAmP.js} +6 -6
- package/dist/chunks/{LpColorPicker-Ee1DZiRd.js → LpColorPicker-1y1QJHZR.js} +56 -28
- package/dist/chunks/{LpConfirmDialog-i15pulMT.js → LpConfirmDialog-BDystNtm.js} +3 -3
- package/dist/chunks/{LpConfirmHost-D0oGavtd.js → LpConfirmHost-oOsxJHfQ.js} +1 -1
- package/dist/chunks/{LpContextMenu-DXpFJjlO.js → LpContextMenu-rx2tCjwk.js} +2 -2
- package/dist/chunks/{LpCopyButton-Dmq7DmFw.js → LpCopyButton-BNcGbVXF.js} +2 -2
- package/dist/chunks/{LpCountdown-CXrEK0ev.js → LpCountdown-Cak7cq3X.js} +3 -3
- package/dist/chunks/{LpDataList-CFPtSsBB.js → LpDataList-B6Meb4M9.js} +3 -3
- package/dist/chunks/{LpDatePicker-cC9K-Pk8.js → LpDatePicker-CA0QTfBC.js} +4 -4
- package/dist/chunks/{LpDateRangePicker-BVQKPbvo.js → LpDateRangePicker-u3J51xXk.js} +2 -2
- package/dist/chunks/{LpDisclosure-hRnX3FWL.js → LpDisclosure-Cpa7Hc5T.js} +1 -1
- package/dist/chunks/{LpDrawer-u4rxnuR-.js → LpDrawer-RRamxbLV.js} +1 -1
- package/dist/chunks/{LpDropdownMenu-BgZ0Z_Im.js → LpDropdownMenu-Dl7Z4ZhS.js} +2 -2
- package/dist/chunks/{LpEditable-CjxuOVh_.js → LpEditable-BNogo5DL.js} +5 -5
- package/dist/chunks/{LpEmptyState-CKFTtQgJ.js → LpEmptyState-EQHiRYhG.js} +7 -3
- package/dist/chunks/{LpFieldNotice-CPI8EwtU.js → LpFieldNotice-CzQ2_5rQ.js} +1 -1
- package/dist/chunks/{LpFileTree-BH0gNlSJ.js → LpFileTree-CHgtVh14.js} +2 -2
- package/dist/chunks/{LpFileTreeNode-gPVB1oXM.js → LpFileTreeNode-LqHgHd3B.js} +5 -5
- package/dist/chunks/{LpFormField-gRASfyj2.js → LpFormField-CC57DdTi.js} +2 -2
- package/dist/chunks/{LpGauge-DFdt33x8.js → LpGauge-BO1PYYqD.js} +2 -2
- package/dist/chunks/{LpHintLayer-C2asBIfs.js → LpHintLayer-CvAj4aa6.js} +2 -2
- package/dist/chunks/{LpHints-CNZQ76JV.js → LpHints-BtRvHQQ0.js} +3 -3
- package/dist/chunks/{LpIcon-DkP-9mzK.js → LpIcon--5WSb3jJ.js} +1 -1
- package/dist/chunks/{LpInfraNode-yTh4-5qa.js → LpInfraNode-CxngdQAG.js} +2 -2
- package/dist/chunks/{LpInput-2H-5ILOB.js → LpInput-DqmL-438.js} +2 -2
- package/dist/chunks/{LpLightbox-lAt5uIfx.js → LpLightbox-7YP6zSDm.js} +3 -3
- package/dist/chunks/{LpLoader-DjJEX8hL.js → LpLoader-CUo1MX_0.js} +1 -1
- package/dist/chunks/{LpLogViewer-x78YfhJf.js → LpLogViewer-DQOIsnZ1.js} +6 -6
- package/dist/chunks/{LpMapPicker-Dp5RSCi9.js → LpMapPicker-Dm3vJHN2.js} +2 -2
- package/dist/chunks/{LpMediaGallery-D92oJfY_.js → LpMediaGallery-znEbvIEo.js} +3 -3
- package/dist/chunks/{LpModal-CpH0bNo7.js → LpModal-BnjZ2iem.js} +1 -1
- package/dist/chunks/{LpModalNav-Cuna8c_3.js → LpModalNav-CH1UE9Ch.js} +4 -4
- package/dist/chunks/{LpNotificationBell-BdUQqZhs.js → LpNotificationBell-CrywodQ_.js} +8 -8
- package/dist/chunks/{LpNumberField-DZY3Z670.js → LpNumberField-e0IBkWU1.js} +1 -1
- package/dist/chunks/{LpNumberFlow-Dwb9MV1A.js → LpNumberFlow-CcxEGUy0.js} +4 -2
- package/dist/chunks/{LpPagination-DbeACavM.js → LpPagination-BIIiYHXR.js} +1 -1
- package/dist/chunks/{LpPaletteTheme-DkikZ362.js → LpPaletteTheme-BzHBh-mN.js} +4 -4
- package/dist/chunks/{LpPasswordInput-BzAZsf5V.js → LpPasswordInput-DVgRgTVx.js} +2 -2
- package/dist/chunks/{LpPhoneInput-BMpd-0QR.js → LpPhoneInput-CETEp5W7.js} +2 -2
- package/dist/chunks/{LpPie-C1uIUFxu.js → LpPie-BjDbeytx.js} +6 -6
- package/dist/chunks/{LpPipeline-zjEM1Lwc.js → LpPipeline-zZUj7I6K.js} +4 -4
- package/dist/chunks/{LpProgress-WNaH4emv.js → LpProgress-rOlyafqp.js} +1 -1
- package/dist/chunks/{LpQuota-Cz9PvklM.js → LpQuota-B12yijdB.js} +3 -3
- package/dist/chunks/{LpRadioGroup-CsXeV9Ct.js → LpRadioGroup-ggaPL92T.js} +1 -1
- package/dist/chunks/{LpRangeCalendar-l-0nSFmY.js → LpRangeCalendar-CYYUYqJ7.js} +1 -1
- package/dist/chunks/{LpRelativeTime-UM8EkfrN.js → LpRelativeTime-DwgCb5-8.js} +1 -1
- package/dist/chunks/{LpRepeater-OvzByE5L.js → LpRepeater-BQB0twJ5.js} +3 -3
- package/dist/chunks/LpRollingText-B54Pje7P.js +86 -0
- package/dist/chunks/{LpScramble-TDO5Kdou.js → LpScramble-DbQyBjUY.js} +1 -1
- package/dist/chunks/{LpSecretField-DwQiPOko.js → LpSecretField-uoD6Fngf.js} +7 -7
- package/dist/chunks/{LpSection-DcQsieHG.js → LpSection-DFK_uoJE.js} +1 -1
- package/dist/chunks/{LpSegmented-D2VST0o3.js → LpSegmented-CeACsMMA.js} +4 -2
- package/dist/chunks/{LpSelect-D3pRJfRY.js → LpSelect-Cxq4yBGd.js} +3 -3
- package/dist/chunks/LpShift-C-UGuKMN.js +171 -0
- package/dist/chunks/LpSidebar-DXdbvgM6.js +494 -0
- package/dist/chunks/LpSidebarNav-CE6CVCb0.js +367 -0
- package/dist/chunks/LpSidebarRow-CF9VFZ2w.js +304 -0
- package/dist/chunks/{LpStat-Dzn6WFzi.js → LpStat-CjpXrC8R.js} +6 -4
- package/dist/chunks/{LpStatus-BQU1TUsv.js → LpStatus-g-8z9b_u.js} +3 -3
- package/dist/chunks/{LpStepMark-CXa7DJy_.js → LpStepMark-DU7xalwW.js} +3 -3
- package/dist/chunks/{LpStepper-C9RM_yTG.js → LpStepper-CbRXiXNs.js} +1 -1
- package/dist/chunks/{LpSwap-DzE6M3Mg.js → LpSwap-Xi4j9PR_.js} +1 -1
- package/dist/chunks/{LpSwitch-bGZxUDSx.js → LpSwitch-BWcXEahf.js} +1 -1
- package/dist/chunks/LpTabFace-CG0VqD8I.js +77 -0
- package/dist/chunks/{LpTableFilter-CTZMqFDU.js → LpTableFilter-CYtK9GsF.js} +3 -3
- package/dist/chunks/{LpTagsInput-DrjmrOge.js → LpTagsInput-D1RzCwb5.js} +5 -5
- package/dist/chunks/{LpTextarea-BbYqmG1S.js → LpTextarea-MdIzNTjw.js} +32 -7
- package/dist/chunks/{useTheme-BOV_-AiY.js → LpThemeProvider-8MG6yqU9.js} +66 -1
- package/dist/chunks/{LpThemeStudio-IupHqP0x.js → LpThemeStudio-B0Kk1bX0.js} +138 -104
- package/dist/chunks/LpThemeStudioSection-B7bt8Iyg.js +32 -0
- package/dist/chunks/{LpThemeSwitcher-DarPHuX8.js → LpThemeSwitcher-CI4I7ygL.js} +6 -6
- package/dist/chunks/{LpTimeField-DQ8WvPr2.js → LpTimeField-BawSVsmt.js} +1 -1
- package/dist/chunks/{LpToaster-BTTl_wuy.js → LpToaster-C-P1nmMS.js} +2 -2
- package/dist/chunks/{LpTopologyCanvas-Cq-MiJwo.js → LpTopologyCanvas-CbEZhsP1.js} +1 -1
- package/dist/chunks/{LpTour-BgCfNlaW.js → LpTour-DRyzgpjt.js} +1 -1
- package/dist/chunks/{LpTruncate-TcqfkyJM.js → LpTruncate-4WvCWqnW.js} +1 -1
- package/dist/chunks/{LpUptimeBar-BbhVTPnL.js → LpUptimeBar-B2LNSNxs.js} +4 -4
- package/dist/chunks/{MenuTitle-Dab3EGOp.js → MenuTitle-BmCNNTKH.js} +1 -1
- package/dist/chunks/{OptionContent-DPzNsybd.js → OptionContent-22UT8zLn.js} +1 -1
- package/dist/chunks/{PickerField-DwLw7j0L.js → PickerField-Bfh8id3d.js} +2 -2
- package/dist/chunks/{RevealToggle-BVFM_FAU.js → RevealToggle-jBLJwVwO.js} +2 -2
- package/dist/chunks/{TourCard--2IfgnUU.js → TourCard-BOBcGbEo.js} +5 -5
- package/dist/chunks/{icons-CLu1iR1j.js → icons-DMITlfw5.js} +1 -1
- package/dist/component-names.d.ts +1 -1
- package/dist/components/ContextMenuItems.vue.js +1 -1
- package/dist/components/DropzoneLinkField.vue.js +1 -1
- package/dist/components/FieldWrapper.vue.js +1 -1
- 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/LpAddressInput.vue.js +1 -1
- package/dist/components/LpAlert.vue.js +1 -1
- package/dist/components/LpAppShell.vue.d.ts +67 -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 +28 -0
- package/dist/components/LpBottomNav.vue.js +4 -0
- package/dist/components/LpBreadcrumbs.vue.js +1 -1
- 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.js +4 -4
- 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/LpColorPicker.vue.d.ts +15 -2
- package/dist/components/LpColorPicker.vue.js +1 -1
- package/dist/components/LpCommandPalette.vue.js +4 -4
- 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/LpCopyButton.vue.js +1 -1
- package/dist/components/LpCountdown.vue.js +1 -1
- package/dist/components/LpDataList.vue.js +1 -1
- package/dist/components/LpDatePicker.vue.js +1 -1
- package/dist/components/LpDateRangePicker.vue.js +1 -1
- package/dist/components/LpDisclosure.vue.js +1 -1
- package/dist/components/LpDock.vue.js +1 -1
- package/dist/components/LpDrawer.vue.js +1 -1
- package/dist/components/LpDropdownMenu.vue.js +1 -1
- package/dist/components/LpDropzone.vue.js +2 -2
- package/dist/components/LpEditable.vue.js +1 -1
- package/dist/components/LpEmptyState.vue.d.ts +2 -0
- package/dist/components/LpEmptyState.vue.js +1 -1
- package/dist/components/LpFieldNotice.vue.js +1 -1
- package/dist/components/LpFileTree.vue.js +1 -1
- package/dist/components/LpFileTreeNode.vue.js +1 -1
- package/dist/components/LpFormField.vue.js +1 -1
- package/dist/components/LpGauge.vue.js +1 -1
- package/dist/components/LpHintLayer.vue.js +1 -1
- package/dist/components/LpHints.vue.js +1 -1
- package/dist/components/LpIcon.vue.js +1 -1
- package/dist/components/LpImageEditor.vue.js +3 -3
- package/dist/components/LpInfraNode.vue.js +1 -1
- package/dist/components/LpInput.vue.js +1 -1
- package/dist/components/LpKeys.vue.js +13 -10
- package/dist/components/LpLightbox.vue.js +1 -1
- package/dist/components/LpLoader.vue.js +1 -1
- package/dist/components/LpLogViewer.vue.d.ts +1 -1
- package/dist/components/LpLogViewer.vue.js +1 -1
- package/dist/components/LpMapPicker.vue.js +1 -1
- package/dist/components/LpMediaGallery.vue.js +1 -1
- package/dist/components/LpModal.vue.js +1 -1
- package/dist/components/LpModalNav.vue.js +1 -1
- package/dist/components/LpNotificationBell.vue.js +1 -1
- package/dist/components/LpNumberField.vue.js +1 -1
- package/dist/components/LpNumberFlow.vue.js +1 -1
- package/dist/components/LpPagination.vue.js +1 -1
- package/dist/components/LpPaletteFacts.vue.js +2 -2
- package/dist/components/LpPaletteHeader.vue.js +2 -2
- package/dist/components/LpPaletteStats.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.js +1 -1
- package/dist/components/LpPipeline.vue.js +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/LpRelativeTime.vue.js +1 -1
- package/dist/components/LpRepeater.vue.js +1 -1
- package/dist/components/LpRollingText.vue.d.ts +2 -2
- package/dist/components/LpRollingText.vue.js +1 -1
- package/dist/components/LpScramble.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/LpShift.vue.d.ts +20 -0
- package/dist/components/LpShift.vue.js +1 -1
- package/dist/components/LpShortcutsDialog.vue.js +1 -1
- package/dist/components/LpSidebar.vue.d.ts +74 -23
- package/dist/components/LpSidebar.vue.js +1 -1
- package/dist/components/LpSidebarNav.vue.d.ts +31 -3
- package/dist/components/LpSidebarNav.vue.js +1 -1
- package/dist/components/LpSidebarRow.vue.d.ts +49 -0
- package/dist/components/LpSidebarRow.vue.js +4 -0
- package/dist/components/LpStat.vue.d.ts +11 -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.d.ts +14 -0
- package/dist/components/LpTabFace.vue.js +4 -0
- package/dist/components/LpTable.vue.js +11 -11
- package/dist/components/LpTableFilter.vue.js +1 -1
- package/dist/components/LpTabs.vue.d.ts +4 -4
- package/dist/components/LpTabs.vue.js +18 -72
- package/dist/components/LpTagsInput.vue.js +1 -1
- package/dist/components/LpTextarea.vue.d.ts +19 -1
- package/dist/components/LpTextarea.vue.js +1 -1
- package/dist/components/LpThemeProvider.vue.js +1 -1
- package/dist/components/LpThemeStudio.vue.d.ts +2 -2
- package/dist/components/LpThemeStudio.vue.js +1 -1
- package/dist/components/LpThemeStudioSection.vue.d.ts +4 -1
- package/dist/components/LpThemeStudioSection.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/LpTopologyCanvas.vue.js +1 -1
- package/dist/components/LpTour.vue.js +1 -1
- package/dist/components/LpTruncate.vue.js +1 -1
- package/dist/components/LpUptimeBar.vue.js +1 -1
- package/dist/components/MenuTitle.vue.js +1 -1
- package/dist/components/OptionContent.vue.js +1 -1
- package/dist/components/PickerField.vue.js +1 -1
- package/dist/components/RevealToggle.vue.js +1 -1
- package/dist/components/TourCard.vue.js +1 -1
- package/dist/components/menuWhen.js +1 -1
- package/dist/components/rolling.d.ts +5 -0
- package/dist/components/rolling.js +23 -0
- package/dist/components/sidebar.d.ts +38 -0
- package/dist/components/sidebar.js +6 -1
- package/dist/components/tabs.d.ts +3 -0
- package/dist/components/tabs.js +6 -0
- package/dist/icons-all.js +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +154 -153
- package/package.json +1 -1
- package/src/component-names.ts +1 -0
- package/src/components/LpAppShell.vue +75 -7
- package/src/components/LpBottomNav.vue +84 -0
- package/src/components/LpColorPicker.vue +32 -1
- package/src/components/LpEmptyState.vue +4 -1
- package/src/components/LpKeys.vue +10 -1
- package/src/components/LpNumberFlow.vue +4 -2
- package/src/components/LpRollingText.vue +27 -2
- package/src/components/LpSegmented.vue +3 -1
- package/src/components/LpShift.vue +189 -2
- package/src/components/LpSidebar.vue +304 -18
- package/src/components/LpSidebarNav.vue +211 -78
- package/src/components/LpSidebarRow.vue +242 -0
- package/src/components/LpStat.vue +7 -1
- package/src/components/LpTabFace.vue +52 -0
- package/src/components/LpTabs.vue +6 -41
- package/src/components/LpTextarea.vue +34 -4
- package/src/components/LpThemeStudio.vue +91 -55
- package/src/components/LpThemeStudioSection.vue +15 -7
- package/src/components/rolling.ts +28 -0
- package/src/components/sidebar.ts +41 -0
- package/src/components/tabs.ts +9 -0
- package/src/index.ts +1 -0
- package/src/kit-icons.ts +1 -1
- package/dist/assets/LpTabs-DT0XPTc2.css +0 -18
- package/dist/chunks/LpRollingText-DiL717LK.js +0 -51
- package/dist/chunks/LpShift-DXNsauQZ.js +0 -40
- package/dist/chunks/LpSidebar-Bk7b-K4l.js +0 -256
- package/dist/chunks/LpSidebarNav-BR2AW3KT.js +0 -216
- package/dist/chunks/LpThemeProvider-DcbfOxsU.js +0 -69
- package/dist/chunks/LpThemeStudioSection-BwhqYDLf.js +0 -20
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
import { defineComponent, computed, ref, openBlock, createBlock, mergeProps, unref, withCtx, createElementBlock, createElementVNode, createCommentVNode, Fragment, renderList, toDisplayString, createVNode, normalizeClass, createTextVNode, createSlots, renderSlot } from "vue";
|
|
2
|
+
import { CollapsibleRoot, CollapsibleTrigger, CollapsibleContent } from "reka-ui";
|
|
3
|
+
import { _ as _sfc_main$5 } from "./LpBadge-Huo8EKew.js";
|
|
4
|
+
import "../components/commandSearch.js";
|
|
5
|
+
import "../composables/useHints.js";
|
|
6
|
+
import "../composables/useHintSystem.js";
|
|
7
|
+
import { _ as _sfc_main$4 } from "./LpIcon--5WSb3jJ.js";
|
|
8
|
+
import "../composables/useHotkeys.js";
|
|
9
|
+
import '../assets/MenuShortcut-Cyub0frr.css';import '../assets/LpKeys-C5VMcBOW.css';/* empty css */
|
|
10
|
+
/* empty css */
|
|
11
|
+
import { _ as _sfc_main$2 } from "./LpScrollArea-Hz3-JWUG.js";
|
|
12
|
+
import { _ as _sfc_main$1 } from "./LpSkeleton-BB6XIV-w.js";
|
|
13
|
+
import { _ as _sfc_main$3 } from "./LpSidebarRow-CF9VFZ2w.js";
|
|
14
|
+
import { waiting } from "../components/sidebar.js";
|
|
15
|
+
import { useMergedAttrs } from "../composables/useMergedClass.js";
|
|
16
|
+
const _hoisted_1 = {
|
|
17
|
+
key: 0,
|
|
18
|
+
class: "flex items-center gap-3 px-1"
|
|
19
|
+
};
|
|
20
|
+
const _hoisted_2 = { class: "space-y-1" };
|
|
21
|
+
const _hoisted_3 = {
|
|
22
|
+
key: 0,
|
|
23
|
+
class: "flex flex-col gap-0.5"
|
|
24
|
+
};
|
|
25
|
+
const _hoisted_4 = {
|
|
26
|
+
key: 0,
|
|
27
|
+
class: "px-2 pb-1 pt-2 text-[11px] font-semibold uppercase tracking-[0.08em] text-muted"
|
|
28
|
+
};
|
|
29
|
+
const _hoisted_5 = {
|
|
30
|
+
key: 0,
|
|
31
|
+
class: "flex flex-col gap-0.5"
|
|
32
|
+
};
|
|
33
|
+
const _hoisted_6 = {
|
|
34
|
+
key: 0,
|
|
35
|
+
class: "mx-3 mb-1 border-t border-line"
|
|
36
|
+
};
|
|
37
|
+
const _hoisted_7 = { class: "min-w-0 flex-1 truncate text-left" };
|
|
38
|
+
const _hoisted_8 = {
|
|
39
|
+
key: 2,
|
|
40
|
+
class: "px-2 pb-1 pt-2 text-[11px] font-semibold uppercase tracking-[0.08em] text-muted"
|
|
41
|
+
};
|
|
42
|
+
const __default__ = { inheritAttrs: false };
|
|
43
|
+
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
44
|
+
...__default__,
|
|
45
|
+
__name: "LpSidebarNav",
|
|
46
|
+
props: {
|
|
47
|
+
groups: {},
|
|
48
|
+
pillId: {},
|
|
49
|
+
itemActive: {},
|
|
50
|
+
loading: { type: Boolean },
|
|
51
|
+
skeletonRows: { default: 6 },
|
|
52
|
+
skeletonHeader: { type: Boolean, default: true },
|
|
53
|
+
collapsedKeys: { default: () => [] },
|
|
54
|
+
hoverFollow: { type: Boolean, default: false },
|
|
55
|
+
compact: { type: Boolean },
|
|
56
|
+
pinnable: { type: Boolean },
|
|
57
|
+
pinned: { default: () => [] },
|
|
58
|
+
previewDelay: { default: 900 },
|
|
59
|
+
labels: {}
|
|
60
|
+
},
|
|
61
|
+
emits: ["activate", "toggle-section", "toggle-pin"],
|
|
62
|
+
setup(__props, { emit: __emit }) {
|
|
63
|
+
const props = __props;
|
|
64
|
+
const emit = __emit;
|
|
65
|
+
function sectionKey(section) {
|
|
66
|
+
return section.key ?? section.title ?? "";
|
|
67
|
+
}
|
|
68
|
+
const foldedKeys = computed(() => {
|
|
69
|
+
const holdsActive = new Set(
|
|
70
|
+
props.groups.filter((g) => g.items.some((i) => props.itemActive(i) || onPath(i))).map(sectionKey)
|
|
71
|
+
);
|
|
72
|
+
return new Set(
|
|
73
|
+
props.collapsedKeys.filter((k) => k && !holdsActive.has(k))
|
|
74
|
+
);
|
|
75
|
+
});
|
|
76
|
+
function isOpen(section) {
|
|
77
|
+
return props.compact || !foldedKeys.value.has(sectionKey(section));
|
|
78
|
+
}
|
|
79
|
+
const hovered = ref(null);
|
|
80
|
+
function hover(item) {
|
|
81
|
+
if (props.hoverFollow && !item.disabled) hovered.value = item.id;
|
|
82
|
+
}
|
|
83
|
+
function pillUnder(item) {
|
|
84
|
+
return hovered.value ? hovered.value === item.id : props.itemActive(item);
|
|
85
|
+
}
|
|
86
|
+
function onPath(item) {
|
|
87
|
+
return !!item.children?.some((c) => props.itemActive(c));
|
|
88
|
+
}
|
|
89
|
+
const opened = ref(/* @__PURE__ */ new Set());
|
|
90
|
+
function expanded(item) {
|
|
91
|
+
return onPath(item) || opened.value.has(item.id);
|
|
92
|
+
}
|
|
93
|
+
function toggle(item) {
|
|
94
|
+
const next = new Set(opened.value);
|
|
95
|
+
if (next.has(item.id)) next.delete(item.id);
|
|
96
|
+
else next.add(item.id);
|
|
97
|
+
opened.value = next;
|
|
98
|
+
}
|
|
99
|
+
const pinnedIds = computed(() => new Set(props.pinned.map((i) => i.id)));
|
|
100
|
+
function menuOf(item) {
|
|
101
|
+
const own = item.menu ?? [];
|
|
102
|
+
if (!props.pinnable) return own;
|
|
103
|
+
const pinned = pinnedIds.value.has(item.id);
|
|
104
|
+
return [
|
|
105
|
+
...own,
|
|
106
|
+
{
|
|
107
|
+
label: pinned ? props.labels.unpin : props.labels.pin,
|
|
108
|
+
icon: pinned ? "lucide:pin-off" : "lucide:pin",
|
|
109
|
+
separatorBefore: own.length > 0,
|
|
110
|
+
onSelect: () => emit("toggle-pin", item.id)
|
|
111
|
+
}
|
|
112
|
+
];
|
|
113
|
+
}
|
|
114
|
+
let typed = "";
|
|
115
|
+
let typedAt = 0;
|
|
116
|
+
function onKey(event) {
|
|
117
|
+
const box = event.currentTarget;
|
|
118
|
+
const list = [...box.querySelectorAll("[data-lp-nav-row]")].filter((r) => r.offsetParent !== null);
|
|
119
|
+
const at = list.indexOf(document.activeElement);
|
|
120
|
+
if (at < 0) return;
|
|
121
|
+
const row = list[at];
|
|
122
|
+
const go = (i) => {
|
|
123
|
+
event.preventDefault();
|
|
124
|
+
list[(i + list.length) % list.length]?.focus();
|
|
125
|
+
};
|
|
126
|
+
switch (event.key) {
|
|
127
|
+
case "ArrowDown":
|
|
128
|
+
return go(at + 1);
|
|
129
|
+
case "ArrowUp":
|
|
130
|
+
return go(at - 1);
|
|
131
|
+
case "Home":
|
|
132
|
+
return go(0);
|
|
133
|
+
case "End":
|
|
134
|
+
return go(list.length - 1);
|
|
135
|
+
case "ArrowRight":
|
|
136
|
+
case "ArrowLeft": {
|
|
137
|
+
const open = event.key === "ArrowRight";
|
|
138
|
+
const toggle2 = row.hasAttribute("aria-expanded") ? row : row.parentElement?.querySelector(":scope > button[aria-expanded]");
|
|
139
|
+
if (toggle2 && toggle2.getAttribute("aria-expanded") === "true" !== open) {
|
|
140
|
+
event.preventDefault();
|
|
141
|
+
toggle2.click();
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
if (!open && row.dataset.lpNavNested !== void 0) {
|
|
145
|
+
for (let i = at - 1; i >= 0; i--) if (list[i].dataset.lpNavNested === void 0) return go(i);
|
|
146
|
+
}
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
if (event.key.length !== 1 || event.ctrlKey || event.metaKey || event.altKey) return;
|
|
151
|
+
const now = Date.now();
|
|
152
|
+
typed = now - typedAt > 700 ? event.key : typed + event.key;
|
|
153
|
+
typedAt = now;
|
|
154
|
+
const needle = typed.toLocaleLowerCase();
|
|
155
|
+
for (let k = 1; k <= list.length; k++) {
|
|
156
|
+
const next = list[(at + k) % list.length];
|
|
157
|
+
if ((next.textContent ?? "").trim().toLocaleLowerCase().startsWith(needle)) return go(at + k);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
const SECTION = "lp-section:";
|
|
161
|
+
function sectionItem(section) {
|
|
162
|
+
const icon = section.icon ?? section.items.find((i) => i.icon)?.icon;
|
|
163
|
+
return {
|
|
164
|
+
id: `${SECTION}${sectionKey(section)}`,
|
|
165
|
+
label: section.title ?? "",
|
|
166
|
+
icon,
|
|
167
|
+
children: section.items
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
function activate(item) {
|
|
171
|
+
if (item.id.startsWith(SECTION)) return;
|
|
172
|
+
if (item.children?.length && !item.to && !item.href) toggle(item);
|
|
173
|
+
emit("activate", item);
|
|
174
|
+
}
|
|
175
|
+
const { class: rootClass, attrs: rest } = useMergedAttrs(
|
|
176
|
+
"flex min-h-0 flex-1 flex-col gap-4"
|
|
177
|
+
);
|
|
178
|
+
return (_ctx, _cache) => {
|
|
179
|
+
return __props.loading ? (openBlock(), createBlock(_sfc_main$1, mergeProps({
|
|
180
|
+
key: 0,
|
|
181
|
+
class: unref(rootClass)
|
|
182
|
+
}, unref(rest)), {
|
|
183
|
+
default: withCtx(() => [
|
|
184
|
+
__props.skeletonHeader ? (openBlock(), createElementBlock("div", _hoisted_1, [..._cache[1] || (_cache[1] = [
|
|
185
|
+
createElementVNode("div", { class: "lp-skeleton-item size-10 shrink-0 rounded-pill bg-surface-soft" }, null, -1),
|
|
186
|
+
createElementVNode("div", { class: "flex-1 space-y-2" }, [
|
|
187
|
+
createElementVNode("div", { class: "lp-skeleton-item h-3.5 w-24 rounded-small bg-surface-soft" }),
|
|
188
|
+
createElementVNode("div", { class: "lp-skeleton-item h-3 w-16 rounded-small bg-surface-soft/60" })
|
|
189
|
+
], -1)
|
|
190
|
+
])])) : createCommentVNode("", true),
|
|
191
|
+
createElementVNode("div", _hoisted_2, [
|
|
192
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(__props.skeletonRows, (n) => {
|
|
193
|
+
return openBlock(), createElementBlock("div", {
|
|
194
|
+
key: n,
|
|
195
|
+
class: "lp-skeleton-item h-9 rounded-control bg-surface-soft"
|
|
196
|
+
});
|
|
197
|
+
}), 128))
|
|
198
|
+
])
|
|
199
|
+
]),
|
|
200
|
+
_: 1
|
|
201
|
+
}, 16, ["class"])) : (openBlock(), createBlock(_sfc_main$2, {
|
|
202
|
+
key: 1,
|
|
203
|
+
class: "min-h-0 flex-1",
|
|
204
|
+
"content-class": __props.compact ? "flex min-h-full flex-col gap-1" : "flex min-h-full flex-col gap-4",
|
|
205
|
+
onPointerleave: _cache[0] || (_cache[0] = ($event) => hovered.value = null)
|
|
206
|
+
}, {
|
|
207
|
+
default: withCtx(() => [
|
|
208
|
+
createElementVNode("div", {
|
|
209
|
+
class: "contents",
|
|
210
|
+
onKeydown: onKey
|
|
211
|
+
}, [
|
|
212
|
+
__props.pinned.length ? (openBlock(), createElementBlock("div", _hoisted_3, [
|
|
213
|
+
!__props.compact ? (openBlock(), createElementBlock("p", _hoisted_4, toDisplayString(__props.labels.pinned), 1)) : createCommentVNode("", true),
|
|
214
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(__props.pinned, (item) => {
|
|
215
|
+
return openBlock(), createBlock(_sfc_main$3, {
|
|
216
|
+
key: `pinned:${item.id}`,
|
|
217
|
+
item,
|
|
218
|
+
active: __props.itemActive(item),
|
|
219
|
+
pill: false,
|
|
220
|
+
"pill-id": __props.pillId,
|
|
221
|
+
compact: __props.compact,
|
|
222
|
+
menu: menuOf(item),
|
|
223
|
+
"preview-delay": __props.previewDelay,
|
|
224
|
+
"item-active": __props.itemActive,
|
|
225
|
+
onActivate: activate
|
|
226
|
+
}, null, 8, ["item", "active", "pill-id", "compact", "menu", "preview-delay", "item-active"]);
|
|
227
|
+
}), 128))
|
|
228
|
+
])) : createCommentVNode("", true),
|
|
229
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(__props.groups, (section, si) => {
|
|
230
|
+
return openBlock(), createElementBlock(Fragment, { key: si }, [
|
|
231
|
+
__props.compact && section.collapsible && section.title ? (openBlock(), createElementBlock("div", _hoisted_5, [
|
|
232
|
+
createVNode(_sfc_main$3, {
|
|
233
|
+
item: sectionItem(section),
|
|
234
|
+
active: false,
|
|
235
|
+
pill: false,
|
|
236
|
+
"pill-id": __props.pillId,
|
|
237
|
+
compact: "",
|
|
238
|
+
"on-path": section.items.some((i) => __props.itemActive(i) || onPath(i)),
|
|
239
|
+
"preview-delay": __props.previewDelay,
|
|
240
|
+
"item-active": __props.itemActive,
|
|
241
|
+
onActivate: activate
|
|
242
|
+
}, null, 8, ["item", "pill-id", "on-path", "preview-delay", "item-active"])
|
|
243
|
+
])) : (openBlock(), createBlock(unref(CollapsibleRoot), {
|
|
244
|
+
key: 1,
|
|
245
|
+
as: "div",
|
|
246
|
+
class: "flex flex-col gap-0.5",
|
|
247
|
+
open: isOpen(section),
|
|
248
|
+
disabled: !section.collapsible || !section.title,
|
|
249
|
+
"onUpdate:open": (o) => emit("toggle-section", sectionKey(section), !o)
|
|
250
|
+
}, {
|
|
251
|
+
default: withCtx(() => [
|
|
252
|
+
__props.compact && (si > 0 || __props.pinned.length) ? (openBlock(), createElementBlock("div", _hoisted_6)) : !__props.compact && section.title && section.collapsible ? (openBlock(), createBlock(unref(CollapsibleTrigger), {
|
|
253
|
+
key: 1,
|
|
254
|
+
"data-lp-nav-row": "",
|
|
255
|
+
class: "group/section mt-2 flex cursor-pointer items-center gap-2 rounded-control px-2 py-1 text-[11px] font-semibold uppercase tracking-[0.08em] text-muted outline-none transition-colors duration-[var(--duration-fast)] hover:bg-ink/[0.04] hover:text-ink focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring"
|
|
256
|
+
}, {
|
|
257
|
+
default: withCtx(() => [
|
|
258
|
+
section.icon ? (openBlock(), createBlock(_sfc_main$4, {
|
|
259
|
+
key: 0,
|
|
260
|
+
name: section.icon,
|
|
261
|
+
size: 14,
|
|
262
|
+
class: "shrink-0"
|
|
263
|
+
}, null, 8, ["name"])) : createCommentVNode("", true),
|
|
264
|
+
createElementVNode("span", _hoisted_7, toDisplayString(section.title), 1),
|
|
265
|
+
section.items.some(unref(waiting)) ? (openBlock(), createElementBlock("span", {
|
|
266
|
+
key: 1,
|
|
267
|
+
class: normalizeClass(["size-1.5 shrink-0 rounded-full bg-brand transition-opacity duration-[var(--duration-fast)] motion-reduce:transition-none", isOpen(section) ? "opacity-0" : "opacity-100"])
|
|
268
|
+
}, null, 2)) : createCommentVNode("", true),
|
|
269
|
+
createVNode(_sfc_main$5, {
|
|
270
|
+
tone: "neutral",
|
|
271
|
+
class: normalizeClass(["shrink-0 transition-opacity duration-[var(--duration-fast)] motion-reduce:transition-none", isOpen(section) ? "opacity-0" : "opacity-100"]),
|
|
272
|
+
"aria-hidden": isOpen(section) || void 0
|
|
273
|
+
}, {
|
|
274
|
+
default: withCtx(() => [
|
|
275
|
+
createTextVNode(toDisplayString(section.items.length), 1)
|
|
276
|
+
]),
|
|
277
|
+
_: 2
|
|
278
|
+
}, 1032, ["class", "aria-hidden"]),
|
|
279
|
+
createVNode(_sfc_main$4, {
|
|
280
|
+
name: "lucide:chevron-down",
|
|
281
|
+
size: 14,
|
|
282
|
+
class: "shrink-0 text-muted transition-transform duration-[var(--duration-fast)] ease-[var(--ease-emphasized)] group-data-[state=closed]/section:-rotate-90 motion-reduce:transition-none"
|
|
283
|
+
})
|
|
284
|
+
]),
|
|
285
|
+
_: 2
|
|
286
|
+
}, 1024)) : !__props.compact && section.title ? (openBlock(), createElementBlock("p", _hoisted_8, toDisplayString(section.title), 1)) : createCommentVNode("", true),
|
|
287
|
+
createVNode(unref(CollapsibleContent), { class: "flex flex-col gap-0.5 overflow-hidden data-[state=open]:animate-[collapsible-down_260ms_var(--ease-emphasized)] data-[state=closed]:animate-[collapsible-up_200ms_var(--ease-emphasized)] motion-reduce:animate-none" }, {
|
|
288
|
+
default: withCtx(() => [
|
|
289
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(section.items, (item) => {
|
|
290
|
+
return openBlock(), createElementBlock(Fragment, {
|
|
291
|
+
key: item.id
|
|
292
|
+
}, [
|
|
293
|
+
createVNode(_sfc_main$3, {
|
|
294
|
+
item,
|
|
295
|
+
active: __props.itemActive(item),
|
|
296
|
+
pill: pillUnder(item),
|
|
297
|
+
"pill-id": __props.pillId,
|
|
298
|
+
compact: __props.compact,
|
|
299
|
+
menu: menuOf(item),
|
|
300
|
+
expandable: !__props.compact && !!item.children?.length,
|
|
301
|
+
expanded: expanded(item),
|
|
302
|
+
"on-path": onPath(item),
|
|
303
|
+
"preview-delay": __props.previewDelay,
|
|
304
|
+
hovered: hovered.value === item.id,
|
|
305
|
+
"expand-label": __props.labels.expand,
|
|
306
|
+
"item-active": __props.itemActive,
|
|
307
|
+
onActivate: activate,
|
|
308
|
+
onHover: hover,
|
|
309
|
+
onToggle: ($event) => toggle(item)
|
|
310
|
+
}, createSlots({ _: 2 }, [
|
|
311
|
+
_ctx.$slots.item ? {
|
|
312
|
+
name: "default",
|
|
313
|
+
fn: withCtx((slotProps) => [
|
|
314
|
+
renderSlot(_ctx.$slots, "item", mergeProps({ ref_for: true }, slotProps))
|
|
315
|
+
]),
|
|
316
|
+
key: "0"
|
|
317
|
+
} : void 0
|
|
318
|
+
]), 1032, ["item", "active", "pill", "pill-id", "compact", "menu", "expandable", "expanded", "on-path", "preview-delay", "hovered", "expand-label", "item-active", "onToggle"]),
|
|
319
|
+
!__props.compact && item.children?.length ? (openBlock(), createBlock(unref(CollapsibleRoot), {
|
|
320
|
+
key: 0,
|
|
321
|
+
open: expanded(item)
|
|
322
|
+
}, {
|
|
323
|
+
default: withCtx(() => [
|
|
324
|
+
createVNode(unref(CollapsibleContent), { class: "flex flex-col gap-0.5 overflow-hidden data-[state=open]:animate-[collapsible-down_220ms_var(--ease-emphasized)] data-[state=closed]:animate-[collapsible-up_180ms_var(--ease-emphasized)] motion-reduce:animate-none" }, {
|
|
325
|
+
default: withCtx(() => [
|
|
326
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(item.children, (child) => {
|
|
327
|
+
return openBlock(), createBlock(_sfc_main$3, {
|
|
328
|
+
key: child.id,
|
|
329
|
+
nested: "",
|
|
330
|
+
item: child,
|
|
331
|
+
active: __props.itemActive(child),
|
|
332
|
+
pill: pillUnder(child),
|
|
333
|
+
"pill-id": __props.pillId,
|
|
334
|
+
menu: menuOf(child),
|
|
335
|
+
"preview-delay": __props.previewDelay,
|
|
336
|
+
hovered: hovered.value === child.id,
|
|
337
|
+
"item-active": __props.itemActive,
|
|
338
|
+
onActivate: activate,
|
|
339
|
+
onHover: hover
|
|
340
|
+
}, null, 8, ["item", "active", "pill", "pill-id", "menu", "preview-delay", "hovered", "item-active"]);
|
|
341
|
+
}), 128))
|
|
342
|
+
]),
|
|
343
|
+
_: 2
|
|
344
|
+
}, 1024)
|
|
345
|
+
]),
|
|
346
|
+
_: 2
|
|
347
|
+
}, 1032, ["open"])) : createCommentVNode("", true)
|
|
348
|
+
], 64);
|
|
349
|
+
}), 128))
|
|
350
|
+
]),
|
|
351
|
+
_: 2
|
|
352
|
+
}, 1024)
|
|
353
|
+
]),
|
|
354
|
+
_: 2
|
|
355
|
+
}, 1032, ["open", "disabled", "onUpdate:open"]))
|
|
356
|
+
], 64);
|
|
357
|
+
}), 128))
|
|
358
|
+
], 32)
|
|
359
|
+
]),
|
|
360
|
+
_: 3
|
|
361
|
+
}, 8, ["content-class"]));
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
});
|
|
365
|
+
export {
|
|
366
|
+
_sfc_main as _
|
|
367
|
+
};
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
import { defineComponent, ref, watch, onBeforeUnmount, computed, openBlock, createBlock, withCtx, createElementBlock, createElementVNode, toDisplayString, createCommentVNode, resolveDynamicComponent, createTextVNode, unref, Fragment, renderList, mergeProps, createVNode, normalizeClass, normalizeStyle, renderSlot } from "vue";
|
|
2
|
+
import { Motion } from "motion-v";
|
|
3
|
+
import { useLocale } from "../composables/useLocale.js";
|
|
4
|
+
import { usePillTransition } from "../composables/usePillTransition.js";
|
|
5
|
+
import { useLinkComponent } from "../composables/useLpConfig.js";
|
|
6
|
+
import { _ as _sfc_main$2 } from "./LpBadge-Huo8EKew.js";
|
|
7
|
+
import { _ as _sfc_main$4 } from "./LpContextMenu-rx2tCjwk.js";
|
|
8
|
+
import { _ as _sfc_main$1 } from "./LpHoverCard-spGxyw7T.js";
|
|
9
|
+
import { _ as _sfc_main$3 } from "./LpIcon--5WSb3jJ.js";
|
|
10
|
+
import LpKeys from "../components/LpKeys.vue.js";
|
|
11
|
+
import { _ as _sfc_main$5 } from "./LpNumberFlow-CcxEGUy0.js";
|
|
12
|
+
import { waiting } from "../components/sidebar.js";
|
|
13
|
+
import { resolveLink } from "../components/link.js";
|
|
14
|
+
const _hoisted_1 = { class: "relative flex flex-col" };
|
|
15
|
+
const _hoisted_2 = {
|
|
16
|
+
key: 1,
|
|
17
|
+
class: "lp-sweep absolute inset-y-0 left-0 w-2/5 rounded-pill bg-brand"
|
|
18
|
+
};
|
|
19
|
+
const _hoisted_3 = {
|
|
20
|
+
key: 0,
|
|
21
|
+
class: "relative z-10 shrink-0"
|
|
22
|
+
};
|
|
23
|
+
const _hoisted_4 = {
|
|
24
|
+
key: 1,
|
|
25
|
+
class: "relative z-10 text-xs font-semibold uppercase"
|
|
26
|
+
};
|
|
27
|
+
const _hoisted_5 = {
|
|
28
|
+
key: 2,
|
|
29
|
+
class: "relative z-10 size-1 shrink-0 rounded-full bg-current opacity-50"
|
|
30
|
+
};
|
|
31
|
+
const _hoisted_6 = { class: "relative z-10 min-w-0 flex-1 truncate text-left" };
|
|
32
|
+
const _hoisted_7 = {
|
|
33
|
+
key: 1,
|
|
34
|
+
class: "relative z-10 size-2 shrink-0 rounded-full bg-brand"
|
|
35
|
+
};
|
|
36
|
+
const _hoisted_8 = {
|
|
37
|
+
key: 0,
|
|
38
|
+
class: "absolute inset-0 animate-ping rounded-pill bg-brand/30"
|
|
39
|
+
};
|
|
40
|
+
const _hoisted_9 = {
|
|
41
|
+
key: 3,
|
|
42
|
+
class: "w-5 shrink-0",
|
|
43
|
+
"aria-hidden": "true"
|
|
44
|
+
};
|
|
45
|
+
const _hoisted_10 = ["aria-label", "aria-expanded"];
|
|
46
|
+
const _hoisted_11 = {
|
|
47
|
+
key: 0,
|
|
48
|
+
class: "flex flex-col"
|
|
49
|
+
};
|
|
50
|
+
const _hoisted_12 = {
|
|
51
|
+
key: 0,
|
|
52
|
+
class: "flex items-center gap-2 border-b border-line px-3 py-2 text-sm font-medium text-ink"
|
|
53
|
+
};
|
|
54
|
+
const _hoisted_13 = { class: "min-w-0 flex-1 truncate" };
|
|
55
|
+
const _hoisted_14 = {
|
|
56
|
+
key: 1,
|
|
57
|
+
class: "flex flex-col gap-0.5"
|
|
58
|
+
};
|
|
59
|
+
const _hoisted_15 = { class: "flex items-center gap-2 px-2 py-1 text-sm font-medium text-ink" };
|
|
60
|
+
const _hoisted_16 = { class: "min-w-0 flex-1 truncate" };
|
|
61
|
+
const _hoisted_17 = {
|
|
62
|
+
key: 0,
|
|
63
|
+
class: "flex max-h-[min(70vh,30rem)] flex-col gap-0.5 overflow-y-auto"
|
|
64
|
+
};
|
|
65
|
+
const _hoisted_18 = { class: "min-w-0 flex-1 truncate" };
|
|
66
|
+
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
67
|
+
__name: "LpSidebarRow",
|
|
68
|
+
props: {
|
|
69
|
+
item: {},
|
|
70
|
+
active: { type: Boolean },
|
|
71
|
+
pill: { type: Boolean },
|
|
72
|
+
pillId: {},
|
|
73
|
+
compact: { type: Boolean },
|
|
74
|
+
nested: { type: Boolean },
|
|
75
|
+
menu: { default: () => [] },
|
|
76
|
+
expandable: { type: Boolean },
|
|
77
|
+
expanded: { type: Boolean },
|
|
78
|
+
onPath: { type: Boolean },
|
|
79
|
+
previewDelay: { default: 900 },
|
|
80
|
+
hovered: { type: Boolean },
|
|
81
|
+
expandLabel: {},
|
|
82
|
+
itemActive: {}
|
|
83
|
+
},
|
|
84
|
+
emits: ["activate", "hover", "toggle"],
|
|
85
|
+
setup(__props, { emit: __emit }) {
|
|
86
|
+
const props = __props;
|
|
87
|
+
const emit = __emit;
|
|
88
|
+
const locale = useLocale();
|
|
89
|
+
const pillTransition = usePillTransition();
|
|
90
|
+
const linkComponent = useLinkComponent();
|
|
91
|
+
function rowOf(item) {
|
|
92
|
+
const link = item.disabled ? null : resolveLink(linkComponent.value, { to: item.to, href: item.href });
|
|
93
|
+
if (link) return link;
|
|
94
|
+
return { is: "button", props: { type: "button", disabled: item.disabled || void 0 } };
|
|
95
|
+
}
|
|
96
|
+
const bumped = ref(false);
|
|
97
|
+
let bumpTimer;
|
|
98
|
+
watch(
|
|
99
|
+
() => props.item.badge,
|
|
100
|
+
(now, was) => {
|
|
101
|
+
if (typeof now !== "number" || typeof was !== "number" || now <= was) return;
|
|
102
|
+
bumped.value = true;
|
|
103
|
+
clearTimeout(bumpTimer);
|
|
104
|
+
bumpTimer = setTimeout(() => bumped.value = false, 1200);
|
|
105
|
+
}
|
|
106
|
+
);
|
|
107
|
+
onBeforeUnmount(() => clearTimeout(bumpTimer));
|
|
108
|
+
const initials = computed(
|
|
109
|
+
() => props.item.label.split(/\s+/).filter(Boolean).slice(0, 2).map((w) => [...w][0]).join("")
|
|
110
|
+
);
|
|
111
|
+
const hidden = computed(() => (props.compact || !props.expanded) && !!props.item.children?.some(waiting));
|
|
112
|
+
const hasBadge = computed(() => props.item.badge != null || !!props.item.dot || hidden.value);
|
|
113
|
+
const card = computed(() => !props.item.disabled && (props.compact || !!props.item.preview));
|
|
114
|
+
const delay = computed(() => props.compact && !props.item.preview ? 250 : props.previewDelay);
|
|
115
|
+
return (_ctx, _cache) => {
|
|
116
|
+
return openBlock(), createBlock(_sfc_main$1, {
|
|
117
|
+
disabled: !card.value,
|
|
118
|
+
side: "right",
|
|
119
|
+
align: "start",
|
|
120
|
+
"side-offset": __props.compact ? 12 : 16,
|
|
121
|
+
"open-delay": delay.value,
|
|
122
|
+
"close-delay": 120,
|
|
123
|
+
touch: "none",
|
|
124
|
+
"panel-class": __props.item.preview ? "w-80 p-0 overflow-hidden" : "w-56 p-2"
|
|
125
|
+
}, {
|
|
126
|
+
trigger: withCtx(() => [
|
|
127
|
+
createElementVNode("div", _hoisted_1, [
|
|
128
|
+
createVNode(_sfc_main$4, {
|
|
129
|
+
items: __props.menu,
|
|
130
|
+
title: (__props.item.menuTitle ?? __props.item.label) || void 0,
|
|
131
|
+
"title-icon": __props.item.icon
|
|
132
|
+
}, {
|
|
133
|
+
default: withCtx(() => [
|
|
134
|
+
(openBlock(), createBlock(resolveDynamicComponent(rowOf(__props.item).is), mergeProps(rowOf(__props.item).props, {
|
|
135
|
+
"aria-current": __props.active ? "page" : void 0,
|
|
136
|
+
"aria-disabled": __props.item.disabled || void 0,
|
|
137
|
+
"aria-label": __props.compact ? __props.item.label : void 0,
|
|
138
|
+
"data-lp-nav-row": "",
|
|
139
|
+
"aria-keyshortcuts": __props.item.hotkey,
|
|
140
|
+
"aria-busy": __props.item.busy ? true : void 0,
|
|
141
|
+
"data-lp-nav-nested": __props.nested || void 0,
|
|
142
|
+
class: ["group/item relative flex items-center rounded-control font-medium outline-none transition-colors duration-[var(--duration-fast)] focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring", [
|
|
143
|
+
__props.compact ? ["ml-1 size-10 justify-center", __props.onPath && !__props.active ? "bg-ink/[0.06]" : ""] : __props.nested ? "gap-2.5 py-1.5 pl-9 pr-3 text-[13px]" : "gap-3 px-3 py-2 text-sm",
|
|
144
|
+
__props.item.disabled ? "cursor-not-allowed text-muted/50" : __props.active || __props.hovered || __props.onPath ? "text-ink" : "text-muted hover:text-ink"
|
|
145
|
+
]],
|
|
146
|
+
onClick: _cache[0] || (_cache[0] = ($event) => emit("activate", __props.item)),
|
|
147
|
+
onPointerenter: _cache[1] || (_cache[1] = ($event) => emit("hover", __props.item))
|
|
148
|
+
}), {
|
|
149
|
+
default: withCtx(() => [
|
|
150
|
+
__props.item.busy !== void 0 && __props.item.busy !== false ? (openBlock(), createElementBlock("span", {
|
|
151
|
+
key: 0,
|
|
152
|
+
class: normalizeClass(["pointer-events-none absolute bottom-0.5 z-10 h-0.5 overflow-hidden rounded-pill bg-brand/15", __props.compact ? "inset-x-2" : "inset-x-3"])
|
|
153
|
+
}, [
|
|
154
|
+
typeof __props.item.busy === "number" ? (openBlock(), createElementBlock("span", {
|
|
155
|
+
key: 0,
|
|
156
|
+
class: "block h-full rounded-pill bg-brand transition-[width] duration-(--duration-medium) ease-[var(--ease-emphasized)]",
|
|
157
|
+
style: normalizeStyle({ width: `${Math.round(Math.min(1, Math.max(0, __props.item.busy)) * 100)}%` })
|
|
158
|
+
}, null, 4)) : (openBlock(), createElementBlock("span", _hoisted_2))
|
|
159
|
+
], 2)) : createCommentVNode("", true),
|
|
160
|
+
__props.pill ? (openBlock(), createBlock(unref(Motion), {
|
|
161
|
+
key: 1,
|
|
162
|
+
"layout-id": __props.pillId,
|
|
163
|
+
transition: unref(pillTransition),
|
|
164
|
+
class: "absolute inset-0 z-0 rounded-control bg-brand-soft"
|
|
165
|
+
}, null, 8, ["layout-id", "transition"])) : createCommentVNode("", true),
|
|
166
|
+
renderSlot(_ctx.$slots, "default", {
|
|
167
|
+
item: __props.item,
|
|
168
|
+
active: __props.active
|
|
169
|
+
}, () => [
|
|
170
|
+
__props.item.icon ? (openBlock(), createElementBlock("span", _hoisted_3, [
|
|
171
|
+
createVNode(_sfc_main$3, {
|
|
172
|
+
name: __props.item.icon,
|
|
173
|
+
size: __props.nested ? 15 : 17,
|
|
174
|
+
class: normalizeClass(["transition-colors", __props.active ? "text-brand" : ""])
|
|
175
|
+
}, null, 8, ["name", "size", "class"]),
|
|
176
|
+
__props.compact && hasBadge.value ? (openBlock(), createElementBlock("span", {
|
|
177
|
+
key: 0,
|
|
178
|
+
class: normalizeClass(["absolute -right-1 -top-1 size-2 rounded-full bg-brand ring-2 ring-surface-raised", bumped.value ? "animate-pulse" : ""])
|
|
179
|
+
}, null, 2)) : createCommentVNode("", true)
|
|
180
|
+
])) : __props.compact ? (openBlock(), createElementBlock("span", _hoisted_4, toDisplayString(initials.value), 1)) : __props.nested ? (openBlock(), createElementBlock("span", _hoisted_5)) : createCommentVNode("", true),
|
|
181
|
+
!__props.compact ? (openBlock(), createElementBlock(Fragment, { key: 3 }, [
|
|
182
|
+
createElementVNode("span", _hoisted_6, toDisplayString(__props.item.label), 1),
|
|
183
|
+
__props.item.hotkey && !hasBadge.value && !__props.expandable ? (openBlock(), createBlock(LpKeys, {
|
|
184
|
+
key: 0,
|
|
185
|
+
combo: __props.item.hotkey,
|
|
186
|
+
size: "sm",
|
|
187
|
+
"aria-hidden": "true",
|
|
188
|
+
class: "pointer-events-none absolute right-2 z-10 rounded-small bg-surface-raised/90 opacity-0 transition-opacity duration-(--duration-fast) group-hover/item:opacity-100 group-focus-visible/item:opacity-100"
|
|
189
|
+
}, null, 8, ["combo"])) : createCommentVNode("", true),
|
|
190
|
+
hasBadge.value && __props.item.badge == null ? (openBlock(), createElementBlock("span", _hoisted_7)) : createCommentVNode("", true),
|
|
191
|
+
__props.item.badge != null ? (openBlock(), createBlock(_sfc_main$2, {
|
|
192
|
+
key: 2,
|
|
193
|
+
tone: __props.active ? "brand" : "neutral",
|
|
194
|
+
class: "relative z-10 shrink-0"
|
|
195
|
+
}, {
|
|
196
|
+
default: withCtx(() => [
|
|
197
|
+
bumped.value ? (openBlock(), createElementBlock("span", _hoisted_8)) : createCommentVNode("", true),
|
|
198
|
+
typeof __props.item.badge === "number" ? (openBlock(), createBlock(_sfc_main$5, {
|
|
199
|
+
key: 1,
|
|
200
|
+
value: __props.item.badge,
|
|
201
|
+
grouped: "",
|
|
202
|
+
locale: unref(locale),
|
|
203
|
+
"animate-on-mount": false
|
|
204
|
+
}, null, 8, ["value", "locale"])) : (openBlock(), createElementBlock(Fragment, { key: 2 }, [
|
|
205
|
+
createTextVNode(toDisplayString(__props.item.badge), 1)
|
|
206
|
+
], 64))
|
|
207
|
+
]),
|
|
208
|
+
_: 1
|
|
209
|
+
}, 8, ["tone"])) : createCommentVNode("", true),
|
|
210
|
+
__props.expandable ? (openBlock(), createElementBlock("span", _hoisted_9)) : createCommentVNode("", true)
|
|
211
|
+
], 64)) : createCommentVNode("", true)
|
|
212
|
+
])
|
|
213
|
+
]),
|
|
214
|
+
_: 3
|
|
215
|
+
}, 16, ["aria-current", "aria-disabled", "aria-label", "aria-keyshortcuts", "aria-busy", "data-lp-nav-nested", "class"]))
|
|
216
|
+
]),
|
|
217
|
+
_: 3
|
|
218
|
+
}, 8, ["items", "title", "title-icon"]),
|
|
219
|
+
__props.expandable && !__props.compact ? (openBlock(), createElementBlock("button", {
|
|
220
|
+
key: 0,
|
|
221
|
+
type: "button",
|
|
222
|
+
class: "absolute right-2 top-1/2 z-20 grid size-6 -translate-y-1/2 place-items-center rounded-small text-muted outline-none transition-colors hover:bg-ink/[0.06] hover:text-ink focus-visible:ring-2 focus-visible:ring-ring",
|
|
223
|
+
"aria-label": __props.expandLabel,
|
|
224
|
+
"aria-expanded": __props.expanded,
|
|
225
|
+
onClick: _cache[2] || (_cache[2] = ($event) => emit("toggle"))
|
|
226
|
+
}, [
|
|
227
|
+
createVNode(_sfc_main$3, {
|
|
228
|
+
name: "lucide:chevron-right",
|
|
229
|
+
size: 14,
|
|
230
|
+
class: normalizeClass(["transition-transform duration-(--duration-fast) ease-[var(--ease-emphasized)] motion-reduce:transition-none", __props.expanded ? "rotate-90" : ""])
|
|
231
|
+
}, null, 8, ["class"])
|
|
232
|
+
], 8, _hoisted_10)) : createCommentVNode("", true)
|
|
233
|
+
])
|
|
234
|
+
]),
|
|
235
|
+
default: withCtx(() => [
|
|
236
|
+
__props.item.preview ? (openBlock(), createElementBlock("div", _hoisted_11, [
|
|
237
|
+
__props.compact ? (openBlock(), createElementBlock("div", _hoisted_12, [
|
|
238
|
+
createElementVNode("span", _hoisted_13, toDisplayString(__props.item.label), 1),
|
|
239
|
+
__props.item.hotkey ? (openBlock(), createBlock(LpKeys, {
|
|
240
|
+
key: 0,
|
|
241
|
+
combo: __props.item.hotkey,
|
|
242
|
+
size: "sm"
|
|
243
|
+
}, null, 8, ["combo"])) : createCommentVNode("", true)
|
|
244
|
+
])) : createCommentVNode("", true),
|
|
245
|
+
(openBlock(), createBlock(resolveDynamicComponent(__props.item.preview)))
|
|
246
|
+
])) : (openBlock(), createElementBlock("div", _hoisted_14, [
|
|
247
|
+
createElementVNode("div", _hoisted_15, [
|
|
248
|
+
createElementVNode("span", _hoisted_16, toDisplayString(__props.item.label), 1),
|
|
249
|
+
__props.item.badge != null ? (openBlock(), createBlock(_sfc_main$2, {
|
|
250
|
+
key: 0,
|
|
251
|
+
tone: "neutral"
|
|
252
|
+
}, {
|
|
253
|
+
default: withCtx(() => [
|
|
254
|
+
createTextVNode(toDisplayString(typeof __props.item.badge === "number" ? __props.item.badge.toLocaleString(unref(locale)) : __props.item.badge), 1)
|
|
255
|
+
]),
|
|
256
|
+
_: 1
|
|
257
|
+
})) : createCommentVNode("", true),
|
|
258
|
+
__props.item.hotkey ? (openBlock(), createBlock(LpKeys, {
|
|
259
|
+
key: 1,
|
|
260
|
+
combo: __props.item.hotkey,
|
|
261
|
+
size: "sm"
|
|
262
|
+
}, null, 8, ["combo"])) : createCommentVNode("", true)
|
|
263
|
+
]),
|
|
264
|
+
__props.item.children?.length ? (openBlock(), createElementBlock("div", _hoisted_17, [
|
|
265
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(__props.item.children, (child) => {
|
|
266
|
+
return openBlock(), createBlock(resolveDynamicComponent(rowOf(child).is), mergeProps({
|
|
267
|
+
key: child.id
|
|
268
|
+
}, { ref_for: true }, rowOf(child).props, {
|
|
269
|
+
"aria-current": __props.itemActive?.(child) ? "page" : void 0,
|
|
270
|
+
class: ["flex shrink-0 items-center gap-2 rounded-control px-2 py-1.5 text-left text-[13px] outline-none transition-colors hover:bg-ink/[0.05] focus-visible:ring-2 focus-visible:ring-ring", child.disabled ? "opacity-50" : __props.itemActive?.(child) ? "text-brand" : "text-muted hover:text-ink"],
|
|
271
|
+
onClick: ($event) => emit("activate", child)
|
|
272
|
+
}), {
|
|
273
|
+
default: withCtx(() => [
|
|
274
|
+
child.icon ? (openBlock(), createBlock(_sfc_main$3, {
|
|
275
|
+
key: 0,
|
|
276
|
+
name: child.icon,
|
|
277
|
+
size: 15,
|
|
278
|
+
class: "shrink-0"
|
|
279
|
+
}, null, 8, ["name"])) : createCommentVNode("", true),
|
|
280
|
+
createElementVNode("span", _hoisted_18, toDisplayString(child.label), 1),
|
|
281
|
+
child.badge != null ? (openBlock(), createBlock(_sfc_main$2, {
|
|
282
|
+
key: 1,
|
|
283
|
+
tone: "neutral"
|
|
284
|
+
}, {
|
|
285
|
+
default: withCtx(() => [
|
|
286
|
+
createTextVNode(toDisplayString(child.badge), 1)
|
|
287
|
+
]),
|
|
288
|
+
_: 2
|
|
289
|
+
}, 1024)) : createCommentVNode("", true)
|
|
290
|
+
]),
|
|
291
|
+
_: 2
|
|
292
|
+
}, 1040, ["aria-current", "class", "onClick"]);
|
|
293
|
+
}), 128))
|
|
294
|
+
])) : createCommentVNode("", true)
|
|
295
|
+
]))
|
|
296
|
+
]),
|
|
297
|
+
_: 3
|
|
298
|
+
}, 8, ["disabled", "side-offset", "open-delay", "panel-class"]);
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
});
|
|
302
|
+
export {
|
|
303
|
+
_sfc_main as _
|
|
304
|
+
};
|