@leavepulse/ui 0.43.4 → 0.45.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +121 -7
- package/dist/assets/{LpCommandPalette-B-0Est4Z.css → LpCommandPalette-nGNnzXqQ.css} +21 -21
- package/dist/assets/{LpDropzone-BBoWvi-J.css → LpDropzone-i4BdMi1H.css} +12 -12
- package/dist/assets/{LpImageEditor-Ct7Y3aNu.css → LpImageEditor-CbMA82g8.css} +6 -6
- package/dist/assets/{LpRollingText-CR1mb0Vt.css → LpRollingText-BGnE6q9j.css} +3 -0
- package/dist/assets/{LpShortcutsDialog-C6YoQ8_M.css → LpShortcutsDialog-CqYX3yy6.css} +28 -7
- package/dist/assets/{LpSkeleton-D7xU8IPV.css → LpSkeleton-H3Z5dEIk.css} +4 -1
- package/dist/assets/{LpTable-BgPLJOXa.css → LpTable-CPwWxTJS.css} +49 -9
- package/dist/chunks/ContextMenuItems-BtKU7074.js +124 -0
- package/dist/chunks/{LayoutCanvas-Dd20boUG.js → LayoutCanvas-BkaGXTjx.js} +26 -9
- package/dist/chunks/{LayoutNode-DGpZA9LX.js → LayoutNode-B3_9E1Xa.js} +28 -12
- package/dist/chunks/{LpActionBar-BlvtGB2P.js → LpActionBar-CnfFVIwC.js} +26 -12
- package/dist/chunks/{LpAddressInput-B-Zvxsn7.js → LpAddressInput-BwX8uo4_.js} +54 -49
- package/dist/chunks/{LpAlert-BAYHDSS1.js → LpAlert-B6ilrM7T.js} +16 -9
- package/dist/chunks/{LpAppShell-BGQVIY-3.js → LpAppShell-C53_RaGF.js} +53 -26
- package/dist/chunks/{LpAutocomplete-DExlIZe_.js → LpAutocomplete-C8IgSMsi.js} +52 -24
- package/dist/chunks/{LpAvatar-B3-xAOH3.js → LpAvatar-C1XStdOo.js} +19 -10
- package/dist/chunks/LpBreadcrumbs-CQJd73Gm.js +95 -0
- package/dist/chunks/{LpButton-5VXXCjwF.js → LpButton-CKSwC6Mu.js} +45 -15
- package/dist/chunks/{LpCalendar-B7Ko5RdR.js → LpCalendar-DrA2McTU.js} +1 -1
- package/dist/chunks/{LpCard-BhI1N_vL.js → LpCard-C2IvucmX.js} +1 -1
- package/dist/chunks/{LpCheckbox-CVccKYaH.js → LpCheckbox-Bkj13CbW.js} +8 -4
- package/dist/chunks/{LpCodeBlock-Bo0B4TFR.js → LpCodeBlock-ca7ANFyW.js} +49 -17
- package/dist/chunks/{LpColorPicker-BlXea7LM.js → LpColorPicker-zz4VGkG4.js} +75 -26
- package/dist/chunks/{LpConfirmDialog-Q-bxff8z.js → LpConfirmDialog-DCw5jR1t.js} +59 -17
- package/dist/chunks/LpConfirmHost-CbywMpMP.js +49 -0
- package/dist/chunks/LpContextMenu-BqkAYa9X.js +69 -0
- package/dist/chunks/LpDatePicker-DuusgT69.js +195 -0
- package/dist/chunks/LpDateRangePicker-DHeuznfC.js +208 -0
- package/dist/chunks/{LpDisclosure-ChQYmjlR.js → LpDisclosure-Cc23-JOT.js} +1 -1
- package/dist/chunks/{LpDrawer-BZ6k3hvo.js → LpDrawer-Dt4aB4Fr.js} +65 -28
- package/dist/chunks/{LpDropdownMenu-DJpoqRCb.js → LpDropdownMenu-DdJGQzPn.js} +2 -1
- package/dist/chunks/{LpEmptyState-Dsdqz1Wj.js → LpEmptyState-BJbZXC8D.js} +1 -1
- package/dist/chunks/LpFieldNotice-wtieLUTj.js +64 -0
- package/dist/chunks/{LpFileTree-_5vFBgaK.js → LpFileTree-CNurOvkV.js} +25 -10
- package/dist/chunks/{LpFileTreeNode-BdcIYKIE.js → LpFileTreeNode-D_qRRdsH.js} +3 -3
- package/dist/chunks/LpFormField-CtVYj6tO.js +101 -0
- package/dist/chunks/{LpIcon-CCnX5_2j.js → LpIcon-DYtaid0K.js} +20 -6
- package/dist/chunks/{LpInput-9EXWUM9B.js → LpInput-D-YGQbEv.js} +58 -20
- package/dist/chunks/{LpLightbox-2sYVMY-S.js → LpLightbox-DSDahF23.js} +148 -61
- package/dist/chunks/{LpLink-DCND-zyu.js → LpLink-Krkjhe_y.js} +15 -6
- package/dist/chunks/{LpLogViewer-CaRy5MeS.js → LpLogViewer-KypbgOyo.js} +300 -72
- package/dist/chunks/{LpMapPicker-ul4oYno6.js → LpMapPicker-Cc84LaM3.js} +39 -14
- package/dist/chunks/{LpMediaGallery-FF-NquIo.js → LpMediaGallery-YKr-cQPN.js} +7 -4
- package/dist/chunks/{LpModal-Bt0pQCI_.js → LpModal-DMMDQHAu.js} +52 -29
- package/dist/chunks/{LpModalNav-YaifHrXC.js → LpModalNav-BVPDyIup.js} +10 -7
- package/dist/chunks/{LpNotificationBell-DyGGsMAM.js → LpNotificationBell-CCwyJP5C.js} +79 -33
- package/dist/chunks/{LpNumberField-CWuX08iX.js → LpNumberField-B77O-z28.js} +21 -8
- package/dist/chunks/{LpNumberFlow-amWYaeuA.js → LpNumberFlow-z4WPZcZu.js} +22 -12
- package/dist/chunks/{LpOtpInput-y2v-pmiN.js → LpOtpInput-CziPF3Oq.js} +37 -8
- package/dist/chunks/{LpPagination-5FxjmmB5.js → LpPagination-BcDlo3r_.js} +31 -20
- package/dist/chunks/{LpPasswordInput--sjYCkLS.js → LpPasswordInput-eKzQhbQP.js} +11 -8
- package/dist/chunks/LpPhoneInput-BCbrrhgE.js +336 -0
- package/dist/chunks/{LpPie-D6OnzwlJ.js → LpPie-BEJ2SfI6.js} +84 -28
- package/dist/chunks/{LpPopover-8268UmlC.js → LpPopover-DCKeqiVn.js} +5 -2
- package/dist/chunks/{LpProgress-Btq5W4Ut.js → LpProgress-CBU1iI69.js} +5 -4
- package/dist/chunks/{LpRadioGroup-xPIuVDO_.js → LpRadioGroup-DmEW0l78.js} +9 -2
- package/dist/chunks/LpRangeCalendar-DZuaRV0W.js +331 -0
- package/dist/chunks/{LpRollingText-CM5gkSeF.js → LpRollingText-DB7upf-5.js} +1 -1
- package/dist/chunks/{LpScrollArea-D8xyKXcF.js → LpScrollArea-Bry1fdOM.js} +14 -2
- package/dist/chunks/{LpSection-aM6J_u51.js → LpSection-tKEH0jYf.js} +1 -1
- package/dist/chunks/{LpSegmented-fV0Sk92p.js → LpSegmented-C09EEam2.js} +8 -4
- package/dist/chunks/{LpSelect-ANIVtrpM.js → LpSelect-DNIL6MB9.js} +50 -31
- package/dist/chunks/{LpSidebar-ClBUwoEz.js → LpSidebar-CQNB0-yU.js} +30 -22
- package/dist/chunks/{LpSidebarNav-llOcs_Fn.js → LpSidebarNav-kx-LdqNU.js} +16 -11
- package/dist/chunks/{LpSkeleton-CTI-vBgW.js → LpSkeleton-BB6XIV-w.js} +1 -1
- package/dist/chunks/{LpSlider-BwNIBkAK.js → LpSlider-Cuzmrd7p.js} +7 -2
- package/dist/chunks/{LpSparkline-C6xQ2dwv.js → LpSparkline-CB80N8SJ.js} +11 -4
- package/dist/chunks/{LpStat-CQaW8R--.js → LpStat-B-7udBRP.js} +2 -2
- package/dist/chunks/{LpStepper-Bk-XaQYU.js → LpStepper-C7XiVKZj.js} +34 -19
- package/dist/chunks/{LpSwitch-Blizvqyt.js → LpSwitch-OrcOJX9m.js} +41 -27
- package/dist/chunks/LpTableFilter-BV8PpLM9.js +158 -0
- package/dist/chunks/{LpTableOfContents-CjvxPMpU.js → LpTableOfContents-BUcAfGPQ.js} +36 -41
- package/dist/chunks/{LpTabs-Cefe_lys.js → LpTabs-29iW1XOx.js} +20 -6
- package/dist/chunks/LpTagsInput-D1SuqbhB.js +300 -0
- package/dist/chunks/LpTextarea-uuScWo6-.js +77 -0
- package/dist/chunks/LpThemeProvider-Be4r2TQX.js +35 -0
- package/dist/chunks/LpThemeSwitcher-B4aVPbNC.js +166 -0
- package/dist/chunks/{LpTilt-DuyKbpkA.js → LpTilt-B7KHX1zH.js} +2 -2
- package/dist/chunks/{LpTimeField-K6nAGboX.js → LpTimeField-Cqe7fXnh.js} +14 -8
- package/dist/chunks/{LpToaster-gDB1EaU3.js → LpToaster-DpJvoCOh.js} +94 -31
- package/dist/chunks/{LpTooltip-hCLPAqMG.js → LpTooltip-CXVKcOXT.js} +14 -6
- package/dist/chunks/LpTooltipProvider-CftjV7Xc.js +25 -0
- package/dist/chunks/{LpTopologyCanvas-Cm1L39uL.js → LpTopologyCanvas-6ozNrQKh.js} +8 -2
- package/dist/chunks/{LpUptimeBar-DvAMno0S.js → LpUptimeBar-ugcv25xj.js} +44 -15
- package/dist/chunks/icons-CkA0njzm.js +43 -0
- package/dist/chunks/{LpThemeSwitcher-Cue-myST.js → useTheme-DJm1JSsY.js} +215 -260
- package/dist/component-names.d.ts +1 -1
- package/dist/components/ContextMenuItems.vue.d.ts +8 -0
- package/dist/components/ContextMenuItems.vue.js +4 -0
- package/dist/components/LayoutCanvas.vue.js +1 -1
- package/dist/components/LayoutNode.vue.d.ts +4 -0
- package/dist/components/LayoutNode.vue.js +1 -1
- package/dist/components/LpActionBar.vue.d.ts +3 -0
- package/dist/components/LpActionBar.vue.js +1 -1
- package/dist/components/LpAddressInput.vue.d.ts +1 -1
- package/dist/components/LpAddressInput.vue.js +1 -1
- package/dist/components/LpAlert.vue.d.ts +9 -0
- package/dist/components/LpAlert.vue.js +1 -1
- package/dist/components/LpAppShell.vue.d.ts +10 -0
- package/dist/components/LpAppShell.vue.js +1 -1
- package/dist/components/LpAutocomplete.vue.d.ts +31 -6
- package/dist/components/LpAutocomplete.vue.js +1 -1
- package/dist/components/LpAvatar.vue.d.ts +3 -3
- package/dist/components/LpAvatar.vue.js +1 -1
- package/dist/components/LpBadge.vue.d.ts +2 -2
- package/dist/components/LpBreadcrumbs.vue.d.ts +13 -9
- package/dist/components/LpBreadcrumbs.vue.js +1 -1
- package/dist/components/LpButton.vue.d.ts +35 -98
- 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 +47 -3
- package/dist/components/LpChart.vue.js +377 -97
- package/dist/components/LpCheckbox.vue.js +1 -1
- package/dist/components/LpCodeBlock.vue.d.ts +2 -0
- package/dist/components/LpCodeBlock.vue.js +1 -1
- package/dist/components/LpColorPicker.vue.d.ts +2 -2
- package/dist/components/LpColorPicker.vue.js +1 -1
- package/dist/components/LpCommandPalette.vue.d.ts +14 -3
- package/dist/components/LpCommandPalette.vue.js +142 -77
- package/dist/components/LpConfirmDialog.vue.d.ts +15 -3
- package/dist/components/LpConfirmDialog.vue.js +1 -1
- package/dist/components/LpConfirmHost.vue.d.ts +9 -0
- package/dist/components/LpConfirmHost.vue.js +4 -0
- package/dist/components/LpContextMenu.vue.d.ts +3 -5
- package/dist/components/LpContextMenu.vue.js +1 -1
- package/dist/components/LpDatePicker.vue.d.ts +24 -6
- package/dist/components/LpDatePicker.vue.js +1 -1
- package/dist/components/LpDateRangePicker.vue.d.ts +60 -0
- package/dist/components/LpDateRangePicker.vue.js +4 -0
- package/dist/components/LpDisclosure.vue.js +1 -1
- package/dist/components/LpDrawer.vue.d.ts +10 -0
- package/dist/components/LpDrawer.vue.js +1 -1
- package/dist/components/LpDropdownMenu.vue.js +1 -1
- package/dist/components/LpDropzone.vue.js +23 -7
- package/dist/components/LpEmptyState.vue.js +1 -1
- package/dist/components/LpFieldNotice.vue.d.ts +8 -0
- package/dist/components/LpFieldNotice.vue.js +4 -0
- package/dist/components/LpFileTree.vue.d.ts +11 -2
- package/dist/components/LpFileTree.vue.js +1 -1
- package/dist/components/LpFileTreeNode.vue.js +1 -1
- package/dist/components/LpFormField.vue.d.ts +13 -1
- package/dist/components/LpFormField.vue.js +1 -1
- package/dist/components/LpIcon.vue.d.ts +0 -1
- package/dist/components/LpIcon.vue.js +1 -1
- package/dist/components/LpImageEditor.vue.js +93 -58
- package/dist/components/LpInput.vue.d.ts +22 -3
- package/dist/components/LpInput.vue.js +1 -1
- package/dist/components/LpLightbox.vue.d.ts +17 -0
- package/dist/components/LpLightbox.vue.js +1 -1
- package/dist/components/LpLink.vue.d.ts +11 -11
- package/dist/components/LpLink.vue.js +1 -1
- package/dist/components/LpLogViewer.vue.d.ts +72 -3
- package/dist/components/LpLogViewer.vue.js +1 -1
- package/dist/components/LpMapPicker.vue.d.ts +4 -4
- package/dist/components/LpMapPicker.vue.js +1 -1
- package/dist/components/LpMediaGallery.vue.js +1 -1
- package/dist/components/LpModal.vue.d.ts +16 -6
- package/dist/components/LpModal.vue.js +1 -1
- package/dist/components/LpModalNav.vue.d.ts +0 -1
- package/dist/components/LpModalNav.vue.js +1 -1
- package/dist/components/LpNotificationBell.vue.d.ts +11 -2
- package/dist/components/LpNotificationBell.vue.js +1 -1
- package/dist/components/LpNumberField.vue.d.ts +2 -0
- package/dist/components/LpNumberField.vue.js +1 -1
- package/dist/components/LpNumberFlow.vue.js +1 -1
- package/dist/components/LpOtpInput.vue.js +1 -1
- package/dist/components/LpPagination.vue.d.ts +2 -0
- package/dist/components/LpPagination.vue.js +1 -1
- package/dist/components/LpPasswordInput.vue.js +1 -1
- package/dist/components/LpPhoneInput.vue.d.ts +13 -0
- package/dist/components/LpPhoneInput.vue.js +1 -1
- package/dist/components/LpPie.vue.d.ts +21 -2
- package/dist/components/LpPie.vue.js +1 -1
- package/dist/components/LpPopover.vue.d.ts +2 -0
- 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/LpRadioGroup.vue.js +1 -1
- package/dist/components/LpRangeCalendar.vue.d.ts +51 -0
- package/dist/components/LpRangeCalendar.vue.js +4 -0
- package/dist/components/LpRollingText.vue.d.ts +1 -1
- package/dist/components/LpRollingText.vue.js +1 -1
- package/dist/components/LpScrollArea.vue.d.ts +2 -2
- package/dist/components/LpScrollArea.vue.js +1 -1
- package/dist/components/LpSection.vue.d.ts +1 -1
- package/dist/components/LpSection.vue.js +1 -1
- package/dist/components/LpSegmented.vue.d.ts +5 -0
- package/dist/components/LpSegmented.vue.js +1 -1
- package/dist/components/LpSelect.vue.d.ts +1 -0
- package/dist/components/LpSelect.vue.js +1 -1
- package/dist/components/LpShortcutsDialog.vue.d.ts +7 -1
- package/dist/components/LpShortcutsDialog.vue.js +60 -15
- package/dist/components/LpSidebar.vue.d.ts +6 -2
- package/dist/components/LpSidebar.vue.js +1 -1
- package/dist/components/LpSidebarNav.vue.js +1 -1
- package/dist/components/LpSkeleton.vue.js +1 -1
- package/dist/components/LpSlider.vue.js +1 -1
- package/dist/components/LpSparkline.vue.d.ts +1 -0
- package/dist/components/LpSparkline.vue.js +1 -1
- package/dist/components/LpStat.vue.js +1 -1
- package/dist/components/LpStepper.vue.js +1 -1
- package/dist/components/LpSwitch.vue.js +1 -1
- package/dist/components/LpTable.vue.d.ts +107 -3
- package/dist/components/LpTable.vue.js +540 -128
- package/dist/components/LpTableFilter.vue.d.ts +31 -0
- package/dist/components/LpTableFilter.vue.js +4 -0
- package/dist/components/LpTableOfContents.vue.d.ts +4 -2
- package/dist/components/LpTableOfContents.vue.js +1 -1
- package/dist/components/LpTabs.vue.d.ts +2 -0
- package/dist/components/LpTabs.vue.js +1 -1
- package/dist/components/LpTagsInput.vue.d.ts +77 -0
- package/dist/components/LpTagsInput.vue.js +4 -0
- package/dist/components/LpTextarea.vue.d.ts +19 -6
- package/dist/components/LpTextarea.vue.js +1 -1
- package/dist/components/LpThemeProvider.vue.d.ts +22 -0
- package/dist/components/LpThemeProvider.vue.js +4 -0
- package/dist/components/LpThemeSwitcher.vue.d.ts +15 -2
- package/dist/components/LpThemeSwitcher.vue.js +1 -1
- package/dist/components/LpTilt.vue.js +1 -1
- package/dist/components/LpTimeField.vue.js +1 -1
- package/dist/components/LpToaster.vue.d.ts +6 -1
- package/dist/components/LpToaster.vue.js +1 -1
- package/dist/components/LpTooltip.vue.d.ts +1 -2
- package/dist/components/LpTooltip.vue.js +1 -1
- package/dist/components/LpTooltipProvider.vue.d.ts +22 -0
- package/dist/components/LpTooltipProvider.vue.js +4 -0
- package/dist/components/LpTopologyCanvas.vue.js +1 -1
- package/dist/components/LpUptimeBar.vue.d.ts +4 -0
- package/dist/components/LpUptimeBar.vue.js +1 -1
- package/dist/components/chart.d.ts +32 -1
- package/dist/components/chart.js +42 -6
- package/dist/components/codeHighlight.d.ts +6 -0
- package/dist/components/codeHighlight.js +92 -20
- package/dist/components/color.d.ts +1 -1
- package/dist/components/color.js +20 -9
- package/dist/components/commandSearch.js +3 -0
- package/dist/components/confirm.d.ts +25 -0
- package/dist/components/confirm.js +26 -0
- package/dist/components/countries.d.ts +6 -0
- package/dist/components/countries.js +7 -0
- package/dist/components/dateRange.d.ts +43 -0
- package/dist/components/dateRange.js +76 -0
- package/dist/components/exportData.d.ts +58 -0
- package/dist/components/exportData.js +165 -0
- package/dist/components/fileTree.js +16 -7
- package/dist/components/imageCrop.d.ts +42 -0
- package/dist/components/imageCrop.js +47 -0
- package/dist/components/link.d.ts +12 -0
- package/dist/components/link.js +19 -0
- package/dist/components/logSearch.d.ts +18 -0
- package/dist/components/logSearch.js +36 -0
- package/dist/components/modalDepth.d.ts +18 -2
- package/dist/components/modalDepth.js +17 -5
- package/dist/components/otp.d.ts +5 -0
- package/dist/components/otp.js +10 -0
- package/dist/components/phone.d.ts +41 -0
- package/dist/components/phone.js +80 -0
- package/dist/components/sidebar.d.ts +7 -1
- package/dist/components/tableFilter.d.ts +36 -0
- package/dist/components/tableFilter.js +84 -0
- package/dist/components/tableSort.d.ts +8 -0
- package/dist/components/tableSort.js +31 -0
- package/dist/components/tags.d.ts +20 -0
- package/dist/components/tags.js +37 -0
- package/dist/composables/useField.d.ts +38 -0
- package/dist/composables/useField.js +45 -0
- package/dist/composables/useFieldNotice.d.ts +17 -0
- package/dist/composables/useFieldNotice.js +28 -0
- package/dist/composables/useForm.d.ts +53 -0
- package/dist/composables/useForm.js +207 -0
- package/dist/composables/useFormDraft.d.ts +10 -3
- package/dist/composables/useFormDraft.js +9 -14
- package/dist/composables/useHotkeys.d.ts +81 -5
- package/dist/composables/useHotkeys.js +223 -25
- package/dist/composables/useInputFilter.d.ts +17 -0
- package/dist/composables/useInputFilter.js +47 -10
- package/dist/composables/useInputMask.d.ts +59 -0
- package/dist/composables/useInputMask.js +170 -0
- package/dist/composables/useLpConfig.d.ts +24 -0
- package/dist/composables/useLpConfig.js +44 -0
- package/dist/composables/usePaintSelect.d.ts +22 -0
- package/dist/composables/usePaintSelect.js +169 -0
- package/dist/composables/useRovingFocus.js +7 -0
- package/dist/composables/useShift.js +7 -2
- package/dist/composables/useTilt.d.ts +2 -2
- package/dist/composables/useTilt.js +5 -6
- package/dist/composables/useToast.d.ts +20 -0
- package/dist/composables/useToast.js +28 -4
- package/dist/composables/useZoomPan.d.ts +3 -3
- package/dist/composables/useZoomPan.js +4 -4
- package/dist/icons-all.d.ts +1 -0
- package/dist/icons-all.js +3 -0
- package/dist/icons.d.ts +14 -1
- package/dist/index.d.ts +60 -4
- package/dist/index.js +245 -141
- package/dist/kit-icons.d.ts +2 -0
- package/dist/layout/tree.d.ts +2 -0
- package/dist/layout/tree.js +16 -1
- package/dist/layout/useLayout.d.ts +15 -0
- package/dist/layout/useLayout.js +41 -14
- package/dist/theme/backdrop.d.ts +12 -0
- package/dist/theme/presets.d.ts +0 -2
- package/dist/theme/useTheme.d.ts +32 -9
- package/package.json +18 -8
- package/src/component-names.ts +9 -7
- package/src/components/ContextMenuItems.vue +88 -0
- package/src/components/LayoutCanvas.vue +26 -6
- package/src/components/LayoutNode.vue +30 -4
- package/src/components/LpActionBar.vue +31 -8
- package/src/components/LpAddressInput.vue +57 -41
- package/src/components/LpAlert.vue +16 -3
- package/src/components/LpAppShell.vue +45 -12
- package/src/components/LpAutocomplete.vue +47 -10
- package/src/components/LpAvatar.vue +20 -6
- package/src/components/LpBreadcrumbs.vue +65 -41
- package/src/components/LpButton.vue +60 -14
- package/src/components/LpChart.vue +351 -28
- package/src/components/LpCheckbox.vue +7 -3
- package/src/components/LpCodeBlock.vue +50 -14
- package/src/components/LpColorPicker.vue +73 -10
- package/src/components/LpCommandPalette.vue +115 -20
- package/src/components/LpConfirmDialog.vue +68 -17
- package/src/components/LpConfirmHost.vue +59 -0
- package/src/components/LpContextMenu.vue +15 -116
- package/src/components/LpDatePicker.vue +104 -68
- package/src/components/LpDateRangePicker.vue +224 -0
- package/src/components/LpDrawer.vue +56 -19
- package/src/components/LpDropdownMenu.vue +1 -0
- package/src/components/LpDropzone.vue +21 -4
- package/src/components/LpFieldNotice.vue +65 -0
- package/src/components/LpFileTree.vue +33 -7
- package/src/components/LpFormField.vue +59 -7
- package/src/components/LpIcon.vue +22 -4
- package/src/components/LpImageEditor.vue +96 -57
- package/src/components/LpInput.vue +62 -11
- package/src/components/LpLightbox.vue +140 -29
- package/src/components/LpLink.vue +24 -13
- package/src/components/LpLogViewer.vue +311 -39
- package/src/components/LpMapPicker.vue +36 -13
- package/src/components/LpMediaGallery.vue +8 -2
- package/src/components/LpModal.vue +54 -28
- package/src/components/LpModalNav.vue +5 -2
- package/src/components/LpNotificationBell.vue +77 -23
- package/src/components/LpNumberField.vue +21 -6
- package/src/components/LpNumberFlow.vue +26 -10
- package/src/components/LpOtpInput.vue +43 -8
- package/src/components/LpPagination.vue +23 -7
- package/src/components/LpPasswordInput.vue +4 -1
- package/src/components/LpPhoneInput.vue +224 -39
- package/src/components/LpPie.vue +102 -20
- package/src/components/LpPopover.vue +4 -0
- package/src/components/LpProgress.vue +5 -3
- package/src/components/LpRadioGroup.vue +9 -2
- package/src/components/LpRangeCalendar.vue +365 -0
- package/src/components/LpRollingText.vue +3 -0
- package/src/components/LpScrollArea.vue +22 -2
- package/src/components/LpSegmented.vue +12 -2
- package/src/components/LpSelect.vue +0 -0
- package/src/components/LpShortcutsDialog.vue +83 -9
- package/src/components/LpSidebar.vue +14 -9
- package/src/components/LpSidebarNav.vue +17 -5
- package/src/components/LpSkeleton.vue +4 -1
- package/src/components/LpSlider.vue +7 -1
- package/src/components/LpSparkline.vue +11 -3
- package/src/components/LpStepper.vue +23 -10
- package/src/components/LpSwitch.vue +31 -8
- package/src/components/LpTable.vue +668 -90
- package/src/components/LpTableFilter.vue +175 -0
- package/src/components/LpTableOfContents.vue +50 -32
- package/src/components/LpTabs.vue +23 -6
- package/src/components/LpTagsInput.vue +364 -0
- package/src/components/LpTextarea.vue +44 -6
- package/src/components/LpThemeProvider.vue +41 -0
- package/src/components/LpThemeSwitcher.vue +76 -33
- package/src/components/LpTilt.vue +2 -2
- package/src/components/LpTimeField.vue +14 -3
- package/src/components/LpToaster.vue +115 -27
- package/src/components/LpTooltip.vue +29 -5
- package/src/components/LpTooltipProvider.vue +24 -0
- package/src/components/LpTopologyCanvas.vue +19 -2
- package/src/components/LpUptimeBar.vue +46 -8
- package/src/components/chart.ts +82 -8
- package/src/components/codeHighlight.ts +111 -15
- package/src/components/color.ts +30 -9
- package/src/components/commandSearch.ts +6 -0
- package/src/components/confirm.ts +58 -0
- package/src/components/countries.ts +12 -0
- package/src/components/dateRange.ts +134 -0
- package/src/components/exportData.ts +228 -0
- package/src/components/fileTree.ts +19 -7
- package/src/components/imageCrop.ts +107 -0
- package/src/components/link.ts +34 -0
- package/src/components/logSearch.ts +46 -0
- package/src/components/modalDepth.ts +48 -6
- package/src/components/otp.ts +16 -0
- package/src/components/phone.ts +140 -0
- package/src/components/sidebar.ts +7 -1
- package/src/components/tableFilter.ts +122 -0
- package/src/components/tableSort.ts +37 -0
- package/src/components/tags.ts +62 -0
- package/src/composables/useField.ts +83 -0
- package/src/composables/useFieldNotice.ts +59 -0
- package/src/composables/useForm.ts +314 -0
- package/src/composables/useFormDraft.ts +25 -20
- package/src/composables/useHotkeys.ts +355 -28
- package/src/composables/useInputFilter.ts +77 -14
- package/src/composables/useInputMask.ts +254 -0
- package/src/composables/useLpConfig.ts +87 -0
- package/src/composables/usePaintSelect.ts +243 -0
- package/src/composables/useRovingFocus.ts +11 -0
- package/src/composables/useShift.ts +13 -2
- package/src/composables/useTilt.ts +5 -6
- package/src/composables/useToast.ts +56 -4
- package/src/composables/useZoomPan.ts +6 -6
- package/src/iconSubset.d.mts +10 -0
- package/src/iconSubset.mjs +51 -0
- package/src/icons-all.ts +10 -0
- package/src/icons.ts +59 -8
- package/src/index.ts +73 -4
- package/src/kit-icons.ts +5 -0
- package/src/layout/tree.ts +30 -0
- package/src/layout/useLayout.ts +68 -18
- package/src/nuxt.ts +87 -17
- package/src/runtime/config.plugin.ts +14 -0
- package/src/runtime/theme.plugin.ts +43 -23
- package/src/theme/backdrop.ts +69 -0
- package/src/theme/presets.ts +6 -64
- package/src/theme/useTheme.ts +206 -100
- package/src/tokens/tokens.css +46 -0
- package/dist/chunks/LpBreadcrumbs-p4jHe_V-.js +0 -62
- package/dist/chunks/LpContextMenu-CwW1QXe_.js +0 -217
- package/dist/chunks/LpDatePicker-CwOToxGq.js +0 -164
- package/dist/chunks/LpFormField-CazBc2-a.js +0 -62
- package/dist/chunks/LpPhoneInput-BDSKVl_z.js +0 -209
- package/dist/chunks/LpTextarea-t7F6gv8E.js +0 -47
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
export interface TableFilterOption {
|
|
3
|
+
value: unknown
|
|
4
|
+
label: string
|
|
5
|
+
/** Rows holding the value; omitted when unknown (a server-backed table). */
|
|
6
|
+
count?: number
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export interface TableFilterLabels {
|
|
10
|
+
search: string
|
|
11
|
+
all: string
|
|
12
|
+
none: string
|
|
13
|
+
invert: string
|
|
14
|
+
only: string
|
|
15
|
+
onlyShown: string
|
|
16
|
+
addShown: string
|
|
17
|
+
noValues: string
|
|
18
|
+
}
|
|
19
|
+
</script>
|
|
20
|
+
|
|
21
|
+
<script setup lang="ts">
|
|
22
|
+
/*
|
|
23
|
+
* The value filter of one LpTable column, opened from the funnel in its
|
|
24
|
+
* header. Built for columns with many values: a search narrows the LIST
|
|
25
|
+
* without touching what is ticked, "Only" next to a value shows just that one
|
|
26
|
+
* in a click, and after a search the matches can be taken as a whole.
|
|
27
|
+
*/
|
|
28
|
+
import { computed, ref } from "vue"
|
|
29
|
+
import LpCheckbox from "./LpCheckbox.vue"
|
|
30
|
+
import LpInput from "./LpInput.vue"
|
|
31
|
+
import LpShift from "./LpShift.vue"
|
|
32
|
+
import { usePaintSelect } from "../composables/usePaintSelect"
|
|
33
|
+
import { hideAllValues, invertHidden, matchesQuery, onlyValues, unhideValues } from "./tableFilter"
|
|
34
|
+
|
|
35
|
+
const props = defineProps<{
|
|
36
|
+
options: TableFilterOption[]
|
|
37
|
+
hidden: ReadonlySet<unknown>
|
|
38
|
+
labels: TableFilterLabels
|
|
39
|
+
}>()
|
|
40
|
+
|
|
41
|
+
const emit = defineEmits<{ (e: "update:hidden", value: Set<unknown>): void }>()
|
|
42
|
+
|
|
43
|
+
/** Past this many values a list is easier searched than scanned. */
|
|
44
|
+
const SEARCH_FROM = 8
|
|
45
|
+
|
|
46
|
+
const query = ref("")
|
|
47
|
+
const values = computed(() => props.options.map((o) => o.value))
|
|
48
|
+
const shown = computed(() => props.options.filter((o) => matchesQuery(o.label, query.value)))
|
|
49
|
+
|
|
50
|
+
function set(next: Set<unknown>) {
|
|
51
|
+
emit("update:hidden", next)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function toggle(value: unknown) {
|
|
55
|
+
const next = new Set(props.hidden)
|
|
56
|
+
if (next.has(value)) next.delete(value)
|
|
57
|
+
else next.add(value)
|
|
58
|
+
set(next)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const list = ref<HTMLElement | null>(null)
|
|
62
|
+
|
|
63
|
+
/*
|
|
64
|
+
* Press a value's tick and sweep down the list to tick or clear the run, the
|
|
65
|
+
* same way rows of the table are painted. The selection here is the values
|
|
66
|
+
* shown, so painting writes back the complement as the hidden set.
|
|
67
|
+
*/
|
|
68
|
+
const byKey = computed(() => new Map(props.options.map((o) => [String(o.value), o.value])))
|
|
69
|
+
const paint = usePaintSelect<unknown>({
|
|
70
|
+
root: list,
|
|
71
|
+
selection: () => values.value.filter((v) => !props.hidden.has(v)),
|
|
72
|
+
set: (shownValues) => {
|
|
73
|
+
const keep = new Set(shownValues)
|
|
74
|
+
set(new Set(values.value.filter((v) => !keep.has(v))))
|
|
75
|
+
},
|
|
76
|
+
resolve: (raw) => (byKey.value.has(raw) ? byKey.value.get(raw) : undefined),
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
/* Up and down walk the ticks, so a long list is not a long run of Tab. */
|
|
80
|
+
function onListKeydown(event: KeyboardEvent) {
|
|
81
|
+
if (event.key !== "ArrowDown" && event.key !== "ArrowUp") return
|
|
82
|
+
const boxes = [...(list.value?.querySelectorAll<HTMLElement>("[role=checkbox]") ?? [])]
|
|
83
|
+
const at = boxes.indexOf(document.activeElement as HTMLElement)
|
|
84
|
+
const next = boxes[at + (event.key === "ArrowDown" ? 1 : -1)]
|
|
85
|
+
if (!next) return
|
|
86
|
+
event.preventDefault()
|
|
87
|
+
next.focus()
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const action =
|
|
91
|
+
"rounded-control px-1.5 py-0.5 text-xs font-medium text-muted outline-none transition-colors duration-fast hover:bg-surface-soft hover:text-ink focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-40"
|
|
92
|
+
</script>
|
|
93
|
+
|
|
94
|
+
<template>
|
|
95
|
+
<div class="flex flex-col gap-2">
|
|
96
|
+
<LpInput
|
|
97
|
+
v-if="options.length >= SEARCH_FROM"
|
|
98
|
+
v-model="query"
|
|
99
|
+
size="sm"
|
|
100
|
+
icon="lucide:search"
|
|
101
|
+
:placeholder="labels.search"
|
|
102
|
+
:aria-label="labels.search"
|
|
103
|
+
/>
|
|
104
|
+
|
|
105
|
+
<div class="flex flex-wrap items-center gap-1">
|
|
106
|
+
<template v-if="query">
|
|
107
|
+
<button
|
|
108
|
+
type="button"
|
|
109
|
+
:class="action"
|
|
110
|
+
:disabled="!shown.length"
|
|
111
|
+
@click="set(onlyValues(values, shown.map((o) => o.value)))"
|
|
112
|
+
>
|
|
113
|
+
{{ labels.onlyShown.replace("{count}", String(shown.length)) }}
|
|
114
|
+
</button>
|
|
115
|
+
<button
|
|
116
|
+
type="button"
|
|
117
|
+
:class="action"
|
|
118
|
+
:disabled="!shown.length"
|
|
119
|
+
@click="set(unhideValues(hidden, shown.map((o) => o.value)))"
|
|
120
|
+
>
|
|
121
|
+
{{ labels.addShown.replace("{count}", String(shown.length)) }}
|
|
122
|
+
</button>
|
|
123
|
+
</template>
|
|
124
|
+
<template v-else>
|
|
125
|
+
<button type="button" :class="action" :disabled="!hidden.size" @click="set(new Set())">
|
|
126
|
+
{{ labels.all }}
|
|
127
|
+
</button>
|
|
128
|
+
<button
|
|
129
|
+
type="button"
|
|
130
|
+
:class="action"
|
|
131
|
+
:disabled="hidden.size === options.length"
|
|
132
|
+
@click="set(hideAllValues(values))"
|
|
133
|
+
>
|
|
134
|
+
{{ labels.none }}
|
|
135
|
+
</button>
|
|
136
|
+
<button type="button" :class="action" @click="set(invertHidden(values, hidden))">
|
|
137
|
+
{{ labels.invert }}
|
|
138
|
+
</button>
|
|
139
|
+
</template>
|
|
140
|
+
</div>
|
|
141
|
+
|
|
142
|
+
<LpShift>
|
|
143
|
+
<div
|
|
144
|
+
ref="list"
|
|
145
|
+
class="-mx-1 flex max-h-64 flex-col overflow-y-auto overscroll-contain"
|
|
146
|
+
@keydown="onListKeydown"
|
|
147
|
+
>
|
|
148
|
+
<div
|
|
149
|
+
v-for="option in shown"
|
|
150
|
+
:key="String(option.value)"
|
|
151
|
+
class="group/opt flex items-center gap-2 rounded-control px-1.5 py-1 transition-colors duration-fast select-none hover:bg-surface-soft"
|
|
152
|
+
:data-paint-key="String(option.value)"
|
|
153
|
+
>
|
|
154
|
+
<LpCheckbox
|
|
155
|
+
:model-value="!hidden.has(option.value)"
|
|
156
|
+
class="min-w-0 flex-1"
|
|
157
|
+
@pointerdown="paint.onPointerDown($event, option.value)"
|
|
158
|
+
@update:model-value="toggle(option.value)"
|
|
159
|
+
>
|
|
160
|
+
<span class="truncate">{{ option.label }}</span>
|
|
161
|
+
</LpCheckbox>
|
|
162
|
+
<span v-if="option.count !== undefined" class="text-xs text-muted tabular-nums">{{ option.count }}</span>
|
|
163
|
+
<button
|
|
164
|
+
type="button"
|
|
165
|
+
class="rounded-control px-1.5 py-0.5 text-xs font-medium text-brand opacity-0 outline-none transition-opacity duration-fast group-hover/opt:opacity-100 hover:bg-brand-soft focus-visible:opacity-100 focus-visible:ring-2 focus-visible:ring-ring"
|
|
166
|
+
@click="set(onlyValues(values, [option.value]))"
|
|
167
|
+
>
|
|
168
|
+
{{ labels.only }}
|
|
169
|
+
</button>
|
|
170
|
+
</div>
|
|
171
|
+
<p v-if="!shown.length" class="px-1.5 py-2 text-xs text-muted">{{ labels.noValues }}</p>
|
|
172
|
+
</div>
|
|
173
|
+
</LpShift>
|
|
174
|
+
</div>
|
|
175
|
+
</template>
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import { Motion } from "motion-v"
|
|
13
13
|
import { computed, onBeforeUnmount, onMounted, ref, useId, watch } from "vue"
|
|
14
|
+
import { useLabels } from "../composables/useLpConfig"
|
|
14
15
|
import { usePillTransition } from "../composables/usePillTransition"
|
|
15
16
|
|
|
16
17
|
export interface TocLink {
|
|
@@ -23,14 +24,29 @@ export interface TocLink {
|
|
|
23
24
|
const props = withDefaults(
|
|
24
25
|
defineProps<{
|
|
25
26
|
links: TocLink[]
|
|
26
|
-
/** Heading shown above the list. */
|
|
27
|
+
/** Heading shown above the list (defaults to the `title` label). */
|
|
27
28
|
title?: string
|
|
28
29
|
/** px offset from the top used as the scroll-spy trigger line. */
|
|
29
30
|
offset?: number
|
|
31
|
+
labels?: Partial<{ title: string }>
|
|
30
32
|
}>(),
|
|
31
|
-
{
|
|
33
|
+
{ offset: 96 },
|
|
32
34
|
)
|
|
33
35
|
|
|
36
|
+
const text = useLabels("toc", { title: "On this page" }, () => props.labels)
|
|
37
|
+
const heading = computed(() => props.title ?? text.value.title)
|
|
38
|
+
|
|
39
|
+
// Every level of the tree as one ordered list; depth drives the indent, so
|
|
40
|
+
// links nested deeper than two levels render instead of vanishing.
|
|
41
|
+
interface TocRow {
|
|
42
|
+
link: TocLink
|
|
43
|
+
depth: number
|
|
44
|
+
}
|
|
45
|
+
function flatten(links: TocLink[], depth = 0): TocRow[] {
|
|
46
|
+
return links.flatMap((link) => [{ link, depth }, ...flatten(link.children ?? [], depth + 1)])
|
|
47
|
+
}
|
|
48
|
+
const rows = computed(() => flatten(props.links))
|
|
49
|
+
|
|
34
50
|
const activeId = ref<string>("")
|
|
35
51
|
// The id the pointer is hovering (null when not hovering). The indicator bar
|
|
36
52
|
// follows the hovered link, falling back to the scroll-spy active one — same
|
|
@@ -97,13 +113,28 @@ function unfreeze() {
|
|
|
97
113
|
safetyTimer = null
|
|
98
114
|
}
|
|
99
115
|
|
|
100
|
-
|
|
116
|
+
/*
|
|
117
|
+
* The element that actually scrolls to the heading. Inside an app shell that is
|
|
118
|
+
* a scroll region, not the window, and watching window.scrollY there saw no
|
|
119
|
+
* movement and unfroze on the first frame.
|
|
120
|
+
*/
|
|
121
|
+
function scrollerOf(el: HTMLElement): HTMLElement | null {
|
|
122
|
+
for (let node = el.parentElement; node; node = node.parentElement) {
|
|
123
|
+
const { overflowY } = getComputedStyle(node)
|
|
124
|
+
if (/(auto|scroll|overlay)/.test(overflowY) && node.scrollHeight > node.clientHeight) return node
|
|
125
|
+
}
|
|
126
|
+
return null
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function suppressSpyUntilScrollEnds(target: HTMLElement) {
|
|
101
130
|
spySuppressed = true
|
|
102
131
|
if (rafId != null) cancelAnimationFrame(rafId)
|
|
103
132
|
if (safetyTimer != null) clearTimeout(safetyTimer)
|
|
104
|
-
|
|
133
|
+
const scroller = scrollerOf(target)
|
|
134
|
+
const position = () => (scroller ? scroller.scrollTop : window.scrollY)
|
|
135
|
+
let last = position()
|
|
105
136
|
const tick = () => {
|
|
106
|
-
const y =
|
|
137
|
+
const y = position()
|
|
107
138
|
if (y === last) {
|
|
108
139
|
unfreeze() // position held for a frame → scrolling has come to rest
|
|
109
140
|
return
|
|
@@ -122,9 +153,11 @@ function onClick(id: string, ev: MouseEvent) {
|
|
|
122
153
|
if (!el) return
|
|
123
154
|
ev.preventDefault()
|
|
124
155
|
activeId.value = id // mark immediately so the bar jumps to the clicked item
|
|
125
|
-
suppressSpyUntilScrollEnds()
|
|
156
|
+
suppressSpyUntilScrollEnds(el)
|
|
126
157
|
el.scrollIntoView({ behavior: "smooth", block: "start" })
|
|
127
|
-
|
|
158
|
+
// Keep the router's own state: replacing it with null broke scroll
|
|
159
|
+
// restoration and back/forward bookkeeping in vue-router apps.
|
|
160
|
+
history.replaceState(history.state, "", `#${id}`)
|
|
128
161
|
}
|
|
129
162
|
|
|
130
163
|
onMounted(setup)
|
|
@@ -136,16 +169,21 @@ onBeforeUnmount(() => {
|
|
|
136
169
|
</script>
|
|
137
170
|
|
|
138
171
|
<template>
|
|
139
|
-
<nav :aria-label="
|
|
172
|
+
<nav :aria-label="heading" class="text-sm">
|
|
140
173
|
<p class="mb-2.5 text-[11px] font-semibold uppercase tracking-[0.08em] text-muted">
|
|
141
|
-
{{
|
|
174
|
+
{{ heading }}
|
|
142
175
|
</p>
|
|
143
176
|
<ul class="relative flex flex-col gap-0.5 border-l border-line" @mouseleave="hoveredId = null">
|
|
144
|
-
<li v-for="link in
|
|
177
|
+
<li v-for="{ link, depth } in rows" :key="link.id" class="flex flex-col">
|
|
145
178
|
<a
|
|
146
179
|
:href="`#${link.id}`"
|
|
147
|
-
class="relative -ml-px block py-1
|
|
148
|
-
:class="
|
|
180
|
+
class="relative -ml-px block py-1 leading-snug transition-colors duration-[var(--duration-fast)]"
|
|
181
|
+
:class="[
|
|
182
|
+
depth > 0 ? 'text-[13px]' : '',
|
|
183
|
+
litId === link.id ? 'text-brand' : 'text-muted hover:text-ink',
|
|
184
|
+
]"
|
|
185
|
+
:style="{ paddingLeft: `${0.875 + depth * 0.875}rem` }"
|
|
186
|
+
:aria-current="activeId === link.id ? 'location' : undefined"
|
|
149
187
|
@click="onClick(link.id, $event)"
|
|
150
188
|
@mouseenter="hoveredId = link.id"
|
|
151
189
|
>
|
|
@@ -157,26 +195,6 @@ onBeforeUnmount(() => {
|
|
|
157
195
|
/>
|
|
158
196
|
{{ link.text }}
|
|
159
197
|
</a>
|
|
160
|
-
|
|
161
|
-
<ul v-if="link.children?.length" class="flex flex-col gap-0.5">
|
|
162
|
-
<li v-for="child in link.children" :key="child.id">
|
|
163
|
-
<a
|
|
164
|
-
:href="`#${child.id}`"
|
|
165
|
-
class="relative -ml-px block py-1 pl-7 text-[13px] leading-snug transition-colors duration-[var(--duration-fast)]"
|
|
166
|
-
:class="litId === child.id ? 'text-brand' : 'text-muted hover:text-ink'"
|
|
167
|
-
@click="onClick(child.id, $event)"
|
|
168
|
-
@mouseenter="hoveredId = child.id"
|
|
169
|
-
>
|
|
170
|
-
<Motion
|
|
171
|
-
v-if="litId === child.id"
|
|
172
|
-
:layout-id="pillId"
|
|
173
|
-
:transition="pillTransition"
|
|
174
|
-
class="absolute -left-px top-0 h-full w-0.5 rounded-full bg-brand"
|
|
175
|
-
/>
|
|
176
|
-
{{ child.text }}
|
|
177
|
-
</a>
|
|
178
|
-
</li>
|
|
179
|
-
</ul>
|
|
180
198
|
</li>
|
|
181
199
|
</ul>
|
|
182
200
|
</nav>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
2
|
import { Motion, useReducedMotion } from "motion-v"
|
|
3
3
|
import { TabsContent, TabsList, TabsRoot, TabsTrigger } from "reka-ui"
|
|
4
|
-
import { computed, ref, useId } from "vue"
|
|
4
|
+
import { computed, ref, useId, watch } from "vue"
|
|
5
5
|
import { usePillTransition } from "../composables/usePillTransition"
|
|
6
6
|
import LpIcon from "./LpIcon.vue"
|
|
7
7
|
|
|
@@ -12,9 +12,11 @@ export interface TabItem {
|
|
|
12
12
|
icon?: string
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
withDefaults(
|
|
15
|
+
const props = withDefaults(
|
|
16
16
|
defineProps<{
|
|
17
17
|
modelValue?: string
|
|
18
|
+
/** Initially active tab when `v-model` is not bound (default: the first). */
|
|
19
|
+
defaultValue?: string
|
|
18
20
|
items: TabItem[]
|
|
19
21
|
/**
|
|
20
22
|
* "contained" (default) wraps the triggers in a bordered, filled bar.
|
|
@@ -31,7 +33,22 @@ withDefaults(
|
|
|
31
33
|
}>(),
|
|
32
34
|
{ variant: "contained", accent: false, block: false },
|
|
33
35
|
)
|
|
34
|
-
defineEmits<{ (e: "update:modelValue", value: string): void }>()
|
|
36
|
+
const emit = defineEmits<{ (e: "update:modelValue", value: string): void }>()
|
|
37
|
+
|
|
38
|
+
// Held here rather than left to reka, so the active marker follows the active
|
|
39
|
+
// tab in uncontrolled use too: reading the prop alone left it unmarked.
|
|
40
|
+
const current = ref(props.modelValue ?? props.defaultValue ?? props.items[0]?.value)
|
|
41
|
+
watch(
|
|
42
|
+
() => props.modelValue,
|
|
43
|
+
(value) => {
|
|
44
|
+
if (value !== undefined) current.value = value
|
|
45
|
+
},
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
function select(value: string) {
|
|
49
|
+
if (props.modelValue === undefined) current.value = value
|
|
50
|
+
emit("update:modelValue", value)
|
|
51
|
+
}
|
|
35
52
|
|
|
36
53
|
// The pill sits under the hovered tab, falling back to the active one
|
|
37
54
|
// (UAProject header behaviour). motion-v shared layoutId animates the move.
|
|
@@ -80,8 +97,8 @@ function releaseFocusAfterPointer(event: PointerEvent) {
|
|
|
80
97
|
|
|
81
98
|
<template>
|
|
82
99
|
<TabsRoot
|
|
83
|
-
:model-value="
|
|
84
|
-
@update:model-value="(v) =>
|
|
100
|
+
:model-value="current"
|
|
101
|
+
@update:model-value="(v) => select(v as string)"
|
|
85
102
|
>
|
|
86
103
|
<TabsList
|
|
87
104
|
class="gap-1"
|
|
@@ -109,7 +126,7 @@ function releaseFocusAfterPointer(event: PointerEvent) {
|
|
|
109
126
|
<!-- Active marker: a bottom bar in "underline", a filled pill otherwise.
|
|
110
127
|
Both slide between tabs via the shared motion layoutId. -->
|
|
111
128
|
<Motion
|
|
112
|
-
v-if="pillUnder(item.value,
|
|
129
|
+
v-if="pillUnder(item.value, current)"
|
|
113
130
|
:layout-id="pillId"
|
|
114
131
|
:transition="pillTransition"
|
|
115
132
|
:class="variant === 'underline'
|