@feugene/granularity 0.16.0 → 0.19.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/dist/chunks/chevron-left-D8AUBAM7.js +23 -0
- package/dist/chunks/chevron-left-D8AUBAM7.js.map +1 -0
- package/dist/chunks/{chevron-right-BfqMVpbB.js → chevron-right-C6Z01h0X.js} +1 -22
- package/dist/chunks/chevron-right-C6Z01h0X.js.map +1 -0
- package/dist/chunks/config-8Pcutu1j2.js.map +1 -0
- package/dist/chunks/{config-K0C2tcLB.js → config-9PYRZlKE.js} +1 -1
- package/dist/chunks/{config-K0C2tcLB.js.map → config-9PYRZlKE.js.map} +1 -1
- package/dist/chunks/{config-Zc_bUvZY2.js → config-BDfTXHo12.js} +1 -1
- package/dist/chunks/{config-Zc_bUvZY2.js.map → config-BDfTXHo12.js.map} +1 -1
- package/dist/chunks/config-BE6n20np2.js.map +1 -0
- package/dist/chunks/config-BJ7Bv_G2.js +148 -0
- package/dist/chunks/config-BJ7Bv_G2.js.map +1 -0
- package/dist/chunks/config-BKvX0q102.js.map +1 -0
- package/dist/chunks/{config-CpwwkFBO.js → config-Baj7Wvx-.js} +1 -1
- package/dist/chunks/{config-CpwwkFBO.js.map → config-Baj7Wvx-.js.map} +1 -1
- package/dist/chunks/{config-D8tSR2uS.js → config-Be9k9bOf.js} +2 -8
- package/dist/chunks/config-Be9k9bOf.js.map +1 -0
- package/dist/chunks/config-BoNR7_PD2.js.map +1 -0
- package/dist/chunks/{config-DxCTVBfx.js → config-BsPDQ0dS.js} +2 -2
- package/dist/chunks/config-BsPDQ0dS.js.map +1 -0
- package/dist/chunks/{config-DpqOnJiz2.js → config-CDat1wXf2.js} +1 -1
- package/dist/chunks/config-CDat1wXf2.js.map +1 -0
- package/dist/chunks/config-CN2ULSQL.js.map +1 -0
- package/dist/chunks/{config-Cw6TDzWv2.js → config-COpuWGr_.js} +1 -1
- package/dist/chunks/config-COpuWGr_.js.map +1 -0
- package/dist/chunks/config-CY0_6cMi2.js.map +1 -0
- package/dist/chunks/{config-B-g6lT19.js → config-DA6SnEoy.js} +5 -2
- package/dist/chunks/config-DA6SnEoy.js.map +1 -0
- package/dist/chunks/config-DAX8Deh1.js +68 -0
- package/dist/chunks/config-DAX8Deh1.js.map +1 -0
- package/dist/chunks/config-DKdlqXiY.js.map +1 -1
- package/dist/chunks/{config-CvC0sX8p.js → config-MRvhUl-O.js} +1 -1
- package/dist/chunks/{config-CvC0sX8p.js.map → config-MRvhUl-O.js.map} +1 -1
- package/dist/chunks/config-Rw9OyW702.js.map +1 -0
- package/dist/chunks/config-ScuvHw6k2.js +42 -0
- package/dist/chunks/config-ScuvHw6k2.js.map +1 -0
- package/dist/chunks/config-T3qdQBgU2.js.map +1 -0
- package/dist/chunks/config-eXB87DOi.js.map +1 -0
- package/dist/chunks/context-BSYR7RZs.js.map +1 -1
- package/dist/chunks/{en-B3xMeswz.js → en-COdzxgAX.js} +30 -5
- package/dist/chunks/en-COdzxgAX.js.map +1 -0
- package/dist/chunks/{es-CA-mkU--.js → es-ClqJ-4hr.js} +30 -5
- package/dist/chunks/es-ClqJ-4hr.js.map +1 -0
- package/dist/chunks/{es-Bv8vvqdT.js → es-DGMHwknJ.js} +3 -3
- package/dist/chunks/{es-Bv8vvqdT.js.map → es-DGMHwknJ.js.map} +1 -1
- package/dist/chunks/generated-BRkbhyxk.js +3270 -0
- package/dist/chunks/generated-BRkbhyxk.js.map +1 -0
- package/dist/chunks/grKbdStyles-CeZhGQHr.js +43 -0
- package/dist/chunks/grKbdStyles-CeZhGQHr.js.map +1 -0
- package/dist/chunks/{grTextareaStyles-CWI2SqC8.js → grTextareaStyles-iOcHuVMM.js} +2 -2
- package/dist/chunks/{grTextareaStyles-CWI2SqC8.js.map → grTextareaStyles-iOcHuVMM.js.map} +1 -1
- package/dist/chunks/{granular-provider-CtrXGa7c.js → granular-provider-C6uAujdJ.js} +23 -21
- package/dist/chunks/granular-provider-C6uAujdJ.js.map +1 -0
- package/dist/chunks/grip-vertical-lRha2S7q.js +16 -0
- package/dist/chunks/grip-vertical-lRha2S7q.js.map +1 -0
- package/dist/chunks/icon-Dag2tIMs.js +21 -0
- package/dist/chunks/icon-Dag2tIMs.js.map +1 -0
- package/dist/chunks/{keyboard-zYvvyHd4.js → keyboard-DE2yhz_b.js} +10 -1
- package/dist/chunks/keyboard-DE2yhz_b.js.map +1 -0
- package/dist/chunks/{optionFilter-BVY988pC.js → optionFilter-DYw9XPPx.js} +1 -71
- package/dist/chunks/optionFilter-DYw9XPPx.js.map +1 -0
- package/dist/chunks/{useOverlayLayer-BupuP_hs.js → overlayStack-C8cfsqXa.js} +11 -61
- package/dist/chunks/overlayStack-C8cfsqXa.js.map +1 -0
- package/dist/chunks/{portalRoot-CWD4zHBm.js → portalRoot-CVhCgdG6.js} +10 -1
- package/dist/chunks/{portalRoot-CWD4zHBm.js.map → portalRoot-CVhCgdG6.js.map} +1 -1
- package/dist/chunks/{ru-COWxgh2A.js → ru-9z8ix45c.js} +30 -5
- package/dist/chunks/ru-9z8ix45c.js.map +1 -0
- package/dist/chunks/useDragSort-0l47h4yb.js +265 -0
- package/dist/chunks/useDragSort-0l47h4yb.js.map +1 -0
- package/dist/chunks/{useModalOverlay-DCM4d3yA.js → useModalOverlay-DrQVYwwA.js} +2 -2
- package/dist/chunks/{useModalOverlay-DCM4d3yA.js.map → useModalOverlay-DrQVYwwA.js.map} +1 -1
- package/dist/chunks/{usePortalTarget-RyzEgNTb.js → usePortalTarget-Cn-Wiz5d.js} +1 -1
- package/dist/chunks/{usePortalTarget-RyzEgNTb.js.map → usePortalTarget-Cn-Wiz5d.js.map} +1 -1
- package/dist/components/GrAutocomplete/chunks/{GrAutocomplete-CQ9T7Lly.js → GrAutocomplete-gY4Xopza.js} +35 -26
- package/dist/components/GrAutocomplete/chunks/GrAutocomplete-gY4Xopza.js.map +1 -0
- package/dist/components/GrAutocomplete/index.js +1 -1
- package/dist/components/GrAutocomplete/styles.css +1 -1
- package/dist/components/GrBreadcrumbs/chunks/{GrBreadcrumbs-BCNGDS6k.js → GrBreadcrumbs-DS_-PBVt.js} +8 -7
- package/dist/components/GrBreadcrumbs/chunks/GrBreadcrumbs-DS_-PBVt.js.map +1 -0
- package/dist/components/GrBreadcrumbs/index.js +1 -1
- package/dist/components/GrCollapse/chunks/{GrCollapse-B2Fc6A9r.js.map → GrCollapse-Kk0DE8tb.js.map} +1 -1
- package/dist/components/GrCollapse/index.js +1 -1
- package/dist/components/GrColorPicker/chunks/{GrColorPicker-bnYBRGk8.js → GrColorPicker-CkBTzkqn.js} +4 -4
- package/dist/components/GrColorPicker/chunks/{GrColorPicker-bnYBRGk8.js.map → GrColorPicker-CkBTzkqn.js.map} +1 -1
- package/dist/components/GrColorPicker/index.js +2 -2
- package/dist/components/GrCommandPalette/chunks/{GrCommandPalette-MWDYDPNC.js → GrCommandPalette-BugTlGdj.js} +41 -16
- package/dist/components/GrCommandPalette/chunks/GrCommandPalette-BugTlGdj.js.map +1 -0
- package/dist/components/GrCommandPalette/index.js +2 -2
- package/dist/components/GrCommandPalette/styles.css +1 -1
- package/dist/components/GrConfigProvider/index.js +2 -2
- package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-DaQmlp1_.js → GrConfirmDialog-Ds5T0GiR.js} +1 -1
- package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-DaQmlp1_.js.map → GrConfirmDialog-Ds5T0GiR.js.map} +1 -1
- package/dist/components/GrConfirmDialog/index.js +1 -1
- package/dist/components/GrDataTable/chunks/{GrDataTable-DVFho9Cj.js → GrDataTable-CYe2A2WA.js} +498 -48
- package/dist/components/GrDataTable/chunks/GrDataTable-CYe2A2WA.js.map +1 -0
- package/dist/components/GrDataTable/index.js +2 -2
- package/dist/components/GrDialog/chunks/{GrDialog-AE1gIZuz.js → GrDialog-C3tYaA8v.js} +1 -1
- package/dist/components/GrDialog/chunks/{GrDialog-AE1gIZuz.js.map → GrDialog-C3tYaA8v.js.map} +1 -1
- package/dist/components/GrDialog/index.js +1 -1
- package/dist/components/GrDialogService/chunks/{GrDialogService-B4DYWDkA.js → GrDialogService-CTBiiJDI.js} +3 -3
- package/dist/components/GrDialogService/chunks/{GrDialogService-B4DYWDkA.js.map → GrDialogService-CTBiiJDI.js.map} +1 -1
- package/dist/components/GrDialogService/index.js +1 -1
- package/dist/components/GrDivider/chunks/{GrDivider-B2Xwc_QO.js → GrDivider-xxq1_fIl.js} +1 -1
- package/dist/components/GrDivider/chunks/{GrDivider-B2Xwc_QO.js.map → GrDivider-xxq1_fIl.js.map} +1 -1
- package/dist/components/GrDivider/index.js +2 -2
- package/dist/components/GrDrawer/chunks/{GrDrawer-DQwi6aRw.js → GrDrawer-BSSuiNHU.js} +1 -1
- package/dist/components/GrDrawer/chunks/{GrDrawer-DQwi6aRw.js.map → GrDrawer-BSSuiNHU.js.map} +1 -1
- package/dist/components/GrDrawer/index.js +1 -1
- package/dist/components/GrDropdown/chunks/{GrDropdown-BLng6V1m.js → GrDropdown-Bh6UK2M5.js} +3 -3
- package/dist/components/GrDropdown/chunks/{GrDropdown-BLng6V1m.js.map → GrDropdown-Bh6UK2M5.js.map} +1 -1
- package/dist/components/GrDropdown/index.js +1 -1
- package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu-BImk2Vs7.js → GrDropdownMenu-LyfEFUbg.js} +2 -2
- package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu-BImk2Vs7.js.map → GrDropdownMenu-LyfEFUbg.js.map} +1 -1
- package/dist/components/GrDropdownMenu/index.js +2 -2
- package/dist/components/GrFileUpload/chunks/{GrFileUpload-D0B-BEsd.js → GrFileUpload-DuDzC43S.js} +2 -2
- package/dist/components/GrFileUpload/chunks/{GrFileUpload-D0B-BEsd.js.map → GrFileUpload-DuDzC43S.js.map} +1 -1
- package/dist/components/GrFileUpload/index.js +1 -1
- package/dist/components/GrImageViewer/chunks/{GrImageViewer-BeCnE8XQ.js → GrImageViewer-DfD4euH5.js} +48 -23
- package/dist/components/GrImageViewer/chunks/GrImageViewer-DfD4euH5.js.map +1 -0
- package/dist/components/GrImageViewer/index.js +1 -1
- package/dist/components/GrInput/chunks/{GrInput-DD2gYdqS.js → GrInput-2wd7Crs0.js} +1 -1
- package/dist/components/GrInput/chunks/GrInput-2wd7Crs0.js.map +1 -0
- package/dist/components/GrInput/index.js +1 -1
- package/dist/components/GrInputTag/chunks/{GrInputTag-DmNunixz.js → GrInputTag-CyV2eY7Z.js} +20 -33
- package/dist/components/GrInputTag/chunks/GrInputTag-CyV2eY7Z.js.map +1 -0
- package/dist/components/GrInputTag/index.js +1 -1
- package/dist/components/GrKbd/chunks/{GrKbd-DRFPvW3G.js → GrKbd-DU2lBkRV.js} +218 -52
- package/dist/components/GrKbd/chunks/GrKbd-DU2lBkRV.js.map +1 -0
- package/dist/components/GrKbd/index.js +3 -3
- package/dist/components/GrModal/chunks/{GrModal-B8I78T0N.js → GrModal-CbMMr6W1.js} +1 -1
- package/dist/components/GrModal/chunks/{GrModal-B8I78T0N.js.map → GrModal-CbMMr6W1.js.map} +1 -1
- package/dist/components/GrModal/index.js +1 -1
- package/dist/components/GrNumberInput/chunks/{GrNumberInput-CZOyPz4J.js → GrNumberInput-B5CHZDBj.js} +2 -1
- package/dist/components/GrNumberInput/chunks/{GrNumberInput-CZOyPz4J.js.map → GrNumberInput-B5CHZDBj.js.map} +1 -1
- package/dist/components/GrNumberInput/index.js +1 -1
- package/dist/components/GrPagination/chunks/{GrPagination-B6N0QZBf.js → GrPagination-BM4FrD6Q.js} +4 -4
- package/dist/components/GrPagination/chunks/GrPagination-BM4FrD6Q.js.map +1 -0
- package/dist/components/GrPagination/index.js +1 -1
- package/dist/components/GrPopover/chunks/{GrPopover-B1eRCOoO.js → GrPopover-DMH4Jjst.js} +1 -1
- package/dist/components/GrPopover/chunks/{GrPopover-B1eRCOoO.js.map → GrPopover-DMH4Jjst.js.map} +1 -1
- package/dist/components/GrPopover/index.js +1 -1
- package/dist/components/GrProgressBar/chunks/{GrProgressBar-BiHnaitu.js → GrProgressBar-xwbNM9QB.js} +1 -1
- package/dist/components/GrProgressBar/chunks/GrProgressBar-xwbNM9QB.js.map +1 -0
- package/dist/components/GrProgressBar/index.js +1 -1
- package/dist/components/GrProgressCircle/chunks/{GrProgressCircle-CTogjcHz.js → GrProgressCircle-B8olXRo5.js} +1 -1
- package/dist/components/GrProgressCircle/chunks/{GrProgressCircle-CTogjcHz.js.map → GrProgressCircle-B8olXRo5.js.map} +1 -1
- package/dist/components/GrProgressCircle/index.js +2 -2
- package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-Ct174NVD.js → GrPromptDialog-Pwr9NPxK.js} +3 -3
- package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-Ct174NVD.js.map → GrPromptDialog-Pwr9NPxK.js.map} +1 -1
- package/dist/components/GrPromptDialog/index.js +1 -1
- package/dist/components/GrRadio/chunks/{GrRadio-DksDro_U.js → GrRadio-DWiRaMzt.js} +8 -32
- package/dist/components/GrRadio/chunks/GrRadio-DWiRaMzt.js.map +1 -0
- package/dist/components/GrRadio/index.js +1 -1
- package/dist/components/GrRadioGroup/chunks/{GrRadioGroup-BOIhejE6.js → GrRadioGroup-DIuBw0wk.js} +34 -27
- package/dist/components/GrRadioGroup/chunks/GrRadioGroup-DIuBw0wk.js.map +1 -0
- package/dist/components/GrRadioGroup/index.js +1 -1
- package/dist/components/GrRating/chunks/{GrRating-JrHXz0Rv.js → GrRating-DVFH3lYu.js} +10 -9
- package/dist/components/GrRating/chunks/GrRating-DVFH3lYu.js.map +1 -0
- package/dist/components/GrRating/index.js +2 -2
- package/dist/components/GrSegmented/chunks/{GrSegmented-BQIlH5KI.js → GrSegmented-CQw3ijqa.js} +47 -65
- package/dist/components/GrSegmented/chunks/GrSegmented-CQw3ijqa.js.map +1 -0
- package/dist/components/GrSegmented/index.js +1 -1
- package/dist/components/GrSelect/chunks/{GrSelect-aqkPCqjd.js → GrSelect-B-Voni7D.js} +69 -55
- package/dist/components/GrSelect/chunks/GrSelect-B-Voni7D.js.map +1 -0
- package/dist/components/GrSelect/index.js +1 -1
- package/dist/components/GrSelect/styles.css +1 -1
- package/dist/components/GrSidebar/chunks/{GrSidebar-DRGnnViw.js → GrSidebar-i7AxjhY_.js} +3 -2
- package/dist/components/GrSidebar/chunks/{GrSidebar-DRGnnViw.js.map → GrSidebar-i7AxjhY_.js.map} +1 -1
- package/dist/components/GrSidebar/index.js +2 -2
- package/dist/components/GrSkeleton/index.js +1 -1
- package/dist/components/GrSlider/chunks/{GrSlider-DkU9IQSX.js → GrSlider-CyhVsNKn.js} +21 -34
- package/dist/components/GrSlider/chunks/GrSlider-CyhVsNKn.js.map +1 -0
- package/dist/components/GrSlider/index.js +2 -2
- package/dist/components/GrSortableList/chunks/GrSortableList-XB7mXM1W.js +277 -0
- package/dist/components/GrSortableList/chunks/GrSortableList-XB7mXM1W.js.map +1 -0
- package/dist/components/GrSortableList/index.js +3 -0
- package/dist/components/GrSplitter/chunks/{GrSplitter-7To8jbJ8.js → GrSplitter-BzxVQwbY.js} +17 -37
- package/dist/components/GrSplitter/chunks/GrSplitter-BzxVQwbY.js.map +1 -0
- package/dist/components/GrSplitter/index.js +2 -2
- package/dist/components/GrStatistic/chunks/{GrStatistic-CttyoYPT.js → GrStatistic-DOsM6s5V.js} +54 -7
- package/dist/components/GrStatistic/chunks/GrStatistic-DOsM6s5V.js.map +1 -0
- package/dist/components/GrStatistic/index.js +2 -2
- package/dist/components/GrSwitch/chunks/{GrSwitch-B9TYbiih.js → GrSwitch-DpyvVrZG.js} +1 -1
- package/dist/components/GrSwitch/chunks/{GrSwitch-B9TYbiih.js.map → GrSwitch-DpyvVrZG.js.map} +1 -1
- package/dist/components/GrSwitch/index.js +2 -2
- package/dist/components/GrTabPanels/index.js +1 -1
- package/dist/components/GrTable/chunks/{GrTable-BB-mI_NM.js → GrTable-BfqgwETQ.js} +7 -1
- package/dist/components/GrTable/chunks/GrTable-BfqgwETQ.js.map +1 -0
- package/dist/components/GrTable/index.js +1 -1
- package/dist/components/GrTabs/chunks/{GrTabs-B8CDq2D9.js → GrTabs-f3-oQenu.js} +55 -65
- package/dist/components/GrTabs/chunks/GrTabs-f3-oQenu.js.map +1 -0
- package/dist/components/GrTabs/index.js +1 -1
- package/dist/components/GrTextarea/chunks/{GrTextarea-DUh5Tlo4.js → GrTextarea-DSvd1nSy.js} +1 -1
- package/dist/components/GrTextarea/chunks/{GrTextarea-DUh5Tlo4.js.map → GrTextarea-DSvd1nSy.js.map} +1 -1
- package/dist/components/GrTextarea/index.js +2 -2
- package/dist/components/GrTimeline/chunks/{GrTimeline-CE9b3s18.js → GrTimeline-B-h2Yanw.js} +1 -1
- package/dist/components/GrTimeline/chunks/{GrTimeline-CE9b3s18.js.map → GrTimeline-B-h2Yanw.js.map} +1 -1
- package/dist/components/GrTimeline/index.js +2 -2
- package/dist/components/GrToaster/chunks/{GrToaster-BKQy3Srm.js → GrToaster-Dqja0Lf9.js} +114 -13
- package/dist/components/GrToaster/chunks/GrToaster-Dqja0Lf9.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-DEbejfhA.js → GrTooltip-Cn08heWz.js} +2 -2
- package/dist/components/GrTooltip/chunks/{GrTooltip-DEbejfhA.js.map → GrTooltip-Cn08heWz.js.map} +1 -1
- package/dist/components/GrTooltip/index.js +2 -2
- package/dist/components/GrTree/chunks/{GrTree-wfdbvygw.js → GrTree-BR9a2pay.js} +148 -111
- package/dist/components/GrTree/chunks/GrTree-BR9a2pay.js.map +1 -0
- package/dist/components/GrTree/index.js +2 -2
- package/dist/components/GrTree/styles.css +1 -1
- package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-lLWmAMtI.js → GrTreeSelect--muUeB0v.js} +28 -14
- package/dist/components/GrTreeSelect/chunks/GrTreeSelect--muUeB0v.js.map +1 -0
- package/dist/components/GrTreeSelect/index.js +1 -1
- package/dist/composables/useAnnouncer.js +1 -1
- package/dist/composables/useComboboxNavigation.js +71 -0
- package/dist/composables/useComboboxNavigation.js.map +1 -0
- package/dist/composables/useDismissible.js +1 -1
- package/dist/composables/useDragGesture.js +55 -0
- package/dist/composables/useDragGesture.js.map +1 -0
- package/dist/composables/useDragSort.js +2 -0
- package/dist/composables/useFloating.js +22 -1
- package/dist/composables/useFloating.js.map +1 -1
- package/dist/composables/useGrComponentConfig.js +2 -0
- package/dist/composables/useGranularityTranslations.js +2 -0
- package/dist/composables/useOverlayLayer.js +64 -1
- package/dist/composables/useOverlayLayer.js.map +1 -0
- package/dist/composables/usePortalTarget.js +1 -1
- package/dist/composables/useRovingFocus.js +150 -0
- package/dist/composables/useRovingFocus.js.map +1 -0
- package/dist/directives/hotkey.js +13 -7
- package/dist/directives/hotkey.js.map +1 -1
- package/dist/directives/loading.js +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 +77 -68
- package/dist/styles/themes/dark.css +6 -1
- package/dist/testing.js +199 -0
- package/dist/testing.js.map +1 -0
- package/dist/theme-apply.js +33 -0
- package/dist/theme-apply.js.map +1 -0
- package/dist/theme.js +501 -0
- package/dist/theme.js.map +1 -0
- package/dist/tokens.js +1 -3131
- package/dist/types/src/components/GrAlert/defaults.d.ts +1 -1
- package/dist/types/src/components/GrAutocomplete/defaults.d.ts +1 -1
- package/dist/types/src/components/GrAvatar/defaults.d.ts +1 -1
- package/dist/types/src/components/GrBadge/defaults.d.ts +1 -1
- package/dist/types/src/components/GrBottomNav/defaults.d.ts +1 -1
- package/dist/types/src/components/GrBreadcrumbs/defaults.d.ts +1 -1
- package/dist/types/src/components/GrBreadcrumbs/grBreadcrumbsStyles.d.ts +5 -2
- package/dist/types/src/components/GrButton/defaults.d.ts +1 -1
- package/dist/types/src/components/GrCard/defaults.d.ts +1 -1
- package/dist/types/src/components/GrCheckbox/defaults.d.ts +1 -1
- package/dist/types/src/components/GrCheckboxGroup/defaults.d.ts +1 -1
- package/dist/types/src/components/GrCollapse/defaults.d.ts +1 -1
- package/dist/types/src/components/GrColorPicker/defaults.d.ts +1 -1
- package/dist/types/src/components/GrColorPicker/grColorPickerStyles.d.ts +2 -2
- package/dist/types/src/components/GrCommandPalette/GrCommandPalette.vue.d.ts +6 -6
- package/dist/types/src/components/GrCommandPalette/defaults.d.ts +1 -1
- package/dist/types/src/components/GrCommandPalette/filtering.d.ts +6 -2
- package/dist/types/src/components/GrConfigProvider/context.d.ts +6 -22
- package/dist/types/src/components/GrConfigProvider/index.d.ts +1 -1
- package/dist/types/src/components/GrConfirmDialog/defaults.d.ts +1 -1
- package/dist/types/src/components/GrDataTable/GrDataTable.vue.d.ts +53 -0
- package/dist/types/src/components/GrDataTable/defaults.d.ts +1 -1
- package/dist/types/src/components/GrDataTable/grDataTableStyles.d.ts +38 -0
- package/dist/types/src/components/GrDialog/defaults.d.ts +1 -1
- package/dist/types/src/components/GrDivider/defaults.d.ts +1 -1
- package/dist/types/src/components/GrDrawer/defaults.d.ts +1 -1
- package/dist/types/src/components/GrEmptyState/defaults.d.ts +1 -1
- package/dist/types/src/components/GrFileUpload/defaults.d.ts +1 -1
- package/dist/types/src/components/GrFormField/defaults.d.ts +1 -1
- package/dist/types/src/components/GrFormFile/defaults.d.ts +1 -1
- package/dist/types/src/components/GrFormSection/defaults.d.ts +1 -1
- package/dist/types/src/components/GrIcon/defaults.d.ts +1 -1
- package/dist/types/src/components/GrImageViewer/composables/usePointerGestures.d.ts +1 -0
- package/dist/types/src/components/GrImageViewer/composables/useZoomPan.d.ts +1 -2
- package/dist/types/src/components/GrInput/defaults.d.ts +1 -1
- package/dist/types/src/components/GrInputTag/defaults.d.ts +1 -1
- package/dist/types/src/components/GrKbd/GrKbd.vue.d.ts +18 -3
- package/dist/types/src/components/GrKbd/defaults.d.ts +1 -1
- package/dist/types/src/components/GrKbd/grKbdStyles.d.ts +20 -3
- package/dist/types/src/components/GrKbd/index.d.ts +6 -0
- package/dist/types/src/components/GrLink/defaults.d.ts +1 -1
- package/dist/types/src/components/GrModal/defaults.d.ts +1 -1
- package/dist/types/src/components/GrNumberInput/defaults.d.ts +1 -1
- package/dist/types/src/components/GrPagination/defaults.d.ts +1 -1
- package/dist/types/src/components/GrPopover/GrPopover.vue.d.ts +1 -1
- package/dist/types/src/components/GrPopover/defaults.d.ts +1 -1
- package/dist/types/src/components/GrProgressBar/defaults.d.ts +1 -1
- package/dist/types/src/components/GrProgressCircle/defaults.d.ts +1 -1
- package/dist/types/src/components/GrProgressCircle/grProgressCircleStyles.d.ts +1 -1
- package/dist/types/src/components/GrPromptDialog/defaults.d.ts +1 -1
- package/dist/types/src/components/GrRadio/defaults.d.ts +1 -1
- package/dist/types/src/components/GrRadio/grRadioGroupContext.d.ts +12 -4
- package/dist/types/src/components/GrRadioGroup/defaults.d.ts +1 -1
- package/dist/types/src/components/GrRating/GrRating.vue.d.ts +9 -4
- package/dist/types/src/components/GrRating/defaults.d.ts +1 -1
- package/dist/types/src/components/GrSegmented/defaults.d.ts +1 -1
- package/dist/types/src/components/GrSelect/defaults.d.ts +1 -1
- package/dist/types/src/components/GrSlider/defaults.d.ts +1 -1
- package/dist/types/src/components/GrSortableList/GrSortableList.vue.d.ts +68 -0
- package/dist/types/src/components/GrSortableList/config.d.ts +1 -0
- package/dist/types/src/components/GrSortableList/grSortableListStyles.d.ts +37 -0
- package/dist/types/src/components/GrSortableList/index.d.ts +9 -0
- package/dist/types/src/components/GrSortableList/safelist.d.ts +1 -0
- package/dist/types/src/components/GrSplitter/defaults.d.ts +1 -1
- package/dist/types/src/components/GrStatistic/GrStatistic.vue.d.ts +12 -9
- package/dist/types/src/components/GrStatistic/defaults.d.ts +1 -1
- package/dist/types/src/components/GrStatistic/grStatisticStyles.d.ts +1 -2
- package/dist/types/src/components/GrSwitch/defaults.d.ts +1 -1
- package/dist/types/src/components/GrTable/GrTable.vue.d.ts +13 -0
- package/dist/types/src/components/GrTable/defaults.d.ts +1 -1
- package/dist/types/src/components/GrTabs/GrTabs.vue.d.ts +6 -2
- package/dist/types/src/components/GrTabs/defaults.d.ts +1 -1
- package/dist/types/src/components/GrTextarea/defaults.d.ts +1 -1
- package/dist/types/src/components/GrTextarea/grTextareaStyles.d.ts +2 -2
- package/dist/types/src/components/GrTimeline/defaults.d.ts +1 -1
- package/dist/types/src/components/GrTimeline/grTimelineStyles.d.ts +1 -1
- package/dist/types/src/components/GrToaster/GrToaster.vue.d.ts +8 -0
- package/dist/types/src/components/GrToaster/grToasterStyles.d.ts +27 -0
- package/dist/types/src/components/GrTooltip/defaults.d.ts +1 -1
- package/dist/types/src/components/GrTree/defaults.d.ts +1 -1
- package/dist/types/src/components/GrTree/grTreeInteractionContext.d.ts +0 -1
- package/dist/types/src/components/GrTree/grTreeProps.d.ts +11 -4
- package/dist/types/src/components/GrTree/safelist.d.ts +1 -1
- package/dist/types/src/components/GrTreeSelect/defaults.d.ts +1 -1
- package/dist/types/src/components/shared/hotkey.d.ts +7 -15
- package/dist/types/src/components/shared/hotkeyTokens.d.ts +37 -0
- package/dist/types/src/components/shared/icon.d.ts +13 -0
- package/dist/types/src/composables/internal/dragSortGeometry.d.ts +59 -0
- package/dist/types/src/composables/internal/overlayStack.d.ts +11 -0
- package/dist/types/src/composables/useDragGesture.d.ts +63 -0
- package/dist/types/src/composables/useDragSort.d.ts +80 -0
- package/dist/types/src/composables/useFloating.d.ts +5 -1
- package/dist/types/src/composables/useGrComponentConfig.d.ts +41 -0
- package/dist/types/src/composables/useGranularityTranslations.d.ts +13 -0
- package/dist/types/src/composables/useRovingFocus.d.ts +108 -0
- package/dist/types/src/granular-provider/shared.d.ts +1 -0
- package/dist/types/src/i18n/messages/en.d.ts +48 -0
- package/dist/types/src/i18n/messages/es.d.ts +48 -0
- package/dist/types/src/i18n/messages/ru.d.ts +48 -0
- package/dist/types/src/index.d.ts +12 -0
- package/dist/types/src/internal/keyboard.d.ts +6 -0
- package/dist/types/src/testing/announcer.d.ts +10 -0
- package/dist/types/src/testing/context.d.ts +36 -0
- package/dist/types/src/testing/env.d.ts +25 -0
- package/dist/types/src/testing/geometry.d.ts +23 -0
- package/dist/types/src/testing/index.d.ts +12 -0
- package/dist/types/src/testing/pointer.d.ts +31 -0
- package/dist/types/src/theme/apply.d.ts +27 -0
- package/dist/types/src/theme/color.d.ts +35 -0
- package/dist/types/src/theme/extendTheme.d.ts +63 -0
- package/dist/types/src/theme/index.d.ts +22 -0
- package/dist/types/src/theme/roles.d.ts +16 -0
- package/dist/types/src/theme/tone.d.ts +32 -0
- package/dist/types/src/theme/validate.d.ts +16 -0
- package/dist/types/src/tokens/types.d.ts +8 -0
- package/dist/web-types.json +214 -13
- package/package.json +47 -4
- package/tokens/themes/dark.json +2 -1
- package/dist/chunks/chevron-right-BfqMVpbB.js.map +0 -1
- package/dist/chunks/config-8Pcutu1j.js.map +0 -1
- package/dist/chunks/config-B-g6lT19.js.map +0 -1
- package/dist/chunks/config-BE6n20np.js.map +0 -1
- package/dist/chunks/config-BKvX0q10.js.map +0 -1
- package/dist/chunks/config-BNfQwyL4.js +0 -97
- package/dist/chunks/config-BNfQwyL4.js.map +0 -1
- package/dist/chunks/config-BoNR7_PD.js.map +0 -1
- package/dist/chunks/config-CN2ULSQL2.js.map +0 -1
- package/dist/chunks/config-CY0_6cMi.js.map +0 -1
- package/dist/chunks/config-Cw6TDzWv2.js.map +0 -1
- package/dist/chunks/config-D8tSR2uS.js.map +0 -1
- package/dist/chunks/config-DpqOnJiz2.js.map +0 -1
- package/dist/chunks/config-DxCTVBfx.js.map +0 -1
- package/dist/chunks/config-LGrZIdaZ.js +0 -21
- package/dist/chunks/config-LGrZIdaZ.js.map +0 -1
- package/dist/chunks/config-Rw9OyW70.js.map +0 -1
- package/dist/chunks/config-T3qdQBgU.js.map +0 -1
- package/dist/chunks/config-eXB87DOi2.js.map +0 -1
- package/dist/chunks/en-B3xMeswz.js.map +0 -1
- package/dist/chunks/es-CA-mkU--.js.map +0 -1
- package/dist/chunks/grKbdStyles-DAoxiytu.js +0 -31
- package/dist/chunks/grKbdStyles-DAoxiytu.js.map +0 -1
- package/dist/chunks/granular-provider-CtrXGa7c.js.map +0 -1
- package/dist/chunks/keyboard-zYvvyHd4.js.map +0 -1
- package/dist/chunks/optionFilter-BVY988pC.js.map +0 -1
- package/dist/chunks/ru-COWxgh2A.js.map +0 -1
- package/dist/chunks/useOverlayLayer-BupuP_hs.js.map +0 -1
- package/dist/components/GrAutocomplete/chunks/GrAutocomplete-CQ9T7Lly.js.map +0 -1
- package/dist/components/GrBreadcrumbs/chunks/GrBreadcrumbs-BCNGDS6k.js.map +0 -1
- package/dist/components/GrCommandPalette/chunks/GrCommandPalette-MWDYDPNC.js.map +0 -1
- package/dist/components/GrDataTable/chunks/GrDataTable-DVFho9Cj.js.map +0 -1
- package/dist/components/GrImageViewer/chunks/GrImageViewer-BeCnE8XQ.js.map +0 -1
- package/dist/components/GrInput/chunks/GrInput-DD2gYdqS.js.map +0 -1
- package/dist/components/GrInputTag/chunks/GrInputTag-DmNunixz.js.map +0 -1
- package/dist/components/GrKbd/chunks/GrKbd-DRFPvW3G.js.map +0 -1
- package/dist/components/GrPagination/chunks/GrPagination-B6N0QZBf.js.map +0 -1
- package/dist/components/GrProgressBar/chunks/GrProgressBar-BiHnaitu.js.map +0 -1
- package/dist/components/GrRadio/chunks/GrRadio-DksDro_U.js.map +0 -1
- package/dist/components/GrRadioGroup/chunks/GrRadioGroup-BOIhejE6.js.map +0 -1
- package/dist/components/GrRating/chunks/GrRating-JrHXz0Rv.js.map +0 -1
- package/dist/components/GrSegmented/chunks/GrSegmented-BQIlH5KI.js.map +0 -1
- package/dist/components/GrSelect/chunks/GrSelect-aqkPCqjd.js.map +0 -1
- package/dist/components/GrSlider/chunks/GrSlider-DkU9IQSX.js.map +0 -1
- package/dist/components/GrSplitter/chunks/GrSplitter-7To8jbJ8.js.map +0 -1
- package/dist/components/GrStatistic/chunks/GrStatistic-CttyoYPT.js.map +0 -1
- package/dist/components/GrTable/chunks/GrTable-BB-mI_NM.js.map +0 -1
- package/dist/components/GrTabs/chunks/GrTabs-B8CDq2D9.js.map +0 -1
- package/dist/components/GrToaster/chunks/GrToaster-BKQy3Srm.js.map +0 -1
- package/dist/components/GrTree/chunks/GrTree-wfdbvygw.js.map +0 -1
- package/dist/components/GrTreeSelect/chunks/GrTreeSelect-lLWmAMtI.js.map +0 -1
- package/dist/tokens.js.map +0 -1
- package/dist/chunks/{config-8Pcutu1j.js → config-8Pcutu1j2.js} +0 -0
- package/dist/chunks/{config-BE6n20np.js → config-BE6n20np2.js} +0 -0
- package/dist/chunks/{config-BKvX0q10.js → config-BKvX0q102.js} +0 -0
- package/dist/chunks/{config-BoNR7_PD.js → config-BoNR7_PD2.js} +0 -0
- package/dist/chunks/{config-CN2ULSQL2.js → config-CN2ULSQL.js} +0 -0
- package/dist/chunks/{config-CY0_6cMi.js → config-CY0_6cMi2.js} +0 -0
- package/dist/chunks/{config-Rw9OyW70.js → config-Rw9OyW702.js} +0 -0
- package/dist/chunks/{config-T3qdQBgU.js → config-T3qdQBgU2.js} +0 -0
- package/dist/chunks/{config-eXB87DOi2.js → config-eXB87DOi.js} +0 -0
- package/dist/components/GrCollapse/chunks/{GrCollapse-B2Fc6A9r.js → GrCollapse-Kk0DE8tb.js} +1 -1
- /package/dist/types/src/composables/{internal/useComboboxNavigation.d.ts → useComboboxNavigation.d.ts} +0 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { computed, ref } from "vue";
|
|
2
|
+
//#region src/composables/useRovingFocus.ts
|
|
3
|
+
function useRovingFocus(options) {
|
|
4
|
+
const activeKey = ref();
|
|
5
|
+
const orientation = () => options.orientation?.() ?? "vertical";
|
|
6
|
+
const wraps = () => options.wrap?.() ?? true;
|
|
7
|
+
const skips = () => options.skipDisabled?.() ?? false;
|
|
8
|
+
const disabled = (key) => options.isDisabled?.(key) ?? false;
|
|
9
|
+
function firstFocusable(items) {
|
|
10
|
+
if (!skips()) return items[0];
|
|
11
|
+
return items.find((key) => !disabled(key)) ?? items[0];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Роверный элемент. Порядок: явно активный (если ещё в наборе) → стартовый →
|
|
15
|
+
* первый доступный. Именно здесь живёт инвариант «ровно один `tabindex=0`»:
|
|
16
|
+
* пока набор непуст, ответ не бывает пустым.
|
|
17
|
+
*/
|
|
18
|
+
const rovingKey = computed(() => {
|
|
19
|
+
const items = options.items();
|
|
20
|
+
if (items.length === 0) return void 0;
|
|
21
|
+
const active = activeKey.value;
|
|
22
|
+
if (active !== void 0 && items.includes(active)) return active;
|
|
23
|
+
const initial = options.initialKey?.();
|
|
24
|
+
if (initial !== void 0 && items.includes(initial)) return initial;
|
|
25
|
+
return firstFocusable(items);
|
|
26
|
+
});
|
|
27
|
+
function tabindexFor(key) {
|
|
28
|
+
return rovingKey.value === key ? 0 : -1;
|
|
29
|
+
}
|
|
30
|
+
function setActive(key) {
|
|
31
|
+
activeKey.value = key;
|
|
32
|
+
}
|
|
33
|
+
function reset() {
|
|
34
|
+
activeKey.value = void 0;
|
|
35
|
+
}
|
|
36
|
+
function focusKey(key) {
|
|
37
|
+
const previous = rovingKey.value;
|
|
38
|
+
activeKey.value = key;
|
|
39
|
+
if (key !== previous) options.onMove?.(key, previous);
|
|
40
|
+
const focusNow = () => {
|
|
41
|
+
options.elementFor(key)?.focus();
|
|
42
|
+
};
|
|
43
|
+
const pending = options.beforeFocus?.(key);
|
|
44
|
+
if (pending && typeof pending.then === "function") return pending.then(focusNow);
|
|
45
|
+
focusNow();
|
|
46
|
+
return Promise.resolve();
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Индекс цели после сдвига. `undefined` — движение невозможно: упёрлись в
|
|
50
|
+
* край без зацикливания либо весь набор выключен.
|
|
51
|
+
*/
|
|
52
|
+
function targetIndex(from, delta) {
|
|
53
|
+
const items = options.items();
|
|
54
|
+
const len = items.length;
|
|
55
|
+
if (len === 0 || delta === 0) return void 0;
|
|
56
|
+
let index = from;
|
|
57
|
+
for (let attempt = 0; attempt < len; attempt += 1) {
|
|
58
|
+
const next = index + delta;
|
|
59
|
+
if (next < 0 || next >= len) {
|
|
60
|
+
if (!wraps()) return void 0;
|
|
61
|
+
index = (next % len + len) % len;
|
|
62
|
+
} else index = next;
|
|
63
|
+
if (!skips() || !disabled(items[index])) return index;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function currentIndex() {
|
|
67
|
+
const items = options.items();
|
|
68
|
+
const key = rovingKey.value;
|
|
69
|
+
return key === void 0 ? -1 : items.indexOf(key);
|
|
70
|
+
}
|
|
71
|
+
function moveBy(delta) {
|
|
72
|
+
const items = options.items();
|
|
73
|
+
const from = currentIndex();
|
|
74
|
+
if (from < 0) return false;
|
|
75
|
+
const target = targetIndex(from, delta);
|
|
76
|
+
if (target === void 0) {
|
|
77
|
+
const edge = delta > 0 ? "end" : "start";
|
|
78
|
+
return options.onOverflow?.(edge, delta) ?? false;
|
|
79
|
+
}
|
|
80
|
+
focusKey(items[target]);
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
function rowBounds(index) {
|
|
84
|
+
const len = options.items().length;
|
|
85
|
+
const width = Math.max(1, options.columns?.() ?? len);
|
|
86
|
+
const row = Math.floor(index / width);
|
|
87
|
+
return [row * width, Math.min(row * width + width - 1, len - 1)];
|
|
88
|
+
}
|
|
89
|
+
function moveToEdge(edge) {
|
|
90
|
+
const items = options.items();
|
|
91
|
+
if (items.length === 0) return false;
|
|
92
|
+
const from = currentIndex();
|
|
93
|
+
const [start, end] = orientation() === "grid" && from >= 0 ? rowBounds(from) : [0, items.length - 1];
|
|
94
|
+
const target = edge === "start" ? start : end;
|
|
95
|
+
if (!skips()) {
|
|
96
|
+
focusKey(items[target]);
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
const direction = edge === "start" ? 1 : -1;
|
|
100
|
+
for (let index = target; index >= start && index <= end; index += direction) {
|
|
101
|
+
const key = items[index];
|
|
102
|
+
if (!disabled(key)) {
|
|
103
|
+
focusKey(key);
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
/** Шаг вперёд/назад по объявленной ориентации; `0` — клавиша этой оси не касается. */
|
|
110
|
+
function deltaForKey(key) {
|
|
111
|
+
const mode = orientation();
|
|
112
|
+
const columns = Math.max(1, options.columns?.() ?? 1);
|
|
113
|
+
switch (key) {
|
|
114
|
+
case "ArrowRight": return mode === "vertical" ? 0 : 1;
|
|
115
|
+
case "ArrowLeft": return mode === "vertical" ? 0 : -1;
|
|
116
|
+
case "ArrowDown":
|
|
117
|
+
if (mode === "horizontal") return 0;
|
|
118
|
+
return mode === "grid" ? columns : 1;
|
|
119
|
+
case "ArrowUp":
|
|
120
|
+
if (mode === "horizontal") return 0;
|
|
121
|
+
return mode === "grid" ? -columns : -1;
|
|
122
|
+
default: return 0;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
function handleNavigationKeys(event) {
|
|
126
|
+
if (event.altKey || event.ctrlKey || event.metaKey) return false;
|
|
127
|
+
if (event.key === "Home" || event.key === "End") {
|
|
128
|
+
const moved = moveToEdge(event.key === "Home" ? "start" : "end");
|
|
129
|
+
if (moved) event.preventDefault();
|
|
130
|
+
return moved;
|
|
131
|
+
}
|
|
132
|
+
const delta = deltaForKey(event.key);
|
|
133
|
+
if (delta === 0) return false;
|
|
134
|
+
const moved = moveBy(delta);
|
|
135
|
+
if (moved) event.preventDefault();
|
|
136
|
+
return moved;
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
rovingKey,
|
|
140
|
+
tabindexFor,
|
|
141
|
+
setActive,
|
|
142
|
+
reset,
|
|
143
|
+
focusKey,
|
|
144
|
+
moveBy,
|
|
145
|
+
moveToEdge,
|
|
146
|
+
handleNavigationKeys
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
//#endregion
|
|
150
|
+
export { useRovingFocus };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRovingFocus.js","names":[],"sources":["../../src/composables/useRovingFocus.ts"],"sourcesContent":["import type { ComputedRef, Ref } from 'vue'\nimport { computed, ref } from 'vue'\n\n/**\n * Roving tabindex: группа — одна остановка `Tab`, внутрь заходят стрелками.\n *\n * Механика написана в пакете шесть раз (`GrDropdownMenu`, `GrTree`, `GrTabs`,\n * `GrSegmented`, `GrRadio`, `GrInputTag`) и разошлась не стилистически, а по\n * существу: у одних кольцо зациклено, у других упирается в края; одни\n * пропускают выключенные элементы, другие намеренно нет; адресуются то\n * индексом, то ключом, то значением. Каждое расхождение здесь стало опцией —\n * поэтому опций много, и это дешевле, чем седьмая копия.\n *\n * Осознанно **не** обобщается активация: `Enter`/`Space` и «двигает ли стрелка\n * выбор» — доменная логика компонента. У `GrSegmented` и `GrRadio` стрелка\n * меняет значение, у `GrTree` и `GrInputTag` — нет, у `GrTabs` это проп.\n * Примитив ведёт фокус и отдаёт `onMove`; что делать с переездом, решает\n * компонент.\n *\n * Инвариант «ровно один элемент с `tabindex=\"0\"`» держит `rovingKey`: это\n * `computed`, а не `ref`, поэтому при смене набора он самокорректируется в\n * момент чтения. Отдельная нормализация с `watch(..., { flush: 'sync' })`,\n * как в `GrTree`, больше не нужна.\n */\n\n/** Какие стрелки ведут по набору. */\nexport type GrRovingOrientation = 'horizontal' | 'vertical' | 'both' | 'grid'\n\n/** Край набора, в который упёрлось движение. */\nexport type GrRovingEdge = 'start' | 'end'\n\nexport interface UseRovingFocusOptions<TKey> {\n /** Ключи элементов в порядке отображения. Индекс, значение, opaque-ключ — что угодно сравнимое по `===`. */\n items: () => readonly TKey[]\n /**\n * DOM-узел элемента. Массив ref-ов, `Map`, `querySelector` — примитиву\n * безразлично, знать раскладку обязан компонент.\n */\n elementFor: (key: TKey) => HTMLElement | null | undefined\n /** Выключен ли элемент. Спрашивается только при `skipDisabled`. */\n isDisabled?: (key: TKey) => boolean\n /** По умолчанию `vertical`. */\n orientation?: () => GrRovingOrientation\n /** Ширина строки для `orientation: 'grid'`. Игнорируется в остальных режимах. */\n columns?: () => number\n /** Замкнуто ли кольцо. По умолчанию `true`. */\n wrap?: () => boolean\n /**\n * Пропускать выключенные при движении. По умолчанию `false`: в паттерне\n * `menu` выключенный пункт остаётся в обходе намеренно — `aria-disabled`\n * оставляет его фокусируемым, чтобы скринридер прочёл, что он есть.\n */\n skipDisabled?: () => boolean\n /**\n * Стартовый элемент, когда фокус в группе ещё не был — обычно выбранное\n * значение.\n *\n * **Выключенность здесь не проверяется, и это не упущение.** Проверить её\n * автоматически по `isDisabled` нельзя: у `GrSegmented` загружающийся сегмент\n * остановку `Tab` сохраняет, хотя для движения заблокирован, а у `GrRadio`\n * выключенный переключатель терять её обязан. Условие знает только вызывающий,\n * поэтому геттер обязан вернуть `undefined` для значения, которое не может\n * принять фокус. Забыть об этом — значит оставить группу без остановки `Tab`\n * вовсе: элемент с `tabindex=\"0\"` будет назначен, но отрисует `-1`.\n */\n initialKey?: () => TKey | undefined\n /**\n * Позиция переехала — компонент решает, менять ли заодно выбор. Вызывается\n * **до** переноса фокуса: в `radiogroup` стрелка переносит выбор, и модель\n * обязана примениться раньше, чем сфокусируется целевой элемент.\n */\n onMove?: (key: TKey, previous: TKey | undefined) => void\n /**\n * Движение упёрлось в край при `wrap: false`. Вернул `true` — считаем клавишу\n * обработанной (кольцо `GrInputTag` так отдаёт фокус полю ввода, календарь —\n * листает месяц).\n */\n onOverflow?: (edge: GrRovingEdge, delta: number) => boolean\n /**\n * Донести элемент до экрана перед фокусом: виртуализация, `scrollIntoView`,\n * ожидание перерисовки после `onMove`. Вернул промис — фокус ждёт ровно его,\n * без добавленных примитивом тиков; вернул `undefined` — фокус остаётся\n * синхронным, чтобы не менять тайминг у компонентов, которые на него\n * полагаются.\n */\n beforeFocus?: (key: TKey) => void | Promise<void>\n}\n\nexport interface UseRovingFocusReturn<TKey> {\n /** Элемент, который держит `tabindex=\"0\"`. Никогда не «никто» при непустом наборе. */\n rovingKey: ComputedRef<TKey | undefined>\n /** `0` для роверного элемента, `-1` для всех остальных. */\n tabindexFor: (key: TKey) => 0 | -1\n /** Сделать активным без переноса фокуса — для синхронизации с мышью (`@focus`, `@click`). */\n setActive: (key: TKey) => void\n /**\n * Забыть явно наведённый фокус: остановка `Tab` возвращается к производной\n * (`initialKey` → первый доступный). Нужно, когда набор опустел, — иначе\n * устаревший ключ всплывёт, как только элементы появятся снова.\n */\n reset: () => void\n /** Сделать активным и перенести фокус. */\n focusKey: (key: TKey) => Promise<void>\n /** Сдвиг на `delta` позиций от текущего. Вернёт `false`, если движение не состоялось. */\n moveBy: (delta: number) => boolean\n /** На край набора (в `grid` — на край текущей строки). */\n moveToEdge: (edge: GrRovingEdge) => boolean\n /**\n * Стрелки, `Home`, `End` по объявленной ориентации. Возвращает `true`, если\n * клавиша обработана (с `preventDefault`) — остальное компонент разбирает сам.\n */\n handleNavigationKeys: (event: KeyboardEvent) => boolean\n}\n\nexport function useRovingFocus<TKey>(\n options: UseRovingFocusOptions<TKey>,\n): UseRovingFocusReturn<TKey> {\n const activeKey: Ref<TKey | undefined> = ref()\n\n const orientation = (): GrRovingOrientation => options.orientation?.() ?? 'vertical'\n const wraps = (): boolean => options.wrap?.() ?? true\n const skips = (): boolean => options.skipDisabled?.() ?? false\n const disabled = (key: TKey): boolean => options.isDisabled?.(key) ?? false\n\n function firstFocusable(items: readonly TKey[]): TKey | undefined {\n if (!skips()) return items[0]\n return items.find(key => !disabled(key)) ?? items[0]\n }\n\n /**\n * Роверный элемент. Порядок: явно активный (если ещё в наборе) → стартовый →\n * первый доступный. Именно здесь живёт инвариант «ровно один `tabindex=0`»:\n * пока набор непуст, ответ не бывает пустым.\n */\n const rovingKey = computed<TKey | undefined>(() => {\n const items = options.items()\n if (items.length === 0) return undefined\n\n const active = activeKey.value\n if (active !== undefined && items.includes(active)) return active\n\n const initial = options.initialKey?.()\n if (initial !== undefined && items.includes(initial)) return initial\n\n return firstFocusable(items)\n })\n\n function tabindexFor(key: TKey): 0 | -1 {\n return rovingKey.value === key ? 0 : -1\n }\n\n function setActive(key: TKey): void {\n activeKey.value = key\n }\n\n function reset(): void {\n activeKey.value = undefined\n }\n\n function focusKey(key: TKey): Promise<void> {\n const previous = rovingKey.value\n activeKey.value = key\n\n // Состояние — до фокуса: `onMove` часто меняет модель (в `radiogroup`\n // стрелка переносит выбор), и компонент вправе рассчитывать, что к моменту\n // фокуса оно уже применено.\n if (key !== previous) options.onMove?.(key, previous)\n\n const focusNow = (): void => {\n options.elementFor(key)?.focus()\n }\n\n const pending = options.beforeFocus?.(key)\n if (pending && typeof pending.then === 'function') {\n return pending.then(focusNow)\n }\n\n focusNow()\n return Promise.resolve()\n }\n\n /**\n * Индекс цели после сдвига. `undefined` — движение невозможно: упёрлись в\n * край без зацикливания либо весь набор выключен.\n */\n function targetIndex(from: number, delta: number): number | undefined {\n const items = options.items()\n const len = items.length\n if (len === 0 || delta === 0) return undefined\n\n let index = from\n\n // Шагов не больше размера набора: полный оборот без единого доступного\n // элемента означает, что двигаться некуда. Шаг на каждой итерации тот же —\n // выключенный элемент в сетке перешагивается по вертикали, сохраняя\n // колонку; прыжок «вбок» был бы неожиданным.\n for (let attempt = 0; attempt < len; attempt += 1) {\n const next = index + delta\n\n if (next < 0 || next >= len) {\n if (!wraps()) return undefined\n // Зацикливание по модулю набора. Колонку это сохраняет, когда длина\n // кратна ширине строки — у календарной сетки 42 = 6 × 7 так и есть.\n index = ((next % len) + len) % len\n }\n else {\n index = next\n }\n\n if (!skips() || !disabled(items[index])) return index\n }\n\n return undefined\n }\n\n function currentIndex(): number {\n const items = options.items()\n const key = rovingKey.value\n return key === undefined ? -1 : items.indexOf(key)\n }\n\n function moveBy(delta: number): boolean {\n const items = options.items()\n // `rovingKey` пуст только при пустом наборе — двигаться нечем.\n const from = currentIndex()\n if (from < 0) return false\n\n const target = targetIndex(from, delta)\n if (target === undefined) {\n const edge: GrRovingEdge = delta > 0 ? 'end' : 'start'\n return options.onOverflow?.(edge, delta) ?? false\n }\n\n void focusKey(items[target])\n return true\n }\n\n function rowBounds(index: number): [number, number] {\n const len = options.items().length\n const width = Math.max(1, options.columns?.() ?? len)\n const row = Math.floor(index / width)\n return [row * width, Math.min(row * width + width - 1, len - 1)]\n }\n\n function moveToEdge(edge: GrRovingEdge): boolean {\n const items = options.items()\n if (items.length === 0) return false\n\n const from = currentIndex()\n // В сетке `Home`/`End` — края строки (в календаре это начало и конец\n // недели); в линейных режимах — края всего набора.\n const [start, end] = orientation() === 'grid' && from >= 0\n ? rowBounds(from)\n : [0, items.length - 1]\n\n const target = edge === 'start' ? start : end\n if (!skips()) {\n void focusKey(items[target])\n return true\n }\n\n const direction = edge === 'start' ? 1 : -1\n for (let index = target; index >= start && index <= end; index += direction) {\n const key = items[index]\n if (!disabled(key)) {\n void focusKey(key)\n return true\n }\n }\n return false\n }\n\n /** Шаг вперёд/назад по объявленной ориентации; `0` — клавиша этой оси не касается. */\n function deltaForKey(key: string): number {\n const mode = orientation()\n const columns = Math.max(1, options.columns?.() ?? 1)\n\n switch (key) {\n case 'ArrowRight':\n return mode === 'vertical' ? 0 : 1\n case 'ArrowLeft':\n return mode === 'vertical' ? 0 : -1\n case 'ArrowDown':\n if (mode === 'horizontal') return 0\n return mode === 'grid' ? columns : 1\n case 'ArrowUp':\n if (mode === 'horizontal') return 0\n return mode === 'grid' ? -columns : -1\n default:\n return 0\n }\n }\n\n function handleNavigationKeys(event: KeyboardEvent): boolean {\n if (event.altKey || event.ctrlKey || event.metaKey) return false\n\n if (event.key === 'Home' || event.key === 'End') {\n const moved = moveToEdge(event.key === 'Home' ? 'start' : 'end')\n if (moved) event.preventDefault()\n return moved\n }\n\n const delta = deltaForKey(event.key)\n if (delta === 0) return false\n\n const moved = moveBy(delta)\n if (moved) event.preventDefault()\n return moved\n }\n\n return { rovingKey, tabindexFor, setActive, reset, focusKey, moveBy, moveToEdge, handleNavigationKeys }\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { a as shiftSatisfied, i as isEditableTarget, n as isAppleDevice, r as isComposingEvent, t as eventMatchesKey } from "../chunks/keyboard-DE2yhz_b.js";
|
|
2
2
|
//#region src/directives/hotkey.ts
|
|
3
3
|
var states = /* @__PURE__ */ new WeakMap();
|
|
4
4
|
function normalizeBinding(value) {
|
|
@@ -36,13 +36,15 @@ function parseHotkeys(map) {
|
|
|
36
36
|
if (!parts.length) continue;
|
|
37
37
|
let ctrl = false;
|
|
38
38
|
let meta = false;
|
|
39
|
+
let mod = false;
|
|
39
40
|
let alt = false;
|
|
40
41
|
let shift = false;
|
|
41
42
|
const keyToken = parts.at(-1);
|
|
42
43
|
if (!keyToken) continue;
|
|
43
44
|
for (const p of parts.slice(0, -1)) {
|
|
44
45
|
const t = p.toLowerCase();
|
|
45
|
-
if (t === "
|
|
46
|
+
if (t === "mod") mod = true;
|
|
47
|
+
else if (t === "ctrl" || t === "control") ctrl = true;
|
|
46
48
|
else if (t === "meta" || t === "cmd" || t === "command" || t === "⌘") meta = true;
|
|
47
49
|
else if (t === "alt" || t === "option") alt = true;
|
|
48
50
|
else if (t === "shift") shift = true;
|
|
@@ -53,6 +55,7 @@ function parseHotkeys(map) {
|
|
|
53
55
|
key,
|
|
54
56
|
ctrl,
|
|
55
57
|
meta,
|
|
58
|
+
mod,
|
|
56
59
|
alt,
|
|
57
60
|
shift,
|
|
58
61
|
entry
|
|
@@ -61,11 +64,14 @@ function parseHotkeys(map) {
|
|
|
61
64
|
return parsed;
|
|
62
65
|
}
|
|
63
66
|
function matchesHotkey(event, hk) {
|
|
64
|
-
|
|
65
|
-
|
|
67
|
+
const apple = hk.mod ? isAppleDevice() : false;
|
|
68
|
+
const expectMeta = hk.meta || hk.mod && apple;
|
|
69
|
+
const expectCtrl = hk.ctrl || hk.mod && !apple;
|
|
70
|
+
if (expectCtrl !== event.ctrlKey) return false;
|
|
71
|
+
if (expectMeta !== event.metaKey) return false;
|
|
66
72
|
if (hk.alt !== event.altKey) return false;
|
|
67
73
|
if (!shiftSatisfied(event, hk.key, hk.shift)) return false;
|
|
68
|
-
return eventMatchesKey(event, hk.key, { codeFallback:
|
|
74
|
+
return eventMatchesKey(event, hk.key, { codeFallback: expectCtrl || expectMeta || hk.alt });
|
|
69
75
|
}
|
|
70
76
|
function resolveEntry(entry) {
|
|
71
77
|
if (typeof entry === "function") return {
|
|
@@ -112,9 +118,9 @@ var vHotkey = {
|
|
|
112
118
|
for (const hk of current.hotkeys) {
|
|
113
119
|
if (!matchesHotkey(event, hk)) continue;
|
|
114
120
|
const entry = resolveEntry(hk.entry);
|
|
115
|
-
const hasModifier = hk.ctrl || hk.meta || hk.alt || hk.shift;
|
|
121
|
+
const hasModifier = hk.ctrl || hk.meta || hk.mod || hk.alt || hk.shift;
|
|
116
122
|
if (editable && !entry.allowInEditable && !hasModifier && hk.key !== "Escape") continue;
|
|
117
|
-
if (entry.preventDefault ?? (hk.ctrl || hk.meta || hk.alt)) event.preventDefault();
|
|
123
|
+
if (entry.preventDefault ?? (hk.ctrl || hk.meta || hk.mod || hk.alt)) event.preventDefault();
|
|
118
124
|
if (entry.stopPropagation) event.stopPropagation();
|
|
119
125
|
entry.handler(event);
|
|
120
126
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hotkey.js","names":[],"sources":["../../src/directives/hotkey.ts"],"sourcesContent":["import type { Directive } from 'vue'\n\nimport { eventMatchesKey, isComposingEvent, isEditableTarget, shiftSatisfied } from '../internal/keyboard'\n\nexport type HotkeyHandler = (event: KeyboardEvent) => void\n\nexport type HotkeyEntry =\n | HotkeyHandler\n | {\n handler: HotkeyHandler\n /** По умолчанию: `true` для комбинаций с Ctrl/Meta/Alt, иначе `false`. */\n preventDefault?: boolean\n /** По умолчанию `false`. */\n stopPropagation?: boolean\n /** Разрешить срабатывать, когда фокус в `input/textarea/[contenteditable]`. */\n allowInEditable?: boolean\n }\n\nexport type HotkeyMap = Record<string, HotkeyEntry>\n\n/**\n * Где слушать клавиатуру:\n * - `'global'` (по умолчанию) — слушатель на `window`; хоткеи работают из любого места страницы.\n * - `'element'` — слушатель на самом элементе; хоткеи срабатывают только когда фокус внутри\n * элемента (событие всплывает до него). Элемент должен быть фокусируемым (`tabindex`).\n */\nexport type HotkeyScope = 'global' | 'element'\n\nexport type HotkeyBindingValue =\n | HotkeyMap\n | {\n handlers: HotkeyMap\n enabled?: boolean\n scope?: HotkeyScope\n }\n\ntype ParsedHotkey = {\n original: string\n key: string\n ctrl: boolean\n meta: boolean\n alt: boolean\n shift: boolean\n entry: HotkeyEntry\n}\n\ntype InternalState = {\n enabled: boolean\n hotkeys: ParsedHotkey[]\n listener: (event: KeyboardEvent) => void\n /** Цель, на которой висит слушатель (`window` для 'global', сам `el` для 'element'). */\n target: Window | HTMLElement\n}\n\nconst states = new WeakMap<HTMLElement, InternalState>()\n\nfunction normalizeBinding(value: HotkeyBindingValue | undefined) {\n if (!value) return { enabled: false, handlers: {} as HotkeyMap, scope: 'global' as HotkeyScope }\n if ('handlers' in (value as any)) {\n const v = value as { handlers: HotkeyMap; enabled?: boolean; scope?: HotkeyScope }\n return { enabled: v.enabled ?? true, handlers: v.handlers ?? {}, scope: v.scope ?? 'global' }\n }\n return { enabled: true, handlers: value as HotkeyMap, scope: 'global' as HotkeyScope }\n}\n\nfunction normalizeKeyToken(token: string): string {\n const t = token.trim().toLowerCase()\n if (t === 'esc') return 'Escape'\n if (t === 'escape') return 'Escape'\n if (t === 'space') return ' '\n if (t.length === 1) return t\n return token.trim()\n}\n\nfunction parseHotkeys(map: HotkeyMap): ParsedHotkey[] {\n const parsed: ParsedHotkey[] = []\n\n for (const [combo, entry] of Object.entries(map)) {\n const parts = combo\n .split('+')\n .map(p => p.trim())\n .filter(Boolean)\n\n if (!parts.length) continue\n\n let ctrl = false\n let meta = false\n let alt = false\n let shift = false\n\n const keyToken = parts.at(-1)\n if (!keyToken) continue\n for (const p of parts.slice(0, -1)) {\n const t = p.toLowerCase()\n if (t === 'ctrl' || t === 'control') ctrl = true\n else if (t === 'meta' || t === 'cmd' || t === 'command' || t === '⌘') meta = true\n else if (t === 'alt' || t === 'option') alt = true\n else if (t === 'shift') shift = true\n }\n\n const key = normalizeKeyToken(keyToken)\n parsed.push({ original: combo, key, ctrl, meta, alt, shift, entry })\n }\n\n return parsed\n}\n\nfunction matchesHotkey(event: KeyboardEvent, hk: ParsedHotkey): boolean {\n if (hk.ctrl !== event.ctrlKey) return false\n if (hk.meta !== event.metaKey) return false\n if (hk.alt !== event.altKey) return false\n if (!shiftSatisfied(event, hk.key, hk.shift)) return false\n\n // По физическому коду матчатся только комбинации с модификаторами: там\n // клавиша — позиция на клавиатуре, и `Ctrl+K` обязан работать на любой\n // раскладке. Одиночная клавиша — печатная, её раскладка и определяет.\n return eventMatchesKey(event, hk.key, { codeFallback: hk.ctrl || hk.meta || hk.alt })\n}\n\nfunction resolveEntry(entry: HotkeyEntry) {\n if (typeof entry === 'function') {\n return {\n handler: entry,\n preventDefault: undefined as boolean | undefined,\n stopPropagation: false,\n allowInEditable: false,\n }\n }\n\n return {\n handler: entry.handler,\n preventDefault: entry.preventDefault,\n stopPropagation: entry.stopPropagation ?? false,\n allowInEditable: entry.allowInEditable ?? false,\n }\n}\n\n/**\n * `v-hotkey` — горячие клавиши на компонент/страницу.\n *\n * Пример:\n * ```vue\n * <div v-hotkey=\"{ 'Escape': close, 'Ctrl+K': openSearch }\" />\n * ```\n *\n * По умолчанию слушатель глобальный (`window`). Чтобы хоткеи срабатывали только\n * когда фокус внутри элемента, используйте `scope: 'element'`:\n * ```vue\n * <div tabindex=\"0\" v-hotkey=\"{ handlers: { 'j': next }, scope: 'element' }\" />\n * ```\n */\nexport const vHotkey: Directive<HTMLElement, HotkeyBindingValue> = {\n mounted(el, binding) {\n if (typeof window === 'undefined') return\n\n const { enabled, handlers, scope } = normalizeBinding(binding.value)\n const target: Window | HTMLElement = scope === 'element' ? el : window\n\n const state: InternalState = {\n enabled,\n hotkeys: parseHotkeys(handlers),\n listener: (event: KeyboardEvent) => {\n const current = states.get(el)\n if (!current?.enabled) return\n if (!el.isConnected) return\n // Клавиша во время IME-композиции принадлежит композиции, а не хоткею.\n if (isComposingEvent(event)) return\n\n const editable = isEditableTarget(event.target)\n\n for (const hk of current.hotkeys) {\n if (!matchesHotkey(event, hk)) continue\n\n const entry = resolveEntry(hk.entry)\n\n // По умолчанию не перехватываем \"простые\" клавиши во время ввода.\n const hasModifier = hk.ctrl || hk.meta || hk.alt || hk.shift\n if (editable && !entry.allowInEditable && !hasModifier && hk.key !== 'Escape') {\n continue\n }\n\n const preventDefault = entry.preventDefault ?? (hk.ctrl || hk.meta || hk.alt)\n if (preventDefault) event.preventDefault()\n if (entry.stopPropagation) event.stopPropagation()\n\n entry.handler(event)\n return\n }\n },\n target,\n }\n\n states.set(el, state)\n target.addEventListener('keydown', state.listener as EventListener)\n },\n updated(el, binding) {\n const state = states.get(el)\n if (!state) return\n\n const next = normalizeBinding(binding.value)\n state.enabled = next.enabled\n state.hotkeys = parseHotkeys(next.handlers)\n\n // Смена scope на лету — переносим слушатель на новую цель.\n const nextTarget: Window | HTMLElement = next.scope === 'element' ? el : window\n if (nextTarget !== state.target) {\n state.target.removeEventListener('keydown', state.listener as EventListener)\n state.target = nextTarget\n nextTarget.addEventListener('keydown', state.listener as EventListener)\n }\n },\n unmounted(el) {\n const state = states.get(el)\n if (!state) return\n state.target.removeEventListener('keydown', state.listener as EventListener)\n states.delete(el)\n },\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hotkey.js","names":[],"sources":["../../src/directives/hotkey.ts"],"sourcesContent":["import type { Directive } from 'vue'\n\nimport { eventMatchesKey, isAppleDevice, isComposingEvent, isEditableTarget, shiftSatisfied } from '../internal/keyboard'\n\nexport type HotkeyHandler = (event: KeyboardEvent) => void\n\nexport type HotkeyEntry =\n | HotkeyHandler\n | {\n handler: HotkeyHandler\n /** По умолчанию: `true` для комбинаций с Ctrl/Meta/Alt, иначе `false`. */\n preventDefault?: boolean\n /** По умолчанию `false`. */\n stopPropagation?: boolean\n /** Разрешить срабатывать, когда фокус в `input/textarea/[contenteditable]`. */\n allowInEditable?: boolean\n }\n\nexport type HotkeyMap = Record<string, HotkeyEntry>\n\n/**\n * Где слушать клавиатуру:\n * - `'global'` (по умолчанию) — слушатель на `window`; хоткеи работают из любого места страницы.\n * - `'element'` — слушатель на самом элементе; хоткеи срабатывают только когда фокус внутри\n * элемента (событие всплывает до него). Элемент должен быть фокусируемым (`tabindex`).\n */\nexport type HotkeyScope = 'global' | 'element'\n\nexport type HotkeyBindingValue =\n | HotkeyMap\n | {\n handlers: HotkeyMap\n enabled?: boolean\n scope?: HotkeyScope\n }\n\ntype ParsedHotkey = {\n original: string\n key: string\n ctrl: boolean\n meta: boolean\n /** `mod` — Cmd на macOS, Ctrl на прочих: подсказка и привязка пишутся одинаково. */\n mod: boolean\n alt: boolean\n shift: boolean\n entry: HotkeyEntry\n}\n\ntype InternalState = {\n enabled: boolean\n hotkeys: ParsedHotkey[]\n listener: (event: KeyboardEvent) => void\n /** Цель, на которой висит слушатель (`window` для 'global', сам `el` для 'element'). */\n target: Window | HTMLElement\n}\n\nconst states = new WeakMap<HTMLElement, InternalState>()\n\nfunction normalizeBinding(value: HotkeyBindingValue | undefined) {\n if (!value) return { enabled: false, handlers: {} as HotkeyMap, scope: 'global' as HotkeyScope }\n if ('handlers' in (value as any)) {\n const v = value as { handlers: HotkeyMap; enabled?: boolean; scope?: HotkeyScope }\n return { enabled: v.enabled ?? true, handlers: v.handlers ?? {}, scope: v.scope ?? 'global' }\n }\n return { enabled: true, handlers: value as HotkeyMap, scope: 'global' as HotkeyScope }\n}\n\nfunction normalizeKeyToken(token: string): string {\n const t = token.trim().toLowerCase()\n if (t === 'esc') return 'Escape'\n if (t === 'escape') return 'Escape'\n if (t === 'space') return ' '\n if (t.length === 1) return t\n return token.trim()\n}\n\nfunction parseHotkeys(map: HotkeyMap): ParsedHotkey[] {\n const parsed: ParsedHotkey[] = []\n\n for (const [combo, entry] of Object.entries(map)) {\n const parts = combo\n .split('+')\n .map(p => p.trim())\n .filter(Boolean)\n\n if (!parts.length) continue\n\n let ctrl = false\n let meta = false\n let mod = false\n let alt = false\n let shift = false\n\n const keyToken = parts.at(-1)\n if (!keyToken) continue\n for (const p of parts.slice(0, -1)) {\n const t = p.toLowerCase()\n if (t === 'mod') mod = true\n else if (t === 'ctrl' || t === 'control') ctrl = true\n else if (t === 'meta' || t === 'cmd' || t === 'command' || t === '⌘') meta = true\n else if (t === 'alt' || t === 'option') alt = true\n else if (t === 'shift') shift = true\n }\n\n const key = normalizeKeyToken(keyToken)\n parsed.push({ original: combo, key, ctrl, meta, mod, alt, shift, entry })\n }\n\n return parsed\n}\n\nfunction matchesHotkey(event: KeyboardEvent, hk: ParsedHotkey): boolean {\n // Платформа читается в момент события: `navigator` в теле модуля на сервере\n // либо отсутствует, либо отвечает не за ту машину.\n const apple = hk.mod ? isAppleDevice() : false\n const expectMeta = hk.meta || (hk.mod && apple)\n const expectCtrl = hk.ctrl || (hk.mod && !apple)\n\n if (expectCtrl !== event.ctrlKey) return false\n if (expectMeta !== event.metaKey) return false\n if (hk.alt !== event.altKey) return false\n if (!shiftSatisfied(event, hk.key, hk.shift)) return false\n\n // По физическому коду матчатся только комбинации с модификаторами: там\n // клавиша — позиция на клавиатуре, и `Ctrl+K` обязан работать на любой\n // раскладке. Одиночная клавиша — печатная, её раскладка и определяет.\n return eventMatchesKey(event, hk.key, { codeFallback: expectCtrl || expectMeta || hk.alt })\n}\n\nfunction resolveEntry(entry: HotkeyEntry) {\n if (typeof entry === 'function') {\n return {\n handler: entry,\n preventDefault: undefined as boolean | undefined,\n stopPropagation: false,\n allowInEditable: false,\n }\n }\n\n return {\n handler: entry.handler,\n preventDefault: entry.preventDefault,\n stopPropagation: entry.stopPropagation ?? false,\n allowInEditable: entry.allowInEditable ?? false,\n }\n}\n\n/**\n * `v-hotkey` — горячие клавиши на компонент/страницу.\n *\n * Пример:\n * ```vue\n * <div v-hotkey=\"{ 'Escape': close, 'Ctrl+K': openSearch }\" />\n * ```\n *\n * По умолчанию слушатель глобальный (`window`). Чтобы хоткеи срабатывали только\n * когда фокус внутри элемента, используйте `scope: 'element'`:\n * ```vue\n * <div tabindex=\"0\" v-hotkey=\"{ handlers: { 'j': next }, scope: 'element' }\" />\n * ```\n */\nexport const vHotkey: Directive<HTMLElement, HotkeyBindingValue> = {\n mounted(el, binding) {\n if (typeof window === 'undefined') return\n\n const { enabled, handlers, scope } = normalizeBinding(binding.value)\n const target: Window | HTMLElement = scope === 'element' ? el : window\n\n const state: InternalState = {\n enabled,\n hotkeys: parseHotkeys(handlers),\n listener: (event: KeyboardEvent) => {\n const current = states.get(el)\n if (!current?.enabled) return\n if (!el.isConnected) return\n // Клавиша во время IME-композиции принадлежит композиции, а не хоткею.\n if (isComposingEvent(event)) return\n\n const editable = isEditableTarget(event.target)\n\n for (const hk of current.hotkeys) {\n if (!matchesHotkey(event, hk)) continue\n\n const entry = resolveEntry(hk.entry)\n\n // По умолчанию не перехватываем \"простые\" клавиши во время ввода.\n const hasModifier = hk.ctrl || hk.meta || hk.mod || hk.alt || hk.shift\n if (editable && !entry.allowInEditable && !hasModifier && hk.key !== 'Escape') {\n continue\n }\n\n const preventDefault = entry.preventDefault ?? (hk.ctrl || hk.meta || hk.mod || hk.alt)\n if (preventDefault) event.preventDefault()\n if (entry.stopPropagation) event.stopPropagation()\n\n entry.handler(event)\n return\n }\n },\n target,\n }\n\n states.set(el, state)\n target.addEventListener('keydown', state.listener as EventListener)\n },\n updated(el, binding) {\n const state = states.get(el)\n if (!state) return\n\n const next = normalizeBinding(binding.value)\n state.enabled = next.enabled\n state.hotkeys = parseHotkeys(next.handlers)\n\n // Смена scope на лету — переносим слушатель на новую цель.\n const nextTarget: Window | HTMLElement = next.scope === 'element' ? el : window\n if (nextTarget !== state.target) {\n state.target.removeEventListener('keydown', state.listener as EventListener)\n state.target = nextTarget\n nextTarget.addEventListener('keydown', state.listener as EventListener)\n }\n },\n unmounted(el) {\n const state = states.get(el)\n if (!state) return\n state.target.removeEventListener('keydown', state.listener as EventListener)\n states.delete(el)\n },\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as ensurePortalRoot } from "../chunks/portalRoot-
|
|
1
|
+
import { t as ensurePortalRoot } from "../chunks/portalRoot-CVhCgdG6.js";
|
|
2
2
|
import { n as markInert, t as inertableOutside } from "../chunks/inert-DIHCCn_1.js";
|
|
3
3
|
import { t as GrLoading_default } from "../components/GrLoading/chunks/GrLoading-CH95CFzS.js";
|
|
4
4
|
import { createVNode, render } from "vue";
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as granularityDefaultThemes, i as granularityComponentConfigs, n as GRANULARITY_PROVIDER_ID, o as granularityThemeNames, r as createGranularityProvider, t as granularityProvider } from "./chunks/granular-provider-
|
|
1
|
+
import { a as granularityDefaultThemes, i as granularityComponentConfigs, n as GRANULARITY_PROVIDER_ID, o as granularityThemeNames, r as createGranularityProvider, t as granularityProvider } from "./chunks/granular-provider-C6uAujdJ.js";
|
|
2
2
|
export { GRANULARITY_PROVIDER_ID, createGranularityProvider, granularityProvider as default, granularityProvider, granularityComponentConfigs, granularityDefaultThemes, granularityThemeNames };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as granularityDefaultThemes, i as granularityComponentConfigs, n as GRANULARITY_PROVIDER_ID, o as granularityThemeNames, r as createGranularityProvider, t as granularityProvider } from "./chunks/granular-provider-
|
|
1
|
+
import { a as granularityDefaultThemes, i as granularityComponentConfigs, n as GRANULARITY_PROVIDER_ID, o as granularityThemeNames, r as createGranularityProvider, t as granularityProvider } from "./chunks/granular-provider-C6uAujdJ.js";
|
|
2
2
|
export { GRANULARITY_PROVIDER_ID, createGranularityProvider, granularityProvider as default, granularityProvider, granularityComponentConfigs, granularityDefaultThemes, granularityThemeNames };
|
package/dist/i18n/all.js
CHANGED
package/dist/i18n/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { t as GRANULARITY_I18N_KEY } from "../chunks/adapter-CAOxmn2G.js";
|
|
2
|
-
import { i as GRANULARITY_I18N_BLOCK, n as ru, r as en, t as es } from "../chunks/es-
|
|
2
|
+
import { i as GRANULARITY_I18N_BLOCK, n as ru, r as en, t as es } from "../chunks/es-DGMHwknJ.js";
|
|
3
3
|
export { GRANULARITY_I18N_BLOCK, GRANULARITY_I18N_KEY, en, es, ru };
|