@feugene/granularity 0.49.0 → 0.50.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 +3 -3
- package/dist/chunks/chevron-up-BhW6hi8L.js +23 -0
- package/dist/chunks/chevron-up-BhW6hi8L.js.map +1 -0
- package/dist/chunks/{config-E1cTyRVV.js → config-8n1VR0ju.js} +1 -1
- package/dist/chunks/{config-E1cTyRVV.js.map → config-8n1VR0ju.js.map} +1 -1
- package/dist/chunks/{config-DIDz_E5m.js → config-B34mkd53.js} +66 -1
- package/dist/chunks/config-B34mkd53.js.map +1 -0
- package/dist/chunks/{config-B5SBUa6u.js → config-B7qZqiUB.js} +28 -1
- package/dist/chunks/config-B7qZqiUB.js.map +1 -0
- package/dist/chunks/config-BBrPUEye.js +8 -0
- package/dist/chunks/config-BBrPUEye.js.map +1 -0
- package/dist/chunks/{config-CT4lP6S4.js → config-BOCzHqWh.js} +2 -2
- package/dist/chunks/{config-CT4lP6S4.js.map → config-BOCzHqWh.js.map} +1 -1
- package/dist/chunks/{config-iemgzS4x.js → config-BP1ktzwh.js} +2 -24
- package/dist/chunks/config-BP1ktzwh.js.map +1 -0
- package/dist/chunks/config-BTxmdRzT.js +28 -0
- package/dist/chunks/config-BTxmdRzT.js.map +1 -0
- package/dist/chunks/{config-CjWOTgLL.js → config-Bk52xd5l.js} +12 -5
- package/dist/chunks/config-Bk52xd5l.js.map +1 -0
- package/dist/chunks/{config-D3HOuHDe.js → config-C3SqBqSQ.js} +3 -1
- package/dist/chunks/config-C3SqBqSQ.js.map +1 -0
- package/dist/chunks/{config-2ZHRsdOc.js → config-C3uqd-sW.js} +1 -1
- package/dist/chunks/config-C3uqd-sW.js.map +1 -0
- package/dist/chunks/{config-BXRmsn3t.js → config-CPhcZzHi.js} +72 -10
- package/dist/chunks/config-CPhcZzHi.js.map +1 -0
- package/dist/chunks/config-CWtfxkM9.js.map +1 -1
- package/dist/chunks/{config--t2dxj0t.js → config-CmLTCmY9.js} +2 -2
- package/dist/chunks/{config--t2dxj0t.js.map → config-CmLTCmY9.js.map} +1 -1
- package/dist/chunks/{config-BAse0laT.js → config-CvtqB4ki.js} +8 -3
- package/dist/chunks/config-CvtqB4ki.js.map +1 -0
- package/dist/chunks/{config-BcXX7S7B.js → config-D-JgqV0J.js} +5 -1
- package/dist/chunks/{config-BcXX7S7B.js.map → config-D-JgqV0J.js.map} +1 -1
- package/dist/chunks/{config-BHLMTJaR.js → config-D1oVht-E.js} +8 -3
- package/dist/chunks/config-D1oVht-E.js.map +1 -0
- package/dist/chunks/{config-B42iJ48O.js → config-DG41PD9i.js} +13 -1
- package/dist/chunks/config-DG41PD9i.js.map +1 -0
- package/dist/chunks/{config-Bs1HwUcx.js → config-DPJ3jtiB.js} +12 -2
- package/dist/chunks/config-DPJ3jtiB.js.map +1 -0
- package/dist/chunks/{config-tNqtapcT.js → config-DpqjlCfB.js} +2 -2
- package/dist/chunks/{config-tNqtapcT.js.map → config-DpqjlCfB.js.map} +1 -1
- package/dist/chunks/{config-DNDgp9bB.js → config-DpzFoSIh.js} +64 -2
- package/dist/chunks/config-DpzFoSIh.js.map +1 -0
- package/dist/chunks/config-SPugeaHT.js +37 -0
- package/dist/chunks/config-SPugeaHT.js.map +1 -0
- package/dist/chunks/{en-CsQUoBS2.js → en-mIFywnV2.js} +22 -6
- package/dist/chunks/en-mIFywnV2.js.map +1 -0
- package/dist/chunks/{es-9nbkPvdA.js → es-CvthYwtB.js} +22 -6
- package/dist/chunks/es-CvthYwtB.js.map +1 -0
- package/dist/chunks/{es-DrUz5J6I.js → es-DlGd6Mrj.js} +3 -3
- package/dist/chunks/{es-DrUz5J6I.js.map → es-DlGd6Mrj.js.map} +1 -1
- package/dist/chunks/{generated-CxvC5O0V.js → generated-Cx4C7GRN.js} +84 -0
- package/dist/chunks/{generated-CxvC5O0V.js.map → generated-Cx4C7GRN.js.map} +1 -1
- package/dist/chunks/{grPopoverStyles-CYAeO3Ov.js → grPopoverStyles-CncEkiPu.js} +1 -1
- package/dist/chunks/{grPopoverStyles-CYAeO3Ov.js.map → grPopoverStyles-CncEkiPu.js.map} +1 -1
- package/dist/chunks/{grSelectStyles-D9EQ-pgK.js → grSelectStyles-Cam-IG9s.js} +3 -2
- package/dist/chunks/grSelectStyles-Cam-IG9s.js.map +1 -0
- package/dist/chunks/{grSliderStyles-kaz6VXZ3.js → grSliderStyles-CqzV0hll.js} +1 -1
- package/dist/chunks/grSliderStyles-CqzV0hll.js.map +1 -0
- package/dist/chunks/{config-CbEbLyDE.js → grSortableListStyles-CxieDmpe.js} +1 -27
- package/dist/chunks/grSortableListStyles-CxieDmpe.js.map +1 -0
- package/dist/chunks/grTableStyles-CPSxDTOW.js +66 -0
- package/dist/chunks/grTableStyles-CPSxDTOW.js.map +1 -0
- package/dist/chunks/{config-CMNfZO7S.js → grTabsStyles-DIz2VdIm.js} +1 -36
- package/dist/chunks/grTabsStyles-DIz2VdIm.js.map +1 -0
- package/dist/chunks/grTooltipStyles-CtbGEEGV.js +24 -0
- package/dist/chunks/grTooltipStyles-CtbGEEGV.js.map +1 -0
- package/dist/chunks/{granular-provider-B6xomapW.js → granular-provider-cv5vaM1a.js} +21 -19
- package/dist/chunks/granular-provider-cv5vaM1a.js.map +1 -0
- package/dist/chunks/hotkeySequence-BTHIM_5A.js +46 -0
- package/dist/chunks/hotkeySequence-BTHIM_5A.js.map +1 -0
- package/dist/chunks/{keyboard-DE2yhz_b.js → keyboard-BiFSgWLt.js} +70 -1
- package/dist/chunks/keyboard-BiFSgWLt.js.map +1 -0
- package/dist/chunks/optionPanel-DvY7Tv_4.js +182 -0
- package/dist/chunks/optionPanel-DvY7Tv_4.js.map +1 -0
- package/dist/chunks/overlayListPanel-D91jBCHU.js +21 -0
- package/dist/chunks/overlayListPanel-D91jBCHU.js.map +1 -0
- package/dist/chunks/{overlayStack-DH4Z7am1.js → overlayStack-DCkCgXZP.js} +1 -1
- package/dist/chunks/{overlayStack-DH4Z7am1.js.map → overlayStack-DCkCgXZP.js.map} +1 -1
- package/dist/chunks/{overlayPanelSurface-BKeMhRx4.js → overlayTransition-C0FDMx7Q.js} +24 -24
- package/dist/chunks/overlayTransition-C0FDMx7Q.js.map +1 -0
- package/dist/chunks/{ru-88i1WG0b.js → ru-CQKDR-kD.js} +22 -6
- package/dist/chunks/ru-CQKDR-kD.js.map +1 -0
- package/dist/chunks/{useMenuItemsFocus-B7Bl_aFA.js → useMenuItemsFocus-C031blYS.js} +1 -1
- package/dist/chunks/{useMenuItemsFocus-B7Bl_aFA.js.map → useMenuItemsFocus-C031blYS.js.map} +1 -1
- package/dist/chunks/{useModalOverlay-ACRkflzx.js → useModalOverlay-CKCQkGdB.js} +1 -1
- package/dist/chunks/{useModalOverlay-ACRkflzx.js.map → useModalOverlay-CKCQkGdB.js.map} +1 -1
- package/dist/components/GrAutocomplete/chunks/{GrAutocomplete-Chhw65pI.js → GrAutocomplete-Cyr1-ENw.js} +181 -123
- package/dist/components/GrAutocomplete/chunks/GrAutocomplete-Cyr1-ENw.js.map +1 -0
- package/dist/components/GrAutocomplete/index.js +2 -2
- package/dist/components/GrAutocomplete/styles.css +1 -1
- package/dist/components/GrCarousel/chunks/{GrCarousel-ByuughtI.js → GrCarousel-CBj-PEPB.js} +186 -37
- package/dist/components/GrCarousel/chunks/GrCarousel-CBj-PEPB.js.map +1 -0
- package/dist/components/GrCarousel/index.js +2 -2
- package/dist/components/GrCarousel/styles.css +1 -1
- package/dist/components/GrCheckbox/chunks/{GrCheckbox-Dp201frb.js → GrCheckbox-B4NJc7Ur.js} +2 -1
- package/dist/components/GrCheckbox/chunks/GrCheckbox-B4NJc7Ur.js.map +1 -0
- package/dist/components/GrCheckbox/index.js +1 -1
- package/dist/components/GrCheckboxGroup/chunks/{GrCheckboxGroup-IpqG5qwm.js → GrCheckboxGroup-qZHpNFCX.js} +1 -1
- package/dist/components/GrCheckboxGroup/chunks/{GrCheckboxGroup-IpqG5qwm.js.map → GrCheckboxGroup-qZHpNFCX.js.map} +1 -1
- package/dist/components/GrCheckboxGroup/index.js +1 -1
- package/dist/components/GrColorPicker/chunks/{GrColorPicker-BRM_4lyI.js → GrColorPicker-vGSgpUV9.js} +353 -38
- package/dist/components/GrColorPicker/chunks/GrColorPicker-vGSgpUV9.js.map +1 -0
- package/dist/components/GrColorPicker/index.js +2 -2
- package/dist/components/GrColorPicker/styles.css +1 -1
- package/dist/components/GrCommandPalette/chunks/{GrCommandPalette-BJHmkDQv.js → GrCommandPalette-CAHgj0Aa.js} +23 -7
- package/dist/components/GrCommandPalette/chunks/GrCommandPalette-CAHgj0Aa.js.map +1 -0
- package/dist/components/GrCommandPalette/index.js +1 -1
- package/dist/components/GrCommandPalette/styles.css +1 -1
- package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-BzUQwbec.js → GrConfirmDialog-dg021BMd.js} +1 -1
- package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-BzUQwbec.js.map → GrConfirmDialog-dg021BMd.js.map} +1 -1
- package/dist/components/GrConfirmDialog/index.js +1 -1
- package/dist/components/GrContextMenu/chunks/{GrContextMenu-RpxMHQXH.js → GrContextMenu-bQ1Vvy2c.js} +3 -3
- package/dist/components/GrContextMenu/chunks/{GrContextMenu-RpxMHQXH.js.map → GrContextMenu-bQ1Vvy2c.js.map} +1 -1
- package/dist/components/GrContextMenu/index.js +1 -1
- package/dist/components/GrDataTable/chunks/{GrDataTable-DQxYYgQk.js → GrDataTable-Bb2jWnRG.js} +576 -136
- package/dist/components/GrDataTable/chunks/GrDataTable-Bb2jWnRG.js.map +1 -0
- package/dist/components/GrDataTable/index.js +2 -2
- package/dist/components/GrDelta/chunks/{GrDelta-CgTvfoIN.js → GrDelta-BSv1KdMy.js} +0 -0
- package/dist/components/GrDelta/chunks/{GrDelta-CgTvfoIN.js.map → GrDelta-BSv1KdMy.js.map} +1 -1
- package/dist/components/GrDelta/index.js +2 -2
- package/dist/components/GrDialog/chunks/{GrDialog-DDz_OEhk.js → GrDialog-C9Zu72jB.js} +1 -1
- package/dist/components/GrDialog/chunks/{GrDialog-DDz_OEhk.js.map → GrDialog-C9Zu72jB.js.map} +1 -1
- package/dist/components/GrDialog/index.js +1 -1
- package/dist/components/GrDialogService/chunks/{GrDialogService-Dtq0ZCN5.js → GrDialogService-DLBifO61.js} +2 -2
- package/dist/components/GrDialogService/chunks/{GrDialogService-Dtq0ZCN5.js.map → GrDialogService-DLBifO61.js.map} +1 -1
- package/dist/components/GrDialogService/index.js +1 -1
- package/dist/components/GrDrawer/chunks/{GrDrawer-CNpSMuN-.js → GrDrawer-DOcRTE8G.js} +1 -1
- package/dist/components/GrDrawer/chunks/{GrDrawer-CNpSMuN-.js.map → GrDrawer-DOcRTE8G.js.map} +1 -1
- package/dist/components/GrDrawer/index.js +1 -1
- package/dist/components/GrDropdown/chunks/{GrDropdown-cLZuZMEY.js → GrDropdown-kxwmgfSe.js} +2 -2
- package/dist/components/GrDropdown/chunks/{GrDropdown-cLZuZMEY.js.map → GrDropdown-kxwmgfSe.js.map} +1 -1
- package/dist/components/GrDropdown/index.js +2 -2
- package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu-Dxkz_ry4.js → GrDropdownMenu--VoK3VY0.js} +3 -34
- package/dist/components/GrDropdownMenu/chunks/GrDropdownMenu--VoK3VY0.js.map +1 -0
- package/dist/components/GrDropdownMenu/chunks/GrDropdownMenu-CkM3BFPL.js +34 -0
- package/dist/components/GrDropdownMenu/chunks/GrDropdownMenu-CkM3BFPL.js.map +1 -0
- package/dist/components/GrDropdownMenu/index.js +2 -1
- package/dist/components/GrEmptyState/chunks/{GrEmptyState-BbvwE-E0.js → GrEmptyState-Bz6-_ED4.js} +42 -6
- package/dist/components/GrEmptyState/chunks/GrEmptyState-Bz6-_ED4.js.map +1 -0
- package/dist/components/GrEmptyState/index.js +1 -1
- package/dist/components/GrFileUpload/chunks/{GrFileUpload-BwMR71zN.js → GrFileUpload-Bgdfnkd8.js} +5 -2
- package/dist/components/GrFileUpload/chunks/GrFileUpload-Bgdfnkd8.js.map +1 -0
- package/dist/components/GrFileUpload/index.js +1 -1
- package/dist/components/GrFormFile/chunks/{GrFormFile-Dlxx-9zi.js → GrFormFile-Ctq1isz-.js} +78 -11
- package/dist/components/GrFormFile/chunks/GrFormFile-Ctq1isz-.js.map +1 -0
- package/dist/components/GrFormFile/index.js +2 -2
- package/dist/components/GrFormFile/styles.css +1 -1
- package/dist/components/GrImageViewer/chunks/{GrImageViewer-DK-iVHHC.js → GrImageViewer-Bnql_dNP.js} +1 -1
- package/dist/components/GrImageViewer/chunks/{GrImageViewer-DK-iVHHC.js.map → GrImageViewer-Bnql_dNP.js.map} +1 -1
- package/dist/components/GrImageViewer/index.js +1 -1
- package/dist/components/GrInput/chunks/{GrInput-DV4gMWPR.js → GrInput-CoaFLpaU.js} +43 -22
- package/dist/components/GrInput/chunks/GrInput-CoaFLpaU.js.map +1 -0
- package/dist/components/GrInput/index.js +1 -1
- package/dist/components/GrInputTag/chunks/{GrInputTag-qnRdAZnn.js → GrInputTag-BzzNRBe3.js} +245 -18
- package/dist/components/GrInputTag/chunks/GrInputTag-BzzNRBe3.js.map +1 -0
- package/dist/components/GrInputTag/index.js +2 -2
- package/dist/components/GrJsonViewer/chunks/{GrJsonViewer-D7CyWzhT.js → GrJsonViewer-B6ZJ3GFH.js} +2 -2
- package/dist/components/GrJsonViewer/chunks/{GrJsonViewer-D7CyWzhT.js.map → GrJsonViewer-B6ZJ3GFH.js.map} +1 -1
- package/dist/components/GrJsonViewer/index.js +1 -1
- package/dist/components/GrKbd/chunks/{GrKbd-BNMeoaLV.js → GrKbd-D2rHDkQv.js} +42 -37
- package/dist/components/GrKbd/chunks/GrKbd-D2rHDkQv.js.map +1 -0
- package/dist/components/GrKbd/index.js +1 -1
- package/dist/components/GrModal/chunks/{GrModal-Cm0mtSXk.js → GrModal-SHb1U2qx.js} +1 -1
- package/dist/components/GrModal/chunks/{GrModal-Cm0mtSXk.js.map → GrModal-SHb1U2qx.js.map} +1 -1
- package/dist/components/GrModal/index.js +1 -1
- package/dist/components/GrNavbar/chunks/{GrNavbar-BRGuksiy.js → GrNavbar-IEIHC5Vt.js} +10 -4
- package/dist/components/GrNavbar/chunks/GrNavbar-IEIHC5Vt.js.map +1 -0
- package/dist/components/GrNavbar/index.js +2 -2
- package/dist/components/GrNumberInput/chunks/{GrNumberInput-BI6-vkcs.js → GrNumberInput-CmnUDaKi.js} +2 -22
- package/dist/components/GrNumberInput/chunks/{GrNumberInput-BI6-vkcs.js.map → GrNumberInput-CmnUDaKi.js.map} +1 -1
- package/dist/components/GrNumberInput/index.js +1 -1
- package/dist/components/GrPagination/chunks/{GrPagination-CMrLPzvL.js → GrPagination-AMbn5D8I.js} +1 -1
- package/dist/components/GrPagination/chunks/{GrPagination-CMrLPzvL.js.map → GrPagination-AMbn5D8I.js.map} +1 -1
- package/dist/components/GrPagination/index.js +1 -1
- package/dist/components/GrPopover/chunks/{GrPopover-CcWvr1ZA.js → GrPopover-DjVxt8bf.js} +3 -3
- package/dist/components/GrPopover/chunks/{GrPopover-CcWvr1ZA.js.map → GrPopover-DjVxt8bf.js.map} +1 -1
- package/dist/components/GrPopover/index.js +2 -2
- package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-BEL-QgwE.js → GrPromptDialog-BhbIZP1f.js} +3 -3
- package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-BEL-QgwE.js.map → GrPromptDialog-BhbIZP1f.js.map} +1 -1
- package/dist/components/GrPromptDialog/index.js +1 -1
- package/dist/components/GrSelect/chunks/{GrSelect-DvSq-nV-.js → GrSelect-B-ykrHpL.js} +24 -180
- package/dist/components/GrSelect/chunks/GrSelect-B-ykrHpL.js.map +1 -0
- package/dist/components/GrSelect/index.js +2 -2
- package/dist/components/GrSelect/styles.css +1 -1
- package/dist/components/GrSidebar/chunks/GrSidebar-jVvoLGDO.js +543 -0
- package/dist/components/GrSidebar/chunks/GrSidebar-jVvoLGDO.js.map +1 -0
- package/dist/components/GrSidebar/index.js +2 -2
- package/dist/components/GrSlider/chunks/{GrSlider-CO8N9SF6.js → GrSlider-DF2Cq0rV.js} +29 -4
- package/dist/components/GrSlider/chunks/GrSlider-DF2Cq0rV.js.map +1 -0
- package/dist/components/GrSlider/index.js +2 -2
- package/dist/components/GrSortableList/chunks/{GrSortableList-NKriuGm_.js → GrSortableList-ChH9nQBv.js} +1 -1
- package/dist/components/GrSortableList/chunks/{GrSortableList-NKriuGm_.js.map → GrSortableList-ChH9nQBv.js.map} +1 -1
- package/dist/components/GrSortableList/index.js +2 -2
- package/dist/components/GrTabPanels/chunks/GrTabPanels-BDt5oVdd.js +30 -0
- package/dist/components/GrTabPanels/chunks/GrTabPanels-BDt5oVdd.js.map +1 -0
- package/dist/components/GrTabPanels/chunks/GrTabPanels-BJvAflnA.js +83 -0
- package/dist/components/GrTabPanels/chunks/GrTabPanels-BJvAflnA.js.map +1 -0
- package/dist/components/GrTabPanels/index.js +2 -1
- package/dist/components/GrTable/chunks/{GrTable-CKJ-HrsN.js → GrTable-BQitSDep.js} +52 -16
- package/dist/components/GrTable/chunks/GrTable-BQitSDep.js.map +1 -0
- package/dist/components/GrTable/index.js +2 -2
- package/dist/components/GrTabs/chunks/{GrTabs-s9RzC1WX.js → GrTabs-DVC6nfWB.js} +1 -1
- package/dist/components/GrTabs/chunks/{GrTabs-s9RzC1WX.js.map → GrTabs-DVC6nfWB.js.map} +1 -1
- package/dist/components/GrTabs/index.js +2 -2
- package/dist/components/GrTabsWithPanels/chunks/GrTabsWithPanels-BYtuzouj.js +98 -0
- package/dist/components/GrTabsWithPanels/chunks/GrTabsWithPanels-BYtuzouj.js.map +1 -0
- package/dist/components/GrTabsWithPanels/index.js +3 -0
- package/dist/components/GrTextarea/chunks/{GrTextarea-Bfgc0DD2.js → GrTextarea-BFwyqcHB.js} +22 -5
- package/dist/components/GrTextarea/chunks/GrTextarea-BFwyqcHB.js.map +1 -0
- package/dist/components/GrTextarea/index.js +1 -1
- package/dist/components/GrToaster/chunks/{GrToaster-CZixNk0l.js → GrToaster-OzT1VKcp.js} +163 -32
- package/dist/components/GrToaster/chunks/GrToaster-OzT1VKcp.js.map +1 -0
- package/dist/components/GrToaster/index.js +2 -2
- package/dist/components/GrToaster/styles.css +1 -1
- package/dist/components/GrTooltip/chunks/{GrTooltip-DkMMM0uq.js → GrTooltip-BDcFycvW.js} +26 -13
- package/dist/components/GrTooltip/chunks/GrTooltip-BDcFycvW.js.map +1 -0
- package/dist/components/GrTooltip/index.js +2 -2
- package/dist/components/GrTransfer/chunks/{GrTransfer-DdfBUf35.js → GrTransfer-CV7BL5UK.js} +114 -12
- package/dist/components/GrTransfer/chunks/GrTransfer-CV7BL5UK.js.map +1 -0
- package/dist/components/GrTransfer/index.js +1 -1
- package/dist/components/GrTransfer/styles.css +1 -1
- package/dist/components/GrTree/chunks/{GrTree-6yZrncJE.js → GrTree-DpgaP8hk.js} +39 -1
- package/dist/components/GrTree/chunks/GrTree-DpgaP8hk.js.map +1 -0
- package/dist/components/GrTree/index.js +1 -1
- package/dist/components/GrTree/styles.css +1 -1
- package/dist/components/GrTreeSections/chunks/{GrTreeSections-DcmDcLwj.js → GrTreeSections-BeOj__44.js} +1 -1
- package/dist/components/GrTreeSections/chunks/{GrTreeSections-DcmDcLwj.js.map → GrTreeSections-BeOj__44.js.map} +1 -1
- package/dist/components/GrTreeSections/index.js +1 -1
- package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-B6KoDYiZ.js → GrTreeSelect-BHq-T8wH.js} +113 -14
- package/dist/components/GrTreeSelect/chunks/GrTreeSelect-BHq-T8wH.js.map +1 -0
- package/dist/components/GrTreeSelect/index.js +2 -2
- package/dist/composables/useFloating.js +1 -1
- package/dist/composables/useHotkeys.js +89 -0
- package/dist/composables/useHotkeys.js.map +1 -0
- package/dist/composables/useOverlayLayer.js +1 -1
- package/dist/directives/hotkey.js +19 -46
- package/dist/directives/hotkey.js.map +1 -1
- package/dist/granular-provider-node.js +1 -1
- package/dist/granular-provider.js +1 -1
- package/dist/i18n/all.js +1 -1
- package/dist/i18n/index.js +1 -1
- package/dist/index.js +71 -63
- package/dist/theme.js +1 -1
- package/dist/tokens.js +1 -1
- package/dist/types/components/GrAutocomplete/GrAutocomplete.vue.d.ts +4 -4
- package/dist/types/components/GrAutocomplete/composables/useAutocompleteNavigation.d.ts +12 -3
- package/dist/types/components/GrAutocomplete/composables/useAutocompletePanel.d.ts +12 -2
- package/dist/types/components/GrAutocomplete/composables/useAutocompleteValues.d.ts +7 -4
- package/dist/types/components/GrAutocomplete/composables/useRemoteOptions.d.ts +4 -4
- package/dist/types/components/GrAutocomplete/grAutocompleteStyles.d.ts +15 -1
- package/dist/types/components/GrAutocomplete/index.d.ts +1 -1
- package/dist/types/components/GrCarousel/GrCarousel.vue.d.ts +29 -1
- package/dist/types/components/GrCarousel/composables/useCarouselSwipe.d.ts +5 -0
- package/dist/types/components/GrCarousel/grCarouselContext.d.ts +21 -0
- package/dist/types/components/GrCarousel/grCarouselStyles.d.ts +39 -9
- package/dist/types/components/GrCheckbox/GrCheckbox.vue.d.ts +13 -0
- package/dist/types/components/GrColorPicker/GrColorPicker.vue.d.ts +18 -2
- package/dist/types/components/GrColorPicker/color.d.ts +13 -1
- package/dist/types/components/GrColorPicker/colorArea.d.ts +59 -0
- package/dist/types/components/GrColorPicker/defaults.d.ts +3 -1
- package/dist/types/components/GrColorPicker/eyeDropper.d.ts +21 -0
- package/dist/types/components/GrColorPicker/grColorPickerStyles.d.ts +42 -0
- package/dist/types/components/GrCommandPalette/GrCommandPalette.vue.d.ts +10 -1
- package/dist/types/components/GrDataTable/GrDataTable.vue.d.ts +41 -1
- package/dist/types/components/GrDataTable/composables/useDataTableGridNavigation.d.ts +53 -0
- package/dist/types/components/GrDataTable/grDataTableStyles.d.ts +8 -0
- package/dist/types/components/GrDataTable/index.d.ts +1 -1
- package/dist/types/components/GrDelta/grDeltaStyles.d.ts +10 -3
- package/dist/types/components/GrEmptyState/GrEmptyState.vue.d.ts +11 -2
- package/dist/types/components/GrEmptyState/grEmptyStateStyles.d.ts +10 -0
- package/dist/types/components/GrEmptyState/index.d.ts +1 -1
- package/dist/types/components/GrFileUpload/GrFileUpload.vue.d.ts +2 -1
- package/dist/types/components/GrFormFile/GrFormFile.vue.d.ts +10 -0
- package/dist/types/components/GrInput/GrInput.vue.d.ts +15 -0
- package/dist/types/components/GrInputTag/GrInputTag.vue.d.ts +16 -0
- package/dist/types/components/GrInputTag/grInputTagStyles.d.ts +11 -0
- package/dist/types/components/GrKbd/GrKbd.vue.d.ts +14 -0
- package/dist/types/components/GrNavbar/GrNavbar.vue.d.ts +18 -0
- package/dist/types/components/GrNavbar/grNavbarStyles.d.ts +10 -1
- package/dist/types/components/GrNavbar/index.d.ts +1 -0
- package/dist/types/components/GrSelect/composables/useSelectPanelItems.d.ts +8 -34
- package/dist/types/components/GrSelect/composables/useSelectVirtualization.d.ts +7 -0
- package/dist/types/components/GrSelect/grSelectStyles.d.ts +1 -1
- package/dist/types/components/GrSidebar/GrSidebar.vue.d.ts +20 -0
- package/dist/types/components/GrSidebar/GrSidebarItem.vue.d.ts +39 -5
- package/dist/types/components/GrSidebar/grSidebarStyles.d.ts +32 -0
- package/dist/types/components/GrSidebar/index.d.ts +1 -1
- package/dist/types/components/GrSidebar/sidebarContext.d.ts +23 -1
- package/dist/types/components/GrSlider/GrSlider.vue.d.ts +39 -1
- package/dist/types/components/GrSlider/grSliderStyles.d.ts +1 -1
- package/dist/types/components/GrTabPanels/context.d.ts +6 -0
- package/dist/types/components/GrTable/GrTable.vue.d.ts +37 -0
- package/dist/types/components/GrTable/grTableStyles.d.ts +16 -7
- package/dist/types/components/GrTabsWithPanels/GrTabsWithPanels.vue.d.ts +77 -0
- package/dist/types/components/GrTabsWithPanels/config.d.ts +1 -0
- package/dist/types/components/GrTabsWithPanels/index.d.ts +4 -0
- package/dist/types/components/GrTextarea/GrTextarea.vue.d.ts +19 -1
- package/dist/types/components/GrToaster/GrToaster.vue.d.ts +12 -0
- package/dist/types/components/GrToaster/grToasterStyles.d.ts +26 -0
- package/dist/types/components/GrTooltip/GrTooltip.vue.d.ts +22 -0
- package/dist/types/components/GrTransfer/GrTransfer.vue.d.ts +23 -0
- package/dist/types/components/GrTreeSelect/grTreeSelectStyles.d.ts +1 -1
- package/dist/types/components/GrTreeSelect/grTreeSelectTypes.d.ts +20 -0
- package/dist/types/components/shared/hotkey.d.ts +8 -9
- package/dist/types/components/shared/optionPanel.d.ts +100 -0
- package/dist/types/components/shared/overlayListPanel.d.ts +18 -0
- package/dist/types/composables/useHotkeys.d.ts +43 -0
- package/dist/types/granular-provider/shared.d.ts +1 -0
- package/dist/types/i18n/messages/en.d.ts +28 -0
- package/dist/types/i18n/messages/es.d.ts +28 -0
- package/dist/types/i18n/messages/ru.d.ts +28 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/internal/hotkeySequence.d.ts +22 -0
- package/dist/types/internal/keyboard.d.ts +45 -0
- package/dist/web-types.json +463 -26
- package/package.json +9 -1
- package/dist/chunks/config-2ZHRsdOc.js.map +0 -1
- package/dist/chunks/config-B42iJ48O.js.map +0 -1
- package/dist/chunks/config-B5SBUa6u.js.map +0 -1
- package/dist/chunks/config-BAse0laT.js.map +0 -1
- package/dist/chunks/config-BHLMTJaR.js.map +0 -1
- package/dist/chunks/config-BXRmsn3t.js.map +0 -1
- package/dist/chunks/config-Bs1HwUcx.js.map +0 -1
- package/dist/chunks/config-CMNfZO7S.js.map +0 -1
- package/dist/chunks/config-CbEbLyDE.js.map +0 -1
- package/dist/chunks/config-CjWOTgLL.js.map +0 -1
- package/dist/chunks/config-D3HOuHDe.js.map +0 -1
- package/dist/chunks/config-DIDz_E5m.js.map +0 -1
- package/dist/chunks/config-DNDgp9bB.js.map +0 -1
- package/dist/chunks/config-iemgzS4x.js.map +0 -1
- package/dist/chunks/en-CsQUoBS2.js.map +0 -1
- package/dist/chunks/es-9nbkPvdA.js.map +0 -1
- package/dist/chunks/grSelectStyles-D9EQ-pgK.js.map +0 -1
- package/dist/chunks/grSliderStyles-kaz6VXZ3.js.map +0 -1
- package/dist/chunks/grTableStyles-DkQPMfx9.js +0 -39
- package/dist/chunks/grTableStyles-DkQPMfx9.js.map +0 -1
- package/dist/chunks/granular-provider-B6xomapW.js.map +0 -1
- package/dist/chunks/keyboard-DE2yhz_b.js.map +0 -1
- package/dist/chunks/overlayPanelSurface-BKeMhRx4.js.map +0 -1
- package/dist/chunks/ru-88i1WG0b.js.map +0 -1
- package/dist/components/GrAutocomplete/chunks/GrAutocomplete-Chhw65pI.js.map +0 -1
- package/dist/components/GrCarousel/chunks/GrCarousel-ByuughtI.js.map +0 -1
- package/dist/components/GrCheckbox/chunks/GrCheckbox-Dp201frb.js.map +0 -1
- package/dist/components/GrColorPicker/chunks/GrColorPicker-BRM_4lyI.js.map +0 -1
- package/dist/components/GrCommandPalette/chunks/GrCommandPalette-BJHmkDQv.js.map +0 -1
- package/dist/components/GrDataTable/chunks/GrDataTable-DQxYYgQk.js.map +0 -1
- package/dist/components/GrDropdownMenu/chunks/GrDropdownMenu-Dxkz_ry4.js.map +0 -1
- package/dist/components/GrEmptyState/chunks/GrEmptyState-BbvwE-E0.js.map +0 -1
- package/dist/components/GrFileUpload/chunks/GrFileUpload-BwMR71zN.js.map +0 -1
- package/dist/components/GrFormFile/chunks/GrFormFile-Dlxx-9zi.js.map +0 -1
- package/dist/components/GrInput/chunks/GrInput-DV4gMWPR.js.map +0 -1
- package/dist/components/GrInputTag/chunks/GrInputTag-qnRdAZnn.js.map +0 -1
- package/dist/components/GrKbd/chunks/GrKbd-BNMeoaLV.js.map +0 -1
- package/dist/components/GrNavbar/chunks/GrNavbar-BRGuksiy.js.map +0 -1
- package/dist/components/GrSelect/chunks/GrSelect-DvSq-nV-.js.map +0 -1
- package/dist/components/GrSidebar/chunks/GrSidebar-DoKLlHSw.js +0 -264
- package/dist/components/GrSidebar/chunks/GrSidebar-DoKLlHSw.js.map +0 -1
- package/dist/components/GrSlider/chunks/GrSlider-CO8N9SF6.js.map +0 -1
- package/dist/components/GrTabPanels/chunks/GrTabPanels-5zsbqS1v.js +0 -92
- package/dist/components/GrTabPanels/chunks/GrTabPanels-5zsbqS1v.js.map +0 -1
- package/dist/components/GrTable/chunks/GrTable-CKJ-HrsN.js.map +0 -1
- package/dist/components/GrTextarea/chunks/GrTextarea-Bfgc0DD2.js.map +0 -1
- package/dist/components/GrToaster/chunks/GrToaster-CZixNk0l.js.map +0 -1
- package/dist/components/GrTooltip/chunks/GrTooltip-DkMMM0uq.js.map +0 -1
- package/dist/components/GrTransfer/chunks/GrTransfer-DdfBUf35.js.map +0 -1
- package/dist/components/GrTree/chunks/GrTree-6yZrncJE.js.map +0 -1
- package/dist/components/GrTreeSelect/chunks/GrTreeSelect-B6KoDYiZ.js.map +0 -1
- package/dist/types/components/GrAutocomplete/composables/useAutocompleteVirtual.d.ts +0 -33
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GrTooltip-BDcFycvW.js","names":[],"sources":["../../../../src/components/GrTooltip/GrTooltip.vue","../../../../src/components/GrTooltip/GrTooltip.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * GrTooltip — GR-примитив инлайн-подсказки на hover/focus.\n *\n * По умолчанию триггер — иконка info; можно заменить через слот.\n * A11y:\n * - `role=\"tooltip\"` связывается с триггером через уникальный `aria-describedby`;\n * - подсказка закрывается по `Escape` (WCAG 1.4.13 «Content on Hover or Focus» —\n * dismissible без необходимости двигать курсор/фокус);\n * - панель не интерактивна (`pointer-events-none`), поэтому «hoverable»-требование\n * того же критерия неприменимо — навести курсор на саму подсказку невозможно.\n *\n * Позиционирование — через общий `useFloating` (см. `composables/internal`):\n * `placement` задаёт предпочтительную сторону, `flip` переворачивает подсказку,\n * если места не хватает, а `shift` не даёт ей вылезти за края viewport.\n */\nimport { computed, onMounted, onUnmounted, onUpdated, ref, useId, useSlots, watchEffect } from 'vue'\n\nimport { usePortalTarget } from '../../composables/usePortalTarget'\n\nimport { vClickOutside } from '../../directives'\nimport GrIcon from '../GrIcon'\nimport { useFloating, type UseFloatingPlacement } from '../../composables/useFloating'\nimport { useDismissible } from '../../composables/useDismissible'\nimport { useGrComponentSize, useGrThemeAttrs } from '../GrConfigProvider/context'\nimport { type GrTooltipSize, panelSizes, panelWidths, triggerIconSizes } from './grTooltipStyles'\n\nimport IconInfo from '~icons/lucide/info'\n\nexport type GrTooltipPlacement = UseFloatingPlacement\n\nexport interface GrTooltipProps {\n /** Текст подсказки. Разметка вместо текста — слот `#content`. */\n text?: string\n /** Цвет триггер-иконки (CSS color). По умолчанию — `var(--gr-muted-fg)`. */\n iconColor?: string\n /** Размер панели и дефолтной триггер-иконки. */\n size?: GrTooltipSize\n /** Предпочтительная сторона панели; `flip` может её изменить. */\n placement?: GrTooltipPlacement\n /** Зазор между триггером и панелью, px. */\n offsetPx?: number\n /** Задержка перед показом, мс. Спасает от мигания при проведении курсором по панели кнопок. */\n openDelay?: number\n /** Задержка перед скрытием, мс. */\n closeDelay?: number\n /** Подсказка не показывается ничем — ни курсором, ни фокусом, ни `v-model:open`. */\n disabled?: boolean\n /** Управляемая видимость. Без неё компонент ведёт видимость сам. */\n open?: boolean\n /**\n * Обёртка занимает ширину родителя вместо ширины содержимого.\n *\n * Нужно там, где триггер обязан тянуться: пункт списка, строка меню, ячейка.\n * `inline-flex` по умолчанию схлопнул бы такой триггер по содержимому, и\n * подсветка с кольцом фокуса сжались бы вместе с ним.\n */\n block?: boolean\n /**\n * Вешать ли `aria-describedby` на триггер. По умолчанию да.\n *\n * `false` — когда подсказка **дословно повторяет** доступное имя триггера:\n * тогда это не описание, а шум, и диктор произносит подпись дважды. Так\n * устроен свёрнутый `GrSidebarItem`: имя у него уже в `aria-label`.\n */\n describeTrigger?: boolean\n}\n\nexport interface GrTooltipEmits {\n (e: 'update:open', value: boolean): void\n}\n\nconst props = withDefaults(defineProps<GrTooltipProps>(), {\n text: undefined,\n iconColor: 'var(--gr-muted-fg)',\n size: undefined,\n placement: 'top',\n offsetPx: undefined,\n openDelay: 0,\n closeDelay: 0,\n disabled: false,\n open: undefined,\n block: false,\n describeTrigger: true,\n})\n\nconst emit = defineEmits<GrTooltipEmits>()\n\ndefineSlots<{\n /** Триггер. По умолчанию — иконка info. */\n default?: () => unknown\n /** Содержимое подсказки; заменяет проп `text`. */\n content?: () => unknown\n}>()\n\nconst slots = useSlots()\n\nconst resolvedSize = useGrComponentSize(() => props.size, { component: 'GrTooltip' })\n\nconst panelClass = computed(() => [\n panelSizes[resolvedSize.value],\n panelWidths[resolvedSize.value],\n].join(' '))\nconst triggerIconSize = computed(() => triggerIconSizes[resolvedSize.value])\n\nconst tooltipId = `gr-tooltip-${useId()}`\n\nconst triggerStyle = computed(() => ({ color: props.iconColor }))\n\n// Телепорт включается только ПОСЛЕ монтирования: иначе первый клиентский\n// рендер не совпадает с серверным и ломается гидрация (см. композабл).\nconst { target: portalTarget, enabled: teleportEnabled } = usePortalTarget()\n\n// Тема поддерева на телепортированную панель: в DOM она уезжает в `body`, то\n// есть вне обёртки провайдера, и `data-theme` с неё не наследуется. В дереве\n// компонентов панель остаётся внутри — `inject` доходит, и тему она ставит себе\n// сама.\nconst themeAttrs = useGrThemeAttrs()\n\nconst uncontrolledOpen = ref(false)\nconst triggerEl = ref<HTMLElement | null>(null)\nconst panelEl = ref<HTMLElement | null>(null)\n\n/** Показывать нечего — пустая панель хуже отсутствующей. */\nconst hasContent = computed(() => Boolean(slots.content) || Boolean(props.text))\n\nconst open = computed<boolean>({\n get: () => {\n if (props.disabled || !hasContent.value)\n return false\n return props.open ?? uncontrolledOpen.value\n },\n set: (next) => {\n uncontrolledOpen.value = next\n emit('update:open', next)\n },\n})\n\nconst { floatingStyle } = useFloating(triggerEl, panelEl, open, {\n placement: () => props.placement,\n // Геттер, а не значение: `useFloating` читает опцию на каждом пересчёте, и\n // так проп остаётся живым, а не замирает на моменте setup.\n get offsetPx() { return props.offsetPx },\n zIndexVar: '--gr-z-tooltip',\n})\n\nlet delayTimer: ReturnType<typeof setTimeout> | undefined\n\nfunction schedule(next: boolean, delayMs: number): void {\n clearTimeout(delayTimer)\n\n if (delayMs <= 0) {\n open.value = next\n return\n }\n\n delayTimer = setTimeout(() => {\n open.value = next\n }, delayMs)\n}\n\nfunction show(): void {\n if (props.disabled)\n return\n schedule(true, props.openDelay)\n}\n\nfunction hide(): void {\n schedule(false, props.closeDelay)\n}\n\n/** Escape и клик вне закрывают мгновенно: задержка тут читалась бы как залипание. */\nfunction dismiss(): void {\n clearTimeout(delayTimer)\n if (open.value)\n open.value = false\n}\n\n// Нужен только тач-режиму: курсор и фокус закрывают подсказку сами.\nconst dismissOnOutside = computed(() => ({ handler: dismiss, enabled: open.value }))\n\n/**\n * На тач-устройствах hover не существует, а фокус по тапу не гарантирован —\n * без этого подсказка там недоступна вовсе. Тап по триггеру переключает\n * панель, тап вне — закрывает (`vClickOutside`).\n */\nfunction onTouch(): void {\n if (open.value)\n dismiss()\n else show()\n}\n\nonUnmounted(() => clearTimeout(delayTimer))\n\nuseDismissible(open, dismiss)\n\nconst FOCUSABLE_SELECTOR = 'a[href],button,input,select,textarea,[tabindex]:not([tabindex=\"-1\"])'\n\n/**\n * Типовое употребление — подсказка у кнопки. Фокусируемая обёртка вокруг\n * фокусируемого контрола дала бы два таб-стопа на один визуальный элемент,\n * поэтому обёртка забирает `tabindex` только когда в слоте фокусироваться\n * нечему (текст, иконка). Разметку слота пишет потребитель, привязать к ней\n * `aria-describedby` из шаблона нельзя — отсюда единственная точка, где атрибут\n * ставится вручную.\n */\nconst slotFocusableEl = ref<HTMLElement | null>(null)\n\nfunction syncSlotFocusable(): void {\n slotFocusableEl.value = slots.default\n ? triggerEl.value?.querySelector<HTMLElement>(FOCUSABLE_SELECTOR) ?? null\n : null\n}\n\nonMounted(syncSlotFocusable)\nonUpdated(syncSlotFocusable)\n\nwatchEffect((onCleanup) => {\n const el = slotFocusableEl.value\n if (!el || !props.describeTrigger)\n return\n\n el.setAttribute('aria-describedby', tooltipId)\n onCleanup(() => el.removeAttribute('aria-describedby'))\n})\n\nconst wrapperTabindex = computed(() => (slotFocusableEl.value ? undefined : 0))\nconst wrapperDescribedBy = computed(() => (\n slotFocusableEl.value || !props.describeTrigger ? undefined : tooltipId\n))\n\n/**\n * Обе обёртки, а не только внешняя: внутренний триггер тоже `inline-flex`, и\n * снаружи до него не дотянуться — оставь его как есть, и содержимое всё равно\n * схлопнется по себе.\n */\nconst layoutClass = computed(() => (props.block ? 'flex w-full' : 'inline-flex'))\n</script>\n\n<template>\n <span\n v-click-outside=\"dismissOnOutside\"\n data-gr-tooltip\n class=\"relative\"\n :class=\"layoutClass\"\n >\n <span\n ref=\"triggerEl\"\n data-gr-tooltip-trigger\n data-testid=\"gr-tooltip-trigger\"\n :tabindex=\"wrapperTabindex\"\n :aria-describedby=\"wrapperDescribedBy\"\n class=\"items-center justify-center focus:outline-none\"\n :class=\"layoutClass\"\n :style=\"triggerStyle\"\n @mouseenter=\"show\"\n @mouseleave=\"hide\"\n @focusin=\"show\"\n @focusout=\"hide\"\n @touchstart.passive=\"onTouch\"\n >\n <slot>\n <GrIcon :size=\"triggerIconSize\">\n <IconInfo />\n </GrIcon>\n </slot>\n </span>\n\n <teleport :to=\"portalTarget\" :disabled=\"!teleportEnabled\">\n <!--\n Свой набор, а не общий `panelPopTransition`: подсказка появляется фейдом\n без масштабирования — она догоняет курсор, и рост от 95% читался бы как\n второй, лишний жест. В общей карте живут наборы с двумя и более\n потребителями, у этого он один.\n -->\n <transition\n enter-active-class=\"transition-opacity ease-[var(--gr-ease-out)] duration-[var(--gr-duration-fast)]\"\n enter-from-class=\"opacity-0\"\n enter-to-class=\"opacity-100\"\n leave-active-class=\"transition-opacity ease-[var(--gr-ease-in)] duration-[var(--gr-duration-fast)]\"\n leave-from-class=\"opacity-100\"\n leave-to-class=\"opacity-0\"\n >\n <span\n v-show=\"open\"\n :id=\"tooltipId\"\n ref=\"panelEl\"\n role=\"tooltip\"\n v-bind=\"themeAttrs\"\n data-gr-tooltip-panel\n data-gr-overlay-root\n class=\"pointer-events-none rounded-[var(--gr-radius-control)] border border-[var(--gr-brd)] bg-[var(--gr-popover)] text-[var(--gr-popover-fg)] shadow-[var(--gr-shadow-1)]\"\n :class=\"panelClass\"\n :style=\"floatingStyle\"\n >\n <slot name=\"content\">{{ text }}</slot>\n </span>\n </transition>\n </teleport>\n </span>\n</template>\n","<script setup lang=\"ts\">\n/**\n * GrTooltip — GR-примитив инлайн-подсказки на hover/focus.\n *\n * По умолчанию триггер — иконка info; можно заменить через слот.\n * A11y:\n * - `role=\"tooltip\"` связывается с триггером через уникальный `aria-describedby`;\n * - подсказка закрывается по `Escape` (WCAG 1.4.13 «Content on Hover or Focus» —\n * dismissible без необходимости двигать курсор/фокус);\n * - панель не интерактивна (`pointer-events-none`), поэтому «hoverable»-требование\n * того же критерия неприменимо — навести курсор на саму подсказку невозможно.\n *\n * Позиционирование — через общий `useFloating` (см. `composables/internal`):\n * `placement` задаёт предпочтительную сторону, `flip` переворачивает подсказку,\n * если места не хватает, а `shift` не даёт ей вылезти за края viewport.\n */\nimport { computed, onMounted, onUnmounted, onUpdated, ref, useId, useSlots, watchEffect } from 'vue'\n\nimport { usePortalTarget } from '../../composables/usePortalTarget'\n\nimport { vClickOutside } from '../../directives'\nimport GrIcon from '../GrIcon'\nimport { useFloating, type UseFloatingPlacement } from '../../composables/useFloating'\nimport { useDismissible } from '../../composables/useDismissible'\nimport { useGrComponentSize, useGrThemeAttrs } from '../GrConfigProvider/context'\nimport { type GrTooltipSize, panelSizes, panelWidths, triggerIconSizes } from './grTooltipStyles'\n\nimport IconInfo from '~icons/lucide/info'\n\nexport type GrTooltipPlacement = UseFloatingPlacement\n\nexport interface GrTooltipProps {\n /** Текст подсказки. Разметка вместо текста — слот `#content`. */\n text?: string\n /** Цвет триггер-иконки (CSS color). По умолчанию — `var(--gr-muted-fg)`. */\n iconColor?: string\n /** Размер панели и дефолтной триггер-иконки. */\n size?: GrTooltipSize\n /** Предпочтительная сторона панели; `flip` может её изменить. */\n placement?: GrTooltipPlacement\n /** Зазор между триггером и панелью, px. */\n offsetPx?: number\n /** Задержка перед показом, мс. Спасает от мигания при проведении курсором по панели кнопок. */\n openDelay?: number\n /** Задержка перед скрытием, мс. */\n closeDelay?: number\n /** Подсказка не показывается ничем — ни курсором, ни фокусом, ни `v-model:open`. */\n disabled?: boolean\n /** Управляемая видимость. Без неё компонент ведёт видимость сам. */\n open?: boolean\n /**\n * Обёртка занимает ширину родителя вместо ширины содержимого.\n *\n * Нужно там, где триггер обязан тянуться: пункт списка, строка меню, ячейка.\n * `inline-flex` по умолчанию схлопнул бы такой триггер по содержимому, и\n * подсветка с кольцом фокуса сжались бы вместе с ним.\n */\n block?: boolean\n /**\n * Вешать ли `aria-describedby` на триггер. По умолчанию да.\n *\n * `false` — когда подсказка **дословно повторяет** доступное имя триггера:\n * тогда это не описание, а шум, и диктор произносит подпись дважды. Так\n * устроен свёрнутый `GrSidebarItem`: имя у него уже в `aria-label`.\n */\n describeTrigger?: boolean\n}\n\nexport interface GrTooltipEmits {\n (e: 'update:open', value: boolean): void\n}\n\nconst props = withDefaults(defineProps<GrTooltipProps>(), {\n text: undefined,\n iconColor: 'var(--gr-muted-fg)',\n size: undefined,\n placement: 'top',\n offsetPx: undefined,\n openDelay: 0,\n closeDelay: 0,\n disabled: false,\n open: undefined,\n block: false,\n describeTrigger: true,\n})\n\nconst emit = defineEmits<GrTooltipEmits>()\n\ndefineSlots<{\n /** Триггер. По умолчанию — иконка info. */\n default?: () => unknown\n /** Содержимое подсказки; заменяет проп `text`. */\n content?: () => unknown\n}>()\n\nconst slots = useSlots()\n\nconst resolvedSize = useGrComponentSize(() => props.size, { component: 'GrTooltip' })\n\nconst panelClass = computed(() => [\n panelSizes[resolvedSize.value],\n panelWidths[resolvedSize.value],\n].join(' '))\nconst triggerIconSize = computed(() => triggerIconSizes[resolvedSize.value])\n\nconst tooltipId = `gr-tooltip-${useId()}`\n\nconst triggerStyle = computed(() => ({ color: props.iconColor }))\n\n// Телепорт включается только ПОСЛЕ монтирования: иначе первый клиентский\n// рендер не совпадает с серверным и ломается гидрация (см. композабл).\nconst { target: portalTarget, enabled: teleportEnabled } = usePortalTarget()\n\n// Тема поддерева на телепортированную панель: в DOM она уезжает в `body`, то\n// есть вне обёртки провайдера, и `data-theme` с неё не наследуется. В дереве\n// компонентов панель остаётся внутри — `inject` доходит, и тему она ставит себе\n// сама.\nconst themeAttrs = useGrThemeAttrs()\n\nconst uncontrolledOpen = ref(false)\nconst triggerEl = ref<HTMLElement | null>(null)\nconst panelEl = ref<HTMLElement | null>(null)\n\n/** Показывать нечего — пустая панель хуже отсутствующей. */\nconst hasContent = computed(() => Boolean(slots.content) || Boolean(props.text))\n\nconst open = computed<boolean>({\n get: () => {\n if (props.disabled || !hasContent.value)\n return false\n return props.open ?? uncontrolledOpen.value\n },\n set: (next) => {\n uncontrolledOpen.value = next\n emit('update:open', next)\n },\n})\n\nconst { floatingStyle } = useFloating(triggerEl, panelEl, open, {\n placement: () => props.placement,\n // Геттер, а не значение: `useFloating` читает опцию на каждом пересчёте, и\n // так проп остаётся живым, а не замирает на моменте setup.\n get offsetPx() { return props.offsetPx },\n zIndexVar: '--gr-z-tooltip',\n})\n\nlet delayTimer: ReturnType<typeof setTimeout> | undefined\n\nfunction schedule(next: boolean, delayMs: number): void {\n clearTimeout(delayTimer)\n\n if (delayMs <= 0) {\n open.value = next\n return\n }\n\n delayTimer = setTimeout(() => {\n open.value = next\n }, delayMs)\n}\n\nfunction show(): void {\n if (props.disabled)\n return\n schedule(true, props.openDelay)\n}\n\nfunction hide(): void {\n schedule(false, props.closeDelay)\n}\n\n/** Escape и клик вне закрывают мгновенно: задержка тут читалась бы как залипание. */\nfunction dismiss(): void {\n clearTimeout(delayTimer)\n if (open.value)\n open.value = false\n}\n\n// Нужен только тач-режиму: курсор и фокус закрывают подсказку сами.\nconst dismissOnOutside = computed(() => ({ handler: dismiss, enabled: open.value }))\n\n/**\n * На тач-устройствах hover не существует, а фокус по тапу не гарантирован —\n * без этого подсказка там недоступна вовсе. Тап по триггеру переключает\n * панель, тап вне — закрывает (`vClickOutside`).\n */\nfunction onTouch(): void {\n if (open.value)\n dismiss()\n else show()\n}\n\nonUnmounted(() => clearTimeout(delayTimer))\n\nuseDismissible(open, dismiss)\n\nconst FOCUSABLE_SELECTOR = 'a[href],button,input,select,textarea,[tabindex]:not([tabindex=\"-1\"])'\n\n/**\n * Типовое употребление — подсказка у кнопки. Фокусируемая обёртка вокруг\n * фокусируемого контрола дала бы два таб-стопа на один визуальный элемент,\n * поэтому обёртка забирает `tabindex` только когда в слоте фокусироваться\n * нечему (текст, иконка). Разметку слота пишет потребитель, привязать к ней\n * `aria-describedby` из шаблона нельзя — отсюда единственная точка, где атрибут\n * ставится вручную.\n */\nconst slotFocusableEl = ref<HTMLElement | null>(null)\n\nfunction syncSlotFocusable(): void {\n slotFocusableEl.value = slots.default\n ? triggerEl.value?.querySelector<HTMLElement>(FOCUSABLE_SELECTOR) ?? null\n : null\n}\n\nonMounted(syncSlotFocusable)\nonUpdated(syncSlotFocusable)\n\nwatchEffect((onCleanup) => {\n const el = slotFocusableEl.value\n if (!el || !props.describeTrigger)\n return\n\n el.setAttribute('aria-describedby', tooltipId)\n onCleanup(() => el.removeAttribute('aria-describedby'))\n})\n\nconst wrapperTabindex = computed(() => (slotFocusableEl.value ? undefined : 0))\nconst wrapperDescribedBy = computed(() => (\n slotFocusableEl.value || !props.describeTrigger ? undefined : tooltipId\n))\n\n/**\n * Обе обёртки, а не только внешняя: внутренний триггер тоже `inline-flex`, и\n * снаружи до него не дотянуться — оставь его как есть, и содержимое всё равно\n * схлопнется по себе.\n */\nconst layoutClass = computed(() => (props.block ? 'flex w-full' : 'inline-flex'))\n</script>\n\n<template>\n <span\n v-click-outside=\"dismissOnOutside\"\n data-gr-tooltip\n class=\"relative\"\n :class=\"layoutClass\"\n >\n <span\n ref=\"triggerEl\"\n data-gr-tooltip-trigger\n data-testid=\"gr-tooltip-trigger\"\n :tabindex=\"wrapperTabindex\"\n :aria-describedby=\"wrapperDescribedBy\"\n class=\"items-center justify-center focus:outline-none\"\n :class=\"layoutClass\"\n :style=\"triggerStyle\"\n @mouseenter=\"show\"\n @mouseleave=\"hide\"\n @focusin=\"show\"\n @focusout=\"hide\"\n @touchstart.passive=\"onTouch\"\n >\n <slot>\n <GrIcon :size=\"triggerIconSize\">\n <IconInfo />\n </GrIcon>\n </slot>\n </span>\n\n <teleport :to=\"portalTarget\" :disabled=\"!teleportEnabled\">\n <!--\n Свой набор, а не общий `panelPopTransition`: подсказка появляется фейдом\n без масштабирования — она догоняет курсор, и рост от 95% читался бы как\n второй, лишний жест. В общей карте живут наборы с двумя и более\n потребителями, у этого он один.\n -->\n <transition\n enter-active-class=\"transition-opacity ease-[var(--gr-ease-out)] duration-[var(--gr-duration-fast)]\"\n enter-from-class=\"opacity-0\"\n enter-to-class=\"opacity-100\"\n leave-active-class=\"transition-opacity ease-[var(--gr-ease-in)] duration-[var(--gr-duration-fast)]\"\n leave-from-class=\"opacity-100\"\n leave-to-class=\"opacity-0\"\n >\n <span\n v-show=\"open\"\n :id=\"tooltipId\"\n ref=\"panelEl\"\n role=\"tooltip\"\n v-bind=\"themeAttrs\"\n data-gr-tooltip-panel\n data-gr-overlay-root\n class=\"pointer-events-none rounded-[var(--gr-radius-control)] border border-[var(--gr-brd)] bg-[var(--gr-popover)] text-[var(--gr-popover-fg)] shadow-[var(--gr-shadow-1)]\"\n :class=\"panelClass\"\n :style=\"floatingStyle\"\n >\n <slot name=\"content\">{{ text }}</slot>\n </span>\n </transition>\n </teleport>\n </span>\n</template>\n"],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as
|
|
1
|
+
import { t as GrTooltip_default } from "./chunks/GrTooltip-BDcFycvW.js";
|
|
2
|
+
import { n as grTooltipSafelist, t as grTooltipConfig } from "../../chunks/config-BP1ktzwh.js";
|
|
3
3
|
export { GrTooltip_default as GrTooltip, GrTooltip_default as default, grTooltipConfig, grTooltipSafelist };
|
|
@@ -2,6 +2,7 @@ import { a as useGrComponentSize, i as useGrComponentProp } from "../../../chunk
|
|
|
2
2
|
import { n as useGranularityTranslations } from "../../../chunks/granularityI18n-BC5zsj_d.js";
|
|
3
3
|
import { t as usePortalTarget } from "../../../chunks/usePortalTarget-BhrRgdqW.js";
|
|
4
4
|
import { i as normalizeOptionQuery, r as matchesQueryParts } from "../../../chunks/optionFilter-DYw9XPPx.js";
|
|
5
|
+
import { useVirtualList } from "../../../composables/useVirtualList.js";
|
|
5
6
|
import { useGrFormControl } from "../../../composables/useGrFormControl.js";
|
|
6
7
|
import { t as useFocusWithin } from "../../../chunks/useFocusWithin-BwHE0rzm.js";
|
|
7
8
|
import { useRovingFocus } from "../../../composables/useRovingFocus.js";
|
|
@@ -13,8 +14,8 @@ import { t as resolveScrollOverflow } from "../../../chunks/scrollOverflow-B_kEd
|
|
|
13
14
|
import { useDragGesture } from "../../../composables/useDragGesture.js";
|
|
14
15
|
import { t as chevron_left_default } from "../../../chunks/chevron-left-D8AUBAM7.js";
|
|
15
16
|
import { t as chevron_right_default } from "../../../chunks/chevron-right-C6Z01h0X.js";
|
|
16
|
-
import { t as GrCheckbox_default } from "../../GrCheckbox/chunks/GrCheckbox-
|
|
17
|
-
import { t as GrInput_default } from "../../GrInput/chunks/GrInput-
|
|
17
|
+
import { t as GrCheckbox_default } from "../../GrCheckbox/chunks/GrCheckbox-B4NJc7Ur.js";
|
|
18
|
+
import { t as GrInput_default } from "../../GrInput/chunks/GrInput-CoaFLpaU.js";
|
|
18
19
|
import { n as hitTest, t as autoScrollDelta } from "../../../chunks/dragSortGeometry-CY-llfrQ.js";
|
|
19
20
|
import { C as transferTitleClass, S as transferStatusClass, _ as transferLabelClass, a as grTransferHeaderClass, b as transferReorderIconClass, c as grTransferPanelClass, d as transferActionIconClass, f as transferActionInertClass, g as transferGhostLabelClass, h as transferGhostCountClass, i as grTransferEmptyClass, l as grTransferReorderClass, m as transferGhostClass, o as grTransferMarkClass, p as transferCounterClass, r as grTransferActionsClass, s as grTransferOptionClass, u as grTransferSearchClass, v as transferListBase, x as transferRootBase, y as transferMarkIconClass } from "../../../chunks/config-DmED6aJV.js";
|
|
20
21
|
import { Fragment, Teleport, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, markRaw, nextTick, normalizeClass, normalizeStyle, onBeforeUnmount, onMounted, onScopeDispose, openBlock, ref, renderList, renderSlot, shallowRef, toDisplayString, unref, useId, useSlots, watch, withCtx } from "vue";
|
|
@@ -547,6 +548,7 @@ var _hoisted_6 = [
|
|
|
547
548
|
"id",
|
|
548
549
|
"data-gr-transfer-list",
|
|
549
550
|
"data-overflow",
|
|
551
|
+
"data-gr-virtual",
|
|
550
552
|
"aria-label",
|
|
551
553
|
"aria-labelledby",
|
|
552
554
|
"aria-describedby",
|
|
@@ -559,12 +561,15 @@ var _hoisted_6 = [
|
|
|
559
561
|
var _hoisted_7 = [
|
|
560
562
|
"aria-selected",
|
|
561
563
|
"aria-disabled",
|
|
564
|
+
"aria-setsize",
|
|
565
|
+
"aria-posinset",
|
|
562
566
|
"tabindex",
|
|
563
567
|
"onPointerdown",
|
|
564
568
|
"onClick",
|
|
565
569
|
"onFocus",
|
|
566
570
|
"onDblclick"
|
|
567
571
|
];
|
|
572
|
+
var ROW_ESTIMATE_PX = 36;
|
|
568
573
|
//#endregion
|
|
569
574
|
//#region src/components/GrTransfer/GrTransfer.vue
|
|
570
575
|
var GrTransfer_default = /* @__PURE__ */ defineComponent({
|
|
@@ -594,6 +599,11 @@ var GrTransfer_default = /* @__PURE__ */ defineComponent({
|
|
|
594
599
|
type: Function,
|
|
595
600
|
default: void 0
|
|
596
601
|
},
|
|
602
|
+
loading: {
|
|
603
|
+
type: Boolean,
|
|
604
|
+
default: false
|
|
605
|
+
},
|
|
606
|
+
loadingText: { default: void 0 },
|
|
597
607
|
sortable: {
|
|
598
608
|
type: Boolean,
|
|
599
609
|
default: true
|
|
@@ -603,6 +613,10 @@ var GrTransfer_default = /* @__PURE__ */ defineComponent({
|
|
|
603
613
|
default: void 0
|
|
604
614
|
},
|
|
605
615
|
maxHeight: { default: void 0 },
|
|
616
|
+
virtual: {
|
|
617
|
+
type: Boolean,
|
|
618
|
+
default: false
|
|
619
|
+
},
|
|
606
620
|
size: { default: void 0 },
|
|
607
621
|
disabled: {
|
|
608
622
|
type: Boolean,
|
|
@@ -691,7 +705,7 @@ var GrTransfer_default = /* @__PURE__ */ defineComponent({
|
|
|
691
705
|
const split = computed(() => splitByModel(props.items ?? [], keyOf, props.modelValue ?? []));
|
|
692
706
|
if (process.env.NODE_ENV !== "production") watch(split, (value) => {
|
|
693
707
|
if (value.duplicated.length > 0) console.warn(`[granularity] GrTransfer: ключи повторяются в \`items\` (${value.duplicated.join(", ")}) — рисуется первый элемент с таким ключом.`);
|
|
694
|
-
if (value.unresolved.length > 0 && (props.items?.length ?? 0) > 0) console.warn(`[granularity] GrTransfer: ключи из \`modelValue\` не найдены в \`items\` (${value.unresolved.join(", ")}). Они сохранены в значении, но не показаны: каталог мог ещё не приехать.`);
|
|
708
|
+
if (!props.loading && value.unresolved.length > 0 && (props.items?.length ?? 0) > 0) console.warn(`[granularity] GrTransfer: ключи из \`modelValue\` не найдены в \`items\` (${value.unresolved.join(", ")}). Они сохранены в значении, но не показаны: каталог мог ещё не приехать.`);
|
|
695
709
|
}, { immediate: true });
|
|
696
710
|
const queries = ref({
|
|
697
711
|
source: "",
|
|
@@ -843,15 +857,81 @@ var GrTransfer_default = /* @__PURE__ */ defineComponent({
|
|
|
843
857
|
function rowsOf(side) {
|
|
844
858
|
return side === "source" ? sourceRows.value : targetRows.value;
|
|
845
859
|
}
|
|
860
|
+
let isUnmounting = false;
|
|
861
|
+
onBeforeUnmount(() => {
|
|
862
|
+
isUnmounting = true;
|
|
863
|
+
});
|
|
864
|
+
/**
|
|
865
|
+
* Строка размонтируется — снимаем регистрацию, а если фокус был на ней, уводим
|
|
866
|
+
* его на сам список.
|
|
867
|
+
*
|
|
868
|
+
* При виртуализации это не редкость: колесо мыши уносит сфокусированную строку
|
|
869
|
+
* из окна, и без перевода фокус упал бы на `body`. Обработчик клавиш висит на
|
|
870
|
+
* списке, до `body` он не достаёт, и клавиатура панели умерла бы до клика мышью.
|
|
871
|
+
*
|
|
872
|
+
* Элемент берётся из карты, а не из аргумента: Vue обнуляет function ref ДО
|
|
873
|
+
* удаления узла, то есть в момент вызова фокус ещё на строке.
|
|
874
|
+
*/
|
|
846
875
|
function registerRow(side, key, el) {
|
|
847
876
|
const map = rowsOf(side);
|
|
848
|
-
if (el instanceof HTMLElement)
|
|
849
|
-
|
|
877
|
+
if (el instanceof HTMLElement) {
|
|
878
|
+
map.set(key, el);
|
|
879
|
+
return;
|
|
880
|
+
}
|
|
881
|
+
const previous = map.get(key);
|
|
882
|
+
const active = typeof document === "undefined" ? null : document.activeElement;
|
|
883
|
+
const heldFocus = Boolean(previous && active && (previous === active || previous.contains(active)));
|
|
884
|
+
map.delete(key);
|
|
885
|
+
if (heldFocus && !isUnmounting) listEls.value[side]?.focus({ preventScroll: true });
|
|
886
|
+
}
|
|
887
|
+
/**
|
|
888
|
+
* Виртуализатор просит `Ref` на контейнер, а панели хранятся одной картой на обе
|
|
889
|
+
* стороны. Отдельная ссылка на сторону — дешевле, чем разводить карту на два рефа
|
|
890
|
+
* и синхронизировать их вручную.
|
|
891
|
+
*/
|
|
892
|
+
const sourceListEl = computed(() => listEls.value.source);
|
|
893
|
+
const targetListEl = computed(() => listEls.value.target);
|
|
894
|
+
/** Оценка высоты строки до первого замера: считает сам виртуализатор по образцам. */
|
|
895
|
+
function makeVirtualizer(side) {
|
|
896
|
+
return useVirtualList({
|
|
897
|
+
container: side === "source" ? sourceListEl : targetListEl,
|
|
898
|
+
count: () => props.virtual ? visible.value[side].length : 0,
|
|
899
|
+
source: () => visible.value[side],
|
|
900
|
+
itemSize: () => ROW_ESTIMATE_PX,
|
|
901
|
+
viewportSize: () => typeof props.maxHeight === "number" ? props.maxHeight : void 0
|
|
902
|
+
});
|
|
903
|
+
}
|
|
904
|
+
const sourceVirtualizer = makeVirtualizer("source");
|
|
905
|
+
const targetVirtualizer = makeVirtualizer("target");
|
|
906
|
+
function virtualizerOf(side) {
|
|
907
|
+
return side === "source" ? sourceVirtualizer : targetVirtualizer;
|
|
908
|
+
}
|
|
909
|
+
/** Строки к отрисовке: при выключенной виртуализации — все. */
|
|
910
|
+
function renderedOf(side) {
|
|
911
|
+
if (!props.virtual) return visible.value[side];
|
|
912
|
+
const { start, end } = virtualizerOf(side).range.value;
|
|
913
|
+
return visible.value[side].slice(start, end);
|
|
914
|
+
}
|
|
915
|
+
/** Абсолютный индекс строки: `aria-posinset` обязан считать от всего списка. */
|
|
916
|
+
function absoluteIndex(side, offsetInWindow) {
|
|
917
|
+
return props.virtual ? virtualizerOf(side).range.value.start + offsetInWindow : offsetInWindow;
|
|
918
|
+
}
|
|
919
|
+
/**
|
|
920
|
+
* Строки вне окна в DOM нет: `elementFor` вернул бы `null`, и фокус остался бы
|
|
921
|
+
* на месте. Поэтому сперва прокрутка, и только следующим тиком — фокус.
|
|
922
|
+
*/
|
|
923
|
+
function scrollRowIntoView(side, key) {
|
|
924
|
+
if (props.virtual) {
|
|
925
|
+
const index = visibleKeys.value[side].indexOf(key);
|
|
926
|
+
if (index >= 0) virtualizerOf(side).scrollToIndex(index);
|
|
927
|
+
}
|
|
928
|
+
return nextTick();
|
|
850
929
|
}
|
|
851
930
|
function makeRoving(side) {
|
|
852
931
|
return useRovingFocus({
|
|
853
932
|
items: () => visibleKeys.value[side],
|
|
854
933
|
elementFor: (key) => rowsOf(side).get(key) ?? null,
|
|
934
|
+
beforeFocus: (key) => scrollRowIntoView(side, key),
|
|
855
935
|
orientation: () => "vertical",
|
|
856
936
|
wrap: () => false,
|
|
857
937
|
skipDisabled: () => false,
|
|
@@ -1078,6 +1158,14 @@ var GrTransfer_default = /* @__PURE__ */ defineComponent({
|
|
|
1078
1158
|
enter: (event) => emit("focus", event),
|
|
1079
1159
|
leave: (event) => emit("blur", event)
|
|
1080
1160
|
});
|
|
1161
|
+
/**
|
|
1162
|
+
* Скролл-протяжённость виртуализованного списка держат псевдоэлементы
|
|
1163
|
+
* контейнера: распорка приезжает переменными в том же патче, что и сами строки,
|
|
1164
|
+
* и схлопнуться между кадрами ей нечем.
|
|
1165
|
+
*/
|
|
1166
|
+
function listStyle(side) {
|
|
1167
|
+
return props.virtual ? virtualizerOf(side).spacerStyle.value : void 0;
|
|
1168
|
+
}
|
|
1081
1169
|
const panelStyle = computed(() => ({ maxHeight: props.maxHeight === void 0 ? "var(--gr-transfer-panel-max-h, 18rem)" : typeof props.maxHeight === "number" ? `${props.maxHeight}px` : props.maxHeight }));
|
|
1082
1170
|
function counterText(side) {
|
|
1083
1171
|
return t("gr.transfer.selected", "{count} of {total}", {
|
|
@@ -1094,6 +1182,7 @@ var GrTransfer_default = /* @__PURE__ */ defineComponent({
|
|
|
1094
1182
|
function emptyText(side) {
|
|
1095
1183
|
return normalizeOptionQuery(queries.value[side]) === "" ? t("gr.transfer.empty", "Nothing here yet") : t("gr.transfer.emptyFiltered", "Nothing matches the search");
|
|
1096
1184
|
}
|
|
1185
|
+
const resolvedLoadingText = computed(() => props.loadingText ?? t("gr.transfer.loading", "Loading…"));
|
|
1097
1186
|
function isFiltered(side) {
|
|
1098
1187
|
return normalizeOptionQuery(queries.value[side]) !== "";
|
|
1099
1188
|
}
|
|
@@ -1216,6 +1305,7 @@ var GrTransfer_default = /* @__PURE__ */ defineComponent({
|
|
|
1216
1305
|
clearable: "",
|
|
1217
1306
|
size: unref(resolvedSize),
|
|
1218
1307
|
disabled: unref(isDisabled),
|
|
1308
|
+
loading: __props.loading,
|
|
1219
1309
|
placeholder: unref(t)("gr.transfer.search", "Search"),
|
|
1220
1310
|
"aria-label": `${titles.value[side]} — ${unref(t)("gr.transfer.search", "Search")}`,
|
|
1221
1311
|
"onUpdate:modelValue": (value) => onSearch(side, value),
|
|
@@ -1224,6 +1314,7 @@ var GrTransfer_default = /* @__PURE__ */ defineComponent({
|
|
|
1224
1314
|
"model-value",
|
|
1225
1315
|
"size",
|
|
1226
1316
|
"disabled",
|
|
1317
|
+
"loading",
|
|
1227
1318
|
"placeholder",
|
|
1228
1319
|
"aria-label",
|
|
1229
1320
|
"onUpdate:modelValue",
|
|
@@ -1233,7 +1324,7 @@ var GrTransfer_default = /* @__PURE__ */ defineComponent({
|
|
|
1233
1324
|
class: normalizeClass(unref(transferStatusClass)),
|
|
1234
1325
|
role: "status",
|
|
1235
1326
|
"aria-live": "polite"
|
|
1236
|
-
}, toDisplayString(isFiltered(side) ? shownText(side) : ""), 3),
|
|
1327
|
+
}, toDisplayString(__props.loading ? resolvedLoadingText.value : isFiltered(side) ? shownText(side) : ""), 3),
|
|
1237
1328
|
createElementVNode("div", {
|
|
1238
1329
|
id: side === "source" ? sourceListId : unref(fieldId) ?? targetListId,
|
|
1239
1330
|
ref_for: true,
|
|
@@ -1244,7 +1335,10 @@ var GrTransfer_default = /* @__PURE__ */ defineComponent({
|
|
|
1244
1335
|
"data-overflow": listOverflow.value[side],
|
|
1245
1336
|
role: "listbox",
|
|
1246
1337
|
"aria-multiselectable": "true",
|
|
1338
|
+
tabindex: "-1",
|
|
1339
|
+
"data-gr-virtual": __props.virtual ? "" : void 0,
|
|
1247
1340
|
class: normalizeClass(unref(transferListBase)),
|
|
1341
|
+
style: normalizeStyle(listStyle(side)),
|
|
1248
1342
|
"aria-label": hasHeaderSlot.value ? titles.value[side] : void 0,
|
|
1249
1343
|
"aria-labelledby": hasHeaderSlot.value ? side === "target" ? unref(fieldLabelId) : void 0 : side === "target" && unref(fieldLabelId) ? `${unref(fieldLabelId)} ${targetTitleId}` : side === "source" ? sourceTitleId : targetTitleId,
|
|
1250
1344
|
"aria-describedby": side === "target" ? unref(describedBy) : void 0,
|
|
@@ -1254,15 +1348,20 @@ var GrTransfer_default = /* @__PURE__ */ defineComponent({
|
|
|
1254
1348
|
"aria-disabled": unref(isDisabled) ? "true" : void 0,
|
|
1255
1349
|
onKeydown: (event) => onListKeydown(side, event),
|
|
1256
1350
|
onScrollPassive: scheduleOverflow
|
|
1257
|
-
}, [(openBlock(true), createElementBlock(Fragment, null, renderList(
|
|
1351
|
+
}, [(openBlock(true), createElementBlock(Fragment, null, renderList(renderedOf(side), (item, index) => {
|
|
1258
1352
|
return openBlock(), createElementBlock("div", {
|
|
1259
1353
|
key: keyOf(item),
|
|
1260
1354
|
ref_for: true,
|
|
1261
|
-
ref: (el) =>
|
|
1355
|
+
ref: (el) => {
|
|
1356
|
+
registerRow(side, keyOf(item), el);
|
|
1357
|
+
if (__props.virtual) virtualizerOf(side).measure(absoluteIndex(side, index), el);
|
|
1358
|
+
},
|
|
1262
1359
|
"data-gr-transfer-option": "",
|
|
1263
1360
|
role: "option",
|
|
1264
1361
|
"aria-selected": selections.value[side].keys.has(keyOf(item)) ? "true" : "false",
|
|
1265
1362
|
"aria-disabled": disabledOf(item) ? "true" : void 0,
|
|
1363
|
+
"aria-setsize": visible.value[side].length,
|
|
1364
|
+
"aria-posinset": absoluteIndex(side, index) + 1,
|
|
1266
1365
|
tabindex: rovingOf(side).tabindexFor(keyOf(item)),
|
|
1267
1366
|
class: normalizeClass(unref(grTransferOptionClass)({
|
|
1268
1367
|
size: unref(resolvedSize),
|
|
@@ -1286,15 +1385,18 @@ var GrTransfer_default = /* @__PURE__ */ defineComponent({
|
|
|
1286
1385
|
}, null, 8, ["class"])) : createCommentVNode("", true)], 2), renderSlot(_ctx.$slots, "item", {
|
|
1287
1386
|
item,
|
|
1288
1387
|
side,
|
|
1289
|
-
index,
|
|
1388
|
+
index: absoluteIndex(side, index),
|
|
1290
1389
|
selected: selections.value[side].keys.has(keyOf(item)),
|
|
1291
1390
|
disabled: disabledOf(item)
|
|
1292
1391
|
}, () => [createElementVNode("span", { class: normalizeClass(unref(transferLabelClass)) }, toDisplayString(labelOf(item)), 3)])], 42, _hoisted_7);
|
|
1293
|
-
}), 128))],
|
|
1294
|
-
visible.value[side].length === 0 ? renderSlot(_ctx.$slots, "
|
|
1392
|
+
}), 128))], 46, _hoisted_6),
|
|
1393
|
+
__props.loading && visible.value[side].length === 0 ? renderSlot(_ctx.$slots, "loading", { side }, () => [createElementVNode("p", {
|
|
1394
|
+
"data-gr-transfer-loading": "",
|
|
1395
|
+
class: normalizeClass(unref(grTransferEmptyClass)(unref(resolvedSize)))
|
|
1396
|
+
}, toDisplayString(resolvedLoadingText.value), 3)], void 0, 1) : visible.value[side].length === 0 ? renderSlot(_ctx.$slots, "empty", {
|
|
1295
1397
|
side,
|
|
1296
1398
|
filtered: isFiltered(side)
|
|
1297
|
-
}, () => [createElementVNode("p", { class: normalizeClass(unref(grTransferEmptyClass)(unref(resolvedSize))) }, toDisplayString(emptyText(side)), 3)], void 0,
|
|
1399
|
+
}, () => [createElementVNode("p", { class: normalizeClass(unref(grTransferEmptyClass)(unref(resolvedSize))) }, toDisplayString(emptyText(side)), 3)], void 0, 2) : createCommentVNode("", true)
|
|
1298
1400
|
], 14, _hoisted_2);
|
|
1299
1401
|
}), 64)),
|
|
1300
1402
|
(openBlock(), createBlock(Teleport, {
|