@robot-admin/naive-ui-components 0.4.4 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/C_ActionBar-jZPsiXtT.css.map +1 -0
- package/dist/C_ActionBar.css +205 -0
- package/dist/{C_AntV-DGjscTWa.css.map → C_AntV-A3NXx_sF.css.map} +1 -1
- package/dist/C_AntV-D2Zp2qQF.css.map +1 -0
- package/dist/C_AntV.css +398 -0
- package/dist/C_AntV.js.map +1 -1
- package/dist/C_AntV2.js +1 -1
- package/dist/C_AntV2.js.map +1 -1
- package/dist/C_Barcode-Do1Ozsmh.css.map +1 -0
- package/dist/C_Barcode.css +39 -0
- package/dist/C_Captcha-CZmAETly.css.map +1 -0
- package/dist/C_Captcha.css +109 -0
- package/dist/C_Cascade-Dq0S5Jkm.css.map +1 -0
- package/dist/C_Cascade.css +10 -0
- package/dist/C_City-DNKv4MpH.css.map +1 -0
- package/dist/C_City.css +132 -0
- package/dist/C_Code-avZjAnHD.css.map +1 -0
- package/dist/C_Code.css +8 -0
- package/dist/C_CollapsePanel-BpofCDyl.css.map +1 -0
- package/dist/C_CollapsePanel.css +171 -0
- package/dist/C_Cron-DqHQ92LN.css.map +1 -0
- package/dist/C_Cron.css +307 -0
- package/dist/C_Draggable-r6nhx3yM.css.map +1 -0
- package/dist/C_Draggable.css +238 -0
- package/dist/C_Editor-D0_6UhIa.css.map +1 -0
- package/dist/C_Editor.css +52 -0
- package/dist/{C_FilePreview-B4XgTv-h.css.map → C_FilePreview-BVarVvnD.css.map} +1 -1
- package/dist/C_FilePreview-DHGlV4OR.css.map +1 -0
- package/dist/C_FilePreview.css +507 -0
- package/dist/C_FilePreview.js.map +1 -1
- package/dist/C_FilePreview2.js +1 -1
- package/dist/C_FilePreview2.js.map +1 -1
- package/dist/{C_Form-DLb9FtAb.css.map → C_Form-BciQUPpS.css.map} +1 -1
- package/dist/C_Form-CKHvXL3O.css.map +1 -0
- package/dist/C_Form.css +976 -0
- package/dist/C_Form.js.map +1 -1
- package/dist/C_Form2.js +1 -1
- package/dist/C_Form2.js.map +1 -1
- package/dist/{C_FormSearch-DlIEoh7X.css.map → C_FormSearch-Bmd2CmG6.css.map} +1 -1
- package/dist/C_FormSearch-DBNtnjaL.css.map +1 -0
- package/dist/C_FormSearch.css +177 -0
- package/dist/C_FormSearch.js.map +1 -1
- package/dist/C_FormSearch2.js +1 -1
- package/dist/C_FormSearch2.js.map +1 -1
- package/dist/C_FormulaEditor-3WG2vtQl.css.map +1 -0
- package/dist/C_FormulaEditor.css +502 -0
- package/dist/C_FullCalendar-1U4VlG7X.css.map +1 -0
- package/dist/C_FullCalendar-DLUdCtqf.css.map +1 -0
- package/dist/C_FullCalendar.css +7 -0
- package/dist/C_FullCalendar.js.map +1 -1
- package/dist/C_FullCalendar2.js +1 -1
- package/dist/C_FullCalendar2.js.map +1 -1
- package/dist/C_GlobalSearch-B6wK3m3k.css.map +1 -0
- package/dist/C_GlobalSearch.css +616 -0
- package/dist/C_Guide.js.map +1 -1
- package/dist/C_Guide2.js.map +1 -1
- package/dist/C_Icon.js.map +1 -1
- package/dist/C_Icon2.js.map +1 -1
- package/dist/C_ImageCropper-D3L2-J_J.css.map +1 -0
- package/dist/C_ImageCropper.css +129 -0
- package/dist/C_Language.js.map +1 -1
- package/dist/C_Language2.js.map +1 -1
- package/dist/C_Map-BCJmDnJT.css.map +1 -0
- package/dist/C_Map.css +29 -0
- package/dist/{C_Markdown-C2uiBVSW.css.map → C_Markdown-7iBnLDtL.css.map} +1 -1
- package/dist/C_Markdown-BbTvdFCl.css.map +1 -0
- package/dist/C_Markdown.css +112 -0
- package/dist/C_Markdown.js.map +1 -1
- package/dist/C_Markdown2.js +1 -1
- package/dist/C_Markdown2.js.map +1 -1
- package/dist/C_NotificationCenter-DT6fQ79O.css.map +1 -0
- package/dist/C_NotificationCenter.css +466 -0
- package/dist/C_QRCode-DMxSyogU.css.map +1 -0
- package/dist/C_QRCode.css +51 -0
- package/dist/C_Signature-B5fFz6RD.css.map +1 -0
- package/dist/C_Signature.css +79 -0
- package/dist/C_SplitPane-DuyzUhKB.css.map +1 -0
- package/dist/C_SplitPane.css +152 -0
- package/dist/C_Steps-DGwXxS2Y.css.map +1 -0
- package/dist/C_Steps.css +171 -0
- package/dist/{C_Table-C55H4kPr.css.map → C_Table-Dcam_tRs.css.map} +1 -1
- package/dist/C_Table-tbUx-R4H.css.map +1 -0
- package/dist/C_Table.css +527 -0
- package/dist/C_Table.js.map +1 -1
- package/dist/C_Table2.js +1 -1
- package/dist/C_Table2.js.map +1 -1
- package/dist/C_Theme.js.map +1 -1
- package/dist/C_Theme2.js.map +1 -1
- package/dist/C_Time-CKb_fwdm.css.map +1 -0
- package/dist/C_Time.css +23 -0
- package/dist/C_Tree-B-Le4hjQ.css.map +1 -0
- package/dist/C_Tree.css +142 -0
- package/dist/C_Upload-S30RmC9t.css.map +1 -0
- package/dist/C_Upload.css +251 -0
- package/dist/C_VideoPlayer-Cdgv4Zq0.css.map +1 -0
- package/dist/C_VideoPlayer.css +355 -0
- package/dist/C_VideoPlayer.d.ts +1 -1
- package/dist/C_VtableGantt-DB87-jdS.css.map +1 -0
- package/dist/C_VtableGantt.css +89 -0
- package/dist/C_WaterFall-C4HDqf-a.css.map +1 -0
- package/dist/C_WaterFall.css +73 -0
- package/dist/{C_WorkFlow-CSO86Cuc.css.map → C_WorkFlow-7F6op6qN.css.map} +1 -1
- package/dist/C_WorkFlow-Cy3HWA6A.css.map +1 -0
- package/dist/C_WorkFlow.css +1166 -0
- package/dist/C_WorkFlow.js.map +1 -1
- package/dist/C_WorkFlow2.js +1 -1
- package/dist/C_WorkFlow2.js.map +1 -1
- package/dist/chunk.js +1 -1
- package/dist/constants.d.ts +4 -4
- package/dist/constants2.d.ts +5 -5
- package/dist/constants3.d.ts +3 -3
- package/dist/constants4.d.ts +4 -4
- package/dist/constants5.d.ts +8 -3816
- package/dist/data.d.ts +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js.map +1 -1
- package/dist/index.vue.d.ts +1 -1
- package/dist/index10.vue.d.ts +8 -8
- package/dist/index11.vue.d.ts +2 -2
- package/dist/index12.vue.d.ts +7 -7
- package/dist/index13.vue.d.ts +1 -1
- package/dist/index14.vue.d.ts +2 -2
- package/dist/index15.vue.d.ts +1 -1
- package/dist/index16.vue.d.ts +2 -2
- package/dist/index3.vue.d.ts +1 -1
- package/dist/index4.vue.d.ts +2 -2
- package/dist/index5.vue.d.ts +2 -2
- package/dist/index6.vue.d.ts +4 -4
- package/dist/index7.vue.d.ts +2 -2
- package/dist/index8.vue.d.ts +4 -4
- package/dist/index9.vue.d.ts +1 -1
- package/dist/resolver.cjs +1 -1
- package/dist/resolver.cjs.map +1 -1
- package/dist/resolver.d.cts +7 -0
- package/dist/resolver.d.ts +7 -0
- package/dist/resolver.js +1 -1
- package/dist/resolver.js.map +1 -1
- package/dist/style.css +481 -481
- package/dist/useCalendarEvents.d.ts +1 -1
- package/dist/useCollapsePanel.d.ts +1 -1
- package/dist/useCropperCore.d.ts +7 -7
- package/dist/useDraggableLayout.d.ts +2 -2
- package/dist/useDynamicFormState.d.ts +8 -8
- package/dist/useEdgeInteraction.d.ts +4 -7293
- package/dist/useFullscreen.d.ts +2 -2
- package/dist/useInfiniteScroll.d.ts +3 -3
- package/dist/useModalEdit.d.ts +41 -17
- package/dist/useQRCode.d.ts +3 -3
- package/dist/useSearchState.d.ts +3 -3
- package/dist/useSignatureHistory.d.ts +3 -3
- package/dist/useSplitResize.d.ts +3 -3
- package/dist/useTimeSelection.d.ts +2 -2
- package/dist/useTreeOperations.d.ts +3 -3
- package/dist/useWorkflowValidation.d.ts +5 -5
- package/package.json +32 -32
- package/dist/C_FullCalendar-BULCIlVK.css.map +0 -1
package/dist/C_Markdown2.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"C_Markdown2.js","names":["isDark","modelValue","height","placeholder","toolbar","mode","tocNavPosition","defaultFullscreen","autofocus","includeLevel","leftToolbar","rightToolbar"],"sources":["../src/components/C_Markdown/index.vue","../src/components/C_Markdown/index.vue","../src/components/C_Markdown/index.vue"],"sourcesContent":["/* 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"}
|