@robot-admin/naive-ui-components 0.9.1 → 0.9.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/C_ActionBar-BAcfOfRw.css.map +1 -0
- package/dist/C_ActionBar-DG2HW7t5.css.map +1 -0
- package/dist/C_ActionBar.css +47 -47
- package/dist/C_ActionBar.js.map +1 -1
- package/dist/C_ActionBar2.js +1 -1
- package/dist/C_ActionBar2.js.map +1 -1
- package/dist/{C_AntV-BY8jqqmi.css.map → C_AntV-D_jTK8oZ.css.map} +1 -1
- package/dist/{C_AntV-BbkHc-_a.css.map → C_AntV-DanTAq22.css.map} +1 -1
- package/dist/C_AntV.css +79 -79
- package/dist/C_AntV.js.map +1 -1
- package/dist/C_AntV2.js +3 -3
- package/dist/C_AntV2.js.map +1 -1
- package/dist/{C_AudioPlayer-DKRIGhi7.css.map → C_AudioPlayer-BnYIJXPD.css.map} +1 -1
- package/dist/{C_AudioPlayer-DlB6eNsa.css.map → C_AudioPlayer-ldTy9Y34.css.map} +1 -1
- package/dist/C_AudioPlayer.css +47 -47
- package/dist/C_AudioPlayer.js.map +1 -1
- package/dist/C_AudioPlayer2.js +1 -1
- package/dist/C_AudioPlayer2.js.map +1 -1
- package/dist/{C_AvatarGroup-D02zci-i.css.map → C_AvatarGroup-B9d-GJ9c.css.map} +1 -1
- package/dist/{C_AvatarGroup-DatHaUlY.css.map → C_AvatarGroup-SIzxuuZr.css.map} +1 -1
- package/dist/C_AvatarGroup.css +21 -21
- package/dist/C_AvatarGroup.js.map +1 -1
- package/dist/C_AvatarGroup2.js +1 -1
- package/dist/C_AvatarGroup2.js.map +1 -1
- package/dist/{C_Barcode-DYDRDe2O.css.map → C_Barcode-CAU2mFcx.css.map} +1 -1
- package/dist/{C_Barcode-muJdc_O4.css.map → C_Barcode-D2oJaEg3.css.map} +1 -1
- package/dist/C_Barcode.css +7 -7
- package/dist/C_Barcode.js.map +1 -1
- package/dist/C_Barcode2.js +1 -1
- package/dist/C_Barcode2.js.map +1 -1
- package/dist/C_Breadcrumb.js.map +1 -1
- package/dist/C_Breadcrumb2.js +1 -1
- package/dist/C_Breadcrumb2.js.map +1 -1
- package/dist/{C_Captcha-9_hk6VmY.css.map → C_Captcha-B3yrtG7t.css.map} +1 -1
- package/dist/{C_Captcha-MtASlJ0f.css.map → C_Captcha-D4hDdWDu.css.map} +1 -1
- package/dist/C_Captcha.css +19 -19
- package/dist/C_Captcha.js.map +1 -1
- package/dist/C_Captcha2.js +1 -1
- package/dist/C_Captcha2.js.map +1 -1
- package/dist/C_Cascade-BE7t1OX5.css.map +1 -0
- package/dist/C_Cascade-CpDiau1y.css.map +1 -0
- package/dist/C_Cascade.css +3 -3
- package/dist/C_Cascade.js.map +1 -1
- package/dist/C_Cascade2.js +1 -1
- package/dist/C_Cascade2.js.map +1 -1
- package/dist/{C_Chat-Csjz_BFw.css.map → C_Chat-CF1SU7mc.css.map} +1 -1
- package/dist/{C_Chat-DO1ZBA_0.css.map → C_Chat-DeUv6uuI.css.map} +1 -1
- package/dist/C_Chat.css +65 -65
- package/dist/C_Chat.js.map +1 -1
- package/dist/C_Chat2.js +1 -1
- package/dist/C_Chat2.js.map +1 -1
- package/dist/{C_City-Bam08Qv3.css.map → C_City-DdkX6u64.css.map} +1 -1
- package/dist/{C_City-Bb3W-KaN.css.map → C_City-iP-dIvui.css.map} +1 -1
- package/dist/C_City.css +29 -29
- package/dist/C_City.js.map +1 -1
- package/dist/C_City2.js +1 -1
- package/dist/C_City2.js.map +1 -1
- package/dist/C_Code-BWmJMNS7.css.map +1 -0
- package/dist/C_Code-k14vjgVl.css.map +1 -0
- package/dist/C_Code.css +3 -3
- package/dist/C_Code.js.map +1 -1
- package/dist/C_Code2.js +1 -1
- package/dist/C_Code2.js.map +1 -1
- package/dist/{C_CollapsePanel-CWkFCqNQ.css.map → C_CollapsePanel-BSKcWSmY.css.map} +1 -1
- package/dist/{C_CollapsePanel-pcVJA_4z.css.map → C_CollapsePanel-DRvRq8tB.css.map} +1 -1
- package/dist/C_CollapsePanel.css +35 -35
- package/dist/C_CollapsePanel.js.map +1 -1
- package/dist/C_CollapsePanel2.js +1 -1
- package/dist/C_CollapsePanel2.js.map +1 -1
- package/dist/{C_ContextMenu-B3Cgz_wJ.css.map → C_ContextMenu-Bn_uhJSo.css.map} +1 -1
- package/dist/{C_ContextMenu-u1LixF3_.css.map → C_ContextMenu-C9iuxG2n.css.map} +1 -1
- package/dist/C_ContextMenu.css +17 -17
- package/dist/C_ContextMenu.js.map +1 -1
- package/dist/C_ContextMenu2.js +1 -1
- package/dist/C_ContextMenu2.js.map +1 -1
- package/dist/{C_Cron-Civir5-I.css.map → C_Cron-BIQ2By9v.css.map} +1 -1
- package/dist/{C_Cron-iw3qpMsy.css.map → C_Cron-BNSAGD6A.css.map} +1 -1
- package/dist/C_Cron.css +57 -57
- package/dist/C_Cron.js.map +1 -1
- package/dist/C_Cron2.js +1 -1
- package/dist/C_Cron2.js.map +1 -1
- package/dist/C_Date.js.map +1 -1
- package/dist/C_Date2.js +1 -1
- package/dist/C_Date2.js.map +1 -1
- package/dist/{C_Draggable-BCjIvIwT.css.map → C_Draggable-BDAbk4s5.css.map} +1 -1
- package/dist/{C_Draggable-DwkSlCOS.css.map → C_Draggable-UhfDLXop.css.map} +1 -1
- package/dist/C_Draggable.css +46 -46
- package/dist/C_Draggable.js.map +1 -1
- package/dist/C_Draggable2.js +1 -1
- package/dist/C_Draggable2.js.map +1 -1
- package/dist/{C_Editor-BfjjYQ9B.css.map → C_Editor-CZOaChru.css.map} +1 -1
- package/dist/{C_Editor-Do2StvoJ.css.map → C_Editor-kJAQq5z6.css.map} +1 -1
- package/dist/C_Editor.css +14 -14
- package/dist/C_Editor.js.map +1 -1
- package/dist/C_Editor2.js +1 -1
- package/dist/C_Editor2.js.map +1 -1
- package/dist/{C_FilePreview-BhcbiXsV.css.map → C_FilePreview-Bs_omgJS.css.map} +1 -1
- package/dist/{C_FilePreview-DJudcIbW.css.map → C_FilePreview-DbwoyF2j.css.map} +1 -1
- package/dist/C_FilePreview.css +91 -91
- package/dist/C_FilePreview.js.map +1 -1
- package/dist/C_FilePreview2.js +1 -1
- package/dist/C_FilePreview2.js.map +1 -1
- package/dist/{C_Form-BtcAPIRi.css.map → C_Form-SCq-DZaZ.css.map} +1 -1
- package/dist/{C_Form-D_gwQ7hC.css.map → C_Form-mcd1nKvF.css.map} +1 -1
- package/dist/C_Form.css +223 -223
- package/dist/C_Form.js.map +1 -1
- package/dist/C_Form2.js +1 -1
- package/dist/C_Form2.js.map +1 -1
- package/dist/{C_FormSearch-Bi4XYjjk.css.map → C_FormSearch-C3F8peAY.css.map} +1 -1
- package/dist/{C_FormSearch-DUGOoX0u.css.map → C_FormSearch-qW56bJPo.css.map} +1 -1
- package/dist/C_FormSearch.css +45 -45
- package/dist/C_FormSearch.js.map +1 -1
- package/dist/C_FormSearch2.js +1 -1
- package/dist/C_FormSearch2.js.map +1 -1
- package/dist/{C_FormulaEditor-CJk3SSUJ.css.map → C_FormulaEditor-ChOvDbsZ.css.map} +1 -1
- package/dist/{C_FormulaEditor-Cy7mjfVO.css.map → C_FormulaEditor-mfiIUDY4.css.map} +1 -1
- package/dist/C_FormulaEditor.css +78 -78
- package/dist/C_FormulaEditor.js.map +1 -1
- package/dist/C_FormulaEditor2.js +1 -1
- package/dist/C_FormulaEditor2.js.map +1 -1
- package/dist/C_FullCalendar-C2nsqrgS.css.map +1 -0
- package/dist/C_FullCalendar-DdFtXVhy.css.map +1 -0
- package/dist/C_FullCalendar.css +2 -2
- package/dist/C_FullCalendar.js.map +1 -1
- package/dist/C_FullCalendar2.js +1 -1
- package/dist/C_FullCalendar2.js.map +1 -1
- package/dist/{C_GlobalSearch-B6wK3m3k.css.map → C_GlobalSearch-Dq4Wo01K.css.map} +1 -1
- package/dist/{C_GlobalSearch-DoPjldFm.css.map → C_GlobalSearch-RB7J43gu.css.map} +1 -1
- package/dist/C_GlobalSearch.css +112 -112
- package/dist/C_GlobalSearch.js.map +1 -1
- package/dist/C_GlobalSearch2.js +1 -1
- package/dist/C_GlobalSearch2.js.map +1 -1
- package/dist/C_Guide.js.map +1 -1
- package/dist/C_Guide2.js +1 -1
- package/dist/C_Guide2.js.map +1 -1
- package/dist/C_Icon.js.map +1 -1
- package/dist/C_Icon2.js.map +1 -1
- package/dist/{C_ImageCropper-BqZpkZfU.css.map → C_ImageCropper-CdTX2nxU.css.map} +1 -1
- package/dist/{C_ImageCropper-CylwGuzS.css.map → C_ImageCropper-ilOqPklJ.css.map} +1 -1
- package/dist/C_ImageCropper.css +23 -23
- package/dist/C_ImageCropper.js.map +1 -1
- package/dist/C_ImageCropper2.js +1 -1
- package/dist/C_ImageCropper2.js.map +1 -1
- package/dist/C_Language.js.map +1 -1
- package/dist/C_Language2.js +1 -1
- package/dist/C_Language2.js.map +1 -1
- package/dist/{C_Login-BkdnkBKX.css.map → C_Login-B3qYkLrN.css.map} +1 -1
- package/dist/{C_Login-VkMM6OJ2.css.map → C_Login-xMI1_ojE.css.map} +1 -1
- package/dist/C_Login.css +72 -72
- package/dist/C_Login.js.map +1 -1
- package/dist/C_Login2.js +1 -1
- package/dist/C_Login2.js.map +1 -1
- package/dist/{C_Map-DNnBcY70.css.map → C_Map-CWMMN58_.css.map} +1 -1
- package/dist/{C_Map-LEXIx6zM.css.map → C_Map-xSR2H-9o.css.map} +1 -1
- package/dist/C_Map.css +4 -4
- package/dist/C_Map.js.map +1 -1
- package/dist/C_Map2.js +1 -1
- package/dist/C_Map2.js.map +1 -1
- package/dist/{C_Markdown-DwmI0_0Q.css.map → C_Markdown-C7lTVJ1S.css.map} +1 -1
- package/dist/{C_Markdown-k0794RW0.css.map → C_Markdown-CZDm_baQ.css.map} +1 -1
- package/dist/C_Markdown.css +33 -33
- package/dist/C_Markdown.js.map +1 -1
- package/dist/C_Markdown2.js +1 -1
- package/dist/C_Markdown2.js.map +1 -1
- package/dist/C_Menu.js.map +1 -1
- package/dist/C_Menu2.js +1 -1
- package/dist/C_Menu2.js.map +1 -1
- package/dist/{C_NotificationCenter-DT6fQ79O.css.map → C_NotificationCenter-D7GGGWg7.css.map} +1 -1
- package/dist/{C_NotificationCenter-DbgBiyqB.css.map → C_NotificationCenter-SSmeHA45.css.map} +1 -1
- package/dist/C_NotificationCenter.css +89 -89
- package/dist/C_NotificationCenter.js.map +1 -1
- package/dist/C_NotificationCenter2.js +1 -1
- package/dist/C_NotificationCenter2.js.map +1 -1
- package/dist/C_OrgChart.js.map +1 -1
- package/dist/C_OrgChart2.js.map +1 -1
- package/dist/C_Progress.js.map +1 -1
- package/dist/C_Progress2.js +1 -1
- package/dist/C_Progress2.js.map +1 -1
- package/dist/{C_QRCode-CFNTda_1.css.map → C_QRCode-B_1lHUdx.css.map} +1 -1
- package/dist/{C_QRCode-CmWr9lK-.css.map → C_QRCode-CuQRYu0s.css.map} +1 -1
- package/dist/C_QRCode.css +9 -9
- package/dist/C_QRCode.js.map +1 -1
- package/dist/C_QRCode2.js +1 -1
- package/dist/C_QRCode2.js.map +1 -1
- package/dist/{C_Signature-BDx4ctsE.css.map → C_Signature-Bp-RBpAl.css.map} +1 -1
- package/dist/{C_Signature-Bz_uNbwv.css.map → C_Signature-Cb2VW1ok.css.map} +1 -1
- package/dist/C_Signature.css +15 -15
- package/dist/C_Signature.js.map +1 -1
- package/dist/C_Signature2.js +1 -1
- package/dist/C_Signature2.js.map +1 -1
- package/dist/C_Skeleton.js.map +1 -1
- package/dist/C_Skeleton2.js.map +1 -1
- package/dist/{C_SplitPane-BOwr1C7K.css.map → C_SplitPane-CgGWYsRE.css.map} +1 -1
- package/dist/{C_SplitPane-N-a_D-7F.css.map → C_SplitPane-DGf6WEeR.css.map} +1 -1
- package/dist/C_SplitPane.css +31 -31
- package/dist/C_SplitPane.js.map +1 -1
- package/dist/C_SplitPane2.js +1 -1
- package/dist/C_SplitPane2.js.map +1 -1
- package/dist/C_Steps-Buyg7Axn.css.map +1 -0
- package/dist/C_Steps-DNY91VbQ.css.map +1 -0
- package/dist/C_Steps.css +38 -38
- package/dist/C_Steps.js.map +1 -1
- package/dist/C_Steps2.js +1 -1
- package/dist/C_Steps2.js.map +1 -1
- package/dist/{C_Table-BcM5LqAM.css.map → C_Table--kbQaaBv.css.map} +1 -1
- package/dist/{C_Table-HATVoq1F.css.map → C_Table-D631kdXC.css.map} +1 -1
- package/dist/C_Table.css +104 -104
- package/dist/C_Table.js.map +1 -1
- package/dist/C_Table2.js +2 -2
- package/dist/C_Table2.js.map +1 -1
- package/dist/{C_TagsView-DX3LecK1.css.map → C_TagsView-COjGNM9h.css.map} +1 -1
- package/dist/{C_TagsView-DqOTa8bL.css.map → C_TagsView-zUDj9S06.css.map} +1 -1
- package/dist/C_TagsView.css +36 -36
- package/dist/C_TagsView.js.map +1 -1
- package/dist/C_TagsView2.js +1 -1
- package/dist/C_TagsView2.js.map +1 -1
- package/dist/C_Theme.js.map +1 -1
- package/dist/C_Theme2.js +1 -1
- package/dist/C_Theme2.js.map +1 -1
- package/dist/C_Time-BQ9PGy8B.css.map +1 -0
- package/dist/C_Time-CO73krC6.css.map +1 -0
- package/dist/C_Time.css +5 -5
- package/dist/C_Time.js.map +1 -1
- package/dist/C_Time2.js +1 -1
- package/dist/C_Time2.js.map +1 -1
- package/dist/{C_Timeline-BKkimrZx.css.map → C_Timeline-4rk0Dzgn.css.map} +1 -1
- package/dist/{C_Timeline-DTuSCX6p.css.map → C_Timeline-DdESmqwL.css.map} +1 -1
- package/dist/C_Timeline.css +45 -45
- package/dist/C_Timeline.js.map +1 -1
- package/dist/C_Timeline2.js +1 -1
- package/dist/C_Timeline2.js.map +1 -1
- package/dist/{C_Transfer-BOB6OBqS.css.map → C_Transfer-B-vjvhjI.css.map} +1 -1
- package/dist/{C_Transfer-Dpq7ezWC.css.map → C_Transfer-EzdHzZNv.css.map} +1 -1
- package/dist/C_Transfer.css +31 -31
- package/dist/C_Transfer.js.map +1 -1
- package/dist/C_Transfer2.js +1 -1
- package/dist/C_Transfer2.js.map +1 -1
- package/dist/{C_Tree-D98nX9qT.css.map → C_Tree-CsXgGfhn.css.map} +1 -1
- package/dist/{C_Tree-ulfm7b-P.css.map → C_Tree-P7eRpnOa.css.map} +1 -1
- package/dist/C_Tree.css +33 -33
- package/dist/C_Tree.js.map +1 -1
- package/dist/C_Tree2.js +1 -1
- package/dist/C_Tree2.js.map +1 -1
- package/dist/{C_Upload-BR9fg5r4.css.map → C_Upload-CHjiVVh7.css.map} +1 -1
- package/dist/{C_Upload-CPqf74Ea.css.map → C_Upload-DE3OLsZD.css.map} +1 -1
- package/dist/C_Upload.css +50 -50
- package/dist/C_Upload.js.map +1 -1
- package/dist/C_Upload2.js +2 -2
- package/dist/C_Upload2.js.map +1 -1
- package/dist/{C_VideoPlayer-4J96tKfK.css.map → C_VideoPlayer-CnaNOFtW.css.map} +1 -1
- package/dist/{C_VideoPlayer-D35seHkm.css.map → C_VideoPlayer-cnP88zNV.css.map} +1 -1
- package/dist/C_VideoPlayer.css +68 -68
- package/dist/C_VideoPlayer.js.map +1 -1
- package/dist/C_VideoPlayer2.js +3 -3
- package/dist/C_VideoPlayer2.js.map +1 -1
- package/dist/{C_VtableGantt-C2lxFmWg.css.map → C_VtableGantt-CZlJgvpC.css.map} +1 -1
- package/dist/{C_VtableGantt-Dwnkw_WL.css.map → C_VtableGantt-DKfQkql0.css.map} +1 -1
- package/dist/C_VtableGantt.css +15 -15
- package/dist/C_VtableGantt.js.map +1 -1
- package/dist/C_VtableGantt2.js +1 -1
- package/dist/C_VtableGantt2.js.map +1 -1
- package/dist/{C_WaterFall-C4HDqf-a.css.map → C_WaterFall-BJ_39ext.css.map} +1 -1
- package/dist/{C_WaterFall-HWB-gPON.css.map → C_WaterFall-cYc1vntE.css.map} +1 -1
- package/dist/C_WaterFall.css +16 -16
- package/dist/C_WaterFall.js.map +1 -1
- package/dist/C_WaterFall2.js +1 -1
- package/dist/C_WaterFall2.js.map +1 -1
- package/dist/{C_WorkFlow-2hJfvvTK.css.map → C_WorkFlow-BFzRGGhJ.css.map} +1 -1
- package/dist/{C_WorkFlow-DHoNjl8-.css.map → C_WorkFlow-DSyCOvRp.css.map} +1 -1
- package/dist/C_WorkFlow.css +193 -193
- package/dist/C_WorkFlow.js.map +1 -1
- package/dist/C_WorkFlow2.js +1 -1
- package/dist/C_WorkFlow2.js.map +1 -1
- package/dist/constants.d.ts +1 -1
- package/dist/constants2.d.ts +2 -2
- package/dist/constants3.d.ts +1 -1
- package/dist/constants4.d.ts +1 -1
- package/dist/constants5.d.ts +2 -2
- package/dist/data.d.ts +1 -1
- package/dist/index.vue.d.ts +2 -2
- package/dist/index11.vue.d.ts +2 -2
- package/dist/index12.vue.d.ts +1 -1
- package/dist/index13.vue.d.ts +2 -2
- package/dist/index14.vue.d.ts +3 -3
- package/dist/index15.vue.d.ts +6 -6
- package/dist/index17.vue.d.ts +1 -1
- package/dist/index18.vue.d.ts +2 -2
- package/dist/index2.vue.d.ts +6 -6
- package/dist/index20.vue.d.ts +1 -1
- package/dist/index21.vue.d.ts +2 -2
- package/dist/index22.vue.d.ts +2 -2
- package/dist/index24.vue.d.ts +1 -1
- package/dist/index26.vue.d.ts +3 -3
- package/dist/index27.vue.d.ts +1 -1
- package/dist/index28.vue.d.ts +2 -2
- package/dist/index3.vue.d.ts +2 -2
- package/dist/index4.vue.d.ts +2 -2
- package/dist/index6.vue.d.ts +3 -3
- package/dist/style.css +1991 -1991
- package/dist/useCalendarEvents.d.ts +1 -1
- package/dist/useCollapsePanel.d.ts +3 -3
- package/dist/useCropperCore.d.ts +4 -4
- package/dist/useDraggableLayout.d.ts +2 -2
- package/dist/useDynamicFormState.d.ts +13 -13
- package/dist/useEdgeInteraction.d.ts +1 -1
- package/dist/useInfiniteScroll.d.ts +3 -3
- package/dist/useModalEdit.d.ts +3 -3
- package/dist/useQRCode.d.ts +3 -3
- package/dist/useSignatureHistory.d.ts +1 -1
- package/dist/useSplitResize.d.ts +5 -5
- package/dist/useTimeSelection.d.ts +2 -2
- package/dist/useTreeOperations.d.ts +4 -4
- package/dist/useWorkflowValidation.d.ts +4 -4
- package/package.json +4 -7
- package/dist/C_ActionBar-DYG0Yf3A.css.map +0 -1
- package/dist/C_ActionBar-MAjRhqcI.css.map +0 -1
- package/dist/C_Cascade-Dq0S5Jkm.css.map +0 -1
- package/dist/C_Cascade-IUUHIh7r.css.map +0 -1
- package/dist/C_Code-BFi5xxnM.css.map +0 -1
- package/dist/C_Code-CZ7yfnri.css.map +0 -1
- package/dist/C_FullCalendar-BQA0OjGB.css.map +0 -1
- package/dist/C_FullCalendar-ChJUosAi.css.map +0 -1
- package/dist/C_Steps-Bk1krgiR.css.map +0 -1
- package/dist/C_Steps-Dn2CMpy1.css.map +0 -1
- package/dist/C_Time-BzyQVvTS.css.map +0 -1
- package/dist/C_Time-DmpKLQHc.css.map +0 -1
- package/dist/themes/glass-morphism.css +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"C_ContextMenu.js","names":[],"sources":["../src/components/C_ContextMenu/types.ts","../src/components/C_ContextMenu/index.vue"],"sourcesContent":["/**\n * @Description: 右键菜单组件类型定义\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\n */\n\n/** 菜单项 */\nexport interface ContextMenuItem {\n /** 唯一标识 */\n key: string\n /** 菜单文字 */\n label: string\n /** 图标(Iconify 图标名) */\n icon?: string\n /** 快捷键标注文字(仅展示,不绑定) */\n shortcut?: string\n /** 是否禁用 */\n disabled?: boolean\n /** 是否隐藏 */\n hidden?: boolean\n /** 分割线(此项渲染为分割线,label 被忽略) */\n divider?: boolean\n /** 子菜单(支持无限嵌套) */\n children?: ContextMenuItem[]\n /** 自定义样式类 */\n className?: string\n /** 危险操作(红色高亮) */\n danger?: boolean\n}\n\n/** 组件 Props */\nexport interface ContextMenuProps {\n /** 菜单项列表 */\n items: ContextMenuItem[]\n /** 菜单最小宽度 */\n minWidth?: number\n /** 菜单最大宽度 */\n maxWidth?: number\n /** 子菜单展开方向 */\n subMenuPlacement?: 'right' | 'left'\n /** 点击菜单项后是否自动关闭 */\n autoClose?: boolean\n /** 是否禁用整个菜单 */\n disabled?: boolean\n /** 自定义 z-index */\n zIndex?: number\n}\n\n/** 默认 Props */\nexport const DEFAULT_CONTEXT_MENU_PROPS = {\n minWidth: 180,\n maxWidth: 280,\n subMenuPlacement: 'right' as const,\n autoClose: true,\n disabled: false,\n zIndex: 9999,\n}\n","<!--\n * @Description: 右键菜单组件 — 声明式配置、快捷键标注、嵌套子菜单\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\n-->\n<template>\n <!-- 遮罩层 -->\n <Teleport to=\"body\">\n <div\n v-if=\"visible\"\n class=\"c-context-menu-overlay\"\n :style=\"{ zIndex: props.zIndex - 1 }\"\n @click=\"close\"\n @contextmenu.prevent=\"close\"\n />\n\n <!-- 菜单面板 -->\n <div\n v-if=\"visible\"\n ref=\"menuRef\"\n class=\"c-context-menu\"\n :style=\"menuStyle\"\n role=\"menu\"\n tabindex=\"-1\"\n @keydown.escape=\"close\"\n >\n <template\n v-for=\"item in visibleItems\"\n :key=\"item.key\"\n >\n <!-- 分割线 -->\n <div\n v-if=\"item.divider\"\n class=\"c-context-menu__divider\"\n role=\"separator\"\n />\n\n <!-- 普通菜单项 -->\n <div\n v-else\n :class=\"[\n 'c-context-menu__item',\n {\n 'is-disabled': item.disabled,\n 'is-danger': item.danger,\n },\n ]\"\n role=\"menuitem\"\n :aria-disabled=\"item.disabled\"\n @click=\"handleItemClick(item)\"\n @mouseenter=\"handleMouseEnter(item)\"\n @mouseleave=\"handleMouseLeave\"\n >\n <!-- 图标 -->\n <span\n v-if=\"item.icon\"\n class=\"c-context-menu__icon\"\n >\n <C_Icon :name=\"item.icon\" />\n </span>\n\n <!-- 文本 -->\n <span class=\"c-context-menu__label\">{{ item.label }}</span>\n\n <!-- 快捷键 -->\n <span\n v-if=\"item.shortcut\"\n class=\"c-context-menu__shortcut\"\n >\n {{ item.shortcut }}\n </span>\n\n <!-- 子菜单箭头 -->\n <span\n v-if=\"item.children?.length\"\n class=\"c-context-menu__arrow\"\n >\n <C_Icon name=\"mdi:chevron-right\" />\n </span>\n\n <!-- 子菜单(递归) -->\n <C_ContextMenu\n v-if=\"item.children?.length && activeSubKey === item.key\"\n :items=\"item.children\"\n :min-width=\"props.minWidth\"\n :max-width=\"props.maxWidth\"\n :sub-menu-placement=\"props.subMenuPlacement\"\n :auto-close=\"props.autoClose\"\n :z-index=\"props.zIndex + 1\"\n class=\"c-context-menu__submenu\"\n :class=\"`is-${props.subMenuPlacement}`\"\n :style=\"{ position: 'absolute' }\"\n @select=\"handleSubSelect\"\n />\n </div>\n </template>\n </div>\n </Teleport>\n</template>\n\n<script setup lang=\"ts\">\n import { computed, nextTick, ref } from 'vue'\n import C_Icon from '../C_Icon/index.vue'\n import {\n DEFAULT_CONTEXT_MENU_PROPS,\n type ContextMenuItem,\n type ContextMenuProps,\n } from './types'\n\n defineOptions({ name: 'C_ContextMenu' })\n\n const props = withDefaults(defineProps<ContextMenuProps>(), {\n items: () => [],\n minWidth: DEFAULT_CONTEXT_MENU_PROPS.minWidth,\n maxWidth: DEFAULT_CONTEXT_MENU_PROPS.maxWidth,\n subMenuPlacement: DEFAULT_CONTEXT_MENU_PROPS.subMenuPlacement,\n autoClose: DEFAULT_CONTEXT_MENU_PROPS.autoClose,\n disabled: DEFAULT_CONTEXT_MENU_PROPS.disabled,\n zIndex: DEFAULT_CONTEXT_MENU_PROPS.zIndex,\n })\n\n const emit = defineEmits<{\n (e: 'select', item: ContextMenuItem): void\n (e: 'open', position: { x: number; y: number }): void\n (e: 'close'): void\n }>()\n\n // ===== 状态 =====\n const visible = ref(false)\n const position = ref({ x: 0, y: 0 })\n const menuRef = ref<HTMLElement>()\n const activeSubKey = ref<string | null>(null)\n\n let subTimer: ReturnType<typeof setTimeout> | null = null\n\n // ===== 可见项 =====\n const visibleItems = computed(() => props.items.filter(item => !item.hidden))\n\n // ===== 菜单定位样式 =====\n const menuStyle = computed(() => ({\n left: `${position.value.x}px`,\n top: `${position.value.y}px`,\n minWidth: `${props.minWidth}px`,\n maxWidth: `${props.maxWidth}px`,\n zIndex: props.zIndex,\n }))\n\n // ===== 边界校正 =====\n const adjustPosition = () => {\n nextTick(() => {\n const el = menuRef.value\n if (!el) return\n const rect = el.getBoundingClientRect()\n const { innerWidth, innerHeight } = window\n\n if (rect.right > innerWidth) {\n position.value.x = innerWidth - rect.width - 8\n }\n if (rect.bottom > innerHeight) {\n position.value.y = innerHeight - rect.height - 8\n }\n if (position.value.x < 0) position.value.x = 8\n if (position.value.y < 0) position.value.y = 8\n })\n }\n\n // ===== 打开/关闭 =====\n const open = (x: number, y: number) => {\n if (props.disabled) return\n position.value = { x, y }\n visible.value = true\n emit('open', { x, y })\n adjustPosition()\n\n // 聚焦以支持 Escape 关闭\n nextTick(() => menuRef.value?.focus())\n }\n\n const close = () => {\n visible.value = false\n activeSubKey.value = null\n emit('close')\n }\n\n // ===== 菜单项点击 =====\n const handleItemClick = (item: ContextMenuItem) => {\n if (item.disabled) return\n if (item.children?.length) return // 有子菜单不触发\n\n emit('select', item)\n if (props.autoClose) close()\n }\n\n // ===== 子菜单悬停 =====\n const handleMouseEnter = (item: ContextMenuItem) => {\n if (subTimer) {\n clearTimeout(subTimer)\n subTimer = null\n }\n if (item.children?.length && !item.disabled) {\n subTimer = setTimeout(() => {\n activeSubKey.value = item.key\n }, 150)\n } else {\n activeSubKey.value = null\n }\n }\n\n const handleMouseLeave = () => {\n if (subTimer) {\n clearTimeout(subTimer)\n subTimer = null\n }\n subTimer = setTimeout(() => {\n activeSubKey.value = null\n }, 300)\n }\n\n // ===== 子菜单选择向上冒泡 =====\n const handleSubSelect = (item: ContextMenuItem) => {\n emit('select', item)\n if (props.autoClose) close()\n }\n\n // ===== 暴露 API =====\n defineExpose({\n /** 在指定坐标打开菜单 */\n open,\n /** 关闭菜单 */\n close,\n /** 当前是否可见 */\n visible: computed(() => visible.value),\n })\n</script>\n\n<style scoped lang=\"scss\">\n @use './index.scss';\n</style>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"C_ContextMenu.js","names":[],"sources":["../src/components/C_ContextMenu/types.ts","../src/components/C_ContextMenu/index.vue","../src/components/C_ContextMenu/index.vue"],"sourcesContent":["/**\n * @Description: 右键菜单组件类型定义\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\n */\n\n/** 菜单项 */\nexport interface ContextMenuItem {\n /** 唯一标识 */\n key: string\n /** 菜单文字 */\n label: string\n /** 图标(Iconify 图标名) */\n icon?: string\n /** 快捷键标注文字(仅展示,不绑定) */\n shortcut?: string\n /** 是否禁用 */\n disabled?: boolean\n /** 是否隐藏 */\n hidden?: boolean\n /** 分割线(此项渲染为分割线,label 被忽略) */\n divider?: boolean\n /** 子菜单(支持无限嵌套) */\n children?: ContextMenuItem[]\n /** 自定义样式类 */\n className?: string\n /** 危险操作(红色高亮) */\n danger?: boolean\n}\n\n/** 组件 Props */\nexport interface ContextMenuProps {\n /** 菜单项列表 */\n items: ContextMenuItem[]\n /** 菜单最小宽度 */\n minWidth?: number\n /** 菜单最大宽度 */\n maxWidth?: number\n /** 子菜单展开方向 */\n subMenuPlacement?: 'right' | 'left'\n /** 点击菜单项后是否自动关闭 */\n autoClose?: boolean\n /** 是否禁用整个菜单 */\n disabled?: boolean\n /** 自定义 z-index */\n zIndex?: number\n}\n\n/** 默认 Props */\nexport const DEFAULT_CONTEXT_MENU_PROPS = {\n minWidth: 180,\n maxWidth: 280,\n subMenuPlacement: 'right' as const,\n autoClose: true,\n disabled: false,\n zIndex: 9999,\n}\n","<!--\n * @Description: 右键菜单组件 — 声明式配置、快捷键标注、嵌套子菜单\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\n-->\n<template>\n <!-- 遮罩层 -->\n <Teleport to=\"body\">\n <div\n v-if=\"visible\"\n class=\"c-context-menu-overlay\"\n :style=\"{ zIndex: props.zIndex - 1 }\"\n @click=\"close\"\n @contextmenu.prevent=\"close\"\n />\n\n <!-- 菜单面板 -->\n <div\n v-if=\"visible\"\n ref=\"menuRef\"\n class=\"c-context-menu\"\n :style=\"menuStyle\"\n role=\"menu\"\n tabindex=\"-1\"\n @keydown.escape=\"close\"\n >\n <template\n v-for=\"item in visibleItems\"\n :key=\"item.key\"\n >\n <!-- 分割线 -->\n <div\n v-if=\"item.divider\"\n class=\"c-context-menu__divider\"\n role=\"separator\"\n />\n\n <!-- 普通菜单项 -->\n <div\n v-else\n :class=\"[\n 'c-context-menu__item',\n {\n 'is-disabled': item.disabled,\n 'is-danger': item.danger,\n },\n ]\"\n role=\"menuitem\"\n :aria-disabled=\"item.disabled\"\n @click=\"handleItemClick(item)\"\n @mouseenter=\"handleMouseEnter(item)\"\n @mouseleave=\"handleMouseLeave\"\n >\n <!-- 图标 -->\n <span\n v-if=\"item.icon\"\n class=\"c-context-menu__icon\"\n >\n <C_Icon :name=\"item.icon\" />\n </span>\n\n <!-- 文本 -->\n <span class=\"c-context-menu__label\">{{ item.label }}</span>\n\n <!-- 快捷键 -->\n <span\n v-if=\"item.shortcut\"\n class=\"c-context-menu__shortcut\"\n >\n {{ item.shortcut }}\n </span>\n\n <!-- 子菜单箭头 -->\n <span\n v-if=\"item.children?.length\"\n class=\"c-context-menu__arrow\"\n >\n <C_Icon name=\"mdi:chevron-right\" />\n </span>\n\n <!-- 子菜单(递归) -->\n <C_ContextMenu\n v-if=\"item.children?.length && activeSubKey === item.key\"\n :items=\"item.children\"\n :min-width=\"props.minWidth\"\n :max-width=\"props.maxWidth\"\n :sub-menu-placement=\"props.subMenuPlacement\"\n :auto-close=\"props.autoClose\"\n :z-index=\"props.zIndex + 1\"\n class=\"c-context-menu__submenu\"\n :class=\"`is-${props.subMenuPlacement}`\"\n :style=\"{ position: 'absolute' }\"\n @select=\"handleSubSelect\"\n />\n </div>\n </template>\n </div>\n </Teleport>\n</template>\n\n<script setup lang=\"ts\">\n import { computed, nextTick, ref } from 'vue'\n import C_Icon from '../C_Icon/index.vue'\n import {\n DEFAULT_CONTEXT_MENU_PROPS,\n type ContextMenuItem,\n type ContextMenuProps,\n } from './types'\n\n defineOptions({ name: 'C_ContextMenu' })\n\n const props = withDefaults(defineProps<ContextMenuProps>(), {\n items: () => [],\n minWidth: DEFAULT_CONTEXT_MENU_PROPS.minWidth,\n maxWidth: DEFAULT_CONTEXT_MENU_PROPS.maxWidth,\n subMenuPlacement: DEFAULT_CONTEXT_MENU_PROPS.subMenuPlacement,\n autoClose: DEFAULT_CONTEXT_MENU_PROPS.autoClose,\n disabled: DEFAULT_CONTEXT_MENU_PROPS.disabled,\n zIndex: DEFAULT_CONTEXT_MENU_PROPS.zIndex,\n })\n\n const emit = defineEmits<{\n (e: 'select', item: ContextMenuItem): void\n (e: 'open', position: { x: number; y: number }): void\n (e: 'close'): void\n }>()\n\n // ===== 状态 =====\n const visible = ref(false)\n const position = ref({ x: 0, y: 0 })\n const menuRef = ref<HTMLElement>()\n const activeSubKey = ref<string | null>(null)\n\n let subTimer: ReturnType<typeof setTimeout> | null = null\n\n // ===== 可见项 =====\n const visibleItems = computed(() => props.items.filter(item => !item.hidden))\n\n // ===== 菜单定位样式 =====\n const menuStyle = computed(() => ({\n left: `${position.value.x}px`,\n top: `${position.value.y}px`,\n minWidth: `${props.minWidth}px`,\n maxWidth: `${props.maxWidth}px`,\n zIndex: props.zIndex,\n }))\n\n // ===== 边界校正 =====\n const adjustPosition = () => {\n nextTick(() => {\n const el = menuRef.value\n if (!el) return\n const rect = el.getBoundingClientRect()\n const { innerWidth, innerHeight } = window\n\n if (rect.right > innerWidth) {\n position.value.x = innerWidth - rect.width - 8\n }\n if (rect.bottom > innerHeight) {\n position.value.y = innerHeight - rect.height - 8\n }\n if (position.value.x < 0) position.value.x = 8\n if (position.value.y < 0) position.value.y = 8\n })\n }\n\n // ===== 打开/关闭 =====\n const open = (x: number, y: number) => {\n if (props.disabled) return\n position.value = { x, y }\n visible.value = true\n emit('open', { x, y })\n adjustPosition()\n\n // 聚焦以支持 Escape 关闭\n nextTick(() => menuRef.value?.focus())\n }\n\n const close = () => {\n visible.value = false\n activeSubKey.value = null\n emit('close')\n }\n\n // ===== 菜单项点击 =====\n const handleItemClick = (item: ContextMenuItem) => {\n if (item.disabled) return\n if (item.children?.length) return // 有子菜单不触发\n\n emit('select', item)\n if (props.autoClose) close()\n }\n\n // ===== 子菜单悬停 =====\n const handleMouseEnter = (item: ContextMenuItem) => {\n if (subTimer) {\n clearTimeout(subTimer)\n subTimer = null\n }\n if (item.children?.length && !item.disabled) {\n subTimer = setTimeout(() => {\n activeSubKey.value = item.key\n }, 150)\n } else {\n activeSubKey.value = null\n }\n }\n\n const handleMouseLeave = () => {\n if (subTimer) {\n clearTimeout(subTimer)\n subTimer = null\n }\n subTimer = setTimeout(() => {\n activeSubKey.value = null\n }, 300)\n }\n\n // ===== 子菜单选择向上冒泡 =====\n const handleSubSelect = (item: ContextMenuItem) => {\n emit('select', item)\n if (props.autoClose) close()\n }\n\n // ===== 暴露 API =====\n defineExpose({\n /** 在指定坐标打开菜单 */\n open,\n /** 关闭菜单 */\n close,\n /** 当前是否可见 */\n visible: computed(() => visible.value),\n })\n</script>\n\n<style scoped lang=\"scss\">\n @use './index.scss';\n</style>\n","<!--\n * @Description: 右键菜单组件 — 声明式配置、快捷键标注、嵌套子菜单\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\n-->\n<template>\n <!-- 遮罩层 -->\n <Teleport to=\"body\">\n <div\n v-if=\"visible\"\n class=\"c-context-menu-overlay\"\n :style=\"{ zIndex: props.zIndex - 1 }\"\n @click=\"close\"\n @contextmenu.prevent=\"close\"\n />\n\n <!-- 菜单面板 -->\n <div\n v-if=\"visible\"\n ref=\"menuRef\"\n class=\"c-context-menu\"\n :style=\"menuStyle\"\n role=\"menu\"\n tabindex=\"-1\"\n @keydown.escape=\"close\"\n >\n <template\n v-for=\"item in visibleItems\"\n :key=\"item.key\"\n >\n <!-- 分割线 -->\n <div\n v-if=\"item.divider\"\n class=\"c-context-menu__divider\"\n role=\"separator\"\n />\n\n <!-- 普通菜单项 -->\n <div\n v-else\n :class=\"[\n 'c-context-menu__item',\n {\n 'is-disabled': item.disabled,\n 'is-danger': item.danger,\n },\n ]\"\n role=\"menuitem\"\n :aria-disabled=\"item.disabled\"\n @click=\"handleItemClick(item)\"\n @mouseenter=\"handleMouseEnter(item)\"\n @mouseleave=\"handleMouseLeave\"\n >\n <!-- 图标 -->\n <span\n v-if=\"item.icon\"\n class=\"c-context-menu__icon\"\n >\n <C_Icon :name=\"item.icon\" />\n </span>\n\n <!-- 文本 -->\n <span class=\"c-context-menu__label\">{{ item.label }}</span>\n\n <!-- 快捷键 -->\n <span\n v-if=\"item.shortcut\"\n class=\"c-context-menu__shortcut\"\n >\n {{ item.shortcut }}\n </span>\n\n <!-- 子菜单箭头 -->\n <span\n v-if=\"item.children?.length\"\n class=\"c-context-menu__arrow\"\n >\n <C_Icon name=\"mdi:chevron-right\" />\n </span>\n\n <!-- 子菜单(递归) -->\n <C_ContextMenu\n v-if=\"item.children?.length && activeSubKey === item.key\"\n :items=\"item.children\"\n :min-width=\"props.minWidth\"\n :max-width=\"props.maxWidth\"\n :sub-menu-placement=\"props.subMenuPlacement\"\n :auto-close=\"props.autoClose\"\n :z-index=\"props.zIndex + 1\"\n class=\"c-context-menu__submenu\"\n :class=\"`is-${props.subMenuPlacement}`\"\n :style=\"{ position: 'absolute' }\"\n @select=\"handleSubSelect\"\n />\n </div>\n </template>\n </div>\n </Teleport>\n</template>\n\n<script setup lang=\"ts\">\n import { computed, nextTick, ref } from 'vue'\n import C_Icon from '../C_Icon/index.vue'\n import {\n DEFAULT_CONTEXT_MENU_PROPS,\n type ContextMenuItem,\n type ContextMenuProps,\n } from './types'\n\n defineOptions({ name: 'C_ContextMenu' })\n\n const props = withDefaults(defineProps<ContextMenuProps>(), {\n items: () => [],\n minWidth: DEFAULT_CONTEXT_MENU_PROPS.minWidth,\n maxWidth: DEFAULT_CONTEXT_MENU_PROPS.maxWidth,\n subMenuPlacement: DEFAULT_CONTEXT_MENU_PROPS.subMenuPlacement,\n autoClose: DEFAULT_CONTEXT_MENU_PROPS.autoClose,\n disabled: DEFAULT_CONTEXT_MENU_PROPS.disabled,\n zIndex: DEFAULT_CONTEXT_MENU_PROPS.zIndex,\n })\n\n const emit = defineEmits<{\n (e: 'select', item: ContextMenuItem): void\n (e: 'open', position: { x: number; y: number }): void\n (e: 'close'): void\n }>()\n\n // ===== 状态 =====\n const visible = ref(false)\n const position = ref({ x: 0, y: 0 })\n const menuRef = ref<HTMLElement>()\n const activeSubKey = ref<string | null>(null)\n\n let subTimer: ReturnType<typeof setTimeout> | null = null\n\n // ===== 可见项 =====\n const visibleItems = computed(() => props.items.filter(item => !item.hidden))\n\n // ===== 菜单定位样式 =====\n const menuStyle = computed(() => ({\n left: `${position.value.x}px`,\n top: `${position.value.y}px`,\n minWidth: `${props.minWidth}px`,\n maxWidth: `${props.maxWidth}px`,\n zIndex: props.zIndex,\n }))\n\n // ===== 边界校正 =====\n const adjustPosition = () => {\n nextTick(() => {\n const el = menuRef.value\n if (!el) return\n const rect = el.getBoundingClientRect()\n const { innerWidth, innerHeight } = window\n\n if (rect.right > innerWidth) {\n position.value.x = innerWidth - rect.width - 8\n }\n if (rect.bottom > innerHeight) {\n position.value.y = innerHeight - rect.height - 8\n }\n if (position.value.x < 0) position.value.x = 8\n if (position.value.y < 0) position.value.y = 8\n })\n }\n\n // ===== 打开/关闭 =====\n const open = (x: number, y: number) => {\n if (props.disabled) return\n position.value = { x, y }\n visible.value = true\n emit('open', { x, y })\n adjustPosition()\n\n // 聚焦以支持 Escape 关闭\n nextTick(() => menuRef.value?.focus())\n }\n\n const close = () => {\n visible.value = false\n activeSubKey.value = null\n emit('close')\n }\n\n // ===== 菜单项点击 =====\n const handleItemClick = (item: ContextMenuItem) => {\n if (item.disabled) return\n if (item.children?.length) return // 有子菜单不触发\n\n emit('select', item)\n if (props.autoClose) close()\n }\n\n // ===== 子菜单悬停 =====\n const handleMouseEnter = (item: ContextMenuItem) => {\n if (subTimer) {\n clearTimeout(subTimer)\n subTimer = null\n }\n if (item.children?.length && !item.disabled) {\n subTimer = setTimeout(() => {\n activeSubKey.value = item.key\n }, 150)\n } else {\n activeSubKey.value = null\n }\n }\n\n const handleMouseLeave = () => {\n if (subTimer) {\n clearTimeout(subTimer)\n subTimer = null\n }\n subTimer = setTimeout(() => {\n activeSubKey.value = null\n }, 300)\n }\n\n // ===== 子菜单选择向上冒泡 =====\n const handleSubSelect = (item: ContextMenuItem) => {\n emit('select', item)\n if (props.autoClose) close()\n }\n\n // ===== 暴露 API =====\n defineExpose({\n /** 在指定坐标打开菜单 */\n open,\n /** 关闭菜单 */\n close,\n /** 当前是否可见 */\n visible: computed(() => visible.value),\n })\n</script>\n\n<style scoped lang=\"scss\">\n @use './index.scss';\n</style>\n"],"mappings":"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"}
|
package/dist/C_ContextMenu2.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{t as e}from"./C_Icon2.js";import{t}from"./export-helper.js";import{Fragment as n,Teleport as r,computed as i,createBlock as a,createCommentVNode as o,createElementBlock as s,createElementVNode as c,createVNode as l,defineComponent as u,nextTick as d,normalizeClass as f,normalizeStyle as p,openBlock as m,ref as h,renderList as g,resolveComponent as _,toDisplayString as v,withKeys as y,withModifiers as b}from"vue";const x={minWidth:180,maxWidth:280,subMenuPlacement:`right`,autoClose:!0,disabled:!1,zIndex:9999},S={key:0,class:`c-context-menu__divider`,role:`separator`},C=[`aria-disabled`,`onClick`,`onMouseenter`],w={key:0,class:`c-context-menu__icon`},T={class:`c-context-menu__label`},E={key:1,class:`c-context-menu__shortcut`},D={key:2,class:`c-context-menu__arrow`};var O=t(u({name:`C_ContextMenu`,__name:`index`,props:{items:{default:()=>[]},minWidth:{default:x.minWidth},maxWidth:{default:x.maxWidth},subMenuPlacement:{default:x.subMenuPlacement},autoClose:{type:Boolean,default:x.autoClose},disabled:{type:Boolean,default:x.disabled},zIndex:{default:x.zIndex}},emits:[`select`,`open`,`close`],setup(t,{expose:u,emit:
|
|
1
|
+
import{t as e}from"./C_Icon2.js";import{t}from"./export-helper.js";import{Fragment as n,Teleport as r,computed as i,createBlock as a,createCommentVNode as o,createElementBlock as s,createElementVNode as c,createVNode as l,defineComponent as u,nextTick as d,normalizeClass as f,normalizeStyle as p,openBlock as m,ref as h,renderList as g,resolveComponent as _,toDisplayString as v,withKeys as y,withModifiers as b}from"vue";const x={minWidth:180,maxWidth:280,subMenuPlacement:`right`,autoClose:!0,disabled:!1,zIndex:9999},S={key:0,class:`c-context-menu__divider`,role:`separator`},C=[`aria-disabled`,`onClick`,`onMouseenter`],w={key:0,class:`c-context-menu__icon`},T={class:`c-context-menu__label`},E={key:1,class:`c-context-menu__shortcut`},D={key:2,class:`c-context-menu__arrow`};var O=t(u({name:`C_ContextMenu`,__name:`index`,props:{items:{default:()=>[]},minWidth:{default:x.minWidth},maxWidth:{default:x.maxWidth},subMenuPlacement:{default:x.subMenuPlacement},autoClose:{type:Boolean,default:x.autoClose},disabled:{type:Boolean,default:x.disabled},zIndex:{default:x.zIndex}},emits:[`select`,`open`,`close`],setup(t,{expose:u,emit:_}){let x=t,k=_,A=h(!1),j=h({x:0,y:0}),M=h(),N=h(null),P=null,F=i(()=>x.items.filter(e=>!e.hidden)),I=i(()=>({left:`${j.value.x}px`,top:`${j.value.y}px`,minWidth:`${x.minWidth}px`,maxWidth:`${x.maxWidth}px`,zIndex:x.zIndex})),L=()=>{d(()=>{let e=M.value;if(!e)return;let t=e.getBoundingClientRect(),{innerWidth:n,innerHeight:r}=window;t.right>n&&(j.value.x=n-t.width-8),t.bottom>r&&(j.value.y=r-t.height-8),j.value.x<0&&(j.value.x=8),j.value.y<0&&(j.value.y=8)})},R=(e,t)=>{x.disabled||(j.value={x:e,y:t},A.value=!0,k(`open`,{x:e,y:t}),L(),d(()=>M.value?.focus()))},z=()=>{A.value=!1,N.value=null,k(`close`)},B=e=>{e.disabled||e.children?.length||(k(`select`,e),x.autoClose&&z())},V=e=>{P&&=(clearTimeout(P),null),e.children?.length&&!e.disabled?P=setTimeout(()=>{N.value=e.key},150):N.value=null},H=()=>{P&&=(clearTimeout(P),null),P=setTimeout(()=>{N.value=null},300)},U=e=>{k(`select`,e),x.autoClose&&z()};return u({open:R,close:z,visible:i(()=>A.value)}),(t,i)=>{let u=O;return m(),s(n,null,[o(` 遮罩层 `),(m(),a(r,{to:`body`},[A.value?(m(),s(`div`,{key:0,class:`c-context-menu-overlay`,style:p({zIndex:x.zIndex-1}),onClick:z,onContextmenu:b(z,[`prevent`])},null,36)):o(`v-if`,!0),o(` 菜单面板 `),A.value?(m(),s(`div`,{key:1,ref_key:`menuRef`,ref:M,class:`c-context-menu`,style:p(I.value),role:`menu`,tabindex:`-1`,onKeydown:y(z,[`escape`])},[(m(!0),s(n,null,g(F.value,t=>(m(),s(n,{key:t.key},[o(` 分割线 `),t.divider?(m(),s(`div`,S)):(m(),s(n,{key:1},[o(` 普通菜单项 `),c(`div`,{class:f([`c-context-menu__item`,{"is-disabled":t.disabled,"is-danger":t.danger}]),role:`menuitem`,"aria-disabled":t.disabled,onClick:e=>B(t),onMouseenter:e=>V(t),onMouseleave:H},[o(` 图标 `),t.icon?(m(),s(`span`,w,[l(e,{name:t.icon},null,8,[`name`])])):o(`v-if`,!0),o(` 文本 `),c(`span`,T,v(t.label),1),o(` 快捷键 `),t.shortcut?(m(),s(`span`,E,v(t.shortcut),1)):o(`v-if`,!0),o(` 子菜单箭头 `),t.children?.length?(m(),s(`span`,D,[l(e,{name:`mdi:chevron-right`})])):o(`v-if`,!0),o(` 子菜单(递归) `),t.children?.length&&N.value===t.key?(m(),a(u,{key:3,items:t.children,"min-width":x.minWidth,"max-width":x.maxWidth,"sub-menu-placement":x.subMenuPlacement,"auto-close":x.autoClose,"z-index":x.zIndex+1,class:f([`c-context-menu__submenu`,`is-${x.subMenuPlacement}`]),style:{position:`absolute`},onSelect:U},null,8,[`items`,`min-width`,`max-width`,`sub-menu-placement`,`auto-close`,`z-index`,`class`])):o(`v-if`,!0)],42,C)],2112))],64))),128))],36)):o(`v-if`,!0)]))],2112)}}}),[[`__scopeId`,`data-v-f2de30a3`]]);export{x as n,O as t};
|
|
2
2
|
//# sourceMappingURL=C_ContextMenu2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"C_ContextMenu2.js","names":[],"sources":["../src/components/C_ContextMenu/types.ts","../src/components/C_ContextMenu/index.vue"],"sourcesContent":["/**\n * @Description: 右键菜单组件类型定义\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\n */\n\n/** 菜单项 */\nexport interface ContextMenuItem {\n /** 唯一标识 */\n key: string\n /** 菜单文字 */\n label: string\n /** 图标(Iconify 图标名) */\n icon?: string\n /** 快捷键标注文字(仅展示,不绑定) */\n shortcut?: string\n /** 是否禁用 */\n disabled?: boolean\n /** 是否隐藏 */\n hidden?: boolean\n /** 分割线(此项渲染为分割线,label 被忽略) */\n divider?: boolean\n /** 子菜单(支持无限嵌套) */\n children?: ContextMenuItem[]\n /** 自定义样式类 */\n className?: string\n /** 危险操作(红色高亮) */\n danger?: boolean\n}\n\n/** 组件 Props */\nexport interface ContextMenuProps {\n /** 菜单项列表 */\n items: ContextMenuItem[]\n /** 菜单最小宽度 */\n minWidth?: number\n /** 菜单最大宽度 */\n maxWidth?: number\n /** 子菜单展开方向 */\n subMenuPlacement?: 'right' | 'left'\n /** 点击菜单项后是否自动关闭 */\n autoClose?: boolean\n /** 是否禁用整个菜单 */\n disabled?: boolean\n /** 自定义 z-index */\n zIndex?: number\n}\n\n/** 默认 Props */\nexport const DEFAULT_CONTEXT_MENU_PROPS = {\n minWidth: 180,\n maxWidth: 280,\n subMenuPlacement: 'right' as const,\n autoClose: true,\n disabled: false,\n zIndex: 9999,\n}\n","<!--\n * @Description: 右键菜单组件 — 声明式配置、快捷键标注、嵌套子菜单\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\n-->\n<template>\n <!-- 遮罩层 -->\n <Teleport to=\"body\">\n <div\n v-if=\"visible\"\n class=\"c-context-menu-overlay\"\n :style=\"{ zIndex: props.zIndex - 1 }\"\n @click=\"close\"\n @contextmenu.prevent=\"close\"\n />\n\n <!-- 菜单面板 -->\n <div\n v-if=\"visible\"\n ref=\"menuRef\"\n class=\"c-context-menu\"\n :style=\"menuStyle\"\n role=\"menu\"\n tabindex=\"-1\"\n @keydown.escape=\"close\"\n >\n <template\n v-for=\"item in visibleItems\"\n :key=\"item.key\"\n >\n <!-- 分割线 -->\n <div\n v-if=\"item.divider\"\n class=\"c-context-menu__divider\"\n role=\"separator\"\n />\n\n <!-- 普通菜单项 -->\n <div\n v-else\n :class=\"[\n 'c-context-menu__item',\n {\n 'is-disabled': item.disabled,\n 'is-danger': item.danger,\n },\n ]\"\n role=\"menuitem\"\n :aria-disabled=\"item.disabled\"\n @click=\"handleItemClick(item)\"\n @mouseenter=\"handleMouseEnter(item)\"\n @mouseleave=\"handleMouseLeave\"\n >\n <!-- 图标 -->\n <span\n v-if=\"item.icon\"\n class=\"c-context-menu__icon\"\n >\n <C_Icon :name=\"item.icon\" />\n </span>\n\n <!-- 文本 -->\n <span class=\"c-context-menu__label\">{{ item.label }}</span>\n\n <!-- 快捷键 -->\n <span\n v-if=\"item.shortcut\"\n class=\"c-context-menu__shortcut\"\n >\n {{ item.shortcut }}\n </span>\n\n <!-- 子菜单箭头 -->\n <span\n v-if=\"item.children?.length\"\n class=\"c-context-menu__arrow\"\n >\n <C_Icon name=\"mdi:chevron-right\" />\n </span>\n\n <!-- 子菜单(递归) -->\n <C_ContextMenu\n v-if=\"item.children?.length && activeSubKey === item.key\"\n :items=\"item.children\"\n :min-width=\"props.minWidth\"\n :max-width=\"props.maxWidth\"\n :sub-menu-placement=\"props.subMenuPlacement\"\n :auto-close=\"props.autoClose\"\n :z-index=\"props.zIndex + 1\"\n class=\"c-context-menu__submenu\"\n :class=\"`is-${props.subMenuPlacement}`\"\n :style=\"{ position: 'absolute' }\"\n @select=\"handleSubSelect\"\n />\n </div>\n </template>\n </div>\n </Teleport>\n</template>\n\n<script setup lang=\"ts\">\n import { computed, nextTick, ref } from 'vue'\n import C_Icon from '../C_Icon/index.vue'\n import {\n DEFAULT_CONTEXT_MENU_PROPS,\n type ContextMenuItem,\n type ContextMenuProps,\n } from './types'\n\n defineOptions({ name: 'C_ContextMenu' })\n\n const props = withDefaults(defineProps<ContextMenuProps>(), {\n items: () => [],\n minWidth: DEFAULT_CONTEXT_MENU_PROPS.minWidth,\n maxWidth: DEFAULT_CONTEXT_MENU_PROPS.maxWidth,\n subMenuPlacement: DEFAULT_CONTEXT_MENU_PROPS.subMenuPlacement,\n autoClose: DEFAULT_CONTEXT_MENU_PROPS.autoClose,\n disabled: DEFAULT_CONTEXT_MENU_PROPS.disabled,\n zIndex: DEFAULT_CONTEXT_MENU_PROPS.zIndex,\n })\n\n const emit = defineEmits<{\n (e: 'select', item: ContextMenuItem): void\n (e: 'open', position: { x: number; y: number }): void\n (e: 'close'): void\n }>()\n\n // ===== 状态 =====\n const visible = ref(false)\n const position = ref({ x: 0, y: 0 })\n const menuRef = ref<HTMLElement>()\n const activeSubKey = ref<string | null>(null)\n\n let subTimer: ReturnType<typeof setTimeout> | null = null\n\n // ===== 可见项 =====\n const visibleItems = computed(() => props.items.filter(item => !item.hidden))\n\n // ===== 菜单定位样式 =====\n const menuStyle = computed(() => ({\n left: `${position.value.x}px`,\n top: `${position.value.y}px`,\n minWidth: `${props.minWidth}px`,\n maxWidth: `${props.maxWidth}px`,\n zIndex: props.zIndex,\n }))\n\n // ===== 边界校正 =====\n const adjustPosition = () => {\n nextTick(() => {\n const el = menuRef.value\n if (!el) return\n const rect = el.getBoundingClientRect()\n const { innerWidth, innerHeight } = window\n\n if (rect.right > innerWidth) {\n position.value.x = innerWidth - rect.width - 8\n }\n if (rect.bottom > innerHeight) {\n position.value.y = innerHeight - rect.height - 8\n }\n if (position.value.x < 0) position.value.x = 8\n if (position.value.y < 0) position.value.y = 8\n })\n }\n\n // ===== 打开/关闭 =====\n const open = (x: number, y: number) => {\n if (props.disabled) return\n position.value = { x, y }\n visible.value = true\n emit('open', { x, y })\n adjustPosition()\n\n // 聚焦以支持 Escape 关闭\n nextTick(() => menuRef.value?.focus())\n }\n\n const close = () => {\n visible.value = false\n activeSubKey.value = null\n emit('close')\n }\n\n // ===== 菜单项点击 =====\n const handleItemClick = (item: ContextMenuItem) => {\n if (item.disabled) return\n if (item.children?.length) return // 有子菜单不触发\n\n emit('select', item)\n if (props.autoClose) close()\n }\n\n // ===== 子菜单悬停 =====\n const handleMouseEnter = (item: ContextMenuItem) => {\n if (subTimer) {\n clearTimeout(subTimer)\n subTimer = null\n }\n if (item.children?.length && !item.disabled) {\n subTimer = setTimeout(() => {\n activeSubKey.value = item.key\n }, 150)\n } else {\n activeSubKey.value = null\n }\n }\n\n const handleMouseLeave = () => {\n if (subTimer) {\n clearTimeout(subTimer)\n subTimer = null\n }\n subTimer = setTimeout(() => {\n activeSubKey.value = null\n }, 300)\n }\n\n // ===== 子菜单选择向上冒泡 =====\n const handleSubSelect = (item: ContextMenuItem) => {\n emit('select', item)\n if (props.autoClose) close()\n }\n\n // ===== 暴露 API =====\n defineExpose({\n /** 在指定坐标打开菜单 */\n open,\n /** 关闭菜单 */\n close,\n /** 当前是否可见 */\n visible: computed(() => visible.value),\n })\n</script>\n\n<style scoped lang=\"scss\">\n @use './index.scss';\n</style>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"C_ContextMenu2.js","names":[],"sources":["../src/components/C_ContextMenu/types.ts","../src/components/C_ContextMenu/index.vue","../src/components/C_ContextMenu/index.vue"],"sourcesContent":["/**\n * @Description: 右键菜单组件类型定义\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\n */\n\n/** 菜单项 */\nexport interface ContextMenuItem {\n /** 唯一标识 */\n key: string\n /** 菜单文字 */\n label: string\n /** 图标(Iconify 图标名) */\n icon?: string\n /** 快捷键标注文字(仅展示,不绑定) */\n shortcut?: string\n /** 是否禁用 */\n disabled?: boolean\n /** 是否隐藏 */\n hidden?: boolean\n /** 分割线(此项渲染为分割线,label 被忽略) */\n divider?: boolean\n /** 子菜单(支持无限嵌套) */\n children?: ContextMenuItem[]\n /** 自定义样式类 */\n className?: string\n /** 危险操作(红色高亮) */\n danger?: boolean\n}\n\n/** 组件 Props */\nexport interface ContextMenuProps {\n /** 菜单项列表 */\n items: ContextMenuItem[]\n /** 菜单最小宽度 */\n minWidth?: number\n /** 菜单最大宽度 */\n maxWidth?: number\n /** 子菜单展开方向 */\n subMenuPlacement?: 'right' | 'left'\n /** 点击菜单项后是否自动关闭 */\n autoClose?: boolean\n /** 是否禁用整个菜单 */\n disabled?: boolean\n /** 自定义 z-index */\n zIndex?: number\n}\n\n/** 默认 Props */\nexport const DEFAULT_CONTEXT_MENU_PROPS = {\n minWidth: 180,\n maxWidth: 280,\n subMenuPlacement: 'right' as const,\n autoClose: true,\n disabled: false,\n zIndex: 9999,\n}\n","<!--\n * @Description: 右键菜单组件 — 声明式配置、快捷键标注、嵌套子菜单\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\n-->\n<template>\n <!-- 遮罩层 -->\n <Teleport to=\"body\">\n <div\n v-if=\"visible\"\n class=\"c-context-menu-overlay\"\n :style=\"{ zIndex: props.zIndex - 1 }\"\n @click=\"close\"\n @contextmenu.prevent=\"close\"\n />\n\n <!-- 菜单面板 -->\n <div\n v-if=\"visible\"\n ref=\"menuRef\"\n class=\"c-context-menu\"\n :style=\"menuStyle\"\n role=\"menu\"\n tabindex=\"-1\"\n @keydown.escape=\"close\"\n >\n <template\n v-for=\"item in visibleItems\"\n :key=\"item.key\"\n >\n <!-- 分割线 -->\n <div\n v-if=\"item.divider\"\n class=\"c-context-menu__divider\"\n role=\"separator\"\n />\n\n <!-- 普通菜单项 -->\n <div\n v-else\n :class=\"[\n 'c-context-menu__item',\n {\n 'is-disabled': item.disabled,\n 'is-danger': item.danger,\n },\n ]\"\n role=\"menuitem\"\n :aria-disabled=\"item.disabled\"\n @click=\"handleItemClick(item)\"\n @mouseenter=\"handleMouseEnter(item)\"\n @mouseleave=\"handleMouseLeave\"\n >\n <!-- 图标 -->\n <span\n v-if=\"item.icon\"\n class=\"c-context-menu__icon\"\n >\n <C_Icon :name=\"item.icon\" />\n </span>\n\n <!-- 文本 -->\n <span class=\"c-context-menu__label\">{{ item.label }}</span>\n\n <!-- 快捷键 -->\n <span\n v-if=\"item.shortcut\"\n class=\"c-context-menu__shortcut\"\n >\n {{ item.shortcut }}\n </span>\n\n <!-- 子菜单箭头 -->\n <span\n v-if=\"item.children?.length\"\n class=\"c-context-menu__arrow\"\n >\n <C_Icon name=\"mdi:chevron-right\" />\n </span>\n\n <!-- 子菜单(递归) -->\n <C_ContextMenu\n v-if=\"item.children?.length && activeSubKey === item.key\"\n :items=\"item.children\"\n :min-width=\"props.minWidth\"\n :max-width=\"props.maxWidth\"\n :sub-menu-placement=\"props.subMenuPlacement\"\n :auto-close=\"props.autoClose\"\n :z-index=\"props.zIndex + 1\"\n class=\"c-context-menu__submenu\"\n :class=\"`is-${props.subMenuPlacement}`\"\n :style=\"{ position: 'absolute' }\"\n @select=\"handleSubSelect\"\n />\n </div>\n </template>\n </div>\n </Teleport>\n</template>\n\n<script setup lang=\"ts\">\n import { computed, nextTick, ref } from 'vue'\n import C_Icon from '../C_Icon/index.vue'\n import {\n DEFAULT_CONTEXT_MENU_PROPS,\n type ContextMenuItem,\n type ContextMenuProps,\n } from './types'\n\n defineOptions({ name: 'C_ContextMenu' })\n\n const props = withDefaults(defineProps<ContextMenuProps>(), {\n items: () => [],\n minWidth: DEFAULT_CONTEXT_MENU_PROPS.minWidth,\n maxWidth: DEFAULT_CONTEXT_MENU_PROPS.maxWidth,\n subMenuPlacement: DEFAULT_CONTEXT_MENU_PROPS.subMenuPlacement,\n autoClose: DEFAULT_CONTEXT_MENU_PROPS.autoClose,\n disabled: DEFAULT_CONTEXT_MENU_PROPS.disabled,\n zIndex: DEFAULT_CONTEXT_MENU_PROPS.zIndex,\n })\n\n const emit = defineEmits<{\n (e: 'select', item: ContextMenuItem): void\n (e: 'open', position: { x: number; y: number }): void\n (e: 'close'): void\n }>()\n\n // ===== 状态 =====\n const visible = ref(false)\n const position = ref({ x: 0, y: 0 })\n const menuRef = ref<HTMLElement>()\n const activeSubKey = ref<string | null>(null)\n\n let subTimer: ReturnType<typeof setTimeout> | null = null\n\n // ===== 可见项 =====\n const visibleItems = computed(() => props.items.filter(item => !item.hidden))\n\n // ===== 菜单定位样式 =====\n const menuStyle = computed(() => ({\n left: `${position.value.x}px`,\n top: `${position.value.y}px`,\n minWidth: `${props.minWidth}px`,\n maxWidth: `${props.maxWidth}px`,\n zIndex: props.zIndex,\n }))\n\n // ===== 边界校正 =====\n const adjustPosition = () => {\n nextTick(() => {\n const el = menuRef.value\n if (!el) return\n const rect = el.getBoundingClientRect()\n const { innerWidth, innerHeight } = window\n\n if (rect.right > innerWidth) {\n position.value.x = innerWidth - rect.width - 8\n }\n if (rect.bottom > innerHeight) {\n position.value.y = innerHeight - rect.height - 8\n }\n if (position.value.x < 0) position.value.x = 8\n if (position.value.y < 0) position.value.y = 8\n })\n }\n\n // ===== 打开/关闭 =====\n const open = (x: number, y: number) => {\n if (props.disabled) return\n position.value = { x, y }\n visible.value = true\n emit('open', { x, y })\n adjustPosition()\n\n // 聚焦以支持 Escape 关闭\n nextTick(() => menuRef.value?.focus())\n }\n\n const close = () => {\n visible.value = false\n activeSubKey.value = null\n emit('close')\n }\n\n // ===== 菜单项点击 =====\n const handleItemClick = (item: ContextMenuItem) => {\n if (item.disabled) return\n if (item.children?.length) return // 有子菜单不触发\n\n emit('select', item)\n if (props.autoClose) close()\n }\n\n // ===== 子菜单悬停 =====\n const handleMouseEnter = (item: ContextMenuItem) => {\n if (subTimer) {\n clearTimeout(subTimer)\n subTimer = null\n }\n if (item.children?.length && !item.disabled) {\n subTimer = setTimeout(() => {\n activeSubKey.value = item.key\n }, 150)\n } else {\n activeSubKey.value = null\n }\n }\n\n const handleMouseLeave = () => {\n if (subTimer) {\n clearTimeout(subTimer)\n subTimer = null\n }\n subTimer = setTimeout(() => {\n activeSubKey.value = null\n }, 300)\n }\n\n // ===== 子菜单选择向上冒泡 =====\n const handleSubSelect = (item: ContextMenuItem) => {\n emit('select', item)\n if (props.autoClose) close()\n }\n\n // ===== 暴露 API =====\n defineExpose({\n /** 在指定坐标打开菜单 */\n open,\n /** 关闭菜单 */\n close,\n /** 当前是否可见 */\n visible: computed(() => visible.value),\n })\n</script>\n\n<style scoped lang=\"scss\">\n @use './index.scss';\n</style>\n","<!--\n * @Description: 右键菜单组件 — 声明式配置、快捷键标注、嵌套子菜单\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\n-->\n<template>\n <!-- 遮罩层 -->\n <Teleport to=\"body\">\n <div\n v-if=\"visible\"\n class=\"c-context-menu-overlay\"\n :style=\"{ zIndex: props.zIndex - 1 }\"\n @click=\"close\"\n @contextmenu.prevent=\"close\"\n />\n\n <!-- 菜单面板 -->\n <div\n v-if=\"visible\"\n ref=\"menuRef\"\n class=\"c-context-menu\"\n :style=\"menuStyle\"\n role=\"menu\"\n tabindex=\"-1\"\n @keydown.escape=\"close\"\n >\n <template\n v-for=\"item in visibleItems\"\n :key=\"item.key\"\n >\n <!-- 分割线 -->\n <div\n v-if=\"item.divider\"\n class=\"c-context-menu__divider\"\n role=\"separator\"\n />\n\n <!-- 普通菜单项 -->\n <div\n v-else\n :class=\"[\n 'c-context-menu__item',\n {\n 'is-disabled': item.disabled,\n 'is-danger': item.danger,\n },\n ]\"\n role=\"menuitem\"\n :aria-disabled=\"item.disabled\"\n @click=\"handleItemClick(item)\"\n @mouseenter=\"handleMouseEnter(item)\"\n @mouseleave=\"handleMouseLeave\"\n >\n <!-- 图标 -->\n <span\n v-if=\"item.icon\"\n class=\"c-context-menu__icon\"\n >\n <C_Icon :name=\"item.icon\" />\n </span>\n\n <!-- 文本 -->\n <span class=\"c-context-menu__label\">{{ item.label }}</span>\n\n <!-- 快捷键 -->\n <span\n v-if=\"item.shortcut\"\n class=\"c-context-menu__shortcut\"\n >\n {{ item.shortcut }}\n </span>\n\n <!-- 子菜单箭头 -->\n <span\n v-if=\"item.children?.length\"\n class=\"c-context-menu__arrow\"\n >\n <C_Icon name=\"mdi:chevron-right\" />\n </span>\n\n <!-- 子菜单(递归) -->\n <C_ContextMenu\n v-if=\"item.children?.length && activeSubKey === item.key\"\n :items=\"item.children\"\n :min-width=\"props.minWidth\"\n :max-width=\"props.maxWidth\"\n :sub-menu-placement=\"props.subMenuPlacement\"\n :auto-close=\"props.autoClose\"\n :z-index=\"props.zIndex + 1\"\n class=\"c-context-menu__submenu\"\n :class=\"`is-${props.subMenuPlacement}`\"\n :style=\"{ position: 'absolute' }\"\n @select=\"handleSubSelect\"\n />\n </div>\n </template>\n </div>\n </Teleport>\n</template>\n\n<script setup lang=\"ts\">\n import { computed, nextTick, ref } from 'vue'\n import C_Icon from '../C_Icon/index.vue'\n import {\n DEFAULT_CONTEXT_MENU_PROPS,\n type ContextMenuItem,\n type ContextMenuProps,\n } from './types'\n\n defineOptions({ name: 'C_ContextMenu' })\n\n const props = withDefaults(defineProps<ContextMenuProps>(), {\n items: () => [],\n minWidth: DEFAULT_CONTEXT_MENU_PROPS.minWidth,\n maxWidth: DEFAULT_CONTEXT_MENU_PROPS.maxWidth,\n subMenuPlacement: DEFAULT_CONTEXT_MENU_PROPS.subMenuPlacement,\n autoClose: DEFAULT_CONTEXT_MENU_PROPS.autoClose,\n disabled: DEFAULT_CONTEXT_MENU_PROPS.disabled,\n zIndex: DEFAULT_CONTEXT_MENU_PROPS.zIndex,\n })\n\n const emit = defineEmits<{\n (e: 'select', item: ContextMenuItem): void\n (e: 'open', position: { x: number; y: number }): void\n (e: 'close'): void\n }>()\n\n // ===== 状态 =====\n const visible = ref(false)\n const position = ref({ x: 0, y: 0 })\n const menuRef = ref<HTMLElement>()\n const activeSubKey = ref<string | null>(null)\n\n let subTimer: ReturnType<typeof setTimeout> | null = null\n\n // ===== 可见项 =====\n const visibleItems = computed(() => props.items.filter(item => !item.hidden))\n\n // ===== 菜单定位样式 =====\n const menuStyle = computed(() => ({\n left: `${position.value.x}px`,\n top: `${position.value.y}px`,\n minWidth: `${props.minWidth}px`,\n maxWidth: `${props.maxWidth}px`,\n zIndex: props.zIndex,\n }))\n\n // ===== 边界校正 =====\n const adjustPosition = () => {\n nextTick(() => {\n const el = menuRef.value\n if (!el) return\n const rect = el.getBoundingClientRect()\n const { innerWidth, innerHeight } = window\n\n if (rect.right > innerWidth) {\n position.value.x = innerWidth - rect.width - 8\n }\n if (rect.bottom > innerHeight) {\n position.value.y = innerHeight - rect.height - 8\n }\n if (position.value.x < 0) position.value.x = 8\n if (position.value.y < 0) position.value.y = 8\n })\n }\n\n // ===== 打开/关闭 =====\n const open = (x: number, y: number) => {\n if (props.disabled) return\n position.value = { x, y }\n visible.value = true\n emit('open', { x, y })\n adjustPosition()\n\n // 聚焦以支持 Escape 关闭\n nextTick(() => menuRef.value?.focus())\n }\n\n const close = () => {\n visible.value = false\n activeSubKey.value = null\n emit('close')\n }\n\n // ===== 菜单项点击 =====\n const handleItemClick = (item: ContextMenuItem) => {\n if (item.disabled) return\n if (item.children?.length) return // 有子菜单不触发\n\n emit('select', item)\n if (props.autoClose) close()\n }\n\n // ===== 子菜单悬停 =====\n const handleMouseEnter = (item: ContextMenuItem) => {\n if (subTimer) {\n clearTimeout(subTimer)\n subTimer = null\n }\n if (item.children?.length && !item.disabled) {\n subTimer = setTimeout(() => {\n activeSubKey.value = item.key\n }, 150)\n } else {\n activeSubKey.value = null\n }\n }\n\n const handleMouseLeave = () => {\n if (subTimer) {\n clearTimeout(subTimer)\n subTimer = null\n }\n subTimer = setTimeout(() => {\n activeSubKey.value = null\n }, 300)\n }\n\n // ===== 子菜单选择向上冒泡 =====\n const handleSubSelect = (item: ContextMenuItem) => {\n emit('select', item)\n if (props.autoClose) close()\n }\n\n // ===== 暴露 API =====\n defineExpose({\n /** 在指定坐标打开菜单 */\n open,\n /** 关闭菜单 */\n close,\n /** 当前是否可见 */\n visible: computed(() => visible.value),\n })\n</script>\n\n<style scoped lang=\"scss\">\n @use './index.scss';\n</style>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"C_Cron-
|
|
1
|
+
{"version":3,"file":"C_Cron-BIQ2By9v.css","names":[],"sources":["../src/components/C_Cron/components/CronFieldEditor.vue?vue&type=style&index=0&scoped=e6fa8e5b&lang.scss","../src/components/C_Cron/components/CronPreview.vue?vue&type=style&index=0&scoped=a695bb32&lang.scss","../src/components/C_Cron/components/CronTemplates.vue?vue&type=style&index=0&scoped=fe320f38&lang.scss","../src/components/C_Cron/index.vue?vue&type=style&index=0&scoped=06e7be26&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled */.cron-field-editor__grid[data-v-e6fa8e5b] {\n display: grid;\n grid-template-columns: repeat(var(--cols, 10), 1fr);\n gap: 4px;\n}\n.cron-field-editor__cell[data-v-e6fa8e5b] {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 34px;\n border-radius: 6px;\n font-size: 13px;\n font-variant-numeric: tabular-nums;\n transition: all var(--c-transition, 0.2s ease);\n user-select: none;\n color: var(--c-text-2);\n /* 非交互高亮(every / range / step 的视觉反馈) */\n /* 可交互模式(specific) */\n}\n.cron-field-editor__cell--on[data-v-e6fa8e5b]:not(.cron-field-editor__cell--pick) {\n background: color-mix(in srgb, var(--c-primary) 12%, transparent);\n color: var(--c-primary);\n}\n.cron-field-editor__cell--pick[data-v-e6fa8e5b] {\n cursor: pointer;\n}\n.cron-field-editor__cell--pick[data-v-e6fa8e5b]:hover:not(.cron-field-editor__cell--on) {\n background: var(--c-bg-card);\n}\n.cron-field-editor__cell--pick.cron-field-editor__cell--on[data-v-e6fa8e5b] {\n background: var(--c-primary);\n color: #fff;\n font-weight: 600;\n}","/* unplugin-vue-components disabled */.cron-preview__header[data-v-a695bb32] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-weight: 600;\n font-size: 13px;\n margin-bottom: 6px;\n color: var(--c-text-1);\n}\n.cron-preview__list[data-v-a695bb32] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n.cron-preview__item[data-v-a695bb32] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 3px 4px;\n border-radius: 4px;\n font-size: 12px;\n transition: background var(--c-transition, 0.2s ease);\n}\n.cron-preview__item[data-v-a695bb32]:hover {\n background: var(--c-bg-card);\n}\n.cron-preview__idx[data-v-a695bb32] {\n width: 16px;\n text-align: center;\n color: var(--c-text-4);\n flex-shrink: 0;\n font-size: 11px;\n}\n.cron-preview__date[data-v-a695bb32] {\n font-family: \"Courier New\", Courier, monospace;\n flex: 1;\n font-size: 12px;\n}\n.cron-preview__week[data-v-a695bb32] {\n color: var(--c-text-4);\n font-size: 12px;\n flex-shrink: 0;\n}","/* unplugin-vue-components disabled */.cron-templates__header[data-v-fe320f38] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-weight: 600;\n font-size: 13px;\n margin-bottom: 10px;\n color: var(--c-text-1);\n}\n.cron-templates__cards[data-v-fe320f38] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));\n gap: 8px;\n}\n.cron-templates__card[data-v-fe320f38] {\n padding: 10px 12px;\n border-radius: 8px;\n border: 1px solid var(--c-border);\n cursor: pointer;\n transition: all var(--c-transition, 0.2s ease);\n}\n.cron-templates__card[data-v-fe320f38]:hover {\n border-color: var(--c-primary);\n background: color-mix(in srgb, var(--c-primary) 4%, transparent);\n}\n.cron-templates__card--active[data-v-fe320f38] {\n border-color: var(--c-primary);\n background: color-mix(in srgb, var(--c-primary) 8%, transparent);\n}\n.cron-templates__card-name[data-v-fe320f38] {\n font-size: 13px;\n font-weight: 500;\n line-height: 1.4;\n}\n.cron-templates__card-expr[data-v-fe320f38] {\n font-family: \"Courier New\", Courier, monospace;\n font-size: 11px;\n color: var(--c-text-4);\n margin-top: 2px;\n}","/* unplugin-vue-components disabled *//* Cron 表达式编辑器 - 组件级全局样式 */\n.c-cron[data-v-06e7be26] {\n padding: 20px;\n border-radius: 10px;\n border: 1px solid var(--c-border);\n background: var(--c-bg-card);\n /* ═══════ 顶部 ═══════ */\n /* ─── 分段式字段选择器 ──────────────────── */\n /* ─── 表达式行 ─────────────────────────── */\n /* ═══════ 主内容 ═══════ */\n /* ─── 右侧控制面板 ────────────────────── */\n /* ═══════ 底部模板 ═══════ */\n}\n.c-cron__header[data-v-06e7be26] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding-bottom: 16px;\n border-bottom: 1px solid var(--c-border);\n margin-bottom: 16px;\n}\n.c-cron__title-row[data-v-06e7be26] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n.c-cron__title[data-v-06e7be26] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-weight: 600;\n font-size: 15px;\n}\n.c-cron__segments[data-v-06e7be26] {\n display: flex;\n gap: 2px;\n padding: 3px;\n border-radius: 10px;\n background: var(--c-bg);\n}\n.c-cron__segment[data-v-06e7be26] {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 8px 6px 5px;\n border-radius: 8px;\n cursor: pointer;\n transition: all var(--c-transition, 0.2s ease);\n user-select: none;\n min-width: 0;\n}\n.c-cron__segment[data-v-06e7be26]:not(.c-cron__segment--active):hover {\n background: color-mix(in srgb, var(--c-bg-card) 60%, transparent);\n}\n.c-cron__segment--active[data-v-06e7be26] {\n background: var(--c-bg-card);\n box-shadow: 0 1px 4px rgba(0, 0, 0, 0.08);\n}\n.c-cron__segment--active .c-cron__segment-value[data-v-06e7be26] {\n color: var(--c-primary);\n}\n.c-cron__segment--wildcard:not(.c-cron__segment--active) .c-cron__segment-value[data-v-06e7be26] {\n opacity: 0.35;\n}\n.c-cron__segment-value[data-v-06e7be26] {\n font-family: \"Courier New\", Courier, monospace;\n font-size: 15px;\n font-weight: 700;\n line-height: 1.3;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-align: center;\n}\n.c-cron__segment-label[data-v-06e7be26] {\n font-size: 11px;\n color: var(--c-text-4);\n margin-top: 2px;\n}\n.c-cron__expr-row[data-v-06e7be26] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.c-cron__expr-input[data-v-06e7be26] {\n width: 240px;\n flex-shrink: 0;\n}\n.c-cron__expr-desc[data-v-06e7be26] {\n flex: 1;\n font-size: 13px;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.c-cron__description[data-v-06e7be26] {\n color: var(--c-text-2);\n}\n.c-cron__error[data-v-06e7be26] {\n color: var(--error-color);\n}\n.c-cron__body[data-v-06e7be26] {\n display: flex;\n gap: 24px;\n}\n.c-cron__main[data-v-06e7be26] {\n flex: 1;\n min-width: 0;\n}\n.c-cron__panel[data-v-06e7be26] {\n width: 260px;\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n.c-cron__config[data-v-06e7be26] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n.c-cron__config-row[data-v-06e7be26] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n color: var(--c-text-2);\n flex-wrap: wrap;\n}\n.c-cron__config-num[data-v-06e7be26] {\n width: 68px;\n}\n.c-cron__quick[data-v-06e7be26] {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 13px;\n}\n.c-cron__quick a[data-v-06e7be26] {\n color: var(--c-primary);\n cursor: pointer;\n user-select: none;\n}\n.c-cron__quick a[data-v-06e7be26]:hover {\n text-decoration: underline;\n}\n.c-cron__quick-sep[data-v-06e7be26] {\n color: var(--c-text-4);\n}\n.c-cron__quick-count[data-v-06e7be26] {\n margin-left: 4px;\n font-size: 12px;\n color: var(--c-text-4);\n}\n.c-cron__panel-line[data-v-06e7be26] {\n height: 1px;\n background: var(--c-border);\n}\n.c-cron__footer[data-v-06e7be26] {\n margin-top: 16px;\n padding-top: 16px;\n border-top: 1px solid var(--c-border);\n}\n\n/* ─── 响应式 ────────────────────────────────── */\n@media (max-width: 768px) {\n.c-cron__body[data-v-06e7be26] {\n flex-direction: column;\n}\n.c-cron__panel[data-v-06e7be26] {\n width: 100%;\n}\n.c-cron__segments[data-v-06e7be26] {\n flex-wrap: wrap;\n}\n.c-cron__segment[data-v-06e7be26] {\n min-width: calc(33% - 4px);\n}\n.c-cron__expr-row[data-v-06e7be26] {\n flex-wrap: wrap;\n}\n.c-cron__expr-input[data-v-06e7be26] {\n width: 100%;\n}\n}"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"C_Cron-
|
|
1
|
+
{"version":3,"file":"C_Cron-BNSAGD6A.css","names":[],"sources":["../src/components/C_Cron/components/CronFieldEditor.vue?vue&type=style&index=0&scoped=e6fa8e5b&lang.scss","../src/components/C_Cron/components/CronPreview.vue?vue&type=style&index=0&scoped=a695bb32&lang.scss","../src/components/C_Cron/components/CronTemplates.vue?vue&type=style&index=0&scoped=fe320f38&lang.scss","../src/components/C_Cron/index.vue?vue&type=style&index=0&scoped=06e7be26&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled */.cron-field-editor__grid[data-v-e6fa8e5b] {\n display: grid;\n grid-template-columns: repeat(var(--cols, 10), 1fr);\n gap: 4px;\n}\n.cron-field-editor__cell[data-v-e6fa8e5b] {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 34px;\n border-radius: 6px;\n font-size: 13px;\n font-variant-numeric: tabular-nums;\n transition: all var(--c-transition, 0.2s ease);\n user-select: none;\n color: var(--c-text-2);\n /* 非交互高亮(every / range / step 的视觉反馈) */\n /* 可交互模式(specific) */\n}\n.cron-field-editor__cell--on[data-v-e6fa8e5b]:not(.cron-field-editor__cell--pick) {\n background: color-mix(in srgb, var(--c-primary) 12%, transparent);\n color: var(--c-primary);\n}\n.cron-field-editor__cell--pick[data-v-e6fa8e5b] {\n cursor: pointer;\n}\n.cron-field-editor__cell--pick[data-v-e6fa8e5b]:hover:not(.cron-field-editor__cell--on) {\n background: var(--c-bg-card);\n}\n.cron-field-editor__cell--pick.cron-field-editor__cell--on[data-v-e6fa8e5b] {\n background: var(--c-primary);\n color: #fff;\n font-weight: 600;\n}","/* unplugin-vue-components disabled */.cron-preview__header[data-v-a695bb32] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-weight: 600;\n font-size: 13px;\n margin-bottom: 6px;\n color: var(--c-text-1);\n}\n.cron-preview__list[data-v-a695bb32] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n.cron-preview__item[data-v-a695bb32] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 3px 4px;\n border-radius: 4px;\n font-size: 12px;\n transition: background var(--c-transition, 0.2s ease);\n}\n.cron-preview__item[data-v-a695bb32]:hover {\n background: var(--c-bg-card);\n}\n.cron-preview__idx[data-v-a695bb32] {\n width: 16px;\n text-align: center;\n color: var(--c-text-4);\n flex-shrink: 0;\n font-size: 11px;\n}\n.cron-preview__date[data-v-a695bb32] {\n font-family: \"Courier New\", Courier, monospace;\n flex: 1;\n font-size: 12px;\n}\n.cron-preview__week[data-v-a695bb32] {\n color: var(--c-text-4);\n font-size: 12px;\n flex-shrink: 0;\n}","/* unplugin-vue-components disabled */.cron-templates__header[data-v-fe320f38] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-weight: 600;\n font-size: 13px;\n margin-bottom: 10px;\n color: var(--c-text-1);\n}\n.cron-templates__cards[data-v-fe320f38] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));\n gap: 8px;\n}\n.cron-templates__card[data-v-fe320f38] {\n padding: 10px 12px;\n border-radius: 8px;\n border: 1px solid var(--c-border);\n cursor: pointer;\n transition: all var(--c-transition, 0.2s ease);\n}\n.cron-templates__card[data-v-fe320f38]:hover {\n border-color: var(--c-primary);\n background: color-mix(in srgb, var(--c-primary) 4%, transparent);\n}\n.cron-templates__card--active[data-v-fe320f38] {\n border-color: var(--c-primary);\n background: color-mix(in srgb, var(--c-primary) 8%, transparent);\n}\n.cron-templates__card-name[data-v-fe320f38] {\n font-size: 13px;\n font-weight: 500;\n line-height: 1.4;\n}\n.cron-templates__card-expr[data-v-fe320f38] {\n font-family: \"Courier New\", Courier, monospace;\n font-size: 11px;\n color: var(--c-text-4);\n margin-top: 2px;\n}","/* unplugin-vue-components disabled *//* Cron 表达式编辑器 - 组件级全局样式 */\n.c-cron[data-v-06e7be26] {\n padding: 20px;\n border-radius: 10px;\n border: 1px solid var(--c-border);\n background: var(--c-bg-card);\n /* ═══════ 顶部 ═══════ */\n /* ─── 分段式字段选择器 ──────────────────── */\n /* ─── 表达式行 ─────────────────────────── */\n /* ═══════ 主内容 ═══════ */\n /* ─── 右侧控制面板 ────────────────────── */\n /* ═══════ 底部模板 ═══════ */\n}\n.c-cron__header[data-v-06e7be26] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding-bottom: 16px;\n border-bottom: 1px solid var(--c-border);\n margin-bottom: 16px;\n}\n.c-cron__title-row[data-v-06e7be26] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n.c-cron__title[data-v-06e7be26] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-weight: 600;\n font-size: 15px;\n}\n.c-cron__segments[data-v-06e7be26] {\n display: flex;\n gap: 2px;\n padding: 3px;\n border-radius: 10px;\n background: var(--c-bg);\n}\n.c-cron__segment[data-v-06e7be26] {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 8px 6px 5px;\n border-radius: 8px;\n cursor: pointer;\n transition: all var(--c-transition, 0.2s ease);\n user-select: none;\n min-width: 0;\n}\n.c-cron__segment[data-v-06e7be26]:not(.c-cron__segment--active):hover {\n background: color-mix(in srgb, var(--c-bg-card) 60%, transparent);\n}\n.c-cron__segment--active[data-v-06e7be26] {\n background: var(--c-bg-card);\n box-shadow: 0 1px 4px rgba(0, 0, 0, 0.08);\n}\n.c-cron__segment--active .c-cron__segment-value[data-v-06e7be26] {\n color: var(--c-primary);\n}\n.c-cron__segment--wildcard:not(.c-cron__segment--active) .c-cron__segment-value[data-v-06e7be26] {\n opacity: 0.35;\n}\n.c-cron__segment-value[data-v-06e7be26] {\n font-family: \"Courier New\", Courier, monospace;\n font-size: 15px;\n font-weight: 700;\n line-height: 1.3;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-align: center;\n}\n.c-cron__segment-label[data-v-06e7be26] {\n font-size: 11px;\n color: var(--c-text-4);\n margin-top: 2px;\n}\n.c-cron__expr-row[data-v-06e7be26] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.c-cron__expr-input[data-v-06e7be26] {\n width: 240px;\n flex-shrink: 0;\n}\n.c-cron__expr-desc[data-v-06e7be26] {\n flex: 1;\n font-size: 13px;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.c-cron__description[data-v-06e7be26] {\n color: var(--c-text-2);\n}\n.c-cron__error[data-v-06e7be26] {\n color: var(--error-color);\n}\n.c-cron__body[data-v-06e7be26] {\n display: flex;\n gap: 24px;\n}\n.c-cron__main[data-v-06e7be26] {\n flex: 1;\n min-width: 0;\n}\n.c-cron__panel[data-v-06e7be26] {\n width: 260px;\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n.c-cron__config[data-v-06e7be26] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n.c-cron__config-row[data-v-06e7be26] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n color: var(--c-text-2);\n flex-wrap: wrap;\n}\n.c-cron__config-num[data-v-06e7be26] {\n width: 68px;\n}\n.c-cron__quick[data-v-06e7be26] {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 13px;\n}\n.c-cron__quick a[data-v-06e7be26] {\n color: var(--c-primary);\n cursor: pointer;\n user-select: none;\n}\n.c-cron__quick a[data-v-06e7be26]:hover {\n text-decoration: underline;\n}\n.c-cron__quick-sep[data-v-06e7be26] {\n color: var(--c-text-4);\n}\n.c-cron__quick-count[data-v-06e7be26] {\n margin-left: 4px;\n font-size: 12px;\n color: var(--c-text-4);\n}\n.c-cron__panel-line[data-v-06e7be26] {\n height: 1px;\n background: var(--c-border);\n}\n.c-cron__footer[data-v-06e7be26] {\n margin-top: 16px;\n padding-top: 16px;\n border-top: 1px solid var(--c-border);\n}\n\n/* ─── 响应式 ────────────────────────────────── */\n@media (max-width: 768px) {\n.c-cron__body[data-v-06e7be26] {\n flex-direction: column;\n}\n.c-cron__panel[data-v-06e7be26] {\n width: 100%;\n}\n.c-cron__segments[data-v-06e7be26] {\n flex-wrap: wrap;\n}\n.c-cron__segment[data-v-06e7be26] {\n min-width: calc(33% - 4px);\n}\n.c-cron__expr-row[data-v-06e7be26] {\n flex-wrap: wrap;\n}\n.c-cron__expr-input[data-v-06e7be26] {\n width: 100%;\n}\n}"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
|
package/dist/C_Cron.css
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
/* unplugin-vue-components disabled */.cron-field-editor__grid[data-v-
|
|
1
|
+
/* unplugin-vue-components disabled */.cron-field-editor__grid[data-v-e6fa8e5b] {
|
|
2
2
|
display: grid;
|
|
3
3
|
grid-template-columns: repeat(var(--cols, 10), 1fr);
|
|
4
4
|
gap: 4px;
|
|
5
5
|
}
|
|
6
|
-
.cron-field-editor__cell[data-v-
|
|
6
|
+
.cron-field-editor__cell[data-v-e6fa8e5b] {
|
|
7
7
|
display: flex;
|
|
8
8
|
align-items: center;
|
|
9
9
|
justify-content: center;
|
|
@@ -17,22 +17,22 @@
|
|
|
17
17
|
/* 非交互高亮(every / range / step 的视觉反馈) */
|
|
18
18
|
/* 可交互模式(specific) */
|
|
19
19
|
}
|
|
20
|
-
.cron-field-editor__cell--on[data-v-
|
|
20
|
+
.cron-field-editor__cell--on[data-v-e6fa8e5b]:not(.cron-field-editor__cell--pick) {
|
|
21
21
|
background: color-mix(in srgb, var(--c-primary) 12%, transparent);
|
|
22
22
|
color: var(--c-primary);
|
|
23
23
|
}
|
|
24
|
-
.cron-field-editor__cell--pick[data-v-
|
|
24
|
+
.cron-field-editor__cell--pick[data-v-e6fa8e5b] {
|
|
25
25
|
cursor: pointer;
|
|
26
26
|
}
|
|
27
|
-
.cron-field-editor__cell--pick[data-v-
|
|
27
|
+
.cron-field-editor__cell--pick[data-v-e6fa8e5b]:hover:not(.cron-field-editor__cell--on) {
|
|
28
28
|
background: var(--c-bg-card);
|
|
29
29
|
}
|
|
30
|
-
.cron-field-editor__cell--pick.cron-field-editor__cell--on[data-v-
|
|
30
|
+
.cron-field-editor__cell--pick.cron-field-editor__cell--on[data-v-e6fa8e5b] {
|
|
31
31
|
background: var(--c-primary);
|
|
32
32
|
color: #fff;
|
|
33
33
|
font-weight: 600;
|
|
34
34
|
}
|
|
35
|
-
/* unplugin-vue-components disabled */.cron-preview__header[data-v-
|
|
35
|
+
/* unplugin-vue-components disabled */.cron-preview__header[data-v-a695bb32] {
|
|
36
36
|
display: flex;
|
|
37
37
|
align-items: center;
|
|
38
38
|
gap: 6px;
|
|
@@ -41,12 +41,12 @@
|
|
|
41
41
|
margin-bottom: 6px;
|
|
42
42
|
color: var(--c-text-1);
|
|
43
43
|
}
|
|
44
|
-
.cron-preview__list[data-v-
|
|
44
|
+
.cron-preview__list[data-v-a695bb32] {
|
|
45
45
|
display: flex;
|
|
46
46
|
flex-direction: column;
|
|
47
47
|
gap: 2px;
|
|
48
48
|
}
|
|
49
|
-
.cron-preview__item[data-v-
|
|
49
|
+
.cron-preview__item[data-v-a695bb32] {
|
|
50
50
|
display: flex;
|
|
51
51
|
align-items: center;
|
|
52
52
|
gap: 6px;
|
|
@@ -55,27 +55,27 @@
|
|
|
55
55
|
font-size: 12px;
|
|
56
56
|
transition: background var(--c-transition, 0.2s ease);
|
|
57
57
|
}
|
|
58
|
-
.cron-preview__item[data-v-
|
|
58
|
+
.cron-preview__item[data-v-a695bb32]:hover {
|
|
59
59
|
background: var(--c-bg-card);
|
|
60
60
|
}
|
|
61
|
-
.cron-preview__idx[data-v-
|
|
61
|
+
.cron-preview__idx[data-v-a695bb32] {
|
|
62
62
|
width: 16px;
|
|
63
63
|
text-align: center;
|
|
64
64
|
color: var(--c-text-4);
|
|
65
65
|
flex-shrink: 0;
|
|
66
66
|
font-size: 11px;
|
|
67
67
|
}
|
|
68
|
-
.cron-preview__date[data-v-
|
|
68
|
+
.cron-preview__date[data-v-a695bb32] {
|
|
69
69
|
font-family: "Courier New", Courier, monospace;
|
|
70
70
|
flex: 1;
|
|
71
71
|
font-size: 12px;
|
|
72
72
|
}
|
|
73
|
-
.cron-preview__week[data-v-
|
|
73
|
+
.cron-preview__week[data-v-a695bb32] {
|
|
74
74
|
color: var(--c-text-4);
|
|
75
75
|
font-size: 12px;
|
|
76
76
|
flex-shrink: 0;
|
|
77
77
|
}
|
|
78
|
-
/* unplugin-vue-components disabled */.cron-templates__header[data-v-
|
|
78
|
+
/* unplugin-vue-components disabled */.cron-templates__header[data-v-fe320f38] {
|
|
79
79
|
display: flex;
|
|
80
80
|
align-items: center;
|
|
81
81
|
gap: 6px;
|
|
@@ -84,39 +84,39 @@
|
|
|
84
84
|
margin-bottom: 10px;
|
|
85
85
|
color: var(--c-text-1);
|
|
86
86
|
}
|
|
87
|
-
.cron-templates__cards[data-v-
|
|
87
|
+
.cron-templates__cards[data-v-fe320f38] {
|
|
88
88
|
display: grid;
|
|
89
89
|
grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
|
|
90
90
|
gap: 8px;
|
|
91
91
|
}
|
|
92
|
-
.cron-templates__card[data-v-
|
|
92
|
+
.cron-templates__card[data-v-fe320f38] {
|
|
93
93
|
padding: 10px 12px;
|
|
94
94
|
border-radius: 8px;
|
|
95
95
|
border: 1px solid var(--c-border);
|
|
96
96
|
cursor: pointer;
|
|
97
97
|
transition: all var(--c-transition, 0.2s ease);
|
|
98
98
|
}
|
|
99
|
-
.cron-templates__card[data-v-
|
|
99
|
+
.cron-templates__card[data-v-fe320f38]:hover {
|
|
100
100
|
border-color: var(--c-primary);
|
|
101
101
|
background: color-mix(in srgb, var(--c-primary) 4%, transparent);
|
|
102
102
|
}
|
|
103
|
-
.cron-templates__card--active[data-v-
|
|
103
|
+
.cron-templates__card--active[data-v-fe320f38] {
|
|
104
104
|
border-color: var(--c-primary);
|
|
105
105
|
background: color-mix(in srgb, var(--c-primary) 8%, transparent);
|
|
106
106
|
}
|
|
107
|
-
.cron-templates__card-name[data-v-
|
|
107
|
+
.cron-templates__card-name[data-v-fe320f38] {
|
|
108
108
|
font-size: 13px;
|
|
109
109
|
font-weight: 500;
|
|
110
110
|
line-height: 1.4;
|
|
111
111
|
}
|
|
112
|
-
.cron-templates__card-expr[data-v-
|
|
112
|
+
.cron-templates__card-expr[data-v-fe320f38] {
|
|
113
113
|
font-family: "Courier New", Courier, monospace;
|
|
114
114
|
font-size: 11px;
|
|
115
115
|
color: var(--c-text-4);
|
|
116
116
|
margin-top: 2px;
|
|
117
117
|
}
|
|
118
118
|
/* unplugin-vue-components disabled *//* Cron 表达式编辑器 - 组件级全局样式 */
|
|
119
|
-
.c-cron[data-v-
|
|
119
|
+
.c-cron[data-v-06e7be26] {
|
|
120
120
|
padding: 20px;
|
|
121
121
|
border-radius: 10px;
|
|
122
122
|
border: 1px solid var(--c-border);
|
|
@@ -128,7 +128,7 @@
|
|
|
128
128
|
/* ─── 右侧控制面板 ────────────────────── */
|
|
129
129
|
/* ═══════ 底部模板 ═══════ */
|
|
130
130
|
}
|
|
131
|
-
.c-cron__header[data-v-
|
|
131
|
+
.c-cron__header[data-v-06e7be26] {
|
|
132
132
|
display: flex;
|
|
133
133
|
flex-direction: column;
|
|
134
134
|
gap: 12px;
|
|
@@ -136,26 +136,26 @@
|
|
|
136
136
|
border-bottom: 1px solid var(--c-border);
|
|
137
137
|
margin-bottom: 16px;
|
|
138
138
|
}
|
|
139
|
-
.c-cron__title-row[data-v-
|
|
139
|
+
.c-cron__title-row[data-v-06e7be26] {
|
|
140
140
|
display: flex;
|
|
141
141
|
align-items: center;
|
|
142
142
|
justify-content: space-between;
|
|
143
143
|
}
|
|
144
|
-
.c-cron__title[data-v-
|
|
144
|
+
.c-cron__title[data-v-06e7be26] {
|
|
145
145
|
display: flex;
|
|
146
146
|
align-items: center;
|
|
147
147
|
gap: 6px;
|
|
148
148
|
font-weight: 600;
|
|
149
149
|
font-size: 15px;
|
|
150
150
|
}
|
|
151
|
-
.c-cron__segments[data-v-
|
|
151
|
+
.c-cron__segments[data-v-06e7be26] {
|
|
152
152
|
display: flex;
|
|
153
153
|
gap: 2px;
|
|
154
154
|
padding: 3px;
|
|
155
155
|
border-radius: 10px;
|
|
156
156
|
background: var(--c-bg);
|
|
157
157
|
}
|
|
158
|
-
.c-cron__segment[data-v-
|
|
158
|
+
.c-cron__segment[data-v-06e7be26] {
|
|
159
159
|
flex: 1;
|
|
160
160
|
display: flex;
|
|
161
161
|
flex-direction: column;
|
|
@@ -167,20 +167,20 @@
|
|
|
167
167
|
user-select: none;
|
|
168
168
|
min-width: 0;
|
|
169
169
|
}
|
|
170
|
-
.c-cron__segment[data-v-
|
|
170
|
+
.c-cron__segment[data-v-06e7be26]:not(.c-cron__segment--active):hover {
|
|
171
171
|
background: color-mix(in srgb, var(--c-bg-card) 60%, transparent);
|
|
172
172
|
}
|
|
173
|
-
.c-cron__segment--active[data-v-
|
|
173
|
+
.c-cron__segment--active[data-v-06e7be26] {
|
|
174
174
|
background: var(--c-bg-card);
|
|
175
175
|
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.08);
|
|
176
176
|
}
|
|
177
|
-
.c-cron__segment--active .c-cron__segment-value[data-v-
|
|
177
|
+
.c-cron__segment--active .c-cron__segment-value[data-v-06e7be26] {
|
|
178
178
|
color: var(--c-primary);
|
|
179
179
|
}
|
|
180
|
-
.c-cron__segment--wildcard:not(.c-cron__segment--active) .c-cron__segment-value[data-v-
|
|
180
|
+
.c-cron__segment--wildcard:not(.c-cron__segment--active) .c-cron__segment-value[data-v-06e7be26] {
|
|
181
181
|
opacity: 0.35;
|
|
182
182
|
}
|
|
183
|
-
.c-cron__segment-value[data-v-
|
|
183
|
+
.c-cron__segment-value[data-v-06e7be26] {
|
|
184
184
|
font-family: "Courier New", Courier, monospace;
|
|
185
185
|
font-size: 15px;
|
|
186
186
|
font-weight: 700;
|
|
@@ -191,21 +191,21 @@
|
|
|
191
191
|
white-space: nowrap;
|
|
192
192
|
text-align: center;
|
|
193
193
|
}
|
|
194
|
-
.c-cron__segment-label[data-v-
|
|
194
|
+
.c-cron__segment-label[data-v-06e7be26] {
|
|
195
195
|
font-size: 11px;
|
|
196
196
|
color: var(--c-text-4);
|
|
197
197
|
margin-top: 2px;
|
|
198
198
|
}
|
|
199
|
-
.c-cron__expr-row[data-v-
|
|
199
|
+
.c-cron__expr-row[data-v-06e7be26] {
|
|
200
200
|
display: flex;
|
|
201
201
|
align-items: center;
|
|
202
202
|
gap: 8px;
|
|
203
203
|
}
|
|
204
|
-
.c-cron__expr-input[data-v-
|
|
204
|
+
.c-cron__expr-input[data-v-06e7be26] {
|
|
205
205
|
width: 240px;
|
|
206
206
|
flex-shrink: 0;
|
|
207
207
|
}
|
|
208
|
-
.c-cron__expr-desc[data-v-
|
|
208
|
+
.c-cron__expr-desc[data-v-06e7be26] {
|
|
209
209
|
flex: 1;
|
|
210
210
|
font-size: 13px;
|
|
211
211
|
min-width: 0;
|
|
@@ -213,33 +213,33 @@
|
|
|
213
213
|
text-overflow: ellipsis;
|
|
214
214
|
white-space: nowrap;
|
|
215
215
|
}
|
|
216
|
-
.c-cron__description[data-v-
|
|
216
|
+
.c-cron__description[data-v-06e7be26] {
|
|
217
217
|
color: var(--c-text-2);
|
|
218
218
|
}
|
|
219
|
-
.c-cron__error[data-v-
|
|
219
|
+
.c-cron__error[data-v-06e7be26] {
|
|
220
220
|
color: var(--error-color);
|
|
221
221
|
}
|
|
222
|
-
.c-cron__body[data-v-
|
|
222
|
+
.c-cron__body[data-v-06e7be26] {
|
|
223
223
|
display: flex;
|
|
224
224
|
gap: 24px;
|
|
225
225
|
}
|
|
226
|
-
.c-cron__main[data-v-
|
|
226
|
+
.c-cron__main[data-v-06e7be26] {
|
|
227
227
|
flex: 1;
|
|
228
228
|
min-width: 0;
|
|
229
229
|
}
|
|
230
|
-
.c-cron__panel[data-v-
|
|
230
|
+
.c-cron__panel[data-v-06e7be26] {
|
|
231
231
|
width: 260px;
|
|
232
232
|
flex-shrink: 0;
|
|
233
233
|
display: flex;
|
|
234
234
|
flex-direction: column;
|
|
235
235
|
gap: 12px;
|
|
236
236
|
}
|
|
237
|
-
.c-cron__config[data-v-
|
|
237
|
+
.c-cron__config[data-v-06e7be26] {
|
|
238
238
|
display: flex;
|
|
239
239
|
flex-direction: column;
|
|
240
240
|
gap: 8px;
|
|
241
241
|
}
|
|
242
|
-
.c-cron__config-row[data-v-
|
|
242
|
+
.c-cron__config-row[data-v-06e7be26] {
|
|
243
243
|
display: flex;
|
|
244
244
|
align-items: center;
|
|
245
245
|
gap: 6px;
|
|
@@ -247,36 +247,36 @@
|
|
|
247
247
|
color: var(--c-text-2);
|
|
248
248
|
flex-wrap: wrap;
|
|
249
249
|
}
|
|
250
|
-
.c-cron__config-num[data-v-
|
|
250
|
+
.c-cron__config-num[data-v-06e7be26] {
|
|
251
251
|
width: 68px;
|
|
252
252
|
}
|
|
253
|
-
.c-cron__quick[data-v-
|
|
253
|
+
.c-cron__quick[data-v-06e7be26] {
|
|
254
254
|
display: flex;
|
|
255
255
|
align-items: center;
|
|
256
256
|
gap: 4px;
|
|
257
257
|
font-size: 13px;
|
|
258
258
|
}
|
|
259
|
-
.c-cron__quick a[data-v-
|
|
259
|
+
.c-cron__quick a[data-v-06e7be26] {
|
|
260
260
|
color: var(--c-primary);
|
|
261
261
|
cursor: pointer;
|
|
262
262
|
user-select: none;
|
|
263
263
|
}
|
|
264
|
-
.c-cron__quick a[data-v-
|
|
264
|
+
.c-cron__quick a[data-v-06e7be26]:hover {
|
|
265
265
|
text-decoration: underline;
|
|
266
266
|
}
|
|
267
|
-
.c-cron__quick-sep[data-v-
|
|
267
|
+
.c-cron__quick-sep[data-v-06e7be26] {
|
|
268
268
|
color: var(--c-text-4);
|
|
269
269
|
}
|
|
270
|
-
.c-cron__quick-count[data-v-
|
|
270
|
+
.c-cron__quick-count[data-v-06e7be26] {
|
|
271
271
|
margin-left: 4px;
|
|
272
272
|
font-size: 12px;
|
|
273
273
|
color: var(--c-text-4);
|
|
274
274
|
}
|
|
275
|
-
.c-cron__panel-line[data-v-
|
|
275
|
+
.c-cron__panel-line[data-v-06e7be26] {
|
|
276
276
|
height: 1px;
|
|
277
277
|
background: var(--c-border);
|
|
278
278
|
}
|
|
279
|
-
.c-cron__footer[data-v-
|
|
279
|
+
.c-cron__footer[data-v-06e7be26] {
|
|
280
280
|
margin-top: 16px;
|
|
281
281
|
padding-top: 16px;
|
|
282
282
|
border-top: 1px solid var(--c-border);
|
|
@@ -284,24 +284,24 @@
|
|
|
284
284
|
|
|
285
285
|
/* ─── 响应式 ────────────────────────────────── */
|
|
286
286
|
@media (max-width: 768px) {
|
|
287
|
-
.c-cron__body[data-v-
|
|
287
|
+
.c-cron__body[data-v-06e7be26] {
|
|
288
288
|
flex-direction: column;
|
|
289
289
|
}
|
|
290
|
-
.c-cron__panel[data-v-
|
|
290
|
+
.c-cron__panel[data-v-06e7be26] {
|
|
291
291
|
width: 100%;
|
|
292
292
|
}
|
|
293
|
-
.c-cron__segments[data-v-
|
|
293
|
+
.c-cron__segments[data-v-06e7be26] {
|
|
294
294
|
flex-wrap: wrap;
|
|
295
295
|
}
|
|
296
|
-
.c-cron__segment[data-v-
|
|
296
|
+
.c-cron__segment[data-v-06e7be26] {
|
|
297
297
|
min-width: calc(33% - 4px);
|
|
298
298
|
}
|
|
299
|
-
.c-cron__expr-row[data-v-
|
|
299
|
+
.c-cron__expr-row[data-v-06e7be26] {
|
|
300
300
|
flex-wrap: wrap;
|
|
301
301
|
}
|
|
302
|
-
.c-cron__expr-input[data-v-
|
|
302
|
+
.c-cron__expr-input[data-v-06e7be26] {
|
|
303
303
|
width: 100%;
|
|
304
304
|
}
|
|
305
305
|
}
|
|
306
306
|
|
|
307
|
-
/*# sourceMappingURL=C_Cron-
|
|
307
|
+
/*# sourceMappingURL=C_Cron-BIQ2By9v.css.map*/
|