@feugene/granularity 0.24.1 → 0.26.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/config-BViooYNv.js.map +1 -0
- package/dist/chunks/config-BfsBepkH.js.map +1 -0
- package/dist/chunks/config-BuGlNPE92.js.map +1 -0
- package/dist/chunks/config-CPSxM7XE.js +8 -0
- package/dist/chunks/config-CPSxM7XE.js.map +1 -0
- package/dist/chunks/config-D7zgE_Gr.js +107 -0
- package/dist/chunks/config-D7zgE_Gr.js.map +1 -0
- package/dist/chunks/config-DAX8Deh1.js.map +1 -0
- package/dist/chunks/config-DGCMHPCR.js +19 -0
- package/dist/chunks/config-DGCMHPCR.js.map +1 -0
- package/dist/chunks/config-DGWFal5h.js +128 -0
- package/dist/chunks/config-DGWFal5h.js.map +1 -0
- package/dist/chunks/config-DKISz9gR.js +39 -0
- package/dist/chunks/config-DKISz9gR.js.map +1 -0
- package/dist/chunks/{config-BSyiFlbi2.js → config-DtgYuGUn2.js} +2 -1
- package/dist/chunks/config-DtgYuGUn2.js.map +1 -0
- package/dist/chunks/config-Iu684VNI.js +21 -0
- package/dist/chunks/config-Iu684VNI.js.map +1 -0
- package/dist/chunks/config-T3qdQBgU.js.map +1 -0
- package/dist/chunks/config-rkcKArZQ.js.map +1 -0
- package/dist/chunks/config-vSji8w90.js.map +1 -0
- package/dist/chunks/config-zjeAJ4ho2.js.map +1 -0
- package/dist/chunks/context-BfIQv7m12.js.map +1 -0
- package/dist/chunks/context-CTbuwcYs.js.map +1 -1
- package/dist/chunks/{en-DCCFP4qu.js → en-NpP9e7lC.js} +16 -2
- package/dist/chunks/en-NpP9e7lC.js.map +1 -0
- package/dist/chunks/{es-CT34HBVM.js → es-DaeA2Ql-.js} +16 -2
- package/dist/chunks/es-DaeA2Ql-.js.map +1 -0
- package/dist/chunks/{es-DdJsxlUr.js → es-Do2CNrC2.js} +3 -3
- package/dist/chunks/{es-DdJsxlUr.js.map → es-Do2CNrC2.js.map} +1 -1
- package/dist/chunks/{generated-1WEi10KK.js → generated-CJe6hdiE.js} +49 -0
- package/dist/chunks/{generated-1WEi10KK.js.map → generated-CJe6hdiE.js.map} +1 -1
- package/dist/chunks/{grBadgeStyles-C2wLlkjF.js → grBadgeStyles-C1S56Alo.js} +6 -1
- package/dist/chunks/{grBadgeStyles-C2wLlkjF.js.map → grBadgeStyles-C1S56Alo.js.map} +1 -1
- package/dist/chunks/grChipGroupContext-DZXkACap.js +4 -0
- package/dist/chunks/grChipGroupContext-DZXkACap.js.map +1 -0
- package/dist/chunks/{config-C5mO5DYZ.js → grDropdownMenuStyles-D1LOkdVj.js} +1 -38
- package/dist/chunks/grDropdownMenuStyles-D1LOkdVj.js.map +1 -0
- package/dist/chunks/{grPopoverStyles-Rz_Z5nLW.js → grPopoverStyles-Cke_BZsM.js} +16 -3
- package/dist/chunks/grPopoverStyles-Cke_BZsM.js.map +1 -0
- package/dist/chunks/{granular-provider-Dr2PKgl1.js → granular-provider-BaHkLjFX.js} +19 -11
- package/dist/chunks/granular-provider-BaHkLjFX.js.map +1 -0
- package/dist/chunks/{ru-CLiAMwrx.js → ru-Bg9-DPmg.js} +16 -2
- package/dist/chunks/ru-Bg9-DPmg.js.map +1 -0
- package/dist/chunks/{config-qVg3Zz_A.js → safelist-DOfCQR5O.js} +2 -19
- package/dist/chunks/safelist-DOfCQR5O.js.map +1 -0
- package/dist/chunks/useMenuItemsFocus-OyOnIAlr.js +117 -0
- package/dist/chunks/useMenuItemsFocus-OyOnIAlr.js.map +1 -0
- package/dist/chunks/{validation-DauXRIkL.js → validation-5HhpanPP.js} +1 -1
- package/dist/chunks/{validation-DauXRIkL.js.map → validation-5HhpanPP.js.map} +1 -1
- package/dist/components/GrAutocomplete/chunks/{GrAutocomplete-DsevPtiS.js → GrAutocomplete-D9c9BNFg.js} +1 -1
- package/dist/components/GrAutocomplete/chunks/{GrAutocomplete-DsevPtiS.js.map → GrAutocomplete-D9c9BNFg.js.map} +1 -1
- package/dist/components/GrAutocomplete/index.js +1 -1
- package/dist/components/GrBadge/chunks/{GrBadge-u2ZdS7CN.js → GrBadge-_9rCHuE1.js} +1 -1
- package/dist/components/GrBadge/chunks/{GrBadge-u2ZdS7CN.js.map → GrBadge-_9rCHuE1.js.map} +1 -1
- package/dist/components/GrBadge/index.js +3 -2
- package/dist/components/GrButton/chunks/{GrButton-Bw2AH4uX.js → GrButton-DCz-Wn-V.js} +1 -1
- package/dist/components/GrButton/chunks/{GrButton-Bw2AH4uX.js.map → GrButton-DCz-Wn-V.js.map} +1 -1
- package/dist/components/GrButton/index.js +1 -1
- package/dist/components/GrButtonGroup/chunks/{GrButtonGroup-CKyiAV8K.js → GrButtonGroup-BQo5VQ_c.js} +1 -1
- package/dist/components/GrButtonGroup/chunks/{GrButtonGroup-CKyiAV8K.js.map → GrButtonGroup-BQo5VQ_c.js.map} +1 -1
- package/dist/components/GrButtonGroup/index.js +2 -2
- package/dist/components/GrCard/chunks/{GrCard-gI2wA8ZZ.js → GrCard-aQIjk6I9.js} +1 -1
- package/dist/components/GrCard/chunks/GrCard-aQIjk6I9.js.map +1 -0
- package/dist/components/GrCard/index.js +1 -1
- package/dist/components/GrCheckboxGroup/index.js +1 -1
- package/dist/components/GrChip/chunks/GrChip-BnL2FedO.js +222 -0
- package/dist/components/GrChip/chunks/GrChip-BnL2FedO.js.map +1 -0
- package/dist/components/GrChip/index.js +3 -0
- package/dist/components/GrChipGroup/chunks/GrChipGroup-DefmSdY9.js +209 -0
- package/dist/components/GrChipGroup/chunks/GrChipGroup-DefmSdY9.js.map +1 -0
- package/dist/components/GrChipGroup/index.js +3 -0
- package/dist/components/GrCodeBlock/chunks/{GrCodeBlock-BmXCLgLS.js → GrCodeBlock-CyptiEo4.js} +1 -1
- package/dist/components/GrCodeBlock/chunks/{GrCodeBlock-BmXCLgLS.js.map → GrCodeBlock-CyptiEo4.js.map} +1 -1
- package/dist/components/GrCodeBlock/index.js +1 -1
- package/dist/components/GrCollapse/chunks/{GrCollapse-DIHEiTju.js → GrCollapse-DUROgAgc.js} +1 -1
- package/dist/components/GrCollapse/chunks/{GrCollapse-DIHEiTju.js.map → GrCollapse-DUROgAgc.js.map} +1 -1
- package/dist/components/GrCollapse/index.js +1 -1
- package/dist/components/GrColorPicker/chunks/{GrColorPicker-qQdoEPHF.js → GrColorPicker-CDaJRVIM.js} +1 -1
- package/dist/components/GrColorPicker/chunks/{GrColorPicker-qQdoEPHF.js.map → GrColorPicker-CDaJRVIM.js.map} +1 -1
- package/dist/components/GrColorPicker/index.js +1 -1
- package/dist/components/GrCommandPalette/chunks/{GrCommandPalette-BFcMf4Pn.js → GrCommandPalette-BPsVN_XU.js} +3 -3
- package/dist/components/GrCommandPalette/chunks/GrCommandPalette-BPsVN_XU.js.map +1 -0
- package/dist/components/GrCommandPalette/index.js +1 -1
- package/dist/components/GrCommandPalette/styles.css +1 -1
- package/dist/components/GrConfigProvider/chunks/{GrConfigProvider-UP-EaoAf.js → GrConfigProvider-BF7R3hgg.js} +1 -1
- package/dist/components/GrConfigProvider/chunks/GrConfigProvider-BF7R3hgg.js.map +1 -0
- package/dist/components/GrConfigProvider/index.js +1 -1
- package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-rRtMScJX.js → GrConfirmDialog-CwXNLyzk.js} +3 -3
- package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-rRtMScJX.js.map → GrConfirmDialog-CwXNLyzk.js.map} +1 -1
- package/dist/components/GrConfirmDialog/index.js +1 -1
- package/dist/components/GrContextMenu/chunks/GrContextMenu-BbAJholy.js +331 -0
- package/dist/components/GrContextMenu/chunks/GrContextMenu-BbAJholy.js.map +1 -0
- package/dist/components/GrContextMenu/index.js +3 -0
- package/dist/components/GrDataTable/chunks/{GrDataTable-B5MmZFUg.js → GrDataTable-NRbrXpdx.js} +2 -2
- package/dist/components/GrDataTable/chunks/GrDataTable-NRbrXpdx.js.map +1 -0
- package/dist/components/GrDataTable/index.js +1 -1
- package/dist/components/GrDescriptionList/chunks/{GrDescriptionList-C6Pxjjbh.js → GrDescriptionList-1mICfrqX.js} +1 -1
- package/dist/components/GrDescriptionList/chunks/{GrDescriptionList-C6Pxjjbh.js.map → GrDescriptionList-1mICfrqX.js.map} +1 -1
- package/dist/components/GrDescriptionList/index.js +2 -2
- package/dist/components/GrDialog/chunks/{GrDialog-D0U5iRqV.js → GrDialog-5Y5K87ss.js} +2 -2
- package/dist/components/GrDialog/chunks/{GrDialog-D0U5iRqV.js.map → GrDialog-5Y5K87ss.js.map} +1 -1
- package/dist/components/GrDialog/index.js +1 -1
- package/dist/components/GrDialogService/chunks/{GrDialogService-CrwA4aJq.js → GrDialogService-CHVR4sOk.js} +6 -6
- package/dist/components/GrDialogService/chunks/GrDialogService-CHVR4sOk.js.map +1 -0
- package/dist/components/GrDialogService/index.js +1 -1
- package/dist/components/GrDrawer/chunks/{GrDrawer-C3zAg2tG.js → GrDrawer-CXy3-SVd.js} +2 -2
- package/dist/components/GrDrawer/chunks/GrDrawer-CXy3-SVd.js.map +1 -0
- package/dist/components/GrDrawer/index.js +1 -1
- package/dist/components/GrDropdown/chunks/{GrDropdown-BSfFOcDx.js → GrDropdown-BfTmdPyh.js} +10 -79
- package/dist/components/GrDropdown/chunks/GrDropdown-BfTmdPyh.js.map +1 -0
- package/dist/components/GrDropdown/index.js +2 -2
- package/dist/components/GrDropdownMenu/chunks/GrDropdownMenu-l5HEqzjr.js +130 -0
- package/dist/components/GrDropdownMenu/chunks/GrDropdownMenu-l5HEqzjr.js.map +1 -0
- package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu-DyS6dWDp.js → GrDropdownMenuList-BGA_xNVo.js} +57 -159
- package/dist/components/GrDropdownMenu/chunks/GrDropdownMenuList-BGA_xNVo.js.map +1 -0
- package/dist/components/GrDropdownMenu/index.js +3 -2
- package/dist/components/GrEmptyState/chunks/{GrEmptyState-BGUX8O0U.js → GrEmptyState-CS9do8eM.js} +1 -1
- package/dist/components/GrEmptyState/chunks/{GrEmptyState-BGUX8O0U.js.map → GrEmptyState-CS9do8eM.js.map} +1 -1
- package/dist/components/GrEmptyState/index.js +2 -2
- package/dist/components/GrFileUpload/chunks/{GrFileUpload-D3-vC-ap.js → GrFileUpload-wNXzHb5N.js} +1 -1
- package/dist/components/GrFileUpload/chunks/GrFileUpload-wNXzHb5N.js.map +1 -0
- package/dist/components/GrFileUpload/index.js +1 -1
- package/dist/components/GrForm/chunks/{GrForm-B_Qq_13k.js → GrForm-CAlJg-wb.js} +1 -1
- package/dist/components/GrForm/chunks/{GrForm-B_Qq_13k.js.map → GrForm-CAlJg-wb.js.map} +1 -1
- package/dist/components/GrForm/index.js +3 -3
- package/dist/components/GrFormField/chunks/{GrFormField-kqfVY30N.js → GrFormField-DSylU7IU.js} +1 -1
- package/dist/components/GrFormField/chunks/GrFormField-DSylU7IU.js.map +1 -0
- package/dist/components/GrFormField/index.js +1 -1
- package/dist/components/GrFormFile/chunks/{GrFormFile-D722xHn8.js → GrFormFile-DhVkB2gm.js} +1 -1
- package/dist/components/GrFormFile/chunks/{GrFormFile-D722xHn8.js.map → GrFormFile-DhVkB2gm.js.map} +1 -1
- package/dist/components/GrFormFile/index.js +1 -1
- package/dist/components/GrInputTag/chunks/{GrInputTag-C7QVPijj.js → GrInputTag-UI8kIB_F.js} +2 -2
- package/dist/components/GrInputTag/chunks/{GrInputTag-C7QVPijj.js.map → GrInputTag-UI8kIB_F.js.map} +1 -1
- package/dist/components/GrInputTag/index.js +1 -1
- package/dist/components/GrJsonViewer/chunks/{GrJsonViewer-DFUppRNb.js → GrJsonViewer-jk3ylOTc.js} +2 -2
- package/dist/components/GrJsonViewer/chunks/GrJsonViewer-jk3ylOTc.js.map +1 -0
- package/dist/components/GrJsonViewer/index.js +1 -1
- package/dist/components/GrList/chunks/{GrList-DAtzVIHh.js → GrList-B5bclmHV.js} +30 -3
- package/dist/components/GrList/chunks/GrList-B5bclmHV.js.map +1 -0
- package/dist/components/GrList/index.js +1 -1
- package/dist/components/GrList/styles.css +1 -1
- package/dist/components/GrModal/chunks/{GrModal-CPz7SWD_.js → GrModal-CCoWZuIl.js} +2 -2
- package/dist/components/GrModal/chunks/GrModal-CCoWZuIl.js.map +1 -0
- package/dist/components/GrModal/index.js +1 -1
- package/dist/components/GrNavbar/chunks/{GrNavbar-DWaaoV7n.js → GrNavbar-DPj30sHX.js} +1 -1
- package/dist/components/GrNavbar/chunks/{GrNavbar-DWaaoV7n.js.map → GrNavbar-DPj30sHX.js.map} +1 -1
- package/dist/components/GrNavbar/index.js +1 -1
- package/dist/components/GrNumberInput/chunks/{GrNumberInput-BotnzW77.js → GrNumberInput-V2mZvDDC.js} +1 -1
- package/dist/components/GrNumberInput/chunks/{GrNumberInput-BotnzW77.js.map → GrNumberInput-V2mZvDDC.js.map} +1 -1
- package/dist/components/GrNumberInput/index.js +2 -2
- package/dist/components/GrPagination/chunks/{GrPagination-GtGtSMJG.js → GrPagination-DG7kp6VL.js} +2 -2
- package/dist/components/GrPagination/chunks/{GrPagination-GtGtSMJG.js.map → GrPagination-DG7kp6VL.js.map} +1 -1
- package/dist/components/GrPagination/index.js +1 -1
- package/dist/components/GrPopover/chunks/{GrPopover-b70bIlQ9.js → GrPopover-DDChM1jD.js} +28 -10
- package/dist/components/GrPopover/chunks/GrPopover-DDChM1jD.js.map +1 -0
- package/dist/components/GrPopover/index.js +2 -2
- package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-CEI8bf-t.js → GrPromptDialog-BGuMUzlv.js} +5 -5
- package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-CEI8bf-t.js.map → GrPromptDialog-BGuMUzlv.js.map} +1 -1
- package/dist/components/GrPromptDialog/index.js +1 -1
- package/dist/components/GrRadioGroup/chunks/{GrRadioGroup-BVmjKXcv.js → GrRadioGroup-7w4bXIg_.js} +1 -1
- package/dist/components/GrRadioGroup/chunks/{GrRadioGroup-BVmjKXcv.js.map → GrRadioGroup-7w4bXIg_.js.map} +1 -1
- package/dist/components/GrRadioGroup/index.js +1 -1
- package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-CZONq8uT.js → GrResponseErrorBanner-BhP-xw2P.js} +1 -1
- package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-CZONq8uT.js.map → GrResponseErrorBanner-BhP-xw2P.js.map} +1 -1
- package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-CgfAwlg3.js → GrResponseErrorBanner-DA4q90Zt.js} +1 -1
- package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-CgfAwlg3.js.map → GrResponseErrorBanner-DA4q90Zt.js.map} +1 -1
- package/dist/components/GrResponseErrorBanner/index.js +2 -2
- package/dist/components/GrSelect/chunks/{GrSelect-CaGuyvtb.js → GrSelect-BA1wfX3c.js} +19 -3
- package/dist/components/GrSelect/chunks/GrSelect-BA1wfX3c.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-D7WxRtIu.js → GrSidebar-DY-LgIbS.js} +2 -2
- package/dist/components/GrSidebar/chunks/{GrSidebar-D7WxRtIu.js.map → GrSidebar-DY-LgIbS.js.map} +1 -1
- package/dist/components/GrSidebar/index.js +2 -2
- package/dist/components/GrSlider/index.js +1 -1
- package/dist/components/GrSortableList/chunks/{GrSortableList-BmcUVAMb.js → GrSortableList-BMXyxmRc.js} +3 -3
- package/dist/components/GrSortableList/chunks/{GrSortableList-BmcUVAMb.js.map → GrSortableList-BMXyxmRc.js.map} +1 -1
- package/dist/components/GrSortableList/index.js +2 -2
- package/dist/components/GrSteps/chunks/GrSteps-Cce4rfr3.js +282 -0
- package/dist/components/GrSteps/chunks/GrSteps-Cce4rfr3.js.map +1 -0
- package/dist/components/GrSteps/index.js +3 -0
- package/dist/components/GrTabPanels/chunks/{GrTabPanels-AJt1w1XC.js → GrTabPanels-BZQS8-JM.js} +12 -1
- package/dist/components/GrTabPanels/chunks/{GrTabPanels-AJt1w1XC.js.map → GrTabPanels-BZQS8-JM.js.map} +1 -1
- package/dist/components/GrTabPanels/index.js +1 -1
- package/dist/components/GrTimeline/chunks/{GrTimeline-Ch9sHzwL.js → GrTimeline-DIDdkTn7.js} +12 -1
- package/dist/components/GrTimeline/chunks/GrTimeline-DIDdkTn7.js.map +1 -0
- package/dist/components/GrTimeline/index.js +1 -1
- package/dist/components/GrToaster/chunks/{GrToaster-DJUzx3sR.js → GrToaster-CC49q3a4.js} +1 -1
- package/dist/components/GrToaster/chunks/{GrToaster-DJUzx3sR.js.map → GrToaster-CC49q3a4.js.map} +1 -1
- package/dist/components/GrToaster/index.js +1 -1
- package/dist/components/GrTree/chunks/{GrTree-BvOeQ3xJ.js.map → GrTree-J5q8aCya.js.map} +1 -1
- package/dist/components/GrTree/index.js +1 -1
- package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-_LjTRR7X.js → GrTreeSelect-DEfxWAc3.js} +1 -1
- package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-_LjTRR7X.js.map → GrTreeSelect-DEfxWAc3.js.map} +1 -1
- package/dist/components/GrTreeSelect/index.js +1 -1
- package/dist/composables/useFloating.js +47 -7
- package/dist/composables/useFloating.js.map +1 -1
- package/dist/composables/useTheme.js.map +1 -1
- package/dist/composables/useToast.js.map +1 -1
- package/dist/granular-provider-node.js +1 -1
- package/dist/granular-provider.js +1 -1
- package/dist/i18n/all.js +1 -1
- package/dist/i18n/index.js +1 -1
- package/dist/index.js +68 -58
- package/dist/theme.js +1 -1
- package/dist/tokens.js +1 -1
- package/dist/types/components/GrBadge/grBadgeStyles.d.ts +7 -0
- package/dist/types/components/GrCard/GrCard.vue.d.ts +1 -1
- package/dist/types/components/GrChip/GrChip.vue.d.ts +118 -0
- package/dist/types/components/GrChip/config.d.ts +1 -0
- package/dist/types/components/GrChip/defaults.d.ts +16 -0
- package/dist/types/components/GrChip/grChipGroupContext.d.ts +52 -0
- package/dist/types/components/GrChip/grChipStyles.d.ts +64 -0
- package/dist/types/components/GrChip/index.d.ts +11 -0
- package/dist/types/components/GrChip/safelist.d.ts +7 -0
- package/dist/types/components/GrChipGroup/GrChipGroup.vue.d.ts +128 -0
- package/dist/types/components/GrChipGroup/config.d.ts +1 -0
- package/dist/types/components/GrChipGroup/defaults.d.ts +13 -0
- package/dist/types/components/GrChipGroup/grChipGroupStyles.d.ts +7 -0
- package/dist/types/components/GrChipGroup/index.d.ts +9 -0
- package/dist/types/components/GrChipGroup/safelist.d.ts +1 -0
- package/dist/types/components/GrContextMenu/GrContextMenu.vue.d.ts +157 -0
- package/dist/types/components/GrContextMenu/config.d.ts +1 -0
- package/dist/types/components/GrContextMenu/contextMenuAnchor.d.ts +29 -0
- package/dist/types/components/GrContextMenu/index.d.ts +7 -0
- package/dist/types/components/GrDataTable/GrDataTable.vue.d.ts +1 -1
- package/dist/types/components/GrDropdownMenu/GrDropdownMenu.vue.d.ts +3 -3
- package/dist/types/components/GrDropdownMenu/GrDropdownMenuEntries.vue.d.ts +22 -0
- package/dist/types/components/GrFilePreview/GrFilePreview.vue.d.ts +1 -1
- package/dist/types/components/GrForm/index.d.ts +1 -1
- package/dist/types/components/GrList/GrListItem.vue.d.ts +1 -1
- package/dist/types/components/GrPopover/GrPopover.vue.d.ts +21 -2
- package/dist/types/components/GrPopover/grPopoverStyles.d.ts +11 -1
- package/dist/types/components/GrPopover/index.d.ts +1 -1
- package/dist/types/components/GrStatistic/GrStatistic.vue.d.ts +1 -1
- package/dist/types/components/GrSteps/GrSteps.vue.d.ts +118 -0
- package/dist/types/components/GrSteps/config.d.ts +1 -0
- package/dist/types/components/GrSteps/defaults.d.ts +18 -0
- package/dist/types/components/GrSteps/grStepsStyles.d.ts +63 -0
- package/dist/types/components/GrSteps/index.d.ts +11 -0
- package/dist/types/components/GrSteps/safelist.d.ts +1 -0
- package/dist/types/components/GrSteps/stepsModel.d.ts +57 -0
- package/dist/types/composables/internal/useMenuItemsFocus.d.ts +24 -0
- package/dist/types/composables/internal/useTypeahead.d.ts +30 -0
- package/dist/types/composables/useFloating.d.ts +33 -2
- package/dist/types/granular-provider/shared.d.ts +4 -0
- package/dist/types/i18n/messages/en.d.ts +26 -0
- package/dist/types/i18n/messages/es.d.ts +26 -0
- package/dist/types/i18n/messages/ru.d.ts +26 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/web-types.json +790 -241
- package/package.json +18 -2
- package/dist/chunks/config-BSyiFlbi2.js.map +0 -1
- package/dist/chunks/config-BViooYNv2.js.map +0 -1
- package/dist/chunks/config-BfsBepkH2.js.map +0 -1
- package/dist/chunks/config-BuGlNPE9.js.map +0 -1
- package/dist/chunks/config-C5mO5DYZ.js.map +0 -1
- package/dist/chunks/config-DAX8Deh12.js.map +0 -1
- package/dist/chunks/config-T3qdQBgU2.js.map +0 -1
- package/dist/chunks/config-qVg3Zz_A.js.map +0 -1
- package/dist/chunks/config-rkcKArZQ2.js.map +0 -1
- package/dist/chunks/config-vSji8w902.js.map +0 -1
- package/dist/chunks/config-zjeAJ4ho.js.map +0 -1
- package/dist/chunks/context-BfIQv7m1.js.map +0 -1
- package/dist/chunks/en-DCCFP4qu.js.map +0 -1
- package/dist/chunks/es-CT34HBVM.js.map +0 -1
- package/dist/chunks/grPopoverStyles-Rz_Z5nLW.js.map +0 -1
- package/dist/chunks/granular-provider-Dr2PKgl1.js.map +0 -1
- package/dist/chunks/ru-CLiAMwrx.js.map +0 -1
- package/dist/components/GrCard/chunks/GrCard-gI2wA8ZZ.js.map +0 -1
- package/dist/components/GrCommandPalette/chunks/GrCommandPalette-BFcMf4Pn.js.map +0 -1
- package/dist/components/GrConfigProvider/chunks/GrConfigProvider-UP-EaoAf.js.map +0 -1
- package/dist/components/GrDataTable/chunks/GrDataTable-B5MmZFUg.js.map +0 -1
- package/dist/components/GrDialogService/chunks/GrDialogService-CrwA4aJq.js.map +0 -1
- package/dist/components/GrDrawer/chunks/GrDrawer-C3zAg2tG.js.map +0 -1
- package/dist/components/GrDropdown/chunks/GrDropdown-BSfFOcDx.js.map +0 -1
- package/dist/components/GrDropdownMenu/chunks/GrDropdownMenu-DyS6dWDp.js.map +0 -1
- package/dist/components/GrFileUpload/chunks/GrFileUpload-D3-vC-ap.js.map +0 -1
- package/dist/components/GrFormField/chunks/GrFormField-kqfVY30N.js.map +0 -1
- package/dist/components/GrJsonViewer/chunks/GrJsonViewer-DFUppRNb.js.map +0 -1
- package/dist/components/GrList/chunks/GrList-DAtzVIHh.js.map +0 -1
- package/dist/components/GrModal/chunks/GrModal-CPz7SWD_.js.map +0 -1
- package/dist/components/GrPopover/chunks/GrPopover-b70bIlQ9.js.map +0 -1
- package/dist/components/GrSelect/chunks/GrSelect-CaGuyvtb.js.map +0 -1
- package/dist/components/GrTimeline/chunks/GrTimeline-Ch9sHzwL.js.map +0 -1
- package/dist/chunks/{config-BViooYNv2.js → config-BViooYNv.js} +0 -0
- package/dist/chunks/{config-BfsBepkH2.js → config-BfsBepkH.js} +0 -0
- package/dist/chunks/{config-BuGlNPE9.js → config-BuGlNPE92.js} +0 -0
- package/dist/chunks/{config-DAX8Deh12.js → config-DAX8Deh1.js} +0 -0
- package/dist/chunks/{config-T3qdQBgU2.js → config-T3qdQBgU.js} +0 -0
- package/dist/chunks/{config-rkcKArZQ2.js → config-rkcKArZQ.js} +0 -0
- package/dist/chunks/{config-vSji8w902.js → config-vSji8w90.js} +0 -0
- package/dist/chunks/{config-zjeAJ4ho.js → config-zjeAJ4ho2.js} +0 -0
- package/dist/chunks/{context-BfIQv7m1.js → context-BfIQv7m12.js} +0 -0
- package/dist/components/GrTree/chunks/{GrTree-BvOeQ3xJ.js → GrTree-J5q8aCya.js} +1 -1
|
@@ -1,17 +1,15 @@
|
|
|
1
1
|
import { s as useGrThemeAttrs } from "../../../chunks/context-CTbuwcYs.js";
|
|
2
2
|
import { t as usePortalTarget } from "../../../chunks/usePortalTarget-C0p-mhaM.js";
|
|
3
3
|
import { vClickOutside } from "../../../directives/clickOutside.js";
|
|
4
|
-
import { i as isEditableTarget } from "../../../chunks/keyboard-DE2yhz_b.js";
|
|
5
4
|
import { useFloating } from "../../../composables/useFloating.js";
|
|
6
5
|
import { useOverlayLayer } from "../../../composables/useOverlayLayer.js";
|
|
7
6
|
import { t as useControlledOpen } from "../../../chunks/useControlledOpen-DV3SqLTP.js";
|
|
8
|
-
import { t as
|
|
7
|
+
import { t as useMenuItemsFocus } from "../../../chunks/useMenuItemsFocus-OyOnIAlr.js";
|
|
9
8
|
import { n as grDropdownContentClass, r as grDropdownOriginClass } from "../../../chunks/grDropdownStyles-V7TRiCXn.js";
|
|
10
9
|
import { Teleport, Transition, computed, createBlock, createElementBlock, createElementVNode, createVNode, defineComponent, mergeProps, nextTick, normalizeClass, onBeforeUnmount, onMounted, openBlock, ref, renderSlot, unref, useId, vShow, watch, withCtx, withDirectives } from "vue";
|
|
11
10
|
//#region src/components/GrDropdown/GrDropdown.vue?vue&type=script&setup=true&lang.ts
|
|
12
11
|
var _hoisted_1 = { "data-gr-dropdown": "" };
|
|
13
12
|
var _hoisted_2 = ["id"];
|
|
14
|
-
var TYPEAHEAD_RESET_MS = 600;
|
|
15
13
|
//#endregion
|
|
16
14
|
//#region src/components/GrDropdown/GrDropdown.vue
|
|
17
15
|
var GrDropdown_default = /* @__PURE__ */ defineComponent({
|
|
@@ -47,25 +45,15 @@ var GrDropdown_default = /* @__PURE__ */ defineComponent({
|
|
|
47
45
|
const panelEl = ref(null);
|
|
48
46
|
const clickOutsideExclude = [() => panelEl.value];
|
|
49
47
|
const panelId = useId();
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
* (см. `GrDropdownMenuItem`), и список участников таб-порядка был бы пуст.
|
|
55
|
-
*/
|
|
56
|
-
function panelItems() {
|
|
57
|
-
return getFocusableElements(panelEl.value, { tabbableOnly: false });
|
|
58
|
-
}
|
|
59
|
-
function focusItemAt(index) {
|
|
60
|
-
const items = panelItems();
|
|
61
|
-
if (items.length === 0) return;
|
|
62
|
-
items[(index + items.length) % items.length]?.focus();
|
|
63
|
-
}
|
|
48
|
+
const menu = useMenuItemsFocus({
|
|
49
|
+
container: () => panelEl.value,
|
|
50
|
+
close: () => close()
|
|
51
|
+
});
|
|
64
52
|
async function openWithFocus(first) {
|
|
65
53
|
if (props.disabled) return;
|
|
66
54
|
setOpen(true);
|
|
67
55
|
await nextTick();
|
|
68
|
-
|
|
56
|
+
menu.focusAt(first ? 0 : -1);
|
|
69
57
|
}
|
|
70
58
|
/**
|
|
71
59
|
* Пропсы для реального фокусируемого триггера (кнопки). Консьюмер биндит их на
|
|
@@ -104,63 +92,6 @@ var GrDropdown_default = /* @__PURE__ */ defineComponent({
|
|
|
104
92
|
break;
|
|
105
93
|
}
|
|
106
94
|
}
|
|
107
|
-
/**
|
|
108
|
-
* Typeahead паттерна menu: печатные символы копятся в буфер и переводят фокус
|
|
109
|
-
* на первый подходящий пункт, начиная со следующего за текущим.
|
|
110
|
-
*/
|
|
111
|
-
let typeaheadBuffer = "";
|
|
112
|
-
let typeaheadTimer;
|
|
113
|
-
function onTypeahead(char) {
|
|
114
|
-
clearTimeout(typeaheadTimer);
|
|
115
|
-
typeaheadTimer = setTimeout(() => {
|
|
116
|
-
typeaheadBuffer = "";
|
|
117
|
-
}, TYPEAHEAD_RESET_MS);
|
|
118
|
-
typeaheadBuffer = typeaheadBuffer.length === 1 && typeaheadBuffer === char ? char : typeaheadBuffer + char;
|
|
119
|
-
const query = typeaheadBuffer.toLowerCase();
|
|
120
|
-
const items = panelItems();
|
|
121
|
-
if (items.length === 0) return;
|
|
122
|
-
const currentIndex = items.indexOf(document.activeElement);
|
|
123
|
-
for (let step = 1; step <= items.length; step += 1) {
|
|
124
|
-
const item = items[(currentIndex + step + items.length) % items.length];
|
|
125
|
-
if ((item.textContent ?? "").trim().toLowerCase().startsWith(query)) {
|
|
126
|
-
item.focus();
|
|
127
|
-
return;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
function onPanelKeydown(event) {
|
|
132
|
-
const currentIndex = panelItems().indexOf(document.activeElement);
|
|
133
|
-
const editable = isEditableTarget(event.target);
|
|
134
|
-
switch (event.key) {
|
|
135
|
-
case "ArrowDown":
|
|
136
|
-
event.preventDefault();
|
|
137
|
-
focusItemAt(currentIndex + 1);
|
|
138
|
-
return;
|
|
139
|
-
case "ArrowUp":
|
|
140
|
-
event.preventDefault();
|
|
141
|
-
focusItemAt(currentIndex - 1);
|
|
142
|
-
return;
|
|
143
|
-
case "Home":
|
|
144
|
-
if (editable) return;
|
|
145
|
-
event.preventDefault();
|
|
146
|
-
focusItemAt(0);
|
|
147
|
-
return;
|
|
148
|
-
case "End":
|
|
149
|
-
if (editable) return;
|
|
150
|
-
event.preventDefault();
|
|
151
|
-
focusItemAt(-1);
|
|
152
|
-
return;
|
|
153
|
-
case "Tab":
|
|
154
|
-
close();
|
|
155
|
-
return;
|
|
156
|
-
}
|
|
157
|
-
if (editable) return;
|
|
158
|
-
if (event.key === " " && typeaheadBuffer === "") return;
|
|
159
|
-
if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {
|
|
160
|
-
event.preventDefault();
|
|
161
|
-
onTypeahead(event.key);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
95
|
const { floatingStyle, resolvedPlacement, update: updateFloatingPosition } = useFloating(rootEl, panelEl, isOpen, {
|
|
165
96
|
placement: () => props.placement,
|
|
166
97
|
get offsetPx() {
|
|
@@ -211,7 +142,7 @@ var GrDropdown_default = /* @__PURE__ */ defineComponent({
|
|
|
211
142
|
if (typeof value === "number") return `${value}px`;
|
|
212
143
|
const bare = value.trim();
|
|
213
144
|
if (/^\d+$/.test(bare)) {
|
|
214
|
-
if (process.env.NODE_ENV !== "production") console.warn(`[GrDropdown] width="${value}" трактуется как ${bare}px. Шкалы tailwind-токенов (w-48) у пропа больше нет — укажите единицы: width="${bare}px" или :width="${bare}".`);
|
|
145
|
+
if (typeof process !== "undefined" && process.env.NODE_ENV !== "production") console.warn(`[GrDropdown] width="${value}" трактуется как ${bare}px. Шкалы tailwind-токенов (w-48) у пропа больше нет — укажите единицы: width="${bare}px" или :width="${bare}".`);
|
|
215
146
|
return `${bare}px`;
|
|
216
147
|
}
|
|
217
148
|
return value;
|
|
@@ -229,12 +160,12 @@ var GrDropdown_default = /* @__PURE__ */ defineComponent({
|
|
|
229
160
|
if (props.closeOnContentClick) close();
|
|
230
161
|
}
|
|
231
162
|
onMounted(() => {
|
|
232
|
-
if (process.env.NODE_ENV
|
|
163
|
+
if (!(typeof process !== "undefined" && process.env.NODE_ENV !== "production")) return;
|
|
233
164
|
if (rootEl.value?.querySelector("[aria-haspopup]")) return;
|
|
234
165
|
console.warn("[GrDropdown] триггер не привязан: добавьте `v-bind=\"triggerProps\"` на элемент внутри слота #trigger — <template #trigger=\"{ triggerProps }\"><GrButton v-bind=\"triggerProps\">…</GrButton></template>. Без этого у триггера нет ни клика, ни клавиатуры, ни aria-haspopup/aria-expanded.");
|
|
235
166
|
});
|
|
236
167
|
onBeforeUnmount(() => {
|
|
237
|
-
|
|
168
|
+
menu.reset();
|
|
238
169
|
clearTimeout(hoverTimer);
|
|
239
170
|
});
|
|
240
171
|
const { target: portalTarget, enabled: teleportEnabled } = usePortalTarget(() => props.teleportTo);
|
|
@@ -284,7 +215,7 @@ var GrDropdown_default = /* @__PURE__ */ defineComponent({
|
|
|
284
215
|
class: panelClasses.value,
|
|
285
216
|
style: panelStyle.value,
|
|
286
217
|
onClick: onContentClick,
|
|
287
|
-
onKeydown:
|
|
218
|
+
onKeydown: _cache[0] || (_cache[0] = (...args) => unref(menu).onKeydown && unref(menu).onKeydown(...args)),
|
|
288
219
|
onMouseenter: onHoverEnter,
|
|
289
220
|
onMouseleave: onHoverLeave
|
|
290
221
|
}), [createElementVNode("div", {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GrDropdown-BfTmdPyh.js","names":[],"sources":["../../../../src/components/GrDropdown/GrDropdown.vue","../../../../src/components/GrDropdown/GrDropdown.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, useId, watch } from 'vue'\n\nimport { usePortalTarget } from '../../composables/usePortalTarget'\n\nimport { vClickOutside } from '../../directives'\nimport { useFloating, type UseFloatingPlacement } from '../../composables/useFloating'\nimport { useOverlayLayer } from '../../composables/useOverlayLayer'\nimport { useControlledOpen } from '../../composables/internal/useControlledOpen'\nimport { useMenuItemsFocus } from '../../composables/internal/useMenuItemsFocus'\nimport {\n grDropdownContentClass,\n grDropdownOriginClass,\n type GrDropdownWidth,\n} from './grDropdownStyles'\n\nexport type GrDropdownTrigger = 'click' | 'hover'\n\nexport interface GrDropdownProps {\n /** Размещение панели относительно триггера; `flip` при нехватке места остаётся. */\n placement?: UseFloatingPlacement\n /** Зазор между триггером и панелью, px. */\n offset?: number\n /** Ширина панели: число — пиксели, строка — CSS-длина, `auto` — по контенту. */\n width?: GrDropdownWidth\n /** Чем открывается панель. В любом режиме работают клик и клавиатура. */\n trigger?: GrDropdownTrigger\n /** Задержка открытия по наведению, мс. */\n openDelay?: number\n /** Задержка закрытия после ухода курсора, мс. */\n closeDelay?: number\n /** Панель не открывается ничем; триггер остаётся фокусируемым. */\n disabled?: boolean\n /** Закрывать панель по клику внутри content. */\n closeOnContentClick?: boolean\n /** Дополнительные классы контейнера content. */\n contentClass?: string\n /**\n * Точечное переопределение точки монтирования. По умолчанию — общий портал\n * оверлеев (`#gr-portal` либо `portalTarget` из `GrConfigProvider`).\n */\n teleportTo?: string | HTMLElement\n /**\n * Контролируемое состояние панели (`v-model:open`). Без пропа панель ведёт\n * себя сама (uncontrolled), с ним — слушайте `update:open` и меняйте проп.\n */\n open?: boolean\n}\n\nexport interface GrDropdownEmits {\n /** Панель открылась/закрылась (`v-model:open`). */\n (e: 'update:open', value: boolean): void\n}\n\nimport { useGrThemeAttrs } from '../GrConfigProvider/context'\n\nconst props = withDefaults(defineProps<GrDropdownProps>(), {\n placement: 'bottom-end',\n offset: 8,\n width: '12rem',\n trigger: 'click',\n openDelay: 120,\n closeDelay: 160,\n disabled: false,\n closeOnContentClick: true,\n contentClass: '',\n teleportTo: undefined,\n open: undefined,\n})\n\nconst emit = defineEmits<GrDropdownEmits>()\n\n// Имя `isOpen` сохранено: читатели работают с computed-Ref.\nconst { open: isOpen, setOpen } = useControlledOpen(\n () => props.open,\n next => emit('update:open', next),\n)\n\nconst rootEl = ref<HTMLElement | null>(null)\nconst panelEl = ref<HTMLElement | null>(null)\nconst clickOutsideExclude = [() => panelEl.value]\n\nconst panelId = useId()\n\n// Кольцо фокуса и поиск по буквам — общие с `GrContextMenu`: паттерн `menu`\n// один, и вторая его реализация разошлась бы с первой незаметно для тестов.\nconst menu = useMenuItemsFocus({\n container: () => panelEl.value,\n close: () => close(),\n})\n\nasync function openWithFocus(first: boolean): Promise<void> {\n if (props.disabled)\n return\n\n setOpen(true)\n await nextTick()\n menu.focusAt(first ? 0 : -1)\n}\n\n/**\n * Пропсы для реального фокусируемого триггера (кнопки). Консьюмер биндит их на\n * элемент внутри слота `#trigger`: `<GrButton v-bind=\"triggerProps\">`. Даёт\n * `aria-haspopup`/`aria-expanded`/`aria-controls`, клавиатуру и **клик**.\n *\n * Клик живёт здесь, а не на обёртке слота: обёртка ловила бы и клики по\n * вложенным кнопкам и ссылкам, переключая панель мимо намерения пользователя.\n */\nconst triggerProps = computed(() => ({\n 'aria-haspopup': 'menu' as const,\n 'aria-expanded': isOpen.value,\n 'aria-controls': isOpen.value ? panelId : undefined,\n 'aria-disabled': props.disabled ? true : undefined,\n 'onClick': toggle,\n 'onKeydown': onTriggerKeydown,\n}))\n\nfunction onTriggerKeydown(event: KeyboardEvent): void {\n if (props.disabled)\n return\n\n switch (event.key) {\n case 'Enter':\n case ' ':\n case 'ArrowDown':\n event.preventDefault()\n void openWithFocus(true)\n break\n case 'ArrowUp':\n event.preventDefault()\n void openWithFocus(false)\n break\n case 'Escape':\n if (isOpen.value) {\n event.preventDefault()\n close()\n }\n break\n }\n}\n\nconst { floatingStyle, resolvedPlacement, update: updateFloatingPosition } = useFloating(\n rootEl,\n panelEl,\n isOpen,\n {\n placement: () => props.placement,\n // Геттер, а не значение: иначе проп замрёт на моменте `setup`.\n get offsetPx() { return props.offset },\n zIndexVar: '--gr-z-dropdown',\n },\n)\n\n// ————— Открытие по наведению. Задержки нужны обе: без `openDelay` панель\n// выпрыгивает на любое пересечение курсором, без `closeDelay` её не удержать\n// при переходе с триггера на панель — между ними зазор `offset`.\nlet hoverTimer: ReturnType<typeof setTimeout> | undefined\n\nfunction open(): void {\n if (props.disabled)\n return\n\n clearTimeout(hoverTimer)\n setOpen(true)\n}\n\nfunction toggle(): void {\n if (props.disabled)\n return\n\n clearTimeout(hoverTimer)\n setOpen(!isOpen.value)\n}\n\nfunction close(): void {\n clearTimeout(hoverTimer)\n setOpen(false)\n}\n\nfunction scheduleHover(next: boolean, delayMs: number): void {\n clearTimeout(hoverTimer)\n\n if (delayMs <= 0) {\n setOpen(next)\n return\n }\n\n hoverTimer = setTimeout(setOpen, delayMs, next)\n}\n\nfunction onHoverEnter(): void {\n if (props.disabled || props.trigger !== 'hover')\n return\n scheduleHover(true, props.openDelay)\n}\n\nfunction onHoverLeave(): void {\n if (props.trigger !== 'hover')\n return\n scheduleHover(false, props.closeDelay)\n}\n\n// Возврат фокуса — из контракта слоя: он запоминает активный элемент при\n// открытии и возвращает фокус, только если на момент закрытия тот всё ещё\n// внутри панели. Прежняя эвристика «возвращать, если открыли с клавиатуры»\n// промахивалась в обе стороны.\nuseOverlayLayer(isOpen, close, { root: panelEl })\n\nwatch(\n () => [props.placement, props.offset],\n () => {\n if (isOpen.value) updateFloatingPosition()\n },\n)\n\nwatch(\n () => props.disabled,\n (value) => {\n if (value) close()\n },\n)\n\nfunction toCssLength(value: GrDropdownWidth): string | undefined {\n if (value === 'auto')\n return undefined\n if (typeof value === 'number')\n return `${value}px`\n\n // Строка без единиц браузер просто отбросит, поэтому трактуем её как пиксели\n // — и предупреждаем: `width=\"48\"` легко прочесть как токен шкалы `w-48`.\n const bare = value.trim()\n if (/^\\d+$/.test(bare)) {\n if (__GR_DEV__) {\n console.warn(\n `[GrDropdown] width=\"${value}\" трактуется как ${bare}px. `\n + 'Шкалы tailwind-токенов (w-48) у пропа больше нет — укажите единицы: '\n + `width=\"${bare}px\" или :width=\"${bare}\".`,\n )\n }\n return `${bare}px`\n }\n\n return value\n}\n\nconst panelStyle = computed(() => {\n const width = toCssLength(props.width)\n return width ? { ...floatingStyle.value, width } : floatingStyle.value\n})\n\nconst contentClasses = computed(() => grDropdownContentClass(props.contentClass))\n\nconst panelClasses = computed(() => grDropdownOriginClass(resolvedPlacement.value))\n\nfunction onContentClick(): void {\n if (props.closeOnContentClick) {\n close()\n }\n}\n\n// Триггер без `v-bind=\"triggerProps\"` — это триггер без клика, без клавиатуры и\n// без ARIA. Молчать об этом нельзя: панель просто не открывалась бы, и искать\n// причину пришлось бы в чужом коде.\nonMounted(() => {\n if (!__GR_DEV__)\n return\n if (rootEl.value?.querySelector('[aria-haspopup]'))\n return\n\n console.warn(\n '[GrDropdown] триггер не привязан: добавьте `v-bind=\"triggerProps\"` на элемент '\n + 'внутри слота #trigger — <template #trigger=\"{ triggerProps }\">'\n + '<GrButton v-bind=\"triggerProps\">…</GrButton></template>. '\n + 'Без этого у триггера нет ни клика, ни клавиатуры, ни aria-haspopup/aria-expanded.',\n )\n})\n\nonBeforeUnmount(() => {\n menu.reset()\n clearTimeout(hoverTimer)\n})\n\n// Телепорт включается только ПОСЛЕ монтирования: иначе первый клиентский\n// рендер не совпадает с серверным и ломается гидрация (см. композабл).\nconst { target: portalTarget, enabled: teleportEnabled } = usePortalTarget(() => props.teleportTo)\n\n// Тема поддерева на телепортированную панель: в DOM она уезжает в `body`, то\n// есть вне обёртки провайдера, и `data-theme` с неё не наследуется. В дереве\n// компонентов панель остаётся внутри — `inject` доходит, и тему она ставит себе\n// сама.\nconst themeAttrs = useGrThemeAttrs()\n\ndefineExpose({ open, close, toggle })\n</script>\n\n<template>\n <div data-gr-dropdown>\n <div\n ref=\"rootEl\"\n v-click-outside=\"{ handler: close, enabled: isOpen, exclude: clickOutsideExclude }\"\n data-gr-dropdown-trigger\n class=\"inline-block max-w-full\"\n @mouseenter=\"onHoverEnter\"\n @mouseleave=\"onHoverLeave\"\n >\n <slot name=\"trigger\" :open=\"isOpen\" :toggle=\"toggle\" :close=\"close\" :trigger-props=\"triggerProps\" />\n </div>\n\n <teleport :to=\"portalTarget\" :disabled=\"!teleportEnabled\">\n <transition\n enter-active-class=\"transition ease-[var(--gr-ease-out)] duration-[var(--gr-duration-fast)]\"\n enter-from-class=\"transform opacity-0 scale-95\"\n enter-to-class=\"transform opacity-100 scale-100\"\n leave-active-class=\"transition ease-[var(--gr-ease-in)] duration-[var(--gr-duration-fast)]\"\n leave-from-class=\"transform opacity-100 scale-100\"\n leave-to-class=\"transform opacity-0 scale-95\"\n >\n <div\n v-show=\"isOpen\"\n :id=\"panelId\"\n ref=\"panelEl\"\n v-bind=\"themeAttrs\"\n data-gr-dropdown-panel\n data-gr-overlay-root\n role=\"menu\"\n tabindex=\"-1\"\n :class=\"panelClasses\"\n :style=\"panelStyle\"\n @click=\"onContentClick\"\n @keydown=\"menu.onKeydown\"\n @mouseenter=\"onHoverEnter\"\n @mouseleave=\"onHoverLeave\"\n >\n <div data-gr-dropdown-content :class=\"contentClasses\">\n <slot name=\"content\" :close=\"close\" />\n </div>\n </div>\n </transition>\n </teleport>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, useId, watch } from 'vue'\n\nimport { usePortalTarget } from '../../composables/usePortalTarget'\n\nimport { vClickOutside } from '../../directives'\nimport { useFloating, type UseFloatingPlacement } from '../../composables/useFloating'\nimport { useOverlayLayer } from '../../composables/useOverlayLayer'\nimport { useControlledOpen } from '../../composables/internal/useControlledOpen'\nimport { useMenuItemsFocus } from '../../composables/internal/useMenuItemsFocus'\nimport {\n grDropdownContentClass,\n grDropdownOriginClass,\n type GrDropdownWidth,\n} from './grDropdownStyles'\n\nexport type GrDropdownTrigger = 'click' | 'hover'\n\nexport interface GrDropdownProps {\n /** Размещение панели относительно триггера; `flip` при нехватке места остаётся. */\n placement?: UseFloatingPlacement\n /** Зазор между триггером и панелью, px. */\n offset?: number\n /** Ширина панели: число — пиксели, строка — CSS-длина, `auto` — по контенту. */\n width?: GrDropdownWidth\n /** Чем открывается панель. В любом режиме работают клик и клавиатура. */\n trigger?: GrDropdownTrigger\n /** Задержка открытия по наведению, мс. */\n openDelay?: number\n /** Задержка закрытия после ухода курсора, мс. */\n closeDelay?: number\n /** Панель не открывается ничем; триггер остаётся фокусируемым. */\n disabled?: boolean\n /** Закрывать панель по клику внутри content. */\n closeOnContentClick?: boolean\n /** Дополнительные классы контейнера content. */\n contentClass?: string\n /**\n * Точечное переопределение точки монтирования. По умолчанию — общий портал\n * оверлеев (`#gr-portal` либо `portalTarget` из `GrConfigProvider`).\n */\n teleportTo?: string | HTMLElement\n /**\n * Контролируемое состояние панели (`v-model:open`). Без пропа панель ведёт\n * себя сама (uncontrolled), с ним — слушайте `update:open` и меняйте проп.\n */\n open?: boolean\n}\n\nexport interface GrDropdownEmits {\n /** Панель открылась/закрылась (`v-model:open`). */\n (e: 'update:open', value: boolean): void\n}\n\nimport { useGrThemeAttrs } from '../GrConfigProvider/context'\n\nconst props = withDefaults(defineProps<GrDropdownProps>(), {\n placement: 'bottom-end',\n offset: 8,\n width: '12rem',\n trigger: 'click',\n openDelay: 120,\n closeDelay: 160,\n disabled: false,\n closeOnContentClick: true,\n contentClass: '',\n teleportTo: undefined,\n open: undefined,\n})\n\nconst emit = defineEmits<GrDropdownEmits>()\n\n// Имя `isOpen` сохранено: читатели работают с computed-Ref.\nconst { open: isOpen, setOpen } = useControlledOpen(\n () => props.open,\n next => emit('update:open', next),\n)\n\nconst rootEl = ref<HTMLElement | null>(null)\nconst panelEl = ref<HTMLElement | null>(null)\nconst clickOutsideExclude = [() => panelEl.value]\n\nconst panelId = useId()\n\n// Кольцо фокуса и поиск по буквам — общие с `GrContextMenu`: паттерн `menu`\n// один, и вторая его реализация разошлась бы с первой незаметно для тестов.\nconst menu = useMenuItemsFocus({\n container: () => panelEl.value,\n close: () => close(),\n})\n\nasync function openWithFocus(first: boolean): Promise<void> {\n if (props.disabled)\n return\n\n setOpen(true)\n await nextTick()\n menu.focusAt(first ? 0 : -1)\n}\n\n/**\n * Пропсы для реального фокусируемого триггера (кнопки). Консьюмер биндит их на\n * элемент внутри слота `#trigger`: `<GrButton v-bind=\"triggerProps\">`. Даёт\n * `aria-haspopup`/`aria-expanded`/`aria-controls`, клавиатуру и **клик**.\n *\n * Клик живёт здесь, а не на обёртке слота: обёртка ловила бы и клики по\n * вложенным кнопкам и ссылкам, переключая панель мимо намерения пользователя.\n */\nconst triggerProps = computed(() => ({\n 'aria-haspopup': 'menu' as const,\n 'aria-expanded': isOpen.value,\n 'aria-controls': isOpen.value ? panelId : undefined,\n 'aria-disabled': props.disabled ? true : undefined,\n 'onClick': toggle,\n 'onKeydown': onTriggerKeydown,\n}))\n\nfunction onTriggerKeydown(event: KeyboardEvent): void {\n if (props.disabled)\n return\n\n switch (event.key) {\n case 'Enter':\n case ' ':\n case 'ArrowDown':\n event.preventDefault()\n void openWithFocus(true)\n break\n case 'ArrowUp':\n event.preventDefault()\n void openWithFocus(false)\n break\n case 'Escape':\n if (isOpen.value) {\n event.preventDefault()\n close()\n }\n break\n }\n}\n\nconst { floatingStyle, resolvedPlacement, update: updateFloatingPosition } = useFloating(\n rootEl,\n panelEl,\n isOpen,\n {\n placement: () => props.placement,\n // Геттер, а не значение: иначе проп замрёт на моменте `setup`.\n get offsetPx() { return props.offset },\n zIndexVar: '--gr-z-dropdown',\n },\n)\n\n// ————— Открытие по наведению. Задержки нужны обе: без `openDelay` панель\n// выпрыгивает на любое пересечение курсором, без `closeDelay` её не удержать\n// при переходе с триггера на панель — между ними зазор `offset`.\nlet hoverTimer: ReturnType<typeof setTimeout> | undefined\n\nfunction open(): void {\n if (props.disabled)\n return\n\n clearTimeout(hoverTimer)\n setOpen(true)\n}\n\nfunction toggle(): void {\n if (props.disabled)\n return\n\n clearTimeout(hoverTimer)\n setOpen(!isOpen.value)\n}\n\nfunction close(): void {\n clearTimeout(hoverTimer)\n setOpen(false)\n}\n\nfunction scheduleHover(next: boolean, delayMs: number): void {\n clearTimeout(hoverTimer)\n\n if (delayMs <= 0) {\n setOpen(next)\n return\n }\n\n hoverTimer = setTimeout(setOpen, delayMs, next)\n}\n\nfunction onHoverEnter(): void {\n if (props.disabled || props.trigger !== 'hover')\n return\n scheduleHover(true, props.openDelay)\n}\n\nfunction onHoverLeave(): void {\n if (props.trigger !== 'hover')\n return\n scheduleHover(false, props.closeDelay)\n}\n\n// Возврат фокуса — из контракта слоя: он запоминает активный элемент при\n// открытии и возвращает фокус, только если на момент закрытия тот всё ещё\n// внутри панели. Прежняя эвристика «возвращать, если открыли с клавиатуры»\n// промахивалась в обе стороны.\nuseOverlayLayer(isOpen, close, { root: panelEl })\n\nwatch(\n () => [props.placement, props.offset],\n () => {\n if (isOpen.value) updateFloatingPosition()\n },\n)\n\nwatch(\n () => props.disabled,\n (value) => {\n if (value) close()\n },\n)\n\nfunction toCssLength(value: GrDropdownWidth): string | undefined {\n if (value === 'auto')\n return undefined\n if (typeof value === 'number')\n return `${value}px`\n\n // Строка без единиц браузер просто отбросит, поэтому трактуем её как пиксели\n // — и предупреждаем: `width=\"48\"` легко прочесть как токен шкалы `w-48`.\n const bare = value.trim()\n if (/^\\d+$/.test(bare)) {\n if (__GR_DEV__) {\n console.warn(\n `[GrDropdown] width=\"${value}\" трактуется как ${bare}px. `\n + 'Шкалы tailwind-токенов (w-48) у пропа больше нет — укажите единицы: '\n + `width=\"${bare}px\" или :width=\"${bare}\".`,\n )\n }\n return `${bare}px`\n }\n\n return value\n}\n\nconst panelStyle = computed(() => {\n const width = toCssLength(props.width)\n return width ? { ...floatingStyle.value, width } : floatingStyle.value\n})\n\nconst contentClasses = computed(() => grDropdownContentClass(props.contentClass))\n\nconst panelClasses = computed(() => grDropdownOriginClass(resolvedPlacement.value))\n\nfunction onContentClick(): void {\n if (props.closeOnContentClick) {\n close()\n }\n}\n\n// Триггер без `v-bind=\"triggerProps\"` — это триггер без клика, без клавиатуры и\n// без ARIA. Молчать об этом нельзя: панель просто не открывалась бы, и искать\n// причину пришлось бы в чужом коде.\nonMounted(() => {\n if (!__GR_DEV__)\n return\n if (rootEl.value?.querySelector('[aria-haspopup]'))\n return\n\n console.warn(\n '[GrDropdown] триггер не привязан: добавьте `v-bind=\"triggerProps\"` на элемент '\n + 'внутри слота #trigger — <template #trigger=\"{ triggerProps }\">'\n + '<GrButton v-bind=\"triggerProps\">…</GrButton></template>. '\n + 'Без этого у триггера нет ни клика, ни клавиатуры, ни aria-haspopup/aria-expanded.',\n )\n})\n\nonBeforeUnmount(() => {\n menu.reset()\n clearTimeout(hoverTimer)\n})\n\n// Телепорт включается только ПОСЛЕ монтирования: иначе первый клиентский\n// рендер не совпадает с серверным и ломается гидрация (см. композабл).\nconst { target: portalTarget, enabled: teleportEnabled } = usePortalTarget(() => props.teleportTo)\n\n// Тема поддерева на телепортированную панель: в DOM она уезжает в `body`, то\n// есть вне обёртки провайдера, и `data-theme` с неё не наследуется. В дереве\n// компонентов панель остаётся внутри — `inject` доходит, и тему она ставит себе\n// сама.\nconst themeAttrs = useGrThemeAttrs()\n\ndefineExpose({ open, close, toggle })\n</script>\n\n<template>\n <div data-gr-dropdown>\n <div\n ref=\"rootEl\"\n v-click-outside=\"{ handler: close, enabled: isOpen, exclude: clickOutsideExclude }\"\n data-gr-dropdown-trigger\n class=\"inline-block max-w-full\"\n @mouseenter=\"onHoverEnter\"\n @mouseleave=\"onHoverLeave\"\n >\n <slot name=\"trigger\" :open=\"isOpen\" :toggle=\"toggle\" :close=\"close\" :trigger-props=\"triggerProps\" />\n </div>\n\n <teleport :to=\"portalTarget\" :disabled=\"!teleportEnabled\">\n <transition\n enter-active-class=\"transition ease-[var(--gr-ease-out)] duration-[var(--gr-duration-fast)]\"\n enter-from-class=\"transform opacity-0 scale-95\"\n enter-to-class=\"transform opacity-100 scale-100\"\n leave-active-class=\"transition ease-[var(--gr-ease-in)] duration-[var(--gr-duration-fast)]\"\n leave-from-class=\"transform opacity-100 scale-100\"\n leave-to-class=\"transform opacity-0 scale-95\"\n >\n <div\n v-show=\"isOpen\"\n :id=\"panelId\"\n ref=\"panelEl\"\n v-bind=\"themeAttrs\"\n data-gr-dropdown-panel\n data-gr-overlay-root\n role=\"menu\"\n tabindex=\"-1\"\n :class=\"panelClasses\"\n :style=\"panelStyle\"\n @click=\"onContentClick\"\n @keydown=\"menu.onKeydown\"\n @mouseenter=\"onHoverEnter\"\n @mouseleave=\"onHoverLeave\"\n >\n <div data-gr-dropdown-content :class=\"contentClasses\">\n <slot name=\"content\" :close=\"close\" />\n </div>\n </div>\n </transition>\n </teleport>\n </div>\n</template>\n"],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { t as GrDropdown_default } from "./chunks/GrDropdown-
|
|
2
|
-
import { n as grDropdownSafelist, t as grDropdownConfig } from "../../chunks/config-
|
|
1
|
+
import { t as GrDropdown_default } from "./chunks/GrDropdown-BfTmdPyh.js";
|
|
2
|
+
import { n as grDropdownSafelist, t as grDropdownConfig } from "../../chunks/config-BViooYNv.js";
|
|
3
3
|
export { GrDropdown_default as GrDropdown, GrDropdown_default as default, grDropdownConfig, grDropdownSafelist };
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { a as columnBaseClass, i as colsClass, o as columnsBaseClass, t as alignClass } from "../../../chunks/grDropdownMenuStyles-D1LOkdVj.js";
|
|
2
|
+
import { n as GrDropdownMenuEntries_default, t as GrDropdownMenuList_default } from "./GrDropdownMenuList-BGA_xNVo.js";
|
|
3
|
+
import { t as GrDropdown_default } from "../../GrDropdown/chunks/GrDropdown-BfTmdPyh.js";
|
|
4
|
+
import { createBlock, createElementBlock, createVNode, defineComponent, guardReactiveProps, normalizeClass, normalizeProps, openBlock, renderSlot, unref, withCtx } from "vue";
|
|
5
|
+
//#endregion
|
|
6
|
+
//#region src/components/GrDropdownMenu/GrDropdownMenu.vue
|
|
7
|
+
var GrDropdownMenu_default = /* @__PURE__ */ defineComponent({
|
|
8
|
+
__name: "GrDropdownMenu",
|
|
9
|
+
props: {
|
|
10
|
+
placement: { default: "bottom-end" },
|
|
11
|
+
offset: { default: 8 },
|
|
12
|
+
width: { default: "12rem" },
|
|
13
|
+
trigger: { default: "click" },
|
|
14
|
+
openDelay: { default: 120 },
|
|
15
|
+
closeDelay: { default: 160 },
|
|
16
|
+
disabled: {
|
|
17
|
+
type: Boolean,
|
|
18
|
+
default: false
|
|
19
|
+
},
|
|
20
|
+
teleportTo: { default: void 0 },
|
|
21
|
+
closeOnContentClick: {
|
|
22
|
+
type: Boolean,
|
|
23
|
+
default: true
|
|
24
|
+
},
|
|
25
|
+
contentClass: { default: "" },
|
|
26
|
+
items: { default: void 0 },
|
|
27
|
+
dividers: {
|
|
28
|
+
type: Boolean,
|
|
29
|
+
default: false
|
|
30
|
+
},
|
|
31
|
+
borderTop: {
|
|
32
|
+
type: Boolean,
|
|
33
|
+
default: false
|
|
34
|
+
},
|
|
35
|
+
borderBottom: {
|
|
36
|
+
type: Boolean,
|
|
37
|
+
default: false
|
|
38
|
+
},
|
|
39
|
+
listClass: { default: "" },
|
|
40
|
+
open: {
|
|
41
|
+
type: Boolean,
|
|
42
|
+
default: void 0
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
emits: ["select", "update:open"],
|
|
46
|
+
setup(__props, { emit: __emit }) {
|
|
47
|
+
const emit = __emit;
|
|
48
|
+
return (_ctx, _cache) => {
|
|
49
|
+
return openBlock(), createBlock(GrDropdown_default, {
|
|
50
|
+
"data-gr-dropdown-menu": "",
|
|
51
|
+
placement: __props.placement,
|
|
52
|
+
offset: __props.offset,
|
|
53
|
+
width: __props.width,
|
|
54
|
+
trigger: __props.trigger,
|
|
55
|
+
"open-delay": __props.openDelay,
|
|
56
|
+
"close-delay": __props.closeDelay,
|
|
57
|
+
disabled: __props.disabled,
|
|
58
|
+
"teleport-to": __props.teleportTo,
|
|
59
|
+
"close-on-content-click": __props.closeOnContentClick,
|
|
60
|
+
"content-class": __props.contentClass,
|
|
61
|
+
open: __props.open,
|
|
62
|
+
"onUpdate:open": _cache[1] || (_cache[1] = ($event) => emit("update:open", $event))
|
|
63
|
+
}, {
|
|
64
|
+
trigger: withCtx((slotProps) => [renderSlot(_ctx.$slots, "trigger", normalizeProps(guardReactiveProps(slotProps)))]),
|
|
65
|
+
content: withCtx((slotProps) => [createVNode(GrDropdownMenuList_default, {
|
|
66
|
+
dividers: __props.dividers,
|
|
67
|
+
"border-top": __props.borderTop,
|
|
68
|
+
"border-bottom": __props.borderBottom,
|
|
69
|
+
class: normalizeClass(__props.listClass)
|
|
70
|
+
}, {
|
|
71
|
+
default: withCtx(() => [renderSlot(_ctx.$slots, "default", normalizeProps(guardReactiveProps(slotProps)), () => [createVNode(GrDropdownMenuEntries_default, {
|
|
72
|
+
items: __props.items,
|
|
73
|
+
onSelect: _cache[0] || (_cache[0] = ($event) => emit("select", $event))
|
|
74
|
+
}, null, 8, ["items"])])]),
|
|
75
|
+
_: 2
|
|
76
|
+
}, 1032, [
|
|
77
|
+
"dividers",
|
|
78
|
+
"border-top",
|
|
79
|
+
"border-bottom",
|
|
80
|
+
"class"
|
|
81
|
+
])]),
|
|
82
|
+
_: 3
|
|
83
|
+
}, 8, [
|
|
84
|
+
"placement",
|
|
85
|
+
"offset",
|
|
86
|
+
"width",
|
|
87
|
+
"trigger",
|
|
88
|
+
"open-delay",
|
|
89
|
+
"close-delay",
|
|
90
|
+
"disabled",
|
|
91
|
+
"teleport-to",
|
|
92
|
+
"close-on-content-click",
|
|
93
|
+
"content-class",
|
|
94
|
+
"open"
|
|
95
|
+
]);
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
//#endregion
|
|
100
|
+
//#region src/components/GrDropdownMenu/GrDropdownMenuColumn.vue
|
|
101
|
+
var GrDropdownMenuColumn_default = /* @__PURE__ */ defineComponent({
|
|
102
|
+
__name: "GrDropdownMenuColumn",
|
|
103
|
+
props: { align: { default: "center" } },
|
|
104
|
+
setup(__props) {
|
|
105
|
+
return (_ctx, _cache) => {
|
|
106
|
+
return openBlock(), createElementBlock("div", {
|
|
107
|
+
"data-gr-dropdown-menu-column": "",
|
|
108
|
+
role: "none",
|
|
109
|
+
class: normalizeClass([unref(columnBaseClass), unref(alignClass)[__props.align]])
|
|
110
|
+
}, [renderSlot(_ctx.$slots, "default")], 2);
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
//#endregion
|
|
115
|
+
//#region src/components/GrDropdownMenu/GrDropdownMenuColumns.vue
|
|
116
|
+
var GrDropdownMenuColumns_default = /* @__PURE__ */ defineComponent({
|
|
117
|
+
__name: "GrDropdownMenuColumns",
|
|
118
|
+
props: { cols: { default: 2 } },
|
|
119
|
+
setup(__props) {
|
|
120
|
+
return (_ctx, _cache) => {
|
|
121
|
+
return openBlock(), createElementBlock("div", {
|
|
122
|
+
"data-gr-dropdown-menu-columns": "",
|
|
123
|
+
role: "none",
|
|
124
|
+
class: normalizeClass([unref(columnsBaseClass), unref(colsClass)[__props.cols]])
|
|
125
|
+
}, [renderSlot(_ctx.$slots, "default")], 2);
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
//#endregion
|
|
130
|
+
export { GrDropdownMenuColumn_default as n, GrDropdownMenu_default as r, GrDropdownMenuColumns_default as t };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GrDropdownMenu-l5HEqzjr.js","names":[],"sources":["../../../../src/components/GrDropdownMenu/GrDropdownMenu.vue","../../../../src/components/GrDropdownMenu/GrDropdownMenu.vue","../../../../src/components/GrDropdownMenu/GrDropdownMenuColumn.vue","../../../../src/components/GrDropdownMenu/GrDropdownMenuColumn.vue","../../../../src/components/GrDropdownMenu/GrDropdownMenuColumns.vue","../../../../src/components/GrDropdownMenu/GrDropdownMenuColumns.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport GrDropdown from '../GrDropdown/GrDropdown.vue'\n// Типы размещения и ширины — из владельца API, а не переобъявлением: расхождение\n// обнаружилось бы только рантаймом.\nimport type { GrDropdownTrigger } from '../GrDropdown/GrDropdown.vue'\nimport type { GrDropdownWidth } from '../GrDropdown/grDropdownStyles'\nimport type { UseFloatingPlacement } from '../../composables/useFloating'\n\nimport GrDropdownMenuEntries from './GrDropdownMenuEntries.vue'\nimport GrDropdownMenuList from './GrDropdownMenuList.vue'\nimport type { GrDropdownMenuAction, GrDropdownMenuEntry } from './menuModel'\n\nexport interface GrDropdownMenuProps {\n /** Размещение панели относительно триггера; переворот при нехватке места остаётся. */\n placement?: UseFloatingPlacement\n /** Зазор между триггером и панелью, px. */\n offset?: number\n /** Ширина панели: число — пиксели, строка — CSS-длина, `auto` — по контенту. */\n width?: GrDropdownWidth\n /** Чем открывается панель. В любом режиме работают клик и клавиатура. */\n trigger?: GrDropdownTrigger\n /** Задержка открытия по наведению, мс. */\n openDelay?: number\n /** Задержка закрытия после ухода курсора, мс. */\n closeDelay?: number\n /** Меню не открывается ничем; триггер остаётся фокусируемым. */\n disabled?: boolean\n /** Куда телепортировать панель (`body` по умолчанию). */\n /** Точечное переопределение точки монтирования; по умолчанию — общий портал. */\n teleportTo?: string | HTMLElement\n /** Закрывать по клику внутри content. */\n closeOnContentClick?: boolean\n /** Дополнительные классы content-контейнера. */\n contentClass?: string\n /**\n * Декларативное меню: пункты, группы и разделители массивом. Слот по\n * умолчанию сильнее — он для меню, которое из модели не собирается.\n */\n items?: GrDropdownMenuEntry[]\n\n // list wrapper\n /** Разделители между пунктами. */\n dividers?: boolean\n /** Верхний бордер контейнера списка. */\n borderTop?: boolean\n /** Нижний бордер контейнера списка. */\n borderBottom?: boolean\n /** Дополнительные классы для wrapper'а списка. */\n listClass?: string\n /**\n * Контролируемое состояние панели (`v-model:open`) — прокидывается в\n * `GrDropdown`. Без пропа меню ведёт себя само (uncontrolled).\n */\n open?: boolean\n}\n\nexport interface GrDropdownMenuEmits {\n /** Выбран пункт декларативного меню. */\n (e: 'select', item: GrDropdownMenuAction): void\n /** Панель открылась/закрылась (`v-model:open`). */\n (e: 'update:open', value: boolean): void\n}\n\nwithDefaults(defineProps<GrDropdownMenuProps>(), {\n placement: 'bottom-end',\n offset: 8,\n width: '12rem',\n trigger: 'click',\n openDelay: 120,\n closeDelay: 160,\n disabled: false,\n teleportTo: undefined,\n closeOnContentClick: true,\n // Поле панели принадлежит панели. Гасить его отсюда своим `p-0` нельзя: оба\n // класса попадают в один атрибут с равной специфичностью, и победителя\n // выбирает порядок правил в сгенерированном CSS, а не разметка. Пункт вписан\n // в это поле собственным радиусом — см. `itemBaseClass`.\n contentClass: '',\n items: undefined,\n dividers: false,\n borderTop: false,\n borderBottom: false,\n listClass: '',\n open: undefined,\n})\n\nconst emit = defineEmits<GrDropdownMenuEmits>()\n\n</script>\n\n<template>\n <GrDropdown\n data-gr-dropdown-menu\n :placement=\"placement\"\n :offset=\"offset\"\n :width=\"width\"\n :trigger=\"trigger\"\n :open-delay=\"openDelay\"\n :close-delay=\"closeDelay\"\n :disabled=\"disabled\"\n :teleport-to=\"teleportTo\"\n :close-on-content-click=\"closeOnContentClick\"\n :content-class=\"contentClass\"\n :open=\"open\"\n @update:open=\"emit('update:open', $event)\"\n >\n <template #trigger=\"slotProps\">\n <slot name=\"trigger\" v-bind=\"slotProps\" />\n </template>\n\n <template #content=\"slotProps\">\n <GrDropdownMenuList\n :dividers=\"dividers\"\n :border-top=\"borderTop\"\n :border-bottom=\"borderBottom\"\n :class=\"listClass\"\n >\n <slot v-bind=\"slotProps\">\n <GrDropdownMenuEntries :items=\"items\" @select=\"emit('select', $event)\" />\n </slot>\n </GrDropdownMenuList>\n </template>\n </GrDropdown>\n</template>\n","<script setup lang=\"ts\">\nimport GrDropdown from '../GrDropdown/GrDropdown.vue'\n// Типы размещения и ширины — из владельца API, а не переобъявлением: расхождение\n// обнаружилось бы только рантаймом.\nimport type { GrDropdownTrigger } from '../GrDropdown/GrDropdown.vue'\nimport type { GrDropdownWidth } from '../GrDropdown/grDropdownStyles'\nimport type { UseFloatingPlacement } from '../../composables/useFloating'\n\nimport GrDropdownMenuEntries from './GrDropdownMenuEntries.vue'\nimport GrDropdownMenuList from './GrDropdownMenuList.vue'\nimport type { GrDropdownMenuAction, GrDropdownMenuEntry } from './menuModel'\n\nexport interface GrDropdownMenuProps {\n /** Размещение панели относительно триггера; переворот при нехватке места остаётся. */\n placement?: UseFloatingPlacement\n /** Зазор между триггером и панелью, px. */\n offset?: number\n /** Ширина панели: число — пиксели, строка — CSS-длина, `auto` — по контенту. */\n width?: GrDropdownWidth\n /** Чем открывается панель. В любом режиме работают клик и клавиатура. */\n trigger?: GrDropdownTrigger\n /** Задержка открытия по наведению, мс. */\n openDelay?: number\n /** Задержка закрытия после ухода курсора, мс. */\n closeDelay?: number\n /** Меню не открывается ничем; триггер остаётся фокусируемым. */\n disabled?: boolean\n /** Куда телепортировать панель (`body` по умолчанию). */\n /** Точечное переопределение точки монтирования; по умолчанию — общий портал. */\n teleportTo?: string | HTMLElement\n /** Закрывать по клику внутри content. */\n closeOnContentClick?: boolean\n /** Дополнительные классы content-контейнера. */\n contentClass?: string\n /**\n * Декларативное меню: пункты, группы и разделители массивом. Слот по\n * умолчанию сильнее — он для меню, которое из модели не собирается.\n */\n items?: GrDropdownMenuEntry[]\n\n // list wrapper\n /** Разделители между пунктами. */\n dividers?: boolean\n /** Верхний бордер контейнера списка. */\n borderTop?: boolean\n /** Нижний бордер контейнера списка. */\n borderBottom?: boolean\n /** Дополнительные классы для wrapper'а списка. */\n listClass?: string\n /**\n * Контролируемое состояние панели (`v-model:open`) — прокидывается в\n * `GrDropdown`. Без пропа меню ведёт себя само (uncontrolled).\n */\n open?: boolean\n}\n\nexport interface GrDropdownMenuEmits {\n /** Выбран пункт декларативного меню. */\n (e: 'select', item: GrDropdownMenuAction): void\n /** Панель открылась/закрылась (`v-model:open`). */\n (e: 'update:open', value: boolean): void\n}\n\nwithDefaults(defineProps<GrDropdownMenuProps>(), {\n placement: 'bottom-end',\n offset: 8,\n width: '12rem',\n trigger: 'click',\n openDelay: 120,\n closeDelay: 160,\n disabled: false,\n teleportTo: undefined,\n closeOnContentClick: true,\n // Поле панели принадлежит панели. Гасить его отсюда своим `p-0` нельзя: оба\n // класса попадают в один атрибут с равной специфичностью, и победителя\n // выбирает порядок правил в сгенерированном CSS, а не разметка. Пункт вписан\n // в это поле собственным радиусом — см. `itemBaseClass`.\n contentClass: '',\n items: undefined,\n dividers: false,\n borderTop: false,\n borderBottom: false,\n listClass: '',\n open: undefined,\n})\n\nconst emit = defineEmits<GrDropdownMenuEmits>()\n\n</script>\n\n<template>\n <GrDropdown\n data-gr-dropdown-menu\n :placement=\"placement\"\n :offset=\"offset\"\n :width=\"width\"\n :trigger=\"trigger\"\n :open-delay=\"openDelay\"\n :close-delay=\"closeDelay\"\n :disabled=\"disabled\"\n :teleport-to=\"teleportTo\"\n :close-on-content-click=\"closeOnContentClick\"\n :content-class=\"contentClass\"\n :open=\"open\"\n @update:open=\"emit('update:open', $event)\"\n >\n <template #trigger=\"slotProps\">\n <slot name=\"trigger\" v-bind=\"slotProps\" />\n </template>\n\n <template #content=\"slotProps\">\n <GrDropdownMenuList\n :dividers=\"dividers\"\n :border-top=\"borderTop\"\n :border-bottom=\"borderBottom\"\n :class=\"listClass\"\n >\n <slot v-bind=\"slotProps\">\n <GrDropdownMenuEntries :items=\"items\" @select=\"emit('select', $event)\" />\n </slot>\n </GrDropdownMenuList>\n </template>\n </GrDropdown>\n</template>\n","<script setup lang=\"ts\">\nimport { alignClass, columnBaseClass, type GrDropdownMenuColumnAlign } from './grDropdownMenuStyles'\n\nexport type { GrDropdownMenuColumnAlign } from './grDropdownMenuStyles'\n\nexport interface GrDropdownMenuColumnProps {\n align?: GrDropdownMenuColumnAlign\n}\n\nwithDefaults(defineProps<GrDropdownMenuColumnProps>(), {\n align: 'center',\n})\n</script>\n\n<template>\n <div\n data-gr-dropdown-menu-column\n role=\"none\"\n :class=\"[columnBaseClass, alignClass[align]]\"\n >\n <slot />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { alignClass, columnBaseClass, type GrDropdownMenuColumnAlign } from './grDropdownMenuStyles'\n\nexport type { GrDropdownMenuColumnAlign } from './grDropdownMenuStyles'\n\nexport interface GrDropdownMenuColumnProps {\n align?: GrDropdownMenuColumnAlign\n}\n\nwithDefaults(defineProps<GrDropdownMenuColumnProps>(), {\n align: 'center',\n})\n</script>\n\n<template>\n <div\n data-gr-dropdown-menu-column\n role=\"none\"\n :class=\"[columnBaseClass, alignClass[align]]\"\n >\n <slot />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { colsClass, columnsBaseClass, type GrDropdownMenuColumnsCount } from './grDropdownMenuStyles'\n\nexport interface GrDropdownMenuColumnsProps {\n cols?: GrDropdownMenuColumnsCount\n}\n\nwithDefaults(defineProps<GrDropdownMenuColumnsProps>(), {\n cols: 2,\n})\n</script>\n\n<template>\n <div\n data-gr-dropdown-menu-columns\n role=\"none\"\n :class=\"[columnsBaseClass, colsClass[cols]]\"\n >\n <slot />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { colsClass, columnsBaseClass, type GrDropdownMenuColumnsCount } from './grDropdownMenuStyles'\n\nexport interface GrDropdownMenuColumnsProps {\n cols?: GrDropdownMenuColumnsCount\n}\n\nwithDefaults(defineProps<GrDropdownMenuColumnsProps>(), {\n cols: 2,\n})\n</script>\n\n<template>\n <div\n data-gr-dropdown-menu-columns\n role=\"none\"\n :class=\"[columnsBaseClass, colsClass[cols]]\"\n >\n <slot />\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsFA,MAAM,OAAO;;uBAKX,YA+Ba,oBAAA;IA9BX,yBAAA;IACC,WAAW,QAAA;IACX,QAAQ,QAAA;IACR,OAAO,QAAA;IACP,SAAS,QAAA;IACT,cAAY,QAAA;IACZ,eAAa,QAAA;IACb,UAAU,QAAA;IACV,eAAa,QAAA;IACb,0BAAwB,QAAA;IACxB,iBAAe,QAAA;IACf,MAAM,QAAA;IACN,iBAAW,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,eAAgB,MAAM;;IAE7B,SAAO,SAAE,cAAS,CAC3B,WAA0C,KAAA,QAAA,WAAA,eAAA,mBAAb,SAAS,CAAA,CAAA,CAAA,CAAA;IAG7B,SAAO,SAAE,cAAS,CAC3B,YASqB,4BAAA;KARlB,UAAU,QAAA;KACV,cAAY,QAAA;KACZ,iBAAe,QAAA;KACf,OAAK,eAAE,QAAA,SAAS;;4BAIV,CAFP,WAEO,KAAA,QAAA,WAAA,eAAA,mBAFO,SAAS,CAAA,SAEhB,CADL,YAAyE,+BAAA;MAAjD,OAAO,QAAA;MAAQ,UAAM,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,UAAW,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBEvG5E,mBAMM,OAAA;IALJ,gCAAA;IACA,MAAK;IACJ,OAAK,eAAA,CAAG,MAAA,eAAA,GAAiB,MAAA,UAAA,CAAU,CAAC,QAAA,MAAK,CAAA;OAE1C,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,CAAA;;;;;;;;;;;uBEPV,mBAMM,OAAA;IALJ,iCAAA;IACA,MAAK;IACJ,OAAK,eAAA,CAAG,MAAA,gBAAA,GAAkB,MAAA,SAAA,CAAS,CAAC,QAAA,KAAI,CAAA;OAEzC,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,CAAA"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { t as check_default } from "../../../chunks/check-BZI24Qs4.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, guardReactiveProps, mergeProps, normalizeClass, normalizeProps, openBlock, renderList, renderSlot, resolveDynamicComponent, toDisplayString, unref, useAttrs, useId, useSlots, withCtx } from "vue";
|
|
2
|
+
import { _ as itemShortcutClass, b as textAlignClass, c as dividerInsetClass, d as grDropdownMenuListClass, f as headerClass, h as itemIndicatorClass, l as dividersClass, s as dividerClass, u as grDropdownMenuItemClass, y as listBaseClass } from "../../../chunks/grDropdownMenuStyles-D1LOkdVj.js";
|
|
3
|
+
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, defineComponent, mergeProps, normalizeClass, openBlock, renderList, renderSlot, resolveDynamicComponent, toDisplayString, unref, useAttrs, useId, useSlots, withCtx } from "vue";
|
|
5
4
|
//#endregion
|
|
6
5
|
//#region src/components/GrDropdownMenu/GrDropdownMenuDivider.vue
|
|
7
6
|
var GrDropdownMenuDivider_default = /* @__PURE__ */ defineComponent({
|
|
@@ -215,40 +214,6 @@ var GrDropdownMenuItem_default = /* @__PURE__ */ defineComponent({
|
|
|
215
214
|
}
|
|
216
215
|
});
|
|
217
216
|
//#endregion
|
|
218
|
-
//#region src/components/GrDropdownMenu/GrDropdownMenuList.vue
|
|
219
|
-
var GrDropdownMenuList_default = /* @__PURE__ */ defineComponent({
|
|
220
|
-
__name: "GrDropdownMenuList",
|
|
221
|
-
props: {
|
|
222
|
-
dividers: {
|
|
223
|
-
type: Boolean,
|
|
224
|
-
default: false
|
|
225
|
-
},
|
|
226
|
-
borderTop: {
|
|
227
|
-
type: Boolean,
|
|
228
|
-
default: false
|
|
229
|
-
},
|
|
230
|
-
borderBottom: {
|
|
231
|
-
type: Boolean,
|
|
232
|
-
default: false
|
|
233
|
-
}
|
|
234
|
-
},
|
|
235
|
-
setup(__props) {
|
|
236
|
-
const props = __props;
|
|
237
|
-
const className = computed(() => grDropdownMenuListClass({
|
|
238
|
-
dividers: props.dividers,
|
|
239
|
-
borderTop: props.borderTop,
|
|
240
|
-
borderBottom: props.borderBottom
|
|
241
|
-
}));
|
|
242
|
-
return (_ctx, _cache) => {
|
|
243
|
-
return openBlock(), createElementBlock("div", {
|
|
244
|
-
"data-gr-dropdown-menu-list": "",
|
|
245
|
-
role: "none",
|
|
246
|
-
class: normalizeClass(className.value)
|
|
247
|
-
}, [renderSlot(_ctx.$slots, "default")], 2);
|
|
248
|
-
};
|
|
249
|
-
}
|
|
250
|
-
});
|
|
251
|
-
//#endregion
|
|
252
217
|
//#region src/components/GrDropdownMenu/menuModel.ts
|
|
253
218
|
function isMenuSeparator(entry) {
|
|
254
219
|
return "type" in entry && entry.type === "divider";
|
|
@@ -260,47 +225,19 @@ function isMenuAction(entry) {
|
|
|
260
225
|
return !isMenuSeparator(entry) && !isMenuSection(entry);
|
|
261
226
|
}
|
|
262
227
|
//#endregion
|
|
263
|
-
//#region src/components/GrDropdownMenu/
|
|
264
|
-
var
|
|
265
|
-
__name: "
|
|
266
|
-
props: {
|
|
267
|
-
|
|
268
|
-
offset: { default: 8 },
|
|
269
|
-
width: { default: "12rem" },
|
|
270
|
-
trigger: { default: "click" },
|
|
271
|
-
openDelay: { default: 120 },
|
|
272
|
-
closeDelay: { default: 160 },
|
|
273
|
-
disabled: {
|
|
274
|
-
type: Boolean,
|
|
275
|
-
default: false
|
|
276
|
-
},
|
|
277
|
-
teleportTo: { default: void 0 },
|
|
278
|
-
closeOnContentClick: {
|
|
279
|
-
type: Boolean,
|
|
280
|
-
default: true
|
|
281
|
-
},
|
|
282
|
-
contentClass: { default: "" },
|
|
283
|
-
items: { default: void 0 },
|
|
284
|
-
dividers: {
|
|
285
|
-
type: Boolean,
|
|
286
|
-
default: false
|
|
287
|
-
},
|
|
288
|
-
borderTop: {
|
|
289
|
-
type: Boolean,
|
|
290
|
-
default: false
|
|
291
|
-
},
|
|
292
|
-
borderBottom: {
|
|
293
|
-
type: Boolean,
|
|
294
|
-
default: false
|
|
295
|
-
},
|
|
296
|
-
listClass: { default: "" },
|
|
297
|
-
open: {
|
|
298
|
-
type: Boolean,
|
|
299
|
-
default: void 0
|
|
300
|
-
}
|
|
301
|
-
},
|
|
302
|
-
emits: ["select", "update:open"],
|
|
228
|
+
//#region src/components/GrDropdownMenu/GrDropdownMenuEntries.vue
|
|
229
|
+
var GrDropdownMenuEntries_default = /* @__PURE__ */ defineComponent({
|
|
230
|
+
__name: "GrDropdownMenuEntries",
|
|
231
|
+
props: { items: {} },
|
|
232
|
+
emits: ["select"],
|
|
303
233
|
setup(__props, { emit: __emit }) {
|
|
234
|
+
/**
|
|
235
|
+
* Рендер декларативной модели меню — без обёртки списка: её ставит потребитель,
|
|
236
|
+
* потому что `dividers`/`borderTop` принадлежат конкретному меню, а не модели.
|
|
237
|
+
*
|
|
238
|
+
* Вынесено из `GrDropdownMenu` ради `GrContextMenu`: модель у них общая, и
|
|
239
|
+
* вторая копия цикла разошлась бы с первой при первом же новом поле пункта.
|
|
240
|
+
*/
|
|
304
241
|
const emit = __emit;
|
|
305
242
|
function itemProps(item) {
|
|
306
243
|
return {
|
|
@@ -321,101 +258,62 @@ var GrDropdownMenu_default = /* @__PURE__ */ defineComponent({
|
|
|
321
258
|
emit("select", item);
|
|
322
259
|
}
|
|
323
260
|
return (_ctx, _cache) => {
|
|
324
|
-
return openBlock(),
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
"close-delay": __props.closeDelay,
|
|
332
|
-
disabled: __props.disabled,
|
|
333
|
-
"teleport-to": __props.teleportTo,
|
|
334
|
-
"close-on-content-click": __props.closeOnContentClick,
|
|
335
|
-
"content-class": __props.contentClass,
|
|
336
|
-
open: __props.open,
|
|
337
|
-
"onUpdate:open": _cache[0] || (_cache[0] = ($event) => emit("update:open", $event))
|
|
338
|
-
}, {
|
|
339
|
-
trigger: withCtx((slotProps) => [renderSlot(_ctx.$slots, "trigger", normalizeProps(guardReactiveProps(slotProps)))]),
|
|
340
|
-
content: withCtx((slotProps) => [createVNode(GrDropdownMenuList_default, {
|
|
341
|
-
dividers: __props.dividers,
|
|
342
|
-
"border-top": __props.borderTop,
|
|
343
|
-
"border-bottom": __props.borderBottom,
|
|
344
|
-
class: normalizeClass(__props.listClass)
|
|
261
|
+
return openBlock(true), createElementBlock(Fragment, null, renderList(__props.items ?? [], (entry, index) => {
|
|
262
|
+
return openBlock(), createElementBlock(Fragment, null, [unref(isMenuSeparator)(entry) ? (openBlock(), createBlock(GrDropdownMenuDivider_default, {
|
|
263
|
+
key: `divider-${index}`,
|
|
264
|
+
inset: entry.inset
|
|
265
|
+
}, null, 8, ["inset"])) : unref(isMenuSection)(entry) ? (openBlock(), createBlock(GrDropdownMenuGroup_default, {
|
|
266
|
+
key: `group-${entry.title ?? index}`,
|
|
267
|
+
title: entry.title
|
|
345
268
|
}, {
|
|
346
|
-
default: withCtx(() => [
|
|
347
|
-
return openBlock(),
|
|
348
|
-
|
|
349
|
-
inset: entry.inset
|
|
350
|
-
}, null, 8, ["inset"])) : unref(isMenuSection)(entry) ? (openBlock(), createBlock(GrDropdownMenuGroup_default, {
|
|
351
|
-
key: `group-${entry.title ?? index}`,
|
|
352
|
-
title: entry.title
|
|
353
|
-
}, {
|
|
354
|
-
default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(entry.items, (item) => {
|
|
355
|
-
return openBlock(), createBlock(GrDropdownMenuItem_default, mergeProps({ key: item.key }, { ref_for: true }, itemProps(item), { onClick: ($event) => onSelect(item) }), {
|
|
356
|
-
default: withCtx(() => [createTextVNode(toDisplayString(item.label), 1)]),
|
|
357
|
-
_: 2
|
|
358
|
-
}, 1040, ["onClick"]);
|
|
359
|
-
}), 128))]),
|
|
360
|
-
_: 2
|
|
361
|
-
}, 1032, ["title"])) : unref(isMenuAction)(entry) ? (openBlock(), createBlock(GrDropdownMenuItem_default, mergeProps({ key: entry.key }, { ref_for: true }, itemProps(entry), { onClick: ($event) => onSelect(entry) }), {
|
|
362
|
-
default: withCtx(() => [createTextVNode(toDisplayString(entry.label), 1)]),
|
|
269
|
+
default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(entry.items, (item) => {
|
|
270
|
+
return openBlock(), createBlock(GrDropdownMenuItem_default, mergeProps({ key: item.key }, { ref_for: true }, itemProps(item), { onClick: ($event) => onSelect(item) }), {
|
|
271
|
+
default: withCtx(() => [createTextVNode(toDisplayString(item.label), 1)]),
|
|
363
272
|
_: 2
|
|
364
|
-
}, 1040, ["onClick"])
|
|
365
|
-
}),
|
|
273
|
+
}, 1040, ["onClick"]);
|
|
274
|
+
}), 128))]),
|
|
366
275
|
_: 2
|
|
367
|
-
}, 1032, [
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
])]),
|
|
373
|
-
_: 3
|
|
374
|
-
}, 8, [
|
|
375
|
-
"placement",
|
|
376
|
-
"offset",
|
|
377
|
-
"width",
|
|
378
|
-
"trigger",
|
|
379
|
-
"open-delay",
|
|
380
|
-
"close-delay",
|
|
381
|
-
"disabled",
|
|
382
|
-
"teleport-to",
|
|
383
|
-
"close-on-content-click",
|
|
384
|
-
"content-class",
|
|
385
|
-
"open"
|
|
386
|
-
]);
|
|
387
|
-
};
|
|
388
|
-
}
|
|
389
|
-
});
|
|
390
|
-
//#endregion
|
|
391
|
-
//#region src/components/GrDropdownMenu/GrDropdownMenuColumn.vue
|
|
392
|
-
var GrDropdownMenuColumn_default = /* @__PURE__ */ defineComponent({
|
|
393
|
-
__name: "GrDropdownMenuColumn",
|
|
394
|
-
props: { align: { default: "center" } },
|
|
395
|
-
setup(__props) {
|
|
396
|
-
return (_ctx, _cache) => {
|
|
397
|
-
return openBlock(), createElementBlock("div", {
|
|
398
|
-
"data-gr-dropdown-menu-column": "",
|
|
399
|
-
role: "none",
|
|
400
|
-
class: normalizeClass([unref(columnBaseClass), unref(alignClass)[__props.align]])
|
|
401
|
-
}, [renderSlot(_ctx.$slots, "default")], 2);
|
|
276
|
+
}, 1032, ["title"])) : unref(isMenuAction)(entry) ? (openBlock(), createBlock(GrDropdownMenuItem_default, mergeProps({ key: entry.key }, { ref_for: true }, itemProps(entry), { onClick: ($event) => onSelect(entry) }), {
|
|
277
|
+
default: withCtx(() => [createTextVNode(toDisplayString(entry.label), 1)]),
|
|
278
|
+
_: 2
|
|
279
|
+
}, 1040, ["onClick"])) : createCommentVNode("", true)], 64);
|
|
280
|
+
}), 256);
|
|
402
281
|
};
|
|
403
282
|
}
|
|
404
283
|
});
|
|
405
284
|
//#endregion
|
|
406
|
-
//#region src/components/GrDropdownMenu/
|
|
407
|
-
var
|
|
408
|
-
__name: "
|
|
409
|
-
props: {
|
|
285
|
+
//#region src/components/GrDropdownMenu/GrDropdownMenuList.vue
|
|
286
|
+
var GrDropdownMenuList_default = /* @__PURE__ */ defineComponent({
|
|
287
|
+
__name: "GrDropdownMenuList",
|
|
288
|
+
props: {
|
|
289
|
+
dividers: {
|
|
290
|
+
type: Boolean,
|
|
291
|
+
default: false
|
|
292
|
+
},
|
|
293
|
+
borderTop: {
|
|
294
|
+
type: Boolean,
|
|
295
|
+
default: false
|
|
296
|
+
},
|
|
297
|
+
borderBottom: {
|
|
298
|
+
type: Boolean,
|
|
299
|
+
default: false
|
|
300
|
+
}
|
|
301
|
+
},
|
|
410
302
|
setup(__props) {
|
|
303
|
+
const props = __props;
|
|
304
|
+
const className = computed(() => grDropdownMenuListClass({
|
|
305
|
+
dividers: props.dividers,
|
|
306
|
+
borderTop: props.borderTop,
|
|
307
|
+
borderBottom: props.borderBottom
|
|
308
|
+
}));
|
|
411
309
|
return (_ctx, _cache) => {
|
|
412
310
|
return openBlock(), createElementBlock("div", {
|
|
413
|
-
"data-gr-dropdown-menu-
|
|
311
|
+
"data-gr-dropdown-menu-list": "",
|
|
414
312
|
role: "none",
|
|
415
|
-
class: normalizeClass(
|
|
313
|
+
class: normalizeClass(className.value)
|
|
416
314
|
}, [renderSlot(_ctx.$slots, "default")], 2);
|
|
417
315
|
};
|
|
418
316
|
}
|
|
419
317
|
});
|
|
420
318
|
//#endregion
|
|
421
|
-
export { GrDropdownMenuItem_default as a, GrDropdownMenuDivider_default as c,
|
|
319
|
+
export { GrDropdownMenuItem_default as a, GrDropdownMenuDivider_default as c, isMenuSection as i, GrDropdownMenuEntries_default as n, GrDropdownMenuGroup_default as o, isMenuAction as r, GrDropdownMenuHeader_default as s, GrDropdownMenuList_default as t };
|