@robot-admin/naive-ui-components 0.3.1 → 0.3.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-nnfbZCea.css.map +1 -0
- package/dist/C_ActionBar2.js +2 -2
- package/dist/C_ActionBar2.js.map +1 -1
- package/dist/C_AntV-DGjscTWa.css.map +1 -0
- package/dist/C_AntV2.js +6 -6
- package/dist/C_AntV2.js.map +1 -1
- package/dist/C_Barcode-DjTmDkbQ.css.map +1 -0
- package/dist/C_Barcode2.js +1 -1
- package/dist/C_Barcode2.js.map +1 -1
- package/dist/C_Captcha-Ccq3DMrR.css.map +1 -0
- package/dist/C_Captcha2.js +1 -1
- package/dist/C_Captcha2.js.map +1 -1
- package/dist/C_Cascade-IUUHIh7r.css.map +1 -0
- package/dist/C_Cascade2.js +2 -2
- package/dist/C_Cascade2.js.map +1 -1
- package/dist/C_City-Cv5BESaN.css.map +1 -0
- package/dist/C_City2.js +2 -2
- package/dist/C_City2.js.map +1 -1
- package/dist/C_Code-DPZlNSxL.css.map +1 -0
- package/dist/C_Code2.js +8 -7
- package/dist/C_Code2.js.map +1 -1
- package/dist/C_CollapsePanel-Fap-lv_5.css.map +1 -0
- package/dist/C_CollapsePanel2.js +1 -1
- package/dist/C_CollapsePanel2.js.map +1 -1
- package/dist/C_Cron-C0-8b5af.css.map +1 -0
- package/dist/C_Cron2.js +15 -14
- package/dist/C_Cron2.js.map +1 -1
- package/dist/C_Date2.js +1 -1
- package/dist/C_Date2.js.map +1 -1
- package/dist/C_Draggable-Bq6o0qXn.css.map +1 -0
- package/dist/C_Draggable2.js +1 -1
- package/dist/C_Draggable2.js.map +1 -1
- package/dist/C_Editor-OlxIF9-5.css.map +1 -0
- package/dist/C_Editor2.js +1 -1
- package/dist/C_Editor2.js.map +1 -1
- package/dist/C_FilePreview-B4XgTv-h.css.map +1 -0
- package/dist/C_FilePreview.cjs +1 -0
- package/dist/C_FilePreview.js +1 -0
- package/dist/C_FilePreview2.js +10 -9
- package/dist/C_FilePreview2.js.map +1 -1
- package/dist/C_Form-Cr9oX037.css.map +1 -0
- package/dist/C_Form.cjs +1 -0
- package/dist/C_Form.js +1 -0
- package/dist/C_Form2.js +69 -72
- package/dist/C_Form2.js.map +1 -1
- package/dist/C_FormSearch-DlIEoh7X.css.map +1 -0
- package/dist/C_FormSearch2.js +2 -2
- package/dist/C_FormSearch2.js.map +1 -1
- package/dist/C_FormulaEditor-Cm0CokN5.css.map +1 -0
- package/dist/C_FormulaEditor2.js +6 -6
- package/dist/C_FormulaEditor2.js.map +1 -1
- package/dist/C_FullCalendar-BULCIlVK.css.map +1 -0
- package/dist/C_FullCalendar2.js +2 -2
- package/dist/C_FullCalendar2.js.map +1 -1
- package/dist/C_Guide2.js +1 -1
- package/dist/C_Guide2.js.map +1 -1
- package/dist/C_Icon2.js.map +1 -1
- package/dist/C_ImageCropper-DrmUlaLi.css.map +1 -0
- package/dist/C_ImageCropper2.js +4 -4
- package/dist/C_ImageCropper2.js.map +1 -1
- package/dist/C_Language2.js +1 -1
- package/dist/C_Language2.js.map +1 -1
- package/dist/C_Map-WUMXSAfy.css.map +1 -0
- package/dist/C_Map2.js +2 -2
- package/dist/C_Map2.js.map +1 -1
- package/dist/C_Markdown-Dmv8yaM4.css.map +1 -0
- package/dist/C_Markdown2.js +4 -4
- package/dist/C_Markdown2.js.map +1 -1
- package/dist/C_NotificationCenter-DbgBiyqB.css.map +1 -0
- package/dist/C_NotificationCenter2.js +21 -20
- package/dist/C_NotificationCenter2.js.map +1 -1
- package/dist/C_Progress2.js +1 -1
- package/dist/C_Progress2.js.map +1 -1
- package/dist/C_QRCode-G7fiAkm4.css.map +1 -0
- package/dist/C_QRCode2.js +1 -1
- package/dist/C_QRCode2.js.map +1 -1
- package/dist/C_Signature-es-ZNPzr.css.map +1 -0
- package/dist/C_Signature2.js +2 -2
- package/dist/C_Signature2.js.map +1 -1
- package/dist/C_SplitPane-Br2eK8IG.css.map +1 -0
- package/dist/C_SplitPane2.js +1 -1
- package/dist/C_SplitPane2.js.map +1 -1
- package/dist/C_Steps-P9Qj9iDd.css.map +1 -0
- package/dist/C_Steps2.js +1 -1
- package/dist/C_Steps2.js.map +1 -1
- package/dist/C_Table-DAwAxr72.css.map +1 -0
- package/dist/C_Table.cjs +1 -0
- package/dist/C_Table.js +1 -0
- package/dist/C_Table2.js +3 -3
- package/dist/C_Table2.js.map +1 -1
- package/dist/C_Theme2.js +1 -1
- package/dist/C_Theme2.js.map +1 -1
- package/dist/C_Time-Bd_e1YDN.css.map +1 -0
- package/dist/C_Time2.js +2 -2
- package/dist/C_Time2.js.map +1 -1
- package/dist/C_Tree-DnGc_MPb.css.map +1 -0
- package/dist/C_Tree2.js +2 -2
- package/dist/C_Tree2.js.map +1 -1
- package/dist/C_Upload-i8LB_29U.css.map +1 -0
- package/dist/C_Upload2.js +5 -5
- package/dist/C_Upload2.js.map +1 -1
- package/dist/C_VideoPlayer-rm0MODUv.css.map +1 -0
- package/dist/C_VideoPlayer2.js +21 -20
- package/dist/C_VideoPlayer2.js.map +1 -1
- package/dist/C_VtableGantt-BpY-Rng3.css.map +1 -0
- package/dist/C_VtableGantt2.js +2 -2
- package/dist/C_VtableGantt2.js.map +1 -1
- package/dist/C_WaterFall-HWB-gPON.css.map +1 -0
- package/dist/C_WaterFall2.js +2 -2
- package/dist/C_WaterFall2.js.map +1 -1
- package/dist/C_WorkFlow-CSO86Cuc.css.map +1 -0
- package/dist/C_WorkFlow2.js +6 -6
- package/dist/C_WorkFlow2.js.map +1 -1
- package/dist/constants.d.ts +4 -4
- package/dist/constants2.d.ts +4 -4
- package/dist/constants3.d.ts +4 -4
- package/dist/constants4.d.ts +5 -5
- package/dist/constants5.d.ts +2 -2
- package/dist/data.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.vue.d.ts +1 -1
- package/dist/index10.vue.d.ts +7 -7
- package/dist/index11.vue.d.ts +2 -2
- package/dist/index12.vue.d.ts +5 -5
- package/dist/index12.vue.d.ts.map +1 -1
- package/dist/index13.vue.d.ts +1 -1
- package/dist/index14.vue.d.ts +1 -1
- package/dist/index16.vue.d.ts +1 -1
- package/dist/index2.vue.d.ts +6 -6
- package/dist/index3.vue.d.ts +2 -2
- package/dist/index4.vue.d.ts +2 -2
- package/dist/index5.vue.d.ts +2 -2
- package/dist/index6.vue.d.ts +1 -1
- package/dist/index8.vue.d.ts +3 -3
- package/dist/resolver.js.map +1 -1
- package/dist/style.css +1555 -1555
- package/dist/useCalendarEvents.d.ts +2 -2
- package/dist/useCollapsePanel.d.ts +2 -2
- package/dist/useCropperCore.d.ts +3 -3
- package/dist/useDraggableLayout.d.ts +8 -8
- package/dist/useDynamicFormState.d.ts +111 -111
- package/dist/useDynamicFormState.d.ts.map +1 -1
- package/dist/useEdgeInteraction.d.ts +2 -2
- package/dist/useInfiniteScroll.d.ts +1 -1
- package/dist/useModalEdit.d.ts +4 -4
- package/dist/useModalEdit.d.ts.map +1 -1
- package/dist/useQRCode.d.ts +4 -4
- package/dist/useQRCode.d.ts.map +1 -1
- package/dist/useSearchState.d.ts +2 -2
- package/dist/useSignatureHistory.d.ts +4 -4
- package/dist/useSplitResize.d.ts +6 -6
- package/dist/useSplitResize.d.ts.map +1 -1
- package/dist/useTimeSelection.d.ts +2 -2
- package/dist/useTreeOperations.d.ts +6 -6
- package/dist/useWorkflowValidation.d.ts +5 -5
- package/package.json +2 -1
- package/dist/C_ActionBar-DWN-woTc.css.map +0 -1
- package/dist/C_AntV-AFKyK6hH.css.map +0 -1
- package/dist/C_Barcode-P_EFj8dC.css.map +0 -1
- package/dist/C_Captcha-C-ef41xw.css.map +0 -1
- package/dist/C_Cascade-D9kNsjsV.css.map +0 -1
- package/dist/C_City-BCQ4ipiK.css.map +0 -1
- package/dist/C_Code-C9kvvEmO.css.map +0 -1
- package/dist/C_CollapsePanel-BUJHuYcU.css.map +0 -1
- package/dist/C_Cron-yx2Ob4Jl.css.map +0 -1
- package/dist/C_Draggable-C483syRC.css.map +0 -1
- package/dist/C_Editor-Bp0SyIEw.css.map +0 -1
- package/dist/C_FilePreview-CPqvhoCy.css.map +0 -1
- package/dist/C_Form-Jx7PY3sT.css.map +0 -1
- package/dist/C_FormSearch-DvRgxlRn.css.map +0 -1
- package/dist/C_FormulaEditor-DtGkt4T_.css.map +0 -1
- package/dist/C_FullCalendar-BF7H0YIx.css.map +0 -1
- package/dist/C_ImageCropper-BVJfUufl.css.map +0 -1
- package/dist/C_Map-DpzeuWdX.css.map +0 -1
- package/dist/C_Markdown-BEjxknqd.css.map +0 -1
- package/dist/C_NotificationCenter-0l3TY2Gn.css.map +0 -1
- package/dist/C_QRCode-DbdiAIPg.css.map +0 -1
- package/dist/C_Signature-zhHCbra9.css.map +0 -1
- package/dist/C_SplitPane-C6sBsfKY.css.map +0 -1
- package/dist/C_Steps-CODHN5Hs.css.map +0 -1
- package/dist/C_Table-DSNsntmT.css.map +0 -1
- package/dist/C_Time-BvZLYraL.css.map +0 -1
- package/dist/C_Tree-0GDv--jX.css.map +0 -1
- package/dist/C_Upload-BXd3YYLx.css.map +0 -1
- package/dist/C_VideoPlayer-DYG3RL0Q.css.map +0 -1
- package/dist/C_VtableGantt-fhItIiHE.css.map +0 -1
- package/dist/C_WaterFall-8sQDFXKg.css.map +0 -1
- package/dist/C_WorkFlow-J-dyIuh9.css.map +0 -1
package/dist/C_Markdown2.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { t as export_helper_default } from "./export-helper.js";
|
|
2
|
-
import { computed, createElementBlock, createVNode, defineComponent, normalizeClass, onMounted, openBlock, ref,
|
|
2
|
+
import { computed, createElementBlock, createVNode, defineComponent, normalizeClass, onMounted, openBlock, ref, unref, watch } from "vue";
|
|
3
|
+
import VMdEditor from "@kangc/v-md-editor";
|
|
3
4
|
|
|
4
5
|
//#region src/components/C_Markdown/index.vue?vue&type=script&setup=true&lang.ts
|
|
5
6
|
var index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
|
|
@@ -136,8 +137,7 @@ var index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCo
|
|
|
136
137
|
wordCount
|
|
137
138
|
});
|
|
138
139
|
return (_ctx, _cache) => {
|
|
139
|
-
|
|
140
|
-
return openBlock(), createElementBlock("div", { class: normalizeClass(["c-markdown-wrapper", { "is-dark": _ctx.isDark }]) }, [createVNode(_component_v_md_editor, {
|
|
140
|
+
return openBlock(), createElementBlock("div", { class: normalizeClass(["c-markdown-wrapper", { "is-dark": _ctx.isDark }]) }, [createVNode(unref(VMdEditor), {
|
|
141
141
|
ref_key: "editorRef",
|
|
142
142
|
ref: editorRef,
|
|
143
143
|
"model-value": _ctx.modelValue,
|
|
@@ -179,7 +179,7 @@ var index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCo
|
|
|
179
179
|
|
|
180
180
|
//#endregion
|
|
181
181
|
//#region src/components/C_Markdown/index.vue
|
|
182
|
-
var C_Markdown_default = /* @__PURE__ */ export_helper_default(index_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-
|
|
182
|
+
var C_Markdown_default = /* @__PURE__ */ export_helper_default(index_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-cfe5e2cb"]]);
|
|
183
183
|
|
|
184
184
|
//#endregion
|
|
185
185
|
export { C_Markdown_default as t };
|
package/dist/C_Markdown2.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"C_Markdown2.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":["<!--\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 class=\"c-markdown-wrapper\" :class=\"{ 'is-dark': isDark }\">\r\n <v-md-editor\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\nimport { ref, computed, watch, onMounted } from \"vue\";\r\n\r\ndefineOptions({ name: \"C_Markdown\" });\r\n\r\nexport 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\ninterface 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\nconst 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\ninterface 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\nconst emit = defineEmits<Emits>();\r\n\r\nconst editorRef = ref<any>(null);\r\nconst cachedHtml = ref(\"\");\r\n\r\nconst wordCount = computed(() => {\r\n return props.modelValue?.length || 0;\r\n});\r\n\r\nconst 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\nonMounted(() => {\r\n if (props.showWordCount && props.modelValue) {\r\n emit(\"word-count-change\", props.modelValue.length);\r\n }\r\n});\r\n\r\nwatch(\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\nconst 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\nconst 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\nconst handleSave = (text: string, html: string) => {\r\n emit(\"save\", text, html);\r\n};\r\n\r\nconst 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\nconst handleFullscreenChange = (isFullscreen: boolean) => {\r\n emit(\"fullscreen-change\", isFullscreen);\r\n};\r\n\r\nconst handleCopyCodeSuccess = (text: string) => {\r\n emit(\"copy-code-success\", text);\r\n};\r\n\r\nlet autoSaveTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\nconst 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\nconst focus = () => {\r\n editorRef.value?.focus();\r\n};\r\n\r\nconst getHtml = (): string => {\r\n return cachedHtml.value;\r\n};\r\n\r\nconst 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\ndefineExpose({\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 class=\"c-markdown-wrapper\" :class=\"{ 'is-dark': isDark }\">\r\n <v-md-editor\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\nimport { ref, computed, watch, onMounted } from \"vue\";\r\n\r\ndefineOptions({ name: \"C_Markdown\" });\r\n\r\nexport 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\ninterface 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\nconst 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\ninterface 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\nconst emit = defineEmits<Emits>();\r\n\r\nconst editorRef = ref<any>(null);\r\nconst cachedHtml = ref(\"\");\r\n\r\nconst wordCount = computed(() => {\r\n return props.modelValue?.length || 0;\r\n});\r\n\r\nconst 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\nonMounted(() => {\r\n if (props.showWordCount && props.modelValue) {\r\n emit(\"word-count-change\", props.modelValue.length);\r\n }\r\n});\r\n\r\nwatch(\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\nconst 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\nconst 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\nconst handleSave = (text: string, html: string) => {\r\n emit(\"save\", text, html);\r\n};\r\n\r\nconst 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\nconst handleFullscreenChange = (isFullscreen: boolean) => {\r\n emit(\"fullscreen-change\", isFullscreen);\r\n};\r\n\r\nconst handleCopyCodeSuccess = (text: string) => {\r\n emit(\"copy-code-success\", text);\r\n};\r\n\r\nlet autoSaveTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\nconst 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\nconst focus = () => {\r\n editorRef.value?.focus();\r\n};\r\n\r\nconst getHtml = (): string => {\r\n return cachedHtml.value;\r\n};\r\n\r\nconst 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\ndefineExpose({\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 class=\"c-markdown-wrapper\" :class=\"{ 'is-dark': isDark }\">\r\n <v-md-editor\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\nimport { ref, computed, watch, onMounted } from \"vue\";\r\n\r\ndefineOptions({ name: \"C_Markdown\" });\r\n\r\nexport 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\ninterface 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\nconst 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\ninterface 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\nconst emit = defineEmits<Emits>();\r\n\r\nconst editorRef = ref<any>(null);\r\nconst cachedHtml = ref(\"\");\r\n\r\nconst wordCount = computed(() => {\r\n return props.modelValue?.length || 0;\r\n});\r\n\r\nconst 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\nonMounted(() => {\r\n if (props.showWordCount && props.modelValue) {\r\n emit(\"word-count-change\", props.modelValue.length);\r\n }\r\n});\r\n\r\nwatch(\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\nconst 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\nconst 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\nconst handleSave = (text: string, html: string) => {\r\n emit(\"save\", text, html);\r\n};\r\n\r\nconst 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\nconst handleFullscreenChange = (isFullscreen: boolean) => {\r\n emit(\"fullscreen-change\", isFullscreen);\r\n};\r\n\r\nconst handleCopyCodeSuccess = (text: string) => {\r\n emit(\"copy-code-success\", text);\r\n};\r\n\r\nlet autoSaveTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\nconst 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\nconst focus = () => {\r\n editorRef.value?.focus();\r\n};\r\n\r\nconst getHtml = (): string => {\r\n return cachedHtml.value;\r\n};\r\n\r\nconst 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\ndefineExpose({\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECwEA,MAAM,QAAQ;EAoCd,MAAM,OAAO;EAEb,MAAM,YAAY,IAAS,KAAK;EAChC,MAAM,aAAa,IAAI,GAAG;EAE1B,MAAM,YAAY,eAAe;AAC/B,UAAO,MAAM,YAAY,UAAU;IACnC;EAEF,MAAM,4BAA4B,eAAe;GAC/C,MAAM,gBAAgB;IACpB,QAAQ;IACR,UAAU;IACX;AACD,UAAO,MAAM,oBACT;IAAE,GAAG;IAAe,GAAG,MAAM;IAAmB,GAChD;IACJ;AAEF,kBAAgB;AACd,OAAI,MAAM,iBAAiB,MAAM,WAC/B,MAAK,qBAAqB,MAAM,WAAW,OAAO;IAEpD;AAEF,cACQ,MAAM,aACX,aAAa;AACZ,OAAI,MAAM,cACR,MAAK,qBAAqB,UAAU,UAAU,EAAE;KAGpD,EAAE,WAAW,MAAM,CACpB;EAED,MAAM,eAAe,UAAkB;AACrC,OAAI,MAAM,SAAS,MAAM,WAAW;AAClC,SAAK,uBAAuB,MAAM,QAAQ,MAAM,UAAU;AAC1D;;AAEF,QAAK,qBAAqB,MAAM;AAChC,OAAI,MAAM,cACR,MAAK,qBAAqB,MAAM,OAAO;;EAI3C,MAAM,gBAAgB,MAAc,SAAiB;AACnD,cAAW,QAAQ;AACnB,QAAK,UAAU,MAAM,KAAK;AAC1B,OAAI,MAAM,SACR,UAAS,KAAK;;EAIlB,MAAM,cAAc,MAAc,SAAiB;AACjD,QAAK,QAAQ,MAAM,KAAK;;EAG1B,MAAM,qBACJ,OACA,aACA,UACG;AACH,QAAK,gBAAgB,OAAO,aAAa,MAAM;;EAGjD,MAAM,0BAA0B,iBAA0B;AACxD,QAAK,qBAAqB,aAAa;;EAGzC,MAAM,yBAAyB,SAAiB;AAC9C,QAAK,qBAAqB,KAAK;;EAGjC,IAAI,gBAAsD;EAE1D,MAAM,YAAY,SAAiB;AACjC,OAAI,cAAe,cAAa,cAAc;AAC9C,mBAAgB,iBAAiB;AAC/B,SAAK,aAAa,KAAK;MACtB,MAAM,iBAAiB;;EAG5B,MAAM,cAAc;AAClB,aAAU,OAAO,OAAO;;EAG1B,MAAM,gBAAwB;AAC5B,UAAO,WAAW;;EAGpB,MAAM,cAAc,SAAiB;AACnC,aAAU,OAAO,QAAQ,cAAsB;IAC7C,MAAM,GAAG,WAAW;IACpB,UAAU;IACX,EAAE;;AAGL,WAAa;GACX;GACA;GACA;GACA;GACD,CAAC;;;uBA3MA,mBAuBM,OAAA,EAvBD,OAAK,eAAA,CAAC,sBAAoB,EAAA,WAAsBA,KAAAA,QAAM,CAAA,CAAA,KACzD,YAqBE,wBAAA;aApBI;IAAJ,KAAI;IACH,eAAaC,KAAAA;IACb,QAAQC,KAAAA;IACR,aAAaC,KAAAA;IACb,SAASC,KAAAA;IACT,MAAMC,KAAAA;IACN,uBAAqB,0BAAA;IACrB,oBAAkBC,KAAAA;IAClB,sBAAoBC,KAAAA;IACpB,WAAWC,KAAAA;IACX,iBAAeC,KAAAA;IACf,gBAAcC,KAAAA;IACd,iBAAeC,KAAAA;IACf,oBAAkB;IAClB,uBAAoB;IACpB,UAAQ;IACR,QAAM;IACN,eAAc;IACd,oBAAmB;IACnB,mBAAmB"}
|
|
1
|
+
{"version":3,"file":"C_Markdown2.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 class=\"c-markdown-wrapper\" :class=\"{ 'is-dark': isDark }\">\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\nimport { ref, computed, watch, onMounted } from \"vue\";\r\nimport VMdEditor from \"@kangc/v-md-editor\";\r\n\r\ndefineOptions({ name: \"C_Markdown\" });\r\n\r\nexport 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\ninterface 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\nconst 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\ninterface 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\nconst emit = defineEmits<Emits>();\r\n\r\nconst editorRef = ref<any>(null);\r\nconst cachedHtml = ref(\"\");\r\n\r\nconst wordCount = computed(() => {\r\n return props.modelValue?.length || 0;\r\n});\r\n\r\nconst 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\nonMounted(() => {\r\n if (props.showWordCount && props.modelValue) {\r\n emit(\"word-count-change\", props.modelValue.length);\r\n }\r\n});\r\n\r\nwatch(\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\nconst 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\nconst 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\nconst handleSave = (text: string, html: string) => {\r\n emit(\"save\", text, html);\r\n};\r\n\r\nconst 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\nconst handleFullscreenChange = (isFullscreen: boolean) => {\r\n emit(\"fullscreen-change\", isFullscreen);\r\n};\r\n\r\nconst handleCopyCodeSuccess = (text: string) => {\r\n emit(\"copy-code-success\", text);\r\n};\r\n\r\nlet autoSaveTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\nconst 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\nconst focus = () => {\r\n editorRef.value?.focus();\r\n};\r\n\r\nconst getHtml = (): string => {\r\n return cachedHtml.value;\r\n};\r\n\r\nconst 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\ndefineExpose({\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 class=\"c-markdown-wrapper\" :class=\"{ 'is-dark': isDark }\">\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\nimport { ref, computed, watch, onMounted } from \"vue\";\r\nimport VMdEditor from \"@kangc/v-md-editor\";\r\n\r\ndefineOptions({ name: \"C_Markdown\" });\r\n\r\nexport 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\ninterface 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\nconst 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\ninterface 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\nconst emit = defineEmits<Emits>();\r\n\r\nconst editorRef = ref<any>(null);\r\nconst cachedHtml = ref(\"\");\r\n\r\nconst wordCount = computed(() => {\r\n return props.modelValue?.length || 0;\r\n});\r\n\r\nconst 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\nonMounted(() => {\r\n if (props.showWordCount && props.modelValue) {\r\n emit(\"word-count-change\", props.modelValue.length);\r\n }\r\n});\r\n\r\nwatch(\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\nconst 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\nconst 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\nconst handleSave = (text: string, html: string) => {\r\n emit(\"save\", text, html);\r\n};\r\n\r\nconst 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\nconst handleFullscreenChange = (isFullscreen: boolean) => {\r\n emit(\"fullscreen-change\", isFullscreen);\r\n};\r\n\r\nconst handleCopyCodeSuccess = (text: string) => {\r\n emit(\"copy-code-success\", text);\r\n};\r\n\r\nlet autoSaveTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\nconst 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\nconst focus = () => {\r\n editorRef.value?.focus();\r\n};\r\n\r\nconst getHtml = (): string => {\r\n return cachedHtml.value;\r\n};\r\n\r\nconst 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\ndefineExpose({\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 class=\"c-markdown-wrapper\" :class=\"{ 'is-dark': isDark }\">\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\nimport { ref, computed, watch, onMounted } from \"vue\";\r\nimport VMdEditor from \"@kangc/v-md-editor\";\r\n\r\ndefineOptions({ name: \"C_Markdown\" });\r\n\r\nexport 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\ninterface 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\nconst 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\ninterface 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\nconst emit = defineEmits<Emits>();\r\n\r\nconst editorRef = ref<any>(null);\r\nconst cachedHtml = ref(\"\");\r\n\r\nconst wordCount = computed(() => {\r\n return props.modelValue?.length || 0;\r\n});\r\n\r\nconst 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\nonMounted(() => {\r\n if (props.showWordCount && props.modelValue) {\r\n emit(\"word-count-change\", props.modelValue.length);\r\n }\r\n});\r\n\r\nwatch(\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\nconst 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\nconst 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\nconst handleSave = (text: string, html: string) => {\r\n emit(\"save\", text, html);\r\n};\r\n\r\nconst 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\nconst handleFullscreenChange = (isFullscreen: boolean) => {\r\n emit(\"fullscreen-change\", isFullscreen);\r\n};\r\n\r\nconst handleCopyCodeSuccess = (text: string) => {\r\n emit(\"copy-code-success\", text);\r\n};\r\n\r\nlet autoSaveTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\nconst 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\nconst focus = () => {\r\n editorRef.value?.focus();\r\n};\r\n\r\nconst getHtml = (): string => {\r\n return cachedHtml.value;\r\n};\r\n\r\nconst 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\ndefineExpose({\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECyEA,MAAM,QAAQ;EAoCd,MAAM,OAAO;EAEb,MAAM,YAAY,IAAS,KAAK;EAChC,MAAM,aAAa,IAAI,GAAG;EAE1B,MAAM,YAAY,eAAe;AAC/B,UAAO,MAAM,YAAY,UAAU;IACnC;EAEF,MAAM,4BAA4B,eAAe;GAC/C,MAAM,gBAAgB;IACpB,QAAQ;IACR,UAAU;IACX;AACD,UAAO,MAAM,oBACT;IAAE,GAAG;IAAe,GAAG,MAAM;IAAmB,GAChD;IACJ;AAEF,kBAAgB;AACd,OAAI,MAAM,iBAAiB,MAAM,WAC/B,MAAK,qBAAqB,MAAM,WAAW,OAAO;IAEpD;AAEF,cACQ,MAAM,aACX,aAAa;AACZ,OAAI,MAAM,cACR,MAAK,qBAAqB,UAAU,UAAU,EAAE;KAGpD,EAAE,WAAW,MAAM,CACpB;EAED,MAAM,eAAe,UAAkB;AACrC,OAAI,MAAM,SAAS,MAAM,WAAW;AAClC,SAAK,uBAAuB,MAAM,QAAQ,MAAM,UAAU;AAC1D;;AAEF,QAAK,qBAAqB,MAAM;AAChC,OAAI,MAAM,cACR,MAAK,qBAAqB,MAAM,OAAO;;EAI3C,MAAM,gBAAgB,MAAc,SAAiB;AACnD,cAAW,QAAQ;AACnB,QAAK,UAAU,MAAM,KAAK;AAC1B,OAAI,MAAM,SACR,UAAS,KAAK;;EAIlB,MAAM,cAAc,MAAc,SAAiB;AACjD,QAAK,QAAQ,MAAM,KAAK;;EAG1B,MAAM,qBACJ,OACA,aACA,UACG;AACH,QAAK,gBAAgB,OAAO,aAAa,MAAM;;EAGjD,MAAM,0BAA0B,iBAA0B;AACxD,QAAK,qBAAqB,aAAa;;EAGzC,MAAM,yBAAyB,SAAiB;AAC9C,QAAK,qBAAqB,KAAK;;EAGjC,IAAI,gBAAsD;EAE1D,MAAM,YAAY,SAAiB;AACjC,OAAI,cAAe,cAAa,cAAc;AAC9C,mBAAgB,iBAAiB;AAC/B,SAAK,aAAa,KAAK;MACtB,MAAM,iBAAiB;;EAG5B,MAAM,cAAc;AAClB,aAAU,OAAO,OAAO;;EAG1B,MAAM,gBAAwB;AAC5B,UAAO,WAAW;;EAGpB,MAAM,cAAc,SAAiB;AACnC,aAAU,OAAO,QAAQ,cAAsB;IAC7C,MAAM,GAAG,WAAW;IACpB,UAAU;IACX,EAAE;;AAGL,WAAa;GACX;GACA;GACA;GACA;GACD,CAAC;;uBA5MA,mBAuBM,OAAA,EAvBD,OAAK,eAAA,CAAC,sBAAoB,EAAA,WAAsBA,KAAAA,QAAM,CAAA,CAAA,KACzD,YAqBE,MAAA,UAAA,EAAA;aApBI;IAAJ,KAAI;IACH,eAAaC,KAAAA;IACb,QAAQC,KAAAA;IACR,aAAaC,KAAAA;IACb,SAASC,KAAAA;IACT,MAAMC,KAAAA;IACN,uBAAqB,0BAAA;IACrB,oBAAkBC,KAAAA;IAClB,sBAAoBC,KAAAA;IACpB,WAAWC,KAAAA;IACX,iBAAeC,KAAAA;IACf,gBAAcC,KAAAA;IACd,iBAAeC,KAAAA;IACf,oBAAkB;IAClB,uBAAoB;IACpB,UAAQ;IACR,QAAM;IACN,eAAc;IACd,oBAAmB;IACnB,mBAAmB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"C_NotificationCenter-DbgBiyqB.css","names":[],"sources":["../src/components/C_NotificationCenter/components/NotificationBadge.vue?vue&type=style&index=0&scoped=03c9c8c7&lang.scss","../src/components/C_NotificationCenter/components/NotificationItem.vue?vue&type=style&index=0&scoped=30bf7ddc&lang.scss","../src/components/C_NotificationCenter/components/NotificationList.vue?vue&type=style&index=0&scoped=3db0c5bf&lang.scss","../src/components/C_NotificationCenter/components/NotificationDetail.vue?vue&type=style&index=0&scoped=b10b0b8e&lang.scss","../src/components/C_NotificationCenter/index.vue?vue&type=style&index=0&scoped=a60d6896&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled */.notification-badge[data-v-03c9c8c7] {\n position: relative;\n display: inline-flex;\n align-items: center;\n}\n.notification-badge__trigger[data-v-03c9c8c7] {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n padding: 4px;\n border-radius: 6px;\n transition: all var(--c-transition, 0.2s ease);\n}\n.notification-badge__trigger[data-v-03c9c8c7]:hover {\n background-color: var(--c-border);\n}\n.notification-badge__trigger:hover .notification-badge__icon[data-v-03c9c8c7] {\n color: var(--c-primary);\n}\n.notification-badge__icon[data-v-03c9c8c7] {\n color: var(--c-text-2);\n transition: color var(--c-transition, 0.2s ease);\n}\n.notification-badge__count[data-v-03c9c8c7] {\n position: absolute;\n top: -2px;\n right: -4px;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n border-radius: 8px;\n background: #f5222d;\n color: #fff;\n font-size: 10px;\n font-weight: 600;\n line-height: 16px;\n text-align: center;\n white-space: nowrap;\n pointer-events: none;\n box-shadow: 0 0 0 2px var(--c-bg);\n}\n.notification-badge__pulse[data-v-03c9c8c7] {\n position: absolute;\n top: -2px;\n right: -4px;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background: rgba(245, 34, 45, 0.4);\n animation: pulse-ring-03c9c8c7 1.5s cubic-bezier(0.215, 0.61, 0.355, 1) infinite;\n pointer-events: none;\n}\n@keyframes pulse-ring-03c9c8c7 {\n0% {\n transform: scale(0.8);\n opacity: 1;\n}\n100% {\n transform: scale(2.2);\n opacity: 0;\n}\n}\n.badge-bounce-enter-active[data-v-03c9c8c7] {\n animation: badge-in-03c9c8c7 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);\n}\n.badge-bounce-leave-active[data-v-03c9c8c7] {\n animation: badge-in-03c9c8c7 0.2s ease reverse;\n}\n@keyframes badge-in-03c9c8c7 {\n0% {\n transform: scale(0);\n opacity: 0;\n}\n100% {\n transform: scale(1);\n opacity: 1;\n}\n}","/* unplugin-vue-components disabled */.notification-item[data-v-30bf7ddc] {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 12px 16px;\n cursor: pointer;\n transition: background-color var(--c-transition, 0.2s ease);\n border-bottom: 1px solid var(--c-border);\n /* ─── 子元素 ──────────────────────────── */\n}\n.notification-item[data-v-30bf7ddc]:last-child {\n border-bottom: none;\n}\n.notification-item[data-v-30bf7ddc]:hover {\n background-color: var(--c-bg-card);\n}\n.notification-item:hover .notification-item__actions[data-v-30bf7ddc] {\n opacity: 1;\n}\n.notification-item--unread[data-v-30bf7ddc] {\n background-color: color-mix(in srgb, var(--c-primary) 4%, transparent);\n}\n.notification-item--unread[data-v-30bf7ddc]:hover {\n background-color: color-mix(in srgb, var(--c-primary) 8%, transparent);\n}\n.notification-item--urgent[data-v-30bf7ddc] {\n border-left: 3px solid #f5222d;\n padding-left: 13px;\n}\n.notification-item__indicator[data-v-30bf7ddc] {\n flex-shrink: 0;\n width: 8px;\n display: flex;\n align-items: center;\n padding-top: 14px;\n}\n.notification-item__dot[data-v-30bf7ddc] {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--c-primary);\n}\n.notification-item__dot--urgent[data-v-30bf7ddc] {\n background: #f5222d;\n box-shadow: 0 0 4px rgba(245, 34, 45, 0.5);\n}\n.notification-item__dot--high[data-v-30bf7ddc] {\n background: #fa8c16;\n}\n.notification-item__dot--normal[data-v-30bf7ddc] {\n background: var(--c-primary);\n}\n.notification-item__dot--low[data-v-30bf7ddc] {\n background: var(--c-text-4);\n}\n.notification-item__avatar[data-v-30bf7ddc] {\n flex-shrink: 0;\n}\n.notification-item__avatar-placeholder[data-v-30bf7ddc] {\n width: 36px;\n height: 36px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n color: #fff;\n}\n.notification-item__avatar-placeholder--system[data-v-30bf7ddc] {\n background: linear-gradient(135deg, #667eea, #764ba2);\n}\n.notification-item__avatar-placeholder--business[data-v-30bf7ddc] {\n background: linear-gradient(135deg, #43e97b, #38f9d7);\n color: #0d1425;\n}\n.notification-item__avatar-placeholder--alarm[data-v-30bf7ddc] {\n background: linear-gradient(135deg, #f093fb, #f5576c);\n}\n.notification-item__body[data-v-30bf7ddc] {\n flex: 1;\n min-width: 0;\n}\n.notification-item__header[data-v-30bf7ddc] {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-bottom: 4px;\n}\n.notification-item__title[data-v-30bf7ddc] {\n font-size: 13px;\n font-weight: 500;\n color: var(--c-text-1);\n line-height: 1.4;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.notification-item__summary[data-v-30bf7ddc] {\n font-size: 12px;\n color: var(--c-text-2);\n line-height: 1.5;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n.notification-item__meta[data-v-30bf7ddc] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 6px;\n}\n.notification-item__time[data-v-30bf7ddc], .notification-item__sender[data-v-30bf7ddc] {\n font-size: 11px;\n color: var(--c-text-4);\n}\n.notification-item__sender[data-v-30bf7ddc]::before {\n content: \"·\";\n margin-right: 8px;\n}\n.notification-item__actions[data-v-30bf7ddc] {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n gap: 4px;\n opacity: 0;\n transition: opacity var(--c-transition, 0.2s ease);\n}\n.notification-item__action[data-v-30bf7ddc] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n padding: 2px;\n border-radius: 4px;\n cursor: pointer;\n color: var(--c-text-4);\n transition: all var(--c-transition, 0.2s ease);\n}\n.notification-item__action[data-v-30bf7ddc]:hover {\n color: var(--c-primary);\n background-color: var(--c-border);\n}","/* unplugin-vue-components disabled */.notification-list__tabs[data-v-3db0c5bf] {\n display: flex;\n border-bottom: 1px solid var(--c-border);\n padding: 0 4px;\n}\n.notification-list__tab[data-v-3db0c5bf] {\n position: relative;\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 10px 12px;\n font-size: 13px;\n color: var(--c-text-2);\n cursor: pointer;\n transition: all var(--c-transition, 0.2s ease);\n user-select: none;\n}\n.notification-list__tab[data-v-3db0c5bf]::after {\n content: \"\";\n position: absolute;\n bottom: 0;\n left: 12px;\n right: 12px;\n height: 2px;\n background: transparent;\n border-radius: 1px;\n transition: background var(--c-transition, 0.2s ease);\n}\n.notification-list__tab[data-v-3db0c5bf]:hover {\n color: var(--c-text-1);\n}\n.notification-list__tab--active[data-v-3db0c5bf] {\n color: var(--c-primary);\n font-weight: 500;\n}\n.notification-list__tab--active[data-v-3db0c5bf]::after {\n background: var(--c-primary);\n}\n.notification-list__tab-count[data-v-3db0c5bf] {\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n border-radius: 8px;\n background: #f5222d;\n color: #fff;\n font-size: 10px;\n font-weight: 600;\n line-height: 16px;\n text-align: center;\n}\n.notification-list__toolbar[data-v-3db0c5bf] {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 12px;\n padding: 6px 16px;\n border-bottom: 1px solid var(--c-border);\n}\n.notification-list__scroll[data-v-3db0c5bf] {\n flex: 1;\n}\n.notification-list__skeleton[data-v-3db0c5bf] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 14px 16px;\n}\n.notification-list__skeleton-text[data-v-3db0c5bf] {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n.notification-list__load-more[data-v-3db0c5bf] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 12px;\n font-size: 12px;\n color: var(--c-text-2);\n cursor: pointer;\n transition: color var(--c-transition, 0.2s ease);\n}\n.notification-list__load-more[data-v-3db0c5bf]:hover {\n color: var(--c-primary);\n}\n.notification-list__empty[data-v-3db0c5bf] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 0;\n gap: 12px;\n}\n.notification-list__empty-icon[data-v-3db0c5bf] {\n color: var(--c-text-4);\n opacity: 0.5;\n}\n.notification-list__empty-text[data-v-3db0c5bf] {\n font-size: 13px;\n color: var(--c-text-4);\n}","/* unplugin-vue-components disabled */.notification-detail[data-v-b10b0b8e] {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n.notification-detail__back[data-v-b10b0b8e] {\n padding: 8px 16px;\n border-bottom: 1px solid var(--c-border);\n}\n.notification-detail__header[data-v-b10b0b8e] {\n padding: 16px;\n border-bottom: 1px solid var(--c-border);\n}\n.notification-detail__title[data-v-b10b0b8e] {\n font-size: 15px;\n font-weight: 600;\n color: var(--c-text-1);\n line-height: 1.5;\n margin: 0 0 8px;\n}\n.notification-detail__meta[data-v-b10b0b8e] {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n}\n.notification-detail__time[data-v-b10b0b8e] {\n font-size: 11px;\n color: var(--c-text-4);\n}\n.notification-detail__sender[data-v-b10b0b8e] {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: 8px;\n font-size: 12px;\n color: var(--c-text-2);\n}\n.notification-detail__content[data-v-b10b0b8e] {\n flex: 1;\n min-height: 0;\n}\n.notification-detail__body[data-v-b10b0b8e] {\n padding: 16px;\n font-size: 13px;\n line-height: 1.7;\n color: var(--c-text-1);\n word-break: break-word;\n}\n.notification-detail__body[data-v-b10b0b8e] p {\n margin: 0 0 8px;\n}\n.notification-detail__body[data-v-b10b0b8e] ul,\n.notification-detail__body[data-v-b10b0b8e] ol {\n padding-left: 20px;\n margin: 8px 0;\n}\n.notification-detail__body[data-v-b10b0b8e] li {\n margin: 4px 0;\n}\n.notification-detail__body[data-v-b10b0b8e] strong {\n font-weight: 600;\n color: var(--c-primary);\n}\n.notification-detail__footer[data-v-b10b0b8e] {\n padding: 12px 16px;\n border-top: 1px solid var(--c-border);\n display: flex;\n justify-content: flex-end;\n}","/* unplugin-vue-components disabled */.c-notification-center[data-v-a60d6896] {\n display: inline-flex;\n align-items: center;\n}\n.c-notification-center__panel[data-v-a60d6896] {\n display: flex;\n flex-direction: column;\n max-height: 560px;\n}\n.c-notification-center__header[data-v-a60d6896] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 16px 10px;\n border-bottom: 1px solid var(--c-border);\n}\n.c-notification-center__title[data-v-a60d6896] {\n font-size: 15px;\n font-weight: 600;\n color: var(--c-text-1);\n}\n.c-notification-center__header-extra[data-v-a60d6896] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.c-notification-center__ws-dot[data-v-a60d6896] {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n transition: background-color var(--c-transition, 0.2s ease);\n}\n.c-notification-center__ws-dot--connected[data-v-a60d6896] {\n background: #52c41a;\n box-shadow: 0 0 4px rgba(82, 196, 26, 0.5);\n}\n.c-notification-center__ws-dot--connecting[data-v-a60d6896], .c-notification-center__ws-dot--reconnecting[data-v-a60d6896] {\n background: #faad14;\n animation: status-blink-a60d6896 1s ease-in-out infinite;\n}\n.c-notification-center__ws-dot--disconnected[data-v-a60d6896] {\n background: var(--c-text-4);\n}\n@keyframes status-blink-a60d6896 {\n0%, 100% {\n opacity: 1;\n}\n50% {\n opacity: 0.3;\n}\n}\n/* ─── 切换过渡 ───────────────────────────────── */\n.slide-fade-enter-active[data-v-a60d6896] {\n transition: all 0.25s ease-out;\n}\n.slide-fade-leave-active[data-v-a60d6896] {\n transition: all 0.2s ease-in;\n}\n.slide-fade-enter-from[data-v-a60d6896] {\n opacity: 0;\n transform: translateY(8px);\n}\n.slide-fade-leave-to[data-v-a60d6896] {\n opacity: 0;\n transform: translateY(-8px);\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;AC/EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { t as C_Icon_default } from "./C_Icon2.js";
|
|
2
2
|
import { t as export_helper_default } from "./export-helper.js";
|
|
3
3
|
import { i as setItem, t as getItem } from "./storage.js";
|
|
4
|
-
import {
|
|
4
|
+
import { NAvatar, NButton, NPopover, NScrollbar, NSkeleton, NSpin, NTag, NTooltip } from "naive-ui";
|
|
5
|
+
import { Fragment, Transition, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, normalizeStyle, onBeforeUnmount, onMounted, openBlock, readonly, ref, renderList, toDisplayString, unref, watch, withCtx, withModifiers } from "vue";
|
|
5
6
|
|
|
6
7
|
//#region src/components/C_NotificationCenter/constants.ts
|
|
7
8
|
/** 默认角标最大显示数 */
|
|
@@ -684,7 +685,7 @@ var NotificationBadge_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
|
|
|
684
685
|
/** 显示文本 */
|
|
685
686
|
const displayCount = computed(() => props.count > props.maxCount ? `${props.maxCount}+` : String(props.count));
|
|
686
687
|
return (_ctx, _cache) => {
|
|
687
|
-
const _component_NTooltip =
|
|
688
|
+
const _component_NTooltip = NTooltip;
|
|
688
689
|
return openBlock(), createElementBlock("div", _hoisted_1$4, [createVNode(_component_NTooltip, {
|
|
689
690
|
trigger: "hover",
|
|
690
691
|
placement: "bottom"
|
|
@@ -715,7 +716,7 @@ var NotificationBadge_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
|
|
|
715
716
|
|
|
716
717
|
//#endregion
|
|
717
718
|
//#region src/components/C_NotificationCenter/components/NotificationBadge.vue
|
|
718
|
-
var NotificationBadge_default = /* @__PURE__ */ export_helper_default(NotificationBadge_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-
|
|
719
|
+
var NotificationBadge_default = /* @__PURE__ */ export_helper_default(NotificationBadge_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-03c9c8c7"]]);
|
|
719
720
|
|
|
720
721
|
//#endregion
|
|
721
722
|
//#region src/components/C_NotificationCenter/composables/useNotificationFormat.ts
|
|
@@ -813,9 +814,9 @@ var NotificationItem_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
|
|
|
813
814
|
/** 格式化时间 */
|
|
814
815
|
const formattedTime = computed(() => formatRelativeTime(props.message.timestamp));
|
|
815
816
|
return (_ctx, _cache) => {
|
|
816
|
-
const _component_NAvatar =
|
|
817
|
-
const _component_NTag =
|
|
818
|
-
const _component_NTooltip =
|
|
817
|
+
const _component_NAvatar = NAvatar;
|
|
818
|
+
const _component_NTag = NTag;
|
|
819
|
+
const _component_NTooltip = NTooltip;
|
|
819
820
|
return openBlock(), createElementBlock("div", {
|
|
820
821
|
class: normalizeClass(["notification-item", {
|
|
821
822
|
"notification-item--unread": _ctx.message.status === "unread",
|
|
@@ -897,7 +898,7 @@ var NotificationItem_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
|
|
|
897
898
|
|
|
898
899
|
//#endregion
|
|
899
900
|
//#region src/components/C_NotificationCenter/components/NotificationItem.vue
|
|
900
|
-
var NotificationItem_default = /* @__PURE__ */ export_helper_default(NotificationItem_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-
|
|
901
|
+
var NotificationItem_default = /* @__PURE__ */ export_helper_default(NotificationItem_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-30bf7ddc"]]);
|
|
901
902
|
|
|
902
903
|
//#endregion
|
|
903
904
|
//#region src/components/C_NotificationCenter/components/NotificationList.vue?vue&type=script&setup=true&lang.ts
|
|
@@ -948,10 +949,10 @@ var NotificationList_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
|
|
|
948
949
|
return props.unreadByCategory[key] ?? 0;
|
|
949
950
|
}
|
|
950
951
|
return (_ctx, _cache) => {
|
|
951
|
-
const _component_NButton =
|
|
952
|
-
const _component_NSkeleton =
|
|
953
|
-
const _component_NSpin =
|
|
954
|
-
const _component_NScrollbar =
|
|
952
|
+
const _component_NButton = NButton;
|
|
953
|
+
const _component_NSkeleton = NSkeleton;
|
|
954
|
+
const _component_NSpin = NSpin;
|
|
955
|
+
const _component_NScrollbar = NScrollbar;
|
|
955
956
|
return openBlock(), createElementBlock("div", _hoisted_1$2, [
|
|
956
957
|
createCommentVNode(" 分类 Tab "),
|
|
957
958
|
createElementVNode("div", _hoisted_2$2, [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(CATEGORY_TABS), (tab) => {
|
|
@@ -1051,7 +1052,7 @@ var NotificationList_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
|
|
|
1051
1052
|
|
|
1052
1053
|
//#endregion
|
|
1053
1054
|
//#region src/components/C_NotificationCenter/components/NotificationList.vue
|
|
1054
|
-
var NotificationList_default = /* @__PURE__ */ export_helper_default(NotificationList_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-
|
|
1055
|
+
var NotificationList_default = /* @__PURE__ */ export_helper_default(NotificationList_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-3db0c5bf"]]);
|
|
1055
1056
|
|
|
1056
1057
|
//#endregion
|
|
1057
1058
|
//#region src/components/C_NotificationCenter/components/NotificationDetail.vue?vue&type=script&setup=true&lang.ts
|
|
@@ -1104,10 +1105,10 @@ var NotificationDetail_vue_vue_type_script_setup_true_lang_default = /* @__PURE_
|
|
|
1104
1105
|
else emit("navigate", url);
|
|
1105
1106
|
}
|
|
1106
1107
|
return (_ctx, _cache) => {
|
|
1107
|
-
const _component_NButton =
|
|
1108
|
-
const _component_NTag =
|
|
1109
|
-
const _component_NAvatar =
|
|
1110
|
-
const _component_NScrollbar =
|
|
1108
|
+
const _component_NButton = NButton;
|
|
1109
|
+
const _component_NTag = NTag;
|
|
1110
|
+
const _component_NAvatar = NAvatar;
|
|
1111
|
+
const _component_NScrollbar = NScrollbar;
|
|
1111
1112
|
return openBlock(), createElementBlock("div", _hoisted_1$1, [
|
|
1112
1113
|
createCommentVNode(" 返回栏 "),
|
|
1113
1114
|
createElementVNode("div", _hoisted_2$1, [createVNode(_component_NButton, {
|
|
@@ -1191,7 +1192,7 @@ var NotificationDetail_vue_vue_type_script_setup_true_lang_default = /* @__PURE_
|
|
|
1191
1192
|
|
|
1192
1193
|
//#endregion
|
|
1193
1194
|
//#region src/components/C_NotificationCenter/components/NotificationDetail.vue
|
|
1194
|
-
var NotificationDetail_default = /* @__PURE__ */ export_helper_default(NotificationDetail_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-
|
|
1195
|
+
var NotificationDetail_default = /* @__PURE__ */ export_helper_default(NotificationDetail_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-b10b0b8e"]]);
|
|
1195
1196
|
|
|
1196
1197
|
//#endregion
|
|
1197
1198
|
//#region src/components/C_NotificationCenter/index.vue?vue&type=script&setup=true&lang.ts
|
|
@@ -1296,8 +1297,8 @@ var index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCo
|
|
|
1296
1297
|
markAllAsRead: (category) => core.markAllAsRead(category)
|
|
1297
1298
|
});
|
|
1298
1299
|
return (_ctx, _cache) => {
|
|
1299
|
-
const _component_NTooltip =
|
|
1300
|
-
const _component_NPopover =
|
|
1300
|
+
const _component_NTooltip = NTooltip;
|
|
1301
|
+
const _component_NPopover = NPopover;
|
|
1301
1302
|
return openBlock(), createElementBlock("div", _hoisted_1, [createVNode(_component_NPopover, {
|
|
1302
1303
|
show: unref(core).popoverVisible.value,
|
|
1303
1304
|
"onUpdate:show": _cache[1] || (_cache[1] = ($event) => unref(core).popoverVisible.value = $event),
|
|
@@ -1376,7 +1377,7 @@ var index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCo
|
|
|
1376
1377
|
|
|
1377
1378
|
//#endregion
|
|
1378
1379
|
//#region src/components/C_NotificationCenter/index.vue
|
|
1379
|
-
var C_NotificationCenter_default = /* @__PURE__ */ export_helper_default(index_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-
|
|
1380
|
+
var C_NotificationCenter_default = /* @__PURE__ */ export_helper_default(index_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-a60d6896"]]);
|
|
1380
1381
|
|
|
1381
1382
|
//#endregion
|
|
1382
1383
|
export { CATEGORY_MAP as a, DEFAULT_PAGE_SIZE as c, DEFAULT_WS_HEARTBEAT_INTERVAL as d, DEFAULT_WS_HEARTBEAT_MESSAGE as f, PRIORITY_MAP as g, MOCK_MESSAGES as h, useNotificationWS as i, DEFAULT_POLLING_INTERVAL as l, DEFAULT_WS_RECONNECT_INTERVAL as m, useNotificationFormat as n, CATEGORY_TABS as o, DEFAULT_WS_MAX_RECONNECT as p, useNotificationCore as r, DEFAULT_MAX_BADGE_COUNT as s, C_NotificationCenter_default as t, DEFAULT_STORAGE_KEY as u };
|