@robot-admin/naive-ui-components 0.4.4 → 0.5.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/CHANGELOG.md +12 -0
- package/dist/C_ActionBar-jZPsiXtT.css.map +1 -0
- package/dist/C_ActionBar.css +205 -0
- package/dist/{C_AntV-DGjscTWa.css.map → C_AntV-A3NXx_sF.css.map} +1 -1
- package/dist/C_AntV-D2Zp2qQF.css.map +1 -0
- package/dist/C_AntV.css +398 -0
- package/dist/C_AntV.js.map +1 -1
- package/dist/C_AntV2.js +1 -1
- package/dist/C_AntV2.js.map +1 -1
- package/dist/C_Barcode-Do1Ozsmh.css.map +1 -0
- package/dist/C_Barcode.css +39 -0
- package/dist/C_Captcha-CZmAETly.css.map +1 -0
- package/dist/C_Captcha.css +109 -0
- package/dist/C_Cascade-Dq0S5Jkm.css.map +1 -0
- package/dist/C_Cascade.css +10 -0
- package/dist/C_City-DNKv4MpH.css.map +1 -0
- package/dist/C_City.css +132 -0
- package/dist/C_Code-avZjAnHD.css.map +1 -0
- package/dist/C_Code.css +8 -0
- package/dist/C_CollapsePanel-BpofCDyl.css.map +1 -0
- package/dist/C_CollapsePanel.css +171 -0
- package/dist/C_Cron-DqHQ92LN.css.map +1 -0
- package/dist/C_Cron.css +307 -0
- package/dist/C_Draggable-r6nhx3yM.css.map +1 -0
- package/dist/C_Draggable.css +238 -0
- package/dist/C_Editor-D0_6UhIa.css.map +1 -0
- package/dist/C_Editor.css +52 -0
- package/dist/{C_FilePreview-B4XgTv-h.css.map → C_FilePreview-BVarVvnD.css.map} +1 -1
- package/dist/C_FilePreview-DHGlV4OR.css.map +1 -0
- package/dist/C_FilePreview.css +507 -0
- 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-DLb9FtAb.css.map → C_Form-BciQUPpS.css.map} +1 -1
- package/dist/C_Form-CKHvXL3O.css.map +1 -0
- package/dist/C_Form.css +976 -0
- 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-DlIEoh7X.css.map → C_FormSearch-Bmd2CmG6.css.map} +1 -1
- package/dist/C_FormSearch-DBNtnjaL.css.map +1 -0
- package/dist/C_FormSearch.css +177 -0
- 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-3WG2vtQl.css.map +1 -0
- package/dist/C_FormulaEditor.css +502 -0
- package/dist/C_FullCalendar-1U4VlG7X.css.map +1 -0
- package/dist/C_FullCalendar-DLUdCtqf.css.map +1 -0
- package/dist/C_FullCalendar.css +7 -0
- 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 +1 -0
- package/dist/C_GlobalSearch.css +616 -0
- package/dist/C_Guide.js.map +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-D3L2-J_J.css.map +1 -0
- package/dist/C_ImageCropper.css +129 -0
- package/dist/C_Language.js.map +1 -1
- package/dist/C_Language2.js.map +1 -1
- package/dist/C_Map-BCJmDnJT.css.map +1 -0
- package/dist/C_Map.css +29 -0
- package/dist/{C_Markdown-C2uiBVSW.css.map → C_Markdown-7iBnLDtL.css.map} +1 -1
- package/dist/C_Markdown-BbTvdFCl.css.map +1 -0
- package/dist/C_Markdown.css +112 -0
- 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_NotificationCenter-DT6fQ79O.css.map +1 -0
- package/dist/C_NotificationCenter.css +466 -0
- package/dist/C_QRCode-DMxSyogU.css.map +1 -0
- package/dist/C_QRCode.css +51 -0
- package/dist/C_Signature-B5fFz6RD.css.map +1 -0
- package/dist/C_Signature.css +79 -0
- package/dist/C_SplitPane-DuyzUhKB.css.map +1 -0
- package/dist/C_SplitPane.css +152 -0
- package/dist/C_Steps-DGwXxS2Y.css.map +1 -0
- package/dist/C_Steps.css +171 -0
- package/dist/{C_Table-C55H4kPr.css.map → C_Table-Dcam_tRs.css.map} +1 -1
- package/dist/C_Table-tbUx-R4H.css.map +1 -0
- package/dist/C_Table.css +527 -0
- package/dist/C_Table.js.map +1 -1
- package/dist/C_Table2.js +1 -1
- package/dist/C_Table2.js.map +1 -1
- package/dist/C_Theme.js.map +1 -1
- package/dist/C_Theme2.js.map +1 -1
- package/dist/C_Time-CKb_fwdm.css.map +1 -0
- package/dist/C_Time.css +23 -0
- package/dist/C_Tree-B-Le4hjQ.css.map +1 -0
- package/dist/C_Tree.css +142 -0
- package/dist/C_Upload-S30RmC9t.css.map +1 -0
- package/dist/C_Upload.css +251 -0
- package/dist/C_VideoPlayer-Cdgv4Zq0.css.map +1 -0
- package/dist/C_VideoPlayer.css +355 -0
- package/dist/C_VideoPlayer.d.ts +1 -1
- package/dist/C_VtableGantt-DB87-jdS.css.map +1 -0
- package/dist/C_VtableGantt.css +89 -0
- package/dist/C_WaterFall-C4HDqf-a.css.map +1 -0
- package/dist/C_WaterFall.css +73 -0
- package/dist/{C_WorkFlow-CSO86Cuc.css.map → C_WorkFlow-7F6op6qN.css.map} +1 -1
- package/dist/C_WorkFlow-Cy3HWA6A.css.map +1 -0
- package/dist/C_WorkFlow.css +1166 -0
- 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/chunk.js +1 -1
- package/dist/constants.d.ts +4 -4
- package/dist/constants2.d.ts +5 -5
- package/dist/constants3.d.ts +3 -3
- package/dist/constants4.d.ts +4 -4
- package/dist/constants5.d.ts +8 -3816
- package/dist/data.d.ts +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js.map +1 -1
- package/dist/index.vue.d.ts +1 -1
- package/dist/index10.vue.d.ts +8 -8
- package/dist/index11.vue.d.ts +2 -2
- package/dist/index12.vue.d.ts +7 -7
- package/dist/index13.vue.d.ts +1 -1
- package/dist/index14.vue.d.ts +2 -2
- package/dist/index15.vue.d.ts +1 -1
- package/dist/index16.vue.d.ts +2 -2
- package/dist/index3.vue.d.ts +1 -1
- package/dist/index4.vue.d.ts +2 -2
- package/dist/index5.vue.d.ts +2 -2
- package/dist/index6.vue.d.ts +4 -4
- package/dist/index7.vue.d.ts +2 -2
- package/dist/index8.vue.d.ts +4 -4
- package/dist/index9.vue.d.ts +1 -1
- package/dist/resolver.cjs +1 -1
- package/dist/resolver.cjs.map +1 -1
- package/dist/resolver.d.cts +7 -0
- package/dist/resolver.d.ts +7 -0
- package/dist/resolver.js +1 -1
- package/dist/resolver.js.map +1 -1
- package/dist/style.css +481 -481
- package/dist/useCalendarEvents.d.ts +1 -1
- package/dist/useCollapsePanel.d.ts +1 -1
- package/dist/useCropperCore.d.ts +7 -7
- package/dist/useDraggableLayout.d.ts +2 -2
- package/dist/useDynamicFormState.d.ts +8 -8
- package/dist/useEdgeInteraction.d.ts +4 -7293
- package/dist/useFullscreen.d.ts +2 -2
- package/dist/useInfiniteScroll.d.ts +3 -3
- package/dist/useModalEdit.d.ts +41 -17
- package/dist/useQRCode.d.ts +3 -3
- package/dist/useSearchState.d.ts +3 -3
- package/dist/useSignatureHistory.d.ts +3 -3
- package/dist/useSplitResize.d.ts +3 -3
- package/dist/useTimeSelection.d.ts +2 -2
- package/dist/useTreeOperations.d.ts +3 -3
- package/dist/useWorkflowValidation.d.ts +5 -5
- package/package.json +32 -32
- package/dist/C_FullCalendar-BULCIlVK.css.map +0 -1
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/* unplugin-vue-components disabled */.cropper-toolbar[data-v-ac310c55] {
|
|
2
|
+
display: flex;
|
|
3
|
+
flex-wrap: wrap;
|
|
4
|
+
gap: 4px;
|
|
5
|
+
align-items: center;
|
|
6
|
+
padding: 8px 0;
|
|
7
|
+
}
|
|
8
|
+
/* unplugin-vue-components disabled */.cropper-preview[data-v-11f355b4] {
|
|
9
|
+
display: flex;
|
|
10
|
+
flex-direction: column;
|
|
11
|
+
gap: 16px;
|
|
12
|
+
}
|
|
13
|
+
.cropper-preview .preview-label[data-v-11f355b4] {
|
|
14
|
+
display: flex;
|
|
15
|
+
gap: 6px;
|
|
16
|
+
align-items: center;
|
|
17
|
+
font-size: 13px;
|
|
18
|
+
font-weight: 500;
|
|
19
|
+
color: var(--text-color-2);
|
|
20
|
+
}
|
|
21
|
+
.cropper-preview .preview-main[data-v-11f355b4] {
|
|
22
|
+
width: 100%;
|
|
23
|
+
overflow: hidden;
|
|
24
|
+
border: 1px solid var(--border-color);
|
|
25
|
+
border-radius: 6px;
|
|
26
|
+
background: linear-gradient(45deg, #f0f0f0 25%, transparent 25%), linear-gradient(-45deg, #f0f0f0 25%, transparent 25%), linear-gradient(45deg, transparent 75%, #f0f0f0 75%), linear-gradient(-45deg, transparent 75%, #f0f0f0 75%);
|
|
27
|
+
background-position: 0 0, 0 8px, 8px -8px, -8px 0;
|
|
28
|
+
background-size: 16px 16px;
|
|
29
|
+
}
|
|
30
|
+
.cropper-preview .preview-main--circular[data-v-11f355b4] {
|
|
31
|
+
border-radius: 50%;
|
|
32
|
+
}
|
|
33
|
+
.cropper-preview .preview-main__viewport img[data-v-11f355b4] {
|
|
34
|
+
display: block;
|
|
35
|
+
max-width: none !important;
|
|
36
|
+
}
|
|
37
|
+
.cropper-preview .preview-empty[data-v-11f355b4] {
|
|
38
|
+
display: flex;
|
|
39
|
+
align-items: center;
|
|
40
|
+
justify-content: center;
|
|
41
|
+
width: 100%;
|
|
42
|
+
height: 100%;
|
|
43
|
+
min-height: 120px;
|
|
44
|
+
}
|
|
45
|
+
.cropper-preview .preview-thumbs[data-v-11f355b4] {
|
|
46
|
+
display: flex;
|
|
47
|
+
gap: 12px;
|
|
48
|
+
align-items: flex-end;
|
|
49
|
+
justify-content: center;
|
|
50
|
+
}
|
|
51
|
+
.cropper-preview .preview-thumb[data-v-11f355b4] {
|
|
52
|
+
display: flex;
|
|
53
|
+
flex-direction: column;
|
|
54
|
+
gap: 4px;
|
|
55
|
+
align-items: center;
|
|
56
|
+
}
|
|
57
|
+
.cropper-preview .preview-thumb__box[data-v-11f355b4] {
|
|
58
|
+
overflow: hidden;
|
|
59
|
+
border: 1px solid var(--border-color);
|
|
60
|
+
border-radius: 4px;
|
|
61
|
+
background: var(--body-color);
|
|
62
|
+
}
|
|
63
|
+
.cropper-preview .preview-thumb__box--circular[data-v-11f355b4] {
|
|
64
|
+
border-radius: 50%;
|
|
65
|
+
}
|
|
66
|
+
.cropper-preview .preview-thumb__viewport img[data-v-11f355b4] {
|
|
67
|
+
display: block;
|
|
68
|
+
max-width: none !important;
|
|
69
|
+
}
|
|
70
|
+
.cropper-preview .preview-thumb__label[data-v-11f355b4] {
|
|
71
|
+
font-size: 11px;
|
|
72
|
+
color: var(--text-color-3);
|
|
73
|
+
}
|
|
74
|
+
/* unplugin-vue-components disabled *//* C_ImageCropper styles */
|
|
75
|
+
.c-image-cropper[data-v-b25a5839] {
|
|
76
|
+
width: 100%;
|
|
77
|
+
}
|
|
78
|
+
.c-image-cropper__body[data-v-b25a5839] {
|
|
79
|
+
display: flex;
|
|
80
|
+
flex-direction: column;
|
|
81
|
+
gap: 8px;
|
|
82
|
+
}
|
|
83
|
+
.c-image-cropper__workspace[data-v-b25a5839] {
|
|
84
|
+
display: flex;
|
|
85
|
+
gap: 16px;
|
|
86
|
+
align-items: stretch;
|
|
87
|
+
}
|
|
88
|
+
.c-image-cropper__canvas[data-v-b25a5839] {
|
|
89
|
+
position: relative;
|
|
90
|
+
flex: 1;
|
|
91
|
+
min-width: 0;
|
|
92
|
+
overflow: hidden;
|
|
93
|
+
border: 1px solid var(--border-color);
|
|
94
|
+
border-radius: 6px;
|
|
95
|
+
background: var(--body-color);
|
|
96
|
+
}
|
|
97
|
+
.c-image-cropper__canvas[data-v-b25a5839] .vue-cropper {
|
|
98
|
+
width: 100% !important;
|
|
99
|
+
height: 100% !important;
|
|
100
|
+
}
|
|
101
|
+
.c-image-cropper__preview-panel[data-v-b25a5839] {
|
|
102
|
+
flex: 0 1 280px;
|
|
103
|
+
min-width: 200px;
|
|
104
|
+
padding: 16px;
|
|
105
|
+
overflow: hidden;
|
|
106
|
+
border: 1px solid var(--border-color);
|
|
107
|
+
border-radius: 6px;
|
|
108
|
+
background: var(--card-color);
|
|
109
|
+
}
|
|
110
|
+
.c-image-cropper__placeholder[data-v-b25a5839] {
|
|
111
|
+
display: flex;
|
|
112
|
+
flex-direction: column;
|
|
113
|
+
gap: 8px;
|
|
114
|
+
align-items: center;
|
|
115
|
+
justify-content: center;
|
|
116
|
+
height: 100%;
|
|
117
|
+
color: var(--text-color-3);
|
|
118
|
+
font-size: 14px;
|
|
119
|
+
}
|
|
120
|
+
@media (width <= 768px) {
|
|
121
|
+
.c-image-cropper__workspace[data-v-b25a5839] {
|
|
122
|
+
flex-direction: column;
|
|
123
|
+
}
|
|
124
|
+
.c-image-cropper__preview-panel[data-v-b25a5839] {
|
|
125
|
+
max-width: none;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/*# sourceMappingURL=C_ImageCropper-D3L2-J_J.css.map*/
|
package/dist/C_Language.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"C_Language.js","names":["modelValue"],"sources":["../src/components/C_Language/index.vue","../src/components/C_Language/index.vue","../src/components/C_Language/index.vue"],"sourcesContent":["/* unplugin-vue-components disabled */<!--\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2025-11-19\n * @Description: 语言切换组件\n * @Migration: naive-ui-components 组件库迁移版本\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <NDropdown\n size=\"small\"\n trigger=\"hover\"\n :options=\"finalOptions\"\n :value=\"modelValue\"\n @select=\"handleLanguageChange\"\n >\n <NButton text>\n <div class=\"flex items-center\">\n <C_Icon
|
|
1
|
+
{"version":3,"file":"C_Language.js","names":["modelValue"],"sources":["../src/components/C_Language/index.vue","../src/components/C_Language/index.vue","../src/components/C_Language/index.vue"],"sourcesContent":["/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-11-19\r\n * @Description: 语言切换组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <NDropdown\r\n size=\"small\"\r\n trigger=\"hover\"\r\n :options=\"finalOptions\"\r\n :value=\"modelValue\"\r\n @select=\"handleLanguageChange\"\r\n >\r\n <NButton text>\r\n <div class=\"flex items-center\">\r\n <C_Icon\r\n name=\"mdi:language\"\r\n :size=\"18\"\r\n />\r\n </div>\r\n </NButton>\r\n </NDropdown>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { computed, h } from 'vue'\r\n import { NDropdown, NButton } from 'naive-ui'\r\n import C_Icon from '../C_Icon/index.vue'\r\n\r\n defineOptions({ name: 'C_Language' })\r\n\r\n export interface LanguageOption {\r\n key: string\r\n label: string\r\n iconClass?: string\r\n }\r\n\r\n const props = withDefaults(\r\n defineProps<{\r\n modelValue?: string\r\n options?: LanguageOption[]\r\n }>(),\r\n {\r\n modelValue: 'zh-cn',\r\n options: () => [\r\n { key: 'zh-cn', label: '简体中文', iconClass: 'mdi:alpha-c' },\r\n { key: 'en', label: 'English', iconClass: 'mdi:alpha-u' },\r\n { key: 'ja', label: '日本語', iconClass: 'mdi:alpha-j' },\r\n { key: 'ko', label: '한국어', iconClass: 'mdi:alpha-k' },\r\n ],\r\n }\r\n )\r\n\r\n const emit = defineEmits<{\r\n 'update:modelValue': [key: string]\r\n change: [key: string]\r\n }>()\r\n\r\n const finalOptions = computed(() =>\r\n props.options.map(opt => ({\r\n key: opt.key,\r\n label: opt.label,\r\n icon: opt.iconClass\r\n ? () => h(C_Icon, { name: opt.iconClass, size: 16 })\r\n : undefined,\r\n }))\r\n )\r\n\r\n const handleLanguageChange = (key: string) => {\r\n if (key === props.modelValue) return\r\n emit('update:modelValue', key)\r\n emit('change', key)\r\n }\r\n</script>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-11-19\r\n * @Description: 语言切换组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <NDropdown\r\n size=\"small\"\r\n trigger=\"hover\"\r\n :options=\"finalOptions\"\r\n :value=\"modelValue\"\r\n @select=\"handleLanguageChange\"\r\n >\r\n <NButton text>\r\n <div class=\"flex items-center\">\r\n <C_Icon\r\n name=\"mdi:language\"\r\n :size=\"18\"\r\n />\r\n </div>\r\n </NButton>\r\n </NDropdown>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { computed, h } from 'vue'\r\n import { NDropdown, NButton } from 'naive-ui'\r\n import C_Icon from '../C_Icon/index.vue'\r\n\r\n defineOptions({ name: 'C_Language' })\r\n\r\n export interface LanguageOption {\r\n key: string\r\n label: string\r\n iconClass?: string\r\n }\r\n\r\n const props = withDefaults(\r\n defineProps<{\r\n modelValue?: string\r\n options?: LanguageOption[]\r\n }>(),\r\n {\r\n modelValue: 'zh-cn',\r\n options: () => [\r\n { key: 'zh-cn', label: '简体中文', iconClass: 'mdi:alpha-c' },\r\n { key: 'en', label: 'English', iconClass: 'mdi:alpha-u' },\r\n { key: 'ja', label: '日本語', iconClass: 'mdi:alpha-j' },\r\n { key: 'ko', label: '한국어', iconClass: 'mdi:alpha-k' },\r\n ],\r\n }\r\n )\r\n\r\n const emit = defineEmits<{\r\n 'update:modelValue': [key: string]\r\n change: [key: string]\r\n }>()\r\n\r\n const finalOptions = computed(() =>\r\n props.options.map(opt => ({\r\n key: opt.key,\r\n label: opt.label,\r\n icon: opt.iconClass\r\n ? () => h(C_Icon, { name: opt.iconClass, size: 16 })\r\n : undefined,\r\n }))\r\n )\r\n\r\n const handleLanguageChange = (key: string) => {\r\n if (key === props.modelValue) return\r\n emit('update:modelValue', key)\r\n emit('change', key)\r\n }\r\n</script>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-11-19\r\n * @Description: 语言切换组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <NDropdown\r\n size=\"small\"\r\n trigger=\"hover\"\r\n :options=\"finalOptions\"\r\n :value=\"modelValue\"\r\n @select=\"handleLanguageChange\"\r\n >\r\n <NButton text>\r\n <div class=\"flex items-center\">\r\n <C_Icon\r\n name=\"mdi:language\"\r\n :size=\"18\"\r\n />\r\n </div>\r\n </NButton>\r\n </NDropdown>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { computed, h } from 'vue'\r\n import { NDropdown, NButton } from 'naive-ui'\r\n import C_Icon from '../C_Icon/index.vue'\r\n\r\n defineOptions({ name: 'C_Language' })\r\n\r\n export interface LanguageOption {\r\n key: string\r\n label: string\r\n iconClass?: string\r\n }\r\n\r\n const props = withDefaults(\r\n defineProps<{\r\n modelValue?: string\r\n options?: LanguageOption[]\r\n }>(),\r\n {\r\n modelValue: 'zh-cn',\r\n options: () => [\r\n { key: 'zh-cn', label: '简体中文', iconClass: 'mdi:alpha-c' },\r\n { key: 'en', label: 'English', iconClass: 'mdi:alpha-u' },\r\n { key: 'ja', label: '日本語', iconClass: 'mdi:alpha-j' },\r\n { key: 'ko', label: '한국어', iconClass: 'mdi:alpha-k' },\r\n ],\r\n }\r\n )\r\n\r\n const emit = defineEmits<{\r\n 'update:modelValue': [key: string]\r\n change: [key: string]\r\n }>()\r\n\r\n const finalOptions = computed(() =>\r\n props.options.map(opt => ({\r\n key: opt.key,\r\n label: opt.label,\r\n icon: opt.iconClass\r\n ? () => h(C_Icon, { name: opt.iconClass, size: 16 })\r\n : undefined,\r\n }))\r\n )\r\n\r\n const handleLanguageChange = (key: string) => {\r\n if (key === props.modelValue) return\r\n emit('update:modelValue', key)\r\n emit('change', key)\r\n }\r\n</script>\r\n"],"mappings":"0fEuCE,IAAM,EAAQ,EAgBR,EAAO,EAKP,GAAA,EAAA,EAAA,cACJ,EAAM,QAAQ,IAAI,IAAQ,CACxB,IAAK,EAAI,IACT,MAAO,EAAI,MACX,KAAM,EAAI,eAAA,EAAA,EAAA,GACE,EAAA,EAAQ,CAAE,KAAM,EAAI,UAAW,KAAM,GAAI,CAAC,CAClD,IAAA,GACL,EAAE,CACJ,CAEK,EAAwB,GAAgB,CACxC,IAAQ,EAAM,aAClB,EAAK,oBAAqB,EAAI,CAC9B,EAAK,SAAU,EAAI,iEAlDT,EAAA,UAAA,CAAA,CAdV,KAAK,QACL,QAAQ,QACP,QAAS,EAAA,MACT,MAAOA,EAAAA,WACP,SAAQ,8BASC,EAAA,EAAA,EAAA,cAAA,EAAA,EAAA,OAAA,EAAA,QAAA,CAAA,CAPD,KAAA,GAAI,CAAA,2BAML,EAAA,EAAA,EAAA,oBAAA,MALN,EAKM,EAAA,EAAA,EAAA,aADF,EAAA,EAAA,CAFA,KAAK,eACJ,KAAM"}
|
package/dist/C_Language2.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"C_Language2.js","names":["modelValue"],"sources":["../src/components/C_Language/index.vue","../src/components/C_Language/index.vue","../src/components/C_Language/index.vue"],"sourcesContent":["/* unplugin-vue-components disabled */<!--\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2025-11-19\n * @Description: 语言切换组件\n * @Migration: naive-ui-components 组件库迁移版本\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <NDropdown\n size=\"small\"\n trigger=\"hover\"\n :options=\"finalOptions\"\n :value=\"modelValue\"\n @select=\"handleLanguageChange\"\n >\n <NButton text>\n <div class=\"flex items-center\">\n <C_Icon
|
|
1
|
+
{"version":3,"file":"C_Language2.js","names":["modelValue"],"sources":["../src/components/C_Language/index.vue","../src/components/C_Language/index.vue","../src/components/C_Language/index.vue"],"sourcesContent":["/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-11-19\r\n * @Description: 语言切换组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <NDropdown\r\n size=\"small\"\r\n trigger=\"hover\"\r\n :options=\"finalOptions\"\r\n :value=\"modelValue\"\r\n @select=\"handleLanguageChange\"\r\n >\r\n <NButton text>\r\n <div class=\"flex items-center\">\r\n <C_Icon\r\n name=\"mdi:language\"\r\n :size=\"18\"\r\n />\r\n </div>\r\n </NButton>\r\n </NDropdown>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { computed, h } from 'vue'\r\n import { NDropdown, NButton } from 'naive-ui'\r\n import C_Icon from '../C_Icon/index.vue'\r\n\r\n defineOptions({ name: 'C_Language' })\r\n\r\n export interface LanguageOption {\r\n key: string\r\n label: string\r\n iconClass?: string\r\n }\r\n\r\n const props = withDefaults(\r\n defineProps<{\r\n modelValue?: string\r\n options?: LanguageOption[]\r\n }>(),\r\n {\r\n modelValue: 'zh-cn',\r\n options: () => [\r\n { key: 'zh-cn', label: '简体中文', iconClass: 'mdi:alpha-c' },\r\n { key: 'en', label: 'English', iconClass: 'mdi:alpha-u' },\r\n { key: 'ja', label: '日本語', iconClass: 'mdi:alpha-j' },\r\n { key: 'ko', label: '한국어', iconClass: 'mdi:alpha-k' },\r\n ],\r\n }\r\n )\r\n\r\n const emit = defineEmits<{\r\n 'update:modelValue': [key: string]\r\n change: [key: string]\r\n }>()\r\n\r\n const finalOptions = computed(() =>\r\n props.options.map(opt => ({\r\n key: opt.key,\r\n label: opt.label,\r\n icon: opt.iconClass\r\n ? () => h(C_Icon, { name: opt.iconClass, size: 16 })\r\n : undefined,\r\n }))\r\n )\r\n\r\n const handleLanguageChange = (key: string) => {\r\n if (key === props.modelValue) return\r\n emit('update:modelValue', key)\r\n emit('change', key)\r\n }\r\n</script>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-11-19\r\n * @Description: 语言切换组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <NDropdown\r\n size=\"small\"\r\n trigger=\"hover\"\r\n :options=\"finalOptions\"\r\n :value=\"modelValue\"\r\n @select=\"handleLanguageChange\"\r\n >\r\n <NButton text>\r\n <div class=\"flex items-center\">\r\n <C_Icon\r\n name=\"mdi:language\"\r\n :size=\"18\"\r\n />\r\n </div>\r\n </NButton>\r\n </NDropdown>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { computed, h } from 'vue'\r\n import { NDropdown, NButton } from 'naive-ui'\r\n import C_Icon from '../C_Icon/index.vue'\r\n\r\n defineOptions({ name: 'C_Language' })\r\n\r\n export interface LanguageOption {\r\n key: string\r\n label: string\r\n iconClass?: string\r\n }\r\n\r\n const props = withDefaults(\r\n defineProps<{\r\n modelValue?: string\r\n options?: LanguageOption[]\r\n }>(),\r\n {\r\n modelValue: 'zh-cn',\r\n options: () => [\r\n { key: 'zh-cn', label: '简体中文', iconClass: 'mdi:alpha-c' },\r\n { key: 'en', label: 'English', iconClass: 'mdi:alpha-u' },\r\n { key: 'ja', label: '日本語', iconClass: 'mdi:alpha-j' },\r\n { key: 'ko', label: '한국어', iconClass: 'mdi:alpha-k' },\r\n ],\r\n }\r\n )\r\n\r\n const emit = defineEmits<{\r\n 'update:modelValue': [key: string]\r\n change: [key: string]\r\n }>()\r\n\r\n const finalOptions = computed(() =>\r\n props.options.map(opt => ({\r\n key: opt.key,\r\n label: opt.label,\r\n icon: opt.iconClass\r\n ? () => h(C_Icon, { name: opt.iconClass, size: 16 })\r\n : undefined,\r\n }))\r\n )\r\n\r\n const handleLanguageChange = (key: string) => {\r\n if (key === props.modelValue) return\r\n emit('update:modelValue', key)\r\n emit('change', key)\r\n }\r\n</script>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-11-19\r\n * @Description: 语言切换组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <NDropdown\r\n size=\"small\"\r\n trigger=\"hover\"\r\n :options=\"finalOptions\"\r\n :value=\"modelValue\"\r\n @select=\"handleLanguageChange\"\r\n >\r\n <NButton text>\r\n <div class=\"flex items-center\">\r\n <C_Icon\r\n name=\"mdi:language\"\r\n :size=\"18\"\r\n />\r\n </div>\r\n </NButton>\r\n </NDropdown>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { computed, h } from 'vue'\r\n import { NDropdown, NButton } from 'naive-ui'\r\n import C_Icon from '../C_Icon/index.vue'\r\n\r\n defineOptions({ name: 'C_Language' })\r\n\r\n export interface LanguageOption {\r\n key: string\r\n label: string\r\n iconClass?: string\r\n }\r\n\r\n const props = withDefaults(\r\n defineProps<{\r\n modelValue?: string\r\n options?: LanguageOption[]\r\n }>(),\r\n {\r\n modelValue: 'zh-cn',\r\n options: () => [\r\n { key: 'zh-cn', label: '简体中文', iconClass: 'mdi:alpha-c' },\r\n { key: 'en', label: 'English', iconClass: 'mdi:alpha-u' },\r\n { key: 'ja', label: '日本語', iconClass: 'mdi:alpha-j' },\r\n { key: 'ko', label: '한국어', iconClass: 'mdi:alpha-k' },\r\n ],\r\n }\r\n )\r\n\r\n const emit = defineEmits<{\r\n 'update:modelValue': [key: string]\r\n change: [key: string]\r\n }>()\r\n\r\n const finalOptions = computed(() =>\r\n props.options.map(opt => ({\r\n key: opt.key,\r\n label: opt.label,\r\n icon: opt.iconClass\r\n ? () => h(C_Icon, { name: opt.iconClass, size: 16 })\r\n : undefined,\r\n }))\r\n )\r\n\r\n const handleLanguageChange = (key: string) => {\r\n if (key === props.modelValue) return\r\n emit('update:modelValue', key)\r\n emit('change', key)\r\n }\r\n</script>\r\n"],"mappings":"qnBEuCE,IAAM,EAAQ,EAgBR,EAAO,EAKP,EAAe,MACnB,EAAM,QAAQ,IAAI,IAAQ,CACxB,IAAK,EAAI,IACT,MAAO,EAAI,MACX,KAAM,EAAI,cACA,EAAE,EAAQ,CAAE,KAAM,EAAI,UAAW,KAAM,GAAI,CAAC,CAClD,IAAA,GACL,EAAE,CACJ,CAEK,EAAwB,GAAgB,CACxC,IAAQ,EAAM,aAClB,EAAK,oBAAqB,EAAI,CAC9B,EAAK,SAAU,EAAI,qBAjErB,EAeY,EAAA,EAAA,CAAA,CAdV,KAAK,QACL,QAAQ,QACP,QAAS,EAAA,MACT,MAAOA,EAAAA,WACP,SAAQ,kBASC,CAPV,EAOU,EAAA,EAAA,CAAA,CAPD,KAAA,GAAI,CAAA,eAML,CALN,EAKM,MALN,EAKM,CAJJ,EAGE,EAAA,CAFA,KAAK,eACJ,KAAM"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"C_Map-BCJmDnJT.css","names":[],"sources":["../src/components/C_Map/index.vue?vue&type=style&index=0&scoped=a3602506&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled */.c-map[data-v-a3602506] {\n position: relative;\n width: 100%;\n min-height: 300px;\n background: #f5f5f5;\n border-radius: 4px;\n overflow: hidden;\n}\n.c-map .map-container[data-v-a3602506] {\n width: 100%;\n height: 100%;\n border-radius: 4px;\n overflow: hidden;\n}\n.c-map .map-loading[data-v-a3602506] {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(255, 255, 255, 0.9);\n border-radius: 4px;\n z-index: 1000;\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"}
|
package/dist/C_Map.css
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/* unplugin-vue-components disabled */.c-map[data-v-a3602506] {
|
|
2
|
+
position: relative;
|
|
3
|
+
width: 100%;
|
|
4
|
+
min-height: 300px;
|
|
5
|
+
background: #f5f5f5;
|
|
6
|
+
border-radius: 4px;
|
|
7
|
+
overflow: hidden;
|
|
8
|
+
}
|
|
9
|
+
.c-map .map-container[data-v-a3602506] {
|
|
10
|
+
width: 100%;
|
|
11
|
+
height: 100%;
|
|
12
|
+
border-radius: 4px;
|
|
13
|
+
overflow: hidden;
|
|
14
|
+
}
|
|
15
|
+
.c-map .map-loading[data-v-a3602506] {
|
|
16
|
+
position: absolute;
|
|
17
|
+
top: 0;
|
|
18
|
+
left: 0;
|
|
19
|
+
width: 100%;
|
|
20
|
+
height: 100%;
|
|
21
|
+
display: flex;
|
|
22
|
+
align-items: center;
|
|
23
|
+
justify-content: center;
|
|
24
|
+
background: rgba(255, 255, 255, 0.9);
|
|
25
|
+
border-radius: 4px;
|
|
26
|
+
z-index: 1000;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/*# sourceMappingURL=C_Map-BCJmDnJT.css.map*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"C_Markdown-
|
|
1
|
+
{"version":3,"file":"C_Markdown-7iBnLDtL.css","names":[],"sources":["../src/components/C_Markdown/index.vue?vue&type=style&index=0&scoped=67f4346d&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled *//* C_Markdown 组件样式文件 */\n.c-markdown-wrapper[data-v-67f4346d] {\n position: relative;\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor {\n border-radius: 6px;\n border: 1px solid var(--c-border);\n background-color: var(--c-bg-card);\n /* 禁用状态样式 */\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor:hover {\n border-color: var(--c-primary);\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor:focus-within {\n border-color: var(--c-primary);\n box-shadow: 0 0 0 2px var(--c-primary-opacity, rgba(24, 160, 88, 0.2));\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor.disabled {\n background-color: var(--c-bg-disabled, #fafafc);\n cursor: not-allowed;\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor.disabled .v-md-editor__editor {\n cursor: not-allowed;\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar {\n background-color: var(--c-bg-card);\n border-bottom: 1px solid var(--c-border);\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__editor-wrapper {\n background-color: var(--c-bg-card);\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__editor {\n background-color: var(--c-bg-card);\n color: var(--c-text-1);\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__editor textarea {\n color: var(--c-text-1);\n caret-color: var(--c-text-1);\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__preview-wrapper {\n background-color: var(--c-bg-card);\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__preview {\n background-color: var(--c-bg-card);\n color: var(--c-text-1);\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__toc-nav-wrapper {\n background-color: var(--c-bg-card);\n border-left: 1px solid var(--c-border);\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-item {\n color: #ffffff;\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-item:hover {\n background-color: rgba(255, 255, 255, 0.08);\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-item.is-active {\n background-color: rgba(255, 255, 255, 0.12);\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-item svg {\n fill: #ffffff;\n opacity: 0.9;\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-item:hover svg {\n opacity: 1;\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item {\n background-color: transparent;\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item svg {\n fill: #ffffff;\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item:hover {\n background-color: rgba(255, 255, 255, 0.08);\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-divider {\n background-color: var(--c-border);\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__editor::-webkit-scrollbar,\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__preview::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-track,\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-track {\n background-color: rgba(255, 255, 255, 0.05);\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-thumb,\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-thumb {\n background-color: rgba(255, 255, 255, 0.2);\n border-radius: 4px;\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-thumb:hover,\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-thumb:hover {\n background-color: rgba(255, 255, 255, 0.3);\n}\n.c-markdown-wrapper .word-count[data-v-67f4346d] {\n position: absolute;\n bottom: 8px;\n right: 12px;\n font-size: 12px;\n color: var(--c-text-4);\n background: var(--c-bg-card);\n padding: 2px 6px;\n border-radius: 4px;\n z-index: 10;\n}\n.c-markdown-wrapper .word-count.exceed[data-v-67f4346d] {\n color: var(--c-error);\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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"C_Markdown-BbTvdFCl.css","names":[],"sources":["../src/components/C_Markdown/index.vue?vue&type=style&index=0&scoped=67f4346d&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled *//* C_Markdown 组件样式文件 */\n.c-markdown-wrapper[data-v-67f4346d] {\n position: relative;\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor {\n border-radius: 6px;\n border: 1px solid var(--c-border);\n background-color: var(--c-bg-card);\n /* 禁用状态样式 */\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor:hover {\n border-color: var(--c-primary);\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor:focus-within {\n border-color: var(--c-primary);\n box-shadow: 0 0 0 2px var(--c-primary-opacity, rgba(24, 160, 88, 0.2));\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor.disabled {\n background-color: var(--c-bg-disabled, #fafafc);\n cursor: not-allowed;\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor.disabled .v-md-editor__editor {\n cursor: not-allowed;\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar {\n background-color: var(--c-bg-card);\n border-bottom: 1px solid var(--c-border);\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__editor-wrapper {\n background-color: var(--c-bg-card);\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__editor {\n background-color: var(--c-bg-card);\n color: var(--c-text-1);\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__editor textarea {\n color: var(--c-text-1);\n caret-color: var(--c-text-1);\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__preview-wrapper {\n background-color: var(--c-bg-card);\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__preview {\n background-color: var(--c-bg-card);\n color: var(--c-text-1);\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__toc-nav-wrapper {\n background-color: var(--c-bg-card);\n border-left: 1px solid var(--c-border);\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-item {\n color: #ffffff;\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-item:hover {\n background-color: rgba(255, 255, 255, 0.08);\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-item.is-active {\n background-color: rgba(255, 255, 255, 0.12);\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-item svg {\n fill: #ffffff;\n opacity: 0.9;\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-item:hover svg {\n opacity: 1;\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item {\n background-color: transparent;\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item svg {\n fill: #ffffff;\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item:hover {\n background-color: rgba(255, 255, 255, 0.08);\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-divider {\n background-color: var(--c-border);\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__editor::-webkit-scrollbar,\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__preview::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-track,\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-track {\n background-color: rgba(255, 255, 255, 0.05);\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-thumb,\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-thumb {\n background-color: rgba(255, 255, 255, 0.2);\n border-radius: 4px;\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-thumb:hover,\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-thumb:hover {\n background-color: rgba(255, 255, 255, 0.3);\n}\n.c-markdown-wrapper .word-count[data-v-67f4346d] {\n position: absolute;\n bottom: 8px;\n right: 12px;\n font-size: 12px;\n color: var(--c-text-4);\n background: var(--c-bg-card);\n padding: 2px 6px;\n border-radius: 4px;\n z-index: 10;\n}\n.c-markdown-wrapper .word-count.exceed[data-v-67f4346d] {\n color: var(--c-error);\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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/* unplugin-vue-components disabled *//* C_Markdown 组件样式文件 */
|
|
2
|
+
.c-markdown-wrapper[data-v-67f4346d] {
|
|
3
|
+
position: relative;
|
|
4
|
+
}
|
|
5
|
+
.c-markdown-wrapper[data-v-67f4346d] .v-md-editor {
|
|
6
|
+
border-radius: 6px;
|
|
7
|
+
border: 1px solid var(--c-border);
|
|
8
|
+
background-color: var(--c-bg-card);
|
|
9
|
+
/* 禁用状态样式 */
|
|
10
|
+
}
|
|
11
|
+
.c-markdown-wrapper[data-v-67f4346d] .v-md-editor:hover {
|
|
12
|
+
border-color: var(--c-primary);
|
|
13
|
+
}
|
|
14
|
+
.c-markdown-wrapper[data-v-67f4346d] .v-md-editor:focus-within {
|
|
15
|
+
border-color: var(--c-primary);
|
|
16
|
+
box-shadow: 0 0 0 2px var(--c-primary-opacity, rgba(24, 160, 88, 0.2));
|
|
17
|
+
}
|
|
18
|
+
.c-markdown-wrapper[data-v-67f4346d] .v-md-editor.disabled {
|
|
19
|
+
background-color: var(--c-bg-disabled, #fafafc);
|
|
20
|
+
cursor: not-allowed;
|
|
21
|
+
}
|
|
22
|
+
.c-markdown-wrapper[data-v-67f4346d] .v-md-editor.disabled .v-md-editor__editor {
|
|
23
|
+
cursor: not-allowed;
|
|
24
|
+
}
|
|
25
|
+
.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar {
|
|
26
|
+
background-color: var(--c-bg-card);
|
|
27
|
+
border-bottom: 1px solid var(--c-border);
|
|
28
|
+
}
|
|
29
|
+
.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__editor-wrapper {
|
|
30
|
+
background-color: var(--c-bg-card);
|
|
31
|
+
}
|
|
32
|
+
.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__editor {
|
|
33
|
+
background-color: var(--c-bg-card);
|
|
34
|
+
color: var(--c-text-1);
|
|
35
|
+
}
|
|
36
|
+
.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__editor textarea {
|
|
37
|
+
color: var(--c-text-1);
|
|
38
|
+
caret-color: var(--c-text-1);
|
|
39
|
+
}
|
|
40
|
+
.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__preview-wrapper {
|
|
41
|
+
background-color: var(--c-bg-card);
|
|
42
|
+
}
|
|
43
|
+
.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__preview {
|
|
44
|
+
background-color: var(--c-bg-card);
|
|
45
|
+
color: var(--c-text-1);
|
|
46
|
+
}
|
|
47
|
+
.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__toc-nav-wrapper {
|
|
48
|
+
background-color: var(--c-bg-card);
|
|
49
|
+
border-left: 1px solid var(--c-border);
|
|
50
|
+
}
|
|
51
|
+
.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-item {
|
|
52
|
+
color: #ffffff;
|
|
53
|
+
}
|
|
54
|
+
.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-item:hover {
|
|
55
|
+
background-color: rgba(255, 255, 255, 0.08);
|
|
56
|
+
}
|
|
57
|
+
.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-item.is-active {
|
|
58
|
+
background-color: rgba(255, 255, 255, 0.12);
|
|
59
|
+
}
|
|
60
|
+
.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-item svg {
|
|
61
|
+
fill: #ffffff;
|
|
62
|
+
opacity: 0.9;
|
|
63
|
+
}
|
|
64
|
+
.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-item:hover svg {
|
|
65
|
+
opacity: 1;
|
|
66
|
+
}
|
|
67
|
+
.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item {
|
|
68
|
+
background-color: transparent;
|
|
69
|
+
}
|
|
70
|
+
.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item svg {
|
|
71
|
+
fill: #ffffff;
|
|
72
|
+
}
|
|
73
|
+
.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item:hover {
|
|
74
|
+
background-color: rgba(255, 255, 255, 0.08);
|
|
75
|
+
}
|
|
76
|
+
.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-divider {
|
|
77
|
+
background-color: var(--c-border);
|
|
78
|
+
}
|
|
79
|
+
.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__editor::-webkit-scrollbar,
|
|
80
|
+
.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__preview::-webkit-scrollbar {
|
|
81
|
+
width: 8px;
|
|
82
|
+
height: 8px;
|
|
83
|
+
}
|
|
84
|
+
.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-track,
|
|
85
|
+
.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-track {
|
|
86
|
+
background-color: rgba(255, 255, 255, 0.05);
|
|
87
|
+
}
|
|
88
|
+
.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-thumb,
|
|
89
|
+
.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-thumb {
|
|
90
|
+
background-color: rgba(255, 255, 255, 0.2);
|
|
91
|
+
border-radius: 4px;
|
|
92
|
+
}
|
|
93
|
+
.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-thumb:hover,
|
|
94
|
+
.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-thumb:hover {
|
|
95
|
+
background-color: rgba(255, 255, 255, 0.3);
|
|
96
|
+
}
|
|
97
|
+
.c-markdown-wrapper .word-count[data-v-67f4346d] {
|
|
98
|
+
position: absolute;
|
|
99
|
+
bottom: 8px;
|
|
100
|
+
right: 12px;
|
|
101
|
+
font-size: 12px;
|
|
102
|
+
color: var(--c-text-4);
|
|
103
|
+
background: var(--c-bg-card);
|
|
104
|
+
padding: 2px 6px;
|
|
105
|
+
border-radius: 4px;
|
|
106
|
+
z-index: 10;
|
|
107
|
+
}
|
|
108
|
+
.c-markdown-wrapper .word-count.exceed[data-v-67f4346d] {
|
|
109
|
+
color: var(--c-error);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/*# sourceMappingURL=C_Markdown-7iBnLDtL.css.map*/
|
package/dist/C_Markdown.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"C_Markdown.js","names":["isDark","modelValue","height","placeholder","toolbar","mode","tocNavPosition","defaultFullscreen","autofocus","includeLevel","leftToolbar","rightToolbar"],"sources":["../src/components/C_Markdown/index.vue","../src/components/C_Markdown/index.vue","../src/components/C_Markdown/index.vue"],"sourcesContent":["/* unplugin-vue-components disabled */<!--\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2025-06-20\n * @Description: Markdown 编辑器封装组件\n * @Migration: naive-ui-components 组件库迁移版本\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <div class=\"c-markdown-wrapper\" :class=\"{ 'is-dark': isDark }\">\n <VMdEditor\n ref=\"editorRef\"\n :model-value=\"modelValue\"\n :height=\"height\"\n :placeholder=\"placeholder\"\n :toolbar=\"toolbar\"\n :mode=\"mode\"\n :upload-image-config=\"computedUploadImageConfig\"\n :toc-nav-position=\"tocNavPosition\"\n :default-fullscreen=\"defaultFullscreen\"\n :autofocus=\"autofocus\"\n :include-level=\"includeLevel\"\n :left-toolbar=\"leftToolbar\"\n :right-toolbar=\"rightToolbar\"\n :default-show-toc=\"true\"\n @update:model-value=\"handleInput\"\n @change=\"handleChange\"\n @save=\"handleSave\"\n @upload-image=\"handleUploadImage\"\n @fullscreen-change=\"handleFullscreenChange\"\n @copy-code-success=\"handleCopyCodeSuccess\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, onMounted } from \"vue\";\nimport VMdEditor from \"@kangc/v-md-editor\";\n\ndefineOptions({ name: \"C_Markdown\" });\n\nexport type InsertImageFunction = (config: {\n url: string;\n desc?: string;\n width?: string | number;\n height?: string | number;\n}) => void;\n\ninterface Props {\n modelValue?: string;\n height?: string | number;\n disabled?: boolean;\n placeholder?: string;\n mode?: \"edit\" | \"editable\" | \"preview\";\n toolbar?: object;\n uploadImageConfig?: {\n accept?: string;\n multiple?: boolean;\n [key: string]: any;\n };\n tocNavPosition?: \"left\" | \"right\";\n defaultFullscreen?: boolean;\n autofocus?: boolean;\n includeLevel?: number[];\n leftToolbar?: string;\n rightToolbar?: string;\n maxLength?: number;\n showWordCount?: boolean;\n autoSave?: boolean;\n autoSaveInterval?: number;\n /** 是否为暗色主题(外部传入) */\n isDark?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n modelValue: \"\",\n height: \"400px\",\n disabled: false,\n placeholder: \"请输入 Markdown 内容...\",\n mode: \"editable\",\n tocNavPosition: \"right\",\n defaultFullscreen: false,\n autofocus: false,\n includeLevel: () => [1, 2, 3, 4, 5, 6],\n leftToolbar:\n \"undo redo clear | h bold italic strikethrough quote | ul ol table hr | link image code | save\",\n rightToolbar: \"preview toc sync-scroll fullscreen\",\n maxLength: 50000,\n showWordCount: true,\n autoSave: false,\n autoSaveInterval: 30000,\n isDark: false,\n});\n\ninterface Emits {\n \"update:modelValue\": [value: string];\n change: [text: string, html: string];\n save: [text: string, html: string];\n \"upload-image\": [\n event: Event,\n insertImage: InsertImageFunction,\n files: FileList,\n ];\n \"fullscreen-change\": [isFullscreen: boolean];\n \"copy-code-success\": [text: string];\n \"word-count-change\": [count: number];\n \"auto-save\": [text: string];\n \"max-length-exceeded\": [currentLength: number, maxLength: number];\n}\n\nconst emit = defineEmits<Emits>();\n\nconst editorRef = ref<any>(null);\nconst cachedHtml = ref(\"\");\n\nconst wordCount = computed(() => {\n return props.modelValue?.length || 0;\n});\n\nconst computedUploadImageConfig = computed(() => {\n const defaultConfig = {\n accept: \"image/*\",\n multiple: false,\n };\n return props.uploadImageConfig\n ? { ...defaultConfig, ...props.uploadImageConfig }\n : defaultConfig;\n});\n\nonMounted(() => {\n if (props.showWordCount && props.modelValue) {\n emit(\"word-count-change\", props.modelValue.length);\n }\n});\n\nwatch(\n () => props.modelValue,\n (newValue) => {\n if (props.showWordCount) {\n emit(\"word-count-change\", newValue?.length || 0);\n }\n },\n { immediate: true },\n);\n\nconst handleInput = (value: string) => {\n if (value.length > props.maxLength) {\n emit(\"max-length-exceeded\", value.length, props.maxLength);\n return;\n }\n emit(\"update:modelValue\", value);\n if (props.showWordCount) {\n emit(\"word-count-change\", value.length);\n }\n};\n\nconst handleChange = (text: string, html: string) => {\n cachedHtml.value = html;\n emit(\"change\", text, html);\n if (props.autoSave) {\n autoSave(text);\n }\n};\n\nconst handleSave = (text: string, html: string) => {\n emit(\"save\", text, html);\n};\n\nconst handleUploadImage = (\n event: Event,\n insertImage: InsertImageFunction,\n files: FileList,\n) => {\n emit(\"upload-image\", event, insertImage, files);\n};\n\nconst handleFullscreenChange = (isFullscreen: boolean) => {\n emit(\"fullscreen-change\", isFullscreen);\n};\n\nconst handleCopyCodeSuccess = (text: string) => {\n emit(\"copy-code-success\", text);\n};\n\nlet autoSaveTimer: ReturnType<typeof setTimeout> | null = null;\n\nconst autoSave = (text: string) => {\n if (autoSaveTimer) clearTimeout(autoSaveTimer);\n autoSaveTimer = setTimeout(() => {\n emit(\"auto-save\", text);\n }, props.autoSaveInterval);\n};\n\nconst focus = () => {\n editorRef.value?.focus();\n};\n\nconst getHtml = (): string => {\n return cachedHtml.value;\n};\n\nconst insertText = (text: string) => {\n editorRef.value?.insert((selected: string) => ({\n text: `${selected}${text}`,\n selected: text,\n }));\n};\n\ndefineExpose({\n focus,\n getHtml,\n insertText,\n wordCount,\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@use \"./index.scss\";\n</style>\n","/* unplugin-vue-components disabled */<!--\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2025-06-20\n * @Description: Markdown 编辑器封装组件\n * @Migration: naive-ui-components 组件库迁移版本\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <div class=\"c-markdown-wrapper\" :class=\"{ 'is-dark': isDark }\">\n <VMdEditor\n ref=\"editorRef\"\n :model-value=\"modelValue\"\n :height=\"height\"\n :placeholder=\"placeholder\"\n :toolbar=\"toolbar\"\n :mode=\"mode\"\n :upload-image-config=\"computedUploadImageConfig\"\n :toc-nav-position=\"tocNavPosition\"\n :default-fullscreen=\"defaultFullscreen\"\n :autofocus=\"autofocus\"\n :include-level=\"includeLevel\"\n :left-toolbar=\"leftToolbar\"\n :right-toolbar=\"rightToolbar\"\n :default-show-toc=\"true\"\n @update:model-value=\"handleInput\"\n @change=\"handleChange\"\n @save=\"handleSave\"\n @upload-image=\"handleUploadImage\"\n @fullscreen-change=\"handleFullscreenChange\"\n @copy-code-success=\"handleCopyCodeSuccess\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, onMounted } from \"vue\";\nimport VMdEditor from \"@kangc/v-md-editor\";\n\ndefineOptions({ name: \"C_Markdown\" });\n\nexport type InsertImageFunction = (config: {\n url: string;\n desc?: string;\n width?: string | number;\n height?: string | number;\n}) => void;\n\ninterface Props {\n modelValue?: string;\n height?: string | number;\n disabled?: boolean;\n placeholder?: string;\n mode?: \"edit\" | \"editable\" | \"preview\";\n toolbar?: object;\n uploadImageConfig?: {\n accept?: string;\n multiple?: boolean;\n [key: string]: any;\n };\n tocNavPosition?: \"left\" | \"right\";\n defaultFullscreen?: boolean;\n autofocus?: boolean;\n includeLevel?: number[];\n leftToolbar?: string;\n rightToolbar?: string;\n maxLength?: number;\n showWordCount?: boolean;\n autoSave?: boolean;\n autoSaveInterval?: number;\n /** 是否为暗色主题(外部传入) */\n isDark?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n modelValue: \"\",\n height: \"400px\",\n disabled: false,\n placeholder: \"请输入 Markdown 内容...\",\n mode: \"editable\",\n tocNavPosition: \"right\",\n defaultFullscreen: false,\n autofocus: false,\n includeLevel: () => [1, 2, 3, 4, 5, 6],\n leftToolbar:\n \"undo redo clear | h bold italic strikethrough quote | ul ol table hr | link image code | save\",\n rightToolbar: \"preview toc sync-scroll fullscreen\",\n maxLength: 50000,\n showWordCount: true,\n autoSave: false,\n autoSaveInterval: 30000,\n isDark: false,\n});\n\ninterface Emits {\n \"update:modelValue\": [value: string];\n change: [text: string, html: string];\n save: [text: string, html: string];\n \"upload-image\": [\n event: Event,\n insertImage: InsertImageFunction,\n files: FileList,\n ];\n \"fullscreen-change\": [isFullscreen: boolean];\n \"copy-code-success\": [text: string];\n \"word-count-change\": [count: number];\n \"auto-save\": [text: string];\n \"max-length-exceeded\": [currentLength: number, maxLength: number];\n}\n\nconst emit = defineEmits<Emits>();\n\nconst editorRef = ref<any>(null);\nconst cachedHtml = ref(\"\");\n\nconst wordCount = computed(() => {\n return props.modelValue?.length || 0;\n});\n\nconst computedUploadImageConfig = computed(() => {\n const defaultConfig = {\n accept: \"image/*\",\n multiple: false,\n };\n return props.uploadImageConfig\n ? { ...defaultConfig, ...props.uploadImageConfig }\n : defaultConfig;\n});\n\nonMounted(() => {\n if (props.showWordCount && props.modelValue) {\n emit(\"word-count-change\", props.modelValue.length);\n }\n});\n\nwatch(\n () => props.modelValue,\n (newValue) => {\n if (props.showWordCount) {\n emit(\"word-count-change\", newValue?.length || 0);\n }\n },\n { immediate: true },\n);\n\nconst handleInput = (value: string) => {\n if (value.length > props.maxLength) {\n emit(\"max-length-exceeded\", value.length, props.maxLength);\n return;\n }\n emit(\"update:modelValue\", value);\n if (props.showWordCount) {\n emit(\"word-count-change\", value.length);\n }\n};\n\nconst handleChange = (text: string, html: string) => {\n cachedHtml.value = html;\n emit(\"change\", text, html);\n if (props.autoSave) {\n autoSave(text);\n }\n};\n\nconst handleSave = (text: string, html: string) => {\n emit(\"save\", text, html);\n};\n\nconst handleUploadImage = (\n event: Event,\n insertImage: InsertImageFunction,\n files: FileList,\n) => {\n emit(\"upload-image\", event, insertImage, files);\n};\n\nconst handleFullscreenChange = (isFullscreen: boolean) => {\n emit(\"fullscreen-change\", isFullscreen);\n};\n\nconst handleCopyCodeSuccess = (text: string) => {\n emit(\"copy-code-success\", text);\n};\n\nlet autoSaveTimer: ReturnType<typeof setTimeout> | null = null;\n\nconst autoSave = (text: string) => {\n if (autoSaveTimer) clearTimeout(autoSaveTimer);\n autoSaveTimer = setTimeout(() => {\n emit(\"auto-save\", text);\n }, props.autoSaveInterval);\n};\n\nconst focus = () => {\n editorRef.value?.focus();\n};\n\nconst getHtml = (): string => {\n return cachedHtml.value;\n};\n\nconst insertText = (text: string) => {\n editorRef.value?.insert((selected: string) => ({\n text: `${selected}${text}`,\n selected: text,\n }));\n};\n\ndefineExpose({\n focus,\n getHtml,\n insertText,\n wordCount,\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@use \"./index.scss\";\n</style>\n","<!--\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2025-06-20\n * @Description: Markdown 编辑器封装组件\n * @Migration: naive-ui-components 组件库迁移版本\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <div class=\"c-markdown-wrapper\" :class=\"{ 'is-dark': isDark }\">\n <VMdEditor\n ref=\"editorRef\"\n :model-value=\"modelValue\"\n :height=\"height\"\n :placeholder=\"placeholder\"\n :toolbar=\"toolbar\"\n :mode=\"mode\"\n :upload-image-config=\"computedUploadImageConfig\"\n :toc-nav-position=\"tocNavPosition\"\n :default-fullscreen=\"defaultFullscreen\"\n :autofocus=\"autofocus\"\n :include-level=\"includeLevel\"\n :left-toolbar=\"leftToolbar\"\n :right-toolbar=\"rightToolbar\"\n :default-show-toc=\"true\"\n @update:model-value=\"handleInput\"\n @change=\"handleChange\"\n @save=\"handleSave\"\n @upload-image=\"handleUploadImage\"\n @fullscreen-change=\"handleFullscreenChange\"\n @copy-code-success=\"handleCopyCodeSuccess\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, onMounted } from \"vue\";\nimport VMdEditor from \"@kangc/v-md-editor\";\n\ndefineOptions({ name: \"C_Markdown\" });\n\nexport type InsertImageFunction = (config: {\n url: string;\n desc?: string;\n width?: string | number;\n height?: string | number;\n}) => void;\n\ninterface Props {\n modelValue?: string;\n height?: string | number;\n disabled?: boolean;\n placeholder?: string;\n mode?: \"edit\" | \"editable\" | \"preview\";\n toolbar?: object;\n uploadImageConfig?: {\n accept?: string;\n multiple?: boolean;\n [key: string]: any;\n };\n tocNavPosition?: \"left\" | \"right\";\n defaultFullscreen?: boolean;\n autofocus?: boolean;\n includeLevel?: number[];\n leftToolbar?: string;\n rightToolbar?: string;\n maxLength?: number;\n showWordCount?: boolean;\n autoSave?: boolean;\n autoSaveInterval?: number;\n /** 是否为暗色主题(外部传入) */\n isDark?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n modelValue: \"\",\n height: \"400px\",\n disabled: false,\n placeholder: \"请输入 Markdown 内容...\",\n mode: \"editable\",\n tocNavPosition: \"right\",\n defaultFullscreen: false,\n autofocus: false,\n includeLevel: () => [1, 2, 3, 4, 5, 6],\n leftToolbar:\n \"undo redo clear | h bold italic strikethrough quote | ul ol table hr | link image code | save\",\n rightToolbar: \"preview toc sync-scroll fullscreen\",\n maxLength: 50000,\n showWordCount: true,\n autoSave: false,\n autoSaveInterval: 30000,\n isDark: false,\n});\n\ninterface Emits {\n \"update:modelValue\": [value: string];\n change: [text: string, html: string];\n save: [text: string, html: string];\n \"upload-image\": [\n event: Event,\n insertImage: InsertImageFunction,\n files: FileList,\n ];\n \"fullscreen-change\": [isFullscreen: boolean];\n \"copy-code-success\": [text: string];\n \"word-count-change\": [count: number];\n \"auto-save\": [text: string];\n \"max-length-exceeded\": [currentLength: number, maxLength: number];\n}\n\nconst emit = defineEmits<Emits>();\n\nconst editorRef = ref<any>(null);\nconst cachedHtml = ref(\"\");\n\nconst wordCount = computed(() => {\n return props.modelValue?.length || 0;\n});\n\nconst computedUploadImageConfig = computed(() => {\n const defaultConfig = {\n accept: \"image/*\",\n multiple: false,\n };\n return props.uploadImageConfig\n ? { ...defaultConfig, ...props.uploadImageConfig }\n : defaultConfig;\n});\n\nonMounted(() => {\n if (props.showWordCount && props.modelValue) {\n emit(\"word-count-change\", props.modelValue.length);\n }\n});\n\nwatch(\n () => props.modelValue,\n (newValue) => {\n if (props.showWordCount) {\n emit(\"word-count-change\", newValue?.length || 0);\n }\n },\n { immediate: true },\n);\n\nconst handleInput = (value: string) => {\n if (value.length > props.maxLength) {\n emit(\"max-length-exceeded\", value.length, props.maxLength);\n return;\n }\n emit(\"update:modelValue\", value);\n if (props.showWordCount) {\n emit(\"word-count-change\", value.length);\n }\n};\n\nconst handleChange = (text: string, html: string) => {\n cachedHtml.value = html;\n emit(\"change\", text, html);\n if (props.autoSave) {\n autoSave(text);\n }\n};\n\nconst handleSave = (text: string, html: string) => {\n emit(\"save\", text, html);\n};\n\nconst handleUploadImage = (\n event: Event,\n insertImage: InsertImageFunction,\n files: FileList,\n) => {\n emit(\"upload-image\", event, insertImage, files);\n};\n\nconst handleFullscreenChange = (isFullscreen: boolean) => {\n emit(\"fullscreen-change\", isFullscreen);\n};\n\nconst handleCopyCodeSuccess = (text: string) => {\n emit(\"copy-code-success\", text);\n};\n\nlet autoSaveTimer: ReturnType<typeof setTimeout> | null = null;\n\nconst autoSave = (text: string) => {\n if (autoSaveTimer) clearTimeout(autoSaveTimer);\n autoSaveTimer = setTimeout(() => {\n emit(\"auto-save\", text);\n }, props.autoSaveInterval);\n};\n\nconst focus = () => {\n editorRef.value?.focus();\n};\n\nconst getHtml = (): string => {\n return cachedHtml.value;\n};\n\nconst insertText = (text: string) => {\n editorRef.value?.insert((selected: string) => ({\n text: `${selected}${text}`,\n selected: text,\n }));\n};\n\ndefineExpose({\n focus,\n getHtml,\n insertText,\n wordCount,\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@use \"./index.scss\";\n</style>\n"],"mappings":"8hCEyEA,IAAM,EAAQ,EAoCR,EAAO,EAEP,GAAA,EAAA,EAAA,KAAqB,KAAK,CAC1B,GAAA,EAAA,EAAA,KAAiB,GAAG,CAEpB,GAAA,EAAA,EAAA,cACG,EAAM,YAAY,QAAU,EACnC,CAEI,GAAA,EAAA,EAAA,cAA2C,CAC/C,IAAM,EAAgB,CACpB,OAAQ,UACR,SAAU,GACX,CACD,OAAO,EAAM,kBACT,CAAE,GAAG,EAAe,GAAG,EAAM,kBAAkB,CAC/C,GACJ,EAEF,EAAA,EAAA,eAAgB,CACV,EAAM,eAAiB,EAAM,YAC/B,EAAK,oBAAqB,EAAM,WAAW,OAAO,EAEpD,EAEF,EAAA,EAAA,WACQ,EAAM,WACX,GAAa,CACR,EAAM,eACR,EAAK,oBAAqB,GAAU,QAAU,EAAE,EAGpD,CAAE,UAAW,GAAM,CACpB,CAED,IAAM,EAAe,GAAkB,CACrC,GAAI,EAAM,OAAS,EAAM,UAAW,CAClC,EAAK,sBAAuB,EAAM,OAAQ,EAAM,UAAU,CAC1D,OAEF,EAAK,oBAAqB,EAAM,CAC5B,EAAM,eACR,EAAK,oBAAqB,EAAM,OAAO,EAIrC,GAAgB,EAAc,IAAiB,CACnD,EAAW,MAAQ,EACnB,EAAK,SAAU,EAAM,EAAK,CACtB,EAAM,UACR,EAAS,EAAK,EAIZ,GAAc,EAAc,IAAiB,CACjD,EAAK,OAAQ,EAAM,EAAK,EAGpB,GACJ,EACA,EACA,IACG,CACH,EAAK,eAAgB,EAAO,EAAa,EAAM,EAG3C,EAA0B,GAA0B,CACxD,EAAK,oBAAqB,EAAa,EAGnC,EAAyB,GAAiB,CAC9C,EAAK,oBAAqB,EAAK,EAG7B,EAAsD,KAEpD,EAAY,GAAiB,CAC7B,GAAe,aAAa,EAAc,CAC9C,EAAgB,eAAiB,CAC/B,EAAK,YAAa,EAAK,EACtB,EAAM,iBAAiB,SAkB5B,EAAa,CACX,UAhBkB,CAClB,EAAU,OAAO,OAAO,EAgBxB,YAZO,EAAW,MAalB,WAVkB,GAAiB,CACnC,EAAU,OAAO,OAAQ,IAAsB,CAC7C,KAAM,GAAG,IAAW,IACpB,SAAU,EACX,EAAE,EAOH,YACD,CAAC,oDArLM,MAAA,CAvBD,OAAA,EAAA,EAAA,gBAAK,CAAC,qBAAoB,CAAA,UAAsBA,EAAAA,OAAM,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,EAAA,cAAA,EAAA,EAAA,OAsBvD,EAAA,QAAA,CAAA,SApBI,YAAJ,IAAI,EACH,cAAaC,EAAAA,WACb,OAAQC,EAAAA,OACR,YAAaC,EAAAA,YACb,QAASC,EAAAA,QACT,KAAMC,EAAAA,KACN,sBAAqB,EAAA,MACrB,mBAAkBC,EAAAA,eAClB,qBAAoBC,EAAAA,kBACpB,UAAWC,EAAAA,UACX,gBAAeC,EAAAA,aACf,eAAcC,EAAAA,YACd,gBAAeC,EAAAA,aACf,mBAAkB,GAClB,sBAAoB,EACpB,SAAQ,EACR,OAAM,EACN,cAAc,EACd,mBAAmB,EACnB,kBAAmB"}
|
|
1
|
+
{"version":3,"file":"C_Markdown.js","names":["isDark","modelValue","height","placeholder","toolbar","mode","tocNavPosition","defaultFullscreen","autofocus","includeLevel","leftToolbar","rightToolbar"],"sources":["../src/components/C_Markdown/index.vue","../src/components/C_Markdown/index.vue","../src/components/C_Markdown/index.vue"],"sourcesContent":["/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-20\r\n * @Description: Markdown 编辑器封装组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div\r\n class=\"c-markdown-wrapper\"\r\n :class=\"{ 'is-dark': isDark }\"\r\n >\r\n <VMdEditor\r\n ref=\"editorRef\"\r\n :model-value=\"modelValue\"\r\n :height=\"height\"\r\n :placeholder=\"placeholder\"\r\n :toolbar=\"toolbar\"\r\n :mode=\"mode\"\r\n :upload-image-config=\"computedUploadImageConfig\"\r\n :toc-nav-position=\"tocNavPosition\"\r\n :default-fullscreen=\"defaultFullscreen\"\r\n :autofocus=\"autofocus\"\r\n :include-level=\"includeLevel\"\r\n :left-toolbar=\"leftToolbar\"\r\n :right-toolbar=\"rightToolbar\"\r\n :default-show-toc=\"true\"\r\n @update:model-value=\"handleInput\"\r\n @change=\"handleChange\"\r\n @save=\"handleSave\"\r\n @upload-image=\"handleUploadImage\"\r\n @fullscreen-change=\"handleFullscreenChange\"\r\n @copy-code-success=\"handleCopyCodeSuccess\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { ref, computed, watch, onMounted } from 'vue'\r\n import VMdEditor from '@kangc/v-md-editor'\r\n\r\n defineOptions({ name: 'C_Markdown' })\r\n\r\n export type InsertImageFunction = (config: {\r\n url: string\r\n desc?: string\r\n width?: string | number\r\n height?: string | number\r\n }) => void\r\n\r\n interface Props {\r\n modelValue?: string\r\n height?: string | number\r\n disabled?: boolean\r\n placeholder?: string\r\n mode?: 'edit' | 'editable' | 'preview'\r\n toolbar?: object\r\n uploadImageConfig?: {\r\n accept?: string\r\n multiple?: boolean\r\n [key: string]: any\r\n }\r\n tocNavPosition?: 'left' | 'right'\r\n defaultFullscreen?: boolean\r\n autofocus?: boolean\r\n includeLevel?: number[]\r\n leftToolbar?: string\r\n rightToolbar?: string\r\n maxLength?: number\r\n showWordCount?: boolean\r\n autoSave?: boolean\r\n autoSaveInterval?: number\r\n /** 是否为暗色主题(外部传入) */\r\n isDark?: boolean\r\n }\r\n\r\n const props = withDefaults(defineProps<Props>(), {\r\n modelValue: '',\r\n height: '400px',\r\n disabled: false,\r\n placeholder: '请输入 Markdown 内容...',\r\n mode: 'editable',\r\n tocNavPosition: 'right',\r\n defaultFullscreen: false,\r\n autofocus: false,\r\n includeLevel: () => [1, 2, 3, 4, 5, 6],\r\n leftToolbar:\r\n 'undo redo clear | h bold italic strikethrough quote | ul ol table hr | link image code | save',\r\n rightToolbar: 'preview toc sync-scroll fullscreen',\r\n maxLength: 50000,\r\n showWordCount: true,\r\n autoSave: false,\r\n autoSaveInterval: 30000,\r\n isDark: false,\r\n })\r\n\r\n interface Emits {\r\n 'update:modelValue': [value: string]\r\n change: [text: string, html: string]\r\n save: [text: string, html: string]\r\n 'upload-image': [\r\n event: Event,\r\n insertImage: InsertImageFunction,\r\n files: FileList,\r\n ]\r\n 'fullscreen-change': [isFullscreen: boolean]\r\n 'copy-code-success': [text: string]\r\n 'word-count-change': [count: number]\r\n 'auto-save': [text: string]\r\n 'max-length-exceeded': [currentLength: number, maxLength: number]\r\n }\r\n\r\n const emit = defineEmits<Emits>()\r\n\r\n const editorRef = ref<any>(null)\r\n const cachedHtml = ref('')\r\n\r\n const wordCount = computed(() => {\r\n return props.modelValue?.length || 0\r\n })\r\n\r\n const computedUploadImageConfig = computed(() => {\r\n const defaultConfig = {\r\n accept: 'image/*',\r\n multiple: false,\r\n }\r\n return props.uploadImageConfig\r\n ? { ...defaultConfig, ...props.uploadImageConfig }\r\n : defaultConfig\r\n })\r\n\r\n onMounted(() => {\r\n if (props.showWordCount && props.modelValue) {\r\n emit('word-count-change', props.modelValue.length)\r\n }\r\n })\r\n\r\n watch(\r\n () => props.modelValue,\r\n newValue => {\r\n if (props.showWordCount) {\r\n emit('word-count-change', newValue?.length || 0)\r\n }\r\n },\r\n { immediate: true }\r\n )\r\n\r\n const handleInput = (value: string) => {\r\n if (value.length > props.maxLength) {\r\n emit('max-length-exceeded', value.length, props.maxLength)\r\n return\r\n }\r\n emit('update:modelValue', value)\r\n if (props.showWordCount) {\r\n emit('word-count-change', value.length)\r\n }\r\n }\r\n\r\n const handleChange = (text: string, html: string) => {\r\n cachedHtml.value = html\r\n emit('change', text, html)\r\n if (props.autoSave) {\r\n autoSave(text)\r\n }\r\n }\r\n\r\n const handleSave = (text: string, html: string) => {\r\n emit('save', text, html)\r\n }\r\n\r\n const handleUploadImage = (\r\n event: Event,\r\n insertImage: InsertImageFunction,\r\n files: FileList\r\n ) => {\r\n emit('upload-image', event, insertImage, files)\r\n }\r\n\r\n const handleFullscreenChange = (isFullscreen: boolean) => {\r\n emit('fullscreen-change', isFullscreen)\r\n }\r\n\r\n const handleCopyCodeSuccess = (text: string) => {\r\n emit('copy-code-success', text)\r\n }\r\n\r\n let autoSaveTimer: ReturnType<typeof setTimeout> | null = null\r\n\r\n const autoSave = (text: string) => {\r\n if (autoSaveTimer) clearTimeout(autoSaveTimer)\r\n autoSaveTimer = setTimeout(() => {\r\n emit('auto-save', text)\r\n }, props.autoSaveInterval)\r\n }\r\n\r\n const focus = () => {\r\n editorRef.value?.focus()\r\n }\r\n\r\n const getHtml = (): string => {\r\n return cachedHtml.value\r\n }\r\n\r\n const insertText = (text: string) => {\r\n editorRef.value?.insert((selected: string) => ({\r\n text: `${selected}${text}`,\r\n selected: text,\r\n }))\r\n }\r\n\r\n defineExpose({\r\n focus,\r\n getHtml,\r\n insertText,\r\n wordCount,\r\n })\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n @use './index.scss';\r\n</style>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-20\r\n * @Description: Markdown 编辑器封装组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div\r\n class=\"c-markdown-wrapper\"\r\n :class=\"{ 'is-dark': isDark }\"\r\n >\r\n <VMdEditor\r\n ref=\"editorRef\"\r\n :model-value=\"modelValue\"\r\n :height=\"height\"\r\n :placeholder=\"placeholder\"\r\n :toolbar=\"toolbar\"\r\n :mode=\"mode\"\r\n :upload-image-config=\"computedUploadImageConfig\"\r\n :toc-nav-position=\"tocNavPosition\"\r\n :default-fullscreen=\"defaultFullscreen\"\r\n :autofocus=\"autofocus\"\r\n :include-level=\"includeLevel\"\r\n :left-toolbar=\"leftToolbar\"\r\n :right-toolbar=\"rightToolbar\"\r\n :default-show-toc=\"true\"\r\n @update:model-value=\"handleInput\"\r\n @change=\"handleChange\"\r\n @save=\"handleSave\"\r\n @upload-image=\"handleUploadImage\"\r\n @fullscreen-change=\"handleFullscreenChange\"\r\n @copy-code-success=\"handleCopyCodeSuccess\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { ref, computed, watch, onMounted } from 'vue'\r\n import VMdEditor from '@kangc/v-md-editor'\r\n\r\n defineOptions({ name: 'C_Markdown' })\r\n\r\n export type InsertImageFunction = (config: {\r\n url: string\r\n desc?: string\r\n width?: string | number\r\n height?: string | number\r\n }) => void\r\n\r\n interface Props {\r\n modelValue?: string\r\n height?: string | number\r\n disabled?: boolean\r\n placeholder?: string\r\n mode?: 'edit' | 'editable' | 'preview'\r\n toolbar?: object\r\n uploadImageConfig?: {\r\n accept?: string\r\n multiple?: boolean\r\n [key: string]: any\r\n }\r\n tocNavPosition?: 'left' | 'right'\r\n defaultFullscreen?: boolean\r\n autofocus?: boolean\r\n includeLevel?: number[]\r\n leftToolbar?: string\r\n rightToolbar?: string\r\n maxLength?: number\r\n showWordCount?: boolean\r\n autoSave?: boolean\r\n autoSaveInterval?: number\r\n /** 是否为暗色主题(外部传入) */\r\n isDark?: boolean\r\n }\r\n\r\n const props = withDefaults(defineProps<Props>(), {\r\n modelValue: '',\r\n height: '400px',\r\n disabled: false,\r\n placeholder: '请输入 Markdown 内容...',\r\n mode: 'editable',\r\n tocNavPosition: 'right',\r\n defaultFullscreen: false,\r\n autofocus: false,\r\n includeLevel: () => [1, 2, 3, 4, 5, 6],\r\n leftToolbar:\r\n 'undo redo clear | h bold italic strikethrough quote | ul ol table hr | link image code | save',\r\n rightToolbar: 'preview toc sync-scroll fullscreen',\r\n maxLength: 50000,\r\n showWordCount: true,\r\n autoSave: false,\r\n autoSaveInterval: 30000,\r\n isDark: false,\r\n })\r\n\r\n interface Emits {\r\n 'update:modelValue': [value: string]\r\n change: [text: string, html: string]\r\n save: [text: string, html: string]\r\n 'upload-image': [\r\n event: Event,\r\n insertImage: InsertImageFunction,\r\n files: FileList,\r\n ]\r\n 'fullscreen-change': [isFullscreen: boolean]\r\n 'copy-code-success': [text: string]\r\n 'word-count-change': [count: number]\r\n 'auto-save': [text: string]\r\n 'max-length-exceeded': [currentLength: number, maxLength: number]\r\n }\r\n\r\n const emit = defineEmits<Emits>()\r\n\r\n const editorRef = ref<any>(null)\r\n const cachedHtml = ref('')\r\n\r\n const wordCount = computed(() => {\r\n return props.modelValue?.length || 0\r\n })\r\n\r\n const computedUploadImageConfig = computed(() => {\r\n const defaultConfig = {\r\n accept: 'image/*',\r\n multiple: false,\r\n }\r\n return props.uploadImageConfig\r\n ? { ...defaultConfig, ...props.uploadImageConfig }\r\n : defaultConfig\r\n })\r\n\r\n onMounted(() => {\r\n if (props.showWordCount && props.modelValue) {\r\n emit('word-count-change', props.modelValue.length)\r\n }\r\n })\r\n\r\n watch(\r\n () => props.modelValue,\r\n newValue => {\r\n if (props.showWordCount) {\r\n emit('word-count-change', newValue?.length || 0)\r\n }\r\n },\r\n { immediate: true }\r\n )\r\n\r\n const handleInput = (value: string) => {\r\n if (value.length > props.maxLength) {\r\n emit('max-length-exceeded', value.length, props.maxLength)\r\n return\r\n }\r\n emit('update:modelValue', value)\r\n if (props.showWordCount) {\r\n emit('word-count-change', value.length)\r\n }\r\n }\r\n\r\n const handleChange = (text: string, html: string) => {\r\n cachedHtml.value = html\r\n emit('change', text, html)\r\n if (props.autoSave) {\r\n autoSave(text)\r\n }\r\n }\r\n\r\n const handleSave = (text: string, html: string) => {\r\n emit('save', text, html)\r\n }\r\n\r\n const handleUploadImage = (\r\n event: Event,\r\n insertImage: InsertImageFunction,\r\n files: FileList\r\n ) => {\r\n emit('upload-image', event, insertImage, files)\r\n }\r\n\r\n const handleFullscreenChange = (isFullscreen: boolean) => {\r\n emit('fullscreen-change', isFullscreen)\r\n }\r\n\r\n const handleCopyCodeSuccess = (text: string) => {\r\n emit('copy-code-success', text)\r\n }\r\n\r\n let autoSaveTimer: ReturnType<typeof setTimeout> | null = null\r\n\r\n const autoSave = (text: string) => {\r\n if (autoSaveTimer) clearTimeout(autoSaveTimer)\r\n autoSaveTimer = setTimeout(() => {\r\n emit('auto-save', text)\r\n }, props.autoSaveInterval)\r\n }\r\n\r\n const focus = () => {\r\n editorRef.value?.focus()\r\n }\r\n\r\n const getHtml = (): string => {\r\n return cachedHtml.value\r\n }\r\n\r\n const insertText = (text: string) => {\r\n editorRef.value?.insert((selected: string) => ({\r\n text: `${selected}${text}`,\r\n selected: text,\r\n }))\r\n }\r\n\r\n defineExpose({\r\n focus,\r\n getHtml,\r\n insertText,\r\n wordCount,\r\n })\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n @use './index.scss';\r\n</style>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-20\r\n * @Description: Markdown 编辑器封装组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div\r\n class=\"c-markdown-wrapper\"\r\n :class=\"{ 'is-dark': isDark }\"\r\n >\r\n <VMdEditor\r\n ref=\"editorRef\"\r\n :model-value=\"modelValue\"\r\n :height=\"height\"\r\n :placeholder=\"placeholder\"\r\n :toolbar=\"toolbar\"\r\n :mode=\"mode\"\r\n :upload-image-config=\"computedUploadImageConfig\"\r\n :toc-nav-position=\"tocNavPosition\"\r\n :default-fullscreen=\"defaultFullscreen\"\r\n :autofocus=\"autofocus\"\r\n :include-level=\"includeLevel\"\r\n :left-toolbar=\"leftToolbar\"\r\n :right-toolbar=\"rightToolbar\"\r\n :default-show-toc=\"true\"\r\n @update:model-value=\"handleInput\"\r\n @change=\"handleChange\"\r\n @save=\"handleSave\"\r\n @upload-image=\"handleUploadImage\"\r\n @fullscreen-change=\"handleFullscreenChange\"\r\n @copy-code-success=\"handleCopyCodeSuccess\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { ref, computed, watch, onMounted } from 'vue'\r\n import VMdEditor from '@kangc/v-md-editor'\r\n\r\n defineOptions({ name: 'C_Markdown' })\r\n\r\n export type InsertImageFunction = (config: {\r\n url: string\r\n desc?: string\r\n width?: string | number\r\n height?: string | number\r\n }) => void\r\n\r\n interface Props {\r\n modelValue?: string\r\n height?: string | number\r\n disabled?: boolean\r\n placeholder?: string\r\n mode?: 'edit' | 'editable' | 'preview'\r\n toolbar?: object\r\n uploadImageConfig?: {\r\n accept?: string\r\n multiple?: boolean\r\n [key: string]: any\r\n }\r\n tocNavPosition?: 'left' | 'right'\r\n defaultFullscreen?: boolean\r\n autofocus?: boolean\r\n includeLevel?: number[]\r\n leftToolbar?: string\r\n rightToolbar?: string\r\n maxLength?: number\r\n showWordCount?: boolean\r\n autoSave?: boolean\r\n autoSaveInterval?: number\r\n /** 是否为暗色主题(外部传入) */\r\n isDark?: boolean\r\n }\r\n\r\n const props = withDefaults(defineProps<Props>(), {\r\n modelValue: '',\r\n height: '400px',\r\n disabled: false,\r\n placeholder: '请输入 Markdown 内容...',\r\n mode: 'editable',\r\n tocNavPosition: 'right',\r\n defaultFullscreen: false,\r\n autofocus: false,\r\n includeLevel: () => [1, 2, 3, 4, 5, 6],\r\n leftToolbar:\r\n 'undo redo clear | h bold italic strikethrough quote | ul ol table hr | link image code | save',\r\n rightToolbar: 'preview toc sync-scroll fullscreen',\r\n maxLength: 50000,\r\n showWordCount: true,\r\n autoSave: false,\r\n autoSaveInterval: 30000,\r\n isDark: false,\r\n })\r\n\r\n interface Emits {\r\n 'update:modelValue': [value: string]\r\n change: [text: string, html: string]\r\n save: [text: string, html: string]\r\n 'upload-image': [\r\n event: Event,\r\n insertImage: InsertImageFunction,\r\n files: FileList,\r\n ]\r\n 'fullscreen-change': [isFullscreen: boolean]\r\n 'copy-code-success': [text: string]\r\n 'word-count-change': [count: number]\r\n 'auto-save': [text: string]\r\n 'max-length-exceeded': [currentLength: number, maxLength: number]\r\n }\r\n\r\n const emit = defineEmits<Emits>()\r\n\r\n const editorRef = ref<any>(null)\r\n const cachedHtml = ref('')\r\n\r\n const wordCount = computed(() => {\r\n return props.modelValue?.length || 0\r\n })\r\n\r\n const computedUploadImageConfig = computed(() => {\r\n const defaultConfig = {\r\n accept: 'image/*',\r\n multiple: false,\r\n }\r\n return props.uploadImageConfig\r\n ? { ...defaultConfig, ...props.uploadImageConfig }\r\n : defaultConfig\r\n })\r\n\r\n onMounted(() => {\r\n if (props.showWordCount && props.modelValue) {\r\n emit('word-count-change', props.modelValue.length)\r\n }\r\n })\r\n\r\n watch(\r\n () => props.modelValue,\r\n newValue => {\r\n if (props.showWordCount) {\r\n emit('word-count-change', newValue?.length || 0)\r\n }\r\n },\r\n { immediate: true }\r\n )\r\n\r\n const handleInput = (value: string) => {\r\n if (value.length > props.maxLength) {\r\n emit('max-length-exceeded', value.length, props.maxLength)\r\n return\r\n }\r\n emit('update:modelValue', value)\r\n if (props.showWordCount) {\r\n emit('word-count-change', value.length)\r\n }\r\n }\r\n\r\n const handleChange = (text: string, html: string) => {\r\n cachedHtml.value = html\r\n emit('change', text, html)\r\n if (props.autoSave) {\r\n autoSave(text)\r\n }\r\n }\r\n\r\n const handleSave = (text: string, html: string) => {\r\n emit('save', text, html)\r\n }\r\n\r\n const handleUploadImage = (\r\n event: Event,\r\n insertImage: InsertImageFunction,\r\n files: FileList\r\n ) => {\r\n emit('upload-image', event, insertImage, files)\r\n }\r\n\r\n const handleFullscreenChange = (isFullscreen: boolean) => {\r\n emit('fullscreen-change', isFullscreen)\r\n }\r\n\r\n const handleCopyCodeSuccess = (text: string) => {\r\n emit('copy-code-success', text)\r\n }\r\n\r\n let autoSaveTimer: ReturnType<typeof setTimeout> | null = null\r\n\r\n const autoSave = (text: string) => {\r\n if (autoSaveTimer) clearTimeout(autoSaveTimer)\r\n autoSaveTimer = setTimeout(() => {\r\n emit('auto-save', text)\r\n }, props.autoSaveInterval)\r\n }\r\n\r\n const focus = () => {\r\n editorRef.value?.focus()\r\n }\r\n\r\n const getHtml = (): string => {\r\n return cachedHtml.value\r\n }\r\n\r\n const insertText = (text: string) => {\r\n editorRef.value?.insert((selected: string) => ({\r\n text: `${selected}${text}`,\r\n selected: text,\r\n }))\r\n }\r\n\r\n defineExpose({\r\n focus,\r\n getHtml,\r\n insertText,\r\n wordCount,\r\n })\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n @use './index.scss';\r\n</style>\r\n"],"mappings":"8hCE4EE,IAAM,EAAQ,EAoCR,EAAO,EAEP,GAAA,EAAA,EAAA,KAAqB,KAAK,CAC1B,GAAA,EAAA,EAAA,KAAiB,GAAG,CAEpB,GAAA,EAAA,EAAA,cACG,EAAM,YAAY,QAAU,EACnC,CAEI,GAAA,EAAA,EAAA,cAA2C,CAC/C,IAAM,EAAgB,CACpB,OAAQ,UACR,SAAU,GACX,CACD,OAAO,EAAM,kBACT,CAAE,GAAG,EAAe,GAAG,EAAM,kBAAmB,CAChD,GACJ,EAEF,EAAA,EAAA,eAAgB,CACV,EAAM,eAAiB,EAAM,YAC/B,EAAK,oBAAqB,EAAM,WAAW,OAAO,EAEpD,EAEF,EAAA,EAAA,WACQ,EAAM,WACZ,GAAY,CACN,EAAM,eACR,EAAK,oBAAqB,GAAU,QAAU,EAAE,EAGpD,CAAE,UAAW,GAAM,CACpB,CAED,IAAM,EAAe,GAAkB,CACrC,GAAI,EAAM,OAAS,EAAM,UAAW,CAClC,EAAK,sBAAuB,EAAM,OAAQ,EAAM,UAAU,CAC1D,OAEF,EAAK,oBAAqB,EAAM,CAC5B,EAAM,eACR,EAAK,oBAAqB,EAAM,OAAO,EAIrC,GAAgB,EAAc,IAAiB,CACnD,EAAW,MAAQ,EACnB,EAAK,SAAU,EAAM,EAAK,CACtB,EAAM,UACR,EAAS,EAAK,EAIZ,GAAc,EAAc,IAAiB,CACjD,EAAK,OAAQ,EAAM,EAAK,EAGpB,GACJ,EACA,EACA,IACG,CACH,EAAK,eAAgB,EAAO,EAAa,EAAM,EAG3C,EAA0B,GAA0B,CACxD,EAAK,oBAAqB,EAAa,EAGnC,EAAyB,GAAiB,CAC9C,EAAK,oBAAqB,EAAK,EAG7B,EAAsD,KAEpD,EAAY,GAAiB,CAC7B,GAAe,aAAa,EAAc,CAC9C,EAAgB,eAAiB,CAC/B,EAAK,YAAa,EAAK,EACtB,EAAM,iBAAiB,SAkB5B,EAAa,CACX,UAhBkB,CAClB,EAAU,OAAO,OAAO,EAgBxB,YAZO,EAAW,MAalB,WAVkB,GAAiB,CACnC,EAAU,OAAO,OAAQ,IAAsB,CAC7C,KAAM,GAAG,IAAW,IACpB,SAAU,EACX,EAAE,EAOH,YACD,CAAC,oDArLI,MAAA,CAzBJ,OAAA,EAAA,EAAA,gBAAK,CAAC,qBAAoB,CAAA,UACLA,EAAAA,OAAM,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,EAAA,cAAA,EAAA,EAAA,OAuBzB,EAAA,QAAA,CAAA,SApBI,YAAJ,IAAI,EACH,cAAaC,EAAAA,WACb,OAAQC,EAAAA,OACR,YAAaC,EAAAA,YACb,QAASC,EAAAA,QACT,KAAMC,EAAAA,KACN,sBAAqB,EAAA,MACrB,mBAAkBC,EAAAA,eAClB,qBAAoBC,EAAAA,kBACpB,UAAWC,EAAAA,UACX,gBAAeC,EAAAA,aACf,eAAcC,EAAAA,YACd,gBAAeC,EAAAA,aACf,mBAAkB,GAClB,sBAAoB,EACpB,SAAQ,EACR,OAAM,EACN,cAAc,EACd,mBAAmB,EACnB,kBAAmB"}
|
package/dist/C_Markdown2.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{t as e}from"./export-helper.js";import{computed as t,createElementBlock as n,createVNode as r,defineComponent as i,normalizeClass as a,onMounted as o,openBlock as s,ref as c,unref as l,watch as u}from"vue";import d from"@kangc/v-md-editor";var f=e(i({name:`C_Markdown`,__name:`index`,props:{modelValue:{default:``},height:{default:`400px`},disabled:{type:Boolean,default:!1},placeholder:{default:`请输入 Markdown 内容...`},mode:{default:`editable`},toolbar:{},uploadImageConfig:{},tocNavPosition:{default:`right`},defaultFullscreen:{type:Boolean,default:!1},autofocus:{type:Boolean,default:!1},includeLevel:{default:()=>[1,2,3,4,5,6]},leftToolbar:{default:`undo redo clear | h bold italic strikethrough quote | ul ol table hr | link image code | save`},rightToolbar:{default:`preview toc sync-scroll fullscreen`},maxLength:{default:5e4},showWordCount:{type:Boolean,default:!0},autoSave:{type:Boolean,default:!1},autoSaveInterval:{default:3e4},isDark:{type:Boolean,default:!1}},emits:[`update:modelValue`,`change`,`save`,`upload-image`,`fullscreen-change`,`copy-code-success`,`word-count-change`,`auto-save`,`max-length-exceeded`],setup(e,{expose:i,emit:f}){let p=e,m=f,h=c(null),g=c(``),_=t(()=>p.modelValue?.length||0),v=t(()=>{let e={accept:`image/*`,multiple:!1};return p.uploadImageConfig?{...e,...p.uploadImageConfig}:e});o(()=>{p.showWordCount&&p.modelValue&&m(`word-count-change`,p.modelValue.length)}),u(()=>p.modelValue,e=>{p.showWordCount&&m(`word-count-change`,e?.length||0)},{immediate:!0});let y=e=>{if(e.length>p.maxLength){m(`max-length-exceeded`,e.length,p.maxLength);return}m(`update:modelValue`,e),p.showWordCount&&m(`word-count-change`,e.length)},b=(e,t)=>{g.value=t,m(`change`,e,t),p.autoSave&&E(e)},x=(e,t)=>{m(`save`,e,t)},S=(e,t,n)=>{m(`upload-image`,e,t,n)},C=e=>{m(`fullscreen-change`,e)},w=e=>{m(`copy-code-success`,e)},T=null,E=e=>{T&&clearTimeout(T),T=setTimeout(()=>{m(`auto-save`,e)},p.autoSaveInterval)};return i({focus:()=>{h.value?.focus()},getHtml:()=>g.value,insertText:e=>{h.value?.insert(t=>({text:`${t}${e}`,selected:e}))},wordCount:_}),(e,t)=>(s(),n(`div`,{class:a([`c-markdown-wrapper`,{"is-dark":e.isDark}])},[r(l(d),{ref_key:`editorRef`,ref:h,"model-value":e.modelValue,height:e.height,placeholder:e.placeholder,toolbar:e.toolbar,mode:e.mode,"upload-image-config":v.value,"toc-nav-position":e.tocNavPosition,"default-fullscreen":e.defaultFullscreen,autofocus:e.autofocus,"include-level":e.includeLevel,"left-toolbar":e.leftToolbar,"right-toolbar":e.rightToolbar,"default-show-toc":!0,"onUpdate:modelValue":y,onChange:b,onSave:x,onUploadImage:S,onFullscreenChange:C,onCopyCodeSuccess:w},null,8,[`model-value`,`height`,`placeholder`,`toolbar`,`mode`,`upload-image-config`,`toc-nav-position`,`default-fullscreen`,`autofocus`,`include-level`,`left-toolbar`,`right-toolbar`])],2))}}),[[`__scopeId`,`data-v-
|
|
1
|
+
import{t as e}from"./export-helper.js";import{computed as t,createElementBlock as n,createVNode as r,defineComponent as i,normalizeClass as a,onMounted as o,openBlock as s,ref as c,unref as l,watch as u}from"vue";import d from"@kangc/v-md-editor";var f=e(i({name:`C_Markdown`,__name:`index`,props:{modelValue:{default:``},height:{default:`400px`},disabled:{type:Boolean,default:!1},placeholder:{default:`请输入 Markdown 内容...`},mode:{default:`editable`},toolbar:{},uploadImageConfig:{},tocNavPosition:{default:`right`},defaultFullscreen:{type:Boolean,default:!1},autofocus:{type:Boolean,default:!1},includeLevel:{default:()=>[1,2,3,4,5,6]},leftToolbar:{default:`undo redo clear | h bold italic strikethrough quote | ul ol table hr | link image code | save`},rightToolbar:{default:`preview toc sync-scroll fullscreen`},maxLength:{default:5e4},showWordCount:{type:Boolean,default:!0},autoSave:{type:Boolean,default:!1},autoSaveInterval:{default:3e4},isDark:{type:Boolean,default:!1}},emits:[`update:modelValue`,`change`,`save`,`upload-image`,`fullscreen-change`,`copy-code-success`,`word-count-change`,`auto-save`,`max-length-exceeded`],setup(e,{expose:i,emit:f}){let p=e,m=f,h=c(null),g=c(``),_=t(()=>p.modelValue?.length||0),v=t(()=>{let e={accept:`image/*`,multiple:!1};return p.uploadImageConfig?{...e,...p.uploadImageConfig}:e});o(()=>{p.showWordCount&&p.modelValue&&m(`word-count-change`,p.modelValue.length)}),u(()=>p.modelValue,e=>{p.showWordCount&&m(`word-count-change`,e?.length||0)},{immediate:!0});let y=e=>{if(e.length>p.maxLength){m(`max-length-exceeded`,e.length,p.maxLength);return}m(`update:modelValue`,e),p.showWordCount&&m(`word-count-change`,e.length)},b=(e,t)=>{g.value=t,m(`change`,e,t),p.autoSave&&E(e)},x=(e,t)=>{m(`save`,e,t)},S=(e,t,n)=>{m(`upload-image`,e,t,n)},C=e=>{m(`fullscreen-change`,e)},w=e=>{m(`copy-code-success`,e)},T=null,E=e=>{T&&clearTimeout(T),T=setTimeout(()=>{m(`auto-save`,e)},p.autoSaveInterval)};return i({focus:()=>{h.value?.focus()},getHtml:()=>g.value,insertText:e=>{h.value?.insert(t=>({text:`${t}${e}`,selected:e}))},wordCount:_}),(e,t)=>(s(),n(`div`,{class:a([`c-markdown-wrapper`,{"is-dark":e.isDark}])},[r(l(d),{ref_key:`editorRef`,ref:h,"model-value":e.modelValue,height:e.height,placeholder:e.placeholder,toolbar:e.toolbar,mode:e.mode,"upload-image-config":v.value,"toc-nav-position":e.tocNavPosition,"default-fullscreen":e.defaultFullscreen,autofocus:e.autofocus,"include-level":e.includeLevel,"left-toolbar":e.leftToolbar,"right-toolbar":e.rightToolbar,"default-show-toc":!0,"onUpdate:modelValue":y,onChange:b,onSave:x,onUploadImage:S,onFullscreenChange:C,onCopyCodeSuccess:w},null,8,[`model-value`,`height`,`placeholder`,`toolbar`,`mode`,`upload-image-config`,`toc-nav-position`,`default-fullscreen`,`autofocus`,`include-level`,`left-toolbar`,`right-toolbar`])],2))}}),[[`__scopeId`,`data-v-67f4346d`]]);export{f as t};
|
|
2
2
|
//# sourceMappingURL=C_Markdown2.js.map
|