@feugene/granularity 0.4.1 → 0.4.3
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/{adapter-C7fKeUa4.js → adapter-K6zZTzBi.js} +0 -2
- package/dist/chunks/{adapter-C7fKeUa4.js.map → adapter-K6zZTzBi.js.map} +1 -1
- package/dist/chunks/arrow-up-DNXrMoAI.js +0 -2
- package/dist/chunks/classTokens-BPeBXNzu.js +0 -2
- package/dist/chunks/{config-BUGfFjmC.js → config-1I95Zy4V.js} +0 -2
- package/dist/chunks/{config-BUGfFjmC.js.map → config-1I95Zy4V.js.map} +1 -1
- package/dist/chunks/config-2wgwWaAB.js +0 -2
- package/dist/chunks/{config-DBYCntwl.js → config-BA0BWYzs.js} +0 -2
- package/dist/chunks/{config-DBYCntwl.js.map → config-BA0BWYzs.js.map} +1 -1
- package/dist/chunks/{config-dD6Po-Cq.js → config-BCPyma1I.js} +0 -2
- package/dist/chunks/{config-dD6Po-Cq.js.map → config-BCPyma1I.js.map} +1 -1
- package/dist/chunks/{config-CYPU3ztl.js → config-BDlh6iNz.js} +1 -3
- package/dist/chunks/{config-CYPU3ztl.js.map → config-BDlh6iNz.js.map} +1 -1
- package/dist/chunks/config-BKRmlivc.js +0 -2
- package/dist/chunks/{config-CcmeMlic.js → config-BN-B2K4r.js} +1 -3
- package/dist/chunks/{config-CcmeMlic.js.map → config-BN-B2K4r.js.map} +1 -1
- package/dist/chunks/{config-C0b_3LJV.js → config-BNOf_qjD.js} +0 -2
- package/dist/chunks/{config-C0b_3LJV.js.map → config-BNOf_qjD.js.map} +1 -1
- package/dist/chunks/config-BaMO9dQh.js +0 -2
- package/dist/chunks/config-Bv2G0OU6.js +0 -2
- package/dist/chunks/{config-CxCAfXZ1.js → config-BvuQUBtZ.js} +0 -2
- package/dist/chunks/{config-CxCAfXZ1.js.map → config-BvuQUBtZ.js.map} +1 -1
- package/dist/chunks/config-BzZGpWsj.js +0 -2
- package/dist/chunks/{config-KGTIAFD92.js → config-C0j836dC.js} +0 -2
- package/dist/chunks/config-C0j836dC.js.map +1 -0
- package/dist/chunks/{config-D7iuXJbl.js → config-C2iI7_QX.js} +0 -2
- package/dist/chunks/{config-D7iuXJbl.js.map → config-C2iI7_QX.js.map} +1 -1
- package/dist/chunks/{config-BcFOkUhh.js → config-C4AlNm912.js} +1 -3
- package/dist/chunks/config-C4AlNm912.js.map +1 -0
- package/dist/chunks/{config-rFwazRKi.js → config-C5SJXHQ4.js} +0 -2
- package/dist/chunks/{config-rFwazRKi.js.map → config-C5SJXHQ4.js.map} +1 -1
- package/dist/chunks/config-C6SBJxcH.js +0 -2
- package/dist/chunks/{config-BzQ4S4Hb.js → config-CByfsV-z2.js} +0 -2
- package/dist/chunks/config-CByfsV-z2.js.map +1 -0
- package/dist/chunks/{config-rxFL-6yF2.js → config-CM7nbATU2.js} +0 -2
- package/dist/chunks/{config-rxFL-6yF2.js.map → config-CM7nbATU2.js.map} +1 -1
- package/dist/chunks/config-CMZE2fu0.js +0 -2
- package/dist/chunks/config-CU_CBd0k.js +0 -2
- package/dist/chunks/{config-BhvNm4Pp.js → config-CUgvsjZx.js} +0 -2
- package/dist/chunks/{config-BhvNm4Pp.js.map → config-CUgvsjZx.js.map} +1 -1
- package/dist/chunks/{config-DxqMXzNV2.js → config-CWvHiaqr2.js} +0 -2
- package/dist/chunks/{config-DxqMXzNV2.js.map → config-CWvHiaqr2.js.map} +1 -1
- package/dist/chunks/{config-CdAx6ify2.js → config-CgAY2WP9.js} +0 -2
- package/dist/chunks/config-CgAY2WP9.js.map +1 -0
- package/dist/chunks/{config-D1gSaT52.js → config-Cgc-D1K4.js} +0 -2
- package/dist/chunks/{config-D1gSaT52.js.map → config-Cgc-D1K4.js.map} +1 -1
- package/dist/chunks/{config-cn6knwud.js → config-D19pyP4D.js} +0 -2
- package/dist/chunks/{config-cn6knwud.js.map → config-D19pyP4D.js.map} +1 -1
- package/dist/chunks/{config-ug8O8epd.js → config-DCQO6H6h.js} +0 -2
- package/dist/chunks/{config-ug8O8epd.js.map → config-DCQO6H6h.js.map} +1 -1
- package/dist/chunks/{config-BXffa3ta.js → config-DEv4m-ZP.js} +0 -2
- package/dist/chunks/{config-BXffa3ta.js.map → config-DEv4m-ZP.js.map} +1 -1
- package/dist/chunks/config-DFRYOcrP.js +0 -2
- package/dist/chunks/{config-DlLE49_I.js → config-DTpwUHgF.js} +0 -2
- package/dist/chunks/{config-DlLE49_I.js.map → config-DTpwUHgF.js.map} +1 -1
- package/dist/chunks/{config-C2JKq8-2.js → config-DUtUkSzc.js} +1 -2
- package/dist/chunks/config-DUtUkSzc.js.map +1 -0
- package/dist/chunks/config-DW_RqmUp.js +0 -2
- package/dist/chunks/{config-CJeyaUTp.js → config-Da90XGsi.js} +0 -2
- package/dist/chunks/{config-CJeyaUTp.js.map → config-Da90XGsi.js.map} +1 -1
- package/dist/chunks/{config-CJbjLC5X.js → config-DgRJlF00.js} +0 -2
- package/dist/chunks/{config-CJbjLC5X.js.map → config-DgRJlF00.js.map} +1 -1
- package/dist/chunks/config-Dkq0HeLe.js +0 -2
- package/dist/chunks/{config-DwB5-qdP2.js → config-DmI1IQvI2.js} +0 -2
- package/dist/chunks/{config-DwB5-qdP2.js.map → config-DmI1IQvI2.js.map} +1 -1
- package/dist/chunks/{config-BRU5PR8_.js → config-Dnu4VuO0.js} +0 -2
- package/dist/chunks/{config-BRU5PR8_.js.map → config-Dnu4VuO0.js.map} +1 -1
- package/dist/chunks/config-DxqpV-KM.js +0 -2
- package/dist/chunks/config-TyzU6gLf.js +0 -2
- package/dist/chunks/{config-Bv5Dok4j.js → config-XwI6t8cn.js} +0 -2
- package/dist/chunks/{config-Bv5Dok4j.js.map → config-XwI6t8cn.js.map} +1 -1
- package/dist/chunks/{config-DvTUDLT1.js → config-bpQYM5O-.js} +0 -2
- package/dist/chunks/{config-DvTUDLT1.js.map → config-bpQYM5O-.js.map} +1 -1
- package/dist/chunks/{config-BbtK511H.js → config-etXh7Bsr2.js} +0 -2
- package/dist/chunks/config-etXh7Bsr2.js.map +1 -0
- package/dist/chunks/{config-BhubOeci.js → config-fCcRwjIB.js} +0 -2
- package/dist/chunks/{config-BhubOeci.js.map → config-fCcRwjIB.js.map} +1 -1
- package/dist/chunks/{config-D7tRu8u3.js → config-nfOMJXVs.js} +0 -2
- package/dist/chunks/{config-D7tRu8u3.js.map → config-nfOMJXVs.js.map} +1 -1
- package/dist/chunks/{config-BcpRsZTe.js → config-qJXIIY1E.js} +0 -2
- package/dist/chunks/{config-BcpRsZTe.js.map → config-qJXIIY1E.js.map} +1 -1
- package/dist/chunks/{config-Dzz9P-GV2.js → config-r6hzn2Bn2.js} +0 -2
- package/dist/chunks/{config-Dzz9P-GV2.js.map → config-r6hzn2Bn2.js.map} +1 -1
- package/dist/chunks/config-rQlbnEKn.js +0 -2
- package/dist/chunks/dialogShared-BtXUk6Zc.js +0 -2
- package/dist/chunks/{en-BMjJZttK.js → en-BeJa78lP.js} +0 -2
- package/dist/chunks/{en-BMjJZttK.js.map → en-BeJa78lP.js.map} +1 -1
- package/dist/chunks/{es-Cu_RlgIr.js → es-BPqm7rLm.js} +3 -5
- package/dist/chunks/{es-Cu_RlgIr.js.map → es-BPqm7rLm.js.map} +1 -1
- package/dist/chunks/{es-EYCf8G_1.js → es-axYOwwWD.js} +0 -2
- package/dist/chunks/{es-EYCf8G_1.js.map → es-axYOwwWD.js.map} +1 -1
- package/dist/chunks/{fileValidation-CgjTGoUx.js → fileValidation-CwJA8Vmn.js} +0 -2
- package/dist/chunks/{fileValidation-CgjTGoUx.js.map → fileValidation-CwJA8Vmn.js.map} +1 -1
- package/dist/chunks/grBadgeStyles-pqqbVgLk.js +0 -2
- package/dist/chunks/grButtonStyles-BxZW2x0-.js +0 -2
- package/dist/chunks/{grDropdownStyles-DQfLh-bp.js → grDropdownStyles-DMp7RrI9.js} +0 -2
- package/dist/chunks/{grDropdownStyles-DQfLh-bp.js.map → grDropdownStyles-DMp7RrI9.js.map} +1 -1
- package/dist/chunks/{grLoadingStyles-CERsxyk9.js → grLoadingStyles-CrxZHFL0.js} +0 -2
- package/dist/chunks/{grLoadingStyles-CERsxyk9.js.map → grLoadingStyles-CrxZHFL0.js.map} +1 -1
- package/dist/chunks/grModalStyles-Dv2NXBKi.js +0 -2
- package/dist/chunks/{grSelectStyles-C1zNEkV7.js → grSelectStyles-B7doeAQp.js} +0 -2
- package/dist/chunks/{grSelectStyles-C1zNEkV7.js.map → grSelectStyles-B7doeAQp.js.map} +1 -1
- package/dist/chunks/{granularityI18n-BEWP9aJs.js → granularityI18n-GCqUz_lo.js} +1 -3
- package/dist/chunks/{granularityI18n-BEWP9aJs.js.map → granularityI18n-GCqUz_lo.js.map} +1 -1
- package/dist/chunks/info-C0bHmdZq.js +0 -2
- package/dist/chunks/loader-circle-B2rWDk5u.js +0 -2
- package/dist/chunks/{ru-DKswMSdd.js → ru-Dqh-2C00.js} +0 -2
- package/dist/chunks/{ru-DKswMSdd.js.map → ru-Dqh-2C00.js.map} +1 -1
- package/dist/chunks/safelist-BF822K15.js +0 -2
- package/dist/chunks/safelist-BY7z8fOl.js +0 -2
- package/dist/chunks/{shared-Bvjkhhm2.js → shared-buYOkZSv.js} +33 -35
- package/dist/chunks/{shared-Bvjkhhm2.js.map → shared-buYOkZSv.js.map} +1 -1
- package/dist/chunks/transition-mJ3PZCHH.js +0 -2
- package/dist/chunks/x-Pa6C2hwi.js +0 -2
- package/dist/chunks/x-circle-DQSlBLmX.js +0 -2
- package/dist/components/GrAlert/chunks/GrAlert-BjerGcU8.js +0 -2
- package/dist/components/GrAvatar/chunks/GrAvatar-BjnPKNAL.js +0 -2
- package/dist/components/GrBadge/chunks/GrBadge-wuIb4_2K.js +0 -2
- package/dist/components/GrBadgeWrap/chunks/GrBadgeWrap-CxtamOZ-.js +0 -2
- package/dist/components/GrBottomNav/chunks/GrBottomNav-CsmQ7mTJ.js +0 -2
- package/dist/components/GrButton/chunks/GrButton-BmGdp8-4.js +0 -2
- package/dist/components/GrButtonGroup/chunks/GrButtonGroup-CBj4tpms.js +0 -2
- package/dist/components/GrCard/chunks/GrCard-xtDcXBr7.js +0 -2
- package/dist/components/GrCheckbox/chunks/GrCheckbox-Bt3d7ckE.js +0 -2
- package/dist/components/GrCollapse/chunks/GrCollapse-HU20VTVn.js +0 -2
- package/dist/components/GrConfirmDialog/chunks/GrConfirmDialog-DjGOX9Hd.js +0 -2
- package/dist/components/GrDataTable/chunks/GrDataTable-QDOJWmdY.js +0 -2
- package/dist/components/GrDialog/chunks/GrDialog-gObmaVEl.js +0 -2
- package/dist/components/GrDrawer/chunks/GrDrawer-BJL_gTxI.js +0 -2
- package/dist/components/GrDropdown/chunks/{GrDropdown-DVTU32T_.js → GrDropdown-BkACCXdp.js} +2 -4
- package/dist/components/GrDropdown/chunks/{GrDropdown-DVTU32T_.js.map → GrDropdown-BkACCXdp.js.map} +1 -1
- package/dist/components/GrDropdown/index.js +2 -2
- package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu-fePQRcgh.js → GrDropdownMenu-BEenXrJw.js} +1 -3
- package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu-fePQRcgh.js.map → GrDropdownMenu-BEenXrJw.js.map} +1 -1
- package/dist/components/GrDropdownMenu/index.js +2 -2
- package/dist/components/GrEmptyState/chunks/{GrEmptyState-Bs8d3tgb.js → GrEmptyState-BLbMJFW-.js} +0 -2
- package/dist/components/GrEmptyState/chunks/{GrEmptyState-Bs8d3tgb.js.map → GrEmptyState-BLbMJFW-.js.map} +1 -1
- package/dist/components/GrEmptyState/index.js +2 -2
- package/dist/components/GrFileUpload/chunks/{GrFileUpload-DVv8yXpl.js → GrFileUpload-u01j9S0t.js} +1 -3
- package/dist/components/GrFileUpload/chunks/{GrFileUpload-DVv8yXpl.js.map → GrFileUpload-u01j9S0t.js.map} +1 -1
- package/dist/components/GrFileUpload/index.js +3 -3
- package/dist/components/GrFormField/chunks/{GrFormField-BzezYcS8.js → GrFormField-C6PfAs4u.js} +0 -2
- package/dist/components/GrFormField/chunks/{GrFormField-BzezYcS8.js.map → GrFormField-C6PfAs4u.js.map} +1 -1
- package/dist/components/GrFormField/index.js +2 -2
- package/dist/components/GrFormFile/chunks/{GrFormFile-DtZOypJW.js → GrFormFile-DdM8Bc2B.js} +2 -4
- package/dist/components/GrFormFile/chunks/{GrFormFile-DtZOypJW.js.map → GrFormFile-DdM8Bc2B.js.map} +1 -1
- package/dist/components/GrFormFile/index.js +2 -2
- package/dist/components/GrFormSection/chunks/{GrFormSection-BIPB1RIk.js → GrFormSection-5djEaQZQ.js} +0 -2
- package/dist/components/GrFormSection/chunks/{GrFormSection-BIPB1RIk.js.map → GrFormSection-5djEaQZQ.js.map} +1 -1
- package/dist/components/GrFormSection/index.js +2 -2
- package/dist/components/GrIcon/chunks/GrIcon-BV7RBU_0.js +0 -2
- package/dist/components/GrImageViewer/chunks/{GrImageViewer-fn8ilJTA.js → GrImageViewer-CjSnohW7.js} +0 -2
- package/dist/components/GrImageViewer/chunks/{GrImageViewer-fn8ilJTA.js.map → GrImageViewer-CjSnohW7.js.map} +1 -1
- package/dist/components/GrImageViewer/index.js +2 -2
- package/dist/components/GrInput/chunks/{GrInput-DLLRrH1A.js → GrInput-ghxaTf6d.js} +0 -2
- package/dist/components/GrInput/chunks/{GrInput-DLLRrH1A.js.map → GrInput-ghxaTf6d.js.map} +1 -1
- package/dist/components/GrInput/index.js +2 -2
- package/dist/components/GrInputTag/chunks/{GrInputTag-CzrrBxgU.js → GrInputTag-B0x4U0Yk.js} +1 -3
- package/dist/components/GrInputTag/chunks/{GrInputTag-CzrrBxgU.js.map → GrInputTag-B0x4U0Yk.js.map} +1 -1
- package/dist/components/GrInputTag/index.js +2 -2
- package/dist/components/GrLink/chunks/{GrLink-Dhkid3Mp.js → GrLink-BbN7R3iP.js} +1 -3
- package/dist/components/GrLink/chunks/{GrLink-Dhkid3Mp.js.map → GrLink-BbN7R3iP.js.map} +1 -1
- package/dist/components/GrLink/index.js +2 -2
- package/dist/components/GrList/chunks/{GrList-CjgeVjhY.js → GrList--Ib4zLNw.js} +0 -2
- package/dist/components/GrList/chunks/{GrList-CjgeVjhY.js.map → GrList--Ib4zLNw.js.map} +1 -1
- package/dist/components/GrList/index.js +2 -2
- package/dist/components/GrLoading/chunks/{GrLoading-DihGX3ol.js → GrLoading-C3QZKwE-.js} +1 -3
- package/dist/components/GrLoading/chunks/{GrLoading-DihGX3ol.js.map → GrLoading-C3QZKwE-.js.map} +1 -1
- package/dist/components/GrLoading/index.js +2 -2
- package/dist/components/GrModal/chunks/GrModal-gvfvlp7k.js +0 -2
- package/dist/components/GrModal/index.js +1 -1
- package/dist/components/GrNavbar/chunks/{GrNavbar-CQOAfO6y.js → GrNavbar-nIyuiVj1.js} +1 -3
- package/dist/components/GrNavbar/chunks/{GrNavbar-CQOAfO6y.js.map → GrNavbar-nIyuiVj1.js.map} +1 -1
- package/dist/components/GrNavbar/index.js +2 -2
- package/dist/components/GrNumberInput/chunks/{GrNumberInput-CyHgUotG.js → GrNumberInput-B0mPLjdv.js} +1 -3
- package/dist/components/GrNumberInput/chunks/{GrNumberInput-CyHgUotG.js.map → GrNumberInput-B0mPLjdv.js.map} +1 -1
- package/dist/components/GrNumberInput/index.js +2 -2
- package/dist/components/GrPagination/chunks/{GrPagination-C5cxRJsF.js → GrPagination-BSTO6flk.js} +2 -4
- package/dist/components/GrPagination/chunks/{GrPagination-C5cxRJsF.js.map → GrPagination-BSTO6flk.js.map} +1 -1
- package/dist/components/GrPagination/index.js +2 -2
- package/dist/components/GrProgressBar/chunks/{GrProgressBar-C9wAAFxR.js → GrProgressBar-MvMnzsJl.js} +1 -3
- package/dist/components/GrProgressBar/chunks/{GrProgressBar-C9wAAFxR.js.map → GrProgressBar-MvMnzsJl.js.map} +1 -1
- package/dist/components/GrProgressBar/index.js +2 -2
- package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-Cfq9bvL3.js → GrPromptDialog-DKhbN6ji.js} +2 -4
- package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-Cfq9bvL3.js.map → GrPromptDialog-DKhbN6ji.js.map} +1 -1
- package/dist/components/GrPromptDialog/index.js +2 -2
- package/dist/components/GrRadio/chunks/{GrRadio-B_t_ZNVl.js → GrRadio-BxBs3WHq.js} +1 -3
- package/dist/components/GrRadio/chunks/{GrRadio-B_t_ZNVl.js.map → GrRadio-BxBs3WHq.js.map} +1 -1
- package/dist/components/GrRadio/index.js +2 -2
- package/dist/components/GrRadioGroup/chunks/{GrRadioGroup-CVlgpUBr.js → GrRadioGroup-CEAfJQ6A.js} +1 -3
- package/dist/components/GrRadioGroup/chunks/{GrRadioGroup-CVlgpUBr.js.map → GrRadioGroup-CEAfJQ6A.js.map} +1 -1
- package/dist/components/GrRadioGroup/index.js +2 -2
- package/dist/components/GrSegmented/chunks/{GrSegmented-BPl1koHc.js → GrSegmented-Bwn2qOY4.js} +1 -3
- package/dist/components/GrSegmented/chunks/{GrSegmented-BPl1koHc.js.map → GrSegmented-Bwn2qOY4.js.map} +1 -1
- package/dist/components/GrSegmented/index.js +2 -2
- package/dist/components/GrSelect/chunks/{GrSelect-aVqUL-1F.js → GrSelect-9wRWAu2R.js} +3 -5
- package/dist/components/GrSelect/chunks/{GrSelect-aVqUL-1F.js.map → GrSelect-9wRWAu2R.js.map} +1 -1
- package/dist/components/GrSelect/index.js +2 -2
- package/dist/components/GrSidebar/chunks/{GrSidebar-DVucgcfV.js → GrSidebar-CSZ3RpFB.js} +0 -2
- package/dist/components/GrSidebar/chunks/{GrSidebar-DVucgcfV.js.map → GrSidebar-CSZ3RpFB.js.map} +1 -1
- package/dist/components/GrSidebar/index.js +2 -2
- package/dist/components/GrSkeleton/chunks/{GrSkeleton-CDTvCSoH.js → GrSkeleton-DKXkqWDa.js} +0 -2
- package/dist/components/GrSkeleton/chunks/{GrSkeleton-CDTvCSoH.js.map → GrSkeleton-DKXkqWDa.js.map} +1 -1
- package/dist/components/GrSkeleton/index.js +2 -2
- package/dist/components/GrSwitch/chunks/{GrSwitch-Bnamgqb2.js → GrSwitch-CdBxwV3k.js} +1 -3
- package/dist/components/GrSwitch/chunks/{GrSwitch-Bnamgqb2.js.map → GrSwitch-CdBxwV3k.js.map} +1 -1
- package/dist/components/GrSwitch/index.js +2 -2
- package/dist/components/GrTable/chunks/GrTable-CyQ9uw8A.js +0 -2
- package/dist/components/GrTable/index.js +1 -1
- package/dist/components/GrTabs/chunks/{GrTabs-CiGmcmvm.js → GrTabs-BpF8AAUz.js} +0 -2
- package/dist/components/GrTabs/chunks/{GrTabs-CiGmcmvm.js.map → GrTabs-BpF8AAUz.js.map} +1 -1
- package/dist/components/GrTabs/index.js +2 -2
- package/dist/components/GrTextarea/chunks/{GrTextarea-VBSc6A7D.js → GrTextarea-DFS9ZkrA.js} +1 -3
- package/dist/components/GrTextarea/chunks/{GrTextarea-VBSc6A7D.js.map → GrTextarea-DFS9ZkrA.js.map} +1 -1
- package/dist/components/GrTextarea/index.js +2 -2
- package/dist/components/GrToaster/chunks/{GrToaster-I1e-zCpf.js → GrToaster-3Mf0Moxt.js} +1 -3
- package/dist/components/GrToaster/chunks/{GrToaster-I1e-zCpf.js.map → GrToaster-3Mf0Moxt.js.map} +1 -1
- package/dist/components/GrToaster/index.js +2 -2
- package/dist/components/GrTooltip/chunks/{GrTooltip-CrV1gI_c.js → GrTooltip-BvmsukLW.js} +0 -2
- package/dist/components/GrTooltip/chunks/{GrTooltip-CrV1gI_c.js.map → GrTooltip-BvmsukLW.js.map} +1 -1
- package/dist/components/GrTooltip/index.js +2 -2
- package/dist/components/GrTree/chunks/{GrTree-Dlev9oBd.js → GrTree-C2kN-O4Q.js} +0 -2
- package/dist/components/GrTree/chunks/{GrTree-Dlev9oBd.js.map → GrTree-C2kN-O4Q.js.map} +1 -1
- package/dist/components/GrTree/index.js +2 -2
- package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-DN6XFjOD.js → GrTreeSelect-Da-CpRqm.js} +5 -7
- package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-DN6XFjOD.js.map → GrTreeSelect-Da-CpRqm.js.map} +1 -1
- package/dist/components/GrTreeSelect/index.js +2 -2
- package/dist/composables/useTheme.js +0 -2
- package/dist/composables/useToast.js +0 -2
- package/dist/directives/autofocus.js +55 -0
- package/dist/directives/autofocus.js.map +1 -0
- package/dist/directives/autosize.js +117 -0
- package/dist/directives/autosize.js.map +1 -0
- package/dist/directives/clickOutside.js +96 -0
- package/dist/directives/clickOutside.js.map +1 -0
- package/dist/directives/dropzone.js +164 -0
- package/dist/directives/dropzone.js.map +1 -0
- package/dist/directives/hotkey.js +138 -0
- package/dist/directives/hotkey.js.map +1 -0
- package/dist/directives/index.js +6 -1
- package/dist/directives/loading.js +163 -0
- package/dist/directives/loading.js.map +1 -0
- package/dist/fileValidation/index.js +1 -1
- package/dist/granular-provider-node.js +2 -4
- package/dist/granular-provider.js +1 -3
- package/dist/i18n/all.js +1 -3
- package/dist/i18n/index.js +2 -2
- package/dist/index.js +71 -66
- package/dist/types/src/components/GrLink/grLinkStyles.d.ts +1 -1
- package/dist/vue/index.js +0 -2
- package/package.json +25 -1
- package/dist/chunks/config-BbtK511H.js.map +0 -1
- package/dist/chunks/config-BcFOkUhh.js.map +0 -1
- package/dist/chunks/config-BzQ4S4Hb.js.map +0 -1
- package/dist/chunks/config-C2JKq8-2.js.map +0 -1
- package/dist/chunks/config-CdAx6ify2.js.map +0 -1
- package/dist/chunks/config-KGTIAFD92.js.map +0 -1
- package/dist/chunks/directives-Cuib0yOO.js +0 -728
- package/dist/chunks/directives-Cuib0yOO.js.map +0 -1
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { nextTick } from "vue";
|
|
2
|
+
//#region src/directives/autofocus.ts
|
|
3
|
+
function resolveOptions(value) {
|
|
4
|
+
if (value === false) return {
|
|
5
|
+
enabled: false,
|
|
6
|
+
selector: "",
|
|
7
|
+
preventScroll: true
|
|
8
|
+
};
|
|
9
|
+
if (typeof value === "string") return {
|
|
10
|
+
enabled: true,
|
|
11
|
+
selector: value,
|
|
12
|
+
preventScroll: true
|
|
13
|
+
};
|
|
14
|
+
if (value && typeof value === "object") return {
|
|
15
|
+
enabled: value.disabled !== true,
|
|
16
|
+
selector: value.selector,
|
|
17
|
+
preventScroll: value.preventScroll ?? true
|
|
18
|
+
};
|
|
19
|
+
return {
|
|
20
|
+
enabled: true,
|
|
21
|
+
selector: void 0,
|
|
22
|
+
preventScroll: true
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function tryFocus(target, preventScroll) {
|
|
26
|
+
if (!target) return;
|
|
27
|
+
const focusable = target;
|
|
28
|
+
if (typeof focusable.focus !== "function") return;
|
|
29
|
+
try {
|
|
30
|
+
focusable.focus({ preventScroll });
|
|
31
|
+
} catch {
|
|
32
|
+
focusable.focus();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* `v-autofocus` — универсальный автофокус.
|
|
37
|
+
* Работает как на нативных элементах, так и на компонентах-обёртках (фокусирует вложенный `input/textarea/...`).
|
|
38
|
+
*/
|
|
39
|
+
var vAutofocus = { mounted(el, binding) {
|
|
40
|
+
const { enabled, selector, preventScroll } = resolveOptions(binding.value);
|
|
41
|
+
if (!enabled) return;
|
|
42
|
+
nextTick().then(() => {
|
|
43
|
+
requestAnimationFrame(() => {
|
|
44
|
+
const finalSelector = selector || "input, textarea, select, button, [tabindex]:not([tabindex=\"-1\"])";
|
|
45
|
+
if (el.matches?.(finalSelector)) {
|
|
46
|
+
tryFocus(el, preventScroll);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const inner = el.querySelector?.(finalSelector);
|
|
50
|
+
tryFocus(inner, preventScroll);
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
} };
|
|
54
|
+
//#endregion
|
|
55
|
+
export { vAutofocus };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autofocus.js","names":[],"sources":["../../src/directives/autofocus.ts"],"sourcesContent":["import type { Directive } from 'vue'\nimport { nextTick } from 'vue'\n\nexport type AutofocusBindingValue =\n | boolean\n | string\n | {\n selector?: string\n preventScroll?: boolean\n disabled?: boolean\n }\n\nfunction resolveOptions(value: AutofocusBindingValue | undefined) {\n if (value === false) {\n return { enabled: false, selector: '', preventScroll: true }\n }\n\n if (typeof value === 'string') {\n return { enabled: true, selector: value, preventScroll: true }\n }\n\n if (value && typeof value === 'object') {\n return {\n enabled: value.disabled !== true,\n selector: value.selector,\n preventScroll: value.preventScroll ?? true,\n }\n }\n\n return { enabled: true, selector: undefined as string | undefined, preventScroll: true }\n}\n\nfunction tryFocus(target: Element | null | undefined, preventScroll: boolean) {\n if (!target) return\n\n const focusable = target as unknown as { focus?: (options?: any) => void }\n if (typeof focusable.focus !== 'function') return\n\n try {\n focusable.focus({ preventScroll })\n } catch {\n // Fallback for browsers that don't support FocusOptions.\n focusable.focus()\n }\n}\n\n/**\n * `v-autofocus` — универсальный автофокус.\n * Работает как на нативных элементах, так и на компонентах-обёртках (фокусирует вложенный `input/textarea/...`).\n */\nexport const vAutofocus: Directive<HTMLElement, AutofocusBindingValue> = {\n mounted(el, binding) {\n const { enabled, selector, preventScroll } = resolveOptions(binding.value)\n if (!enabled) return\n\n void nextTick().then(() => {\n // Небольшая задержка помогает, когда внутренний input появляется после обновления/анимаций.\n requestAnimationFrame(() => {\n const defaultSelector = 'input, textarea, select, button, [tabindex]:not([tabindex=\"-1\"])'\n const finalSelector = selector || defaultSelector\n\n if ((el as any).matches?.(finalSelector)) {\n tryFocus(el, preventScroll)\n return\n }\n\n const inner = el.querySelector?.(finalSelector)\n tryFocus(inner, preventScroll)\n })\n })\n },\n}\n"],"mappings":";;AAYA,SAAS,eAAe,OAA0C;AAChE,KAAI,UAAU,MACZ,QAAO;EAAE,SAAS;EAAO,UAAU;EAAI,eAAe;EAAM;AAG9D,KAAI,OAAO,UAAU,SACnB,QAAO;EAAE,SAAS;EAAM,UAAU;EAAO,eAAe;EAAM;AAGhE,KAAI,SAAS,OAAO,UAAU,SAC5B,QAAO;EACL,SAAS,MAAM,aAAa;EAC5B,UAAU,MAAM;EAChB,eAAe,MAAM,iBAAiB;EACvC;AAGH,QAAO;EAAE,SAAS;EAAM,UAAU,KAAA;EAAiC,eAAe;EAAM;;AAG1F,SAAS,SAAS,QAAoC,eAAwB;AAC5E,KAAI,CAAC,OAAQ;CAEb,MAAM,YAAY;AAClB,KAAI,OAAO,UAAU,UAAU,WAAY;AAE3C,KAAI;AACF,YAAU,MAAM,EAAE,eAAe,CAAC;SAC5B;AAEN,YAAU,OAAO;;;;;;;AAQrB,IAAa,aAA4D,EACvE,QAAQ,IAAI,SAAS;CACnB,MAAM,EAAE,SAAS,UAAU,kBAAkB,eAAe,QAAQ,MAAM;AAC1E,KAAI,CAAC,QAAS;AAET,WAAU,CAAC,WAAW;AAEzB,8BAA4B;GAE1B,MAAM,gBAAgB,YADE;AAGxB,OAAK,GAAW,UAAU,cAAc,EAAE;AACxC,aAAS,IAAI,cAAc;AAC3B;;GAGF,MAAM,QAAQ,GAAG,gBAAgB,cAAc;AAC/C,YAAS,OAAO,cAAc;IAC9B;GACF;GAEL"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { nextTick } from "vue";
|
|
2
|
+
//#region src/directives/autosize.ts
|
|
3
|
+
var states = /* @__PURE__ */ new WeakMap();
|
|
4
|
+
function normalize(value) {
|
|
5
|
+
if (value === false) return { enabled: false };
|
|
6
|
+
if (value && typeof value === "object") return { enabled: value.enabled ?? true };
|
|
7
|
+
return { enabled: true };
|
|
8
|
+
}
|
|
9
|
+
function resolveTextarea(el) {
|
|
10
|
+
if (el instanceof HTMLTextAreaElement) return el;
|
|
11
|
+
return el.querySelector("textarea");
|
|
12
|
+
}
|
|
13
|
+
function toNumber(input) {
|
|
14
|
+
const n = Number.parseFloat(input);
|
|
15
|
+
return Number.isFinite(n) ? n : 0;
|
|
16
|
+
}
|
|
17
|
+
function autosize(textarea) {
|
|
18
|
+
textarea.style.height = "auto";
|
|
19
|
+
const style = getComputedStyle(textarea);
|
|
20
|
+
const border = toNumber(style.borderTopWidth) + toNumber(style.borderBottomWidth);
|
|
21
|
+
const height = style.boxSizing === "border-box" ? textarea.scrollHeight + border : textarea.scrollHeight;
|
|
22
|
+
textarea.style.height = `${height}px`;
|
|
23
|
+
}
|
|
24
|
+
function scheduleAutosize(textarea) {
|
|
25
|
+
nextTick().then(() => {
|
|
26
|
+
requestAnimationFrame(() => autosize(textarea));
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* `v-autosize` — автоподстройка высоты `textarea`.
|
|
31
|
+
*
|
|
32
|
+
* Пример:
|
|
33
|
+
* ```vue
|
|
34
|
+
* <textarea v-autosize />
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
var vAutosize = {
|
|
38
|
+
mounted(el, binding) {
|
|
39
|
+
const { enabled } = normalize(binding.value);
|
|
40
|
+
const textarea = resolveTextarea(el);
|
|
41
|
+
const state = {
|
|
42
|
+
textarea,
|
|
43
|
+
onInput: null,
|
|
44
|
+
prevOverflowY: textarea ? textarea.style.overflowY : null
|
|
45
|
+
};
|
|
46
|
+
states.set(el, state);
|
|
47
|
+
if (!enabled || !textarea) return;
|
|
48
|
+
textarea.style.overflowY = "hidden";
|
|
49
|
+
autosize(textarea);
|
|
50
|
+
scheduleAutosize(textarea);
|
|
51
|
+
const onInput = () => {
|
|
52
|
+
const current = states.get(el);
|
|
53
|
+
if (!current?.textarea) return;
|
|
54
|
+
autosize(current.textarea);
|
|
55
|
+
};
|
|
56
|
+
state.onInput = onInput;
|
|
57
|
+
textarea.addEventListener("input", onInput);
|
|
58
|
+
},
|
|
59
|
+
updated(el, binding) {
|
|
60
|
+
const { enabled } = normalize(binding.value);
|
|
61
|
+
const state = states.get(el);
|
|
62
|
+
if (!state) return;
|
|
63
|
+
const nextTextarea = resolveTextarea(el);
|
|
64
|
+
if (state.textarea !== nextTextarea) {
|
|
65
|
+
if (state.textarea && state.onInput) state.textarea.removeEventListener("input", state.onInput);
|
|
66
|
+
state.textarea = nextTextarea;
|
|
67
|
+
state.prevOverflowY = nextTextarea ? nextTextarea.style.overflowY : null;
|
|
68
|
+
state.onInput = null;
|
|
69
|
+
if (enabled && nextTextarea) {
|
|
70
|
+
nextTextarea.style.overflowY = "hidden";
|
|
71
|
+
autosize(nextTextarea);
|
|
72
|
+
scheduleAutosize(nextTextarea);
|
|
73
|
+
const onInput = () => {
|
|
74
|
+
const current = states.get(el);
|
|
75
|
+
if (!current?.textarea) return;
|
|
76
|
+
autosize(current.textarea);
|
|
77
|
+
};
|
|
78
|
+
state.onInput = onInput;
|
|
79
|
+
nextTextarea.addEventListener("input", onInput);
|
|
80
|
+
}
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (!state.textarea) return;
|
|
84
|
+
if (!enabled) {
|
|
85
|
+
if (state.onInput) {
|
|
86
|
+
state.textarea.removeEventListener("input", state.onInput);
|
|
87
|
+
state.onInput = null;
|
|
88
|
+
}
|
|
89
|
+
if (state.prevOverflowY !== null) state.textarea.style.overflowY = state.prevOverflowY;
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (!state.onInput) {
|
|
93
|
+
state.prevOverflowY = state.textarea.style.overflowY;
|
|
94
|
+
state.textarea.style.overflowY = "hidden";
|
|
95
|
+
const onInput = () => {
|
|
96
|
+
const current = states.get(el);
|
|
97
|
+
if (!current?.textarea) return;
|
|
98
|
+
autosize(current.textarea);
|
|
99
|
+
};
|
|
100
|
+
state.onInput = onInput;
|
|
101
|
+
state.textarea.addEventListener("input", onInput);
|
|
102
|
+
}
|
|
103
|
+
autosize(state.textarea);
|
|
104
|
+
scheduleAutosize(state.textarea);
|
|
105
|
+
},
|
|
106
|
+
unmounted(el) {
|
|
107
|
+
const state = states.get(el);
|
|
108
|
+
if (!state) return;
|
|
109
|
+
if (state.textarea && state.onInput) {
|
|
110
|
+
state.textarea.removeEventListener("input", state.onInput);
|
|
111
|
+
if (state.prevOverflowY !== null) state.textarea.style.overflowY = state.prevOverflowY;
|
|
112
|
+
}
|
|
113
|
+
states.delete(el);
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
//#endregion
|
|
117
|
+
export { vAutosize };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autosize.js","names":[],"sources":["../../src/directives/autosize.ts"],"sourcesContent":["import type { Directive } from 'vue'\nimport { nextTick } from 'vue'\n\nexport type AutosizeBindingValue =\n | boolean\n | {\n enabled?: boolean\n }\n\ntype InternalState = {\n textarea: HTMLTextAreaElement | null\n onInput: (() => void) | null\n prevOverflowY: string | null\n}\n\nconst states = new WeakMap<HTMLElement, InternalState>()\n\nfunction normalize(value: AutosizeBindingValue | undefined) {\n if (value === false) return { enabled: false }\n if (value && typeof value === 'object') return { enabled: value.enabled ?? true }\n return { enabled: true }\n}\n\nfunction resolveTextarea(el: HTMLElement): HTMLTextAreaElement | null {\n if (el instanceof HTMLTextAreaElement) return el\n return el.querySelector('textarea')\n}\n\nfunction toNumber(input: string): number {\n const n = Number.parseFloat(input)\n return Number.isFinite(n) ? n : 0\n}\n\nfunction autosize(textarea: HTMLTextAreaElement) {\n // Важно сбросить, чтобы textarea могла уменьшаться при удалении текста.\n textarea.style.height = 'auto'\n\n const style = getComputedStyle(textarea)\n const border = toNumber(style.borderTopWidth) + toNumber(style.borderBottomWidth)\n const height = style.boxSizing === 'border-box' ? textarea.scrollHeight + border : textarea.scrollHeight\n\n textarea.style.height = `${height}px`\n}\n\nfunction scheduleAutosize(textarea: HTMLTextAreaElement) {\n void nextTick().then(() => {\n requestAnimationFrame(() => autosize(textarea))\n })\n}\n\n/**\n * `v-autosize` — автоподстройка высоты `textarea`.\n *\n * Пример:\n * ```vue\n * <textarea v-autosize />\n * ```\n */\nexport const vAutosize: Directive<HTMLElement, AutosizeBindingValue> = {\n mounted(el, binding) {\n const { enabled } = normalize(binding.value)\n const textarea = resolveTextarea(el)\n\n const state: InternalState = {\n textarea,\n onInput: null,\n prevOverflowY: textarea ? textarea.style.overflowY : null,\n }\n states.set(el, state)\n\n if (!enabled || !textarea) return\n\n textarea.style.overflowY = 'hidden'\n autosize(textarea)\n scheduleAutosize(textarea)\n\n const onInput = () => {\n const current = states.get(el)\n if (!current?.textarea) return\n autosize(current.textarea)\n }\n\n state.onInput = onInput\n textarea.addEventListener('input', onInput)\n },\n updated(el, binding) {\n const { enabled } = normalize(binding.value)\n const state = states.get(el)\n if (!state) return\n\n const nextTextarea = resolveTextarea(el)\n if (state.textarea !== nextTextarea) {\n if (state.textarea && state.onInput) {\n state.textarea.removeEventListener('input', state.onInput)\n }\n\n state.textarea = nextTextarea\n state.prevOverflowY = nextTextarea ? nextTextarea.style.overflowY : null\n state.onInput = null\n\n if (enabled && nextTextarea) {\n nextTextarea.style.overflowY = 'hidden'\n autosize(nextTextarea)\n scheduleAutosize(nextTextarea)\n\n const onInput = () => {\n const current = states.get(el)\n if (!current?.textarea) return\n autosize(current.textarea)\n }\n state.onInput = onInput\n nextTextarea.addEventListener('input', onInput)\n }\n\n return\n }\n\n if (!state.textarea) return\n\n if (!enabled) {\n // Disabled in-flight: detach listener and restore previous overflow.\n if (state.onInput) {\n state.textarea.removeEventListener('input', state.onInput)\n state.onInput = null\n }\n if (state.prevOverflowY !== null) {\n state.textarea.style.overflowY = state.prevOverflowY\n }\n return\n }\n\n // Re-enable after being disabled: reattach listener and re-apply overflow.\n if (!state.onInput) {\n state.prevOverflowY = state.textarea.style.overflowY\n state.textarea.style.overflowY = 'hidden'\n\n const onInput = () => {\n const current = states.get(el)\n if (!current?.textarea) return\n autosize(current.textarea)\n }\n state.onInput = onInput\n state.textarea.addEventListener('input', onInput)\n }\n\n autosize(state.textarea)\n scheduleAutosize(state.textarea)\n },\n unmounted(el) {\n const state = states.get(el)\n if (!state) return\n\n if (state.textarea && state.onInput) {\n state.textarea.removeEventListener('input', state.onInput)\n if (state.prevOverflowY !== null) state.textarea.style.overflowY = state.prevOverflowY\n }\n\n states.delete(el)\n },\n}\n"],"mappings":";;AAeA,IAAM,yBAAS,IAAI,SAAqC;AAExD,SAAS,UAAU,OAAyC;AAC1D,KAAI,UAAU,MAAO,QAAO,EAAE,SAAS,OAAO;AAC9C,KAAI,SAAS,OAAO,UAAU,SAAU,QAAO,EAAE,SAAS,MAAM,WAAW,MAAM;AACjF,QAAO,EAAE,SAAS,MAAM;;AAG1B,SAAS,gBAAgB,IAA6C;AACpE,KAAI,cAAc,oBAAqB,QAAO;AAC9C,QAAO,GAAG,cAAc,WAAW;;AAGrC,SAAS,SAAS,OAAuB;CACvC,MAAM,IAAI,OAAO,WAAW,MAAM;AAClC,QAAO,OAAO,SAAS,EAAE,GAAG,IAAI;;AAGlC,SAAS,SAAS,UAA+B;AAE/C,UAAS,MAAM,SAAS;CAExB,MAAM,QAAQ,iBAAiB,SAAS;CACxC,MAAM,SAAS,SAAS,MAAM,eAAe,GAAG,SAAS,MAAM,kBAAkB;CACjF,MAAM,SAAS,MAAM,cAAc,eAAe,SAAS,eAAe,SAAS,SAAS;AAE5F,UAAS,MAAM,SAAS,GAAG,OAAO;;AAGpC,SAAS,iBAAiB,UAA+B;AAClD,WAAU,CAAC,WAAW;AACzB,8BAA4B,SAAS,SAAS,CAAC;GAC/C;;;;;;;;;;AAWJ,IAAa,YAA0D;CACrE,QAAQ,IAAI,SAAS;EACnB,MAAM,EAAE,YAAY,UAAU,QAAQ,MAAM;EAC5C,MAAM,WAAW,gBAAgB,GAAG;EAEpC,MAAM,QAAuB;GAC3B;GACA,SAAS;GACT,eAAe,WAAW,SAAS,MAAM,YAAY;GACtD;AACD,SAAO,IAAI,IAAI,MAAM;AAErB,MAAI,CAAC,WAAW,CAAC,SAAU;AAE3B,WAAS,MAAM,YAAY;AAC3B,WAAS,SAAS;AAClB,mBAAiB,SAAS;EAE1B,MAAM,gBAAgB;GACpB,MAAM,UAAU,OAAO,IAAI,GAAG;AAC9B,OAAI,CAAC,SAAS,SAAU;AACxB,YAAS,QAAQ,SAAS;;AAG5B,QAAM,UAAU;AAChB,WAAS,iBAAiB,SAAS,QAAQ;;CAE7C,QAAQ,IAAI,SAAS;EACnB,MAAM,EAAE,YAAY,UAAU,QAAQ,MAAM;EAC5C,MAAM,QAAQ,OAAO,IAAI,GAAG;AAC5B,MAAI,CAAC,MAAO;EAEZ,MAAM,eAAe,gBAAgB,GAAG;AACxC,MAAI,MAAM,aAAa,cAAc;AACnC,OAAI,MAAM,YAAY,MAAM,QAC1B,OAAM,SAAS,oBAAoB,SAAS,MAAM,QAAQ;AAG5D,SAAM,WAAW;AACjB,SAAM,gBAAgB,eAAe,aAAa,MAAM,YAAY;AACpE,SAAM,UAAU;AAEhB,OAAI,WAAW,cAAc;AAC3B,iBAAa,MAAM,YAAY;AAC/B,aAAS,aAAa;AACtB,qBAAiB,aAAa;IAE9B,MAAM,gBAAgB;KACpB,MAAM,UAAU,OAAO,IAAI,GAAG;AAC9B,SAAI,CAAC,SAAS,SAAU;AACxB,cAAS,QAAQ,SAAS;;AAE5B,UAAM,UAAU;AAChB,iBAAa,iBAAiB,SAAS,QAAQ;;AAGjD;;AAGF,MAAI,CAAC,MAAM,SAAU;AAErB,MAAI,CAAC,SAAS;AAEZ,OAAI,MAAM,SAAS;AACjB,UAAM,SAAS,oBAAoB,SAAS,MAAM,QAAQ;AAC1D,UAAM,UAAU;;AAElB,OAAI,MAAM,kBAAkB,KAC1B,OAAM,SAAS,MAAM,YAAY,MAAM;AAEzC;;AAIF,MAAI,CAAC,MAAM,SAAS;AAClB,SAAM,gBAAgB,MAAM,SAAS,MAAM;AAC3C,SAAM,SAAS,MAAM,YAAY;GAEjC,MAAM,gBAAgB;IACpB,MAAM,UAAU,OAAO,IAAI,GAAG;AAC9B,QAAI,CAAC,SAAS,SAAU;AACxB,aAAS,QAAQ,SAAS;;AAE5B,SAAM,UAAU;AAChB,SAAM,SAAS,iBAAiB,SAAS,QAAQ;;AAGnD,WAAS,MAAM,SAAS;AACxB,mBAAiB,MAAM,SAAS;;CAElC,UAAU,IAAI;EACZ,MAAM,QAAQ,OAAO,IAAI,GAAG;AAC5B,MAAI,CAAC,MAAO;AAEZ,MAAI,MAAM,YAAY,MAAM,SAAS;AACnC,SAAM,SAAS,oBAAoB,SAAS,MAAM,QAAQ;AAC1D,OAAI,MAAM,kBAAkB,KAAM,OAAM,SAAS,MAAM,YAAY,MAAM;;AAG3E,SAAO,OAAO,GAAG;;CAEpB"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
//#region src/directives/clickOutside.ts
|
|
2
|
+
function normalize(value) {
|
|
3
|
+
if (typeof value === "function") return {
|
|
4
|
+
enabled: true,
|
|
5
|
+
capture: true,
|
|
6
|
+
events: ["click"],
|
|
7
|
+
handler: value,
|
|
8
|
+
exclude: []
|
|
9
|
+
};
|
|
10
|
+
if (value && typeof value === "object") return {
|
|
11
|
+
enabled: value.enabled ?? true,
|
|
12
|
+
capture: value.capture ?? true,
|
|
13
|
+
events: value.events?.length ? value.events : ["click"],
|
|
14
|
+
handler: value.handler,
|
|
15
|
+
exclude: value.exclude ?? []
|
|
16
|
+
};
|
|
17
|
+
return {
|
|
18
|
+
enabled: false,
|
|
19
|
+
capture: true,
|
|
20
|
+
events: ["click"],
|
|
21
|
+
handler: void 0,
|
|
22
|
+
exclude: []
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function isEventInside(el, event) {
|
|
26
|
+
const target = event.target;
|
|
27
|
+
if (!target) return false;
|
|
28
|
+
const composedPath = event.composedPath?.();
|
|
29
|
+
if (Array.isArray(composedPath)) return composedPath.includes(el);
|
|
30
|
+
return el.contains(target);
|
|
31
|
+
}
|
|
32
|
+
function resolveExclude(doc, exclude) {
|
|
33
|
+
const resolved = [];
|
|
34
|
+
for (const item of exclude) {
|
|
35
|
+
if (typeof item === "string") {
|
|
36
|
+
const found = doc.querySelector(item);
|
|
37
|
+
if (found instanceof HTMLElement) resolved.push(found);
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if (typeof item === "function") {
|
|
41
|
+
const found = item();
|
|
42
|
+
if (found instanceof HTMLElement) resolved.push(found);
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
if (item instanceof HTMLElement) resolved.push(item);
|
|
46
|
+
}
|
|
47
|
+
return resolved;
|
|
48
|
+
}
|
|
49
|
+
var states = /* @__PURE__ */ new WeakMap();
|
|
50
|
+
function unbind(el) {
|
|
51
|
+
const state = states.get(el);
|
|
52
|
+
if (!state) return;
|
|
53
|
+
for (const event of state.options.events) state.doc.removeEventListener(event, state.listener, state.options.capture);
|
|
54
|
+
states.delete(el);
|
|
55
|
+
}
|
|
56
|
+
function bind(el, value) {
|
|
57
|
+
const options = normalize(value);
|
|
58
|
+
const doc = el.ownerDocument;
|
|
59
|
+
const listener = (event) => {
|
|
60
|
+
const current = states.get(el);
|
|
61
|
+
if (!current) return;
|
|
62
|
+
const { enabled, handler, exclude } = current.options;
|
|
63
|
+
if (!enabled || !handler) return;
|
|
64
|
+
if ("button" in event && typeof event.button === "number" && event.button !== 0) return;
|
|
65
|
+
if (!el.isConnected) return;
|
|
66
|
+
if (isEventInside(el, event)) return;
|
|
67
|
+
const excluded = resolveExclude(current.doc, exclude);
|
|
68
|
+
for (const ex of excluded) if (isEventInside(ex, event)) return;
|
|
69
|
+
handler(event);
|
|
70
|
+
};
|
|
71
|
+
const nextState = {
|
|
72
|
+
options,
|
|
73
|
+
doc,
|
|
74
|
+
listener
|
|
75
|
+
};
|
|
76
|
+
states.set(el, nextState);
|
|
77
|
+
if (!options.enabled || !options.handler) return;
|
|
78
|
+
for (const event of options.events) doc.addEventListener(event, listener, options.capture);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* `v-click-outside` — обработчик клика вне элемента (например, закрытие дропдауна/модалки).
|
|
82
|
+
*/
|
|
83
|
+
var vClickOutside = {
|
|
84
|
+
mounted(el, binding) {
|
|
85
|
+
bind(el, binding.value);
|
|
86
|
+
},
|
|
87
|
+
updated(el, binding) {
|
|
88
|
+
unbind(el);
|
|
89
|
+
bind(el, binding.value);
|
|
90
|
+
},
|
|
91
|
+
unmounted(el) {
|
|
92
|
+
unbind(el);
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
//#endregion
|
|
96
|
+
export { vClickOutside };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clickOutside.js","names":[],"sources":["../../src/directives/clickOutside.ts"],"sourcesContent":["import type { Directive } from 'vue'\n\nexport type ClickOutsideHandler = (event: MouseEvent | TouchEvent | PointerEvent) => void\n\nexport type ClickOutsideExclude = HTMLElement | string | (() => HTMLElement | null | undefined)\n\nexport type ClickOutsideBindingValue =\n | ClickOutsideHandler\n | {\n handler: ClickOutsideHandler\n /** По умолчанию `true`. */\n enabled?: boolean\n /** По умолчанию `true` (слушаем в capture, чтобы stopPropagation внутри не ломал закрытие). */\n capture?: boolean\n /** Список событий. По умолчанию `['click']`. */\n events?: Array<'click' | 'mousedown' | 'touchstart' | 'pointerdown'>\n /** Элементы/селекторы, клики по которым считаются \"внутри\". */\n exclude?: ClickOutsideExclude[]\n }\n\ntype NormalizedOptions = {\n enabled: boolean\n capture: boolean\n events: Array<'click' | 'mousedown' | 'touchstart' | 'pointerdown'>\n handler: ClickOutsideHandler | undefined\n exclude: ClickOutsideExclude[]\n}\n\nfunction normalize(value: ClickOutsideBindingValue | undefined): NormalizedOptions {\n if (typeof value === 'function') {\n return { enabled: true, capture: true, events: ['click'], handler: value, exclude: [] }\n }\n\n if (value && typeof value === 'object') {\n return {\n enabled: value.enabled ?? true,\n capture: value.capture ?? true,\n events: value.events?.length ? value.events : ['click'],\n handler: value.handler,\n exclude: value.exclude ?? [],\n }\n }\n\n return { enabled: false, capture: true, events: ['click'], handler: undefined, exclude: [] }\n}\n\nfunction isEventInside(el: HTMLElement, event: Event): boolean {\n const target = event.target as Node | null\n if (!target) return false\n\n const composedPath = (event as any).composedPath?.() as EventTarget[] | undefined\n if (Array.isArray(composedPath)) {\n return composedPath.includes(el)\n }\n\n return el.contains(target)\n}\n\nfunction resolveExclude(doc: Document, exclude: ClickOutsideExclude[]): HTMLElement[] {\n const resolved: HTMLElement[] = []\n\n for (const item of exclude) {\n if (typeof item === 'string') {\n const found = doc.querySelector(item)\n if (found instanceof HTMLElement) resolved.push(found)\n continue\n }\n\n if (typeof item === 'function') {\n const found = item()\n if (found instanceof HTMLElement) resolved.push(found)\n continue\n }\n\n if (item instanceof HTMLElement) {\n resolved.push(item)\n }\n }\n\n return resolved\n}\n\ntype InternalState = {\n options: NormalizedOptions\n doc: Document\n listener: (event: Event) => void\n}\n\nconst states = new WeakMap<HTMLElement, InternalState>()\n\nfunction unbind(el: HTMLElement) {\n const state = states.get(el)\n if (!state) return\n\n for (const event of state.options.events) {\n state.doc.removeEventListener(event, state.listener, state.options.capture)\n }\n\n states.delete(el)\n}\n\nfunction bind(el: HTMLElement, value: ClickOutsideBindingValue | undefined) {\n const options = normalize(value)\n const doc = el.ownerDocument\n\n const listener = (event: Event) => {\n const current = states.get(el)\n if (!current) return\n\n const { enabled, handler, exclude } = current.options\n if (!enabled || !handler) return\n\n if ('button' in (event as any) && typeof (event as any).button === 'number' && (event as any).button !== 0) {\n return\n }\n\n if (!el.isConnected) return\n\n if (isEventInside(el, event)) return\n\n const excluded = resolveExclude(current.doc, exclude)\n for (const ex of excluded) {\n if (isEventInside(ex, event)) return\n }\n\n handler(event as any)\n }\n\n const nextState: InternalState = { options, doc, listener }\n states.set(el, nextState)\n\n if (!options.enabled || !options.handler) return\n\n for (const event of options.events) {\n doc.addEventListener(event, listener, options.capture)\n }\n}\n\n/**\n * `v-click-outside` — обработчик клика вне элемента (например, закрытие дропдауна/модалки).\n */\nexport const vClickOutside: Directive<HTMLElement, ClickOutsideBindingValue> = {\n mounted(el, binding) {\n bind(el, binding.value)\n },\n updated(el, binding) {\n unbind(el)\n bind(el, binding.value)\n },\n unmounted(el) {\n unbind(el)\n },\n}\n"],"mappings":";AA4BA,SAAS,UAAU,OAAgE;AACjF,KAAI,OAAO,UAAU,WACnB,QAAO;EAAE,SAAS;EAAM,SAAS;EAAM,QAAQ,CAAC,QAAQ;EAAE,SAAS;EAAO,SAAS,EAAE;EAAE;AAGzF,KAAI,SAAS,OAAO,UAAU,SAC5B,QAAO;EACL,SAAS,MAAM,WAAW;EAC1B,SAAS,MAAM,WAAW;EAC1B,QAAQ,MAAM,QAAQ,SAAS,MAAM,SAAS,CAAC,QAAQ;EACvD,SAAS,MAAM;EACf,SAAS,MAAM,WAAW,EAAE;EAC7B;AAGH,QAAO;EAAE,SAAS;EAAO,SAAS;EAAM,QAAQ,CAAC,QAAQ;EAAE,SAAS,KAAA;EAAW,SAAS,EAAE;EAAE;;AAG9F,SAAS,cAAc,IAAiB,OAAuB;CAC7D,MAAM,SAAS,MAAM;AACrB,KAAI,CAAC,OAAQ,QAAO;CAEpB,MAAM,eAAgB,MAAc,gBAAgB;AACpD,KAAI,MAAM,QAAQ,aAAa,CAC7B,QAAO,aAAa,SAAS,GAAG;AAGlC,QAAO,GAAG,SAAS,OAAO;;AAG5B,SAAS,eAAe,KAAe,SAA+C;CACpF,MAAM,WAA0B,EAAE;AAElC,MAAK,MAAM,QAAQ,SAAS;AAC1B,MAAI,OAAO,SAAS,UAAU;GAC5B,MAAM,QAAQ,IAAI,cAAc,KAAK;AACrC,OAAI,iBAAiB,YAAa,UAAS,KAAK,MAAM;AACtD;;AAGF,MAAI,OAAO,SAAS,YAAY;GAC9B,MAAM,QAAQ,MAAM;AACpB,OAAI,iBAAiB,YAAa,UAAS,KAAK,MAAM;AACtD;;AAGF,MAAI,gBAAgB,YAClB,UAAS,KAAK,KAAK;;AAIvB,QAAO;;AAST,IAAM,yBAAS,IAAI,SAAqC;AAExD,SAAS,OAAO,IAAiB;CAC/B,MAAM,QAAQ,OAAO,IAAI,GAAG;AAC5B,KAAI,CAAC,MAAO;AAEZ,MAAK,MAAM,SAAS,MAAM,QAAQ,OAChC,OAAM,IAAI,oBAAoB,OAAO,MAAM,UAAU,MAAM,QAAQ,QAAQ;AAG7E,QAAO,OAAO,GAAG;;AAGnB,SAAS,KAAK,IAAiB,OAA6C;CAC1E,MAAM,UAAU,UAAU,MAAM;CAChC,MAAM,MAAM,GAAG;CAEf,MAAM,YAAY,UAAiB;EACjC,MAAM,UAAU,OAAO,IAAI,GAAG;AAC9B,MAAI,CAAC,QAAS;EAEd,MAAM,EAAE,SAAS,SAAS,YAAY,QAAQ;AAC9C,MAAI,CAAC,WAAW,CAAC,QAAS;AAE1B,MAAI,YAAa,SAAiB,OAAQ,MAAc,WAAW,YAAa,MAAc,WAAW,EACvG;AAGF,MAAI,CAAC,GAAG,YAAa;AAErB,MAAI,cAAc,IAAI,MAAM,CAAE;EAE9B,MAAM,WAAW,eAAe,QAAQ,KAAK,QAAQ;AACrD,OAAK,MAAM,MAAM,SACf,KAAI,cAAc,IAAI,MAAM,CAAE;AAGhC,UAAQ,MAAa;;CAGvB,MAAM,YAA2B;EAAE;EAAS;EAAK;EAAU;AAC3D,QAAO,IAAI,IAAI,UAAU;AAEzB,KAAI,CAAC,QAAQ,WAAW,CAAC,QAAQ,QAAS;AAE1C,MAAK,MAAM,SAAS,QAAQ,OAC1B,KAAI,iBAAiB,OAAO,UAAU,QAAQ,QAAQ;;;;;AAO1D,IAAa,gBAAkE;CAC7E,QAAQ,IAAI,SAAS;AACnB,OAAK,IAAI,QAAQ,MAAM;;CAEzB,QAAQ,IAAI,SAAS;AACnB,SAAO,GAAG;AACV,OAAK,IAAI,QAAQ,MAAM;;CAEzB,UAAU,IAAI;AACZ,SAAO,GAAG;;CAEb"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { l as runFileValidators, u as FileValidationError } from "../chunks/fileValidation-CwJA8Vmn.js";
|
|
2
|
+
//#region src/directives/dropzone.ts
|
|
3
|
+
function normalize(value) {
|
|
4
|
+
if (typeof value === "function") return {
|
|
5
|
+
enabled: true,
|
|
6
|
+
multiple: true,
|
|
7
|
+
validators: void 0,
|
|
8
|
+
preventDefault: true,
|
|
9
|
+
stopPropagation: false,
|
|
10
|
+
onFiles: value,
|
|
11
|
+
onError: void 0,
|
|
12
|
+
onStateChange: void 0,
|
|
13
|
+
overClass: "ds-dropzone--over"
|
|
14
|
+
};
|
|
15
|
+
if (value && typeof value === "object") return {
|
|
16
|
+
enabled: value.enabled ?? true,
|
|
17
|
+
multiple: value.multiple ?? true,
|
|
18
|
+
validators: value.validators,
|
|
19
|
+
preventDefault: value.preventDefault ?? true,
|
|
20
|
+
stopPropagation: value.stopPropagation ?? false,
|
|
21
|
+
onFiles: value.onFiles,
|
|
22
|
+
onError: value.onError,
|
|
23
|
+
onStateChange: value.onStateChange,
|
|
24
|
+
overClass: value.overClass ?? "ds-dropzone--over"
|
|
25
|
+
};
|
|
26
|
+
return {
|
|
27
|
+
enabled: false,
|
|
28
|
+
multiple: true,
|
|
29
|
+
validators: void 0,
|
|
30
|
+
preventDefault: true,
|
|
31
|
+
stopPropagation: false,
|
|
32
|
+
onFiles: void 0,
|
|
33
|
+
onError: void 0,
|
|
34
|
+
onStateChange: void 0,
|
|
35
|
+
overClass: "ds-dropzone--over"
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
var states = /* @__PURE__ */ new WeakMap();
|
|
39
|
+
function setOver(el, next) {
|
|
40
|
+
const state = states.get(el);
|
|
41
|
+
if (!state) return;
|
|
42
|
+
const wasDomOver = el.dataset.grDropzoneOver === "true";
|
|
43
|
+
const prev = state.isOver;
|
|
44
|
+
state.isOver = next;
|
|
45
|
+
if (next) {
|
|
46
|
+
el.classList.add(state.options.overClass);
|
|
47
|
+
el.dataset.grDropzoneOver = "true";
|
|
48
|
+
} else {
|
|
49
|
+
el.classList.remove(state.options.overClass);
|
|
50
|
+
delete el.dataset.grDropzoneOver;
|
|
51
|
+
}
|
|
52
|
+
if (prev !== next || wasDomOver !== next) state.options.onStateChange?.({ isOver: next });
|
|
53
|
+
}
|
|
54
|
+
function unbind(el) {
|
|
55
|
+
const state = states.get(el);
|
|
56
|
+
if (!state) return;
|
|
57
|
+
state.overCounter = 0;
|
|
58
|
+
setOver(el, false);
|
|
59
|
+
delete el.dataset.grDropzone;
|
|
60
|
+
el.removeEventListener("dragenter", state.onDragEnter);
|
|
61
|
+
el.removeEventListener("dragover", state.onDragOver);
|
|
62
|
+
el.removeEventListener("dragleave", state.onDragLeave);
|
|
63
|
+
el.removeEventListener("drop", state.onDrop);
|
|
64
|
+
states.delete(el);
|
|
65
|
+
}
|
|
66
|
+
function bind(el, value) {
|
|
67
|
+
const state = {
|
|
68
|
+
options: normalize(value),
|
|
69
|
+
overCounter: 0,
|
|
70
|
+
isOver: false,
|
|
71
|
+
onDragEnter(event) {
|
|
72
|
+
const current = states.get(el);
|
|
73
|
+
if (!current?.options.enabled) return;
|
|
74
|
+
if (current.options.preventDefault) event.preventDefault();
|
|
75
|
+
if (current.options.stopPropagation) event.stopPropagation();
|
|
76
|
+
current.overCounter += 1;
|
|
77
|
+
setOver(el, true);
|
|
78
|
+
},
|
|
79
|
+
onDragOver(event) {
|
|
80
|
+
const current = states.get(el);
|
|
81
|
+
if (!current?.options.enabled) return;
|
|
82
|
+
if (current.options.preventDefault) event.preventDefault();
|
|
83
|
+
if (current.options.stopPropagation) event.stopPropagation();
|
|
84
|
+
if (event.dataTransfer) event.dataTransfer.dropEffect = "copy";
|
|
85
|
+
},
|
|
86
|
+
onDragLeave(event) {
|
|
87
|
+
const current = states.get(el);
|
|
88
|
+
if (!current?.options.enabled) return;
|
|
89
|
+
if (current.options.preventDefault) event.preventDefault();
|
|
90
|
+
if (current.options.stopPropagation) event.stopPropagation();
|
|
91
|
+
current.overCounter = Math.max(0, current.overCounter - 1);
|
|
92
|
+
if (current.overCounter === 0) setOver(el, false);
|
|
93
|
+
},
|
|
94
|
+
onDrop(event) {
|
|
95
|
+
const current = states.get(el);
|
|
96
|
+
if (!current?.options.enabled) return;
|
|
97
|
+
if (current.options.preventDefault) event.preventDefault();
|
|
98
|
+
if (current.options.stopPropagation) event.stopPropagation();
|
|
99
|
+
current.overCounter = 0;
|
|
100
|
+
setOver(el, false);
|
|
101
|
+
const dt = event.dataTransfer;
|
|
102
|
+
const files = dt?.files ? Array.prototype.slice.call(dt.files) : [];
|
|
103
|
+
if (!files.length) return;
|
|
104
|
+
(async () => {
|
|
105
|
+
try {
|
|
106
|
+
const { files: picked, issues } = await runFileValidators(files, current.options.validators ?? [], {
|
|
107
|
+
source: "drop",
|
|
108
|
+
multiple: current.options.multiple
|
|
109
|
+
});
|
|
110
|
+
if (issues.length > 0) {
|
|
111
|
+
current.options.onError?.(new FileValidationError(issues, picked));
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
if (!picked.length) return;
|
|
115
|
+
await current.options.onFiles?.(picked, event);
|
|
116
|
+
} catch (error) {
|
|
117
|
+
current.options.onError?.(error);
|
|
118
|
+
}
|
|
119
|
+
})();
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
states.set(el, state);
|
|
123
|
+
el.dataset.grDropzone = "true";
|
|
124
|
+
el.addEventListener("dragenter", state.onDragEnter);
|
|
125
|
+
el.addEventListener("dragover", state.onDragOver);
|
|
126
|
+
el.addEventListener("dragleave", state.onDragLeave);
|
|
127
|
+
el.addEventListener("drop", state.onDrop);
|
|
128
|
+
}
|
|
129
|
+
function update(el, value) {
|
|
130
|
+
const state = states.get(el);
|
|
131
|
+
if (!state) {
|
|
132
|
+
bind(el, value);
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
const prevOverClass = state.options.overClass;
|
|
136
|
+
const nextOptions = normalize(value);
|
|
137
|
+
state.options = nextOptions;
|
|
138
|
+
if (prevOverClass !== nextOptions.overClass) {
|
|
139
|
+
el.classList.remove(prevOverClass);
|
|
140
|
+
if (state.isOver) el.classList.add(nextOptions.overClass);
|
|
141
|
+
}
|
|
142
|
+
if (!nextOptions.enabled) {
|
|
143
|
+
state.overCounter = 0;
|
|
144
|
+
setOver(el, false);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* `v-dropzone` — декларативная DnD-зона для файлов (перетаскивание + drop).
|
|
149
|
+
*
|
|
150
|
+
* Директива не делает загрузку сама — только нормализует события и отдаёт `File[]`.
|
|
151
|
+
*/
|
|
152
|
+
var vDropzone = {
|
|
153
|
+
mounted(el, binding) {
|
|
154
|
+
bind(el, binding.value);
|
|
155
|
+
},
|
|
156
|
+
updated(el, binding) {
|
|
157
|
+
update(el, binding.value);
|
|
158
|
+
},
|
|
159
|
+
unmounted(el) {
|
|
160
|
+
unbind(el);
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
//#endregion
|
|
164
|
+
export { vDropzone };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dropzone.js","names":[],"sources":["../../src/directives/dropzone.ts"],"sourcesContent":["import type { Directive } from 'vue'\n\nimport type { FileValidator } from '../fileValidation'\n\nimport { FileValidationError, runFileValidators } from '../fileValidation'\n\nexport type DropzoneOnFiles = (files: File[], event: DragEvent) => void | Promise<void>\n\nexport type DropzoneBindingValue =\n | DropzoneOnFiles\n | {\n onFiles: DropzoneOnFiles\n /** По умолчанию `true`. */\n enabled?: boolean\n /** По умолчанию `true`. */\n multiple?: boolean\n\n /** Валидаторы, которые будут запущены перед `onFiles`. */\n validators?: FileValidator[]\n /** По умолчанию `true` (предотвращаем дефолтное поведение браузера при drop). */\n preventDefault?: boolean\n /** По умолчанию `false`. */\n stopPropagation?: boolean\n /** Вызывается, если валидация файлов не прошла. */\n onError?: (error: unknown) => void\n /** Вызывается при изменении состояния drag-over. */\n onStateChange?: (state: { isOver: boolean }) => void\n /** CSS-класс, который навешивается на элемент, пока курсор с файлами над зоной. */\n overClass?: string\n }\n\ntype NormalizedOptions = {\n enabled: boolean\n multiple: boolean\n validators: FileValidator[] | undefined\n preventDefault: boolean\n stopPropagation: boolean\n onFiles: DropzoneOnFiles | undefined\n onError: ((error: unknown) => void) | undefined\n onStateChange: ((state: { isOver: boolean }) => void) | undefined\n overClass: string\n}\n\nfunction normalize(value: DropzoneBindingValue | undefined): NormalizedOptions {\n if (typeof value === 'function') {\n return {\n enabled: true,\n multiple: true,\n validators: undefined,\n preventDefault: true,\n stopPropagation: false,\n onFiles: value,\n onError: undefined,\n onStateChange: undefined,\n overClass: 'ds-dropzone--over',\n }\n }\n\n if (value && typeof value === 'object') {\n return {\n enabled: value.enabled ?? true,\n multiple: value.multiple ?? true,\n validators: value.validators,\n preventDefault: value.preventDefault ?? true,\n stopPropagation: value.stopPropagation ?? false,\n onFiles: value.onFiles,\n onError: value.onError,\n onStateChange: value.onStateChange,\n overClass: value.overClass ?? 'ds-dropzone--over',\n }\n }\n\n return {\n enabled: false,\n multiple: true,\n validators: undefined,\n preventDefault: true,\n stopPropagation: false,\n onFiles: undefined,\n onError: undefined,\n onStateChange: undefined,\n overClass: 'ds-dropzone--over',\n }\n}\n\ntype InternalState = {\n options: NormalizedOptions\n overCounter: number\n isOver: boolean\n onDragEnter: (event: DragEvent) => void\n onDragOver: (event: DragEvent) => void\n onDragLeave: (event: DragEvent) => void\n onDrop: (event: DragEvent) => void\n}\n\nconst states = new WeakMap<HTMLElement, InternalState>()\n\nfunction setOver(el: HTMLElement, next: boolean) {\n const state = states.get(el)\n if (!state) return\n\n // `state.isOver` может рассинхронизироваться с DOM (например, при обновлениях\n // компонента/директивы во время drag-over). Поэтому DOM-состояние всегда\n // приводим к `next`, а коллбек вызываем только при фактическом изменении.\n const wasDomOver = el.dataset.grDropzoneOver === 'true'\n const prev = state.isOver\n\n state.isOver = next\n\n if (next) {\n el.classList.add(state.options.overClass)\n el.dataset.grDropzoneOver = 'true'\n } else {\n el.classList.remove(state.options.overClass)\n delete el.dataset.grDropzoneOver\n }\n\n if (prev !== next || wasDomOver !== next) {\n state.options.onStateChange?.({ isOver: next })\n }\n}\n\nfunction unbind(el: HTMLElement) {\n const state = states.get(el)\n if (!state) return\n\n // Гарантированно очищаем визуальное состояние и счётчики.\n // Это важно, если директива обновлялась/перебиндилась во время DnD.\n state.overCounter = 0\n setOver(el, false)\n\n delete el.dataset.grDropzone\n\n el.removeEventListener('dragenter', state.onDragEnter)\n el.removeEventListener('dragover', state.onDragOver)\n el.removeEventListener('dragleave', state.onDragLeave)\n el.removeEventListener('drop', state.onDrop)\n\n states.delete(el)\n}\n\nfunction bind(el: HTMLElement, value: DropzoneBindingValue | undefined) {\n const options = normalize(value)\n\n const state: InternalState = {\n options,\n overCounter: 0,\n isOver: false,\n onDragEnter(event) {\n const current = states.get(el)\n if (!current?.options.enabled) return\n\n if (current.options.preventDefault) event.preventDefault()\n if (current.options.stopPropagation) event.stopPropagation()\n\n current.overCounter += 1\n setOver(el, true)\n },\n onDragOver(event) {\n const current = states.get(el)\n if (!current?.options.enabled) return\n\n if (current.options.preventDefault) event.preventDefault()\n if (current.options.stopPropagation) event.stopPropagation()\n\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'copy'\n },\n onDragLeave(event) {\n const current = states.get(el)\n if (!current?.options.enabled) return\n\n if (current.options.preventDefault) event.preventDefault()\n if (current.options.stopPropagation) event.stopPropagation()\n\n current.overCounter = Math.max(0, current.overCounter - 1)\n if (current.overCounter === 0) setOver(el, false)\n },\n onDrop(event) {\n const current = states.get(el)\n if (!current?.options.enabled) return\n\n if (current.options.preventDefault) event.preventDefault()\n if (current.options.stopPropagation) event.stopPropagation()\n\n current.overCounter = 0\n setOver(el, false)\n\n const dt = event.dataTransfer\n const files = dt?.files ? Array.prototype.slice.call(dt.files) as File[] : []\n if (!files.length) return\n\n void (async () => {\n try {\n const validators = current.options.validators ?? []\n\n const { files: picked, issues } = await runFileValidators(files, validators, {\n source: 'drop',\n multiple: current.options.multiple,\n })\n\n if (issues.length > 0) {\n current.options.onError?.(new FileValidationError(issues, picked))\n return\n }\n\n if (!picked.length) return\n await current.options.onFiles?.(picked, event)\n } catch (error) {\n current.options.onError?.(error)\n }\n })()\n },\n }\n\n states.set(el, state)\n\n // Base marker.\n el.dataset.grDropzone = 'true'\n\n el.addEventListener('dragenter', state.onDragEnter)\n el.addEventListener('dragover', state.onDragOver)\n el.addEventListener('dragleave', state.onDragLeave)\n el.addEventListener('drop', state.onDrop)\n}\n\nfunction update(el: HTMLElement, value: DropzoneBindingValue | undefined) {\n const state = states.get(el)\n if (!state) {\n bind(el, value)\n return\n }\n\n const prevOverClass = state.options.overClass\n const nextOptions = normalize(value)\n\n state.options = nextOptions\n\n // Если поменялся `overClass`, синхронизируем DOM.\n if (prevOverClass !== nextOptions.overClass) {\n el.classList.remove(prevOverClass)\n if (state.isOver) el.classList.add(nextOptions.overClass)\n }\n\n // Если директива выключена — сбрасываем состояние.\n if (!nextOptions.enabled) {\n state.overCounter = 0\n setOver(el, false)\n }\n}\n\n/**\n * `v-dropzone` — декларативная DnD-зона для файлов (перетаскивание + drop).\n *\n * Директива не делает загрузку сама — только нормализует события и отдаёт `File[]`.\n */\nexport const vDropzone: Directive<HTMLElement, DropzoneBindingValue> = {\n mounted(el, binding) {\n bind(el, binding.value)\n },\n updated(el, binding) {\n update(el, binding.value)\n },\n unmounted(el) {\n unbind(el)\n },\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
//#region src/directives/hotkey.ts
|
|
2
|
+
var states = /* @__PURE__ */ new WeakMap();
|
|
3
|
+
function isEditableTarget(target) {
|
|
4
|
+
if (!(target instanceof HTMLElement)) return false;
|
|
5
|
+
if (target.isContentEditable) return true;
|
|
6
|
+
const tag = target.tagName;
|
|
7
|
+
return tag === "INPUT" || tag === "TEXTAREA" || tag === "SELECT";
|
|
8
|
+
}
|
|
9
|
+
function normalizeBinding(value) {
|
|
10
|
+
if (!value) return {
|
|
11
|
+
enabled: false,
|
|
12
|
+
handlers: {}
|
|
13
|
+
};
|
|
14
|
+
if ("handlers" in value) {
|
|
15
|
+
const v = value;
|
|
16
|
+
return {
|
|
17
|
+
enabled: v.enabled ?? true,
|
|
18
|
+
handlers: v.handlers ?? {}
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
enabled: true,
|
|
23
|
+
handlers: value
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function normalizeKeyToken(token) {
|
|
27
|
+
const t = token.trim().toLowerCase();
|
|
28
|
+
if (t === "esc") return "Escape";
|
|
29
|
+
if (t === "escape") return "Escape";
|
|
30
|
+
if (t === "space") return " ";
|
|
31
|
+
if (t.length === 1) return t;
|
|
32
|
+
return token.trim();
|
|
33
|
+
}
|
|
34
|
+
function parseHotkeys(map) {
|
|
35
|
+
const parsed = [];
|
|
36
|
+
for (const [combo, entry] of Object.entries(map)) {
|
|
37
|
+
const parts = combo.split("+").map((p) => p.trim()).filter(Boolean);
|
|
38
|
+
if (!parts.length) continue;
|
|
39
|
+
let ctrl = false;
|
|
40
|
+
let meta = false;
|
|
41
|
+
let alt = false;
|
|
42
|
+
let shift = false;
|
|
43
|
+
const keyToken = parts.at(-1);
|
|
44
|
+
if (!keyToken) continue;
|
|
45
|
+
for (const p of parts.slice(0, -1)) {
|
|
46
|
+
const t = p.toLowerCase();
|
|
47
|
+
if (t === "ctrl" || t === "control") ctrl = true;
|
|
48
|
+
else if (t === "meta" || t === "cmd" || t === "command" || t === "⌘") meta = true;
|
|
49
|
+
else if (t === "alt" || t === "option") alt = true;
|
|
50
|
+
else if (t === "shift") shift = true;
|
|
51
|
+
}
|
|
52
|
+
const key = normalizeKeyToken(keyToken);
|
|
53
|
+
parsed.push({
|
|
54
|
+
original: combo,
|
|
55
|
+
key,
|
|
56
|
+
ctrl,
|
|
57
|
+
meta,
|
|
58
|
+
alt,
|
|
59
|
+
shift,
|
|
60
|
+
entry
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
return parsed;
|
|
64
|
+
}
|
|
65
|
+
function matchKey(expected, eventKey) {
|
|
66
|
+
if (expected === " ") return eventKey === " " || eventKey === "Spacebar";
|
|
67
|
+
if (expected.length === 1) return expected.toLowerCase() === eventKey.toLowerCase();
|
|
68
|
+
return expected === eventKey;
|
|
69
|
+
}
|
|
70
|
+
function resolveEntry(entry) {
|
|
71
|
+
if (typeof entry === "function") return {
|
|
72
|
+
handler: entry,
|
|
73
|
+
preventDefault: void 0,
|
|
74
|
+
stopPropagation: false,
|
|
75
|
+
allowInEditable: false
|
|
76
|
+
};
|
|
77
|
+
return {
|
|
78
|
+
handler: entry.handler,
|
|
79
|
+
preventDefault: entry.preventDefault,
|
|
80
|
+
stopPropagation: entry.stopPropagation ?? false,
|
|
81
|
+
allowInEditable: entry.allowInEditable ?? false
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* `v-hotkey` — горячие клавиши на компонент/страницу.
|
|
86
|
+
*
|
|
87
|
+
* Пример:
|
|
88
|
+
* ```vue
|
|
89
|
+
* <div v-hotkey="{ 'Escape': close, 'Ctrl+K': openSearch }" />
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
var vHotkey = {
|
|
93
|
+
mounted(el, binding) {
|
|
94
|
+
if (typeof window === "undefined") return;
|
|
95
|
+
const { enabled, handlers } = normalizeBinding(binding.value);
|
|
96
|
+
const state = {
|
|
97
|
+
enabled,
|
|
98
|
+
hotkeys: parseHotkeys(handlers),
|
|
99
|
+
listener: (event) => {
|
|
100
|
+
const current = states.get(el);
|
|
101
|
+
if (!current?.enabled) return;
|
|
102
|
+
if (!el.isConnected) return;
|
|
103
|
+
const editable = isEditableTarget(event.target);
|
|
104
|
+
for (const hk of current.hotkeys) {
|
|
105
|
+
if (hk.ctrl !== event.ctrlKey) continue;
|
|
106
|
+
if (hk.meta !== event.metaKey) continue;
|
|
107
|
+
if (hk.alt !== event.altKey) continue;
|
|
108
|
+
if (hk.shift !== event.shiftKey) continue;
|
|
109
|
+
if (!matchKey(hk.key, event.key)) continue;
|
|
110
|
+
const entry = resolveEntry(hk.entry);
|
|
111
|
+
const hasModifier = hk.ctrl || hk.meta || hk.alt || hk.shift;
|
|
112
|
+
if (editable && !entry.allowInEditable && !hasModifier && hk.key !== "Escape") continue;
|
|
113
|
+
if (entry.preventDefault ?? (hk.ctrl || hk.meta || hk.alt)) event.preventDefault();
|
|
114
|
+
if (entry.stopPropagation) event.stopPropagation();
|
|
115
|
+
entry.handler(event);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
states.set(el, state);
|
|
121
|
+
window.addEventListener("keydown", state.listener);
|
|
122
|
+
},
|
|
123
|
+
updated(el, binding) {
|
|
124
|
+
const state = states.get(el);
|
|
125
|
+
if (!state) return;
|
|
126
|
+
const next = normalizeBinding(binding.value);
|
|
127
|
+
state.enabled = next.enabled;
|
|
128
|
+
state.hotkeys = parseHotkeys(next.handlers);
|
|
129
|
+
},
|
|
130
|
+
unmounted(el) {
|
|
131
|
+
const state = states.get(el);
|
|
132
|
+
if (!state) return;
|
|
133
|
+
window.removeEventListener("keydown", state.listener);
|
|
134
|
+
states.delete(el);
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
//#endregion
|
|
138
|
+
export { vHotkey };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hotkey.js","names":[],"sources":["../../src/directives/hotkey.ts"],"sourcesContent":["import type { Directive } from 'vue'\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\nexport type HotkeyBindingValue =\n | HotkeyMap\n | {\n handlers: HotkeyMap\n enabled?: boolean\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}\n\nconst states = new WeakMap<HTMLElement, InternalState>()\n\nfunction isEditableTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false\n if (target.isContentEditable) return true\n\n const tag = target.tagName\n return tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT'\n}\n\nfunction normalizeBinding(value: HotkeyBindingValue | undefined) {\n if (!value) return { enabled: false, handlers: {} as HotkeyMap }\n if ('handlers' in (value as any)) {\n const v = value as { handlers: HotkeyMap; enabled?: boolean }\n return { enabled: v.enabled ?? true, handlers: v.handlers ?? {} }\n }\n return { enabled: true, handlers: value as HotkeyMap }\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 matchKey(expected: string, eventKey: string): boolean {\n if (expected === ' ') return eventKey === ' ' || eventKey === 'Spacebar'\n if (expected.length === 1) return expected.toLowerCase() === eventKey.toLowerCase()\n return expected === eventKey\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 */\nexport const vHotkey: Directive<HTMLElement, HotkeyBindingValue> = {\n mounted(el, binding) {\n if (typeof window === 'undefined') return\n\n const { enabled, handlers } = normalizeBinding(binding.value)\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\n const editable = isEditableTarget(event.target)\n\n for (const hk of current.hotkeys) {\n if (hk.ctrl !== event.ctrlKey) continue\n if (hk.meta !== event.metaKey) continue\n if (hk.alt !== event.altKey) continue\n if (hk.shift !== event.shiftKey) continue\n if (!matchKey(hk.key, event.key)) 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 }\n\n states.set(el, state)\n window.addEventListener('keydown', state.listener)\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 unmounted(el) {\n const state = states.get(el)\n if (!state) return\n window.removeEventListener('keydown', state.listener)\n states.delete(el)\n },\n}\n"],"mappings":"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"}
|
package/dist/directives/index.js
CHANGED
|
@@ -1,2 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { vAutofocus } from "./autofocus.js";
|
|
2
|
+
import { vAutosize } from "./autosize.js";
|
|
3
|
+
import { vClickOutside } from "./clickOutside.js";
|
|
4
|
+
import { vDropzone } from "./dropzone.js";
|
|
5
|
+
import { vHotkey } from "./hotkey.js";
|
|
6
|
+
import { createLoading, vLoading } from "./loading.js";
|
|
2
7
|
export { createLoading, vAutofocus, vAutosize, vClickOutside, vDropzone, vHotkey, vLoading };
|