@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
package/src/components/LpPie.vue
CHANGED
|
@@ -31,6 +31,16 @@ import LpRollingText from "./LpRollingText.vue"
|
|
|
31
31
|
import LpShift from "./LpShift.vue"
|
|
32
32
|
import LpTooltip from "./LpTooltip.vue"
|
|
33
33
|
import { useMergedAttrs } from "../composables/useMergedClass"
|
|
34
|
+
import { useLabels } from "../composables/useLpConfig"
|
|
35
|
+
|
|
36
|
+
export interface PieText {
|
|
37
|
+
[key: string]: string
|
|
38
|
+
empty: string
|
|
39
|
+
other: string
|
|
40
|
+
total: string
|
|
41
|
+
/** "{n} selected"; `{n}` is replaced by the count. */
|
|
42
|
+
selected: string
|
|
43
|
+
}
|
|
34
44
|
|
|
35
45
|
/** A slice, as reported by every interaction event. */
|
|
36
46
|
export interface SliceEvent {
|
|
@@ -107,21 +117,26 @@ const props = withDefaults(
|
|
|
107
117
|
*/
|
|
108
118
|
menuItems?: (slice: SliceEvent, selection: SliceEvent[]) => ContextMenuItemDef[]
|
|
109
119
|
emptyLabel?: string
|
|
120
|
+
/** Accessible name for the chart. Defaults to a generated summary. */
|
|
121
|
+
ariaLabel?: string
|
|
122
|
+
/** Render the slices as a visually hidden table for screen readers. */
|
|
123
|
+
dataTable?: boolean
|
|
124
|
+
/** Text overrides (`labels` is taken by the callout switch). */
|
|
125
|
+
text?: Partial<PieText>
|
|
110
126
|
}>(),
|
|
111
127
|
{
|
|
112
128
|
type: "donut",
|
|
113
129
|
size: 180,
|
|
114
130
|
innerRatio: 0.62,
|
|
115
131
|
maxSlices: 6,
|
|
116
|
-
otherLabel: "Other",
|
|
117
132
|
showPercent: true,
|
|
118
133
|
showTotal: true,
|
|
119
134
|
labelWidth: 140,
|
|
120
135
|
padAngle: 1.5,
|
|
121
136
|
cornerRadius: 4,
|
|
122
137
|
hoverOffset: 8,
|
|
123
|
-
emptyLabel: "No data",
|
|
124
138
|
animate: true,
|
|
139
|
+
dataTable: false,
|
|
125
140
|
duration: 900,
|
|
126
141
|
},
|
|
127
142
|
)
|
|
@@ -134,11 +149,17 @@ const emit = defineEmits<{
|
|
|
134
149
|
(e: "sliceContextMenu", payload: SliceEvent): void
|
|
135
150
|
}>()
|
|
136
151
|
|
|
152
|
+
const strings = useLabels<PieText>(
|
|
153
|
+
"pie",
|
|
154
|
+
{ empty: "No data", other: "Other", total: "total", selected: "{n} selected" },
|
|
155
|
+
() => props.text,
|
|
156
|
+
)
|
|
157
|
+
|
|
137
158
|
const resolved = computed(() =>
|
|
138
159
|
resolveSlices(
|
|
139
160
|
props.slices,
|
|
140
161
|
props.maxSlices || undefined,
|
|
141
|
-
props.otherLabel,
|
|
162
|
+
props.otherLabel ?? strings.value.other,
|
|
142
163
|
!props.sortBySize,
|
|
143
164
|
),
|
|
144
165
|
)
|
|
@@ -336,6 +357,23 @@ const dragging = ref(false)
|
|
|
336
357
|
|
|
337
358
|
const isSelected = (i: number) => selected.value.has(i)
|
|
338
359
|
|
|
360
|
+
/*
|
|
361
|
+
* Indices only mean something against the slices they were taken from. When
|
|
362
|
+
* the data changes shape, a selection or hover pointing past the end would read
|
|
363
|
+
* a slice that no longer exists, so anything out of range is dropped.
|
|
364
|
+
*/
|
|
365
|
+
watch(
|
|
366
|
+
() => arcs.value.length,
|
|
367
|
+
(n) => {
|
|
368
|
+
if (active.value >= n) active.value = -1
|
|
369
|
+
if (anchor.value >= n) anchor.value = -1
|
|
370
|
+
if ([...selected.value].some((i) => i >= n)) {
|
|
371
|
+
selected.value = new Set([...selected.value].filter((i) => i < n))
|
|
372
|
+
emitSelection()
|
|
373
|
+
}
|
|
374
|
+
},
|
|
375
|
+
)
|
|
376
|
+
|
|
339
377
|
const payloadFor = (i: number) => {
|
|
340
378
|
const a = arcs.value[i]
|
|
341
379
|
return { index: i, label: a.label, value: a.value, isOther: a.isOther }
|
|
@@ -354,7 +392,9 @@ const rangeTo = (i: number) => {
|
|
|
354
392
|
return next
|
|
355
393
|
}
|
|
356
394
|
|
|
357
|
-
|
|
395
|
+
type Modifiers = Pick<MouseEvent, "button" | "shiftKey" | "ctrlKey" | "metaKey">
|
|
396
|
+
|
|
397
|
+
const onSlicePointerDown = (i: number, e: Modifiers, drag = true) => {
|
|
358
398
|
// Right-click opens a menu; it must not disturb a selection the menu acts on.
|
|
359
399
|
if (e.button === 2) return
|
|
360
400
|
|
|
@@ -372,12 +412,18 @@ const onSlicePointerDown = (i: number, e: PointerEvent) => {
|
|
|
372
412
|
const only = selected.value.size === 1 && selected.value.has(i)
|
|
373
413
|
selected.value = only ? new Set() : new Set([i])
|
|
374
414
|
anchor.value = only ? -1 : i
|
|
375
|
-
if (!only) beginDrag()
|
|
415
|
+
if (!only && drag) beginDrag()
|
|
376
416
|
}
|
|
377
417
|
emitSelection()
|
|
378
418
|
emit("sliceClick", payloadFor(i))
|
|
379
419
|
}
|
|
380
420
|
|
|
421
|
+
/* Enter and Space on a legend entry arrive as a click with no pointer behind
|
|
422
|
+
it (detail 0); pointer clicks were already handled on pointerdown. */
|
|
423
|
+
const onLegendClick = (i: number, e: MouseEvent) => {
|
|
424
|
+
if (e.detail === 0) onSlicePointerDown(i, e, false)
|
|
425
|
+
}
|
|
426
|
+
|
|
381
427
|
/** Drag across slices to gather them — same gesture as a rubber-band in a list. */
|
|
382
428
|
const onSlicePointerEnter = (i: number) => {
|
|
383
429
|
clearTimeout(leaveTimer)
|
|
@@ -516,8 +562,10 @@ const onSliceContextMenu = (i: number) => {
|
|
|
516
562
|
|
|
517
563
|
/** The slice the centre reads out: the hovered one, else a lone selection. */
|
|
518
564
|
const focused = computed(() => {
|
|
519
|
-
|
|
520
|
-
|
|
565
|
+
const n = arcs.value.length
|
|
566
|
+
if (active.value >= 0 && active.value < n) return active.value
|
|
567
|
+
const only = selected.value.size === 1 ? [...selected.value][0] : -1
|
|
568
|
+
return only < n ? only : -1
|
|
521
569
|
})
|
|
522
570
|
|
|
523
571
|
/** Unselected slices only recede once something is actually selected. */
|
|
@@ -526,11 +574,14 @@ const dimmed = (i: number) => selected.value.size > 0 && !selected.value.has(i)
|
|
|
526
574
|
const total = computed(() => resolved.value.total)
|
|
527
575
|
|
|
528
576
|
const selectedArcs = computed(() =>
|
|
529
|
-
[...selected.value]
|
|
577
|
+
[...selected.value]
|
|
578
|
+
.sort((x, y) => x - y)
|
|
579
|
+
.filter((i) => i < arcs.value.length)
|
|
580
|
+
.map((i) => arcs.value[i]),
|
|
530
581
|
)
|
|
531
582
|
|
|
532
583
|
/** The slice under the pointer; null over the gaps, which disables the tip. */
|
|
533
|
-
const hovered = computed(() =>
|
|
584
|
+
const hovered = computed(() => arcs.value[active.value] ?? null)
|
|
534
585
|
|
|
535
586
|
/* Sticky copy for the tooltip's own contents: `hovered` drops to null the
|
|
536
587
|
instant the pointer leaves a slice, and reading it directly would blank the
|
|
@@ -550,10 +601,22 @@ const centreValue = computed(() => {
|
|
|
550
601
|
|
|
551
602
|
const centreLabel = computed(() => {
|
|
552
603
|
if (focused.value >= 0) return arcs.value[focused.value].label
|
|
553
|
-
if (selected.value.size > 1)
|
|
554
|
-
|
|
604
|
+
if (selected.value.size > 1)
|
|
605
|
+
return strings.value.selected.replace("{n}", String(selected.value.size))
|
|
606
|
+
return strings.value.total
|
|
555
607
|
})
|
|
556
608
|
|
|
609
|
+
const summary = computed(
|
|
610
|
+
() =>
|
|
611
|
+
props.ariaLabel ??
|
|
612
|
+
[
|
|
613
|
+
props.title,
|
|
614
|
+
...arcs.value.map((a) => `${a.label}: ${fmt(a.value)} (${pct(a.fraction)})`),
|
|
615
|
+
]
|
|
616
|
+
.filter(Boolean)
|
|
617
|
+
.join(", "),
|
|
618
|
+
)
|
|
619
|
+
|
|
557
620
|
// The pie sets its own gap between chart and legend, which a narrow card has to close up.
|
|
558
621
|
const { class: rootClass, attrs: rest } = useMergedAttrs(
|
|
559
622
|
"flex flex-col gap-3",
|
|
@@ -575,7 +638,7 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
|
|
|
575
638
|
:style="{ width: `${size}px`, height: `${size}px` }"
|
|
576
639
|
>
|
|
577
640
|
<LpIcon name="lucide:chart-pie" :size="18" />
|
|
578
|
-
<span class="text-xs">{{ emptyLabel }}</span>
|
|
641
|
+
<span class="text-xs">{{ emptyLabel ?? strings.empty }}</span>
|
|
579
642
|
</div>
|
|
580
643
|
|
|
581
644
|
<!-- items-start, not items-center: an unfolded legend can be taller than
|
|
@@ -634,16 +697,21 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
|
|
|
634
697
|
</span>
|
|
635
698
|
</LpShift>
|
|
636
699
|
</template>
|
|
700
|
+
<!-- The canvas keeps its natural size where there is room and scales
|
|
701
|
+
down as a whole where there is not (a phone, a narrow column):
|
|
702
|
+
the callout labels widen the box well past the circle, and at a
|
|
703
|
+
fixed width they ran off the screen. -->
|
|
637
704
|
<div
|
|
638
|
-
class="relative shrink-0"
|
|
639
|
-
:style="{ width: `${canvasWidth}px`,
|
|
705
|
+
class="relative max-w-full shrink-0 max-sm:mx-auto"
|
|
706
|
+
:style="{ width: `${canvasWidth}px`, aspectRatio: `${canvasWidth} / ${canvasHeight}` }"
|
|
640
707
|
>
|
|
641
708
|
<!-- Clicking the empty middle (or the gaps) clears, so a selection can
|
|
642
709
|
be dropped without hunting for somewhere outside the chart. -->
|
|
643
710
|
<svg
|
|
644
|
-
:
|
|
645
|
-
|
|
646
|
-
|
|
711
|
+
:viewBox="`0 0 ${canvasWidth} ${canvasHeight}`"
|
|
712
|
+
class="block size-full touch-none select-none"
|
|
713
|
+
role="img"
|
|
714
|
+
:aria-label="summary"
|
|
647
715
|
@pointerleave="leaveChart"
|
|
648
716
|
@pointerup="endDrag"
|
|
649
717
|
@click.self="clearSelection"
|
|
@@ -672,7 +740,7 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
|
|
|
672
740
|
<g :clip-path="animate ? `url(#${sweepId}-sweep)` : undefined">
|
|
673
741
|
<path
|
|
674
742
|
v-for="(a, i) in arcs"
|
|
675
|
-
:key="a.label"
|
|
743
|
+
:key="`${i}-${a.label}`"
|
|
676
744
|
:d="a.d"
|
|
677
745
|
:fill="a.color"
|
|
678
746
|
class="pointer-events-none transition-[transform,opacity] duration-medium ease-[var(--ease-emphasized)] motion-reduce:transition-none"
|
|
@@ -684,7 +752,7 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
|
|
|
684
752
|
<!-- Invisible, unmoving, and on top: the actual hit area. -->
|
|
685
753
|
<path
|
|
686
754
|
v-for="(a, i) in arcs"
|
|
687
|
-
:key="`hit-${a.label}`"
|
|
755
|
+
:key="`hit-${i}-${a.label}`"
|
|
688
756
|
:d="a.d"
|
|
689
757
|
fill="transparent"
|
|
690
758
|
class="cursor-pointer"
|
|
@@ -765,7 +833,7 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
|
|
|
765
833
|
<div v-if="legendShown" class="flex min-w-0 flex-col gap-1.5" @pointerup="endDrag">
|
|
766
834
|
<button
|
|
767
835
|
v-for="(a, i) in arcs"
|
|
768
|
-
:key="a.label"
|
|
836
|
+
:key="`${i}-${a.label}`"
|
|
769
837
|
type="button"
|
|
770
838
|
class="group flex cursor-pointer items-center gap-2 rounded-md px-1 py-0.5 text-xs outline-none transition-[opacity,background-color] duration-fast focus-visible:ring-2 focus-visible:ring-ring"
|
|
771
839
|
:class="[dimmed(i) ? 'opacity-45' : '', isSelected(i) ? 'bg-surface-soft' : '']"
|
|
@@ -773,6 +841,9 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
|
|
|
773
841
|
@pointerenter="onSlicePointerEnter(i)"
|
|
774
842
|
@pointerleave="onSlicePointerLeave(i)"
|
|
775
843
|
@pointerdown="onSlicePointerDown(i, $event)"
|
|
844
|
+
@click="onLegendClick(i, $event)"
|
|
845
|
+
@focus="active = i"
|
|
846
|
+
@blur="active === i && (active = -1)"
|
|
776
847
|
@contextmenu="onSliceContextMenu(i)"
|
|
777
848
|
>
|
|
778
849
|
<span
|
|
@@ -789,5 +860,16 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
|
|
|
789
860
|
</div>
|
|
790
861
|
</div>
|
|
791
862
|
</LpContextMenu>
|
|
863
|
+
|
|
864
|
+
<table v-if="dataTable && hasData" class="sr-only">
|
|
865
|
+
<caption v-if="title">{{ title }}</caption>
|
|
866
|
+
<tbody>
|
|
867
|
+
<tr v-for="(a, i) in arcs" :key="`${i}-${a.label}`">
|
|
868
|
+
<th scope="row">{{ a.label }}</th>
|
|
869
|
+
<td>{{ fmt(a.value) }}</td>
|
|
870
|
+
<td>{{ pct(a.fraction) }}</td>
|
|
871
|
+
</tr>
|
|
872
|
+
</tbody>
|
|
873
|
+
</table>
|
|
792
874
|
</div>
|
|
793
875
|
</template>
|
|
@@ -14,6 +14,8 @@ withDefaults(
|
|
|
14
14
|
sideOffset?: number
|
|
15
15
|
/** Extra classes for the floating panel (width, padding, overflow). */
|
|
16
16
|
panelClass?: string
|
|
17
|
+
/** Accessible name of the panel, which reka exposes as a dialog. */
|
|
18
|
+
ariaLabel?: string
|
|
17
19
|
}>(),
|
|
18
20
|
{ side: "bottom", align: "center", sideOffset: 6 },
|
|
19
21
|
)
|
|
@@ -30,9 +32,11 @@ const open = defineModel<boolean>("open")
|
|
|
30
32
|
</PopoverTrigger>
|
|
31
33
|
<PopoverPortal>
|
|
32
34
|
<PopoverContent
|
|
35
|
+
:collision-padding="8"
|
|
33
36
|
:side="side"
|
|
34
37
|
:align="align"
|
|
35
38
|
:side-offset="sideOffset"
|
|
39
|
+
:aria-label="ariaLabel"
|
|
36
40
|
:class="[POPOVER_PANEL, 'z-(--z-popover) w-64 rounded-card p-3 text-sm text-ink outline-none', panelClass]"
|
|
37
41
|
>
|
|
38
42
|
<slot />
|
|
@@ -166,9 +166,11 @@ watch(
|
|
|
166
166
|
() => runSweep(props.value, props.duration),
|
|
167
167
|
)
|
|
168
168
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
)
|
|
169
|
+
// A zero or missing max (no quota known yet) reads as empty, not as NaN%.
|
|
170
|
+
const pct = computed(() => {
|
|
171
|
+
const ratio = props.max > 0 ? (shown.value / props.max) * 100 : 0
|
|
172
|
+
return Number.isFinite(ratio) ? Math.max(0, Math.min(100, ratio)) : 0
|
|
173
|
+
})
|
|
172
174
|
|
|
173
175
|
/*
|
|
174
176
|
* The tone actually painted. `auto` reads the fill and crosses two thresholds;
|
|
@@ -7,6 +7,7 @@ export default { inheritAttrs: false }
|
|
|
7
7
|
|
|
8
8
|
<script setup lang="ts">
|
|
9
9
|
import { RadioGroupIndicator, RadioGroupItem, RadioGroupRoot } from "reka-ui"
|
|
10
|
+
import { useFieldControl } from "../composables/useField"
|
|
10
11
|
import { useMergedAttrs } from "../composables/useMergedClass"
|
|
11
12
|
|
|
12
13
|
export interface RadioOption {
|
|
@@ -17,9 +18,11 @@ export interface RadioOption {
|
|
|
17
18
|
// `options` renders simple {value,label} rows. For rich items (icons, badges,
|
|
18
19
|
// multi-line) pass <LpRadio> children in the default slot instead — they share
|
|
19
20
|
// the same RadioGroupRoot, so selection still flows through v-model.
|
|
20
|
-
defineProps<{ modelValue?: string; options?: RadioOption[]; disabled?: boolean }>()
|
|
21
|
+
const props = defineProps<{ modelValue?: string; options?: RadioOption[]; disabled?: boolean }>()
|
|
21
22
|
defineEmits<{ (e: "update:modelValue", value: string): void }>()
|
|
22
23
|
|
|
24
|
+
const field = useFieldControl(() => ({ wrapped: false, disabled: props.disabled }))
|
|
25
|
+
|
|
23
26
|
// A radio group stacks with a fixed gap; a dense settings list needs it smaller, and a horizontal layout needs it gone.
|
|
24
27
|
const { class: rootClass, attrs: rest } = useMergedAttrs(
|
|
25
28
|
"flex flex-col gap-2",
|
|
@@ -29,7 +32,11 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
|
|
|
29
32
|
<template>
|
|
30
33
|
<RadioGroupRoot
|
|
31
34
|
:model-value="modelValue"
|
|
32
|
-
:disabled="disabled"
|
|
35
|
+
:disabled="field.disabled"
|
|
36
|
+
:required="field.required"
|
|
37
|
+
:aria-labelledby="field.labelId"
|
|
38
|
+
:aria-describedby="field.describedBy"
|
|
39
|
+
:aria-invalid="field.invalid || undefined"
|
|
33
40
|
:class="rootClass"
|
|
34
41
|
v-bind="rest"
|
|
35
42
|
@update:model-value="(v) => $emit('update:modelValue', v as string)"
|