@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.
Files changed (188) hide show
  1. package/dist/C_ActionBar-nnfbZCea.css.map +1 -0
  2. package/dist/C_ActionBar2.js +2 -2
  3. package/dist/C_ActionBar2.js.map +1 -1
  4. package/dist/C_AntV-DGjscTWa.css.map +1 -0
  5. package/dist/C_AntV2.js +6 -6
  6. package/dist/C_AntV2.js.map +1 -1
  7. package/dist/C_Barcode-DjTmDkbQ.css.map +1 -0
  8. package/dist/C_Barcode2.js +1 -1
  9. package/dist/C_Barcode2.js.map +1 -1
  10. package/dist/C_Captcha-Ccq3DMrR.css.map +1 -0
  11. package/dist/C_Captcha2.js +1 -1
  12. package/dist/C_Captcha2.js.map +1 -1
  13. package/dist/C_Cascade-IUUHIh7r.css.map +1 -0
  14. package/dist/C_Cascade2.js +2 -2
  15. package/dist/C_Cascade2.js.map +1 -1
  16. package/dist/C_City-Cv5BESaN.css.map +1 -0
  17. package/dist/C_City2.js +2 -2
  18. package/dist/C_City2.js.map +1 -1
  19. package/dist/C_Code-DPZlNSxL.css.map +1 -0
  20. package/dist/C_Code2.js +8 -7
  21. package/dist/C_Code2.js.map +1 -1
  22. package/dist/C_CollapsePanel-Fap-lv_5.css.map +1 -0
  23. package/dist/C_CollapsePanel2.js +1 -1
  24. package/dist/C_CollapsePanel2.js.map +1 -1
  25. package/dist/C_Cron-C0-8b5af.css.map +1 -0
  26. package/dist/C_Cron2.js +15 -14
  27. package/dist/C_Cron2.js.map +1 -1
  28. package/dist/C_Date2.js +1 -1
  29. package/dist/C_Date2.js.map +1 -1
  30. package/dist/C_Draggable-Bq6o0qXn.css.map +1 -0
  31. package/dist/C_Draggable2.js +1 -1
  32. package/dist/C_Draggable2.js.map +1 -1
  33. package/dist/C_Editor-OlxIF9-5.css.map +1 -0
  34. package/dist/C_Editor2.js +1 -1
  35. package/dist/C_Editor2.js.map +1 -1
  36. package/dist/C_FilePreview-B4XgTv-h.css.map +1 -0
  37. package/dist/C_FilePreview.cjs +1 -0
  38. package/dist/C_FilePreview.js +1 -0
  39. package/dist/C_FilePreview2.js +10 -9
  40. package/dist/C_FilePreview2.js.map +1 -1
  41. package/dist/C_Form-Cr9oX037.css.map +1 -0
  42. package/dist/C_Form.cjs +1 -0
  43. package/dist/C_Form.js +1 -0
  44. package/dist/C_Form2.js +69 -72
  45. package/dist/C_Form2.js.map +1 -1
  46. package/dist/C_FormSearch-DlIEoh7X.css.map +1 -0
  47. package/dist/C_FormSearch2.js +2 -2
  48. package/dist/C_FormSearch2.js.map +1 -1
  49. package/dist/C_FormulaEditor-Cm0CokN5.css.map +1 -0
  50. package/dist/C_FormulaEditor2.js +6 -6
  51. package/dist/C_FormulaEditor2.js.map +1 -1
  52. package/dist/C_FullCalendar-BULCIlVK.css.map +1 -0
  53. package/dist/C_FullCalendar2.js +2 -2
  54. package/dist/C_FullCalendar2.js.map +1 -1
  55. package/dist/C_Guide2.js +1 -1
  56. package/dist/C_Guide2.js.map +1 -1
  57. package/dist/C_Icon2.js.map +1 -1
  58. package/dist/C_ImageCropper-DrmUlaLi.css.map +1 -0
  59. package/dist/C_ImageCropper2.js +4 -4
  60. package/dist/C_ImageCropper2.js.map +1 -1
  61. package/dist/C_Language2.js +1 -1
  62. package/dist/C_Language2.js.map +1 -1
  63. package/dist/C_Map-WUMXSAfy.css.map +1 -0
  64. package/dist/C_Map2.js +2 -2
  65. package/dist/C_Map2.js.map +1 -1
  66. package/dist/C_Markdown-Dmv8yaM4.css.map +1 -0
  67. package/dist/C_Markdown2.js +4 -4
  68. package/dist/C_Markdown2.js.map +1 -1
  69. package/dist/C_NotificationCenter-DbgBiyqB.css.map +1 -0
  70. package/dist/C_NotificationCenter2.js +21 -20
  71. package/dist/C_NotificationCenter2.js.map +1 -1
  72. package/dist/C_Progress2.js +1 -1
  73. package/dist/C_Progress2.js.map +1 -1
  74. package/dist/C_QRCode-G7fiAkm4.css.map +1 -0
  75. package/dist/C_QRCode2.js +1 -1
  76. package/dist/C_QRCode2.js.map +1 -1
  77. package/dist/C_Signature-es-ZNPzr.css.map +1 -0
  78. package/dist/C_Signature2.js +2 -2
  79. package/dist/C_Signature2.js.map +1 -1
  80. package/dist/C_SplitPane-Br2eK8IG.css.map +1 -0
  81. package/dist/C_SplitPane2.js +1 -1
  82. package/dist/C_SplitPane2.js.map +1 -1
  83. package/dist/C_Steps-P9Qj9iDd.css.map +1 -0
  84. package/dist/C_Steps2.js +1 -1
  85. package/dist/C_Steps2.js.map +1 -1
  86. package/dist/C_Table-DAwAxr72.css.map +1 -0
  87. package/dist/C_Table.cjs +1 -0
  88. package/dist/C_Table.js +1 -0
  89. package/dist/C_Table2.js +3 -3
  90. package/dist/C_Table2.js.map +1 -1
  91. package/dist/C_Theme2.js +1 -1
  92. package/dist/C_Theme2.js.map +1 -1
  93. package/dist/C_Time-Bd_e1YDN.css.map +1 -0
  94. package/dist/C_Time2.js +2 -2
  95. package/dist/C_Time2.js.map +1 -1
  96. package/dist/C_Tree-DnGc_MPb.css.map +1 -0
  97. package/dist/C_Tree2.js +2 -2
  98. package/dist/C_Tree2.js.map +1 -1
  99. package/dist/C_Upload-i8LB_29U.css.map +1 -0
  100. package/dist/C_Upload2.js +5 -5
  101. package/dist/C_Upload2.js.map +1 -1
  102. package/dist/C_VideoPlayer-rm0MODUv.css.map +1 -0
  103. package/dist/C_VideoPlayer2.js +21 -20
  104. package/dist/C_VideoPlayer2.js.map +1 -1
  105. package/dist/C_VtableGantt-BpY-Rng3.css.map +1 -0
  106. package/dist/C_VtableGantt2.js +2 -2
  107. package/dist/C_VtableGantt2.js.map +1 -1
  108. package/dist/C_WaterFall-HWB-gPON.css.map +1 -0
  109. package/dist/C_WaterFall2.js +2 -2
  110. package/dist/C_WaterFall2.js.map +1 -1
  111. package/dist/C_WorkFlow-CSO86Cuc.css.map +1 -0
  112. package/dist/C_WorkFlow2.js +6 -6
  113. package/dist/C_WorkFlow2.js.map +1 -1
  114. package/dist/constants.d.ts +4 -4
  115. package/dist/constants2.d.ts +4 -4
  116. package/dist/constants3.d.ts +4 -4
  117. package/dist/constants4.d.ts +5 -5
  118. package/dist/constants5.d.ts +2 -2
  119. package/dist/data.d.ts +1 -1
  120. package/dist/index.js.map +1 -1
  121. package/dist/index.vue.d.ts +1 -1
  122. package/dist/index10.vue.d.ts +7 -7
  123. package/dist/index11.vue.d.ts +2 -2
  124. package/dist/index12.vue.d.ts +5 -5
  125. package/dist/index12.vue.d.ts.map +1 -1
  126. package/dist/index13.vue.d.ts +1 -1
  127. package/dist/index14.vue.d.ts +1 -1
  128. package/dist/index16.vue.d.ts +1 -1
  129. package/dist/index2.vue.d.ts +6 -6
  130. package/dist/index3.vue.d.ts +2 -2
  131. package/dist/index4.vue.d.ts +2 -2
  132. package/dist/index5.vue.d.ts +2 -2
  133. package/dist/index6.vue.d.ts +1 -1
  134. package/dist/index8.vue.d.ts +3 -3
  135. package/dist/resolver.js.map +1 -1
  136. package/dist/style.css +1555 -1555
  137. package/dist/useCalendarEvents.d.ts +2 -2
  138. package/dist/useCollapsePanel.d.ts +2 -2
  139. package/dist/useCropperCore.d.ts +3 -3
  140. package/dist/useDraggableLayout.d.ts +8 -8
  141. package/dist/useDynamicFormState.d.ts +111 -111
  142. package/dist/useDynamicFormState.d.ts.map +1 -1
  143. package/dist/useEdgeInteraction.d.ts +2 -2
  144. package/dist/useInfiniteScroll.d.ts +1 -1
  145. package/dist/useModalEdit.d.ts +4 -4
  146. package/dist/useModalEdit.d.ts.map +1 -1
  147. package/dist/useQRCode.d.ts +4 -4
  148. package/dist/useQRCode.d.ts.map +1 -1
  149. package/dist/useSearchState.d.ts +2 -2
  150. package/dist/useSignatureHistory.d.ts +4 -4
  151. package/dist/useSplitResize.d.ts +6 -6
  152. package/dist/useSplitResize.d.ts.map +1 -1
  153. package/dist/useTimeSelection.d.ts +2 -2
  154. package/dist/useTreeOperations.d.ts +6 -6
  155. package/dist/useWorkflowValidation.d.ts +5 -5
  156. package/package.json +2 -1
  157. package/dist/C_ActionBar-DWN-woTc.css.map +0 -1
  158. package/dist/C_AntV-AFKyK6hH.css.map +0 -1
  159. package/dist/C_Barcode-P_EFj8dC.css.map +0 -1
  160. package/dist/C_Captcha-C-ef41xw.css.map +0 -1
  161. package/dist/C_Cascade-D9kNsjsV.css.map +0 -1
  162. package/dist/C_City-BCQ4ipiK.css.map +0 -1
  163. package/dist/C_Code-C9kvvEmO.css.map +0 -1
  164. package/dist/C_CollapsePanel-BUJHuYcU.css.map +0 -1
  165. package/dist/C_Cron-yx2Ob4Jl.css.map +0 -1
  166. package/dist/C_Draggable-C483syRC.css.map +0 -1
  167. package/dist/C_Editor-Bp0SyIEw.css.map +0 -1
  168. package/dist/C_FilePreview-CPqvhoCy.css.map +0 -1
  169. package/dist/C_Form-Jx7PY3sT.css.map +0 -1
  170. package/dist/C_FormSearch-DvRgxlRn.css.map +0 -1
  171. package/dist/C_FormulaEditor-DtGkt4T_.css.map +0 -1
  172. package/dist/C_FullCalendar-BF7H0YIx.css.map +0 -1
  173. package/dist/C_ImageCropper-BVJfUufl.css.map +0 -1
  174. package/dist/C_Map-DpzeuWdX.css.map +0 -1
  175. package/dist/C_Markdown-BEjxknqd.css.map +0 -1
  176. package/dist/C_NotificationCenter-0l3TY2Gn.css.map +0 -1
  177. package/dist/C_QRCode-DbdiAIPg.css.map +0 -1
  178. package/dist/C_Signature-zhHCbra9.css.map +0 -1
  179. package/dist/C_SplitPane-C6sBsfKY.css.map +0 -1
  180. package/dist/C_Steps-CODHN5Hs.css.map +0 -1
  181. package/dist/C_Table-DSNsntmT.css.map +0 -1
  182. package/dist/C_Time-BvZLYraL.css.map +0 -1
  183. package/dist/C_Tree-0GDv--jX.css.map +0 -1
  184. package/dist/C_Upload-BXd3YYLx.css.map +0 -1
  185. package/dist/C_VideoPlayer-DYG3RL0Q.css.map +0 -1
  186. package/dist/C_VtableGantt-fhItIiHE.css.map +0 -1
  187. package/dist/C_WaterFall-8sQDFXKg.css.map +0 -1
  188. package/dist/C_WorkFlow-J-dyIuh9.css.map +0 -1
@@ -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, resolveComponent, watch } from "vue";
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
- const _component_v_md_editor = resolveComponent("v-md-editor");
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-26eea21a"]]);
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 };
@@ -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 { Fragment, Transition, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, normalizeStyle, onBeforeUnmount, onMounted, openBlock, readonly, ref, renderList, resolveComponent, toDisplayString, unref, watch, withCtx, withModifiers } from "vue";
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 = resolveComponent("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-da0cc98c"]]);
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 = resolveComponent("NAvatar");
817
- const _component_NTag = resolveComponent("NTag");
818
- const _component_NTooltip = resolveComponent("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-0104dbfc"]]);
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 = resolveComponent("NButton");
952
- const _component_NSkeleton = resolveComponent("NSkeleton");
953
- const _component_NSpin = resolveComponent("NSpin");
954
- const _component_NScrollbar = resolveComponent("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-47e5497f"]]);
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 = resolveComponent("NButton");
1108
- const _component_NTag = resolveComponent("NTag");
1109
- const _component_NAvatar = resolveComponent("NAvatar");
1110
- const _component_NScrollbar = resolveComponent("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-d10a445e"]]);
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 = resolveComponent("NTooltip");
1300
- const _component_NPopover = resolveComponent("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-d4b27637"]]);
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 };