@robot-admin/naive-ui-components 0.4.4 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/C_ActionBar-jZPsiXtT.css.map +1 -0
  3. package/dist/C_ActionBar.css +205 -0
  4. package/dist/{C_AntV-DGjscTWa.css.map → C_AntV-A3NXx_sF.css.map} +1 -1
  5. package/dist/C_AntV-D2Zp2qQF.css.map +1 -0
  6. package/dist/C_AntV.css +398 -0
  7. package/dist/C_AntV.js.map +1 -1
  8. package/dist/C_AntV2.js +1 -1
  9. package/dist/C_AntV2.js.map +1 -1
  10. package/dist/C_Barcode-Do1Ozsmh.css.map +1 -0
  11. package/dist/C_Barcode.css +39 -0
  12. package/dist/C_Captcha-CZmAETly.css.map +1 -0
  13. package/dist/C_Captcha.css +109 -0
  14. package/dist/C_Cascade-Dq0S5Jkm.css.map +1 -0
  15. package/dist/C_Cascade.css +10 -0
  16. package/dist/C_City-DNKv4MpH.css.map +1 -0
  17. package/dist/C_City.css +132 -0
  18. package/dist/C_Code-avZjAnHD.css.map +1 -0
  19. package/dist/C_Code.css +8 -0
  20. package/dist/C_CollapsePanel-BpofCDyl.css.map +1 -0
  21. package/dist/C_CollapsePanel.css +171 -0
  22. package/dist/C_Cron-DqHQ92LN.css.map +1 -0
  23. package/dist/C_Cron.css +307 -0
  24. package/dist/C_Draggable-r6nhx3yM.css.map +1 -0
  25. package/dist/C_Draggable.css +238 -0
  26. package/dist/C_Editor-D0_6UhIa.css.map +1 -0
  27. package/dist/C_Editor.css +52 -0
  28. package/dist/{C_FilePreview-B4XgTv-h.css.map → C_FilePreview-BVarVvnD.css.map} +1 -1
  29. package/dist/C_FilePreview-DHGlV4OR.css.map +1 -0
  30. package/dist/C_FilePreview.css +507 -0
  31. package/dist/C_FilePreview.js.map +1 -1
  32. package/dist/C_FilePreview2.js +1 -1
  33. package/dist/C_FilePreview2.js.map +1 -1
  34. package/dist/{C_Form-DLb9FtAb.css.map → C_Form-BciQUPpS.css.map} +1 -1
  35. package/dist/C_Form-CKHvXL3O.css.map +1 -0
  36. package/dist/C_Form.css +976 -0
  37. package/dist/C_Form.js.map +1 -1
  38. package/dist/C_Form2.js +1 -1
  39. package/dist/C_Form2.js.map +1 -1
  40. package/dist/{C_FormSearch-DlIEoh7X.css.map → C_FormSearch-Bmd2CmG6.css.map} +1 -1
  41. package/dist/C_FormSearch-DBNtnjaL.css.map +1 -0
  42. package/dist/C_FormSearch.css +177 -0
  43. package/dist/C_FormSearch.js.map +1 -1
  44. package/dist/C_FormSearch2.js +1 -1
  45. package/dist/C_FormSearch2.js.map +1 -1
  46. package/dist/C_FormulaEditor-3WG2vtQl.css.map +1 -0
  47. package/dist/C_FormulaEditor.css +502 -0
  48. package/dist/C_FullCalendar-1U4VlG7X.css.map +1 -0
  49. package/dist/C_FullCalendar-DLUdCtqf.css.map +1 -0
  50. package/dist/C_FullCalendar.css +7 -0
  51. package/dist/C_FullCalendar.js.map +1 -1
  52. package/dist/C_FullCalendar2.js +1 -1
  53. package/dist/C_FullCalendar2.js.map +1 -1
  54. package/dist/C_GlobalSearch-B6wK3m3k.css.map +1 -0
  55. package/dist/C_GlobalSearch.css +616 -0
  56. package/dist/C_Guide.js.map +1 -1
  57. package/dist/C_Guide2.js.map +1 -1
  58. package/dist/C_Icon.js.map +1 -1
  59. package/dist/C_Icon2.js.map +1 -1
  60. package/dist/C_ImageCropper-D3L2-J_J.css.map +1 -0
  61. package/dist/C_ImageCropper.css +129 -0
  62. package/dist/C_Language.js.map +1 -1
  63. package/dist/C_Language2.js.map +1 -1
  64. package/dist/C_Map-BCJmDnJT.css.map +1 -0
  65. package/dist/C_Map.css +29 -0
  66. package/dist/{C_Markdown-C2uiBVSW.css.map → C_Markdown-7iBnLDtL.css.map} +1 -1
  67. package/dist/C_Markdown-BbTvdFCl.css.map +1 -0
  68. package/dist/C_Markdown.css +112 -0
  69. package/dist/C_Markdown.js.map +1 -1
  70. package/dist/C_Markdown2.js +1 -1
  71. package/dist/C_Markdown2.js.map +1 -1
  72. package/dist/C_NotificationCenter-DT6fQ79O.css.map +1 -0
  73. package/dist/C_NotificationCenter.css +466 -0
  74. package/dist/C_QRCode-DMxSyogU.css.map +1 -0
  75. package/dist/C_QRCode.css +51 -0
  76. package/dist/C_Signature-B5fFz6RD.css.map +1 -0
  77. package/dist/C_Signature.css +79 -0
  78. package/dist/C_SplitPane-DuyzUhKB.css.map +1 -0
  79. package/dist/C_SplitPane.css +152 -0
  80. package/dist/C_Steps-DGwXxS2Y.css.map +1 -0
  81. package/dist/C_Steps.css +171 -0
  82. package/dist/{C_Table-C55H4kPr.css.map → C_Table-Dcam_tRs.css.map} +1 -1
  83. package/dist/C_Table-tbUx-R4H.css.map +1 -0
  84. package/dist/C_Table.css +527 -0
  85. package/dist/C_Table.js.map +1 -1
  86. package/dist/C_Table2.js +1 -1
  87. package/dist/C_Table2.js.map +1 -1
  88. package/dist/C_Theme.js.map +1 -1
  89. package/dist/C_Theme2.js.map +1 -1
  90. package/dist/C_Time-CKb_fwdm.css.map +1 -0
  91. package/dist/C_Time.css +23 -0
  92. package/dist/C_Tree-B-Le4hjQ.css.map +1 -0
  93. package/dist/C_Tree.css +142 -0
  94. package/dist/C_Upload-S30RmC9t.css.map +1 -0
  95. package/dist/C_Upload.css +251 -0
  96. package/dist/C_VideoPlayer-Cdgv4Zq0.css.map +1 -0
  97. package/dist/C_VideoPlayer.css +355 -0
  98. package/dist/C_VideoPlayer.d.ts +1 -1
  99. package/dist/C_VtableGantt-DB87-jdS.css.map +1 -0
  100. package/dist/C_VtableGantt.css +89 -0
  101. package/dist/C_WaterFall-C4HDqf-a.css.map +1 -0
  102. package/dist/C_WaterFall.css +73 -0
  103. package/dist/{C_WorkFlow-CSO86Cuc.css.map → C_WorkFlow-7F6op6qN.css.map} +1 -1
  104. package/dist/C_WorkFlow-Cy3HWA6A.css.map +1 -0
  105. package/dist/C_WorkFlow.css +1166 -0
  106. package/dist/C_WorkFlow.js.map +1 -1
  107. package/dist/C_WorkFlow2.js +1 -1
  108. package/dist/C_WorkFlow2.js.map +1 -1
  109. package/dist/chunk.js +1 -1
  110. package/dist/constants.d.ts +4 -4
  111. package/dist/constants2.d.ts +5 -5
  112. package/dist/constants3.d.ts +3 -3
  113. package/dist/constants4.d.ts +4 -4
  114. package/dist/constants5.d.ts +8 -3816
  115. package/dist/data.d.ts +1 -1
  116. package/dist/index.cjs.map +1 -1
  117. package/dist/index.d.ts +2 -1
  118. package/dist/index.js.map +1 -1
  119. package/dist/index.vue.d.ts +1 -1
  120. package/dist/index10.vue.d.ts +8 -8
  121. package/dist/index11.vue.d.ts +2 -2
  122. package/dist/index12.vue.d.ts +7 -7
  123. package/dist/index13.vue.d.ts +1 -1
  124. package/dist/index14.vue.d.ts +2 -2
  125. package/dist/index15.vue.d.ts +1 -1
  126. package/dist/index16.vue.d.ts +2 -2
  127. package/dist/index3.vue.d.ts +1 -1
  128. package/dist/index4.vue.d.ts +2 -2
  129. package/dist/index5.vue.d.ts +2 -2
  130. package/dist/index6.vue.d.ts +4 -4
  131. package/dist/index7.vue.d.ts +2 -2
  132. package/dist/index8.vue.d.ts +4 -4
  133. package/dist/index9.vue.d.ts +1 -1
  134. package/dist/resolver.cjs +1 -1
  135. package/dist/resolver.cjs.map +1 -1
  136. package/dist/resolver.d.cts +7 -0
  137. package/dist/resolver.d.ts +7 -0
  138. package/dist/resolver.js +1 -1
  139. package/dist/resolver.js.map +1 -1
  140. package/dist/style.css +481 -481
  141. package/dist/useCalendarEvents.d.ts +1 -1
  142. package/dist/useCollapsePanel.d.ts +1 -1
  143. package/dist/useCropperCore.d.ts +7 -7
  144. package/dist/useDraggableLayout.d.ts +2 -2
  145. package/dist/useDynamicFormState.d.ts +8 -8
  146. package/dist/useEdgeInteraction.d.ts +4 -7293
  147. package/dist/useFullscreen.d.ts +2 -2
  148. package/dist/useInfiniteScroll.d.ts +3 -3
  149. package/dist/useModalEdit.d.ts +41 -17
  150. package/dist/useQRCode.d.ts +3 -3
  151. package/dist/useSearchState.d.ts +3 -3
  152. package/dist/useSignatureHistory.d.ts +3 -3
  153. package/dist/useSplitResize.d.ts +3 -3
  154. package/dist/useTimeSelection.d.ts +2 -2
  155. package/dist/useTreeOperations.d.ts +3 -3
  156. package/dist/useWorkflowValidation.d.ts +5 -5
  157. package/package.json +32 -32
  158. package/dist/C_FullCalendar-BULCIlVK.css.map +0 -1
@@ -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":["/* unplugin-vue-components disabled */<!--\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2025-06-20\n * @Description: Markdown 编辑器封装组件\n * @Migration: naive-ui-components 组件库迁移版本\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <div class=\"c-markdown-wrapper\" :class=\"{ 'is-dark': isDark }\">\n <VMdEditor\n ref=\"editorRef\"\n :model-value=\"modelValue\"\n :height=\"height\"\n :placeholder=\"placeholder\"\n :toolbar=\"toolbar\"\n :mode=\"mode\"\n :upload-image-config=\"computedUploadImageConfig\"\n :toc-nav-position=\"tocNavPosition\"\n :default-fullscreen=\"defaultFullscreen\"\n :autofocus=\"autofocus\"\n :include-level=\"includeLevel\"\n :left-toolbar=\"leftToolbar\"\n :right-toolbar=\"rightToolbar\"\n :default-show-toc=\"true\"\n @update:model-value=\"handleInput\"\n @change=\"handleChange\"\n @save=\"handleSave\"\n @upload-image=\"handleUploadImage\"\n @fullscreen-change=\"handleFullscreenChange\"\n @copy-code-success=\"handleCopyCodeSuccess\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, onMounted } from \"vue\";\nimport VMdEditor from \"@kangc/v-md-editor\";\n\ndefineOptions({ name: \"C_Markdown\" });\n\nexport type InsertImageFunction = (config: {\n url: string;\n desc?: string;\n width?: string | number;\n height?: string | number;\n}) => void;\n\ninterface Props {\n modelValue?: string;\n height?: string | number;\n disabled?: boolean;\n placeholder?: string;\n mode?: \"edit\" | \"editable\" | \"preview\";\n toolbar?: object;\n uploadImageConfig?: {\n accept?: string;\n multiple?: boolean;\n [key: string]: any;\n };\n tocNavPosition?: \"left\" | \"right\";\n defaultFullscreen?: boolean;\n autofocus?: boolean;\n includeLevel?: number[];\n leftToolbar?: string;\n rightToolbar?: string;\n maxLength?: number;\n showWordCount?: boolean;\n autoSave?: boolean;\n autoSaveInterval?: number;\n /** 是否为暗色主题(外部传入) */\n isDark?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n modelValue: \"\",\n height: \"400px\",\n disabled: false,\n placeholder: \"请输入 Markdown 内容...\",\n mode: \"editable\",\n tocNavPosition: \"right\",\n defaultFullscreen: false,\n autofocus: false,\n includeLevel: () => [1, 2, 3, 4, 5, 6],\n leftToolbar:\n \"undo redo clear | h bold italic strikethrough quote | ul ol table hr | link image code | save\",\n rightToolbar: \"preview toc sync-scroll fullscreen\",\n maxLength: 50000,\n showWordCount: true,\n autoSave: false,\n autoSaveInterval: 30000,\n isDark: false,\n});\n\ninterface Emits {\n \"update:modelValue\": [value: string];\n change: [text: string, html: string];\n save: [text: string, html: string];\n \"upload-image\": [\n event: Event,\n insertImage: InsertImageFunction,\n files: FileList,\n ];\n \"fullscreen-change\": [isFullscreen: boolean];\n \"copy-code-success\": [text: string];\n \"word-count-change\": [count: number];\n \"auto-save\": [text: string];\n \"max-length-exceeded\": [currentLength: number, maxLength: number];\n}\n\nconst emit = defineEmits<Emits>();\n\nconst editorRef = ref<any>(null);\nconst cachedHtml = ref(\"\");\n\nconst wordCount = computed(() => {\n return props.modelValue?.length || 0;\n});\n\nconst computedUploadImageConfig = computed(() => {\n const defaultConfig = {\n accept: \"image/*\",\n multiple: false,\n };\n return props.uploadImageConfig\n ? { ...defaultConfig, ...props.uploadImageConfig }\n : defaultConfig;\n});\n\nonMounted(() => {\n if (props.showWordCount && props.modelValue) {\n emit(\"word-count-change\", props.modelValue.length);\n }\n});\n\nwatch(\n () => props.modelValue,\n (newValue) => {\n if (props.showWordCount) {\n emit(\"word-count-change\", newValue?.length || 0);\n }\n },\n { immediate: true },\n);\n\nconst handleInput = (value: string) => {\n if (value.length > props.maxLength) {\n emit(\"max-length-exceeded\", value.length, props.maxLength);\n return;\n }\n emit(\"update:modelValue\", value);\n if (props.showWordCount) {\n emit(\"word-count-change\", value.length);\n }\n};\n\nconst handleChange = (text: string, html: string) => {\n cachedHtml.value = html;\n emit(\"change\", text, html);\n if (props.autoSave) {\n autoSave(text);\n }\n};\n\nconst handleSave = (text: string, html: string) => {\n emit(\"save\", text, html);\n};\n\nconst handleUploadImage = (\n event: Event,\n insertImage: InsertImageFunction,\n files: FileList,\n) => {\n emit(\"upload-image\", event, insertImage, files);\n};\n\nconst handleFullscreenChange = (isFullscreen: boolean) => {\n emit(\"fullscreen-change\", isFullscreen);\n};\n\nconst handleCopyCodeSuccess = (text: string) => {\n emit(\"copy-code-success\", text);\n};\n\nlet autoSaveTimer: ReturnType<typeof setTimeout> | null = null;\n\nconst autoSave = (text: string) => {\n if (autoSaveTimer) clearTimeout(autoSaveTimer);\n autoSaveTimer = setTimeout(() => {\n emit(\"auto-save\", text);\n }, props.autoSaveInterval);\n};\n\nconst focus = () => {\n editorRef.value?.focus();\n};\n\nconst getHtml = (): string => {\n return cachedHtml.value;\n};\n\nconst insertText = (text: string) => {\n editorRef.value?.insert((selected: string) => ({\n text: `${selected}${text}`,\n selected: text,\n }));\n};\n\ndefineExpose({\n focus,\n getHtml,\n insertText,\n wordCount,\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@use \"./index.scss\";\n</style>\n","/* unplugin-vue-components disabled */<!--\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2025-06-20\n * @Description: Markdown 编辑器封装组件\n * @Migration: naive-ui-components 组件库迁移版本\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <div class=\"c-markdown-wrapper\" :class=\"{ 'is-dark': isDark }\">\n <VMdEditor\n ref=\"editorRef\"\n :model-value=\"modelValue\"\n :height=\"height\"\n :placeholder=\"placeholder\"\n :toolbar=\"toolbar\"\n :mode=\"mode\"\n :upload-image-config=\"computedUploadImageConfig\"\n :toc-nav-position=\"tocNavPosition\"\n :default-fullscreen=\"defaultFullscreen\"\n :autofocus=\"autofocus\"\n :include-level=\"includeLevel\"\n :left-toolbar=\"leftToolbar\"\n :right-toolbar=\"rightToolbar\"\n :default-show-toc=\"true\"\n @update:model-value=\"handleInput\"\n @change=\"handleChange\"\n @save=\"handleSave\"\n @upload-image=\"handleUploadImage\"\n @fullscreen-change=\"handleFullscreenChange\"\n @copy-code-success=\"handleCopyCodeSuccess\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, onMounted } from \"vue\";\nimport VMdEditor from \"@kangc/v-md-editor\";\n\ndefineOptions({ name: \"C_Markdown\" });\n\nexport type InsertImageFunction = (config: {\n url: string;\n desc?: string;\n width?: string | number;\n height?: string | number;\n}) => void;\n\ninterface Props {\n modelValue?: string;\n height?: string | number;\n disabled?: boolean;\n placeholder?: string;\n mode?: \"edit\" | \"editable\" | \"preview\";\n toolbar?: object;\n uploadImageConfig?: {\n accept?: string;\n multiple?: boolean;\n [key: string]: any;\n };\n tocNavPosition?: \"left\" | \"right\";\n defaultFullscreen?: boolean;\n autofocus?: boolean;\n includeLevel?: number[];\n leftToolbar?: string;\n rightToolbar?: string;\n maxLength?: number;\n showWordCount?: boolean;\n autoSave?: boolean;\n autoSaveInterval?: number;\n /** 是否为暗色主题(外部传入) */\n isDark?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n modelValue: \"\",\n height: \"400px\",\n disabled: false,\n placeholder: \"请输入 Markdown 内容...\",\n mode: \"editable\",\n tocNavPosition: \"right\",\n defaultFullscreen: false,\n autofocus: false,\n includeLevel: () => [1, 2, 3, 4, 5, 6],\n leftToolbar:\n \"undo redo clear | h bold italic strikethrough quote | ul ol table hr | link image code | save\",\n rightToolbar: \"preview toc sync-scroll fullscreen\",\n maxLength: 50000,\n showWordCount: true,\n autoSave: false,\n autoSaveInterval: 30000,\n isDark: false,\n});\n\ninterface Emits {\n \"update:modelValue\": [value: string];\n change: [text: string, html: string];\n save: [text: string, html: string];\n \"upload-image\": [\n event: Event,\n insertImage: InsertImageFunction,\n files: FileList,\n ];\n \"fullscreen-change\": [isFullscreen: boolean];\n \"copy-code-success\": [text: string];\n \"word-count-change\": [count: number];\n \"auto-save\": [text: string];\n \"max-length-exceeded\": [currentLength: number, maxLength: number];\n}\n\nconst emit = defineEmits<Emits>();\n\nconst editorRef = ref<any>(null);\nconst cachedHtml = ref(\"\");\n\nconst wordCount = computed(() => {\n return props.modelValue?.length || 0;\n});\n\nconst computedUploadImageConfig = computed(() => {\n const defaultConfig = {\n accept: \"image/*\",\n multiple: false,\n };\n return props.uploadImageConfig\n ? { ...defaultConfig, ...props.uploadImageConfig }\n : defaultConfig;\n});\n\nonMounted(() => {\n if (props.showWordCount && props.modelValue) {\n emit(\"word-count-change\", props.modelValue.length);\n }\n});\n\nwatch(\n () => props.modelValue,\n (newValue) => {\n if (props.showWordCount) {\n emit(\"word-count-change\", newValue?.length || 0);\n }\n },\n { immediate: true },\n);\n\nconst handleInput = (value: string) => {\n if (value.length > props.maxLength) {\n emit(\"max-length-exceeded\", value.length, props.maxLength);\n return;\n }\n emit(\"update:modelValue\", value);\n if (props.showWordCount) {\n emit(\"word-count-change\", value.length);\n }\n};\n\nconst handleChange = (text: string, html: string) => {\n cachedHtml.value = html;\n emit(\"change\", text, html);\n if (props.autoSave) {\n autoSave(text);\n }\n};\n\nconst handleSave = (text: string, html: string) => {\n emit(\"save\", text, html);\n};\n\nconst handleUploadImage = (\n event: Event,\n insertImage: InsertImageFunction,\n files: FileList,\n) => {\n emit(\"upload-image\", event, insertImage, files);\n};\n\nconst handleFullscreenChange = (isFullscreen: boolean) => {\n emit(\"fullscreen-change\", isFullscreen);\n};\n\nconst handleCopyCodeSuccess = (text: string) => {\n emit(\"copy-code-success\", text);\n};\n\nlet autoSaveTimer: ReturnType<typeof setTimeout> | null = null;\n\nconst autoSave = (text: string) => {\n if (autoSaveTimer) clearTimeout(autoSaveTimer);\n autoSaveTimer = setTimeout(() => {\n emit(\"auto-save\", text);\n }, props.autoSaveInterval);\n};\n\nconst focus = () => {\n editorRef.value?.focus();\n};\n\nconst getHtml = (): string => {\n return cachedHtml.value;\n};\n\nconst insertText = (text: string) => {\n editorRef.value?.insert((selected: string) => ({\n text: `${selected}${text}`,\n selected: text,\n }));\n};\n\ndefineExpose({\n focus,\n getHtml,\n insertText,\n wordCount,\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@use \"./index.scss\";\n</style>\n","<!--\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2025-06-20\n * @Description: Markdown 编辑器封装组件\n * @Migration: naive-ui-components 组件库迁移版本\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <div class=\"c-markdown-wrapper\" :class=\"{ 'is-dark': isDark }\">\n <VMdEditor\n ref=\"editorRef\"\n :model-value=\"modelValue\"\n :height=\"height\"\n :placeholder=\"placeholder\"\n :toolbar=\"toolbar\"\n :mode=\"mode\"\n :upload-image-config=\"computedUploadImageConfig\"\n :toc-nav-position=\"tocNavPosition\"\n :default-fullscreen=\"defaultFullscreen\"\n :autofocus=\"autofocus\"\n :include-level=\"includeLevel\"\n :left-toolbar=\"leftToolbar\"\n :right-toolbar=\"rightToolbar\"\n :default-show-toc=\"true\"\n @update:model-value=\"handleInput\"\n @change=\"handleChange\"\n @save=\"handleSave\"\n @upload-image=\"handleUploadImage\"\n @fullscreen-change=\"handleFullscreenChange\"\n @copy-code-success=\"handleCopyCodeSuccess\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, onMounted } from \"vue\";\nimport VMdEditor from \"@kangc/v-md-editor\";\n\ndefineOptions({ name: \"C_Markdown\" });\n\nexport type InsertImageFunction = (config: {\n url: string;\n desc?: string;\n width?: string | number;\n height?: string | number;\n}) => void;\n\ninterface Props {\n modelValue?: string;\n height?: string | number;\n disabled?: boolean;\n placeholder?: string;\n mode?: \"edit\" | \"editable\" | \"preview\";\n toolbar?: object;\n uploadImageConfig?: {\n accept?: string;\n multiple?: boolean;\n [key: string]: any;\n };\n tocNavPosition?: \"left\" | \"right\";\n defaultFullscreen?: boolean;\n autofocus?: boolean;\n includeLevel?: number[];\n leftToolbar?: string;\n rightToolbar?: string;\n maxLength?: number;\n showWordCount?: boolean;\n autoSave?: boolean;\n autoSaveInterval?: number;\n /** 是否为暗色主题(外部传入) */\n isDark?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n modelValue: \"\",\n height: \"400px\",\n disabled: false,\n placeholder: \"请输入 Markdown 内容...\",\n mode: \"editable\",\n tocNavPosition: \"right\",\n defaultFullscreen: false,\n autofocus: false,\n includeLevel: () => [1, 2, 3, 4, 5, 6],\n leftToolbar:\n \"undo redo clear | h bold italic strikethrough quote | ul ol table hr | link image code | save\",\n rightToolbar: \"preview toc sync-scroll fullscreen\",\n maxLength: 50000,\n showWordCount: true,\n autoSave: false,\n autoSaveInterval: 30000,\n isDark: false,\n});\n\ninterface Emits {\n \"update:modelValue\": [value: string];\n change: [text: string, html: string];\n save: [text: string, html: string];\n \"upload-image\": [\n event: Event,\n insertImage: InsertImageFunction,\n files: FileList,\n ];\n \"fullscreen-change\": [isFullscreen: boolean];\n \"copy-code-success\": [text: string];\n \"word-count-change\": [count: number];\n \"auto-save\": [text: string];\n \"max-length-exceeded\": [currentLength: number, maxLength: number];\n}\n\nconst emit = defineEmits<Emits>();\n\nconst editorRef = ref<any>(null);\nconst cachedHtml = ref(\"\");\n\nconst wordCount = computed(() => {\n return props.modelValue?.length || 0;\n});\n\nconst computedUploadImageConfig = computed(() => {\n const defaultConfig = {\n accept: \"image/*\",\n multiple: false,\n };\n return props.uploadImageConfig\n ? { ...defaultConfig, ...props.uploadImageConfig }\n : defaultConfig;\n});\n\nonMounted(() => {\n if (props.showWordCount && props.modelValue) {\n emit(\"word-count-change\", props.modelValue.length);\n }\n});\n\nwatch(\n () => props.modelValue,\n (newValue) => {\n if (props.showWordCount) {\n emit(\"word-count-change\", newValue?.length || 0);\n }\n },\n { immediate: true },\n);\n\nconst handleInput = (value: string) => {\n if (value.length > props.maxLength) {\n emit(\"max-length-exceeded\", value.length, props.maxLength);\n return;\n }\n emit(\"update:modelValue\", value);\n if (props.showWordCount) {\n emit(\"word-count-change\", value.length);\n }\n};\n\nconst handleChange = (text: string, html: string) => {\n cachedHtml.value = html;\n emit(\"change\", text, html);\n if (props.autoSave) {\n autoSave(text);\n }\n};\n\nconst handleSave = (text: string, html: string) => {\n emit(\"save\", text, html);\n};\n\nconst handleUploadImage = (\n event: Event,\n insertImage: InsertImageFunction,\n files: FileList,\n) => {\n emit(\"upload-image\", event, insertImage, files);\n};\n\nconst handleFullscreenChange = (isFullscreen: boolean) => {\n emit(\"fullscreen-change\", isFullscreen);\n};\n\nconst handleCopyCodeSuccess = (text: string) => {\n emit(\"copy-code-success\", text);\n};\n\nlet autoSaveTimer: ReturnType<typeof setTimeout> | null = null;\n\nconst autoSave = (text: string) => {\n if (autoSaveTimer) clearTimeout(autoSaveTimer);\n autoSaveTimer = setTimeout(() => {\n emit(\"auto-save\", text);\n }, props.autoSaveInterval);\n};\n\nconst focus = () => {\n editorRef.value?.focus();\n};\n\nconst getHtml = (): string => {\n return cachedHtml.value;\n};\n\nconst insertText = (text: string) => {\n editorRef.value?.insert((selected: string) => ({\n text: `${selected}${text}`,\n selected: text,\n }));\n};\n\ndefineExpose({\n focus,\n getHtml,\n insertText,\n wordCount,\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@use \"./index.scss\";\n</style>\n"],"mappings":"uoCEyEA,IAAM,EAAQ,EAoCR,EAAO,EAEP,EAAY,EAAS,KAAK,CAC1B,EAAa,EAAI,GAAG,CAEpB,EAAY,MACT,EAAM,YAAY,QAAU,EACnC,CAEI,EAA4B,MAAe,CAC/C,IAAM,EAAgB,CACpB,OAAQ,UACR,SAAU,GACX,CACD,OAAO,EAAM,kBACT,CAAE,GAAG,EAAe,GAAG,EAAM,kBAAkB,CAC/C,GACJ,CAEF,MAAgB,CACV,EAAM,eAAiB,EAAM,YAC/B,EAAK,oBAAqB,EAAM,WAAW,OAAO,EAEpD,CAEF,MACQ,EAAM,WACX,GAAa,CACR,EAAM,eACR,EAAK,oBAAqB,GAAU,QAAU,EAAE,EAGpD,CAAE,UAAW,GAAM,CACpB,CAED,IAAM,EAAe,GAAkB,CACrC,GAAI,EAAM,OAAS,EAAM,UAAW,CAClC,EAAK,sBAAuB,EAAM,OAAQ,EAAM,UAAU,CAC1D,OAEF,EAAK,oBAAqB,EAAM,CAC5B,EAAM,eACR,EAAK,oBAAqB,EAAM,OAAO,EAIrC,GAAgB,EAAc,IAAiB,CACnD,EAAW,MAAQ,EACnB,EAAK,SAAU,EAAM,EAAK,CACtB,EAAM,UACR,EAAS,EAAK,EAIZ,GAAc,EAAc,IAAiB,CACjD,EAAK,OAAQ,EAAM,EAAK,EAGpB,GACJ,EACA,EACA,IACG,CACH,EAAK,eAAgB,EAAO,EAAa,EAAM,EAG3C,EAA0B,GAA0B,CACxD,EAAK,oBAAqB,EAAa,EAGnC,EAAyB,GAAiB,CAC9C,EAAK,oBAAqB,EAAK,EAG7B,EAAsD,KAEpD,EAAY,GAAiB,CAC7B,GAAe,aAAa,EAAc,CAC9C,EAAgB,eAAiB,CAC/B,EAAK,YAAa,EAAK,EACtB,EAAM,iBAAiB,SAkB5B,EAAa,CACX,UAhBkB,CAClB,EAAU,OAAO,OAAO,EAgBxB,YAZO,EAAW,MAalB,WAVkB,GAAiB,CACnC,EAAU,OAAO,OAAQ,IAAsB,CAC7C,KAAM,GAAG,IAAW,IACpB,SAAU,EACX,EAAE,EAOH,YACD,CAAC,aA5MA,EAuBM,MAAA,CAvBD,MAAK,EAAA,CAAC,qBAAoB,CAAA,UAAsBA,EAAAA,OAAM,CAAA,CAAA,CAAA,CAAA,CACzD,EAqBE,EAAA,EAAA,CAAA,SApBI,YAAJ,IAAI,EACH,cAAaC,EAAAA,WACb,OAAQC,EAAAA,OACR,YAAaC,EAAAA,YACb,QAASC,EAAAA,QACT,KAAMC,EAAAA,KACN,sBAAqB,EAAA,MACrB,mBAAkBC,EAAAA,eAClB,qBAAoBC,EAAAA,kBACpB,UAAWC,EAAAA,UACX,gBAAeC,EAAAA,aACf,eAAcC,EAAAA,YACd,gBAAeC,EAAAA,aACf,mBAAkB,GAClB,sBAAoB,EACpB,SAAQ,EACR,OAAM,EACN,cAAc,EACd,mBAAmB,EACnB,kBAAmB"}
1
+ {"version":3,"file":"C_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\r\n class=\"c-markdown-wrapper\"\r\n :class=\"{ 'is-dark': isDark }\"\r\n >\r\n <VMdEditor\r\n ref=\"editorRef\"\r\n :model-value=\"modelValue\"\r\n :height=\"height\"\r\n :placeholder=\"placeholder\"\r\n :toolbar=\"toolbar\"\r\n :mode=\"mode\"\r\n :upload-image-config=\"computedUploadImageConfig\"\r\n :toc-nav-position=\"tocNavPosition\"\r\n :default-fullscreen=\"defaultFullscreen\"\r\n :autofocus=\"autofocus\"\r\n :include-level=\"includeLevel\"\r\n :left-toolbar=\"leftToolbar\"\r\n :right-toolbar=\"rightToolbar\"\r\n :default-show-toc=\"true\"\r\n @update:model-value=\"handleInput\"\r\n @change=\"handleChange\"\r\n @save=\"handleSave\"\r\n @upload-image=\"handleUploadImage\"\r\n @fullscreen-change=\"handleFullscreenChange\"\r\n @copy-code-success=\"handleCopyCodeSuccess\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { ref, computed, watch, onMounted } from 'vue'\r\n import VMdEditor from '@kangc/v-md-editor'\r\n\r\n defineOptions({ name: 'C_Markdown' })\r\n\r\n export type InsertImageFunction = (config: {\r\n url: string\r\n desc?: string\r\n width?: string | number\r\n height?: string | number\r\n }) => void\r\n\r\n interface Props {\r\n modelValue?: string\r\n height?: string | number\r\n disabled?: boolean\r\n placeholder?: string\r\n mode?: 'edit' | 'editable' | 'preview'\r\n toolbar?: object\r\n uploadImageConfig?: {\r\n accept?: string\r\n multiple?: boolean\r\n [key: string]: any\r\n }\r\n tocNavPosition?: 'left' | 'right'\r\n defaultFullscreen?: boolean\r\n autofocus?: boolean\r\n includeLevel?: number[]\r\n leftToolbar?: string\r\n rightToolbar?: string\r\n maxLength?: number\r\n showWordCount?: boolean\r\n autoSave?: boolean\r\n autoSaveInterval?: number\r\n /** 是否为暗色主题(外部传入) */\r\n isDark?: boolean\r\n }\r\n\r\n const props = withDefaults(defineProps<Props>(), {\r\n modelValue: '',\r\n height: '400px',\r\n disabled: false,\r\n placeholder: '请输入 Markdown 内容...',\r\n mode: 'editable',\r\n tocNavPosition: 'right',\r\n defaultFullscreen: false,\r\n autofocus: false,\r\n includeLevel: () => [1, 2, 3, 4, 5, 6],\r\n leftToolbar:\r\n 'undo redo clear | h bold italic strikethrough quote | ul ol table hr | link image code | save',\r\n rightToolbar: 'preview toc sync-scroll fullscreen',\r\n maxLength: 50000,\r\n showWordCount: true,\r\n autoSave: false,\r\n autoSaveInterval: 30000,\r\n isDark: false,\r\n })\r\n\r\n interface Emits {\r\n 'update:modelValue': [value: string]\r\n change: [text: string, html: string]\r\n save: [text: string, html: string]\r\n 'upload-image': [\r\n event: Event,\r\n insertImage: InsertImageFunction,\r\n files: FileList,\r\n ]\r\n 'fullscreen-change': [isFullscreen: boolean]\r\n 'copy-code-success': [text: string]\r\n 'word-count-change': [count: number]\r\n 'auto-save': [text: string]\r\n 'max-length-exceeded': [currentLength: number, maxLength: number]\r\n }\r\n\r\n const emit = defineEmits<Emits>()\r\n\r\n const editorRef = ref<any>(null)\r\n const cachedHtml = ref('')\r\n\r\n const wordCount = computed(() => {\r\n return props.modelValue?.length || 0\r\n })\r\n\r\n const computedUploadImageConfig = computed(() => {\r\n const defaultConfig = {\r\n accept: 'image/*',\r\n multiple: false,\r\n }\r\n return props.uploadImageConfig\r\n ? { ...defaultConfig, ...props.uploadImageConfig }\r\n : defaultConfig\r\n })\r\n\r\n onMounted(() => {\r\n if (props.showWordCount && props.modelValue) {\r\n emit('word-count-change', props.modelValue.length)\r\n }\r\n })\r\n\r\n watch(\r\n () => props.modelValue,\r\n newValue => {\r\n if (props.showWordCount) {\r\n emit('word-count-change', newValue?.length || 0)\r\n }\r\n },\r\n { immediate: true }\r\n )\r\n\r\n const handleInput = (value: string) => {\r\n if (value.length > props.maxLength) {\r\n emit('max-length-exceeded', value.length, props.maxLength)\r\n return\r\n }\r\n emit('update:modelValue', value)\r\n if (props.showWordCount) {\r\n emit('word-count-change', value.length)\r\n }\r\n }\r\n\r\n const handleChange = (text: string, html: string) => {\r\n cachedHtml.value = html\r\n emit('change', text, html)\r\n if (props.autoSave) {\r\n autoSave(text)\r\n }\r\n }\r\n\r\n const handleSave = (text: string, html: string) => {\r\n emit('save', text, html)\r\n }\r\n\r\n const handleUploadImage = (\r\n event: Event,\r\n insertImage: InsertImageFunction,\r\n files: FileList\r\n ) => {\r\n emit('upload-image', event, insertImage, files)\r\n }\r\n\r\n const handleFullscreenChange = (isFullscreen: boolean) => {\r\n emit('fullscreen-change', isFullscreen)\r\n }\r\n\r\n const handleCopyCodeSuccess = (text: string) => {\r\n emit('copy-code-success', text)\r\n }\r\n\r\n let autoSaveTimer: ReturnType<typeof setTimeout> | null = null\r\n\r\n const autoSave = (text: string) => {\r\n if (autoSaveTimer) clearTimeout(autoSaveTimer)\r\n autoSaveTimer = setTimeout(() => {\r\n emit('auto-save', text)\r\n }, props.autoSaveInterval)\r\n }\r\n\r\n const focus = () => {\r\n editorRef.value?.focus()\r\n }\r\n\r\n const getHtml = (): string => {\r\n return cachedHtml.value\r\n }\r\n\r\n const insertText = (text: string) => {\r\n editorRef.value?.insert((selected: string) => ({\r\n text: `${selected}${text}`,\r\n selected: text,\r\n }))\r\n }\r\n\r\n defineExpose({\r\n focus,\r\n getHtml,\r\n insertText,\r\n wordCount,\r\n })\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n @use './index.scss';\r\n</style>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-20\r\n * @Description: Markdown 编辑器封装组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div\r\n class=\"c-markdown-wrapper\"\r\n :class=\"{ 'is-dark': isDark }\"\r\n >\r\n <VMdEditor\r\n ref=\"editorRef\"\r\n :model-value=\"modelValue\"\r\n :height=\"height\"\r\n :placeholder=\"placeholder\"\r\n :toolbar=\"toolbar\"\r\n :mode=\"mode\"\r\n :upload-image-config=\"computedUploadImageConfig\"\r\n :toc-nav-position=\"tocNavPosition\"\r\n :default-fullscreen=\"defaultFullscreen\"\r\n :autofocus=\"autofocus\"\r\n :include-level=\"includeLevel\"\r\n :left-toolbar=\"leftToolbar\"\r\n :right-toolbar=\"rightToolbar\"\r\n :default-show-toc=\"true\"\r\n @update:model-value=\"handleInput\"\r\n @change=\"handleChange\"\r\n @save=\"handleSave\"\r\n @upload-image=\"handleUploadImage\"\r\n @fullscreen-change=\"handleFullscreenChange\"\r\n @copy-code-success=\"handleCopyCodeSuccess\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { ref, computed, watch, onMounted } from 'vue'\r\n import VMdEditor from '@kangc/v-md-editor'\r\n\r\n defineOptions({ name: 'C_Markdown' })\r\n\r\n export type InsertImageFunction = (config: {\r\n url: string\r\n desc?: string\r\n width?: string | number\r\n height?: string | number\r\n }) => void\r\n\r\n interface Props {\r\n modelValue?: string\r\n height?: string | number\r\n disabled?: boolean\r\n placeholder?: string\r\n mode?: 'edit' | 'editable' | 'preview'\r\n toolbar?: object\r\n uploadImageConfig?: {\r\n accept?: string\r\n multiple?: boolean\r\n [key: string]: any\r\n }\r\n tocNavPosition?: 'left' | 'right'\r\n defaultFullscreen?: boolean\r\n autofocus?: boolean\r\n includeLevel?: number[]\r\n leftToolbar?: string\r\n rightToolbar?: string\r\n maxLength?: number\r\n showWordCount?: boolean\r\n autoSave?: boolean\r\n autoSaveInterval?: number\r\n /** 是否为暗色主题(外部传入) */\r\n isDark?: boolean\r\n }\r\n\r\n const props = withDefaults(defineProps<Props>(), {\r\n modelValue: '',\r\n height: '400px',\r\n disabled: false,\r\n placeholder: '请输入 Markdown 内容...',\r\n mode: 'editable',\r\n tocNavPosition: 'right',\r\n defaultFullscreen: false,\r\n autofocus: false,\r\n includeLevel: () => [1, 2, 3, 4, 5, 6],\r\n leftToolbar:\r\n 'undo redo clear | h bold italic strikethrough quote | ul ol table hr | link image code | save',\r\n rightToolbar: 'preview toc sync-scroll fullscreen',\r\n maxLength: 50000,\r\n showWordCount: true,\r\n autoSave: false,\r\n autoSaveInterval: 30000,\r\n isDark: false,\r\n })\r\n\r\n interface Emits {\r\n 'update:modelValue': [value: string]\r\n change: [text: string, html: string]\r\n save: [text: string, html: string]\r\n 'upload-image': [\r\n event: Event,\r\n insertImage: InsertImageFunction,\r\n files: FileList,\r\n ]\r\n 'fullscreen-change': [isFullscreen: boolean]\r\n 'copy-code-success': [text: string]\r\n 'word-count-change': [count: number]\r\n 'auto-save': [text: string]\r\n 'max-length-exceeded': [currentLength: number, maxLength: number]\r\n }\r\n\r\n const emit = defineEmits<Emits>()\r\n\r\n const editorRef = ref<any>(null)\r\n const cachedHtml = ref('')\r\n\r\n const wordCount = computed(() => {\r\n return props.modelValue?.length || 0\r\n })\r\n\r\n const computedUploadImageConfig = computed(() => {\r\n const defaultConfig = {\r\n accept: 'image/*',\r\n multiple: false,\r\n }\r\n return props.uploadImageConfig\r\n ? { ...defaultConfig, ...props.uploadImageConfig }\r\n : defaultConfig\r\n })\r\n\r\n onMounted(() => {\r\n if (props.showWordCount && props.modelValue) {\r\n emit('word-count-change', props.modelValue.length)\r\n }\r\n })\r\n\r\n watch(\r\n () => props.modelValue,\r\n newValue => {\r\n if (props.showWordCount) {\r\n emit('word-count-change', newValue?.length || 0)\r\n }\r\n },\r\n { immediate: true }\r\n )\r\n\r\n const handleInput = (value: string) => {\r\n if (value.length > props.maxLength) {\r\n emit('max-length-exceeded', value.length, props.maxLength)\r\n return\r\n }\r\n emit('update:modelValue', value)\r\n if (props.showWordCount) {\r\n emit('word-count-change', value.length)\r\n }\r\n }\r\n\r\n const handleChange = (text: string, html: string) => {\r\n cachedHtml.value = html\r\n emit('change', text, html)\r\n if (props.autoSave) {\r\n autoSave(text)\r\n }\r\n }\r\n\r\n const handleSave = (text: string, html: string) => {\r\n emit('save', text, html)\r\n }\r\n\r\n const handleUploadImage = (\r\n event: Event,\r\n insertImage: InsertImageFunction,\r\n files: FileList\r\n ) => {\r\n emit('upload-image', event, insertImage, files)\r\n }\r\n\r\n const handleFullscreenChange = (isFullscreen: boolean) => {\r\n emit('fullscreen-change', isFullscreen)\r\n }\r\n\r\n const handleCopyCodeSuccess = (text: string) => {\r\n emit('copy-code-success', text)\r\n }\r\n\r\n let autoSaveTimer: ReturnType<typeof setTimeout> | null = null\r\n\r\n const autoSave = (text: string) => {\r\n if (autoSaveTimer) clearTimeout(autoSaveTimer)\r\n autoSaveTimer = setTimeout(() => {\r\n emit('auto-save', text)\r\n }, props.autoSaveInterval)\r\n }\r\n\r\n const focus = () => {\r\n editorRef.value?.focus()\r\n }\r\n\r\n const getHtml = (): string => {\r\n return cachedHtml.value\r\n }\r\n\r\n const insertText = (text: string) => {\r\n editorRef.value?.insert((selected: string) => ({\r\n text: `${selected}${text}`,\r\n selected: text,\r\n }))\r\n }\r\n\r\n defineExpose({\r\n focus,\r\n getHtml,\r\n insertText,\r\n wordCount,\r\n })\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n @use './index.scss';\r\n</style>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-20\r\n * @Description: Markdown 编辑器封装组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div\r\n class=\"c-markdown-wrapper\"\r\n :class=\"{ 'is-dark': isDark }\"\r\n >\r\n <VMdEditor\r\n ref=\"editorRef\"\r\n :model-value=\"modelValue\"\r\n :height=\"height\"\r\n :placeholder=\"placeholder\"\r\n :toolbar=\"toolbar\"\r\n :mode=\"mode\"\r\n :upload-image-config=\"computedUploadImageConfig\"\r\n :toc-nav-position=\"tocNavPosition\"\r\n :default-fullscreen=\"defaultFullscreen\"\r\n :autofocus=\"autofocus\"\r\n :include-level=\"includeLevel\"\r\n :left-toolbar=\"leftToolbar\"\r\n :right-toolbar=\"rightToolbar\"\r\n :default-show-toc=\"true\"\r\n @update:model-value=\"handleInput\"\r\n @change=\"handleChange\"\r\n @save=\"handleSave\"\r\n @upload-image=\"handleUploadImage\"\r\n @fullscreen-change=\"handleFullscreenChange\"\r\n @copy-code-success=\"handleCopyCodeSuccess\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { ref, computed, watch, onMounted } from 'vue'\r\n import VMdEditor from '@kangc/v-md-editor'\r\n\r\n defineOptions({ name: 'C_Markdown' })\r\n\r\n export type InsertImageFunction = (config: {\r\n url: string\r\n desc?: string\r\n width?: string | number\r\n height?: string | number\r\n }) => void\r\n\r\n interface Props {\r\n modelValue?: string\r\n height?: string | number\r\n disabled?: boolean\r\n placeholder?: string\r\n mode?: 'edit' | 'editable' | 'preview'\r\n toolbar?: object\r\n uploadImageConfig?: {\r\n accept?: string\r\n multiple?: boolean\r\n [key: string]: any\r\n }\r\n tocNavPosition?: 'left' | 'right'\r\n defaultFullscreen?: boolean\r\n autofocus?: boolean\r\n includeLevel?: number[]\r\n leftToolbar?: string\r\n rightToolbar?: string\r\n maxLength?: number\r\n showWordCount?: boolean\r\n autoSave?: boolean\r\n autoSaveInterval?: number\r\n /** 是否为暗色主题(外部传入) */\r\n isDark?: boolean\r\n }\r\n\r\n const props = withDefaults(defineProps<Props>(), {\r\n modelValue: '',\r\n height: '400px',\r\n disabled: false,\r\n placeholder: '请输入 Markdown 内容...',\r\n mode: 'editable',\r\n tocNavPosition: 'right',\r\n defaultFullscreen: false,\r\n autofocus: false,\r\n includeLevel: () => [1, 2, 3, 4, 5, 6],\r\n leftToolbar:\r\n 'undo redo clear | h bold italic strikethrough quote | ul ol table hr | link image code | save',\r\n rightToolbar: 'preview toc sync-scroll fullscreen',\r\n maxLength: 50000,\r\n showWordCount: true,\r\n autoSave: false,\r\n autoSaveInterval: 30000,\r\n isDark: false,\r\n })\r\n\r\n interface Emits {\r\n 'update:modelValue': [value: string]\r\n change: [text: string, html: string]\r\n save: [text: string, html: string]\r\n 'upload-image': [\r\n event: Event,\r\n insertImage: InsertImageFunction,\r\n files: FileList,\r\n ]\r\n 'fullscreen-change': [isFullscreen: boolean]\r\n 'copy-code-success': [text: string]\r\n 'word-count-change': [count: number]\r\n 'auto-save': [text: string]\r\n 'max-length-exceeded': [currentLength: number, maxLength: number]\r\n }\r\n\r\n const emit = defineEmits<Emits>()\r\n\r\n const editorRef = ref<any>(null)\r\n const cachedHtml = ref('')\r\n\r\n const wordCount = computed(() => {\r\n return props.modelValue?.length || 0\r\n })\r\n\r\n const computedUploadImageConfig = computed(() => {\r\n const defaultConfig = {\r\n accept: 'image/*',\r\n multiple: false,\r\n }\r\n return props.uploadImageConfig\r\n ? { ...defaultConfig, ...props.uploadImageConfig }\r\n : defaultConfig\r\n })\r\n\r\n onMounted(() => {\r\n if (props.showWordCount && props.modelValue) {\r\n emit('word-count-change', props.modelValue.length)\r\n }\r\n })\r\n\r\n watch(\r\n () => props.modelValue,\r\n newValue => {\r\n if (props.showWordCount) {\r\n emit('word-count-change', newValue?.length || 0)\r\n }\r\n },\r\n { immediate: true }\r\n )\r\n\r\n const handleInput = (value: string) => {\r\n if (value.length > props.maxLength) {\r\n emit('max-length-exceeded', value.length, props.maxLength)\r\n return\r\n }\r\n emit('update:modelValue', value)\r\n if (props.showWordCount) {\r\n emit('word-count-change', value.length)\r\n }\r\n }\r\n\r\n const handleChange = (text: string, html: string) => {\r\n cachedHtml.value = html\r\n emit('change', text, html)\r\n if (props.autoSave) {\r\n autoSave(text)\r\n }\r\n }\r\n\r\n const handleSave = (text: string, html: string) => {\r\n emit('save', text, html)\r\n }\r\n\r\n const handleUploadImage = (\r\n event: Event,\r\n insertImage: InsertImageFunction,\r\n files: FileList\r\n ) => {\r\n emit('upload-image', event, insertImage, files)\r\n }\r\n\r\n const handleFullscreenChange = (isFullscreen: boolean) => {\r\n emit('fullscreen-change', isFullscreen)\r\n }\r\n\r\n const handleCopyCodeSuccess = (text: string) => {\r\n emit('copy-code-success', text)\r\n }\r\n\r\n let autoSaveTimer: ReturnType<typeof setTimeout> | null = null\r\n\r\n const autoSave = (text: string) => {\r\n if (autoSaveTimer) clearTimeout(autoSaveTimer)\r\n autoSaveTimer = setTimeout(() => {\r\n emit('auto-save', text)\r\n }, props.autoSaveInterval)\r\n }\r\n\r\n const focus = () => {\r\n editorRef.value?.focus()\r\n }\r\n\r\n const getHtml = (): string => {\r\n return cachedHtml.value\r\n }\r\n\r\n const insertText = (text: string) => {\r\n editorRef.value?.insert((selected: string) => ({\r\n text: `${selected}${text}`,\r\n selected: text,\r\n }))\r\n }\r\n\r\n defineExpose({\r\n focus,\r\n getHtml,\r\n insertText,\r\n wordCount,\r\n })\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n @use './index.scss';\r\n</style>\r\n"],"mappings":"uoCE4EE,IAAM,EAAQ,EAoCR,EAAO,EAEP,EAAY,EAAS,KAAK,CAC1B,EAAa,EAAI,GAAG,CAEpB,EAAY,MACT,EAAM,YAAY,QAAU,EACnC,CAEI,EAA4B,MAAe,CAC/C,IAAM,EAAgB,CACpB,OAAQ,UACR,SAAU,GACX,CACD,OAAO,EAAM,kBACT,CAAE,GAAG,EAAe,GAAG,EAAM,kBAAmB,CAChD,GACJ,CAEF,MAAgB,CACV,EAAM,eAAiB,EAAM,YAC/B,EAAK,oBAAqB,EAAM,WAAW,OAAO,EAEpD,CAEF,MACQ,EAAM,WACZ,GAAY,CACN,EAAM,eACR,EAAK,oBAAqB,GAAU,QAAU,EAAE,EAGpD,CAAE,UAAW,GAAM,CACpB,CAED,IAAM,EAAe,GAAkB,CACrC,GAAI,EAAM,OAAS,EAAM,UAAW,CAClC,EAAK,sBAAuB,EAAM,OAAQ,EAAM,UAAU,CAC1D,OAEF,EAAK,oBAAqB,EAAM,CAC5B,EAAM,eACR,EAAK,oBAAqB,EAAM,OAAO,EAIrC,GAAgB,EAAc,IAAiB,CACnD,EAAW,MAAQ,EACnB,EAAK,SAAU,EAAM,EAAK,CACtB,EAAM,UACR,EAAS,EAAK,EAIZ,GAAc,EAAc,IAAiB,CACjD,EAAK,OAAQ,EAAM,EAAK,EAGpB,GACJ,EACA,EACA,IACG,CACH,EAAK,eAAgB,EAAO,EAAa,EAAM,EAG3C,EAA0B,GAA0B,CACxD,EAAK,oBAAqB,EAAa,EAGnC,EAAyB,GAAiB,CAC9C,EAAK,oBAAqB,EAAK,EAG7B,EAAsD,KAEpD,EAAY,GAAiB,CAC7B,GAAe,aAAa,EAAc,CAC9C,EAAgB,eAAiB,CAC/B,EAAK,YAAa,EAAK,EACtB,EAAM,iBAAiB,SAkB5B,EAAa,CACX,UAhBkB,CAClB,EAAU,OAAO,OAAO,EAgBxB,YAZO,EAAW,MAalB,WAVkB,GAAiB,CACnC,EAAU,OAAO,OAAQ,IAAsB,CAC7C,KAAM,GAAG,IAAW,IACpB,SAAU,EACX,EAAE,EAOH,YACD,CAAC,aA/MF,EA0BM,MAAA,CAzBJ,MAAK,EAAA,CAAC,qBAAoB,CAAA,UACLA,EAAAA,OAAM,CAAA,CAAA,CAAA,CAAA,CAE3B,EAqBE,EAAA,EAAA,CAAA,SApBI,YAAJ,IAAI,EACH,cAAaC,EAAAA,WACb,OAAQC,EAAAA,OACR,YAAaC,EAAAA,YACb,QAASC,EAAAA,QACT,KAAMC,EAAAA,KACN,sBAAqB,EAAA,MACrB,mBAAkBC,EAAAA,eAClB,qBAAoBC,EAAAA,kBACpB,UAAWC,EAAAA,UACX,gBAAeC,EAAAA,aACf,eAAcC,EAAAA,YACd,gBAAeC,EAAAA,aACf,mBAAkB,GAClB,sBAAoB,EACpB,SAAQ,EACR,OAAM,EACN,cAAc,EACd,mBAAmB,EACnB,kBAAmB"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"C_NotificationCenter-DT6fQ79O.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"}
@@ -0,0 +1,466 @@
1
+ /* unplugin-vue-components disabled */.notification-badge[data-v-03c9c8c7] {
2
+ position: relative;
3
+ display: inline-flex;
4
+ align-items: center;
5
+ }
6
+ .notification-badge__trigger[data-v-03c9c8c7] {
7
+ position: relative;
8
+ display: inline-flex;
9
+ align-items: center;
10
+ justify-content: center;
11
+ cursor: pointer;
12
+ padding: 4px;
13
+ border-radius: 6px;
14
+ transition: all var(--c-transition, 0.2s ease);
15
+ }
16
+ .notification-badge__trigger[data-v-03c9c8c7]:hover {
17
+ background-color: var(--c-border);
18
+ }
19
+ .notification-badge__trigger:hover .notification-badge__icon[data-v-03c9c8c7] {
20
+ color: var(--c-primary);
21
+ }
22
+ .notification-badge__icon[data-v-03c9c8c7] {
23
+ color: var(--c-text-2);
24
+ transition: color var(--c-transition, 0.2s ease);
25
+ }
26
+ .notification-badge__count[data-v-03c9c8c7] {
27
+ position: absolute;
28
+ top: -2px;
29
+ right: -4px;
30
+ min-width: 16px;
31
+ height: 16px;
32
+ padding: 0 4px;
33
+ border-radius: 8px;
34
+ background: #f5222d;
35
+ color: #fff;
36
+ font-size: 10px;
37
+ font-weight: 600;
38
+ line-height: 16px;
39
+ text-align: center;
40
+ white-space: nowrap;
41
+ pointer-events: none;
42
+ box-shadow: 0 0 0 2px var(--c-bg);
43
+ }
44
+ .notification-badge__pulse[data-v-03c9c8c7] {
45
+ position: absolute;
46
+ top: -2px;
47
+ right: -4px;
48
+ width: 16px;
49
+ height: 16px;
50
+ border-radius: 50%;
51
+ background: rgba(245, 34, 45, 0.4);
52
+ animation: pulse-ring-03c9c8c7 1.5s cubic-bezier(0.215, 0.61, 0.355, 1) infinite;
53
+ pointer-events: none;
54
+ }
55
+ @keyframes pulse-ring-03c9c8c7 {
56
+ 0% {
57
+ transform: scale(0.8);
58
+ opacity: 1;
59
+ }
60
+ 100% {
61
+ transform: scale(2.2);
62
+ opacity: 0;
63
+ }
64
+ }
65
+ .badge-bounce-enter-active[data-v-03c9c8c7] {
66
+ animation: badge-in-03c9c8c7 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
67
+ }
68
+ .badge-bounce-leave-active[data-v-03c9c8c7] {
69
+ animation: badge-in-03c9c8c7 0.2s ease reverse;
70
+ }
71
+ @keyframes badge-in-03c9c8c7 {
72
+ 0% {
73
+ transform: scale(0);
74
+ opacity: 0;
75
+ }
76
+ 100% {
77
+ transform: scale(1);
78
+ opacity: 1;
79
+ }
80
+ }
81
+ /* unplugin-vue-components disabled */.notification-item[data-v-30bf7ddc] {
82
+ display: flex;
83
+ align-items: flex-start;
84
+ gap: 10px;
85
+ padding: 12px 16px;
86
+ cursor: pointer;
87
+ transition: background-color var(--c-transition, 0.2s ease);
88
+ border-bottom: 1px solid var(--c-border);
89
+ /* ─── 子元素 ──────────────────────────── */
90
+ }
91
+ .notification-item[data-v-30bf7ddc]:last-child {
92
+ border-bottom: none;
93
+ }
94
+ .notification-item[data-v-30bf7ddc]:hover {
95
+ background-color: var(--c-bg-card);
96
+ }
97
+ .notification-item:hover .notification-item__actions[data-v-30bf7ddc] {
98
+ opacity: 1;
99
+ }
100
+ .notification-item--unread[data-v-30bf7ddc] {
101
+ background-color: color-mix(in srgb, var(--c-primary) 4%, transparent);
102
+ }
103
+ .notification-item--unread[data-v-30bf7ddc]:hover {
104
+ background-color: color-mix(in srgb, var(--c-primary) 8%, transparent);
105
+ }
106
+ .notification-item--urgent[data-v-30bf7ddc] {
107
+ border-left: 3px solid #f5222d;
108
+ padding-left: 13px;
109
+ }
110
+ .notification-item__indicator[data-v-30bf7ddc] {
111
+ flex-shrink: 0;
112
+ width: 8px;
113
+ display: flex;
114
+ align-items: center;
115
+ padding-top: 14px;
116
+ }
117
+ .notification-item__dot[data-v-30bf7ddc] {
118
+ width: 6px;
119
+ height: 6px;
120
+ border-radius: 50%;
121
+ background: var(--c-primary);
122
+ }
123
+ .notification-item__dot--urgent[data-v-30bf7ddc] {
124
+ background: #f5222d;
125
+ box-shadow: 0 0 4px rgba(245, 34, 45, 0.5);
126
+ }
127
+ .notification-item__dot--high[data-v-30bf7ddc] {
128
+ background: #fa8c16;
129
+ }
130
+ .notification-item__dot--normal[data-v-30bf7ddc] {
131
+ background: var(--c-primary);
132
+ }
133
+ .notification-item__dot--low[data-v-30bf7ddc] {
134
+ background: var(--c-text-4);
135
+ }
136
+ .notification-item__avatar[data-v-30bf7ddc] {
137
+ flex-shrink: 0;
138
+ }
139
+ .notification-item__avatar-placeholder[data-v-30bf7ddc] {
140
+ width: 36px;
141
+ height: 36px;
142
+ border-radius: 50%;
143
+ display: flex;
144
+ align-items: center;
145
+ justify-content: center;
146
+ font-size: 16px;
147
+ color: #fff;
148
+ }
149
+ .notification-item__avatar-placeholder--system[data-v-30bf7ddc] {
150
+ background: linear-gradient(135deg, #667eea, #764ba2);
151
+ }
152
+ .notification-item__avatar-placeholder--business[data-v-30bf7ddc] {
153
+ background: linear-gradient(135deg, #43e97b, #38f9d7);
154
+ color: #0d1425;
155
+ }
156
+ .notification-item__avatar-placeholder--alarm[data-v-30bf7ddc] {
157
+ background: linear-gradient(135deg, #f093fb, #f5576c);
158
+ }
159
+ .notification-item__body[data-v-30bf7ddc] {
160
+ flex: 1;
161
+ min-width: 0;
162
+ }
163
+ .notification-item__header[data-v-30bf7ddc] {
164
+ display: flex;
165
+ align-items: center;
166
+ gap: 6px;
167
+ margin-bottom: 4px;
168
+ }
169
+ .notification-item__title[data-v-30bf7ddc] {
170
+ font-size: 13px;
171
+ font-weight: 500;
172
+ color: var(--c-text-1);
173
+ line-height: 1.4;
174
+ overflow: hidden;
175
+ text-overflow: ellipsis;
176
+ white-space: nowrap;
177
+ }
178
+ .notification-item__summary[data-v-30bf7ddc] {
179
+ font-size: 12px;
180
+ color: var(--c-text-2);
181
+ line-height: 1.5;
182
+ display: -webkit-box;
183
+ -webkit-line-clamp: 2;
184
+ line-clamp: 2;
185
+ -webkit-box-orient: vertical;
186
+ overflow: hidden;
187
+ }
188
+ .notification-item__meta[data-v-30bf7ddc] {
189
+ display: flex;
190
+ align-items: center;
191
+ gap: 8px;
192
+ margin-top: 6px;
193
+ }
194
+ .notification-item__time[data-v-30bf7ddc], .notification-item__sender[data-v-30bf7ddc] {
195
+ font-size: 11px;
196
+ color: var(--c-text-4);
197
+ }
198
+ .notification-item__sender[data-v-30bf7ddc]::before {
199
+ content: "·";
200
+ margin-right: 8px;
201
+ }
202
+ .notification-item__actions[data-v-30bf7ddc] {
203
+ flex-shrink: 0;
204
+ display: flex;
205
+ align-items: center;
206
+ gap: 4px;
207
+ opacity: 0;
208
+ transition: opacity var(--c-transition, 0.2s ease);
209
+ }
210
+ .notification-item__action[data-v-30bf7ddc] {
211
+ display: inline-flex;
212
+ align-items: center;
213
+ justify-content: center;
214
+ width: 24px;
215
+ height: 24px;
216
+ padding: 2px;
217
+ border-radius: 4px;
218
+ cursor: pointer;
219
+ color: var(--c-text-4);
220
+ transition: all var(--c-transition, 0.2s ease);
221
+ }
222
+ .notification-item__action[data-v-30bf7ddc]:hover {
223
+ color: var(--c-primary);
224
+ background-color: var(--c-border);
225
+ }
226
+ /* unplugin-vue-components disabled */.notification-list__tabs[data-v-3db0c5bf] {
227
+ display: flex;
228
+ border-bottom: 1px solid var(--c-border);
229
+ padding: 0 4px;
230
+ }
231
+ .notification-list__tab[data-v-3db0c5bf] {
232
+ position: relative;
233
+ display: flex;
234
+ align-items: center;
235
+ gap: 4px;
236
+ padding: 10px 12px;
237
+ font-size: 13px;
238
+ color: var(--c-text-2);
239
+ cursor: pointer;
240
+ transition: all var(--c-transition, 0.2s ease);
241
+ user-select: none;
242
+ }
243
+ .notification-list__tab[data-v-3db0c5bf]::after {
244
+ content: "";
245
+ position: absolute;
246
+ bottom: 0;
247
+ left: 12px;
248
+ right: 12px;
249
+ height: 2px;
250
+ background: transparent;
251
+ border-radius: 1px;
252
+ transition: background var(--c-transition, 0.2s ease);
253
+ }
254
+ .notification-list__tab[data-v-3db0c5bf]:hover {
255
+ color: var(--c-text-1);
256
+ }
257
+ .notification-list__tab--active[data-v-3db0c5bf] {
258
+ color: var(--c-primary);
259
+ font-weight: 500;
260
+ }
261
+ .notification-list__tab--active[data-v-3db0c5bf]::after {
262
+ background: var(--c-primary);
263
+ }
264
+ .notification-list__tab-count[data-v-3db0c5bf] {
265
+ min-width: 16px;
266
+ height: 16px;
267
+ padding: 0 4px;
268
+ border-radius: 8px;
269
+ background: #f5222d;
270
+ color: #fff;
271
+ font-size: 10px;
272
+ font-weight: 600;
273
+ line-height: 16px;
274
+ text-align: center;
275
+ }
276
+ .notification-list__toolbar[data-v-3db0c5bf] {
277
+ display: flex;
278
+ align-items: center;
279
+ justify-content: flex-end;
280
+ gap: 12px;
281
+ padding: 6px 16px;
282
+ border-bottom: 1px solid var(--c-border);
283
+ }
284
+ .notification-list__scroll[data-v-3db0c5bf] {
285
+ flex: 1;
286
+ }
287
+ .notification-list__skeleton[data-v-3db0c5bf] {
288
+ display: flex;
289
+ align-items: flex-start;
290
+ gap: 12px;
291
+ padding: 14px 16px;
292
+ }
293
+ .notification-list__skeleton-text[data-v-3db0c5bf] {
294
+ flex: 1;
295
+ display: flex;
296
+ flex-direction: column;
297
+ gap: 8px;
298
+ }
299
+ .notification-list__load-more[data-v-3db0c5bf] {
300
+ display: flex;
301
+ align-items: center;
302
+ justify-content: center;
303
+ gap: 6px;
304
+ padding: 12px;
305
+ font-size: 12px;
306
+ color: var(--c-text-2);
307
+ cursor: pointer;
308
+ transition: color var(--c-transition, 0.2s ease);
309
+ }
310
+ .notification-list__load-more[data-v-3db0c5bf]:hover {
311
+ color: var(--c-primary);
312
+ }
313
+ .notification-list__empty[data-v-3db0c5bf] {
314
+ display: flex;
315
+ flex-direction: column;
316
+ align-items: center;
317
+ justify-content: center;
318
+ padding: 60px 0;
319
+ gap: 12px;
320
+ }
321
+ .notification-list__empty-icon[data-v-3db0c5bf] {
322
+ color: var(--c-text-4);
323
+ opacity: 0.5;
324
+ }
325
+ .notification-list__empty-text[data-v-3db0c5bf] {
326
+ font-size: 13px;
327
+ color: var(--c-text-4);
328
+ }
329
+ /* unplugin-vue-components disabled */.notification-detail[data-v-b10b0b8e] {
330
+ display: flex;
331
+ flex-direction: column;
332
+ height: 100%;
333
+ }
334
+ .notification-detail__back[data-v-b10b0b8e] {
335
+ padding: 8px 16px;
336
+ border-bottom: 1px solid var(--c-border);
337
+ }
338
+ .notification-detail__header[data-v-b10b0b8e] {
339
+ padding: 16px;
340
+ border-bottom: 1px solid var(--c-border);
341
+ }
342
+ .notification-detail__title[data-v-b10b0b8e] {
343
+ font-size: 15px;
344
+ font-weight: 600;
345
+ color: var(--c-text-1);
346
+ line-height: 1.5;
347
+ margin: 0 0 8px;
348
+ }
349
+ .notification-detail__meta[data-v-b10b0b8e] {
350
+ display: flex;
351
+ align-items: center;
352
+ gap: 8px;
353
+ flex-wrap: wrap;
354
+ }
355
+ .notification-detail__time[data-v-b10b0b8e] {
356
+ font-size: 11px;
357
+ color: var(--c-text-4);
358
+ }
359
+ .notification-detail__sender[data-v-b10b0b8e] {
360
+ display: flex;
361
+ align-items: center;
362
+ gap: 6px;
363
+ margin-top: 8px;
364
+ font-size: 12px;
365
+ color: var(--c-text-2);
366
+ }
367
+ .notification-detail__content[data-v-b10b0b8e] {
368
+ flex: 1;
369
+ min-height: 0;
370
+ }
371
+ .notification-detail__body[data-v-b10b0b8e] {
372
+ padding: 16px;
373
+ font-size: 13px;
374
+ line-height: 1.7;
375
+ color: var(--c-text-1);
376
+ word-break: break-word;
377
+ }
378
+ .notification-detail__body[data-v-b10b0b8e] p {
379
+ margin: 0 0 8px;
380
+ }
381
+ .notification-detail__body[data-v-b10b0b8e] ul,
382
+ .notification-detail__body[data-v-b10b0b8e] ol {
383
+ padding-left: 20px;
384
+ margin: 8px 0;
385
+ }
386
+ .notification-detail__body[data-v-b10b0b8e] li {
387
+ margin: 4px 0;
388
+ }
389
+ .notification-detail__body[data-v-b10b0b8e] strong {
390
+ font-weight: 600;
391
+ color: var(--c-primary);
392
+ }
393
+ .notification-detail__footer[data-v-b10b0b8e] {
394
+ padding: 12px 16px;
395
+ border-top: 1px solid var(--c-border);
396
+ display: flex;
397
+ justify-content: flex-end;
398
+ }
399
+ /* unplugin-vue-components disabled */.c-notification-center[data-v-a60d6896] {
400
+ display: inline-flex;
401
+ align-items: center;
402
+ }
403
+ .c-notification-center__panel[data-v-a60d6896] {
404
+ display: flex;
405
+ flex-direction: column;
406
+ max-height: 560px;
407
+ }
408
+ .c-notification-center__header[data-v-a60d6896] {
409
+ display: flex;
410
+ align-items: center;
411
+ justify-content: space-between;
412
+ padding: 14px 16px 10px;
413
+ border-bottom: 1px solid var(--c-border);
414
+ }
415
+ .c-notification-center__title[data-v-a60d6896] {
416
+ font-size: 15px;
417
+ font-weight: 600;
418
+ color: var(--c-text-1);
419
+ }
420
+ .c-notification-center__header-extra[data-v-a60d6896] {
421
+ display: flex;
422
+ align-items: center;
423
+ gap: 8px;
424
+ }
425
+ .c-notification-center__ws-dot[data-v-a60d6896] {
426
+ width: 8px;
427
+ height: 8px;
428
+ border-radius: 50%;
429
+ transition: background-color var(--c-transition, 0.2s ease);
430
+ }
431
+ .c-notification-center__ws-dot--connected[data-v-a60d6896] {
432
+ background: #52c41a;
433
+ box-shadow: 0 0 4px rgba(82, 196, 26, 0.5);
434
+ }
435
+ .c-notification-center__ws-dot--connecting[data-v-a60d6896], .c-notification-center__ws-dot--reconnecting[data-v-a60d6896] {
436
+ background: #faad14;
437
+ animation: status-blink-a60d6896 1s ease-in-out infinite;
438
+ }
439
+ .c-notification-center__ws-dot--disconnected[data-v-a60d6896] {
440
+ background: var(--c-text-4);
441
+ }
442
+ @keyframes status-blink-a60d6896 {
443
+ 0%, 100% {
444
+ opacity: 1;
445
+ }
446
+ 50% {
447
+ opacity: 0.3;
448
+ }
449
+ }
450
+ /* ─── 切换过渡 ───────────────────────────────── */
451
+ .slide-fade-enter-active[data-v-a60d6896] {
452
+ transition: all 0.25s ease-out;
453
+ }
454
+ .slide-fade-leave-active[data-v-a60d6896] {
455
+ transition: all 0.2s ease-in;
456
+ }
457
+ .slide-fade-enter-from[data-v-a60d6896] {
458
+ opacity: 0;
459
+ transform: translateY(8px);
460
+ }
461
+ .slide-fade-leave-to[data-v-a60d6896] {
462
+ opacity: 0;
463
+ transform: translateY(-8px);
464
+ }
465
+
466
+ /*# sourceMappingURL=C_NotificationCenter-DT6fQ79O.css.map*/
@@ -0,0 +1 @@
1
+ {"version":3,"file":"C_QRCode-DMxSyogU.css","names":[],"sources":["../src/components/C_QRCode/index.vue?vue&type=style&index=0&scoped=7a4201b5&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled *//* C_QRCode styles */\n.c-qrcode[data-v-7a4201b5] {\n display: inline-flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n max-width: 100%;\n}\n.c-qrcode .qrcode-wrapper[data-v-7a4201b5] {\n display: inline-block;\n padding: 8px;\n background: var(--c-bg-content, #fff);\n border-radius: 6px;\n transition: all 0.3s ease;\n overflow: hidden;\n max-width: 100%;\n line-height: 0;\n}\n.c-qrcode .qrcode-wrapper.with-border[data-v-7a4201b5] {\n border: 1px dashed var(--c-border-default, #e0e0e6);\n}\n.c-qrcode .qrcode-wrapper[data-v-7a4201b5]:hover {\n border-color: var(--primary-color, #409eff);\n box-shadow: var(--c-shadow-sm, 0 1px 4px rgba(0, 0, 0, 0.08));\n}\n.c-qrcode .qrcode-wrapper canvas[data-v-7a4201b5] {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.c-qrcode .qrcode-wrapper .qrcode-svg[data-v-7a4201b5] {\n display: flex;\n align-items: center;\n justify-content: center;\n max-width: 100%;\n}\n.c-qrcode .qrcode-wrapper .qrcode-svg[data-v-7a4201b5] svg {\n width: 100%;\n height: 100%;\n display: block;\n}\n.c-qrcode .qrcode-label[data-v-7a4201b5] {\n font-size: 14px;\n color: var(--c-text-secondary, #999);\n text-align: center;\n font-weight: 500;\n word-break: break-all;\n max-width: 100%;\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"}
@@ -0,0 +1,51 @@
1
+ /* unplugin-vue-components disabled *//* C_QRCode styles */
2
+ .c-qrcode[data-v-7a4201b5] {
3
+ display: inline-flex;
4
+ flex-direction: column;
5
+ align-items: center;
6
+ gap: 8px;
7
+ max-width: 100%;
8
+ }
9
+ .c-qrcode .qrcode-wrapper[data-v-7a4201b5] {
10
+ display: inline-block;
11
+ padding: 8px;
12
+ background: var(--c-bg-content, #fff);
13
+ border-radius: 6px;
14
+ transition: all 0.3s ease;
15
+ overflow: hidden;
16
+ max-width: 100%;
17
+ line-height: 0;
18
+ }
19
+ .c-qrcode .qrcode-wrapper.with-border[data-v-7a4201b5] {
20
+ border: 1px dashed var(--c-border-default, #e0e0e6);
21
+ }
22
+ .c-qrcode .qrcode-wrapper[data-v-7a4201b5]:hover {
23
+ border-color: var(--primary-color, #409eff);
24
+ box-shadow: var(--c-shadow-sm, 0 1px 4px rgba(0, 0, 0, 0.08));
25
+ }
26
+ .c-qrcode .qrcode-wrapper canvas[data-v-7a4201b5] {
27
+ display: block;
28
+ max-width: 100%;
29
+ height: auto;
30
+ }
31
+ .c-qrcode .qrcode-wrapper .qrcode-svg[data-v-7a4201b5] {
32
+ display: flex;
33
+ align-items: center;
34
+ justify-content: center;
35
+ max-width: 100%;
36
+ }
37
+ .c-qrcode .qrcode-wrapper .qrcode-svg[data-v-7a4201b5] svg {
38
+ width: 100%;
39
+ height: 100%;
40
+ display: block;
41
+ }
42
+ .c-qrcode .qrcode-label[data-v-7a4201b5] {
43
+ font-size: 14px;
44
+ color: var(--c-text-secondary, #999);
45
+ text-align: center;
46
+ font-weight: 500;
47
+ word-break: break-all;
48
+ max-width: 100%;
49
+ }
50
+
51
+ /*# sourceMappingURL=C_QRCode-DMxSyogU.css.map*/
@@ -0,0 +1 @@
1
+ {"version":3,"file":"C_Signature-B5fFz6RD.css","names":[],"sources":["../src/components/C_Signature/index.vue?vue&type=style&index=0&scoped=1c733bfe&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled *//* 电子签名组件样式 */\n.c-signature[data-v-1c733bfe] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n width: 100%;\n}\n.c-signature .signature-toolbar[data-v-1c733bfe] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n background: var(--c-bg-card, #fff);\n border: 1px solid var(--c-border, #e1e4e8);\n border-radius: var(--c-radius, 6px);\n flex-wrap: wrap;\n}\n.c-signature .signature-toolbar .toolbar-section[data-v-1c733bfe] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.c-signature .signature-toolbar .toolbar-section.divider[data-v-1c733bfe] {\n width: 1px;\n height: 24px;\n background: var(--c-border, #e1e4e8);\n margin: 0 4px;\n}\n.c-signature .signature-toolbar .toolbar-section .section-label[data-v-1c733bfe] {\n font-size: 13px;\n color: var(--c-text-3, #999);\n font-weight: 500;\n}\n.c-signature .signature-canvas-wrapper[data-v-1c733bfe] {\n position: relative;\n border: 1px solid var(--c-border, #e1e4e8);\n border-radius: var(--c-radius, 6px);\n overflow: hidden;\n background: var(--c-bg, #fff);\n transition: border-color 0.3s;\n}\n.c-signature .signature-canvas-wrapper[data-v-1c733bfe]:hover {\n border-color: var(--c-primary, #409eff);\n}\n.c-signature .signature-canvas-wrapper.disabled[data-v-1c733bfe] {\n opacity: 0.6;\n cursor: not-allowed;\n border-color: var(--c-border, #e1e4e8);\n}\n.c-signature .signature-canvas-wrapper.readonly[data-v-1c733bfe] {\n cursor: default;\n}\n.c-signature .signature-canvas-wrapper .signature-canvas[data-v-1c733bfe] {\n display: block;\n width: 100%;\n height: 100%;\n cursor: crosshair;\n touch-action: none;\n}\n.c-signature .signature-canvas-wrapper .signature-canvas.disabled[data-v-1c733bfe], .c-signature .signature-canvas-wrapper .signature-canvas.readonly[data-v-1c733bfe] {\n cursor: not-allowed;\n}\n.c-signature .signature-canvas-wrapper .canvas-placeholder[data-v-1c733bfe] {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n color: var(--c-text-4, #ccc);\n font-size: 14px;\n pointer-events: none;\n user-select: none;\n}\n.c-signature .signature-actions[data-v-1c733bfe] {\n display: flex;\n justify-content: flex-end;\n gap: 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"}